talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 015a56d858d3853d85872c05ca07cfdf38e508a4
parent adfd551d2fd4c6a4f14530eeeea523b4403d6d66
Author: Colin Leroy <colin@colino.net>
Date:   Sun, 16 Mar 2008 13:48:05 +0000

2008-03-16 [colin]	3.3.1cvs26

	* src/summaryview.c
	* src/gtk/gtksctree.c
	* src/gtk/gtksctree.h
		Implement 2-lines items in Summaryview when in
		three columns mode

Diffstat:
MChangeLog | 8++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/gtk/gtksctree.c | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Msrc/gtk/gtksctree.h | 4++++
Msrc/summaryview.c | 57+++++++++++++++++++++++++++++++++++++++++++++++++--------
6 files changed, 131 insertions(+), 19 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,11 @@ +2008-03-16 [colin] 3.3.1cvs26 + + * src/summaryview.c + * src/gtk/gtksctree.c + * src/gtk/gtksctree.h + Implement 2-lines items in Summaryview when in + three columns mode + 2008-03-16 [paul] 3.3.1cvs25 * manual/faq.xml diff --git a/PATCHSETS b/PATCHSETS @@ -3260,3 +3260,4 @@ ( cvs diff -u -r 1.395.2.360 -r 1.395.2.361 src/summaryview.c; cvs diff -u -r 1.14.2.61 -r 1.14.2.62 src/plugins/trayicon/trayicon.c; ) > 3.3.1cvs23.patchset ( cvs diff -u -r 1.1.4.49 -r 1.1.4.50 src/prefs_filtering_action.c; ) > 3.3.1cvs24.patchset ( cvs diff -u -r 1.1.2.15 -r 1.1.2.16 manual/faq.xml; ) > 3.3.1cvs25.patchset +( cvs diff -u -r 1.395.2.361 -r 1.395.2.362 src/summaryview.c; cvs diff -u -r 1.1.4.42 -r 1.1.4.43 src/gtk/gtksctree.c; cvs diff -u -r 1.1.4.12 -r 1.1.4.13 src/gtk/gtksctree.h; ) > 3.3.1cvs26.patchset diff --git a/configure.ac b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=3 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=25 +EXTRA_VERSION=26 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/gtk/gtksctree.c b/src/gtk/gtksctree.c @@ -289,8 +289,12 @@ gtk_sctree_draw_expander (GtkCTree *ctree, justification_factor = -1; else justification_factor = 1; - y = (clip_rectangle->y + (clip_rectangle->height - PM_SIZE) / 2 - - (clip_rectangle->height + 1) % 2); + if (!GTK_CLIST_ROW_HEIGHT_SET(GTK_CLIST(clist))) + y = (clip_rectangle->y + (clip_rectangle->height - PM_SIZE) / 2 - + (clip_rectangle->height + 1) % 2); + else + y = (clip_rectangle->y + (clip_rectangle->height/2 - PM_SIZE) / 2 - + (clip_rectangle->height/2 + 1) % 2); if (!ctree_row->children) { @@ -777,6 +781,15 @@ gtk_sctree_draw_lines (GtkCTree *ctree, return offset; } +static gboolean filter_fg (PangoAttribute *attribute, gpointer data) +{ + const PangoAttrClass *klass = attribute->klass; + if (klass->type == PANGO_ATTR_FOREGROUND) + return TRUE; + + return FALSE; +} + static PangoLayout * sc_gtk_clist_create_cell_layout (GtkCList *clist, GtkCListRow *clist_row, @@ -803,11 +816,26 @@ sc_gtk_clist_create_cell_layout (GtkCList *clist, if (!text) return NULL; - layout = gtk_widget_create_pango_layout (GTK_WIDGET (clist), - ((cell->type == GTK_CELL_PIXTEXT) ? - GTK_CELL_PIXTEXT (*cell)->text : - GTK_CELL_TEXT (*cell)->text)); - pango_layout_set_font_description (layout, style->font_desc); + if (!GTK_SCTREE(clist)->use_markup[column]) { + layout = gtk_widget_create_pango_layout (GTK_WIDGET (clist), + ((cell->type == GTK_CELL_PIXTEXT) ? + GTK_CELL_PIXTEXT (*cell)->text : + GTK_CELL_TEXT (*cell)->text)); + pango_layout_set_font_description (layout, style->font_desc); + } else { + PangoContext *context = gtk_widget_get_pango_context (GTK_WIDGET(clist)); + layout = pango_layout_new (context); + pango_layout_set_markup (layout, text, -1); + pango_layout_set_font_description (layout, style->font_desc); + if (clist_row->state == GTK_STATE_SELECTED) { + /* for selected row, we should remove any forced foreground color + * or it looks like shit */ + PangoAttrList *list = pango_layout_get_attributes(layout); + PangoAttrList *rem = pango_attr_list_filter(list, filter_fg, NULL); + if (rem) + pango_attr_list_unref(rem); + } + } return layout; @@ -1117,6 +1145,10 @@ gtk_sctree_draw_row (GtkCList *clist, if (i != ctree->tree_column) { + int start_y = (clip_rectangle.height - height) / 2; + if (GTK_CLIST_ROW_HEIGHT_SET(GTK_CLIST(clist))) + start_y = (clip_rectangle.height/2 - height) / 2; + offset += clist_row->cell[i].horizontal; switch (clist_row->cell[i].type) { @@ -1127,7 +1159,7 @@ gtk_sctree_draw_row (GtkCList *clist, GTK_CELL_PIXMAP (clist_row->cell[i])->mask, offset, clip_rectangle.y + clist_row->cell[i].vertical + - (clip_rectangle.height - height) / 2, + start_y, pixmap_width, height); break; case GTK_CELL_PIXTEXT: @@ -1137,7 +1169,7 @@ gtk_sctree_draw_row (GtkCList *clist, GTK_CELL_PIXTEXT (clist_row->cell[i])->mask, offset, clip_rectangle.y + clist_row->cell[i].vertical + - (clip_rectangle.height - height) / 2, + start_y, pixmap_width, height); offset += GTK_CELL_PIXTEXT (clist_row->cell[i])->spacing; @@ -1528,8 +1560,12 @@ sctree_is_hot_spot (GtkSCTree *sctree, cell = GTK_CELL_PIXTEXT (tree_row->row.cell[ctree->tree_column]); - yu = (ROW_TOP_YPIXEL (clist, row) + (clist->row_height - PM_SIZE) / 2 - + if (!GTK_CLIST_ROW_HEIGHT_SET(GTK_CLIST(clist))) + yu = (ROW_TOP_YPIXEL (clist, row) + (clist->row_height - PM_SIZE) / 2 - (clist->row_height - 1) % 2); + else + yu = (ROW_TOP_YPIXEL (clist, row) + (clist->row_height/2 - PM_SIZE) / 2 - + (clist->row_height/2 - 1) % 2); #ifndef MAEMO if (clist->column[ctree->tree_column].justification == GTK_JUSTIFY_RIGHT) @@ -1928,10 +1964,32 @@ GtkWidget *gtk_sctree_new_with_titles (gint columns, gint tree_column, GTK_SCTREE(widget)->show_stripes = TRUE; GTK_SCTREE(widget)->always_expand_recursively = TRUE; + GTK_SCTREE(widget)->force_additive_sel = FALSE; + + GTK_SCTREE(widget)->use_markup = g_new0(gboolean, columns); return widget; } +void gtk_sctree_set_use_markup (GtkSCTree *sctree, + int column, + gboolean markup) +{ + gint columns = 0; + GValue value = { 0 }; + + g_return_if_fail(GTK_IS_SCTREE(sctree)); + + g_value_init (&value, G_TYPE_INT); + g_object_get_property (G_OBJECT (sctree), "n-columns", &value); + columns = g_value_get_int (&value); + g_value_unset (&value); + + g_return_if_fail(column < columns); + + sctree->use_markup[column] = markup; +} + void gtk_sctree_select (GtkSCTree *sctree, GtkCTreeNode *node) { select_row(sctree, diff --git a/src/gtk/gtksctree.h b/src/gtk/gtksctree.h @@ -41,6 +41,7 @@ struct _GtkSCTree { GtkTooltips *tips; gboolean always_expand_recursively; gboolean force_additive_sel; + gboolean *use_markup; }; struct _GtkSCTreeClass { @@ -121,6 +122,9 @@ gtk_sctree_insert_gnode (GtkCTree *ctree, void gtk_sctree_set_column_tooltip (GtkSCTree *sctree, int column, const gchar *tip); +void gtk_sctree_set_use_markup (GtkSCTree *sctree, + int column, + gboolean markup); gboolean gtk_sctree_is_hot_spot (GtkSCTree *ctree, gint x, diff --git a/src/summaryview.c b/src/summaryview.c @@ -98,7 +98,7 @@ #define SUMMARY_COL_LOCKED_WIDTH 13 #define SUMMARY_COL_MIME_WIDTH 11 - +static int normal_row_height = -1; static GtkStyle *bold_style; static GtkStyle *bold_marked_style; static GtkStyle *bold_deleted_style; @@ -855,6 +855,12 @@ void summary_relayout(SummaryView *summaryview) break; } + summary_set_column_order(summaryview); + if (prefs_common.layout_mode == VERTICAL_LAYOUT) { + gtk_clist_set_row_height(GTK_CLIST(summaryview->ctree), 2*normal_row_height + 2); + } else { + gtk_clist_set_row_height(GTK_CLIST(summaryview->ctree), 0); + } gtk_widget_unref(summaryview->hbox_l); gtk_widget_unref(summaryview->statlabel_msgs); quicksearch_relayout(summaryview->quicksearch); @@ -2914,7 +2920,8 @@ static gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *g gint *col_pos = summaryview->col_pos; const gchar *msgid = msginfo->msgid; GHashTable *msgid_table = summaryview->msgid_table; - + gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT); + summary_set_header(summaryview, text, msginfo); gtk_sctree_set_node_info(ctree, cnode, text[col_pos[S_COL_SUBJECT]], 2, @@ -2939,6 +2946,9 @@ static gboolean summary_insert_gnode_func(GtkCTree *ctree, guint depth, GNode *g if (summaryview->col_state[summaryview->col_pos[S_COL_TAGS]].visible) SET_TEXT(S_COL_TAGS); + if (vert) + g_free(text[summaryview->col_pos[S_COL_SUBJECT]]); + #undef SET_TEXT GTKUT_CTREE_NODE_SET_ROW_DATA(cnode, msginfo); @@ -2959,6 +2969,8 @@ static void summary_set_ctree_from_list(SummaryView *summaryview, GHashTable *msgid_table; GHashTable *subject_table = NULL; GSList * cur; + gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT); + START_TIMING(""); if (!mlist) return; @@ -3014,6 +3026,8 @@ static void summary_set_ctree_from_list(SummaryView *summaryview, (ctree, NULL, node, text, 2, NULL, NULL, NULL, NULL, FALSE, FALSE); + if (vert) + g_free(text[summaryview->col_pos[S_COL_SUBJECT]]); GTKUT_CTREE_NODE_SET_ROW_DATA(node, msginfo); summary_set_marks_func(ctree, node, summaryview); @@ -3110,6 +3124,10 @@ static inline void summary_set_header(SummaryView *summaryview, gchar *text[], gint *col_pos = summaryview->col_pos; gchar *from_text = NULL, *to_text = NULL, *tags_text = NULL; gboolean should_swap = FALSE; + gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT); + static gchar *color_dim_rgb = NULL; + if (!color_dim_rgb) + color_dim_rgb = gdk_color_to_string(&summaryview->color_dim); text[col_pos[S_COL_FROM]] = ""; text[col_pos[S_COL_TO]] = ""; @@ -3150,7 +3168,7 @@ static inline void summary_set_header(SummaryView *summaryview, gchar *text[], text[col_pos[S_COL_TAGS]] = ""; /* slow! */ - if (summaryview->col_state[summaryview->col_pos[S_COL_DATE]].visible) { + if (summaryview->col_state[summaryview->col_pos[S_COL_DATE]].visible || vert) { if (msginfo->date_t) { procheader_date_get_localtime(date_modified, sizeof(date_modified), @@ -3217,6 +3235,14 @@ static inline void summary_set_header(SummaryView *summaryview, gchar *text[], else text[col_pos[S_COL_SUBJECT]] = msginfo->subject ? msginfo->subject : _("(No Subject)"); + if (vert) { + gchar *tmp = g_markup_printf_escaped(_("%s\n<span color='%s' style='italic'>From: %s, on %s</span>"), + text[col_pos[S_COL_SUBJECT]], + color_dim_rgb, + text[col_pos[S_COL_FROM]], + text[col_pos[S_COL_DATE]]); + text[col_pos[S_COL_SUBJECT]] = tmp; + } } static void summary_display_msg(SummaryView *summaryview, GtkCTreeNode *row) @@ -5820,7 +5846,6 @@ static gboolean summary_popup_menu(GtkWidget *widget, gpointer data) static gchar *summaryview_get_tooltip_text(SummaryView *summaryview, MsgInfo *info, gint column) { MsgFlags flags; - if (!info) return NULL; @@ -5897,6 +5922,7 @@ static gboolean tooltip_cb (GtkWidget *widget, gchar *formatted = NULL; MsgInfo *info = NULL; GdkRectangle rect; + gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT); if (!prefs_common.show_tooltips) return FALSE; @@ -5934,8 +5960,11 @@ static gboolean tooltip_cb (GtkWidget *widget, formatted = g_strdup(text); g_strstrip(formatted); - - gtk_tooltip_set_text (tooltip, formatted); + + if (!vert) + gtk_tooltip_set_text (tooltip, formatted); + else + gtk_tooltip_set_markup (tooltip, formatted); g_free(formatted); rect.x = x - 2; @@ -5955,6 +5984,7 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview) gchar *titles[N_SUMMARY_COLS]; SummaryColumnType type; gint pos; + gboolean vert = (prefs_common.layout_mode == VERTICAL_LAYOUT); memset(titles, 0, sizeof(titles)); @@ -5970,6 +6000,10 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview) ctree = gtk_sctree_new_with_titles (N_SUMMARY_COLS, col_pos[S_COL_SUBJECT], titles); + /* get normal row height */ + gtk_clist_set_row_height(GTK_CLIST(ctree), 0); + normal_row_height = GTK_CLIST(ctree)->row_height; + if (prefs_common.show_col_headers == FALSE) gtk_clist_column_titles_hide(GTK_CLIST(ctree)); @@ -6031,10 +6065,17 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview) for (pos = 0; pos < N_SUMMARY_COLS; pos++) { GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(ctree)->column[pos].button, GTK_CAN_FOCUS); - gtk_clist_set_column_visibility - (GTK_CLIST(ctree), pos, col_state[pos].visible); + if ((pos == summaryview->col_pos[S_COL_FROM] || + pos == summaryview->col_pos[S_COL_DATE]) && vert) + gtk_clist_set_column_visibility + (GTK_CLIST(ctree), pos, FALSE); + else + gtk_clist_set_column_visibility + (GTK_CLIST(ctree), pos, col_state[pos].visible); } + gtk_sctree_set_use_markup(GTK_SCTREE(ctree), summaryview->col_pos[S_COL_SUBJECT], vert); + /* connect signal to the buttons for sorting */ #define CLIST_BUTTON_SIGNAL_CONNECT(col, func) \ g_signal_connect \