[meld] Port from manual gdk.Pixbuf handling to gtk.IconTheme



commit 71c25907ad5910c7b96d68106f7c84973ccc7de6
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Sun Sep 5 11:45:12 2010 +1000

    Port from manual gdk.Pixbuf handling to gtk.IconTheme
    
    This commit moves from custom loading and handling of pixbufs toward
    using gtk.IconTheme for all pixbuf access, including moving from
    file-based access to icon-name access.
    
    data/icons/button_[apply|delete]*.xpm: Make apply/delete icons square
    data/icons/tree-[file|folder]-*: Remove now-unused icons, replaced by
                                     tinted versions of icon theme icons
    meld/dirdiff.py: Adapt to named icon and tint columns, and move our
                     custom cell renderer
    meld/filediff.py: Adapt and workaround our odd linkmap pixbuf usage
    meld/meldapp.py: Use theme icons instead of custom folder/file ones
    meld/tree.py: Use named icons and add status-based tint table and column
    meld/ui/emblemcellrenderer.py: Move custom cell renderer to its own
                                   file, move to using cairo, and allow for
                                   tinting of icons
    meld/ui/gnomeglade.py: Remove now-unused load_pixbuf function
    meld/vcview.py: Adapt to use updated EmblemCellRenderer

 data/icons/button_apply0.xpm       |   11 ++-
 data/icons/button_apply1.xpm       |   39 ++++++------
 data/icons/button_delete.xpm       |   11 ++-
 data/icons/tree-file-changed.png   |  Bin 2244 -> 0 bytes
 data/icons/tree-file-missing.png   |  Bin 2191 -> 0 bytes
 data/icons/tree-file-new.png       |  Bin 2258 -> 0 bytes
 data/icons/tree-file-newer.png     |  Bin 2412 -> 0 bytes
 data/icons/tree-file-normal.png    |  Bin 2250 -> 0 bytes
 data/icons/tree-folder-changed.png |  Bin 840 -> 0 bytes
 data/icons/tree-folder-missing.png |  Bin 1095 -> 0 bytes
 data/icons/tree-folder-new.png     |  Bin 840 -> 0 bytes
 data/icons/tree-folder-normal.png  |  Bin 840 -> 0 bytes
 meld/dirdiff.py                    |   65 ++++----------------
 meld/filediff.py                   |   17 +++--
 meld/meldapp.py                    |    5 +-
 meld/tree.py                       |   60 +++++++++++--------
 meld/ui/emblemcellrenderer.py      |  118 ++++++++++++++++++++++++++++++++++++
 meld/ui/gnomeglade.py              |   11 ---
 meld/vcview.py                     |   16 +++--
 19 files changed, 225 insertions(+), 128 deletions(-)
---
diff --git a/data/icons/button_apply0.xpm b/data/icons/button_apply0.xpm
index f21f171..9833895 100644
--- a/data/icons/button_apply0.xpm
+++ b/data/icons/button_apply0.xpm
@@ -1,9 +1,10 @@
 /* XPM */
