diff options
author | Federico Mena Quintero <federico@ximian.com> | 2005-10-03 20:27:52 +0000 |
---|---|---|
committer | Federico Mena Quintero <federico@src.gnome.org> | 2005-10-03 20:27:52 +0000 |
commit | 55a7c31665310549a0b6eca3c668d4c7567396d0 (patch) | |
tree | 3099deaf08b9ca498888477375145e2656bc1bb7 | |
parent | 8d0574f9cfe7b4992a6bc99c1754d7fe132c7a84 (diff) | |
download | gdk-pixbuf-55a7c31665310549a0b6eca3c668d4c7567396d0.tar.gz |
Merged from HEAD:
2005-10-03 Federico Mena Quintero <federico@ximian.com>
Merged from HEAD:
Don't reload the current folder unnecessarily on ::map().
* gtk/gtkfilechooserprivate.h (ReloadState): New enum to represent
the reloading state.
(struct _GtkFileChooserDefault): Added a "reload_state" field.
* gtk/gtkfilechooserdefault.c (gtk_file_chooser_default_init):
Initialize impl->reload_state.
(gtk_file_chooser_default_map): Check the impl->reload_state; load
a default folder if no folder has been set, or reload the current
one only if we had been unmapped first.
(gtk_file_chooser_default_update_current_folder): Set the
reload_state to RELOAD_HAS_FOLDER.
(gtk_file_chooser_default_unmap): Implement, and set the
reload_state to RELOAD_WAS_UNMAPPED.
(shortcuts_model_create): Don't call shortcuts_add_bookmarks()
here; they'll get (re)loaded on ::map() anyway.
* gtk/gtkfilechooserwidget.c
(gtk_file_chooser_widget_constructor): Don't set a default folder here.
* tests/autotestfilechooser.c (test_action_widgets): Don't take in
a dialog; build it ourselves.
(test_reload): New test to ensure that we don't load the default
folder more than once, and that we reload it when
unmapping/remapping.
(get_impl_from_dialog): New utility function.
(test_widgets_for_current_action): Use get_impl_from_dialog().
-rw-r--r-- | ChangeLog | 33 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 33 | ||||
-rw-r--r-- | gtk/gtkfilechooserdefault.c | 48 | ||||
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 5 |
4 files changed, 112 insertions, 7 deletions
@@ -1,3 +1,36 @@ +2005-10-03 Federico Mena Quintero <federico@ximian.com> + + Merged from HEAD: + + Don't reload the current folder unnecessarily on ::map(). + + * gtk/gtkfilechooserprivate.h (ReloadState): New enum to represent + the reloading state. + (struct _GtkFileChooserDefault): Added a "reload_state" field. + + * gtk/gtkfilechooserdefault.c (gtk_file_chooser_default_init): + Initialize impl->reload_state. + (gtk_file_chooser_default_map): Check the impl->reload_state; load + a default folder if no folder has been set, or reload the current + one only if we had been unmapped first. + (gtk_file_chooser_default_update_current_folder): Set the + reload_state to RELOAD_HAS_FOLDER. + (gtk_file_chooser_default_unmap): Implement, and set the + reload_state to RELOAD_WAS_UNMAPPED. + (shortcuts_model_create): Don't call shortcuts_add_bookmarks() + here; they'll get (re)loaded on ::map() anyway. + + * gtk/gtkfilechooserwidget.c + (gtk_file_chooser_widget_constructor): Don't set a default folder here. + + * tests/autotestfilechooser.c (test_action_widgets): Don't take in + a dialog; build it ourselves. + (test_reload): New test to ensure that we don't load the default + folder more than once, and that we reload it when + unmapping/remapping. + (get_impl_from_dialog): New utility function. + (test_widgets_for_current_action): Use get_impl_from_dialog(). + 2005-10-03 Matthias Clasen <mclasen@redhat.com> * configure.in: Bump version diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index ff58f5359..e48778908 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,36 @@ +2005-10-03 Federico Mena Quintero <federico@ximian.com> + + Merged from HEAD: + + Don't reload the current folder unnecessarily on ::map(). + + * gtk/gtkfilechooserprivate.h (ReloadState): New enum to represent + the reloading state. + (struct _GtkFileChooserDefault): Added a "reload_state" field. + + * gtk/gtkfilechooserdefault.c (gtk_file_chooser_default_init): + Initialize impl->reload_state. + (gtk_file_chooser_default_map): Check the impl->reload_state; load + a default folder if no folder has been set, or reload the current + one only if we had been unmapped first. + (gtk_file_chooser_default_update_current_folder): Set the + reload_state to RELOAD_HAS_FOLDER. + (gtk_file_chooser_default_unmap): Implement, and set the + reload_state to RELOAD_WAS_UNMAPPED. + (shortcuts_model_create): Don't call shortcuts_add_bookmarks() + here; they'll get (re)loaded on ::map() anyway. + + * gtk/gtkfilechooserwidget.c + (gtk_file_chooser_widget_constructor): Don't set a default folder here. + + * tests/autotestfilechooser.c (test_action_widgets): Don't take in + a dialog; build it ourselves. + (test_reload): New test to ensure that we don't load the default + folder more than once, and that we reload it when + unmapping/remapping. + (get_impl_from_dialog): New utility function. + (test_widgets_for_current_action): Use get_impl_from_dialog(). + 2005-10-03 Matthias Clasen <mclasen@redhat.com> * configure.in: Bump version diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index e89133880..ee285ba52 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -152,6 +152,12 @@ typedef enum { LOAD_FINISHED /* Model is fully loaded and inserted into the tree */ } LoadState; +typedef enum { + RELOAD_EMPTY, /* No folder has been set */ + RELOAD_HAS_FOLDER, /* We have a folder, although it may not be completely loaded yet; no need to reload */ + RELOAD_WAS_UNMAPPED /* We had a folder but got unmapped; reload is needed */ +} ReloadState; + #define MAX_LOADING_TIME 500 struct _GtkFileChooserDefaultClass @@ -206,6 +212,7 @@ struct _GtkFileChooserDefault GtkTreeModelSort *sort_model; LoadState load_state; + ReloadState reload_state; guint load_timeout_id; GSList *pending_select_paths; @@ -373,6 +380,7 @@ static void gtk_file_chooser_default_get_property (GObject *ob static void gtk_file_chooser_default_dispose (GObject *object); static void gtk_file_chooser_default_show_all (GtkWidget *widget); static void gtk_file_chooser_default_map (GtkWidget *widget); +static void gtk_file_chooser_default_unmap (GtkWidget *widget); static void gtk_file_chooser_default_hierarchy_changed (GtkWidget *widget, GtkWidget *previous_toplevel); static void gtk_file_chooser_default_style_set (GtkWidget *widget, @@ -615,6 +623,7 @@ gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class) widget_class->show_all = gtk_file_chooser_default_show_all; widget_class->map = gtk_file_chooser_default_map; + widget_class->unmap = gtk_file_chooser_default_unmap; widget_class->hierarchy_changed = gtk_file_chooser_default_hierarchy_changed; widget_class->style_set = gtk_file_chooser_default_style_set; widget_class->screen_changed = gtk_file_chooser_default_screen_changed; @@ -745,6 +754,7 @@ gtk_file_chooser_default_init (GtkFileChooserDefault *impl) impl->show_hidden = FALSE; impl->icon_size = FALLBACK_ICON_SIZE; impl->load_state = LOAD_EMPTY; + impl->reload_state = RELOAD_EMPTY; impl->pending_select_paths = NULL; gtk_box_set_spacing (GTK_BOX (impl), 12); @@ -1862,7 +1872,6 @@ shortcuts_model_create (GtkFileChooserDefault *impl) shortcuts_append_home (impl); shortcuts_append_desktop (impl); shortcuts_add_volumes (impl); - shortcuts_add_bookmarks (impl); } impl->shortcuts_filter_model = shortcuts_model_filter_new (impl, @@ -4746,6 +4755,7 @@ static void gtk_file_chooser_default_map (GtkWidget *widget) { GtkFileChooserDefault *impl; + char *current_working_dir; profile_start ("start", NULL); @@ -4753,10 +4763,29 @@ gtk_file_chooser_default_map (GtkWidget *widget) GTK_WIDGET_CLASS (parent_class)->map (widget); - if (impl->current_folder) + switch (impl->reload_state) { + case RELOAD_EMPTY: + /* The user didn't explicitly give us a folder to display, so we'll use the cwd */ + current_working_dir = g_get_current_dir (); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (impl), current_working_dir); + g_free (current_working_dir); + break; + + case RELOAD_HAS_FOLDER: + /* Nothing; we are already loading or loaded, so we don't need to reload */ + break; + + case RELOAD_WAS_UNMAPPED: + /* Just reload the current folder */ + g_assert (impl->current_folder != NULL); + pending_select_paths_store_selection (impl); change_folder_and_display_error (impl, impl->current_folder); + break; + + default: + g_assert_not_reached (); } bookmarks_changed_cb (impl->file_system, impl); @@ -4764,6 +4793,19 @@ gtk_file_chooser_default_map (GtkWidget *widget) profile_end ("end", NULL); } +/* GtkWidget::unmap method */ +static void +gtk_file_chooser_default_unmap (GtkWidget *widget) +{ + GtkFileChooserDefault *impl; + + impl = GTK_FILE_CHOOSER_DEFAULT (widget); + + GTK_WIDGET_CLASS (parent_class)->unmap (widget); + + impl->reload_state = RELOAD_WAS_UNMAPPED; +} + static gboolean list_model_filter_func (GtkFileSystemModel *model, GtkFilePath *path, @@ -5369,6 +5411,8 @@ gtk_file_chooser_default_update_current_folder (GtkFileChooser *chooser, gtk_file_path_free (impl->current_folder); impl->current_folder = gtk_file_path_copy (path); + + impl->reload_state = RELOAD_HAS_FOLDER; } /* Update the widgets that may trigger a folder change themselves. */ diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 29a0a3a7e..00c4d2524 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -144,7 +144,6 @@ gtk_file_chooser_widget_constructor (GType type, { GtkFileChooserWidgetPrivate *priv; GObject *object; - gchar *current_folder; object = parent_class->constructor (type, n_construct_properties, @@ -158,10 +157,6 @@ gtk_file_chooser_widget_constructor (GType type, gtk_box_pack_start (GTK_BOX (object), priv->impl, TRUE, TRUE, 0); gtk_widget_show (priv->impl); - current_folder = g_get_current_dir (); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (priv->impl), current_folder); - g_free (current_folder); - _gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (object), GTK_FILE_CHOOSER (priv->impl)); |