manuskript/manuskript/ui/views/cmbOutlineCharacterChoser.py

159 lines
4.9 KiB
Python
Raw Normal View History

2015-06-04 17:08:49 +12:00
#!/usr/bin/env python
2016-02-07 00:34:22 +13:00
# --!-- coding: utf8 --!--
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QBrush, QColor
from PyQt5.QtWidgets import QComboBox
from manuskript.enums import Outline
from manuskript.functions import toInt
2017-11-15 02:48:28 +13:00
from manuskript.ui import style as S
2016-02-07 00:34:22 +13:00
2015-06-04 17:08:49 +12:00
class cmbOutlineCharacterChoser(QComboBox):
2015-06-04 17:08:49 +12:00
def __init__(self, parent=None):
QComboBox.__init__(self, parent)
self.activated[int].connect(self.submit)
self._column = Outline.POV.value
self._index = None
self._indexes = None
self._updating = False
2015-06-11 18:55:24 +12:00
self._various = False
2016-02-07 00:34:22 +13:00
def setModels(self, mdlCharacter, mdlOutline):
self.mdlCharacters = mdlCharacter
self.mdlCharacters.dataChanged.connect(self.updateItems)
self.mdlCharacters.rowsInserted.connect(self.updateItems)
self.mdlCharacters.rowsRemoved.connect(self.updateItems)
2015-06-04 17:08:49 +12:00
self.mdlOutline = mdlOutline
self.mdlOutline.dataChanged.connect(self.update)
2015-06-10 00:03:22 +12:00
self.updateItems()
2016-02-07 00:34:22 +13:00
2015-06-04 17:08:49 +12:00
def updateItems(self):
self.clear()
2015-09-29 22:17:03 +13:00
self.addItem(QIcon.fromTheme("dialog-no"), self.tr("None"))
2016-02-07 00:34:22 +13:00
l = [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")]
2016-02-07 00:34:22 +13:00
for importance in range(3):
self.addItem(l[importance])
2017-11-15 02:48:28 +13:00
self.setItemData(self.count() - 1, QBrush(QColor(S.highlightedTextDark)), Qt.ForegroundRole)
self.setItemData(self.count() - 1, QBrush(QColor(S.highlightLight)), Qt.BackgroundRole)
2016-02-07 00:34:22 +13:00
item = self.model().item(self.count() - 1)
item.setFlags(Qt.ItemIsEnabled)
for i in range(self.mdlCharacters.rowCount()):
imp = toInt(self.mdlCharacters.importance(i))
2016-02-07 00:34:22 +13:00
if not 2 - imp == importance:
continue
self.addItem(self.mdlCharacters.icon(i), self.mdlCharacters.name(i), self.mdlCharacters.ID(i))
self.setItemData(self.count() - 1, self.mdlCharacters.name(i), Qt.ToolTipRole)
2016-02-07 00:34:22 +13:00
2015-06-11 18:55:24 +12:00
self._various = False
2016-02-07 00:34:22 +13:00
if self._index or self._indexes:
self.updateSelectedItem()
2016-02-07 00:34:22 +13:00
def setCurrentModelIndex(self, index):
self._indexes = None
if index.column() != self._column:
index = index.sibling(index.row(), self._column)
self._index = index
2015-06-11 18:55:24 +12:00
self.updateItems()
2016-02-07 00:34:22 +13:00
def setCurrentModelIndexes(self, indexes):
self._index = None
2016-02-07 00:34:22 +13:00
2015-06-11 18:55:24 +12:00
idxes = []
for i in indexes:
if i.isValid():
if i.column() != self._column:
i = i.sibling(i.row(), self._column)
2015-06-11 18:55:24 +12:00
idxes.append(i)
2016-02-07 00:34:22 +13:00
2015-06-11 18:55:24 +12:00
if idxes != self._indexes:
self._indexes = idxes
self.updateItems()
2016-02-07 00:34:22 +13:00
def update(self, topLeft, bottomRight):
2016-02-07 00:34:22 +13:00
if self._updating:
# We are currently putting data in the model, so no updates
return
2016-02-07 00:34:22 +13:00
if self._index:
if topLeft.row() <= self._index.row() <= bottomRight.row():
self.updateSelectedItem()
2016-02-07 00:34:22 +13:00
elif self._indexes:
update = False
for i in self._indexes:
if topLeft.row() <= i.row() <= bottomRight.row():
update = True
if update:
self.updateSelectedItem()
2016-02-07 00:34:22 +13:00
def getPOV(self, index):
item = index.internalPointer()
POV = item.data(self._column)
return POV
2016-02-07 00:34:22 +13:00
def selectPOV(self, POV):
idx = self.findData(POV)
if idx != -1:
self.setCurrentIndex(idx)
else:
self.setCurrentIndex(0)
2016-02-07 00:34:22 +13:00
def updateSelectedItem(self, idx1=None, idx2=None):
2016-02-07 00:34:22 +13:00
if self._updating:
return
2016-02-07 00:34:22 +13:00
if self._index:
POV = self.getPOV(self._index)
self.selectPOV(POV)
2016-02-07 00:34:22 +13:00
elif self._indexes:
POVs = []
same = True
2016-02-07 00:34:22 +13:00
for i in self._indexes:
POVs.append(self.getPOV(i))
2016-02-07 00:34:22 +13:00
for POV in POVs[1:]:
if POV != POVs[0]:
same = False
break
2016-02-07 00:34:22 +13:00
if same:
2015-06-11 18:55:24 +12:00
self._various = False
self.selectPOV(POVs[0])
2016-02-07 00:34:22 +13:00
else:
2015-06-11 18:55:24 +12:00
if not self._various:
self.insertItem(0, self.tr("Various"))
f = self.font()
f.setItalic(True)
self.setItemData(0, f, Qt.FontRole)
self.setItemData(0, QBrush(Qt.darkGray), Qt.ForegroundRole)
self._various = True
self.setCurrentIndex(0)
2016-02-07 00:34:22 +13:00
else:
self.setCurrentIndex(0)
2016-02-07 00:34:22 +13:00
def submit(self, idx):
if self._index:
self.mdlOutline.setData(self._index, self.currentData())
2016-02-07 00:34:22 +13:00
elif self._indexes:
2015-06-11 18:55:24 +12:00
if self._various and self.currentIndex() == 0:
return
2016-02-07 00:34:22 +13:00
self._updating = True
for i in self._indexes:
self.mdlOutline.setData(i, self.currentData())
2016-02-07 00:34:22 +13:00
self._updating = False