From: Dirk-Jan C. Binnema Date: Fri, 16 Jun 2006 13:41:42 +0000 (+0000) Subject: * add progress indication. X-Git-Tag: git_migration_finished~4582 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=390b8f31ef0221c75a141d3e5e52efe6d09c6e32 * add progress indication. - ModestTnyHeaderTree now emits a signal 'status_update' whenever the headers tree is being updated (and when that is over) - a new marshaller is created (marshall.list) for this - ModestUI connects to the signal, and updates the status bar... - ...which is added to the UI pmo-trunk-r274 --- diff --git a/src/gtk-glade/modest-ui-main-view.c b/src/gtk-glade/modest-ui-main-view.c index 550c6c0..45a5a49 100644 --- a/src/gtk-glade/modest-ui-main-view.c +++ b/src/gtk-glade/modest-ui-main-view.c @@ -63,6 +63,10 @@ static void on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data static void on_forward_attached_activated (GtkWidget *widget, gpointer user_data); +static void on_headers_status_update (GtkWidget *header_view, const gchar *msg, gint status, + gpointer user_data); +static void on_status_cleanup (gpointer user_data); + static void register_toolbar_callbacks (ModestUI *modest_ui); @@ -97,14 +101,14 @@ modest_ui_show_main_window (ModestUI *modest_ui) GtkWidget *open_item; GtkWidget *view_attachments_item; GtkWidget *new_account_item; - + GtkWidget *folder_view_holder, *header_view_holder, *mail_paned; gboolean show_attachments_inline; priv = MODEST_UI_GET_PRIVATE(modest_ui); - + height = modest_conf_get_int (priv->modest_conf, MODEST_CONF_MAIN_WINDOW_HEIGHT,NULL); width = modest_conf_get_int (priv->modest_conf, @@ -156,6 +160,9 @@ modest_ui_show_main_window (ModestUI *modest_ui) G_CALLBACK(on_message_clicked), modest_ui); + g_signal_connect (header_view, "status_update", + G_CALLBACK(on_headers_status_update), modest_ui); + g_signal_connect (header_view, "row-activated", G_CALLBACK(on_message_activated), modest_ui); @@ -540,7 +547,8 @@ on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data) if (priv->header_view && priv->current_folder) { - modest_tny_header_tree_view_set_folder (priv->header_view, priv->current_folder); + modest_tny_header_tree_view_set_folder (MODEST_TNY_HEADER_TREE_VIEW(priv->header_view), + priv->current_folder); gtk_widget_queue_draw (priv->header_view); } } @@ -551,3 +559,42 @@ on_forward_attached_activated (GtkWidget *widget, gpointer user_data) quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD_ATTACHED); } + +static void +on_headers_status_update (GtkWidget *header_view, const gchar *msg, gint status_id, + gpointer user_data) +{ + ModestUIPrivate *priv; + ModestUI *modest_ui; + + GtkStatusbar *status_bar; + GtkProgressBar *progress_bar; + GtkWidget *status_box; + + modest_ui = MODEST_UI (user_data); + priv = MODEST_UI_GET_PRIVATE(modest_ui); + + progress_bar = GTK_PROGRESS_BAR(glade_xml_get_widget + (priv->glade_xml, "progressbar")); + status_bar = GTK_STATUSBAR (glade_xml_get_widget + (priv->glade_xml, "statusbar")); + + + status_box = glade_xml_get_widget (priv->glade_xml, "statusbox"); + + + if (!status_bar || !progress_bar) { + g_warning ("failed to find status / progress bar"); + return; + } + + if (msg && status_id) { + gtk_widget_show (status_box); + gtk_progress_bar_pulse (progress_bar); + gtk_statusbar_push (status_bar, status_id, msg); + } else { + gtk_widget_hide (status_box); + gtk_statusbar_pop (status_bar, status_id); + } +} + diff --git a/src/gtk-glade/modest.glade b/src/gtk-glade/modest.glade index beb629a..fc75f04 100644 --- a/src/gtk-glade/modest.glade +++ b/src/gtk-glade/modest.glade @@ -811,6 +811,45 @@ True + + + + True + 0 + + + + True + GTK_PROGRESS_LEFT_TO_RIGHT + 0 + 0.10000000149 + PANGO_ELLIPSIZE_NONE + + + 0 + False + True + + + + + + True + True + + + 0 + False + True + + + + + 0 + False + False + + diff --git a/src/marshall.list b/src/marshall.list index b0935aa..07e7cbd 100644 --- a/src/marshall.list +++ b/src/marshall.list @@ -1,2 +1,3 @@ VOID:POINTER,POINTER VOID:POINTER,POINTER,POINTER +VOID:STRING,INT diff --git a/src/modest-tny-header-tree-view.c b/src/modest-tny-header-tree-view.c index 19561d4..8ef2a85 100644 --- a/src/modest-tny-header-tree-view.c +++ b/src/modest-tny-header-tree-view.c @@ -5,6 +5,7 @@ #include "modest-tny-header-tree-view.h" #include #include +#include "modest-marshal.h" #include #include "modest-icon-factory.h" @@ -16,9 +17,11 @@ static void modest_tny_header_tree_view_finalize (GObject *obj); static void selection_changed (GtkTreeSelection *sel, gpointer user_data); static void column_clicked (GtkTreeViewColumn *treeviewcolumn, gpointer user_data); +static gboolean refresh_folder_finish_status_update (gpointer user_data); enum { MESSAGE_SELECTED_SIGNAL, + STATUS_UPDATE_SIGNAL, LAST_SIGNAL }; @@ -28,7 +31,8 @@ struct _ModestTnyHeaderTreeViewPrivate { TnyMsgFolderIface *tny_msg_folder; TnyListIface *headers; - GSList *columns; + gint status_id; + GSList *columns; ModestTnyHeaderTreeViewStyle style; }; @@ -82,7 +86,16 @@ modest_tny_header_tree_view_class_init (ModestTnyHeaderTreeViewClass *klass) G_STRUCT_OFFSET (ModestTnyHeaderTreeViewClass,message_selected), NULL, NULL, g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); + G_TYPE_NONE, 1, G_TYPE_POINTER); + + signals[STATUS_UPDATE_SIGNAL] = + g_signal_new ("status_update", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ModestTnyHeaderTreeViewClass,message_selected), + NULL, NULL, + modest_marshal_VOID__STRING_INT, + G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); } @@ -388,7 +401,10 @@ init_columns (ModestTnyHeaderTreeView *obj) static void modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj) { - + ModestTnyHeaderTreeViewPrivate *priv; + priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj); + + priv->status_id = 0; } static void @@ -438,7 +454,7 @@ modest_tny_header_tree_view_new (TnyMsgFolderIface *folder, sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); g_signal_connect (sel, "changed", G_CALLBACK(selection_changed), self); - + return GTK_WIDGET(self); } @@ -647,19 +663,26 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, } - -gboolean -modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self, - TnyMsgFolderIface *folder) +static void +refresh_folder (TnyMsgFolderIface *folder, gboolean cancelled, + gpointer user_data) { GtkTreeModel *oldsortable, *sortable; + ModestTnyHeaderTreeView *self = + MODEST_TNY_HEADER_TREE_VIEW(user_data); ModestTnyHeaderTreeViewPrivate *priv; - - g_return_val_if_fail (self, FALSE); + g_return_if_fail (self); + + if (cancelled) + return; + priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self); + + if (!folder) /* when there is no folder */ + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), FALSE); - if (folder) { + else { /* it's a new one or a refresh */ GSList *col; #warning Looks like a memory leak. @@ -668,7 +691,7 @@ modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self, tny_msg_folder_iface_get_headers (folder, priv->headers, FALSE); tny_msg_header_list_model_set_folder (TNY_MSG_HEADER_LIST_MODEL(priv->headers), - folder, TRUE); + folder, TRUE); /* async */ oldsortable = gtk_tree_view_get_model(GTK_TREE_VIEW (self)); if (oldsortable && GTK_IS_TREE_MODEL_SORT(oldsortable)) { @@ -695,13 +718,71 @@ modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self, gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(self), TRUE); /* no need to unref sortable */ - } else /* when there is no folder */ + } +} + + +static void +refresh_folder_status_update (TnyMsgFolderIface *folder, const gchar *msg, + gint status_id, gpointer user_data) +{ + ModestTnyHeaderTreeView *self; + ModestTnyHeaderTreeViewPrivate *priv; + + self = MODEST_TNY_HEADER_TREE_VIEW (user_data); + priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self); + + g_signal_emit (G_OBJECT(self), + signals[STATUS_UPDATE_SIGNAL], 0, + msg, status_id); + if (msg) + g_timeout_add (750, + (GSourceFunc)refresh_folder_finish_status_update, + self); + + priv->status_id = status_id; +} + + +static gboolean +refresh_folder_finish_status_update (gpointer user_data) +{ + ModestTnyHeaderTreeView *self; + ModestTnyHeaderTreeViewPrivate *priv; + + self = MODEST_TNY_HEADER_TREE_VIEW (user_data); + priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self); + + if (priv->status_id == 0) + return FALSE; + + refresh_folder_status_update (NULL, NULL, priv->status_id, + user_data); + priv->status_id = 0; + + return FALSE; +} + + +gboolean +modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self, + TnyMsgFolderIface *folder) +{ + + if (!folder) /* when there is no folder */ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), FALSE); - + + else { /* it's a new one or a refresh */ + tny_msg_folder_iface_refresh_async (folder, + refresh_folder, + refresh_folder_status_update, + self); + } return TRUE; } + static void selection_changed (GtkTreeSelection *sel, gpointer user_data) { diff --git a/src/modest-tny-header-tree-view.h b/src/modest-tny-header-tree-view.h index 987ab8b..5fee5cb 100644 --- a/src/modest-tny-header-tree-view.h +++ b/src/modest-tny-header-tree-view.h @@ -35,6 +35,13 @@ struct _ModestTnyHeaderTreeViewClass { void (*message_selected) (ModestTnyHeaderTreeView* self, TnyMsgIface *msg, gpointer user_data); + + /* msg == NULL implies that the operation is finished, ie. + * the progress indictation can be hidden */ + void (*status_update) (ModestTnyHeaderTreeView* self, + const gchar* msg, + gint status, + gpointer user_data); };