diff options
author | Federico Mena Quintero <federico@gnome.org> | 2011-06-30 16:23:12 -0500 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2011-06-30 16:23:12 -0500 |
commit | c6df130f6a3412de703cf72eb629118c0880c7ee (patch) | |
tree | 67d4ddb763f8186b99b76a8f363323a0ce6bef0d | |
parent | b88acf80bc4555276dbdb6c44445232a6476bc64 (diff) | |
download | gtk+-c6df130f6a3412de703cf72eb629118c0880c7ee.tar.gz |
Warn the user when he still needs to type a filename or choose a folder
Signed-off-by: Federico Mena Quintero <federico@gnome.org>
-rw-r--r-- | gtk/gtkfilechooserdefault.c | 107 | ||||
-rw-r--r-- | gtk/gtkfilechooserprivate.h | 2 |
2 files changed, 96 insertions, 13 deletions
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index 4851c14d6b..c33770faea 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -48,6 +48,7 @@ #include "gtkicontheme.h" #include "gtkimage.h" #include "gtkimagemenuitem.h" +#include "gtkinfobar.h" #include "gtklabel.h" #include "gtkmarshalers.h" #include "gtkmessagedialog.h" @@ -4947,6 +4948,74 @@ unset_file_system_backend (GtkFileChooserDefault *impl) impl->file_system = NULL; } +static void +create_info_bar (GtkFileChooserDefault *impl) +{ + GtkWidget *content_area; + + impl->browse_select_a_folder_info_bar = gtk_info_bar_new (); + impl->browse_select_a_folder_warning_icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_MENU); + impl->browse_select_a_folder_label = gtk_label_new (NULL); + + content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (impl->browse_select_a_folder_info_bar)); + gtk_box_set_spacing (GTK_BOX (content_area), 6); + + gtk_box_pack_start (GTK_BOX (content_area), impl->browse_select_a_folder_warning_icon, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (content_area), impl->browse_select_a_folder_label, TRUE, TRUE, 0); + + gtk_widget_show (impl->browse_select_a_folder_info_bar); + gtk_widget_show (impl->browse_select_a_folder_label); +} + +typedef enum { + INFO_BAR_SELECT_A_FOLDER, + INFO_BAR_ERROR_NO_FILENAME, + INFO_BAR_ERROR_NO_FOLDER +} InfoBarMode; + +static void +set_info_bar (GtkFileChooserDefault *impl, InfoBarMode mode) +{ + char *str; + gboolean free_str; + GtkMessageType message_type; + + if (!impl->browse_select_a_folder_info_bar) + return; + + free_str = FALSE; + + switch (mode) + { + case INFO_BAR_SELECT_A_FOLDER: + str = g_strconcat ("<i>", _("Please select a folder below"), "</i>", NULL); + free_str = TRUE; + message_type = GTK_MESSAGE_OTHER; + break; + + case INFO_BAR_ERROR_NO_FILENAME: + str = _("Please type a file name"); + message_type = GTK_MESSAGE_WARNING; + break; + + case INFO_BAR_ERROR_NO_FOLDER: + str = _("Please select a folder below"); + message_type = GTK_MESSAGE_WARNING; + break; + + default: + g_assert_not_reached (); + return; + } + + gtk_info_bar_set_message_type (GTK_INFO_BAR (impl->browse_select_a_folder_info_bar), message_type); + gtk_widget_set_visible (impl->browse_select_a_folder_warning_icon, message_type == GTK_MESSAGE_WARNING); + gtk_label_set_markup (GTK_LABEL (impl->browse_select_a_folder_label), str); + + if (free_str) + g_free (str); +} + /* Saves the widgets around the pathbar so they can be reparented later * in the correct place. This function must be called paired with * restore_path_bar(). @@ -5025,12 +5094,13 @@ update_path_bar (GtkFileChooserDefault *impl) { put_recent_folder_in_pathbar (impl, &iter); gtk_widget_show (impl->browse_path_bar); - gtk_widget_hide (impl->browse_select_a_folder_label); + gtk_widget_hide (impl->browse_select_a_folder_info_bar); } else { gtk_widget_hide (impl->browse_path_bar); - gtk_widget_show (impl->browse_select_a_folder_label); + set_info_bar (impl, INFO_BAR_SELECT_A_FOLDER); + gtk_widget_show (impl->browse_select_a_folder_info_bar); } } } @@ -8282,7 +8352,6 @@ location_popup_on_paste_handler (GtkFileChooserDefault *impl) impl); } - /* Implementation for GtkFileChooserEmbed::should_respond() */ static gboolean gtk_file_chooser_default_should_respond (GtkFileChooserEmbed *chooser_embed) @@ -8333,7 +8402,12 @@ gtk_file_chooser_default_should_respond (GtkFileChooserEmbed *chooser_embed) return search_should_respond (impl); if (impl->operation_mode == OPERATION_MODE_RECENT) - return recent_should_respond (impl); + { + if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE) + goto save_entry; + else + return recent_should_respond (impl); + } selection_check (impl, &num_selected, &all_files, &all_folders); @@ -8401,13 +8475,24 @@ gtk_file_chooser_default_should_respond (GtkFileChooserEmbed *chooser_embed) check_save_entry (impl, &file, &is_well_formed, &is_empty, &is_file_part_empty, &is_folder); if (!is_well_formed) - return FALSE; + { + if (!is_empty + && impl->action == GTK_FILE_CHOOSER_ACTION_SAVE + && impl->operation_mode == OPERATION_MODE_RECENT) + set_info_bar (impl, INFO_BAR_ERROR_NO_FOLDER); + + return FALSE; + } if (is_empty) { if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE || impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER) - return FALSE; + { + set_info_bar (impl, INFO_BAR_ERROR_NO_FILENAME); + gtk_widget_grab_focus (impl->location_entry); + return FALSE; + } goto file_list; } @@ -9330,13 +9415,9 @@ recent_hide_entry (GtkFileChooserDefault *impl) /* For Save mode, we don't want this icon/label - we want update_path_bar() to do its thing instead */ if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE) { - char *str; - - str = g_strconcat ("<i>", _("Please select a folder below"), "</i>", NULL); - impl->browse_select_a_folder_label = gtk_label_new (NULL); - gtk_label_set_markup (GTK_LABEL (impl->browse_select_a_folder_label), str); - g_free (str); - gtk_box_pack_start (GTK_BOX (impl->recent_hbox), impl->browse_select_a_folder_label, FALSE, FALSE, 0); + create_info_bar (impl); + gtk_box_pack_start (GTK_BOX (impl->recent_hbox), impl->browse_select_a_folder_info_bar, FALSE, FALSE, 0); + set_info_bar (impl, INFO_BAR_SELECT_A_FOLDER); } else { diff --git a/gtk/gtkfilechooserprivate.h b/gtk/gtkfilechooserprivate.h index 3e32d6716a..97d37005a8 100644 --- a/gtk/gtkfilechooserprivate.h +++ b/gtk/gtkfilechooserprivate.h @@ -183,7 +183,9 @@ struct _GtkFileChooserDefault GtkWidget *browse_path_bar_hbox; GtkSizeGroup *browse_path_bar_size_group; GtkWidget *browse_path_bar; + GtkWidget *browse_select_a_folder_info_bar; GtkWidget *browse_select_a_folder_label; + GtkWidget *browse_select_a_folder_warning_icon; GtkFileSystemModel *browse_files_model; char *browse_files_last_selected_name; |