Move the placeholder list store into MilkListStore
authorTravis Reitter <treitter@torizo.(none)>
Wed, 30 Sep 2009 04:18:28 +0000 (21:18 -0700)
committerTravis Reitter <treitter@gmail.com>
Fri, 4 Dec 2009 06:01:12 +0000 (22:01 -0800)
src/milk-list-store.c
src/milk-list-store.h
src/milk-main-window.c

index 6badb83..f5dfefc 100644 (file)
@@ -36,15 +36,28 @@ G_DEFINE_TYPE_EXTENDED (MilkListStore,
                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
                                                milk_list_store_tree_model_init));
 
-#define MILK_LIST_STORE_PRIVATE(o) \
-                (G_TYPE_INSTANCE_GET_PRIVATE ((o), MILK_TYPE_LIST_STORE, MilkListStorePrivate))
-
-#define MILK_LIST_STORE_STAMP_INVALID 0
+/* less expensive than G_TYPE_INSTANCE_GET_PRIVATE */
+#define MILK_LIST_STORE_PRIVATE(o) ((MILK_LIST_STORE ((o)))->priv)
 
 struct _MilkListStorePrivate
 {
-        gint stamp;
-        gint node_count;
+        GtkListStore *store;
+};
+
+/* FIXME: relocate this to its own class */
+typedef struct {
+        gint id;
+        gint priority;
+        char *title;
+} MilkTask;
+
+/* FIXME: don't hard-code this */
+static MilkTask tasks[] = {
+        { 0, 1, "Remember the milk"},
+        { 2, 1, "Make a Maemo 5 RTM client"},
+        { 6, 3, "Get a haircut"},
+        { 9, 2, "Keep it real"},
+        { 5, 3, "Invent smellovision"},
 };
 
 static GtkTreeModelFlags
@@ -56,7 +69,7 @@ milk_list_store_get_flags (GtkTreeModel *model)
 static gint
 milk_list_store_get_n_columns (GtkTreeModel *model)
 {
-        return MILK_LIST_STORE_COLUMN_LAST;
+        return MILK_LIST_STORE_N_COLUMNS;
 }
 
 static GType
@@ -64,12 +77,13 @@ milk_list_store_get_column_type (GtkTreeModel *model,
                                  gint          column)
 {
         switch (column) {
+                case MILK_LIST_STORE_COLUMN_ID:
+                        return G_TYPE_INT;
+
                 case MILK_LIST_STORE_COLUMN_PRIORITY:
                         return G_TYPE_UINT;
 
-                case MILK_LIST_STORE_COLUMN_TASK:
-                        /* FIXME: define the MilkTask class and use
-                         * MILK_TYPE_TASK here */
+                case MILK_LIST_STORE_COLUMN_TITLE:
                         return G_TYPE_STRING;
 
                 default:
@@ -83,27 +97,30 @@ milk_list_store_get_iter (GtkTreeModel *model,
                           GtkTreeIter  *iter,
                           GtkTreePath  *path)
 {
+        MilkListStorePrivate *priv;
+
         g_return_val_if_fail (MILK_IS_LIST_STORE (model), FALSE);
         g_return_val_if_fail (iter, FALSE);
         g_return_val_if_fail (gtk_tree_path_get_depth (path) == 1, FALSE);
 
-        /* FIXME: implement this */
-        g_warning (G_STRLOC ": FIXME: not implemented");
+        priv = MILK_LIST_STORE_PRIVATE (model);
 
-        return TRUE;
+        return gtk_tree_model_get_iter (
+                        GTK_TREE_MODEL (priv->store), iter, path);
 }
 
 static GtkTreePath*
 milk_list_store_get_path (GtkTreeModel *model,
                           GtkTreeIter  *iter)
 {
+        MilkListStorePrivate *priv;
+
         g_return_val_if_fail (MILK_IS_LIST_STORE (model), NULL);
         g_return_val_if_fail (iter, NULL);
 
-        /* FIXME: implement this */
-        g_warning (G_STRLOC ": FIXME: not implemented");
+        priv = MILK_LIST_STORE_PRIVATE (model);
 
-        return NULL;
+        return gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), iter);
 }
 
 static void
