[meld] filediff: Add highlight to chunk-based navigation



commit 5c82d129bfcc1bc69b89c1ed89f135b9e153ae62
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Wed Mar 14 05:45:36 2012 +1000

    filediff: Add highlight to chunk-based navigation
    
    When the user moves between chunks with next/previous actions, we now
    add a fading highlight to indicate the destination chunk, as another
    way to help orientate the user in cases of sudden movement.

 data/styles/meld-base.xml |    2 +-
 meld/filediff.py          |   13 ++++++++++++-
 meld/misc.py              |    1 +
 meld/sourceview.py        |   25 +++++++++++++++++++------
 4 files changed, 33 insertions(+), 8 deletions(-)
---
diff --git a/data/styles/meld-base.xml b/data/styles/meld-base.xml
index 5955b4a..8b8b58b 100644
--- a/data/styles/meld-base.xml
+++ b/data/styles/meld-base.xml
@@ -9,7 +9,7 @@
   <style name="meld:delete" background="#ffffff" foreground="#880000" line-background="#cccccc"/>
   <style name="meld:error" background="#fce94f" foreground="#faad3d" line-background="#fade0a"/>
   <style name="meld:inline" background="#8ac2ff"/>
-  <style name="meld:current-line-highlight" background="#ffff00"/>
+  <style name="meld:current-line-highlight" foreground="#333333" background="#ffff00"/>
   <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)"/>
diff --git a/meld/filediff.py b/meld/filediff.py
index e836d0e..010ac0e 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -40,7 +40,8 @@ from meld.matchers.merge import Merger
 from meld.patchdialog import PatchDialog
 from meld.recent import RecentType
 from meld.settings import bind_settings, meldsettings
-from meld.sourceview import LanguageManager, get_custom_encoding_candidates
+from meld.sourceview import (
+    LanguageManager, TextviewLineAnimationType, get_custom_encoding_candidates)
 from meld.ui.findbar import FindBar
 
 
@@ -498,6 +499,16 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         self.textview[pane].scroll_to_mark(
             buf.get_insert(), tolerance, True, 0.5, 0.5)
 
+        # If we've moved to a valid chunk (or stayed in the first/last chunk)
+        # then briefly highlight the chunk for better visual orientation.
+        chunk_start = buf.get_iter_at_line_or_eof(chunk[1])
+        chunk_end = buf.get_iter_at_line_or_eof(chunk[2])
+        mark0 = buf.create_mark(None, chunk_start, True)
+        mark1 = buf.create_mark(None, chunk_end, True)
+        self.textview[pane].add_fading_highlight(
+            mark0, mark1, 'focus-highlight', 400000, starting_alpha=0.3,
+            anim_type=TextviewLineAnimationType.stroke)
+
     def on_linkmap_scroll_event(self, linkmap, event):
         self.next_diff(event.direction)
 
diff --git a/meld/misc.py b/meld/misc.py
index 2a65de0..e767141 100644
--- a/meld/misc.py
+++ b/meld/misc.py
@@ -219,6 +219,7 @@ def get_common_theme():
         "conflict": lookup("meld:conflict", "background"),
         "replace": lookup("meld:replace", "background"),
         "error": lookup("meld:error", "background"),
+        "focus-highlight": lookup("meld:current-line-highlight", "foreground"),
         "current-chunk-highlight": lookup(
             "meld:current-chunk-highlight", "background")
     }
diff --git a/meld/sourceview.py b/meld/sourceview.py
index 1f69c5b..df3528c 100644
--- a/meld/sourceview.py
+++ b/meld/sourceview.py
@@ -15,6 +15,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import logging
+from enum import Enum
 
 from gi.repository import Gdk
 from gi.repository import Gio
@@ -70,17 +71,23 @@ class LanguageManager(object):
         return cls.manager.guess_language(None, content_type)
 
 
+class TextviewLineAnimationType(Enum):
+    fill = 'fill'
+    stroke = 'stroke'
+
+
 class TextviewLineAnimation(object):
     __slots__ = ("start_mark", "end_mark", "start_rgba", "end_rgba",
-                 "start_time", "duration")
+                 "start_time", "duration", "anim_type")
 
-    def __init__(self, mark0, mark1, rgba0, rgba1, duration):
+    def __init__(self, mark0, mark1, rgba0, rgba1, duration, anim_type):
         self.start_mark = mark0
         self.end_mark = mark1
         self.start_rgba = rgba0
         self.end_rgba = rgba1
         self.start_time = GLib.get_monotonic_time()
         self.duration = duration
+        self.anim_type = anim_type
 
 
 class MeldSourceView(GtkSource.View):
@@ -164,12 +171,15 @@ class MeldSourceView(GtkSource.View):
     def get_line_num_for_y(self, y):
         return self.get_line_at_y(y)[0].get_line()
 
-    def add_fading_highlight(self, mark0, mark1, colour_name, duration):
+    def add_fading_highlight(
+            self, mark0, mark1, colour_name, duration,
+            anim_type=TextviewLineAnimationType.fill, starting_alpha=1.0):
         rgba0 = self.fill_colors[colour_name].copy()
         rgba1 = self.fill_colors[colour_name].copy()
-        rgba0.alpha = 1.0
+        rgba0.alpha = starting_alpha
         rgba1.alpha = 0.0
-        anim = TextviewLineAnimation(mark0, mark1, rgba0, rgba1, duration)
+        anim = TextviewLineAnimation(
+            mark0, mark1, rgba0, rgba1, duration, anim_type)
         self.animating_chunks.append(anim)
 
     def on_setting_changed(self, settings, key):
@@ -274,7 +284,10 @@ class MeldSourceView(GtkSource.View):
 
             context.set_source_rgba(*rgba)
             context.rectangle(x, ystart - visible.y, width, yend - ystart)
-            context.fill()
+            if c.anim_type == TextviewLineAnimationType.stroke:
+                context.stroke()
+            else:
+                context.fill()
 
             if current_time <= c.start_time + c.duration:
                 new_anim_chunks.append(c)


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