[meld] Dim text ignored by filters



commit cef0f70c3f77c3a83c8b3807671ef76e292a0768
Author: David Rabel <David Rabel NoreSoft com>
Date:   Wed Oct 14 21:44:33 2015 +0200

    Dim text ignored by filters
    
    Filtered text that is not indicated somehow can lead to confusion,
    because for example Melds comparison algorithm does not distinguish
    between a blank line and a line that matches a text filter.
    
    Now the filtered text is dimmed, that means the foreground color of
    filtered text is changed to light grey to indicate that it is ignored by
    Melds comparison algorithm.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=633515

 data/styles/meld-base.xml |    1 +
 data/styles/meld-dark.xml |    1 +
 meld/filediff.py          |   26 +++++++++++++++++++++++---
 meld/meldbuffer.py        |    5 +++--
 meld/sourceview.py        |    4 ++++
 5 files changed, 32 insertions(+), 5 deletions(-)
---
diff --git a/data/styles/meld-base.xml b/data/styles/meld-base.xml
index 3ef4c25..bd7f4a9 100644
--- a/data/styles/meld-base.xml
+++ b/data/styles/meld-base.xml
@@ -13,4 +13,5 @@
   <style name="meld:unknown-text" foreground="#888888"/>
   <style name="meld:syncpoint-outline" foreground="#555555"/>
   <style name="meld:current-chunk-highlight" background="rgba(255, 255, 255, 0.5)"/>
+  <style name="meld:dimmed" foreground="#999999"/>
 </style-scheme>
diff --git a/data/styles/meld-dark.xml b/data/styles/meld-dark.xml
index 5b5ea48..aaa5bf1 100644
--- a/data/styles/meld-dark.xml
+++ b/data/styles/meld-dark.xml
@@ -14,4 +14,5 @@
   <style name="meld:unknown-text" background="#aaaaaa"/>
   <style name="meld:syncpoint-outline" foreground="#bbbbbb"/>
   <style name="meld:current-chunk-highlight" background="rgba(255, 255, 255, 0.1)"/>
+  <style name="meld:dimmed" foreground="#999999"/>
 </style-scheme>
diff --git a/meld/filediff.py b/meld/filediff.py
index f695509..301b316 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -762,17 +762,37 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
                                                 None, True)
             self.queue_draw()
 
-    def _filter_text(self, txt):
+    def _filter_text(self, txt, buf, start_iter, end_iter):
+        dimmed_tag = buf.get_tag_table().lookup("dimmed")
+        buf.remove_tag(dimmed_tag, start_iter, end_iter)
+        start = start_iter.copy()
+        end = start_iter.copy()
+
         def killit(m):
             assert m.group().count("\n") == 0
             if len(m.groups()):
                 s = m.group()
-                for g in m.groups():
+                for i in reversed(range(1, len(m.groups())+1)):
+                    g = m.group(i)
                     if g:
-                        s = s.replace(g,"")
+                        start.forward_chars(m.start(i))
+                        end.forward_chars(m.end(i))
+                        buf.apply_tag(dimmed_tag, start, end)
+                        start.forward_chars(-m.start(i))
+                        end.forward_chars(-m.end(i))
+
+                        s = s[:m.start(i)-m.start()]+s[m.end(i)-m.start():]
+
                 return s
             else:
+                start.forward_chars(m.start())
+                end.forward_chars(m.end())
+                buf.apply_tag(dimmed_tag, start, end)
+                start.forward_chars(-m.start())
+                end.forward_chars(-m.end())
+
                 return ""
+
         try:
             for filt in self.text_filters:
                 if filt.active:
diff --git a/meld/meldbuffer.py b/meld/meldbuffer.py
index 0a30ee1..a64685a 100644
--- a/meld/meldbuffer.py
+++ b/meld/meldbuffer.py
@@ -223,7 +223,7 @@ class BufferLines(object):
             end = self.buf.get_iter_at_line_or_eof(hi)
             txt = text_type(self.buf.get_text(start, end, False), 'utf8')
 
-            filter_txt = self.textfilter(txt)
+            filter_txt = self.textfilter(txt, self.buf, start, end)
             lines = filter_txt.splitlines()
             ends = filter_txt.splitlines(True)
 
@@ -269,7 +269,8 @@ class BufferLines(object):
             if not line_end.ends_line():
                 line_end.forward_to_line_end()
             txt = self.buf.get_text(line_start, line_end, False)
-            return text_type(self.textfilter(txt), 'utf8')
+            txt_filtered = self.textfilter(txt, self.buf, line_start, line_end)
+            return text_type(txt_filtered, 'utf8')
 
     def __len__(self):
         return self.buf.get_line_count()
diff --git a/meld/sourceview.py b/meld/sourceview.py
index 51c250e..6a3d0c1 100644
--- a/meld/sourceview.py
+++ b/meld/sourceview.py
@@ -124,6 +124,7 @@ class MeldSourceView(GtkSource.View):
 
         buf = meldbuffer.MeldBuffer()
         buf.create_tag("inline")
+        buf.create_tag("dimmed")
         self.set_buffer(buf)
 
         meldsettings.connect('changed', self.on_setting_changed)
@@ -162,6 +163,9 @@ class MeldSourceView(GtkSource.View):
             tag = self.get_buffer().get_tag_table().lookup("inline")
             tag.props.background_rgba = colour_lookup_with_fallback(
                 "meld:inline", "background")
+            tag = self.get_buffer().get_tag_table().lookup("dimmed")
+            tag.props.foreground_rgba = colour_lookup_with_fallback(
+                "meld:dimmed", "foreground")
 
     def do_realize(self):
         bind_settings(self)


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