[meld] dirdiff: Check for symlinks and display a secondary emblem (ggo#46)



commit cfa36661bf18fe7b4096c3dd4a85dde8c520e83d
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Sun Jan 11 12:46:23 2015 +1000

    dirdiff: Check for symlinks and display a secondary emblem (ggo#46)

 meld/dirdiff.py               | 36 +++++++++++++++++++++++++++---------
 meld/ui/emblemcellrenderer.py | 21 +++++++++++++++++++++
 2 files changed, 48 insertions(+), 9 deletions(-)
---
diff --git a/meld/dirdiff.py b/meld/dirdiff.py
index a3c7b759..e4b09eab 100644
--- a/meld/dirdiff.py
+++ b/meld/dirdiff.py
@@ -206,14 +206,15 @@ def _files_same(files, regexes, comparison_args):
 
 
 EMBLEM_NEW = "emblem-meld-newer-file"
+EMBLEM_SYMLINK = "emblem-symbolic-link"
 
-COL_EMBLEM, COL_SIZE, COL_TIME, COL_PERMS, COL_END = \
-        range(tree.COL_END, tree.COL_END + 5)
+COL_EMBLEM, COL_EMBLEM_SECONDARY, COL_SIZE, COL_TIME, COL_PERMS, COL_END = \
+        range(tree.COL_END, tree.COL_END + 6)
 
 
 class DirDiffTreeStore(tree.DiffTreeStore):
     def __init__(self, ntree):
-        tree.DiffTreeStore.__init__(self, ntree, [str, object, object, object])
+        tree.DiffTreeStore.__init__(self, ntree, [str, str, object, object, object])
 
 
 class CanonicalListing(object):
@@ -384,10 +385,13 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
                                   style=col_index(tree.COL_STYLE, i),
                                   weight=col_index(tree.COL_WEIGHT, i),
                                   strikethrough=col_index(tree.COL_STRIKE, 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))
+            column.set_attributes(
+                renicon,
+                icon_name=col_index(tree.COL_ICON, i),
+                emblem_name=col_index(COL_EMBLEM, i),
+                secondary_emblem_name=col_index(COL_EMBLEM_SECONDARY, i),
+                icon_tint=col_index(tree.COL_TINT, i)
+            )
             self.treeview[i].append_column(column)
             self.columns_dict[i]["name"] = column
             # Create file size CellRenderer
@@ -1261,16 +1265,27 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
         files = self.model.value_paths(it)
         regexes = [f.byte_filter for f in self.text_filters if f.active]
 
-        def stat(f):
+        def none_stat(f):
             try:
                 return os.stat(f)
             except OSError:
                 return None
-        stats = [stat(f) for f in files[:self.num_panes]]
+        stats = [none_stat(f) for f in files[:self.num_panes]]
         sizes = [s.st_size if s else 0 for s in stats]
         perms = [s.st_mode if s else 0 for s in stats]
         times = [s.st_mtime if s else 0 for s in stats]
 
+        def none_lstat(f):
+            try:
+                return os.lstat(f)
+            except OSError:
+                return None
+
+        lstats = [none_lstat(f) for f in files[:self.num_panes]]
+        symlinks = {
+            i for i, s in enumerate(lstats) if s and stat.S_ISLNK(s.st_mode)
+        }
+
         existing_times = [s.st_mtime for s in stats if s]
         newest_time = max(existing_times)
         if existing_times.count(newest_time) == len(existing_times):
@@ -1311,6 +1326,9 @@ class DirDiff(melddoc.MeldDoc, gnomeglade.Component):
                 self.model.set_path_state(it, j, state, isdir[j])
                 emblem = EMBLEM_NEW if j in newest else None
                 self.model.set_value(it, column_index(COL_EMBLEM), emblem)
+                link_emblem = EMBLEM_SYMLINK if j in symlinks else None
+                self.model.set_value(
+                    it, column_index(COL_EMBLEM_SECONDARY), link_emblem)
                 self.model.set_value(it, column_index(COL_TIME), times[j])
                 self.model.set_value(it, column_index(COL_SIZE), sizes[j])
                 self.model.set_value(it, column_index(COL_PERMS), perms[j])
diff --git a/meld/ui/emblemcellrenderer.py b/meld/ui/emblemcellrenderer.py
index a924aaec..f9fee222 100644
--- a/meld/ui/emblemcellrenderer.py
+++ b/meld/ui/emblemcellrenderer.py
@@ -31,6 +31,10 @@ class EmblemCellRenderer(Gtk.CellRenderer):
         "emblem-name": (str, "Named emblem icon",
                         "Name for emblem icon to overlay",
                         None, GObject.PARAM_READWRITE),
+        "secondary-emblem-name": (
+            str, "Named secondary emblem icon",
+            "Name for secondary 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),
@@ -42,6 +46,7 @@ class EmblemCellRenderer(Gtk.CellRenderer):
         super(EmblemCellRenderer, self).__init__()
         self._icon_name = "text-x-generic"
         self._emblem_name = None
+        self._secondary_emblem_name = None
         self._icon_tint = None
         self._tint_color = None
         self._state = None
@@ -54,6 +59,8 @@ class EmblemCellRenderer(Gtk.CellRenderer):
             self._icon_name = value
         elif pspec.name == "emblem-name":
             self._emblem_name = value
+        elif pspec.name == "secondary-emblem-name":
+            self._secondary_emblem_name = value
         elif pspec.name == "icon-tint":
             self._icon_tint = value
             if self._icon_tint:
@@ -69,6 +76,8 @@ class EmblemCellRenderer(Gtk.CellRenderer):
             return self._icon_name
         elif pspec.name == "emblem-name":
             return self._emblem_name
+        elif pspec.name == "secondary-emblem-name":
+            return self._secondary_emblem_name
         elif pspec.name == "icon-tint":
             return self._icon_tint
         else:
@@ -121,6 +130,18 @@ class EmblemCellRenderer(Gtk.CellRenderer):
                                   cell_area.width, self._emblem_size)
                 context.fill()
 
+            if self._secondary_emblem_name:
+                pixbuf = self._get_pixbuf(
+                    self._secondary_emblem_name, self._emblem_size)
+                x_offset = self._icon_size - self._emblem_size
+                y_offset = self._icon_size - self._emblem_size + height_offset
+                context.set_operator(cairo.OPERATOR_OVER)
+                Gdk.cairo_set_source_pixbuf(
+                    context, pixbuf, x_offset, y_offset)
+                context.rectangle(
+                    x_offset, y_offset, cell_area.width, self._emblem_size)
+                context.fill()
+
         context.pop_group_to_source()
         context.set_operator(cairo.OPERATOR_OVER)
         context.paint()


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