From 01a478263cac00fb0315eb1836b8c9670f4e197b Mon Sep 17 00:00:00 2001 From: Jose Dapena Paz Date: Thu, 11 Dec 2008 10:54:22 +0000 Subject: [PATCH] Progress feedback in header window pmo-drop-split-view-r6768 --- src/hildon2/modest-header-window.c | 179 ++++++++++++++++++++++++++++++++++-- src/hildon2/modest-header-window.h | 4 + src/modest-ui-dimming-rules.c | 4 + 3 files changed, 179 insertions(+), 8 deletions(-) diff --git a/src/hildon2/modest-header-window.c b/src/hildon2/modest-header-window.c index 3f776d3..3122479 100644 --- a/src/hildon2/modest-header-window.c +++ b/src/hildon2/modest-header-window.c @@ -90,9 +90,13 @@ struct _ModestHeaderWindowPrivate { /* signals */ GSList *sighandlers; + gulong queue_change_handler; /* Display state */ osso_display_state_t display_state; + + /* progress hint */ + gboolean progress_hint; }; #define MODEST_HEADER_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_HEADER_WINDOW, \ @@ -154,6 +158,14 @@ static gboolean on_expose_event(GtkTreeView *header_view, static void on_vertical_movement (HildonPannableArea *area, HildonMovementDirection direction, gdouble x, gdouble y, gpointer user_data); +static void set_progress_hint (ModestHeaderWindow *self, + gboolean enabled); +static void on_queue_changed (ModestMailOperationQueue *queue, + ModestMailOperation *mail_op, + ModestMailOperationQueueNotification type, + ModestHeaderWindow *self); +static void modest_header_window_show_toolbar (ModestWindow *window, + gboolean show_toolbar); /* globals */ @@ -209,6 +221,7 @@ modest_header_window_class_init (ModestHeaderWindowClass *klass) modest_window_class->zoom_minus_func = on_zoom_minus_plus_not_implemented; modest_window_class->zoom_plus_func = on_zoom_minus_plus_not_implemented; + modest_window_class->show_toolbar_func = modest_header_window_show_toolbar; modest_window_class->disconnect_signals_func = modest_header_window_disconnect_signals; } @@ -234,6 +247,8 @@ modest_header_window_init (ModestHeaderWindow *obj) priv->updating_banner = NULL; priv->updating_banner_timeout = 0; priv->autoscroll = TRUE; + priv->progress_hint = FALSE; + priv->queue_change_handler = 0; modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(), GTK_WINDOW(obj), @@ -273,8 +288,14 @@ modest_header_window_disconnect_signals (ModestWindow *self) ModestHeaderWindowPrivate *priv; priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self); + if (g_signal_handler_is_connected (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + priv->queue_change_handler)) + g_signal_handler_disconnect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + priv->queue_change_handler); + modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers); - priv->sighandlers = NULL; + priv->sighandlers = NULL; + } static void @@ -314,13 +335,11 @@ connect_signals (ModestHeaderWindow *self) G_CALLBACK (on_vertical_movement), self); - /* TODO: connect header view activate */ - - /* window */ - - /* we don't register this in sighandlers, as it should be run after disconnecting all signals, - * in destroy stage */ - + /* Mail Operation Queue */ + priv->queue_change_handler = g_signal_connect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + "queue-changed", + G_CALLBACK (on_queue_changed), + self); } @@ -854,3 +873,147 @@ on_expose_event(GtkTreeView *header_view, return FALSE; } + +static gboolean +set_toolbar_transfer_mode (ModestHeaderWindow *self) +{ + ModestHeaderWindowPrivate *priv = NULL; + + g_return_val_if_fail (MODEST_IS_HEADER_WINDOW (self), FALSE); + + priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self); + + set_progress_hint (self, TRUE); + + return FALSE; +} + +static void +set_progress_hint (ModestHeaderWindow *self, + gboolean enabled) +{ + ModestWindowPrivate *parent_priv; + ModestHeaderWindowPrivate *priv; + + g_return_if_fail (MODEST_IS_HEADER_WINDOW (self)); + + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self); + + /* Sets current progress hint */ + priv->progress_hint = enabled; + + if (GTK_WIDGET_VISIBLE (self)) { + hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self), enabled?1:0); + } + +} + +gboolean +modest_header_window_toolbar_on_transfer_mode (ModestHeaderWindow *self) +{ + ModestHeaderWindowPrivate *priv= NULL; + + g_return_val_if_fail (MODEST_IS_HEADER_WINDOW (self), FALSE); + priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); + + return priv->progress_hint; +} + +static void +modest_header_window_show_toolbar (ModestWindow *self, + gboolean show_toolbar) +{ + ModestHeaderWindowPrivate *priv = NULL; + ModestWindowPrivate *parent_priv; + + parent_priv = MODEST_WINDOW_GET_PRIVATE(self); + priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self); + + if (modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (self))) + set_progress_hint (MODEST_HEADER_WINDOW (self), TRUE); + else + set_progress_hint (MODEST_HEADER_WINDOW (self), FALSE); +} + +gboolean +modest_header_window_transfer_mode_enabled (ModestHeaderWindow *self) +{ + ModestHeaderWindowPrivate *priv; + + g_return_val_if_fail (MODEST_IS_HEADER_WINDOW (self), FALSE); + priv = MODEST_HEADER_WINDOW_GET_PRIVATE(self); + + return priv->progress_hint; +} + +static void +on_mail_operation_started (ModestMailOperation *mail_op, + gpointer user_data) +{ + ModestHeaderWindow *self; + ModestMailOperationTypeOperation op_type; + GObject *source = NULL; + + self = MODEST_HEADER_WINDOW (user_data); + op_type = modest_mail_operation_get_type_operation (mail_op); + source = modest_mail_operation_get_source(mail_op); + if (G_OBJECT (self) == source) { + set_toolbar_transfer_mode(self); + } + g_object_unref (source); +} + +static void +on_mail_operation_finished (ModestMailOperation *mail_op, + gpointer user_data) +{ + ModestHeaderWindow *self; + ModestMailOperationTypeOperation op_type; + + self = MODEST_HEADER_WINDOW (user_data); + op_type = modest_mail_operation_get_type_operation (mail_op); + + /* If no more operations are being observed, NORMAL mode is enabled again */ + if (modest_mail_operation_queue_num_elements (modest_runtime_get_mail_operation_queue ()) == 0) { + set_progress_hint (self, FALSE); + } + + modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self)); +} + +static void +on_queue_changed (ModestMailOperationQueue *queue, + ModestMailOperation *mail_op, + ModestMailOperationQueueNotification type, + ModestHeaderWindow *self) +{ + ModestHeaderWindowPrivate *priv; + + priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self); + + /* If this operations was created by another window, do nothing */ + if (!modest_mail_operation_is_mine (mail_op, G_OBJECT(self))) + return; + + if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED) { + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (mail_op), + "operation-started", + G_CALLBACK (on_mail_operation_started), + self); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (mail_op), + "operation-finished", + G_CALLBACK (on_mail_operation_finished), + self); + } else if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED) { + priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers, + G_OBJECT (mail_op), + "operation-started"); + priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers, + G_OBJECT (mail_op), + "operation-finished"); + } +} + diff --git a/src/hildon2/modest-header-window.h b/src/hildon2/modest-header-window.h index 2a26b5d..1df990b 100644 --- a/src/hildon2/modest-header-window.h +++ b/src/hildon2/modest-header-window.h @@ -83,6 +83,10 @@ ModestWindow* modest_header_window_new (TnyFolder *folder); */ ModestHeaderView *modest_header_window_get_header_view (ModestHeaderWindow *self); +gboolean modest_header_window_toolbar_on_transfer_mode (ModestHeaderWindow *self); +gboolean modest_header_window_transfer_mode_enabled (ModestHeaderWindow *self); + + G_END_DECLS #endif diff --git a/src/modest-ui-dimming-rules.c b/src/modest-ui-dimming-rules.c index 1c1b1ee..6b4b5e7 100644 --- a/src/modest-ui-dimming-rules.c +++ b/src/modest-ui-dimming-rules.c @@ -2739,6 +2739,10 @@ _transfer_mode_enabled (ModestWindow *win) result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win)); } else if (MODEST_IS_MAIN_WINDOW(win)) { result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win)); +#ifdef MODEST_TOOLKIT_HILDON2 + } else if (MODEST_IS_HEADER_WINDOW (win)) { + result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win)); +#endif } else { g_warning("_transfer_mode_enabled called with wrong window type"); } -- 1.7.9.5