-static char * button_apply_xpm[] = {
-"16 12 3 1",
+static char * button_apply0_xpm[] = {
+"16 16 2 1",
 " 	c None",
 ".	c #000000",
-"+	c #FFFFFF",
+"                ",
+"                ",
 "                ",
 "        ...     ",
 "         ...    ",
@@ -15,4 +16,6 @@ static char * button_apply_xpm[] = {
 "          ....  ",
 "          ...   ",
 "         ...    ",
-"        ...     "};
+"        ...     ",
+"                ",
+"                "};
diff --git a/data/icons/button_apply1.xpm b/data/icons/button_apply1.xpm
index 41a3783..884b082 100644
--- a/data/icons/button_apply1.xpm
+++ b/data/icons/button_apply1.xpm
@@ -1,20 +1,21 @@
 /* XPM */
-static char *button_apply1[] = {
-/* columns rows colors chars-per-pixel */
-"16 12 2 1",
-"  c black",
-". c None",
-/* pixels */
-"................",
-".....   ........",
-"....   .........",
-"...   ..........",
-"..    ..........",
-".              .",
-"               .",
-".              .",
-"..    ..........",
-"...   ..........",
-"....   .........",
-".....   ........"
-};
+static char * button_apply1_xpm[] = {
+"16 16 2 1",
+" 	c None",
+".	c #000000",
+"                ",
+"                ",
+"     ...        ",
+"    ...         ",
+"   ...          ",
+"  ....          ",
+" .............. ",
+"............... ",
+" .............. ",
+"  ....          ",
+"   ...          ",
+"    ...         ",
+"     ...        ",
+"                ",
+"                ",
+"                "};
diff --git a/data/icons/button_delete.xpm b/data/icons/button_delete.xpm
index 09dcd37..a6bb6d7 100644
--- a/data/icons/button_delete.xpm
+++ b/data/icons/button_delete.xpm
@@ -1,8 +1,9 @@
 /* XPM */
 static char * button_delete_xpm[] = {
-"16 12 2 1",
-".	c black",
+"16 16 2 1",
 " 	c None",
+".	c #000000",
+"                ",
 "                ",
 " ....      .... ",
 "  ....    ....  ",
@@ -14,5 +15,7 @@ static char * button_delete_xpm[] = {
 "    ........    ",
 "   ....  ....   ",
 "  ....    ....  ",
-" ....      .... "
-};
+" ....      .... ",
+"                ",
+"                ",
+"                "};
diff --git a/meld/dirdiff.py b/meld/dirdiff.py
index db044d2..2abc0a0 100644
--- a/meld/dirdiff.py
+++ b/meld/dirdiff.py
@@ -17,7 +17,6 @@
 import filecmp
 import paths
 from ui import gnomeglade
-import gobject
 import gtk
 import gtk.keysyms
 import math
@@ -32,6 +31,8 @@ import re
 import stat
 import time
 
+import ui.emblemcellrenderer
+
 gdk = gtk.gdk
 
 ################################################################################
@@ -99,9 +100,7 @@ def _files_same(lof, regexes):
     _cache[ lof ] = misc.struct(sigs=sigs, result=result)
     return result
 
-COL_EMBLEM = tree.COL_END + 1
-pixbuf_newer = gnomeglade.load_pixbuf(paths.icon_dir("tree-file-newer.png"), 14)
-TYPE_PIXBUF = type(pixbuf_newer)
+COL_EMBLEM, COL_END = tree.COL_END, tree.COL_END + 1
 
 ################################################################################
 #
@@ -110,49 +109,8 @@ TYPE_PIXBUF = type(pixbuf_newer)
 ################################################################################
 class DirDiffTreeStore(tree.DiffTreeStore):
     def __init__(self, ntree):
-        types = [type("")] * COL_EMBLEM * ntree
-        types[tree.COL_ICON*ntree:tree.COL_ICON*ntree+ntree] = [TYPE_PIXBUF] * ntree
-        types[COL_EMBLEM*ntree:COL_EMBLEM*ntree+ntree] = [TYPE_PIXBUF] * ntree
-        gtk.TreeStore.__init__(self, *types)
-        self.ntree = ntree
-        self._setup_default_styles()
-
-################################################################################
-#
-# EmblemCellRenderer
-#
-################################################################################
-class EmblemCellRenderer(gtk.GenericCellRenderer):
-    __gproperties__ = {
-        'pixbuf': (gtk.gdk.Pixbuf, 'pixmap property', 'the base pixmap', gobject.PARAM_READWRITE),
-        'emblem': (gtk.gdk.Pixbuf, 'emblem property', 'the emblem pixmap', gobject.PARAM_READWRITE),
-    }
-    def __init__(self):
-        self.__gobject_init__()
-        self.renderer = gtk.CellRendererPixbuf()
-        self.pixbuf = None
-        self.emblem = None
-
-    def do_set_property(self, pspec, value):
-        if not hasattr(self, pspec.name):
-            raise AttributeError, 'unknown property %s' % pspec.name
-        setattr(self, pspec.name, value)
-    def do_get_property(self, pspec):
-        return getattr(self, pspec.name)
-
-    def on_render(self, window, widget, background_area, cell_area, expose_area, flags):
-        r = self.renderer
-        r.props.pixbuf = self.pixbuf
-        r.render(window, widget, background_area, cell_area, expose_area, flags)
-        r.props.pixbuf = self.emblem
-        r.render(window, widget, background_area, cell_area, expose_area, flags)
-
-    def on_get_size(self, widget, cell_area):
-        if not hasattr(self, "size"):
-            r = self.renderer
-            r.props.pixbuf = self.pixbuf
-            self.size = r.get_size(widget, cell_area)
-        return self.size
+        types = [str] * COL_END * ntree
+        tree.DiffTreeStore.__init__(self, ntree, types)
 
 ################################################################################
 #
@@ -224,12 +182,15 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
             self.treeview[i].get_selection().set_mode(gtk.SELECTION_MULTIPLE)
             column = gtk.TreeViewColumn()
             rentext = gtk.CellRendererText()
-            renicon = EmblemCellRenderer()
+            renicon = ui.emblemcellrenderer.EmblemCellRenderer()
             column.pack_start(renicon, expand=0)
             column.pack_start(rentext, expand=1)
-            column.set_attributes(renicon, pixbuf=self.model.column_index(tree.COL_ICON,i),
-                                           emblem=self.model.column_index(COL_EMBLEM,i))
-            column.set_attributes(rentext, markup=self.model.column_index(tree.COL_TEXT,i))
+            col_index = self.model.column_index
+            column.set_attributes(rentext, markup=col_index(tree.COL_TEXT,i))
+            column.set_attributes(renicon,
+                                  icon_name=col_index(tree.COL_ICON, i),
+                                  emblem_name=col_index(COL_EMBLEM, i),
+                                  icon_tint=col_index(tree.COL_TINT, i))
             self.treeview[i].append_column(column)
             self.scrolledwindow[i].get_vadjustment().connect("value-changed", self._sync_vscroll )
             self.scrolledwindow[i].get_hadjustment().connect("value-changed", self._sync_hscroll )
@@ -820,7 +781,7 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
                     self.model.set_state(it, j,  tree.STATE_MODIFIED, isdir)
                 self.model.set_value(it,
                     self.model.column_index(COL_EMBLEM, j),
-                    j == newest_index and pixbuf_newer or None)
+                    j == newest_index and "emblem-meld-newer-file" or None)
                 one_isdir[j] = isdir
         for j in range(self.model.ntree):
             if not mod_times[j]:
