[meld: 2/7] A new version of smart scrolling [issue #78].



commit 5b7bda933ea0f6fbb49f988ea0d159c7878ed4e7
Author: Heikki Ketoharju <heikki ketoharju iki fi>
Date:   Thu Jan 31 23:43:02 2019 +0200

    A new version of smart scrolling [issue #78].
    
    This version takes screen position into account when scrolled with mouse
    and jumps to the next/previous diff outside the screen.

 meld/filediff.py | 40 ++++++++++------------------------------
 1 file changed, 10 insertions(+), 30 deletions(-)
---
diff --git a/meld/filediff.py b/meld/filediff.py
index 044788b1..e4ef96b1 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -620,40 +620,20 @@ class FileDiff(Gtk.VBox, MeldDoc):
                 return
 
 
-            #Count the down top and bottom 25% of the window
-            topedge = text_area.y
-            bottomedge = text_area.y+text_area.height
-
-            topline = self.textview[pane].get_line_at_y(
-                topedge).target_iter.get_line()
-            bottomline = self.textview[pane].get_line_at_y(
-                bottomedge).target_iter.get_line()
-
-            topquarter = self.textview[pane].get_line_at_y(
-                topedge + text_area.height / 4).target_iter.get_line()
-            bottomquarter = self.textview[pane].get_line_at_y(
-                bottomedge - text_area.height / 4).target_iter.get_line()
-
-            while chunk[1] < topquarter and direction == Gdk.ScrollDirection.DOWN:
-                target += 1
-                if(target > self.linediffer.diff_count()):
-                    return
-
-                chunk = self.linediffer.get_chunk(target, pane)
-                if not chunk:
-                    return
+            halfscreen = text_area.y+text_area.height / 2
+            halfline = self.textview[pane].get_line_at_y(
+                halfscreen).target_iter.get_line()
 
-            while chunk[1] > bottomquarter and direction == Gdk.ScrollDirection.UP:
-                target -= 1
-                if target < 0:
-                    return
+            (current, prev, next) = self.linediffer.locate_chunk(1, halfline)
 
-                chunk = self.linediffer.get_chunk(target, pane)
-                if not chunk:
-                    return
+            if direction == Gdk.ScrollDirection.DOWN:
+                target = next
+            else:
+                target = prev
 
         self.go_to_chunk(target, centered=centered)
 
+
     @Template.Callback()
     def action_previous_conflict(self, *args):
         self.go_to_chunk(self.cursor.prev_conflict, self.cursor.pane)
@@ -2192,4 +2172,4 @@ class FileDiff(Gtk.VBox, MeldDoc):
         for mgr in self.msgarea_mgr:
             if mgr.get_msg_id() == FileDiff.MSG_SYNCPOINTS:
                 mgr.clear()
-        self.refresh_comparison()
+        self.refresh_comparison()
\ No newline at end of file


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