X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmilk-main-window.c;h=b22c24f8b3561c7ae9658c061bfcf7007b077c07;hb=dc6af2499262368d4391be3c3baf698edfce389b;hp=89401befc04f79e48c04a332ef3444f9f1b5dab8;hpb=2843bd66bdfd9ec91a74d13289699a544c7ac6e9;p=milk diff --git a/src/milk-main-window.c b/src/milk-main-window.c index 89401be..b22c24f 100644 --- a/src/milk-main-window.c +++ b/src/milk-main-window.c @@ -23,21 +23,30 @@ #include #include #include +#include #include "milk-main-window.h" +#include "milk-auth.h" #include "milk-task-model.h" 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) + +static GtkWidget *default_window = NULL; struct _MilkMainWindowPrivate { + MilkAuth *auth; + + GtkWidget *app_menu; + GtkWidget *main_vbox; GtkWidget *new_task_entry; GtkWidget *task_view; + GtkWidget *task_selector; }; enum { @@ -45,6 +54,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, @@ -80,17 +95,116 @@ milk_main_window_dispose (GObject *object) } static void +new_task_clicked_cb (GtkButton *button, + MilkMainWindow *window) +{ + g_debug ("FIXME: implement 'new task' action"); +} + +/* XXX: The latency between clicking "complete" and actually removing the task + * from the view after polling the server is very long, so there's an obvious + * lag -- it will be completely transparent (and look very fast) as soon as + * we've got a cache in place */ +static void complete_clicked_cb (GtkButton *button, MilkMainWindow *window) { - g_debug ("FIXME: implement 'complete' action"); + MilkMainWindowPrivate *priv; + GList *rows; + GtkTreeModel *model; + char *timeline; + GError *error = NULL; + + priv = MILK_MAIN_WINDOW_PRIVATE (window); + + rows = hildon_touch_selector_get_selected_rows ( + HILDON_TOUCH_SELECTOR (priv->task_view), + TASK_VIEW_COLUMN_TITLE); + model = hildon_touch_selector_get_model ( + HILDON_TOUCH_SELECTOR (priv->task_view), + TASK_VIEW_COLUMN_TITLE); + + timeline = milk_auth_timeline_create (priv->auth, &error); + + if (error) { + g_warning (G_STRLOC ": failed to create a timeline: %s", + error->message); + g_clear_error (&error); + } else { + while (rows) { + GtkTreeIter iter; + RtmTask *task; + + gtk_tree_model_get_iter (model, &iter, rows->data); + gtk_tree_model_get (model, &iter, + MILK_TASK_MODEL_COLUMN_TASK, &task, + -1); + + milk_auth_task_complete (priv->auth, timeline, task, + &error); + if (error != NULL) { + g_warning (G_STRLOC ": failed to complete task " + "%s: %s", + rtm_task_get_id (task), + error->message); + g_clear_error (&error); + } + + rows = g_list_delete_link (rows, rows); + } + } } +/* XXX: high latency until we have a cache; see the note for + * complete_clicked_cb() */ static void delete_clicked_cb (GtkButton *button, MilkMainWindow *window) { - g_debug ("FIXME: implement 'delete' action"); + MilkMainWindowPrivate *priv; + GList *rows; + GtkTreeModel *model; + char *timeline; + GError *error = NULL; + + priv = MILK_MAIN_WINDOW_PRIVATE (window); + + rows = hildon_touch_selector_get_selected_rows ( + HILDON_TOUCH_SELECTOR (priv->task_view), + TASK_VIEW_COLUMN_TITLE); + model = hildon_touch_selector_get_model ( + HILDON_TOUCH_SELECTOR (priv->task_view), + TASK_VIEW_COLUMN_TITLE); + + timeline = milk_auth_timeline_create (priv->auth, &error); + + if (error) { + g_warning (G_STRLOC ": failed to create a timeline: %s", + error->message); + g_clear_error (&error); + } else { + while (rows) { + GtkTreeIter iter; + RtmTask *task; + + gtk_tree_model_get_iter (model, &iter, rows->data); + gtk_tree_model_get (model, &iter, + MILK_TASK_MODEL_COLUMN_TASK, &task, + -1); + + milk_auth_task_delete (priv->auth, timeline, task, + &error); + if (error != NULL) { + g_warning (G_STRLOC ": failed to delete task " + "%s: %s", + rtm_task_get_id (task), + error->message); + g_clear_error (&error); + } + + rows = g_list_delete_link (rows, rows); + } + } } static void @@ -153,90 +267,8 @@ task_view_selection_changed_cb (HildonTouchSelector *view, 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); - } + g_list_free (rows); } static GtkWidget* @@ -289,70 +321,27 @@ contact_column_render_func (GtkCellLayout *cell_layout, GtkTreeIter *iter, gpointer user_data) { - MilkTask *task; - char *title; + RtmTask *task; gtk_tree_model_get ( model, iter, MILK_TASK_MODEL_COLUMN_TASK, &task, -1); + g_object_set (renderer, "text", rtm_task_get_name (task), NULL); - g_object_get (task, "title", &title, NULL); - g_object_set (renderer, "text", title, NULL); - - g_free (title); g_object_unref (task); } -static HildonAppMenu* -create_menu (gpointer user_data) +static gboolean +begin_auth_idle (MilkMainWindow *window) { - HildonAppMenu *menu; - GtkWidget *w; + MilkMainWindowPrivate *priv; - menu = HILDON_APP_MENU (hildon_app_menu_new ()); + priv = MILK_MAIN_WINDOW_PRIVATE (window); + + /* FIXME: cut this */ + g_debug ("trying to run the milk auth demo"); + milk_auth_log_in (priv->auth); - 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, - _("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, - _("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; + return FALSE; } static void @@ -384,21 +373,25 @@ milk_main_window_constructed (GObject* object) /* * Task List */ - model = GTK_TREE_MODEL (milk_task_model_new ()); + priv->auth = milk_auth_get_default (); + model = GTK_TREE_MODEL (milk_task_model_new (priv->auth)); w = hildon_touch_selector_new (); + renderer = gtk_cell_renderer_text_new (); g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL); - col = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (w), - model, renderer, - "text", MILK_TASK_MODEL_COLUMN_TITLE, - NULL); + + col = hildon_touch_selector_append_column ( + HILDON_TOUCH_SELECTOR (w), model, NULL, NULL); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (col), renderer, TRUE); + gtk_cell_layout_set_cell_data_func ( + GTK_CELL_LAYOUT (col), renderer, + (GtkCellLayoutDataFunc) contact_column_render_func, + self, NULL); g_object_unref (model); - hildon_touch_selector_column_set_text_column ( - col, MILK_TASK_MODEL_COLUMN_TITLE); hildon_touch_selector_set_column_selection_mode ( HILDON_TOUCH_SELECTOR (w), HILDON_TOUCH_SELECTOR_SELECTION_MODE_MULTIPLE); @@ -410,9 +403,19 @@ 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)); + + /* break a cyclical dependency by doing this after the window is + * constructed */ + g_idle_add ((GSourceFunc) begin_auth_idle, self); } static void @@ -431,12 +434,16 @@ 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* -milk_main_window_new () +milk_main_window_get_default () { - return g_object_new (MILK_TYPE_MAIN_WINDOW, - NULL); + if (!default_window) { + default_window = g_object_new (MILK_TYPE_MAIN_WINDOW, NULL); + } + + return default_window; }