From 8e222c1e675cc4b263f1f4f569907788a82ee10f Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sun, 18 Oct 2020 19:25:12 +0200 Subject: [PATCH] Change typewriter mode to scroll at any point --- CHANGELOG.md | 2 +- nw/gui/doceditor.py | 47 ++++++++++++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 801417bc..d93b0044 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # novelWriter ChangeLog -## Version 1.0 Release Beta 5 [2020-10-18] +## Version 1.0 Beta 5 [2020-10-18] **Important Notes** diff --git a/nw/gui/doceditor.py b/nw/gui/doceditor.py index 6d431319..12b038ca 100644 --- a/nw/gui/doceditor.py +++ b/nw/gui/doceditor.py @@ -61,6 +61,11 @@ logger = logging.getLogger(__name__) class GuiDocEditor(QTextEdit): + MOVE_KEYS = ( + Qt.Key_Left, Qt.Key_Right, Qt.Key_Up, Qt.Key_Down, + Qt.Key_PageUp, Qt.Key_PageDown + ) + def __init__(self, theParent): QTextEdit.__init__(self, theParent) @@ -765,34 +770,40 @@ class GuiDocEditor(QTextEdit): return elif keyEvent == QKeySequence.Redo: self.docAction(nwDocAction.REDO) + return elif keyEvent == QKeySequence.Undo: self.docAction(nwDocAction.UNDO) + return elif keyEvent == QKeySequence.SelectAll: self.docAction(nwDocAction.SEL_ALL) - else: - QTextEdit.keyPressEvent(self, keyEvent) - self.docFooter.updateLineCount() + return if self.mainConf.scollWithCursor: + + cOld = self.cursorRect().center().y() + QTextEdit.keyPressEvent(self, keyEvent) + kMod = keyEvent.modifiers() - if kMod == Qt.NoModifier or kMod == Qt.ShiftModifier: - hWid = self.viewport().height() - cPos = self.cursorRect().center().y() - mPos = self.mainConf.scollToPoint * hWid - vBar = self.verticalScrollBar() - - # Compute the needed scroll and duration - pOld = vBar.value() - pNew = pOld + cPos - round(mPos*0.01) - aDur = 150 + round(min(abs(pNew - pOld)/hWid, 1.0)*500) - - if pNew >= 0: + okMod = kMod == Qt.NoModifier or kMod == Qt.ShiftModifier + okKey = keyEvent.key() not in self.MOVE_KEYS + if okMod and okKey: + cNew = self.cursorRect().center().y() + cMov = cNew - cOld + mPos = self.mainConf.scollToPoint * self.viewport().height() * 0.01 + if abs(cMov) > 0 and cOld > mPos: + # Move the scroll bar + vBar = self.verticalScrollBar() doAnim = QPropertyAnimation(vBar, b"value", self) - doAnim.setDuration(aDur) - doAnim.setStartValue(pOld) - doAnim.setEndValue(pNew) + doAnim.setDuration(150) + doAnim.setStartValue(vBar.value()) + doAnim.setEndValue(vBar.value() + cMov) doAnim.start() + else: + QTextEdit.keyPressEvent(self, keyEvent) + + self.docFooter.updateLineCount() + return def focusNextPrevChild(self, toNext):