@@ -112,26 +129,31 @@ milk_list_store_get_value (GtkTreeModel *model,
                            gint          column,
                            GValue       *value)
 {
+        MilkListStorePrivate *priv;
+
         g_return_if_fail (MILK_IS_LIST_STORE (model));
         g_return_if_fail (iter);
-        g_return_if_fail (column < 0);
+        g_return_if_fail (column >= 0);
         g_return_if_fail (value);
 
-        /* FIXME: implement this */
-        g_warning (G_STRLOC ": FIXME: not implemented");
+        priv = MILK_LIST_STORE_PRIVATE (model);
+
+        gtk_tree_model_get_value (
+                        GTK_TREE_MODEL (priv->store), iter, column, value);
 }
 
 static gboolean
 milk_list_store_iter_next (GtkTreeModel *model,
                            GtkTreeIter  *iter)
 {
+        MilkListStorePrivate *priv;
+
         g_return_val_if_fail (MILK_IS_LIST_STORE (model), FALSE);
         g_return_val_if_fail (iter, FALSE);
 
-        /* FIXME: implement this */
-        g_warning (G_STRLOC ": FIXME: not implemented");
+        priv = MILK_LIST_STORE_PRIVATE (model);
 
-        return TRUE;
+        return gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store), iter);
 }
 
 static gboolean
@@ -140,19 +162,18 @@ milk_list_store_iter_nth_child (GtkTreeModel *model,
                                 GtkTreeIter  *parent,
                                 gint          index)
 {
-        MilkListStorePrivate *priv = MILK_LIST_STORE_PRIVATE (model);
+        MilkListStorePrivate *priv;
 
         g_return_val_if_fail (MILK_IS_LIST_STORE (model), FALSE);
         g_return_val_if_fail (iter, FALSE);
         /* we're one-dimensional */
         g_return_val_if_fail (!parent, FALSE);
-        g_return_val_if_fail (index < 0, FALSE);
-        g_return_val_if_fail (index >= priv->node_count, FALSE);
+        g_return_val_if_fail (index >= 0, FALSE);
 
-        /* FIXME: implement this */
-        g_warning (G_STRLOC ": FIXME: not implemented");
+        priv = MILK_LIST_STORE_PRIVATE (model);
 
-        return TRUE;
+        return gtk_tree_model_iter_nth_child (
+                        GTK_TREE_MODEL (priv->store), iter, parent, index);
 }
 
 static gboolean
@@ -160,34 +181,51 @@ milk_list_store_iter_children (GtkTreeModel *model,
                                GtkTreeIter  *iter,
                                GtkTreeIter  *parent)
 {
-        /* we're one-dimensional, so this is a degenerate case */
-        return milk_list_store_iter_nth_child (model, iter, parent, 0);
+        MilkListStorePrivate *priv;
+
+        g_return_val_if_fail (MILK_IS_LIST_STORE (model), FALSE);
+        g_return_val_if_fail (iter, FALSE);
+        /* we're one-dimensional */
+        g_return_val_if_fail (!parent, FALSE);
+
+        priv = MILK_LIST_STORE_PRIVATE (model);
+
+        return gtk_tree_model_iter_children (
+                        GTK_TREE_MODEL (priv->store), iter, parent);
 }
 
 static gboolean
 milk_list_store_iter_has_child (GtkTreeModel *model,
                                 GtkTreeIter  *iter)
 {
+        MilkListStorePrivate *priv;
+
         g_return_val_if_fail (MILK_IS_LIST_STORE (model), FALSE);
         g_return_val_if_fail (iter, FALSE);
 
-        return FALSE;
+        priv = MILK_LIST_STORE_PRIVATE (model);
+
+        return gtk_tree_model_iter_has_child (
+                        GTK_TREE_MODEL (priv->store), iter);
 }
 
 static gint
 milk_list_store_iter_n_children (GtkTreeModel *model,
                                  GtkTreeIter  *iter)
 {
-        MilkListStorePrivate *priv = MILK_LIST_STORE_PRIVATE (model);
+        MilkListStorePrivate *priv;
 
         g_return_val_if_fail (MILK_IS_LIST_STORE (model), -1);
         g_return_val_if_fail (iter, -1);
 
+        priv = MILK_LIST_STORE_PRIVATE (model);
+
         /* we're one-dimensional */
         if (iter)
                 return 0;
 
-        return priv->node_count;
+        return gtk_tree_model_iter_n_children (
+                        GTK_TREE_MODEL (priv->store), iter);
 }
 
 static gboolean
