X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-main-window.c;h=06c3d37390cceb5176c6e93cf444b6f09d8ebbb3;hp=712bf38599100861c92230f4145c386d3705f575;hb=a59af551866fd1520213195db36bf189d357716f;hpb=864c085607658b16daf578e94e63916e9832af83 diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 712bf38..06c3d37 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -32,7 +32,7 @@ #include #include #include "modest-hildon-includes.h" - +#include "modest-defs.h" #include #include "widgets/modest-main-window.h" @@ -69,6 +69,9 @@ static void save_sizes (ModestMainWindow *self); static void modest_main_window_show_toolbar (ModestWindow *window, gboolean show_toolbar); +static void cancel_progressbar (GtkToolButton *toolbutton, + ModestMainWindow *self); + static void on_queue_changed (ModestMailOperationQueue *queue, ModestMailOperation *mail_op, ModestMailOperationQueueNotification type, @@ -115,6 +118,7 @@ struct _ModestMainWindowPrivate { GtkWidget *cancel_toolitem; GtkWidget *sort_toolitem; GtkWidget *refresh_toolitem; + ModestToolBarModes current_toolbar_mode; /* On-demand widgets */ GtkWidget *accounts_popup; @@ -157,6 +161,12 @@ static const GtkActionEntry modest_folder_view_action_entries [] = { { "FolderViewCSMHelp", NULL, N_("mcen_me_inbox_help"), NULL, NULL, NULL }, }; + +static const GtkToggleActionEntry modest_main_window_toggle_action_entries [] = { + { "ToolbarToggleView", MODEST_STOCK_SPLIT_VIEW, N_("gqn_toolb_rss_fldonoff"), "t", NULL, G_CALLBACK (modest_ui_actions_toggle_folders_view), FALSE }, +}; + + /************************************************************************/ GType @@ -218,6 +228,7 @@ modest_main_window_init (ModestMainWindow *obj) priv->progress_widgets = NULL; priv->progress_bar = NULL; + priv->current_toolbar_mode = TOOLBAR_MODE_NORMAL; priv->style = MODEST_MAIN_WINDOW_STYLE_SPLIT; priv->contents_style = MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS; @@ -273,11 +284,11 @@ restore_sizes (ModestMainWindow *self) conf = modest_runtime_get_conf (); modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned), - "modest-main-paned"); + MODEST_CONF_MAIN_PANED_KEY); modest_widget_memory_restore (conf, G_OBJECT(priv->header_view), - "header-view"); + MODEST_CONF_HEADER_VIEW_KEY); modest_widget_memory_restore (conf, G_OBJECT(self), - "modest-main-window"); + MODEST_CONF_MAIN_WINDOW_KEY); } @@ -290,10 +301,12 @@ save_sizes (ModestMainWindow *self) priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); conf = modest_runtime_get_conf (); - modest_widget_memory_save (conf,G_OBJECT(self), "modest-main-window"); - modest_widget_memory_save (conf, G_OBJECT(priv->main_paned), - "modest-main-paned"); - modest_widget_memory_save (conf, G_OBJECT(priv->header_view), "header-view"); + modest_widget_memory_save (conf,G_OBJECT(self), + MODEST_CONF_MAIN_WINDOW_KEY); + modest_widget_memory_save (conf, G_OBJECT(priv->main_paned), + MODEST_CONF_MAIN_PANED_KEY); + modest_widget_memory_save (conf, G_OBJECT(priv->header_view), + MODEST_CONF_HEADER_VIEW_KEY); } static void @@ -439,6 +452,11 @@ modest_main_window_new (void) G_N_ELEMENTS (modest_toggle_action_entries), self); + gtk_action_group_add_toggle_actions (action_group, + modest_main_window_toggle_action_entries, + G_N_ELEMENTS (modest_main_window_toggle_action_entries), + self); + gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); g_object_unref (action_group); @@ -561,15 +579,21 @@ modest_main_window_set_style (ModestMainWindow *self, ModestMainWindowStyle style) { ModestMainWindowPrivate *priv; + ModestWindowPrivate *parent_priv; + GtkAction *action; g_return_if_fail (MODEST_IS_MAIN_WINDOW (self)); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); /* no change -> nothing to do */ if (priv->style == style) return; + /* Get toggle button */ + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarToggleView"); + priv->style = style; switch (style) { @@ -581,6 +605,10 @@ modest_main_window_set_style (ModestMainWindow *self, /* Reparent the contents widget to the main vbox */ gtk_widget_reparent (priv->contents_widget, priv->main_vbox); + g_signal_handlers_block_by_func (action, modest_ui_actions_toggle_folders_view, self); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + g_signal_handlers_unblock_by_func (action, modest_ui_actions_toggle_folders_view, self); + break; case MODEST_MAIN_WINDOW_STYLE_SPLIT: /* Remove header view */ @@ -590,6 +618,11 @@ modest_main_window_set_style (ModestMainWindow *self, /* Reparent the main paned */ gtk_paned_add2 (GTK_PANED (priv->main_paned), priv->contents_widget); gtk_container_add (GTK_CONTAINER (priv->main_vbox), priv->main_paned); + + g_signal_handlers_block_by_func (action, modest_ui_actions_toggle_folders_view, self); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), FALSE); + g_signal_handlers_unblock_by_func (action, modest_ui_actions_toggle_folders_view, self); + break; default: g_return_if_reached (); @@ -616,6 +649,8 @@ modest_main_window_get_style (ModestMainWindow *self) return priv->style; } + + static gboolean modest_main_window_window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata) { @@ -676,8 +711,8 @@ modest_main_window_show_toolbar (ModestWindow *self, priv->cancel_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarCancel"); priv->refresh_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSendReceive"); priv->sort_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSort"); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE); gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE); + gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE); gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE); gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE); @@ -689,6 +724,11 @@ modest_main_window_show_toolbar (ModestWindow *self, gtk_container_add (GTK_CONTAINER (priv->progress_toolitem), priv->progress_bar); gtk_toolbar_insert(GTK_TOOLBAR(parent_priv->toolbar), GTK_TOOL_ITEM (priv->progress_toolitem), insert_index); + /* Connect cancel 'clicked' signal to abort progress mode */ + g_signal_connect(priv->cancel_toolitem, "clicked", + G_CALLBACK(cancel_progressbar), + self); + /* Add it to the observers list */ priv->progress_widgets = g_slist_prepend(priv->progress_widgets, priv->progress_bar); @@ -778,19 +818,28 @@ on_account_update (TnyAccountStore *account_store, default_account = modest_account_mgr_get_default_account (mgr); do { - TnyAccount *acc; - const gchar *acc_name; - gchar *display_name; + TnyAccount *acc = NULL; + const gchar *acc_name = NULL; /* Create tool item */ acc = TNY_ACCOUNT (tny_iterator_get_current (iter)); - acc_name = tny_account_get_name (acc); + if (acc) + acc_name = tny_account_get_name (acc); /* Create display name */ - if (!strcmp (default_account, acc_name)) - display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_default"), acc_name); + gchar *display_name = NULL; + if (acc_name) { + if (default_account && !(strcmp (default_account, acc_name) == 0)) + display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_default"), acc_name); + else + display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_mailbox_n"), acc_name); + } else - display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_mailbox_n"), acc_name); + { + /* TODO: This probably should never happen: */ + display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_default"), ""); + } + item = gtk_menu_item_new_with_label (display_name); @@ -1031,56 +1080,97 @@ static void set_toolbar_mode (ModestMainWindow *self, ModestToolBarModes mode) { + ModestWindowPrivate *parent_priv; ModestMainWindowPrivate *priv; + GtkAction *sort_action, *refresh_action, *cancel_action; g_return_if_fail (MODEST_IS_MAIN_WINDOW (self)); + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - + + sort_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarSort"); + refresh_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarSendReceive"); + cancel_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarCancel"); + + /* Sets current toolbar mode */ + priv->current_toolbar_mode = mode; + + /* Show and hide toolbar items */ switch (mode) { case TOOLBAR_MODE_NORMAL: - if (priv->sort_toolitem) - gtk_widget_show (priv->sort_toolitem); - - if (priv->refresh_toolitem) - gtk_widget_show (priv->refresh_toolitem); - - if (priv->progress_toolitem) + if (sort_action) + gtk_action_set_visible (sort_action, TRUE); + if (refresh_action) + gtk_action_set_visible (refresh_action, TRUE); + if (priv->progress_toolitem) { gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE); + gtk_widget_hide (priv->progress_toolitem); + } if (priv->progress_bar) - gtk_widget_hide (priv->progress_bar); - - if (priv->cancel_toolitem) - gtk_widget_hide (priv->cancel_toolitem); + gtk_widget_hide (priv->progress_bar); + + if (cancel_action) + gtk_action_set_visible (cancel_action, FALSE); break; case TOOLBAR_MODE_TRANSFER: - if (priv->sort_toolitem) - gtk_widget_hide (priv->sort_toolitem); - - if (priv->refresh_toolitem) - gtk_widget_hide (priv->refresh_toolitem); - - if (priv->progress_toolitem) + if (sort_action) + gtk_action_set_visible (sort_action, FALSE); + if (refresh_action) + gtk_action_set_visible (refresh_action, FALSE); + if (cancel_action) + gtk_action_set_visible (cancel_action, TRUE); + if (priv->progress_toolitem) { gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE); + gtk_widget_show (priv->progress_toolitem); + } if (priv->progress_bar) - gtk_widget_show (priv->progress_bar); - - if (priv->cancel_toolitem) - gtk_widget_show (priv->cancel_toolitem); + gtk_widget_show (priv->progress_bar); break; default: - if (priv->cancel_toolitem) - gtk_widget_show (priv->sort_toolitem); - - if (priv->refresh_toolitem) - gtk_widget_show (priv->refresh_toolitem); - - if (priv->progress_bar) - gtk_widget_hide (priv->progress_bar); - - if (priv->cancel_toolitem) - gtk_widget_hide (priv->cancel_toolitem); + g_return_if_reached (); + } + + gtk_widget_show_all (GTK_WIDGET (self)); +} + +static void +cancel_progressbar (GtkToolButton *toolbutton, + ModestMainWindow *self) +{ + GSList *tmp; + ModestMainWindowPrivate *priv; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + + /* Get operation observers and cancel its current operation */ + tmp = priv->progress_widgets; + while (tmp) { + modest_progress_object_cancel_current_operation (MODEST_PROGRESS_OBJECT(tmp->data)); + tmp=g_slist_next(tmp); + } +} + +static gboolean +observers_empty (ModestMainWindow *self) +{ + GSList *tmp = NULL; + ModestMainWindowPrivate *priv; + gboolean is_empty = TRUE; + guint pending_ops = 0; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + tmp = priv->progress_widgets; + + /* Check all observers */ + while (tmp && is_empty) { + pending_ops = modest_progress_object_num_pending_operations (MODEST_PROGRESS_OBJECT(tmp->data)); + is_empty = pending_ops == 0; + + tmp = g_slist_next(tmp); } + + return is_empty; } static void @@ -1089,45 +1179,56 @@ on_queue_changed (ModestMailOperationQueue *queue, ModestMailOperationQueueNotification type, ModestMainWindow *self) { - GSList *tmp; ModestMainWindowPrivate *priv; ModestMailOperationId op_id; ModestToolBarModes mode; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + GSList *tmp; + gboolean mode_changed = FALSE; + g_return_if_fail (MODEST_IS_MAIN_WINDOW (self)); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + /* Get toolbar mode from operation id*/ op_id = modest_mail_operation_get_id (mail_op); switch (op_id) { case MODEST_MAIL_OPERATION_ID_SEND: case MODEST_MAIL_OPERATION_ID_RECEIVE: mode = TOOLBAR_MODE_TRANSFER; + if (priv->current_toolbar_mode == TOOLBAR_MODE_NORMAL) + mode_changed = TRUE; break; default: mode = TOOLBAR_MODE_NORMAL; } + /* Add operation observers and change toolbar if neccessary*/ tmp = priv->progress_widgets; switch (type) { case MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED: - if (mode != TOOLBAR_MODE_NORMAL) + if (mode_changed) set_toolbar_mode (MODEST_MAIN_WINDOW(self), mode); - while (tmp) { - modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data), - mail_op); - tmp = g_slist_next (tmp); + if (mode == TOOLBAR_MODE_TRANSFER) { + while (tmp) { + modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data), + mail_op); + tmp = g_slist_next (tmp); + } } break; case MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED: - if (mode != TOOLBAR_MODE_NORMAL) - set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_NORMAL); - while (tmp) { - modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data), - mail_op); - tmp = g_slist_next (tmp); + if (mode == TOOLBAR_MODE_TRANSFER) { + while (tmp) { + modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data), + mail_op); + tmp = g_slist_next (tmp); + } + + /* If no more operations are being observed, NORMAL mode is enabled again */ + if (observers_empty (MODEST_MAIN_WINDOW(self))) + set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_NORMAL); } break; - } + } }