[gthumb] update the catalog after removing files or deleting files from disk
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] update the catalog after removing files or deleting files from disk
- Date: Sat, 17 Sep 2016 16:47:58 +0000 (UTC)
commit cc8433e5460600301341609981c1dae7e98863e1
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sat Sep 17 18:17:20 2016 +0200
update the catalog after removing files or deleting files from disk
extensions/catalogs/actions.c | 6 +-
extensions/catalogs/gth-file-source-catalogs.c | 47 +++++++-----
extensions/catalogs/gth-file-source-catalogs.h | 3 +-
extensions/selections/actions.c | 2 +-
extensions/selections/gth-file-source-selections.c | 12 +++-
extensions/selections/gth-selections-manager.c | 14 ++--
extensions/selections/gth-selections-manager.h | 3 +-
gthumb/gth-browser.c | 9 ++-
gthumb/gth-file-source.c | 79 +++++++++++++++++---
gthumb/gth-file-source.h | 6 ++
10 files changed, 139 insertions(+), 42 deletions(-)
---
diff --git a/extensions/catalogs/actions.c b/extensions/catalogs/actions.c
index 195e3b9..83e82f3 100644
--- a/extensions/catalogs/actions.c
+++ b/extensions/catalogs/actions.c
@@ -46,14 +46,18 @@ gth_browser_activate_remove_from_catalog (GSimpleAction *action,
GthBrowser *browser = GTH_BROWSER (user_data);
GList *items;
GList *file_data_list;
+ GList *file_list;
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view
(browser)));
file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+ file_list = gth_file_data_list_to_file_list (file_data_list);
gth_catalog_manager_remove_files (GTK_WINDOW (browser),
gth_browser_get_location_data (browser),
- file_data_list);
+ file_list,
+ TRUE);
+ _g_object_list_unref (file_list);
_g_object_list_unref (file_data_list);
_gtk_tree_path_list_free (items);
}
diff --git a/extensions/catalogs/gth-file-source-catalogs.c b/extensions/catalogs/gth-file-source-catalogs.c
index c3e3bdf..ed82f20 100644
--- a/extensions/catalogs/gth-file-source-catalogs.c
+++ b/extensions/catalogs/gth-file-source-catalogs.c
@@ -1307,9 +1307,10 @@ gth_file_source_catalogs_reorder (GthFileSource *file_source,
typedef struct {
GtkWindow *parent;
- GList *file_data_list;
+ GList *file_list;
GFile *gio_file;
GthCatalog *catalog;
+ gboolean notify;
} RemoveFromCatalogData;
@@ -1322,7 +1323,7 @@ remove_from_catalog_end (GError *error,
g_object_unref (data->catalog);
g_object_unref (data->gio_file);
- _g_object_list_unref (data->file_data_list);
+ _g_object_list_unref (data->file_list);
g_free (data);
}
@@ -1335,22 +1336,15 @@ remove_files__catalog_save_done_cb (void **buffer,
{
RemoveFromCatalogData *data = user_data;
- if (error == NULL) {
+ if ((error == NULL) && data->notify) {
GFile *catalog_file;
- GList *files = NULL;
- GList *scan;
catalog_file = gth_catalog_file_from_gio_file (data->gio_file, NULL);
- for (scan = data->file_data_list; scan; scan = scan->next)
- files = g_list_prepend (files, g_object_ref (((GthFileData*) scan->data)->file));
- files = g_list_reverse (files);
-
gth_monitor_folder_changed (gth_main_get_default_monitor (),
catalog_file,
- files,
+ data->file_list,
GTH_MONITOR_EVENT_REMOVED);
- _g_object_list_unref (files);
g_object_unref (catalog_file);
}
@@ -1387,9 +1381,9 @@ catalog_buffer_ready_cb (void **buffer,
return;
}
- for (scan = data->file_data_list; scan; scan = scan->next) {
- GthFileData *file_data = scan->data;
- gth_catalog_remove_file (data->catalog, file_data->file);
+ for (scan = data->file_list; scan; scan = scan->next) {
+ GFile *file = scan->data;
+ gth_catalog_remove_file (data->catalog, file);
}
catalog_buffer = gth_catalog_to_data (data->catalog, &catalog_size);
@@ -1412,14 +1406,16 @@ catalog_buffer_ready_cb (void **buffer,
void
gth_catalog_manager_remove_files (GtkWindow *parent,
GthFileData *location,
- GList *file_list)
+ GList *file_list,
+ gboolean notify)
{
RemoveFromCatalogData *data;
data = g_new0 (RemoveFromCatalogData, 1);
data->parent = parent;
- data->file_data_list = gth_file_data_list_dup (file_list);
+ data->file_list = _g_file_list_dup (file_list);
data->gio_file = gth_main_get_gio_file (location->file);
+ data->notify = notify;
_g_file_load_async (data->gio_file,
G_PRIORITY_DEFAULT,
@@ -1432,11 +1428,25 @@ gth_catalog_manager_remove_files (GtkWindow *parent,
static void
gth_file_source_catalogs_remove (GthFileSource *file_source,
GthFileData *location,
- GList *file_list /* GthFileData list */,
+ GList *file_data_list /* GthFileData list */,
gboolean permanently,
GtkWindow *parent)
{
- gth_catalog_manager_remove_files (parent, location, file_list);
+ GList *file_list;
+
+ file_list = gth_file_data_list_to_file_list (file_data_list);
+ gth_catalog_manager_remove_files (parent, location, file_list, TRUE);
+
+ _g_object_list_unref (file_list);
+}
+
+
+static void
+gth_file_source_catalogs_deleted_from_disk (GthFileSource *file_source,
+ GthFileData *location,
+ GList *file_list)
+{
+ gth_catalog_manager_remove_files (NULL, location, file_list, FALSE);
}
@@ -1481,6 +1491,7 @@ gth_file_source_catalogs_class_init (GthFileSourceCatalogsClass *class)
file_source_class->is_reorderable = gth_file_source_catalogs_is_reorderable;
file_source_class->reorder = gth_file_source_catalogs_reorder;
file_source_class->remove = gth_file_source_catalogs_remove;
+ file_source_class->deleted_from_disk = gth_file_source_catalogs_deleted_from_disk;
}
diff --git a/extensions/catalogs/gth-file-source-catalogs.h b/extensions/catalogs/gth-file-source-catalogs.h
index bd2c7fa..29f9176 100644
--- a/extensions/catalogs/gth-file-source-catalogs.h
+++ b/extensions/catalogs/gth-file-source-catalogs.h
@@ -49,6 +49,7 @@ struct _GthFileSourceCatalogsClass
GType gth_file_source_catalogs_get_type (void) G_GNUC_CONST;
void gth_catalog_manager_remove_files (GtkWindow *parent,
GthFileData *location,
- GList *file_list /* GthFileData list */);
+ GList *file_list /* GFile list */,
+ gboolean notify);
#endif /* GTH_FILE_SOURCE_CATALOGS_H */
diff --git a/extensions/selections/actions.c b/extensions/selections/actions.c
index ea457cd..8bde399 100644
--- a/extensions/selections/actions.c
+++ b/extensions/selections/actions.c
@@ -170,7 +170,7 @@ gth_browser_activate_remove_from_selection (GthBrowser *browser,
items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view
(browser)));
file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
files = gth_file_data_list_to_file_list (file_list);
- gth_selections_manager_remove_files (folder, files);
+ gth_selections_manager_remove_files (folder, files, TRUE);
_g_object_list_unref (files);
_g_object_list_unref (file_list);
diff --git a/extensions/selections/gth-file-source-selections.c
b/extensions/selections/gth-file-source-selections.c
index 5d8c0f1..cf97e5a 100644
--- a/extensions/selections/gth-file-source-selections.c
+++ b/extensions/selections/gth-file-source-selections.c
@@ -267,12 +267,21 @@ gth_file_source_selections_remove (GthFileSource *file_source,
GList *files;
files = gth_file_data_list_to_file_list (file_list);
- gth_selections_manager_remove_files (location->file, files);
+ gth_selections_manager_remove_files (location->file, files, TRUE);
_g_object_list_unref (files);
}
+static void
+gth_file_source_selections_deleted_from_disk (GthFileSource *file_source,
+ GthFileData *location,
+ GList *file_list)
+{
+ gth_selections_manager_remove_files (location->file, file_list, FALSE);
+}
+
+
static gboolean
gth_file_source_selections_shows_extra_widget (GthFileSource *file_source)
{
@@ -317,6 +326,7 @@ gth_file_source_selections_class_init (GthFileSourceSelectionsClass *class)
file_source_class->is_reorderable = gth_file_source_selections_is_reorderable;
file_source_class->reorder = gth_file_source_selections_reorder;
file_source_class->remove = gth_file_source_selections_remove;
+ file_source_class->deleted_from_disk = gth_file_source_selections_deleted_from_disk;
file_source_class->shows_extra_widget = gth_file_source_selections_shows_extra_widget;
}
diff --git a/extensions/selections/gth-selections-manager.c b/extensions/selections/gth-selections-manager.c
index b44b0f8..f7423c7 100644
--- a/extensions/selections/gth-selections-manager.c
+++ b/extensions/selections/gth-selections-manager.c
@@ -393,8 +393,9 @@ gth_selections_manager_add_files (GFile *folder,
void
-gth_selections_manager_remove_files (GFile *folder,
- GList *file_list)
+gth_selections_manager_remove_files (GFile *folder,
+ GList *file_list,
+ gboolean notify)
{
GthSelectionsManager *self;
int n_selection;
@@ -433,10 +434,11 @@ gth_selections_manager_remove_files (GFile *folder,
g_mutex_unlock (&self->priv->mutex);
- gth_monitor_folder_changed (gth_main_get_default_monitor (),
- folder,
- file_list,
- GTH_MONITOR_EVENT_REMOVED);
+ if (notify)
+ gth_monitor_folder_changed (gth_main_get_default_monitor (),
+ folder,
+ file_list,
+ GTH_MONITOR_EVENT_REMOVED);
gth_monitor_emblems_changed (gth_main_get_default_monitor (), file_list);
}
diff --git a/extensions/selections/gth-selections-manager.h b/extensions/selections/gth-selections-manager.h
index ae747a9..076714f 100644
--- a/extensions/selections/gth-selections-manager.h
+++ b/extensions/selections/gth-selections-manager.h
@@ -62,7 +62,8 @@ gboolean gth_selections_manager_add_files (GFile *folder,
GList *file_list, /* GFile list */
int destination_position);
void gth_selections_manager_remove_files (GFile *folder,
- GList *file_list);
+ GList *file_list,
+ gboolean notify);
void gth_selections_manager_reorder (GFile *folder,
GList *visible_files, /* GFile list */
GList *files_to_move, /* GFile list */
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 6f65bf0..96186dd 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -3242,9 +3242,6 @@ folder_changed_cb (GthMonitor *monitor,
}
}
- if ((event == GTH_MONITOR_EVENT_REMOVED) && g_file_equal (parent, browser->priv->location->file))
- event = GTH_MONITOR_EVENT_DELETED;
-
if (update_folder_tree || update_file_list) {
MonitorEventData *monitor_data;
gboolean current_file_deleted = FALSE;
@@ -3270,7 +3267,11 @@ folder_changed_cb (GthMonitor *monitor,
monitor_data);
break;
+ case GTH_MONITOR_EVENT_REMOVED:
case GTH_MONITOR_EVENT_DELETED:
+ if ((event == GTH_MONITOR_EVENT_REMOVED) && ! g_file_equal (parent,
browser->priv->location->file))
+ break;
+
if (browser->priv->current_file != NULL) {
GList *link;
@@ -3303,6 +3304,8 @@ folder_changed_cb (GthMonitor *monitor,
g_signal_handlers_block_by_data (gth_browser_get_file_list_view
(browser), browser);
gth_file_list_delete_files (GTH_FILE_LIST (browser->priv->file_list), list);
gth_file_list_delete_files (GTH_FILE_LIST (browser->priv->thumbnail_list),
list);
+ if (event == GTH_MONITOR_EVENT_DELETED)
+ gth_file_source_deleted_from_disk (browser->priv->location_source,
browser->priv->location, list);
if (current_file_deleted)
g_signal_handlers_unblock_by_data (gth_browser_get_file_list_view
(browser), browser);
}
diff --git a/gthumb/gth-file-source.c b/gthumb/gth-file-source.c
index 4fc6b0f..87f39df 100644
--- a/gthumb/gth-file-source.c
+++ b/gthumb/gth-file-source.c
@@ -55,6 +55,7 @@ typedef enum {
FILE_SOURCE_OP_COPY,
FILE_SOURCE_OP_REORDER,
FILE_SOURCE_OP_REMOVE,
+ FILE_SOURCE_OP_DELETED_FROM_DISK,
FILE_SOURCE_OP_GET_FREE_SPACE
} FileSourceOp;
@@ -141,6 +142,12 @@ typedef struct {
typedef struct {
+ GthFileData *location;
+ GList *file_list;
+} DeletedFromDiskData;
+
+
+typedef struct {
GFile *location;
SpaceReadyCallback callback;
gpointer data;
@@ -151,16 +158,17 @@ typedef struct {
GthFileSource *file_source;
FileSourceOp op;
union {
- ListData list;
- ForEachChildData fec;
- ReadAttributesData read_attributes;
- RenameData rename;
- CopyData copy;
- ReorderData reorder;
- WriteMetadataData write_metadata;
- ReadMetadataData read_metadata;
- RemoveData remove;
- GetFreeSpaceData get_free_space;
+ ListData list;
+ ForEachChildData fec;
+ ReadAttributesData read_attributes;
+ RenameData rename;
+ CopyData copy;
+ ReorderData reorder;
+ WriteMetadataData write_metadata;
+ ReadMetadataData read_metadata;
+ RemoveData remove;
+ DeletedFromDiskData deleted_from_disk;
+ GetFreeSpaceData get_free_space;
} data;
} FileSourceAsyncOp;
@@ -202,6 +210,10 @@ file_source_async_op_free (FileSourceAsyncOp *async_op)
_g_object_unref (async_op->data.remove.location);
_g_object_list_unref (async_op->data.remove.file_list);
break;
+ case FILE_SOURCE_OP_DELETED_FROM_DISK:
+ _g_object_unref (async_op->data.deleted_from_disk.location);
+ _g_object_list_unref (async_op->data.deleted_from_disk.file_list);
+ break;
case FILE_SOURCE_OP_GET_FREE_SPACE:
_g_object_unref (async_op->data.get_free_space.location);
break;
@@ -419,6 +431,23 @@ gth_file_source_queue_remove (GthFileSource *file_source,
static void
+gth_file_source_queue_deleted_from_disk (GthFileSource *file_source,
+ GthFileData *location,
+ GList *file_list)
+{
+ FileSourceAsyncOp *async_op;
+
+ async_op = g_new0 (FileSourceAsyncOp, 1);
+ async_op->file_source = file_source;
+ async_op->op = FILE_SOURCE_OP_DELETED_FROM_DISK;
+ async_op->data.deleted_from_disk.location = gth_file_data_dup (location);
+ async_op->data.deleted_from_disk.file_list = _g_file_list_dup (file_list);
+
+ file_source->priv->queue = g_list_append (file_source->priv->queue, async_op);
+}
+
+
+static void
gth_file_source_queue_get_free_space (GthFileSource *file_source,
GFile *location,
SpaceReadyCallback callback,
@@ -526,6 +555,12 @@ gth_file_source_exec_next_in_queue (GthFileSource *file_source)
async_op->data.remove.parent);
break;
+ case FILE_SOURCE_OP_DELETED_FROM_DISK:
+ gth_file_source_queue_deleted_from_disk (file_source,
+ async_op->data.deleted_from_disk.location,
+ async_op->data.deleted_from_disk.file_list);
+ break;
+
case FILE_SOURCE_OP_GET_FREE_SPACE:
gth_file_source_get_free_space (file_source,
async_op->data.get_free_space.location,
@@ -848,6 +883,14 @@ base_remove (GthFileSource *file_source,
}
+static void
+base_deleted_from_disk (GthFileSource *file_source,
+ GList *file_list /* GFile list */)
+{
+ /* void */
+}
+
+
static gboolean
base_shows_extra_widget (GthFileSource *file_source)
{
@@ -895,6 +938,7 @@ gth_file_source_class_init (GthFileSourceClass *class)
class->is_reorderable = base_is_reorderable;
class->reorder = base_reorder;
class->remove = base_remove;
+ class->deleted_from_disk = base_deleted_from_disk;
class->get_free_space = base_get_free_space;
class->shows_extra_widget = base_shows_extra_widget;
}
@@ -1084,6 +1128,7 @@ list__done_func (GObject *source,
{
ListOpData *data = user_data;
+ data->files = g_list_reverse (data->files);
data->ready_func (data->file_source, data->files, error, data->user_data);
_g_object_list_unref (data->files);
@@ -1356,6 +1401,20 @@ gth_file_source_remove (GthFileSource *file_source,
void
+gth_file_source_deleted_from_disk (GthFileSource *file_source,
+ GthFileData *location,
+ GList *file_list /* GFile list */)
+{
+ if (gth_file_source_is_active (file_source)) {
+ gth_file_source_queue_deleted_from_disk (file_source, location, file_list);
+ return;
+ }
+ g_cancellable_reset (file_source->priv->cancellable);
+ GTH_FILE_SOURCE_GET_CLASS (G_OBJECT (file_source))->deleted_from_disk (file_source, location,
file_list);
+}
+
+
+void
gth_file_source_get_free_space (GthFileSource *file_source,
GFile *location,
SpaceReadyCallback callback,
diff --git a/gthumb/gth-file-source.h b/gthumb/gth-file-source.h
index 24b5546..9e28a82 100644
--- a/gthumb/gth-file-source.h
+++ b/gthumb/gth-file-source.h
@@ -132,6 +132,9 @@ struct _GthFileSourceClass
GList *file_list, /* GthFileData list */
gboolean permanently,
GtkWindow *parent);
+ void (*deleted_from_disk) (GthFileSource *file_source,
+ GthFileData *location,
+ GList *files /* GFile list */);
void (*get_free_space) (GthFileSource *file_source,
GFile *location,
SpaceReadyCallback callback,
@@ -221,6 +224,9 @@ void gth_file_source_remove (GthFileSource *file
GList *file_list /* GthFileData list */,
gboolean permanently,
GtkWindow *parent);
+void gth_file_source_deleted_from_disk (GthFileSource *file_source,
+ GthFileData *location,
+ GList *file_list /* GFile list */);
void gth_file_source_get_free_space (GthFileSource *file_source,
GFile *location,
SpaceReadyCallback callback,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]