manuskript/manuskript/ui/cheatSheet.py
2016-02-06 08:38:33 +01:00

171 lines
6 KiB
Python

#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from models.outlineModel import *
from ui.cheatSheet_ui import *
from functions import *
import models.references as Ref
class cheatSheet(QWidget, Ui_cheatSheet):
activated = pyqtSignal(str)
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setupUi(self)
self.splitter.setStretchFactor(0, 5)
self.splitter.setStretchFactor(1, 70)
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.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.view.linkActivated.connect(self.openLink)
self.view.linkHovered.connect(self.linkHovered)
self.outlineModel = None
self.persoModel = 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.persoModel = mw.mdlPersos
self.plotModel = mw.mdlPlots
self.worldModel = mw.mdlWorld
self.outlineModel.dataChanged.connect(self.populateTimer.start)
self.persoModel.dataChanged.connect(self.populateTimer.start)
self.plotModel.dataChanged.connect(self.populateTimer.start)
self.worldModel.dataChanged.connect(self.populateTimer.start)
self.populate()
def populate(self):
if self.persoModel:
d = []
for r in range(self.persoModel.rowCount()):
name = self.persoModel.item(r, Perso.name.value).text()
ID = self.persoModel.item(r, Perso.ID.value).text()
imp = self.persoModel.item(r, Perso.importance.value).text()
imp = [self.tr("Minor"), self.tr("Secondary"), self.tr("Main")][int(imp)]
d.append((name, ID, imp))
self.data[(self.tr("Characters"), Ref.PersoLetter)] = 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.value).text()
ID = self.plotModel.item(r, Plot.ID.value).text()
imp = self.plotModel.item(r, Plot.importance.value).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(lightBlue()))
item.setForeground(QBrush(Qt.darkBlue))
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()]
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):
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()