From 1118f01c91a6bf10a5617ddc80c936ed633c8dce Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:05:58 +0100 Subject: [PATCH] Combine all event filters in one module, and apply the status tip filter to the sidebar as well --- .../{wheeleventfilter.py => eventfilters.py} | 18 ++++++++++++++---- novelwriter/gui/doceditor.py | 2 +- novelwriter/gui/docviewer.py | 2 +- novelwriter/gui/mainmenu.py | 17 ++++------------- novelwriter/gui/sidebar.py | 6 ++++-- ...eventfilter.py => test_ext_eventfilters.py} | 6 +++--- 6 files changed, 27 insertions(+), 24 deletions(-) rename novelwriter/extensions/{wheeleventfilter.py => eventfilters.py} (80%) rename tests/test_ext/{test_ext_wheeleventfilter.py => test_ext_eventfilters.py} (92%) diff --git a/novelwriter/extensions/wheeleventfilter.py b/novelwriter/extensions/eventfilters.py similarity index 80% rename from novelwriter/extensions/wheeleventfilter.py rename to novelwriter/extensions/eventfilters.py index 220fa324..9c53354e 100644 --- a/novelwriter/extensions/wheeleventfilter.py +++ b/novelwriter/extensions/eventfilters.py @@ -1,9 +1,10 @@ """ -novelWriter – Custom Object: Wheel Event Filter -=============================================== +novelWriter – Custom Objects: Event Filters +=========================================== File History: -Created: 2023-08-31 [2.1rc1] +Created: 2023-08-31 [2.1rc1] WheelEventFilter +Created: 2023-11-28 [2.2] StatusTipFilter This file is a part of novelWriter Copyright 2018–2023, Veronica Berglyd Olsen @@ -23,7 +24,7 @@ along with this program. If not, see . """ from __future__ import annotations -from PyQt5.QtGui import QWheelEvent +from PyQt5.QtGui import QStatusTipEvent, QWheelEvent from PyQt5.QtCore import QEvent, QObject from PyQt5.QtWidgets import QWidget @@ -63,3 +64,12 @@ class WheelEventFilter(QObject): return False # END Class WheelEventFilter + + +class StatusTipFilter(QObject): + + def eventFilter(self, obj: QObject, event: QEvent) -> bool: + """Filter out status tip events on menus.""" + return True if isinstance(event, QStatusTipEvent) else super().eventFilter(obj, event) + +# END Class StatusTipFilter diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 4d4ac393..8ea95769 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -62,7 +62,7 @@ from novelwriter.tools.lipsum import GuiLipsum from novelwriter.core.document import NWDocument from novelwriter.gui.dochighlight import GuiDocHighlighter from novelwriter.gui.editordocument import GuiTextDocument -from novelwriter.extensions.wheeleventfilter import WheelEventFilter +from novelwriter.extensions.eventfilters import WheelEventFilter if TYPE_CHECKING: # pragma: no cover from novelwriter.guimain import GuiMain diff --git a/novelwriter/gui/docviewer.py b/novelwriter/gui/docviewer.py index d548f0d4..44ccb1d5 100644 --- a/novelwriter/gui/docviewer.py +++ b/novelwriter/gui/docviewer.py @@ -46,7 +46,7 @@ from novelwriter.enum import nwItemType, nwDocAction, nwDocMode from novelwriter.error import logException from novelwriter.constants import nwUnicode from novelwriter.core.tohtml import ToHtml -from novelwriter.extensions.wheeleventfilter import WheelEventFilter +from novelwriter.extensions.eventfilters import WheelEventFilter if TYPE_CHECKING: # pragma: no cover from novelwriter.guimain import GuiMain diff --git a/novelwriter/gui/mainmenu.py b/novelwriter/gui/mainmenu.py index a601fb99..e442f9e8 100644 --- a/novelwriter/gui/mainmenu.py +++ b/novelwriter/gui/mainmenu.py @@ -3,8 +3,7 @@ novelWriter – GUI Main Menu =========================== File History: -Created: 2019-04-27 [0.0.1] GuiMainMenu -Created: 2023-11-28 [2.2] StatusTipFilter +Created: 2019-04-27 [0.0.1] This file is a part of novelWriter Copyright 2018–2023, Veronica Berglyd Olsen @@ -29,14 +28,15 @@ import logging from typing import TYPE_CHECKING from pathlib import Path -from PyQt5.QtGui import QDesktopServices, QStatusTipEvent -from PyQt5.QtCore import QEvent, QObject, QUrl, pyqtSignal, pyqtSlot +from PyQt5.QtGui import QDesktopServices +from PyQt5.QtCore import QUrl, pyqtSignal, pyqtSlot from PyQt5.QtWidgets import QMenuBar, QAction from novelwriter import CONFIG, SHARED from novelwriter.enum import nwDocAction, nwDocInsert, nwWidget from novelwriter.common import openExternalPath from novelwriter.constants import nwConst, trConst, nwKeyWords, nwLabels, nwUnicode +from novelwriter.extensions.eventfilters import StatusTipFilter if TYPE_CHECKING: # pragma: no cover from novelwriter.guimain import GuiMain @@ -971,12 +971,3 @@ class GuiMainMenu(QMenuBar): return # END Class GuiMainMenu - - -class StatusTipFilter(QObject): - - def eventFilter(self, obj: QObject, event: QEvent) -> bool: - """Filter out status tip events.""" - return True if isinstance(event, QStatusTipEvent) else super().eventFilter(obj, event) - -# END Class StatusTipFilter diff --git a/novelwriter/gui/sidebar.py b/novelwriter/gui/sidebar.py index 9cfbf118..b15908a2 100644 --- a/novelwriter/gui/sidebar.py +++ b/novelwriter/gui/sidebar.py @@ -27,12 +27,13 @@ import logging from typing import TYPE_CHECKING -from PyQt5.QtCore import QEvent, QPoint, Qt, QSize, pyqtSignal from PyQt5.QtGui import QPalette +from PyQt5.QtCore import QEvent, QPoint, Qt, QSize, pyqtSignal from PyQt5.QtWidgets import QMenu, QToolButton, QVBoxLayout, QWidget from novelwriter import CONFIG, SHARED from novelwriter.enum import nwView +from novelwriter.extensions.eventfilters import StatusTipFilter if TYPE_CHECKING: # pragma: no cover from novelwriter.guimain import GuiMain @@ -54,6 +55,7 @@ class GuiSideBar(QWidget): iPx = CONFIG.pxInt(24) iconSize = QSize(iPx, iPx) self.setContentsMargins(0, 0, 0, 0) + self.installEventFilter(StatusTipFilter(mainGui)) # Buttons self.tbProject = QToolButton(self) @@ -162,7 +164,7 @@ class GuiSideBar(QWidget): class _PopRightMenu(QMenu): - def event(self, event: QEvent): + def event(self, event: QEvent) -> bool: """Overload the show event and move the menu popup location.""" if event.type() == QEvent.Show: parent = self.parent() diff --git a/tests/test_ext/test_ext_wheeleventfilter.py b/tests/test_ext/test_ext_eventfilters.py similarity index 92% rename from tests/test_ext/test_ext_wheeleventfilter.py rename to tests/test_ext/test_ext_eventfilters.py index 2d348358..844d4403 100644 --- a/tests/test_ext/test_ext_wheeleventfilter.py +++ b/tests/test_ext/test_ext_eventfilters.py @@ -26,7 +26,7 @@ from PyQt5.QtGui import QKeyEvent, QWheelEvent from PyQt5.QtCore import QEvent, QObject, QPoint, Qt from PyQt5.QtWidgets import QWidget -from novelwriter.extensions.wheeleventfilter import WheelEventFilter +from novelwriter.extensions.eventfilters import WheelEventFilter class MockWidget(QWidget): @@ -42,7 +42,7 @@ class MockWidget(QWidget): @pytest.mark.gui -def testExtWheelEventFilter_Main(): +def testExtEventFilters_WheelEventFilter(): """Test the WheelEventFilter class.""" obj = QObject() widget = MockWidget() @@ -65,4 +65,4 @@ def testExtWheelEventFilter_Main(): eFilter.eventFilter(obj, event) assert widget.count == 1 -# END Test testExtWheelEventFilter_Main +# END Test testExtEventFilters_WheelEventFilter