diff --git a/novelwriter/dialogs/about.py b/novelwriter/dialogs/about.py index 59d4251f..429930cd 100644 --- a/novelwriter/dialogs/about.py +++ b/novelwriter/dialogs/about.py @@ -33,10 +33,11 @@ from PyQt6.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.common import readTextFile +from novelwriter.enum import nwStandardButton from novelwriter.extensions.configlayout import NColorLabel from novelwriter.extensions.modified import NDialog from novelwriter.extensions.versioninfo import VersionInfoWidget -from novelwriter.types import QtAlignRightTop, QtDialogClose, QtHexArgb +from novelwriter.types import QtAlignRightTop, QtHexArgb if TYPE_CHECKING: from PyQt6.QtGui import QCloseEvent @@ -82,8 +83,11 @@ class GuiAbout(NDialog): self.txtCredits.setViewportMargins(0, 8, 8, 0) # Buttons - self.btnBox = QDialogButtonBox(QtDialogClose, self) - self.btnBox.rejected.connect(self.reject) + self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self) + self.btnClose.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnClose, QDialogButtonBox.ButtonRole.RejectRole) # Assemble self.innerBox = QVBoxLayout() diff --git a/novelwriter/dialogs/docmerge.py b/novelwriter/dialogs/docmerge.py index 2c392374..0c8bdfa2 100644 --- a/novelwriter/dialogs/docmerge.py +++ b/novelwriter/dialogs/docmerge.py @@ -33,10 +33,11 @@ from PyQt6.QtWidgets import ( ) from novelwriter import SHARED +from novelwriter.enum import nwStandardButton from novelwriter.extensions.configlayout import NColorLabel from novelwriter.extensions.modified import NDialog from novelwriter.extensions.switch import NSwitch -from novelwriter.types import QtAccepted, QtDialogCancel, QtDialogOk, QtDialogReset, QtUserRole +from novelwriter.types import QtAccepted, QtUserRole logger = logging.getLogger(__name__) @@ -85,13 +86,19 @@ class GuiDocMerge(NDialog): self.optBox.setColumnStretch(2, 1) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel, self) - self.buttonBox.accepted.connect(self.accept) - self.buttonBox.rejected.connect(self.reject) + self.btnOk = SHARED.theme.getStandardButton(nwStandardButton.OK, self) + self.btnOk.clicked.connect(self.accept) - self.resetButton = self.buttonBox.addButton(QtDialogReset) - if self.resetButton: - self.resetButton.clicked.connect(self._resetList) + self.btnCancel = SHARED.theme.getStandardButton(nwStandardButton.CANCEL, self) + self.btnCancel.clicked.connect(self.reject) + + self.btnReset = SHARED.theme.getStandardButton(nwStandardButton.RESET, self) + self.btnReset.clicked.connect(self._resetList) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnOk, QDialogButtonBox.ButtonRole.AcceptRole) + self.btnBox.addButton(self.btnCancel, QDialogButtonBox.ButtonRole.RejectRole) + self.btnBox.addButton(self.btnReset, QDialogButtonBox.ButtonRole.ResetRole) # Assemble self.outerBox = QVBoxLayout() @@ -103,7 +110,7 @@ class GuiDocMerge(NDialog): self.outerBox.addSpacing(8) self.outerBox.addLayout(self.optBox) self.outerBox.addSpacing(12) - self.outerBox.addWidget(self.buttonBox) + self.outerBox.addWidget(self.btnBox) self.setLayout(self.outerBox) # Load Content diff --git a/novelwriter/dialogs/docsplit.py b/novelwriter/dialogs/docsplit.py index 5850aff3..7355409e 100644 --- a/novelwriter/dialogs/docsplit.py +++ b/novelwriter/dialogs/docsplit.py @@ -33,10 +33,11 @@ from PyQt6.QtWidgets import ( ) from novelwriter import SHARED +from novelwriter.enum import nwStandardButton from novelwriter.extensions.configlayout import NColorLabel from novelwriter.extensions.modified import NComboBox, NDialog from novelwriter.extensions.switch import NSwitch -from novelwriter.types import QtAccepted, QtDialogCancel, QtDialogOk, QtUserRole +from novelwriter.types import QtAccepted, QtUserRole logger = logging.getLogger(__name__) @@ -117,9 +118,15 @@ class GuiDocSplit(NDialog): self.optBox.setColumnStretch(3, 1) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel, self) - self.buttonBox.accepted.connect(self.accept) - self.buttonBox.rejected.connect(self.reject) + self.btnOk = SHARED.theme.getStandardButton(nwStandardButton.OK, self) + self.btnOk.clicked.connect(self.accept) + + self.btnCancel = SHARED.theme.getStandardButton(nwStandardButton.CANCEL, self) + self.btnCancel.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnOk, QDialogButtonBox.ButtonRole.AcceptRole) + self.btnBox.addButton(self.btnCancel, QDialogButtonBox.ButtonRole.RejectRole) # Assemble self.outerBox = QVBoxLayout() @@ -132,7 +139,7 @@ class GuiDocSplit(NDialog): self.outerBox.addSpacing(8) self.outerBox.addLayout(self.optBox) self.outerBox.addSpacing(12) - self.outerBox.addWidget(self.buttonBox) + self.outerBox.addWidget(self.btnBox) self.setLayout(self.outerBox) # Load Content diff --git a/novelwriter/dialogs/editlabel.py b/novelwriter/dialogs/editlabel.py index b8b4bae4..4d56e07e 100644 --- a/novelwriter/dialogs/editlabel.py +++ b/novelwriter/dialogs/editlabel.py @@ -27,8 +27,10 @@ import logging from PyQt6.QtWidgets import QDialogButtonBox, QHBoxLayout, QLabel, QLineEdit, QVBoxLayout, QWidget +from novelwriter import SHARED +from novelwriter.enum import nwStandardButton from novelwriter.extensions.modified import NDialog -from novelwriter.types import QtAccepted, QtDialogCancel, QtDialogOk +from novelwriter.types import QtAccepted logger = logging.getLogger(__name__) @@ -54,9 +56,15 @@ class GuiEditLabel(NDialog): self.lblValue.setBuddy(self.lblValue) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel, self) - self.buttonBox.accepted.connect(self.accept) - self.buttonBox.rejected.connect(self.reject) + self.btnOk = SHARED.theme.getStandardButton(nwStandardButton.OK, self) + self.btnOk.clicked.connect(self.accept) + + self.btnCancel = SHARED.theme.getStandardButton(nwStandardButton.CANCEL, self) + self.btnCancel.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnOk, QDialogButtonBox.ButtonRole.AcceptRole) + self.btnBox.addButton(self.btnCancel, QDialogButtonBox.ButtonRole.RejectRole) # Assemble self.innerBox = QHBoxLayout() @@ -67,7 +75,7 @@ class GuiEditLabel(NDialog): self.outerBox = QVBoxLayout() self.outerBox.setSpacing(12) self.outerBox.addLayout(self.innerBox, 1) - self.outerBox.addWidget(self.buttonBox, 0) + self.outerBox.addWidget(self.btnBox, 0) self.setLayout(self.outerBox) diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 758f7908..7062f4ad 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -38,13 +38,14 @@ from novelwriter.common import compact, describeFont, processDialogSymbols, uniq from novelwriter.config import DEF_GUI_DARK, DEF_GUI_LIGHT, DEF_ICONS, DEF_TREECOL from novelwriter.constants import nwLabels, nwQuotes, nwUnicode, trConst from novelwriter.dialogs.quotes import GuiQuoteSelect +from novelwriter.enum import nwStandardButton from novelwriter.extensions.configlayout import NColorLabel, NScrollableForm from novelwriter.extensions.modified import ( NComboBox, NDialog, NDoubleSpinBox, NIconToolButton, NSpinBox ) from novelwriter.extensions.pagedsidebar import NPagedSideBar from novelwriter.extensions.switch import NSwitch -from novelwriter.types import QtAlignCenter, QtDialogCancel, QtDialogSave +from novelwriter.types import QtAlignCenter logger = logging.getLogger(__name__) @@ -89,9 +90,15 @@ class GuiPreferences(NDialog): self.mainForm.setHelpTextStyle(SHARED.theme.helpText) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogCancel, self) - self.buttonBox.accepted.connect(self._doSave) - self.buttonBox.rejected.connect(self.reject) + self.btnSave = SHARED.theme.getStandardButton(nwStandardButton.SAVE, self) + self.btnSave.clicked.connect(self._doSave) + + self.btnCancel = SHARED.theme.getStandardButton(nwStandardButton.CANCEL, self) + self.btnCancel.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnSave, QDialogButtonBox.ButtonRole.AcceptRole) + self.btnBox.addButton(self.btnCancel, QDialogButtonBox.ButtonRole.RejectRole) # Assemble self.searchBox = QHBoxLayout() @@ -107,7 +114,7 @@ class GuiPreferences(NDialog): self.outerBox = QVBoxLayout() self.outerBox.addLayout(self.searchBox) self.outerBox.addLayout(self.mainBox) - self.outerBox.addWidget(self.buttonBox) + self.outerBox.addWidget(self.btnBox) self.outerBox.setSpacing(8) self.setLayout(self.outerBox) diff --git a/novelwriter/dialogs/projectsettings.py b/novelwriter/dialogs/projectsettings.py index 5e16d52e..a6f090cf 100644 --- a/novelwriter/dialogs/projectsettings.py +++ b/novelwriter/dialogs/projectsettings.py @@ -41,15 +41,12 @@ from novelwriter import CONFIG, SHARED from novelwriter.common import formatFileFilter, qtAddAction, qtLambda, simplified from novelwriter.constants import nwLabels, trConst from novelwriter.core.status import CUSTOM_COL, NWStatus, StatusEntry -from novelwriter.enum import nwStatusShape +from novelwriter.enum import nwStandardButton, nwStatusShape from novelwriter.extensions.configlayout import NColorLabel, NFixedPage, NScrollableForm from novelwriter.extensions.modified import NComboBox, NDialog, NIconToolButton from novelwriter.extensions.pagedsidebar import NPagedSideBar from novelwriter.extensions.switch import NSwitch -from novelwriter.types import ( - QtDialogCancel, QtDialogSave, QtSizeMinimum, QtSizeMinimumExpanding, - QtUserRole -) +from novelwriter.types import QtSizeMinimum, QtSizeMinimumExpanding, QtUserRole logger = logging.getLogger(__name__) @@ -95,9 +92,15 @@ class GuiProjectSettings(NDialog): self.sidebar.buttonClicked.connect(self._sidebarClicked) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogCancel, self) - self.buttonBox.accepted.connect(self._doSave) - self.buttonBox.rejected.connect(self.reject) + self.btnSave = SHARED.theme.getStandardButton(nwStandardButton.SAVE, self) + self.btnSave.clicked.connect(self._doSave) + + self.btnCancel = SHARED.theme.getStandardButton(nwStandardButton.CANCEL, self) + self.btnCancel.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnSave, QDialogButtonBox.ButtonRole.AcceptRole) + self.btnBox.addButton(self.btnCancel, QDialogButtonBox.ButtonRole.RejectRole) # Content SHARED.project.countStatus() @@ -126,7 +129,7 @@ class GuiProjectSettings(NDialog): self.outerBox = QVBoxLayout() self.outerBox.addLayout(self.topBox) self.outerBox.addLayout(self.mainBox) - self.outerBox.addWidget(self.buttonBox) + self.outerBox.addWidget(self.btnBox) self.outerBox.setSpacing(8) self.setLayout(self.outerBox) diff --git a/novelwriter/dialogs/quotes.py b/novelwriter/dialogs/quotes.py index 6030ecfe..2a813d39 100644 --- a/novelwriter/dialogs/quotes.py +++ b/novelwriter/dialogs/quotes.py @@ -32,12 +32,11 @@ from PyQt6.QtWidgets import ( QListWidgetItem, QVBoxLayout, QWidget ) +from novelwriter import SHARED from novelwriter.constants import nwQuotes, trConst +from novelwriter.enum import nwStandardButton from novelwriter.extensions.modified import NDialog -from novelwriter.types import ( - QtAccepted, QtAlignCenter, QtAlignTop, QtDialogCancel, QtDialogOk, - QtUserRole -) +from novelwriter.types import QtAccepted, QtAlignCenter, QtAlignTop, QtUserRole logger = logging.getLogger(__name__) @@ -91,9 +90,15 @@ class GuiQuoteSelect(NDialog): self.listBox.setMinimumHeight(150) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogOk | QtDialogCancel, self) - self.buttonBox.accepted.connect(self.accept) - self.buttonBox.rejected.connect(self.reject) + self.btnOk = SHARED.theme.getStandardButton(nwStandardButton.OK, self) + self.btnOk.clicked.connect(self.accept) + + self.btnCancel = SHARED.theme.getStandardButton(nwStandardButton.CANCEL, self) + self.btnCancel.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnOk, QDialogButtonBox.ButtonRole.AcceptRole) + self.btnBox.addButton(self.btnCancel, QDialogButtonBox.ButtonRole.RejectRole) # Assemble self.labelBox.addWidget(self.previewLabel, 0, QtAlignTop) @@ -103,7 +108,7 @@ class GuiQuoteSelect(NDialog): self.innerBox.addWidget(self.listBox) self.outerBox.addLayout(self.innerBox) - self.outerBox.addWidget(self.buttonBox) + self.outerBox.addWidget(self.btnBox) self.setLayout(self.outerBox) diff --git a/novelwriter/dialogs/wordlist.py b/novelwriter/dialogs/wordlist.py index 19e2da9d..c1db00ee 100644 --- a/novelwriter/dialogs/wordlist.py +++ b/novelwriter/dialogs/wordlist.py @@ -37,9 +37,9 @@ from PyQt6.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.common import formatFileFilter from novelwriter.core.spellcheck import UserDictionary +from novelwriter.enum import nwStandardButton from novelwriter.extensions.configlayout import NColorLabel from novelwriter.extensions.modified import NDialog, NIconToolButton -from novelwriter.types import QtDialogClose, QtDialogSave if TYPE_CHECKING: from PyQt6.QtGui import QCloseEvent @@ -110,9 +110,15 @@ class GuiWordList(NDialog): self.editBox.addWidget(self.delButton, 0) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogClose, self) - self.buttonBox.accepted.connect(self._doSave) - self.buttonBox.rejected.connect(self.reject) + self.btnSave = SHARED.theme.getStandardButton(nwStandardButton.SAVE, self) + self.btnSave.clicked.connect(self._doSave) + + self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self) + self.btnClose.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnSave, QDialogButtonBox.ButtonRole.AcceptRole) + self.btnBox.addButton(self.btnClose, QDialogButtonBox.ButtonRole.RejectRole) # Assemble self.outerBox = QVBoxLayout() @@ -120,7 +126,7 @@ class GuiWordList(NDialog): self.outerBox.addWidget(self.listBox, 1) self.outerBox.addLayout(self.editBox, 0) self.outerBox.addSpacing(12) - self.outerBox.addWidget(self.buttonBox, 0) + self.outerBox.addWidget(self.btnBox, 0) self.outerBox.setSpacing(4) self.setLayout(self.outerBox) diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py index 441c9cd1..6293a9f6 100644 --- a/novelwriter/gui/theme.py +++ b/novelwriter/gui/theme.py @@ -57,17 +57,23 @@ STYLES_MIN_TOOLBUTTON = "minimalToolButton" STYLES_BIG_TOOLBUTTON = "bigToolButton" STANDARD_BUTTONS = { - nwStandardButton.OK: (QT_TRANSLATE_NOOP("Button", "OK"), "btn_ok", "blue"), - nwStandardButton.CANCEL: (QT_TRANSLATE_NOOP("Button", "Cancel"), "btn_cancel", "red"), - nwStandardButton.YES: (QT_TRANSLATE_NOOP("Button", "Yes"), "btn_yes", "green"), - nwStandardButton.NO: (QT_TRANSLATE_NOOP("Button", "No"), "btn_no", "red"), - nwStandardButton.OPEN: (QT_TRANSLATE_NOOP("Button", "Open"), "btn_open", "blue"), - nwStandardButton.CLOSE: (QT_TRANSLATE_NOOP("Button", "Close"), "btn_close", "red"), - nwStandardButton.BROWSE: (QT_TRANSLATE_NOOP("Button", "Browse"), "btn_browse", "yellow"), - nwStandardButton.LIST: (QT_TRANSLATE_NOOP("Button", "List"), "btn_list", "blue"), - nwStandardButton.NEW: (QT_TRANSLATE_NOOP("Button", "New"), "btn_new", "green"), - nwStandardButton.CREATE: (QT_TRANSLATE_NOOP("Button", "Create"), "btn_create", "yellow"), - nwStandardButton.RESET: (QT_TRANSLATE_NOOP("Button", "Reset"), "btn_reset", "green"), + nwStandardButton.OK: (QT_TRANSLATE_NOOP("Button", "OK"), "btn_ok", "blue"), + nwStandardButton.CANCEL: (QT_TRANSLATE_NOOP("Button", "Cancel"), "btn_cancel", "red"), + nwStandardButton.YES: (QT_TRANSLATE_NOOP("Button", "&Yes"), "btn_yes", "green"), + nwStandardButton.NO: (QT_TRANSLATE_NOOP("Button", "&No"), "btn_no", "red"), + nwStandardButton.OPEN: (QT_TRANSLATE_NOOP("Button", "Open"), "btn_open", "blue"), + nwStandardButton.CLOSE: (QT_TRANSLATE_NOOP("Button", "Close"), "btn_close", "faded"), + nwStandardButton.SAVE: (QT_TRANSLATE_NOOP("Button", "Save"), "btn_save", "blue"), + nwStandardButton.BROWSE: (QT_TRANSLATE_NOOP("Button", "Browse"), "btn_browse", "yellow"), + nwStandardButton.LIST: (QT_TRANSLATE_NOOP("Button", "List"), "btn_list", "blue"), + nwStandardButton.NEW: (QT_TRANSLATE_NOOP("Button", "New"), "btn_new", "green"), + nwStandardButton.CREATE: (QT_TRANSLATE_NOOP("Button", "Create"), "btn_create", "yellow"), + nwStandardButton.RESET: (QT_TRANSLATE_NOOP("Button", "Reset"), "btn_reset", "green"), + nwStandardButton.INSERT: (QT_TRANSLATE_NOOP("Button", "Insert"), "btn_insert", "blue"), + nwStandardButton.APPLY: (QT_TRANSLATE_NOOP("Button", "Apply"), "btn_apply", "blue"), + nwStandardButton.BUILD: (QT_TRANSLATE_NOOP("Button", "Build"), "btn_build", "blue"), + nwStandardButton.PRINT: (QT_TRANSLATE_NOOP("Button", "Print"), "btn_print", "blue"), + nwStandardButton.PREVIEW: (QT_TRANSLATE_NOOP("Button", "Preview"), "btn_preview", "blue"), } diff --git a/novelwriter/tools/dictionaries.py b/novelwriter/tools/dictionaries.py index 5cc97021..06f26a95 100644 --- a/novelwriter/tools/dictionaries.py +++ b/novelwriter/tools/dictionaries.py @@ -37,9 +37,10 @@ from PyQt6.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.common import formatFileFilter, formatInt, getFileSize, openExternalPath +from novelwriter.enum import nwStandardButton from novelwriter.error import formatException from novelwriter.extensions.modified import NIconToolButton, NNonBlockingDialog -from novelwriter.types import QtDialogClose, QtHexArgb +from novelwriter.types import QtHexArgb logger = logging.getLogger(__name__) @@ -110,8 +111,11 @@ class GuiDictionaries(NNonBlockingDialog): self.infoBox.setFrameStyle(QFrame.Shape.NoFrame) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogClose, self) - self.buttonBox.rejected.connect(self.reject) + self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self) + self.btnClose.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnClose, QDialogButtonBox.ButtonRole.AcceptRole) # Assemble self.outerBox = QVBoxLayout() @@ -123,7 +127,7 @@ class GuiDictionaries(NNonBlockingDialog): self.outerBox.addLayout(self.inBox, 0) self.outerBox.addWidget(self.infoBox, 1) self.outerBox.addSpacing(8) - self.outerBox.addWidget(self.buttonBox, 0) + self.outerBox.addWidget(self.btnBox, 0) self.setLayout(self.outerBox) diff --git a/novelwriter/tools/lipsum.py b/novelwriter/tools/lipsum.py index d28fb845..49b793a5 100644 --- a/novelwriter/tools/lipsum.py +++ b/novelwriter/tools/lipsum.py @@ -34,9 +34,10 @@ from PyQt6.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.common import readTextFile +from novelwriter.enum import nwStandardButton from novelwriter.extensions.modified import NDialog from novelwriter.extensions.switch import NSwitch -from novelwriter.types import QtAlignLeft, QtAlignRight, QtDialogClose, QtRoleAction +from novelwriter.types import QtAlignLeft, QtAlignRight logger = logging.getLogger(__name__) @@ -91,22 +92,22 @@ class GuiLipsum(NDialog): self.innerBox.addLayout(self.formBox) # Buttons - self.buttonBox = QDialogButtonBox(self) - self.buttonBox.rejected.connect(self.reject) + self.btnInsert = SHARED.theme.getStandardButton(nwStandardButton.INSERT, self) + self.btnInsert.clicked.connect(self._doInsert) + self.btnInsert.setAutoDefault(False) - self.btnClose = self.buttonBox.addButton(QtDialogClose) - if self.btnClose: - self.btnClose.setAutoDefault(False) + self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self) + self.btnClose.clicked.connect(self.reject) + self.btnClose.setAutoDefault(False) - self.btnInsert = self.buttonBox.addButton(self.tr("Insert"), QtRoleAction) - if self.btnInsert: - self.btnInsert.clicked.connect(self._doInsert) - self.btnInsert.setAutoDefault(False) + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnInsert, QDialogButtonBox.ButtonRole.ApplyRole) + self.btnBox.addButton(self.btnClose, QDialogButtonBox.ButtonRole.RejectRole) # Assemble self.outerBox = QVBoxLayout() self.outerBox.addLayout(self.innerBox) - self.outerBox.addWidget(self.buttonBox) + self.outerBox.addWidget(self.btnBox) self.outerBox.setSpacing(16) self.setLayout(self.outerBox) diff --git a/novelwriter/tools/manusbuild.py b/novelwriter/tools/manusbuild.py index 19070b14..c77898d7 100644 --- a/novelwriter/tools/manusbuild.py +++ b/novelwriter/tools/manusbuild.py @@ -32,7 +32,7 @@ from PyQt6.QtCore import QTimer, pyqtSlot from PyQt6.QtWidgets import ( QAbstractButton, QAbstractItemView, QDialogButtonBox, QFileDialog, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QListWidget, QListWidgetItem, - QPushButton, QSplitter, QVBoxLayout, QWidget + QSplitter, QVBoxLayout, QWidget ) from novelwriter import SHARED @@ -40,10 +40,10 @@ from novelwriter.common import makeFileNameSafe, openExternalPath from novelwriter.constants import nwLabels from novelwriter.core.docbuild import NWBuildDocument from novelwriter.core.item import NWItem -from novelwriter.enum import nwBuildFmt -from novelwriter.extensions.modified import NDialog, NIconToolButton +from novelwriter.enum import nwBuildFmt, nwStandardButton +from novelwriter.extensions.modified import NDialog, NIconToolButton, NPushButton from novelwriter.extensions.progressbars import NProgressSimple -from novelwriter.types import QtAlignCenter, QtDialogClose, QtRoleAction, QtRoleReject, QtUserRole +from novelwriter.types import QtAlignCenter, QtRoleAction, QtRoleReject, QtUserRole if TYPE_CHECKING: from PyQt6.QtGui import QCloseEvent @@ -178,25 +178,19 @@ class GuiManuscriptBuild(NDialog): self.buildBox.setVerticalSpacing(4) # Dialog Buttons - self.buttonBox = QDialogButtonBox(self) - - self.btnOpen = QPushButton( - SHARED.theme.getIcon("browse", "yellow"), self.tr("Open Folder"), self - ) - self.btnOpen.setIconSize(bSz) + self.btnOpen = NPushButton(self, self.tr("Open Folder"), bSz, "browse", "yellow") self.btnOpen.setAutoDefault(False) - self.buttonBox.addButton(self.btnOpen, QtRoleAction) - self.btnBuild = QPushButton( - SHARED.theme.getIcon("sb_build", "blue"), self.tr("&Build"), self - ) - self.btnBuild.setIconSize(bSz) + self.btnBuild = SHARED.theme.getStandardButton(nwStandardButton.BUILD, self) self.btnBuild.setAutoDefault(True) - self.buttonBox.addButton(self.btnBuild, QtRoleAction) - self.btnClose = self.buttonBox.addButton(QtDialogClose) - if self.btnClose: - self.btnClose.setAutoDefault(False) + self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self) + self.btnClose.setAutoDefault(False) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnOpen, QtRoleAction) + self.btnBox.addButton(self.btnBuild, QtRoleAction) + self.btnBox.addButton(self.btnClose, QtRoleReject) # Assemble GUI # ============ @@ -223,7 +217,7 @@ class GuiManuscriptBuild(NDialog): self.outerBox.addSpacing(4) self.outerBox.addLayout(self.buildBox, 0) self.outerBox.addSpacing(16) - self.outerBox.addWidget(self.buttonBox, 0) + self.outerBox.addWidget(self.btnBox, 0) self.outerBox.setSpacing(0) self.setLayout(self.outerBox) @@ -239,7 +233,7 @@ class GuiManuscriptBuild(NDialog): # Signals self.btnReset.clicked.connect(self._doResetBuildName) self.btnBrowse.clicked.connect(self._doSelectPath) - self.buttonBox.clicked.connect(self._dialogButtonClicked) + self.btnBox.clicked.connect(self._dialogButtonClicked) self.listFormats.itemSelectionChanged.connect(self._resetProgress) logger.debug("Ready: GuiManuscriptBuild") @@ -266,7 +260,7 @@ class GuiManuscriptBuild(NDialog): @pyqtSlot("QAbstractButton*") def _dialogButtonClicked(self, button: QAbstractButton) -> None: """Handle button clicks from the dialog button box.""" - role = self.buttonBox.buttonRole(button) + role = self.btnBox.buttonRole(button) if role == QtRoleAction: if button == self.btnBuild: self._runBuild() diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py index 8c458db3..79a93787 100644 --- a/novelwriter/tools/manuscript.py +++ b/novelwriter/tools/manuscript.py @@ -36,9 +36,9 @@ from PyQt6.QtGui import ( from PyQt6.QtPrintSupport import QPrinter, QPrintPreviewDialog from PyQt6.QtWidgets import ( QAbstractItemView, QApplication, QFormLayout, QGridLayout, QHBoxLayout, - QLabel, QListWidget, QListWidgetItem, QPushButton, QSplitter, - QStackedWidget, QTabWidget, QTextBrowser, QTreeWidget, QTreeWidgetItem, - QVBoxLayout, QWidget + QLabel, QListWidget, QListWidgetItem, QSplitter, QStackedWidget, + QTabWidget, QTextBrowser, QTreeWidget, QTreeWidgetItem, QVBoxLayout, + QWidget ) from novelwriter import CONFIG, SHARED @@ -46,6 +46,7 @@ from novelwriter.common import fuzzyTime, qtLambda from novelwriter.constants import nwHeadFmt, nwLabels, nwStats, nwUnicode, trStats from novelwriter.core.buildsettings import BuildCollection, BuildSettings from novelwriter.core.docbuild import NWBuildDocument +from novelwriter.enum import nwStandardButton from novelwriter.extensions.modified import NIconToggleButton, NIconToolButton, NToolDialog from novelwriter.extensions.progressbars import NProgressCircle from novelwriter.extensions.switch import NSwitch @@ -171,16 +172,16 @@ class GuiManuscript(NToolDialog): # Process Controls # ================ - self.btnPreview = QPushButton(self.tr("Preview"), self) + self.btnPreview = SHARED.theme.getStandardButton(nwStandardButton.PREVIEW, self) self.btnPreview.clicked.connect(self._generatePreview) - self.btnPrint = QPushButton(self.tr("Print"), self) + self.btnPrint = SHARED.theme.getStandardButton(nwStandardButton.PRINT, self) self.btnPrint.clicked.connect(self._printDocument) - self.btnBuild = QPushButton(self.tr("Build"), self) + self.btnBuild = SHARED.theme.getStandardButton(nwStandardButton.BUILD, self) self.btnBuild.clicked.connect(self._buildManuscript) - self.btnClose = QPushButton(self.tr("Close"), self) + self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self) self.btnClose.clicked.connect(qtLambda(self.close)) self.processBox = QGridLayout() diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py index e8bf94b6..795c7eed 100644 --- a/novelwriter/tools/manussettings.py +++ b/novelwriter/tools/manussettings.py @@ -40,6 +40,7 @@ from novelwriter import CONFIG, SHARED from novelwriter.common import describeFont, fontMatcher, qtAddAction, qtLambda from novelwriter.constants import nwHeadFmt, nwKeyWords, nwLabels, nwUnicode, trConst from novelwriter.core.buildsettings import BuildSettings, FilterMode +from novelwriter.enum import nwStandardButton from novelwriter.extensions.configlayout import ( NColorLabel, NFixedPage, NScrollableForm, NScrollablePage ) @@ -50,9 +51,8 @@ from novelwriter.extensions.pagedsidebar import NPagedSideBar from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.switchbox import NSwitchBox from novelwriter.types import ( - QtAlignCenter, QtAlignLeft, QtDialogApply, QtDialogClose, QtDialogSave, - QtHeaderFixed, QtHeaderStretch, QtRoleAccept, QtRoleApply, QtRoleReject, - QtUserRole + QtAlignCenter, QtAlignLeft, QtHeaderFixed, QtHeaderStretch, QtRoleAccept, + QtRoleApply, QtRoleReject, QtUserRole ) if TYPE_CHECKING: @@ -125,8 +125,15 @@ class GuiBuildSettings(NToolDialog): self.toolStack.addWidget(self.optTabFormatting) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogApply | QtDialogSave | QtDialogClose, self) - self.buttonBox.clicked.connect(self._dialogButtonClicked) + self.btnApply = SHARED.theme.getStandardButton(nwStandardButton.APPLY, self) + self.btnSave = SHARED.theme.getStandardButton(nwStandardButton.SAVE, self) + self.btnCancel = SHARED.theme.getStandardButton(nwStandardButton.CANCEL, self) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnApply, QDialogButtonBox.ButtonRole.ApplyRole) + self.btnBox.addButton(self.btnSave, QDialogButtonBox.ButtonRole.AcceptRole) + self.btnBox.addButton(self.btnCancel, QDialogButtonBox.ButtonRole.RejectRole) + self.btnBox.clicked.connect(self._dialogButtonClicked) # Assemble self.topBox = QHBoxLayout() @@ -143,7 +150,7 @@ class GuiBuildSettings(NToolDialog): self.outerBox = QVBoxLayout() self.outerBox.addLayout(self.topBox) self.outerBox.addLayout(self.mainBox) - self.outerBox.addWidget(self.buttonBox) + self.outerBox.addWidget(self.btnBox) self.outerBox.setSpacing(12) self.setLayout(self.outerBox) @@ -205,7 +212,7 @@ class GuiBuildSettings(NToolDialog): @pyqtSlot("QAbstractButton*") def _dialogButtonClicked(self, button: QAbstractButton) -> None: """Handle button clicks from the dialog button box.""" - role = self.buttonBox.buttonRole(button) + role = self.btnBox.buttonRole(button) if role == QtRoleApply: self._applyChanges() self._emitBuildData() diff --git a/novelwriter/tools/noveldetails.py b/novelwriter/tools/noveldetails.py index 7447b553..bfec8938 100644 --- a/novelwriter/tools/noveldetails.py +++ b/novelwriter/tools/noveldetails.py @@ -38,12 +38,13 @@ from PyQt6.QtWidgets import ( from novelwriter import SHARED from novelwriter.common import formatTime, numberToRoman from novelwriter.constants import nwUnicode +from novelwriter.enum import nwStandardButton from novelwriter.extensions.configlayout import NColorLabel, NFixedPage, NScrollablePage from novelwriter.extensions.modified import NNonBlockingDialog from novelwriter.extensions.novelselector import NovelSelector from novelwriter.extensions.pagedsidebar import NPagedSideBar from novelwriter.extensions.switch import NSwitch -from novelwriter.types import QtAlignRight, QtDecoration, QtDialogClose +from novelwriter.types import QtAlignRight, QtDecoration if TYPE_CHECKING: from PyQt6.QtGui import QCloseEvent @@ -102,8 +103,11 @@ class GuiNovelDetails(NNonBlockingDialog): self.mainStack.addWidget(self.contentsPage) # Buttons - self.buttonBox = QDialogButtonBox(QtDialogClose, self) - self.buttonBox.rejected.connect(self.reject) + self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self) + self.btnClose.clicked.connect(self.reject) + + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnClose, QDialogButtonBox.ButtonRole.RejectRole) # Assemble self.topBox = QHBoxLayout() @@ -119,7 +123,7 @@ class GuiNovelDetails(NNonBlockingDialog): self.outerBox = QVBoxLayout() self.outerBox.addLayout(self.topBox) self.outerBox.addLayout(self.mainBox) - self.outerBox.addWidget(self.buttonBox) + self.outerBox.addWidget(self.btnBox) self.outerBox.setSpacing(8) self.setLayout(self.outerBox) diff --git a/novelwriter/tools/writingstats.py b/novelwriter/tools/writingstats.py index 4494da8f..b6440e5c 100644 --- a/novelwriter/tools/writingstats.py +++ b/novelwriter/tools/writingstats.py @@ -39,13 +39,11 @@ from PyQt6.QtWidgets import ( from novelwriter import CONFIG, SHARED from novelwriter.common import checkInt, checkIntTuple, formatTime, minmax, qtLambda from novelwriter.constants import nwConst +from novelwriter.enum import nwStandardButton from novelwriter.error import formatException -from novelwriter.extensions.modified import NToolDialog +from novelwriter.extensions.modified import NPushButton, NToolDialog from novelwriter.extensions.switch import NSwitch -from novelwriter.types import ( - QtAlignLeftMiddle, QtAlignRight, QtAlignRightMiddle, QtDecoration, - QtDialogClose, QtRoleAction -) +from novelwriter.types import QtAlignLeftMiddle, QtAlignRight, QtAlignRightMiddle, QtDecoration if TYPE_CHECKING: from novelwriter.guimain import GuiMain @@ -182,6 +180,7 @@ class GuiWritingStats(NToolDialog): # Filter Options iPx = SHARED.theme.baseIconHeight + bSz = SHARED.theme.buttonIconSize self.filterForm = QGridLayout(self) self.filterForm.setRowStretch(6, 1) @@ -276,6 +275,10 @@ class GuiWritingStats(NToolDialog): self.optsBox.addWidget(self.histMax, 0) # Buttons + self.btnClose = SHARED.theme.getStandardButton(nwStandardButton.CLOSE, self) + self.btnClose.clicked.connect(self._doClose) + self.btnClose.setAutoDefault(False) + self.saveJSON = QAction(self.tr("JSON Data File (.json)"), self) self.saveJSON.triggered.connect(qtLambda(self._saveData, self.FMT_JSON)) @@ -286,17 +289,13 @@ class GuiWritingStats(NToolDialog): self.saveMenu.addAction(self.saveJSON) self.saveMenu.addAction(self.saveCSV) - self.buttonBox = QDialogButtonBox(self) - self.buttonBox.rejected.connect(self._doClose) + self.btnSave = NPushButton(self, self.tr("Save As"), bSz, "btn_save", "blue") + self.btnSave.setAutoDefault(False) + self.btnSave.setMenu(self.saveMenu) - self.btnClose = self.buttonBox.addButton(QtDialogClose) - if self.btnClose: - self.btnClose.setAutoDefault(False) - - self.btnSave = self.buttonBox.addButton(self.tr("Save As"), QtRoleAction) - if self.btnSave: - self.btnSave.setAutoDefault(False) - self.btnSave.setMenu(self.saveMenu) + self.btnBox = QDialogButtonBox(self) + self.btnBox.addButton(self.btnClose, QDialogButtonBox.ButtonRole.RejectRole) + self.btnBox.addButton(self.btnSave, QDialogButtonBox.ButtonRole.ActionRole) # Assemble self.outerBox = QGridLayout() @@ -304,7 +303,7 @@ class GuiWritingStats(NToolDialog): self.outerBox.addLayout(self.optsBox, 1, 0, 1, 2) self.outerBox.addWidget(self.infoBox, 2, 0) self.outerBox.addWidget(self.filterBox, 2, 1) - self.outerBox.addWidget(self.buttonBox, 3, 0, 1, 2) + self.outerBox.addWidget(self.btnBox, 3, 0, 1, 2) self.outerBox.setRowStretch(0, 1) self.setLayout(self.outerBox)