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:
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 \