From 731439d31b823a63eb2e26ba330fac487f240dc4 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Wed, 31 May 2006 16:27:29 +0000 Subject: [PATCH] * all: - first step of configurable headers in the header view. now, the headers to be shown and their order is a setting on the header view - added support for styles; which we will need for the Maemo-version pmo-trunk-r132 --- src/gtk-glade/modest-ui.c | 19 ++- src/gtk/modest-main-window.c | 19 ++- src/modest-tny-header-tree-view.c | 243 +++++++++++++++++++++++++------------ src/modest-tny-header-tree-view.h | 84 ++++++++++++- 4 files changed, 284 insertions(+), 81 deletions(-) diff --git a/src/gtk-glade/modest-ui.c b/src/gtk-glade/modest-ui.c index acd8793..478e756 100644 --- a/src/gtk-glade/modest-ui.c +++ b/src/gtk-glade/modest-ui.c @@ -628,9 +628,24 @@ on_password_requested (ModestTnyAccountStore *account_store, static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder) { + int i; + GSList *columns = NULL; GtkWidget *header_tree; - - header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder)); + ModestTnyHeaderTreeViewColumn cols[] = { + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE + }; + + for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i) + columns = g_slist_append (columns, GINT_TO_POINTER(cols[i])); + + header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns, + MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL)); + g_slist_free (columns); + if (!header_tree) { g_warning ("could not create header tree"); return NULL; diff --git a/src/gtk/modest-main-window.c b/src/gtk/modest-main-window.c index 1719341..e0a2730 100644 --- a/src/gtk/modest-main-window.c +++ b/src/gtk/modest-main-window.c @@ -261,9 +261,26 @@ modest_main_window_get_ui (ModestTnyFolderTreeView *folder_view, static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder) { +int i; + GSList *columns = NULL; GtkWidget *header_tree; + ModestTnyHeaderTreeViewColumn cols[] = { + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_TO, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SENT_DATE, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH + }; + + for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i) + columns = g_slist_append (columns, GINT_TO_POINTER(cols[i])); + + header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns, + MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL)); + g_slist_free (columns); - header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder)); if (!header_tree) { g_warning ("could not create header tree"); return NULL; diff --git a/src/modest-tny-header-tree-view.c b/src/modest-tny-header-tree-view.c index 4a5509b..d69f38b 100644 --- a/src/modest-tny-header-tree-view.c +++ b/src/modest-tny-header-tree-view.c @@ -20,7 +20,6 @@ enum { LAST_SIGNAL }; - enum { HEADER_ICON_READ = 1, HEADER_ICON_UNREAD, @@ -29,25 +28,17 @@ enum { }; -enum { - SORT_COLUMN_FROM = 1, - SORT_COLUMN_TO, - SORT_COLUMN_SUBJECT, - SORT_COLUMN_ATTACH, - SORT_COLUMN_RECEIVED, - SORT_COLUMN_SENT, - SORT_COLUMN_MSGTYPE, - SORT_COLUMN_NUM -}; - - typedef struct _ModestTnyHeaderTreeViewPrivate ModestTnyHeaderTreeViewPrivate; struct _ModestTnyHeaderTreeViewPrivate { + TnyMsgFolderIface *tny_msg_folder; TnyListIface *headers; - GdkPixbuf *icons[HEADER_ICON_NUM]; - guint sort_columns[SORT_COLUMN_NUM]; + GdkPixbuf *icons[HEADER_ICON_NUM]; + guint sort_columns[MODEST_TNY_HEADER_TREE_VIEW_COLUMN_NUM]; + + GSList *columns; + ModestTnyHeaderTreeViewStyle style; }; #define MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_TNY_HEADER_TREE_VIEW, \ @@ -239,81 +230,107 @@ get_new_column (const gchar *name, GtkCellRenderer *renderer, +static void +remove_all_columns (ModestTnyHeaderTreeView *obj) +{ + GList *columns, *cursor; + + columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(obj)); + + for (cursor = columns; cursor; cursor = cursor->next) + gtk_tree_view_remove_column (GTK_TREE_VIEW(obj), + GTK_TREE_VIEW_COLUMN(cursor->data)); + g_list_free (columns); +} + + + static void -modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj) +init_columns (ModestTnyHeaderTreeView *obj) { GtkTreeViewColumn *column; GtkCellRenderer *renderer_msgtype, *renderer_header, *renderer_attach; - int i; + ModestTnyHeaderTreeViewPrivate *priv; + GSList *cursor; priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj); - - init_icons (priv->icons); - + renderer_msgtype = gtk_cell_renderer_pixbuf_new (); renderer_attach = gtk_cell_renderer_pixbuf_new (); renderer_header = gtk_cell_renderer_text_new (); + + remove_all_columns (obj); + + for (cursor = priv->columns; cursor; cursor = cursor->next) { + ModestTnyHeaderTreeViewColumn col = + (ModestTnyHeaderTreeViewColumn) GPOINTER_TO_INT(cursor->data); + + switch (col) { + + case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE: + + column = get_new_column (_("M"), renderer_msgtype, FALSE, + TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, + FALSE, (GtkTreeCellDataFunc)msgtype_cell_data, priv->icons); + break; + + case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH: + + column = get_new_column (_("A"), renderer_attach, FALSE, + TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, + FALSE, (GtkTreeCellDataFunc)attach_cell_data, priv->icons); + break; + + case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE: + column = get_new_column (_("Received"), renderer_header, TRUE, + TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN, + TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL); + break; + + case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM: + column = get_new_column (_("From"), renderer_header, TRUE, + TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN, + TRUE, (GtkTreeCellDataFunc)sender_cell_data, NULL); + break; + + case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT: + column = get_new_column (_("Subject"), renderer_header, TRUE, + TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN, + TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL); + break; + + + case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SENT_DATE: + column = get_new_column (_("Sent"), renderer_header, TRUE, + TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_COLUMN, + TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL); + break; + + case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_TO: + column = get_new_column (_("To"), renderer_header, TRUE, + TNY_MSG_HEADER_LIST_MODEL_TO_COLUMN, + TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL); + break; + } + gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); + } +} - priv->tny_msg_folder = NULL; - priv->headers = NULL; - for (i = 0; i != SORT_COLUMN_NUM; ++i) - priv->sort_columns[i] = -1; - /* msgtype */ - column = get_new_column (_("M"), renderer_msgtype, FALSE, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, - FALSE, (GtkTreeCellDataFunc)msgtype_cell_data, priv->icons); - gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); - priv->sort_columns[SORT_COLUMN_MSGTYPE] = - gtk_tree_view_column_get_sort_column_id (column); - g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj); - - /* attachment */ - column = get_new_column (_("A"), renderer_attach, FALSE, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, - FALSE, (GtkTreeCellDataFunc)attach_cell_data, priv->icons); - gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); - priv->sort_columns[SORT_COLUMN_ATTACH] = - gtk_tree_view_column_get_sort_column_id (column); - g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj); - - /* received */ - column = get_new_column (_("Received"), renderer_header, TRUE, TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN, - TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); - priv->sort_columns[SORT_COLUMN_RECEIVED] = - gtk_tree_view_column_get_sort_column_id (column); - g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj); - - /* from */ - column = get_new_column (_("From"), renderer_header, TRUE, TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN, - TRUE, (GtkTreeCellDataFunc)sender_cell_data, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); - priv->sort_columns[SORT_COLUMN_FROM] = - gtk_tree_view_column_get_sort_column_id (column); - g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj); - - - /* subject */ - column = get_new_column (_("Subject"), renderer_header, TRUE, TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN, - TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); - priv->sort_columns[SORT_COLUMN_SUBJECT] = - gtk_tree_view_column_get_sort_column_id (column); - g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj); +static void +modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj) +{ + ModestTnyHeaderTreeViewPrivate *priv; + priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj); - - /* all cols */ - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(obj), TRUE); - gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(obj), TRUE); - - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(obj), TRUE); /* alternating row colors */ - + init_icons (priv->icons); } static void @@ -342,21 +359,33 @@ modest_tny_header_tree_view_finalize (GObject *obj) } GtkWidget* -modest_tny_header_tree_view_new (TnyMsgFolderIface *folder) +modest_tny_header_tree_view_new (TnyMsgFolderIface *folder, + GSList *columns, + ModestTnyHeaderTreeViewStyle style) { GObject *obj; GtkTreeSelection *sel; ModestTnyHeaderTreeView *self; - + obj = G_OBJECT(g_object_new(MODEST_TYPE_TNY_HEADER_TREE_VIEW, NULL)); self = MODEST_TNY_HEADER_TREE_VIEW(obj); - + if (!modest_tny_header_tree_view_set_folder (self, NULL)) { g_warning ("could not set the folder"); g_object_unref (obj); return NULL; } + modest_tny_header_tree_view_set_style (self, style); + modest_tny_header_tree_view_set_columns (self, columns); + + /* all cols */ + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(obj), TRUE); + gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(obj), TRUE); + + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(obj), + TRUE); /* alternating row colors */ + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); g_signal_connect (sel, "changed", G_CALLBACK(selection_changed), self); @@ -364,7 +393,71 @@ modest_tny_header_tree_view_new (TnyMsgFolderIface *folder) return GTK_WIDGET(self); } +gboolean +modest_tny_header_tree_view_set_columns (ModestTnyHeaderTreeView *self, GSList *columns) +{ + ModestTnyHeaderTreeViewPrivate *priv; + GSList *cursor; + + g_return_val_if_fail (self, FALSE); + + priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self); + g_slist_free (priv->columns); + + for (cursor = columns; cursor; cursor = cursor->next) { + ModestTnyHeaderTreeViewColumn col = + (ModestTnyHeaderTreeViewColumn) GPOINTER_TO_INT(cursor->data); + if (0 > col || col >= MODEST_TNY_HEADER_TREE_VIEW_COLUMN_NUM) + g_warning ("invalid column in column list"); + else + priv->columns = g_slist_append (priv->columns, cursor->data); + } + + init_columns (self); /* redraw them */ + return TRUE; +} + + + +const GSList* +modest_tny_header_tree_view_get_columns (ModestTnyHeaderTreeView *self) +{ + ModestTnyHeaderTreeViewPrivate *priv; + GSList *cursor; + + g_return_val_if_fail (self, FALSE); + + priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self); + return priv->columns; +} + + + + +gboolean +modest_tny_header_tree_view_set_style (ModestTnyHeaderTreeView *self, + ModestTnyHeaderTreeViewStyle style) +{ + g_return_val_if_fail (self, FALSE); + g_return_val_if_fail (style >= 0 && style < MODEST_TNY_HEADER_TREE_VIEW_STYLE_NUM, + FALSE); + + MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self)->style = style; + + return TRUE; +} + +ModestTnyHeaderTreeViewStyle +modest_tny_header_tree_view_get_style (ModestTnyHeaderTreeView *self) +{ + g_return_val_if_fail (self, FALSE); + + return MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self)->style; +} + + +# if 0 static gint cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, gpointer user_data) @@ -415,7 +508,7 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, return &iter1 - &iter2; } } - +#endif gboolean diff --git a/src/modest-tny-header-tree-view.h b/src/modest-tny-header-tree-view.h index b0cb60a..38ed0ec 100644 --- a/src/modest-tny-header-tree-view.h +++ b/src/modest-tny-header-tree-view.h @@ -38,6 +38,29 @@ struct _ModestTnyHeaderTreeViewClass { }; +enum { + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_TO, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SENT_DATE, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE, + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH, + + MODEST_TNY_HEADER_TREE_VIEW_COLUMN_NUM +}; +typedef guint ModestTnyHeaderTreeViewColumn; + +enum { + MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL, + MODEST_TNY_HEADER_TREE_VIEW_STYLE_COMPACT, + + MODEST_TNY_HEADER_TREE_VIEW_STYLE_NUM +}; +typedef guint ModestTnyHeaderTreeViewStyle; + + + /** * modest_tny_header_tree_view_get_type: * @@ -51,13 +74,17 @@ GType modest_tny_header_tree_view_get_type (void) G_GNUC_CONST; /** * modest_tny_header_tree_view_new: * @folder: a TnyMsgFolderIface object + * @columns: a list of ModestTnyHeaderTreeViewColumn + * @style: a ModestTnyHeaderTreeViewColumn with the style of this listview + * ( MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL or MODEST_TNY_HEADER_TREE_VIEW_STYLE_COMPACT) * * create a new ModestTnyHeaderTreeView instance, based on a folder iface - * + * * Returns: a new GtkWidget (a GtkTreeView-subclass) */ -GtkWidget* modest_tny_header_tree_view_new (TnyMsgFolderIface *folder); - +GtkWidget* modest_tny_header_tree_view_new (TnyMsgFolderIface *folder, + GSList *columns, + ModestTnyHeaderTreeViewStyle style); /** * modest_tny_header_tree_view_set_folder: @@ -71,7 +98,58 @@ GtkWidget* modest_tny_header_tree_view_new (TnyMsgFolderIface *folder); gboolean modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self, TnyMsgFolderIface *folder); + +/** + * modest_tny_header_tree_view_set_columns: + * @self: a ModestTnyHeaderTreeView instance + * @columns: a list of ModestTnyHeaderTreeViewColumn + * + * set the columns for this ModestTnyHeaderTreeView + * + * Returns: TRUE if it succeeded, FALSE otherwise + */ +gboolean modest_tny_header_tree_view_set_columns (ModestTnyHeaderTreeView *self, + GSList *columns); +/** + * modest_tny_header_tree_view_get_columns: + * @self: a ModestTnyHeaderTreeView instance + * @folder: a TnyMsgFolderIface object + * + * get the columns for this ModestTnyHeaderTreeView + * + * Returns: list of columms, or NULL in case of no columns or error + */ +const GSList* modest_tny_header_tree_view_get_columns (ModestTnyHeaderTreeView *self); + + +/** + * modest_tny_header_tree_view_set_style: + * @self: a ModestTnyHeaderTreeView instance + * @style: the style for this tree view + * + * set the folder for this ModestTnyHeaderTreeView + * + * Returns: TRUE if it succeeded, FALSE otherwise + */ +gboolean modest_tny_header_tree_view_set_style (ModestTnyHeaderTreeView *self, + ModestTnyHeaderTreeViewStyle style); + +/** + * modest_tny_header_tree_view_set_folder: + * @self: a ModestTnyHeaderTreeView instance + * @folder: a TnyMsgFolderIface object + * + * set the folder for this ModestTnyHeaderTreeView + * + * Returns: TRUE if it succeeded, FALSE otherwise + */ +ModestTnyHeaderTreeViewStyle modest_tny_header_tree_view_get_style (ModestTnyHeaderTreeView *self); + G_END_DECLS + + + + #endif /* __MODEST_TNY_HEADER_TREE_VIEW_H__ */ -- 1.7.9.5