summaryrefslogtreecommitdiff
path: root/gtk/gtksearchengine.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-07-01 12:51:20 -0700
committerMatthias Clasen <mclasen@redhat.com>2015-07-04 00:29:25 -0400
commit33b5c26f419aab0c072a7ac49f450e861459b852 (patch)
tree04cbbc3a282a446a6dd4120c08ed80d93cec5c60 /gtk/gtksearchengine.c
parentf87f43b6229d2314523c925d0f3584ab23c7adf9 (diff)
downloadgtk+-33b5c26f419aab0c072a7ac49f450e861459b852.tar.gz
file chooser: Add and use a model search engine
This search engine reuses the GFileInfo that is already loaded for the file list, to ensure that hits from the current directory always appear promptly.
Diffstat (limited to 'gtk/gtksearchengine.c')
-rw-r--r--gtk/gtksearchengine.c57
1 files changed, 55 insertions, 2 deletions
diff --git a/gtk/gtksearchengine.c b/gtk/gtksearchengine.c
index 67110f936b..8a92a220c1 100644
--- a/gtk/gtksearchengine.c
+++ b/gtk/gtksearchengine.c
@@ -23,6 +23,7 @@
#include "gtksearchengine.h"
#include "gtksearchenginesimple.h"
#include "gtksearchenginetracker.h"
+#include "gtksearchenginemodel.h"
#include "gtksearchenginequartz.h"
#include <gdk/gdk.h> /* for GDK_WINDOWING_QUARTZ */
@@ -40,9 +41,15 @@ struct _GtkSearchEnginePrivate {
gboolean simple_running;
gchar *simple_error;
+ GtkSearchEngine *model;
+ gboolean model_running;
+ gchar *model_error;
+
gboolean running;
gboolean recursive;
GHashTable *hits;
+
+ GtkQuery *query;
};
enum
@@ -61,11 +68,16 @@ static void
set_query (GtkSearchEngine *engine,
GtkQuery *query)
{
+ g_set_object (&engine->priv->query, query);
+
if (engine->priv->native)
_gtk_search_engine_set_query (engine->priv->native, query);
if (engine->priv->simple)
_gtk_search_engine_set_query (engine->priv->simple, query);
+
+ if (engine->priv->model)
+ _gtk_search_engine_set_query (engine->priv->model, query);
}
static void
@@ -87,6 +99,13 @@ start (GtkSearchEngine *engine)
engine->priv->simple_running = TRUE;
}
+ if (engine->priv->model)
+ {
+ g_clear_pointer (&engine->priv->model_error, g_free);
+ _gtk_search_engine_start (engine->priv->model);
+ engine->priv->model_running = TRUE;
+ }
+
engine->priv->running = TRUE;
}
@@ -105,6 +124,12 @@ stop (GtkSearchEngine *engine)
engine->priv->simple_running = FALSE;
}
+ if (engine->priv->model)
+ {
+ _gtk_search_engine_stop (engine->priv->model);
+ engine->priv->model_running = FALSE;
+ }
+
engine->priv->running = FALSE;
g_hash_table_remove_all (engine->priv->hits);
@@ -121,8 +146,13 @@ finalize (GObject *object)
g_clear_object (&engine->priv->simple);
g_free (engine->priv->simple_error);
+ g_clear_object (&engine->priv->model);
+ g_free (engine->priv->model_error);
+
g_clear_pointer (&engine->priv->hits, g_hash_table_unref);
+ g_clear_object (&engine->priv->query);
+
G_OBJECT_CLASS (_gtk_search_engine_parent_class)->finalize (object);
}
@@ -222,6 +252,8 @@ update_status (GtkSearchEngine *engine)
_gtk_search_engine_error (engine, engine->priv->native_error);
else if (engine->priv->simple_error)
_gtk_search_engine_error (engine, engine->priv->simple_error);
+ else if (engine->priv->model_error)
+ _gtk_search_engine_error (engine, engine->priv->model_error);
else
_gtk_search_engine_finished (engine);
}
@@ -238,6 +270,8 @@ finished (GtkSearchEngine *engine,
composite->priv->native_running = FALSE;
else if (engine == composite->priv->simple)
composite->priv->simple_running = FALSE;
+ else if (engine == composite->priv->model)
+ composite->priv->model_running = FALSE;
update_status (composite);
}
@@ -257,10 +291,16 @@ error (GtkSearchEngine *engine,
}
else if (engine == composite->priv->simple)
{
- g_free (composite->priv->native_error);
- composite->priv->native_error = g_strdup (message);
+ g_free (composite->priv->simple_error);
+ composite->priv->simple_error = g_strdup (message);
composite->priv->simple_running = FALSE;
}
+ else if (engine == composite->priv->model)
+ {
+ g_free (composite->priv->model_error);
+ composite->priv->model_error = g_strdup (message);
+ composite->priv->model_running = FALSE;
+ }
update_status (composite);
}
@@ -432,3 +472,16 @@ _gtk_search_engine_get_recursive (GtkSearchEngine *engine)
return engine->priv->recursive;
}
+
+void
+_gtk_search_engine_set_model (GtkSearchEngine *engine,
+ GtkFileSystemModel *model)
+{
+ g_clear_object (&engine->priv->model);
+ if (model)
+ {
+ engine->priv->model = _gtk_search_engine_model_new (model);
+ if (engine->priv->query)
+ _gtk_search_engine_set_query (engine->priv->model, engine->priv->query);
+ }
+}