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
static gint
milk_list_store_get_n_columns (GtkTreeModel *model)
{
- return MILK_LIST_STORE_COLUMN_LAST;
+ return MILK_LIST_STORE_N_COLUMNS;
}
static GType
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:
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
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
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
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
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
{
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);
}
{
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
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
#include <hildon/hildon.h>
#include "milk-main-window.h"
+#include "milk-list-store.h"
G_DEFINE_TYPE (MilkMainWindow, milk_main_window, HILDON_TYPE_WINDOW)
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,
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)
{
user_data);
hildon_app_menu_append (menu, GTK_BUTTON (w));
- gtk_widget_show_all (menu);
+ gtk_widget_show_all (GTK_WIDGET (menu));
return menu;
}
/*
* 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 ();
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);