From 3f75147ce63f560bbfc5ed736e78a03968ec5759 Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Thu, 24 Jan 2008 18:27:49 +0000 Subject: [PATCH] * Fixed the Modest compilation in GNOME * Added progress bar to Modest GNOME pmo-trunk-r4088 --- src/gnome/modest-gnome-info-bar.c | 161 ++++++++++++++++++++++++++++++++---- src/gnome/modest-msg-edit-window.c | 9 ++ src/gnome/modest-platform.c | 3 +- 3 files changed, 155 insertions(+), 18 deletions(-) diff --git a/src/gnome/modest-gnome-info-bar.c b/src/gnome/modest-gnome-info-bar.c index 13491b7..36a8776 100644 --- a/src/gnome/modest-gnome-info-bar.c +++ b/src/gnome/modest-gnome-info-bar.c @@ -28,6 +28,7 @@ */ +#include #include "modest-gnome-info-bar.h" #include #include @@ -44,6 +45,10 @@ static void modest_gnome_info_bar_add_operation (ModestProgressObject *self, static void modest_gnome_info_bar_remove_operation (ModestProgressObject *self, ModestMailOperation *mail_op); +static void modest_gnome_info_bar_set_pulsating_mode (ModestGnomeInfoBar *self, + const gchar* msg, + gboolean is_pulsating); + static void on_progress_changed (ModestMailOperation *mail_op, ModestMailOperationState *state, ModestGnomeInfoBar *self); @@ -51,6 +56,8 @@ static void on_progress_changed (ModestMailOperation *mail_o static gboolean progressbar_clean (GtkProgressBar *bar); static gboolean statusbar_clean (GtkStatusbar *bar); +#define MODEST_GNOME_INFO_BAR_PULSE_INTERVAL 125 + /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -74,6 +81,7 @@ struct _ModestGnomeInfoBarPrivate { guint status_bar_timeout; guint progress_bar_timeout; + guint pulsating_timeout; }; #define MODEST_GNOME_INFO_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -251,30 +259,46 @@ modest_gnome_info_bar_remove_operation (ModestProgressObject *self, ModestGnomeInfoBar *me; ModestGnomeInfoBarPrivate *priv; GSList *link; + ObservableData *tmp_data = NULL; + gboolean is_current; me = MODEST_GNOME_INFO_BAR (self); priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (me); + is_current = (priv->current == mail_op); + + /* Find item */ + tmp_data = g_malloc0 (sizeof (ObservableData)); + tmp_data->mail_op = mail_op; link = g_slist_find_custom (priv->observables, - mail_op, + tmp_data, (GCompareFunc) compare_observable_data); - + /* Remove the item */ if (link) { - priv->observables = g_slist_remove_link (priv->observables, link); - destroy_observable_data ((ObservableData *) link->data); + ObservableData *ob_data = link->data; + g_signal_handler_disconnect (ob_data->mail_op, ob_data->signal_handler); + g_object_unref (ob_data->mail_op); + g_free (ob_data); + priv->observables = g_slist_delete_link (priv->observables, link); + tmp_data->mail_op = NULL; + link = NULL; } - + /* Update the current mail operation */ - if (priv->current == mail_op) { + if (is_current) { if (priv->observables) priv->current = ((ObservableData *) priv->observables->data)->mail_op; else priv->current = NULL; /* Refresh the view */ + modest_gnome_info_bar_set_pulsating_mode (me, NULL, FALSE); progressbar_clean (GTK_PROGRESS_BAR (priv->progress_bar)); } + + /* free */ + g_free(tmp_data); } static void @@ -283,17 +307,51 @@ on_progress_changed (ModestMailOperation *mail_op, ModestGnomeInfoBar *self) { ModestGnomeInfoBarPrivate *priv; + gboolean determined = FALSE; priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (self); /* If the mail operation is the currently shown one */ if (priv->current == mail_op) { gchar *msg = NULL; - - msg = g_strdup_printf ("Mail operation %d of %d", - modest_mail_operation_get_task_done (mail_op), - modest_mail_operation_get_task_total (mail_op)); - modest_gnome_info_bar_set_message (self, msg); + + determined = (state->done > 0 && state->total > 1) && + !(state->done == 1 && state->total == 100); + + switch (state->op_type) { + case MODEST_MAIL_OPERATION_TYPE_RECEIVE: + if (determined) + msg = g_strdup_printf(_("mcen_me_receiving"), + state->done, state->total); + else + msg = g_strdup(_("mail_me_receiving")); + break; + case MODEST_MAIL_OPERATION_TYPE_SEND: + if (determined) + msg = g_strdup_printf(_("mcen_me_sending"), state->done, + state->total); + else + msg = g_strdup(_("mail_me_sending")); + break; + + case MODEST_MAIL_OPERATION_TYPE_OPEN: + msg = g_strdup(_("mail_me_opening")); + break; + default: + msg = g_strdup(""); + } + + /* If we have byte information use it */ + if ((state->bytes_done != 0) && (state->bytes_total != 0)) + modest_gnome_info_bar_set_progress (self, msg, + state->bytes_done, + state->bytes_total); + else if ((state->done == 0) && (state->total == 0)) + modest_gnome_info_bar_set_pulsating_mode (self, msg, TRUE); + else + modest_gnome_info_bar_set_progress (self, msg, + state->done, + state->total); g_free (msg); } } @@ -328,6 +386,18 @@ modest_gnome_info_bar_set_message (ModestGnomeInfoBar *self, priv->status_bar); } +static gboolean +modest_gnome_info_bar_is_pulsating (ModestGnomeInfoBar *self) +{ + ModestGnomeInfoBarPrivate *priv; + + g_return_val_if_fail (MODEST_IS_GNOME_INFO_BAR(self), FALSE); + + priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (self); + + return priv->pulsating_timeout != 0; +} + void modest_gnome_info_bar_set_progress (ModestGnomeInfoBar *self, const gchar *message, @@ -335,16 +405,73 @@ modest_gnome_info_bar_set_progress (ModestGnomeInfoBar *self, gint total) { ModestGnomeInfoBarPrivate *priv; + gboolean determined = FALSE; + g_return_if_fail (MODEST_IS_GNOME_INFO_BAR(self)); + g_return_if_fail (done <= total); + priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (self); - /* Set progress */ - if (total != 0) - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progress_bar), - (gdouble)done/(gdouble)total); - else + if (modest_gnome_info_bar_is_pulsating (self)) + modest_gnome_info_bar_set_pulsating_mode (self, NULL, FALSE); + + /* Set progress. Tinymail sometimes returns us 1/100 when it + does not have any clue, NOTE that 1/100 could be also a + valid progress (we will loose it), but it will be recovered + once the done is greater than 1 */ + determined = (done > 0 && total > 1) && + !(done == 1 && total == 100); + if (!determined) { gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); + } else { + gdouble percent = 0; + if (total != 0) /* Avoid division by zero. */ + percent = (gdouble)done/(gdouble)total; + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progress_bar), + percent); + } + /* Set text */ - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), message); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), + (message && message[0] != '\0')?message:" "); +} + +static gboolean +do_pulse (gpointer data) +{ + ModestGnomeInfoBarPrivate *priv; + + g_return_val_if_fail (MODEST_IS_GNOME_INFO_BAR(data), FALSE); + + priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (data); + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); + return TRUE; +} + +static void +modest_gnome_info_bar_set_pulsating_mode (ModestGnomeInfoBar *self, + const gchar* msg, + gboolean is_pulsating) +{ + ModestGnomeInfoBarPrivate *priv; + + g_return_if_fail (MODEST_IS_GNOME_INFO_BAR (self)); + + priv = MODEST_GNOME_INFO_BAR_GET_PRIVATE (self); + + if (msg != NULL) + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), msg); + + if (is_pulsating == (priv->pulsating_timeout != 0)) + return; + else if (is_pulsating && (priv->pulsating_timeout == 0)) { + /* enable */ + priv->pulsating_timeout = g_timeout_add (MODEST_GNOME_INFO_BAR_PULSE_INTERVAL, + do_pulse, self); + } else if (!is_pulsating && (priv->pulsating_timeout != 0)) { + /* disable */ + g_source_remove (priv->pulsating_timeout); + priv->pulsating_timeout = 0; + } } diff --git a/src/gnome/modest-msg-edit-window.c b/src/gnome/modest-msg-edit-window.c index 7b9729c..b4dbf79 100644 --- a/src/gnome/modest-msg-edit-window.c +++ b/src/gnome/modest-msg-edit-window.c @@ -556,6 +556,15 @@ modest_msg_edit_window_remove_attachments (ModestMsgEditWindow *window, g_message ("Remove attachments operation is not supported"); } +void +modest_msg_edit_window_get_parts_size (ModestMsgEditWindow *window, + gint *parts_count, + guint64 *parts_size) +{ + *parts_count = 0; + *parts_size = 0; +} + void modest_msg_edit_window_show_cc (ModestMsgEditWindow *window, gboolean show) diff --git a/src/gnome/modest-platform.c b/src/gnome/modest-platform.c index cc9b6a4..942a6a6 100644 --- a/src/gnome/modest-platform.c +++ b/src/gnome/modest-platform.c @@ -254,6 +254,7 @@ gboolean modest_platform_connect_and_wait_if_network_account (GtkWindow *parent_ void modest_platform_connect_if_remote_and_perform (GtkWindow *parent_window, + gboolean force, TnyFolderStore *folder_store, ModestConnectedPerformer callback, gpointer user_data) @@ -295,7 +296,7 @@ modest_platform_connect_if_remote_and_perform (GtkWindow *parent_window, } } - modest_platform_connect_and_perform (parent_window, account, callback, user_data); + modest_platform_connect_and_perform (parent_window, force, account, callback, user_data); return; } -- 1.7.9.5