]> Pileus Git - ~andy/gtk/commitdiff
Fix sensitivity of file operation buttons and buttons inside fileop
authorOwen Taylor <otaylor@redhat.com>
Fri, 25 Oct 2002 19:57:48 +0000 (19:57 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Fri, 25 Oct 2002 19:57:48 +0000 (19:57 +0000)
Fri Oct 25 14:51:34 2002  Owen Taylor  <otaylor@redhat.com>

        * gtk/gtkfilesel.c: Fix sensitivity of file operation
        buttons and buttons inside fileop dialogs to update
        properly based on the contents of the entries.
        (#74267, based on part of a patch from Muktha
        Narayan)

gtk/gtkfilesel.c

index 3fb1d1f5fe91d659bb46b4bdfb1b5158f9504499..700c9df1c7046c9b1ccd55efcecbec7009cd918c 100644 (file)
@@ -389,6 +389,7 @@ static gint gtk_file_selection_insert_text   (GtkWidget             *widget,
                                              gint                   new_text_length,
                                              gint                  *position,
                                              gpointer               user_data);
+static void gtk_file_selection_update_fileops (GtkFileSelection     *filesel);
 
 static void gtk_file_selection_file_activate (GtkTreeView       *tree_view,
                                              GtkTreePath       *path,
@@ -787,12 +788,15 @@ gtk_file_selection_init (GtkFileSelection *filesel)
                    G_CALLBACK (gtk_file_selection_key_press), filesel);
   g_signal_connect (filesel->selection_entry, "insert_text",
                    G_CALLBACK (gtk_file_selection_insert_text), NULL);
+  g_signal_connect_swapped (filesel->selection_entry, "changed",
+                           G_CALLBACK (gtk_file_selection_update_fileops), filesel);
   g_signal_connect_swapped (filesel->selection_entry, "focus_in_event",
                            G_CALLBACK (grab_default),
                            filesel->ok_button);
   g_signal_connect_swapped (filesel->selection_entry, "activate",
                            G_CALLBACK (gtk_button_clicked),
                            filesel->ok_button);
+  
   gtk_box_pack_start (GTK_BOX (entry_vbox), filesel->selection_entry, TRUE, TRUE, 0);
   gtk_widget_show (filesel->selection_entry);
 
@@ -1092,8 +1096,10 @@ gtk_file_selection_show_fileop_buttons (GtkFileSelection *filesel)
                          filesel->fileop_ren_file, TRUE, TRUE, 0);
       gtk_widget_show (filesel->fileop_ren_file);
     }
+  
+  gtk_file_selection_update_fileops (filesel);
+  
   g_object_notify (G_OBJECT (filesel), "show_fileops");
-  gtk_widget_queue_resize (GTK_WIDGET (filesel));
 }
 
 void       
@@ -1339,6 +1345,20 @@ gtk_file_selection_fileop_destroy (GtkWidget *widget,
   fs->fileop_dialog = NULL;
 }
 
+static gboolean
+entry_is_empty (GtkEntry *entry)
+{
+  const gchar *text = gtk_entry_get_text (entry);
+  
+  return *text == '\0';
+}
+
+static void
+gtk_file_selection_fileop_entry_changed (GtkEntry   *entry,
+                                        GtkWidget  *button)
+{
+  gtk_widget_set_sensitive (button, !entry_is_empty (entry));
+}
 
 static void
 gtk_file_selection_create_dir_confirmed (GtkWidget *widget,
@@ -1450,10 +1470,15 @@ gtk_file_selection_create_dir (GtkWidget *widget,
 
   gtk_widget_grab_focus (fs->fileop_entry);
 
-  button = gtk_button_new_with_label (_("Create"));
+  button = gtk_button_new_with_mnemonic (_("C_reate"));
+  gtk_widget_set_sensitive (button, FALSE);
   g_signal_connect (button, "clicked",
                    G_CALLBACK (gtk_file_selection_create_dir_confirmed),
                    fs);
+  g_signal_connect (fs->fileop_entry, "changed",
+                    G_CALLBACK (gtk_file_selection_fileop_entry_changed),
+                   button);
+
   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
                     button, TRUE, TRUE, 0);
   GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
@@ -1718,10 +1743,14 @@ gtk_file_selection_rename_file (GtkWidget *widget,
 
   gtk_widget_grab_focus (fs->fileop_entry);
 
-  button = gtk_button_new_with_label (_("Rename"));
+  button = gtk_button_new_with_mnemonic (_("_Rename"));
   g_signal_connect (button, "clicked",
                    G_CALLBACK (gtk_file_selection_rename_file_confirmed),
                    fs);
+  g_signal_connect (fs->fileop_entry, "changed",
+                   G_CALLBACK (gtk_file_selection_fileop_entry_changed),
+                   button);
+
   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
                      button, TRUE, TRUE, 0);
   GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
@@ -1753,6 +1782,23 @@ gtk_file_selection_insert_text (GtkWidget   *widget,
   return TRUE;
 }
 
+static void
+gtk_file_selection_update_fileops (GtkFileSelection *fs)
+{
+  gboolean sensitive;
+
+  if (!fs->selection_entry)
+    return;
+
+  sensitive = !entry_is_empty (GTK_ENTRY (fs->selection_entry));
+
+  if (fs->fileop_del_file)
+    gtk_widget_set_sensitive (fs->fileop_del_file, sensitive);
+  
+  if (fs->fileop_ren_file)
+    gtk_widget_set_sensitive (fs->fileop_ren_file, sensitive);
+}
+
 static gint
 gtk_file_selection_key_press (GtkWidget   *widget,
                              GdkEventKey *event,