X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkfilechooserutils.c;h=43148aa9c34654a9f33749f6b70978e18d213d51;hb=cb27c4b08c278ac7e8a882b638dbf30acd1436cf;hp=c7f34550ccc23afb5c0d4033a281b546f08b3fe4;hpb=d97cdbdf53832729141b3b66de00f770b44e3390;p=~andy%2Fgtk diff --git a/gtk/gtkfilechooserutils.c b/gtk/gtkfilechooserutils.c index c7f34550c..43148aa9c 100644 --- a/gtk/gtkfilechooserutils.c +++ b/gtk/gtkfilechooserutils.c @@ -14,9 +14,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -25,7 +23,7 @@ #include "gtkfilesystem.h" #include "gtktypebuiltins.h" #include "gtkintl.h" -#include "gtkalias.h" + static gboolean delegate_set_current_folder (GtkFileChooser *chooser, GFile *file, @@ -90,9 +88,6 @@ _gtk_file_chooser_install_properties (GObjectClass *klass) g_object_class_override_property (klass, GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET, "extra-widget"); - g_object_class_override_property (klass, - GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND, - "file-system-backend"); g_object_class_override_property (klass, GTK_FILE_CHOOSER_PROP_FILTER, "filter"); @@ -117,6 +112,9 @@ _gtk_file_chooser_install_properties (GObjectClass *klass) g_object_class_override_property (klass, GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION, "do-overwrite-confirmation"); + g_object_class_override_property (klass, + GTK_FILE_CHOOSER_PROP_CREATE_FOLDERS, + "create-folders"); } /** @@ -207,14 +205,14 @@ delegate_select_file (GtkFileChooser *chooser, GFile *file, GError **error) { - return _gtk_file_chooser_select_file (get_delegate (chooser), file, error); + return gtk_file_chooser_select_file (get_delegate (chooser), file, error); } static void delegate_unselect_file (GtkFileChooser *chooser, GFile *file) { - _gtk_file_chooser_unselect_file (get_delegate (chooser), file); + gtk_file_chooser_unselect_file (get_delegate (chooser), file); } static void @@ -232,13 +230,13 @@ delegate_unselect_all (GtkFileChooser *chooser) static GSList * delegate_get_files (GtkFileChooser *chooser) { - return _gtk_file_chooser_get_files (get_delegate (chooser)); + return gtk_file_chooser_get_files (get_delegate (chooser)); } static GFile * delegate_get_preview_file (GtkFileChooser *chooser) { - return _gtk_file_chooser_get_preview_file (get_delegate (chooser)); + return gtk_file_chooser_get_preview_file (get_delegate (chooser)); } static GtkFileSystem * @@ -286,7 +284,7 @@ delegate_remove_shortcut_folder (GtkFileChooser *chooser, static GSList * delegate_list_shortcut_folders (GtkFileChooser *chooser) { - return gtk_file_chooser_list_shortcut_folders (get_delegate (chooser)); + return _gtk_file_chooser_list_shortcut_folder_files (get_delegate (chooser)); } static gboolean @@ -294,13 +292,13 @@ delegate_set_current_folder (GtkFileChooser *chooser, GFile *file, GError **error) { - return _gtk_file_chooser_set_current_folder_file (get_delegate (chooser), file, error); + return gtk_file_chooser_set_current_folder_file (get_delegate (chooser), file, error); } static GFile * delegate_get_current_folder (GtkFileChooser *chooser) { - return _gtk_file_chooser_get_current_folder_file (get_delegate (chooser)); + return gtk_file_chooser_get_current_folder_file (get_delegate (chooser)); } static void @@ -360,3 +358,86 @@ delegate_confirm_overwrite (GtkFileChooser *chooser, g_signal_emit_by_name (data, "confirm-overwrite", &conf); return conf; } + +static GFile * +get_parent_for_uri (const char *uri) +{ + GFile *file; + GFile *parent; + + file = g_file_new_for_uri (uri); + parent = g_file_get_parent (file); + + g_object_unref (file); + return parent; + +} + +/* Extracts the parent folders out of the supplied list of GtkRecentInfo* items, and returns + * a list of GFile* for those unique parents. + */ +GList * +_gtk_file_chooser_extract_recent_folders (GList *infos) +{ + GList *l; + GList *result; + GHashTable *folders; + + result = NULL; + + folders = g_hash_table_new (g_file_hash, (GEqualFunc) g_file_equal); + + for (l = infos; l; l = l->next) + { + GtkRecentInfo *info = l->data; + const char *uri; + GFile *parent; + + uri = gtk_recent_info_get_uri (info); + parent = get_parent_for_uri (uri); + + if (parent) + { + if (!g_hash_table_lookup (folders, parent)) + { + g_hash_table_insert (folders, parent, (gpointer) 1); + result = g_list_prepend (result, g_object_ref (parent)); + } + + g_object_unref (parent); + } + } + + result = g_list_reverse (result); + + g_hash_table_destroy (folders); + + return result; +} + +GSettings * +_gtk_file_chooser_get_settings_for_widget (GtkWidget *widget) +{ + static GQuark file_chooser_settings_quark = 0; + GtkSettings *gtksettings; + GSettings *settings; + + if (G_UNLIKELY (file_chooser_settings_quark == 0)) + file_chooser_settings_quark = g_quark_from_static_string ("-gtk-file-chooser-settings"); + + gtksettings = gtk_widget_get_settings (widget); + settings = g_object_get_qdata (G_OBJECT (gtksettings), file_chooser_settings_quark); + + if (G_UNLIKELY (settings == NULL)) + { + settings = g_settings_new ("org.gtk.Settings.FileChooser"); + g_settings_delay (settings); + + g_object_set_qdata_full (G_OBJECT (gtksettings), + file_chooser_settings_quark, + settings, + g_object_unref); + } + + return settings; +}