diff --git a/meld/filediff.py b/meld/filediff.py
index 76b5df8..ce9ff0f 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -521,12 +521,17 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
             self.textview[i].set_tabs(tabs)
         for i in range(2):
             self.linkmap[i].queue_draw()
-        load = lambda x: gnomeglade.load_pixbuf(paths.icon_dir(x), self.pixels_per_line)
-        self.pixbuf_apply0 = load("button_apply0.xpm")
-        self.pixbuf_apply1 = load("button_apply1.xpm")
-        self.pixbuf_delete = load("button_delete.xpm")
-        self.pixbuf_copy0  = load("button_copy0.xpm")
-        self.pixbuf_copy1  = load("button_copy1.xpm")
+
+        icon_theme = gtk.icon_theme_get_default()
+        load = lambda x: icon_theme.load_icon(x, self.pixels_per_line, 0)
+        self.pixbuf_apply0 = load("button_apply0")
+        self.pixbuf_apply1 = load("button_apply1")
+        self.pixbuf_delete = load("button_delete")
+        # FIXME: this is a somewhat bizarre action to take, but our non-square
+        # icons really make this kind of handling difficult
+        load = lambda x: icon_theme.load_icon(x, self.pixels_per_line * 2, 0)
+        self.pixbuf_copy0  = load("button_copy0")
+        self.pixbuf_copy1  = load("button_copy1")
 
     def on_preference_changed(self, key, value):
         if key == "tab_size":
diff --git a/meld/meldapp.py b/meld/meldapp.py
index 9b2a0cb..96bcdde 100644
--- a/meld/meldapp.py
+++ b/meld/meldapp.py
@@ -505,7 +505,7 @@ class MeldApp(gnomeglade.Component):
     def append_dirdiff(self, dirs, auto_compare=False):
         assert len(dirs) in (1,2,3)
         doc = dirdiff.DirDiff(self.prefs, len(dirs))
-        self._append_page(doc, "tree-folder-normal")
+        self._append_page(doc, "folder")
         doc.set_locations(dirs)
         # FIXME: This doesn't work, as dirdiff behaves differently to vcview
         if auto_compare:
@@ -522,7 +522,7 @@ class MeldApp(gnomeglade.Component):
         seq.clear()
         seq.connect("can-undo", self.on_can_undo)
         seq.connect("can-redo", self.on_can_redo)
-        self._append_page(doc, "tree-file-normal")
+        self._append_page(doc, "text-x-generic")
         doc.set_files(files)
         return doc
 
