diff options
author | svetelna <zu.miklankova@gmail.com> | 2020-04-20 15:42:04 +0200 |
---|---|---|
committer | svetelna <zu.miklankova@gmail.com> | 2020-05-02 21:27:28 +0200 |
commit | fb19a2815d2eaec1dd5a58939863f50e2e0aecd8 (patch) | |
tree | e0f391a8409bfd326dbacd77524cbdef511bea97 /qutebrowser/javascript | |
parent | 1b7946ed14b386a24db050f2d6dba81ba6518755 (diff) | |
download | qutebrowser-fb19a2815d2eaec1dd5a58939863f50e2e0aecd8.tar.gz qutebrowser-fb19a2815d2eaec1dd5a58939863f50e2e0aecd8.zip |
implementing visual-line-mode on webengine side
Diffstat (limited to 'qutebrowser/javascript')
-rw-r--r-- | qutebrowser/javascript/caret.js | 91 |
1 files changed, 75 insertions, 16 deletions
diff --git a/qutebrowser/javascript/caret.js b/qutebrowser/javascript/caret.js index 55ff6a8b5..6d7a3bb00 100644 --- a/qutebrowser/javascript/caret.js +++ b/qutebrowser/javascript/caret.js @@ -706,6 +706,16 @@ window._qutebrowser.caret = (function() { CaretBrowsing.isCaretVisible = false; /** + * selection modes + * @type {enum} + */ + CaretBrowsing.SelectionState = { + "NONE": 1, + "NORMAL": 2, + "LINE": 3, + }; + + /** * The actual caret element, an absolute-positioned flashing line. * @type {Element} */ @@ -887,7 +897,11 @@ window._qutebrowser.caret = (function() { CaretBrowsing.injectCaretStyles(); CaretBrowsing.toggle(); CaretBrowsing.initiated = true; - CaretBrowsing.selectionEnabled = selectionRange > 0; + if (selectionRange > 0) { + CaretBrowsing.selectionState = CaretBrowsing.SelectionState.NORMAL; + } else { + CaretBrowsing.selectionState = CaretBrowsing.SelectionState.NONE; + } }; /** @@ -1145,16 +1159,52 @@ window._qutebrowser.caret = (function() { } }; + CaretBrowsing.reverseSelection = () => { + const sel = window.getSelection(); + sel.setBaseAndExtent( + sel.extentNode, sel.extentOffset, sel.baseNode, + sel.baseOffset + ); + }; + + CaretBrowsing.selectLine = function() { + const sel = window.getSelection(); + sel.modify("extend", "right", "lineboundary"); + CaretBrowsing.reverseSelection(); + sel.modify("extend", "left", "lineboundary"); + CaretBrowsing.reverseSelection(); + }; + + CaretBrowsing.updateLineSelection = function(direction, granularity) { + if (!(granularity === "character") && !(granularity === "word")) { + window. + getSelection(). + modify("extend", direction, granularity); + CaretBrowsing.selectLine(); + } + }; + + CaretBrowsing.selectionEnabled = function() { + if (CaretBrowsing.selectionState === CaretBrowsing.SelectionState.NONE) { + return false; + } + return true; + }; + CaretBrowsing.move = function(direction, granularity, count = 1) { let action = "move"; - if (CaretBrowsing.selectionEnabled) { + if (CaretBrowsing.selectionState !== CaretBrowsing.SelectionState.NONE) { action = "extend"; } for (let i = 0; i < count; i++) { - window. - getSelection(). - modify(action, direction, granularity); + if (CaretBrowsing.selectionState === CaretBrowsing.SelectionState.LINE) { + CaretBrowsing.updateLineSelection(direction, granularity); + } else { + window. + getSelection(). + modify(action, direction, granularity); + } } if (CaretBrowsing.isWindows && @@ -1174,7 +1224,7 @@ window._qutebrowser.caret = (function() { CaretBrowsing.moveToBlock = function(paragraph, boundary, count = 1) { let action = "move"; - if (CaretBrowsing.selectionEnabled) { + if (CaretBrowsing.selectionState !== CaretBrowsing.SelectionState.NONE) { action = "extend"; } for (let i = 0; i < count; i++) { @@ -1185,6 +1235,10 @@ window._qutebrowser.caret = (function() { window. getSelection(). modify(action, boundary, "paragraphboundary"); + + if (CaretBrowsing.selectionState === CaretBrowsing.SelectionState.LINE) { + CaretBrowsing.selectLine(); + } } }; @@ -1294,14 +1348,14 @@ window._qutebrowser.caret = (function() { funcs.setInitialCursor = () => { if (!CaretBrowsing.initiated) { CaretBrowsing.setInitialCursor(); - return CaretBrowsing.selectionEnabled; + return CaretBrowsing.selectionEnabled(); } if (window.getSelection().toString().length === 0) { positionCaret(); } CaretBrowsing.toggle(); - return CaretBrowsing.selectionEnabled; + return CaretBrowsing.selectionEnabled(); }; funcs.setFlags = (flags) => { @@ -1399,17 +1453,22 @@ window._qutebrowser.caret = (function() { funcs.getSelection = () => window.getSelection().toString(); - funcs.toggleSelection = () => { - CaretBrowsing.selectionEnabled = !CaretBrowsing.selectionEnabled; - return CaretBrowsing.selectionEnabled; + funcs.toggleSelection = (line) => { + if (line) { + CaretBrowsing.selectionState = + CaretBrowsing.SelectionState.LINE; + CaretBrowsing.selectLine(); + CaretBrowsing.finishMove(); + } else if (CaretBrowsing.selectionState === CaretBrowsing.SelectionState.NONE) { + CaretBrowsing.selectionState = CaretBrowsing.SelectionState.NORMAL; + } else { + CaretBrowsing.selectionState = CaretBrowsing.SelectionState.NONE; + } + return CaretBrowsing.selectionState; }; funcs.reverseSelection = () => { - const sel = window.getSelection(); - sel.setBaseAndExtent( - sel.extentNode, sel.extentOffset, sel.baseNode, - sel.baseOffset - ); + CaretBrowsing.reverseSelection(); }; return funcs; |