From 9e4b9cbac470b5529cc75e05f3a53d69462660b6 Mon Sep 17 00:00:00 2001 From: Travis Reitter Date: Sun, 13 Sep 2009 21:14:41 -0700 Subject: [PATCH] add widgets to the main window --- src/milk-main-window.c | 324 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 322 insertions(+), 2 deletions(-) diff --git a/src/milk-main-window.c b/src/milk-main-window.c index 03d54a7..e9bb64e 100644 --- a/src/milk-main-window.c +++ b/src/milk-main-window.c @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -32,6 +33,11 @@ G_DEFINE_TYPE (MilkMainWindow, milk_main_window, HILDON_TYPE_WINDOW) struct _MilkMainWindowPrivate { + GtkWidget *main_vbox; + + GtkWidget *new_task_entry; + GtkWidget *task_view; + GtkWidget *action_bar; }; static void @@ -43,7 +49,8 @@ milk_main_window_get_property (GObject *object, switch (property_id) { default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, + pspec); } } @@ -56,7 +63,8 @@ milk_main_window_set_property (GObject *object, switch (property_id) { default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, + pspec); } } @@ -67,9 +75,321 @@ milk_main_window_dispose (GObject *object) } static void +complete_clicked_cb (GtkButton *button, + MilkMainWindow *window) +{ + g_debug ("FIXME: implement 'complete' action"); +} + +static void +delete_clicked_cb (GtkButton *button, + MilkMainWindow *window) +{ + g_debug ("FIXME: implement 'delete' action"); +} + +static void +priority_plus_clicked_cb (GtkButton *button, + MilkMainWindow *window) +{ + g_debug ("FIXME: implement 'priority plus' action"); +} + +static void +priority_minus_clicked_cb (GtkButton *button, + MilkMainWindow *window) +{ + g_debug ("FIXME: implement 'priority minus' action"); +} + +static void +edit_clicked_cb (GtkButton *button, + MilkMainWindow *window) +{ + g_debug ("FIXME: implement 'edit' action"); +} + +static MenuItem menu_items_always_shown[] = { + {"New Task", "menu-item-new-task", new_task_clicked_cb}, +}; + +static MenuItem menu_items_selection_required[] = { + {"Edit", "menu-item-edit", edit_clicked_cb}, + {"Priority +", "menu-item-priority_plus", priority_plus_clicked_cb}, + {"Priority -", "menu-item-priority_minus", priority_minus_clicked_cb}, + {"Complete", "menu-item-complete", complete_clicked_cb}, + {"Delete", "menu-item-delete", delete_clicked_cb}, +}; + +static void +task_view_selection_changed_cb (HildonTouchSelector *view, + gint column, + MilkMainWindow *window) +{ + MilkMainWindowPrivate *priv; + GList *rows; + gboolean show = FALSE; + gint i; + + priv = MILK_MAIN_WINDOW_PRIVATE (window); + + rows = hildon_touch_selector_get_selected_rows (view, column); + show = (g_list_length (rows) > 0); + + for (i = 0; i < G_N_ELEMENTS (menu_items_selection_required); i++) { + GtkWidget *w; + + w = g_object_get_data ( + G_OBJECT (priv->app_menu), + menu_items_selection_required[i].id); + + if (show) + gtk_widget_show (w); + else + gtk_widget_hide (w); + } +} + +static GtkWidget* +create_menu (gpointer user_data) +{ + HildonAppMenu *menu; + MenuItem *menu_array; + gint i, length; + GtkWidget *w; + + menu = HILDON_APP_MENU (hildon_app_menu_new ()); + + menu_array = menu_items_always_shown; + length = G_N_ELEMENTS (menu_items_always_shown); + for (i = 0; i < length; i++) { + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _(menu_array[i].display_name), ""); + g_signal_connect (w, "clicked", + G_CALLBACK (menu_array[i].callback), user_data); + g_object_set_data (G_OBJECT (menu), menu_array[i].id, w); + hildon_app_menu_append (menu, GTK_BUTTON (w)); + gtk_widget_show (w); + } + + menu_array = menu_items_selection_required; + length = G_N_ELEMENTS (menu_items_selection_required); + for (i = 0; i < length; i++) { + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + menu_array[i].display_name, ""); + g_signal_connect (w, "clicked", + G_CALLBACK (menu_array[i].callback), user_data); + g_object_set_data (G_OBJECT (menu), menu_array[i].id, w); + hildon_app_menu_append (menu, GTK_BUTTON (w)); + gtk_widget_hide (w); + } + + gtk_widget_show (GTK_WIDGET (menu)); + + return GTK_WIDGET (menu); +} + +static MenuItem menu_items_always_shown[] = { + {"New Task", "menu-item-new-task", new_task_clicked_cb}, +}; + +static MenuItem menu_items_selection_required[] = { + {"Edit", "menu-item-edit", edit_clicked_cb}, + {"Priority +", "menu-item-priority_plus", priority_plus_clicked_cb}, + {"Priority -", "menu-item-priority_minus", priority_minus_clicked_cb}, + {"Complete", "menu-item-complete", complete_clicked_cb}, + {"Delete", "menu-item-delete", delete_clicked_cb}, +}; + +static void +task_view_selection_changed_cb (HildonTouchSelector *view, + gint column, + MilkMainWindow *window) +{ + MilkMainWindowPrivate *priv; + GList *rows; + gboolean show = FALSE; + gint i; + + priv = MILK_MAIN_WINDOW_PRIVATE (window); + + rows = hildon_touch_selector_get_selected_rows (view, column); + show = (g_list_length (rows) > 0); + + for (i = 0; i < G_N_ELEMENTS (menu_items_selection_required); i++) { + GtkWidget *w; + + w = g_object_get_data ( + G_OBJECT (priv->app_menu), + menu_items_selection_required[i].id); + + if (show) + gtk_widget_show (w); + else + gtk_widget_hide (w); + } +} + +static GtkWidget* +create_menu (gpointer user_data) +{ + HildonAppMenu *menu; + MenuItem *menu_array; + gint i, length; + GtkWidget *w; + + menu = HILDON_APP_MENU (hildon_app_menu_new ()); + + menu_array = menu_items_always_shown; + length = G_N_ELEMENTS (menu_items_always_shown); + for (i = 0; i < length; i++) { + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _(menu_array[i].display_name), ""); + g_signal_connect (w, "clicked", + G_CALLBACK (menu_array[i].callback), user_data); + g_object_set_data (G_OBJECT (menu), menu_array[i].id, w); + hildon_app_menu_append (menu, GTK_BUTTON (w)); + gtk_widget_show (w); + } + + menu_array = menu_items_selection_required; + length = G_N_ELEMENTS (menu_items_selection_required); + for (i = 0; i < length; i++) { + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + menu_array[i].display_name, ""); + g_signal_connect (w, "clicked", + G_CALLBACK (menu_array[i].callback), user_data); + g_object_set_data (G_OBJECT (menu), menu_array[i].id, w); + hildon_app_menu_append (menu, GTK_BUTTON (w)); + gtk_widget_hide (w); + } + + gtk_widget_show (GTK_WIDGET (menu)); + + return GTK_WIDGET (menu); +} + +static void +contact_column_render_func (GtkCellLayout *cell_layout, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) +{ + MilkTask *task; + char *title; + + gtk_tree_model_get ( + model, iter, MILK_TASK_MODEL_COLUMN_TASK, &task, -1); + + g_object_get (task, "title", &title, NULL); + g_object_set (renderer, "text", title, NULL); + + g_free (title); + g_object_unref (task); +} + +static void milk_main_window_constructed (GObject* object) { MilkMainWindow *self = MILK_MAIN_WINDOW (object); + MilkMainWindowPrivate *priv = MILK_MAIN_WINDOW_PRIVATE (object); + GtkWidget *w; + GtkWidget *pannable; + + w = gtk_vbox_new (FALSE, HILDON_MARGIN_DEFAULT); + gtk_container_add (GTK_CONTAINER (self), w); + priv->main_vbox = w; + + /* + * New Task entry + */ + w = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT); + gtk_box_pack_start (GTK_BOX (priv->main_vbox), w, FALSE, FALSE, 0); + + /* FIXME: change this to hildon_gtk_entry_set_placeholder_text() is + * fixed, since this is deprecated */ + hildon_entry_set_placeholder (HILDON_ENTRY (w), + _("Enter a new task...")); + priv->new_task_entry = w; + + /* + * Task List + */ + w = hildon_pannable_area_new (); + gtk_box_pack_start (GTK_BOX (priv->main_vbox), w, TRUE, TRUE, 0); + pannable = w; + + /* FIXME: attach the model (create a new MilkTaskModel class that syncs + * with the cached tasks) */ + w = gtk_tree_view_new (); + hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (pannable), + w); + gtk_widget_grab_focus (w); + priv->task_view = w; + + /* + * Action Bar + */ + w = gtk_hbox_new (TRUE, HILDON_MARGIN_DEFAULT); + gtk_box_pack_start (GTK_BOX (priv->main_vbox), w, FALSE, FALSE, 0); + priv->action_bar = w; + + /* FIXME: these are probably better off being icons, for width reasons + */ + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _("Complete"), ""); + gtk_container_add (GTK_CONTAINER (priv->action_bar), w); + g_signal_connect (w, "clicked", G_CALLBACK (complete_clicked_cb), self); + + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _("Delete"), ""); + gtk_container_add (GTK_CONTAINER (priv->action_bar), w); + g_signal_connect (w, "clicked", G_CALLBACK (delete_clicked_cb), self); + + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _("Priority +"), ""); + gtk_container_add (GTK_CONTAINER (priv->action_bar), w); + g_signal_connect (w, "clicked", G_CALLBACK (priority_plus_clicked_cb), + self); + + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _("Priority -"), ""); + gtk_container_add (GTK_CONTAINER (priv->action_bar), w); + g_signal_connect (w, "clicked", G_CALLBACK (priority_minus_clicked_cb), + self); + + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _("Edit"), ""); + gtk_container_add (GTK_CONTAINER (priv->action_bar), w); + g_signal_connect (w, "clicked", G_CALLBACK (edit_clicked_cb), + self); + + w = hildon_button_new_with_text ( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _("Edit Tags"), ""); + gtk_container_add (GTK_CONTAINER (priv->action_bar), w); + g_signal_connect (w, "clicked", G_CALLBACK (edit_tags_clicked_cb), + self); } static void -- 1.7.9.5