rename MilkListStore to MilkTaskModel, since it's more descriptive
authorTravis Reitter <treitter@torizo.(none)>
Wed, 30 Sep 2009 04:24:24 +0000 (21:24 -0700)
committerTravis Reitter <treitter@gmail.com>
Fri, 4 Dec 2009 06:01:13 +0000 (22:01 -0800)
src/Makefile.am
src/milk-list-store.c [deleted file]
src/milk-list-store.h [deleted file]
src/milk-main-window.c
src/milk-task-model.c [new file with mode: 0644]

index 2f577bc..ee21ad6 100644 (file)
@@ -8,12 +8,12 @@ AM_CFLAGS = \
 bin_PROGRAMS = milk
 
 milk_SOURCES = \
-       milk-list-store.c \
-       milk-list-store.h \
        milk-main.c \
        milk-main.h \
        milk-main-window.c \
-       milk-main-window.h
+       milk-main-window.h \
+       milk-task-model.c \
+       milk-task-model.h
 
 milk_LDADD = $(MILK_LIBS)
 
diff --git a/src/milk-list-store.c b/src/milk-list-store.c
deleted file mode 100644 (file)
index f5dfefc..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA  02110-1301  USA
- *
- * Authors: Travis Reitter <treitter@gmail.com>
- */
-
-#include <config.h>
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <hildon/hildon.h>
-
-#include "milk-list-store.h"
-
-static void
-milk_list_store_tree_model_init (GtkTreeModelIface *iface);
-
-G_DEFINE_TYPE_EXTENDED (MilkListStore,
-                        milk_list_store,
-                        G_TYPE_OBJECT,
-                        0,
-                        G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
-                                               milk_list_store_tree_model_init));
-
-/* less expensive than G_TYPE_INSTANCE_GET_PRIVATE */
-#define MILK_LIST_STORE_PRIVATE(o) ((MILK_LIST_STORE ((o)))->priv)
-
-struct _MilkListStorePrivate
-{
-        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
-milk_list_store_get_flags (GtkTreeModel *model)
-{
-        return GTK_TREE_MODEL_LIST_ONLY;
-}
-
-static gint
-milk_list_store_get_n_columns (GtkTreeModel *model)
-{
-        return MILK_LIST_STORE_N_COLUMNS;
-}
-
-static GType
-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_TITLE:
-                        return G_TYPE_STRING;
-
-                default:
-                        g_warning (G_STRLOC ": invalid column: %d", column);
-                        return G_TYPE_INVALID;
-        }
-}
-
-static gboolean
-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);
-
-        priv = MILK_LIST_STORE_PRIVATE (model);
-
-        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);
-
-        priv = MILK_LIST_STORE_PRIVATE (model);
-
-        return gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), iter);
-}
-
-static void
-milk_list_store_get_value (GtkTreeModel *model,
-                           GtkTreeIter  *iter,
-                           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 (value);
-
-        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);
-
-        priv = MILK_LIST_STORE_PRIVATE (model);
-
-        return gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store), iter);
-}
-
-static gboolean
-milk_list_store_iter_nth_child (GtkTreeModel *model,
-                                GtkTreeIter  *iter,
-                                GtkTreeIter  *parent,
-                                gint          index)
-{
-        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);
-
-        priv = MILK_LIST_STORE_PRIVATE (model);
-
-        return gtk_tree_model_iter_nth_child (
-                        GTK_TREE_MODEL (priv->store), iter, parent, index);
-}
-
-static gboolean
-milk_list_store_iter_children (GtkTreeModel *model,
-                               GtkTreeIter  *iter,
-                               GtkTreeIter  *parent)
-{
-        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);
-
-        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;
-
-        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 gtk_tree_model_iter_n_children (
-                        GTK_TREE_MODEL (priv->store), iter);
-}
-
-static gboolean
-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);
-
-        priv = MILK_LIST_STORE_PRIVATE (model);
-
-        return gtk_tree_model_iter_parent (
-                        GTK_TREE_MODEL (priv->store), iter, child);
-}
-
-static void
-milk_list_store_get_property (GObject    *object,
-                               guint       property_id,
-                               GValue     *value,
-                               GParamSpec *pspec)
-{
-        MilkListStorePrivate *priv = MILK_LIST_STORE_PRIVATE (object);
-        switch (property_id)
-        {
-                default:
-                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id,
-                                        pspec);
-        }
-}
-
-static void
-milk_list_store_set_property (GObject      *object,
-                               guint         property_id,
-                               const GValue *value,
-                               GParamSpec   *pspec)
-{
-        MilkListStorePrivate *priv = MILK_LIST_STORE_PRIVATE (object);
-        switch (property_id)
-        {
-                default:
-                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id,
-                                        pspec);
-        }
-}
-
-static void
-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);
-}
-
-static void
-milk_list_store_constructed (GObject* object)
-{
-        MilkListStore *self = MILK_LIST_STORE (object);
-        MilkListStorePrivate *priv = MILK_LIST_STORE_PRIVATE (object);
-        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
-milk_list_store_class_init (MilkListStoreClass *klass)
-{
-        GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-        g_type_class_add_private (klass, sizeof (MilkListStorePrivate));
-
-        object_class->get_property = milk_list_store_get_property;
-        object_class->set_property = milk_list_store_set_property;
-        object_class->constructed = milk_list_store_constructed;
-        object_class->dispose = milk_list_store_dispose;
-}
-
-static void
-milk_list_store_init (MilkListStore *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
-milk_list_store_tree_model_init (GtkTreeModelIface *iface)
-{
-        iface->get_flags       = milk_list_store_get_flags;
-        iface->get_n_columns   = milk_list_store_get_n_columns;
-        iface->get_column_type = milk_list_store_get_column_type;
-        iface->get_iter        = milk_list_store_get_iter;
-        iface->get_path        = milk_list_store_get_path;
-        iface->get_value       = milk_list_store_get_value;
-        iface->iter_next       = milk_list_store_iter_next;
-        iface->iter_children   = milk_list_store_iter_children;
-        iface->iter_has_child  = milk_list_store_iter_has_child;
-        iface->iter_n_children = milk_list_store_iter_n_children;
-        iface->iter_nth_child  = milk_list_store_iter_nth_child;
-        iface->iter_parent     = milk_list_store_iter_parent;
-}
-
-MilkListStore*
-milk_list_store_new ()
-{
-        return g_object_new (MILK_TYPE_LIST_STORE,
-                             NULL);
-}
diff --git a/src/milk-list-store.h b/src/milk-list-store.h
deleted file mode 100644 (file)
index 7155eda..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA  02110-1301  USA
- *
- * Authors: Travis Reitter <treitter@gmail.com>
- */
-
-#ifndef _MILK_LIST_STORE_H
-#define _MILK_LIST_STORE_H
-
-G_BEGIN_DECLS
-
-#define MILK_TYPE_LIST_STORE milk_list_store_get_type()
-
-#define MILK_LIST_STORE(obj) \
-    (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
-                                 MILK_TYPE_LIST_STORE, MilkListStore))
-
-#define MILK_LIST_STORE_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_CAST ((klass), \
-                              MILK_TYPE_LIST_STORE, MilkListStoreClass))
-
-#define MILK_IS_LIST_STORE(obj) \
-    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
-                                 MILK_TYPE_LIST_STORE))
-
-#define MILK_IS_LIST_STORE_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_TYPE ((klass), \
-                              MILK_TYPE_LIST_STORE))
-
-#define MILK_LIST_STORE_GET_CLASS(obj) \
-    (G_TYPE_INSTANCE_GET_CLASS ((obj), \
-                                MILK_TYPE_LIST_STORE, MilkListStoreClass))
-
-typedef struct _MilkListStore MilkListStore;
-typedef struct _MilkListStoreClass MilkListStoreClass;
-typedef struct _MilkListStorePrivate MilkListStorePrivate;
-
-typedef enum {
-        MILK_LIST_STORE_COLUMN_ID,
-        MILK_LIST_STORE_COLUMN_PRIORITY,
-        MILK_LIST_STORE_COLUMN_TITLE,
-        MILK_LIST_STORE_N_COLUMNS
-} OssoABookListStoreColumn;
-
-struct _MilkListStore
-{
-    GObject parent;
-    MilkListStorePrivate *priv;
-};
-
-struct _MilkListStoreClass
-{
-    GObjectClass parent_class;
-};
-
-GType milk_list_store_get_type (void);
-
-
-MilkListStore* milk_list_store_new ();
-
-#endif /* _MILK_LIST_STORE_H */
index 809c106..89401be 100644 (file)
@@ -25,7 +25,7 @@
 #include <hildon/hildon.h>
 
 #include "milk-main-window.h"
