manuskript/manuskript/ui/cheatSheet.py
2018-08-14 09:04:00 -06:00

196 lines
6.8 KiB
Python

#!/usr/bin/env python
# --!-- coding: utf8 --!--
from PyQt5.QtCore import pyqtSignal, Qt, QTimer, QRect
from PyQt5.QtGui import QBrush, QCursor, QPalette, QFontMetrics, QColor
from PyQt5.QtWidgets import QWidget, QListWidgetItem, QToolTip, QStyledItemDelegate, QStyle
from manuskript.enums import Character
from manuskript.enums import Plot
from manuskript.functions import mainWindow
from manuskript.ui import style as S
from manuskript.ui.cheatSheet_ui import Ui_cheatSheet
from manuskript.models import references as Ref
from manuskript.ui.editors.completer import completer
class cheatSheet(QWidget, Ui_cheatSheet):
activated = pyqtSignal(str)
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setupUi(self)
self.txtFilter.setStyleSheet(S.lineEditSS())
self.splitter.setStretchFactor(0, 5)
self.splitter.setStretchFactor(1, 70)
self.txtFilter.textChanged.connect(self.textChanged)
self.txtFilter.textChanged.connect(self.updateListFromData)
self.txtFilter.returnPressed.connect(self.showInfos)
self.listDelegate = listCompleterDelegate(self)
self.list.setItemDelegate(self.listDelegate)
self.list.itemActivated.connect(self.showInfos)
self.list.itemClicked.connect(self.showInfos)
self.hideList()
self.list.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.view.linkActivated.connect(self.openLink)
self.view.linkHovered.connect(self.linkHovered)
self.btnShowList.toggled.connect(self.list.setVisible)
self.line.hide()
self.outlineModel = None
self.characterModel = None
self.plotModel = None
self.worldModel = None
self.populateTimer = QTimer(self)
self.populateTimer.setSingleShot(True)
self.populateTimer.setInterval(500)
self.populateTimer.timeout.connect(self.populate)
self.populateTimer.stop()
self.data = {}
self.populate()
def setModels(self):
mw = mainWindow()
self.outlineModel = mw.mdlOutline
self.characterModel = mw.mdlCharacter
self.plotModel = mw.mdlPlots
self.worldModel = mw.mdlWorld
self.outlineModel.dataChanged.connect(self.populateTimer.start)
self.characterModel.dataChanged.connect(self.populateTimer.start)
self.characterModel.rowsInserted.connect(self.populateTimer.start)
self.characterModel.rowsRemoved.connect(self.populateTimer.start)
self.plotModel.dataChanged.connect(self.populateTimer.start)
self.worldModel.dataChanged.connect(self.populateTimer.start)
self.populate()
def textChanged(self, text):
if not text:
self.hideList()
self.list.clear()
self.view.setText("")
else:
self.list.show()
def hideList(self):
if not self.btnShowList.isChecked():
self.list.hide()
def populate(self):
if self.characterModel:
d = []
for c in self.characterModel.characters:
imp = [self.tr("Minor"), self.tr("Secondary"), self.tr("Main")][int(c.importance())]
d.append((c.name(), c.ID(), imp))
self.data[(self.tr("Characters"), Ref.CharacterLetter)] = d
if self.outlineModel:
d = []
def addChildren(item):
for c in item.children():
d.append((c.title(), c.ID(), c.path()))
addChildren(c)
r = self.outlineModel.rootItem
addChildren(r)
self.data[(self.tr("Texts"), Ref.TextLetter)] = d
if self.plotModel:
d = []
for r in range(self.plotModel.rowCount()):
name = self.plotModel.item(r, Plot.name).text()
ID = self.plotModel.item(r, Plot.ID).text()
imp = self.plotModel.item(r, Plot.importance).text()
imp = [self.tr("Minor"), self.tr("Secondary"), self.tr("Main")][int(imp)]
d.append((name, ID, imp))
self.data[(self.tr("Plots"), Ref.PlotLetter)] = d
if self.worldModel:
d = self.worldModel.listAll()
self.data[(self.tr("World"), Ref.WorldLetter)] = d
self.updateListFromData()
def addCategory(self, title):
item = QListWidgetItem(title)
item.setBackground(QBrush(QColor(S.highlightLight)))
item.setForeground(QBrush(QColor(S.highlightedTextDark)))
item.setFlags(Qt.ItemIsEnabled)
f = item.font()
f.setBold(True)
item.setFont(f)
self.list.addItem(item)
def updateListFromData(self):
self.list.clear()
for cat in self.data:
filtered = [i for i in self.data[cat] if self.txtFilter.text().lower() in i[0].lower() or
self.txtFilter.text().lower() in cat[0].lower()]
if filtered:
self.addCategory(cat[0])
for item in filtered:
i = QListWidgetItem(item[0])
i.setData(Qt.UserRole, Ref.EmptyRef.format(cat[1], item[1], item[0]))
i.setData(Qt.UserRole + 1, item[2])
self.list.addItem(i)
self.list.setCurrentRow(1)
def showInfos(self):
self.hideList()
if self.list and len(self.txtFilter.text()) != 0:
i = self.list.currentItem()
ref = i.data(Qt.UserRole)
if ref:
self.view.setText(Ref.infos(ref))
def openLink(self, link):
Ref.open(link)
def linkHovered(self, link):
if link:
QToolTip.showText(QCursor.pos(), Ref.tooltip(link))
def keyPressEvent(self, event):
if event.key() in [Qt.Key_Up, Qt.Key_Down]:
self.list.keyPressEvent(event)
else:
QWidget.keyPressEvent(self, event)
class listCompleterDelegate(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.Inactive, QPalette.Highlight))
title = index.data()
extra = " - {}".format(extra)
painter.drawText(option.rect, Qt.AlignLeft, title)
fm = QFontMetrics(option.font)
w = fm.width(title)
r = QRect(option.rect)
r.setLeft(r.left() + w)
painter.save()
painter.setPen(Qt.gray)
painter.drawText(r, Qt.AlignLeft, extra)
painter.restore()