]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkfilechooserbutton.c
filechooserbutton: Emit 'selection-changed' when changing the selection programmatically
[~andy/gtk] / gtk / gtkfilechooserbutton.c
index c69157d3b1fb1367867a235cd9072a3199fedb7b..0c887e5968d90366090f488ae8c168c59ba36625 100644 (file)
@@ -208,6 +208,9 @@ struct _GtkFileChooserButtonPrivate
   guint  active                       : 1;
 
   guint  focus_on_click               : 1;
+
+  /* Whether the next async callback from GIO should emit the "selection-changed" signal */
+  guint  is_changing_selection        : 1;
 };
 
 
@@ -591,6 +594,18 @@ gtk_file_chooser_button_file_chooser_iface_init (GtkFileChooserIface *iface)
   iface->remove_shortcut_folder = gtk_file_chooser_button_remove_shortcut_folder;
 }
 
+static void
+emit_selection_changed_if_changing_selection (GtkFileChooserButton *button)
+{
+  GtkFileChooserButtonPrivate *priv = button->priv;
+
+  if (priv->is_changing_selection)
+    {
+      priv->is_changing_selection = FALSE;
+      g_signal_emit_by_name (button, "selection-changed");
+    }
+}
+
 static gboolean
 gtk_file_chooser_button_set_current_folder (GtkFileChooser    *chooser,
                                            GFile             *file,
@@ -662,6 +677,8 @@ gtk_file_chooser_button_select_file (GtkFileChooser *chooser,
 
       priv->selection_while_inactive = g_object_ref (file);
 
+      priv->is_changing_selection = TRUE;
+
       update_label_and_image (button);
       update_combo_box (button);
 
@@ -692,6 +709,8 @@ gtk_file_chooser_button_unselect_file (GtkFileChooser *chooser,
              priv->selection_while_inactive = NULL;
            }
 
+         priv->is_changing_selection = TRUE;
+
          update_label_and_image (button);
          update_combo_box (button);
        }
@@ -716,10 +735,10 @@ gtk_file_chooser_button_unselect_all (GtkFileChooser *chooser)
        {
          g_object_unref (priv->selection_while_inactive);
          priv->selection_while_inactive = NULL;
-
-         update_label_and_image (button);
-         update_combo_box (button);
        }
+
+      update_label_and_image (button);
+      update_combo_box (button);
     }
 }
 
@@ -2556,6 +2575,8 @@ update_label_get_info_cb (GCancellable *cancellable,
     g_object_unref (pixbuf);
 
 out:
+  emit_selection_changed_if_changing_selection (button);
+
   g_object_unref (button);
   g_object_unref (cancellable);
 }
@@ -2566,10 +2587,12 @@ update_label_and_image (GtkFileChooserButton *button)
   GtkFileChooserButtonPrivate *priv = button->priv;
   gchar *label_text;
   GFile *file;
+  gboolean done_changing_selection;
 
   file = get_selected_file (button);
 
   label_text = NULL;
+  done_changing_selection = FALSE;
 
   if (priv->update_button_cancellable)
     {
@@ -2607,7 +2630,10 @@ update_label_and_image (GtkFileChooserButton *button)
           _gtk_file_system_volume_unref (volume);
 
           if (label_text)
+           {
+             done_changing_selection = TRUE;
              goto out;
+           }
         }
 
       if (g_file_is_native (file))
@@ -2629,8 +2655,16 @@ update_label_and_image (GtkFileChooserButton *button)
           gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf);
           if (pixbuf)
             g_object_unref (pixbuf);
+
+         done_changing_selection = TRUE;
         }
     }
+  else
+    {
+      /* We know the selection is empty */
+      done_changing_selection = TRUE;
+    }
+
 out:
 
   if (file)
@@ -2646,6 +2680,9 @@ out:
       gtk_label_set_text (GTK_LABEL (priv->label), _(FALLBACK_DISPLAY_NAME));
       gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), NULL);
     }
+
+  if (done_changing_selection)
+    emit_selection_changed_if_changing_selection (button);
 }
 
 
@@ -2804,7 +2841,7 @@ combo_box_changed_cb (GtkComboBox *combo_box,
        case ROW_TYPE_BOOKMARK:
        case ROW_TYPE_CURRENT_FOLDER:
          if (data)
-           gtk_file_chooser_button_set_current_folder (GTK_FILE_CHOOSER (button), data, NULL);
+           gtk_file_chooser_button_select_file (GTK_FILE_CHOOSER (button), data, NULL);
          break;
        case ROW_TYPE_VOLUME:
          {
@@ -2813,7 +2850,7 @@ combo_box_changed_cb (GtkComboBox *combo_box,
            base_file = _gtk_file_system_volume_get_root (data);
            if (base_file)
              {
-               gtk_file_chooser_button_set_current_folder (GTK_FILE_CHOOSER (button), base_file, NULL);
+               gtk_file_chooser_button_select_file (GTK_FILE_CHOOSER (button), base_file, NULL);
                g_object_unref (base_file);
              }
          }