1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-20 08:27:59 +01:00

Scroll any focused scrollable element rather than the entire window. Closes issue #61.

This commit is contained in:
Kris Maglione
2009-10-06 20:19:12 -04:00
parent 63e0ef561d
commit f8bbd77356
2 changed files with 76 additions and 22 deletions

View File

@@ -81,18 +81,83 @@ function Buffer() //{{{
return win; return win;
} }
// both values are given in percent, -1 means no change function findScrollable(dir, horiz)
{
let pos = "scrollTop", size = "clientHeight", max = "scrollHeight";
if (horiz)
pos = "scrollLeft", size = "clientWidth", max = "scrollWidth";
function find(elem)
{
for (; elem && elem.parentNode instanceof Element; elem = elem.parentNode)
if (dir < 0 && elem[pos] > 0 || dir > 0 && elem[pos] + elem[size] < elem[max])
break;
return elem;
}
if (content.getSelection().rangeCount)
var elem = find(content.getSelection().getRangeAt(0).startContainer);
if (!(elem instanceof Element))
{
let doc = findScrollableWindow().document;
elem = find(doc.body ||
buffer.evaluateXPath("//body || //xhtml:body", doc).snapshotItem(0) ||
doc.documentElement);
}
return elem;
}
function scrollVert(elem, type, num)
{
elem = elem || findScrollable(num, false);
let fontSize = parseInt(util.computedStyle(elem).fontSize);
let increment;
if (type == "lines")
increment = fontSize;
else if (type == "pages")
increment = elem.clientHeight - fontSize;
else
throw Error()
elem.scrollTop += num * increment;
}
function scrollHoriz(elem, type, num)
{
elem = elem || findScrollable(num, true);
let fontSize = parseInt(util.computedStyle(elem).fontSize);
let increment;
if (type == "columns")
increment = fontSize; // Good enough, I suppose.
else if (type == "pages")
increment = elem.clientWidth - fontSize;
else
throw Error()
elem.scrollLeft += num * increment;
}
function scrollElemToPercentiles(elem, horizontal, vertical)
{
elem = elem || findScrollable();
marks.add("'", true);
if (horizontal != null)
elem.scrollLeft = (elem.scrollWidth - elem.clientWidth) * (horizontal / 100);
if (vertical != null)
elem.scrollTop = (elem.scrollHeight - elem.clientHeight) * (vertical / 100);
}
function scrollToPercentiles(horizontal, vertical) function scrollToPercentiles(horizontal, vertical)
{ {
let win = findScrollableWindow(); let win = findScrollableWindow();
let h, v; let h, v;
if (horizontal < 0) if (horizontal == null)
h = win.scrollX; h = win.scrollX;
else else
h = win.scrollMaxX / 100 * horizontal; h = win.scrollMaxX / 100 * horizontal;
if (vertical < 0) if (vertical == null)
v = win.scrollY; v = win.scrollY;
else else
v = win.scrollMaxY / 100 * vertical; v = win.scrollMaxY / 100 * vertical;
@@ -1268,7 +1333,7 @@ function Buffer() //{{{
*/ */
scrollBottom: function () scrollBottom: function ()
{ {
scrollToPercentiles(-1, 100); scrollToPercentiles(null, 100);
}, },
/** /**
@@ -1279,13 +1344,7 @@ function Buffer() //{{{
*/ */
scrollColumns: function (cols) scrollColumns: function (cols)
{ {
let win = findScrollableWindow(); scrollHoriz(null, "columns", cols);
const COL_WIDTH = 20;
if (cols > 0 && win.scrollX >= win.scrollMaxX || cols < 0 && win.scrollX == 0)
liberator.beep();
win.scrollBy(COL_WIDTH * cols, 0);
}, },
/** /**
@@ -1293,7 +1352,7 @@ function Buffer() //{{{
*/ */
scrollEnd: function () scrollEnd: function ()
{ {
scrollToPercentiles(100, -1); scrollToPercentiles(100, null);
}, },
/** /**
@@ -1304,9 +1363,7 @@ function Buffer() //{{{
*/ */
scrollLines: function (lines) scrollLines: function (lines)
{ {
let win = findScrollableWindow(); scrollVert(null, "lines", lines);
checkScrollYBounds(win, lines);
win.scrollByLines(lines);
}, },
/** /**
@@ -1317,9 +1374,7 @@ function Buffer() //{{{
*/ */
scrollPages: function (pages) scrollPages: function (pages)
{ {
let win = findScrollableWindow(); scrollVert(null, "pages", pages);
checkScrollYBounds(win, pages);
win.scrollByPages(pages);
}, },
/** /**
@@ -1372,7 +1427,7 @@ function Buffer() //{{{
*/ */
scrollStart: function () scrollStart: function ()
{ {
scrollToPercentiles(0, -1); scrollToPercentiles(0, null);
}, },
/** /**
@@ -1380,7 +1435,7 @@ function Buffer() //{{{
*/ */
scrollTop: function () scrollTop: function ()
{ {
scrollToPercentiles(-1, 0); scrollToPercentiles(null, 0);
}, },
// TODO: allow callback for filtering out unwanted frames? User defined? // TODO: allow callback for filtering out unwanted frames? User defined?

View File

@@ -1079,8 +1079,7 @@ const liberator = (function () //{{{
{ {
if (typeof msg == "object") if (typeof msg == "object")
msg = util.objectToString(msg); msg = util.objectToString(msg);
else msg = String.replace(msg, /\n?$/, "\n");
msg += "\n";
window.dump(msg.replace(/^./gm, ("config" in modules && config.name.toLowerCase()) + ": $&")); window.dump(msg.replace(/^./gm, ("config" in modules && config.name.toLowerCase()) + ": $&"));
}, },