Compare commits

...

2 Commits

Author SHA1 Message Date
Timm Bäder
09efa8ecdd filechooserwidget: Sort search hits after query position 2019-07-04 10:41:44 +02:00
Timm Bäder
8ccb3915f9 searchengine: remove priv pointer 2019-07-04 09:31:40 +02:00
3 changed files with 171 additions and 107 deletions

View File

@@ -4007,6 +4007,50 @@ compare_name (GtkFileSystemModel *model,
return result; return result;
} }
static int
compare_query_pos (GtkFileSystemModel *model,
GtkTreeIter *a,
GtkTreeIter *b,
GtkFileChooserWidget *impl)
{
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
const char *query = NULL;
const char *name_a, *name_b;
char *normalized_a, *normalized_b;
char *cmp_a, *cmp_b;
gsize pos1, pos2;
/* Just for safety */
if (!priv->search_query)
return 0;
query = gtk_query_get_text (priv->search_query);
name_a = g_value_get_string (_gtk_file_system_model_get_value (model, a, MODEL_COL_NAME));
name_b = g_value_get_string (_gtk_file_system_model_get_value (model, b, MODEL_COL_NAME));
normalized_a = g_utf8_normalize (name_a, -1, G_NORMALIZE_NFD);
normalized_b = g_utf8_normalize (name_b, -1, G_NORMALIZE_NFD);
cmp_a = g_utf8_strdown (normalized_a, -1);
cmp_b = g_utf8_strdown (normalized_b, -1);
pos1 = strstr(cmp_a, query) - cmp_a;
pos2 = strstr(cmp_b, query) - cmp_b;
g_free (cmp_a);
g_free (cmp_b);
g_free (normalized_a);
g_free (normalized_b);
if (pos1 < pos2)
return -1;
else if (pos1 > pos2)
return 1;
return 0;
}
static gint static gint
compare_size (GtkFileSystemModel *model, compare_size (GtkFileSystemModel *model,
GtkTreeIter *a, GtkTreeIter *a,
@@ -4172,6 +4216,9 @@ search_sort_func (GtkTreeModel *model,
result = compare_location (fs_model, a, b, impl); result = compare_location (fs_model, a, b, impl);
if (result == 0)
result = compare_query_pos (fs_model, a, b, impl);
if (result == 0) if (result == 0)
result = compare_name (fs_model, a, b, impl); result = compare_name (fs_model, a, b, impl);

View File

@@ -69,90 +69,97 @@ static void
set_query (GtkSearchEngine *engine, set_query (GtkSearchEngine *engine,
GtkQuery *query) GtkQuery *query)
{ {
g_set_object (&engine->priv->query, query); GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
if (engine->priv->native) g_set_object (&priv->query, query);
_gtk_search_engine_set_query (engine->priv->native, query);
if (engine->priv->simple) if (priv->native)
_gtk_search_engine_set_query (engine->priv->simple, query); _gtk_search_engine_set_query (priv->native, query);
if (engine->priv->model) if (priv->simple)
_gtk_search_engine_set_query (engine->priv->model, query); _gtk_search_engine_set_query (priv->simple, query);
if (priv->model)
_gtk_search_engine_set_query (priv->model, query);
} }
static void static void
start (GtkSearchEngine *engine) start (GtkSearchEngine *engine)
{ {
g_hash_table_remove_all (engine->priv->hits); GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
if (engine->priv->native) g_hash_table_remove_all (priv->hits);
if (priv->native)
{ {
g_clear_pointer (&engine->priv->native_error, g_free); g_clear_pointer (&priv->native_error, g_free);
_gtk_search_engine_start (engine->priv->native); _gtk_search_engine_start (priv->native);
engine->priv->native_running = TRUE; priv->native_running = TRUE;
} }
if (engine->priv->simple) if (priv->simple)
{ {
g_clear_pointer (&engine->priv->simple_error, g_free); g_clear_pointer (&priv->simple_error, g_free);
_gtk_search_engine_start (engine->priv->simple); _gtk_search_engine_start (priv->simple);
engine->priv->simple_running = TRUE; priv->simple_running = TRUE;
} }
if (engine->priv->model) if (priv->model)
{ {
g_clear_pointer (&engine->priv->model_error, g_free); g_clear_pointer (&priv->model_error, g_free);
_gtk_search_engine_start (engine->priv->model); _gtk_search_engine_start (priv->model);
engine->priv->model_running = TRUE; priv->model_running = TRUE;
} }
engine->priv->running = TRUE; priv->running = TRUE;
} }
static void static void
stop (GtkSearchEngine *engine) stop (GtkSearchEngine *engine)
{ {
if (engine->priv->native) GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
if (priv->native)
{ {
_gtk_search_engine_stop (engine->priv->native); _gtk_search_engine_stop (priv->native);
engine->priv->native_running = FALSE; priv->native_running = FALSE;
} }
if (engine->priv->simple) if (priv->simple)
{ {
_gtk_search_engine_stop (engine->priv->simple); _gtk_search_engine_stop (priv->simple);
engine->priv->simple_running = FALSE; priv->simple_running = FALSE;
} }
if (engine->priv->model) if (priv->model)
{ {
_gtk_search_engine_stop (engine->priv->model); _gtk_search_engine_stop (priv->model);
engine->priv->model_running = FALSE; priv->model_running = FALSE;
} }
engine->priv->running = FALSE; priv->running = FALSE;
g_hash_table_remove_all (engine->priv->hits); g_hash_table_remove_all (priv->hits);
} }
static void static void
finalize (GObject *object) finalize (GObject *object)
{ {
GtkSearchEngine *engine = GTK_SEARCH_ENGINE (object); GtkSearchEngine *engine = GTK_SEARCH_ENGINE (object);
GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
g_clear_object (&engine->priv->native); g_clear_object (&priv->native);
g_free (engine->priv->native_error); g_free (priv->native_error);
g_clear_object (&engine->priv->simple); g_clear_object (&priv->simple);
g_free (engine->priv->simple_error); g_free (priv->simple_error);
g_clear_object (&engine->priv->model); g_clear_object (&priv->model);
g_free (engine->priv->model_error); g_free (priv->model_error);
g_clear_pointer (&engine->priv->hits, g_hash_table_unref); g_clear_pointer (&priv->hits, g_hash_table_unref);
g_clear_object (&engine->priv->query); g_clear_object (&priv->query);
G_OBJECT_CLASS (_gtk_search_engine_parent_class)->finalize (object); G_OBJECT_CLASS (_gtk_search_engine_parent_class)->finalize (object);
} }
@@ -201,9 +208,9 @@ _gtk_search_engine_class_init (GtkSearchEngineClass *class)
static void static void
_gtk_search_engine_init (GtkSearchEngine *engine) _gtk_search_engine_init (GtkSearchEngine *engine)
{ {
engine->priv = _gtk_search_engine_get_instance_private (engine); GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
engine->priv->recursive = TRUE; priv->recursive = TRUE;
} }
static void static void
@@ -212,6 +219,7 @@ hits_added (GtkSearchEngine *engine,
gpointer data) gpointer data)
{ {
GtkSearchEngine *composite = GTK_SEARCH_ENGINE (data); GtkSearchEngine *composite = GTK_SEARCH_ENGINE (data);
GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (composite);
GList *added, *l; GList *added, *l;
GtkSearchHit *hit; GtkSearchHit *hit;
@@ -221,10 +229,10 @@ hits_added (GtkSearchEngine *engine,
{ {
hit = l->data; hit = l->data;
if (!g_hash_table_contains (composite->priv->hits, hit)) if (!g_hash_table_contains (priv->hits, hit))
{ {
hit = _gtk_search_hit_dup (hit); hit = _gtk_search_hit_dup (hit);
g_hash_table_add (composite->priv->hits, hit); g_hash_table_add (priv->hits, hit);
added = g_list_prepend (added, hit); added = g_list_prepend (added, hit);
} }
} }
@@ -239,22 +247,23 @@ hits_added (GtkSearchEngine *engine,
static void static void
update_status (GtkSearchEngine *engine) update_status (GtkSearchEngine *engine)
{ {
GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
gboolean running; gboolean running;
running = engine->priv->native_running || engine->priv->simple_running; running = priv->native_running || priv->simple_running;
if (running != engine->priv->running) if (running != priv->running)
{ {
engine->priv->running = running; priv->running = running;
if (!running) if (!running)
{ {
if (engine->priv->native_error) if (priv->native_error)
_gtk_search_engine_error (engine, engine->priv->native_error); _gtk_search_engine_error (engine, priv->native_error);
else if (engine->priv->simple_error) else if (priv->simple_error)
_gtk_search_engine_error (engine, engine->priv->simple_error); _gtk_search_engine_error (engine, priv->simple_error);
else if (engine->priv->model_error) else if (priv->model_error)
_gtk_search_engine_error (engine, engine->priv->model_error); _gtk_search_engine_error (engine, priv->model_error);
else else
_gtk_search_engine_finished (engine); _gtk_search_engine_finished (engine);
} }
@@ -266,13 +275,14 @@ finished (GtkSearchEngine *engine,
gpointer data) gpointer data)
{ {
GtkSearchEngine *composite = GTK_SEARCH_ENGINE (data); GtkSearchEngine *composite = GTK_SEARCH_ENGINE (data);
GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (composite);
if (engine == composite->priv->native) if (engine == priv->native)
composite->priv->native_running = FALSE; priv->native_running = FALSE;
else if (engine == composite->priv->simple) else if (engine == priv->simple)
composite->priv->simple_running = FALSE; priv->simple_running = FALSE;
else if (engine == composite->priv->model) else if (engine == priv->model)
composite->priv->model_running = FALSE; priv->model_running = FALSE;
update_status (composite); update_status (composite);
} }
@@ -283,24 +293,25 @@ error (GtkSearchEngine *engine,
gpointer data) gpointer data)
{ {
GtkSearchEngine *composite = GTK_SEARCH_ENGINE (data); GtkSearchEngine *composite = GTK_SEARCH_ENGINE (data);
GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (composite);
if (engine == composite->priv->native) if (engine == priv->native)
{ {
g_free (composite->priv->native_error); g_free (priv->native_error);
composite->priv->native_error = g_strdup (message); priv->native_error = g_strdup (message);
composite->priv->native_running = FALSE; priv->native_running = FALSE;
} }
else if (engine == composite->priv->simple) else if (engine == priv->simple)
{ {
g_free (composite->priv->simple_error); g_free (priv->simple_error);
composite->priv->simple_error = g_strdup (message); priv->simple_error = g_strdup (message);
composite->priv->simple_running = FALSE; priv->simple_running = FALSE;
} }
else if (engine == composite->priv->model) else if (engine == priv->model)
{ {
g_free (composite->priv->model_error); g_free (priv->model_error);
composite->priv->model_error = g_strdup (message); priv->model_error = g_strdup (message);
composite->priv->model_running = FALSE; priv->model_running = FALSE;
} }
update_status (composite); update_status (composite);
@@ -360,37 +371,39 @@ GtkSearchEngine *
_gtk_search_engine_new (void) _gtk_search_engine_new (void)
{ {
GtkSearchEngine *engine; GtkSearchEngine *engine;
GtkSearchEnginePrivate *priv;
engine = g_object_new (GTK_TYPE_SEARCH_ENGINE, NULL); engine = g_object_new (GTK_TYPE_SEARCH_ENGINE, NULL);
priv = _gtk_search_engine_get_instance_private (engine);
engine->priv->simple = _gtk_search_engine_simple_new (); priv->simple = _gtk_search_engine_simple_new ();
g_debug ("Using simple search engine"); g_debug ("Using simple search engine");
connect_engine_signals (engine->priv->simple, engine); connect_engine_signals (priv->simple, engine);
#ifdef HAVE_TRACKER #ifdef HAVE_TRACKER
engine->priv->native = _gtk_search_engine_tracker_new (); priv->native = _gtk_search_engine_tracker_new ();
if (engine->priv->native) if (priv->native)
{ {
g_debug ("Using Tracker search engine"); g_debug ("Using Tracker search engine");
connect_engine_signals (engine->priv->native, engine); connect_engine_signals (priv->native, engine);
_gtk_search_engine_simple_set_indexed_cb (GTK_SEARCH_ENGINE_SIMPLE (engine->priv->simple), _gtk_search_engine_simple_set_indexed_cb (GTK_SEARCH_ENGINE_SIMPLE (priv->simple),
_gtk_search_engine_tracker_is_indexed, _gtk_search_engine_tracker_is_indexed,
g_object_ref (engine->priv->native), g_object_ref (priv->native),
g_object_unref); g_object_unref);
} }
#endif #endif
#ifdef GDK_WINDOWING_QUARTZ #ifdef GDK_WINDOWING_QUARTZ
engine->priv->native = _gtk_search_engine_quartz_new (); priv->native = _gtk_search_engine_quartz_new ();
if (engine->priv->native) if (priv->native)
{ {
g_debug ("Using Quartz search engine"); g_debug ("Using Quartz search engine");
connect_engine_signals (engine->priv->native, engine); connect_engine_signals (priv->native, engine);
} }
#endif #endif
engine->priv->hits = g_hash_table_new_full (search_hit_hash, search_hit_equal, priv->hits = g_hash_table_new_full (search_hit_hash, search_hit_equal,
(GDestroyNotify)_gtk_search_hit_free, NULL); (GDestroyNotify)_gtk_search_hit_free, NULL);
return engine; return engine;
} }
@@ -453,37 +466,43 @@ void
_gtk_search_engine_set_recursive (GtkSearchEngine *engine, _gtk_search_engine_set_recursive (GtkSearchEngine *engine,
gboolean recursive) gboolean recursive)
{ {
GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
g_return_if_fail (GTK_IS_SEARCH_ENGINE (engine)); g_return_if_fail (GTK_IS_SEARCH_ENGINE (engine));
g_assert (!engine->priv->running); g_assert (!priv->running);
engine->priv->recursive = recursive; priv->recursive = recursive;
if (engine->priv->native) if (priv->native)
_gtk_search_engine_set_recursive (engine->priv->native, recursive); _gtk_search_engine_set_recursive (priv->native, recursive);
if (engine->priv->simple) if (priv->simple)
_gtk_search_engine_set_recursive (engine->priv->simple, recursive); _gtk_search_engine_set_recursive (priv->simple, recursive);
} }
gboolean gboolean
_gtk_search_engine_get_recursive (GtkSearchEngine *engine) _gtk_search_engine_get_recursive (GtkSearchEngine *engine)
{ {
GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
g_return_val_if_fail (GTK_IS_SEARCH_ENGINE (engine), TRUE); g_return_val_if_fail (GTK_IS_SEARCH_ENGINE (engine), TRUE);
return engine->priv->recursive; return priv->recursive;
} }
void void
_gtk_search_engine_set_model (GtkSearchEngine *engine, _gtk_search_engine_set_model (GtkSearchEngine *engine,
GtkFileSystemModel *model) GtkFileSystemModel *model)
{ {
g_clear_object (&engine->priv->model); GtkSearchEnginePrivate *priv = _gtk_search_engine_get_instance_private (engine);
g_clear_object (&priv->model);
if (model) if (model)
{ {
engine->priv->model = _gtk_search_engine_model_new (model); priv->model = _gtk_search_engine_model_new (model);
connect_engine_signals (engine->priv->model, engine); connect_engine_signals (priv->model, engine);
if (engine->priv->query) if (priv->query)
_gtk_search_engine_set_query (engine->priv->model, engine->priv->query); _gtk_search_engine_set_query (priv->model, priv->query);
} }
} }

View File

@@ -14,7 +14,7 @@
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>. * License along with this library. If not, see <http://www.gnu.org/licenses/>.
* *
* Author: Anders Carlsson <andersca@imendio.com> * Author: Anders Carlsson <andersca@imendio.com>
* *
* Based on nautilus-search-engine.h * Based on nautilus-search-engine.h
*/ */
@@ -49,25 +49,23 @@ struct _GtkSearchHit
struct _GtkSearchEngine struct _GtkSearchEngine
{ {
GObject parent; GObject parent;
GtkSearchEnginePrivate *priv;
}; };
struct _GtkSearchEngineClass struct _GtkSearchEngineClass
{ {
GObjectClass parent_class; GObjectClass parent_class;
/* VTable */ /* VTable */
void (*set_query) (GtkSearchEngine *engine, void (*set_query) (GtkSearchEngine *engine,
GtkQuery *query); GtkQuery *query);
void (*start) (GtkSearchEngine *engine); void (*start) (GtkSearchEngine *engine);
void (*stop) (GtkSearchEngine *engine); void (*stop) (GtkSearchEngine *engine);
/* Signals */ /* Signals */
void (*hits_added) (GtkSearchEngine *engine, void (*hits_added) (GtkSearchEngine *engine,
GList *hits); GList *hits);
void (*finished) (GtkSearchEngine *engine); void (*finished) (GtkSearchEngine *engine);
void (*error) (GtkSearchEngine *engine, void (*error) (GtkSearchEngine *engine,
const gchar *error_message); const gchar *error_message);
}; };
@@ -75,15 +73,15 @@ GType _gtk_search_engine_get_type (void);
GtkSearchEngine* _gtk_search_engine_new (void); GtkSearchEngine* _gtk_search_engine_new (void);
void _gtk_search_engine_set_query (GtkSearchEngine *engine, void _gtk_search_engine_set_query (GtkSearchEngine *engine,
GtkQuery *query); GtkQuery *query);
void _gtk_search_engine_start (GtkSearchEngine *engine); void _gtk_search_engine_start (GtkSearchEngine *engine);
void _gtk_search_engine_stop (GtkSearchEngine *engine); void _gtk_search_engine_stop (GtkSearchEngine *engine);
void _gtk_search_engine_hits_added (GtkSearchEngine *engine, void _gtk_search_engine_hits_added (GtkSearchEngine *engine,
GList *hits); GList *hits);
void _gtk_search_engine_finished (GtkSearchEngine *engine); void _gtk_search_engine_finished (GtkSearchEngine *engine);
void _gtk_search_engine_error (GtkSearchEngine *engine, void _gtk_search_engine_error (GtkSearchEngine *engine,
const gchar *error_message); const gchar *error_message);
void _gtk_search_engine_set_recursive (GtkSearchEngine *engine, void _gtk_search_engine_set_recursive (GtkSearchEngine *engine,
gboolean recursive); gboolean recursive);