mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 22:20:24 +00:00
Merge branch 'bgo593793-filechooser-recent-folders-master'
This commit is contained in:
commit
af00ca81e1
@ -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)
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user