Clean up warnings and deprecations in gui components
This commit is contained in:
+16
-1
@@ -38,7 +38,8 @@ from urllib.parse import urljoin
|
|||||||
from urllib.request import pathname2url
|
from urllib.request import pathname2url
|
||||||
|
|
||||||
from PyQt6.QtCore import QCoreApplication, QMimeData, QUrl
|
from PyQt6.QtCore import QCoreApplication, QMimeData, QUrl
|
||||||
from PyQt6.QtGui import QColor, QDesktopServices, QFont, QFontDatabase, QFontInfo
|
from PyQt6.QtGui import QAction, QColor, QDesktopServices, QFont, QFontDatabase, QFontInfo
|
||||||
|
from PyQt6.QtWidgets import QMenu, QMenuBar, QWidget
|
||||||
|
|
||||||
from novelwriter.constants import nwConst, nwLabels, nwUnicode, trConst
|
from novelwriter.constants import nwConst, nwLabels, nwUnicode, trConst
|
||||||
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
|
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
|
||||||
@@ -461,6 +462,20 @@ def qtLambda(func: Callable, *args: Any, **kwargs: Any) -> Callable:
|
|||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
def qtAddAction(parent: QWidget, label: str) -> QAction:
|
||||||
|
"""Helper to add action to widget and always return the action."""
|
||||||
|
action = QAction(label, parent)
|
||||||
|
parent.addAction(action)
|
||||||
|
return action
|
||||||
|
|
||||||
|
|
||||||
|
def qtAddMenu(parent: QMenuBar | QMenu, label: str) -> QMenu:
|
||||||
|
"""Helper to add menu to menu and always return the menu."""
|
||||||
|
menu = QMenu(label, parent)
|
||||||
|
parent.addMenu(menu)
|
||||||
|
return menu
|
||||||
|
|
||||||
|
|
||||||
def encodeMimeHandles(mimeData: QMimeData, handles: list[str]) -> None:
|
def encodeMimeHandles(mimeData: QMimeData, handles: list[str]) -> None:
|
||||||
"""Encode handles into a mime data object."""
|
"""Encode handles into a mime data object."""
|
||||||
mimeData.setData(nwConst.MIME_HANDLE, b"|".join(h.encode() for h in handles))
|
mimeData.setData(nwConst.MIME_HANDLE, b"|".join(h.encode() for h in handles))
|
||||||
|
|||||||
@@ -52,7 +52,9 @@ from PyQt6.QtWidgets import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.common import decodeMimeHandles, fontMatcher, minmax, qtLambda, transferCase
|
from novelwriter.common import (
|
||||||
|
decodeMimeHandles, fontMatcher, minmax, qtAddAction, qtLambda, transferCase
|
||||||
|
)
|
||||||
from novelwriter.constants import nwConst, nwKeyWords, nwShortcode, nwUnicode
|
from novelwriter.constants import nwConst, nwKeyWords, nwShortcode, nwUnicode
|
||||||
from novelwriter.core.document import NWDocument
|
from novelwriter.core.document import NWDocument
|
||||||
from novelwriter.enum import (
|
from novelwriter.enum import (
|
||||||
@@ -168,7 +170,7 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
self.customContextMenuRequested.connect(self._openContextMenu)
|
self.customContextMenuRequested.connect(self._openContextMenu)
|
||||||
|
|
||||||
# Editor Settings
|
# Editor Settings
|
||||||
self.setMinimumWidth(CONFIG.pxInt(300))
|
self.setMinimumWidth(300)
|
||||||
self.setAutoFillBackground(True)
|
self.setAutoFillBackground(True)
|
||||||
self.setFrameStyle(QFrame.Shape.NoFrame)
|
self.setFrameStyle(QFrame.Shape.NoFrame)
|
||||||
self.setAcceptDrops(True)
|
self.setAcceptDrops(True)
|
||||||
@@ -295,10 +297,11 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
palette.setColor(QPalette.ColorRole.Text, syntax.text)
|
palette.setColor(QPalette.ColorRole.Text, syntax.text)
|
||||||
self.setPalette(palette)
|
self.setPalette(palette)
|
||||||
|
|
||||||
palette = self.viewport().palette()
|
if viewport := self.viewport():
|
||||||
palette.setColor(QPalette.ColorRole.Base, syntax.back)
|
palette = viewport.palette()
|
||||||
palette.setColor(QPalette.ColorRole.Text, syntax.text)
|
palette.setColor(QPalette.ColorRole.Base, syntax.back)
|
||||||
self.viewport().setPalette(palette)
|
palette.setColor(QPalette.ColorRole.Text, syntax.text)
|
||||||
|
viewport.setPalette(palette)
|
||||||
|
|
||||||
self.docHeader.matchColours()
|
self.docHeader.matchColours()
|
||||||
self.docFooter.matchColours()
|
self.docFooter.matchColours()
|
||||||
@@ -513,29 +516,27 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
|
|
||||||
def cursorIsVisible(self) -> bool:
|
def cursorIsVisible(self) -> bool:
|
||||||
"""Check if the cursor is visible in the editor."""
|
"""Check if the cursor is visible in the editor."""
|
||||||
return (
|
viewport = self.viewport()
|
||||||
0 < self.cursorRect().top()
|
height = viewport.height() if viewport else 0
|
||||||
and self.cursorRect().bottom() < self.viewport().height()
|
return 0 < self.cursorRect().top() and self.cursorRect().bottom() < height
|
||||||
)
|
|
||||||
|
|
||||||
def ensureCursorVisibleNoCentre(self) -> None:
|
def ensureCursorVisibleNoCentre(self) -> None:
|
||||||
"""Ensure cursor is visible, but don't force it to centre."""
|
"""Ensure cursor is visible, but don't force it to centre."""
|
||||||
cT = self.cursorRect().top()
|
if (viewport := self.viewport()) and (vBar := self.verticalScrollBar()):
|
||||||
cB = self.cursorRect().bottom()
|
cT = self.cursorRect().top()
|
||||||
vH = self.viewport().height()
|
cB = self.cursorRect().bottom()
|
||||||
if cT < 0:
|
vH = viewport.height()
|
||||||
count = 0
|
if cT < 0:
|
||||||
vBar = self.verticalScrollBar()
|
count = 0
|
||||||
while self.cursorRect().top() < 0 and count < 100000:
|
while self.cursorRect().top() < 0 and count < 100000:
|
||||||
vBar.setValue(vBar.value() - 1)
|
vBar.setValue(vBar.value() - 1)
|
||||||
count += 1
|
count += 1
|
||||||
elif cB > vH:
|
elif cB > vH:
|
||||||
count = 0
|
count = 0
|
||||||
vBar = self.verticalScrollBar()
|
while self.cursorRect().bottom() > vH and count < 100000:
|
||||||
while self.cursorRect().bottom() > vH and count < 100000:
|
vBar.setValue(vBar.value() + 1)
|
||||||
vBar.setValue(vBar.value() + 1)
|
count += 1
|
||||||
count += 1
|
QApplication.processEvents()
|
||||||
QApplication.processEvents()
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def updateDocMargins(self) -> None:
|
def updateDocMargins(self) -> None:
|
||||||
@@ -547,10 +548,10 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
wH = self.height()
|
wH = self.height()
|
||||||
|
|
||||||
vBar = self.verticalScrollBar()
|
vBar = self.verticalScrollBar()
|
||||||
sW = vBar.width() if vBar.isVisible() else 0
|
sW = vBar.width() if vBar and vBar.isVisible() else 0
|
||||||
|
|
||||||
hBar = self.horizontalScrollBar()
|
hBar = self.horizontalScrollBar()
|
||||||
sH = hBar.height() if hBar.isVisible() else 0
|
sH = hBar.height() if hBar and hBar.isVisible() else 0
|
||||||
|
|
||||||
tM = self._vpMargin
|
tM = self._vpMargin
|
||||||
if CONFIG.textWidth > 0 or SHARED.focusMode:
|
if CONFIG.textWidth > 0 or SHARED.focusMode:
|
||||||
@@ -959,10 +960,9 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
kMod = event.modifiers()
|
kMod = event.modifiers()
|
||||||
okMod = kMod in (QtModNone, QtModShift)
|
okMod = kMod in (QtModNone, QtModShift)
|
||||||
okKey = event.key() not in self.MOVE_KEYS
|
okKey = event.key() not in self.MOVE_KEYS
|
||||||
if nPos != cPos and okMod and okKey:
|
if nPos != cPos and okMod and okKey and (viewport := self.viewport()):
|
||||||
mPos = CONFIG.autoScrollPos*0.01 * self.viewport().height()
|
mPos = CONFIG.autoScrollPos*0.01 * viewport.height()
|
||||||
if cPos > mPos:
|
if cPos > mPos and (vBar := self.verticalScrollBar()):
|
||||||
vBar = self.verticalScrollBar()
|
|
||||||
vBar.setValue(vBar.value() + (1 if nPos > cPos else -1))
|
vBar.setValue(vBar.value() + (1 if nPos > cPos else -1))
|
||||||
else:
|
else:
|
||||||
super().keyPressEvent(event)
|
super().keyPressEvent(event)
|
||||||
@@ -971,7 +971,7 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
|
|
||||||
def dragEnterEvent(self, event: QDragEnterEvent) -> None:
|
def dragEnterEvent(self, event: QDragEnterEvent) -> None:
|
||||||
"""Overload drag enter event to handle dragged items."""
|
"""Overload drag enter event to handle dragged items."""
|
||||||
if event.mimeData().hasFormat(nwConst.MIME_HANDLE):
|
if (data := event.mimeData()) and data.hasFormat(nwConst.MIME_HANDLE):
|
||||||
event.acceptProposedAction()
|
event.acceptProposedAction()
|
||||||
else:
|
else:
|
||||||
super().dragEnterEvent(event)
|
super().dragEnterEvent(event)
|
||||||
@@ -979,7 +979,7 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
|
|
||||||
def dragMoveEvent(self, event: QDragMoveEvent) -> None:
|
def dragMoveEvent(self, event: QDragMoveEvent) -> None:
|
||||||
"""Overload drag move event to handle dragged items."""
|
"""Overload drag move event to handle dragged items."""
|
||||||
if event.mimeData().hasFormat(nwConst.MIME_HANDLE):
|
if (data := event.mimeData()) and data.hasFormat(nwConst.MIME_HANDLE):
|
||||||
event.acceptProposedAction()
|
event.acceptProposedAction()
|
||||||
else:
|
else:
|
||||||
super().dragMoveEvent(event)
|
super().dragMoveEvent(event)
|
||||||
@@ -987,8 +987,8 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
|
|
||||||
def dropEvent(self, event: QDropEvent) -> None:
|
def dropEvent(self, event: QDropEvent) -> None:
|
||||||
"""Overload drop event to handle dragged items."""
|
"""Overload drop event to handle dragged items."""
|
||||||
if event.mimeData().hasFormat(nwConst.MIME_HANDLE):
|
if (data := event.mimeData()) and data.hasFormat(nwConst.MIME_HANDLE):
|
||||||
if handles := decodeMimeHandles(event.mimeData()):
|
if handles := decodeMimeHandles(data):
|
||||||
if SHARED.project.tree.checkType(handles[0], nwItemType.FILE):
|
if SHARED.project.tree.checkType(handles[0], nwItemType.FILE):
|
||||||
self.openDocumentRequest.emit(handles[0], nwDocMode.EDIT, "", True)
|
self.openDocumentRequest.emit(handles[0], nwDocMode.EDIT, "", True)
|
||||||
else:
|
else:
|
||||||
@@ -1098,10 +1098,10 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
# at unwanted times when other changes are made to the document
|
# at unwanted times when other changes are made to the document
|
||||||
cursor = self.textCursor()
|
cursor = self.textCursor()
|
||||||
bPos = cursor.positionInBlock()
|
bPos = cursor.positionInBlock()
|
||||||
if bPos > 0:
|
if bPos > 0 and (viewport := self.viewport()):
|
||||||
show = self._completer.updateText(text, bPos)
|
show = self._completer.updateText(text, bPos)
|
||||||
point = self.cursorRect().bottomRight()
|
point = self.cursorRect().bottomRight()
|
||||||
self._completer.move(self.viewport().mapToGlobal(point))
|
self._completer.move(viewport.mapToGlobal(point))
|
||||||
self._completer.setVisible(show)
|
self._completer.setVisible(show)
|
||||||
else:
|
else:
|
||||||
self._completer.setVisible(False)
|
self._completer.setVisible(False)
|
||||||
@@ -1148,46 +1148,46 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
ctxMenu = QMenu(self)
|
ctxMenu = QMenu(self)
|
||||||
ctxMenu.setObjectName("ContextMenu")
|
ctxMenu.setObjectName("ContextMenu")
|
||||||
if pBlock.userState() == BLOCK_TITLE:
|
if pBlock.userState() == BLOCK_TITLE:
|
||||||
action = ctxMenu.addAction(self.tr("Set as Document Name"))
|
action = qtAddAction(ctxMenu, self.tr("Set as Document Name"))
|
||||||
action.triggered.connect(qtLambda(self._emitRenameItem, pBlock))
|
action.triggered.connect(qtLambda(self._emitRenameItem, pBlock))
|
||||||
|
|
||||||
# URL
|
# URL
|
||||||
(mData, mType) = self._qDocument.metaDataAtPos(pCursor.position())
|
(mData, mType) = self._qDocument.metaDataAtPos(pCursor.position())
|
||||||
if mData and mType == "url":
|
if mData and mType == "url":
|
||||||
action = ctxMenu.addAction(self.tr("Open URL"))
|
action = qtAddAction(ctxMenu, self.tr("Open URL"))
|
||||||
action.triggered.connect(qtLambda(SHARED.openWebsite, mData))
|
action.triggered.connect(qtLambda(SHARED.openWebsite, mData))
|
||||||
ctxMenu.addSeparator()
|
ctxMenu.addSeparator()
|
||||||
|
|
||||||
# Follow
|
# Follow
|
||||||
status = self._processTag(cursor=pCursor, follow=False)
|
status = self._processTag(cursor=pCursor, follow=False)
|
||||||
if status == nwTrinary.POSITIVE:
|
if status == nwTrinary.POSITIVE:
|
||||||
action = ctxMenu.addAction(self.tr("Follow Tag"))
|
action = qtAddAction(ctxMenu, self.tr("Follow Tag"))
|
||||||
action.triggered.connect(qtLambda(self._processTag, cursor=pCursor, follow=True))
|
action.triggered.connect(qtLambda(self._processTag, cursor=pCursor, follow=True))
|
||||||
ctxMenu.addSeparator()
|
ctxMenu.addSeparator()
|
||||||
elif status == nwTrinary.NEGATIVE:
|
elif status == nwTrinary.NEGATIVE:
|
||||||
action = ctxMenu.addAction(self.tr("Create Note for Tag"))
|
action = qtAddAction(ctxMenu, self.tr("Create Note for Tag"))
|
||||||
action.triggered.connect(qtLambda(self._processTag, cursor=pCursor, create=True))
|
action.triggered.connect(qtLambda(self._processTag, cursor=pCursor, create=True))
|
||||||
ctxMenu.addSeparator()
|
ctxMenu.addSeparator()
|
||||||
|
|
||||||
# Cut, Copy and Paste
|
# Cut, Copy and Paste
|
||||||
if uCursor.hasSelection():
|
if uCursor.hasSelection():
|
||||||
action = ctxMenu.addAction(self.tr("Cut"))
|
action = qtAddAction(ctxMenu, self.tr("Cut"))
|
||||||
action.triggered.connect(qtLambda(self.docAction, nwDocAction.CUT))
|
action.triggered.connect(qtLambda(self.docAction, nwDocAction.CUT))
|
||||||
action = ctxMenu.addAction(self.tr("Copy"))
|
action = qtAddAction(ctxMenu, self.tr("Copy"))
|
||||||
action.triggered.connect(qtLambda(self.docAction, nwDocAction.COPY))
|
action.triggered.connect(qtLambda(self.docAction, nwDocAction.COPY))
|
||||||
|
|
||||||
action = ctxMenu.addAction(self.tr("Paste"))
|
action = qtAddAction(ctxMenu, self.tr("Paste"))
|
||||||
action.triggered.connect(qtLambda(self.docAction, nwDocAction.PASTE))
|
action.triggered.connect(qtLambda(self.docAction, nwDocAction.PASTE))
|
||||||
ctxMenu.addSeparator()
|
ctxMenu.addSeparator()
|
||||||
|
|
||||||
# Selections
|
# Selections
|
||||||
action = ctxMenu.addAction(self.tr("Select All"))
|
action = qtAddAction(ctxMenu, self.tr("Select All"))
|
||||||
action.triggered.connect(qtLambda(self.docAction, nwDocAction.SEL_ALL))
|
action.triggered.connect(qtLambda(self.docAction, nwDocAction.SEL_ALL))
|
||||||
action = ctxMenu.addAction(self.tr("Select Word"))
|
action = qtAddAction(ctxMenu, self.tr("Select Word"))
|
||||||
action.triggered.connect(qtLambda(
|
action.triggered.connect(qtLambda(
|
||||||
self._makePosSelection, QTextCursor.SelectionType.WordUnderCursor, pos,
|
self._makePosSelection, QTextCursor.SelectionType.WordUnderCursor, pos,
|
||||||
))
|
))
|
||||||
action = ctxMenu.addAction(self.tr("Select Paragraph"))
|
action = qtAddAction(ctxMenu, self.tr("Select Paragraph"))
|
||||||
action.triggered.connect(qtLambda(
|
action.triggered.connect(qtLambda(
|
||||||
self._makePosSelection, QTextCursor.SelectionType.BlockUnderCursor, pos
|
self._makePosSelection, QTextCursor.SelectionType.BlockUnderCursor, pos
|
||||||
))
|
))
|
||||||
@@ -1203,23 +1203,24 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
sCursor.movePosition(QtMoveRight, QtKeepAnchor, cLen)
|
sCursor.movePosition(QtMoveRight, QtKeepAnchor, cLen)
|
||||||
if suggest:
|
if suggest:
|
||||||
ctxMenu.addSeparator()
|
ctxMenu.addSeparator()
|
||||||
ctxMenu.addAction(self.tr("Spelling Suggestion(s)"))
|
qtAddAction(ctxMenu, self.tr("Spelling Suggestion(s)"))
|
||||||
for option in suggest[:15]:
|
for option in suggest[:15]:
|
||||||
action = ctxMenu.addAction(f"{nwUnicode.U_ENDASH} {option}")
|
action = qtAddAction(ctxMenu, f"{nwUnicode.U_ENDASH} {option}")
|
||||||
action.triggered.connect(qtLambda(self._correctWord, sCursor, option))
|
action.triggered.connect(qtLambda(self._correctWord, sCursor, option))
|
||||||
else:
|
else:
|
||||||
trNone = self.tr("No Suggestions")
|
trNone = self.tr("No Suggestions")
|
||||||
ctxMenu.addAction(f"{nwUnicode.U_ENDASH} {trNone}")
|
qtAddAction(ctxMenu, f"{nwUnicode.U_ENDASH} {trNone}")
|
||||||
|
|
||||||
ctxMenu.addSeparator()
|
ctxMenu.addSeparator()
|
||||||
action = ctxMenu.addAction(self.tr("Ignore Word"))
|
action = qtAddAction(ctxMenu, self.tr("Ignore Word"))
|
||||||
action.triggered.connect(qtLambda(self._addWord, word, block, False))
|
action.triggered.connect(qtLambda(self._addWord, word, block, False))
|
||||||
action = ctxMenu.addAction(self.tr("Add Word to Dictionary"))
|
action = qtAddAction(ctxMenu, self.tr("Add Word to Dictionary"))
|
||||||
action.triggered.connect(qtLambda(self._addWord, word, block, True))
|
action.triggered.connect(qtLambda(self._addWord, word, block, True))
|
||||||
|
|
||||||
# Execute the context menu
|
# Execute the context menu
|
||||||
ctxMenu.exec(self.viewport().mapToGlobal(pos))
|
if viewport := self.viewport():
|
||||||
ctxMenu.deleteLater()
|
ctxMenu.exec(viewport.mapToGlobal(pos))
|
||||||
|
ctxMenu.deleteLater()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -2007,8 +2008,8 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
sPos = cPos
|
sPos = cPos
|
||||||
for i in range(cPos - bPos):
|
for i in range(cPos - bPos):
|
||||||
sPos = cPos - i - 1
|
sPos = cPos - i - 1
|
||||||
cOne = self._qDocument.characterAt(sPos)
|
cOne = str(self._qDocument.characterAt(sPos))
|
||||||
cTwo = self._qDocument.characterAt(sPos - 1)
|
cTwo = str(self._qDocument.characterAt(sPos - 1))
|
||||||
if not (cOne.isalnum() or cOne in apos and cTwo.isalnum()):
|
if not (cOne.isalnum() or cOne in apos and cTwo.isalnum()):
|
||||||
sPos += 1
|
sPos += 1
|
||||||
break
|
break
|
||||||
@@ -2017,8 +2018,8 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
ePos = cPos
|
ePos = cPos
|
||||||
for i in range(bPos + bLen - cPos):
|
for i in range(bPos + bLen - cPos):
|
||||||
ePos = cPos + i
|
ePos = cPos + i
|
||||||
cOne = self._qDocument.characterAt(ePos)
|
cOne = str(self._qDocument.characterAt(ePos))
|
||||||
cTwo = self._qDocument.characterAt(ePos + 1)
|
cTwo = str(self._qDocument.characterAt(ePos + 1))
|
||||||
if not (cOne.isalnum() or cOne in apos and cTwo.isalnum()):
|
if not (cOne.isalnum() or cOne in apos and cTwo.isalnum()):
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -2122,7 +2123,7 @@ class MetaCompleter(QMenu):
|
|||||||
|
|
||||||
for value in sorted(options):
|
for value in sorted(options):
|
||||||
rep = value + suffix
|
rep = value + suffix
|
||||||
action = self.addAction(value)
|
action = qtAddAction(self, value)
|
||||||
action.triggered.connect(qtLambda(self._emitComplete, offset, length, rep))
|
action.triggered.connect(qtLambda(self._emitComplete, offset, length, rep))
|
||||||
|
|
||||||
return True
|
return True
|
||||||
@@ -2339,7 +2340,6 @@ class GuiDocToolBar(QWidget):
|
|||||||
logger.debug("Create: GuiDocToolBar")
|
logger.debug("Create: GuiDocToolBar")
|
||||||
|
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
cM = CONFIG.pxInt(4)
|
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
|
|
||||||
# General Buttons
|
# General Buttons
|
||||||
@@ -2412,7 +2412,7 @@ class GuiDocToolBar(QWidget):
|
|||||||
self.outerBox.addWidget(self.tbBoldMD)
|
self.outerBox.addWidget(self.tbBoldMD)
|
||||||
self.outerBox.addWidget(self.tbItalicMD)
|
self.outerBox.addWidget(self.tbItalicMD)
|
||||||
self.outerBox.addWidget(self.tbStrikeMD)
|
self.outerBox.addWidget(self.tbStrikeMD)
|
||||||
self.outerBox.addSpacing(cM)
|
self.outerBox.addSpacing(4)
|
||||||
self.outerBox.addWidget(self.tbBold)
|
self.outerBox.addWidget(self.tbBold)
|
||||||
self.outerBox.addWidget(self.tbItalic)
|
self.outerBox.addWidget(self.tbItalic)
|
||||||
self.outerBox.addWidget(self.tbStrike)
|
self.outerBox.addWidget(self.tbStrike)
|
||||||
@@ -2420,8 +2420,8 @@ class GuiDocToolBar(QWidget):
|
|||||||
self.outerBox.addWidget(self.tbMark)
|
self.outerBox.addWidget(self.tbMark)
|
||||||
self.outerBox.addWidget(self.tbSuperscript)
|
self.outerBox.addWidget(self.tbSuperscript)
|
||||||
self.outerBox.addWidget(self.tbSubscript)
|
self.outerBox.addWidget(self.tbSubscript)
|
||||||
self.outerBox.setContentsMargins(cM, cM, cM, cM)
|
self.outerBox.setContentsMargins(4, 4, 4, 4)
|
||||||
self.outerBox.setSpacing(cM)
|
self.outerBox.setSpacing(4)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
self.updateTheme()
|
self.updateTheme()
|
||||||
@@ -2472,7 +2472,6 @@ class GuiDocEditSearch(QFrame):
|
|||||||
self.docEditor = docEditor
|
self.docEditor = docEditor
|
||||||
|
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
mPx = CONFIG.pxInt(6)
|
|
||||||
|
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
self.setAutoFillBackground(True)
|
self.setAutoFillBackground(True)
|
||||||
@@ -2498,7 +2497,7 @@ class GuiDocEditSearch(QFrame):
|
|||||||
self.searchOpt.setContentsMargins(0, 0, 0, 0)
|
self.searchOpt.setContentsMargins(0, 0, 0, 0)
|
||||||
|
|
||||||
self.searchLabel = QLabel(self.tr("Search"), self)
|
self.searchLabel = QLabel(self.tr("Search"), self)
|
||||||
self.searchLabel.setIndent(CONFIG.pxInt(6))
|
self.searchLabel.setIndent(6)
|
||||||
|
|
||||||
self.resultLabel = QLabel("?/?", self)
|
self.resultLabel = QLabel("?/?", self)
|
||||||
|
|
||||||
@@ -2575,12 +2574,11 @@ class GuiDocEditSearch(QFrame):
|
|||||||
self.mainBox.setColumnStretch(3, 0)
|
self.mainBox.setColumnStretch(3, 0)
|
||||||
self.mainBox.setColumnStretch(4, 0)
|
self.mainBox.setColumnStretch(4, 0)
|
||||||
self.mainBox.setColumnStretch(5, 0)
|
self.mainBox.setColumnStretch(5, 0)
|
||||||
self.mainBox.setSpacing(CONFIG.pxInt(2))
|
self.mainBox.setSpacing(2)
|
||||||
self.mainBox.setContentsMargins(mPx, mPx, mPx, mPx)
|
self.mainBox.setContentsMargins(6, 6, 6, 6)
|
||||||
|
|
||||||
boxWidth = CONFIG.pxInt(200)
|
self.searchBox.setFixedWidth(200)
|
||||||
self.searchBox.setFixedWidth(boxWidth)
|
self.replaceBox.setFixedWidth(200)
|
||||||
self.replaceBox.setFixedWidth(boxWidth)
|
|
||||||
self.replaceBox.setVisible(False)
|
self.replaceBox.setVisible(False)
|
||||||
self.replaceButton.setVisible(False)
|
self.replaceButton.setVisible(False)
|
||||||
self.adjustSize()
|
self.adjustSize()
|
||||||
@@ -2848,7 +2846,6 @@ class GuiDocEditHeader(QWidget):
|
|||||||
|
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
mPx = CONFIG.pxInt(4)
|
|
||||||
|
|
||||||
# Main Widget Settings
|
# Main Widget Settings
|
||||||
self.setAutoFillBackground(True)
|
self.setAutoFillBackground(True)
|
||||||
@@ -2895,13 +2892,13 @@ class GuiDocEditHeader(QWidget):
|
|||||||
self.outerBox.addWidget(self.tbButton, 0)
|
self.outerBox.addWidget(self.tbButton, 0)
|
||||||
self.outerBox.addWidget(self.outlineButton, 0)
|
self.outerBox.addWidget(self.outlineButton, 0)
|
||||||
self.outerBox.addWidget(self.searchButton, 0)
|
self.outerBox.addWidget(self.searchButton, 0)
|
||||||
self.outerBox.addSpacing(mPx)
|
self.outerBox.addSpacing(4)
|
||||||
self.outerBox.addWidget(self.itemTitle, 1)
|
self.outerBox.addWidget(self.itemTitle, 1)
|
||||||
self.outerBox.addSpacing(mPx)
|
self.outerBox.addSpacing(4)
|
||||||
self.outerBox.addSpacing(iPx)
|
self.outerBox.addSpacing(iPx)
|
||||||
self.outerBox.addWidget(self.minmaxButton, 0)
|
self.outerBox.addWidget(self.minmaxButton, 0)
|
||||||
self.outerBox.addWidget(self.closeButton, 0)
|
self.outerBox.addWidget(self.closeButton, 0)
|
||||||
self.outerBox.setContentsMargins(mPx, mPx, mPx, mPx)
|
self.outerBox.setContentsMargins(4, 4, 4, 4)
|
||||||
self.outerBox.setSpacing(0)
|
self.outerBox.setSpacing(0)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
@@ -2912,7 +2909,7 @@ class GuiDocEditHeader(QWidget):
|
|||||||
# Fix Margins and Size
|
# Fix Margins and Size
|
||||||
# This is needed for high DPI systems. See issue #499.
|
# This is needed for high DPI systems. See issue #499.
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
self.setMinimumHeight(iPx + 2*mPx)
|
self.setMinimumHeight(iPx + 8)
|
||||||
|
|
||||||
self.updateFont()
|
self.updateFont()
|
||||||
self.updateTheme()
|
self.updateTheme()
|
||||||
@@ -2945,7 +2942,7 @@ class GuiDocEditHeader(QWidget):
|
|||||||
tStart = time()
|
tStart = time()
|
||||||
self.outlineMenu.clear()
|
self.outlineMenu.clear()
|
||||||
for number, text in data.items():
|
for number, text in data.items():
|
||||||
action = self.outlineMenu.addAction(text)
|
action = qtAddAction(self.outlineMenu, text)
|
||||||
action.triggered.connect(qtLambda(self._gotoBlock, number))
|
action.triggered.connect(qtLambda(self._gotoBlock, number))
|
||||||
self._docOutline = data
|
self._docOutline = data
|
||||||
logger.debug("Document outline updated in %.3f ms", 1000*(time() - tStart))
|
logger.debug("Document outline updated in %.3f ms", 1000*(time() - tStart))
|
||||||
@@ -3070,9 +3067,6 @@ class GuiDocEditFooter(QWidget):
|
|||||||
|
|
||||||
iPx = round(0.9*SHARED.theme.baseIconHeight)
|
iPx = round(0.9*SHARED.theme.baseIconHeight)
|
||||||
fPx = int(0.9*SHARED.theme.fontPixelSize)
|
fPx = int(0.9*SHARED.theme.fontPixelSize)
|
||||||
mPx = CONFIG.pxInt(8)
|
|
||||||
bSp = CONFIG.pxInt(4)
|
|
||||||
hSp = CONFIG.pxInt(6)
|
|
||||||
|
|
||||||
# Cached Translations
|
# Cached Translations
|
||||||
self._trLineCount = self.tr("Line: {0} ({1})")
|
self._trLineCount = self.tr("Line: {0} ({1})")
|
||||||
@@ -3127,23 +3121,23 @@ class GuiDocEditFooter(QWidget):
|
|||||||
|
|
||||||
# Assemble Layout
|
# Assemble Layout
|
||||||
self.outerBox = QHBoxLayout()
|
self.outerBox = QHBoxLayout()
|
||||||
self.outerBox.setSpacing(bSp)
|
self.outerBox.setSpacing(4)
|
||||||
self.outerBox.addWidget(self.statusIcon)
|
self.outerBox.addWidget(self.statusIcon)
|
||||||
self.outerBox.addWidget(self.statusText)
|
self.outerBox.addWidget(self.statusText)
|
||||||
self.outerBox.addStretch(1)
|
self.outerBox.addStretch(1)
|
||||||
self.outerBox.addWidget(self.linesIcon)
|
self.outerBox.addWidget(self.linesIcon)
|
||||||
self.outerBox.addWidget(self.linesText)
|
self.outerBox.addWidget(self.linesText)
|
||||||
self.outerBox.addSpacing(hSp)
|
self.outerBox.addSpacing(6)
|
||||||
self.outerBox.addWidget(self.wordsIcon)
|
self.outerBox.addWidget(self.wordsIcon)
|
||||||
self.outerBox.addWidget(self.wordsText)
|
self.outerBox.addWidget(self.wordsText)
|
||||||
self.outerBox.setContentsMargins(mPx, mPx, mPx, mPx)
|
self.outerBox.setContentsMargins(8, 8, 8, 8)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
|
|
||||||
# Fix Margins and Size
|
# Fix Margins and Size
|
||||||
# This is needed for high DPI systems. See issue #499.
|
# This is needed for high DPI systems. See issue #499.
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
self.setMinimumHeight(fPx + 2*mPx)
|
self.setMinimumHeight(fPx + 16)
|
||||||
|
|
||||||
# Fix the Colours
|
# Fix the Colours
|
||||||
self.updateFont()
|
self.updateFont()
|
||||||
@@ -3226,12 +3220,13 @@ class GuiDocEditFooter(QWidget):
|
|||||||
|
|
||||||
def updateLineCount(self, cursor: QTextCursor) -> None:
|
def updateLineCount(self, cursor: QTextCursor) -> None:
|
||||||
"""Update the line and document position counter."""
|
"""Update the line and document position counter."""
|
||||||
cPos = cursor.position() + 1
|
if document := cursor.document():
|
||||||
cLine = cursor.blockNumber() + 1
|
cPos = cursor.position() + 1
|
||||||
cCount = max(cursor.document().characterCount(), 1)
|
cLine = cursor.blockNumber() + 1
|
||||||
self.linesText.setText(
|
cCount = max(document.characterCount(), 1)
|
||||||
self._trLineCount.format(f"{cLine:n}", f"{100*cPos//cCount:d} %")
|
self.linesText.setText(
|
||||||
)
|
self._trLineCount.format(f"{cLine:n}", f"{100*cPos//cCount:d} %")
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
def updateWordCount(self, wCount: int, selection: bool) -> None:
|
def updateWordCount(self, wCount: int, selection: bool) -> None:
|
||||||
|
|||||||
@@ -272,14 +272,14 @@ class GuiDocHighlighter(QSyntaxHighlighter):
|
|||||||
"""Loop through all blocks and re-highlight those of a given
|
"""Loop through all blocks and re-highlight those of a given
|
||||||
content type.
|
content type.
|
||||||
"""
|
"""
|
||||||
qDoc = self.document()
|
if document := self.document():
|
||||||
nBlocks = qDoc.blockCount()
|
nBlocks = document.blockCount()
|
||||||
tStart = time()
|
tStart = time()
|
||||||
for i in range(nBlocks):
|
for i in range(nBlocks):
|
||||||
block = qDoc.findBlockByNumber(i)
|
block = document.findBlockByNumber(i)
|
||||||
if block.userState() & cType > 0:
|
if block.userState() & cType > 0:
|
||||||
self.rehighlightBlock(block)
|
self.rehighlightBlock(block)
|
||||||
logger.debug("Document highlighted in %.3f ms" % (1000*(time() - tStart)))
|
logger.debug("Document highlighted in %.3f ms" % (1000*(time() - tStart)))
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ from enum import Enum
|
|||||||
|
|
||||||
from PyQt6.QtCore import QPoint, Qt, QUrl, pyqtSignal, pyqtSlot
|
from PyQt6.QtCore import QPoint, Qt, QUrl, pyqtSignal, pyqtSlot
|
||||||
from PyQt6.QtGui import (
|
from PyQt6.QtGui import (
|
||||||
QAction, QCursor, QDesktopServices, QDragEnterEvent, QDragMoveEvent,
|
QCursor, QDesktopServices, QDragEnterEvent, QDragMoveEvent, QDropEvent,
|
||||||
QDropEvent, QMouseEvent, QPalette, QResizeEvent, QTextCursor
|
QMouseEvent, QPalette, QResizeEvent, QTextCursor
|
||||||
)
|
)
|
||||||
from PyQt6.QtWidgets import (
|
from PyQt6.QtWidgets import (
|
||||||
QApplication, QFrame, QHBoxLayout, QMenu, QTextBrowser, QToolButton,
|
QApplication, QFrame, QHBoxLayout, QMenu, QTextBrowser, QToolButton,
|
||||||
@@ -41,7 +41,7 @@ from PyQt6.QtWidgets import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.common import decodeMimeHandles, qtLambda
|
from novelwriter.common import decodeMimeHandles, qtAddAction, qtLambda
|
||||||
from novelwriter.constants import nwConst, nwStyles, nwUnicode
|
from novelwriter.constants import nwConst, nwStyles, nwUnicode
|
||||||
from novelwriter.enum import nwChange, nwDocAction, nwDocMode, nwItemType
|
from novelwriter.enum import nwChange, nwDocAction, nwDocMode, nwItemType
|
||||||
from novelwriter.error import logException
|
from novelwriter.error import logException
|
||||||
@@ -79,7 +79,7 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
self._docTheme = TextDocumentTheme()
|
self._docTheme = TextDocumentTheme()
|
||||||
|
|
||||||
# Settings
|
# Settings
|
||||||
self.setMinimumWidth(CONFIG.pxInt(300))
|
self.setMinimumWidth(300)
|
||||||
self.setAutoFillBackground(True)
|
self.setAutoFillBackground(True)
|
||||||
self.setOpenLinks(False)
|
self.setOpenLinks(False)
|
||||||
self.setOpenExternalLinks(False)
|
self.setOpenExternalLinks(False)
|
||||||
@@ -124,8 +124,7 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
@property
|
@property
|
||||||
def scrollPosition(self) -> int:
|
def scrollPosition(self) -> int:
|
||||||
"""Return the scrollbar position."""
|
"""Return the scrollbar position."""
|
||||||
vBar = self.verticalScrollBar()
|
if (vBar := self.verticalScrollBar()) and vBar.isVisible():
|
||||||
if vBar.isVisible():
|
|
||||||
return vBar.value()
|
return vBar.value()
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@@ -163,12 +162,13 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
palette.setColor(QPalette.ColorRole.Text, syntax.text)
|
palette.setColor(QPalette.ColorRole.Text, syntax.text)
|
||||||
self.setPalette(palette)
|
self.setPalette(palette)
|
||||||
|
|
||||||
palette = self.viewport().palette()
|
if viewport := self.viewport():
|
||||||
palette.setColor(QPalette.ColorRole.Base, syntax.back)
|
palette = viewport.palette()
|
||||||
palette.setColor(QPalette.ColorRole.Text, syntax.text)
|
palette.setColor(QPalette.ColorRole.Base, syntax.back)
|
||||||
self.viewport().setPalette(palette)
|
palette.setColor(QPalette.ColorRole.Text, syntax.text)
|
||||||
self.docHeader.matchColours()
|
viewport.setPalette(palette)
|
||||||
self.docFooter.matchColours()
|
self.docHeader.matchColours()
|
||||||
|
self.docFooter.matchColours()
|
||||||
|
|
||||||
# Update theme colours
|
# Update theme colours
|
||||||
self._docTheme.text = syntax.text
|
self._docTheme.text = syntax.text
|
||||||
@@ -186,7 +186,8 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
self._docTheme.altdialog = syntax.dialA
|
self._docTheme.altdialog = syntax.dialA
|
||||||
|
|
||||||
# Set default text margins
|
# Set default text margins
|
||||||
self.document().setDocumentMargin(0)
|
if document := self.document():
|
||||||
|
document.setDocumentMargin(0)
|
||||||
|
|
||||||
# Scroll bars
|
# Scroll bars
|
||||||
if CONFIG.hideVScroll:
|
if CONFIG.hideVScroll:
|
||||||
@@ -217,7 +218,9 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
logger.debug("Generating preview for item '%s'", tHandle)
|
logger.debug("Generating preview for item '%s'", tHandle)
|
||||||
QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor))
|
QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor))
|
||||||
|
|
||||||
sPos = self.verticalScrollBar().value()
|
vBar = self.verticalScrollBar()
|
||||||
|
sPos = vBar.value() if vBar else 0
|
||||||
|
|
||||||
qDoc = ToQTextDocument(SHARED.project)
|
qDoc = ToQTextDocument(SHARED.project)
|
||||||
qDoc.setJustify(CONFIG.doJustify)
|
qDoc.setJustify(CONFIG.doJustify)
|
||||||
qDoc.setDialogHighlight(True)
|
qDoc.setDialogHighlight(True)
|
||||||
@@ -252,9 +255,9 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
self.setDocument(qDoc.document)
|
self.setDocument(qDoc.document)
|
||||||
self.setTabStopDistance(CONFIG.tabWidth)
|
self.setTabStopDistance(CONFIG.tabWidth)
|
||||||
|
|
||||||
if self._docHandle == tHandle:
|
if self._docHandle == tHandle and vBar:
|
||||||
# This is a refresh, so we set the scrollbar back to where it was
|
# This is a refresh, so we set the scrollbar back to where it was
|
||||||
self.verticalScrollBar().setValue(sPos)
|
vBar.setValue(sPos)
|
||||||
|
|
||||||
self._docHandle = tHandle
|
self._docHandle = tHandle
|
||||||
SHARED.project.data.setLastHandle(tHandle, "viewer")
|
SHARED.project.data.setLastHandle(tHandle, "viewer")
|
||||||
@@ -311,10 +314,10 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
cM = CONFIG.textMargin
|
cM = CONFIG.textMargin
|
||||||
|
|
||||||
vBar = self.verticalScrollBar()
|
vBar = self.verticalScrollBar()
|
||||||
sW = vBar.width() if vBar.isVisible() else 0
|
sW = vBar.width() if vBar and vBar.isVisible() else 0
|
||||||
|
|
||||||
hBar = self.horizontalScrollBar()
|
hBar = self.horizontalScrollBar()
|
||||||
sH = hBar.height() if hBar.isVisible() else 0
|
sH = hBar.height() if hBar and hBar.isVisible() else 0
|
||||||
|
|
||||||
tM = cM
|
tM = cM
|
||||||
if CONFIG.textWidth > 0:
|
if CONFIG.textWidth > 0:
|
||||||
@@ -339,8 +342,7 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
|
|
||||||
def setScrollPosition(self, pos: int) -> None:
|
def setScrollPosition(self, pos: int) -> None:
|
||||||
"""Set the scrollbar position."""
|
"""Set the scrollbar position."""
|
||||||
vBar = self.verticalScrollBar()
|
if (vBar := self.verticalScrollBar()) and vBar.isVisible():
|
||||||
if vBar.isVisible():
|
|
||||||
vBar.setValue(pos)
|
vBar.setValue(pos)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -402,31 +404,27 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
ctxMenu = QMenu(self)
|
ctxMenu = QMenu(self)
|
||||||
|
|
||||||
if userSelection:
|
if userSelection:
|
||||||
mnuCopy = QAction(self.tr("Copy"), ctxMenu)
|
action = qtAddAction(ctxMenu, self.tr("Copy"))
|
||||||
mnuCopy.triggered.connect(qtLambda(self.docAction, nwDocAction.COPY))
|
action.triggered.connect(qtLambda(self.docAction, nwDocAction.COPY))
|
||||||
ctxMenu.addAction(mnuCopy)
|
|
||||||
|
|
||||||
ctxMenu.addSeparator()
|
ctxMenu.addSeparator()
|
||||||
|
|
||||||
mnuSelAll = QAction(self.tr("Select All"), ctxMenu)
|
action = qtAddAction(ctxMenu, self.tr("Select All"))
|
||||||
mnuSelAll.triggered.connect(qtLambda(self.docAction, nwDocAction.SEL_ALL))
|
action.triggered.connect(qtLambda(self.docAction, nwDocAction.SEL_ALL))
|
||||||
ctxMenu.addAction(mnuSelAll)
|
|
||||||
|
|
||||||
mnuSelWord = QAction(self.tr("Select Word"), ctxMenu)
|
action = qtAddAction(ctxMenu, self.tr("Select Word"))
|
||||||
mnuSelWord.triggered.connect(qtLambda(
|
action.triggered.connect(qtLambda(
|
||||||
self._makePosSelection, QTextCursor.SelectionType.WordUnderCursor, point
|
self._makePosSelection, QTextCursor.SelectionType.WordUnderCursor, point
|
||||||
))
|
))
|
||||||
ctxMenu.addAction(mnuSelWord)
|
|
||||||
|
|
||||||
mnuSelPara = QAction(self.tr("Select Paragraph"), ctxMenu)
|
action = qtAddAction(ctxMenu, self.tr("Select Paragraph"))
|
||||||
mnuSelPara.triggered.connect(qtLambda(
|
action.triggered.connect(qtLambda(
|
||||||
self._makePosSelection, QTextCursor.SelectionType.BlockUnderCursor, point
|
self._makePosSelection, QTextCursor.SelectionType.BlockUnderCursor, point
|
||||||
))
|
))
|
||||||
ctxMenu.addAction(mnuSelPara)
|
|
||||||
|
|
||||||
# Open the context menu
|
# Open the context menu
|
||||||
ctxMenu.exec(self.viewport().mapToGlobal(point))
|
if viewport := self.viewport():
|
||||||
ctxMenu.deleteLater()
|
ctxMenu.exec(viewport.mapToGlobal(point))
|
||||||
|
ctxMenu.deleteLater()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -452,7 +450,7 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
|
|
||||||
def dragEnterEvent(self, event: QDragEnterEvent) -> None:
|
def dragEnterEvent(self, event: QDragEnterEvent) -> None:
|
||||||
"""Overload drag enter event to handle dragged items."""
|
"""Overload drag enter event to handle dragged items."""
|
||||||
if event.mimeData().hasFormat(nwConst.MIME_HANDLE):
|
if (data := event.mimeData()) and data.hasFormat(nwConst.MIME_HANDLE):
|
||||||
event.acceptProposedAction()
|
event.acceptProposedAction()
|
||||||
else:
|
else:
|
||||||
super().dragEnterEvent(event)
|
super().dragEnterEvent(event)
|
||||||
@@ -460,7 +458,7 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
|
|
||||||
def dragMoveEvent(self, event: QDragMoveEvent) -> None:
|
def dragMoveEvent(self, event: QDragMoveEvent) -> None:
|
||||||
"""Overload drag move event to handle dragged items."""
|
"""Overload drag move event to handle dragged items."""
|
||||||
if event.mimeData().hasFormat(nwConst.MIME_HANDLE):
|
if (data := event.mimeData()) and data.hasFormat(nwConst.MIME_HANDLE):
|
||||||
event.acceptProposedAction()
|
event.acceptProposedAction()
|
||||||
else:
|
else:
|
||||||
super().dragMoveEvent(event)
|
super().dragMoveEvent(event)
|
||||||
@@ -468,8 +466,8 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
|
|
||||||
def dropEvent(self, event: QDropEvent) -> None:
|
def dropEvent(self, event: QDropEvent) -> None:
|
||||||
"""Overload drop event to handle dragged items."""
|
"""Overload drop event to handle dragged items."""
|
||||||
if event.mimeData().hasFormat(nwConst.MIME_HANDLE):
|
if (data := event.mimeData()) and data.hasFormat(nwConst.MIME_HANDLE):
|
||||||
if handles := decodeMimeHandles(event.mimeData()):
|
if handles := decodeMimeHandles(data):
|
||||||
if SHARED.project.tree.checkType(handles[0], nwItemType.FILE):
|
if SHARED.project.tree.checkType(handles[0], nwItemType.FILE):
|
||||||
self.openDocumentRequest.emit(handles[0], nwDocMode.VIEW, "", True)
|
self.openDocumentRequest.emit(handles[0], nwDocMode.VIEW, "", True)
|
||||||
else:
|
else:
|
||||||
@@ -640,7 +638,6 @@ class GuiDocViewHeader(QWidget):
|
|||||||
|
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
mPx = CONFIG.pxInt(4)
|
|
||||||
|
|
||||||
# Main Widget Settings
|
# Main Widget Settings
|
||||||
self.setAutoFillBackground(True)
|
self.setAutoFillBackground(True)
|
||||||
@@ -692,9 +689,9 @@ class GuiDocViewHeader(QWidget):
|
|||||||
self.outerBox.addWidget(self.outlineButton, 0)
|
self.outerBox.addWidget(self.outlineButton, 0)
|
||||||
self.outerBox.addWidget(self.backButton, 0)
|
self.outerBox.addWidget(self.backButton, 0)
|
||||||
self.outerBox.addWidget(self.forwardButton, 0)
|
self.outerBox.addWidget(self.forwardButton, 0)
|
||||||
self.outerBox.addSpacing(mPx)
|
self.outerBox.addSpacing(4)
|
||||||
self.outerBox.addWidget(self.itemTitle, 1)
|
self.outerBox.addWidget(self.itemTitle, 1)
|
||||||
self.outerBox.addSpacing(mPx)
|
self.outerBox.addSpacing(4)
|
||||||
self.outerBox.addWidget(self.editButton, 0)
|
self.outerBox.addWidget(self.editButton, 0)
|
||||||
self.outerBox.addWidget(self.refreshButton, 0)
|
self.outerBox.addWidget(self.refreshButton, 0)
|
||||||
self.outerBox.addWidget(self.closeButton, 0)
|
self.outerBox.addWidget(self.closeButton, 0)
|
||||||
@@ -705,8 +702,8 @@ class GuiDocViewHeader(QWidget):
|
|||||||
# Fix Margins and Size
|
# Fix Margins and Size
|
||||||
# This is needed for high DPI systems. See issue #499.
|
# This is needed for high DPI systems. See issue #499.
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
self.outerBox.setContentsMargins(mPx, mPx, mPx, mPx)
|
self.outerBox.setContentsMargins(4, 4, 4, 4)
|
||||||
self.setMinimumHeight(iPx + 2*mPx)
|
self.setMinimumHeight(iPx + 8)
|
||||||
|
|
||||||
self.updateFont()
|
self.updateFont()
|
||||||
self.updateTheme()
|
self.updateTheme()
|
||||||
@@ -747,7 +744,7 @@ class GuiDocViewHeader(QWidget):
|
|||||||
minLevel = min(minLevel, level)
|
minLevel = min(minLevel, level)
|
||||||
for title, text, level in entries[:30]:
|
for title, text, level in entries[:30]:
|
||||||
indent = " "*(level - minLevel)
|
indent = " "*(level - minLevel)
|
||||||
action = self.outlineMenu.addAction(f"{indent}{text}")
|
action = qtAddAction(self.outlineMenu, f"{indent}{text}")
|
||||||
action.triggered.connect(
|
action.triggered.connect(
|
||||||
lambda _, title=title: self.docViewer.navigateTo(f"#{tHandle}:{title}")
|
lambda _, title=title: self.docViewer.navigateTo(f"#{tHandle}:{title}")
|
||||||
)
|
)
|
||||||
@@ -885,8 +882,6 @@ class GuiDocViewFooter(QWidget):
|
|||||||
|
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
hSp = CONFIG.pxInt(4)
|
|
||||||
mPx = CONFIG.pxInt(4)
|
|
||||||
|
|
||||||
# Main Widget Settings
|
# Main Widget Settings
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
@@ -923,14 +918,14 @@ class GuiDocViewFooter(QWidget):
|
|||||||
self.outerBox.addStretch(1)
|
self.outerBox.addStretch(1)
|
||||||
self.outerBox.addWidget(self.showComments, 0)
|
self.outerBox.addWidget(self.showComments, 0)
|
||||||
self.outerBox.addWidget(self.showSynopsis, 0)
|
self.outerBox.addWidget(self.showSynopsis, 0)
|
||||||
self.outerBox.setSpacing(hSp)
|
self.outerBox.setSpacing(4)
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
|
|
||||||
# Fix Margins and Size
|
# Fix Margins and Size
|
||||||
# This is needed for high DPI systems. See issue #499.
|
# This is needed for high DPI systems. See issue #499.
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
self.outerBox.setContentsMargins(mPx, mPx, mPx, mPx)
|
self.outerBox.setContentsMargins(4, 4, 4, 4)
|
||||||
self.setMinimumHeight(iPx + 2*mPx)
|
self.setMinimumHeight(iPx + 8)
|
||||||
|
|
||||||
self.updateFont()
|
self.updateFont()
|
||||||
self.updateTheme()
|
self.updateTheme()
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ from PyQt6.QtWidgets import (
|
|||||||
QTreeWidgetItem, QVBoxLayout, QWidget
|
QTreeWidgetItem, QVBoxLayout, QWidget
|
||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import SHARED
|
||||||
from novelwriter.common import checkInt
|
from novelwriter.common import checkInt, qtAddAction
|
||||||
from novelwriter.constants import nwLabels, nwLists, nwStyles, trConst
|
from novelwriter.constants import nwLabels, nwLists, nwStyles, trConst
|
||||||
from novelwriter.core.index import IndexHeading, IndexItem
|
from novelwriter.core.index import IndexHeading, IndexItem
|
||||||
from novelwriter.enum import nwChange, nwDocMode, nwItemClass
|
from novelwriter.enum import nwChange, nwDocMode, nwItemClass
|
||||||
@@ -63,7 +63,7 @@ class GuiDocViewerPanel(QWidget):
|
|||||||
|
|
||||||
self.optsMenu = QMenu(self)
|
self.optsMenu = QMenu(self)
|
||||||
|
|
||||||
self.aInactive = self.optsMenu.addAction(self.tr("Hide Inactive Tags"))
|
self.aInactive = qtAddAction(self.optsMenu, self.tr("Hide Inactive Tags"))
|
||||||
self.aInactive.setCheckable(True)
|
self.aInactive.setCheckable(True)
|
||||||
self.aInactive.toggled.connect(self._toggleHideInactive)
|
self.aInactive.toggled.connect(self._toggleHideInactive)
|
||||||
|
|
||||||
@@ -248,7 +248,6 @@ class _ViewPanelBackRefs(QTreeWidget):
|
|||||||
|
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
cMg = CONFIG.pxInt(6)
|
|
||||||
|
|
||||||
self.setHeaderLabels([self.tr("Document"), "", "", self.tr("First Heading")])
|
self.setHeaderLabels([self.tr("Document"), "", "", self.tr("First Heading")])
|
||||||
self.setIndentation(0)
|
self.setIndentation(0)
|
||||||
@@ -257,16 +256,16 @@ class _ViewPanelBackRefs(QTreeWidget):
|
|||||||
self.setFrameStyle(QFrame.Shape.NoFrame)
|
self.setFrameStyle(QFrame.Shape.NoFrame)
|
||||||
|
|
||||||
# Set Header Sizes
|
# Set Header Sizes
|
||||||
treeHeader = self.header()
|
if header := self.header():
|
||||||
treeHeader.setStretchLastSection(True)
|
header.setStretchLastSection(True)
|
||||||
treeHeader.setMinimumSectionSize(iPx + cMg) # See Issue #1627
|
header.setMinimumSectionSize(iPx + 6) # See Issue #1627
|
||||||
treeHeader.setSectionResizeMode(self.C_DOC, QtHeaderToContents)
|
header.setSectionResizeMode(self.C_DOC, QtHeaderToContents)
|
||||||
treeHeader.setSectionResizeMode(self.C_EDIT, QtHeaderFixed)
|
header.setSectionResizeMode(self.C_EDIT, QtHeaderFixed)
|
||||||
treeHeader.setSectionResizeMode(self.C_VIEW, QtHeaderFixed)
|
header.setSectionResizeMode(self.C_VIEW, QtHeaderFixed)
|
||||||
treeHeader.setSectionResizeMode(self.C_TITLE, QtHeaderToContents)
|
header.setSectionResizeMode(self.C_TITLE, QtHeaderToContents)
|
||||||
treeHeader.resizeSection(self.C_EDIT, iPx + cMg)
|
header.resizeSection(self.C_EDIT, iPx + 6)
|
||||||
treeHeader.resizeSection(self.C_VIEW, iPx + cMg)
|
header.resizeSection(self.C_VIEW, iPx + 6)
|
||||||
treeHeader.setSectionsMovable(False)
|
header.setSectionsMovable(False)
|
||||||
|
|
||||||
# Cache Icons Locally
|
# Cache Icons Locally
|
||||||
self._editIcon = SHARED.theme.getIcon("edit", "green")
|
self._editIcon = SHARED.theme.getIcon("edit", "green")
|
||||||
@@ -385,7 +384,6 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|||||||
|
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
cMg = CONFIG.pxInt(6)
|
|
||||||
|
|
||||||
self.setHeaderLabels([
|
self.setHeaderLabels([
|
||||||
self.tr("Tag"), "", "", self.tr("Importance"), self.tr("Document"),
|
self.tr("Tag"), "", "", self.tr("Importance"), self.tr("Document"),
|
||||||
@@ -401,14 +399,14 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|||||||
self.sortByColumn(self.C_NAME, Qt.SortOrder.AscendingOrder)
|
self.sortByColumn(self.C_NAME, Qt.SortOrder.AscendingOrder)
|
||||||
|
|
||||||
# Set Header Sizes
|
# Set Header Sizes
|
||||||
treeHeader = self.header()
|
if header := self.header():
|
||||||
treeHeader.setStretchLastSection(True)
|
header.setStretchLastSection(True)
|
||||||
treeHeader.setMinimumSectionSize(iPx + cMg) # See Issue #1627
|
header.setMinimumSectionSize(iPx + 6) # See Issue #1627
|
||||||
treeHeader.setSectionResizeMode(self.C_EDIT, QtHeaderFixed)
|
header.setSectionResizeMode(self.C_EDIT, QtHeaderFixed)
|
||||||
treeHeader.setSectionResizeMode(self.C_VIEW, QtHeaderFixed)
|
header.setSectionResizeMode(self.C_VIEW, QtHeaderFixed)
|
||||||
treeHeader.resizeSection(self.C_EDIT, iPx + cMg)
|
header.resizeSection(self.C_EDIT, iPx + 6)
|
||||||
treeHeader.resizeSection(self.C_VIEW, iPx + cMg)
|
header.resizeSection(self.C_VIEW, iPx + 6)
|
||||||
treeHeader.setSectionsMovable(False)
|
header.setSectionsMovable(False)
|
||||||
|
|
||||||
# Cache Icons Locally
|
# Cache Icons Locally
|
||||||
self.updateTheme()
|
self.updateTheme()
|
||||||
@@ -482,19 +480,19 @@ class _ViewPanelKeyWords(QTreeWidget):
|
|||||||
def setColumnWidths(self, widths: list[int]) -> None:
|
def setColumnWidths(self, widths: list[int]) -> None:
|
||||||
"""Set the column widths."""
|
"""Set the column widths."""
|
||||||
if isinstance(widths, list) and len(widths) >= 4:
|
if isinstance(widths, list) and len(widths) >= 4:
|
||||||
self.setColumnWidth(self.C_NAME, CONFIG.pxInt(checkInt(widths[0], 100)))
|
self.setColumnWidth(self.C_NAME, checkInt(widths[0], 100))
|
||||||
self.setColumnWidth(self.C_IMPORT, CONFIG.pxInt(checkInt(widths[1], 100)))
|
self.setColumnWidth(self.C_IMPORT, checkInt(widths[1], 100))
|
||||||
self.setColumnWidth(self.C_DOC, CONFIG.pxInt(checkInt(widths[2], 100)))
|
self.setColumnWidth(self.C_DOC, checkInt(widths[2], 100))
|
||||||
self.setColumnWidth(self.C_TITLE, CONFIG.pxInt(checkInt(widths[3], 100)))
|
self.setColumnWidth(self.C_TITLE, checkInt(widths[3], 100))
|
||||||
return
|
return
|
||||||
|
|
||||||
def getColumnWidths(self) -> list[int]:
|
def getColumnWidths(self) -> list[int]:
|
||||||
"""Get the widths of the user-adjustable columns."""
|
"""Get the widths of the user-adjustable columns."""
|
||||||
return [
|
return [
|
||||||
CONFIG.rpxInt(self.columnWidth(self.C_NAME)),
|
self.columnWidth(self.C_NAME),
|
||||||
CONFIG.rpxInt(self.columnWidth(self.C_IMPORT)),
|
self.columnWidth(self.C_IMPORT),
|
||||||
CONFIG.rpxInt(self.columnWidth(self.C_DOC)),
|
self.columnWidth(self.C_DOC),
|
||||||
CONFIG.rpxInt(self.columnWidth(self.C_TITLE)),
|
self.columnWidth(self.C_TITLE),
|
||||||
]
|
]
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ from enum import Enum
|
|||||||
from PyQt6.QtCore import pyqtSlot
|
from PyQt6.QtCore import pyqtSlot
|
||||||
from PyQt6.QtWidgets import QGridLayout, QLabel, QWidget
|
from PyQt6.QtWidgets import QGridLayout, QLabel, QWidget
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import SHARED
|
||||||
from novelwriter.common import elide
|
from novelwriter.common import elide
|
||||||
from novelwriter.constants import nwLabels, nwStats, trConst
|
from novelwriter.constants import nwLabels, nwStats, trConst
|
||||||
from novelwriter.enum import nwChange
|
from novelwriter.enum import nwChange
|
||||||
@@ -53,9 +53,6 @@ class GuiItemDetails(QWidget):
|
|||||||
self._handle = None
|
self._handle = None
|
||||||
|
|
||||||
# Sizes
|
# Sizes
|
||||||
hSp = CONFIG.pxInt(6)
|
|
||||||
vSp = CONFIG.pxInt(1)
|
|
||||||
mPx = CONFIG.pxInt(6)
|
|
||||||
fPt = SHARED.theme.fontPointSize
|
fPt = SHARED.theme.fontPointSize
|
||||||
|
|
||||||
fntLabel = self.font()
|
fntLabel = self.font()
|
||||||
@@ -176,9 +173,9 @@ class GuiItemDetails(QWidget):
|
|||||||
self.mainBox.setColumnStretch(3, 0)
|
self.mainBox.setColumnStretch(3, 0)
|
||||||
self.mainBox.setColumnStretch(4, 0)
|
self.mainBox.setColumnStretch(4, 0)
|
||||||
|
|
||||||
self.mainBox.setHorizontalSpacing(hSp)
|
self.mainBox.setHorizontalSpacing(6)
|
||||||
self.mainBox.setVerticalSpacing(vSp)
|
self.mainBox.setVerticalSpacing(1)
|
||||||
self.mainBox.setContentsMargins(mPx, mPx, mPx, mPx)
|
self.mainBox.setContentsMargins(6, 6, 6, 6)
|
||||||
|
|
||||||
self.setLayout(self.mainBox)
|
self.setLayout(self.mainBox)
|
||||||
|
|
||||||
|
|||||||
+136
-136
@@ -33,7 +33,7 @@ from PyQt6.QtGui import QAction
|
|||||||
from PyQt6.QtWidgets import QMenuBar
|
from PyQt6.QtWidgets import QMenuBar
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.common import openExternalPath, qtLambda
|
from novelwriter.common import openExternalPath, qtAddAction, qtAddMenu, qtLambda
|
||||||
from novelwriter.constants import (
|
from novelwriter.constants import (
|
||||||
nwConst, nwKeyWords, nwLabels, nwShortcode, nwStats, nwStyles, nwUnicode,
|
nwConst, nwKeyWords, nwLabels, nwShortcode, nwStats, nwStyles, nwUnicode,
|
||||||
trConst
|
trConst
|
||||||
@@ -128,21 +128,21 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildProjectMenu(self) -> None:
|
def _buildProjectMenu(self) -> None:
|
||||||
"""Assemble the Project menu."""
|
"""Assemble the Project menu."""
|
||||||
# Project
|
# Project
|
||||||
self.projMenu = self.addMenu(self.tr("&Project"))
|
self.projMenu = qtAddMenu(self, self.tr("&Project"))
|
||||||
|
|
||||||
# Project > Create or Open Project
|
# Project > Create or Open Project
|
||||||
self.aOpenProject = self.projMenu.addAction(self.tr("Create or Open Project"))
|
self.aOpenProject = qtAddAction(self.projMenu, self.tr("Create or Open Project"))
|
||||||
self.aOpenProject.setShortcut("Ctrl+Shift+O")
|
self.aOpenProject.setShortcut("Ctrl+Shift+O")
|
||||||
self.aOpenProject.triggered.connect(self.mainGui.showWelcomeDialog)
|
self.aOpenProject.triggered.connect(self.mainGui.showWelcomeDialog)
|
||||||
|
|
||||||
# Project > Save Project
|
# Project > Save Project
|
||||||
self.aSaveProject = self.projMenu.addAction(self.tr("Save Project"))
|
self.aSaveProject = qtAddAction(self.projMenu, self.tr("Save Project"))
|
||||||
self.aSaveProject.setShortcut("Ctrl+Shift+S")
|
self.aSaveProject.setShortcut("Ctrl+Shift+S")
|
||||||
self.aSaveProject.triggered.connect(qtLambda(self.mainGui.saveProject))
|
self.aSaveProject.triggered.connect(qtLambda(self.mainGui.saveProject))
|
||||||
self.mainGui.addAction(self.aSaveProject)
|
self.mainGui.addAction(self.aSaveProject)
|
||||||
|
|
||||||
# Project > Close Project
|
# Project > Close Project
|
||||||
self.aCloseProject = self.projMenu.addAction(self.tr("Close Project"))
|
self.aCloseProject = qtAddAction(self.projMenu, self.tr("Close Project"))
|
||||||
self.aCloseProject.setShortcut("Ctrl+Shift+W")
|
self.aCloseProject.setShortcut("Ctrl+Shift+W")
|
||||||
self.aCloseProject.triggered.connect(qtLambda(self.mainGui.closeProject, False))
|
self.aCloseProject.triggered.connect(qtLambda(self.mainGui.closeProject, False))
|
||||||
|
|
||||||
@@ -150,12 +150,12 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.projMenu.addSeparator()
|
self.projMenu.addSeparator()
|
||||||
|
|
||||||
# Project > Project Settings
|
# Project > Project Settings
|
||||||
self.aProjectSettings = self.projMenu.addAction(self.tr("Project Settings"))
|
self.aProjectSettings = qtAddAction(self.projMenu, self.tr("Project Settings"))
|
||||||
self.aProjectSettings.setShortcut("Ctrl+Shift+,")
|
self.aProjectSettings.setShortcut("Ctrl+Shift+,")
|
||||||
self.aProjectSettings.triggered.connect(self.mainGui.showProjectSettingsDialog)
|
self.aProjectSettings.triggered.connect(self.mainGui.showProjectSettingsDialog)
|
||||||
|
|
||||||
# Project > Novel Details
|
# Project > Novel Details
|
||||||
self.aNovelDetails = self.projMenu.addAction(self.tr("Novel Details"))
|
self.aNovelDetails = qtAddAction(self.projMenu, self.tr("Novel Details"))
|
||||||
self.aNovelDetails.setShortcut("Shift+F6")
|
self.aNovelDetails.setShortcut("Shift+F6")
|
||||||
self.aNovelDetails.triggered.connect(self.mainGui.showNovelDetailsDialog)
|
self.aNovelDetails.triggered.connect(self.mainGui.showNovelDetailsDialog)
|
||||||
|
|
||||||
@@ -163,16 +163,16 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.projMenu.addSeparator()
|
self.projMenu.addSeparator()
|
||||||
|
|
||||||
# Project > Edit
|
# Project > Edit
|
||||||
self.aRenameItem = self.projMenu.addAction(self.tr("Rename Item"))
|
self.aRenameItem = qtAddAction(self.projMenu, self.tr("Rename Item"))
|
||||||
self.aRenameItem.setShortcut("F2")
|
self.aRenameItem.setShortcut("F2")
|
||||||
|
|
||||||
# Project > Delete
|
# Project > Delete
|
||||||
self.aDeleteItem = self.projMenu.addAction(self.tr("Delete Item"))
|
self.aDeleteItem = qtAddAction(self.projMenu, self.tr("Delete Item"))
|
||||||
self.aDeleteItem.setShortcut("Del")
|
self.aDeleteItem.setShortcut("Del")
|
||||||
self.aDeleteItem.setShortcutContext(Qt.ShortcutContext.WidgetShortcut)
|
self.aDeleteItem.setShortcutContext(Qt.ShortcutContext.WidgetShortcut)
|
||||||
|
|
||||||
# Project > Empty Trash
|
# Project > Empty Trash
|
||||||
self.aEmptyTrash = self.projMenu.addAction(self.tr("Empty Trash"))
|
self.aEmptyTrash = qtAddAction(self.projMenu, self.tr("Empty Trash"))
|
||||||
|
|
||||||
self.mainGui.projView.connectMenuActions(
|
self.mainGui.projView.connectMenuActions(
|
||||||
self.aRenameItem, self.aDeleteItem, self.aEmptyTrash
|
self.aRenameItem, self.aDeleteItem, self.aEmptyTrash
|
||||||
@@ -182,7 +182,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.projMenu.addSeparator()
|
self.projMenu.addSeparator()
|
||||||
|
|
||||||
# Project > Exit
|
# Project > Exit
|
||||||
self.aExitNW = self.projMenu.addAction(self.tr("Exit"))
|
self.aExitNW = qtAddAction(self.projMenu, self.tr("Exit"))
|
||||||
self.aExitNW.setShortcut("Ctrl+Q")
|
self.aExitNW.setShortcut("Ctrl+Q")
|
||||||
self.aExitNW.setMenuRole(QAction.MenuRole.QuitRole)
|
self.aExitNW.setMenuRole(QAction.MenuRole.QuitRole)
|
||||||
self.aExitNW.triggered.connect(qtLambda(self.mainGui.closeMain))
|
self.aExitNW.triggered.connect(qtLambda(self.mainGui.closeMain))
|
||||||
@@ -193,21 +193,21 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildDocumentMenu(self) -> None:
|
def _buildDocumentMenu(self) -> None:
|
||||||
"""Assemble the Document menu."""
|
"""Assemble the Document menu."""
|
||||||
# Document
|
# Document
|
||||||
self.docuMenu = self.addMenu(self.tr("&Document"))
|
self.docuMenu = qtAddMenu(self, self.tr("&Document"))
|
||||||
|
|
||||||
# Document > Open
|
# Document > Open
|
||||||
self.aOpenDoc = self.docuMenu.addAction(self.tr("Open Document"))
|
self.aOpenDoc = qtAddAction(self.docuMenu, self.tr("Open Document"))
|
||||||
self.aOpenDoc.setShortcut("Ctrl+O")
|
self.aOpenDoc.setShortcut("Ctrl+O")
|
||||||
self.aOpenDoc.triggered.connect(self.mainGui.openSelectedItem)
|
self.aOpenDoc.triggered.connect(self.mainGui.openSelectedItem)
|
||||||
|
|
||||||
# Document > Save
|
# Document > Save
|
||||||
self.aSaveDoc = self.docuMenu.addAction(self.tr("Save Document"))
|
self.aSaveDoc = qtAddAction(self.docuMenu, self.tr("Save Document"))
|
||||||
self.aSaveDoc.setShortcut("Ctrl+S")
|
self.aSaveDoc.setShortcut("Ctrl+S")
|
||||||
self.aSaveDoc.triggered.connect(self.mainGui.forceSaveDocument)
|
self.aSaveDoc.triggered.connect(self.mainGui.forceSaveDocument)
|
||||||
self.mainGui.addAction(self.aSaveDoc)
|
self.mainGui.addAction(self.aSaveDoc)
|
||||||
|
|
||||||
# Document > Close
|
# Document > Close
|
||||||
self.aCloseDoc = self.docuMenu.addAction(self.tr("Close Document"))
|
self.aCloseDoc = qtAddAction(self.docuMenu, self.tr("Close Document"))
|
||||||
self.aCloseDoc.setShortcut("Ctrl+W")
|
self.aCloseDoc.setShortcut("Ctrl+W")
|
||||||
self.aCloseDoc.triggered.connect(self.mainGui.closeDocEditor)
|
self.aCloseDoc.triggered.connect(self.mainGui.closeDocEditor)
|
||||||
self.mainGui.addAction(self.aCloseDoc)
|
self.mainGui.addAction(self.aCloseDoc)
|
||||||
@@ -216,12 +216,12 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.docuMenu.addSeparator()
|
self.docuMenu.addSeparator()
|
||||||
|
|
||||||
# Document > Preview
|
# Document > Preview
|
||||||
self.aViewDoc = self.docuMenu.addAction(self.tr("View Document"))
|
self.aViewDoc = qtAddAction(self.docuMenu, self.tr("View Document"))
|
||||||
self.aViewDoc.setShortcut("Ctrl+R")
|
self.aViewDoc.setShortcut("Ctrl+R")
|
||||||
self.aViewDoc.triggered.connect(qtLambda(self.mainGui.viewDocument, None))
|
self.aViewDoc.triggered.connect(qtLambda(self.mainGui.viewDocument, None))
|
||||||
|
|
||||||
# Document > Close Preview
|
# Document > Close Preview
|
||||||
self.aCloseView = self.docuMenu.addAction(self.tr("Close Document View"))
|
self.aCloseView = qtAddAction(self.docuMenu, self.tr("Close Document View"))
|
||||||
self.aCloseView.setShortcut("Ctrl+Shift+R")
|
self.aCloseView.setShortcut("Ctrl+Shift+R")
|
||||||
self.aCloseView.triggered.connect(self.mainGui.closeDocViewer)
|
self.aCloseView.triggered.connect(self.mainGui.closeDocViewer)
|
||||||
|
|
||||||
@@ -229,11 +229,11 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.docuMenu.addSeparator()
|
self.docuMenu.addSeparator()
|
||||||
|
|
||||||
# Document > Show File Details
|
# Document > Show File Details
|
||||||
self.aFileDetails = self.docuMenu.addAction(self.tr("Show File Details"))
|
self.aFileDetails = qtAddAction(self.docuMenu, self.tr("Show File Details"))
|
||||||
self.aFileDetails.triggered.connect(qtLambda(self.mainGui.docEditor.revealLocation))
|
self.aFileDetails.triggered.connect(qtLambda(self.mainGui.docEditor.revealLocation))
|
||||||
|
|
||||||
# Document > Import From File
|
# Document > Import From File
|
||||||
self.aImportFile = self.docuMenu.addAction(self.tr("Import Text from File"))
|
self.aImportFile = qtAddAction(self.docuMenu, self.tr("Import Text from File"))
|
||||||
self.aImportFile.triggered.connect(qtLambda(self.mainGui.importDocument))
|
self.aImportFile.triggered.connect(qtLambda(self.mainGui.importDocument))
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -241,10 +241,10 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildEditMenu(self) -> None:
|
def _buildEditMenu(self) -> None:
|
||||||
"""Assemble the Edit menu."""
|
"""Assemble the Edit menu."""
|
||||||
# Edit
|
# Edit
|
||||||
self.editMenu = self.addMenu(self.tr("&Edit"))
|
self.editMenu = qtAddMenu(self, self.tr("&Edit"))
|
||||||
|
|
||||||
# Edit > Undo
|
# Edit > Undo
|
||||||
self.aEditUndo = self.editMenu.addAction(self.tr("Undo"))
|
self.aEditUndo = qtAddAction(self.editMenu, self.tr("Undo"))
|
||||||
self.aEditUndo.setShortcut("Ctrl+Z")
|
self.aEditUndo.setShortcut("Ctrl+Z")
|
||||||
self.aEditUndo.triggered.connect(
|
self.aEditUndo.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.UNDO)
|
lambda: self.requestDocAction.emit(nwDocAction.UNDO)
|
||||||
@@ -252,7 +252,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aEditUndo)
|
self.mainGui.addAction(self.aEditUndo)
|
||||||
|
|
||||||
# Edit > Redo
|
# Edit > Redo
|
||||||
self.aEditRedo = self.editMenu.addAction(self.tr("Redo"))
|
self.aEditRedo = qtAddAction(self.editMenu, self.tr("Redo"))
|
||||||
self.aEditRedo.setShortcut("Ctrl+Y")
|
self.aEditRedo.setShortcut("Ctrl+Y")
|
||||||
self.aEditRedo.triggered.connect(
|
self.aEditRedo.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.REDO)
|
lambda: self.requestDocAction.emit(nwDocAction.REDO)
|
||||||
@@ -263,7 +263,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.editMenu.addSeparator()
|
self.editMenu.addSeparator()
|
||||||
|
|
||||||
# Edit > Cut
|
# Edit > Cut
|
||||||
self.aEditCut = self.editMenu.addAction(self.tr("Cut"))
|
self.aEditCut = qtAddAction(self.editMenu, self.tr("Cut"))
|
||||||
self.aEditCut.setShortcut("Ctrl+X")
|
self.aEditCut.setShortcut("Ctrl+X")
|
||||||
self.aEditCut.triggered.connect(
|
self.aEditCut.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.CUT)
|
lambda: self.requestDocAction.emit(nwDocAction.CUT)
|
||||||
@@ -271,7 +271,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aEditCut)
|
self.mainGui.addAction(self.aEditCut)
|
||||||
|
|
||||||
# Edit > Copy
|
# Edit > Copy
|
||||||
self.aEditCopy = self.editMenu.addAction(self.tr("Copy"))
|
self.aEditCopy = qtAddAction(self.editMenu, self.tr("Copy"))
|
||||||
self.aEditCopy.setShortcut("Ctrl+C")
|
self.aEditCopy.setShortcut("Ctrl+C")
|
||||||
self.aEditCopy.triggered.connect(
|
self.aEditCopy.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.COPY)
|
lambda: self.requestDocAction.emit(nwDocAction.COPY)
|
||||||
@@ -279,7 +279,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aEditCopy)
|
self.mainGui.addAction(self.aEditCopy)
|
||||||
|
|
||||||
# Edit > Paste
|
# Edit > Paste
|
||||||
self.aEditPaste = self.editMenu.addAction(self.tr("Paste"))
|
self.aEditPaste = qtAddAction(self.editMenu, self.tr("Paste"))
|
||||||
self.aEditPaste.setShortcut("Ctrl+V")
|
self.aEditPaste.setShortcut("Ctrl+V")
|
||||||
self.aEditPaste.triggered.connect(
|
self.aEditPaste.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.PASTE)
|
lambda: self.requestDocAction.emit(nwDocAction.PASTE)
|
||||||
@@ -290,7 +290,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.editMenu.addSeparator()
|
self.editMenu.addSeparator()
|
||||||
|
|
||||||
# Edit > Select All
|
# Edit > Select All
|
||||||
self.aSelectAll = self.editMenu.addAction(self.tr("Select All"))
|
self.aSelectAll = qtAddAction(self.editMenu, self.tr("Select All"))
|
||||||
self.aSelectAll.setShortcut("Ctrl+A")
|
self.aSelectAll.setShortcut("Ctrl+A")
|
||||||
self.aSelectAll.triggered.connect(
|
self.aSelectAll.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SEL_ALL)
|
lambda: self.requestDocAction.emit(nwDocAction.SEL_ALL)
|
||||||
@@ -298,7 +298,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aSelectAll)
|
self.mainGui.addAction(self.aSelectAll)
|
||||||
|
|
||||||
# Edit > Select Paragraph
|
# Edit > Select Paragraph
|
||||||
self.aSelectPar = self.editMenu.addAction(self.tr("Select Paragraph"))
|
self.aSelectPar = qtAddAction(self.editMenu, self.tr("Select Paragraph"))
|
||||||
self.aSelectPar.setShortcut("Ctrl+Shift+A")
|
self.aSelectPar.setShortcut("Ctrl+Shift+A")
|
||||||
self.aSelectPar.triggered.connect(
|
self.aSelectPar.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SEL_PARA)
|
lambda: self.requestDocAction.emit(nwDocAction.SEL_PARA)
|
||||||
@@ -310,24 +310,24 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildViewMenu(self) -> None:
|
def _buildViewMenu(self) -> None:
|
||||||
"""Assemble the View menu."""
|
"""Assemble the View menu."""
|
||||||
# View
|
# View
|
||||||
self.viewMenu = self.addMenu(self.tr("&View"))
|
self.viewMenu = qtAddMenu(self, self.tr("&View"))
|
||||||
|
|
||||||
# View > TreeView
|
# View > TreeView
|
||||||
self.aFocusTree = self.viewMenu.addAction(self.tr("Go to Tree View"))
|
self.aFocusTree = qtAddAction(self.viewMenu, self.tr("Go to Tree View"))
|
||||||
self.aFocusTree.setShortcut("Ctrl+T")
|
self.aFocusTree.setShortcut("Ctrl+T")
|
||||||
self.aFocusTree.triggered.connect(
|
self.aFocusTree.triggered.connect(
|
||||||
lambda: self.requestFocusChange.emit(nwFocus.TREE)
|
lambda: self.requestFocusChange.emit(nwFocus.TREE)
|
||||||
)
|
)
|
||||||
|
|
||||||
# View > Document Editor
|
# View > Document Editor
|
||||||
self.aFocusDocument = self.viewMenu.addAction(self.tr("Go to Document"))
|
self.aFocusDocument = qtAddAction(self.viewMenu, self.tr("Go to Document"))
|
||||||
self.aFocusDocument.setShortcut("Ctrl+E")
|
self.aFocusDocument.setShortcut("Ctrl+E")
|
||||||
self.aFocusDocument.triggered.connect(
|
self.aFocusDocument.triggered.connect(
|
||||||
lambda: self.requestFocusChange.emit(nwFocus.DOCUMENT)
|
lambda: self.requestFocusChange.emit(nwFocus.DOCUMENT)
|
||||||
)
|
)
|
||||||
|
|
||||||
# View > Outline
|
# View > Outline
|
||||||
self.aFocusOutline = self.viewMenu.addAction(self.tr("Go to Outline"))
|
self.aFocusOutline = qtAddAction(self.viewMenu, self.tr("Go to Outline"))
|
||||||
self.aFocusOutline.setShortcut("Ctrl+Shift+T")
|
self.aFocusOutline.setShortcut("Ctrl+Shift+T")
|
||||||
self.aFocusOutline.triggered.connect(
|
self.aFocusOutline.triggered.connect(
|
||||||
lambda: self.requestFocusChange.emit(nwFocus.OUTLINE)
|
lambda: self.requestFocusChange.emit(nwFocus.OUTLINE)
|
||||||
@@ -337,14 +337,14 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.viewMenu.addSeparator()
|
self.viewMenu.addSeparator()
|
||||||
|
|
||||||
# View > Go Backward
|
# View > Go Backward
|
||||||
self.aViewPrev = self.viewMenu.addAction(self.tr("Navigate Backward"))
|
self.aViewPrev = qtAddAction(self.viewMenu, self.tr("Navigate Backward"))
|
||||||
self.aViewPrev.setShortcut("Alt+Left")
|
self.aViewPrev.setShortcut("Alt+Left")
|
||||||
self.aViewPrev.setShortcutContext(Qt.ShortcutContext.WidgetShortcut)
|
self.aViewPrev.setShortcutContext(Qt.ShortcutContext.WidgetShortcut)
|
||||||
self.aViewPrev.triggered.connect(self.mainGui.docViewer.navBackward)
|
self.aViewPrev.triggered.connect(self.mainGui.docViewer.navBackward)
|
||||||
self.mainGui.docViewer.addAction(self.aViewPrev)
|
self.mainGui.docViewer.addAction(self.aViewPrev)
|
||||||
|
|
||||||
# View > Go Forward
|
# View > Go Forward
|
||||||
self.aViewNext = self.viewMenu.addAction(self.tr("Navigate Forward"))
|
self.aViewNext = qtAddAction(self.viewMenu, self.tr("Navigate Forward"))
|
||||||
self.aViewNext.setShortcut("Alt+Right")
|
self.aViewNext.setShortcut("Alt+Right")
|
||||||
self.aViewNext.setShortcutContext(Qt.ShortcutContext.WidgetShortcut)
|
self.aViewNext.setShortcutContext(Qt.ShortcutContext.WidgetShortcut)
|
||||||
self.aViewNext.triggered.connect(self.mainGui.docViewer.navForward)
|
self.aViewNext.triggered.connect(self.mainGui.docViewer.navForward)
|
||||||
@@ -354,13 +354,13 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.viewMenu.addSeparator()
|
self.viewMenu.addSeparator()
|
||||||
|
|
||||||
# View > Focus Mode
|
# View > Focus Mode
|
||||||
self.aFocusMode = self.viewMenu.addAction(self.tr("Focus Mode"))
|
self.aFocusMode = qtAddAction(self.viewMenu, self.tr("Focus Mode"))
|
||||||
self.aFocusMode.setShortcut("F8")
|
self.aFocusMode.setShortcut("F8")
|
||||||
self.aFocusMode.triggered.connect(self.mainGui.toggleFocusMode)
|
self.aFocusMode.triggered.connect(self.mainGui.toggleFocusMode)
|
||||||
self.mainGui.addAction(self.aFocusMode)
|
self.mainGui.addAction(self.aFocusMode)
|
||||||
|
|
||||||
# View > Toggle Full Screen
|
# View > Toggle Full Screen
|
||||||
self.aFullScreen = self.viewMenu.addAction(self.tr("Full Screen Mode"))
|
self.aFullScreen = qtAddAction(self.viewMenu, self.tr("Full Screen Mode"))
|
||||||
self.aFullScreen.setShortcut("F11")
|
self.aFullScreen.setShortcut("F11")
|
||||||
self.aFullScreen.triggered.connect(self.mainGui.toggleFullScreenMode)
|
self.aFullScreen.triggered.connect(self.mainGui.toggleFullScreenMode)
|
||||||
self.mainGui.addAction(self.aFullScreen)
|
self.mainGui.addAction(self.aFullScreen)
|
||||||
@@ -370,13 +370,13 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildInsertMenu(self) -> None:
|
def _buildInsertMenu(self) -> None:
|
||||||
"""Assemble the Insert menu."""
|
"""Assemble the Insert menu."""
|
||||||
# Insert
|
# Insert
|
||||||
self.insMenu = self.addMenu(self.tr("&Insert"))
|
self.insMenu = qtAddMenu(self, self.tr("&Insert"))
|
||||||
|
|
||||||
# Insert > Dashes and Dots
|
# Insert > Dashes and Dots
|
||||||
self.mInsDashes = self.insMenu.addMenu(self.tr("Dashes"))
|
self.mInsDashes = qtAddMenu(self.insMenu, self.tr("Dashes"))
|
||||||
|
|
||||||
# Insert > Short Dash
|
# Insert > Short Dash
|
||||||
self.aInsENDash = self.mInsDashes.addAction(self.tr("Short Dash"))
|
self.aInsENDash = qtAddAction(self.mInsDashes, self.tr("Short Dash"))
|
||||||
self.aInsENDash.setShortcut("Ctrl+K, -")
|
self.aInsENDash.setShortcut("Ctrl+K, -")
|
||||||
self.aInsENDash.triggered.connect(
|
self.aInsENDash.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_ENDASH)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_ENDASH)
|
||||||
@@ -384,7 +384,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsENDash)
|
self.mainGui.addAction(self.aInsENDash)
|
||||||
|
|
||||||
# Insert > Long Dash
|
# Insert > Long Dash
|
||||||
self.aInsEMDash = self.mInsDashes.addAction(self.tr("Long Dash"))
|
self.aInsEMDash = qtAddAction(self.mInsDashes, self.tr("Long Dash"))
|
||||||
self.aInsEMDash.setShortcut("Ctrl+K, _")
|
self.aInsEMDash.setShortcut("Ctrl+K, _")
|
||||||
self.aInsEMDash.triggered.connect(
|
self.aInsEMDash.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_EMDASH)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_EMDASH)
|
||||||
@@ -392,7 +392,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsEMDash)
|
self.mainGui.addAction(self.aInsEMDash)
|
||||||
|
|
||||||
# Insert > Long Dash
|
# Insert > Long Dash
|
||||||
self.aInsHorBar = self.mInsDashes.addAction(self.tr("Horizontal Bar"))
|
self.aInsHorBar = qtAddAction(self.mInsDashes, self.tr("Horizontal Bar"))
|
||||||
self.aInsHorBar.setShortcut("Ctrl+K, Ctrl+_")
|
self.aInsHorBar.setShortcut("Ctrl+K, Ctrl+_")
|
||||||
self.aInsHorBar.triggered.connect(
|
self.aInsHorBar.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_HBAR)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_HBAR)
|
||||||
@@ -400,7 +400,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsHorBar)
|
self.mainGui.addAction(self.aInsHorBar)
|
||||||
|
|
||||||
# Insert > Figure Dash
|
# Insert > Figure Dash
|
||||||
self.aInsFigDash = self.mInsDashes.addAction(self.tr("Figure Dash"))
|
self.aInsFigDash = qtAddAction(self.mInsDashes, self.tr("Figure Dash"))
|
||||||
self.aInsFigDash.setShortcut("Ctrl+K, ~")
|
self.aInsFigDash.setShortcut("Ctrl+K, ~")
|
||||||
self.aInsFigDash.triggered.connect(
|
self.aInsFigDash.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_FGDASH)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_FGDASH)
|
||||||
@@ -408,10 +408,10 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsFigDash)
|
self.mainGui.addAction(self.aInsFigDash)
|
||||||
|
|
||||||
# Insert > Quote Marks
|
# Insert > Quote Marks
|
||||||
self.mInsQuotes = self.insMenu.addMenu(self.tr("Quote Marks"))
|
self.mInsQuotes = qtAddMenu(self.insMenu, self.tr("Quote Marks"))
|
||||||
|
|
||||||
# Insert > Left Single Quote
|
# Insert > Left Single Quote
|
||||||
self.aInsQuoteLS = self.mInsQuotes.addAction(self.tr("Left Single Quote"))
|
self.aInsQuoteLS = qtAddAction(self.mInsQuotes, self.tr("Left Single Quote"))
|
||||||
self.aInsQuoteLS.setShortcut("Ctrl+K, 1")
|
self.aInsQuoteLS.setShortcut("Ctrl+K, 1")
|
||||||
self.aInsQuoteLS.triggered.connect(
|
self.aInsQuoteLS.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_LS)
|
lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_LS)
|
||||||
@@ -419,7 +419,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsQuoteLS)
|
self.mainGui.addAction(self.aInsQuoteLS)
|
||||||
|
|
||||||
# Insert > Right Single Quote
|
# Insert > Right Single Quote
|
||||||
self.aInsQuoteRS = self.mInsQuotes.addAction(self.tr("Right Single Quote"))
|
self.aInsQuoteRS = qtAddAction(self.mInsQuotes, self.tr("Right Single Quote"))
|
||||||
self.aInsQuoteRS.setShortcut("Ctrl+K, 2")
|
self.aInsQuoteRS.setShortcut("Ctrl+K, 2")
|
||||||
self.aInsQuoteRS.triggered.connect(
|
self.aInsQuoteRS.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_RS)
|
lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_RS)
|
||||||
@@ -427,7 +427,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsQuoteRS)
|
self.mainGui.addAction(self.aInsQuoteRS)
|
||||||
|
|
||||||
# Insert > Left Double Quote
|
# Insert > Left Double Quote
|
||||||
self.aInsQuoteLD = self.mInsQuotes.addAction(self.tr("Left Double Quote"))
|
self.aInsQuoteLD = qtAddAction(self.mInsQuotes, self.tr("Left Double Quote"))
|
||||||
self.aInsQuoteLD.setShortcut("Ctrl+K, 3")
|
self.aInsQuoteLD.setShortcut("Ctrl+K, 3")
|
||||||
self.aInsQuoteLD.triggered.connect(
|
self.aInsQuoteLD.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_LD)
|
lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_LD)
|
||||||
@@ -435,7 +435,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsQuoteLD)
|
self.mainGui.addAction(self.aInsQuoteLD)
|
||||||
|
|
||||||
# Insert > Right Double Quote
|
# Insert > Right Double Quote
|
||||||
self.aInsQuoteRD = self.mInsQuotes.addAction(self.tr("Right Double Quote"))
|
self.aInsQuoteRD = qtAddAction(self.mInsQuotes, self.tr("Right Double Quote"))
|
||||||
self.aInsQuoteRD.setShortcut("Ctrl+K, 4")
|
self.aInsQuoteRD.setShortcut("Ctrl+K, 4")
|
||||||
self.aInsQuoteRD.triggered.connect(
|
self.aInsQuoteRD.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_RD)
|
lambda: self.requestDocInsert.emit(nwDocInsert.QUOTE_RD)
|
||||||
@@ -443,7 +443,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsQuoteRD)
|
self.mainGui.addAction(self.aInsQuoteRD)
|
||||||
|
|
||||||
# Insert > Alternative Apostrophe
|
# Insert > Alternative Apostrophe
|
||||||
self.aInsMSApos = self.mInsQuotes.addAction(self.tr("Alternative Apostrophe"))
|
self.aInsMSApos = qtAddAction(self.mInsQuotes, self.tr("Alternative Apostrophe"))
|
||||||
self.aInsMSApos.setShortcut("Ctrl+K, '")
|
self.aInsMSApos.setShortcut("Ctrl+K, '")
|
||||||
self.aInsMSApos.triggered.connect(
|
self.aInsMSApos.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_MAPOS)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_MAPOS)
|
||||||
@@ -451,10 +451,10 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsMSApos)
|
self.mainGui.addAction(self.aInsMSApos)
|
||||||
|
|
||||||
# Insert > Symbols
|
# Insert > Symbols
|
||||||
self.mInsPunct = self.insMenu.addMenu(self.tr("General Punctuation"))
|
self.mInsPunct = qtAddMenu(self.insMenu, self.tr("General Punctuation"))
|
||||||
|
|
||||||
# Insert > Ellipsis
|
# Insert > Ellipsis
|
||||||
self.aInsEllipsis = self.mInsPunct.addAction(self.tr("Ellipsis"))
|
self.aInsEllipsis = qtAddAction(self.mInsPunct, self.tr("Ellipsis"))
|
||||||
self.aInsEllipsis.setShortcut("Ctrl+K, .")
|
self.aInsEllipsis.setShortcut("Ctrl+K, .")
|
||||||
self.aInsEllipsis.triggered.connect(
|
self.aInsEllipsis.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_HELLIP)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_HELLIP)
|
||||||
@@ -462,7 +462,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsEllipsis)
|
self.mainGui.addAction(self.aInsEllipsis)
|
||||||
|
|
||||||
# Insert > Prime
|
# Insert > Prime
|
||||||
self.aInsPrime = self.mInsPunct.addAction(self.tr("Prime"))
|
self.aInsPrime = qtAddAction(self.mInsPunct, self.tr("Prime"))
|
||||||
self.aInsPrime.setShortcut("Ctrl+K, Ctrl+'")
|
self.aInsPrime.setShortcut("Ctrl+K, Ctrl+'")
|
||||||
self.aInsPrime.triggered.connect(
|
self.aInsPrime.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_PRIME)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_PRIME)
|
||||||
@@ -470,7 +470,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsPrime)
|
self.mainGui.addAction(self.aInsPrime)
|
||||||
|
|
||||||
# Insert > Double Prime
|
# Insert > Double Prime
|
||||||
self.aInsDPrime = self.mInsPunct.addAction(self.tr("Double Prime"))
|
self.aInsDPrime = qtAddAction(self.mInsPunct, self.tr("Double Prime"))
|
||||||
self.aInsDPrime.setShortcut("Ctrl+K, Ctrl+\"")
|
self.aInsDPrime.setShortcut("Ctrl+K, Ctrl+\"")
|
||||||
self.aInsDPrime.triggered.connect(
|
self.aInsDPrime.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_DPRIME)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_DPRIME)
|
||||||
@@ -478,10 +478,10 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsDPrime)
|
self.mainGui.addAction(self.aInsDPrime)
|
||||||
|
|
||||||
# Insert > White Spaces
|
# Insert > White Spaces
|
||||||
self.mInsSpace = self.insMenu.addMenu(self.tr("White Spaces"))
|
self.mInsSpace = qtAddMenu(self.insMenu, self.tr("White Spaces"))
|
||||||
|
|
||||||
# Insert > Non-Breaking Space
|
# Insert > Non-Breaking Space
|
||||||
self.aInsNBSpace = self.mInsSpace.addAction(self.tr("Non-Breaking Space"))
|
self.aInsNBSpace = qtAddAction(self.mInsSpace, self.tr("Non-Breaking Space"))
|
||||||
self.aInsNBSpace.setShortcut("Ctrl+K, Space")
|
self.aInsNBSpace.setShortcut("Ctrl+K, Space")
|
||||||
self.aInsNBSpace.triggered.connect(
|
self.aInsNBSpace.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_NBSP)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_NBSP)
|
||||||
@@ -489,7 +489,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsNBSpace)
|
self.mainGui.addAction(self.aInsNBSpace)
|
||||||
|
|
||||||
# Insert > Thin Space
|
# Insert > Thin Space
|
||||||
self.aInsThinSpace = self.mInsSpace.addAction(self.tr("Thin Space"))
|
self.aInsThinSpace = qtAddAction(self.mInsSpace, self.tr("Thin Space"))
|
||||||
self.aInsThinSpace.setShortcut("Ctrl+K, Shift+Space")
|
self.aInsThinSpace.setShortcut("Ctrl+K, Shift+Space")
|
||||||
self.aInsThinSpace.triggered.connect(
|
self.aInsThinSpace.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_THSP)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_THSP)
|
||||||
@@ -497,7 +497,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsThinSpace)
|
self.mainGui.addAction(self.aInsThinSpace)
|
||||||
|
|
||||||
# Insert > Thin Non-Breaking Space
|
# Insert > Thin Non-Breaking Space
|
||||||
self.aInsThinNBSpace = self.mInsSpace.addAction(self.tr("Thin Non-Breaking Space"))
|
self.aInsThinNBSpace = qtAddAction(self.mInsSpace, self.tr("Thin Non-Breaking Space"))
|
||||||
self.aInsThinNBSpace.setShortcut("Ctrl+K, Ctrl+Space")
|
self.aInsThinNBSpace.setShortcut("Ctrl+K, Ctrl+Space")
|
||||||
self.aInsThinNBSpace.triggered.connect(
|
self.aInsThinNBSpace.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_THNBSP)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_THNBSP)
|
||||||
@@ -505,10 +505,10 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsThinNBSpace)
|
self.mainGui.addAction(self.aInsThinNBSpace)
|
||||||
|
|
||||||
# Insert > Symbols
|
# Insert > Symbols
|
||||||
self.mInsSymbol = self.insMenu.addMenu(self.tr("Other Symbols"))
|
self.mInsSymbol = qtAddMenu(self.insMenu, self.tr("Other Symbols"))
|
||||||
|
|
||||||
# Insert > List Bullet
|
# Insert > List Bullet
|
||||||
self.aInsBullet = self.mInsSymbol.addAction(self.tr("List Bullet"))
|
self.aInsBullet = qtAddAction(self.mInsSymbol, self.tr("List Bullet"))
|
||||||
self.aInsBullet.setShortcut("Ctrl+K, *")
|
self.aInsBullet.setShortcut("Ctrl+K, *")
|
||||||
self.aInsBullet.triggered.connect(
|
self.aInsBullet.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_BULL)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_BULL)
|
||||||
@@ -516,7 +516,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsBullet)
|
self.mainGui.addAction(self.aInsBullet)
|
||||||
|
|
||||||
# Insert > Hyphen Bullet
|
# Insert > Hyphen Bullet
|
||||||
self.aInsHyBull = self.mInsSymbol.addAction(self.tr("Hyphen Bullet"))
|
self.aInsHyBull = qtAddAction(self.mInsSymbol, self.tr("Hyphen Bullet"))
|
||||||
self.aInsHyBull.setShortcut("Ctrl+K, Ctrl+-")
|
self.aInsHyBull.setShortcut("Ctrl+K, Ctrl+-")
|
||||||
self.aInsHyBull.triggered.connect(
|
self.aInsHyBull.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_HYBULL)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_HYBULL)
|
||||||
@@ -524,7 +524,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsHyBull)
|
self.mainGui.addAction(self.aInsHyBull)
|
||||||
|
|
||||||
# Insert > Flower Mark
|
# Insert > Flower Mark
|
||||||
self.aInsFlower = self.mInsSymbol.addAction(self.tr("Flower Mark"))
|
self.aInsFlower = qtAddAction(self.mInsSymbol, self.tr("Flower Mark"))
|
||||||
self.aInsFlower.setShortcut("Ctrl+K, Ctrl+*")
|
self.aInsFlower.setShortcut("Ctrl+K, Ctrl+*")
|
||||||
self.aInsFlower.triggered.connect(
|
self.aInsFlower.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_FLOWER)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_FLOWER)
|
||||||
@@ -532,7 +532,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsFlower)
|
self.mainGui.addAction(self.aInsFlower)
|
||||||
|
|
||||||
# Insert > Per Mille
|
# Insert > Per Mille
|
||||||
self.aInsPerMille = self.mInsSymbol.addAction(self.tr("Per Mille"))
|
self.aInsPerMille = qtAddAction(self.mInsSymbol, self.tr("Per Mille"))
|
||||||
self.aInsPerMille.setShortcut("Ctrl+K, %")
|
self.aInsPerMille.setShortcut("Ctrl+K, %")
|
||||||
self.aInsPerMille.triggered.connect(
|
self.aInsPerMille.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_PERMIL)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_PERMIL)
|
||||||
@@ -540,7 +540,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsPerMille)
|
self.mainGui.addAction(self.aInsPerMille)
|
||||||
|
|
||||||
# Insert > Degree Symbol
|
# Insert > Degree Symbol
|
||||||
self.aInsDegree = self.mInsSymbol.addAction(self.tr("Degree Symbol"))
|
self.aInsDegree = qtAddAction(self.mInsSymbol, self.tr("Degree Symbol"))
|
||||||
self.aInsDegree.setShortcut("Ctrl+K, Ctrl+O")
|
self.aInsDegree.setShortcut("Ctrl+K, Ctrl+O")
|
||||||
self.aInsDegree.triggered.connect(
|
self.aInsDegree.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_DEGREE)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_DEGREE)
|
||||||
@@ -548,7 +548,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsDegree)
|
self.mainGui.addAction(self.aInsDegree)
|
||||||
|
|
||||||
# Insert > Minus Sign
|
# Insert > Minus Sign
|
||||||
self.aInsMinus = self.mInsSymbol.addAction(self.tr("Minus Sign"))
|
self.aInsMinus = qtAddAction(self.mInsSymbol, self.tr("Minus Sign"))
|
||||||
self.aInsMinus.setShortcut("Ctrl+K, Ctrl+M")
|
self.aInsMinus.setShortcut("Ctrl+K, Ctrl+M")
|
||||||
self.aInsMinus.triggered.connect(
|
self.aInsMinus.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_MINUS)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_MINUS)
|
||||||
@@ -556,7 +556,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsMinus)
|
self.mainGui.addAction(self.aInsMinus)
|
||||||
|
|
||||||
# Insert > Times Sign
|
# Insert > Times Sign
|
||||||
self.aInsTimes = self.mInsSymbol.addAction(self.tr("Times Sign"))
|
self.aInsTimes = qtAddAction(self.mInsSymbol, self.tr("Times Sign"))
|
||||||
self.aInsTimes.setShortcut("Ctrl+K, Ctrl+X")
|
self.aInsTimes.setShortcut("Ctrl+K, Ctrl+X")
|
||||||
self.aInsTimes.triggered.connect(
|
self.aInsTimes.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_TIMES)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_TIMES)
|
||||||
@@ -564,7 +564,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsTimes)
|
self.mainGui.addAction(self.aInsTimes)
|
||||||
|
|
||||||
# Insert > Division
|
# Insert > Division
|
||||||
self.aInsDivide = self.mInsSymbol.addAction(self.tr("Division Sign"))
|
self.aInsDivide = qtAddAction(self.mInsSymbol, self.tr("Division Sign"))
|
||||||
self.aInsDivide.setShortcut("Ctrl+K, Ctrl+D")
|
self.aInsDivide.setShortcut("Ctrl+K, Ctrl+D")
|
||||||
self.aInsDivide.triggered.connect(
|
self.aInsDivide.triggered.connect(
|
||||||
lambda: self.requestDocInsertText.emit(nwUnicode.U_DIVIDE)
|
lambda: self.requestDocInsertText.emit(nwUnicode.U_DIVIDE)
|
||||||
@@ -572,18 +572,18 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsDivide)
|
self.mainGui.addAction(self.aInsDivide)
|
||||||
|
|
||||||
# Insert > Tags and References
|
# Insert > Tags and References
|
||||||
self.mInsKeywords = self.insMenu.addMenu(self.tr("Tags and References"))
|
self.mInsKeywords = qtAddMenu(self.insMenu, self.tr("Tags and References"))
|
||||||
for key in nwKeyWords.ALL_KEYS:
|
for key in nwKeyWords.ALL_KEYS:
|
||||||
action = self.mInsKeywords.addAction(trConst(nwLabels.KEY_NAME[key]))
|
action = qtAddAction(self.mInsKeywords, trConst(nwLabels.KEY_NAME[key]))
|
||||||
action.setShortcut(nwLabels.KEY_SHORTCUT[key])
|
action.setShortcut(nwLabels.KEY_SHORTCUT[key])
|
||||||
action.triggered.connect(qtLambda(self.requestDocKeyWordInsert.emit, key))
|
action.triggered.connect(qtLambda(self.requestDocKeyWordInsert.emit, key))
|
||||||
self.mainGui.addAction(action)
|
self.mainGui.addAction(action)
|
||||||
|
|
||||||
# Insert > Special Comments
|
# Insert > Special Comments
|
||||||
self.mInsComments = self.insMenu.addMenu(self.tr("Special Comments"))
|
self.mInsComments = qtAddMenu(self.insMenu, self.tr("Special Comments"))
|
||||||
|
|
||||||
# Insert > Synopsis Comment
|
# Insert > Synopsis Comment
|
||||||
self.aInsSynopsis = self.mInsComments.addAction(self.tr("Synopsis Comment"))
|
self.aInsSynopsis = qtAddAction(self.mInsComments, self.tr("Synopsis Comment"))
|
||||||
self.aInsSynopsis.setShortcut("Ctrl+K, S")
|
self.aInsSynopsis.setShortcut("Ctrl+K, S")
|
||||||
self.aInsSynopsis.triggered.connect(
|
self.aInsSynopsis.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.SYNOPSIS)
|
lambda: self.requestDocInsert.emit(nwDocInsert.SYNOPSIS)
|
||||||
@@ -591,7 +591,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsSynopsis)
|
self.mainGui.addAction(self.aInsSynopsis)
|
||||||
|
|
||||||
# Insert > Short Description Comment
|
# Insert > Short Description Comment
|
||||||
self.aInsShort = self.mInsComments.addAction(self.tr("Short Description Comment"))
|
self.aInsShort = qtAddAction(self.mInsComments, self.tr("Short Description Comment"))
|
||||||
self.aInsShort.setShortcut("Ctrl+K, H")
|
self.aInsShort.setShortcut("Ctrl+K, H")
|
||||||
self.aInsShort.triggered.connect(
|
self.aInsShort.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.SHORT)
|
lambda: self.requestDocInsert.emit(nwDocInsert.SHORT)
|
||||||
@@ -599,47 +599,47 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aInsShort)
|
self.mainGui.addAction(self.aInsShort)
|
||||||
|
|
||||||
# Insert > Word/Character Count
|
# Insert > Word/Character Count
|
||||||
self.mInsField = self.insMenu.addMenu(self.tr("Word/Character Count"))
|
self.mInsField = qtAddMenu(self.insMenu, self.tr("Word/Character Count"))
|
||||||
for field in nwStats.ALL_FIELDS:
|
for field in nwStats.ALL_FIELDS:
|
||||||
value = nwShortcode.FIELD_VALUE.format(field)
|
value = nwShortcode.FIELD_VALUE.format(field)
|
||||||
action = self.mInsField.addAction(trConst(nwLabels.STATS_NAME[field]))
|
action = qtAddAction(self.mInsField, trConst(nwLabels.STATS_NAME[field]))
|
||||||
action.triggered.connect(qtLambda(self.requestDocInsertText.emit, value))
|
action.triggered.connect(qtLambda(self.requestDocInsertText.emit, value))
|
||||||
|
|
||||||
# Insert > Breaks and Vertical Space
|
# Insert > Breaks and Vertical Space
|
||||||
self.mInsBreaks = self.insMenu.addMenu(self.tr("Breaks and Vertical Space"))
|
self.mInsBreaks = qtAddMenu(self.insMenu, self.tr("Breaks and Vertical Space"))
|
||||||
|
|
||||||
# Insert > New Page
|
# Insert > New Page
|
||||||
self.aInsNewPage = self.mInsBreaks.addAction(self.tr("Page Break"))
|
self.aInsNewPage = qtAddAction(self.mInsBreaks, self.tr("Page Break"))
|
||||||
self.aInsNewPage.triggered.connect(
|
self.aInsNewPage.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.NEW_PAGE)
|
lambda: self.requestDocInsert.emit(nwDocInsert.NEW_PAGE)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Insert > Forced Line Break
|
# Insert > Forced Line Break
|
||||||
self.aInsLineBreak = self.mInsBreaks.addAction(self.tr("Forced Line Break"))
|
self.aInsLineBreak = qtAddAction(self.mInsBreaks, self.tr("Forced Line Break"))
|
||||||
self.aInsLineBreak.triggered.connect(
|
self.aInsLineBreak.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.LINE_BRK)
|
lambda: self.requestDocInsert.emit(nwDocInsert.LINE_BRK)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Insert > Vertical Space (Single)
|
# Insert > Vertical Space (Single)
|
||||||
self.aInsVSpaceS = self.mInsBreaks.addAction(self.tr("Vertical Space (Single)"))
|
self.aInsVSpaceS = qtAddAction(self.mInsBreaks, self.tr("Vertical Space (Single)"))
|
||||||
self.aInsVSpaceS.triggered.connect(
|
self.aInsVSpaceS.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.VSPACE_S)
|
lambda: self.requestDocInsert.emit(nwDocInsert.VSPACE_S)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Insert > Vertical Space (Multi)
|
# Insert > Vertical Space (Multi)
|
||||||
self.aInsVSpaceM = self.mInsBreaks.addAction(self.tr("Vertical Space (Multi)"))
|
self.aInsVSpaceM = qtAddAction(self.mInsBreaks, self.tr("Vertical Space (Multi)"))
|
||||||
self.aInsVSpaceM.triggered.connect(
|
self.aInsVSpaceM.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.VSPACE_M)
|
lambda: self.requestDocInsert.emit(nwDocInsert.VSPACE_M)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Insert > Placeholder Text
|
# Insert > Placeholder Text
|
||||||
self.aLipsumText = self.insMenu.addAction(self.tr("Placeholder Text"))
|
self.aLipsumText = qtAddAction(self.insMenu, self.tr("Placeholder Text"))
|
||||||
self.aLipsumText.triggered.connect(
|
self.aLipsumText.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.LIPSUM)
|
lambda: self.requestDocInsert.emit(nwDocInsert.LIPSUM)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Insert > Footnote
|
# Insert > Footnote
|
||||||
self.aFootnote = self.insMenu.addAction(self.tr("Footnote"))
|
self.aFootnote = qtAddAction(self.insMenu, self.tr("Footnote"))
|
||||||
self.aFootnote.triggered.connect(
|
self.aFootnote.triggered.connect(
|
||||||
lambda: self.requestDocInsert.emit(nwDocInsert.FOOTNOTE)
|
lambda: self.requestDocInsert.emit(nwDocInsert.FOOTNOTE)
|
||||||
)
|
)
|
||||||
@@ -649,10 +649,10 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildFormatMenu(self) -> None:
|
def _buildFormatMenu(self) -> None:
|
||||||
"""Assemble the Format menu."""
|
"""Assemble the Format menu."""
|
||||||
# Format
|
# Format
|
||||||
self.fmtMenu = self.addMenu(self.tr("&Format"))
|
self.fmtMenu = qtAddMenu(self, self.tr("&Format"))
|
||||||
|
|
||||||
# Format > Bold
|
# Format > Bold
|
||||||
self.aFmtBold = self.fmtMenu.addAction(self.tr("Bold"))
|
self.aFmtBold = qtAddAction(self.fmtMenu, self.tr("Bold"))
|
||||||
self.aFmtBold.setShortcut("Ctrl+B")
|
self.aFmtBold.setShortcut("Ctrl+B")
|
||||||
self.aFmtBold.triggered.connect(
|
self.aFmtBold.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.MD_BOLD)
|
lambda: self.requestDocAction.emit(nwDocAction.MD_BOLD)
|
||||||
@@ -660,7 +660,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtBold)
|
self.mainGui.addAction(self.aFmtBold)
|
||||||
|
|
||||||
# Format > Italic
|
# Format > Italic
|
||||||
self.aFmtItalic = self.fmtMenu.addAction(self.tr("Italic"))
|
self.aFmtItalic = qtAddAction(self.fmtMenu, self.tr("Italic"))
|
||||||
self.aFmtItalic.setShortcut("Ctrl+I")
|
self.aFmtItalic.setShortcut("Ctrl+I")
|
||||||
self.aFmtItalic.triggered.connect(
|
self.aFmtItalic.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.MD_ITALIC)
|
lambda: self.requestDocAction.emit(nwDocAction.MD_ITALIC)
|
||||||
@@ -668,7 +668,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtItalic)
|
self.mainGui.addAction(self.aFmtItalic)
|
||||||
|
|
||||||
# Format > Strikethrough
|
# Format > Strikethrough
|
||||||
self.aFmtStrike = self.fmtMenu.addAction(self.tr("Strikethrough"))
|
self.aFmtStrike = qtAddAction(self.fmtMenu, self.tr("Strikethrough"))
|
||||||
self.aFmtStrike.setShortcut("Ctrl+D")
|
self.aFmtStrike.setShortcut("Ctrl+D")
|
||||||
self.aFmtStrike.triggered.connect(
|
self.aFmtStrike.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.MD_STRIKE)
|
lambda: self.requestDocAction.emit(nwDocAction.MD_STRIKE)
|
||||||
@@ -679,7 +679,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.fmtMenu.addSeparator()
|
self.fmtMenu.addSeparator()
|
||||||
|
|
||||||
# Format > Double Quotes
|
# Format > Double Quotes
|
||||||
self.aFmtDQuote = self.fmtMenu.addAction(self.tr("Wrap Double Quotes"))
|
self.aFmtDQuote = qtAddAction(self.fmtMenu, self.tr("Wrap Double Quotes"))
|
||||||
self.aFmtDQuote.setShortcut("Ctrl+\"")
|
self.aFmtDQuote.setShortcut("Ctrl+\"")
|
||||||
self.aFmtDQuote.triggered.connect(
|
self.aFmtDQuote.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.D_QUOTE)
|
lambda: self.requestDocAction.emit(nwDocAction.D_QUOTE)
|
||||||
@@ -687,7 +687,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtDQuote)
|
self.mainGui.addAction(self.aFmtDQuote)
|
||||||
|
|
||||||
# Format > Single Quotes
|
# Format > Single Quotes
|
||||||
self.aFmtSQuote = self.fmtMenu.addAction(self.tr("Wrap Single Quotes"))
|
self.aFmtSQuote = qtAddAction(self.fmtMenu, self.tr("Wrap Single Quotes"))
|
||||||
self.aFmtSQuote.setShortcut("Ctrl+'")
|
self.aFmtSQuote.setShortcut("Ctrl+'")
|
||||||
self.aFmtSQuote.triggered.connect(
|
self.aFmtSQuote.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.S_QUOTE)
|
lambda: self.requestDocAction.emit(nwDocAction.S_QUOTE)
|
||||||
@@ -698,46 +698,46 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.fmtMenu.addSeparator()
|
self.fmtMenu.addSeparator()
|
||||||
|
|
||||||
# Shortcodes
|
# Shortcodes
|
||||||
self.mShortcodes = self.fmtMenu.addMenu(self.tr("More Formats ..."))
|
self.mShortcodes = qtAddMenu(self.fmtMenu, self.tr("More Formats ..."))
|
||||||
|
|
||||||
# Shortcode Bold
|
# Shortcode Bold
|
||||||
self.aScBold = self.mShortcodes.addAction(self.tr("Bold (Shortcode)"))
|
self.aScBold = qtAddAction(self.mShortcodes, self.tr("Bold (Shortcode)"))
|
||||||
self.aScBold.triggered.connect(
|
self.aScBold.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SC_BOLD)
|
lambda: self.requestDocAction.emit(nwDocAction.SC_BOLD)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Shortcode Italic
|
# Shortcode Italic
|
||||||
self.aScItalic = self.mShortcodes.addAction(self.tr("Italics (Shortcode)"))
|
self.aScItalic = qtAddAction(self.mShortcodes, self.tr("Italics (Shortcode)"))
|
||||||
self.aScItalic.triggered.connect(
|
self.aScItalic.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SC_ITALIC)
|
lambda: self.requestDocAction.emit(nwDocAction.SC_ITALIC)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Shortcode Strikethrough
|
# Shortcode Strikethrough
|
||||||
self.aScStrike = self.mShortcodes.addAction(self.tr("Strikethrough (Shortcode)"))
|
self.aScStrike = qtAddAction(self.mShortcodes, self.tr("Strikethrough (Shortcode)"))
|
||||||
self.aScStrike.triggered.connect(
|
self.aScStrike.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SC_STRIKE)
|
lambda: self.requestDocAction.emit(nwDocAction.SC_STRIKE)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Shortcode Underline
|
# Shortcode Underline
|
||||||
self.aScULine = self.mShortcodes.addAction(self.tr("Underline"))
|
self.aScULine = qtAddAction(self.mShortcodes, self.tr("Underline"))
|
||||||
self.aScULine.triggered.connect(
|
self.aScULine.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SC_ULINE)
|
lambda: self.requestDocAction.emit(nwDocAction.SC_ULINE)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Shortcode Mark
|
# Shortcode Mark
|
||||||
self.aScMark = self.mShortcodes.addAction(self.tr("Highlight"))
|
self.aScMark = qtAddAction(self.mShortcodes, self.tr("Highlight"))
|
||||||
self.aScMark.triggered.connect(
|
self.aScMark.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SC_MARK)
|
lambda: self.requestDocAction.emit(nwDocAction.SC_MARK)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Shortcode Superscript
|
# Shortcode Superscript
|
||||||
self.aScSuper = self.mShortcodes.addAction(self.tr("Superscript"))
|
self.aScSuper = qtAddAction(self.mShortcodes, self.tr("Superscript"))
|
||||||
self.aScSuper.triggered.connect(
|
self.aScSuper.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SC_SUP)
|
lambda: self.requestDocAction.emit(nwDocAction.SC_SUP)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Shortcode Subscript
|
# Shortcode Subscript
|
||||||
self.aScSub = self.mShortcodes.addAction(self.tr("Subscript"))
|
self.aScSub = qtAddAction(self.mShortcodes, self.tr("Subscript"))
|
||||||
self.aScSub.triggered.connect(
|
self.aScSub.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.SC_SUB)
|
lambda: self.requestDocAction.emit(nwDocAction.SC_SUB)
|
||||||
)
|
)
|
||||||
@@ -746,7 +746,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.fmtMenu.addSeparator()
|
self.fmtMenu.addSeparator()
|
||||||
|
|
||||||
# Format > Heading 1 (Partition)
|
# Format > Heading 1 (Partition)
|
||||||
self.aFmtHead1 = self.fmtMenu.addAction(trConst(nwStyles.T_LABEL["H1"]))
|
self.aFmtHead1 = qtAddAction(self.fmtMenu, trConst(nwStyles.T_LABEL["H1"]))
|
||||||
self.aFmtHead1.setShortcut("Ctrl+1")
|
self.aFmtHead1.setShortcut("Ctrl+1")
|
||||||
self.aFmtHead1.triggered.connect(
|
self.aFmtHead1.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H1)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H1)
|
||||||
@@ -754,7 +754,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtHead1)
|
self.mainGui.addAction(self.aFmtHead1)
|
||||||
|
|
||||||
# Format > Heading 2 (Chapter)
|
# Format > Heading 2 (Chapter)
|
||||||
self.aFmtHead2 = self.fmtMenu.addAction(trConst(nwStyles.T_LABEL["H2"]))
|
self.aFmtHead2 = qtAddAction(self.fmtMenu, trConst(nwStyles.T_LABEL["H2"]))
|
||||||
self.aFmtHead2.setShortcut("Ctrl+2")
|
self.aFmtHead2.setShortcut("Ctrl+2")
|
||||||
self.aFmtHead2.triggered.connect(
|
self.aFmtHead2.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H2)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H2)
|
||||||
@@ -762,7 +762,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtHead2)
|
self.mainGui.addAction(self.aFmtHead2)
|
||||||
|
|
||||||
# Format > Heading 3 (Scene)
|
# Format > Heading 3 (Scene)
|
||||||
self.aFmtHead3 = self.fmtMenu.addAction(trConst(nwStyles.T_LABEL["H3"]))
|
self.aFmtHead3 = qtAddAction(self.fmtMenu, trConst(nwStyles.T_LABEL["H3"]))
|
||||||
self.aFmtHead3.setShortcut("Ctrl+3")
|
self.aFmtHead3.setShortcut("Ctrl+3")
|
||||||
self.aFmtHead3.triggered.connect(
|
self.aFmtHead3.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H3)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H3)
|
||||||
@@ -770,7 +770,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtHead3)
|
self.mainGui.addAction(self.aFmtHead3)
|
||||||
|
|
||||||
# Format > Heading 4 (Section)
|
# Format > Heading 4 (Section)
|
||||||
self.aFmtHead4 = self.fmtMenu.addAction(trConst(nwStyles.T_LABEL["H4"]))
|
self.aFmtHead4 = qtAddAction(self.fmtMenu, trConst(nwStyles.T_LABEL["H4"]))
|
||||||
self.aFmtHead4.setShortcut("Ctrl+4")
|
self.aFmtHead4.setShortcut("Ctrl+4")
|
||||||
self.aFmtHead4.triggered.connect(
|
self.aFmtHead4.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H4)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_H4)
|
||||||
@@ -781,19 +781,19 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.fmtMenu.addSeparator()
|
self.fmtMenu.addSeparator()
|
||||||
|
|
||||||
# Format > Novel Title
|
# Format > Novel Title
|
||||||
self.aFmtTitle = self.fmtMenu.addAction(self.tr("Novel Title"))
|
self.aFmtTitle = qtAddAction(self.fmtMenu, self.tr("Novel Title"))
|
||||||
self.aFmtTitle.triggered.connect(
|
self.aFmtTitle.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_TTL)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_TTL)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Format > Unnumbered Chapter
|
# Format > Unnumbered Chapter
|
||||||
self.aFmtUnNum = self.fmtMenu.addAction(self.tr("Unnumbered Chapter"))
|
self.aFmtUnNum = qtAddAction(self.fmtMenu, self.tr("Unnumbered Chapter"))
|
||||||
self.aFmtUnNum.triggered.connect(
|
self.aFmtUnNum.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_UNN)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_UNN)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Format > Alternative Scene
|
# Format > Alternative Scene
|
||||||
self.aFmtHardSc = self.fmtMenu.addAction(self.tr("Alternative Scene"))
|
self.aFmtHardSc = qtAddAction(self.fmtMenu, self.tr("Alternative Scene"))
|
||||||
self.aFmtHardSc.triggered.connect(
|
self.aFmtHardSc.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_HSC)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_HSC)
|
||||||
)
|
)
|
||||||
@@ -802,7 +802,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.fmtMenu.addSeparator()
|
self.fmtMenu.addSeparator()
|
||||||
|
|
||||||
# Format > Align Left
|
# Format > Align Left
|
||||||
self.aFmtAlignLeft = self.fmtMenu.addAction(self.tr("Align Left"))
|
self.aFmtAlignLeft = qtAddAction(self.fmtMenu, self.tr("Align Left"))
|
||||||
self.aFmtAlignLeft.setShortcut("Ctrl+5")
|
self.aFmtAlignLeft.setShortcut("Ctrl+5")
|
||||||
self.aFmtAlignLeft.triggered.connect(
|
self.aFmtAlignLeft.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.ALIGN_L)
|
lambda: self.requestDocAction.emit(nwDocAction.ALIGN_L)
|
||||||
@@ -810,7 +810,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtAlignLeft)
|
self.mainGui.addAction(self.aFmtAlignLeft)
|
||||||
|
|
||||||
# Format > Align Centre
|
# Format > Align Centre
|
||||||
self.aFmtAlignCentre = self.fmtMenu.addAction(self.tr("Align Centre"))
|
self.aFmtAlignCentre = qtAddAction(self.fmtMenu, self.tr("Align Centre"))
|
||||||
self.aFmtAlignCentre.setShortcut("Ctrl+6")
|
self.aFmtAlignCentre.setShortcut("Ctrl+6")
|
||||||
self.aFmtAlignCentre.triggered.connect(
|
self.aFmtAlignCentre.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.ALIGN_C)
|
lambda: self.requestDocAction.emit(nwDocAction.ALIGN_C)
|
||||||
@@ -818,7 +818,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtAlignCentre)
|
self.mainGui.addAction(self.aFmtAlignCentre)
|
||||||
|
|
||||||
# Format > Align Right
|
# Format > Align Right
|
||||||
self.aFmtAlignRight = self.fmtMenu.addAction(self.tr("Align Right"))
|
self.aFmtAlignRight = qtAddAction(self.fmtMenu, self.tr("Align Right"))
|
||||||
self.aFmtAlignRight.setShortcut("Ctrl+7")
|
self.aFmtAlignRight.setShortcut("Ctrl+7")
|
||||||
self.aFmtAlignRight.triggered.connect(
|
self.aFmtAlignRight.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.ALIGN_R)
|
lambda: self.requestDocAction.emit(nwDocAction.ALIGN_R)
|
||||||
@@ -829,7 +829,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.fmtMenu.addSeparator()
|
self.fmtMenu.addSeparator()
|
||||||
|
|
||||||
# Format > Indent Left
|
# Format > Indent Left
|
||||||
self.aFmtIndentLeft = self.fmtMenu.addAction(self.tr("Indent Left"))
|
self.aFmtIndentLeft = qtAddAction(self.fmtMenu, self.tr("Indent Left"))
|
||||||
self.aFmtIndentLeft.setShortcut("Ctrl+8")
|
self.aFmtIndentLeft.setShortcut("Ctrl+8")
|
||||||
self.aFmtIndentLeft.triggered.connect(
|
self.aFmtIndentLeft.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.INDENT_L)
|
lambda: self.requestDocAction.emit(nwDocAction.INDENT_L)
|
||||||
@@ -837,7 +837,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtIndentLeft)
|
self.mainGui.addAction(self.aFmtIndentLeft)
|
||||||
|
|
||||||
# Format > Indent Right
|
# Format > Indent Right
|
||||||
self.aFmtIndentRight = self.fmtMenu.addAction(self.tr("Indent Right"))
|
self.aFmtIndentRight = qtAddAction(self.fmtMenu, self.tr("Indent Right"))
|
||||||
self.aFmtIndentRight.setShortcut("Ctrl+9")
|
self.aFmtIndentRight.setShortcut("Ctrl+9")
|
||||||
self.aFmtIndentRight.triggered.connect(
|
self.aFmtIndentRight.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.INDENT_R)
|
lambda: self.requestDocAction.emit(nwDocAction.INDENT_R)
|
||||||
@@ -848,7 +848,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.fmtMenu.addSeparator()
|
self.fmtMenu.addSeparator()
|
||||||
|
|
||||||
# Format > Comment
|
# Format > Comment
|
||||||
self.aFmtComment = self.fmtMenu.addAction(self.tr("Toggle Comment"))
|
self.aFmtComment = qtAddAction(self.fmtMenu, self.tr("Toggle Comment"))
|
||||||
self.aFmtComment.setShortcut("Ctrl+/")
|
self.aFmtComment.setShortcut("Ctrl+/")
|
||||||
self.aFmtComment.triggered.connect(
|
self.aFmtComment.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_COM)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_COM)
|
||||||
@@ -856,14 +856,14 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFmtComment)
|
self.mainGui.addAction(self.aFmtComment)
|
||||||
|
|
||||||
# Format > Ignore Text
|
# Format > Ignore Text
|
||||||
self.aFmtIgnore = self.fmtMenu.addAction(self.tr("Toggle Ignore Text"))
|
self.aFmtIgnore = qtAddAction(self.fmtMenu, self.tr("Toggle Ignore Text"))
|
||||||
self.aFmtIgnore.setShortcut("Ctrl+Shift+D")
|
self.aFmtIgnore.setShortcut("Ctrl+Shift+D")
|
||||||
self.aFmtIgnore.triggered.connect(
|
self.aFmtIgnore.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_IGN)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_IGN)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Format > Remove Block Format
|
# Format > Remove Block Format
|
||||||
self.aFmtNoFormat = self.fmtMenu.addAction(self.tr("Remove Block Format"))
|
self.aFmtNoFormat = qtAddAction(self.fmtMenu, self.tr("Remove Block Format"))
|
||||||
self.aFmtNoFormat.setShortcuts(["Ctrl+0", "Ctrl+Shift+/"])
|
self.aFmtNoFormat.setShortcuts(["Ctrl+0", "Ctrl+Shift+/"])
|
||||||
self.aFmtNoFormat.triggered.connect(
|
self.aFmtNoFormat.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_TXT)
|
lambda: self.requestDocAction.emit(nwDocAction.BLOCK_TXT)
|
||||||
@@ -874,19 +874,19 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.fmtMenu.addSeparator()
|
self.fmtMenu.addSeparator()
|
||||||
|
|
||||||
# Format > Replace Straight Single Quotes
|
# Format > Replace Straight Single Quotes
|
||||||
self.aFmtReplSng = self.fmtMenu.addAction(self.tr("Replace Straight Single Quotes"))
|
self.aFmtReplSng = qtAddAction(self.fmtMenu, self.tr("Replace Straight Single Quotes"))
|
||||||
self.aFmtReplSng.triggered.connect(
|
self.aFmtReplSng.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.REPL_SNG)
|
lambda: self.requestDocAction.emit(nwDocAction.REPL_SNG)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Format > Replace Straight Double Quotes
|
# Format > Replace Straight Double Quotes
|
||||||
self.aFmtReplDbl = self.fmtMenu.addAction(self.tr("Replace Straight Double Quotes"))
|
self.aFmtReplDbl = qtAddAction(self.fmtMenu, self.tr("Replace Straight Double Quotes"))
|
||||||
self.aFmtReplDbl.triggered.connect(
|
self.aFmtReplDbl.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.REPL_DBL)
|
lambda: self.requestDocAction.emit(nwDocAction.REPL_DBL)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Format > Remove In-Paragraph Breaks
|
# Format > Remove In-Paragraph Breaks
|
||||||
self.aFmtRmBreaks = self.fmtMenu.addAction(self.tr("Remove In-Paragraph Breaks"))
|
self.aFmtRmBreaks = qtAddAction(self.fmtMenu, self.tr("Remove In-Paragraph Breaks"))
|
||||||
self.aFmtRmBreaks.triggered.connect(
|
self.aFmtRmBreaks.triggered.connect(
|
||||||
lambda: self.requestDocAction.emit(nwDocAction.RM_BREAKS)
|
lambda: self.requestDocAction.emit(nwDocAction.RM_BREAKS)
|
||||||
)
|
)
|
||||||
@@ -896,28 +896,28 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildSearchMenu(self) -> None:
|
def _buildSearchMenu(self) -> None:
|
||||||
"""Assemble the Search menu."""
|
"""Assemble the Search menu."""
|
||||||
# Search
|
# Search
|
||||||
self.srcMenu = self.addMenu(self.tr("&Search"))
|
self.srcMenu = qtAddMenu(self, self.tr("&Search"))
|
||||||
|
|
||||||
# Search > Find
|
# Search > Find
|
||||||
self.aFind = self.srcMenu.addAction(self.tr("Find"))
|
self.aFind = qtAddAction(self.srcMenu, self.tr("Find"))
|
||||||
self.aFind.setShortcut("Ctrl+F")
|
self.aFind.setShortcut("Ctrl+F")
|
||||||
self.aFind.triggered.connect(qtLambda(self.mainGui.docEditor.beginSearch))
|
self.aFind.triggered.connect(qtLambda(self.mainGui.docEditor.beginSearch))
|
||||||
self.mainGui.addAction(self.aFind)
|
self.mainGui.addAction(self.aFind)
|
||||||
|
|
||||||
# Search > Replace
|
# Search > Replace
|
||||||
self.aReplace = self.srcMenu.addAction(self.tr("Replace"))
|
self.aReplace = qtAddAction(self.srcMenu, self.tr("Replace"))
|
||||||
self.aReplace.setShortcut("Ctrl+=" if CONFIG.osDarwin else "Ctrl+H")
|
self.aReplace.setShortcut("Ctrl+=" if CONFIG.osDarwin else "Ctrl+H")
|
||||||
self.aReplace.triggered.connect(qtLambda(self.mainGui.docEditor.beginReplace))
|
self.aReplace.triggered.connect(qtLambda(self.mainGui.docEditor.beginReplace))
|
||||||
self.mainGui.addAction(self.aReplace)
|
self.mainGui.addAction(self.aReplace)
|
||||||
|
|
||||||
# Search > Find Next
|
# Search > Find Next
|
||||||
self.aFindNext = self.srcMenu.addAction(self.tr("Find Next"))
|
self.aFindNext = qtAddAction(self.srcMenu, self.tr("Find Next"))
|
||||||
self.aFindNext.setShortcuts(["Ctrl+G", "F3"] if CONFIG.osDarwin else ["F3", "Ctrl+G"])
|
self.aFindNext.setShortcuts(["Ctrl+G", "F3"] if CONFIG.osDarwin else ["F3", "Ctrl+G"])
|
||||||
self.aFindNext.triggered.connect(qtLambda(self.mainGui.docEditor.findNext))
|
self.aFindNext.triggered.connect(qtLambda(self.mainGui.docEditor.findNext))
|
||||||
self.mainGui.addAction(self.aFindNext)
|
self.mainGui.addAction(self.aFindNext)
|
||||||
|
|
||||||
# Search > Find Prev
|
# Search > Find Prev
|
||||||
self.aFindPrev = self.srcMenu.addAction(self.tr("Find Previous"))
|
self.aFindPrev = qtAddAction(self.srcMenu, self.tr("Find Previous"))
|
||||||
self.aFindPrev.setShortcuts(
|
self.aFindPrev.setShortcuts(
|
||||||
["Ctrl+Shift+G", "Shift+F3"] if CONFIG.osDarwin else ["Shift+F3", "Ctrl+Shift+G"]
|
["Ctrl+Shift+G", "Shift+F3"] if CONFIG.osDarwin else ["Shift+F3", "Ctrl+Shift+G"]
|
||||||
)
|
)
|
||||||
@@ -925,7 +925,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mainGui.addAction(self.aFindPrev)
|
self.mainGui.addAction(self.aFindPrev)
|
||||||
|
|
||||||
# Search > Replace Next
|
# Search > Replace Next
|
||||||
self.aReplaceNext = self.srcMenu.addAction(self.tr("Replace Next"))
|
self.aReplaceNext = qtAddAction(self.srcMenu, self.tr("Replace Next"))
|
||||||
self.aReplaceNext.setShortcut("Ctrl+Shift+1")
|
self.aReplaceNext.setShortcut("Ctrl+Shift+1")
|
||||||
self.aReplaceNext.triggered.connect(qtLambda(self.mainGui.docEditor.replaceNext))
|
self.aReplaceNext.triggered.connect(qtLambda(self.mainGui.docEditor.replaceNext))
|
||||||
self.mainGui.addAction(self.aReplaceNext)
|
self.mainGui.addAction(self.aReplaceNext)
|
||||||
@@ -934,7 +934,7 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.srcMenu.addSeparator()
|
self.srcMenu.addSeparator()
|
||||||
|
|
||||||
# Search > Find in Project
|
# Search > Find in Project
|
||||||
self.aFindProj = self.srcMenu.addAction(self.tr("Find in Project"))
|
self.aFindProj = qtAddAction(self.srcMenu, self.tr("Find in Project"))
|
||||||
self.aFindProj.setShortcut("Ctrl+Shift+F")
|
self.aFindProj.setShortcut("Ctrl+Shift+F")
|
||||||
self.aFindProj.triggered.connect(lambda: self.requestViewChange.emit(nwView.SEARCH))
|
self.aFindProj.triggered.connect(lambda: self.requestViewChange.emit(nwView.SEARCH))
|
||||||
|
|
||||||
@@ -943,17 +943,17 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildToolsMenu(self) -> None:
|
def _buildToolsMenu(self) -> None:
|
||||||
"""Assemble the Tools menu."""
|
"""Assemble the Tools menu."""
|
||||||
# Tools
|
# Tools
|
||||||
self.toolsMenu = self.addMenu(self.tr("&Tools"))
|
self.toolsMenu = qtAddMenu(self, self.tr("&Tools"))
|
||||||
|
|
||||||
# Tools > Check Spelling
|
# Tools > Check Spelling
|
||||||
self.aSpellCheck = self.toolsMenu.addAction(self.tr("Check Spelling"))
|
self.aSpellCheck = qtAddAction(self.toolsMenu, self.tr("Check Spelling"))
|
||||||
self.aSpellCheck.setCheckable(True)
|
self.aSpellCheck.setCheckable(True)
|
||||||
self.aSpellCheck.setChecked(SHARED.project.data.spellCheck)
|
self.aSpellCheck.setChecked(SHARED.project.data.spellCheck)
|
||||||
self.aSpellCheck.triggered.connect(self._toggleSpellCheck) # triggered, not toggled!
|
self.aSpellCheck.triggered.connect(self._toggleSpellCheck) # triggered, not toggled!
|
||||||
self.aSpellCheck.setShortcut("Ctrl+F7")
|
self.aSpellCheck.setShortcut("Ctrl+F7")
|
||||||
self.mainGui.addAction(self.aSpellCheck)
|
self.mainGui.addAction(self.aSpellCheck)
|
||||||
|
|
||||||
self.mSelectLanguage = self.toolsMenu.addMenu(self.tr("Spell Check Language"))
|
self.mSelectLanguage = qtAddMenu(self.toolsMenu, self.tr("Spell Check Language"))
|
||||||
languages = SHARED.spelling.listDictionaries()
|
languages = SHARED.spelling.listDictionaries()
|
||||||
languages.insert(0, ("None", self.tr("Default")))
|
languages.insert(0, ("None", self.tr("Default")))
|
||||||
for n, (tag, language) in enumerate(languages):
|
for n, (tag, language) in enumerate(languages):
|
||||||
@@ -963,25 +963,25 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.mSelectLanguage.addAction(aSpell)
|
self.mSelectLanguage.addAction(aSpell)
|
||||||
|
|
||||||
# Tools > Re-Run Spell Check
|
# Tools > Re-Run Spell Check
|
||||||
self.aReRunSpell = self.toolsMenu.addAction(self.tr("Re-Run Spell Check"))
|
self.aReRunSpell = qtAddAction(self.toolsMenu, self.tr("Re-Run Spell Check"))
|
||||||
self.aReRunSpell.setShortcut("F7")
|
self.aReRunSpell.setShortcut("F7")
|
||||||
self.aReRunSpell.triggered.connect(qtLambda(self.mainGui.docEditor.spellCheckDocument))
|
self.aReRunSpell.triggered.connect(qtLambda(self.mainGui.docEditor.spellCheckDocument))
|
||||||
self.mainGui.addAction(self.aReRunSpell)
|
self.mainGui.addAction(self.aReRunSpell)
|
||||||
|
|
||||||
# Tools > Project Word List
|
# Tools > Project Word List
|
||||||
self.aEditWordList = self.toolsMenu.addAction(self.tr("Project Word List"))
|
self.aEditWordList = qtAddAction(self.toolsMenu, self.tr("Project Word List"))
|
||||||
self.aEditWordList.triggered.connect(self.mainGui.showProjectWordListDialog)
|
self.aEditWordList.triggered.connect(self.mainGui.showProjectWordListDialog)
|
||||||
|
|
||||||
# Tools > Add Dictionaries
|
# Tools > Add Dictionaries
|
||||||
if CONFIG.osWindows or CONFIG.isDebug:
|
if CONFIG.osWindows or CONFIG.isDebug:
|
||||||
self.aAddDicts = self.toolsMenu.addAction(self.tr("Add Dictionaries"))
|
self.aAddDicts = qtAddAction(self.toolsMenu, self.tr("Add Dictionaries"))
|
||||||
self.aAddDicts.triggered.connect(self.mainGui.showDictionariesDialog)
|
self.aAddDicts.triggered.connect(self.mainGui.showDictionariesDialog)
|
||||||
|
|
||||||
# Tools > Separator
|
# Tools > Separator
|
||||||
self.toolsMenu.addSeparator()
|
self.toolsMenu.addSeparator()
|
||||||
|
|
||||||
# Tools > Rebuild Index
|
# Tools > Rebuild Index
|
||||||
self.aRebuildIndex = self.toolsMenu.addAction(self.tr("Rebuild Index"))
|
self.aRebuildIndex = qtAddAction(self.toolsMenu, self.tr("Rebuild Index"))
|
||||||
self.aRebuildIndex.setShortcut("F9")
|
self.aRebuildIndex.setShortcut("F9")
|
||||||
self.aRebuildIndex.triggered.connect(qtLambda(self.mainGui.rebuildIndex))
|
self.aRebuildIndex.triggered.connect(qtLambda(self.mainGui.rebuildIndex))
|
||||||
|
|
||||||
@@ -989,21 +989,21 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.toolsMenu.addSeparator()
|
self.toolsMenu.addSeparator()
|
||||||
|
|
||||||
# Tools > Backup Project
|
# Tools > Backup Project
|
||||||
self.aBackupProject = self.toolsMenu.addAction(self.tr("Backup Project"))
|
self.aBackupProject = qtAddAction(self.toolsMenu, self.tr("Backup Project"))
|
||||||
self.aBackupProject.triggered.connect(qtLambda(SHARED.project.backupProject, True))
|
self.aBackupProject.triggered.connect(qtLambda(SHARED.project.backupProject, True))
|
||||||
|
|
||||||
# Tools > Build Manuscript
|
# Tools > Build Manuscript
|
||||||
self.aBuildManuscript = self.toolsMenu.addAction(self.tr("Build Manuscript"))
|
self.aBuildManuscript = qtAddAction(self.toolsMenu, self.tr("Build Manuscript"))
|
||||||
self.aBuildManuscript.setShortcut("F5")
|
self.aBuildManuscript.setShortcut("F5")
|
||||||
self.aBuildManuscript.triggered.connect(self.mainGui.showBuildManuscriptDialog)
|
self.aBuildManuscript.triggered.connect(self.mainGui.showBuildManuscriptDialog)
|
||||||
|
|
||||||
# Tools > Writing Statistics
|
# Tools > Writing Statistics
|
||||||
self.aWritingStats = self.toolsMenu.addAction(self.tr("Writing Statistics"))
|
self.aWritingStats = qtAddAction(self.toolsMenu, self.tr("Writing Statistics"))
|
||||||
self.aWritingStats.setShortcut("F6")
|
self.aWritingStats.setShortcut("F6")
|
||||||
self.aWritingStats.triggered.connect(self.mainGui.showWritingStatsDialog)
|
self.aWritingStats.triggered.connect(self.mainGui.showWritingStatsDialog)
|
||||||
|
|
||||||
# Tools > Preferences
|
# Tools > Preferences
|
||||||
self.aPreferences = self.toolsMenu.addAction(self.tr("Preferences"))
|
self.aPreferences = qtAddAction(self.toolsMenu, self.tr("Preferences"))
|
||||||
self.aPreferences.setShortcut("Ctrl+,")
|
self.aPreferences.setShortcut("Ctrl+,")
|
||||||
self.aPreferences.setMenuRole(QAction.MenuRole.PreferencesRole)
|
self.aPreferences.setMenuRole(QAction.MenuRole.PreferencesRole)
|
||||||
self.aPreferences.triggered.connect(self.mainGui.showPreferencesDialog)
|
self.aPreferences.triggered.connect(self.mainGui.showPreferencesDialog)
|
||||||
@@ -1014,15 +1014,15 @@ class GuiMainMenu(QMenuBar):
|
|||||||
def _buildHelpMenu(self) -> None:
|
def _buildHelpMenu(self) -> None:
|
||||||
"""Assemble the Help menu."""
|
"""Assemble the Help menu."""
|
||||||
# Help
|
# Help
|
||||||
self.helpMenu = self.addMenu(self.tr("&Help"))
|
self.helpMenu = qtAddMenu(self, self.tr("&Help"))
|
||||||
|
|
||||||
# Help > About
|
# Help > About
|
||||||
self.aAboutNW = self.helpMenu.addAction(self.tr("About novelWriter"))
|
self.aAboutNW = qtAddAction(self.helpMenu, self.tr("About novelWriter"))
|
||||||
self.aAboutNW.setMenuRole(QAction.MenuRole.AboutRole)
|
self.aAboutNW.setMenuRole(QAction.MenuRole.AboutRole)
|
||||||
self.aAboutNW.triggered.connect(self.mainGui.showAboutNWDialog)
|
self.aAboutNW.triggered.connect(self.mainGui.showAboutNWDialog)
|
||||||
|
|
||||||
# Help > About Qt
|
# Help > About Qt
|
||||||
self.aAboutQt = self.helpMenu.addAction(self.tr("About Qt"))
|
self.aAboutQt = qtAddAction(self.helpMenu, self.tr("About Qt"))
|
||||||
self.aAboutQt.setMenuRole(QAction.MenuRole.AboutQtRole)
|
self.aAboutQt.setMenuRole(QAction.MenuRole.AboutQtRole)
|
||||||
self.aAboutQt.triggered.connect(self.mainGui.showAboutQtDialog)
|
self.aAboutQt.triggered.connect(self.mainGui.showAboutQtDialog)
|
||||||
|
|
||||||
@@ -1030,14 +1030,14 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.helpMenu.addSeparator()
|
self.helpMenu.addSeparator()
|
||||||
|
|
||||||
# Help > User Manual (Online)
|
# Help > User Manual (Online)
|
||||||
self.aHelpDocs = self.helpMenu.addAction(self.tr("User Manual (Online)"))
|
self.aHelpDocs = qtAddAction(self.helpMenu, self.tr("User Manual (Online)"))
|
||||||
self.aHelpDocs.setShortcut("F1")
|
self.aHelpDocs.setShortcut("F1")
|
||||||
self.aHelpDocs.triggered.connect(qtLambda(SHARED.openWebsite, nwConst.URL_DOCS))
|
self.aHelpDocs.triggered.connect(qtLambda(SHARED.openWebsite, nwConst.URL_DOCS))
|
||||||
self.mainGui.addAction(self.aHelpDocs)
|
self.mainGui.addAction(self.aHelpDocs)
|
||||||
|
|
||||||
# Help > User Manual (PDF)
|
# Help > User Manual (PDF)
|
||||||
if isinstance(CONFIG.pdfDocs, Path):
|
if isinstance(CONFIG.pdfDocs, Path):
|
||||||
self.aPdfDocs = self.helpMenu.addAction(self.tr("User Manual (PDF)"))
|
self.aPdfDocs = qtAddAction(self.helpMenu, self.tr("User Manual (PDF)"))
|
||||||
self.aPdfDocs.setShortcut("Shift+F1")
|
self.aPdfDocs.setShortcut("Shift+F1")
|
||||||
self.aPdfDocs.triggered.connect(self._openUserManualFile)
|
self.aPdfDocs.triggered.connect(self._openUserManualFile)
|
||||||
self.mainGui.addAction(self.aPdfDocs)
|
self.mainGui.addAction(self.aPdfDocs)
|
||||||
@@ -1046,15 +1046,15 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.helpMenu.addSeparator()
|
self.helpMenu.addSeparator()
|
||||||
|
|
||||||
# Document > Report an Issue
|
# Document > Report an Issue
|
||||||
self.aIssue = self.helpMenu.addAction(self.tr("Report an Issue (GitHub)"))
|
self.aIssue = qtAddAction(self.helpMenu, self.tr("Report an Issue (GitHub)"))
|
||||||
self.aIssue.triggered.connect(qtLambda(SHARED.openWebsite, nwConst.URL_REPORT))
|
self.aIssue.triggered.connect(qtLambda(SHARED.openWebsite, nwConst.URL_REPORT))
|
||||||
|
|
||||||
# Document > Ask a Question
|
# Document > Ask a Question
|
||||||
self.aQuestion = self.helpMenu.addAction(self.tr("Ask a Question (GitHub)"))
|
self.aQuestion = qtAddAction(self.helpMenu, self.tr("Ask a Question (GitHub)"))
|
||||||
self.aQuestion.triggered.connect(qtLambda(SHARED.openWebsite, nwConst.URL_HELP))
|
self.aQuestion.triggered.connect(qtLambda(SHARED.openWebsite, nwConst.URL_HELP))
|
||||||
|
|
||||||
# Document > Main Website
|
# Document > Main Website
|
||||||
self.aWebsite = self.helpMenu.addAction(self.tr("The novelWriter Website"))
|
self.aWebsite = qtAddAction(self.helpMenu, self.tr("The novelWriter Website"))
|
||||||
self.aWebsite.triggered.connect(qtLambda(SHARED.openWebsite, nwConst.URL_WEB))
|
self.aWebsite.triggered.connect(qtLambda(SHARED.openWebsite, nwConst.URL_WEB))
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ from PyQt6.QtWidgets import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.common import minmax, qtLambda
|
from novelwriter.common import minmax, qtAddAction, qtAddMenu, qtLambda
|
||||||
from novelwriter.constants import nwKeyWords, nwLabels, nwStyles, trConst
|
from novelwriter.constants import nwKeyWords, nwLabels, nwStyles, trConst
|
||||||
from novelwriter.core.index import IndexHeading
|
from novelwriter.core.index import IndexHeading
|
||||||
from novelwriter.enum import nwChange, nwDocMode, nwItemClass, nwOutline
|
from novelwriter.enum import nwChange, nwDocMode, nwItemClass, nwOutline
|
||||||
@@ -199,7 +199,6 @@ class GuiNovelToolBar(QWidget):
|
|||||||
self.novelView = novelView
|
self.novelView = novelView
|
||||||
|
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
mPx = CONFIG.pxInt(2)
|
|
||||||
|
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
self.setAutoFillBackground(True)
|
self.setAutoFillBackground(True)
|
||||||
@@ -211,7 +210,7 @@ class GuiNovelToolBar(QWidget):
|
|||||||
self.novelValue = NovelSelector(self)
|
self.novelValue = NovelSelector(self)
|
||||||
self.novelValue.setFont(selFont)
|
self.novelValue.setFont(selFont)
|
||||||
self.novelValue.setListFormat(self.tr("Outline of {0}"))
|
self.novelValue.setListFormat(self.tr("Outline of {0}"))
|
||||||
self.novelValue.setMinimumWidth(CONFIG.pxInt(150))
|
self.novelValue.setMinimumWidth(150)
|
||||||
self.novelValue.setSizePolicy(QtSizeExpanding, QtSizeExpanding)
|
self.novelValue.setSizePolicy(QtSizeExpanding, QtSizeExpanding)
|
||||||
self.novelValue.novelSelectionChanged.connect(self.setCurrentRoot)
|
self.novelValue.novelSelectionChanged.connect(self.setCurrentRoot)
|
||||||
|
|
||||||
@@ -227,7 +226,7 @@ class GuiNovelToolBar(QWidget):
|
|||||||
# More Options Menu
|
# More Options Menu
|
||||||
self.mMore = QMenu(self)
|
self.mMore = QMenu(self)
|
||||||
|
|
||||||
self.mLastCol = self.mMore.addMenu(self.tr("Last Column"))
|
self.mLastCol = qtAddMenu(self.mMore, self.tr("Last Column"))
|
||||||
self.gLastCol = QActionGroup(self.mMore)
|
self.gLastCol = QActionGroup(self.mMore)
|
||||||
self.aLastCol = {}
|
self.aLastCol = {}
|
||||||
self._addLastColAction(NovelTreeColumn.HIDDEN, self.tr("Hidden"))
|
self._addLastColAction(NovelTreeColumn.HIDDEN, self.tr("Hidden"))
|
||||||
@@ -236,7 +235,7 @@ class GuiNovelToolBar(QWidget):
|
|||||||
self._addLastColAction(NovelTreeColumn.PLOT, self.tr("Novel Plot"))
|
self._addLastColAction(NovelTreeColumn.PLOT, self.tr("Novel Plot"))
|
||||||
|
|
||||||
self.mLastCol.addSeparator()
|
self.mLastCol.addSeparator()
|
||||||
self.aLastColSize = self.mLastCol.addAction(self.tr("Column Size"))
|
self.aLastColSize = qtAddAction(self.mLastCol, self.tr("Column Size"))
|
||||||
self.aLastColSize.triggered.connect(self._selectLastColumnSize)
|
self.aLastColSize.triggered.connect(self._selectLastColumnSize)
|
||||||
|
|
||||||
self.tbMore = NIconToolButton(self, iSz)
|
self.tbMore = NIconToolButton(self, iSz)
|
||||||
@@ -249,7 +248,7 @@ class GuiNovelToolBar(QWidget):
|
|||||||
self.outerBox.addWidget(self.tbNovel)
|
self.outerBox.addWidget(self.tbNovel)
|
||||||
self.outerBox.addWidget(self.tbRefresh)
|
self.outerBox.addWidget(self.tbRefresh)
|
||||||
self.outerBox.addWidget(self.tbMore)
|
self.outerBox.addWidget(self.tbMore)
|
||||||
self.outerBox.setContentsMargins(mPx, mPx, 0, mPx)
|
self.outerBox.setContentsMargins(2, 2, 0, 2)
|
||||||
self.outerBox.setSpacing(0)
|
self.outerBox.setSpacing(0)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
@@ -343,7 +342,7 @@ class GuiNovelToolBar(QWidget):
|
|||||||
|
|
||||||
def _addLastColAction(self, colType: NovelTreeColumn, actionLabel: str) -> None:
|
def _addLastColAction(self, colType: NovelTreeColumn, actionLabel: str) -> None:
|
||||||
"""Add a column selection entry to the last column menu."""
|
"""Add a column selection entry to the last column menu."""
|
||||||
aLast = self.mLastCol.addAction(actionLabel)
|
aLast = qtAddAction(self.mLastCol, actionLabel)
|
||||||
aLast.setCheckable(True)
|
aLast.setCheckable(True)
|
||||||
aLast.setActionGroup(self.gLastCol)
|
aLast.setActionGroup(self.gLastCol)
|
||||||
aLast.triggered.connect(qtLambda(self.setLastColType, colType))
|
aLast.triggered.connect(qtLambda(self.setLastColType, colType))
|
||||||
@@ -388,7 +387,6 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
|
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
cMg = CONFIG.pxInt(6)
|
|
||||||
|
|
||||||
self.setIconSize(iSz)
|
self.setIconSize(iSz)
|
||||||
self.setFrameStyle(QFrame.Shape.NoFrame)
|
self.setFrameStyle(QFrame.Shape.NoFrame)
|
||||||
@@ -403,13 +401,13 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
self.setDragEnabled(False)
|
self.setDragEnabled(False)
|
||||||
|
|
||||||
# Lock the column sizes
|
# Lock the column sizes
|
||||||
treeHeader = self.header()
|
if header := self.header():
|
||||||
treeHeader.setStretchLastSection(False)
|
header.setStretchLastSection(False)
|
||||||
treeHeader.setMinimumSectionSize(iPx + cMg)
|
header.setMinimumSectionSize(iPx + 6)
|
||||||
treeHeader.setSectionResizeMode(self.C_TITLE, QtHeaderStretch)
|
header.setSectionResizeMode(self.C_TITLE, QtHeaderStretch)
|
||||||
treeHeader.setSectionResizeMode(self.C_WORDS, QtHeaderToContents)
|
header.setSectionResizeMode(self.C_WORDS, QtHeaderToContents)
|
||||||
treeHeader.setSectionResizeMode(self.C_EXTRA, QtHeaderToContents)
|
header.setSectionResizeMode(self.C_EXTRA, QtHeaderToContents)
|
||||||
treeHeader.setSectionResizeMode(self.C_MORE, QtHeaderToContents)
|
header.setSectionResizeMode(self.C_MORE, QtHeaderToContents)
|
||||||
|
|
||||||
# Pre-Generate Tree Formatting
|
# Pre-Generate Tree Formatting
|
||||||
fH1 = self.font()
|
fH1 = self.font()
|
||||||
@@ -678,8 +676,9 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def _updateTreeItemValues(self, trItem: QTreeWidgetItem, idxItem: IndexHeading,
|
def _updateTreeItemValues(
|
||||||
tHandle: str, sTitle: str) -> None:
|
self, trItem: QTreeWidgetItem, idxItem: IndexHeading, tHandle: str, sTitle: str
|
||||||
|
) -> None:
|
||||||
"""Set the tree item values from the index entry."""
|
"""Set the tree item values from the index entry."""
|
||||||
iLevel = nwStyles.H_LEVEL.get(idxItem.level, 0)
|
iLevel = nwStyles.H_LEVEL.get(idxItem.level, 0)
|
||||||
hDec = SHARED.theme.getHeaderDecoration(iLevel)
|
hDec = SHARED.theme.getHeaderDecoration(iLevel)
|
||||||
@@ -691,7 +690,8 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
trItem.setData(self.C_MORE, QtDecoration, self._pMore)
|
trItem.setData(self.C_MORE, QtDecoration, self._pMore)
|
||||||
|
|
||||||
# Custom column
|
# Custom column
|
||||||
mW = int(self._lastColSize * self.viewport().width())
|
viewport = self.viewport()
|
||||||
|
mW = int(self._lastColSize * (viewport.width() if viewport else 100))
|
||||||
lastText, toolTip = self._getLastColumnText(tHandle, sTitle)
|
lastText, toolTip = self._getLastColumnText(tHandle, sTitle)
|
||||||
elideText = self.fontMetrics().elidedText(lastText, Qt.TextElideMode.ElideRight, mW)
|
elideText = self.fontMetrics().elidedText(lastText, Qt.TextElideMode.ElideRight, mW)
|
||||||
trItem.setText(self.C_EXTRA, elideText)
|
trItem.setText(self.C_EXTRA, elideText)
|
||||||
|
|||||||
+30
-39
@@ -78,7 +78,7 @@ class GuiOutlineView(QWidget):
|
|||||||
|
|
||||||
# Assemble
|
# Assemble
|
||||||
self.outerBox = QVBoxLayout()
|
self.outerBox = QVBoxLayout()
|
||||||
self.outerBox.setContentsMargins(0, 0, CONFIG.pxInt(4), 0)
|
self.outerBox.setContentsMargins(0, 0, 4, 0)
|
||||||
self.outerBox.addWidget(self.outlineBar)
|
self.outerBox.addWidget(self.outlineBar)
|
||||||
self.outerBox.addWidget(self.splitOutline)
|
self.outerBox.addWidget(self.splitOutline)
|
||||||
|
|
||||||
@@ -225,11 +225,11 @@ class GuiOutlineToolBar(QToolBar):
|
|||||||
self.novelLabel = NColourLabel(
|
self.novelLabel = NColourLabel(
|
||||||
self.tr("Outline of"), self, scale=NColourLabel.HEADER_SCALE, bold=True
|
self.tr("Outline of"), self, scale=NColourLabel.HEADER_SCALE, bold=True
|
||||||
)
|
)
|
||||||
self.novelLabel.setContentsMargins(0, 0, CONFIG.pxInt(12), 0)
|
self.novelLabel.setContentsMargins(0, 0, 12, 0)
|
||||||
|
|
||||||
self.novelValue = NovelSelector(self)
|
self.novelValue = NovelSelector(self)
|
||||||
self.novelValue.setIncludeAll(True)
|
self.novelValue.setIncludeAll(True)
|
||||||
self.novelValue.setMinimumWidth(CONFIG.pxInt(200))
|
self.novelValue.setMinimumWidth(200)
|
||||||
self.novelValue.novelSelectionChanged.connect(self._novelValueChanged)
|
self.novelValue.novelSelectionChanged.connect(self._novelValueChanged)
|
||||||
|
|
||||||
# Actions
|
# Actions
|
||||||
@@ -390,8 +390,8 @@ class GuiOutlineTree(QTreeWidget):
|
|||||||
self.setIconSize(SHARED.theme.baseIconSize)
|
self.setIconSize(SHARED.theme.baseIconSize)
|
||||||
self.setIndentation(0)
|
self.setIndentation(0)
|
||||||
|
|
||||||
self.treeHead = self.header()
|
if header := self.header():
|
||||||
self.treeHead.sectionMoved.connect(self._columnMoved)
|
header.sectionMoved.connect(self._columnMoved)
|
||||||
|
|
||||||
# Pre-Generate Tree Formatting
|
# Pre-Generate Tree Formatting
|
||||||
fH1 = self.font()
|
fH1 = self.font()
|
||||||
@@ -623,7 +623,7 @@ class GuiOutlineTree(QTreeWidget):
|
|||||||
continue
|
continue
|
||||||
tmpOrder.append(nwOutline[name])
|
tmpOrder.append(nwOutline[name])
|
||||||
tmpHidden[nwOutline[name]] = hidden
|
tmpHidden[nwOutline[name]] = hidden
|
||||||
tmpWidth[nwOutline[name]] = CONFIG.pxInt(width)
|
tmpWidth[nwOutline[name]] = width
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.error("Invalid column state")
|
logger.error("Invalid column state")
|
||||||
logException()
|
logException()
|
||||||
@@ -647,26 +647,22 @@ class GuiOutlineTree(QTreeWidget):
|
|||||||
save the current width of hidden columns though. This preserves
|
save the current width of hidden columns though. This preserves
|
||||||
the last known width in case they're unhidden again.
|
the last known width in case they're unhidden again.
|
||||||
"""
|
"""
|
||||||
# If we haven't built the tree, there is nothing to save.
|
if self._lastBuild > 0 and (header := self.header()):
|
||||||
if self._lastBuild == 0:
|
colState = {}
|
||||||
return
|
for iCol in range(self.columnCount()):
|
||||||
|
hItem = self._treeOrder[iCol]
|
||||||
colState = {}
|
iLog = header.logicalIndex(iCol)
|
||||||
for iCol in range(self.columnCount()):
|
logHidden = self.isColumnHidden(iLog)
|
||||||
hItem = self._treeOrder[iCol]
|
orgWidth = self._colWidth[hItem]
|
||||||
iLog = self.treeHead.logicalIndex(iCol)
|
logWidth = self.columnWidth(iLog)
|
||||||
logHidden = self.isColumnHidden(iLog)
|
colState[hItem.name] = [
|
||||||
orgWidth = CONFIG.rpxInt(self._colWidth[hItem])
|
logHidden, orgWidth if logHidden and logWidth == 0 else logWidth
|
||||||
logWidth = CONFIG.rpxInt(self.columnWidth(iLog))
|
]
|
||||||
colState[hItem.name] = [
|
|
||||||
logHidden, orgWidth if logHidden and logWidth == 0 else logWidth
|
|
||||||
]
|
|
||||||
|
|
||||||
logger.debug("Saving State: GuiOutline")
|
|
||||||
pOptions = SHARED.project.options
|
|
||||||
pOptions.setValue("GuiOutline", "columnState", colState)
|
|
||||||
pOptions.saveSettings()
|
|
||||||
|
|
||||||
|
logger.debug("Saving State: GuiOutline")
|
||||||
|
pOptions = SHARED.project.options
|
||||||
|
pOptions.setValue("GuiOutline", "columnState", colState)
|
||||||
|
pOptions.saveSettings()
|
||||||
return
|
return
|
||||||
|
|
||||||
def _populateTree(self, rootHandle: str | None) -> None:
|
def _populateTree(self, rootHandle: str | None) -> None:
|
||||||
@@ -819,8 +815,6 @@ class GuiOutlineDetails(QScrollArea):
|
|||||||
minTitle = 30*SHARED.theme.textNWidth
|
minTitle = 30*SHARED.theme.textNWidth
|
||||||
maxTitle = 40*SHARED.theme.textNWidth
|
maxTitle = 40*SHARED.theme.textNWidth
|
||||||
wCount = SHARED.theme.getTextWidth("999,999")
|
wCount = SHARED.theme.getTextWidth("999,999")
|
||||||
hSpace = int(CONFIG.pxInt(10))
|
|
||||||
vSpace = int(CONFIG.pxInt(4))
|
|
||||||
|
|
||||||
bFont = SHARED.theme.guiFontB
|
bFont = SHARED.theme.guiFontB
|
||||||
|
|
||||||
@@ -899,8 +893,8 @@ class GuiOutlineDetails(QScrollArea):
|
|||||||
|
|
||||||
self.mainForm.setColumnStretch(1, 1)
|
self.mainForm.setColumnStretch(1, 1)
|
||||||
self.mainForm.setRowStretch(4, 1)
|
self.mainForm.setRowStretch(4, 1)
|
||||||
self.mainForm.setHorizontalSpacing(hSpace)
|
self.mainForm.setHorizontalSpacing(10)
|
||||||
self.mainForm.setVerticalSpacing(vSpace)
|
self.mainForm.setVerticalSpacing(4)
|
||||||
|
|
||||||
# Selected Item Tags
|
# Selected Item Tags
|
||||||
self.tagsForm = QGridLayout()
|
self.tagsForm = QGridLayout()
|
||||||
@@ -923,8 +917,8 @@ class GuiOutlineDetails(QScrollArea):
|
|||||||
|
|
||||||
self.tagsForm.setColumnStretch(1, 1)
|
self.tagsForm.setColumnStretch(1, 1)
|
||||||
self.tagsForm.setRowStretch(len(self.tagValues), 1)
|
self.tagsForm.setRowStretch(len(self.tagValues), 1)
|
||||||
self.tagsForm.setHorizontalSpacing(hSpace)
|
self.tagsForm.setHorizontalSpacing(10)
|
||||||
self.tagsForm.setVerticalSpacing(vSpace)
|
self.tagsForm.setVerticalSpacing(4)
|
||||||
|
|
||||||
# Assemble
|
# Assemble
|
||||||
self.mainSplit = QSplitter(Qt.Orientation.Horizontal)
|
self.mainSplit = QSplitter(Qt.Orientation.Horizontal)
|
||||||
@@ -965,21 +959,18 @@ class GuiOutlineDetails(QScrollArea):
|
|||||||
width = parent.width() if isinstance(parent, QWidget) else 1000
|
width = parent.width() if isinstance(parent, QWidget) else 1000
|
||||||
pOptions = SHARED.project.options
|
pOptions = SHARED.project.options
|
||||||
self.mainSplit.setSizes([
|
self.mainSplit.setSizes([
|
||||||
CONFIG.pxInt(pOptions.getInt("GuiOutlineDetails", "detailsWidth", width//3)),
|
pOptions.getInt("GuiOutlineDetails", "detailsWidth", width//3),
|
||||||
CONFIG.pxInt(pOptions.getInt("GuiOutlineDetails", "tagsWidth", 2*width//3))
|
pOptions.getInt("GuiOutlineDetails", "tagsWidth", 2*width//3),
|
||||||
])
|
])
|
||||||
return
|
return
|
||||||
|
|
||||||
def saveGuiSettings(self) -> None:
|
def saveGuiSettings(self) -> None:
|
||||||
"""Run close project tasks."""
|
"""Run close project tasks."""
|
||||||
mainSplit = self.mainSplit.sizes()
|
|
||||||
detailsWidth = CONFIG.rpxInt(mainSplit[0])
|
|
||||||
tagsWidth = CONFIG.rpxInt(mainSplit[1])
|
|
||||||
|
|
||||||
logger.debug("Saving State: GuiOutlineDetails")
|
logger.debug("Saving State: GuiOutlineDetails")
|
||||||
|
mainSplit = self.mainSplit.sizes()
|
||||||
pOptions = SHARED.project.options
|
pOptions = SHARED.project.options
|
||||||
pOptions.setValue("GuiOutlineDetails", "detailsWidth", detailsWidth)
|
pOptions.setValue("GuiOutlineDetails", "detailsWidth", mainSplit[0])
|
||||||
pOptions.setValue("GuiOutlineDetails", "tagsWidth", tagsWidth)
|
pOptions.setValue("GuiOutlineDetails", "tagsWidth", mainSplit[1])
|
||||||
return
|
return
|
||||||
|
|
||||||
def clearDetails(self) -> None:
|
def clearDetails(self) -> None:
|
||||||
|
|||||||
+60
-56
@@ -40,7 +40,7 @@ from PyQt6.QtWidgets import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.common import qtLambda
|
from novelwriter.common import qtAddAction, qtAddMenu, qtLambda
|
||||||
from novelwriter.constants import nwLabels, nwStyles, nwUnicode, trConst
|
from novelwriter.constants import nwLabels, nwStyles, nwUnicode, trConst
|
||||||
from novelwriter.core.coretools import DocDuplicator, DocMerger, DocSplitter
|
from novelwriter.core.coretools import DocDuplicator, DocMerger, DocSplitter
|
||||||
from novelwriter.core.item import NWItem
|
from novelwriter.core.item import NWItem
|
||||||
@@ -243,7 +243,6 @@ class GuiProjectToolBar(QWidget):
|
|||||||
self.projTree = projView.projTree
|
self.projTree = projView.projTree
|
||||||
|
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
mPx = CONFIG.pxInt(2)
|
|
||||||
|
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
self.setAutoFillBackground(True)
|
self.setAutoFillBackground(True)
|
||||||
@@ -274,27 +273,27 @@ class GuiProjectToolBar(QWidget):
|
|||||||
# Add Item Menu
|
# Add Item Menu
|
||||||
self.mAdd = QMenu(self)
|
self.mAdd = QMenu(self)
|
||||||
|
|
||||||
self.aAddEmpty = self.mAdd.addAction(trConst(nwLabels.ITEM_DESCRIPTION["document"]))
|
self.aAddEmpty = qtAddAction(self.mAdd, trConst(nwLabels.ITEM_DESCRIPTION["document"]))
|
||||||
self.aAddEmpty.triggered.connect(
|
self.aAddEmpty.triggered.connect(
|
||||||
qtLambda(self.projTree.newTreeItem, nwItemType.FILE, hLevel=0, isNote=False)
|
qtLambda(self.projTree.newTreeItem, nwItemType.FILE, hLevel=0, isNote=False)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.aAddChap = self.mAdd.addAction(trConst(nwLabels.ITEM_DESCRIPTION["doc_h2"]))
|
self.aAddChap = qtAddAction(self.mAdd, trConst(nwLabels.ITEM_DESCRIPTION["doc_h2"]))
|
||||||
self.aAddChap.triggered.connect(
|
self.aAddChap.triggered.connect(
|
||||||
qtLambda(self.projTree.newTreeItem, nwItemType.FILE, hLevel=2, isNote=False)
|
qtLambda(self.projTree.newTreeItem, nwItemType.FILE, hLevel=2, isNote=False)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.aAddScene = self.mAdd.addAction(trConst(nwLabels.ITEM_DESCRIPTION["doc_h3"]))
|
self.aAddScene = qtAddAction(self.mAdd, trConst(nwLabels.ITEM_DESCRIPTION["doc_h3"]))
|
||||||
self.aAddScene.triggered.connect(
|
self.aAddScene.triggered.connect(
|
||||||
qtLambda(self.projTree.newTreeItem, nwItemType.FILE, hLevel=3, isNote=False)
|
qtLambda(self.projTree.newTreeItem, nwItemType.FILE, hLevel=3, isNote=False)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.aAddNote = self.mAdd.addAction(trConst(nwLabels.ITEM_DESCRIPTION["note"]))
|
self.aAddNote = qtAddAction(self.mAdd, trConst(nwLabels.ITEM_DESCRIPTION["note"]))
|
||||||
self.aAddNote.triggered.connect(
|
self.aAddNote.triggered.connect(
|
||||||
qtLambda(self.projTree.newTreeItem, nwItemType.FILE, hLevel=1, isNote=True)
|
qtLambda(self.projTree.newTreeItem, nwItemType.FILE, hLevel=1, isNote=True)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.aAddFolder = self.mAdd.addAction(trConst(nwLabels.ITEM_DESCRIPTION["folder"]))
|
self.aAddFolder = qtAddAction(self.mAdd, trConst(nwLabels.ITEM_DESCRIPTION["folder"]))
|
||||||
self.aAddFolder.triggered.connect(
|
self.aAddFolder.triggered.connect(
|
||||||
qtLambda(self.projTree.newTreeItem, nwItemType.FOLDER)
|
qtLambda(self.projTree.newTreeItem, nwItemType.FOLDER)
|
||||||
)
|
)
|
||||||
@@ -304,7 +303,7 @@ class GuiProjectToolBar(QWidget):
|
|||||||
self.mTemplates.menuItemTriggered.connect(lambda h: self.newDocumentFromTemplate.emit(h))
|
self.mTemplates.menuItemTriggered.connect(lambda h: self.newDocumentFromTemplate.emit(h))
|
||||||
self.mAdd.addMenu(self.mTemplates)
|
self.mAdd.addMenu(self.mTemplates)
|
||||||
|
|
||||||
self.mAddRoot = self.mAdd.addMenu(trConst(nwLabels.ITEM_DESCRIPTION["root"]))
|
self.mAddRoot = qtAddMenu(self.mAdd, trConst(nwLabels.ITEM_DESCRIPTION["root"]))
|
||||||
self._buildRootMenu()
|
self._buildRootMenu()
|
||||||
|
|
||||||
self.tbAdd = NIconToolButton(self, iSz)
|
self.tbAdd = NIconToolButton(self, iSz)
|
||||||
@@ -315,13 +314,13 @@ class GuiProjectToolBar(QWidget):
|
|||||||
# More Options Menu
|
# More Options Menu
|
||||||
self.mMore = QMenu(self)
|
self.mMore = QMenu(self)
|
||||||
|
|
||||||
self.aExpand = self.mMore.addAction(self.tr("Expand All"))
|
self.aExpand = qtAddAction(self.mMore, self.tr("Expand All"))
|
||||||
self.aExpand.triggered.connect(self.projTree.expandAll)
|
self.aExpand.triggered.connect(self.projTree.expandAll)
|
||||||
|
|
||||||
self.aCollapse = self.mMore.addAction(self.tr("Collapse All"))
|
self.aCollapse = qtAddAction(self.mMore, self.tr("Collapse All"))
|
||||||
self.aCollapse.triggered.connect(self.projTree.collapseAll)
|
self.aCollapse.triggered.connect(self.projTree.collapseAll)
|
||||||
|
|
||||||
self.aEmptyTrash = self.mMore.addAction(self.tr("Empty Trash"))
|
self.aEmptyTrash = qtAddAction(self.mMore, self.tr("Empty Trash"))
|
||||||
self.aEmptyTrash.triggered.connect(self.projTree.emptyTrash)
|
self.aEmptyTrash.triggered.connect(self.projTree.emptyTrash)
|
||||||
|
|
||||||
self.tbMore = NIconToolButton(self, iSz)
|
self.tbMore = NIconToolButton(self, iSz)
|
||||||
@@ -336,7 +335,7 @@ class GuiProjectToolBar(QWidget):
|
|||||||
self.outerBox.addWidget(self.tbMoveD)
|
self.outerBox.addWidget(self.tbMoveD)
|
||||||
self.outerBox.addWidget(self.tbAdd)
|
self.outerBox.addWidget(self.tbAdd)
|
||||||
self.outerBox.addWidget(self.tbMore)
|
self.outerBox.addWidget(self.tbMore)
|
||||||
self.outerBox.setContentsMargins(mPx, mPx, 0, mPx)
|
self.outerBox.setContentsMargins(2, 2, 0, 2)
|
||||||
self.outerBox.setSpacing(0)
|
self.outerBox.setSpacing(0)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
@@ -392,7 +391,7 @@ class GuiProjectToolBar(QWidget):
|
|||||||
logger.debug("Rebuilding quick links menu")
|
logger.debug("Rebuilding quick links menu")
|
||||||
self.mQuick.clear()
|
self.mQuick.clear()
|
||||||
for tHandle, nwItem in SHARED.project.tree.iterRoots(None):
|
for tHandle, nwItem in SHARED.project.tree.iterRoots(None):
|
||||||
action = self.mQuick.addAction(nwItem.itemName)
|
action = qtAddAction(self.mQuick, nwItem.itemName)
|
||||||
action.setData(tHandle)
|
action.setData(tHandle)
|
||||||
action.setIcon(SHARED.theme.getIcon(nwLabels.CLASS_ICON[nwItem.itemClass], "root"))
|
action.setIcon(SHARED.theme.getIcon(nwLabels.CLASS_ICON[nwItem.itemClass], "root"))
|
||||||
action.triggered.connect(
|
action.triggered.connect(
|
||||||
@@ -440,7 +439,7 @@ class GuiProjectToolBar(QWidget):
|
|||||||
def _buildRootMenu(self) -> None:
|
def _buildRootMenu(self) -> None:
|
||||||
"""Build the rood folder menu."""
|
"""Build the rood folder menu."""
|
||||||
def addClass(itemClass: nwItemClass) -> None:
|
def addClass(itemClass: nwItemClass) -> None:
|
||||||
aNew = self.mAddRoot.addAction(trConst(nwLabels.CLASS_NAME[itemClass]))
|
aNew = qtAddAction(self.mAddRoot, trConst(nwLabels.CLASS_NAME[itemClass]))
|
||||||
aNew.setIcon(SHARED.theme.getIcon(nwLabels.CLASS_ICON[itemClass], "root"))
|
aNew.setIcon(SHARED.theme.getIcon(nwLabels.CLASS_ICON[itemClass], "root"))
|
||||||
aNew.triggered.connect(
|
aNew.triggered.connect(
|
||||||
qtLambda(self.projTree.newTreeItem, nwItemType.ROOT, itemClass)
|
qtLambda(self.projTree.newTreeItem, nwItemType.ROOT, itemClass)
|
||||||
@@ -561,17 +560,16 @@ class GuiProjectTree(QTreeView):
|
|||||||
|
|
||||||
# Lock the column sizes
|
# Lock the column sizes
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
cMg = CONFIG.pxInt(6)
|
|
||||||
|
|
||||||
treeHeader = self.header()
|
if header := self.header():
|
||||||
treeHeader.setStretchLastSection(False)
|
header.setStretchLastSection(False)
|
||||||
treeHeader.setMinimumSectionSize(iPx + cMg)
|
header.setMinimumSectionSize(iPx + 6)
|
||||||
treeHeader.setSectionResizeMode(ProjectNode.C_NAME, QtHeaderStretch)
|
header.setSectionResizeMode(ProjectNode.C_NAME, QtHeaderStretch)
|
||||||
treeHeader.setSectionResizeMode(ProjectNode.C_COUNT, QtHeaderToContents)
|
header.setSectionResizeMode(ProjectNode.C_COUNT, QtHeaderToContents)
|
||||||
treeHeader.setSectionResizeMode(ProjectNode.C_ACTIVE, QtHeaderFixed)
|
header.setSectionResizeMode(ProjectNode.C_ACTIVE, QtHeaderFixed)
|
||||||
treeHeader.setSectionResizeMode(ProjectNode.C_STATUS, QtHeaderFixed)
|
header.setSectionResizeMode(ProjectNode.C_STATUS, QtHeaderFixed)
|
||||||
treeHeader.resizeSection(ProjectNode.C_ACTIVE, iPx + cMg)
|
header.resizeSection(ProjectNode.C_ACTIVE, iPx + 6)
|
||||||
treeHeader.resizeSection(ProjectNode.C_STATUS, iPx + cMg)
|
header.resizeSection(ProjectNode.C_STATUS, iPx + 6)
|
||||||
|
|
||||||
self.restoreExpandedState()
|
self.restoreExpandedState()
|
||||||
|
|
||||||
@@ -969,8 +967,9 @@ class GuiProjectTree(QTreeView):
|
|||||||
else:
|
else:
|
||||||
ctxMenu.buildSingleSelectMenu()
|
ctxMenu.buildSingleSelectMenu()
|
||||||
|
|
||||||
ctxMenu.exec(self.viewport().mapToGlobal(point))
|
if viewport := self.viewport():
|
||||||
ctxMenu.deleteLater()
|
ctxMenu.exec(viewport.mapToGlobal(point))
|
||||||
|
ctxMenu.deleteLater()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -1091,7 +1090,8 @@ class _UpdatableMenu(QMenu):
|
|||||||
|
|
||||||
def setActionsVisible(self, value: bool) -> None:
|
def setActionsVisible(self, value: bool) -> None:
|
||||||
"""Set the visibility of root action."""
|
"""Set the visibility of root action."""
|
||||||
self.menuAction().setVisible(value)
|
if action := self.menuAction():
|
||||||
|
action.setVisible(value)
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -1135,7 +1135,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
|
|
||||||
def buildTrashMenu(self) -> None:
|
def buildTrashMenu(self) -> None:
|
||||||
"""Build the special menu for the Trash folder."""
|
"""Build the special menu for the Trash folder."""
|
||||||
action = self.addAction(self.tr("Empty Trash"))
|
action = qtAddAction(self, self.tr("Empty Trash"))
|
||||||
action.triggered.connect(self._tree.emptyTrash)
|
action.triggered.connect(self._tree.emptyTrash)
|
||||||
if self._children:
|
if self._children:
|
||||||
self._expandCollapse()
|
self._expandCollapse()
|
||||||
@@ -1156,7 +1156,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
self.addSeparator()
|
self.addSeparator()
|
||||||
|
|
||||||
# Edit Item Settings
|
# Edit Item Settings
|
||||||
action = self.addAction(self.tr("Rename"))
|
action = qtAddAction(self, self.tr("Rename"))
|
||||||
action.triggered.connect(qtLambda(self._view.renameTreeItem, self._handle))
|
action.triggered.connect(qtLambda(self._view.renameTreeItem, self._handle))
|
||||||
if isFile:
|
if isFile:
|
||||||
self._itemHeader()
|
self._itemHeader()
|
||||||
@@ -1171,7 +1171,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
# Process Item
|
# Process Item
|
||||||
if self._children:
|
if self._children:
|
||||||
self._expandCollapse()
|
self._expandCollapse()
|
||||||
action = self.addAction(self.tr("Duplicate"))
|
action = qtAddAction(self, self.tr("Duplicate"))
|
||||||
action.triggered.connect(qtLambda(self._tree.duplicateFromHandle, self._handle))
|
action.triggered.connect(qtLambda(self._tree.duplicateFromHandle, self._handle))
|
||||||
self._deleteOrTrash()
|
self._deleteOrTrash()
|
||||||
|
|
||||||
@@ -1191,12 +1191,12 @@ class _TreeContextMenu(QMenu):
|
|||||||
|
|
||||||
def _docActions(self) -> None:
|
def _docActions(self) -> None:
|
||||||
"""Add document actions."""
|
"""Add document actions."""
|
||||||
action = self.addAction(self.tr("Open Document"))
|
action = qtAddAction(self, self.tr("Open Document"))
|
||||||
action.triggered.connect(qtLambda(
|
action.triggered.connect(qtLambda(
|
||||||
self._view.openDocumentRequest.emit,
|
self._view.openDocumentRequest.emit,
|
||||||
self._handle, nwDocMode.EDIT, "", True
|
self._handle, nwDocMode.EDIT, "", True
|
||||||
))
|
))
|
||||||
action = self.addAction(self.tr("View Document"))
|
action = qtAddAction(self, self.tr("View Document"))
|
||||||
action.triggered.connect(qtLambda(
|
action.triggered.connect(qtLambda(
|
||||||
self._view.openDocumentRequest.emit,
|
self._view.openDocumentRequest.emit,
|
||||||
self._handle, nwDocMode.VIEW, "", False
|
self._handle, nwDocMode.VIEW, "", False
|
||||||
@@ -1205,7 +1205,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
|
|
||||||
def _itemCreation(self) -> None:
|
def _itemCreation(self) -> None:
|
||||||
"""Add create item actions."""
|
"""Add create item actions."""
|
||||||
menu = self.addMenu(self.tr("Create New ..."))
|
menu = qtAddMenu(self, self.tr("Create New ..."))
|
||||||
menu.addAction(self._view.projBar.aAddEmpty)
|
menu.addAction(self._view.projBar.aAddEmpty)
|
||||||
menu.addAction(self._view.projBar.aAddChap)
|
menu.addAction(self._view.projBar.aAddChap)
|
||||||
menu.addAction(self._view.projBar.aAddScene)
|
menu.addAction(self._view.projBar.aAddScene)
|
||||||
@@ -1217,7 +1217,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
"""Check if there is a header that can be used for rename."""
|
"""Check if there is a header that can be used for rename."""
|
||||||
SHARED.saveEditor()
|
SHARED.saveEditor()
|
||||||
if hItem := SHARED.project.index.getItemHeading(self._handle, "T0001"):
|
if hItem := SHARED.project.index.getItemHeading(self._handle, "T0001"):
|
||||||
action = self.addAction(self.tr("Rename to Heading"))
|
action = qtAddAction(self, self.tr("Rename to Heading"))
|
||||||
action.triggered.connect(
|
action.triggered.connect(
|
||||||
qtLambda(self._view.renameTreeItem, self._handle, hItem.title)
|
qtLambda(self._view.renameTreeItem, self._handle, hItem.title)
|
||||||
)
|
)
|
||||||
@@ -1226,50 +1226,54 @@ class _TreeContextMenu(QMenu):
|
|||||||
def _itemActive(self) -> None:
|
def _itemActive(self) -> None:
|
||||||
"""Add Active/Inactive actions."""
|
"""Add Active/Inactive actions."""
|
||||||
if len(self._indices) > 1:
|
if len(self._indices) > 1:
|
||||||
mSub = self.addMenu(self.tr("Set Active to ..."))
|
mSub = qtAddMenu(self, self.tr("Set Active to ..."))
|
||||||
aOne = mSub.addAction(SHARED.theme.getIcon("checked"), self._tree.trActive)
|
aOne = qtAddAction(mSub, self._tree.trActive)
|
||||||
|
aOne.setIcon(SHARED.theme.getIcon("checked"))
|
||||||
aOne.triggered.connect(qtLambda(self._iterItemActive, True))
|
aOne.triggered.connect(qtLambda(self._iterItemActive, True))
|
||||||
aTwo = mSub.addAction(SHARED.theme.getIcon("unchecked"), self._tree.trInactive)
|
aTwo = qtAddAction(mSub, self._tree.trInactive)
|
||||||
|
aTwo.setIcon(SHARED.theme.getIcon("unchecked"))
|
||||||
aTwo.triggered.connect(qtLambda(self._iterItemActive, False))
|
aTwo.triggered.connect(qtLambda(self._iterItemActive, False))
|
||||||
else:
|
else:
|
||||||
action = self.addAction(self.tr("Toggle Active"))
|
action = qtAddAction(self, self.tr("Toggle Active"))
|
||||||
action.triggered.connect(self._toggleItemActive)
|
action.triggered.connect(self._toggleItemActive)
|
||||||
return
|
return
|
||||||
|
|
||||||
def _itemStatusImport(self, multi: bool) -> None:
|
def _itemStatusImport(self, multi: bool) -> None:
|
||||||
"""Add actions for changing status or importance."""
|
"""Add actions for changing status or importance."""
|
||||||
if self._item.isNovelLike():
|
if self._item.isNovelLike():
|
||||||
menu = self.addMenu(self.tr("Set Status to ..."))
|
menu = qtAddMenu(self, self.tr("Set Status to ..."))
|
||||||
current = self._item.itemStatus
|
current = self._item.itemStatus
|
||||||
for key, entry in SHARED.project.data.itemStatus.iterItems():
|
for key, entry in SHARED.project.data.itemStatus.iterItems():
|
||||||
name = entry.name
|
name = entry.name
|
||||||
if not multi and current == key:
|
if not multi and current == key:
|
||||||
name += f" ({nwUnicode.U_CHECK})"
|
name += f" ({nwUnicode.U_CHECK})"
|
||||||
action = menu.addAction(entry.icon, name)
|
action = qtAddAction(menu, name)
|
||||||
|
action.setIcon(entry.icon)
|
||||||
if multi:
|
if multi:
|
||||||
action.triggered.connect(qtLambda(self._iterSetItemStatus, key))
|
action.triggered.connect(qtLambda(self._iterSetItemStatus, key))
|
||||||
else:
|
else:
|
||||||
action.triggered.connect(qtLambda(self._changeItemStatus, key))
|
action.triggered.connect(qtLambda(self._changeItemStatus, key))
|
||||||
menu.addSeparator()
|
menu.addSeparator()
|
||||||
action = menu.addAction(self.tr("Manage Labels ..."))
|
action = qtAddAction(menu, self.tr("Manage Labels ..."))
|
||||||
action.triggered.connect(qtLambda(
|
action.triggered.connect(qtLambda(
|
||||||
self._view.projectSettingsRequest.emit,
|
self._view.projectSettingsRequest.emit,
|
||||||
GuiProjectSettings.PAGE_STATUS
|
GuiProjectSettings.PAGE_STATUS
|
||||||
))
|
))
|
||||||
else:
|
else:
|
||||||
menu = self.addMenu(self.tr("Set Importance to ..."))
|
menu = qtAddMenu(self, self.tr("Set Importance to ..."))
|
||||||
current = self._item.itemImport
|
current = self._item.itemImport
|
||||||
for key, entry in SHARED.project.data.itemImport.iterItems():
|
for key, entry in SHARED.project.data.itemImport.iterItems():
|
||||||
name = entry.name
|
name = entry.name
|
||||||
if not multi and current == key:
|
if not multi and current == key:
|
||||||
name += f" ({nwUnicode.U_CHECK})"
|
name += f" ({nwUnicode.U_CHECK})"
|
||||||
action = menu.addAction(entry.icon, name)
|
action = qtAddAction(menu, name)
|
||||||
|
action.setIcon(entry.icon)
|
||||||
if multi:
|
if multi:
|
||||||
action.triggered.connect(qtLambda(self._iterSetItemImport, key))
|
action.triggered.connect(qtLambda(self._iterSetItemImport, key))
|
||||||
else:
|
else:
|
||||||
action.triggered.connect(qtLambda(self._changeItemImport, key))
|
action.triggered.connect(qtLambda(self._changeItemImport, key))
|
||||||
menu.addSeparator()
|
menu.addSeparator()
|
||||||
action = menu.addAction(self.tr("Manage Labels ..."))
|
action = qtAddAction(menu, self.tr("Manage Labels ..."))
|
||||||
action.triggered.connect(qtLambda(
|
action.triggered.connect(qtLambda(
|
||||||
self._view.projectSettingsRequest.emit,
|
self._view.projectSettingsRequest.emit,
|
||||||
GuiProjectSettings.PAGE_IMPORT
|
GuiProjectSettings.PAGE_IMPORT
|
||||||
@@ -1278,7 +1282,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
|
|
||||||
def _itemTransform(self, isFile: bool, isFolder: bool) -> None:
|
def _itemTransform(self, isFile: bool, isFolder: bool) -> None:
|
||||||
"""Add actions for the Transform menu."""
|
"""Add actions for the Transform menu."""
|
||||||
menu = self.addMenu(self.tr("Transform ..."))
|
menu = qtAddMenu(self, self.tr("Transform ..."))
|
||||||
|
|
||||||
trDoc = trConst(nwLabels.LAYOUT_NAME[nwItemLayout.DOCUMENT])
|
trDoc = trConst(nwLabels.LAYOUT_NAME[nwItemLayout.DOCUMENT])
|
||||||
trNote = trConst(nwLabels.LAYOUT_NAME[nwItemLayout.NOTE])
|
trNote = trConst(nwLabels.LAYOUT_NAME[nwItemLayout.NOTE])
|
||||||
@@ -1288,42 +1292,42 @@ class _TreeContextMenu(QMenu):
|
|||||||
isNoteFile = isFile and self._item.isNoteLayout()
|
isNoteFile = isFile and self._item.isNoteLayout()
|
||||||
|
|
||||||
if isNoteFile and self._item.documentAllowed():
|
if isNoteFile and self._item.documentAllowed():
|
||||||
action = menu.addAction(self.tr("Convert to {0}").format(trDoc))
|
action = qtAddAction(menu, self.tr("Convert to {0}").format(trDoc))
|
||||||
action.triggered.connect(qtLambda(self._changeItemLayout, loDoc))
|
action.triggered.connect(qtLambda(self._changeItemLayout, loDoc))
|
||||||
|
|
||||||
if isDocFile:
|
if isDocFile:
|
||||||
action = menu.addAction(self.tr("Convert to {0}").format(trNote))
|
action = qtAddAction(menu, self.tr("Convert to {0}").format(trNote))
|
||||||
action.triggered.connect(qtLambda(self._changeItemLayout, loNote))
|
action.triggered.connect(qtLambda(self._changeItemLayout, loNote))
|
||||||
|
|
||||||
if isFolder and self._item.documentAllowed():
|
if isFolder and self._item.documentAllowed():
|
||||||
action = menu.addAction(self.tr("Convert to {0}").format(trDoc))
|
action = qtAddAction(menu, self.tr("Convert to {0}").format(trDoc))
|
||||||
action.triggered.connect(qtLambda(self._convertFolderToFile, loDoc))
|
action.triggered.connect(qtLambda(self._convertFolderToFile, loDoc))
|
||||||
|
|
||||||
if isFolder:
|
if isFolder:
|
||||||
action = menu.addAction(self.tr("Convert to {0}").format(trNote))
|
action = qtAddAction(menu, self.tr("Convert to {0}").format(trNote))
|
||||||
action.triggered.connect(qtLambda(self._convertFolderToFile, loNote))
|
action.triggered.connect(qtLambda(self._convertFolderToFile, loNote))
|
||||||
|
|
||||||
if self._children and isFile:
|
if self._children and isFile:
|
||||||
action = menu.addAction(self.tr("Merge Child Items into Self"))
|
action = qtAddAction(menu, self.tr("Merge Child Items into Self"))
|
||||||
action.triggered.connect(qtLambda(self._tree.mergeDocuments, self._handle, False))
|
action.triggered.connect(qtLambda(self._tree.mergeDocuments, self._handle, False))
|
||||||
action = menu.addAction(self.tr("Merge Child Items into New"))
|
action = qtAddAction(menu, self.tr("Merge Child Items into New"))
|
||||||
action.triggered.connect(qtLambda(self._tree.mergeDocuments, self._handle, True))
|
action.triggered.connect(qtLambda(self._tree.mergeDocuments, self._handle, True))
|
||||||
|
|
||||||
if self._children and isFolder:
|
if self._children and isFolder:
|
||||||
action = menu.addAction(self.tr("Merge Documents in Folder"))
|
action = qtAddAction(menu, self.tr("Merge Documents in Folder"))
|
||||||
action.triggered.connect(qtLambda(self._tree.mergeDocuments, self._handle, True))
|
action.triggered.connect(qtLambda(self._tree.mergeDocuments, self._handle, True))
|
||||||
|
|
||||||
if isFile:
|
if isFile:
|
||||||
action = menu.addAction(self.tr("Split Document by Headings"))
|
action = qtAddAction(menu, self.tr("Split Document by Headings"))
|
||||||
action.triggered.connect(qtLambda(self._tree.splitDocument, self._handle))
|
action.triggered.connect(qtLambda(self._tree.splitDocument, self._handle))
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def _expandCollapse(self) -> None:
|
def _expandCollapse(self) -> None:
|
||||||
"""Add actions for expand and collapse."""
|
"""Add actions for expand and collapse."""
|
||||||
action = self.addAction(self.tr("Expand All"))
|
action = qtAddAction(self, self.tr("Expand All"))
|
||||||
action.triggered.connect(qtLambda(self._tree.expandFromIndex, self._indices[0]))
|
action.triggered.connect(qtLambda(self._tree.expandFromIndex, self._indices[0]))
|
||||||
action = self.addAction(self.tr("Collapse All"))
|
action = qtAddAction(self, self.tr("Collapse All"))
|
||||||
action.triggered.connect(qtLambda(self._tree.collapseFromIndex, self._indices[0]))
|
action.triggered.connect(qtLambda(self._tree.collapseFromIndex, self._indices[0]))
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -1336,7 +1340,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
text = self.tr("Delete Permanently")
|
text = self.tr("Delete Permanently")
|
||||||
else:
|
else:
|
||||||
text = self.tr("Move to Trash")
|
text = self.tr("Move to Trash")
|
||||||
action = self.addAction(text)
|
action = qtAddAction(self, text)
|
||||||
action.triggered.connect(self._tree.processDeleteRequest)
|
action.triggered.connect(self._tree.processDeleteRequest)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
+18
-22
@@ -28,14 +28,14 @@ import logging
|
|||||||
from time import time
|
from time import time
|
||||||
|
|
||||||
from PyQt6.QtCore import Qt, pyqtSignal, pyqtSlot
|
from PyQt6.QtCore import Qt, pyqtSignal, pyqtSlot
|
||||||
from PyQt6.QtGui import QCursor, QKeyEvent
|
from PyQt6.QtGui import QAction, QCursor, QKeyEvent
|
||||||
from PyQt6.QtWidgets import (
|
from PyQt6.QtWidgets import (
|
||||||
QApplication, QFrame, QHBoxLayout, QLabel, QLineEdit, QToolBar,
|
QApplication, QFrame, QHBoxLayout, QLabel, QLineEdit, QToolBar,
|
||||||
QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget
|
QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget
|
||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.common import checkInt, cssCol
|
from novelwriter.common import checkInt, cssCol, qtAddAction
|
||||||
from novelwriter.core.coretools import DocSearch
|
from novelwriter.core.coretools import DocSearch
|
||||||
from novelwriter.core.item import NWItem
|
from novelwriter.core.item import NWItem
|
||||||
from novelwriter.types import (
|
from novelwriter.types import (
|
||||||
@@ -65,8 +65,6 @@ class GuiProjectSearch(QWidget):
|
|||||||
|
|
||||||
iPx = SHARED.theme.baseIconHeight
|
iPx = SHARED.theme.baseIconHeight
|
||||||
iSz = SHARED.theme.baseIconSize
|
iSz = SHARED.theme.baseIconSize
|
||||||
mPx = CONFIG.pxInt(2)
|
|
||||||
tPx = CONFIG.pxInt(4)
|
|
||||||
|
|
||||||
self._time = time()
|
self._time = time()
|
||||||
self._search = DocSearch()
|
self._search = DocSearch()
|
||||||
@@ -76,7 +74,7 @@ class GuiProjectSearch(QWidget):
|
|||||||
# Header
|
# Header
|
||||||
self.viewLabel = QLabel(self.tr("Project Search"), self)
|
self.viewLabel = QLabel(self.tr("Project Search"), self)
|
||||||
self.viewLabel.setFont(SHARED.theme.guiFontB)
|
self.viewLabel.setFont(SHARED.theme.guiFontB)
|
||||||
self.viewLabel.setContentsMargins(mPx, tPx, 0, mPx)
|
self.viewLabel.setContentsMargins(2, 4, 0, 2)
|
||||||
|
|
||||||
# Options
|
# Options
|
||||||
self.searchOpt = QToolBar(self)
|
self.searchOpt = QToolBar(self)
|
||||||
@@ -84,30 +82,30 @@ class GuiProjectSearch(QWidget):
|
|||||||
self.searchOpt.setIconSize(iSz)
|
self.searchOpt.setIconSize(iSz)
|
||||||
self.searchOpt.setContentsMargins(0, 0, 0, 0)
|
self.searchOpt.setContentsMargins(0, 0, 0, 0)
|
||||||
|
|
||||||
self.toggleCase = self.searchOpt.addAction(self.tr("Case Sensitive"))
|
self.toggleCase = qtAddAction(self.searchOpt, self.tr("Case Sensitive"))
|
||||||
self.toggleCase.setCheckable(True)
|
self.toggleCase.setCheckable(True)
|
||||||
self.toggleCase.setChecked(CONFIG.searchProjCase)
|
self.toggleCase.setChecked(CONFIG.searchProjCase)
|
||||||
self.toggleCase.toggled.connect(self._toggleCase)
|
self.toggleCase.toggled.connect(self._toggleCase)
|
||||||
|
|
||||||
self.toggleWord = self.searchOpt.addAction(self.tr("Whole Words Only"))
|
self.toggleWord = qtAddAction(self.searchOpt, self.tr("Whole Words Only"))
|
||||||
self.toggleWord.setCheckable(True)
|
self.toggleWord.setCheckable(True)
|
||||||
self.toggleWord.setChecked(CONFIG.searchProjWord)
|
self.toggleWord.setChecked(CONFIG.searchProjWord)
|
||||||
self.toggleWord.toggled.connect(self._toggleWord)
|
self.toggleWord.toggled.connect(self._toggleWord)
|
||||||
|
|
||||||
self.toggleRegEx = self.searchOpt.addAction(self.tr("RegEx Mode"))
|
self.toggleRegEx = qtAddAction(self.searchOpt, self.tr("RegEx Mode"))
|
||||||
self.toggleRegEx.setCheckable(True)
|
self.toggleRegEx.setCheckable(True)
|
||||||
self.toggleRegEx.setChecked(CONFIG.searchProjRegEx)
|
self.toggleRegEx.setChecked(CONFIG.searchProjRegEx)
|
||||||
self.toggleRegEx.toggled.connect(self._toggleRegEx)
|
self.toggleRegEx.toggled.connect(self._toggleRegEx)
|
||||||
|
|
||||||
# Search Box
|
# Search Box
|
||||||
|
self.searchAction = QAction("", self)
|
||||||
|
self.searchAction.setIcon(SHARED.theme.getIcon("search", "blue"))
|
||||||
|
self.searchAction.triggered.connect(self._processSearch)
|
||||||
|
|
||||||
self.searchText = QLineEdit(self)
|
self.searchText = QLineEdit(self)
|
||||||
self.searchText.setPlaceholderText(self.tr("Search for"))
|
self.searchText.setPlaceholderText(self.tr("Search for"))
|
||||||
self.searchText.setClearButtonEnabled(True)
|
self.searchText.setClearButtonEnabled(True)
|
||||||
|
self.searchText.addAction(self.searchAction, QLineEdit.ActionPosition.TrailingPosition)
|
||||||
self.searchAction = self.searchText.addAction(
|
|
||||||
SHARED.theme.getIcon("search", "blue"), QLineEdit.ActionPosition.TrailingPosition
|
|
||||||
)
|
|
||||||
self.searchAction.triggered.connect(self._processSearch)
|
|
||||||
|
|
||||||
# Search Result
|
# Search Result
|
||||||
self.searchResult = QTreeWidget(self)
|
self.searchResult = QTreeWidget(self)
|
||||||
@@ -121,10 +119,10 @@ class GuiProjectSearch(QWidget):
|
|||||||
self.searchResult.itemDoubleClicked.connect(self._searchResultDoubleClicked)
|
self.searchResult.itemDoubleClicked.connect(self._searchResultDoubleClicked)
|
||||||
self.searchResult.itemSelectionChanged.connect(self._searchResultSelected)
|
self.searchResult.itemSelectionChanged.connect(self._searchResultSelected)
|
||||||
|
|
||||||
treeHeader = self.searchResult.header()
|
if header := self.searchResult.header():
|
||||||
treeHeader.setStretchLastSection(False)
|
header.setStretchLastSection(False)
|
||||||
treeHeader.setSectionResizeMode(self.C_NAME, QtHeaderStretch)
|
header.setSectionResizeMode(self.C_NAME, QtHeaderStretch)
|
||||||
treeHeader.setSectionResizeMode(self.C_COUNT, QtHeaderToContents)
|
header.setSectionResizeMode(self.C_COUNT, QtHeaderToContents)
|
||||||
|
|
||||||
# Assemble
|
# Assemble
|
||||||
self.headerBox = QHBoxLayout()
|
self.headerBox = QHBoxLayout()
|
||||||
@@ -138,7 +136,7 @@ class GuiProjectSearch(QWidget):
|
|||||||
self.outerBox.addWidget(self.searchText, 0)
|
self.outerBox.addWidget(self.searchText, 0)
|
||||||
self.outerBox.addWidget(self.searchResult, 1)
|
self.outerBox.addWidget(self.searchResult, 1)
|
||||||
self.outerBox.setContentsMargins(0, 0, 0, 0)
|
self.outerBox.setContentsMargins(0, 0, 0, 0)
|
||||||
self.outerBox.setSpacing(mPx)
|
self.outerBox.setSpacing(2)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
self.updateTheme()
|
self.updateTheme()
|
||||||
@@ -153,8 +151,6 @@ class GuiProjectSearch(QWidget):
|
|||||||
|
|
||||||
def updateTheme(self) -> None:
|
def updateTheme(self) -> None:
|
||||||
"""Update theme elements."""
|
"""Update theme elements."""
|
||||||
bPx = CONFIG.pxInt(1)
|
|
||||||
mPx = CONFIG.pxInt(2)
|
|
||||||
|
|
||||||
qPalette = self.palette()
|
qPalette = self.palette()
|
||||||
colBase = cssCol(qPalette.base().color())
|
colBase = cssCol(qPalette.base().color())
|
||||||
@@ -162,8 +158,8 @@ class GuiProjectSearch(QWidget):
|
|||||||
|
|
||||||
self.setStyleSheet(
|
self.setStyleSheet(
|
||||||
"QToolBar {padding: 0; background: none;} "
|
"QToolBar {padding: 0; background: none;} "
|
||||||
f"QLineEdit {{border: {bPx}px solid {colBase}; padding: {mPx}px;}} "
|
f"QLineEdit {{border: 1px solid {colBase}; padding: 2px;}} "
|
||||||
f"QLineEdit:focus {{border: {bPx}px solid {colFocus};}} "
|
f"QLineEdit:focus {{border: 1px solid {colFocus};}} "
|
||||||
)
|
)
|
||||||
|
|
||||||
self.searchAction.setIcon(SHARED.theme.getIcon("search", "blue"))
|
self.searchAction.setIcon(SHARED.theme.getIcon("search", "blue"))
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ from PyQt6.QtCore import QEvent, QPoint, QSize, pyqtSignal
|
|||||||
from PyQt6.QtGui import QPalette
|
from PyQt6.QtGui import QPalette
|
||||||
from PyQt6.QtWidgets import QMenu, QVBoxLayout, QWidget
|
from PyQt6.QtWidgets import QMenu, QVBoxLayout, QWidget
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import SHARED
|
||||||
from novelwriter.common import qtLambda
|
from novelwriter.common import qtLambda
|
||||||
from novelwriter.enum import nwView
|
from novelwriter.enum import nwView
|
||||||
from novelwriter.extensions.eventfilters import StatusTipFilter
|
from novelwriter.extensions.eventfilters import StatusTipFilter
|
||||||
@@ -114,7 +114,7 @@ class GuiSideBar(QWidget):
|
|||||||
self.outerBox.addWidget(self.tbStats)
|
self.outerBox.addWidget(self.tbStats)
|
||||||
self.outerBox.addWidget(self.tbSettings)
|
self.outerBox.addWidget(self.tbSettings)
|
||||||
self.outerBox.setContentsMargins(0, 0, 0, 0)
|
self.outerBox.setContentsMargins(0, 0, 0, 0)
|
||||||
self.outerBox.setSpacing(CONFIG.pxInt(6))
|
self.outerBox.setSpacing(6)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
self.updateTheme()
|
self.updateTheme()
|
||||||
|
|||||||
@@ -57,13 +57,11 @@ class GuiMainStatus(QStatusBar):
|
|||||||
# Permanent Widgets
|
# Permanent Widgets
|
||||||
# =================
|
# =================
|
||||||
|
|
||||||
xM = CONFIG.pxInt(8)
|
|
||||||
|
|
||||||
# The Spell Checker Language
|
# The Spell Checker Language
|
||||||
self.langIcon = QLabel("", self)
|
self.langIcon = QLabel("", self)
|
||||||
self.langText = QLabel(self.tr("None"), self)
|
self.langText = QLabel(self.tr("None"), self)
|
||||||
self.langIcon.setContentsMargins(0, 0, 0, 0)
|
self.langIcon.setContentsMargins(0, 0, 0, 0)
|
||||||
self.langText.setContentsMargins(0, 0, xM, 0)
|
self.langText.setContentsMargins(0, 0, 8, 0)
|
||||||
self.addPermanentWidget(self.langIcon)
|
self.addPermanentWidget(self.langIcon)
|
||||||
self.addPermanentWidget(self.langText)
|
self.addPermanentWidget(self.langText)
|
||||||
|
|
||||||
@@ -71,7 +69,7 @@ class GuiMainStatus(QStatusBar):
|
|||||||
self.docIcon = StatusLED(iPx, iPx, self)
|
self.docIcon = StatusLED(iPx, iPx, self)
|
||||||
self.docText = QLabel(self.tr("Editor"), self)
|
self.docText = QLabel(self.tr("Editor"), self)
|
||||||
self.docIcon.setContentsMargins(0, 0, 0, 0)
|
self.docIcon.setContentsMargins(0, 0, 0, 0)
|
||||||
self.docText.setContentsMargins(0, 0, xM, 0)
|
self.docText.setContentsMargins(0, 0, 8, 0)
|
||||||
self.addPermanentWidget(self.docIcon)
|
self.addPermanentWidget(self.docIcon)
|
||||||
self.addPermanentWidget(self.docText)
|
self.addPermanentWidget(self.docText)
|
||||||
|
|
||||||
@@ -79,7 +77,7 @@ class GuiMainStatus(QStatusBar):
|
|||||||
self.projIcon = StatusLED(iPx, iPx, self)
|
self.projIcon = StatusLED(iPx, iPx, self)
|
||||||
self.projText = QLabel(self.tr("Project"), self)
|
self.projText = QLabel(self.tr("Project"), self)
|
||||||
self.projIcon.setContentsMargins(0, 0, 0, 0)
|
self.projIcon.setContentsMargins(0, 0, 0, 0)
|
||||||
self.projText.setContentsMargins(0, 0, xM, 0)
|
self.projText.setContentsMargins(0, 0, 8, 0)
|
||||||
self.addPermanentWidget(self.projIcon)
|
self.addPermanentWidget(self.projIcon)
|
||||||
self.addPermanentWidget(self.projText)
|
self.addPermanentWidget(self.projText)
|
||||||
|
|
||||||
@@ -87,7 +85,7 @@ class GuiMainStatus(QStatusBar):
|
|||||||
self.statsIcon = QLabel(self)
|
self.statsIcon = QLabel(self)
|
||||||
self.statsText = QLabel("", self)
|
self.statsText = QLabel("", self)
|
||||||
self.statsIcon.setContentsMargins(0, 0, 0, 0)
|
self.statsIcon.setContentsMargins(0, 0, 0, 0)
|
||||||
self.statsText.setContentsMargins(0, 0, xM, 0)
|
self.statsText.setContentsMargins(0, 0, 8, 0)
|
||||||
self.addPermanentWidget(self.statsIcon)
|
self.addPermanentWidget(self.statsIcon)
|
||||||
self.addPermanentWidget(self.statsText)
|
self.addPermanentWidget(self.statsText)
|
||||||
|
|
||||||
|
|||||||
@@ -544,31 +544,26 @@ class GuiTheme:
|
|||||||
"""Build default style sheets."""
|
"""Build default style sheets."""
|
||||||
self._styleSheets = {}
|
self._styleSheets = {}
|
||||||
|
|
||||||
aPx = CONFIG.pxInt(2)
|
|
||||||
bPx = CONFIG.pxInt(4)
|
|
||||||
cPx = CONFIG.pxInt(6)
|
|
||||||
dPx = CONFIG.pxInt(8)
|
|
||||||
|
|
||||||
tCol = palette.text().color()
|
tCol = palette.text().color()
|
||||||
hCol = palette.highlight().color()
|
hCol = palette.highlight().color()
|
||||||
|
|
||||||
# Flat Tab Widget and Tab Bar:
|
# Flat Tab Widget and Tab Bar:
|
||||||
self._styleSheets[STYLES_FLAT_TABS] = (
|
self._styleSheets[STYLES_FLAT_TABS] = (
|
||||||
"QTabWidget::pane {border: 0;} "
|
"QTabWidget::pane {border: 0;} "
|
||||||
f"QTabWidget QTabBar::tab {{border: 0; padding: {bPx}px {dPx}px;}} "
|
"QTabWidget QTabBar::tab {border: 0; padding: 4px 8px;} "
|
||||||
f"QTabWidget QTabBar::tab:selected {{color: {cssCol(hCol)};}} "
|
f"QTabWidget QTabBar::tab:selected {{color: {cssCol(hCol)};}} "
|
||||||
)
|
)
|
||||||
|
|
||||||
# Minimal Tool Button
|
# Minimal Tool Button
|
||||||
self._styleSheets[STYLES_MIN_TOOLBUTTON] = (
|
self._styleSheets[STYLES_MIN_TOOLBUTTON] = (
|
||||||
f"QToolButton {{padding: {aPx}px; margin: 0; border: none; background: transparent;}} "
|
"QToolButton {padding: 2px; margin: 0; border: none; background: transparent;} "
|
||||||
f"QToolButton:hover {{border: none; background: {cssCol(tCol, 48)};}} "
|
f"QToolButton:hover {{border: none; background: {cssCol(tCol, 48)};}} "
|
||||||
"QToolButton::menu-indicator {image: none;} "
|
"QToolButton::menu-indicator {image: none;} "
|
||||||
)
|
)
|
||||||
|
|
||||||
# Big Tool Button
|
# Big Tool Button
|
||||||
self._styleSheets[STYLES_BIG_TOOLBUTTON] = (
|
self._styleSheets[STYLES_BIG_TOOLBUTTON] = (
|
||||||
f"QToolButton {{padding: {cPx}px; margin: 0; border: none; background: transparent;}} "
|
"QToolButton {padding: 6px; margin: 0; border: none; background: transparent;} "
|
||||||
f"QToolButton:hover {{border: none; background: {cssCol(tCol, 48)};}} "
|
f"QToolButton:hover {{border: none; background: {cssCol(tCol, 48)};}} "
|
||||||
"QToolButton::menu-indicator {image: none;} "
|
"QToolButton::menu-indicator {image: none;} "
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user