X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-progress-bar-widget.c;h=8ab228d4f03c6c2aee43079da673f6fcea70bb97;hb=1bdf3f882e8e33b06ffe664d035679254964857d;hp=7dd8a79f08c00ac1da6569cf4b4cace00fe542e3;hpb=b91a22bd12622826f5f4f9c065e7c0870e902c33;p=modest diff --git a/src/maemo/modest-progress-bar-widget.c b/src/maemo/modest-progress-bar-widget.c index 7dd8a79..8ab228d 100644 --- a/src/maemo/modest-progress-bar-widget.c +++ b/src/maemo/modest-progress-bar-widget.c @@ -59,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 @@ -67,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 */ @@ -80,11 +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, \ @@ -177,7 +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.05); + 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); @@ -185,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 @@ -205,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); } @@ -291,6 +306,7 @@ modest_progress_bar_remove_operation (ModestProgressObject *self, priv->current = NULL; /* Refresh the view */ + modest_progress_bar_widget_set_pulsating_mode (me, NULL, FALSE); progressbar_clean (GTK_PROGRESS_BAR (priv->progress_bar)); } @@ -382,6 +398,8 @@ on_progress_changed (ModestMailOperation *mail_op, 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, @@ -394,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; } @@ -420,7 +438,10 @@ modest_progress_bar_widget_set_progress (ModestProgressBarWidget *self, priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self); - priv->count++; + 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 @@ -440,7 +461,8 @@ modest_progress_bar_widget_set_progress (ModestProgressBarWidget *self, } /* 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:" "); } @@ -457,3 +479,55 @@ modest_progress_bar_widget_set_undetermined_progress (ModestProgressBarWidget *s 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; + } +}