From 9c115e4142e0338543c5c797c6639a534a7f59d8 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Tue, 30 May 2006 09:02:54 +0000 Subject: [PATCH] * all: - add icons support to the header view - add icons - install icons pmo-trunk-r121 --- src/gtk-glade/Makefile.am | 13 +++- src/gtk-glade/pixmaps/clip.xpm | 17 +++++ src/gtk-glade/pixmaps/read.xpm | 42 +++++++++++ src/gtk-glade/pixmaps/unread.xpm | 50 +++++++++++++ src/modest-tny-header-tree-view.c | 139 +++++++++++++++++++++++++++++++------ 5 files changed, 235 insertions(+), 26 deletions(-) create mode 100644 src/gtk-glade/pixmaps/clip.xpm create mode 100644 src/gtk-glade/pixmaps/read.xpm create mode 100644 src/gtk-glade/pixmaps/unread.xpm diff --git a/src/gtk-glade/Makefile.am b/src/gtk-glade/Makefile.am index a9bc80a..fbb4d3b 100644 --- a/src/gtk-glade/Makefile.am +++ b/src/gtk-glade/Makefile.am @@ -1,6 +1,6 @@ # # Makefile.am -# Time-stamp: <2006-04-30 13:49:49 (djcb)> +# Time-stamp: <2006-05-29 23:12:07 (djcb)> # # # use Automake 'trick' ==> convenience static libraries, which @@ -17,7 +17,11 @@ noinst_LTLIBRARIES=\ libmodest-ui.la GLADE_FILES=\ - modest.glade pixmaps/*.png + modest.glade\ + pixmaps/*.png + +PIXMAP_FILES=\ + pixmaps/*.xpm libmodest_ui_la_SOURCES=\ modest-ui.c @@ -28,7 +32,10 @@ LDADD = \ $(MODEST_GLADE_LIBS) \ $(MODEST_TINYMAIL_LIBS) -EXTRA_DIST=pixmaps/*.png modest.glade modest.gladep +EXTRA_DIST=pixmaps/*.png pixmaps/*.xpm modest.glade modest.gladep gladedir = $(prefix)/share/modest/glade glade_DATA = $(GLADE_FILES) + +pixmapdir = $(prefix)/share/modest/pixmaps +pixmap_DATA = $(PIXMAP_FILES) diff --git a/src/gtk-glade/pixmaps/clip.xpm b/src/gtk-glade/pixmaps/clip.xpm new file mode 100644 index 0000000..6a555bd --- /dev/null +++ b/src/gtk-glade/pixmaps/clip.xpm @@ -0,0 +1,17 @@ +/* XPM */ +static char * clip_xpm[] = { +"11 12 2 1", +" c None", +". c #000000", +" ... ", +" . . ", +" . . ", +" .. .. ", +" .. .. ", +" .. .. ", +" .. .. ", +" . .. . ", +" . . ", +" . . ", +" .... ", +" "}; diff --git a/src/gtk-glade/pixmaps/read.xpm b/src/gtk-glade/pixmaps/read.xpm new file mode 100644 index 0000000..4a3241f --- /dev/null +++ b/src/gtk-glade/pixmaps/read.xpm @@ -0,0 +1,42 @@ +/* XPM */ +static char * read_xpm[] = { +"13 10 29 1", +" c None", +". c #161616", +"+ c #4D4D4D", +"@ c #F5F5F5", +"# c #F4F4F4", +"$ c #373737", +"% c #F3F3F3", +"& c #C3C3C3", +"* c #EAEAEA", +"= c #EBEBEB", +"- c #ADADAD", +"; c #424242", +"> c #EFEFEF", +", c #F2F2F2", +"' c #454545", +") c #4C4C4C", +"! c #BEBEBE", +"~ c #D7D7D7", +"{ c #A3A3A3", +"] c #F1F1F1", +"^ c #BCBCBC", +"/ c #E9E9E9", +"( c #909090", +"_ c #C1C1C1", +": c #DBDBDB", +"< c #CECECE", +"[ c #AAAAAA", +"} c #D4D4D4", +"| c #2D2D2D", +" ........... ", +".+@@@##@@##$.", +".#+##@%#%#+&.", +".#*+@##@#+=-.", +".@##+@#@;>==.", +".,@>+'#)+#,!.", +".@%+#@+#,+~{.", +".#+%#@]%,^$/.", +".+{{(_^:<[}|.", +" ........... "}; diff --git a/src/gtk-glade/pixmaps/unread.xpm b/src/gtk-glade/pixmaps/unread.xpm new file mode 100644 index 0000000..b3c31e4 --- /dev/null +++ b/src/gtk-glade/pixmaps/unread.xpm @@ -0,0 +1,50 @@ +/* XPM */ +static char * unread_xpm[] = { +"13 10 37 1", +" c None", +". c #000000", +"+ c #3D81C1", +"@ c #D4E3F0", +"# c #D5E3F1", +"$ c #2A5984", +"% c #D1E0EF", +"& c #D1E1EF", +"* c #D2E2F0", +"= c #94B9DC", +"- c #C0D5EA", +"; c #D4E2F0", +"> c #C2D5EA", +", c #80AAD6", +"' c #346FA6", +") c #C9D9ED", +"! c #CFDEEF", +"~ c #C9DBED", +"{ c #3673AC", +"] c #3B7EBD", +"^ c #D2E1F0", +"/ c #8EB0DA", +"( c #A6C1E2", +"_ c #77A0D3", +": c #CCDCEE", +"< c #D1DFEF", +"[ c #8CAFDA", +"} c #295883", +"| c #BFD4E9", +"1 c #7AA9D4", +"2 c #6B9CCF", +"3 c #91B4DB", +"4 c #ABC4E3", +"5 c #9DBCDF", +"6 c #7DA6D5", +"7 c #A4C0E0", +"8 c #1E4060", +" ........... ", +".+@##@@##@@$.", +".@+@@#%@&*+=.", +".@-+#@*;*+>,.", +".#@@+#@#')>>.", +".!#~+{@]+^!/.", +".#%+@;+^!+(_.", +".@+&@;: #include "modest-tny-header-tree-view.h" + /* 'private'/'protected' functions */ static void modest_tny_header_tree_view_class_init (ModestTnyHeaderTreeViewClass *klass); static void modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj); @@ -29,18 +30,30 @@ 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); - -/* list my signals */ + +#define PIXMAP_PREFIX PREFIX "/share/modest/pixmaps/" + enum { - /* MY_SIGNAL_1, */ MESSAGE_SELECTED_SIGNAL, LAST_SIGNAL }; + +enum { + HEADER_ICON_READ, + HEADER_ICON_UNREAD, + HEADER_ICON_ATTACH, + HEADER_ICON_NUM +}; + + + typedef struct _ModestTnyHeaderTreeViewPrivate ModestTnyHeaderTreeViewPrivate; struct _ModestTnyHeaderTreeViewPrivate { TnyMsgFolderIface *tny_msg_folder; GtkTreeModel *header_tree_model; + + GdkPixbuf *icons[HEADER_ICON_NUM]; }; #define MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_TNY_HEADER_TREE_VIEW, \ @@ -95,9 +108,11 @@ modest_tny_header_tree_view_class_init (ModestTnyHeaderTreeViewClass *klass) G_TYPE_NONE, 1, G_TYPE_POINTER); } + + static void -map_header_icon (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) +flags_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) { TnyMsgHeaderFlags flags; static gchar txt[10]; @@ -108,16 +123,56 @@ map_header_icon (GtkTreeViewColumn *column, GtkCellRenderer *renderer, } + static void -map_header_text (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) +msgtype_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, + GdkPixbuf *icons[HEADER_ICON_NUM]) { - GObject *rendobj; TnyMsgHeaderFlags flags; + GdkPixbuf *pixbuf; gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -1); - rendobj = G_OBJECT(renderer); + + if (flags & TNY_MSG_HEADER_FLAG_SEEN) + pixbuf = icons[HEADER_ICON_READ]; + else + pixbuf = icons[HEADER_ICON_UNREAD]; + + g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, + NULL); +} + +static void +attach_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, GdkPixbuf *icons[HEADER_ICON_NUM]) +{ + TnyMsgHeaderFlags flags; + GdkPixbuf *pixbuf; + + gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, + &flags, -1); + if (flags & TNY_MSG_HEADER_FLAG_ATTACHMENTS) + pixbuf = icons[HEADER_ICON_ATTACH]; + else + pixbuf = NULL; + + g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, NULL); +} + + + +static void +header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) +{ + GObject *rendobj; + TnyMsgHeaderFlags flags; + + gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, + &flags, -1); + rendobj = G_OBJECT(renderer); if (!(flags & TNY_MSG_HEADER_FLAG_SEEN)) g_object_set (rendobj, "weight", 800, NULL); @@ -127,28 +182,56 @@ map_header_text (GtkTreeViewColumn *column, GtkCellRenderer *renderer, static void +init_icons (GdkPixbuf *icons[HEADER_ICON_NUM]) +{ + icons[HEADER_ICON_READ] = + gdk_pixbuf_new_from_file (PIXMAP_PREFIX "read.xpm",NULL); + icons[HEADER_ICON_UNREAD] = + gdk_pixbuf_new_from_file (PIXMAP_PREFIX "unread.xpm",NULL); + icons[HEADER_ICON_ATTACH] = + gdk_pixbuf_new_from_file (PIXMAP_PREFIX "clip.xpm",NULL); +} + + +static void modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj) { GtkTreeViewColumn *column; - GtkCellRenderer *renderer_icon, *renderer_header; - + GtkCellRenderer *renderer_msgtype, + *renderer_header, + *renderer_attach; + ModestTnyHeaderTreeViewPrivate *priv; priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj); - renderer_icon = gtk_cell_renderer_text_new (); /* TODO */ + 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 (); priv->tny_msg_folder = NULL; priv->header_tree_model = NULL; - /* flags */ - column = gtk_tree_view_column_new_with_attributes(_("F"), renderer_icon, NULL); + /* msgtype */ + column = gtk_tree_view_column_new_with_attributes(_("M"), renderer_msgtype, NULL); + gtk_tree_view_column_set_resizable (column, TRUE); + gtk_tree_view_column_set_sort_column_id (column, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN); + gtk_tree_view_column_set_sort_indicator (column, FALSE); + gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); + gtk_tree_view_column_set_cell_data_func(column, renderer_msgtype, msgtype_cell_data, + priv->icons, NULL); + + + /* attachment */ + column = gtk_tree_view_column_new_with_attributes(_("A"), renderer_attach, NULL); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_sort_column_id (column, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN); gtk_tree_view_column_set_sort_indicator (column, FALSE); gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); - gtk_tree_view_column_set_cell_data_func(column, renderer_icon, map_header_icon, NULL, NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer_attach,attach_cell_data, + priv->icons, NULL); /* date */ column = gtk_tree_view_column_new_with_attributes(_("Date"), renderer_header, @@ -159,7 +242,7 @@ modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj) gtk_tree_view_column_set_sort_column_id (column, TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN); gtk_tree_view_column_set_sort_indicator (column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); - gtk_tree_view_column_set_cell_data_func(column, renderer_header, map_header_text, NULL, NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer_header, header_cell_data, NULL, NULL); g_signal_connect (G_OBJECT (column), "clicked", G_CALLBACK (column_clicked), obj); @@ -172,7 +255,7 @@ modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj) gtk_tree_view_column_set_sort_column_id (column, TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN); gtk_tree_view_column_set_sort_indicator (column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column); - gtk_tree_view_column_set_cell_data_func(column, renderer_header, map_header_text, NULL, NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer_header, header_cell_data, NULL, NULL); g_signal_connect (G_OBJECT (column), "clicked", G_CALLBACK (column_clicked), obj); @@ -191,7 +274,7 @@ modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *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_column_set_cell_data_func(column, renderer_header, map_header_text, NULL, NULL); + gtk_tree_view_column_set_cell_data_func(column, renderer_header, header_cell_data, NULL, NULL); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(obj), TRUE); /* alternating row colors */ @@ -203,7 +286,8 @@ modest_tny_header_tree_view_finalize (GObject *obj) { ModestTnyHeaderTreeView *self; ModestTnyHeaderTreeViewPrivate *priv; - + int i; + self = MODEST_TNY_HEADER_TREE_VIEW(obj); priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self); @@ -212,6 +296,14 @@ modest_tny_header_tree_view_finalize (GObject *obj) priv->header_tree_model = NULL; priv->tny_msg_folder = NULL; + + /* cleanup our icons */ + for (i = 0; i != HEADER_ICON_NUM; ++i) { + if (priv->icons[i]) { + g_object_unref (G_OBJECT(priv->icons[i])); + priv->icons[i] = NULL; + } + } } GtkWidget* @@ -313,13 +405,14 @@ selection_changed (GtkTreeSelection *sel, gpointer user_data) if (!msg) g_message ("cannot find msg"); } + + g_signal_emit (G_OBJECT(tree_view), signals[MESSAGE_SELECTED_SIGNAL], 0, + msg); /* mark message as seen; _set_flags crashes, bug in tinymail? */ - //flags = tny_msg_header_iface_get_flags (TNY_MSG_HEADER_IFACE(header)); + flags = tny_msg_header_iface_get_flags (TNY_MSG_HEADER_IFACE(header)); //tny_msg_header_iface_set_flags (header, flags | TNY_MSG_HEADER_FLAG_SEEN); - - g_signal_emit (G_OBJECT(tree_view), signals[MESSAGE_SELECTED_SIGNAL], 0, - msg); + } } -- 1.7.9.5