X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-progress-bar-widget.c;h=8ab228d4f03c6c2aee43079da673f6fcea70bb97;hp=33b54bd7fd6ab60c13ace309243920d5d7fd4d9b;hb=22d443a8a73bee6cd2e25b256aa93691c9f16492;hpb=9b9efa32a2edc633130c4df8967dee7abc0ec41a diff --git a/src/maemo/modest-progress-bar-widget.c b/src/maemo/modest-progress-bar-widget.c index 33b54bd..8ab228d 100644 --- a/src/maemo/modest-progress-bar-widget.c +++ b/src/maemo/modest-progress-bar-widget.c @@ -27,12 +27,14 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include #include "modest-progress-bar-widget.h" -#include +#include "modest-tny-account.h" #include "modest-platform.h" +#include "modest-runtime.h" /* 'private'/'protected' functions */ static void modest_progress_bar_widget_class_init (ModestProgressBarWidgetClass *klass); @@ -45,11 +47,11 @@ static void modest_progress_bar_add_operation (ModestProgressObject *self, static void modest_progress_bar_remove_operation (ModestProgressObject *self, ModestMailOperation *mail_op); -static void -modest_progress_bar_cancel_current_operation (ModestProgressObject *self); +static void modest_progress_bar_cancel_current_operation (ModestProgressObject *self); -static guint -modest_progress_bar_num_pending_operations (ModestProgressObject *self); +static void modest_progress_bar_cancel_all_operations (ModestProgressObject *self); + +static guint modest_progress_bar_num_pending_operations (ModestProgressObject *self); static void on_progress_changed (ModestMailOperation *mail_op, ModestMailOperationState *state, @@ -57,6 +59,12 @@ static void on_progress_changed (ModestMailOperation *mail_o static gboolean progressbar_clean (GtkProgressBar *bar); +static gboolean modest_progress_bar_widget_is_pulsating (ModestProgressBarWidget *self); + +static void modest_progress_bar_widget_set_pulsating_mode (ModestProgressBarWidget *self, + const gchar* msg, + gboolean is_pulsating); + #define XALIGN 0.5 #define YALIGN 0.5 #define XSPACE 1 @@ -65,6 +73,8 @@ static gboolean progressbar_clean (GtkProgressBar *bar); #define LOWER 0 #define UPPER 150 +#define MODEST_PROGRESS_BAR_PULSE_INTERVAL 125 + /* list my signals */ /* enum { */ /* LAST_SIGNAL */ @@ -78,10 +88,11 @@ struct _ObservableData { typedef struct _ModestProgressBarWidgetPrivate ModestProgressBarWidgetPrivate; struct _ModestProgressBarWidgetPrivate { - GSList *observables; - ModestMailOperation *current; - + GSList *observables; + ModestMailOperation *current; + guint count; GtkWidget *progress_bar; + guint pulsating_timeout; }; #define MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_PROGRESS_BAR_WIDGET, \ @@ -90,9 +101,6 @@ struct _ModestProgressBarWidgetPrivate { /* globals */ static GtkContainerClass *parent_class = NULL; -/* Flag to show or not show Recv cancellation banner */ -static gboolean f_receivingOngoing = FALSE; - /* uncomment the following if you have defined any signals */ /* static guint signals[LAST_SIGNAL] = {0}; */ @@ -104,6 +112,7 @@ modest_progress_object_init (gpointer g, gpointer iface_data) klass->add_operation_func = modest_progress_bar_add_operation; klass->remove_operation_func = modest_progress_bar_remove_operation; klass->cancel_current_operation_func = modest_progress_bar_cancel_current_operation; + klass->cancel_all_operations_func = modest_progress_bar_cancel_all_operations; klass->num_pending_operations_func = modest_progress_bar_num_pending_operations; } @@ -153,16 +162,6 @@ modest_progress_bar_widget_class_init (ModestProgressBarWidgetClass *klass) gobject_class->finalize = modest_progress_bar_widget_finalize; g_type_class_add_private (gobject_class, sizeof(ModestProgressBarWidgetPrivate)); - - /* signal definitions go here, e.g.: */ -/* signals[DATA_CHANGED_SIGNAL] = */ -/* g_signal_new ("data_changed", */ -/* G_TYPE_FROM_CLASS (klass), */ -/* G_SIGNAL_RUN_FIRST, */ -/* G_STRUCT_OFFSET(ModestProgressBarWidgetClass, data_changed), */ -/* NULL, NULL, */ -/* g_cclosure_marshal_VOID__VOID, */ -/* G_TYPE_NONE, 0); */ } static void @@ -175,7 +174,7 @@ modest_progress_bar_widget_init (ModestProgressBarWidget *self) GtkAdjustment *adj; priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE(self); - + /* Alignment */ align = gtk_alignment_new(XALIGN, YALIGN, XSPACE, YSPACE); @@ -186,6 +185,8 @@ modest_progress_bar_widget_init (ModestProgressBarWidget *self) req.height = 64; gtk_progress_set_text_alignment (GTK_PROGRESS (priv->progress_bar), 0, 0.5); gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (priv->progress_bar), PANGO_ELLIPSIZE_END); + gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (priv->progress_bar), 0.25); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), " "); gtk_widget_size_request (priv->progress_bar, &req); gtk_container_add (GTK_CONTAINER (align), priv->progress_bar); gtk_widget_size_request (align, &req); @@ -193,6 +194,8 @@ modest_progress_bar_widget_init (ModestProgressBarWidget *self) /* Add progress bar widget */ gtk_box_pack_start (GTK_BOX(self), align, TRUE, TRUE, 0); gtk_widget_show_all (GTK_WIDGET(self)); + + priv->pulsating_timeout = 0; } static void @@ -213,6 +216,10 @@ modest_progress_bar_widget_finalize (GObject *obj) g_slist_free (priv->observables); priv->observables = NULL; } + + /* remove timeout */ + if (priv->pulsating_timeout != 0) + g_source_remove (priv->pulsating_timeout); G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -225,27 +232,25 @@ modest_progress_bar_add_operation (ModestProgressObject *self, ModestProgressBarWidget *me = NULL; ObservableData *data = NULL; ModestProgressBarWidgetPrivate *priv = NULL; - ModestMailOperationState *state = NULL; me = MODEST_PROGRESS_BAR_WIDGET (self); priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me); data = g_malloc0 (sizeof (ObservableData)); data->mail_op = g_object_ref (mail_op); - data->signal_handler = g_signal_connect (data->mail_op, + data->signal_handler = g_signal_connect (data->mail_op, "progress-changed", G_CALLBACK (on_progress_changed), me); /* Set curent operation */ - priv->current = mail_op; - - /* Call progress_change handler to initialize progress message */ - state = g_malloc0(sizeof(ModestMailOperationState)); - state->done = 0; - state->total = 0; - state->op_type = modest_mail_operation_get_type_operation (mail_op);; -/* on_progress_changed (mail_op, state, me); */ - g_free(state); + if (priv->current == NULL) { + priv->current = mail_op; + + priv->count = 0; + + /* Call progress_change handler to initialize progress message */ +/* modest_progress_bar_widget_set_undetermined_progress (MODEST_PROGRESS_BAR_WIDGET(self), mail_op); */ + } /* Add operation to obserbable objects list */ priv->observables = g_slist_prepend (priv->observables, data); @@ -262,19 +267,22 @@ compare_observable_data (ObservableData *data1, ObservableData *data2) static void modest_progress_bar_remove_operation (ModestProgressObject *self, - ModestMailOperation *mail_op) + ModestMailOperation *mail_op) { ModestProgressBarWidget *me; ModestProgressBarWidgetPrivate *priv; GSList *link; ObservableData *tmp_data = NULL; + gboolean is_current; me = MODEST_PROGRESS_BAR_WIDGET (self); priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me); + is_current = (priv->current == mail_op); + /* Find item */ tmp_data = g_malloc0 (sizeof (ObservableData)); - tmp_data->mail_op = mail_op; + tmp_data->mail_op = mail_op; link = g_slist_find_custom (priv->observables, tmp_data, (GCompareFunc) compare_observable_data); @@ -291,13 +299,14 @@ modest_progress_bar_remove_operation (ModestProgressObject *self, } /* 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_progress_bar_widget_set_pulsating_mode (me, NULL, FALSE); progressbar_clean (GTK_PROGRESS_BAR (priv->progress_bar)); } @@ -328,17 +337,23 @@ modest_progress_bar_cancel_current_operation (ModestProgressObject *self) if (priv->current == NULL) return; - /* bug 59107: if received canceled we shall show banner */ - if ( f_receivingOngoing ) - { - f_receivingOngoing = FALSE; - modest_platform_information_banner (NULL, NULL, _("emev_ib_ui_pop3_msg_recv_cancel")); - } - modest_mail_operation_cancel (priv->current); } static void +modest_progress_bar_cancel_all_operations (ModestProgressObject *self) +{ + ModestProgressBarWidget *me; + ModestProgressBarWidgetPrivate *priv; + + me = MODEST_PROGRESS_BAR_WIDGET (self); + priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (me); + + /* Cancel all the mail operations */ + modest_mail_operation_queue_cancel_all (modest_runtime_get_mail_operation_queue ()); +} + +static void on_progress_changed (ModestMailOperation *mail_op, ModestMailOperationState *state, ModestProgressBarWidget *self) @@ -346,19 +361,17 @@ on_progress_changed (ModestMailOperation *mail_op, ModestProgressBarWidgetPrivate *priv; gboolean determined = FALSE; - f_receivingOngoing = FALSE; priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self); /* If the mail operation is the currently shown one */ if (priv->current == mail_op) { gchar *msg = NULL; - determined = (state->done > 0 && state->total > 0) && + determined = (state->done > 0 && state->total > 1) && !(state->done == 1 && state->total == 100); switch (state->op_type) { case MODEST_MAIL_OPERATION_TYPE_RECEIVE: - f_receivingOngoing = TRUE; if (determined) msg = g_strdup_printf(_("mcen_me_receiving"), state->done, state->total); @@ -382,9 +395,11 @@ on_progress_changed (ModestMailOperation *mail_op, /* If we have byte information use it */ if ((state->bytes_done != 0) && (state->bytes_total != 0)) - modest_progress_bar_widget_set_progress (self, msg, - state->bytes_done, + modest_progress_bar_widget_set_progress (self, msg, + state->bytes_done, state->bytes_total); + else if ((state->done == 0) && (state->total == 0)) + modest_progress_bar_widget_set_pulsating_mode (self, msg, TRUE); else modest_progress_bar_widget_set_progress (self, msg, state->done, @@ -397,7 +412,7 @@ static gboolean progressbar_clean (GtkProgressBar *bar) { gtk_progress_bar_set_fraction (bar, 0); - gtk_progress_bar_set_text (bar, 0); + gtk_progress_bar_set_text (bar, " "); return FALSE; } @@ -416,29 +431,103 @@ modest_progress_bar_widget_set_progress (ModestProgressBarWidget *self, gint total) { ModestProgressBarWidgetPrivate *priv; - + gboolean determined = FALSE; + g_return_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self)); g_return_if_fail (done <= total); priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self); + priv->count++; + + if (modest_progress_bar_widget_is_pulsating (self)) + modest_progress_bar_widget_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 */ - if ((done == 0 && total == 0) || - (done == 1 && total == 100)) { + 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); + 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:" "); +} + + +void +modest_progress_bar_widget_set_undetermined_progress (ModestProgressBarWidget *self, + ModestMailOperation *mail_op) +{ + ModestMailOperationState *state = NULL; + + state = g_malloc0(sizeof(ModestMailOperationState)); + state->done = 0; + state->total = 0; + state->op_type = modest_mail_operation_get_type_operation (mail_op); + on_progress_changed (mail_op, state, self); + g_free(state); +} + +/* this has to be explicitly removed */ +static gboolean +do_pulse (gpointer data) +{ + ModestProgressBarWidgetPrivate *priv; + + g_return_val_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(data), FALSE); + + priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (data); + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); + return TRUE; +} + +gboolean +modest_progress_bar_widget_is_pulsating (ModestProgressBarWidget *self) +{ + ModestProgressBarWidgetPrivate *priv; + + g_return_val_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self), FALSE); + + priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self); + + return priv->pulsating_timeout != 0; } +void +modest_progress_bar_widget_set_pulsating_mode (ModestProgressBarWidget *self, + const gchar* msg, + gboolean is_pulsating) +{ + ModestProgressBarWidgetPrivate *priv; + + g_return_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self)); + + priv = MODEST_PROGRESS_BAR_WIDGET_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_PROGRESS_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; + } +}