mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-09-30 01:07:24 +13:00
108 lines
3.9 KiB
Python
108 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)
|