[gnome-notes] manager: Use GListModel for notes
- From: Isaque Galdino de Araujo <igaldino src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-notes] manager: Use GListModel for notes
- Date: Tue, 31 May 2022 13:40:06 +0000 (UTC)
commit 76f8fcbf2ca0c2611f1b03a0d4207edefb252dd6
Author: Mohammed Sadiq <sadiq sadiqpk org>
Date: Fri Apr 1 11:06:55 2022 +0530
manager: Use GListModel for notes
And adapt to changes
Eventually we can move away from GtkTreeModel completely
src/bjb-controller.c | 19 ++++-
src/libbiji/biji-manager.c | 202 +++++++++++++++++++++++++++------------------
src/libbiji/biji-manager.h | 5 +-
3 files changed, 144 insertions(+), 82 deletions(-)
---
diff --git a/src/bjb-controller.c b/src/bjb-controller.c
index 8faa301e..1e8b6000 100644
--- a/src/bjb-controller.c
+++ b/src/bjb-controller.c
@@ -536,7 +536,8 @@ on_controller_get_notes_cb (GObject *object,
void
bjb_controller_apply_needle (BjbController *self)
{
- GList *result;
+ GListModel *notes;
+ GList *result = NULL;
gchar *needle;
needle = self->needle;
@@ -546,7 +547,21 @@ 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_notes (self->manager, self->group);
+ guint i, n_items = 0;
+
+ notes = biji_manager_get_notes (self->manager, self->group);
+ if (notes)
+ n_items = g_list_model_get_n_items (notes);
+
+ for (i = 0; i < n_items; i++)
+ {
+ g_autoptr(BijiNoteObj) note = NULL;
+
+ note = g_list_model_get_item (notes, i);
+ result = g_list_prepend (result, note);
+ }
+
+ result = g_list_reverse (result);
if (result == NULL)
{
diff --git a/src/libbiji/biji-manager.c b/src/libbiji/biji-manager.c
index 1e99cc77..bb592834 100644
--- a/src/libbiji/biji-manager.c
+++ b/src/libbiji/biji-manager.c
@@ -42,8 +42,8 @@ struct _BijiManager
*/
GListStore *notebooks;
- GHashTable *notes;
- GHashTable *archives;
+ GListStore *notes;
+ GListStore *archives;
GListStore *providers;
BijiProvider *local_provider;
@@ -80,6 +80,52 @@ static GParamSpec *properties[BIJI_MANAGER_PROPERTIES] = { NULL, };
G_DEFINE_TYPE (BijiManager, biji_manager, G_TYPE_OBJECT)
+static gboolean
+manager_remove_list_item (GListStore *store,
+ gpointer item)
+{
+ GListModel *model;
+ guint n_items;
+
+ g_return_val_if_fail (G_IS_LIST_STORE (store), FALSE);
+ g_return_val_if_fail (item, FALSE);
+
+ model = G_LIST_MODEL (store);
+ n_items = g_list_model_get_n_items (model);
+
+ for (guint i = 0; i < n_items; i++)
+ {
+ g_autoptr(GObject) object = NULL;
+
+ object = g_list_model_get_item (model, i);
+
+ if (object == item)
+ {
+ g_list_store_remove (store, i);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static int
+compare_note (gconstpointer a,
+ gconstpointer b,
+ gpointer user_data)
+{
+ g_autofree char *up_a = NULL;
+ g_autofree char *up_b = NULL;
+ BijiNoteObj *item_a = (BijiNoteObj *) a;
+ BijiNoteObj *item_b = (BijiNoteObj *) b;
+
+ up_a = g_utf8_casefold (biji_note_obj_get_title (item_a), -1);
+ up_b = g_utf8_casefold (biji_note_obj_get_title (item_b), -1);
+
+ return g_strcmp0 (up_a, up_b);
+}
+
static void
on_provider_loaded_cb (BijiProvider *provider,
GList *items,
@@ -250,17 +296,8 @@ biji_manager_init (BijiManager *self)
{
self->notebooks = g_list_store_new (BIJI_TYPE_NOTEBOOK);
self->providers = g_list_store_new (BIJI_TYPE_PROVIDER);
-
- /* Item path is key for table */
- self->notes = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- NULL,
- NULL);
-
- self->archives = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- NULL,
- NULL);
+ self->notes = g_list_store_new (BIJI_TYPE_NOTE_OBJ);
+ self->archives = g_list_store_new (BIJI_TYPE_NOTE_OBJ);
self->tracker = biji_tracker_new (self);
}
@@ -282,8 +319,8 @@ void
biji_manager_set_provider (BijiManager *self,
const gchar *provider_id)
{
- g_hash_table_remove_all (self->notes);
- g_hash_table_remove_all (self->archives);
+ g_list_store_remove_all (self->notes);
+ g_list_store_remove_all (self->archives);
self->provider = find_provider_with_id (G_LIST_MODEL (self->providers), provider_id);
if (self->provider)
@@ -308,8 +345,8 @@ 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->notes);
- g_hash_table_destroy (self->archives);
+ g_clear_object (&self->notes);
+ g_clear_object (&self->archives);
g_clear_object (&self->providers);
G_OBJECT_CLASS (biji_manager_parent_class)->finalize (object);
@@ -370,24 +407,20 @@ 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->notes);
-
- for ( l=items ; l != NULL ; l = l->next)
- {
- const char *item_title = NULL;
+ guint i, n_notebooks, n_notes;
- if (BIJI_IS_NOTE_OBJ (l->data))
- item_title = biji_note_obj_get_title (l->data);
-
- if (g_strcmp0 (item_title, title) == 0)
+ n_notes = g_list_model_get_n_items (G_LIST_MODEL (self->notes));
+ for (i = 0; i < n_notes; i++)
{
- is_unique = FALSE;
- break;
+ g_autoptr(BijiNoteObj) item = NULL;
+
+ item = g_list_model_get_item (G_LIST_MODEL (self->notes), i);
+ if (g_strcmp0 (biji_note_obj_get_title (item), title) == 0)
+ {
+ is_unique = FALSE;
+ break;
+ }
}
- }
n_notebooks = g_list_model_get_n_items (G_LIST_MODEL (self->notebooks));
for (i = 0; i < n_notebooks; i++)
@@ -402,7 +435,6 @@ title_is_unique (BijiManager *self, gchar *title)
}
}
- g_list_free (items);
return is_unique;
}
@@ -453,32 +485,15 @@ static void
on_item_deleted_cb (BijiNoteObj *item,
BijiManager *self)
{
- BijiNoteObj *to_delete;
- const gchar *path;
- GHashTable *store;
- BijiItemsGroup group;
-
-
- to_delete = NULL;
- path = biji_note_obj_get_uuid (item);
- store = NULL;
+ BijiItemsGroup group;
- if ((to_delete = g_hash_table_lookup (self->archives, path)))
- {
- store = self->archives;
- group = BIJI_ARCHIVED_ITEMS;
- }
- else if ((to_delete = g_hash_table_lookup (self->notes, path)))
- {
- store = self->notes;
+ if (manager_remove_list_item (self->notes, item))
group = BIJI_LIVING_ITEMS;
- }
-
- if (store == NULL)
+ else if (manager_remove_list_item (self->archives, item))
+ group = BIJI_ARCHIVED_ITEMS;
+ else
return;
-
- g_hash_table_remove (store, path);
biji_manager_notify_changed (self, group, BIJI_MANAGER_ITEM_DELETED, item);
}
@@ -488,17 +503,13 @@ static void
on_item_trashed_cb (BijiNoteObj *item,
BijiManager *self)
{
- const gchar *path;
+ g_autoptr(BijiNoteObj) to_delete = g_object_ref (item);
- path = biji_note_obj_get_uuid (item);
- item = g_hash_table_lookup (self->notes, path);
-
- if (item == NULL)
+ if (!manager_remove_list_item (self->notes, item))
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->notes, path);
+ g_list_store_insert_sorted (self->archives, item, compare_note, NULL);
}
@@ -558,12 +569,12 @@ biji_manager_add_item (BijiManager *manager,
if (uid != NULL)
{
if (group == BIJI_LIVING_ITEMS &&
- (g_hash_table_lookup (manager->notes, uid) ||
+ (biji_manager_find_note (manager, uid, group) ||
biji_manager_find_notebook (manager, uid)))
retval = FALSE;
if (group == BIJI_ARCHIVED_ITEMS &&
- g_hash_table_lookup (manager->archives, uid))
+ biji_manager_find_note (manager, uid, group))
retval = FALSE;
}
@@ -578,14 +589,14 @@ biji_manager_add_item (BijiManager *manager,
if (group == BIJI_LIVING_ITEMS)
{
if (BIJI_IS_NOTE_OBJ (item))
- g_hash_table_insert (manager->notes, (gpointer) uid, item);
+ g_list_store_insert_sorted (manager->notes, item, compare_note, NULL);
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);
+ g_list_store_insert_sorted (manager->archives, item, compare_note, NULL);
/* Connect */
if (BIJI_IS_NOTE_OBJ (item))
@@ -670,29 +681,22 @@ biji_manager_get_default_color (BijiManager *self, GdkRGBA *color)
-GList *
+GListModel *
biji_manager_get_notes (BijiManager *self,
BijiItemsGroup group)
{
- GList *list;
-
-
switch (group)
{
case BIJI_LIVING_ITEMS:
- list = g_hash_table_get_values (self->notes);
- break;
+ return G_LIST_MODEL (self->notes);
case BIJI_ARCHIVED_ITEMS:
- list = g_hash_table_get_values (self->archives);
- break;
+ return G_LIST_MODEL (self->archives);
default:
- list = NULL;
g_warning ("invalid BijiItemsGroup:%i", group);
+ return NULL;
}
-
- return list;
}
GListModel *
@@ -732,6 +736,46 @@ biji_manager_find_notebook (BijiManager *self,
return NULL;
}
+static BijiNoteObj *
+manager_find_note (GListModel *model,
+ const char *uuid)
+{
+ guint n_items;
+
+ g_assert (G_IS_LIST_MODEL (model));
+ g_assert (uuid && *uuid);
+
+ n_items = g_list_model_get_n_items (model);
+
+ for (guint i = 0; i < n_items; i++)
+ {
+ g_autoptr(BijiNoteObj) note = NULL;
+ const char *item_uuid;
+
+ note = g_list_model_get_item (model, i);
+ item_uuid = biji_note_obj_get_uuid (note);
+
+ if (g_strcmp0 (uuid, item_uuid) == 0)
+ return note;
+ }
+
+ return NULL;
+}
+
+BijiNoteObj *
+biji_manager_find_note (BijiManager *self,
+ const char *uuid,
+ BijiItemsGroup group)
+{
+ g_return_val_if_fail (BIJI_IS_MANAGER (self), NULL);
+ g_return_val_if_fail (uuid && *uuid, NULL);
+
+ if (group == BIJI_LIVING_ITEMS)
+ return manager_find_note (G_LIST_MODEL (self->notes), uuid);
+ else
+ return manager_find_note (G_LIST_MODEL (self->archives), uuid);
+}
+
gpointer
biji_manager_get_item_at_path (BijiManager *self, const gchar *path)
{
@@ -742,10 +786,10 @@ biji_manager_get_item_at_path (BijiManager *self, const gchar *path)
if (path == NULL)
return NULL;
- retval = g_hash_table_lookup (self->notes, (gconstpointer) path);
+ retval = biji_manager_find_note (self, path, BIJI_LIVING_ITEMS);
if (retval == NULL)
- retval = g_hash_table_lookup (self->archives, (gconstpointer) path);
+ retval = biji_manager_find_note (self, path, BIJI_ARCHIVED_ITEMS);
return retval;
}
diff --git a/src/libbiji/biji-manager.h b/src/libbiji/biji-manager.h
index a6cd53b7..cf2e6bc5 100644
--- a/src/libbiji/biji-manager.h
+++ b/src/libbiji/biji-manager.h
@@ -91,11 +91,14 @@ gpointer biji_manager_get_item_at_path (BijiManager *manager,
* Free the GList, not its content */
-GList *biji_manager_get_notes (BijiManager *manager,
+GListModel *biji_manager_get_notes (BijiManager *manager,
BijiItemsGroup group);
GListModel *biji_manager_get_notebooks (BijiManager *self);
BijiNotebook *biji_manager_find_notebook (BijiManager *self,
const char *uuid);
+BijiNoteObj *biji_manager_find_note (BijiManager *self,
+ const char *uuid,
+ BijiItemsGroup group);
BijiNoteObj *biji_manager_note_new (BijiManager *manager,
const gchar *str,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]