[gnome-notes] manager: Store notes and notebooks separately



commit a3180b68dda5f5c534b1d7d4ef09ccca40489dbd
Author: Jonathan Kang <jonathankang gnome org>
Date:   Fri Feb 11 14:16:15 2022 +0800

    manager: Store notes and notebooks separately
    
    Previously, a GListStore is used to store notebooks and a GHashTable
    is used to store all notes and notebooks. This leads to an issue that
    an empty note list instead of empty page is shown when there are no
    notes available, but notebooks.
    
    Fix that by using a GHashTable to only store notes so that the numbers
    of notes available can be return when needed.

 src/bjb-controller.c       |  2 +-
 src/libbiji/biji-manager.c | 61 +++++++++++++++++++++++++++-------------------
 src/libbiji/biji-manager.h |  4 +--
 3 files changed, 39 insertions(+), 28 deletions(-)
---
diff --git a/src/bjb-controller.c b/src/bjb-controller.c
index 8a4b6508..a2244854 100644
--- a/src/bjb-controller.c
+++ b/src/bjb-controller.c
@@ -546,7 +546,7 @@ bjb_controller_apply_needle (BjbController *self)
    * If no items, tell it - unless trash is visited */
   if (needle == NULL || g_strcmp0 (needle,"") == 0)
   {
-    result = biji_manager_get_items (self->manager, self->group);
+    result = biji_manager_get_notes (self->manager, self->group);
 
     if (result == NULL)
       {
diff --git a/src/libbiji/biji-manager.c b/src/libbiji/biji-manager.c
index f0d63cd7..62783afe 100644
--- a/src/libbiji/biji-manager.c
+++ b/src/libbiji/biji-manager.c
@@ -42,7 +42,7 @@ struct _BijiManager
    */
 
   GListStore *notebooks;
-  GHashTable *items;
+  GHashTable *notes;
   GHashTable *archives;
   GListStore *providers;
   BijiProvider *local_provider;
@@ -252,7 +252,7 @@ biji_manager_init (BijiManager *self)
   self->providers = g_list_store_new (BIJI_TYPE_PROVIDER);
 
   /* Item path is key for table */
-  self->items = g_hash_table_new_full (g_str_hash,
+  self->notes = g_hash_table_new_full (g_str_hash,
                                        g_str_equal,
                                        NULL,
                                        NULL);
@@ -282,7 +282,7 @@ void
 biji_manager_set_provider (BijiManager *self,
                            const gchar *provider_id)
 {
-  g_hash_table_remove_all (self->items);
+  g_hash_table_remove_all (self->notes);
   g_hash_table_remove_all (self->archives);
 
   self->provider = find_provider_with_id (G_LIST_MODEL (self->providers), provider_id);
@@ -308,7 +308,7 @@ biji_manager_finalize (GObject *object)
   g_clear_object (&self->notebooks);
   g_clear_object (&self->location);
   g_clear_object (&self->tracker);
-  g_hash_table_destroy (self->items);
+  g_hash_table_destroy (self->notes);
   g_hash_table_destroy (self->archives);
   g_clear_object (&self->providers);
 
@@ -370,9 +370,10 @@ static gboolean
 title_is_unique (BijiManager *self, gchar *title)
 {
   gboolean is_unique = TRUE;
+  guint i, n_notebooks;
   GList *items, *l;
 
-  items = g_hash_table_get_values (self->items);
+  items = g_hash_table_get_values (self->notes);
 
   for ( l=items ; l != NULL ; l = l->next)
   {
@@ -380,8 +381,6 @@ title_is_unique (BijiManager *self, gchar *title)
 
     if (BIJI_IS_NOTE_OBJ (l->data))
       item_title = biji_note_obj_get_title (l->data);
-    else if (BIJI_IS_NOTEBOOK (l->data))
-      item_title = biji_notebook_get_title (l->data);
 
     if (g_strcmp0 (item_title, title) == 0)
     {
@@ -390,6 +389,19 @@ title_is_unique (BijiManager *self, gchar *title)
     }
   }
 
+  n_notebooks = g_list_model_get_n_items (G_LIST_MODEL (self->notebooks));
+  for (i = 0; i < n_notebooks; i++)
+    {
+      g_autoptr(BijiNotebook) item = NULL;
+
+      item = g_list_model_get_item (G_LIST_MODEL (self->notebooks), i);
+      if (g_strcmp0 (biji_notebook_get_title (item), title) == 0)
+        {
+          is_unique = FALSE;
+          break;
+        }
+    }
+
   g_list_free (items);
   return is_unique;
 }
@@ -456,9 +468,9 @@ on_item_deleted_cb (BijiNoteObj *item,
     store = self->archives;
     group = BIJI_ARCHIVED_ITEMS;
   }
-  else if ((to_delete = g_hash_table_lookup (self->items, path)))
+  else if ((to_delete = g_hash_table_lookup (self->notes, path)))
   {
-    store = self->items;
+    store = self->notes;
     group = BIJI_LIVING_ITEMS;
   }
 
@@ -479,14 +491,14 @@ on_item_trashed_cb (BijiNoteObj *item,
   const gchar *path;
 
   path = biji_note_obj_get_uuid (item);
-  item = g_hash_table_lookup (self->items, path);
+  item = g_hash_table_lookup (self->notes, path);
 
   if (item == NULL)
     return;
 
   biji_manager_notify_changed (self, BIJI_LIVING_ITEMS, BIJI_MANAGER_ITEM_TRASHED, item);
   g_hash_table_insert (self->archives, (gpointer) path, item);
-  g_hash_table_remove (self->items, path);
+  g_hash_table_remove (self->notes, path);
 }
 
 
@@ -546,7 +558,8 @@ biji_manager_add_item (BijiManager    *manager,
   if (uid != NULL)
   {
     if (group == BIJI_LIVING_ITEMS &&
-        g_hash_table_lookup (manager->items, uid))
+        (g_hash_table_lookup (manager->notes, uid) ||
+         biji_manager_find_notebook (manager, uid)))
       retval = FALSE;
 
     if (group == BIJI_ARCHIVED_ITEMS &&
@@ -563,7 +576,14 @@ biji_manager_add_item (BijiManager    *manager,
   {
     /* Add the item*/
     if (group == BIJI_LIVING_ITEMS)
-      g_hash_table_insert (manager->items, (gpointer) uid, item);
+      {
+        if (BIJI_IS_NOTE_OBJ (item))
+          g_hash_table_insert (manager->notes, (gpointer) uid, item);
+        else if (BIJI_IS_NOTEBOOK (item))
+          if (uid && !biji_manager_find_notebook (manager, uid))
+            g_list_store_insert_sorted (manager->notebooks, item,
+                                        compare_notebook, NULL);
+      }
     else if (group == BIJI_ARCHIVED_ITEMS)
       g_hash_table_insert (manager->archives, (gpointer) uid, item);
 
@@ -576,15 +596,6 @@ biji_manager_add_item (BijiManager    *manager,
       g_signal_connect (item, "renamed", G_CALLBACK (manager_on_note_changed_cb), manager);
       g_signal_connect (item, "color-changed", G_CALLBACK (manager_on_item_icon_changed_cb), manager);
     }
-
-    else if (BIJI_IS_NOTEBOOK (item))
-    {
-      if (uid && !biji_manager_find_notebook (manager, uid))
-        {
-          g_list_store_insert_sorted (manager->notebooks, item,
-                                      compare_notebook, NULL);
-        }
-    }
   }
 
   if (retval && notify)
@@ -660,7 +671,7 @@ biji_manager_get_default_color (BijiManager *self, GdkRGBA *color)
 
 
 GList *
-biji_manager_get_items (BijiManager    *self,
+biji_manager_get_notes (BijiManager    *self,
                         BijiItemsGroup  group)
 {
   GList *list;
@@ -669,7 +680,7 @@ biji_manager_get_items (BijiManager    *self,
   switch (group)
   {
     case BIJI_LIVING_ITEMS:
-      list = g_hash_table_get_values (self->items);
+      list = g_hash_table_get_values (self->notes);
       break;
 
     case BIJI_ARCHIVED_ITEMS:
@@ -731,7 +742,7 @@ biji_manager_get_item_at_path (BijiManager *self, const gchar *path)
   if (path == NULL)
     return NULL;
 
-  retval = g_hash_table_lookup (self->items, (gconstpointer) path);
+  retval = g_hash_table_lookup (self->notes, (gconstpointer) path);
 
   if (retval == NULL)
     retval = g_hash_table_lookup (self->archives, (gconstpointer) path);
diff --git a/src/libbiji/biji-manager.h b/src/libbiji/biji-manager.h
index 71cb10f7..a6cd53b7 100644
--- a/src/libbiji/biji-manager.h
+++ b/src/libbiji/biji-manager.h
@@ -87,11 +87,11 @@ void             biji_manager_notify_changed        (BijiManager           *mana
 gpointer         biji_manager_get_item_at_path      (BijiManager *manager,
                                                      const gchar *path);
 
-/* Get all items, either notes or notebooks
+/* Get all notes.
  * Free the GList, not its content */
 
 
-GList           *biji_manager_get_items             (BijiManager         *manager,
+GList           *biji_manager_get_notes             (BijiManager         *manager,
                                                      BijiItemsGroup       group);
 GListModel      *biji_manager_get_notebooks         (BijiManager         *self);
 BijiNotebook    *biji_manager_find_notebook         (BijiManager         *self,


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