2008-03-16 [colin] 3.3.1cvs26
authorColin Leroy <colin@colino.net>
Sun, 16 Mar 2008 13:48:05 +0000 (13:48 +0000)
committerColin Leroy <colin@colino.net>
Sun, 16 Mar 2008 13:48:05 +0000 (13:48 +0000)
* src/summaryview.c
* src/gtk/gtksctree.c
* src/gtk/gtksctree.h
Implement 2-lines items in Summaryview when in
three columns mode

ChangeLog
PATCHSETS
configure.ac
src/gtk/gtksctree.c
src/gtk/gtksctree.h
src/summaryview.c

index eb75ed900d3515594becd787e0ad00fa2fa9ae94..3528d01d8ee4331886ef6d824b30858ef200daa3 100644 (file)
--- 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
index fc76971551bf8a3278ed21aab4298e99f941246b..681c2c028ad7334ab0a134986a68cc8e9fae57fc 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( 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
index 5c00598111b53e33d7b8780648b8da29ba5ae769..374e08e0178550a9641951f3dbc783db0017d5bd 100644 (file)
@@ -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=
 
index dc7c65085e42ecc8862042feed55f7c291b937c1..12e27b285a9f4fe7d0d237e3b50b0ef00c973344 100644 (file)
@@ -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, 
index 85992a13eeba07cd4d022e448b0af653e143e8da..cab79b75ceccab7c15caa17e61bd483f6e1166ea 100644 (file)
@@ -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, 
index e3a739cd9fdf66cdf8517ca47bef3b9a2b87886c..025555b7a5031b1dd4b2ae1820908b9da94fe6f7 100644 (file)
@@ -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 \