Move Shell search to GcalShellSearchProvider

Add a custom timeline to GcalShellSearchProvier and use
it to gather events.

Do a massive cleanup of unused APIs as well.
This commit is contained in:
Georges Basile Stavracas Neto
2020-04-01 21:06:51 -03:00
parent 06fbe2c2b9
commit 84eeb58804
6 changed files with 251 additions and 390 deletions
-304
View File
@@ -45,16 +45,6 @@ typedef struct
GcalManager *manager;
} AsyncOpsData;
typedef struct
{
ECalDataModelSubscriber *subscriber;
gchar *query;
guint sources_left;
gboolean passed_start;
gboolean search_done;
} ViewStateData;
typedef struct
{
gchar *event_uid;
@@ -64,12 +54,6 @@ typedef struct
GcalManager *manager;
} MoveEventData;
typedef struct
{
GcalManager *manager;
GList *events;
} GatherEventData;
struct _GcalManager
{
GObject parent;
@@ -84,9 +68,6 @@ struct _GcalManager
ESourceRegistry *source_registry;
ECredentialsPrompter *credentials_prompter;
ECalDataModel *shell_search_data_model;
ViewStateData *search_view_data;
GCancellable *async_ops;
gint clients_synchronizing;
@@ -126,36 +107,6 @@ free_async_ops_data (AsyncOpsData *data)
g_free (data);
}
static gboolean
gather_events (ECalDataModel *data_model,
ECalClient *client,
const ECalComponentId *id,
ECalComponent *comp,
time_t instance_start,
time_t instance_end,
gpointer user_data)
{
GatherEventData *data = user_data;
GcalCalendar *calendar;
GcalEvent *event;
GError *error;
error = NULL;
calendar = g_hash_table_lookup (data->manager->clients, e_client_get_source (E_CLIENT (client)));
event = gcal_event_new (calendar, comp, &error);
if (error)
{
g_warning ("Error: %s", error->message);
g_clear_error (&error);
return TRUE;
}
data->events = g_list_append (data->events, event);/* FIXME: add me sorted */
return TRUE;
}
static void
remove_source (GcalManager *self,
ESource *source)
@@ -198,21 +149,6 @@ source_changed (GcalManager *self,
if (!calendar)
GCAL_RETURN ();
if (gcal_calendar_get_visible (calendar))
{
ECalClient *client = gcal_calendar_get_client (calendar);
if (self->shell_search_data_model)
e_cal_data_model_add_client (self->shell_search_data_model, client);
}
else
{
const gchar *id = gcal_calendar_get_id (calendar);
if (self->shell_search_data_model)
e_cal_data_model_remove_client (self->shell_search_data_model, id);
}
g_signal_emit (self, signals[CALENDAR_CHANGED], 0, calendar);
GCAL_EXIT;
@@ -286,12 +222,6 @@ on_calendar_created_cb (GObject *source_object,
gcal_timeline_add_calendar (self->timeline, calendar);
if (visible)
{
if (self->shell_search_data_model != NULL)
e_cal_data_model_add_client (self->shell_search_data_model, client);
}
/* refresh client when it's added */
if (visible && e_client_check_refresh_supported (E_CLIENT (client)))
{
@@ -464,45 +394,6 @@ on_event_removed (GObject *source_object,
GCAL_EXIT;
}
static void
model_state_changed (GcalManager *self,
ECalClientView *view,
ECalDataModelViewState state,
guint percent,
const gchar *message,
const GError *error,
ECalDataModel *data_model)
{
gchar *filter;
GCAL_ENTRY;
filter = e_cal_data_model_dup_filter (data_model);
if (state == E_CAL_DATA_MODEL_VIEW_STATE_START &&
g_strcmp0 (self->search_view_data->query, filter) == 0)
{
self->search_view_data->passed_start = TRUE;
GCAL_GOTO (out);
}
if (self->search_view_data->passed_start &&
state == E_CAL_DATA_MODEL_VIEW_STATE_COMPLETE &&
g_strcmp0 (self->search_view_data->query, filter) == 0)
{
self->search_view_data->sources_left--;
self->search_view_data->search_done = (self->search_view_data->sources_left == 0);
if (self->search_view_data->search_done)
g_signal_emit (self, signals[QUERY_COMPLETED], 0);
}
out:
g_free (filter);
GCAL_EXIT;
}
static void
show_source_error (const gchar *where,
const gchar *what,
@@ -653,7 +544,6 @@ gcal_manager_finalize (GObject *object)
GCAL_ENTRY;
g_clear_object (&self->timeline);
g_clear_object (&self->shell_search_data_model);
if (self->context)
{
@@ -661,12 +551,6 @@ gcal_manager_finalize (GObject *object)
self->context = NULL;
}
if (self->search_view_data)
{
g_clear_pointer (&self->search_view_data->query, g_free);
g_clear_pointer (&self->search_view_data, g_free);
}
g_clear_pointer (&self->clients, g_hash_table_destroy);
G_OBJECT_CLASS (gcal_manager_parent_class)->finalize (object);
@@ -903,137 +787,6 @@ gcal_manager_set_default_calendar (GcalManager *self,
gcal_calendar_get_source (calendar));
}
/**
* gcal_manager_setup_shell_search:
* @self: a #GcalManager
* @subscriber: an #ECalDataModelSubscriber
*
* Sets up the GNOME Shell search subscriber.
*/
void
gcal_manager_setup_shell_search (GcalManager *self,
ECalDataModelSubscriber *subscriber)
{
GTimeZone *zone;
g_return_if_fail (GCAL_IS_MANAGER (self));
if (self->shell_search_data_model)
return;
self->shell_search_data_model = e_cal_data_model_new (gcal_thread_submit_job);
g_signal_connect_object (self->shell_search_data_model,
"view-state-changed",
G_CALLBACK (model_state_changed),
self,
G_CONNECT_SWAPPED);
e_cal_data_model_set_expand_recurrences (self->shell_search_data_model, TRUE);
zone = gcal_context_get_timezone (self->context);
e_cal_data_model_set_timezone (self->shell_search_data_model, gcal_timezone_to_icaltimezone (zone));
self->search_view_data = g_new0 (ViewStateData, 1);
self->search_view_data->subscriber = subscriber;
}
/**
* gcal_manager_set_shell_search_query:
* @self: A #GcalManager instance
* @query: query string (an s-exp)
*
* Set the query terms of the #ECalDataModel used in the shell search
*/
void
gcal_manager_set_shell_search_query (GcalManager *self,
const gchar *query)
{
GCAL_ENTRY;
g_return_if_fail (GCAL_IS_MANAGER (self));
self->search_view_data->passed_start = FALSE;
self->search_view_data->search_done = FALSE;
self->search_view_data->sources_left = g_hash_table_size (self->clients);
if (self->search_view_data->query != NULL)
g_free (self->search_view_data->query);
self->search_view_data->query = g_strdup (query);
e_cal_data_model_set_filter (self->shell_search_data_model, query);
}
/**
* gcal_manager_set_shell_search_subscriber:
* @self: a #GcalManager
* @subscriber: the #ECalDataModelSubscriber to subscribe
* @range_start: the start of the range
* @range_end: the end of the range
*
* Subscribe @subscriber to the shell data modal at the given range.
*/
void
gcal_manager_set_shell_search_subscriber (GcalManager *self,
ECalDataModelSubscriber *subscriber,
time_t range_start,
time_t range_end)
{
GCAL_ENTRY;
e_cal_data_model_subscribe (self->shell_search_data_model, subscriber, range_start, range_end);
GCAL_EXIT;
}
/**
* gcal_manager_shell_search_done:
* @self: a #GcalManager
*
* Retrieves whether the search at @self is done or not.
*
* Returns: %TRUE if the search is finished.
*/
gboolean
gcal_manager_shell_search_done (GcalManager *self)
{
g_return_val_if_fail (GCAL_IS_MANAGER (self), FALSE);
return self->search_view_data->search_done;
}
/**
* gcal_manager_get_shell_search_events:
* @self: a #GcalManager
*
* Retrieves all the events available for GNOME Shell search.
*
* Returns: (nullable)(transfer full)(content-type GcalEvent): a #GList
*/
GList*
gcal_manager_get_shell_search_events (GcalManager *self)
{
time_t range_start, range_end;
GatherEventData data = {
.manager = self,
.events = NULL,
};
GCAL_ENTRY;
e_cal_data_model_get_subscriber_range (self->shell_search_data_model,
self->search_view_data->subscriber,
&range_start,
&range_end);
e_cal_data_model_foreach_component (self->shell_search_data_model,
range_start,
range_end,
gather_events,
&data);
GCAL_RETURN (data.events);
}
/**
* gcal_manager_set_subscriber:
* @self: a #GcalManager
@@ -1469,63 +1222,6 @@ gcal_manager_get_events (GcalManager *self,
GCAL_RETURN (g_steal_pointer (&events_at_range));
}
/**
* gcal_manager_get_event_from_shell_search:
* @self: a #GcalManager
* @uuid: the unique identier of the event
*
* Retrieves the #GcalEvent with @uuid.
*
* Returns: (nullable)(transfer full): a #GcalEvent
*/
GcalEvent*
gcal_manager_get_event_from_shell_search (GcalManager *self,
const gchar *uuid)
{
GcalEvent *new_event;
GList *l;
time_t range_start, range_end;
GatherEventData data = {
.manager = self,
.events = NULL,
};
GCAL_ENTRY;
g_return_val_if_fail (GCAL_IS_MANAGER (self), NULL);
new_event = NULL;
e_cal_data_model_get_subscriber_range (self->shell_search_data_model,
self->search_view_data->subscriber,
&range_start,
&range_end);
e_cal_data_model_foreach_component (self->shell_search_data_model,
range_start,
range_end,
gather_events,
&data);
for (l = data.events; l != NULL; l = g_list_next (l))
{
GcalEvent *event;
event = l->data;
/* Found the event */
if (g_strcmp0 (gcal_event_get_uid (event), uuid) == 0)
new_event = event;
else
g_object_unref (event);
}
g_list_free (data.events);
GCAL_RETURN (new_event);
}
/**
* gcal_manager_get_synchronizing:
* @self: a #GcalManager