[gnome-todo] provider: add :set_default_task_list() vfunc



commit ea6263145aa951919e50fff773faeeb92110d7ef
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sat Apr 22 10:35:39 2017 -0300

    provider: add :set_default_task_list() vfunc
    
    It'll be used in the future by the new list selector
    inside the New Task row.

 plugins/eds/gtd-provider-eds.c           |  112 ++++++++++++++++++------------
 plugins/eds/gtd-provider-eds.h           |    3 +
 plugins/eds/gtd-provider-goa.c           |   20 +++++-
 plugins/eds/gtd-provider-local.c         |   36 +++++++++-
 plugins/todo-txt/gtd-provider-todo-txt.c |   12 +++-
 src/interfaces/gtd-provider.c            |   31 ++++++++
 src/interfaces/gtd-provider.h            |    6 ++
 7 files changed, 173 insertions(+), 47 deletions(-)
---
diff --git a/plugins/eds/gtd-provider-eds.c b/plugins/eds/gtd-provider-eds.c
index 114c34e..1688470 100644
--- a/plugins/eds/gtd-provider-eds.c
+++ b/plugins/eds/gtd-provider-eds.c
@@ -147,56 +147,21 @@ gtd_provider_eds_on_client_connected (GObject      *source_object,
 {
   GtdProviderEdsPrivate *priv;
   GtdProviderEds *self;
+  GtdTaskListEds *list;
   ECalClient *client;
+  TaskData *data;
+  ESource *default_source;
   ESource *source;
-  GError *error = NULL;
+  ESource *parent;
+  GError *error;
 
   self = GTD_PROVIDER_EDS (user_data);
   priv = gtd_provider_eds_get_instance_private (self);
+  error = NULL;
   source = e_client_get_source (E_CLIENT (source_object));
   client = E_CAL_CLIENT (e_cal_client_connect_finish (result, &error));
 
-  if (!error)
-    {
-      GtdTaskListEds *list;
-      TaskData *data;
-      ESource *parent;
-
-      /* parent source's display name is list's origin */
-      parent = e_source_registry_ref_source (priv->source_registry, e_source_get_parent (source));
-
-      /* creates a new task list */
-      list = gtd_task_list_eds_new (GTD_PROVIDER (self), source);
-
-      /* it's not ready until we fetch the list of tasks from client */
-      gtd_object_set_ready (GTD_OBJECT (list), FALSE);
-
-      /* async data */
-      data = task_data_new (user_data, (gpointer) list);
-
-      /* asyncronously fetch the task list */
-      e_cal_client_get_object_list_as_comps (client,
-                                             "contains? \"any\" \"\"",
-                                             NULL,
-                                             gtd_provider_eds_fill_task_list,
-                                             data);
-
-      priv->task_lists = g_list_append (priv->task_lists, list);
-
-      g_object_set_data (G_OBJECT (source), "task-list", list);
-      g_hash_table_insert (priv->clients, source, client);
-
-      /* Emit LIST_ADDED signal */
-      g_signal_emit_by_name (self, "list-added", list);
-
-      g_object_unref (parent);
-
-      g_debug ("%s: %s (%s)",
-               G_STRFUNC,
-               _("Task list source successfully connected"),
-               e_source_get_display_name (source));
-    }
-  else
+  if (error)
     {
       g_debug ("%s: %s (%s): %s",
                G_STRFUNC,
@@ -212,6 +177,47 @@ gtd_provider_eds_on_client_connected (GObject      *source_object,
       return;
     }
 
+  /* parent source's display name is list's origin */
+  parent = e_source_registry_ref_source (priv->source_registry, e_source_get_parent (source));
+
+  /* creates a new task list */
+  list = gtd_task_list_eds_new (GTD_PROVIDER (self), source);
+
+  /* it's not ready until we fetch the list of tasks from client */
+  gtd_object_set_ready (GTD_OBJECT (list), FALSE);
+
+  /* async data */
+  data = task_data_new (user_data, (gpointer) list);
+
+  /* asyncronously fetch the task list */
+  e_cal_client_get_object_list_as_comps (client,
+                                         "contains? \"any\" \"\"",
+                                         NULL,
+                                         gtd_provider_eds_fill_task_list,
+                                         data);
+
+  priv->task_lists = g_list_append (priv->task_lists, list);
+
+  g_object_set_data (G_OBJECT (source), "task-list", list);
+  g_hash_table_insert (priv->clients, source, client);
+
+  /* Check if the current list is the default one */
+  default_source = e_source_registry_ref_default_task_list (priv->source_registry);
+
+  if (default_source == source)
+    g_object_notify (G_OBJECT (self), "default-task-list");
+
+  g_clear_object (&default_source);
+
+  /* Emit LIST_ADDED signal */
+  g_signal_emit_by_name (self, "list-added", list);
+
+  g_object_unref (parent);
+
+  g_debug ("%s: %s (%s)",
+           G_STRFUNC,
+           _("Task list source successfully connected"),
+           e_source_get_display_name (source));
 }
 
 typedef struct
@@ -1039,8 +1045,26 @@ gtd_provider_eds_get_default_task_list (GtdProviderEds *provider)
 
   g_clear_object (&default_source);
 
-  if (gtd_task_list_get_provider (default_task_list) != GTD_PROVIDER (provider))
-    return NULL;
+  if (default_task_list &&
+      gtd_task_list_get_provider (default_task_list) != GTD_PROVIDER (provider))
+    {
+      return NULL;
+    }
 
   return default_task_list;
 }
+
+void
+gtd_provider_eds_set_default_task_list (GtdProviderEds *provider,
+                                        GtdTaskList    *list)
+{
+  GtdProviderEdsPrivate *priv;
+  ESource *source;
+
+  priv = gtd_provider_eds_get_instance_private (provider);
+  source = g_object_get_data (G_OBJECT (list), "task-list");
+
+  e_source_registry_set_default_task_list (priv->source_registry, source);
+
+  g_object_notify (G_OBJECT (provider), "default-task-list");
+}
diff --git a/plugins/eds/gtd-provider-eds.h b/plugins/eds/gtd-provider-eds.h
index 2b48d44..59c9b82 100644
--- a/plugins/eds/gtd-provider-eds.h
+++ b/plugins/eds/gtd-provider-eds.h
@@ -64,6 +64,9 @@ GList*               gtd_provider_eds_get_task_lists             (GtdProviderEds
 
 GtdTaskList*         gtd_provider_eds_get_default_task_list      (GtdProviderEds     *provider);
 
+void                 gtd_provider_eds_set_default_task_list      (GtdProviderEds     *provider,
+                                                                  GtdTaskList        *list);
+
 G_END_DECLS
 
 #endif /* GTD_PROVIDER_EDS_H */
diff --git a/plugins/eds/gtd-provider-goa.c b/plugins/eds/gtd-provider-goa.c
index 27a507a..43337d3 100644
--- a/plugins/eds/gtd-provider-goa.c
+++ b/plugins/eds/gtd-provider-goa.c
@@ -40,11 +40,12 @@ G_DEFINE_TYPE_WITH_CODE (GtdProviderGoa, gtd_provider_goa, GTD_TYPE_PROVIDER_EDS
 enum {
   PROP_0,
   PROP_ACCOUNT,
+  PROP_DEFAULT_TASKLIST,
+  PROP_DESCRIPTION,
   PROP_ENABLED,
   PROP_ICON,
   PROP_ID,
   PROP_NAME,
-  PROP_DESCRIPTION,
   N_PROPS
 };
 
@@ -169,6 +170,13 @@ gtd_provider_goa_get_default_task_list (GtdProvider *provider)
 }
 
 static void
+gtd_provider_goa_set_default_task_list (GtdProvider *provider,
+                                        GtdTaskList *list)
+{
+  gtd_provider_eds_set_default_task_list (GTD_PROVIDER_EDS (provider), list);
+}
+
+static void
 gtd_provider_iface_init (GtdProviderInterface *iface)
 {
   iface->get_id = gtd_provider_goa_get_id;
@@ -185,6 +193,7 @@ gtd_provider_iface_init (GtdProviderInterface *iface)
   iface->remove_task_list = gtd_provider_goa_remove_task_list;
   iface->get_task_lists = gtd_provider_goa_get_task_lists;
   iface->get_default_task_list = gtd_provider_goa_get_default_task_list;
+  iface->set_default_task_list = gtd_provider_goa_set_default_task_list;
 }
 
 static void
@@ -248,6 +257,10 @@ gtd_provider_goa_get_property (GObject    *object,
       g_value_set_object (value, self->account);
       break;
 
+    case PROP_DEFAULT_TASKLIST:
+      g_value_set_object (value, gtd_provider_goa_get_default_task_list (provider));
+      break;
+
     case PROP_DESCRIPTION:
       g_value_set_string (value, gtd_provider_goa_get_description (provider));
       break;
@@ -287,6 +300,10 @@ gtd_provider_goa_set_property (GObject      *object,
       gtd_provider_goa_set_account (self, g_value_get_object (value));
       break;
 
+    case PROP_DEFAULT_TASKLIST:
+      gtd_provider_goa_set_default_task_list (GTD_PROVIDER (self), g_value_get_object (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -347,6 +364,7 @@ gtd_provider_goa_class_init (GtdProviderGoaClass *klass)
   object_class->get_property = gtd_provider_goa_get_property;
   object_class->set_property = gtd_provider_goa_set_property;
 
+  g_object_class_override_property (object_class, PROP_DEFAULT_TASKLIST, "default-task-list");
   g_object_class_override_property (object_class, PROP_DESCRIPTION, "description");
   g_object_class_override_property (object_class, PROP_ENABLED, "enabled");
   g_object_class_override_property (object_class, PROP_ICON, "icon");
diff --git a/plugins/eds/gtd-provider-local.c b/plugins/eds/gtd-provider-local.c
index 116e16e..168877a 100644
--- a/plugins/eds/gtd-provider-local.c
+++ b/plugins/eds/gtd-provider-local.c
@@ -38,10 +38,11 @@ G_DEFINE_TYPE_WITH_CODE (GtdProviderLocal, gtd_provider_local, GTD_TYPE_PROVIDER
 enum {
   PROP_0,
   PROP_ENABLED,
+  PROP_DEFAULT_TASKLIST,
+  PROP_DESCRIPTION,
   PROP_ICON,
   PROP_ID,
   PROP_NAME,
-  PROP_DESCRIPTION,
   LAST_PROP
 };
 
@@ -187,6 +188,13 @@ gtd_provider_local_get_default_task_list (GtdProvider *provider)
 }
 
 static void
+gtd_provider_local_set_default_task_list (GtdProvider *provider,
+                                          GtdTaskList *list)
+{
+  gtd_provider_eds_set_default_task_list (GTD_PROVIDER_EDS (provider), list);
+}
+
+static void
 gtd_provider_iface_init (GtdProviderInterface *iface)
 {
   iface->get_id = gtd_provider_local_get_id;
@@ -203,6 +211,7 @@ gtd_provider_iface_init (GtdProviderInterface *iface)
   iface->remove_task_list = gtd_provider_local_remove_task_list;
   iface->get_task_lists = gtd_provider_local_get_task_lists;
   iface->get_default_task_list = gtd_provider_local_get_default_task_list;
+  iface->set_default_task_list = gtd_provider_local_set_default_task_list;
 }
 
 GtdProviderLocal*
@@ -233,6 +242,10 @@ gtd_provider_local_get_property (GObject    *object,
 
   switch (prop_id)
     {
+    case PROP_DEFAULT_TASKLIST:
+      g_value_set_object (value, gtd_provider_local_get_default_task_list (provider));
+      break;
+
     case PROP_DESCRIPTION:
       g_value_set_string (value, gtd_provider_local_get_description (provider));
       break;
@@ -258,6 +271,25 @@ gtd_provider_local_get_property (GObject    *object,
     }
 }
 
+static void
+gtd_provider_local_set_property (GObject      *object,
+                                 guint         prop_id,
+                                 const GValue *value,
+                                 GParamSpec   *pspec)
+{
+  GtdProvider *provider = GTD_PROVIDER (object);
+
+  switch (prop_id)
+    {
+    case PROP_DEFAULT_TASKLIST:
+      gtd_provider_local_set_default_task_list (provider, g_value_get_object (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
 static gboolean
 gtd_provider_local_should_load_source (GtdProviderEds *provider,
                                        ESource        *source)
@@ -278,7 +310,9 @@ gtd_provider_local_class_init (GtdProviderLocalClass *klass)
 
   object_class->finalize = gtd_provider_local_finalize;
   object_class->get_property = gtd_provider_local_get_property;
+  object_class->set_property = gtd_provider_local_set_property;
 
+  g_object_class_override_property (object_class, PROP_DEFAULT_TASKLIST, "default-task-list");
   g_object_class_override_property (object_class, PROP_DESCRIPTION, "description");
   g_object_class_override_property (object_class, PROP_ENABLED, "enabled");
   g_object_class_override_property (object_class, PROP_ICON, "icon");
diff --git a/plugins/todo-txt/gtd-provider-todo-txt.c b/plugins/todo-txt/gtd-provider-todo-txt.c
index 3661e81..293f050 100644
--- a/plugins/todo-txt/gtd-provider-todo-txt.c
+++ b/plugins/todo-txt/gtd-provider-todo-txt.c
@@ -52,11 +52,12 @@ G_DEFINE_TYPE_WITH_CODE (GtdProviderTodoTxt, gtd_provider_todo_txt, GTD_TYPE_OBJ
 
 enum {
   PROP_0,
+  PROP_DEFAULT_TASKLIST,
+  PROP_DESCRIPTION,
   PROP_ENABLED,
   PROP_ICON,
   PROP_ID,
   PROP_NAME,
-  PROP_DESCRIPTION,
   PROP_SOURCE,
   LAST_PROP
 };
@@ -999,6 +1000,13 @@ gtd_provider_todo_txt_get_default_task_list (GtdProvider *provider)
 }
 
 static void
+gtd_provider_todo_txt_set_default_task_list (GtdProvider *provider,
+                                             GtdTaskList *list)
+{
+  /* FIXME: implement me */
+}
+
+static void
 gtd_provider_iface_init (GtdProviderInterface *iface)
 {
   iface->get_id = gtd_provider_todo_txt_get_id;
@@ -1015,6 +1023,7 @@ gtd_provider_iface_init (GtdProviderInterface *iface)
   iface->remove_task_list = gtd_provider_todo_txt_remove_task_list;
   iface->get_task_lists = gtd_provider_todo_txt_get_task_lists;
   iface->get_default_task_list = gtd_provider_todo_txt_get_default_task_list;
+  iface->set_default_task_list = gtd_provider_todo_txt_set_default_task_list;
 }
 
 GtdProviderTodoTxt*
@@ -1115,6 +1124,7 @@ gtd_provider_todo_txt_class_init (GtdProviderTodoTxtClass *klass)
                                                          G_TYPE_OBJECT,
                                                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
+  g_object_class_override_property (object_class, PROP_DEFAULT_TASKLIST, "default-task-list");
   g_object_class_override_property (object_class, PROP_DESCRIPTION, "description");
   g_object_class_override_property (object_class, PROP_ENABLED, "enabled");
   g_object_class_override_property (object_class, PROP_ICON, "icon");
diff --git a/src/interfaces/gtd-provider.c b/src/interfaces/gtd-provider.c
index 6ff3626..abaa733 100644
--- a/src/interfaces/gtd-provider.c
+++ b/src/interfaces/gtd-provider.c
@@ -111,6 +111,18 @@ gtd_provider_default_init (GtdProviderInterface *iface)
                                                             G_PARAM_READABLE));
 
   /**
+   * GtdProvider::default-task-list:
+   *
+   * The default #GtdTaskList of the provider.
+   */
+  g_object_interface_install_property (iface,
+                                       g_param_spec_object ("default-task-list",
+                                                            "Default tasklist of the provider",
+                                                            "The default tasklist of the provider",
+                                                            GTD_TYPE_TASK_LIST,
+                                                            G_PARAM_READWRITE));
+
+  /**
    * GtdProvider::list-added:
    * @provider: a #GtdProvider
    * @list: a #GtdTaskList
@@ -399,3 +411,22 @@ gtd_provider_get_default_task_list (GtdProvider *provider)
 
   return GTD_PROVIDER_GET_IFACE (provider)->get_default_task_list (provider);
 }
+
+/**
+ * gtd_provider_set_default_task_list:
+ * @provider: a #GtdProvider
+ * @list: a #GtdTaskList
+ *
+ * Sets the default tasklist of @provider.
+ */
+void
+gtd_provider_set_default_task_list (GtdProvider *provider,
+                                    GtdTaskList *list)
+{
+  g_return_if_fail (GTD_IS_PROVIDER (provider));
+  g_return_if_fail (GTD_IS_TASK_LIST (provider));
+  g_return_if_fail (gtd_task_list_get_provider (list) == provider);
+  g_return_if_fail (GTD_PROVIDER_GET_IFACE (provider)->set_default_task_list);
+
+  return GTD_PROVIDER_GET_IFACE (provider)->set_default_task_list (provider, list);
+}
diff --git a/src/interfaces/gtd-provider.h b/src/interfaces/gtd-provider.h
index 24983b5..874ed7a 100644
--- a/src/interfaces/gtd-provider.h
+++ b/src/interfaces/gtd-provider.h
@@ -72,6 +72,9 @@ struct _GtdProviderInterface
   GList*             (*get_task_lists)                           (GtdProvider        *provider);
 
   GtdTaskList*       (*get_default_task_list)                    (GtdProvider        *provider);
+
+  void               (*set_default_task_list)                    (GtdProvider        *provider,
+                                                                  GtdTaskList        *list);
 };
 
 const gchar*         gtd_provider_get_id                         (GtdProvider        *provider);
@@ -108,6 +111,9 @@ GList*               gtd_provider_get_task_lists                 (GtdProvider
 
 GtdTaskList*         gtd_provider_get_default_task_list          (GtdProvider        *provider);
 
+void                 gtd_provider_set_default_task_list          (GtdProvider        *provider,
+                                                                  GtdTaskList        *list);
+
 G_END_DECLS
 
 #endif /* GTD_PROVIDER_H */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]