Attemt to scroll upwards like a typewriter
This commit is contained in:
+2
-1
@@ -126,7 +126,8 @@ class Config:
|
|||||||
self.doReplaceDQuote = True
|
self.doReplaceDQuote = True
|
||||||
self.doReplaceDash = True
|
self.doReplaceDash = True
|
||||||
self.doReplaceDots = True
|
self.doReplaceDots = True
|
||||||
self.extendScroll = True
|
self.scrollPastEnd = True
|
||||||
|
self.scollWithCursor = False
|
||||||
|
|
||||||
self.wordCountTimer = 5.0
|
self.wordCountTimer = 5.0
|
||||||
self.showTabsNSpaces = False
|
self.showTabsNSpaces = False
|
||||||
|
|||||||
+39
-2
@@ -47,7 +47,7 @@ from PyQt5.QtGui import (
|
|||||||
from PyQt5.QtWidgets import (
|
from PyQt5.QtWidgets import (
|
||||||
qApp, QTextEdit, QAction, QMenu, QShortcut, QMessageBox, QWidget, QLabel,
|
qApp, QTextEdit, QAction, QMenu, QShortcut, QMessageBox, QWidget, QLabel,
|
||||||
QToolBar, QToolButton, QHBoxLayout, QGridLayout, QLineEdit, QPushButton,
|
QToolBar, QToolButton, QHBoxLayout, QGridLayout, QLineEdit, QPushButton,
|
||||||
QFrame
|
QFrame, QAbstractSlider
|
||||||
)
|
)
|
||||||
|
|
||||||
from nw.core import NWDoc, NWSpellCheck, NWSpellSimple, countWords
|
from nw.core import NWDoc, NWSpellCheck, NWSpellSimple, countWords
|
||||||
@@ -88,6 +88,8 @@ class GuiDocEditor(QTextEdit):
|
|||||||
self.bigDoc = False # Flag for very large document size
|
self.bigDoc = False # Flag for very large document size
|
||||||
self.doReplace = False # Switch to temporarily disable auto-replace
|
self.doReplace = False # Switch to temporarily disable auto-replace
|
||||||
self.queuePos = None # Used for delayed change of cursor position
|
self.queuePos = None # Used for delayed change of cursor position
|
||||||
|
self.cursorLast = 0 # The last known vertical position of the cursor
|
||||||
|
self.lengthLast = 0
|
||||||
|
|
||||||
# Typography
|
# Typography
|
||||||
self.typDQOpen = self.mainConf.fmtDoubleQuotes[0]
|
self.typDQOpen = self.mainConf.fmtDoubleQuotes[0]
|
||||||
@@ -100,6 +102,8 @@ class GuiDocEditor(QTextEdit):
|
|||||||
self.qDocument.contentsChange.connect(self._docChange)
|
self.qDocument.contentsChange.connect(self._docChange)
|
||||||
self.qDocument.documentLayout().documentSizeChanged.connect(self._docSizeChanged)
|
self.qDocument.documentLayout().documentSizeChanged.connect(self._docSizeChanged)
|
||||||
|
|
||||||
|
self.verticalScrollBar().sliderMoved.connect(self._doVerticalScroll)
|
||||||
|
|
||||||
# Document Title
|
# Document Title
|
||||||
self.docHeader = GuiDocEditHeader(self)
|
self.docHeader = GuiDocEditHeader(self)
|
||||||
self.docFooter = GuiDocEditFooter(self)
|
self.docFooter = GuiDocEditFooter(self)
|
||||||
@@ -319,6 +323,7 @@ class GuiDocEditor(QTextEdit):
|
|||||||
self.setCursorLine(tLine)
|
self.setCursorLine(tLine)
|
||||||
|
|
||||||
self.docFooter.updateLineCount()
|
self.docFooter.updateLineCount()
|
||||||
|
self.lengthLast = self.qDocument.characterCount()
|
||||||
|
|
||||||
qApp.restoreOverrideCursor()
|
qApp.restoreOverrideCursor()
|
||||||
|
|
||||||
@@ -423,7 +428,7 @@ class GuiDocEditor(QTextEdit):
|
|||||||
lM = max(cM, fH)
|
lM = max(cM, fH)
|
||||||
self.setViewportMargins(tM, uM, tM, lM)
|
self.setViewportMargins(tM, uM, tM, lM)
|
||||||
|
|
||||||
if self.mainConf.extendScroll:
|
if self.mainConf.scrollPastEnd:
|
||||||
docFrame = self.qDocument.rootFrame().frameFormat()
|
docFrame = self.qDocument.rootFrame().frameFormat()
|
||||||
docFrame.setBottomMargin(wH - uM - lM - self.theTheme.fontPixelSize)
|
docFrame.setBottomMargin(wH - uM - lM - self.theTheme.fontPixelSize)
|
||||||
self.qDocument.rootFrame().setFrameFormat(docFrame)
|
self.qDocument.rootFrame().setFrameFormat(docFrame)
|
||||||
@@ -757,6 +762,22 @@ class GuiDocEditor(QTextEdit):
|
|||||||
QTextEdit.keyPressEvent(self, keyEvent)
|
QTextEdit.keyPressEvent(self, keyEvent)
|
||||||
self.docFooter.updateLineCount()
|
self.docFooter.updateLineCount()
|
||||||
|
|
||||||
|
if self.mainConf.scollWithCursor:
|
||||||
|
docLen = self.qDocument.characterCount()
|
||||||
|
if docLen == self.lengthLast:
|
||||||
|
# No change, so just update last position
|
||||||
|
self.cursorLast = self.cursorRect().center().y()
|
||||||
|
else:
|
||||||
|
# The user typed something, so check if we need to
|
||||||
|
# scroll, and move the scroll bar the same distance
|
||||||
|
self.lengthLast = docLen
|
||||||
|
self.ensureCursorVisible()
|
||||||
|
cPos = self.cursorRect().center().y()
|
||||||
|
if cPos != self.cursorLast:
|
||||||
|
vBar = self.verticalScrollBar()
|
||||||
|
vBar.setValue(vBar.value() + cPos - self.cursorLast)
|
||||||
|
self.cursorLast = self.cursorRect().center().y()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def focusNextPrevChild(self, toNext):
|
def focusNextPrevChild(self, toNext):
|
||||||
@@ -782,9 +803,18 @@ class GuiDocEditor(QTextEdit):
|
|||||||
|
|
||||||
QTextEdit.mouseReleaseEvent(self, mEvent)
|
QTextEdit.mouseReleaseEvent(self, mEvent)
|
||||||
self.docFooter.updateLineCount()
|
self.docFooter.updateLineCount()
|
||||||
|
self.cursorLast = self.cursorRect().center().y()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def wheelEvent(self, theEvent):
|
||||||
|
"""Briefly capture the mouse wheel event to capture the cursor
|
||||||
|
position.
|
||||||
|
"""
|
||||||
|
QTextEdit.wheelEvent(self, theEvent)
|
||||||
|
self.cursorLast = self.cursorRect().center().y()
|
||||||
|
return
|
||||||
|
|
||||||
def resizeEvent(self, theEvent):
|
def resizeEvent(self, theEvent):
|
||||||
"""If the text editor is resize, we must make sure the document
|
"""If the text editor is resize, we must make sure the document
|
||||||
has its margins adjusted according to user preferences.
|
has its margins adjusted according to user preferences.
|
||||||
@@ -819,6 +849,13 @@ class GuiDocEditor(QTextEdit):
|
|||||||
self._docAutoReplace(self.qDocument.findBlock(thePos))
|
self._docAutoReplace(self.qDocument.findBlock(thePos))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(int)
|
||||||
|
def _doVerticalScroll(self, theChange):
|
||||||
|
"""Update the cursor position on vertical scrolling.
|
||||||
|
"""
|
||||||
|
self.cursorLast = self.cursorRect().center().y()
|
||||||
|
return
|
||||||
|
|
||||||
@pyqtSlot("QPoint")
|
@pyqtSlot("QPoint")
|
||||||
def _openContextMenu(self, thePos):
|
def _openContextMenu(self, thePos):
|
||||||
"""Triggered by right click to open the context menu. Also
|
"""Triggered by right click to open the context menu. Also
|
||||||
|
|||||||
Reference in New Issue
Block a user