[gthumb] do not make catalogs depend on search to fix a circular dependency
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] do not make catalogs depend on search to fix a circular dependency
- Date: Wed, 22 Sep 2010 16:11:23 +0000 (UTC)
commit c11995817abc85538f828821a4f96f7fcdc12cd7
Author: Paolo Bacchilega <paobac src gnome org>
Date: Wed Sep 22 18:10:28 2010 +0200
do not make catalogs depend on search to fix a circular dependency
[bug #630311]
extensions/catalogs/gth-organize-task.c | 86 +++++++++++++++++++++---
extensions/catalogs/gth-organize-task.h | 34 +++++++---
extensions/catalogs/main.c | 8 ++
extensions/search/callbacks.c | 115 +++++++++++++++++++++++++++++++
extensions/search/callbacks.h | 28 ++++----
extensions/search/main.c | 1 +
6 files changed, 240 insertions(+), 32 deletions(-)
---
diff --git a/extensions/catalogs/gth-organize-task.c b/extensions/catalogs/gth-organize-task.c
index 465985a..cc3bc8b 100644
--- a/extensions/catalogs/gth-organize-task.c
+++ b/extensions/catalogs/gth-organize-task.c
@@ -23,7 +23,6 @@
#include <glib.h>
#include <glib/gi18n.h>
#include <gthumb.h>
-#include <extensions/search/gth-search.h>
#include "gth-catalog.h"
#include "gth-organize-task.h"
@@ -216,11 +215,12 @@ add_catalog_for_date (GthOrganizeTask *self,
const char *catalog_key,
GTimeVal *timeval)
{
- GthCatalog *catalog;
- GthDateTime *date_time;
- GFile *catalog_file;
- char *catalog_name;
- GtkTreeIter iter;
+ GthCatalog *catalog;
+ GthDateTime *date_time;
+ GFile *catalog_file;
+ char *catalog_name;
+ GtkTreeIter iter;
+ GthGroupPolicyData policy_data;
catalog = g_hash_table_lookup (self->priv->catalogs, catalog_key);
if (catalog != NULL)
@@ -229,6 +229,29 @@ add_catalog_for_date (GthOrganizeTask *self,
date_time = gth_datetime_new ();
gth_datetime_from_timeval (date_time, timeval);
+ policy_data.task = self;
+ policy_data.date_time = date_time;
+ policy_data.tag = NULL;
+ policy_data.catalog = NULL;
+ policy_data.catalog_file = NULL;
+ gth_hook_invoke ("gth-organize-task-create-catalog", &policy_data);
+
+ catalog = policy_data.catalog;
+ catalog_file = policy_data.catalog_file;
+
+ if (catalog == NULL) {
+ _g_object_unref (catalog_file);
+ catalog_file = gth_catalog_get_file_for_date (date_time, ".catalog");
+ catalog = gth_catalog_load_from_file (catalog_file);
+ }
+
+ if (catalog == NULL)
+ catalog = gth_catalog_new ();
+
+#if 0
+ date_time = gth_datetime_new ();
+ gth_datetime_from_timeval (date_time, timeval);
+
catalog_file = NULL;
if (gth_main_extension_is_active ("search")) {
@@ -266,6 +289,7 @@ add_catalog_for_date (GthOrganizeTask *self,
else
catalog = gth_catalog_new ();
}
+#endif
gth_catalog_set_date (catalog, date_time);
gth_catalog_set_file (catalog, catalog_file);
@@ -297,14 +321,35 @@ add_catalog_for_tag (GthOrganizeTask *self,
const char *catalog_key,
const char *tag)
{
- GthCatalog *catalog;
- GFile *catalog_file;
- GtkTreeIter iter;
+ GthCatalog *catalog;
+ GFile *catalog_file;
+ GtkTreeIter iter;
+ GthGroupPolicyData policy_data;
catalog = g_hash_table_lookup (self->priv->catalogs, catalog_key);
if (catalog != NULL)
return catalog;
+ policy_data.task = self;
+ policy_data.date_time = NULL;
+ policy_data.tag = tag;
+ policy_data.catalog = NULL;
+ policy_data.catalog_file = NULL;
+ gth_hook_invoke ("gth-organize-task-create-catalog", &policy_data);
+
+ catalog = policy_data.catalog;
+ catalog_file = policy_data.catalog_file;
+
+ if (catalog == NULL) {
+ _g_object_unref (catalog_file);
+ catalog_file = gth_catalog_get_file_for_tag (tag, ".catalog");
+ catalog = gth_catalog_load_from_file (catalog_file);
+ }
+
+ if (catalog == NULL)
+ catalog = gth_catalog_new ();
+
+#if 0
catalog_file = NULL;
if (gth_main_extension_is_active ("search")) {
@@ -341,6 +386,8 @@ add_catalog_for_tag (GthOrganizeTask *self,
else
catalog = gth_catalog_new ();
}
+#endif
+
gth_catalog_set_file (catalog, catalog_file);
g_hash_table_insert (self->priv->catalogs, g_strdup (catalog_key), catalog);
@@ -868,3 +915,24 @@ gth_organize_task_set_singletons_catalog (GthOrganizeTask *self,
g_object_unref (file);
}
+
+
+GFile *
+gth_organize_task_get_folder (GthOrganizeTask *self)
+{
+ return self->priv->folder;
+}
+
+
+GthGroupPolicy
+gth_organize_task_get_group_policy (GthOrganizeTask *self)
+{
+ return self->priv->group_policy;
+}
+
+
+gboolean
+gth_organize_task_get_recursive (GthOrganizeTask *self)
+{
+ return self->priv->recursive;
+}
diff --git a/extensions/catalogs/gth-organize-task.h b/extensions/catalogs/gth-organize-task.h
index acd383e..fbe5be8 100644
--- a/extensions/catalogs/gth-organize-task.h
+++ b/extensions/catalogs/gth-organize-task.h
@@ -24,6 +24,7 @@
#include <glib-object.h>
#include <gthumb.h>
+#include "gth-catalog.h"
typedef enum {
GTH_GROUP_POLICY_DIGITALIZED_DATE,
@@ -54,15 +55,28 @@ struct _GthOrganizeTaskClass
GthTaskClass __parent_class;
};
-GType gth_organize_task_get_type (void) G_GNUC_CONST;
-GthTask * gth_organize_task_new (GthBrowser *browser,
- GFile *folder,
- GthGroupPolicy group_policy);
-void gth_organize_task_set_recursive (GthOrganizeTask *self,
- gboolean recursive);
-void gth_organize_task_set_create_singletons (GthOrganizeTask *self,
- gboolean create);
-void gth_organize_task_set_singletons_catalog (GthOrganizeTask *self,
- const char *catalog_name);
+/* GthGroupPolicyData: data used by the "gth-organize-task-create-catalog" hook */
+
+typedef struct {
+ GthOrganizeTask *task; /* in */
+ GthDateTime *date_time; /* in (optional) */
+ const char *tag; /* in (optional) */
+ GFile *catalog_file; /* out */
+ GthCatalog *catalog; /* out */
+} GthGroupPolicyData;
+
+GType gth_organize_task_get_type (void) G_GNUC_CONST;
+GthTask * gth_organize_task_new (GthBrowser *browser,
+ GFile *folder,
+ GthGroupPolicy group_policy);
+void gth_organize_task_set_recursive (GthOrganizeTask *self,
+ gboolean recursive);
+void gth_organize_task_set_create_singletons (GthOrganizeTask *self,
+ gboolean create);
+void gth_organize_task_set_singletons_catalog (GthOrganizeTask *self,
+ const char *catalog_name);
+GFile * gth_organize_task_get_folder (GthOrganizeTask *self);
+GthGroupPolicy gth_organize_task_get_group_policy (GthOrganizeTask *self);
+gboolean gth_organize_task_get_recursive (GthOrganizeTask *self);
#endif /* GTH_ORGANIZE_TASK_H */
diff --git a/extensions/catalogs/main.c b/extensions/catalogs/main.c
index 0467336..c7eb84b 100644
--- a/extensions/catalogs/main.c
+++ b/extensions/catalogs/main.c
@@ -99,6 +99,14 @@ gthumb_extension_activate (void)
**/
gth_hook_register ("dlg-catalog-properties-saved", 3);
+ /**
+ * Called to create a catalog when organizing files in catalogs.
+ *
+ * @data (GthGroupPolicyData *): a structure that contains in and out
+ * parameters, as described in gth-organize-task.h
+ **/
+ gth_hook_register ("gth-organize-task-create-catalog", 1);
+
gth_hook_add_callback ("command-line-files", 10, G_CALLBACK (catalogs__command_line_files_cb), NULL);
gth_hook_add_callback ("gth-catalog-load-from-data", 10, G_CALLBACK (catalogs__gth_catalog_load_from_data_cb), NULL);
diff --git a/extensions/search/callbacks.c b/extensions/search/callbacks.c
index 517fdab..add3a76 100644
--- a/extensions/search/callbacks.c
+++ b/extensions/search/callbacks.c
@@ -26,6 +26,7 @@
#include <gthumb.h>
#include <extensions/catalogs/gth-catalog.h>
#include "actions.h"
+#include "callbacks.h"
#include "gth-search.h"
#include "gth-search-editor.h"
#include "gth-search-task.h"
@@ -233,3 +234,117 @@ search__dlg_catalog_properties_saved (GthBrowser *browser,
g_object_unref (task);
}
+
+
+void
+search__gth_organize_task_create_catalog (GthGroupPolicyData *data)
+{
+ GthGroupPolicy policy;
+
+ policy = gth_organize_task_get_group_policy (data->task);
+ switch (policy) {
+ case GTH_GROUP_POLICY_DIGITALIZED_DATE:
+ case GTH_GROUP_POLICY_MODIFIED_DATE:
+
+ /* delete the .catalog file to avoid to have two catalogs with
+ * the same name, which can be confusing for the user. */
+
+ {
+ GFile *catalog_file;
+ GFile *gio_file;
+
+ catalog_file = gth_catalog_get_file_for_date (data->date_time, ".catalog");
+ gio_file = gth_catalog_file_to_gio_file (catalog_file);
+ if (g_file_delete (gio_file, NULL, NULL)) {
+ GFile *parent;
+ GList *files;
+
+ parent = g_file_get_parent (catalog_file);
+ files = g_list_prepend (NULL, g_object_ref (catalog_file));
+ gth_monitor_folder_changed (gth_main_get_default_monitor (),
+ parent,
+ files,
+ GTH_MONITOR_EVENT_DELETED);
+
+ _g_object_list_unref (files);
+ _g_object_unref (parent);
+ }
+
+ g_object_unref (gio_file);
+ g_object_unref (catalog_file);
+ }
+
+ data->catalog_file = gth_catalog_get_file_for_date (data->date_time, ".search");
+ data->catalog = gth_catalog_load_from_file (data->catalog_file);
+ if (data->catalog == NULL) {
+ GthTest *date_test;
+ GthTest *test_chain;
+
+ data->catalog = (GthCatalog *) gth_search_new ();
+ gth_search_set_folder (GTH_SEARCH (data->catalog), gth_organize_task_get_folder (data->task));
+ gth_search_set_recursive (GTH_SEARCH (data->catalog), gth_organize_task_get_recursive (data->task));
+
+ date_test = gth_main_get_registered_object (GTH_TYPE_TEST, (policy == GTH_GROUP_POLICY_MODIFIED_DATE) ? "file::mtime" : "Embedded::Photo::DateTimeOriginal");
+ gth_test_simple_set_data_as_date (GTH_TEST_SIMPLE (date_test), data->date_time->date);
+ g_object_set (GTH_TEST_SIMPLE (date_test), "op", GTH_TEST_OP_EQUAL, "negative", FALSE, NULL);
+ test_chain = gth_test_chain_new (GTH_MATCH_TYPE_ALL, date_test, NULL);
+ gth_search_set_test (GTH_SEARCH (data->catalog), GTH_TEST_CHAIN (test_chain));
+
+ g_object_unref (test_chain);
+ g_object_unref (date_test);
+ }
+ break;
+
+ case GTH_GROUP_POLICY_TAG:
+ case GTH_GROUP_POLICY_TAG_EMBEDDED:
+
+ /* delete the .catalog file to avoid to have two catalogs with
+ * the same name, which can be confusing for the user. */
+
+ {
+ GFile *catalog_file;
+ GFile *gio_file;
+
+ catalog_file = gth_catalog_get_file_for_tag (data->tag, ".catalog");
+ gio_file = gth_catalog_file_to_gio_file (catalog_file);
+ if (g_file_delete (gio_file, NULL, NULL)) {
+ GFile *parent;
+ GList *files;
+
+ parent = g_file_get_parent (catalog_file);
+ files = g_list_prepend (NULL, g_object_ref (catalog_file));
+ gth_monitor_folder_changed (gth_main_get_default_monitor (),
+ parent,
+ files,
+ GTH_MONITOR_EVENT_DELETED);
+
+ _g_object_list_unref (files);
+ _g_object_unref (parent);
+ }
+
+ g_object_unref (gio_file);
+ g_object_unref (catalog_file);
+ }
+
+ data->catalog_file = gth_catalog_get_file_for_tag (data->tag, ".search");
+ data->catalog = gth_catalog_load_from_file (data->catalog_file);
+ if (data->catalog == NULL) {
+ GthTest *tag_test;
+ GthTest *test_chain;
+
+ data->catalog = (GthCatalog *) gth_search_new ();
+ gth_search_set_folder (GTH_SEARCH (data->catalog), gth_organize_task_get_folder (data->task));
+ gth_search_set_recursive (GTH_SEARCH (data->catalog), gth_organize_task_get_recursive (data->task));
+
+ tag_test = gth_main_get_registered_object (GTH_TYPE_TEST, (policy == GTH_GROUP_POLICY_TAG) ? "comment::category" : "general::tags");
+ gth_test_category_set (GTH_TEST_CATEGORY (tag_test), GTH_TEST_OP_EQUAL, FALSE, data->tag);
+ test_chain = gth_test_chain_new (GTH_MATCH_TYPE_ALL, tag_test, NULL);
+ gth_search_set_test (GTH_SEARCH (data->catalog), GTH_TEST_CHAIN (test_chain));
+
+ g_object_unref (test_chain);
+ g_object_unref (tag_test);
+ }
+
+ break;
+ }
+}
diff --git a/extensions/search/callbacks.h b/extensions/search/callbacks.h
index 9241552..c0f4947 100644
--- a/extensions/search/callbacks.h
+++ b/extensions/search/callbacks.h
@@ -24,19 +24,21 @@
#include <gthumb.h>
#include <extensions/catalogs/gth-catalog.h>
+#include <extensions/catalogs/gth-organize-task.h>
-void search__gth_browser_construct_cb (GthBrowser *browser);
-void search__gth_browser_update_sensitivity_cb (GthBrowser *browser);
-void search__gth_browser_update_extra_widget_cb (GthBrowser *browser);
-GthCatalog * search__gth_catalog_load_from_data_cb (const void *buffer);
-void search__dlg_catalog_properties (GthBrowser *browser,
- GtkBuilder *builder,
- GthFileData *file_data);
-void search__dlg_catalog_properties_save (GtkBuilder *builder,
- GthFileData *file_data,
- GthCatalog *catalog);
-void search__dlg_catalog_properties_saved (GthBrowser *browser,
- GthFileData *file_data,
- GthCatalog *catalog);
+void search__gth_browser_construct_cb (GthBrowser *browser);
+void search__gth_browser_update_sensitivity_cb (GthBrowser *browser);
+void search__gth_browser_update_extra_widget_cb (GthBrowser *browser);
+GthCatalog * search__gth_catalog_load_from_data_cb (const void *buffer);
+void search__dlg_catalog_properties (GtkBuilder *builder,
+ GthFileData *file_data,
+ GthCatalog *catalog);
+void search__dlg_catalog_properties_save (GtkBuilder *builder,
+ GthFileData *file_data,
+ GthCatalog *catalog);
+void search__dlg_catalog_properties_saved (GthBrowser *browser,
+ GthFileData *file_data,
+ GthCatalog *catalog);
+void search__gth_organize_task_create_catalog (GthGroupPolicyData *data);
#endif /* CALLBACKS_H */
diff --git a/extensions/search/main.c b/extensions/search/main.c
index e694169..7308713 100644
--- a/extensions/search/main.c
+++ b/extensions/search/main.c
@@ -35,6 +35,7 @@ gthumb_extension_activate (void)
gth_hook_add_callback ("dlg-catalog-properties", 10, G_CALLBACK (search__dlg_catalog_properties), NULL);
gth_hook_add_callback ("dlg-catalog-properties-save", 10, G_CALLBACK (search__dlg_catalog_properties_save), NULL);
gth_hook_add_callback ("dlg-catalog-properties-saved", 10, G_CALLBACK (search__dlg_catalog_properties_saved), NULL);
+ gth_hook_add_callback ("gth-organize-task-create-catalog", 10, G_CALLBACK (search__gth_organize_task_create_catalog), NULL);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]