From b5a927b9c8ccfb95d9546c31b6fdcb44596660a9 Mon Sep 17 00:00:00 2001 From: Javier Fernandez Garcia-Boente Date: Thu, 2 Aug 2007 20:21:44 +0000 Subject: [PATCH] * Move tny_folder_sync after remove operation and define it on modest-ui-actions, when all messages have been removed. * Review progress-bar widget to get more information when undetermined data is come back from camel-operation. * Move header_view_refilter operation, defined in folder_monitor_update to main_window, which is an observer of headers view. Sometimes, refilter operation was done before model was updated, causing several crashes. pmo-trunk-r2915 --- src/maemo/modest-main-window.c | 5 +++ src/maemo/modest-progress-bar-widget.c | 35 ++++++++++++++--- src/modest-mail-operation.c | 64 +++++++++++++++++++++++--------- src/modest-ui-actions.c | 35 ++++++++++++++++- src/widgets/modest-header-view.c | 8 ++-- 5 files changed, 119 insertions(+), 28 deletions(-) diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 5dbb687..e0f6896 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -1793,6 +1793,11 @@ _on_msg_count_changed (ModestHeaderView *header_view, printf ("DEBUG: %s: folder_empty=%d\n", __FUNCTION__, folder_empty); +/* Check header removed (hide marked as DELETED headers) */ + if (changed & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS) { + modest_header_view_refilter (MODEST_HEADER_VIEW(priv->header_view)); + } + /* Set contents style of headers view */ if (folder_empty) { modest_main_window_set_contents_style (main_window, diff --git a/src/maemo/modest-progress-bar-widget.c b/src/maemo/modest-progress-bar-widget.c index 638ab31..30c766d 100644 --- a/src/maemo/modest-progress-bar-widget.c +++ b/src/maemo/modest-progress-bar-widget.c @@ -82,6 +82,7 @@ struct _ModestProgressBarWidgetPrivate { GSList *observables; ModestMailOperation *current; + guint count; GtkWidget *progress_bar; }; #define MODEST_PROGRESS_BAR_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -185,6 +186,7 @@ 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_widget_size_request (priv->progress_bar, &req); gtk_container_add (GTK_CONTAINER (align), priv->progress_bar); gtk_widget_size_request (align, &req); @@ -239,6 +241,8 @@ modest_progress_bar_add_operation (ModestProgressObject *self, if (priv->current == NULL) { priv->current = mail_op; + priv->count = 0; + /* Call progress_change handler to initialize progress message */ state = g_malloc0(sizeof(ModestMailOperationState)); state->done = 0; @@ -436,28 +440,47 @@ 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++; + /* 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 ((done == 0 && total == 0) || */ +/* (done == 1 && total == 100)) { */ + if (!determined) { + gtk_progress_bar_set_bar_style (GTK_PROGRESS_BAR (priv->progress_bar), /* Deprecated */ + GTK_PROGRESS_CONTINUOUS); gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress_bar)); + printf ("debug: %s:\n undetermined progress (%i) changed (%i/%i) : %i\n", __FUNCTION__, + (int) priv->progress_bar, + done, + total, + priv->count); } 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); + printf ("debug: %s:\n determined progress (%i) changed (%i/%i) : %i\n", __FUNCTION__, + (int) priv->progress_bar, + done, + total, + priv->count); + } + /* Set text */ gtk_progress_bar_set_text (GTK_PROGRESS_BAR (priv->progress_bar), message); } diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 6c31cf2..f904a19 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -130,6 +130,7 @@ typedef struct _XFerMsgAsyncHelper TnyList *headers; TnyFolder *dest_folder; XferMsgsAsynUserCallback user_callback; + gboolean delete; gpointer user_data; } XFerMsgAsyncHelper; @@ -2302,20 +2303,23 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, TnyHeader *header, priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; - + /* remove message from folder */ tny_folder_remove_msg (folder, header, &(priv->error)); - if (!priv->error) { - tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); - tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); - - if (TNY_IS_CAMEL_IMAP_FOLDER (folder)) - tny_folder_sync(folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */ - else if (TNY_IS_CAMEL_POP_FOLDER (folder)) - tny_folder_sync(folder, TRUE, &(priv->error)); /* TRUE --> expunge */ - else - /* lcoal folders */ - tny_folder_sync(folder, TRUE, &(priv->error)); /* TRUE --> expunge */ - } +/* if (!priv->error) { */ +/* tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); */ +/* tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); */ + +/* if (TNY_IS_CAMEL_IMAP_FOLDER (folder)) */ +/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* FALSE --> don't expunge *\/ */ +/* /\* tny_folder_sync (folder, FALSE, &(priv->error)); /\\* FALSE --> don't expunge *\\/ *\/ */ +/* else if (TNY_IS_CAMEL_POP_FOLDER (folder)) */ +/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* TRUE --> dont expunge *\/ */ +/* /\* tny_folder_sync (folder, TRUE, &(priv->error)); /\\* TRUE --> expunge *\\/ *\/ */ +/* else */ +/* /\* local folders *\/ */ +/* tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /\* TRUE --> expunge *\/ */ +/* /\* tny_folder_sync (folder, TRUE, &(priv->error)); /\\* TRUE --> expunge *\\/ *\/ */ +/* } */ /* Set status */ @@ -2372,6 +2376,8 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer XFerMsgAsyncHelper *helper; ModestMailOperation *self; ModestMailOperationPrivate *priv; + TnyIterator *iter = NULL; + TnyHeader *header = NULL; helper = (XFerMsgAsyncHelper *) user_data; self = helper->mail_op; @@ -2393,6 +2399,23 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; } + + /* Mark headers as deleted and seen */ + if ((helper->delete) && + (priv->status == MODEST_MAIL_OPERATION_STATUS_SUCCESS)) { + iter = tny_list_create_iterator (helper->headers); + while (!tny_iterator_is_done (iter)) { + header = TNY_HEADER (tny_iterator_get_current (iter)); + tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); + tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); + g_object_unref (header); + + tny_iterator_next (iter); + } + + } + + /* Notify about operation end */ modest_mail_operation_notify_end (self); @@ -2404,11 +2427,17 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer } /* Free */ - g_object_unref (helper->headers); - g_object_unref (helper->dest_folder); - g_object_unref (helper->mail_op); + if (helper->headers) + g_object_unref (helper->headers); + if (helper->dest_folder) + g_object_unref (helper->dest_folder); + if (helper->mail_op) + g_object_unref (helper->mail_op); + if (folder) + g_object_unref (folder); + if (iter) + g_object_unref (iter); g_slice_free (XFerMsgAsyncHelper, helper); - g_object_unref (folder); } @@ -2488,6 +2517,7 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, helper->headers = g_object_ref(headers); helper->user_callback = user_callback; helper->user_data = user_data; + helper->delete = delete_original; /* Get account and set it into mail_operation */ priv->account = modest_tny_folder_get_account (src_folder); diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index e0cb74f..aed5f2c 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -45,6 +45,9 @@ #include "modest-tny-platform-factory.h" #include "modest-platform.h" #include +#include +#include +#include #ifdef MODEST_PLATFORM_MAEMO #include "maemo/modest-osso-state-saving.h" @@ -322,7 +325,7 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) * or from the message view window: */ header_list = get_selected_headers (win); if (!header_list) return; - + /* Check if any of the headers are already opened, or in the process of being opened */ if (MODEST_IS_MAIN_WINDOW (win)) { gboolean found; @@ -383,6 +386,8 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) GList *sel_list = NULL, *tmp = NULL; GtkTreeRowReference *row_reference = NULL; GtkTreePath *next_path = NULL; + TnyFolder *folder = NULL; + GError *err = NULL; /* Find last selected row */ if (MODEST_IS_MAIN_WINDOW (win)) { @@ -426,6 +431,30 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win) gtk_tree_row_reference_free (row_reference); } + /* Get folder from first header and sync it */ + iter = tny_list_create_iterator (header_list); + header = TNY_HEADER (tny_iterator_get_current (iter)); + folder = tny_header_get_folder (header); + if (TNY_IS_CAMEL_IMAP_FOLDER (folder)) +/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* FALSE --> don't expunge *\/ */ + tny_folder_sync (folder, FALSE, &err); /* FALSE --> don't expunge */ +/* else if (TNY_IS_CAMEL_POP_FOLDER (folder)) */ +/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* TRUE --> dont expunge *\/ */ +/* tny_folder_sync (folder, TRUE, &err); /\* TRUE --> expunge *\/ */ + else + /* local folders */ +/* tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /\* TRUE --> expunge *\/ */ + tny_folder_sync (folder, TRUE, &err); /* TRUE --> expunge */ + + if (err != NULL) { + printf ("DEBUG: %s: Error: code=%d, text=%s\n", __FUNCTION__, err->code, err->message); + g_error_free(err); + } + + g_object_unref (header); + g_object_unref (iter); + g_object_unref (folder); + /* Update toolbar dimming state */ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window)); @@ -4054,8 +4083,12 @@ modest_ui_actions_on_email_menu_activated (GtkAction *action, { g_return_if_fail (MODEST_IS_WINDOW (window)); + /* Init dimming rules init data */ + /* Update dimmed */ modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules"); + + /* Free dimming ruls init data */ } void diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index bee32a6..b95dc48 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -1521,10 +1521,10 @@ folder_monitor_update (TnyFolderObserver *self, if (tny_folder_change_get_folder (change) != priv->folder) return; - /* Check header removed (hide marked as DELETED headers) */ - if (changed & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS) { - modest_header_view_refilter (MODEST_HEADER_VIEW(self)); - } + /* Check header removed (hide marked as DELETED headers) */ +/* if (changed & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS) { */ +/* modest_header_view_refilter (MODEST_HEADER_VIEW(self)); */ +/* } */ /* Check folder count */ if ((changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS) || -- 1.7.9.5