@@ -195,11 +233,16 @@ milk_list_store_iter_parent (GtkTreeModel *model,
                              GtkTreeIter  *iter,
                              GtkTreeIter  *child)
 {
+        MilkListStorePrivate *priv;
+
         g_return_val_if_fail (MILK_IS_LIST_STORE (model), FALSE);
         g_return_val_if_fail (iter, FALSE);
         g_return_val_if_fail (child, FALSE);
 
-        return FALSE;
+        priv = MILK_LIST_STORE_PRIVATE (model);
+
+        return gtk_tree_model_iter_parent (
+                        GTK_TREE_MODEL (priv->store), iter, child);
 }
 
 static void
@@ -237,6 +280,11 @@ milk_list_store_dispose (GObject *object)
 {
         MilkListStorePrivate *priv = MILK_LIST_STORE_PRIVATE (object);
 
+        if (priv->store) {
+                g_object_unref (priv->store);
+                priv->store = NULL;
+        }
+
         G_OBJECT_CLASS (milk_list_store_parent_class)->dispose (object);
 }
 
@@ -245,8 +293,22 @@ milk_list_store_constructed (GObject* object)
 {
         MilkListStore *self = MILK_LIST_STORE (object);
         MilkListStorePrivate *priv = MILK_LIST_STORE_PRIVATE (object);
-
-        priv->stamp = MILK_LIST_STORE_STAMP_INVALID + 1;
+        GtkTreeIter iter;
+        gint i;
+
+        /* Populate model */
+        for (i = 0; i < G_N_ELEMENTS (tasks); i++) {
+                gtk_list_store_append (priv->store, &iter);
+                gtk_list_store_set (
+                                priv->store, &iter,
+                                MILK_LIST_STORE_COLUMN_ID,
+                                tasks[i].id,
+                                MILK_LIST_STORE_COLUMN_PRIORITY,
+                                tasks[i].priority,
+                                MILK_LIST_STORE_COLUMN_TITLE,
+                                tasks[i].title,
+                                -1);
+        }
 }
 
 static void
@@ -260,15 +322,19 @@ milk_list_store_class_init (MilkListStoreClass *klass)
         object_class->set_property = milk_list_store_set_property;
         object_class->constructed = milk_list_store_constructed;
         object_class->dispose = milk_list_store_dispose;
-
-        /* FIXME: trigger the signals with gtk_tree_model_row_inserted(), etc.
-         */
 }
 
 static void
 milk_list_store_init (MilkListStore *self)
 {
-        self->priv = MILK_LIST_STORE_PRIVATE (self);
+        MilkListStorePrivate *priv;
+
+        self->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (
+                        self, MILK_TYPE_LIST_STORE, MilkListStorePrivate);
+
+        priv->store = gtk_list_store_new (
+                        MILK_LIST_STORE_N_COLUMNS, G_TYPE_INT, G_TYPE_UINT,
+                        G_TYPE_STRING);
 }
 
 static void
index 9dd0ca4..7155eda 100644 (file)
@@ -49,9 +49,10 @@ typedef struct _MilkListStoreClass MilkListStoreClass;
 typedef struct _MilkListStorePrivate MilkListStorePrivate;
 
 typedef enum {
+        MILK_LIST_STORE_COLUMN_ID,
         MILK_LIST_STORE_COLUMN_PRIORITY,
-        MILK_LIST_STORE_COLUMN_TASK,
-        MILK_LIST_STORE_COLUMN_LAST,
+        MILK_LIST_STORE_COLUMN_TITLE,
+        MILK_LIST_STORE_N_COLUMNS
 } OssoABookListStoreColumn;
 
 struct _MilkListStore
index 8e4d593..809c106 100644 (file)
@@ -25,6 +25,7 @@
 #include <hildon/hildon.h>
 
 #include "milk-main-window.h"
+#include "milk-list-store.h"
 
 G_DEFINE_TYPE (MilkMainWindow, milk_main_window, HILDON_TYPE_WINDOW)
 
@@ -39,36 +40,11 @@ struct _MilkMainWindowPrivate
         GtkWidget *task_view;
 };
 
