diff --git a/novelwriter/core/coretools.py b/novelwriter/core/coretools.py index 925db901..8b29bf39 100644 --- a/novelwriter/core/coretools.py +++ b/novelwriter/core/coretools.py @@ -370,17 +370,7 @@ class DocSearch: def _buildPattern(self, search: str) -> str: """Build the search pattern string.""" if self._escape: - if CONFIG.verQtValue >= 0x050f00: - search = QRegularExpression.escape(search) - else: - # For older Qt versions, we escape manually - escaped = "" - for c in search: - if c.isalnum() or c == "_": - escaped += c - else: - escaped += f"\\{c}" - search = escaped + search = QRegularExpression.escape(search) if self._words: search = f"(?:^|\\b){search}(?:$|\\b)" return search diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 4d603289..bb09e72f 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -39,8 +39,8 @@ from time import time from typing import TYPE_CHECKING from PyQt5.QtCore import ( - pyqtSignal, pyqtSlot, QObject, QPoint, QRegExp, QRegularExpression, - QRunnable, Qt, QTimer + pyqtSignal, pyqtSlot, QObject, QPoint, QRegularExpression, QRunnable, Qt, + QTimer ) from PyQt5.QtGui import ( QColor, QCursor, QFont, QKeyEvent, QKeySequence, QMouseEvent, QPalette, @@ -2538,32 +2538,18 @@ class GuiDocEditSearch(QFrame): # Getters ## - def getSearchObject(self) -> str | QRegularExpression | QRegExp: + def getSearchObject(self) -> str | QRegularExpression: """Return the current search text either as text or as a regular expression object. """ text = self.searchBox.text() if CONFIG.searchRegEx: - # Using the Unicode-capable QRegularExpression class was - # only added in Qt 5.13. Otherwise, 5.3 and up supports - # only the QRegExp class. - if CONFIG.verQtValue >= 0x050d00: - rxOpt = QRegularExpression.PatternOption.UseUnicodePropertiesOption - if not CONFIG.searchCase: - rxOpt |= QRegularExpression.PatternOption.CaseInsensitiveOption - regEx = QRegularExpression(text, rxOpt) - self._alertSearchValid(regEx.isValid()) - return regEx - else: # pragma: no cover - # >= 50300 to < 51300 - if CONFIG.searchCase: - rxOpt = Qt.CaseSensitivity.CaseSensitive - else: - rxOpt = Qt.CaseSensitivity.CaseInsensitive - regEx = QRegExp(text, rxOpt) - self._alertSearchValid(regEx.isValid()) - return regEx - + rxOpt = QRegularExpression.PatternOption.UseUnicodePropertiesOption + if not CONFIG.searchCase: + rxOpt |= QRegularExpression.PatternOption.CaseInsensitiveOption + regEx = QRegularExpression(text, rxOpt) + self._alertSearchValid(regEx.isValid()) + return regEx return text ## diff --git a/novelwriter/gui/docviewerpanel.py b/novelwriter/gui/docviewerpanel.py index ed4d9ba6..b82c5d52 100644 --- a/novelwriter/gui/docviewerpanel.py +++ b/novelwriter/gui/docviewerpanel.py @@ -209,9 +209,8 @@ class GuiDocViewerPanel(QWidget): def _updateTabVisibility(self) -> None: """Hide class tabs with no content.""" - if CONFIG.verQtValue >= 0x050f00: - for tClass, cTab in self.kwTabs.items(): - self.mainTabs.setTabVisible(self.idTabs[tClass], cTab.countEntries() > 0) + for tClass, cTab in self.kwTabs.items(): + self.mainTabs.setTabVisible(self.idTabs[tClass], cTab.countEntries() > 0) return def _loadAllTags(self) -> None: diff --git a/tests/test_core/test_core_coretools.py b/tests/test_core/test_core_coretools.py index 7c68bb7d..0dd0f113 100644 --- a/tests/test_core/test_core_coretools.py +++ b/tests/test_core/test_core_coretools.py @@ -427,14 +427,7 @@ def testCoreTools_DocSearch(monkeypatch, mockGUI, fncPath, mockRnd, ipsumText): # ======== # Escape Using QRegularExpression - with monkeypatch.context() as mp: - mp.setattr(CONFIG, "verQtValue", 0x050f00) - assert search._buildPattern("[A-Za-z0-9_]+") == r"\[A\-Za\-z0\-9_\]\+" - - # Escape Using Custom Implementation - with monkeypatch.context() as mp: - mp.setattr(CONFIG, "verQtValue", 0x050d00) - assert search._buildPattern("[A-Za-z0-9_]+") == r"\[A\-Za\-z0\-9_\]\+" + assert search._buildPattern("[A-Za-z0-9_]+") == r"\[A\-Za\-z0\-9_\]\+" # Whole Words search.setWholeWords(True) diff --git a/tests/test_gui/test_gui_docviewerpanel.py b/tests/test_gui/test_gui_docviewerpanel.py index b194a52f..9b35bfe4 100644 --- a/tests/test_gui/test_gui_docviewerpanel.py +++ b/tests/test_gui/test_gui_docviewerpanel.py @@ -26,7 +26,7 @@ from tools import C, buildTestProject from PyQt5.QtGui import QIcon -from novelwriter import CONFIG, SHARED +from novelwriter import SHARED from novelwriter.constants import nwLists from novelwriter.core.item import NWItem from novelwriter.dialogs.editlabel import GuiEditLabel @@ -151,14 +151,13 @@ def testGuiViewerPanel_Tags(qtbot, monkeypatch, caplog, nwGUI, projPath, mockRnd nwGUI.docEditor._processTag(cursor, create=True) # Check Panel Tab Visibility - if CONFIG.verQtValue >= 0x050f00: - assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["CHARACTER"]) is True - assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["PLOT"]) is False - assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["WORLD"]) is False - assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["TIMELINE"]) is False - assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["OBJECT"]) is False - assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["ENTITY"]) is False - assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["CUSTOM"]) is False + assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["CHARACTER"]) is True + assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["PLOT"]) is False + assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["WORLD"]) is False + assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["TIMELINE"]) is False + assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["OBJECT"]) is False + assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["ENTITY"]) is False + assert viewPanel.mainTabs.isTabVisible(viewPanel.idTabs["CUSTOM"]) is False # Check Character Tab charTab = viewPanel.kwTabs["CHARACTER"]