diff --git a/novelwriter/dialogs/docmerge.py b/novelwriter/dialogs/docmerge.py index d258c89a..636e2de0 100644 --- a/novelwriter/dialogs/docmerge.py +++ b/novelwriter/dialogs/docmerge.py @@ -29,19 +29,20 @@ import logging from PyQt5.QtCore import Qt, pyqtSlot from PyQt5.QtGui import QCloseEvent from PyQt5.QtWidgets import ( - QAbstractItemView, QDialog, QDialogButtonBox, QGridLayout, QLabel, - QListWidget, QListWidgetItem, QVBoxLayout, QWidget + QAbstractItemView, QDialogButtonBox, QGridLayout, QLabel, QListWidget, + QListWidgetItem, QVBoxLayout, QWidget ) from novelwriter import CONFIG, SHARED from novelwriter.extensions.configlayout import NColourLabel +from novelwriter.extensions.modified import NDialog from novelwriter.extensions.switch import NSwitch from novelwriter.types import QtDialogCancel, QtDialogOk, QtDialogReset, QtUserRole logger = logging.getLogger(__name__) -class GuiDocMerge(QDialog): +class GuiDocMerge(NDialog): D_HANDLE = QtUserRole diff --git a/novelwriter/dialogs/docsplit.py b/novelwriter/dialogs/docsplit.py index 49325a70..1a25144c 100644 --- a/novelwriter/dialogs/docsplit.py +++ b/novelwriter/dialogs/docsplit.py @@ -29,19 +29,20 @@ import logging from PyQt5.QtCore import pyqtSlot from PyQt5.QtGui import QCloseEvent from PyQt5.QtWidgets import ( - QAbstractItemView, QComboBox, QDialog, QDialogButtonBox, QGridLayout, - QLabel, QListWidget, QListWidgetItem, QVBoxLayout, QWidget + QAbstractItemView, QComboBox, QDialogButtonBox, QGridLayout, QLabel, + QListWidget, QListWidgetItem, QVBoxLayout, QWidget ) from novelwriter import CONFIG, SHARED from novelwriter.extensions.configlayout import NColourLabel +from novelwriter.extensions.modified import NDialog from novelwriter.extensions.switch import NSwitch from novelwriter.types import QtDialogCancel, QtDialogOk, QtUserRole logger = logging.getLogger(__name__) -class GuiDocSplit(QDialog): +class GuiDocSplit(NDialog): LINE_ROLE = QtUserRole LEVEL_ROLE = QtUserRole + 1 diff --git a/novelwriter/dialogs/editlabel.py b/novelwriter/dialogs/editlabel.py index 2afbd6fa..95632701 100644 --- a/novelwriter/dialogs/editlabel.py +++ b/novelwriter/dialogs/editlabel.py @@ -31,12 +31,13 @@ from PyQt5.QtWidgets import ( ) from novelwriter import CONFIG +from novelwriter.extensions.modified import NDialog from novelwriter.types import QtDialogCancel, QtDialogOk logger = logging.getLogger(__name__) -class GuiEditLabel(QDialog): +class GuiEditLabel(NDialog): def __init__(self, parent: QWidget, text: str = "") -> None: super().__init__(parent=parent) diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 26ea5a3f..ccbe4cb0 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -27,10 +27,10 @@ from __future__ import annotations import logging from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot -from PyQt5.QtGui import QCloseEvent, QKeyEvent, QKeySequence +from PyQt5.QtGui import QCloseEvent from PyQt5.QtWidgets import ( - QAbstractButton, QApplication, QCompleter, QDialog, QDialogButtonBox, - QFileDialog, QHBoxLayout, QLineEdit, QPushButton, QVBoxLayout, QWidget + QAbstractButton, QApplication, QCompleter, QDialogButtonBox, QFileDialog, + QHBoxLayout, QLineEdit, QPushButton, QVBoxLayout, QWidget ) from novelwriter import CONFIG, SHARED @@ -38,7 +38,9 @@ from novelwriter.common import describeFont from novelwriter.constants import nwConst, nwUnicode from novelwriter.dialogs.quotes import GuiQuoteSelect from novelwriter.extensions.configlayout import NColourLabel, NScrollableForm -from novelwriter.extensions.modified import NComboBox, NDoubleSpinBox, NIconToolButton, NSpinBox +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 ( @@ -49,7 +51,7 @@ from novelwriter.types import ( logger = logging.getLogger(__name__) -class GuiPreferences(QDialog): +class GuiPreferences(NDialog): newPreferencesReady = pyqtSignal(bool, bool, bool, bool) @@ -772,13 +774,6 @@ class GuiPreferences(QDialog): self.deleteLater() return - def keyPressEvent(self, event: QKeyEvent) -> None: - """Overload keyPressEvent to block enter key to save.""" - if event.matches(QKeySequence.StandardKey.Cancel): - self.close() - event.ignore() - return - ## # Private Slots ## diff --git a/novelwriter/dialogs/projectsettings.py b/novelwriter/dialogs/projectsettings.py index 74b44409..2af8f3cb 100644 --- a/novelwriter/dialogs/projectsettings.py +++ b/novelwriter/dialogs/projectsettings.py @@ -29,7 +29,7 @@ import logging from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot from PyQt5.QtGui import QCloseEvent, QColor from PyQt5.QtWidgets import ( - QAbstractItemView, QApplication, QColorDialog, QDialog, QDialogButtonBox, + QAbstractItemView, QApplication, QColorDialog, QDialogButtonBox, QHBoxLayout, QLineEdit, QMenu, QStackedWidget, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget ) @@ -40,7 +40,7 @@ from novelwriter.constants import nwLabels, trConst from novelwriter.core.status import NWStatus, StatusEntry from novelwriter.enum import nwStatusShape from novelwriter.extensions.configlayout import NColourLabel, NFixedPage, NScrollableForm -from novelwriter.extensions.modified import NComboBox, NIconToolButton +from novelwriter.extensions.modified import NComboBox, NDialog, NIconToolButton from novelwriter.extensions.pagedsidebar import NPagedSideBar from novelwriter.extensions.switch import NSwitch from novelwriter.types import ( @@ -51,7 +51,7 @@ from novelwriter.types import ( logger = logging.getLogger(__name__) -class GuiProjectSettings(QDialog): +class GuiProjectSettings(NDialog): PAGE_SETTINGS = 0 PAGE_STATUS = 1 diff --git a/novelwriter/dialogs/quotes.py b/novelwriter/dialogs/quotes.py index 760e82d6..b0f944b0 100644 --- a/novelwriter/dialogs/quotes.py +++ b/novelwriter/dialogs/quotes.py @@ -34,12 +34,13 @@ from PyQt5.QtWidgets import ( from novelwriter import CONFIG from novelwriter.constants import nwQuotes, trConst +from novelwriter.extensions.modified import NDialog from novelwriter.types import QtAlignCenter, QtAlignTop, QtDialogCancel, QtDialogOk, QtUserRole logger = logging.getLogger(__name__) -class GuiQuoteSelect(QDialog): +class GuiQuoteSelect(NDialog): _selected = "" diff --git a/novelwriter/dialogs/wordlist.py b/novelwriter/dialogs/wordlist.py index fa2b573c..817781ee 100644 --- a/novelwriter/dialogs/wordlist.py +++ b/novelwriter/dialogs/wordlist.py @@ -30,7 +30,7 @@ from pathlib import Path from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot from PyQt5.QtGui import QCloseEvent from PyQt5.QtWidgets import ( - QAbstractItemView, QApplication, QDialog, QDialogButtonBox, QFileDialog, + QAbstractItemView, QApplication, QDialogButtonBox, QFileDialog, QHBoxLayout, QLineEdit, QListWidget, QVBoxLayout, QWidget ) @@ -38,13 +38,13 @@ from novelwriter import CONFIG, SHARED from novelwriter.common import formatFileFilter from novelwriter.core.spellcheck import UserDictionary from novelwriter.extensions.configlayout import NColourLabel -from novelwriter.extensions.modified import NIconToolButton +from novelwriter.extensions.modified import NDialog, NIconToolButton from novelwriter.types import QtDialogClose, QtDialogSave logger = logging.getLogger(__name__) -class GuiWordList(QDialog): +class GuiWordList(NDialog): newWordListReady = pyqtSignal() diff --git a/novelwriter/extensions/modified.py b/novelwriter/extensions/modified.py index 210d9638..48694106 100644 --- a/novelwriter/extensions/modified.py +++ b/novelwriter/extensions/modified.py @@ -31,7 +31,7 @@ from enum import Enum from typing import TYPE_CHECKING from PyQt5.QtCore import QSize, Qt -from PyQt5.QtGui import QWheelEvent +from PyQt5.QtGui import QKeyEvent, QKeySequence, QWheelEvent from PyQt5.QtWidgets import ( QApplication, QComboBox, QDialog, QDoubleSpinBox, QSpinBox, QToolButton, QWidget @@ -43,7 +43,17 @@ if TYPE_CHECKING: # pragma: no cover from novelwriter.guimain import GuiMain -class NToolDialog(QDialog): +class NDialog(QDialog): + + def keyPressEvent(self, event: QKeyEvent) -> None: + """Overload keyPressEvent and forward escape to close.""" + if event.matches(QKeySequence.StandardKey.Cancel): + self.close() + event.ignore() + return + + +class NToolDialog(NDialog): def __init__(self, parent: GuiMain) -> None: super().__init__(parent=parent) @@ -62,7 +72,7 @@ class NToolDialog(QDialog): return -class NNonBlockingDialog(QDialog): +class NNonBlockingDialog(NDialog): def __init__(self, parent: QWidget | None = None) -> None: super().__init__(parent=parent) diff --git a/novelwriter/tools/lipsum.py b/novelwriter/tools/lipsum.py index 19b4cac9..5956db4b 100644 --- a/novelwriter/tools/lipsum.py +++ b/novelwriter/tools/lipsum.py @@ -28,19 +28,20 @@ import random from PyQt5.QtCore import Qt, pyqtSlot from PyQt5.QtWidgets import ( - QDialog, QDialogButtonBox, QGridLayout, QHBoxLayout, QLabel, QSpinBox, - QVBoxLayout, QWidget + QDialogButtonBox, QGridLayout, QHBoxLayout, QLabel, QSpinBox, QVBoxLayout, + QWidget ) from novelwriter import CONFIG, SHARED from novelwriter.common import readTextFile +from novelwriter.extensions.modified import NDialog from novelwriter.extensions.switch import NSwitch from novelwriter.types import QtAlignLeft, QtAlignRight, QtDialogClose, QtRoleAction logger = logging.getLogger(__name__) -class GuiLipsum(QDialog): +class GuiLipsum(NDialog): def __init__(self, parent: QWidget) -> None: super().__init__(parent=parent) diff --git a/novelwriter/tools/manusbuild.py b/novelwriter/tools/manusbuild.py index 0af6ef52..e12a6077 100644 --- a/novelwriter/tools/manusbuild.py +++ b/novelwriter/tools/manusbuild.py @@ -30,7 +30,7 @@ from pathlib import Path from PyQt5.QtCore import QTimer, pyqtSlot from PyQt5.QtGui import QCloseEvent from PyQt5.QtWidgets import ( - QAbstractButton, QAbstractItemView, QDialog, QDialogButtonBox, QFileDialog, + QAbstractButton, QAbstractItemView, QDialogButtonBox, QFileDialog, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QListWidget, QListWidgetItem, QPushButton, QSplitter, QVBoxLayout, QWidget ) @@ -42,14 +42,14 @@ from novelwriter.core.buildsettings import BuildSettings from novelwriter.core.docbuild import NWBuildDocument from novelwriter.core.item import NWItem from novelwriter.enum import nwBuildFmt -from novelwriter.extensions.modified import NIconToolButton +from novelwriter.extensions.modified import NDialog, NIconToolButton from novelwriter.extensions.simpleprogress import NProgressSimple from novelwriter.types import QtAlignCenter, QtDialogClose, QtRoleAction, QtRoleReject, QtUserRole logger = logging.getLogger(__name__) -class GuiManuscriptBuild(QDialog): +class GuiManuscriptBuild(NDialog): """GUI Tools: Manuscript Build Dialog This is the tool for running the build itself. It can be accessed diff --git a/novelwriter/tools/welcome.py b/novelwriter/tools/welcome.py index bb291441..c7726b6f 100644 --- a/novelwriter/tools/welcome.py +++ b/novelwriter/tools/welcome.py @@ -34,8 +34,8 @@ from PyQt5.QtCore import ( ) from PyQt5.QtGui import QCloseEvent, QColor, QFont, QPainter, QPaintEvent, QPen from PyQt5.QtWidgets import ( - QAction, QApplication, QDialog, QFileDialog, QFormLayout, QHBoxLayout, - QLabel, QLineEdit, QListView, QMenu, QPushButton, QScrollArea, QShortcut, + QAction, QApplication, QFileDialog, QFormLayout, QHBoxLayout, QLabel, + QLineEdit, QListView, QMenu, QPushButton, QScrollArea, QShortcut, QStackedWidget, QStyledItemDelegate, QStyleOptionViewItem, QVBoxLayout, QWidget ) @@ -46,7 +46,7 @@ from novelwriter.constants import nwFiles from novelwriter.core.coretools import ProjectBuilder from novelwriter.enum import nwItemClass from novelwriter.extensions.configlayout import NWrappedWidgetBox -from novelwriter.extensions.modified import NIconToolButton, NSpinBox +from novelwriter.extensions.modified import NDialog, NIconToolButton, NSpinBox from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.versioninfo import VersionInfoWidget from novelwriter.types import QtAlignLeft, QtAlignRightTop, QtSelected @@ -56,7 +56,7 @@ logger = logging.getLogger(__name__) PANEL_ALPHA = 178 -class GuiWelcome(QDialog): +class GuiWelcome(NDialog): openProjectRequest = pyqtSignal(Path)