From 3bfc04d812245ae07a10dbebde0df7cf9f91512b Mon Sep 17 00:00:00 2001 From: Travis Reitter Date: Mon, 5 Oct 2009 09:48:02 +0100 Subject: [PATCH] Clean up the menu setup code a little and show/hide selection-bsaed menu items as appropriate. --- src/milk-main-window.c | 151 ++++++++++++++++++++++++++++++------------------ 1 file changed, 95 insertions(+), 56 deletions(-) diff --git a/src/milk-main-window.c b/src/milk-main-window.c index cef16b5..91faeed 100644 --- a/src/milk-main-window.c +++ b/src/milk-main-window.c @@ -29,15 +29,18 @@ G_DEFINE_TYPE (MilkMainWindow, milk_main_window, HILDON_TYPE_WINDOW) -#define MILK_MAIN_WINDOW_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), MILK_TYPE_MAIN_WINDOW, MilkMainWindowPrivate)) +/* less expensive than G_TYPE_INSTANCE_GET_PRIVATE */ +#define MILK_MAIN_WINDOW_PRIVATE(o) ((MILK_MAIN_WINDOW ((o)))->priv) struct _MilkMainWindowPrivate { + GtkWidget *app_menu; + GtkWidget *main_vbox; GtkWidget *new_task_entry; GtkWidget *task_view; + GtkWidget *task_selector; }; enum { @@ -45,6 +48,12 @@ enum { N_VIEW_COLUMNS }; +typedef struct { + const char *display_name; + const char *id; + gpointer callback; +} MenuItem; + static void milk_main_window_get_property (GObject *object, guint property_id, @@ -309,65 +318,88 @@ contact_column_render_func (GtkCellLayout *cell_layout, g_object_unref (task); } -static HildonAppMenu* +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 ()); - w = hildon_button_new_with_text ( - HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, - HILDON_BUTTON_ARRANGEMENT_VERTICAL, - _("New Task"), ""); - g_signal_connect (w, "clicked", G_CALLBACK (new_task_clicked_cb), - user_data); - hildon_app_menu_append (menu, GTK_BUTTON (w)); - - w = hildon_button_new_with_text ( - HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, - HILDON_BUTTON_ARRANGEMENT_VERTICAL, - _("Edit"), ""); - g_signal_connect (w, "clicked", G_CALLBACK (edit_clicked_cb), - user_data); - hildon_app_menu_append (menu, GTK_BUTTON (w)); - - w = hildon_button_new_with_text ( - HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, - HILDON_BUTTON_ARRANGEMENT_VERTICAL, - _("Priority +"), ""); - g_signal_connect (w, "clicked", G_CALLBACK (priority_plus_clicked_cb), - user_data); - hildon_app_menu_append (menu, GTK_BUTTON (w)); - - w = hildon_button_new_with_text ( - HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, - HILDON_BUTTON_ARRANGEMENT_VERTICAL, - _("Priority -"), ""); - g_signal_connect (w, "clicked", G_CALLBACK (priority_minus_clicked_cb), - user_data); - hildon_app_menu_append (menu, GTK_BUTTON (w)); - - w = hildon_button_new_with_text ( - HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, - HILDON_BUTTON_ARRANGEMENT_VERTICAL, - _("Complete"), ""); - g_signal_connect (w, "clicked", G_CALLBACK (complete_clicked_cb), - user_data); - hildon_app_menu_append (menu, GTK_BUTTON (w)); - - w = hildon_button_new_with_text ( - HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, - HILDON_BUTTON_ARRANGEMENT_VERTICAL, - _("Delete"), ""); - g_signal_connect (w, "clicked", G_CALLBACK (delete_clicked_cb), - user_data); - hildon_app_menu_append (menu, GTK_BUTTON (w)); - - gtk_widget_show_all (GTK_WIDGET (menu)); - - return menu; + 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 @@ -425,9 +457,15 @@ milk_main_window_constructed (GObject* object) gtk_box_pack_start (GTK_BOX (priv->main_vbox), w, TRUE, TRUE, 0); g_object_set (w, "can-focus", TRUE, NULL); gtk_widget_grab_focus (w); + + g_signal_connect ( + G_OBJECT (w), "changed", + G_CALLBACK (task_view_selection_changed_cb), self); priv->task_view = w; - hildon_window_set_app_menu (HILDON_WINDOW (self), create_menu (self)); + priv->app_menu = create_menu (self); + hildon_window_set_app_menu ( + HILDON_WINDOW (self), HILDON_APP_MENU (priv->app_menu)); } static void @@ -446,7 +484,8 @@ milk_main_window_class_init (MilkMainWindowClass *klass) static void milk_main_window_init (MilkMainWindow *self) { - self->priv = MILK_MAIN_WINDOW_PRIVATE (self); + self->priv = G_TYPE_INSTANCE_GET_PRIVATE ( + self, MILK_TYPE_MAIN_WINDOW, MilkMainWindowPrivate); } GtkWidget* -- 1.7.9.5