@@ -557,6 +557,7 @@ class MeldApp(gnomeglade.Component):
         assert len(locations) in (1,)
         location = locations[0]
         doc = vcview.VcView(self.prefs)
+        # FIXME: need a good themed VC icon
         self._append_page(doc, "vc-icon")
         doc.set_location(location)
         if auto_compare:
diff --git a/meld/tree.py b/meld/tree.py
index 3b58927..430fbb3 100644
--- a/meld/tree.py
+++ b/meld/tree.py
@@ -20,27 +20,17 @@ import gtk
 from ui import gnomeglade
 import paths
 
-COL_PATH, COL_STATE, COL_TEXT, COL_ICON, COL_END = range(5)
+COL_PATH, COL_STATE, COL_TEXT, COL_ICON, COL_TINT, COL_END = range(6)
 
 from vc._vc import STATE_IGNORED, STATE_NONE, STATE_NORMAL, STATE_NOCHANGE, \
     STATE_ERROR, STATE_EMPTY, STATE_NEW, \
     STATE_MODIFIED, STATE_CONFLICT, STATE_REMOVED, \
     STATE_MISSING, STATE_MAX
 
-load = lambda x,s=14: gnomeglade.load_pixbuf(paths.icon_dir(x), s)
-pixbuf_folder = load("tree-folder-normal.png", 20)
-pixbuf_folder_new = load("tree-folder-new.png", 20)
-pixbuf_folder_changed = load("tree-folder-changed.png", 20)
-pixbuf_folder_missing = load("tree-folder-missing.png", 20)
-pixbuf_file = load("tree-file-normal.png")
-pixbuf_file_new = load("tree-file-new.png")
-pixbuf_file_changed = load("tree-file-changed.png")
-pixbuf_file_missing = load("tree-file-missing.png")
 
 class DiffTreeStore(gtk.TreeStore):
-    def __init__(self, ntree = 3, num_col = COL_END):
-        types = [type("")] * num_col * ntree
-        types[COL_ICON*ntree:COL_ICON*ntree+ntree] = [type(pixbuf_file)] * ntree
+
+    def __init__(self, ntree, types):
         gtk.TreeStore.__init__(self, *types)
         self.ntree = ntree
         self._setup_default_styles()
@@ -60,20 +50,36 @@ class DiffTreeStore(gtk.TreeStore):
             '<span foreground="#888888" strikethrough="true">%s</span>' # STATE_MISSING
         ]
         assert len(self.textstyle) == STATE_MAX
+
         self.pixstyle = [
-            (pixbuf_file, pixbuf_folder), # IGNORED
-            (pixbuf_file, pixbuf_folder), # NONE
-            (pixbuf_file, pixbuf_folder), # NORMAL
-            (pixbuf_file, pixbuf_folder), # NOCHANGE
-            (None, None), # ERROR
-            (None, None), # EMPTY
-            (pixbuf_file_new, pixbuf_folder_new), # NEW
-            (pixbuf_file_changed, pixbuf_folder_changed), # MODIFIED
-            (pixbuf_file_changed, pixbuf_folder_changed), # CONFLICT
-            (pixbuf_file_changed, pixbuf_folder_changed), # REMOVED
-            (pixbuf_file_missing, pixbuf_folder_missing) # MISSING
+            ("text-x-generic", "folder"), # IGNORED
+            ("text-x-generic", "folder"), # NONE
+            ("text-x-generic", "folder"), # NORMAL
+            ("text-x-generic", "folder"), # NOCHANGE
+            (None,             None),     # ERROR
+            (None,             None),     # EMPTY
+            ("text-x-generic", "folder"), # NEW
+            ("text-x-generic", "folder"), # MODIFIED
+            ("text-x-generic", "folder"), # CONFLICT
+            ("text-x-generic", "folder"), # REMOVED
+            ("text-x-generic", "folder"), # MISSING
         ]
-        assert len(self.pixstyle) == STATE_MAX
+
+        self.icon_tints = [
+            (None,      None),      # IGNORED
+            (None,      None),      # NONE
+            (None,      None),      # NORMAL
+            (None,      None),      # NOCHANGE
+            (None,      None),      # ERROR
+            (None,      None),      # EMPTY
+            ("#00ff00", None),      # NEW
+            ("#ff0000", None),      # MODIFIED
+            ("#ff0000", None),      # CONFLICT
+            ("#ff0000", None),      # REMOVED
+            ("#ffffff", "#ffffff"), # MISSING
+        ]
+
+        assert len(self.pixstyle) == len(self.icon_tints) == STATE_MAX
 
     def add_entries(self, parent, names):
         child = self.append(parent)
