[meld] dirdiff: Check for symlinks and display a secondary emblem (ggo#46)
- From: Kai Willadsen <kaiw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [meld] dirdiff: Check for symlinks and display a secondary emblem (ggo#46)
- Date: Sat, 16 Dec 2017 02:38:22 +0000 (UTC)
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]