From cac404b01351e3959adb4f4e577da0106ddb37ee Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Sun, 10 Dec 2006 18:09:47 +0000 Subject: [PATCH] * modest-header-view.[ch]: - refactoring (move display_address -> text_utils) - add modest_header_view_get_folder * modest-folder-view.[ch] - change signal from 'folder_selected' -> 'folder_selected_changed', so we get also a signal for the folder that is unselected, and can save it's settings etc. - make modest_folder_guess_folder_type a public and *class* function * modest-toolbar.c: - small cleanups pmo-trunk-r531 --- src/widgets/modest-folder-view.c | 103 +++++++++++++++++++++----------------- src/widgets/modest-folder-view.h | 38 +++++++++++--- src/widgets/modest-header-view.c | 65 +++++++++--------------- src/widgets/modest-header-view.h | 16 ++++-- src/widgets/modest-toolbar.c | 25 ++++++--- 5 files changed, 143 insertions(+), 104 deletions(-) diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index 87e0b03..f88c0b3 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -62,7 +63,7 @@ static const gchar *get_account_name_from_folder (GtkTreeModel *model, Gt static void modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self); enum { - FOLDER_SELECTED_SIGNAL, + FOLDER_SELECTION_CHANGED_SIGNAL, LAST_SIGNAL }; @@ -128,15 +129,15 @@ modest_folder_view_class_init (ModestFolderViewClass *klass) g_type_class_add_private (gobject_class, sizeof(ModestFolderViewPrivate)); - signals[FOLDER_SELECTED_SIGNAL] = - g_signal_new ("folder_selected", + signals[FOLDER_SELECTION_CHANGED_SIGNAL] = + g_signal_new ("folder_selection_changed", G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (ModestFolderViewClass, - folder_selected), + folder_selection_changed), NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); + modest_marshal_VOID__POINTER_BOOLEAN, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_BOOLEAN); } @@ -166,22 +167,16 @@ text_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, g_free (fname); } -/* FIXME: move these to TnyMail */ -enum { - TNY_FOLDER_TYPE_NOTES = TNY_FOLDER_TYPE_ROOT + 1, /* urgh */ - TNY_FOLDER_TYPE_DRAFTS, - TNY_FOLDER_TYPE_CONTACTS, - TNY_FOLDER_TYPE_CALENDAR -}; - +/* guess the folder type based on the name, or -1 in case of error */ static TnyFolderType -guess_folder_type (const gchar* name) +guess_type_from_name (const gchar* name) { - TnyFolderType type; + gint type; gchar *folder; - - g_return_val_if_fail (name, TNY_FOLDER_TYPE_NORMAL); + + if (!name) + return -1; type = TNY_FOLDER_TYPE_NORMAL; folder = g_utf8_strdown (name, strlen(name)); @@ -221,6 +216,22 @@ guess_folder_type (const gchar* name) } + +TnyFolderType +modest_folder_view_guess_folder_type (TnyFolder *folder) +{ + TnyFolderType type; + + g_return_val_if_fail (folder, -1); + + type = tny_folder_get_folder_type (folder); + if (type == TNY_FOLDER_TYPE_NORMAL) + type = guess_type_from_name (tny_folder_get_name (folder)); + + return type; +} + + static void icon_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) @@ -239,7 +250,7 @@ icon_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, rendobj = G_OBJECT(renderer); if (type == TNY_FOLDER_TYPE_NORMAL) - type = guess_folder_type (fname); + type = guess_type_from_name (fname); if (fname) g_free (fname); @@ -500,8 +511,8 @@ update_model_empty (ModestFolderView *self) priv->view_is_empty = TRUE; - g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTED_SIGNAL], 0, - NULL); + g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, + NULL, TRUE); return TRUE; } @@ -582,8 +593,7 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) GtkTreeIter iter; ModestFolderView *tree_view; ModestFolderViewPrivate *priv; - gint type; - const gchar *account_name; + gint type; g_return_if_fail (sel); g_return_if_fail (user_data); @@ -591,38 +601,35 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) priv = MODEST_FOLDER_VIEW_GET_PRIVATE(user_data); priv->cur_selection = sel; - /* is_empty means that there is only the 'empty' item */ if (priv->view_is_empty) return; - + /* folder was _un_selected if true */ if (!gtk_tree_selection_get_selected (sel, &model, &iter)) { - priv->cur_folder = NULL; /* FIXME: need this? */ - return; - } - + priv->cur_folder = NULL; /* FIXME: need this? */ + return; + } + tree_view = MODEST_FOLDER_VIEW (user_data); - gtk_tree_model_get (model, &iter, TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type, TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder, -1); - - if (type == TNY_FOLDER_TYPE_ROOT) { - account_name = tny_account_get_name (TNY_ACCOUNT (folder)); - } else { - if (priv->cur_folder) - tny_folder_expunge (priv->cur_folder, NULL); /* FIXME */ - priv->cur_folder = folder; - - /* FIXME: this is ugly */ - account_name = get_account_name_from_folder (model, iter); - - g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTED_SIGNAL], 0, - folder); - } - + + if (type == TNY_FOLDER_TYPE_ROOT) + return; + + /* emit 2 signals: one for the unselection of the old one, + * and one for the selection of the new on */ + g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, + priv->cur_folder, FALSE); + g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, + folder, TRUE); + + if (priv->cur_folder) + tny_folder_expunge (priv->cur_folder, NULL); /* FIXME */ + priv->cur_folder = folder; } static void @@ -648,12 +655,14 @@ modest_folder_view_update_model (ModestFolderView *self, TnyAccountStore *accoun g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE); retval = update_model (self, MODEST_TNY_ACCOUNT_STORE(account_store)); /* ugly */ - g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTED_SIGNAL], - 0, NULL); + g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL], + 0, NULL, TRUE); return retval; } + +/* ugly */ static const gchar * get_account_name_from_folder (GtkTreeModel *model, GtkTreeIter iter) { diff --git a/src/widgets/modest-folder-view.h b/src/widgets/modest-folder-view.h index fc73383..5cffc0f 100644 --- a/src/widgets/modest-folder-view.h +++ b/src/widgets/modest-folder-view.h @@ -30,9 +30,10 @@ #ifndef __MODEST_FOLDER_VIEW_H__ #define __MODEST_FOLDER_VIEW_H__ +#include #include #include -#include +#include G_BEGIN_DECLS @@ -55,16 +56,28 @@ struct _ModestFolderView { struct _ModestFolderViewClass { GtkTreeViewClass parent_class; - /* emitted when a folder is clicked */ - void (*folder_selected) (ModestFolderView* self, - TnyFolder *folder, - gpointer user_data); - + /* emitted when a folder is selected or unselected */ + void (*folder_selection_changed) (ModestFolderView* self, + TnyFolder *folder, + gboolean selected, + gpointer user_data); + gboolean (*update_model) (ModestFolderView *self, TnyAccountStore *account_store); }; + +/* FIXME: move these to TnyMail */ +enum { + + TNY_FOLDER_TYPE_NOTES = TNY_FOLDER_TYPE_ROOT + 1, /* urgh */ + TNY_FOLDER_TYPE_DRAFTS, + TNY_FOLDER_TYPE_CONTACTS, + TNY_FOLDER_TYPE_CALENDAR +}; + + /** * modest_folder_view_get_type: * @@ -112,7 +125,20 @@ void modest_folder_view_set_title (ModestFolderView *self, const gchar *title); gboolean modest_folder_view_is_empty (ModestFolderView *self); +/** + * modest_folder_view_guess_folder_type: + * @folder: a tnymail folder + * + * guess the type of the folder, this is a class method so it does not need + * an ModestFolderView instance + * + * Returns: the folder type, or -1 in case of error + */ +TnyFolderType modest_folder_view_guess_folder_type (TnyFolder *folder); + + +/* FIXME: this is ugly */ const gchar* modest_folder_view_get_selected_account (ModestFolderView *self); G_END_DECLS diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index af42d0a..09f78c4 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -56,12 +56,11 @@ enum { typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate; struct _ModestHeaderViewPrivate { - TnyFolder *tny_folder; + TnyFolder *folder; TnyList *headers; GMutex *lock; ModestHeaderViewStyle style; - - gulong sig1; + gulong sig1; }; #define MODEST_HEADER_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -190,35 +189,6 @@ header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, } - -/* try to make a shorter display address; changes its argument in-place */ -static gchar* -display_address (gchar *address) -{ - gchar *cursor; - - if (!address) - return NULL; - - /* simplistic --> remove from display name */ - cursor = g_strstr_len (address, strlen(address), "<"); - if (cursor) - cursor[0]='\0'; - - /* simplistic --> remove (bla bla) from display name */ - cursor = g_strstr_len (address, strlen(address), "("); - if (cursor) - cursor[0]='\0'; - - /* FIXME */ - if (!g_utf8_validate (address, -1, NULL)) - g_printerr ("modest: invalid: '%s'", address); - - return address; -} - - - static void sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gboolean is_sender) @@ -239,7 +209,7 @@ sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *rendere g_object_set (G_OBJECT(renderer), "text", - display_address (address), + modest_text_utils_display_address (address), "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400 : 800, "style", @@ -300,7 +270,7 @@ compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer rendobj = G_OBJECT(renderer); header = g_strdup_printf ("%s %s\n%s", - display_address (from), + modest_text_utils_display_address (from), display_date(date), subject); @@ -508,10 +478,10 @@ modest_header_view_finalize (GObject *obj) priv->lock = NULL; } - priv->headers = NULL; - priv->tny_folder = NULL; + priv->headers = NULL; + priv->folder = NULL; - //G_OBJECT_CLASS(parent_class)->finalize (obj); + G_OBJECT_CLASS(parent_class)->finalize (obj); } GtkWidget* @@ -821,6 +791,9 @@ on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err, self = MODEST_HEADER_VIEW(user_data); priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); + + g_assert (folder == priv->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 */ @@ -874,6 +847,15 @@ on_refresh_folder_status_update (TnyFolder *folder, const gchar *msg, } +TnyFolder* +modest_header_view_get_folder (ModestHeaderView *self) +{ + ModestHeaderViewPrivate *priv; + priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); + + return priv->folder; +} + gboolean modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) @@ -881,6 +863,8 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) ModestHeaderViewPrivate *priv; priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); + priv->folder = folder; + if (!folder) {/* when there is no folder */ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), FALSE); gtk_tree_view_set_model (GTK_TREE_VIEW (self), NULL); @@ -890,18 +874,16 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) on_refresh_folder_status_update, self); } - + /* no message selected */ g_signal_emit (G_OBJECT(self), signals[MESSAGE_SELECTED_SIGNAL], 0, NULL); - - //g_mutex_unlock (priv->lock); - return TRUE; } + static void on_selection_changed (GtkTreeSelection *sel, gpointer user_data) { @@ -957,4 +939,3 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) /* Free */ /* g_free (folder); */ } - diff --git a/src/widgets/modest-header-view.h b/src/widgets/modest-header-view.h index aaf7dac..a24e6b4 100644 --- a/src/widgets/modest-header-view.h +++ b/src/widgets/modest-header-view.h @@ -66,17 +66,14 @@ typedef enum _ModestHeaderViewColumn { MODEST_HEADER_VIEW_COLUMN_MSGTYPE, MODEST_HEADER_VIEW_COLUMN_ATTACH, MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER, - MODEST_HEADER_VIEW_COLUMN_NUM } ModestHeaderViewColumn; -/* typedef enum _ModestHeaderViewColumn ModestHeaderViewColumn; */ typedef enum _ModestHeaderViewStyle { MODEST_HEADER_VIEW_STYLE_NORMAL, MODEST_HEADER_VIEW_STYLE_COMPACT, MODEST_HEADER_VIEW_STYLE_NUM } ModestHeaderViewStyle; -/* typedef enum _ModestHeaderViewStyle ModestHeaderViewStyle; */ typedef enum _ModestItemType { MODEST_ITEM_TYPE_MESSAGE, @@ -141,6 +138,19 @@ gboolean modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder); + + +/** + * modest_header_view_get_folder: + * @self: a ModestHeaderView instance + * + * get the folder in this ModestHeaderView + * + * Returns: the tny folder instance or NULL if there is none + */ +TnyFolder *modest_header_view_get_folder (ModestHeaderView *self); + + /** * modest_header_view_set_columns: * @self: a ModestHeaderView instance diff --git a/src/widgets/modest-toolbar.c b/src/widgets/modest-toolbar.c index e52506c..a8e07d0 100644 --- a/src/widgets/modest-toolbar.c +++ b/src/widgets/modest-toolbar.c @@ -104,12 +104,24 @@ modest_toolbar_class_init (ModestToolbarClass *klass) static void modest_toolbar_init (ModestToolbar *obj) { + ModestToolbarPrivate *priv; + priv = MODEST_TOOLBAR_GET_PRIVATE(obj); + + priv->tooltips = NULL; } static void modest_toolbar_finalize (GObject *obj) { + ModestToolbarPrivate *priv; + priv = MODEST_TOOLBAR_GET_PRIVATE(obj); + + if (priv->tooltips) { + g_object_ref_sink (G_OBJECT(priv->tooltips)); + priv->tooltips = NULL; + } + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -183,12 +195,12 @@ static gboolean modest_toolbar_set_buttons (ModestToolbar *self, const GSList *buttons) { const GSList *cursor; - GtkTooltips *tooltips; - - g_return_val_if_fail (self, FALSE); + ModestToolbarPrivate *priv; + + priv = MODEST_TOOLBAR_GET_PRIVATE(self); - tooltips = gtk_tooltips_new (); - gtk_tooltips_enable (tooltips); + priv->tooltips = gtk_tooltips_new (); + gtk_tooltips_enable (priv->tooltips); gtk_toolbar_set_tooltips (GTK_TOOLBAR(self), TRUE); cursor = buttons; @@ -218,7 +230,8 @@ modest_toolbar_set_buttons (ModestToolbar *self, const GSList *buttons) g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(on_toolbutton_clicked), self); - gtk_tooltips_set_tip (tooltips, GTK_WIDGET(button),tooltip, NULL); + gtk_tooltips_set_tip (priv->tooltips, GTK_WIDGET(button), + tooltip, NULL); gtk_widget_show_all (GTK_WIDGET(button)); gtk_toolbar_insert (GTK_TOOLBAR(self), button, -1); } -- 1.7.9.5