manuskript/manuskript/ui/searchMenu.py
2021-04-02 14:15:17 +01:00

109 lines
3.9 KiB
Python

#!/usr/bin/env python
# --!-- coding: utf8 --!--
from PyQt5.QtWidgets import QMenu, QAction
from PyQt5.QtCore import QCoreApplication
from PyQt5 import QtCore
from manuskript.searchLabels import OutlineSearchLabels, CharacterSearchLabels, FlatDataSearchLabels, WorldSearchLabels, PlotSearchLabels
from manuskript.models.searchFilter import searchFilter
from manuskript.enums import Model
def filterKey(modelPreffix, column):
return modelPreffix + str(column)
class searchMenu(QMenu):
def __init__(self, parent=None):
QMenu.__init__(self, parent)
_translate = QCoreApplication.translate
# Model keys must match the ones used in search widget class
self.filters = {
Model.Outline: searchFilter(_translate("MainWindow", "Outline"), True, list(OutlineSearchLabels.keys())),
Model.Character: searchFilter(_translate("MainWindow", "Characters"), True, list(CharacterSearchLabels.keys())),
Model.FlatData: searchFilter(_translate("MainWindow", "FlatData"), True, list(FlatDataSearchLabels.keys())),
Model.World: searchFilter(_translate("MainWindow", "World"), True, list(WorldSearchLabels.keys())),
Model.Plot: searchFilter(_translate("MainWindow", "Plot"), True, list(PlotSearchLabels.keys()))
}
self.options = {
"CS": [self.tr("Case sensitive"), True],
"MatchWords": [self.tr("Match words"), False],
"Regex": [self.tr("Regex"), False]
}
self._generateOptions()
def _generateOptions(self):
a = QAction(self.tr("Search in:"), self)
a.setEnabled(False)
self.addAction(a)
for filterKey in self.filters:
a = QAction(self.tr(self.filters[filterKey].label()), self)
a.setCheckable(True)
a.setChecked(self.filters[filterKey].enabled())
a.setData(filterKey)
a.triggered.connect(self._updateFilters)
self.addAction(a)
self.addSeparator()
a = QAction(self.tr("Options:"), self)
a.setEnabled(False)
self.addAction(a)
for optionKey in self.options:
a = QAction(self.options[optionKey][0], self)
a.setCheckable(True)
a.setChecked(self.options[optionKey][1])
a.setData(optionKey)
a.triggered.connect(self._updateOptions)
self.addAction(a)
self.addSeparator()
def _updateFilters(self):
a = self.sender()
self.filters[a.data()].setEnabled(a.isChecked())
def _updateOptions(self):
a = self.sender()
self.options[a.data()][1] = a.isChecked()
def columns(self, modelName):
if self.filters[modelName].enabled():
return self.filters[modelName].modelColumns()
else:
return []
def caseSensitive(self):
return self.options["CS"][1]
def matchWords(self):
return self.options["MatchWords"][1]
def regex(self):
return self.options["Regex"][1]
def mouseReleaseEvent(self, event):
# Workaround for enabling / disabling actions without closing the menu.
# Source: https://stackoverflow.com/a/14967212
action = self.activeAction()
if action:
action.setEnabled(False)
QMenu.mouseReleaseEvent(self, event)
action.setEnabled(True)
action.trigger()
else:
QMenu.mouseReleaseEvent(self, event)
def keyPressEvent(self, event):
# Workaround for enabling / disabling actions without closing the menu.
# Source: https://stackoverflow.com/a/14967212
action = self.activeAction()
if action and event.key() == QtCore.Qt.Key_Return:
action.setEnabled(False)
QMenu.keyPressEvent(self, event)
action.setEnabled(True)
action.trigger()
else:
QMenu.keyPressEvent(self, event)