X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-header-window.c;h=c8afc67583b30861dd039f2b4c57ed9fa14d33b8;hb=3eaf5dee2bd9e042b06d4b4e6b180ba0d1eaf792;hp=e18b1ffb336e31837d8008f594a81643e9d160c8;hpb=5369793d32a9e4cbf4e538185cc53ac2a02920d8;p=modest diff --git a/src/hildon2/modest-header-window.c b/src/hildon2/modest-header-window.c index e18b1ff..c8afc67 100644 --- a/src/hildon2/modest-header-window.c +++ b/src/hildon2/modest-header-window.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -55,18 +56,31 @@ typedef enum { CONTENTS_STATE_HEADERS = 2 } ContentsState; +typedef enum { + EDIT_MODE_COMMAND_NONE = 0, + EDIT_MODE_COMMAND_MOVE = 1, + EDIT_MODE_COMMAND_DELETE = 2, +} EditModeCommand; + typedef struct _ModestHeaderWindowPrivate ModestHeaderWindowPrivate; struct _ModestHeaderWindowPrivate { GtkWidget *header_view; GtkWidget *empty_view; GtkWidget *contents_view; - GtkWidget *new_message_button; + GtkWidget *top_vbox; + GtkWidget *edit_toolbar; + /* state bar */ ContentsState contents_state; + gboolean edit_mode; + EditModeCommand edit_command; TnyFolder *folder; + /* autoscroll */ + gboolean autoscroll; + /* banners */ GtkWidget *updating_banner; guint updating_banner_timeout; @@ -115,7 +129,22 @@ static void on_header_activated (ModestHeaderView *header_view, static void on_updating_msg_list (ModestHeaderView *header_view, gboolean starting, gpointer user_data); - +static void set_edit_mode (ModestHeaderWindow *self, + EditModeCommand command); +static void edit_toolbar_button_clicked (HildonEditToolbar *toolbar, + ModestHeaderWindow *self); +static void edit_toolbar_arrow_clicked (HildonEditToolbar *toolbar, + ModestHeaderWindow *self); +static void set_delete_edit_mode (GtkButton *button, + ModestHeaderWindow *self); +static void set_moveto_edit_mode (GtkButton *button, + ModestHeaderWindow *self); +static gboolean on_expose_event(GtkTreeView *header_view, + GdkEventExpose *event, + gpointer user_data); +static void on_vertical_movement (HildonPannableArea *area, + HildonMovementDirection direction, + gdouble x, gdouble y, gpointer user_data); /* globals */ static GtkWindowClass *parent_class = NULL; @@ -182,11 +211,16 @@ modest_header_window_init (ModestHeaderWindow *obj) priv->header_view = NULL; priv->empty_view = NULL; + priv->top_vbox = NULL; + priv->edit_mode = FALSE; + priv->edit_command = EDIT_MODE_COMMAND_NONE; + priv->edit_toolbar = NULL; priv->contents_view = NULL; priv->contents_state = CONTENTS_STATE_NONE; priv->folder = NULL; priv->updating_banner = NULL; priv->updating_banner_timeout = 0; + priv->autoscroll = TRUE; modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(), GTK_WINDOW(obj), @@ -253,14 +287,22 @@ connect_signals (ModestHeaderWindow *self) "updating-msg-list", G_CALLBACK (on_updating_msg_list), self); - - /* TODO: connect header view activate */ + priv->sighandlers = + modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (priv->header_view), + "expose-event", + G_CALLBACK (on_expose_event), + self); - /* new message button */ + priv->sighandlers = + modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (priv->contents_view), + "vertical-movement", + G_CALLBACK (on_vertical_movement), + self); + + /* TODO: connect header view activate */ - g_signal_connect (G_OBJECT (priv->new_message_button), "clicked", - G_CALLBACK (modest_ui_actions_on_new_msg), (gpointer) self); - /* window */ /* we don't register this in sighandlers, as it should be run after disconnecting all signals, @@ -299,15 +341,28 @@ create_header_view (ModestWindow *progress_window, TnyFolder *folder) static GtkWidget * create_empty_view (void) { - GtkLabel *label = NULL; + GtkWidget *label = NULL; GtkWidget *align = NULL; align = gtk_alignment_new(EMPTYVIEW_XALIGN, EMPTYVIEW_YALIGN, EMPTYVIEW_XSPACE, EMPTYVIEW_YSPACE); - label = GTK_LABEL(gtk_label_new (_("mcen_ia_nomessages"))); - gtk_label_set_justify (label, GTK_JUSTIFY_CENTER); - gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET(label)); + label = gtk_label_new (_("mcen_ia_nomessages")); + gtk_widget_show (label); + gtk_widget_show (align); + gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER); + gtk_container_add (GTK_CONTAINER (align), label); - return GTK_WIDGET(align); + return align; +} + +static void +on_vertical_movement (HildonPannableArea *area, + HildonMovementDirection direction, + gdouble x, gdouble y, gpointer user_data) +{ + ModestHeaderWindow *self = (ModestHeaderWindow *) user_data; + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); + + priv->autoscroll = FALSE; } @@ -318,39 +373,27 @@ modest_header_window_new (TnyFolder *folder) ModestHeaderWindowPrivate *priv = NULL; HildonProgram *app; GdkPixbuf *window_icon; - GtkWidget *pannable; self = MODEST_HEADER_WINDOW(g_object_new(MODEST_TYPE_HEADER_WINDOW, NULL)); priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self); priv->folder = g_object_ref (folder); - pannable = hildon_pannable_area_new (); + priv->contents_view = hildon_pannable_area_new (); priv->header_view = create_header_view (MODEST_WINDOW (self), folder); priv->empty_view = create_empty_view (); g_object_ref (priv->header_view); g_object_ref (priv->empty_view); - priv->contents_view = gtk_vbox_new (FALSE, 0); - priv->new_message_button = hildon_button_new (MODEST_EDITABLE_SIZE, - HILDON_BUTTON_ARRANGEMENT_HORIZONTAL); - hildon_button_set_title (HILDON_BUTTON (priv->new_message_button), _("mcen_me_viewer_newemail")); - hildon_button_set_image (HILDON_BUTTON (priv->new_message_button), - gtk_image_new_from_stock (MODEST_STOCK_NEW_MAIL, HILDON_ICON_SIZE_TOOLBAR)); - hildon_button_set_title_alignment (HILDON_BUTTON (priv->new_message_button), 0.0, 0.5); - hildon_button_set_image_alignment (HILDON_BUTTON (priv->new_message_button), 0.0, 0.5); - hildon_button_set_alignment (HILDON_BUTTON (priv->new_message_button), 0.0, 0.5, 1.0, 0.0); - hildon_button_set_image_position (HILDON_BUTTON (priv->new_message_button), GTK_POS_LEFT); - setup_menu (self); - gtk_box_pack_start (GTK_BOX (priv->contents_view), priv->new_message_button, FALSE, FALSE, 0); - hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (pannable), priv->contents_view); - gtk_container_add (GTK_CONTAINER (self), pannable); + priv->top_vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_end (GTK_BOX (priv->top_vbox), priv->contents_view, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (self), priv->top_vbox); gtk_widget_show (priv->contents_view); - gtk_widget_show (pannable); - gtk_widget_show (priv->new_message_button); + gtk_widget_show (priv->top_vbox); connect_signals (MODEST_HEADER_WINDOW (self)); @@ -454,6 +497,10 @@ static void setup_menu (ModestHeaderWindow *self) G_CALLBACK (modest_ui_actions_on_details)); add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_sort"), G_CALLBACK (modest_ui_actions_on_sort)); + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_delete"), + G_CALLBACK (set_delete_edit_mode)); + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_moveto"), + G_CALLBACK (set_moveto_edit_mode)); hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self), HILDON_APP_MENU (app_menu)); @@ -526,11 +573,11 @@ set_contents_state (ModestHeaderWindow *self, /* Add the new content */ switch (state) { case CONTENTS_STATE_EMPTY: - gtk_box_pack_start (GTK_BOX (priv->contents_view), priv->empty_view, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (priv->contents_view), priv->empty_view); gtk_widget_show (priv->empty_view); break; case CONTENTS_STATE_HEADERS: - gtk_box_pack_start (GTK_BOX (priv->contents_view), priv->header_view, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (priv->contents_view), priv->header_view); gtk_widget_show (priv->header_view); break; case CONTENTS_STATE_NONE: @@ -635,3 +682,113 @@ on_updating_msg_list (ModestHeaderView *header_view, } } } + +static void +set_edit_mode (ModestHeaderWindow *self, + EditModeCommand command) +{ + ModestHeaderWindowPrivate *priv; + + priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); + if (priv->edit_toolbar) { + gtk_widget_destroy (priv->edit_toolbar); + priv->edit_toolbar = NULL; + } + + if (command == EDIT_MODE_COMMAND_NONE) { + if (priv->edit_mode) { + priv->edit_mode = FALSE; + priv->edit_command = command; + g_object_set (G_OBJECT (priv->header_view), + "hildon-ui-mode", HILDON_UI_MODE_NORMAL, + NULL); + gtk_widget_queue_resize (priv->header_view); + gtk_window_unfullscreen (GTK_WINDOW (self)); + } + } else { + if (!priv->edit_mode) { + GtkTreeSelection *selection; + + g_object_set (G_OBJECT (priv->header_view), + "hildon-ui-mode", HILDON_UI_MODE_EDIT, + NULL); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->header_view)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); + + priv->edit_mode = TRUE; + priv->edit_command = command; + + /* Setup toolbar */ + priv->edit_toolbar = hildon_edit_toolbar_new (); + switch (command) { + case EDIT_MODE_COMMAND_DELETE: + hildon_edit_toolbar_set_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar), + _("TODO: Select messages to delete")); + hildon_edit_toolbar_set_button_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar), + _("TODO: Delete")); + break; + case EDIT_MODE_COMMAND_MOVE: + hildon_edit_toolbar_set_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar), + _("TODO: Select messages to move")); + hildon_edit_toolbar_set_button_label (HILDON_EDIT_TOOLBAR (priv->edit_toolbar), + _("TODO: Move")); + break; + case EDIT_MODE_COMMAND_NONE: + g_assert ("Shouldn't reach"); + } + gtk_box_pack_start (GTK_BOX (priv->top_vbox), priv->edit_toolbar, FALSE, FALSE, 0); + g_signal_connect (G_OBJECT (priv->edit_toolbar), "button-clicked", + G_CALLBACK (edit_toolbar_button_clicked), (gpointer) self); + g_signal_connect (G_OBJECT (priv->edit_toolbar), "arrow-clicked", + G_CALLBACK (edit_toolbar_arrow_clicked), (gpointer) self); + gtk_widget_show (priv->edit_toolbar); + + gtk_widget_queue_resize (priv->header_view); + gtk_window_fullscreen (GTK_WINDOW (self)); + } + } +} + +static void +edit_toolbar_button_clicked (HildonEditToolbar *toolbar, + ModestHeaderWindow *self) +{ + set_edit_mode (self, EDIT_MODE_COMMAND_NONE); +} + +static void +edit_toolbar_arrow_clicked (HildonEditToolbar *toolbar, + ModestHeaderWindow *self) +{ + set_edit_mode (self, EDIT_MODE_COMMAND_NONE); +} + +static void +set_delete_edit_mode (GtkButton *button, + ModestHeaderWindow *self) +{ + set_edit_mode (self, EDIT_MODE_COMMAND_DELETE); +} + +static void +set_moveto_edit_mode (GtkButton *button, + ModestHeaderWindow *self) +{ + set_edit_mode (self, EDIT_MODE_COMMAND_MOVE); +} + +static gboolean +on_expose_event(GtkTreeView *header_view, + GdkEventExpose *event, + gpointer user_data) +{ + ModestHeaderWindow *self = (ModestHeaderWindow *) user_data; + ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); + + g_return_val_if_fail (MODEST_IS_HEADER_WINDOW (self), FALSE); + + if (priv->autoscroll) + hildon_pannable_area_jump_to (HILDON_PANNABLE_AREA (priv->contents_view), 0.0, 0.0); + + return FALSE; +}