manager: add shell search provider helpers

Added:
+ :query-completed signal. This would allow to know when the search has
completed and the shell search provider will be able to sort and rank
the results

Added API to:
+ set the query for the shell provider model
+ set the subscription of the view on the shell provider model
+ know when the querying of the views completed on the model and all the
events are available for retrieving
This commit is contained in:
Erick Pérez Castellanos
2015-02-06 09:21:34 -05:00
parent b3a374dbe9
commit 25fd4ab5a9
2 changed files with 125 additions and 13 deletions
+112 -11
View File
@@ -27,6 +27,16 @@ typedef struct
GcalManager *manager;
} AsyncOpsData;
typedef struct
{
ECalDataModelSubscriber *subscriber;
gchar *query;
guint sources_left;
gboolean passed_start;
gboolean search_done;
} ViewStateData;
typedef struct
{
ECalClient *client;
@@ -48,7 +58,9 @@ typedef struct
ECalDataModel *e_data_model;
ECalDataModel *search_data_model;
ECalDataModel *shell_search_data_model;
ViewStateData *search_view_data;
GCancellable *async_ops;
@@ -86,6 +98,7 @@ enum
SOURCE_ADDED,
SOURCE_REMOVED,
LOAD_COMPLETED,
QUERY_COMPLETED,
NUM_SIGNALS
};
@@ -338,6 +351,8 @@ on_client_connected (GObject *source_object,
e_cal_data_model_add_client (priv->e_data_model, client);
e_cal_data_model_add_client (priv->search_data_model, client);
if (priv->shell_search_data_model != NULL)
e_cal_data_model_add_client (priv->shell_search_data_model, client);
}
/* refresh client when it's added */
@@ -508,6 +523,37 @@ remove_source (GcalManager *manager,
g_signal_emit (manager, signals[SOURCE_REMOVED], 0, source);
}
static void
model_state_changed (GcalManager *manager,
ECalClientView *view,
ECalDataModelViewState state,
guint percent,
const gchar *message,
const GError *error,
ECalDataModel *data_model)
{
GcalManagerPrivate *priv = gcal_manager_get_instance_private (manager);
gchar *filter = e_cal_data_model_dup_filter (data_model);
if (state == E_CAL_DATA_MODEL_VIEW_STATE_START && g_strcmp0 (priv->search_view_data->query, filter) == 0)
{
priv->search_view_data->passed_start = TRUE;
goto out;
}
if (priv->search_view_data->passed_start && state == E_CAL_DATA_MODEL_VIEW_STATE_COMPLETE &&
g_strcmp0 (priv->search_view_data->query, filter) == 0)
{
priv->search_view_data->sources_left--;
priv->search_view_data->search_done = (priv->search_view_data->sources_left == 0);
if (priv->search_view_data->search_done)
g_signal_emit (manager, signals[QUERY_COMPLETED], 0);
}
out:
g_free (filter);
return;
}
static void
gcal_manager_class_init (GcalManagerClass *klass)
{
@@ -544,6 +590,11 @@ gcal_manager_class_init (GcalManagerClass *klass)
G_STRUCT_OFFSET (GcalManagerClass, load_completed),
NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[QUERY_COMPLETED] = g_signal_new ("query-completed", GCAL_TYPE_MANAGER, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GcalManagerClass, query_completed),
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}
static void
@@ -591,8 +642,6 @@ gcal_manager_constructed (GObject *object)
e_cal_data_model_set_expand_recurrences (priv->search_data_model, TRUE);
e_cal_data_model_set_timezone (priv->search_data_model, priv->system_timezone);
g_signal_connect_swapped (priv->search_data_model, "view-state-changed", G_CALLBACK (model_state_changed), object);
sources = e_source_registry_list_enabled (priv->source_registry, E_SOURCE_EXTENSION_CALENDAR);
priv->sources_at_launch = g_list_length (sources);
@@ -617,6 +666,14 @@ gcal_manager_finalize (GObject *object)
if (priv->search_data_model != NULL)
g_object_unref (priv->search_data_model);
if (priv->search_view_data != NULL)
{
g_free (priv->search_view_data->query);
g_free (priv->search_view_data);
}
if (priv->shell_search_data_model != NULL)
g_object_unref (priv->shell_search_data_model);
g_hash_table_destroy (priv->clients);
}
@@ -749,7 +806,8 @@ gcal_manager_get_system_timezone (GcalManager *manager)
}
void
gcal_manager_set_shell_search (GcalManager *manager)
gcal_manager_setup_shell_search (GcalManager *manager,
ECalDataModelSubscriber *subscriber)
{
GcalManagerPrivate *priv;
priv = gcal_manager_get_instance_private (manager);
@@ -757,29 +815,72 @@ gcal_manager_set_shell_search (GcalManager *manager)
if (priv->shell_search_data_model == NULL)
{
priv->shell_search_data_model = e_cal_data_model_new (submit_thread_job);
g_signal_connect_swapped (priv->shell_search_data_model, "view-state-changed", G_CALLBACK (model_state_changed), manager);
e_cal_data_model_set_expand_recurrences (priv->shell_search_data_model, TRUE);
e_cal_data_model_set_timezone (priv->shell_search_data_model, priv->system_timezone);
priv->search_view_data = g_new0 (ViewStateData, 1);
priv->search_view_data->subscriber = subscriber;
}
}
/**
* gcal_manager_set_shell_query:
* gcal_manager_set_shell_search_query:
* @manager: A #GcalManager instance
* @query: (nullable): query terms or %NULL
*
* Set the query terms of the #ECalDataModel or clear it if %NULL is
* passed
* @query: query string (an s-exp)
*
* Set the query terms of the #ECalDataModel used in the shell search
**/
void
gcal_manager_set_shell_query (GcalManager *manager,
const gchar *query)
gcal_manager_set_shell_search_query (GcalManager *manager,
const gchar *query)
{
GcalManagerPrivate *priv = gcal_manager_get_instance_private (manager);
priv->search_view_data->passed_start = FALSE;
priv->search_view_data->search_done = FALSE;
priv->search_view_data->sources_left = g_hash_table_size (priv->clients) - g_strv_length (priv->disabled_sources);
if (priv->search_view_data->query != NULL)
g_free (priv->search_view_data->query);
priv->search_view_data->query = g_strdup (query);
e_cal_data_model_set_filter (priv->shell_search_data_model, query);
}
void
gcal_manager_set_shell_search_subscriber (GcalManager *manager,
ECalDataModelSubscriber *subscriber,
time_t range_start,
time_t range_end)
{
GcalManagerPrivate *priv;
priv = gcal_manager_get_instance_private (manager);
e_cal_data_model_set_filter (priv->shell_search_data_model, query);
e_cal_data_model_subscribe (priv->shell_search_data_model, subscriber, range_start, range_end);
}
gboolean
gcal_manager_shell_search_done (GcalManager *manager)
{
GcalManagerPrivate *priv = gcal_manager_get_instance_private (manager);
return priv->search_view_data->search_done;
}
GList*
gcal_manager_get_shell_search_events (GcalManager *manager)
{
GcalManagerPrivate *priv;
time_t range_start, range_end;
GList *list = NULL;
priv = gcal_manager_get_instance_private (manager);
e_cal_data_model_get_subscriber_range (priv->shell_search_data_model, priv->search_view_data->subscriber,
&range_start, &range_end);
e_cal_data_model_foreach_component (priv->shell_search_data_model, range_start, range_end, gather_components, &list);
return list;
}
void
+13 -2
View File
@@ -50,6 +50,7 @@ struct _GcalManagerClass
void (*source_added) (GcalManager *manager, ESource *source, gboolean enabled);
void (*source_removed) (GcalManager *manager, ESource *source);
void (*load_completed) (GcalManager *manager);
void (*query_completed) (GcalManager *manager);
};
typedef struct
@@ -70,11 +71,21 @@ ESource* gcal_manager_get_default_source (GcalManager *manager
icaltimezone* gcal_manager_get_system_timezone (GcalManager *manager);
void gcal_manager_set_shell_search (GcalManager *manager);
void gcal_manager_setup_shell_search (GcalManager *manager,
ECalDataModelSubscriber *subscriber);
void gcal_manager_set_shell_query (GcalManager *manager,
void gcal_manager_set_shell_search_query (GcalManager *manager,
const gchar *query);
void gcal_manager_set_shell_search_subscriber (GcalManager *manager,
ECalDataModelSubscriber *subscriber,
time_t range_start,
time_t range_end);
gboolean gcal_manager_shell_search_done (GcalManager *manager);
GList* gcal_manager_get_shell_search_events (GcalManager *manager);
void gcal_manager_set_subscriber (GcalManager *manager,
ECalDataModelSubscriber *subscriber,
time_t range_start,