Skip to content

Commit

Permalink
Refactor dialog closing (#1918)
Browse files Browse the repository at this point in the history
  • Loading branch information
vkbo committed Jun 10, 2024
2 parents cddf63f + 8a9b038 commit 9bcb247
Show file tree
Hide file tree
Showing 11 changed files with 49 additions and 33 deletions.
2 changes: 1 addition & 1 deletion novelwriter/dialogs/about.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def __init__(self, parent: QWidget) -> None:

# Buttons
self.btnBox = QDialogButtonBox(QtDialogClose, self)
self.btnBox.rejected.connect(self.close)
self.btnBox.rejected.connect(self.reject)

# Assemble
self.innerBox = QVBoxLayout()
Expand Down
12 changes: 11 additions & 1 deletion novelwriter/dialogs/preferences.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import logging

from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QCloseEvent
from PyQt5.QtGui import QCloseEvent, QKeyEvent, QKeySequence
from PyQt5.QtWidgets import (
QAbstractButton, QCompleter, QDialogButtonBox, QFileDialog, QHBoxLayout,
QLineEdit, QPushButton, QVBoxLayout, QWidget
Expand Down Expand Up @@ -770,6 +770,16 @@ def closeEvent(self, event: QCloseEvent) -> None:
self.softDelete()
return

def keyPressEvent(self, event: QKeyEvent) -> None:
"""Overload keyPressEvent and only accept escape. The main
purpose here is to prevent Enter/Return from closing the dialog
as it is used for the search box.
"""
if event.matches(QKeySequence.StandardKey.Cancel):
self.close()
event.ignore()
return

##
# Private Slots
##
Expand Down
2 changes: 1 addition & 1 deletion novelwriter/dialogs/projectsettings.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def __init__(self, parent: QWidget, gotoPage: int = PAGE_SETTINGS) -> None:
# Buttons
self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogCancel, self)
self.buttonBox.accepted.connect(self._doSave)
self.buttonBox.rejected.connect(self.close)
self.buttonBox.rejected.connect(self.reject)

# Content
SHARED.project.countStatus()
Expand Down
2 changes: 1 addition & 1 deletion novelwriter/dialogs/wordlist.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def __init__(self, parent: QWidget) -> None:
# Buttons
self.buttonBox = QDialogButtonBox(QtDialogSave | QtDialogClose, self)
self.buttonBox.accepted.connect(self._doSave)
self.buttonBox.rejected.connect(self.close)
self.buttonBox.rejected.connect(self.reject)

# Assemble
self.outerBox = QVBoxLayout()
Expand Down
14 changes: 7 additions & 7 deletions novelwriter/extensions/modified.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
from enum import Enum
from typing import TYPE_CHECKING

from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QKeyEvent, QKeySequence, QWheelEvent
from PyQt5.QtCore import QSize, Qt, pyqtSlot
from PyQt5.QtGui import QWheelEvent
from PyQt5.QtWidgets import (
QApplication, QComboBox, QDialog, QDoubleSpinBox, QSpinBox, QToolButton,
QWidget
Expand All @@ -54,11 +54,11 @@ def softDelete(self) -> None:
self.setParent(None) # type: ignore
return

def keyPressEvent(self, event: QKeyEvent) -> None:
"""Overload keyPressEvent and forward escape to close."""
if event.matches(QKeySequence.StandardKey.Cancel):
self.close()
event.ignore()
@pyqtSlot()
def reject(self) -> None:
"""Overload the reject slot and also call close."""
super().reject()
self.close()
return


Expand Down
8 changes: 1 addition & 7 deletions novelwriter/tools/dictionaries.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def __init__(self, parent: QWidget) -> None:

# Buttons
self.buttonBox = QDialogButtonBox(QtDialogClose, self)
self.buttonBox.rejected.connect(self._doClose)
self.buttonBox.rejected.connect(self.reject)

# Assemble
self.innerBox = QVBoxLayout()
Expand Down Expand Up @@ -220,12 +220,6 @@ def _doOpenInstallLocation(self) -> None:
SHARED.error("Path not found.")
return

@pyqtSlot()
def _doClose(self) -> None:
"""Close the dialog."""
self.close()
return

##
# Internal Functions
##
Expand Down
11 changes: 3 additions & 8 deletions novelwriter/tools/lipsum.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import logging
import random

from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import (
QDialogButtonBox, QGridLayout, QHBoxLayout, QLabel, QSpinBox, QVBoxLayout,
QWidget
Expand All @@ -48,13 +48,10 @@ def __init__(self, parent: QWidget) -> None:

logger.debug("Create: GuiLipsum")
self.setObjectName("GuiLipsum")
if CONFIG.osDarwin:
self.setWindowFlag(Qt.WindowType.Tool)
self.setWindowTitle(self.tr("Insert Placeholder Text"))

self._lipsumText = ""

self.setWindowTitle(self.tr("Insert Placeholder Text"))

vSp = CONFIG.pxInt(4)
nPx = CONFIG.pxInt(64)

Expand Down Expand Up @@ -96,7 +93,7 @@ def __init__(self, parent: QWidget) -> None:

# Buttons
self.buttonBox = QDialogButtonBox(self)
self.buttonBox.rejected.connect(self.close)
self.buttonBox.rejected.connect(self.reject)

self.btnClose = self.buttonBox.addButton(QtDialogClose)
self.btnClose.setAutoDefault(False)
Expand All @@ -105,8 +102,6 @@ def __init__(self, parent: QWidget) -> None:
self.btnInsert.clicked.connect(self._doInsert)
self.btnInsert.setAutoDefault(False)

self.rejected.connect(self.close)

# Assemble
self.outerBox = QVBoxLayout()
self.outerBox.addLayout(self.innerBox)
Expand Down
2 changes: 1 addition & 1 deletion novelwriter/tools/noveldetails.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def __init__(self, parent: QWidget) -> None:

# Buttons
self.buttonBox = QDialogButtonBox(QtDialogClose, self)
self.buttonBox.rejected.connect(self.close)
self.buttonBox.rejected.connect(self.reject)

# Assemble
self.topBox = QHBoxLayout()
Expand Down
23 changes: 20 additions & 3 deletions tests/test_ext/test_ext_modified.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,12 @@

import pytest

from PyQt5.QtCore import QPoint, QPointF, Qt
from PyQt5.QtGui import QWheelEvent
from PyQt5.QtCore import QEvent, QPoint, QPointF, Qt
from PyQt5.QtGui import QKeyEvent, QWheelEvent
from PyQt5.QtWidgets import QWidget

from novelwriter.extensions.modified import NComboBox, NDoubleSpinBox, NSpinBox
from novelwriter.extensions.modified import NComboBox, NDialog, NDoubleSpinBox, NSpinBox
from novelwriter.types import QtModNone, QtRejected

from tests.tools import SimpleDialog

Expand All @@ -47,6 +49,21 @@ def ignore(self):
return


@pytest.mark.gui
def testExtModified_NDialog(qtbot, monkeypatch):
"""Test the NDialog class."""
widget = QWidget()
dialog = NDialog(widget)
assert dialog.parent() is widget

dialog.softDelete()
assert dialog.parent() is None

with qtbot.waitSignal(dialog.rejected, timeout=1000):
dialog.keyPressEvent(QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_Escape, QtModNone))
assert dialog.result() == QtRejected


@pytest.mark.gui
def testExtModified_NComboBox(qtbot, monkeypatch):
"""Test the NComboBox class."""
Expand Down
2 changes: 0 additions & 2 deletions tests/test_tools/test_tools_dictionaries.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,4 @@ def testToolDictionaries_Main(qtbot, monkeypatch, nwGUI, fncPath):
"Additional dictionaries found: 2"
)

# Close
nwDicts._doClose()
# qtbot.stop()
4 changes: 3 additions & 1 deletion tests/test_tools/test_tools_lipsum.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from PyQt5.QtWidgets import QAction

from novelwriter import SHARED
from novelwriter.enum import nwDocInsert
from novelwriter.tools.lipsum import GuiLipsum

from tests.tools import C, buildTestProject
Expand Down Expand Up @@ -62,7 +63,8 @@ def testToolLipsum_Main(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
with monkeypatch.context() as mp:
mp.setattr(GuiLipsum, "exec", lambda *a: None)
mp.setattr(GuiLipsum, "lipsumText", "FooBar")
nwGUI.mainMenu.aLipsumText.activate(QAction.Trigger)
with qtbot.waitSignal(nwGUI.docEditor.textChanged):
nwGUI.docEditor.insertText(nwDocInsert.LIPSUM)
assert nwGUI.docEditor.getText() == "### New Scene\n\nFooBar"

# qtbot.stop()

0 comments on commit 9bcb247

Please sign in to comment.