[gthumb] exec the search only if the search parameters changed.
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] exec the search only if the search parameters changed.
- Date: Tue, 16 Feb 2010 21:25:41 +0000 (UTC)
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]