X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-progress-bar-widget.c;h=9459be1c668efb7a35784911481a4938a0b7b4c2;hb=68945e42768533308e3b94f0dc046ef722e56115;hp=202ba662cbeaf1af47422990c1dd6ea192146f0e;hpb=0fe9e223f49814fd1d68f054c496fab5ad7ec183;p=modest diff --git a/src/maemo/modest-progress-bar-widget.c b/src/maemo/modest-progress-bar-widget.c index 202ba66..9459be1 100644 --- a/src/maemo/modest-progress-bar-widget.c +++ b/src/maemo/modest-progress-bar-widget.c @@ -51,6 +51,7 @@ static guint modest_progress_bar_num_pending_operations (ModestProgressObject *self); static void on_progress_changed (ModestMailOperation *mail_op, + ModestMailOperationState *state, ModestProgressBarWidget *self); static gboolean progressbar_clean (GtkProgressBar *bar); @@ -183,20 +184,14 @@ modest_progress_bar_widget_init (ModestProgressBarWidget *self) gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (priv->progress_bar), PANGO_ELLIPSIZE_END); gtk_widget_size_request (priv->progress_bar, &req); gtk_container_add (GTK_CONTAINER (align), priv->progress_bar); - + gtk_widget_size_request (align, &req); + /* Add progress bar widget */ gtk_box_pack_start (GTK_BOX(self), align, TRUE, TRUE, 0); gtk_widget_show_all (GTK_WIDGET(self)); } static void -destroy_observable_data (ObservableData *data) -{ - g_signal_handler_disconnect (data->mail_op, data->signal_handler); - g_object_unref (data->mail_op); -} - -static void modest_progress_bar_widget_finalize (GObject *obj) { ModestProgressBarWidgetPrivate *priv; @@ -206,8 +201,10 @@ modest_progress_bar_widget_finalize (GObject *obj) GSList *tmp; for (tmp = priv->observables; tmp; tmp = g_slist_next (tmp)) { - destroy_observable_data ((ObservableData *) tmp->data); - g_free (tmp->data); + ObservableData *ob_data = tmp->data; + g_signal_handler_disconnect (ob_data->mail_op, ob_data->signal_handler); + g_object_unref (ob_data->mail_op); + g_free (ob_data); } g_slist_free (priv->observables); priv->observables = NULL; @@ -234,7 +231,6 @@ modest_progress_bar_add_operation (ModestProgressObject *self, "progress-changed", G_CALLBACK (on_progress_changed), me); - if (priv->observables == NULL) { priv->current = mail_op; } @@ -267,15 +263,20 @@ modest_progress_bar_remove_operation (ModestProgressObject *self, /* Find item */ tmp_data = g_malloc0 (sizeof (ObservableData)); - tmp_data->mail_op = g_object_ref (mail_op); + tmp_data->mail_op = mail_op; link = g_slist_find_custom (priv->observables, 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 */ @@ -320,45 +321,53 @@ modest_progress_bar_cancel_current_operation (ModestProgressObject *self) } static void on_progress_changed (ModestMailOperation *mail_op, + ModestMailOperationState *state, ModestProgressBarWidget *self) { ModestProgressBarWidgetPrivate *priv; gboolean determined = FALSE; - ModestMailOperationId id; 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; - gint done = modest_mail_operation_get_task_done (mail_op); - gint total = modest_mail_operation_get_task_total (mail_op); - - determined = (done > 0 && total > 0); - id = modest_mail_operation_get_id (mail_op); + + determined = (state->done > 0 && state->total > 0) && + !(state->done == 1 && state->total == 100); - switch (id) { - case MODEST_MAIL_OPERATION_ID_RECEIVE: + switch (state->op_type) { + case MODEST_MAIL_OPERATION_TYPE_RECEIVE: if (determined) - msg = g_strdup_printf(_("mcen_me_receiving"), done, total); + msg = g_strdup_printf(_("mcen_me_receiving"), + state->done, state->total); else - msg = g_strdup(_("mail_me_receiving")); + msg = g_strdup(_("mail_me_receiving")); break; - case MODEST_MAIL_OPERATION_ID_SEND: + case MODEST_MAIL_OPERATION_TYPE_SEND: if (determined) - msg = g_strdup_printf(_("mcen_me_sending"), done, total); + msg = g_strdup_printf(_("mcen_me_sending"), state->done, + state->total); else msg = g_strdup(_("mail_me_sending")); break; - case MODEST_MAIL_OPERATION_ID_OPEN: + case MODEST_MAIL_OPERATION_TYPE_OPEN: msg = g_strdup(_("mail_me_opening")); break; default: msg = g_strdup(""); } - modest_progress_bar_widget_set_progress (self, msg, done, total); + /* 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, + state->bytes_total); + else + modest_progress_bar_widget_set_progress (self, msg, + state->done, + state->total); g_free (msg); } } @@ -380,17 +389,20 @@ modest_progress_bar_widget_new () void -modest_progress_bar_widget_set_progress (ModestProgressBarWidget *self, - const gchar *message, - gint done, - gint total) +modest_progress_bar_widget_set_progress (ModestProgressBarWidget *self, + const gchar *message, + gint done, + gint total) { ModestProgressBarWidgetPrivate *priv; + g_return_if_fail (MODEST_IS_PROGRESS_BAR_WIDGET(self)); + g_return_if_fail (done <= total); + priv = MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE (self); /* Set progress */ - if (total != 0) + if (total != 100) /* FIXME: tinymail send 1/100 when it doesn't know better.. */ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->progress_bar), (gdouble)done/(gdouble)total); else