-/* FIXME: cut this */
-enum {
-        TASK_MODEL_COLUMN_ID,
-        TASK_MODEL_COLUMN_PRIORITY,
-        TASK_MODEL_COLUMN_TITLE,
-        N_MODEL_COLUMNS
-};
-
-/* FIXME: cut this */
 enum {
         TASK_VIEW_COLUMN_TITLE,
         N_VIEW_COLUMNS
 };
 
-/* FIXME: relocate this */
-typedef struct {
-        gint id;
-        gint priority;
-        char *title;
-} MilkTask;
-
-/* FIXME: don't hard-code this */
-static MilkTask tasks[] = {
-        { 0, 1, "Remember the milk"},
-        { 2, 1, "File taxes"},
-        { 6, 3, "Get a haircut"},
-        { 9, 2, "Keep it real"},
-        { 5, 3, "Invent smellovision"},
-};
-
 static void
 milk_main_window_get_property (GObject    *object,
                                guint       property_id,
@@ -326,32 +302,6 @@ contact_column_render_func (GtkCellLayout   *cell_layout,
         g_object_unref (task);
 }
 
-/* FIXME: set up a MilkListStore instead */
-static GtkTreeModel*
-create_task_model ()
-{
-        GtkListStore *list_store;
-        GtkTreeIter iter;
-        gint i;
-
-        list_store = gtk_list_store_new (N_MODEL_COLUMNS,
-                                         G_TYPE_INT,
-                                         G_TYPE_INT,
-                                         G_TYPE_STRING);
-
-        /* Populate model */
-        for (i = 0; i < G_N_ELEMENTS (tasks); i++) {
-                gtk_list_store_append (list_store, &iter);
-                gtk_list_store_set (list_store, &iter,
-                                    TASK_MODEL_COLUMN_ID, tasks[i].id,
-                                    TASK_MODEL_COLUMN_PRIORITY, tasks[i].priority,
-                                    TASK_MODEL_COLUMN_TITLE, tasks[i].title,
-                                   -1);
-        }
-
-        return GTK_TREE_MODEL (list_store);
-}
-
 static HildonAppMenu*
 create_menu (gpointer user_data)
 {
@@ -400,7 +350,7 @@ create_menu (gpointer user_data)
                         user_data);
         hildon_app_menu_append (menu, GTK_BUTTON (w));
 
-        gtk_widget_show_all (menu);
+        gtk_widget_show_all (GTK_WIDGET (menu));
 
         return menu;
 }
@@ -434,9 +384,7 @@ milk_main_window_constructed (GObject* object)
         /*
          * Task List
          */
-        /* FIXME: create a new MilkTaskModel class that syncs with the cached
-         * tasks */
-        model = create_task_model ();
+        model = GTK_TREE_MODEL (milk_list_store_new ());
         w = hildon_touch_selector_new ();
 
         renderer = gtk_cell_renderer_text_new ();
@@ -445,19 +393,19 @@ milk_main_window_constructed (GObject* object)
                         NULL);
         col = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (w),
                         model, renderer,
-                        "text", TASK_MODEL_COLUMN_TITLE,
+                        "text", MILK_LIST_STORE_COLUMN_TITLE,
                         NULL);
         g_object_unref (model);
 
-        hildon_touch_selector_column_set_text_column (col,
-                        TASK_MODEL_COLUMN_TITLE);
+        hildon_touch_selector_column_set_text_column (
+                        col, MILK_LIST_STORE_COLUMN_TITLE);
         hildon_touch_selector_set_column_selection_mode (
                         HILDON_TOUCH_SELECTOR (w),
                         HILDON_TOUCH_SELECTOR_SELECTION_MODE_MULTIPLE);
-        hildon_touch_selector_set_hildon_ui_mode (HILDON_TOUCH_SELECTOR (w),
-                        HILDON_UI_MODE_EDIT);
-        hildon_touch_selector_unselect_all (HILDON_TOUCH_SELECTOR (w),
-                        TASK_VIEW_COLUMN_TITLE);
+        hildon_touch_selector_set_hildon_ui_mode (
+                        HILDON_TOUCH_SELECTOR (w), HILDON_UI_MODE_EDIT);
+        hildon_touch_selector_unselect_all (
+                        HILDON_TOUCH_SELECTOR (w), TASK_VIEW_COLUMN_TITLE);
 
         gtk_box_pack_start (GTK_BOX (priv->main_vbox), w, TRUE, TRUE, 0);
         g_object_set (w, "can-focus", TRUE, NULL);