[file-roller: 8/26] file selector: implemented _[sg]et_selected_files



commit 8b33ca7ad83e1ccab3d14412db9344f1002c0d11
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Wed Aug 8 19:15:44 2012 +0200

    file selector: implemented _[sg]et_selected_files

 src/dlg-add.c                 |   43 +++++++++++++----------
 src/fr-file-selector-dialog.c |   74 ++++++++++++++++++++++++++++++++++------
 2 files changed, 87 insertions(+), 30 deletions(-)
---
diff --git a/src/dlg-add.c b/src/dlg-add.c
index 76c67bf..a969857 100644
--- a/src/dlg-add.c
+++ b/src/dlg-add.c
@@ -345,8 +345,9 @@ dlg_add_folder_load_options (DialogData *data,
 	char       *file_path;
 	GKeyFile   *key_file;
 	GError     *error = NULL;
-	char       *base_dir = NULL;
-	GList      *files = NULL;
+	char       *folder_uri = NULL;
+	GList      *uris = NULL;
+	GList      *files;
 	char       *include_files = NULL;
 	char       *exclude_files = NULL;
 	char       *exclude_folders = NULL;
@@ -368,15 +369,16 @@ dlg_add_folder_load_options (DialogData *data,
 		return FALSE;
 	}
 
-	base_dir = g_key_file_get_string (key_file, "Options", "base_dir", NULL);
-	folder = g_file_new_for_uri (base_dir);
+	folder_uri = g_key_file_get_string (key_file, "Options", "base_dir", NULL);
+	folder = g_file_new_for_uri (folder_uri);
 
-	files = _g_key_file_get_string_list (key_file, "Options", "files", NULL);
-	if (files == NULL) {
+	uris = _g_key_file_get_string_list (key_file, "Options", "files", NULL);
+	if (uris == NULL) {
 		char *filename = g_key_file_get_string (key_file, "Options", "filename", NULL);
 		if (filename != NULL)
-			files = g_list_append (NULL, filename);
+			uris = g_list_append (NULL, filename);
 	}
+	files = _g_file_list_new_from_uri_list (uris);
 
 	include_files = g_key_file_get_string (key_file, "Options", "include_files", NULL);
 	exclude_files = g_key_file_get_string (key_file, "Options", "exclude_files", NULL);
@@ -386,7 +388,7 @@ dlg_add_folder_load_options (DialogData *data,
 
 	sync_widgets_with_options (data,
 				   folder,
-			   	   files,
+				   files,
 			   	   include_files,
 			   	   exclude_files,
 			   	   exclude_folders,
@@ -396,8 +398,9 @@ dlg_add_folder_load_options (DialogData *data,
 	dlg_add_folder_save_last_used_options (data, file_path);
 
 	_g_object_unref (folder);
-	g_free (base_dir);
-	_g_string_list_free (files);
+	g_free (folder_uri);
+	_g_string_list_free (uris);
+	_g_object_list_unref (files);
 	g_free (include_files);
 	g_free (exclude_files);
 	g_free (exclude_folders);
@@ -456,17 +459,19 @@ get_options_from_widgets (DialogData   *data,
 			  gboolean     *update,
 			  gboolean     *no_symlinks)
 {
-	GList *files;
-	GList *scan;
-	int    i;
+	GList  *files;
+	char  **uris;
+	GList  *scan;
+	int     i;
 
 	*base_dir = fr_file_selector_dialog_get_current_folder (FR_FILE_SELECTOR_DIALOG (data->dialog));
-	files = fr_file_selector_dialog_get_selected_files (FR_FILE_SELECTOR_DIALOG (data->dialog));
 
-	*file_uris = g_new (char *, g_list_length (files) + 1);
-	for (scan = files; scan; scan = scan->next)
-		*file_uris[i++] = g_file_get_uri (G_FILE (scan->data));
-	file_uris[i] = NULL;
+	files = fr_file_selector_dialog_get_selected_files (FR_FILE_SELECTOR_DIALOG (data->dialog));
+	uris = g_new (char *, g_list_length (files) + 1);
+	for (scan = files, i = 0; scan; scan = scan->next)
+		uris[i++] = g_file_get_uri (G_FILE (scan->data));
+	uris[i] = NULL;
+	*file_uris = uris;
 	_g_object_list_unref (files);
 
 	*update = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("update_checkbutton")));
@@ -527,7 +532,7 @@ dlg_add_folder_save_current_options (DialogData *data,
 
 	key_file = g_key_file_new ();
 	_g_key_file_set_file_uri (key_file, "Options", "base_dir", folder);
-	g_key_file_set_string_list (key_file, "Options", "files", (const char * const *) files, -1);
+	g_key_file_set_string_list (key_file, "Options", "files", (const char * const *) files, g_strv_length (files));
 	g_key_file_set_string (key_file, "Options", "include_files", include_files);
 	g_key_file_set_string (key_file, "Options", "exclude_files", exclude_files);
 	g_key_file_set_string (key_file, "Options", "exclude_folders", exclude_folders);
diff --git a/src/fr-file-selector-dialog.c b/src/fr-file-selector-dialog.c
index e2548c1..8314177 100644
--- a/src/fr-file-selector-dialog.c
+++ b/src/fr-file-selector-dialog.c
@@ -73,6 +73,7 @@ typedef struct {
 	GFile                *folder;
 	GCancellable         *cancellable;
 	GList                *files;
+	GList                *files_to_select;
 } LoadData;
 
 
@@ -82,7 +83,7 @@ load_data_new (FrFileSelectorDialog *dialog,
 {
 	LoadData *load_data;
 
-	load_data = g_new (LoadData, 1);
+	load_data = g_slice_new0 (LoadData);
 	load_data->dialog = g_object_ref (dialog);
 	load_data->folder = _g_object_ref (folder);
 	load_data->cancellable = g_cancellable_new ();
@@ -102,7 +103,8 @@ load_data_free (LoadData *load_data)
 	_g_object_unref (load_data->folder);
 	g_object_unref (load_data->cancellable);
 	file_info_list_free (load_data->files);
-	g_free (load_data);
+	_g_object_list_unref (load_data->files_to_select);
+	g_slice_free (LoadData, load_data);
 }
 
 
@@ -370,7 +372,7 @@ update_places_list_ready_cb (GList    *files, /* FileInfo list */
 
 		icon = g_themed_icon_new ("drive-harddisk");
 		icon_pixbuf = gth_icon_cache_get_pixbuf (self->priv->icon_cache, icon);
-		file = g_file_new_for_path ("file:///");
+		file = g_file_new_for_path ("/");
 		gtk_list_store_set (list_store, &iter,
 				    PLACE_LIST_COLUMN_ICON, icon_pixbuf,
 				    PLACE_LIST_COLUMN_NAME, N_("File System"),
@@ -1086,7 +1088,7 @@ set_current_folder (FrFileSelectorDialog *self,
 	char        *folder_name;
 	GtkTreeIter  iter;
 
-	_g_clear_object (&self->priv->current_folder);
+	_g_object_unref (self->priv->current_folder);
 	self->priv->current_folder = g_object_ref (folder);
 
 	folder_name = g_file_get_parse_name (folder);
@@ -1130,6 +1132,7 @@ get_folder_content_done_cb (GError   *error,
 	GDateTime            *today;
 	int                   sort_column_id;
 	GtkSortType           sort_order;
+	GHashTable           *selected_files;
 
 	if (error != NULL) {
 		if (! g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
@@ -1149,6 +1152,10 @@ get_folder_content_done_cb (GError   *error,
 	gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (GET_WIDGET ("files_liststore")), &sort_column_id, &sort_order);
 	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GET_WIDGET ("files_liststore")), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, 0);
 
+	selected_files = g_hash_table_new (g_file_hash, (GEqualFunc) g_file_equal);
+	for (scan = load_data->files_to_select; scan; scan = scan->next)
+		g_hash_table_insert(selected_files, scan->data, GINT_TO_POINTER (1));
+
 	list_store = GTK_LIST_STORE (GET_WIDGET ("files_liststore"));
 	gtk_list_store_clear (list_store);
 	for (scan = load_data->files; scan; scan = scan->next) {
@@ -1184,6 +1191,7 @@ get_folder_content_done_cb (GError   *error,
 				    FILE_LIST_COLUMN_SIZE_ORDER, g_file_info_get_size (file_info->info),
 				    FILE_LIST_COLUMN_MODIFIED_ORDER, timeval.tv_sec,
 				    FILE_LIST_COLUMN_IS_FOLDER, is_folder,
+				    FILE_LIST_COLUMN_IS_SELECTED, (g_hash_table_lookup (selected_files, file_info->file) != NULL),
 				    -1);
 
 		g_free (collate_key);
@@ -1199,6 +1207,7 @@ get_folder_content_done_cb (GError   *error,
 	if (load_data->dialog->priv->current_operation == load_data)
 		load_data->dialog->priv->current_operation = NULL;
 
+	g_hash_table_unref (selected_files);
 	g_date_time_unref (today);
 	load_data_free (load_data);
 }
@@ -1217,16 +1226,16 @@ get_folder_content_for_each_child_cb (GFile     *file,
 }
 
 
-void
-fr_file_selector_dialog_set_current_folder (FrFileSelectorDialog *self,
-					    GFile                *folder)
+static void
+_set_current_folder (FrFileSelectorDialog *self,
+		     GFile                *folder,
+		     GList                *files)
 {
-	g_return_if_fail (folder != NULL);
-
 	if (self->priv->current_operation != NULL)
 		g_cancellable_cancel (self->priv->current_operation->cancellable);
 
 	self->priv->current_operation = load_data_new (self, folder);
+	self->priv->current_operation->files_to_select = _g_object_list_ref (files);
 
 	gtk_list_store_clear (GTK_LIST_STORE (GET_WIDGET ("files_liststore")));
 
@@ -1249,10 +1258,20 @@ fr_file_selector_dialog_set_current_folder (FrFileSelectorDialog *self,
 }
 
 
+void
+fr_file_selector_dialog_set_current_folder (FrFileSelectorDialog *self,
+					    GFile                *folder)
+{
+	g_return_if_fail (folder != NULL);
+
+	_set_current_folder (self, folder, NULL);
+}
+
+
 GFile *
 fr_file_selector_dialog_get_current_folder (FrFileSelectorDialog *self)
 {
-	return NULL;
+	return _g_object_ref (self->priv->current_folder);
 }
 
 
@@ -1260,12 +1279,45 @@ void
 fr_file_selector_dialog_set_selected_files (FrFileSelectorDialog  *self,
 					    GList                 *files)
 {
+	GFile *folder;
 
+	if (files == NULL)
+		return;
+
+	folder = g_file_get_parent (G_FILE (files->data));
+	_set_current_folder (self, folder, files);
+
+	g_object_unref (folder);
 }
 
 
 GList *
 fr_file_selector_dialog_get_selected_files (FrFileSelectorDialog *self)
 {
-	return NULL;
+	GtkListStore *list_store;
+	GtkTreeIter   iter;
+	GList        *list;
+
+	list_store = GTK_LIST_STORE (GET_WIDGET ("files_liststore"));
+	if (! gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter))
+		return NULL;
+
+	list = NULL;
+	do {
+		GFile    *file;
+		gboolean  is_selected;
+
+	        gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter,
+	        		    FILE_LIST_COLUMN_FILE, &file,
+	        		    FILE_LIST_COLUMN_IS_SELECTED, &is_selected,
+	                            -1);
+
+	        if (is_selected)
+	        	list = g_list_prepend (list, g_object_ref (file));
+
+	        g_object_unref (file);
+	}
+	while (gtk_tree_model_iter_next (GTK_TREE_MODEL (list_store), &iter));
+
+	return g_list_reverse (list);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]