Merge branch 'bgo593793-filechooser-recent-folders-master'

This commit is contained in:
Federico Mena Quintero 2011-07-27 18:56:39 -05:00
commit af00ca81e1
2 changed files with 196 additions and 306 deletions

View File

@ -406,22 +406,23 @@ static void location_switch_to_path_bar (GtkFileChooserDefault *impl);
static void stop_loading_and_clear_list_model (GtkFileChooserDefault *impl, static void stop_loading_and_clear_list_model (GtkFileChooserDefault *impl,
gboolean remove_from_treeview); gboolean remove_from_treeview);
static void search_setup_widgets (GtkFileChooserDefault *impl);
static void search_stop_searching (GtkFileChooserDefault *impl, static void search_stop_searching (GtkFileChooserDefault *impl,
gboolean remove_query); gboolean remove_query);
static void search_clear_model (GtkFileChooserDefault *impl, static void search_clear_model (GtkFileChooserDefault *impl,
gboolean remove_from_treeview); gboolean remove_from_treeview);
static gboolean search_should_respond (GtkFileChooserDefault *impl); 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 GSList *search_get_selected_files (GtkFileChooserDefault *impl);
static void search_entry_activate_cb (GtkEntry *entry, static void search_entry_activate_cb (GtkEntry *entry,
gpointer data); gpointer data);
static void settings_load (GtkFileChooserDefault *impl); static void settings_load (GtkFileChooserDefault *impl);
static void recent_start_loading (GtkFileChooserDefault *impl);
static void recent_stop_loading (GtkFileChooserDefault *impl); static void recent_stop_loading (GtkFileChooserDefault *impl);
static void recent_clear_model (GtkFileChooserDefault *impl, static void recent_clear_model (GtkFileChooserDefault *impl,
gboolean remove_from_treeview); gboolean remove_from_treeview);
static gboolean recent_should_respond (GtkFileChooserDefault *impl); 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 GSList * recent_get_selected_files (GtkFileChooserDefault *impl);
static void set_file_system_backend (GtkFileChooserDefault *impl); static void set_file_system_backend (GtkFileChooserDefault *impl);
static void unset_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 /* 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 * 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 static gboolean
browse_files_key_press_event_cb (GtkWidget *widget, browse_files_key_press_event_cb (GtkWidget *widget,
@ -4151,7 +4152,9 @@ typedef struct {
gint model_column; gint model_column;
} ColumnMap; } 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 static void
file_list_set_sort_column_ids (GtkFileChooserDefault *impl) file_list_set_sort_column_ids (GtkFileChooserDefault *impl)
{ {
@ -4389,6 +4392,20 @@ file_pane_create (GtkFileChooserDefault *impl,
return vbox; 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 */ /* Creates the widgets specific to Save mode */
static void static void
save_widgets_create (GtkFileChooserDefault *impl) save_widgets_create (GtkFileChooserDefault *impl)
@ -4422,12 +4439,7 @@ save_widgets_create (GtkFileChooserDefault *impl)
/* Location entry */ /* Location entry */
impl->location_entry = _gtk_file_chooser_entry_new (TRUE); location_entry_create (impl);
_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);
gtk_table_attach (GTK_TABLE (impl->save_widgets_table), impl->location_entry, gtk_table_attach (GTK_TABLE (impl->save_widgets_table), impl->location_entry,
1, 2, 0, 1, 1, 2, 0, 1,
GTK_EXPAND | GTK_FILL, 0, GTK_EXPAND | GTK_FILL, 0,
@ -4480,53 +4492,6 @@ location_switch_to_path_bar (GtkFileChooserDefault *impl)
gtk_widget_hide (impl->location_entry_box); 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 /* Turns on the location entry. Can be called even if we are already in that
* mode. * mode.
*/ */
@ -4542,7 +4507,10 @@ location_switch_to_filename_entry (GtkFileChooserDefault *impl)
return; return;
if (impl->location_entry) if (impl->location_entry)
gtk_widget_destroy (impl->location_entry); {
gtk_widget_destroy (impl->location_entry);
impl->location_entry = NULL;
}
/* Box */ /* Box */
@ -4550,19 +4518,13 @@ location_switch_to_filename_entry (GtkFileChooserDefault *impl)
/* Entry */ /* Entry */
impl->location_entry = _gtk_file_chooser_entry_new (TRUE); location_entry_create (impl);
_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);
gtk_box_pack_start (GTK_BOX (impl->location_entry_box), impl->location_entry, TRUE, TRUE, 0); 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); gtk_label_set_mnemonic_widget (GTK_LABEL (impl->location_label), impl->location_entry);
/* Configure the 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_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 */ /* Done */
@ -4915,9 +4877,13 @@ browse_widgets_create (GtkFileChooserDefault *impl)
GtkWidget *widget; GtkWidget *widget;
GtkSizeGroup *size_group; 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); 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, info bar, and their respective machinery - the browse_path_bar_hbox will get packed elsewhere */
path_bar_widgets_create (impl); path_bar_widgets_create (impl);
@ -4925,12 +4891,15 @@ browse_widgets_create (GtkFileChooserDefault *impl)
/* Box for the location label and entry */ /* Box for the location label and entry */
impl->location_entry_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); 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:")); impl->location_label = gtk_label_new_with_mnemonic (_("_Location:"));
gtk_widget_show (impl->location_label); gtk_widget_show (impl->location_label);
gtk_box_pack_start (GTK_BOX (impl->location_entry_box), impl->location_label, FALSE, FALSE, 0); 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 */ /* Paned widget */
hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
@ -4969,7 +4938,6 @@ gtk_file_chooser_default_constructor (GType type,
/* The browse widgets */ /* The browse widgets */
browse_widgets_create (impl); browse_widgets_create (impl);
gtk_box_pack_start (GTK_BOX (impl), impl->browse_widgets_box, TRUE, TRUE, 0);
/* Alignment to hold extra widget */ /* Alignment to hold extra widget */
impl->extra_align = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); 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 if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN
|| impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) || 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_pack_start (GTK_BOX (impl->browse_header_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_reorder_child (GTK_BOX (impl->browse_header_box), impl->browse_path_bar_hbox, 0);
} }
else if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE else if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE
|| impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER) || impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
@ -5225,6 +5193,140 @@ path_bar_update (GtkFileChooserDefault *impl)
path_bar_set_mode (impl, mode); 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. /* This function is basically a do_all function.
* *
* It sets the visibility on all the widgets based on the current state, and * 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); gtk_widget_show (impl->location_button);
save_widgets_destroy (impl); save_widgets_destroy (impl);
gtk_widget_show (impl->browse_widgets_box);
location_mode_set (impl, impl->location_mode, TRUE); 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_columns_autosize (GTK_TREE_VIEW (impl->browse_files_tree_view));
gtk_tree_view_set_search_column (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); MODEL_COL_NAME);
file_list_set_sort_column_ids (impl);
set_sort_column (impl); set_sort_column (impl);
profile_msg (" gtk_tree_view_set_model end", NULL); profile_msg (" gtk_tree_view_set_model end", NULL);
impl->list_sort_ascending = TRUE; impl->list_sort_ascending = TRUE;
@ -7122,17 +7224,7 @@ gtk_file_chooser_default_update_current_folder (GtkFileChooser *chooser,
g_object_ref (file); g_object_ref (file);
switch (impl->operation_mode) operation_mode_set (impl, OPERATION_MODE_BROWSE);
{
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;
}
if (impl->local_only && !g_file_is_native (file)) 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_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
GTK_TREE_MODEL (impl->search_model)); GTK_TREE_MODEL (impl->search_model));
file_list_set_sort_column_ids (impl);
#endif #endif
/* FMQ: if search was empty, say that we got no hits */ /* 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 */ /* Creates the search_model and puts it in the tree view */
static void static void
search_setup_model (GtkFileChooserDefault *impl) 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_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
GTK_TREE_MODEL (impl->search_model)); GTK_TREE_MODEL (impl->search_model));
file_list_set_sort_column_ids (impl);
} }
/* Creates a new query with the specified text and launches it */ /* 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? */ /* 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 * 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 static void
recent_setup_model (GtkFileChooserDefault *impl) 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_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
GTK_TREE_MODEL (impl->recent_model)); GTK_TREE_MODEL (impl->recent_model));
file_list_set_sort_column_ids (impl);
set_busy_cursor (impl, FALSE); set_busy_cursor (impl, FALSE);
@ -9537,45 +9503,6 @@ recent_should_respond (GtkFileChooserDefault *impl)
return (gtk_tree_selection_count_selected_rows (selection) != 0); 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 static void
set_current_filter (GtkFileChooserDefault *impl, set_current_filter (GtkFileChooserDefault *impl,
GtkFileFilter *filter) GtkFileFilter *filter)
@ -9749,17 +9676,7 @@ shortcuts_activate_volume (GtkFileChooserDefault *impl,
{ {
GFile *file; GFile *file;
switch (impl->operation_mode) operation_mode_set (impl, OPERATION_MODE_BROWSE);
{
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;
}
/* We ref the file chooser since volume_mount() may run a main loop, and the /* 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. * user could close the file chooser window in the meantime.
@ -9866,7 +9783,10 @@ shortcuts_activate_iter (GtkFileChooserDefault *impl,
gpointer col_data; gpointer col_data;
ShortcutType shortcut_type; 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_SAVE
|| impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)) || impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER))
_gtk_file_chooser_entry_set_file_part (GTK_FILE_CHOOSER_ENTRY (impl->location_entry), ""); _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; volume = col_data;
operation_mode_set (impl, OPERATION_MODE_BROWSE);
shortcuts_activate_volume (impl, volume); shortcuts_activate_volume (impl, volume);
} }
else if (shortcut_type == SHORTCUT_TYPE_FILE) else if (shortcut_type == SHORTCUT_TYPE_FILE)
@ -9897,6 +9819,8 @@ shortcuts_activate_iter (GtkFileChooserDefault *impl,
struct ShortcutsActivateData *data; struct ShortcutsActivateData *data;
GtkFileSystemVolume *volume; GtkFileSystemVolume *volume;
operation_mode_set (impl, OPERATION_MODE_BROWSE);
volume = _gtk_file_system_get_volume_for_file (impl->file_system, col_data); volume = _gtk_file_system_get_volume_for_file (impl->file_system, col_data);
data = g_new0 (struct ShortcutsActivateData, 1); data = g_new0 (struct ShortcutsActivateData, 1);
@ -9928,11 +9852,11 @@ shortcuts_activate_iter (GtkFileChooserDefault *impl,
} }
else if (shortcut_type == SHORTCUT_TYPE_SEARCH) else if (shortcut_type == SHORTCUT_TYPE_SEARCH)
{ {
search_activate (impl); operation_mode_set (impl, OPERATION_MODE_SEARCH);
} }
else if (shortcut_type == SHORTCUT_TYPE_RECENT) 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) if (impl->operation_mode != OPERATION_MODE_BROWSE)
{ {
GtkWidget *widget_to_focus; 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) if (impl->current_folder)
change_folder_and_display_error (impl, impl->current_folder, FALSE); 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 || if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
{ {
LocationMode new_mode; if (!path)
return;
if (path != NULL) location_mode_set (impl, LOCATION_MODE_FILENAME_ENTRY, TRUE);
{ location_set_user_text (impl, path);
/* 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);
}
}
} }
else if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE || else if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE ||
impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER) impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)

View File

@ -168,6 +168,7 @@ struct _GtkFileChooserDefault
/* The file browsing widgets */ /* The file browsing widgets */
GtkWidget *browse_widgets_box; GtkWidget *browse_widgets_box;
GtkWidget *browse_header_box;
GtkWidget *browse_shortcuts_tree_view; GtkWidget *browse_shortcuts_tree_view;
GtkWidget *browse_shortcuts_add_button; GtkWidget *browse_shortcuts_add_button;
GtkWidget *browse_shortcuts_remove_button; GtkWidget *browse_shortcuts_remove_button;