From 8fff3760760b289273b956be251d9114218ef416 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 3 Apr 2024 21:09:49 +0200 Subject: [PATCH] Clean up flags in all GUI classes --- novelwriter/config.py | 12 ++-- novelwriter/dialogs/about.py | 12 ++-- novelwriter/dialogs/docmerge.py | 13 ++-- novelwriter/dialogs/docsplit.py | 15 ++--- novelwriter/dialogs/editlabel.py | 4 +- novelwriter/dialogs/preferences.py | 4 +- novelwriter/dialogs/projectsettings.py | 4 +- novelwriter/dialogs/quotes.py | 8 +-- novelwriter/dialogs/wordlist.py | 4 +- novelwriter/extensions/circularprogress.py | 2 +- novelwriter/extensions/pagedsidebar.py | 6 +- novelwriter/extensions/switch.py | 2 +- novelwriter/extensions/switchbox.py | 12 ++-- novelwriter/gui/doceditor.py | 65 +++++++++----------- novelwriter/gui/dochighlight.py | 2 +- novelwriter/gui/docviewer.py | 10 ++-- novelwriter/gui/itemdetails.py | 10 ++-- novelwriter/gui/outline.py | 70 +++++++++++----------- novelwriter/gui/projtree.py | 2 +- novelwriter/gui/search.py | 2 +- novelwriter/gui/statusbar.py | 16 ++--- novelwriter/gui/theme.py | 6 +- novelwriter/tools/dictionaries.py | 6 +- novelwriter/tools/lipsum.py | 13 ++-- novelwriter/tools/manusbuild.py | 24 ++++---- novelwriter/tools/manuscript.py | 22 +++---- novelwriter/tools/manussettings.py | 44 +++++++------- novelwriter/tools/noveldetails.py | 8 +-- novelwriter/tools/welcome.py | 8 +-- novelwriter/tools/writingstats.py | 40 ++++++------- novelwriter/types.py | 9 ++- tests/test_gui/test_gui_doceditor.py | 10 ++-- 32 files changed, 236 insertions(+), 229 deletions(-) diff --git a/novelwriter/config.py b/novelwriter/config.py index 670433a0..1f817e0f 100644 --- a/novelwriter/config.py +++ b/novelwriter/config.py @@ -61,8 +61,12 @@ class Config: self.appHandle = "novelwriter" # Set Paths - confRoot = Path(QStandardPaths.writableLocation(QStandardPaths.ConfigLocation)) - dataRoot = Path(QStandardPaths.writableLocation(QStandardPaths.AppDataLocation)) + confRoot = Path(QStandardPaths.writableLocation( + QStandardPaths.StandardLocation.ConfigLocation) + ) + dataRoot = Path(QStandardPaths.writableLocation( + QStandardPaths.StandardLocation.AppDataLocation) + ) self._confPath = confRoot.absolute() / self.appHandle # The user config location self._dataPath = dataRoot.absolute() / self.appHandle # The user data location @@ -83,7 +87,7 @@ class Config: # Localisation # Note that these paths must be strings self._nwLangPath = self._appPath / "assets" / "i18n" - self._qtLangPath = QLibraryInfo.location(QLibraryInfo.TranslationsPath) + self._qtLangPath = QLibraryInfo.location(QLibraryInfo.LibraryLocation.TranslationsPath) hasLocale = (self._nwLangPath / f"nw_{QLocale.system().name()}.qm").exists() self._qLocale = QLocale.system() if hasLocale else QLocale("en_GB") @@ -369,7 +373,7 @@ class Config: elif self.osDarwin and "Helvetica" in fontFam: self.textFont = "Helvetica" else: - self.textFont = fontDB.systemFont(QFontDatabase.GeneralFont).family() + self.textFont = fontDB.systemFont(QFontDatabase.SystemFont.GeneralFont).family() else: self.textFont = family return diff --git a/novelwriter/dialogs/about.py b/novelwriter/dialogs/about.py index 86a331aa..8317a30d 100644 --- a/novelwriter/dialogs/about.py +++ b/novelwriter/dialogs/about.py @@ -32,7 +32,7 @@ from PyQt5.QtWidgets import ( ) from novelwriter import CONFIG, SHARED -from novelwriter.common import readTextFile +from novelwriter.common import cssCol, readTextFile from novelwriter.extensions.configlayout import NColourLabel from novelwriter.extensions.versioninfo import VersionInfoWidget from novelwriter.types import QtAlignRightTop, QtDialogClose @@ -70,7 +70,7 @@ class GuiAbout(QDialog): self.nwLicence = QLabel(self.tr("This application is licenced under {0}").format( "GPL v3.0" - )) + ), self) self.nwLicence.setOpenExternalLinks(True) # Credits @@ -147,10 +147,10 @@ class GuiAbout(QDialog): def _setStyleSheet(self) -> None: """Set stylesheet for all browser tabs.""" - baseCol = self.palette().window().color() - self.txtCredits.setStyleSheet(( - "QTextBrowser {{border: none; background: rgb({r},{g},{b});}} " - ).format(r=baseCol.red(), g=baseCol.green(), b=baseCol.blue())) + baseCol = cssCol(self.palette().window().color()) + self.txtCredits.setStyleSheet( + f"QTextBrowser {{border: none; background: {baseCol};}} " + ) return # END Class GuiAbout diff --git a/novelwriter/dialogs/docmerge.py b/novelwriter/dialogs/docmerge.py index 6c4047f0..9c94489e 100644 --- a/novelwriter/dialogs/docmerge.py +++ b/novelwriter/dialogs/docmerge.py @@ -54,7 +54,8 @@ class GuiDocMerge(QDialog): self._data = {} - self.headLabel = QLabel("{0}".format(self.tr("Documents to Merge"))) + self.headLabel = QLabel(self.tr("Documents to Merge"), self) + self.headLabel.setFont(SHARED.theme.guiFontB) self.helpLabel = NColourLabel( self.tr("Drag and drop items to change the order, or uncheck to exclude."), SHARED.theme.helpText, parent=self, wrap=True @@ -70,12 +71,12 @@ class GuiDocMerge(QDialog): self.listBox.setIconSize(iSz) self.listBox.setMinimumWidth(CONFIG.pxInt(400)) self.listBox.setMinimumHeight(CONFIG.pxInt(180)) - self.listBox.setSelectionBehavior(QAbstractItemView.SelectRows) - self.listBox.setSelectionMode(QAbstractItemView.SingleSelection) - self.listBox.setDragDropMode(QAbstractItemView.InternalMove) + self.listBox.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) + self.listBox.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) + self.listBox.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove) # Merge Options - self.trashLabel = QLabel(self.tr("Move merged items to Trash")) + self.trashLabel = QLabel(self.tr("Move merged items to Trash"), self) self.trashSwitch = NSwitch(self, height=iPx) self.optBox = QGridLayout() @@ -85,7 +86,7 @@ class GuiDocMerge(QDialog): self.optBox.setColumnStretch(2, 1) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel) + self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel, self) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) diff --git a/novelwriter/dialogs/docsplit.py b/novelwriter/dialogs/docsplit.py index e8ec97b8..b9d1f048 100644 --- a/novelwriter/dialogs/docsplit.py +++ b/novelwriter/dialogs/docsplit.py @@ -58,7 +58,8 @@ class GuiDocSplit(QDialog): self.setWindowTitle(self.tr("Split Document")) - self.headLabel = QLabel("{0}".format(self.tr("Document Headings"))) + self.headLabel = QLabel(self.tr("Document Headings"), self) + self.headLabel.setFont(SHARED.theme.guiFontB) self.helpLabel = NColourLabel( self.tr("Select the maximum level to split into files."), SHARED.theme.helpText, parent=self, wrap=True @@ -76,8 +77,8 @@ class GuiDocSplit(QDialog): docHierarchy = pOptions.getBool("GuiDocSplit", "docHierarchy", True) # Heading Selection - self.listBox = QListWidget() - self.listBox.setDragDropMode(QAbstractItemView.NoDragDrop) + self.listBox = QListWidget(self) + self.listBox.setDragDropMode(QAbstractItemView.DragDropMode.NoDragDrop) self.listBox.setMinimumWidth(CONFIG.pxInt(400)) self.listBox.setMinimumHeight(CONFIG.pxInt(180)) @@ -92,15 +93,15 @@ class GuiDocSplit(QDialog): self.splitLevel.currentIndexChanged.connect(self._reloadList) # Split Options - self.folderLabel = QLabel(self.tr("Split into a new folder")) + self.folderLabel = QLabel(self.tr("Split into a new folder"), self) self.folderSwitch = NSwitch(self, height=iPx) self.folderSwitch.setChecked(intoFolder) - self.hierarchyLabel = QLabel(self.tr("Create document hierarchy")) + self.hierarchyLabel = QLabel(self.tr("Create document hierarchy"), self) self.hierarchySwitch = NSwitch(self, height=iPx) self.hierarchySwitch.setChecked(docHierarchy) - self.trashLabel = QLabel(self.tr("Move split document to Trash")) + self.trashLabel = QLabel(self.tr("Move split document to Trash"), self) self.trashSwitch = NSwitch(self, height=iPx) self.optBox = QGridLayout() @@ -115,7 +116,7 @@ class GuiDocSplit(QDialog): self.optBox.setColumnStretch(3, 1) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel) + self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel, self) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) diff --git a/novelwriter/dialogs/editlabel.py b/novelwriter/dialogs/editlabel.py index 5e4d0ca7..a2d374fd 100644 --- a/novelwriter/dialogs/editlabel.py +++ b/novelwriter/dialogs/editlabel.py @@ -56,13 +56,13 @@ class GuiEditLabel(QDialog): self.labelValue.selectAll() # Buttons - self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel) + self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel, self) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) # Assemble self.innerBox = QHBoxLayout() - self.innerBox.addWidget(QLabel(self.tr("Label")), 0) + self.innerBox.addWidget(QLabel(self.tr("Label"), self), 0) self.innerBox.addWidget(self.labelValue, 1) self.innerBox.setSpacing(mSp) diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index d788753e..7d1e4671 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -87,7 +87,7 @@ class GuiPreferences(QDialog): self.mainForm.setHelpTextStyle(SHARED.theme.helpText) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogApply | QtDialogSave | QtDialogClose) + self.buttonBox = QDialogButtonBox(QtDialogApply | QtDialogSave | QtDialogClose, self) self.buttonBox.clicked.connect(self._dialogButtonClicked) # Assemble @@ -811,7 +811,7 @@ class GuiPreferences(QDialog): """Open a dialog to select the backup folder.""" if path := QFileDialog.getExistingDirectory( self, self.tr("Backup Directory"), str(self.backupPath) or "", - options=QFileDialog.ShowDirsOnly + options=QFileDialog.Option.ShowDirsOnly ): self.backupPath = path self.mainForm.setHelpText("backupPath", self.tr("Path: {0}").format(path)) diff --git a/novelwriter/dialogs/projectsettings.py b/novelwriter/dialogs/projectsettings.py index 38e2bf2c..4e234f76 100644 --- a/novelwriter/dialogs/projectsettings.py +++ b/novelwriter/dialogs/projectsettings.py @@ -84,7 +84,7 @@ class GuiProjectSettings(QDialog): self.sidebar.buttonClicked.connect(self._sidebarClicked) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogCancel) + self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogCancel, self) self.buttonBox.accepted.connect(self._doSave) self.buttonBox.rejected.connect(self.close) @@ -603,7 +603,7 @@ class _ReplacePage(NFixedPage): ) # List Box - self.listBox = QTreeWidget() + self.listBox = QTreeWidget(self) self.listBox.setHeaderLabels([self.tr("Keyword"), self.tr("Replace With")]) self.listBox.setColumnWidth(self.COL_KEY, wCol0) self.listBox.setIndentation(0) diff --git a/novelwriter/dialogs/quotes.py b/novelwriter/dialogs/quotes.py index 76bf6ce8..d728994f 100644 --- a/novelwriter/dialogs/quotes.py +++ b/novelwriter/dialogs/quotes.py @@ -66,14 +66,14 @@ class GuiQuoteSelect(QDialog): lblFont.setPointSizeF(4*lblFont.pointSizeF()) # Preview Label - self.previewLabel = QLabel(current) + self.previewLabel = QLabel(current, self) self.previewLabel.setFont(lblFont) self.previewLabel.setFixedSize(QSize(pxW, pxH)) self.previewLabel.setAlignment(QtAlignCenter) - self.previewLabel.setFrameStyle(QFrame.Box | QFrame.Plain) + self.previewLabel.setFrameStyle(QFrame.Shape.Box | QFrame.Shadow.Plain) # Quote Symbols - self.listBox = QListWidget() + self.listBox = QListWidget(self) self.listBox.itemSelectionChanged.connect(self._selectedSymbol) minSize = 100 @@ -90,7 +90,7 @@ class GuiQuoteSelect(QDialog): self.listBox.setMinimumHeight(CONFIG.pxInt(150)) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel) + self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel, self) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) diff --git a/novelwriter/dialogs/wordlist.py b/novelwriter/dialogs/wordlist.py index f07fc2ed..c82ca3d6 100644 --- a/novelwriter/dialogs/wordlist.py +++ b/novelwriter/dialogs/wordlist.py @@ -92,7 +92,7 @@ class GuiWordList(QDialog): # List Box self.listBox = QListWidget(self) - self.listBox.setDragDropMode(QAbstractItemView.NoDragDrop) + self.listBox.setDragDropMode(QAbstractItemView.DragDropMode.NoDragDrop) self.listBox.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) self.listBox.setSortingEnabled(True) @@ -111,7 +111,7 @@ class GuiWordList(QDialog): self.editBox.addWidget(self.delButton, 0) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogClose) + self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogClose, self) self.buttonBox.accepted.connect(self._doSave) self.buttonBox.rejected.connect(self.close) diff --git a/novelwriter/extensions/circularprogress.py b/novelwriter/extensions/circularprogress.py index 21b71199..bbc2f64a 100644 --- a/novelwriter/extensions/circularprogress.py +++ b/novelwriter/extensions/circularprogress.py @@ -59,7 +59,7 @@ class NProgressCircle(QProgressBar): bar=self.palette().highlight().color(), text=self.palette().text().color() ) - self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) self.setFixedWidth(size) self.setFixedHeight(size) return diff --git a/novelwriter/extensions/pagedsidebar.py b/novelwriter/extensions/pagedsidebar.py index 659ae0d7..a3c53455 100644 --- a/novelwriter/extensions/pagedsidebar.py +++ b/novelwriter/extensions/pagedsidebar.py @@ -59,7 +59,7 @@ class NPagedSideBar(QToolBar): self.setOrientation(Qt.Orientation.Vertical) stretch = QWidget(self) - stretch.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + stretch.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self._stretchAction = self.addWidget(stretch) return @@ -119,7 +119,7 @@ class _NPagedToolButton(QToolButton): def __init__(self, parent: QWidget) -> None: super().__init__(parent=parent) - self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) + self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) self.setCheckable(True) fH = self.fontMetrics().height() @@ -197,7 +197,7 @@ class _NPagedToolLabel(QLabel): def __init__(self, parent: QWidget, textColor: QColor | None = None) -> None: super().__init__(parent=parent) - self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) + self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) fH = self.fontMetrics().height() self._bH = round(fH * 1.7) diff --git a/novelwriter/extensions/switch.py b/novelwriter/extensions/switch.py index 421b6a87..e35bd79a 100644 --- a/novelwriter/extensions/switch.py +++ b/novelwriter/extensions/switch.py @@ -46,7 +46,7 @@ class NSwitch(QAbstractButton): self._rR = self._xR - self._rB self.setCheckable(True) - self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) self.setFixedWidth(self._xW) self.setFixedHeight(self._xH) self._offset = self._xR diff --git a/novelwriter/extensions/switchbox.py b/novelwriter/extensions/switchbox.py index e3913288..d41587ba 100644 --- a/novelwriter/extensions/switchbox.py +++ b/novelwriter/extensions/switchbox.py @@ -58,8 +58,8 @@ class NSwitchBox(QScrollArea): self._content = QGridLayout() self._content.setColumnStretch(1, 1) - self._widget = QWidget() - self._widget.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) + self._widget = QWidget(self) + self._widget.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum) self._widget.setLayout(self._content) self.setWidgetResizable(True) @@ -69,7 +69,7 @@ class NSwitchBox(QScrollArea): def addLabel(self, text: str) -> None: """Add a header label to the content box.""" - label = QLabel(text) + label = QLabel(text, self) font = label.font() font.setBold(True) label.setFont(font) @@ -80,12 +80,12 @@ class NSwitchBox(QScrollArea): def addItem(self, qIcon: QIcon, text: str, identifier: str, default: bool = False) -> None: """Add an item to the content box.""" - icon = QLabel("") + icon = QLabel("", self) icon.setAlignment(QtAlignRightMiddle) icon.setPixmap(qIcon.pixmap(self._sIcon, self._sIcon)) self._content.addWidget(icon, self._index, 0, QtAlignLeft) - label = QLabel(text) + label = QLabel(text, self) self._content.addWidget(label, self._index, 1, QtAlignLeft) switch = NSwitch(self, height=self._hSwitch) @@ -100,7 +100,7 @@ class NSwitchBox(QScrollArea): def addSeparator(self) -> None: """Add a blank entry in the content box.""" - spacer = QWidget() + spacer = QWidget(self) spacer.setFixedHeight(int(0.5*self._sIcon)) self._content.addWidget(spacer, self._index, 0, 1, 3, QtAlignLeft) self._widgets.append(spacer) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index f692a448..8c773355 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -65,7 +65,8 @@ from novelwriter.text.counting import standardCounter from novelwriter.tools.lipsum import GuiLipsum from novelwriter.types import ( QtAlignCenterTop, QtAlignJustify, QtAlignLeft, QtAlignLeftTop, - QtAlignRight, QtModCtrl, QtMouseLeft, QtModeNone, QtModShift + QtAlignRight, QtKeepAnchor, QtModCtrl, QtMouseLeft, QtModeNone, QtModShift, + QtMoveAnchor, QtMoveLeft, QtMoveRight ) if TYPE_CHECKING: # pragma: no cover @@ -656,8 +657,8 @@ class GuiDocEditor(QPlainTextEdit): """Make a text selection.""" if start >= 0 and length > 0: cursor = self.textCursor() - cursor.setPosition(start, QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(start + length, QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(start, QtMoveAnchor) + cursor.setPosition(start + length, QtKeepAnchor) self.setTextCursor(cursor) return @@ -1092,8 +1093,8 @@ class GuiDocEditor(QPlainTextEdit): block = cursor.block() if block.isValid(): pos += block.position() - cursor.setPosition(pos, QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(pos + length, QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(pos, QtMoveAnchor) + cursor.setPosition(pos + length, QtKeepAnchor) cursor.insertText(text) self._completer.hide() return @@ -1153,9 +1154,7 @@ class GuiDocEditor(QPlainTextEdit): block = pCursor.block() sCursor = self.textCursor() sCursor.setPosition(block.position() + cPos) - sCursor.movePosition( - QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, cLen - ) + sCursor.movePosition(QtMoveRight, QtKeepAnchor, cLen) if suggest: ctxMenu.addSeparator() ctxMenu.addAction(self.tr("Spelling Suggestion(s)")) @@ -1351,8 +1350,8 @@ class GuiDocEditor(QPlainTextEdit): else: resIdx = 0 if doLoop else maxIdx - cursor.setPosition(resS[resIdx], QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(resE[resIdx], QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(resS[resIdx], QtMoveAnchor) + cursor.setPosition(resE[resIdx], QtKeepAnchor) self.setTextCursor(cursor) self.docSearch.setResultCount(resIdx + 1, len(resS)) @@ -1398,8 +1397,8 @@ class GuiDocEditor(QPlainTextEdit): break if hasSelection: - cursor.setPosition(origA, QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(origB, QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(origA, QtMoveAnchor) + cursor.setPosition(origB, QtKeepAnchor) else: cursor.setPosition(origA) @@ -1502,8 +1501,8 @@ class GuiDocEditor(QPlainTextEdit): if blockS != blockE: posE = blockS.position() + blockS.length() - 1 cursor.clearSelection() - cursor.setPosition(posS, QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(posE, QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(posS, QtMoveAnchor) + cursor.setPosition(posE, QtKeepAnchor) self.setTextCursor(cursor) numB = 0 @@ -1580,8 +1579,8 @@ class GuiDocEditor(QPlainTextEdit): if select == _SelectAction.MOVE_AFTER: cursor.setPosition(posE + len(before + after)) elif select == _SelectAction.KEEP_SELECTION: - cursor.setPosition(posE + len(before), QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(posS + len(before), QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(posE + len(before), QtMoveAnchor) + cursor.setPosition(posS + len(before), QtKeepAnchor) elif select == _SelectAction.KEEP_POSITION: cursor.setPosition(posO + len(before)) @@ -1603,9 +1602,7 @@ class GuiDocEditor(QPlainTextEdit): self._allowAutoReplace(False) for posC in range(posS, posE+1): cursor.setPosition(posC) - cursor.movePosition( - QTextCursor.MoveOperation.Left, QTextCursor.MoveMode.KeepAnchor, 2 - ) + cursor.movePosition(QtMoveLeft, QtKeepAnchor, 2) selText = cursor.selectedText() nS = len(selText) @@ -1625,16 +1622,12 @@ class GuiDocEditor(QPlainTextEdit): cursor.setPosition(posC) if pC in closeCheck: cursor.beginEditBlock() - cursor.movePosition( - QTextCursor.MoveOperation.Left, QTextCursor.MoveMode.KeepAnchor, 1 - ) + cursor.movePosition(QtMoveLeft, QtKeepAnchor, 1) cursor.insertText(oQuote) cursor.endEditBlock() else: cursor.beginEditBlock() - cursor.movePosition( - QTextCursor.MoveOperation.Left, QTextCursor.MoveMode.KeepAnchor, 1 - ) + cursor.movePosition(QtMoveLeft, QtKeepAnchor, 1) cursor.insertText(cQuote) cursor.endEditBlock() @@ -1850,9 +1843,7 @@ class GuiDocEditor(QPlainTextEdit): cursor.beginEditBlock() cursor.clearSelection() cursor.setPosition(rS) - cursor.movePosition( - QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, rE-rS - ) + cursor.movePosition(QtMoveRight, QtKeepAnchor, rE-rS) cursor.insertText(cleanText.rstrip() + "\n") cursor.endEditBlock() @@ -2018,9 +2009,7 @@ class GuiDocEditor(QPlainTextEdit): tInsert = tInsert + self._typPadChar if nDelete > 0: - cursor.movePosition( - QTextCursor.MoveOperation.Left, QTextCursor.MoveMode.KeepAnchor, nDelete - ) + cursor.movePosition(QtMoveLeft, QtKeepAnchor, nDelete) cursor.insertText(tInsert) return @@ -2076,8 +2065,8 @@ class GuiDocEditor(QPlainTextEdit): return cursor cursor.clearSelection() - cursor.setPosition(sPos, QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(ePos, QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(sPos, QtMoveAnchor) + cursor.setPosition(ePos, QtKeepAnchor) self.setTextCursor(cursor) @@ -2101,8 +2090,8 @@ class GuiDocEditor(QPlainTextEdit): posE = cursor.selectionEnd() selTxt = cursor.selectedText() if selTxt.startswith(nwUnicode.U_PSEP): - cursor.setPosition(posS+1, QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(posE, QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(posS+1, QtMoveAnchor) + cursor.setPosition(posE, QtKeepAnchor) self.setTextCursor(cursor) @@ -2441,11 +2430,11 @@ class GuiDocEditSearch(QFrame): self.searchOpt.setIconSize(iSz) self.searchOpt.setContentsMargins(0, 0, 0, 0) - self.searchLabel = QLabel(self.tr("Search")) + self.searchLabel = QLabel(self.tr("Search"), self) self.searchLabel.setFont(self.boxFont) self.searchLabel.setIndent(CONFIG.pxInt(6)) - self.resultLabel = QLabel("?/?") + self.resultLabel = QLabel("?/?", self) self.resultLabel.setFont(self.boxFont) self.resultLabel.setMinimumWidth(SHARED.theme.getTextWidth("?/?", self.boxFont)) @@ -3047,7 +3036,7 @@ class GuiDocEditFooter(QWidget): self.statusIcon.setFixedHeight(iPx) self.statusIcon.setAlignment(QtAlignLeftTop) - self.statusText = QLabel(self.tr("Status")) + self.statusText = QLabel(self.tr("Status"), self) self.statusText.setIndent(0) self.statusText.setMargin(0) self.statusText.setContentsMargins(0, 0, 0, 0) diff --git a/novelwriter/gui/dochighlight.py b/novelwriter/gui/dochighlight.py index 8b479174..27ae33be 100644 --- a/novelwriter/gui/dochighlight.py +++ b/novelwriter/gui/dochighlight.py @@ -116,7 +116,7 @@ class GuiDocHighlighter(QSyntaxHighlighter): # Cache Spell Error Format self._spellErr = QTextCharFormat() self._spellErr.setUnderlineColor(SHARED.theme.colSpell) - self._spellErr.setUnderlineStyle(QTextCharFormat.SpellCheckUnderline) + self._spellErr.setUnderlineStyle(QTextCharFormat.UnderlineStyle.SpellCheckUnderline) # Multiple or Trailing Spaces if CONFIG.showMultiSpaces: diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index ebb31429..bc5caeb5 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -49,7 +49,9 @@ from novelwriter.error import logException from novelwriter.extensions.eventfilters import WheelEventFilter from novelwriter.extensions.modified import NIconToolButton from novelwriter.gui.theme import STYLES_MIN_TOOLBUTTON -from novelwriter.types import QtAlignCenterTop, QtAlignJustify, QtMouseLeft +from novelwriter.types import ( + QtAlignCenterTop, QtAlignJustify, QtKeepAnchor, QtMouseLeft, QtMoveAnchor +) logger = logging.getLogger(__name__) @@ -452,8 +454,8 @@ class GuiDocViewer(QTextBrowser): posE = cursor.selectionEnd() selTxt = cursor.selectedText() if selTxt.startswith(nwUnicode.U_PSEP): - cursor.setPosition(posS+1, QTextCursor.MoveMode.MoveAnchor) - cursor.setPosition(posE, QTextCursor.MoveMode.KeepAnchor) + cursor.setPosition(posS+1, QtMoveAnchor) + cursor.setPosition(posE, QtKeepAnchor) self.setTextCursor(cursor) @@ -635,7 +637,7 @@ class GuiDocViewHeader(QWidget): self.setAutoFillBackground(True) # Title Label - self.itemTitle = QLabel() + self.itemTitle = QLabel(self) self.itemTitle.setText("") self.itemTitle.setIndent(0) self.itemTitle.setMargin(0) diff --git a/novelwriter/gui/itemdetails.py b/novelwriter/gui/itemdetails.py index 982770eb..5e9ed84d 100644 --- a/novelwriter/gui/itemdetails.py +++ b/novelwriter/gui/itemdetails.py @@ -115,25 +115,25 @@ class GuiItemDetails(QWidget): self.cCountName.setFont(fntLabel) self.cCountName.setAlignment(QtAlignRight) - self.cCountData = QLabel("") + self.cCountData = QLabel("", self) self.cCountData.setFont(fntValue) self.cCountData.setAlignment(QtAlignRight) # Word Count - self.wCountName = QLabel(" "+self.tr("Words")) + self.wCountName = QLabel(" "+self.tr("Words"), self) self.wCountName.setFont(fntLabel) self.wCountName.setAlignment(QtAlignRight) - self.wCountData = QLabel("") + self.wCountData = QLabel("", self) self.wCountData.setFont(fntValue) self.wCountData.setAlignment(QtAlignRight) # Paragraph Count - self.pCountName = QLabel(" "+self.tr("Paragraphs")) + self.pCountName = QLabel(" "+self.tr("Paragraphs"), self) self.pCountName.setFont(fntLabel) self.pCountName.setAlignment(QtAlignRight) - self.pCountData = QLabel("") + self.pCountData = QLabel("", self) self.pCountData.setFont(fntValue) self.pCountData.setAlignment(QtAlignRight) diff --git a/novelwriter/gui/outline.py b/novelwriter/gui/outline.py index 6eadbf0a..0d07e5ab 100644 --- a/novelwriter/gui/outline.py +++ b/novelwriter/gui/outline.py @@ -70,7 +70,7 @@ class GuiOutlineView(QWidget): self.outlineBar = GuiOutlineToolBar(self) self.outlineBar.setEnabled(False) - self.splitOutline = QSplitter(Qt.Orientation.Vertical) + self.splitOutline = QSplitter(Qt.Orientation.Vertical, self) self.splitOutline.addWidget(self.outlineTree) self.splitOutline.addWidget(self.outlineData) self.splitOutline.setOpaqueResize(False) @@ -220,7 +220,7 @@ class GuiOutlineToolBar(QToolBar): stretch.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) # Novel Selector - self.novelLabel = QLabel(self.tr("Outline of")) + self.novelLabel = QLabel(self.tr("Outline of"), self) self.novelLabel.setContentsMargins(0, 0, mPx, 0) self.novelValue = NovelSelector(self) @@ -803,12 +803,12 @@ class GuiOutlineDetails(QScrollArea): bFont = SHARED.theme.guiFontB # Details Area - self.titleLabel = QLabel(self.tr("Title")) - self.fileLabel = QLabel(self.tr("Document")) - self.itemLabel = QLabel(self.tr("Status")) - self.titleValue = QLabel("") - self.fileValue = QLabel("") - self.itemValue = QLabel("") + self.titleLabel = QLabel(self.tr("Title"), self) + self.fileLabel = QLabel(self.tr("Document"), self) + self.itemLabel = QLabel(self.tr("Status"), self) + self.titleValue = QLabel("", self) + self.fileValue = QLabel("", self) + self.itemValue = QLabel("", self) self.titleLabel.setFont(bFont) self.fileLabel.setFont(bFont) @@ -822,12 +822,12 @@ class GuiOutlineDetails(QScrollArea): self.itemValue.setMaximumWidth(maxTitle) # Stats Area - self.cCLabel = QLabel(self.tr("Characters")) - self.wCLabel = QLabel(self.tr("Words")) - self.pCLabel = QLabel(self.tr("Paragraphs")) - self.cCValue = QLabel("") - self.wCValue = QLabel("") - self.pCValue = QLabel("") + self.cCLabel = QLabel(self.tr("Characters"), self) + self.wCLabel = QLabel(self.tr("Words"), self) + self.pCLabel = QLabel(self.tr("Paragraphs"), self) + self.cCValue = QLabel("", self) + self.wCValue = QLabel("", self) + self.pCValue = QLabel("", self) self.cCLabel.setFont(bFont) self.wCLabel.setFont(bFont) @@ -841,10 +841,10 @@ class GuiOutlineDetails(QScrollArea): self.pCValue.setAlignment(QtAlignRight) # Synopsis - self.synopLabel = QLabel(self.tr("Synopsis")) + self.synopLabel = QLabel(self.tr("Synopsis"), self) self.synopLabel.setFont(bFont) - self.synopValue = QLabel("") + self.synopValue = QLabel("", self) self.synopValue.setWordWrap(True) self.synopValue.setAlignment(QtAlignLeftTop) @@ -852,15 +852,15 @@ class GuiOutlineDetails(QScrollArea): self.synopLWrap.addWidget(self.synopValue, 1) # Tags - self.povKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.POV_KEY])) - self.focKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.FOCUS_KEY])) - self.chrKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.CHAR_KEY])) - self.pltKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.PLOT_KEY])) - self.timKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.TIME_KEY])) - self.wldKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.WORLD_KEY])) - self.objKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.OBJECT_KEY])) - self.entKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.ENTITY_KEY])) - self.cstKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.CUSTOM_KEY])) + self.povKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.POV_KEY]), self) + self.focKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.FOCUS_KEY]), self) + self.chrKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.CHAR_KEY]), self) + self.pltKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.PLOT_KEY]), self) + self.timKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.TIME_KEY]), self) + self.wldKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.WORLD_KEY]), self) + self.objKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.OBJECT_KEY]), self) + self.entKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.ENTITY_KEY]), self) + self.cstKeyLabel = QLabel(trConst(nwLabels.KEY_NAME[nwKeyWords.CUSTOM_KEY]), self) self.povKeyLabel.setFont(bFont) self.focKeyLabel.setFont(bFont) @@ -882,15 +882,15 @@ class GuiOutlineDetails(QScrollArea): self.entKeyLWrap = QHBoxLayout() self.cstKeyLWrap = QHBoxLayout() - self.povKeyValue = QLabel("") - self.focKeyValue = QLabel("") - self.chrKeyValue = QLabel("") - self.pltKeyValue = QLabel("") - self.timKeyValue = QLabel("") - self.wldKeyValue = QLabel("") - self.objKeyValue = QLabel("") - self.entKeyValue = QLabel("") - self.cstKeyValue = QLabel("") + self.povKeyValue = QLabel("", self) + self.focKeyValue = QLabel("", self) + self.chrKeyValue = QLabel("", self) + self.pltKeyValue = QLabel("", self) + self.timKeyValue = QLabel("", self) + self.wldKeyValue = QLabel("", self) + self.objKeyValue = QLabel("", self) + self.entKeyValue = QLabel("", self) + self.cstKeyValue = QLabel("", self) self.povKeyValue.setWordWrap(True) self.focKeyValue.setWordWrap(True) @@ -977,7 +977,7 @@ class GuiOutlineDetails(QScrollArea): self.tagsForm.setVerticalSpacing(vSpace) # Assemble - self.outerWidget = QWidget() + self.outerWidget = QWidget(self) self.outerBox = QHBoxLayout() self.outerBox.addWidget(self.mainGroup, 0) self.outerBox.addWidget(self.tagsGroup, 1) diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py index 7287ff38..2ade45d8 100644 --- a/novelwriter/gui/projtree.py +++ b/novelwriter/gui/projtree.py @@ -271,7 +271,7 @@ class GuiProjectToolBar(QWidget): self.setAutoFillBackground(True) # Widget Label - self.viewLabel = QLabel(self.tr("Project Content")) + self.viewLabel = QLabel(self.tr("Project Content"), self) self.viewLabel.setFont(SHARED.theme.guiFontB) self.viewLabel.setContentsMargins(0, 0, 0, 0) self.viewLabel.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) diff --git a/novelwriter/gui/search.py b/novelwriter/gui/search.py index 79c0bdd0..6811c026 100644 --- a/novelwriter/gui/search.py +++ b/novelwriter/gui/search.py @@ -71,7 +71,7 @@ class GuiProjectSearch(QWidget): self._map: dict[str, tuple[int, float]] = {} # Header - self.viewLabel = QLabel(self.tr("Project Search")) + self.viewLabel = QLabel(self.tr("Project Search"), self) self.viewLabel.setFont(SHARED.theme.guiFontB) self.viewLabel.setContentsMargins(mPx, tPx, 0, mPx) diff --git a/novelwriter/gui/statusbar.py b/novelwriter/gui/statusbar.py index 1d709b69..1992d609 100644 --- a/novelwriter/gui/statusbar.py +++ b/novelwriter/gui/statusbar.py @@ -66,8 +66,8 @@ class GuiMainStatus(QStatusBar): xM = CONFIG.pxInt(8) # The Spell Checker Language - self.langIcon = QLabel("") - self.langText = QLabel(self.tr("None")) + self.langIcon = QLabel("", self) + self.langText = QLabel(self.tr("None"), self) self.langIcon.setContentsMargins(0, 0, 0, 0) self.langText.setContentsMargins(0, 0, xM, 0) self.addPermanentWidget(self.langIcon) @@ -75,7 +75,7 @@ class GuiMainStatus(QStatusBar): # The Editor Status self.docIcon = StatusLED(colNone, colSaved, colUnsaved, iPx, iPx, self) - self.docText = QLabel(self.tr("Editor")) + self.docText = QLabel(self.tr("Editor"), self) self.docIcon.setContentsMargins(0, 0, 0, 0) self.docText.setContentsMargins(0, 0, xM, 0) self.addPermanentWidget(self.docIcon) @@ -83,15 +83,15 @@ class GuiMainStatus(QStatusBar): # The Project Status self.projIcon = StatusLED(colNone, colSaved, colUnsaved, iPx, iPx, self) - self.projText = QLabel(self.tr("Project")) + self.projText = QLabel(self.tr("Project"), self) self.projIcon.setContentsMargins(0, 0, 0, 0) self.projText.setContentsMargins(0, 0, xM, 0) self.addPermanentWidget(self.projIcon) self.addPermanentWidget(self.projText) # The Project and Session Stats - self.statsIcon = QLabel() - self.statsText = QLabel("") + self.statsIcon = QLabel(self) + self.statsText = QLabel("", self) self.statsIcon.setContentsMargins(0, 0, 0, 0) self.statsText.setContentsMargins(0, 0, xM, 0) self.addPermanentWidget(self.statsIcon) @@ -99,8 +99,8 @@ class GuiMainStatus(QStatusBar): # The Session Clock # Set the minimum width so the label doesn't rescale every second - self.timeIcon = QLabel() - self.timeText = QLabel("") + self.timeIcon = QLabel(self) + self.timeText = QLabel("", self) self.timeText.setToolTip(self.tr("Session Time")) self.timeText.setMinimumWidth(SHARED.theme.getTextWidth("00:00:00:")) self.timeIcon.setContentsMargins(0, 0, 0, 0) diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 2b2003db..c636f677 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -171,7 +171,9 @@ class GuiTheme: # Monospace Font self.guiFontFixed = QFont() self.guiFontFixed.setPointSizeF(0.95*self.fontPointSize) - self.guiFontFixed.setFamily(QFontDatabase.systemFont(QFontDatabase.FixedFont).family()) + self.guiFontFixed.setFamily( + QFontDatabase.systemFont(QFontDatabase.SystemFont.FixedFont).family() + ) logger.debug("GUI Font Family: %s", self.guiFont.family()) logger.debug("GUI Font Point Size: %.2f", self.fontPointSize) @@ -401,7 +403,7 @@ class GuiTheme: font.setFamily("Arial") font.setPointSize(10) else: - font = fontDB.systemFont(QFontDatabase.GeneralFont) + font = fontDB.systemFont(QFontDatabase.SystemFont.GeneralFont) CONFIG.guiFont = font.family() CONFIG.guiFontSize = font.pointSize() else: diff --git a/novelwriter/tools/dictionaries.py b/novelwriter/tools/dictionaries.py index f648b4c8..a944c745 100644 --- a/novelwriter/tools/dictionaries.py +++ b/novelwriter/tools/dictionaries.py @@ -71,7 +71,7 @@ class GuiDictionaries(QDialog): self.tr("Download a dictionary from one of the links, and add it below."), f" \u203a {foUrl}", f" \u203a {loUrl}", - ])) + ]), self) self.huInfo.setOpenExternalLinks(True) self.huInfo.setWordWrap(True) self.huInput = QLineEdit(self) @@ -90,7 +90,7 @@ class GuiDictionaries(QDialog): self.huAddBox.addWidget(self.huImport) # Install Path - self.inInfo = QLabel(self.tr("Dictionary install location")) + self.inInfo = QLabel(self.tr("Dictionary install location"), self) self.inPath = QLineEdit(self) self.inPath.setReadOnly(True) self.inBrowse = NIconToolButton(self, iSz, "browse") @@ -108,7 +108,7 @@ class GuiDictionaries(QDialog): self.infoBox.setFrameStyle(QFrame.Shape.NoFrame) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogClose) + self.buttonBox = QDialogButtonBox(QtDialogClose, self) self.buttonBox.rejected.connect(self._doClose) # Assemble diff --git a/novelwriter/tools/lipsum.py b/novelwriter/tools/lipsum.py index 09fd57bd..bce851f5 100644 --- a/novelwriter/tools/lipsum.py +++ b/novelwriter/tools/lipsum.py @@ -61,7 +61,7 @@ class GuiLipsum(QDialog): self.innerBox.setSpacing(CONFIG.pxInt(16)) # Icon - self.docIcon = QLabel() + self.docIcon = QLabel(self) self.docIcon.setPixmap(SHARED.theme.getPixmap("proj_document", (nPx, nPx))) self.leftBox = QVBoxLayout() @@ -71,15 +71,16 @@ class GuiLipsum(QDialog): self.innerBox.addLayout(self.leftBox) # Form - self.headLabel = QLabel("{0}".format(self.tr("Insert Lorem Ipsum Text"))) + self.headLabel = QLabel(self.tr("Insert Lorem Ipsum Text")) + self.headLabel.setFont(SHARED.theme.guiFontB) - self.paraLabel = QLabel(self.tr("Number of paragraphs")) - self.paraCount = QSpinBox() + self.paraLabel = QLabel(self.tr("Number of paragraphs"), self) + self.paraCount = QSpinBox(self) self.paraCount.setMinimum(1) self.paraCount.setMaximum(100) self.paraCount.setValue(5) - self.randLabel = QLabel(self.tr("Randomise order")) + self.randLabel = QLabel(self.tr("Randomise order"), self) self.randSwitch = NSwitch(self) self.formBox = QGridLayout() @@ -93,7 +94,7 @@ class GuiLipsum(QDialog): self.innerBox.addLayout(self.formBox) # Buttons - self.buttonBox = QDialogButtonBox() + self.buttonBox = QDialogButtonBox(self) self.buttonBox.rejected.connect(self.close) self.btnClose = self.buttonBox.addButton(QtDialogClose) diff --git a/novelwriter/tools/manusbuild.py b/novelwriter/tools/manusbuild.py index 1e7e9956..301e4432 100644 --- a/novelwriter/tools/manusbuild.py +++ b/novelwriter/tools/manusbuild.py @@ -90,8 +90,8 @@ class GuiManuscriptBuild(QDialog): # Output Format # ============= - self.lblFormat = QLabel(self.tr("Output Format")) - self.listFormats = QListWidget() + self.lblFormat = QLabel(self.tr("Output Format"), self) + self.listFormats = QListWidget(self) self.listFormats.setIconSize(iSz) current = None for key in nwBuildFmt: @@ -109,14 +109,14 @@ class GuiManuscriptBuild(QDialog): self.formatBox.addWidget(self.listFormats, 1) self.formatBox.setContentsMargins(0, 0, 0, 0) - self.formatWidget = QWidget() + self.formatWidget = QWidget(self) self.formatWidget.setLayout(self.formatBox) self.formatWidget.setContentsMargins(0, 0, 0, 0) # Table of Contents # ================= - self.lblContent = QLabel(self.tr("Table of Contents")) + self.lblContent = QLabel(self.tr("Table of Contents"), self) self.listContent = QListWidget(self) self.listContent.setIconSize(iSz) @@ -127,7 +127,7 @@ class GuiManuscriptBuild(QDialog): self.contentBox.addWidget(self.listContent, 0) self.contentBox.setContentsMargins(0, 0, 0, 0) - self.contentWidget = QWidget() + self.contentWidget = QWidget(self) self.contentWidget.setLayout(self.contentBox) self.contentWidget.setContentsMargins(0, 0, 0, 0) @@ -139,12 +139,12 @@ class GuiManuscriptBuild(QDialog): font.setUnderline(True) font.setPointSizeF(1.5*font.pointSizeF()) - self.lblMain = QLabel(self._build.name) + self.lblMain = QLabel(self._build.name, self) self.lblMain.setWordWrap(True) self.lblMain.setFont(font) # Build Path - self.lblPath = QLabel(self.tr("Path")) + self.lblPath = QLabel(self.tr("Path"), self) self.buildPath = QLineEdit(self) self.btnBrowse = NIconToolButton(self, iSz, "browse") @@ -154,7 +154,7 @@ class GuiManuscriptBuild(QDialog): self.pathBox.setSpacing(sp8) # Build Name - self.lblName = QLabel(self.tr("File Name")) + self.lblName = QLabel(self.tr("File Name"), self) self.buildName = QLineEdit(self) self.btnReset = NIconToolButton(self, iSz, "revert") self.btnReset.setToolTip(self.tr("Reset file name to default")) @@ -181,19 +181,19 @@ class GuiManuscriptBuild(QDialog): self.buildBox.setVerticalSpacing(sp4) # Dialog Buttons - self.btnOpen = QPushButton(SHARED.theme.getIcon("browse"), self.tr("Open Folder")) + self.btnOpen = QPushButton(SHARED.theme.getIcon("browse"), self.tr("Open Folder"), self) self.btnOpen.setIconSize(bSz) - self.btnBuild = QPushButton(SHARED.theme.getIcon("export"), self.tr("&Build")) + self.btnBuild = QPushButton(SHARED.theme.getIcon("export"), self.tr("&Build"), self) self.btnBuild.setIconSize(bSz) - self.dlgButtons = QDialogButtonBox(QtDialogClose) + self.dlgButtons = QDialogButtonBox(QtDialogClose, self) self.dlgButtons.addButton(self.btnOpen, QtRoleAction) self.dlgButtons.addButton(self.btnBuild, QtRoleAction) # Assemble GUI # ============ - self.mainSplit = QSplitter() + self.mainSplit = QSplitter(self) self.mainSplit.addWidget(self.formatWidget) self.mainSplit.addWidget(self.contentWidget) self.mainSplit.setHandleWidth(sp16) diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py index da7d4740..0fac65fa 100644 --- a/novelwriter/tools/manuscript.py +++ b/novelwriter/tools/manuscript.py @@ -124,7 +124,7 @@ class GuiManuscript(QDialog): self.tbEdit.setStyleSheet(buttonStyle) self.tbEdit.clicked.connect(self._editSelectedBuild) - self.lblBuilds = QLabel("{0}".format(self.tr("Builds"))) + self.lblBuilds = QLabel("{0}".format(self.tr("Builds")), self) self.listToolBox = QHBoxLayout() self.listToolBox.addWidget(self.lblBuilds) @@ -141,8 +141,8 @@ class GuiManuscript(QDialog): self.buildList.setIconSize(iSz) self.buildList.doubleClicked.connect(self._editSelectedBuild) self.buildList.currentItemChanged.connect(self._updateBuildDetails) - self.buildList.setSelectionMode(QAbstractItemView.SingleSelection) - self.buildList.setDragDropMode(QAbstractItemView.InternalMove) + self.buildList.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) + self.buildList.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove) # Details Tabs # ============ @@ -170,16 +170,16 @@ class GuiManuscript(QDialog): # Process Controls # ================ - self.btnPreview = QPushButton(self.tr("Preview")) + self.btnPreview = QPushButton(self.tr("Preview"), self) self.btnPreview.clicked.connect(self._generatePreview) - self.btnPrint = QPushButton(self.tr("Print")) + self.btnPrint = QPushButton(self.tr("Print"), self) self.btnPrint.clicked.connect(self._printDocument) - self.btnBuild = QPushButton(self.tr("Build")) + self.btnBuild = QPushButton(self.tr("Build"), self) self.btnBuild.clicked.connect(self._buildManuscript) - self.btnClose = QPushButton(self.tr("Close")) + self.btnClose = QPushButton(self.tr("Close"), self) self.btnClose.clicked.connect(self.close) self.processBox = QGridLayout() @@ -211,7 +211,7 @@ class GuiManuscript(QDialog): self.optsWidget = QWidget(self) self.optsWidget.setLayout(self.controlBox) - self.mainSplit = QSplitter() + self.mainSplit = QSplitter(self) self.mainSplit.addWidget(self.optsWidget) self.mainSplit.addWidget(self.docWdiget) self.mainSplit.setCollapsible(0, False) @@ -906,7 +906,7 @@ class _PreviewWidget(QTextBrowser): def printPreview(self, printer: QPrinter) -> None: """Connect the print preview painter to the document viewer.""" QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) - printer.setOrientation(QPrinter.Portrait) + printer.setOrientation(QPrinter.Orientation.Portrait) self.document().print(printer) QApplication.restoreOverrideCursor() return @@ -1054,10 +1054,10 @@ class _StatsWidget(QWidget): """Build the minimal stats page.""" mPx = CONFIG.pxInt(8) - self.lblWordCount = QLabel(self.tr("Words")) + self.lblWordCount = QLabel(self.tr("Words"), self) self.minWordCount = QLabel(self) - self.lblCharCount = QLabel(self.tr("Characters")) + self.lblCharCount = QLabel(self.tr("Characters"), self) self.minCharCount = QLabel(self) # Assemble diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py index e0aa873a..ebbcbb17 100644 --- a/novelwriter/tools/manussettings.py +++ b/novelwriter/tools/manussettings.py @@ -102,7 +102,7 @@ class GuiBuildSettings(QDialog): ) # Settings Name - self.lblBuildName = QLabel(self.tr("Name")) + self.lblBuildName = QLabel(self.tr("Name"), self) self.editBuildName = QLineEdit(self) # SideBar @@ -134,7 +134,7 @@ class GuiBuildSettings(QDialog): self.toolStack.addWidget(self.optTabOutput) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogApply | QtDialogSave | QtDialogClose) + self.buttonBox = QDialogButtonBox(QtDialogApply | QtDialogSave | QtDialogClose, self) self.buttonBox.clicked.connect(self._dialogButtonClicked) # Assemble @@ -331,15 +331,15 @@ class _FilterTab(NFixedPage): treeHeader = self.optTree.header() treeHeader.setStretchLastSection(False) treeHeader.setMinimumSectionSize(iPx + cMg) # See Issue #1551 - treeHeader.setSectionResizeMode(self.C_NAME, QHeaderView.Stretch) - treeHeader.setSectionResizeMode(self.C_ACTIVE, QHeaderView.Fixed) - treeHeader.setSectionResizeMode(self.C_STATUS, QHeaderView.Fixed) + treeHeader.setSectionResizeMode(self.C_NAME, QHeaderView.ResizeMode.Stretch) + treeHeader.setSectionResizeMode(self.C_ACTIVE, QHeaderView.ResizeMode.Fixed) + treeHeader.setSectionResizeMode(self.C_STATUS, QHeaderView.ResizeMode.Fixed) treeHeader.resizeSection(self.C_ACTIVE, iPx + cMg) treeHeader.resizeSection(self.C_STATUS, iPx + cMg) - self.optTree.setDragDropMode(QAbstractItemView.NoDragDrop) - self.optTree.setSelectionMode(QAbstractItemView.ExtendedSelection) - self.optTree.setSelectionBehavior(QAbstractItemView.SelectRows) + self.optTree.setDragDropMode(QAbstractItemView.DragDropMode.NoDragDrop) + self.optTree.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) + self.optTree.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) # Filters # ======= @@ -359,7 +359,7 @@ class _FilterTab(NFixedPage): self.resetButton.clicked.connect(lambda: self._setSelectedMode(self.F_FILTERED)) self.modeBox = QHBoxLayout() - self.modeBox.addWidget(QLabel(self.tr("Mark selection as"))) + self.modeBox.addWidget(QLabel(self.tr("Mark selection as"), self)) self.modeBox.addStretch(1) self.modeBox.addWidget(self.includedButton) self.modeBox.addWidget(self.excludedButton) @@ -369,7 +369,7 @@ class _FilterTab(NFixedPage): # Filer Options self.filterOpt = NSwitchBox(self, iPx) self.filterOpt.switchToggled.connect(self._applyFilterSwitch) - self.filterOpt.setFrameStyle(QFrame.NoFrame) + self.filterOpt.setFrameStyle(QFrame.Shape.NoFrame) # Assemble GUI # ============ @@ -381,10 +381,10 @@ class _FilterTab(NFixedPage): self.selectionBox.addLayout(self.modeBox) self.selectionBox.setContentsMargins(0, 0, 0, 0) - self.selectionWidget = QWidget() + self.selectionWidget = QWidget(self) self.selectionWidget.setLayout(self.selectionBox) - self.mainSplit = QSplitter() + self.mainSplit = QSplitter(self) self.mainSplit.addWidget(self.selectionWidget) self.mainSplit.addWidget(self.filterOpt) self.mainSplit.setCollapsible(0, False) @@ -703,7 +703,7 @@ class _HeadingsTab(NScrollablePage): # Edit Form # ========= - self.lblEditForm = QLabel(self.tr("Editing: {0}").format(self.tr("None"))) + self.lblEditForm = QLabel(self.tr("Editing: {0}").format(self.tr("None")), self) self.editTextBox = QPlainTextEdit(self) self.editTextBox.setFixedHeight(5*iPx) @@ -759,12 +759,12 @@ class _HeadingsTab(NScrollablePage): self.layoutMatrix.addWidget(self.layoutHeading, 0, 0, 1, 5) # Title Layout - self.mtxTitle = QLabel(self._build.getLabel("headings.fmtTitle")) + self.mtxTitle = QLabel(self._build.getLabel("headings.fmtTitle"), self) self.centerTitle = NSwitch(self, height=iPx) self.breakTitle = NSwitch(self, height=iPx) - lblCenterT = QLabel(self.tr("Centre")) + lblCenterT = QLabel(self.tr("Centre"), self) lblCenterT.setIndent(sSp) - lblBreakT = QLabel(self.tr("Page Break")) + lblBreakT = QLabel(self.tr("Page Break"), self) lblBreakT.setIndent(sSp) self.layoutMatrix.addWidget(self.mtxTitle, 1, 0) @@ -774,12 +774,12 @@ class _HeadingsTab(NScrollablePage): self.layoutMatrix.addWidget(self.breakTitle, 1, 4) # Chapter Layout - self.mtxChapter = QLabel(self._build.getLabel("headings.fmtChapter")) + self.mtxChapter = QLabel(self._build.getLabel("headings.fmtChapter"), self) self.centerChapter = NSwitch(self, height=iPx) self.breakChapter = NSwitch(self, height=iPx) - lblCenterC = QLabel(self.tr("Centre")) + lblCenterC = QLabel(self.tr("Centre"), self) lblCenterC.setIndent(sSp) - lblBreakC = QLabel(self.tr("Page Break")) + lblBreakC = QLabel(self.tr("Page Break"), self) lblBreakC.setIndent(sSp) self.layoutMatrix.addWidget(self.mtxChapter, 2, 0) @@ -789,12 +789,12 @@ class _HeadingsTab(NScrollablePage): self.layoutMatrix.addWidget(self.breakChapter, 2, 4) # Scene Layout - self.mtxScene = QLabel(self._build.getLabel("headings.fmtScene")) + self.mtxScene = QLabel(self._build.getLabel("headings.fmtScene"), self) self.centerScene = NSwitch(self, height=iPx) self.breakScene = NSwitch(self, height=iPx) - lblCenterS = QLabel(self.tr("Centre")) + lblCenterS = QLabel(self.tr("Centre"), self) lblCenterS.setIndent(sSp) - lblBreakS = QLabel(self.tr("Page Break")) + lblBreakS = QLabel(self.tr("Page Break"), self) lblBreakS.setIndent(sSp) self.layoutMatrix.addWidget(self.mtxScene, 3, 0) diff --git a/novelwriter/tools/noveldetails.py b/novelwriter/tools/noveldetails.py index b5d5d4dd..08755425 100644 --- a/novelwriter/tools/noveldetails.py +++ b/novelwriter/tools/noveldetails.py @@ -95,7 +95,7 @@ class GuiNovelDetails(QDialog): self.mainStack.addWidget(self.contentsPage) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogClose) + self.buttonBox = QDialogButtonBox(QtDialogClose, self) self.buttonBox.rejected.connect(self.close) # Assemble @@ -366,7 +366,7 @@ class _ContentsPage(NFixedPage): countFrom = options.getInt("GuiNovelDetails", "countFrom", 1) clearDouble = options.getBool("GuiNovelDetails", "clearDouble", True) - self.wpLabel = QLabel(self.tr("Words per page")) + self.wpLabel = QLabel(self.tr("Words per page"), self) self.wpValue = QSpinBox(self) self.wpValue.setMinimum(10) @@ -375,7 +375,7 @@ class _ContentsPage(NFixedPage): self.wpValue.setValue(wordsPerPage) self.wpValue.valueChanged.connect(self._populateTree) - self.poLabel = QLabel(self.tr("First page offset")) + self.poLabel = QLabel(self.tr("First page offset"), self) self.poValue = QSpinBox(self) self.poValue.setMinimum(1) @@ -384,7 +384,7 @@ class _ContentsPage(NFixedPage): self.poValue.setValue(countFrom) self.poValue.valueChanged.connect(self._populateTree) - self.dblLabel = QLabel(self.tr("Chapters on odd pages")) + self.dblLabel = QLabel(self.tr("Chapters on odd pages"), self) self.dblValue = NSwitch(self, height=iPx) self.dblValue.setChecked(clearDouble) diff --git a/novelwriter/tools/welcome.py b/novelwriter/tools/welcome.py index 436c7198..c8f26727 100644 --- a/novelwriter/tools/welcome.py +++ b/novelwriter/tools/welcome.py @@ -682,10 +682,10 @@ class _NewProjectForm(QWidget): # ======== self.extraBox = QVBoxLayout() - self.extraBox.addWidget(QLabel("{0}".format(self.tr("Chapters and Scenes")))) + self.extraBox.addWidget(QLabel("{0}".format(self.tr("Chapters and Scenes")), self)) self.extraBox.addLayout(self.novelForm) self.extraBox.addSpacing(sPx) - self.extraBox.addWidget(QLabel("{0}".format(self.tr("Project Notes")))) + self.extraBox.addWidget(QLabel("{0}".format(self.tr("Project Notes")), self)) self.extraBox.addLayout(self.notesForm) self.extraBox.setContentsMargins(0, 0, 0, 0) @@ -694,7 +694,7 @@ class _NewProjectForm(QWidget): self.extraWidget.setContentsMargins(0, 0, 0, 0) self.formBox = QVBoxLayout() - self.formBox.addWidget(QLabel("{0}".format(self.tr("Create New Project")))) + self.formBox.addWidget(QLabel("{0}".format(self.tr("Create New Project")), self)) self.formBox.addLayout(self.projectForm) self.formBox.addSpacing(sPx) self.formBox.addWidget(self.extraWidget) @@ -738,7 +738,7 @@ class _NewProjectForm(QWidget): """Select a project folder.""" if projDir := QFileDialog.getExistingDirectory( self, self.tr("Select Project Folder"), - str(self._basePath), options=QFileDialog.ShowDirsOnly + str(self._basePath), options=QFileDialog.Option.ShowDirsOnly ): self._basePath = Path(projDir) self._updateProjPath() diff --git a/novelwriter/tools/writingstats.py b/novelwriter/tools/writingstats.py index 516fe356..1a12e40f 100644 --- a/novelwriter/tools/writingstats.py +++ b/novelwriter/tools/writingstats.py @@ -105,7 +105,7 @@ class GuiWritingStats(QDialog): pOptions.getInt("GuiWritingStats", "widthCol3", 80) ) - self.listBox = QTreeWidget() + self.listBox = QTreeWidget(self) self.listBox.setHeaderLabels([ self.tr("Session Start"), self.tr("Length"), @@ -145,36 +145,36 @@ class GuiWritingStats(QDialog): self.infoForm = QGridLayout(self) self.infoBox.setLayout(self.infoForm) - self.labelTotal = QLabel(formatTime(0)) + self.labelTotal = QLabel(formatTime(0), self) self.labelTotal.setFont(SHARED.theme.guiFontFixed) self.labelTotal.setAlignment(QtAlignRightMiddle) - self.labelIdleT = QLabel(formatTime(0)) + self.labelIdleT = QLabel(formatTime(0), self) self.labelIdleT.setFont(SHARED.theme.guiFontFixed) self.labelIdleT.setAlignment(QtAlignRightMiddle) - self.labelFilter = QLabel(formatTime(0)) + self.labelFilter = QLabel(formatTime(0), self) self.labelFilter.setFont(SHARED.theme.guiFontFixed) self.labelFilter.setAlignment(QtAlignRightMiddle) - self.novelWords = QLabel("0") + self.novelWords = QLabel("0", self) self.novelWords.setFont(SHARED.theme.guiFontFixed) self.novelWords.setAlignment(QtAlignRightMiddle) - self.notesWords = QLabel("0") + self.notesWords = QLabel("0", self) self.notesWords.setFont(SHARED.theme.guiFontFixed) self.notesWords.setAlignment(QtAlignRightMiddle) - self.totalWords = QLabel("0") + self.totalWords = QLabel("0", self) self.totalWords.setFont(SHARED.theme.guiFontFixed) self.totalWords.setAlignment(QtAlignRightMiddle) - lblTTime = QLabel(self.tr("Total Time:")) - lblITime = QLabel(self.tr("Idle Time:")) - lblFTime = QLabel(self.tr("Filtered Time:")) - lblNvCount = QLabel(self.tr("Novel Word Count:")) - lblNtCount = QLabel(self.tr("Notes Word Count:")) - lblTtCount = QLabel(self.tr("Total Word Count:")) + lblTTime = QLabel(self.tr("Total Time:"), self) + lblITime = QLabel(self.tr("Idle Time:"), self) + lblFTime = QLabel(self.tr("Filtered Time:"), self) + lblNvCount = QLabel(self.tr("Novel Word Count:"), self) + lblNtCount = QLabel(self.tr("Notes Word Count:"), self) + lblTtCount = QLabel(self.tr("Total Word Count:"), self) self.infoForm.addWidget(lblTTime, 0, 0) self.infoForm.addWidget(lblITime, 1, 0) @@ -235,12 +235,12 @@ class GuiWritingStats(QDialog): ) self.showIdleTime.clicked.connect(self._updateListBox) - self.filterForm.addWidget(QLabel(self.tr("Count novel files")), 0, 0) - self.filterForm.addWidget(QLabel(self.tr("Count note files")), 1, 0) - self.filterForm.addWidget(QLabel(self.tr("Hide zero word count")), 2, 0) - self.filterForm.addWidget(QLabel(self.tr("Hide negative word count")), 3, 0) - self.filterForm.addWidget(QLabel(self.tr("Group entries by day")), 4, 0) - self.filterForm.addWidget(QLabel(self.tr("Show idle time")), 5, 0) + self.filterForm.addWidget(QLabel(self.tr("Count novel files"), self), 0, 0) + self.filterForm.addWidget(QLabel(self.tr("Count note files"), self), 1, 0) + self.filterForm.addWidget(QLabel(self.tr("Hide zero word count"), self), 2, 0) + self.filterForm.addWidget(QLabel(self.tr("Hide negative word count"), self), 3, 0) + self.filterForm.addWidget(QLabel(self.tr("Group entries by day"), self), 4, 0) + self.filterForm.addWidget(QLabel(self.tr("Show idle time"), self), 5, 0) self.filterForm.addWidget(self.incNovel, 0, 1) self.filterForm.addWidget(self.incNotes, 1, 1) self.filterForm.addWidget(self.hideZeros, 2, 1) @@ -261,7 +261,7 @@ class GuiWritingStats(QDialog): self.optsBox = QHBoxLayout() self.optsBox.addStretch(1) - self.optsBox.addWidget(QLabel(self.tr("Word count cap for the histogram")), 0) + self.optsBox.addWidget(QLabel(self.tr("Word count cap for the histogram"), self), 0) self.optsBox.addWidget(self.histMax, 0) # Buttons diff --git a/novelwriter/types.py b/novelwriter/types.py index fbc87873..56e59604 100644 --- a/novelwriter/types.py +++ b/novelwriter/types.py @@ -24,7 +24,7 @@ along with this program. If not, see . from __future__ import annotations from PyQt5.QtCore import Qt -from PyQt5.QtGui import QColor, QPainter +from PyQt5.QtGui import QColor, QPainter, QTextCursor from PyQt5.QtWidgets import QDialogButtonBox, QStyle # Qt Alignment Flags @@ -81,3 +81,10 @@ QtRoleAccept = QDialogButtonBox.ButtonRole.AcceptRole QtRoleAction = QDialogButtonBox.ButtonRole.ActionRole QtRoleApply = QDialogButtonBox.ButtonRole.ApplyRole QtRoleReject = QDialogButtonBox.ButtonRole.RejectRole + +# Cursor Types + +QtKeepAnchor = QTextCursor.MoveMode.KeepAnchor +QtMoveAnchor = QTextCursor.MoveMode.MoveAnchor +QtMoveLeft = QTextCursor.MoveOperation.Left +QtMoveRight = QTextCursor.MoveOperation.Right diff --git a/tests/test_gui/test_gui_doceditor.py b/tests/test_gui/test_gui_doceditor.py index a95cef92..d947377a 100644 --- a/tests/test_gui/test_gui_doceditor.py +++ b/tests/test_gui/test_gui_doceditor.py @@ -37,7 +37,7 @@ from novelwriter.enum import ( ) from novelwriter.gui.doceditor import GuiDocEditor, GuiDocToolBar from novelwriter.text.counting import standardCounter -from novelwriter.types import QtAlignJustify, QtAlignLeft, QtMouseLeft +from novelwriter.types import QtAlignJustify, QtAlignLeft, QtKeepAnchor, QtMouseLeft, QtMoveRight KEY_DELAY = 1 @@ -1413,7 +1413,7 @@ def testGuiEditor_MultiBlockFormatting(qtbot, nwGUI, projPath, ipsumText, mockRn # Toggle Comment cursor = nwGUI.docEditor.textCursor() cursor.setPosition(50) - cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, 2000) + cursor.movePosition(QtMoveRight, QtKeepAnchor, 2000) nwGUI.docEditor.setTextCursor(cursor) nwGUI.docEditor._iterFormatBlocks(nwDocAction.BLOCK_COM) @@ -1434,7 +1434,7 @@ def testGuiEditor_MultiBlockFormatting(qtbot, nwGUI, projPath, ipsumText, mockRn # Un-toggle all cursor = nwGUI.docEditor.textCursor() cursor.setPosition(50) - cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, 3000) + cursor.movePosition(QtMoveRight, QtKeepAnchor, 3000) nwGUI.docEditor.setTextCursor(cursor) nwGUI.docEditor._iterFormatBlocks(nwDocAction.BLOCK_COM) @@ -1445,7 +1445,7 @@ def testGuiEditor_MultiBlockFormatting(qtbot, nwGUI, projPath, ipsumText, mockRn # Toggle Ignore Text cursor = nwGUI.docEditor.textCursor() cursor.setPosition(50) - cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, 2000) + cursor.movePosition(QtMoveRight, QtKeepAnchor, 2000) nwGUI.docEditor.setTextCursor(cursor) nwGUI.docEditor._iterFormatBlocks(nwDocAction.BLOCK_IGN) @@ -1456,7 +1456,7 @@ def testGuiEditor_MultiBlockFormatting(qtbot, nwGUI, projPath, ipsumText, mockRn # Clear all paragraphs cursor = nwGUI.docEditor.textCursor() cursor.setPosition(50) - cursor.movePosition(QTextCursor.MoveOperation.Right, QTextCursor.MoveMode.KeepAnchor, 3000) + cursor.movePosition(QtMoveRight, QtKeepAnchor, 3000) nwGUI.docEditor.setTextCursor(cursor) nwGUI.docEditor._iterFormatBlocks(nwDocAction.BLOCK_TXT)