@@ -94,6 +100,8 @@ class DiffTreeStore(gtk.TreeStore):
         for i in range(self.ntree):
             self.set_value(err, self.column_index(COL_STATE,i), STATE_ERROR)
         self.set_value(err, self.column_index(COL_ICON, pane), self.pixstyle[STATE_ERROR][0] )
+        self.set_value(err, self.column_index(COL_TINT, pane),
+                       self.icon_tints[STATE_ERROR][0])
         self.set_value(err, self.column_index(COL_TEXT, pane), self.textstyle[STATE_ERROR] % gobject.markup_escape_text(msg))
 
     def value_paths(self, it):
@@ -109,9 +117,11 @@ class DiffTreeStore(gtk.TreeStore):
         STATE = self.column_index(COL_STATE, pane)
         TEXT  = self.column_index(COL_TEXT,  pane)
         ICON  = self.column_index(COL_ICON,  pane)
+        TINT  = self.column_index(COL_TINT,  pane)
         self.set_value(it, STATE, state)
         self.set_value(it, TEXT,  self.textstyle[state] % name)
         self.set_value(it, ICON,  self.pixstyle[state][isdir])
+        self.set_value(it, TINT,  self.icon_tints[state][isdir])
 
     def get_state(self, it, pane):
         STATE = self.column_index(COL_STATE, pane)
diff --git a/meld/ui/emblemcellrenderer.py b/meld/ui/emblemcellrenderer.py
new file mode 100644
index 0000000..283360b
--- /dev/null
+++ b/meld/ui/emblemcellrenderer.py
@@ -0,0 +1,118 @@
+### Copyright (C) 2002-2006 Stephen Kennedy <stevek gnome org>
+### Copyright (C) 2010 Kai Willadsen <kai willadsen gmail com>
+
+### This program is free software; you can redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 2 of the License, or
+### (at your option) any later version.
+
+### This program is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+
+### You should have received a copy of the GNU General Public License
+### along with this program; if not, write to the Free Software
+### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import cairo
+import gobject
+import gtk
+
+
+class EmblemCellRenderer(gtk.GenericCellRenderer):
+
+    __gproperties__ = {
+        "icon-name":   (str, "Named icon",
+                        "Name for base icon",
+                        "text-x-generic", gobject.PARAM_READWRITE),
+        "emblem-name": (str, "Named emblem icon",
+                        "Name for emblem icon to overlay",
+                        None, gobject.PARAM_READWRITE),
+        "icon-tint":   (str, "Icon tint",
+                        "GDK-parseable color to be used to tint icon",
+                        None, gobject.PARAM_READWRITE),
+    }
+
+    def __init__(self):
+        self.__gobject_init__()
+        self._icon_name = "text-x-generic"
+        self._emblem_name = None
+        self._icon_tint = None
+        self._tint_color = None
+        self._state = None
+        # FIXME: hardcoded sizes
+        self._icon_size = 16
+        self._emblem_size = 8
+
+    def do_set_property(self, pspec, value):
+        if pspec.name == "icon-name":
+            self._icon_name = value
+        elif pspec.name == "emblem-name":
+            self._emblem_name = value
+        elif pspec.name == "icon-tint":
+            self._icon_tint = value
+            if self._icon_tint:
+                self._tint_color = gtk.gdk.color_parse(value)
+            else:
+                self._tint_color = None
+        else:
+            raise AttributeError, "unknown property %s" % name
+
+    def do_get_property(self, pspec):
+        if pspec.name == "icon-name":
+            return self._icon_name
+        elif pspec.name == "emblem-name":
+            return self._emblem_name
+        elif pspec.name == "icon-tint":
+            return self._icon_tint
+        else:
+            raise AttributeError, "unknown property %s" % name
+
+    def on_render(self, window, widget, background_area, cell_area,
+                  expose_area, flags):
+        context = window.cairo_create()
+        context.translate(cell_area.x, cell_area.y)
+        context.rectangle(0, 0, cell_area.width, cell_area.height)
+        context.clip()
+
+        # TODO: Incorporate padding
+        context.push_group()
+        if self._icon_name:
+            icon_theme = gtk.icon_theme_get_default()
+            # Assumes square icons; may break if we don't get the requested size
+            pixbuf = icon_theme.load_icon(self._icon_name,
+                                          self._icon_size, 0).copy() # FIXME: copy?
+
+            context.set_operator(cairo.OPERATOR_SOURCE)
+            context.set_source_pixbuf(pixbuf, 0, 0)
+            context.rectangle(0, 0, cell_area.width, cell_area.height)
+            context.fill()
+
+            if self._tint_color:
+                c = self._tint_color
+                context.set_source_rgba(c.red, c.green, c.blue, 0.2)
+                context.set_operator(cairo.OPERATOR_ATOP)
+                context.paint()
+
+            if self._emblem_name:
+                emblem_pixbuf = icon_theme.load_icon(self._emblem_name,
+                                                     self._emblem_size, 0)
+
+                x_offset = self._icon_size - self._emblem_size
+                context.set_operator(cairo.OPERATOR_OVER)
+                context.set_source_pixbuf(emblem_pixbuf, x_offset, 0)
+                context.rectangle(x_offset, 0,
+                                  cell_area.width, self._emblem_size)
+                context.fill()
+
+        context.set_source(context.pop_group())
+        context.set_operator(cairo.OPERATOR_OVER)
+        context.paint()
+
+    def on_get_size(self, widget, cell_area):
+        # TODO: Account for cell_area if we have alignment set
+        x_offset, y_offset = 0, 0
+        width, height = self._icon_size, self._icon_size
+        # TODO: Account for padding
+        return (x_offset, y_offset, width, height)
diff --git a/meld/ui/gnomeglade.py b/meld/ui/gnomeglade.py
index a4336bc..8f4b1e2 100644
--- a/meld/ui/gnomeglade.py
+++ b/meld/ui/gnomeglade.py
@@ -116,16 +116,5 @@ def connect_signal_handlers(obj):
             print ('Warning: attribute %r not connected'
                    ' as a signal handler' % (attr,))
 
