#!/usr/bin/env python #--!-- coding: utf8 --!-- from qt import * from enums import * from models.outlineModel import * import models.references as Ref from ui.search_ui import * from functions import * class search(QWidget, Ui_search): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.options = { "All": True, "Title": True, "Text": True, "Summary": False, "Notes": False, "POV": False, "Status": False, "Label": False, "CS": True } self.text.returnPressed.connect(self.search) self.generateOptionMenu() self.delegate = listResultDelegate(self) self.result.setItemDelegate(self.delegate) self.result.itemActivated.connect(self.openItem) def generateOptionMenu(self): self.menu = QMenu(self) a = QAction(self.tr("Search in:"), self.menu) a.setEnabled(False) self.menu.addAction(a) for i, d in [ (self.tr("All"), "All"), (self.tr("Title"), "Title"), (self.tr("Text"), "Text"), (self.tr("Summary"), "Summary"), (self.tr("Notes"), "Notes"), (self.tr("POV"), "POV"), (self.tr("Status"), "Status"), (self.tr("Label"), "Label"), ]: a = QAction(i, self.menu) a.setCheckable(True) a.setChecked(self.options[d]) a.setData(d) a.triggered.connect(self.updateOptions) self.menu.addAction(a) self.menu.addSeparator() a = QAction(self.tr("Options:"), self.menu) a.setEnabled(False) self.menu.addAction(a) for i, d in [ (self.tr("Case sensitive"), "CS"), ]: a = QAction(i, self.menu) a.setCheckable(True) a.setChecked(self.options[d]) a.setData(d) a.triggered.connect(self.updateOptions) self.menu.addAction(a) self.menu.addSeparator() self.btnOptions.setMenu(self.menu) def updateOptions(self): a = self.sender() self.options[a.data()] = a.isChecked() def search(self): text = self.text.text() # Chosing the right columns lstColumns = [ ("Title", Outline.title.value), ("Text", Outline.text.value), ("Summary", Outline.summarySentance.value), ("Summary", Outline.summaryFull.value), ("Notes", Outline.notes.value), ("POV", Outline.POV.value), ("Status", Outline.status.value), ("Label", Outline.label.value), ] columns = [c[1] for c in lstColumns if self.options[c[0]] or self.options["All"]] # Setting override cursor qApp.setOverrideCursor(Qt.WaitCursor) # Searching model = mainWindow().mdlOutline results = model.findItemsContaining(text, columns, self.options["CS"]) # Showing results self.result.clear() for r in results: index = model.getIndexByID(r) if not index.isValid(): continue item = index.internalPointer() i = QListWidgetItem(item.title(), self.result) i.setData(Qt.UserRole, r) i.setData(Qt.UserRole + 1, item.path()) self.result.addItem(i) # Removing override cursor qApp.restoreOverrideCursor() def openItem(self, item): r = Ref.textReference(item.data(Qt.UserRole)) Ref.open(r) #mw = mainWindow() #index = mw.mdlOutline.getIndexByID(item.data(Qt.UserRole)) #mw.mainEditor.setCurrentModelIndex(index, newTab=True) class listResultDelegate(QStyledItemDelegate): def __init__(self, parent=None): QStyledItemDelegate.__init__(self, parent) def paint(self, painter, option, index): extra = index.data(Qt.UserRole+1) if not extra: return QStyledItemDelegate.paint(self, painter, option, index) else: if option.state & QStyle.State_Selected: painter.fillRect(option.rect, option.palette.color(QPalette.Highlight)) title = index.data() extra = " - {}".format(extra) painter.drawText(option.rect.adjusted(2, 1, 0, 0), Qt.AlignLeft, title) fm = QFontMetrics(option.font) w = fm.width(title) r = QRect(option.rect) r.setLeft(r.left() + w) painter.save() if option.state & QStyle.State_Selected: painter.setPen(Qt.white) else: painter.setPen(Qt.gray) painter.drawText(r.adjusted(2, 1, 0, 0), Qt.AlignLeft, extra) painter.restore()