[gnome-todo] task-model: Use GtkFlattenListModel internally
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-todo] task-model: Use GtkFlattenListModel internally
- Date: Thu, 4 Jul 2019 15:00:16 +0000 (UTC)
commit 234d51293eda5a957fdab1a7bbe44db9c6408743
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Thu Jul 4 11:42:05 2019 -0300
task-model: Use GtkFlattenListModel internally
We still need GtdTaskModel to return GTD_TYPE_TASK as the
list model type, but GtkFlattenListModel helps reducing a
lot of the code there.
src/models/gtd-task-model.c | 181 ++++----------------------------------------
1 file changed, 14 insertions(+), 167 deletions(-)
---
diff --git a/src/models/gtd-task-model.c b/src/models/gtd-task-model.c
index 9943b7d..e9c331b 100644
--- a/src/models/gtd-task-model.c
+++ b/src/models/gtd-task-model.c
@@ -32,7 +32,7 @@ struct _GtdTaskModel
{
GObject parent;
- GtdListStore *lists;
+ GtkFlattenListModel *model;
guint number_of_tasks;
@@ -54,136 +54,21 @@ enum
static GParamSpec *properties [N_PROPS];
-/*
- * Auxiliary methods
- */
-
-static guint
-find_task_position_at_list_position (GtdTaskModel *self,
- guint position)
-{
- GListModel *tasklists;
- guint offset = 0;
- guint i;
-
- tasklists = gtd_manager_get_task_lists_model (self->manager);
-
- g_assert (g_list_model_get_n_items (tasklists) > position);
-
- for (i = 0; i < position; i++)
- {
- g_autoptr (GListModel) tasklist = g_list_model_get_item (tasklists, i);
- offset += g_list_model_get_n_items (tasklist);
- }
-
- return offset;
-}
-
-
/*
* Callbacks
*/
static void
-on_task_list_items_changed_cb (GtdTaskList *tasklist,
- guint position,
- guint n_removed,
- guint n_added,
- GtdTaskModel *self)
+on_model_items_changed_cb (GListModel *model,
+ guint position,
+ guint n_removed,
+ guint n_added,
+ GtdTaskModel *self)
{
- guint task_position;
- guint list_position;
- gint diff;
-
- list_position = gtd_list_store_get_item_position (self->lists, tasklist);
- task_position = find_task_position_at_list_position (self, list_position) + position;
-
- diff = (gint) n_added - (gint) n_removed;
-
- self->number_of_tasks += diff;
-
- g_list_model_items_changed (G_LIST_MODEL (self), task_position, n_removed, n_added);
-
- GTD_TRACE_MSG ("Task list changed with position=%u, n_removed=%u, n_added=%u",
- task_position,
- n_removed,
- n_added);
-}
-
-static void
-on_manager_items_changed_cb (GListModel *model,
- guint position,
- guint n_removed,
- guint n_added,
- GtdTaskModel *self)
-{
- guint offset;
-
GTD_TRACE_MSG ("Child model changed with position=%u, n_removed=%u, n_added=%u", position, n_removed,
n_added);
- offset = find_task_position_at_list_position (self, position);
-
- if (n_removed > 0)
- {
- guint n_removed_tasks = 0;
- guint i;
-
- for (i = 0; i < n_removed; i++)
- {
- g_autoptr (GtdTaskList) list = NULL;
-
- list = g_list_model_get_item (G_LIST_MODEL (self->lists), position + i);
- g_signal_handlers_disconnect_by_func (list, on_task_list_items_changed_cb, self);
-
- n_removed_tasks += g_list_model_get_n_items (G_LIST_MODEL (list));
- }
+ g_list_model_items_changed (G_LIST_MODEL (self), position, n_removed, n_added);
- self->number_of_tasks -= n_removed_tasks;
-
- g_list_model_items_changed (G_LIST_MODEL (self),
- offset,
- n_removed_tasks,
- 0);
-
- GTD_TRACE_MSG ("Removed %u items at %u", n_removed_tasks, offset);
- }
-
- if (n_added > 0)
- {
- GListModel *tasklists;
- guint n_added_tasks = 0;
- guint i;
-
- tasklists = gtd_manager_get_task_lists_model (self->manager);
-
- for (i = 0; i < n_added; i++)
- {
- g_autoptr (GtdTaskList) list = NULL;
- guint n_tasks;
-
- list = g_list_model_get_item (tasklists, position + i);
- n_tasks = g_list_model_get_n_items (G_LIST_MODEL (list));
-
- g_signal_connect_object (list,
- "items-changed",
- G_CALLBACK (on_task_list_items_changed_cb),
- self,
- 0);
-
- n_added_tasks += n_tasks;
-
- gtd_list_store_insert (self->lists, position + i, list);
- }
-
- self->number_of_tasks += n_added_tasks;
-
- g_list_model_items_changed (G_LIST_MODEL (self),
- offset,
- 0,
- n_added_tasks);
-
- GTD_TRACE_MSG ("Added %u tasks at %u", n_added_tasks, offset);
- }
}
@@ -196,31 +81,8 @@ gtd_task_model_get_item (GListModel *model,
guint position)
{
GtdTaskModel *self = (GtdTaskModel*) model;
- GListModel *tasklists;
- guint current_item = 0;
- guint i;
- tasklists = gtd_manager_get_task_lists_model (self->manager);
-
- for (i = 0; i < g_list_model_get_n_items (tasklists); i++)
- {
- g_autoptr (GtdTaskList) tasklist = NULL;
- guint n_items;
-
- tasklist = g_list_model_get_item (tasklists, i);
- n_items = g_list_model_get_n_items (G_LIST_MODEL (tasklist));
-
- if (current_item + n_items > position)
- {
- guint list_position = position - current_item;
-
- return g_list_model_get_item (G_LIST_MODEL (tasklist), list_position);
- }
-
- current_item += n_items;
- }
-
- return NULL;
+ return g_list_model_get_item (G_LIST_MODEL (self->model), position);
}
static guint
@@ -228,7 +90,7 @@ gtd_task_model_get_n_items (GListModel *model)
{
GtdTaskModel *self = (GtdTaskModel*) model;
- return self->number_of_tasks;
+ return g_list_model_get_n_items (G_LIST_MODEL (self->model));
}
static GType
@@ -256,7 +118,7 @@ gtd_task_model_finalize (GObject *object)
GtdTaskModel *self = (GtdTaskModel *)object;
g_clear_object (&self->manager);
- g_clear_object (&self->lists);
+ g_clear_object (&self->model);
G_OBJECT_CLASS (gtd_task_model_parent_class)->finalize (object);
}
@@ -267,32 +129,17 @@ gtd_task_model_constructed (GObject *object)
{
GtdTaskModel *self = (GtdTaskModel *)object;
GListModel *model;
- guint i;
g_assert (self->manager != NULL);
model = gtd_manager_get_task_lists_model (self->manager);
- g_signal_connect_object (model,
+ g_signal_connect_object (self->model,
"items-changed",
- G_CALLBACK (on_manager_items_changed_cb),
+ G_CALLBACK (on_model_items_changed_cb),
self,
0);
-
-
- for (i = 0; i < g_list_model_get_n_items (model); i++)
- {
- g_autoptr (GListModel) list = g_list_model_get_item (model, i);
-
- gtd_list_store_insert (self->lists, i, list);
- g_signal_connect_object (list,
- "items-changed",
- G_CALLBACK (on_task_list_items_changed_cb),
- self,
- 0);
-
- self->number_of_tasks += g_list_model_get_n_items (list);
- }
+ gtk_flatten_list_model_set_model (self->model, model);
G_OBJECT_CLASS (gtd_task_model_parent_class)->constructed (object);
}
@@ -358,7 +205,7 @@ gtd_task_model_class_init (GtdTaskModelClass *klass)
static void
gtd_task_model_init (GtdTaskModel *self)
{
- self->lists = gtd_list_store_new (GTD_TYPE_TASK_LIST);
+ self->model = gtk_flatten_list_model_new (GTD_TYPE_OBJECT, NULL);
}
GtdTaskModel*
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]