-def load_pixbuf(fname, size=0):
-    """Load an image from a file as a pixbuf, with optional resizing.
-    """
-    image = gtk.Image()
-    image.set_from_file(fname)
-    image = image.get_pixbuf()
-    if size:
-        aspect = float(image.get_height()) / image.get_width()
-        image = image.scale_simple(size, int(aspect*size), 2)
-    return image
-
 
 import gladesupport
diff --git a/meld/vcview.py b/meld/vcview.py
index 4b47797..5cbd6a4 100644
--- a/meld/vcview.py
+++ b/meld/vcview.py
@@ -25,6 +25,7 @@ import misc
 from ui import gnomeglade
 import melddoc
 import paths
+import ui.emblemcellrenderer
 import vc
 
 ################################################################################
@@ -88,7 +89,9 @@ COL_LOCATION, COL_STATUS, COL_REVISION, COL_TAG, COL_OPTIONS, COL_END = range(tr
 
 class VcTreeStore(tree.DiffTreeStore):
     def __init__(self):
-        tree.DiffTreeStore.__init__(self, 1, COL_END)
+        ntree = 1
+        types = [str] * COL_END * ntree
+        tree.DiffTreeStore.__init__(self, ntree, types)
         self.textstyle[tree.STATE_MISSING] = '<span foreground="#000088" strikethrough="true" weight="bold">%s</span>'
 
 ################################################################################
@@ -161,12 +164,15 @@ class VcView(melddoc.MeldDoc, gnomeglade.Component):
         self.treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
         self.treeview.set_headers_visible(1)
         column = gtk.TreeViewColumn( _("Name") )
-        renpix = gtk.CellRendererPixbuf()
+        renicon = ui.emblemcellrenderer.EmblemCellRenderer()
         rentext = gtk.CellRendererText()
-        column.pack_start(renpix, expand=0)
+        column.pack_start(renicon, expand=0)
         column.pack_start(rentext, expand=1)
-        column.set_attributes(renpix, pixbuf=self.model.column_index(tree.COL_ICON, 0))
-        column.set_attributes(rentext, markup=self.model.column_index(tree.COL_TEXT, 0))
+        col_index = self.model.column_index
+        column.set_attributes(renicon,
+                              icon_name=col_index(tree.COL_ICON, 0),
+                              icon_tint=col_index(tree.COL_TINT, 0))
+        column.set_attributes(rentext, markup=col_index(tree.COL_TEXT, 0))
         self.treeview.append_column(column)
 
         def addCol(name, num):



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]