diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index 57c0162235..15c00996f1 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -406,22 +406,23 @@ static void location_switch_to_path_bar (GtkFileChooserDefault *impl); static void stop_loading_and_clear_list_model (GtkFileChooserDefault *impl, gboolean remove_from_treeview); + +static void search_setup_widgets (GtkFileChooserDefault *impl); static void search_stop_searching (GtkFileChooserDefault *impl, gboolean remove_query); static void search_clear_model (GtkFileChooserDefault *impl, gboolean remove_from_treeview); static gboolean search_should_respond (GtkFileChooserDefault *impl); -static void search_switch_to_browse_mode (GtkFileChooserDefault *impl); static GSList *search_get_selected_files (GtkFileChooserDefault *impl); static void search_entry_activate_cb (GtkEntry *entry, gpointer data); static void settings_load (GtkFileChooserDefault *impl); +static void recent_start_loading (GtkFileChooserDefault *impl); static void recent_stop_loading (GtkFileChooserDefault *impl); static void recent_clear_model (GtkFileChooserDefault *impl, gboolean remove_from_treeview); static gboolean recent_should_respond (GtkFileChooserDefault *impl); -static void recent_switch_to_browse_mode (GtkFileChooserDefault *impl); static GSList * recent_get_selected_files (GtkFileChooserDefault *impl); static void set_file_system_backend (GtkFileChooserDefault *impl); static void unset_file_system_backend (GtkFileChooserDefault *impl); @@ -3710,7 +3711,7 @@ key_is_left_or_right (GdkEventKey *event) /* Handles key press events on the file list, so that we can trap Enter to * activate the default button on our own. Also, checks to see if '/' has been - * pressed. See comment by tree_view_keybinding_cb() for more details. + * pressed. */ static gboolean browse_files_key_press_event_cb (GtkWidget *widget, @@ -4151,7 +4152,9 @@ typedef struct { gint model_column; } ColumnMap; -/* Sets the sort column IDs for the file list based on the operation mode */ +/* Sets the sort column IDs for the file list; needs to be done whenever we + * change the model on the treeview. + */ static void file_list_set_sort_column_ids (GtkFileChooserDefault *impl) { @@ -4389,6 +4392,20 @@ file_pane_create (GtkFileChooserDefault *impl, return vbox; } +static void +location_entry_create (GtkFileChooserDefault *impl) +{ + if (!impl->location_entry) + impl->location_entry = _gtk_file_chooser_entry_new (TRUE); + + _gtk_file_chooser_entry_set_file_system (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), + impl->file_system); + _gtk_file_chooser_entry_set_local_only (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), impl->local_only); + _gtk_file_chooser_entry_set_action (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), impl->action); + gtk_entry_set_width_chars (GTK_ENTRY (impl->location_entry), 45); + gtk_entry_set_activates_default (GTK_ENTRY (impl->location_entry), TRUE); +} + /* Creates the widgets specific to Save mode */ static void save_widgets_create (GtkFileChooserDefault *impl) @@ -4422,12 +4439,7 @@ save_widgets_create (GtkFileChooserDefault *impl) /* Location entry */ - impl->location_entry = _gtk_file_chooser_entry_new (TRUE); - _gtk_file_chooser_entry_set_file_system (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), - impl->file_system); - _gtk_file_chooser_entry_set_local_only (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), impl->local_only); - gtk_entry_set_width_chars (GTK_ENTRY (impl->location_entry), 45); - gtk_entry_set_activates_default (GTK_ENTRY (impl->location_entry), TRUE); + location_entry_create (impl); gtk_table_attach (GTK_TABLE (impl->save_widgets_table), impl->location_entry, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, @@ -4480,53 +4492,6 @@ location_switch_to_path_bar (GtkFileChooserDefault *impl) gtk_widget_hide (impl->location_entry_box); } -/* Sets the full path of the current folder as the text in the location entry. */ -static void -location_entry_set_initial_text (GtkFileChooserDefault *impl) -{ - gchar *text, *filename; - - if (!impl->current_folder) - return; - - filename = g_file_get_path (impl->current_folder); - - if (filename) - { - text = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); - g_free (filename); - } - else - text = g_file_get_uri (impl->current_folder); - - if (text) - { - gboolean need_slash; - int len; - - len = strlen (text); - need_slash = (text[len - 1] != G_DIR_SEPARATOR); - - if (need_slash) - { - char *slash_text; - - slash_text = g_new (char, len + 2); - strcpy (slash_text, text); - slash_text[len] = G_DIR_SEPARATOR; - slash_text[len + 1] = 0; - - g_free (text); - text = slash_text; - } - - _gtk_file_chooser_entry_set_file_part (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), text); - g_free (text); - } - - g_free (filename); -} - /* Turns on the location entry. Can be called even if we are already in that * mode. */ @@ -4542,7 +4507,10 @@ location_switch_to_filename_entry (GtkFileChooserDefault *impl) return; if (impl->location_entry) - gtk_widget_destroy (impl->location_entry); + { + gtk_widget_destroy (impl->location_entry); + impl->location_entry = NULL; + } /* Box */ @@ -4550,19 +4518,13 @@ location_switch_to_filename_entry (GtkFileChooserDefault *impl) /* Entry */ - impl->location_entry = _gtk_file_chooser_entry_new (TRUE); - _gtk_file_chooser_entry_set_file_system (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), - impl->file_system); - gtk_entry_set_activates_default (GTK_ENTRY (impl->location_entry), TRUE); - _gtk_file_chooser_entry_set_action (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), impl->action); - + location_entry_create (impl); gtk_box_pack_start (GTK_BOX (impl->location_entry_box), impl->location_entry, TRUE, TRUE, 0); gtk_label_set_mnemonic_widget (GTK_LABEL (impl->location_label), impl->location_entry); /* Configure the entry */ _gtk_file_chooser_entry_set_base_folder (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), impl->current_folder); - _gtk_file_chooser_entry_set_local_only (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), impl->local_only); /* Done */ @@ -4915,9 +4877,13 @@ browse_widgets_create (GtkFileChooserDefault *impl) GtkWidget *widget; GtkSizeGroup *size_group; - /* size group is used by the scrolled windows of the panes */ - size_group = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL); impl->browse_widgets_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_box_pack_start (GTK_BOX (impl), impl->browse_widgets_box, TRUE, TRUE, 0); + gtk_widget_show (impl->browse_widgets_box); + + impl->browse_header_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_box_pack_start (GTK_BOX (impl->browse_widgets_box), impl->browse_header_box, FALSE, FALSE, 0); + gtk_widget_show (impl->browse_header_box); /* Path bar, info bar, and their respective machinery - the browse_path_bar_hbox will get packed elsewhere */ path_bar_widgets_create (impl); @@ -4925,12 +4891,15 @@ browse_widgets_create (GtkFileChooserDefault *impl) /* Box for the location label and entry */ impl->location_entry_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); - gtk_box_pack_start (GTK_BOX (impl->browse_widgets_box), impl->location_entry_box, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (impl->browse_header_box), impl->location_entry_box, FALSE, FALSE, 0); impl->location_label = gtk_label_new_with_mnemonic (_("_Location:")); gtk_widget_show (impl->location_label); gtk_box_pack_start (GTK_BOX (impl->location_entry_box), impl->location_label, FALSE, FALSE, 0); + /* size group is used by the scrolled windows of the panes */ + size_group = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL); + /* Paned widget */ hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); @@ -4969,7 +4938,6 @@ gtk_file_chooser_default_constructor (GType type, /* The browse widgets */ browse_widgets_create (impl); - gtk_box_pack_start (GTK_BOX (impl), impl->browse_widgets_box, TRUE, TRUE, 0); /* Alignment to hold extra widget */ impl->extra_align = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); @@ -5142,8 +5110,8 @@ restore_path_bar (GtkFileChooserDefault *impl) if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN || impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) { - gtk_box_pack_start (GTK_BOX (impl->browse_widgets_box), impl->browse_path_bar_hbox, FALSE, FALSE, 0); - gtk_box_reorder_child (GTK_BOX (impl->browse_widgets_box), impl->browse_path_bar_hbox, 0); + gtk_box_pack_start (GTK_BOX (impl->browse_header_box), impl->browse_path_bar_hbox, FALSE, FALSE, 0); + gtk_box_reorder_child (GTK_BOX (impl->browse_header_box), impl->browse_path_bar_hbox, 0); } else if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE || impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER) @@ -5225,6 +5193,140 @@ path_bar_update (GtkFileChooserDefault *impl) path_bar_set_mode (impl, mode); } +static void +operation_mode_discard_search_widgets (GtkFileChooserDefault *impl) +{ + if (impl->search_hbox) + { + gtk_widget_destroy (impl->search_hbox); + + impl->search_hbox = NULL; + impl->search_entry = NULL; + } +} + +/* Stops running operations like populating the browse model, searches, and the recent-files model */ +static void +operation_mode_stop (GtkFileChooserDefault *impl, OperationMode mode) +{ + switch (mode) + { + case OPERATION_MODE_BROWSE: + stop_loading_and_clear_list_model (impl, TRUE); + break; + + case OPERATION_MODE_SEARCH: + search_stop_searching (impl, FALSE); + search_clear_model (impl, TRUE); + + operation_mode_discard_search_widgets (impl); + break; + + case OPERATION_MODE_RECENT: + recent_stop_loading (impl); + recent_clear_model (impl, TRUE); + break; + + default: + g_assert_not_reached (); + } +} + +static void +operation_mode_set_browse (GtkFileChooserDefault *impl) +{ + path_bar_update (impl); + + if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN || + impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) + { + gtk_widget_show (impl->location_button); + location_mode_set (impl, impl->location_mode, TRUE); + + if (impl->location_mode == LOCATION_MODE_FILENAME_ENTRY) + gtk_widget_show (impl->location_entry_box); + } +} + +static void +operation_mode_set_search (GtkFileChooserDefault *impl) +{ + g_assert (impl->search_hbox == NULL); + g_assert (impl->search_entry == NULL); + g_assert (impl->search_model == NULL); + + search_setup_widgets (impl); +} + +static void +operation_mode_set_recent (GtkFileChooserDefault *impl) +{ + path_bar_update (impl); + + /* Hide the location widgets temporarily */ + if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN || + impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) + { + gtk_widget_hide (impl->location_button); + gtk_widget_hide (impl->location_entry_box); + } + + recent_start_loading (impl); +} + +/* Sometimes we need to frob the selection in the shortcuts list manually */ +static void +shortcuts_select_item_without_activating (GtkFileChooserDefault *impl, int pos) +{ + GtkTreeSelection *selection; + GtkTreePath *path; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view)); + + g_signal_handlers_block_by_func (selection, G_CALLBACK (shortcuts_selection_changed_cb), impl); + + path = gtk_tree_path_new_from_indices (pos, -1); + gtk_tree_selection_select_path (selection, path); + gtk_tree_path_free (path); + + g_signal_handlers_unblock_by_func (selection, G_CALLBACK (shortcuts_selection_changed_cb), impl); +} + +static void +operation_mode_set (GtkFileChooserDefault *impl, OperationMode mode) +{ + ShortcutsIndex shortcut_to_select; + + operation_mode_stop (impl, impl->operation_mode); + + impl->operation_mode = mode; + + switch (impl->operation_mode) + { + case OPERATION_MODE_BROWSE: + operation_mode_set_browse (impl); + shortcut_to_select = SHORTCUTS_CURRENT_FOLDER; + break; + + case OPERATION_MODE_SEARCH: + operation_mode_set_search (impl); + shortcut_to_select = SHORTCUTS_SEARCH; + break; + + case OPERATION_MODE_RECENT: + operation_mode_set_recent (impl); + shortcut_to_select = SHORTCUTS_RECENT; + break; + + default: + g_assert_not_reached (); + return; + } + + if (shortcut_to_select != SHORTCUTS_CURRENT_FOLDER) + shortcuts_select_item_without_activating (impl, shortcuts_get_index (impl, shortcut_to_select)); +} + /* This function is basically a do_all function. * * It sets the visibility on all the widgets based on the current state, and @@ -5262,7 +5364,6 @@ update_appearance (GtkFileChooserDefault *impl) { gtk_widget_show (impl->location_button); save_widgets_destroy (impl); - gtk_widget_show (impl->browse_widgets_box); location_mode_set (impl, impl->location_mode, TRUE); } @@ -6097,6 +6198,7 @@ load_set_model (GtkFileChooserDefault *impl) gtk_tree_view_columns_autosize (GTK_TREE_VIEW (impl->browse_files_tree_view)); gtk_tree_view_set_search_column (GTK_TREE_VIEW (impl->browse_files_tree_view), MODEL_COL_NAME); + file_list_set_sort_column_ids (impl); set_sort_column (impl); profile_msg (" gtk_tree_view_set_model end", NULL); impl->list_sort_ascending = TRUE; @@ -7122,17 +7224,7 @@ gtk_file_chooser_default_update_current_folder (GtkFileChooser *chooser, g_object_ref (file); - switch (impl->operation_mode) - { - case OPERATION_MODE_SEARCH: - search_switch_to_browse_mode (impl); - break; - case OPERATION_MODE_RECENT: - recent_switch_to_browse_mode (impl); - break; - case OPERATION_MODE_BROWSE: - break; - } + operation_mode_set (impl, OPERATION_MODE_BROWSE); if (impl->local_only && !g_file_is_native (file)) { @@ -8895,6 +8987,7 @@ search_engine_finished_cb (GtkSearchEngine *engine, */ gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), GTK_TREE_MODEL (impl->search_model)); + file_list_set_sort_column_ids (impl); #endif /* FMQ: if search was empty, say that we got no hits */ @@ -8964,34 +9057,6 @@ search_stop_searching (GtkFileChooserDefault *impl, } } -/* Stops any pending searches, clears the file list, and switches back to OPERATION_MODE_BROWSE */ -static void -search_switch_to_browse_mode (GtkFileChooserDefault *impl) -{ - g_assert (impl->operation_mode != OPERATION_MODE_BROWSE); - - search_stop_searching (impl, FALSE); - search_clear_model (impl, TRUE); - - gtk_widget_destroy (impl->search_hbox); - impl->search_hbox = NULL; - impl->search_entry = NULL; - - impl->operation_mode = OPERATION_MODE_BROWSE; - path_bar_update (impl); - - if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN || - impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) - { - gtk_widget_show (impl->location_button); - - if (impl->location_mode == LOCATION_MODE_FILENAME_ENTRY) - gtk_widget_show (impl->location_entry_box); - } - - file_list_set_sort_column_ids (impl); -} - /* Creates the search_model and puts it in the tree view */ static void search_setup_model (GtkFileChooserDefault *impl) @@ -9022,6 +9087,7 @@ search_setup_model (GtkFileChooserDefault *impl) */ gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), GTK_TREE_MODEL (impl->search_model)); + file_list_set_sort_column_ids (impl); } /* Creates a new query with the specified text and launches it */ @@ -9171,79 +9237,6 @@ search_setup_widgets (GtkFileChooserDefault *impl) /* FMQ: hide the filter combo? */ } -/* Stops running operations like populating the browse model, searches, and the recent-files model */ -static void -stop_operation (GtkFileChooserDefault *impl, OperationMode mode) -{ - switch (mode) - { - case OPERATION_MODE_BROWSE: - stop_loading_and_clear_list_model (impl, TRUE); - break; - - case OPERATION_MODE_SEARCH: - search_stop_searching (impl, FALSE); - search_clear_model (impl, TRUE); - - gtk_widget_destroy (impl->search_hbox); - impl->search_hbox = NULL; - impl->search_entry = NULL; - break; - - case OPERATION_MODE_RECENT: - recent_stop_loading (impl); - recent_clear_model (impl, TRUE); - break; - } -} - -/* Sometimes we need to frob the selection in the shortcuts list manually */ -static void -shortcuts_select_item_without_activating (GtkFileChooserDefault *impl, int pos) -{ - GtkTreeSelection *selection; - GtkTreePath *path; - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view)); - - g_signal_handlers_block_by_func (selection, G_CALLBACK (shortcuts_selection_changed_cb), impl); - - path = gtk_tree_path_new_from_indices (pos, -1); - gtk_tree_selection_select_path (selection, path); - gtk_tree_path_free (path); - - g_signal_handlers_unblock_by_func (selection, G_CALLBACK (shortcuts_selection_changed_cb), impl); -} - -/* Main entry point to the searching functions; this gets called when the user - * activates the Search shortcut. - */ -static void -search_activate (GtkFileChooserDefault *impl) -{ - OperationMode previous_mode; - - if (impl->operation_mode == OPERATION_MODE_SEARCH) - { - focus_search_entry_in_idle (impl); - return; - } - - previous_mode = impl->operation_mode; - impl->operation_mode = OPERATION_MODE_SEARCH; - - shortcuts_select_item_without_activating (impl, shortcuts_get_index (impl, SHORTCUTS_SEARCH)); - - stop_operation (impl, previous_mode); - - g_assert (impl->search_hbox == NULL); - g_assert (impl->search_entry == NULL); - g_assert (impl->search_model == NULL); - - search_setup_widgets (impl); - file_list_set_sort_column_ids (impl); -} - /* * Recent files support */ @@ -9276,34 +9269,6 @@ recent_stop_loading (GtkFileChooserDefault *impl) } } -/* Stops any pending load, clears the file list, and switches - * back to OPERATION_MODE_BROWSE - */ -static void -recent_switch_to_browse_mode (GtkFileChooserDefault *impl) -{ - g_assert (impl->operation_mode != OPERATION_MODE_BROWSE); - - recent_stop_loading (impl); - recent_clear_model (impl, TRUE); - - impl->operation_mode = OPERATION_MODE_BROWSE; - path_bar_update (impl); - - if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN || - impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) - { - gtk_widget_show (impl->location_button); - - if (impl->location_mode == LOCATION_MODE_FILENAME_ENTRY) - gtk_widget_show (impl->location_entry_box); - } - - gtk_tree_view_column_set_visible (impl->list_size_column, impl->show_size_column); - - file_list_set_sort_column_ids (impl); -} - static void recent_setup_model (GtkFileChooserDefault *impl) { @@ -9345,6 +9310,7 @@ recent_idle_cleanup (gpointer data) gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), GTK_TREE_MODEL (impl->recent_model)); + file_list_set_sort_column_ids (impl); set_busy_cursor (impl, FALSE); @@ -9537,45 +9503,6 @@ recent_should_respond (GtkFileChooserDefault *impl) return (gtk_tree_selection_count_selected_rows (selection) != 0); } -/* Hide the location widgets temporarily */ -static void -recent_hide_entry (GtkFileChooserDefault *impl) -{ - path_bar_update (impl); - - /* Hide the location widgets temporarily */ - if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN || - impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) - { - gtk_widget_hide (impl->location_button); - gtk_widget_hide (impl->location_entry_box); - } -} - -/* Main entry point to the recent files functions; this gets called when - * the user activates the Recently Used shortcut. - */ -static void -recent_activate (GtkFileChooserDefault *impl) -{ - OperationMode previous_mode; - - if (impl->operation_mode == OPERATION_MODE_RECENT) - return; - - previous_mode = impl->operation_mode; - impl->operation_mode = OPERATION_MODE_RECENT; - - shortcuts_select_item_without_activating (impl, shortcuts_get_index (impl, SHORTCUTS_RECENT)); - - stop_operation (impl, previous_mode); - - recent_hide_entry (impl); - - file_list_set_sort_column_ids (impl); - recent_start_loading (impl); -} - static void set_current_filter (GtkFileChooserDefault *impl, GtkFileFilter *filter) @@ -9749,17 +9676,7 @@ shortcuts_activate_volume (GtkFileChooserDefault *impl, { GFile *file; - switch (impl->operation_mode) - { - case OPERATION_MODE_BROWSE: - break; - case OPERATION_MODE_SEARCH: - search_switch_to_browse_mode (impl); - break; - case OPERATION_MODE_RECENT: - recent_switch_to_browse_mode (impl); - break; - } + operation_mode_set (impl, OPERATION_MODE_BROWSE); /* We ref the file chooser since volume_mount() may run a main loop, and the * user could close the file chooser window in the meantime. @@ -9866,7 +9783,10 @@ shortcuts_activate_iter (GtkFileChooserDefault *impl, gpointer col_data; ShortcutType shortcut_type; - if (impl->location_mode == LOCATION_MODE_FILENAME_ENTRY + /* In the Save modes, we want to preserve what the uesr typed in the filename + * entry, so that he may choose another folder without erasing his typed name. + */ + if (impl->location_entry && !(impl->action == GTK_FILE_CHOOSER_ACTION_SAVE || impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)) _gtk_file_chooser_entry_set_file_part (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), ""); @@ -9890,6 +9810,8 @@ shortcuts_activate_iter (GtkFileChooserDefault *impl, volume = col_data; + operation_mode_set (impl, OPERATION_MODE_BROWSE); + shortcuts_activate_volume (impl, volume); } else if (shortcut_type == SHORTCUT_TYPE_FILE) @@ -9897,6 +9819,8 @@ shortcuts_activate_iter (GtkFileChooserDefault *impl, struct ShortcutsActivateData *data; GtkFileSystemVolume *volume; + operation_mode_set (impl, OPERATION_MODE_BROWSE); + volume = _gtk_file_system_get_volume_for_file (impl->file_system, col_data); data = g_new0 (struct ShortcutsActivateData, 1); @@ -9928,11 +9852,11 @@ shortcuts_activate_iter (GtkFileChooserDefault *impl, } else if (shortcut_type == SHORTCUT_TYPE_SEARCH) { - search_activate (impl); + operation_mode_set (impl, OPERATION_MODE_SEARCH); } else if (shortcut_type == SHORTCUT_TYPE_RECENT) { - recent_activate (impl); + operation_mode_set (impl, OPERATION_MODE_RECENT); } } @@ -10196,21 +10120,9 @@ location_popup_handler (GtkFileChooserDefault *impl, if (impl->operation_mode != OPERATION_MODE_BROWSE) { GtkWidget *widget_to_focus; - - /* This will give us the location widgets back */ - switch (impl->operation_mode) - { - case OPERATION_MODE_SEARCH: - search_switch_to_browse_mode (impl); - break; - case OPERATION_MODE_RECENT: - recent_switch_to_browse_mode (impl); - break; - case OPERATION_MODE_BROWSE: - g_assert_not_reached (); - break; - } + operation_mode_set (impl, OPERATION_MODE_BROWSE); + if (impl->current_folder) change_folder_and_display_error (impl, impl->current_folder, FALSE); @@ -10226,34 +10138,11 @@ location_popup_handler (GtkFileChooserDefault *impl, if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN || impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) { - LocationMode new_mode; + if (!path) + return; - if (path != NULL) - { - /* since the user typed something, we unconditionally want to turn on the entry */ - new_mode = LOCATION_MODE_FILENAME_ENTRY; - } - else if (impl->location_mode == LOCATION_MODE_PATH_BAR) - new_mode = LOCATION_MODE_FILENAME_ENTRY; - else if (impl->location_mode == LOCATION_MODE_FILENAME_ENTRY) - new_mode = LOCATION_MODE_PATH_BAR; - else - { - g_assert_not_reached (); - return; - } - - location_mode_set (impl, new_mode, TRUE); - if (new_mode == LOCATION_MODE_FILENAME_ENTRY) - { - if (path != NULL) - location_set_user_text (impl, path); - else - { - location_entry_set_initial_text (impl); - gtk_editable_select_region (GTK_EDITABLE (impl->location_entry), 0, -1); - } - } + location_mode_set (impl, LOCATION_MODE_FILENAME_ENTRY, TRUE); + location_set_user_text (impl, path); } else if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE || impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER) diff --git a/gtk/gtkfilechooserprivate.h b/gtk/gtkfilechooserprivate.h index 2e2109f7af..dd4bccb97b 100644 --- a/gtk/gtkfilechooserprivate.h +++ b/gtk/gtkfilechooserprivate.h @@ -168,6 +168,7 @@ struct _GtkFileChooserDefault /* The file browsing widgets */ GtkWidget *browse_widgets_box; + GtkWidget *browse_header_box; GtkWidget *browse_shortcuts_tree_view; GtkWidget *browse_shortcuts_add_button; GtkWidget *browse_shortcuts_remove_button;