-#include "milk-list-store.h"
+#include "milk-task-model.h"
 
 G_DEFINE_TYPE (MilkMainWindow, milk_main_window, HILDON_TYPE_WINDOW)
 
@@ -384,7 +384,7 @@ milk_main_window_constructed (GObject* object)
         /*
          * Task List
          */
-        model = GTK_TREE_MODEL (milk_list_store_new ());
+        model = GTK_TREE_MODEL (milk_task_model_new ());
         w = hildon_touch_selector_new ();
 
         renderer = gtk_cell_renderer_text_new ();
@@ -393,12 +393,12 @@ milk_main_window_constructed (GObject* object)
                         NULL);
         col = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (w),
                         model, renderer,
-                        "text", MILK_LIST_STORE_COLUMN_TITLE,
+                        "text", MILK_TASK_MODEL_COLUMN_TITLE,
                         NULL);
         g_object_unref (model);
 
         hildon_touch_selector_column_set_text_column (
-                        col, MILK_LIST_STORE_COLUMN_TITLE);
+                        col, MILK_TASK_MODEL_COLUMN_TITLE);
         hildon_touch_selector_set_column_selection_mode (
                         HILDON_TOUCH_SELECTOR (w),
                         HILDON_TOUCH_SELECTOR_SELECTION_MODE_MULTIPLE);
