[gthumb] exec the search only if the search parameters changed.



commit b8c8847d8047b4abad7f6fbea806af764ddf18dc
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Tue Feb 16 22:24:44 2010 +0100

    exec the search only if the search parameters changed.

 extensions/search/callbacks.c  |    5 ++-
 extensions/search/gth-search.c |   65 +++++++++++++++++++++++++++++++++------
 extensions/search/gth-search.h |    2 +
 gthumb/gth-test-selector.c     |   22 +++++--------
 4 files changed, 70 insertions(+), 24 deletions(-)
---
diff --git a/extensions/search/callbacks.c b/extensions/search/callbacks.c
index 78c61a2..007dd95 100644
--- a/extensions/search/callbacks.c
+++ b/extensions/search/callbacks.c
@@ -207,6 +207,7 @@ search__dlg_catalog_properties_save (GtkBuilder  *builder,
 
 	search = gth_search_editor_get_search (GTH_SEARCH_EDITOR (g_object_get_data (G_OBJECT(builder), "search_editor")), NULL);
 	if (search != NULL) {
+		g_file_info_set_attribute_boolean (file_data->info, "gthumb::search-modified", ! gth_search_equal (GTH_SEARCH (catalog), search));
 		gth_search_set_folder (GTH_SEARCH (catalog), gth_search_get_folder (search));
 		gth_search_set_recursive (GTH_SEARCH (catalog), gth_search_is_recursive (search));
 		gth_search_set_test (GTH_SEARCH (catalog), gth_search_get_test (search));
@@ -224,7 +225,9 @@ search__dlg_catalog_properties_saved (GthBrowser  *browser,
 	if (! _g_content_type_is_a (g_file_info_get_content_type (file_data->info), "gthumb/search"))
 		return;
 
-	/* FIXME: search only if the search parameters changed */
+	/* Search only if the search parameters changed */
+	if (! g_file_info_get_attribute_boolean (file_data->info, "gthumb::search-modified"))
+		return;
 
 	task = gth_search_task_new (browser, GTH_SEARCH (catalog), file_data->file);
 	gth_browser_exec_task (browser, task, TRUE);
diff --git a/extensions/search/gth-search.c b/extensions/search/gth-search.c
index 3022054..6c30ee2 100644
--- a/extensions/search/gth-search.c
+++ b/extensions/search/gth-search.c
@@ -86,18 +86,13 @@ gth_search_read_from_doc (GthCatalog *base,
 
 
 static void
-gth_search_write_to_doc (GthCatalog  *catalog,
-			 DomDocument *doc,
-			 DomElement  *root)
+_gth_search_write_to_doc (GthSearch   *self,
+			  DomDocument *doc,
+			  DomElement  *root)
 {
-	GthSearch  *self;
-	char       *uri;
+	char *uri;
 
-	GTH_CATALOG_CLASS (parent_class)->write_to_doc (catalog, doc, root);
-
-	self = GTH_SEARCH (catalog);
-
-       	uri = g_file_get_uri (self->priv->folder);
+	uri = g_file_get_uri (self->priv->folder);
 	dom_element_append_child (root,
 				  dom_document_create_element (doc, "folder",
 							       "uri", uri,
@@ -109,6 +104,16 @@ gth_search_write_to_doc (GthCatalog  *catalog,
 }
 
 
+static void
+gth_search_write_to_doc (GthCatalog  *catalog,
+			 DomDocument *doc,
+			 DomElement  *root)
+{
+	GTH_CATALOG_CLASS (parent_class)->write_to_doc (catalog, doc, root);
+	_gth_search_write_to_doc (GTH_SEARCH (catalog), doc, root);
+}
+
+
 static DomElement*
 gth_search_real_create_element (DomDomizable *base,
 				DomDocument  *doc)
@@ -360,3 +365,43 @@ gth_search_get_test (GthSearch *search)
 	else
 		return NULL;
 }
+
+
+static DomDocument *
+_create_fake_document (GthSearch *self)
+{
+	DomDocument *doc;
+	DomElement  *root;
+
+	doc = dom_document_new ();
+	root = dom_document_create_element (doc, "search", NULL);
+	dom_element_append_child (DOM_ELEMENT (doc), root);
+	_gth_search_write_to_doc (self, doc, root);
+
+	return doc;
+}
+
+
+gboolean
+gth_search_equal (GthSearch *a,
+		  GthSearch *b)
+{
+	DomDocument *doc_a;
+	DomDocument *doc_b;
+	char        *xml_a;
+	gsize        size_a;
+	char        *xml_b;
+	gsize        size_b;
+	gboolean     equal;
+
+	doc_a = _create_fake_document (a);
+	doc_b = _create_fake_document (b);
+	xml_a = dom_document_dump (doc_a, &size_a);
+	xml_b = dom_document_dump (doc_b, &size_b);
+	equal = (size_a == size_b) && (g_strcmp0 (xml_a, xml_b) == 0);
+
+	g_free (xml_a);
+	g_free (xml_b);
+
+	return equal;
+}
diff --git a/extensions/search/gth-search.h b/extensions/search/gth-search.h
index 5ce37c8..f13427f 100644
--- a/extensions/search/gth-search.h
+++ b/extensions/search/gth-search.h
@@ -64,5 +64,7 @@ gboolean          gth_search_is_recursive     (GthSearch    *search);
 void              gth_search_set_test         (GthSearch    *search,
 					       GthTestChain *test);
 GthTestChain *    gth_search_get_test         (GthSearch    *search);
+gboolean          gth_search_equal            (GthSearch    *a,
+					       GthSearch    *b);
 
 #endif /* GTH_SEARCH_H */
diff --git a/gthumb/gth-test-selector.c b/gthumb/gth-test-selector.c
index b9c201c..7f02580 100644
--- a/gthumb/gth-test-selector.c
+++ b/gthumb/gth-test-selector.c
@@ -23,6 +23,7 @@
 #include <config.h>
 #include <glib/gi18n.h>
 #include "glib-utils.h"
+#include "gth-duplicable.h"
 #include "gth-main.h"
 #include "gth-test-selector.h"
 
@@ -372,21 +373,23 @@ gth_test_selector_set_test (GthTestSelector *self,
 			    GthTest         *test)
 {
 	GtkWidget *control;
-	GthTest   *local_test = NULL;
 
-	if (test == NULL)
-		test = local_test = gth_main_get_registered_object (GTH_TYPE_TEST, "file::name");
+	_g_object_unref (self->priv->test);
+	if (test != NULL)
+		self->priv->test = (GthTest *) gth_duplicable_duplicate (GTH_DUPLICABLE (test));
+	else
+		self->priv->test = gth_main_get_registered_object (GTH_TYPE_TEST, "file::name");
 
 	/* update the active test */
 
 	g_signal_handlers_block_by_func (self->priv->test_combo_box, test_combo_box_changed_cb, self);
-	gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->test_combo_box), get_test_index (self, test));
+	gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->test_combo_box), get_test_index (self, self->priv->test));
 	g_signal_handlers_unblock_by_func (self->priv->test_combo_box, test_combo_box_changed_cb, self);
 
 	/* set the test control */
 
-	if (test != NULL)
-		control = gth_test_create_control (test);
+	if (self->priv->test != NULL)
+		control = gth_test_create_control (self->priv->test);
 	else
 		control = NULL;
 
@@ -402,13 +405,6 @@ gth_test_selector_set_test (GthTestSelector *self,
 		gtk_container_add (GTK_CONTAINER (self->priv->control_box),
 				   self->priv->control);
 	}
-
-	if (self->priv->test != NULL)
-		g_object_unref (self->priv->test);
-	self->priv->test = g_object_ref (test);
-
-	if (local_test != NULL)
-		g_object_unref (local_test);
 }
 
 



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