[gnome-todo] manager: Add GtdWorkspace APIs



commit 0d9ff14a288e366cfbd7b68c27a51c7094a6de3f
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Mon Apr 27 01:25:34 2020 -0300

    manager: Add GtdWorkspace APIs

 src/engine/gtd-manager.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++
 src/engine/gtd-manager.h |   8 ++++
 2 files changed, 119 insertions(+)
---
diff --git a/src/engine/gtd-manager.c b/src/engine/gtd-manager.c
index 5aab998..35c58ee 100644
--- a/src/engine/gtd-manager.c
+++ b/src/engine/gtd-manager.c
@@ -22,6 +22,7 @@
 #include "models/gtd-task-model-private.h"
 #include "interfaces/gtd-provider.h"
 #include "interfaces/gtd-panel.h"
+#include "interfaces/gtd-workspace.h"
 #include "notification/gtd-notification.h"
 #include "gtd-clock.h"
 #include "gtd-debug.h"
@@ -60,6 +61,7 @@ struct _GtdManager
   GListModel         *tasks_model;
   GListModel         *unarchived_tasks_model;
 
+  GHashTable         *workspaces;
   GList              *providers;
   GList              *panels;
   GtdProvider        *default_provider;
@@ -84,6 +86,8 @@ enum
   PANEL_REMOVED,
   PROVIDER_ADDED,
   PROVIDER_REMOVED,
+  WORKSPACE_ADDED,
+  WORKSPACE_REMOVED,
   NUM_SIGNALS
 };
 
@@ -355,6 +359,8 @@ gtd_manager_finalize (GObject *object)
   g_clear_object (&self->unarchived_tasks_model);
   g_clear_object (&self->lists_model);
 
+  g_clear_pointer (&self->workspaces, g_hash_table_destroy);
+
   G_OBJECT_CLASS (gtd_manager_parent_class)->finalize (object);
 }
 
@@ -631,12 +637,49 @@ gtd_manager_class_init (GtdManagerClass *klass)
                                             G_TYPE_NONE,
                                             1,
                                             GTD_TYPE_PROVIDER);
+
+  /**
+   * GtdManager::workspace-added:
+   * @manager: a #GtdManager
+   * @workspace: a #GtdWorkspace
+   *
+   * Emitted after @workspace is ADDED.
+   */
+  signals[WORKSPACE_ADDED] = g_signal_new ("workspace-added",
+                                            GTD_TYPE_MANAGER,
+                                            G_SIGNAL_RUN_LAST,
+                                            0,
+                                            NULL,
+                                            NULL,
+                                            NULL,
+                                            G_TYPE_NONE,
+                                            1,
+                                            GTD_TYPE_WORKSPACE);
+
+  /**
+   * GtdManager::workspace-removed:
+   * @manager: a #GtdManager
+   * @workspace: a #GtdWorkspace
+   *
+   * Emitted after @workspace is removed.
+   */
+  signals[WORKSPACE_REMOVED] = g_signal_new ("workspace-removed",
+                                             GTD_TYPE_MANAGER,
+                                             G_SIGNAL_RUN_LAST,
+                                             0,
+                                             NULL,
+                                             NULL,
+                                             NULL,
+                                             G_TYPE_NONE,
+                                             1,
+                                             GTD_TYPE_WORKSPACE);
 }
 
 
 static void
 gtd_manager_init (GtdManager *self)
 {
+  self->workspaces = g_hash_table_new_full (NULL, NULL, g_object_unref, NULL);
   self->settings = g_settings_new ("org.gnome.todo");
   self->plugin_manager = gtd_plugin_manager_new ();
   self->clock = gtd_clock_new ();
@@ -965,6 +1008,74 @@ gtd_manager_get_tasks_model (GtdManager *self)
   return self->unarchived_tasks_model;
 }
 
+/**
+ * gtd_manager_get_workspaces:
+ * @self: a #GtdManager
+ *
+ * Retrieves the current list of workspaces.
+ *
+ * Returns: (transfer full): a #GPtrArray
+ */
+GPtrArray*
+gtd_manager_get_workspaces (GtdManager *self)
+{
+  g_autoptr (GPtrArray) workspaces = NULL;
+  g_autoptr (GList) keys = NULL;
+  GList *l;
+
+  g_return_val_if_fail (GTD_IS_MANAGER (self), NULL);
+
+  workspaces = g_ptr_array_new_with_free_func (g_object_unref);
+  keys = g_hash_table_get_keys (self->workspaces);
+
+  for (l = keys; l; l = l->next)
+    g_ptr_array_add (workspaces, g_object_ref (l->data));
+
+  return g_steal_pointer (&workspaces);
+}
+
+/**
+ * gtd_manager_add_workspace:
+ * @self: a #GtdManager
+ * @workspace: a #GtdWorkspace
+ *
+ * Adds @workspace to the list of workspace. If @workspace
+ * is already added, does nothing.
+ */
+void
+gtd_manager_add_workspace (GtdManager   *self,
+                           GtdWorkspace *workspace)
+{
+  g_return_if_fail (GTD_IS_MANAGER (self));
+  g_return_if_fail (GTD_IS_WORKSPACE (workspace));
+
+  if (g_hash_table_add (self->workspaces, g_object_ref (workspace)))
+    g_signal_emit (self, signals[WORKSPACE_ADDED], 0, workspace);
+}
+
+/**
+ * gtd_manager_remove_workspace:
+ * @self: a #GtdManager
+ * @workspace: a #GtdWorkspace
+ *
+ * Removes @workspace from the list of workspace. If @workspace
+ * is not added, does nothing.
+ */
+void
+gtd_manager_remove_workspace (GtdManager   *self,
+                              GtdWorkspace *workspace)
+{
+  g_return_if_fail (GTD_IS_MANAGER (self));
+  g_return_if_fail (GTD_IS_WORKSPACE (workspace));
+
+  g_object_ref (workspace);
+
+  if (g_hash_table_remove (self->workspaces, workspace))
+    g_signal_emit (self, signals[WORKSPACE_REMOVED], 0, workspace);
+
+  g_object_unref (workspace);
+}
+
 void
 gtd_manager_load_plugins (GtdManager *self)
 {
diff --git a/src/engine/gtd-manager.h b/src/engine/gtd-manager.h
index 09e71d1..3d601b8 100644
--- a/src/engine/gtd-manager.h
+++ b/src/engine/gtd-manager.h
@@ -75,4 +75,12 @@ GListModel*          gtd_manager_get_all_tasks_model             (GtdManager
 
 GListModel*          gtd_manager_get_tasks_model                 (GtdManager         *self);
 
+GPtrArray*           gtd_manager_get_workspaces                  (GtdManager         *self);
+
+void                 gtd_manager_add_workspace                   (GtdManager         *self,
+                                                                  GtdWorkspace       *workspace);
+
+void                 gtd_manager_remove_workspace                (GtdManager         *self,
+                                                                  GtdWorkspace       *workspace);
+
 G_END_DECLS


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