diff --git a/src/milk-task-model.c b/src/milk-task-model.c
new file mode 100644 (file)
index 0000000..8e6a13d
--- /dev/null
@@ -0,0 +1,374 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA  02110-1301  USA
+ *
+ * Authors: Travis Reitter <treitter@gmail.com>
+ */
+
+#include <config.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <hildon/hildon.h>
+
+#include "milk-task-model.h"
+
+static void
+milk_task_model_tree_model_init (GtkTreeModelIface *iface);
+
+G_DEFINE_TYPE_EXTENDED (MilkTaskModel,
+                        milk_task_model,
+                        G_TYPE_OBJECT,
+                        0,
+                        G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
+                                               milk_task_model_tree_model_init));
+
+/* less expensive than G_TYPE_INSTANCE_GET_PRIVATE */
+#define MILK_TASK_MODEL_PRIVATE(o) ((MILK_TASK_MODEL ((o)))->priv)
+
+struct _MilkTaskModelPrivate
+{
+        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
+milk_task_model_get_flags (GtkTreeModel *model)
+{
+        return GTK_TREE_MODEL_LIST_ONLY;
+}
+
+static gint
+milk_task_model_get_n_columns (GtkTreeModel *model)
+{
+        return MILK_TASK_MODEL_N_COLUMNS;
+}
+
+static GType
+milk_task_model_get_column_type (GtkTreeModel *model,
+                                 gint          column)
+{
+        switch (column) {
+                case MILK_TASK_MODEL_COLUMN_ID:
+                        return G_TYPE_INT;
+
+                case MILK_TASK_MODEL_COLUMN_PRIORITY:
+                        return G_TYPE_UINT;
+
+                case MILK_TASK_MODEL_COLUMN_TITLE:
+                        return G_TYPE_STRING;
+
+                default:
+                        g_warning (G_STRLOC ": invalid column: %d", column);
+                        return G_TYPE_INVALID;
+        }
+}
+
+static gboolean
+milk_task_model_get_iter (GtkTreeModel *model,
+                          GtkTreeIter  *iter,
+                          GtkTreePath  *path)
+{
+        MilkTaskModelPrivate *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);
+
+        priv = MILK_TASK_MODEL_PRIVATE (model);
+
+        return gtk_tree_model_get_iter (
+                        GTK_TREE_MODEL (priv->store), iter, path);
+}
+
+static GtkTreePath*
+milk_task_model_get_path (GtkTreeModel *model,
+                          GtkTreeIter  *iter)
+{
+        MilkTaskModelPrivate *priv;
+
+        g_return_val_if_fail (MILK_IS_LIST_STORE (model), NULL);
+        g_return_val_if_fail (iter, NULL);
+
+        priv = MILK_TASK_MODEL_PRIVATE (model);
+
+        return gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), iter);
+}
+
+static void
+milk_task_model_get_value (GtkTreeModel *model,
+                           GtkTreeIter  *iter,
+                           gint          column,
+                           GValue       *value)
+{
+        MilkTaskModelPrivate *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 (value);
+
+        priv = MILK_TASK_MODEL_PRIVATE (model);
+
+        gtk_tree_model_get_value (
+                        GTK_TREE_MODEL (priv->store), iter, column, value);
+}
+
+static gboolean
+milk_task_model_iter_next (GtkTreeModel *model,
+                           GtkTreeIter  *iter)
+{
+        MilkTaskModelPrivate *priv;
+
+        g_return_val_if_fail (MILK_IS_LIST_STORE (model), FALSE);
+        g_return_val_if_fail (iter, FALSE);
+
+        priv = MILK_TASK_MODEL_PRIVATE (model);
+
+        return gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store), iter);
+}
+
+static gboolean
+milk_task_model_iter_nth_child (GtkTreeModel *model,
+                                GtkTreeIter  *iter,
+                                GtkTreeIter  *parent,
+                                gint          index)
+{
+        MilkTaskModelPrivate *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);
+
+        priv = MILK_TASK_MODEL_PRIVATE (model);
+
+        return gtk_tree_model_iter_nth_child (
+                        GTK_TREE_MODEL (priv->store), iter, parent, index);
+}
+
+static gboolean
+milk_task_model_iter_children (GtkTreeModel *model,
+                               GtkTreeIter  *iter,
+                               GtkTreeIter  *parent)
+{
+        MilkTaskModelPrivate *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_TASK_MODEL_PRIVATE (model);
+
+        return gtk_tree_model_iter_children (
+                        GTK_TREE_MODEL (priv->store), iter, parent);
+}
+
+static gboolean
+milk_task_model_iter_has_child (GtkTreeModel *model,
+                                GtkTreeIter  *iter)
+{
+        MilkTaskModelPrivate *priv;
+
+        g_return_val_if_fail (MILK_IS_LIST_STORE (model), FALSE);
+        g_return_val_if_fail (iter, FALSE);
+
+        priv = MILK_TASK_MODEL_PRIVATE (model);
+
+        return gtk_tree_model_iter_has_child (
+                        GTK_TREE_MODEL (priv->store), iter);
+}
+
+static gint
+milk_task_model_iter_n_children (GtkTreeModel *model,
+                                 GtkTreeIter  *iter)
+{
+        MilkTaskModelPrivate *priv;
+
+        g_return_val_if_fail (MILK_IS_LIST_STORE (model), -1);
+        g_return_val_if_fail (iter, -1);
+
+        priv = MILK_TASK_MODEL_PRIVATE (model);
+
+        /* we're one-dimensional */
+        if (iter)
+                return 0;
+
+        return gtk_tree_model_iter_n_children (
+                        GTK_TREE_MODEL (priv->store), iter);
+}
+
+static gboolean
+milk_task_model_iter_parent (GtkTreeModel *model,
+                             GtkTreeIter  *iter,
+                             GtkTreeIter  *child)
+{
+        MilkTaskModelPrivate *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);
+
+        priv = MILK_TASK_MODEL_PRIVATE (model);
+
+        return gtk_tree_model_iter_parent (
+                        GTK_TREE_MODEL (priv->store), iter, child);
+}
+
+static void
+milk_task_model_get_property (GObject    *object,
+                               guint       property_id,
+                               GValue     *value,
+                               GParamSpec *pspec)
+{
+        switch (property_id)
+        {
+                default:
+                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id,
+                                        pspec);
+        }
+}
+
+static void
+milk_task_model_set_property (GObject      *object,
+                               guint         property_id,
+                               const GValue *value,
+                               GParamSpec   *pspec)
+{
+        switch (property_id)
+        {
+                default:
+                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id,
+                                        pspec);
+        }
+}
+
+static void
+milk_task_model_dispose (GObject *object)
+{
+        MilkTaskModelPrivate *priv = MILK_TASK_MODEL_PRIVATE (object);
+
+        if (priv->store) {
+                g_object_unref (priv->store);
+                priv->store = NULL;
+        }
+
+        G_OBJECT_CLASS (milk_task_model_parent_class)->dispose (object);
+}
+
+static void
+milk_task_model_constructed (GObject* object)
+{
+        typedef struct {
+                const char *id;
+                const char *title;
+                gint priority;
+        } MilkTask_args;
+
+        /* FIXME: don't hard-code this */
+        static MilkTask_args tasks[] = {
+                { "0", "Walk the dog", 1},
+                { "2", "Make a Maemo 5 RTM client", 1},
+                { "6", "Stand on one foot", 3},
+                { "9", "Pick up some DVX ('cause it's so crisp)", 2},
+                { "5", "Finalize Halloween costume", 3},
+        };
+
+        MilkTaskModelPrivate *priv = MILK_TASK_MODEL_PRIVATE (object);
+        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_TASK_MODEL_COLUMN_ID,
+                                tasks[i].id,
+                                MILK_TASK_MODEL_COLUMN_PRIORITY,
+                                tasks[i].priority,
+                                MILK_TASK_MODEL_COLUMN_TITLE,
+                                tasks[i].title,
+                                -1);
+        }
+}
+
+static void
+milk_task_model_class_init (MilkTaskModelClass *klass)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+        g_type_class_add_private (klass, sizeof (MilkTaskModelPrivate));
+
+        object_class->get_property = milk_task_model_get_property;
+        object_class->set_property = milk_task_model_set_property;
+        object_class->constructed = milk_task_model_constructed;
+        object_class->dispose = milk_task_model_dispose;
+}
+
+static void
+milk_task_model_init (MilkTaskModel *self)
+{
+        MilkTaskModelPrivate *priv;
+
+        self->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (
+                        self, MILK_TYPE_LIST_STORE, MilkTaskModelPrivate);
+
+        priv->store = gtk_list_store_new (
+                        MILK_TASK_MODEL_N_COLUMNS, G_TYPE_INT, G_TYPE_UINT,
+                        G_TYPE_STRING);
+}
+
+static void
+milk_task_model_tree_model_init (GtkTreeModelIface *iface)
+{
+        iface->get_flags       = milk_task_model_get_flags;
+        iface->get_n_columns   = milk_task_model_get_n_columns;
+        iface->get_column_type = milk_task_model_get_column_type;
+        iface->get_iter        = milk_task_model_get_iter;
+        iface->get_path        = milk_task_model_get_path;
+        iface->get_value       = milk_task_model_get_value;
+        iface->iter_next       = milk_task_model_iter_next;
+        iface->iter_children   = milk_task_model_iter_children;
+        iface->iter_has_child  = milk_task_model_iter_has_child;
+        iface->iter_n_children = milk_task_model_iter_n_children;
+        iface->iter_nth_child  = milk_task_model_iter_nth_child;
+        iface->iter_parent     = milk_task_model_iter_parent;
+}
+
+MilkTaskModel*
+milk_task_model_new ()
+{
+        return g_object_new (MILK_TYPE_LIST_STORE,
+                             NULL);
+}