[gthumb] do not make catalogs depend on search to fix a circular dependency



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]