]> granicus.if.org Git - cgit/commitdiff
cgit.js: line range highlight: improve vertical scroll logic
authorAndy Green <andy@warmcat.com>
Fri, 22 Jun 2018 22:41:47 +0000 (06:41 +0800)
committerAndy Green <andy@warmcat.com>
Fri, 29 Jun 2018 06:30:23 +0000 (14:30 +0800)
Instead of following the browser heuristic to put any matching
id element to the top left of the browser window, compute the
number of visible lines vertically in the window, and the
middle of the highlit range, and try to centre the middle of
the highlit range in the window.

If the top of the range is no longer visible due to a range
consisting of more lines than the window can show, fall back to
placing the top of the range at the top of the window.

Signed-off-by: Andy Green <andy@warmcat.com>
cgit.js

diff --git a/cgit.js b/cgit.js
index 6cc27c117c2710d87efd789c6cc240fea6309ee1..d99c980e50e04197384fc62a6d75fbf341f538e0 100644 (file)
--- a/cgit.js
+++ b/cgit.js
@@ -57,7 +57,7 @@ function line_range_highlight()
        if (l2 < l1)
                l2 = l1;
 
-       var lh, etable, etr, de, n;
+       var lh, etable, etr, de, n, hl, v;
 
        e = document.getElementById('n' + l1);
        if (!e)
@@ -94,7 +94,18 @@ function line_range_highlight()
        while (n <= l2)
                document.getElementById('n' + n++).style.backgroundColor = "yellow";
 
-       e.scrollIntoView(true);
+       hl = (window.innerHeight / (e.offsetHeight + 1));
+       v = (l1 + ((l2 - l1) / 2)) - (hl / 2);
+       if (v > l1)
+               v = l1;
+       if (v < 1)
+               v = 1;
+
+       t = document.getElementById('n' + Math.round(v));
+       if (!t)
+               t = e;
+
+       t.scrollIntoView(true);
 }
 
 /* we have to use load, because header images can push the layout vertically */