mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-09-28 07:21:31 +12:00
Merge pull request #1003 from jdanielp/develop
Fix crash when regex is not valid (Fixes olivierkes#989)
This commit is contained in:
commit
9e8e7a234f
1 changed files with 56 additions and 21 deletions
|
@ -1,5 +1,7 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# --!-- coding: utf8 --!--
|
# --!-- coding: utf8 --!--
|
||||||
|
import re
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt, QRect, QEvent, QCoreApplication
|
from PyQt5.QtCore import Qt, QRect, QEvent, QCoreApplication
|
||||||
from PyQt5.QtGui import QPalette, QFontMetrics, QKeySequence
|
from PyQt5.QtGui import QPalette, QFontMetrics, QKeySequence
|
||||||
from PyQt5.QtWidgets import QWidget, qApp, QListWidgetItem, QStyledItemDelegate, QStyle, QLabel, QToolTip, QShortcut
|
from PyQt5.QtWidgets import QWidget, qApp, QListWidgetItem, QStyledItemDelegate, QStyle, QLabel, QToolTip, QShortcut
|
||||||
|
@ -13,6 +15,8 @@ from manuskript.enums import Model
|
||||||
from manuskript.models.flatDataModelWrapper import flatDataModelWrapper
|
from manuskript.models.flatDataModelWrapper import flatDataModelWrapper
|
||||||
from manuskript.ui.searchMenu import searchMenu
|
from manuskript.ui.searchMenu import searchMenu
|
||||||
from manuskript.ui.highlighters.searchResultHighlighters.searchResultHighlighter import searchResultHighlighter
|
from manuskript.ui.highlighters.searchResultHighlighters.searchResultHighlighter import searchResultHighlighter
|
||||||
|
import logging
|
||||||
|
LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class search(QWidget, Ui_search):
|
class search(QWidget, Ui_search):
|
||||||
|
@ -23,9 +27,11 @@ class search(QWidget, Ui_search):
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
|
|
||||||
self.searchTextInput.returnPressed.connect(self.search)
|
self.searchTextInput.returnPressed.connect(self.search)
|
||||||
|
self.searchTextInput.textChanged.connect(self.updateSearchFeedback)
|
||||||
|
|
||||||
self.searchMenu = searchMenu()
|
self.searchMenu = searchMenu()
|
||||||
self.btnOptions.setMenu(self.searchMenu)
|
self.btnOptions.setMenu(self.searchMenu)
|
||||||
|
self.searchMenu.triggered.connect(self.onSearchMenuChange)
|
||||||
|
|
||||||
self.delegate = listResultDelegate(self)
|
self.delegate = listResultDelegate(self)
|
||||||
self.result.setItemDelegate(self.delegate)
|
self.result.setItemDelegate(self.delegate)
|
||||||
|
@ -68,9 +74,34 @@ class search(QWidget, Ui_search):
|
||||||
if 0 < self.result.currentRow() < self.result.count():
|
if 0 < self.result.currentRow() < self.result.count():
|
||||||
self.openItem(self.result.currentItem())
|
self.openItem(self.result.currentItem())
|
||||||
|
|
||||||
def prepareRegex(self, searchText):
|
def onSearchMenuChange(self):
|
||||||
import re
|
search_string = self.searchTextInput.text()
|
||||||
|
self.updateSearchFeedback(search_string)
|
||||||
|
|
||||||
|
def updateSearchFeedback(self, search_string):
|
||||||
|
palette = QPalette()
|
||||||
|
try:
|
||||||
|
self.compileRegex(search_string)
|
||||||
|
except Exception as e:
|
||||||
|
# From https://stackoverflow.com/questions/27432456/python-qlineedit-text-color
|
||||||
|
palette.setColor(QPalette.Text, Qt.red)
|
||||||
|
|
||||||
|
self.searchTextInput.setPalette(palette)
|
||||||
|
|
||||||
|
def prepareRegex(self, searchText):
|
||||||
|
rtn = None
|
||||||
|
try:
|
||||||
|
rtn = self.compileRegex(searchText)
|
||||||
|
except re.error as e:
|
||||||
|
LOGGER.info("Problem preparing regular expression: " + e.msg)
|
||||||
|
rtn = None
|
||||||
|
except Exception as e:
|
||||||
|
LOGGER.info("Problem preparing regular expression")
|
||||||
|
rtn = None
|
||||||
|
return rtn
|
||||||
|
|
||||||
|
def compileRegex(self, searchText):
|
||||||
|
# Intentionally throws exceptions for use elsewhere
|
||||||
flags = re.UNICODE
|
flags = re.UNICODE
|
||||||
|
|
||||||
if self.searchMenu.caseSensitive() is False:
|
if self.searchMenu.caseSensitive() is False:
|
||||||
|
@ -91,30 +122,33 @@ class search(QWidget, Ui_search):
|
||||||
|
|
||||||
searchText = self.searchTextInput.text()
|
searchText = self.searchTextInput.text()
|
||||||
if len(searchText) > 0:
|
if len(searchText) > 0:
|
||||||
|
results = list()
|
||||||
searchRegex = self.prepareRegex(searchText)
|
searchRegex = self.prepareRegex(searchText)
|
||||||
results = []
|
if searchRegex is not None:
|
||||||
|
# Set override cursor
|
||||||
|
qApp.setOverrideCursor(Qt.WaitCursor)
|
||||||
|
|
||||||
# Set override cursor
|
for model, modelName in [
|
||||||
qApp.setOverrideCursor(Qt.WaitCursor)
|
(mainWindow().mdlOutline, Model.Outline),
|
||||||
|
(mainWindow().mdlCharacter, Model.Character),
|
||||||
|
(flatDataModelWrapper(mainWindow().mdlFlatData), Model.FlatData),
|
||||||
|
(mainWindow().mdlWorld, Model.World),
|
||||||
|
(mainWindow().mdlPlots, Model.Plot)
|
||||||
|
]:
|
||||||
|
filteredColumns = self.searchMenu.columns(modelName)
|
||||||
|
|
||||||
for model, modelName in [
|
# Searching
|
||||||
(mainWindow().mdlOutline, Model.Outline),
|
if len(filteredColumns):
|
||||||
(mainWindow().mdlCharacter, Model.Character),
|
results += model.searchOccurrences(searchRegex, filteredColumns)
|
||||||
(flatDataModelWrapper(mainWindow().mdlFlatData), Model.FlatData),
|
|
||||||
(mainWindow().mdlWorld, Model.World),
|
|
||||||
(mainWindow().mdlPlots, Model.Plot)
|
|
||||||
]:
|
|
||||||
filteredColumns = self.searchMenu.columns(modelName)
|
|
||||||
|
|
||||||
# Searching
|
# Showing results
|
||||||
if len(filteredColumns):
|
self.generateResultsLists(results)
|
||||||
results += model.searchOccurrences(searchRegex, filteredColumns)
|
|
||||||
|
|
||||||
# Showing results
|
# Remove override cursor
|
||||||
self.generateResultsLists(results)
|
qApp.restoreOverrideCursor()
|
||||||
|
else:
|
||||||
# Remove override cursor
|
# No results to generate if there is a problem with the regex
|
||||||
qApp.restoreOverrideCursor()
|
self.generateResultsLists(list())
|
||||||
|
|
||||||
def generateResultsLists(self, results):
|
def generateResultsLists(self, results):
|
||||||
self.noResultsLabel.setVisible(len(results) == 0)
|
self.noResultsLabel.setVisible(len(results) == 0)
|
||||||
|
@ -131,6 +165,7 @@ class search(QWidget, Ui_search):
|
||||||
def leaveEvent(self, event):
|
def leaveEvent(self, event):
|
||||||
self.delegate.mouseLeave()
|
self.delegate.mouseLeave()
|
||||||
|
|
||||||
|
|
||||||
class listResultDelegate(QStyledItemDelegate):
|
class listResultDelegate(QStyledItemDelegate):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QStyledItemDelegate.__init__(self, parent)
|
QStyledItemDelegate.__init__(self, parent)
|
||||||
|
|
Loading…
Reference in a new issue