manuskript/manuskript/ui/views/cmbOutlineStatusChoser.py

140 lines
3.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 QBrush
from PyQt5.QtWidgets import QComboBox
from manuskript.enums import Outline
2015-06-04 17:08:49 +12:00
2015-06-04 17:08:49 +12:00
class cmbOutlineStatusChoser(QComboBox):
def __init__(self, parent=None):
QComboBox.__init__(self, parent)
self.activated[int].connect(self.submit)
self._column = Outline.status.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
2015-06-11 01:57:44 +12:00
def setModels(self, mdlStatus, mdlOutline):
self.mdlStatus = mdlStatus
self.mdlStatus.dataChanged.connect(self.updateItems)
2015-06-04 17:08:49 +12:00
self.mdlOutline = mdlOutline
self.mdlOutline.dataChanged.connect(self.update)
2015-06-04 17:08:49 +12:00
self.updateItems()
2016-02-07 00:34:22 +13:00
def updateItems(self):
2015-06-04 17:08:49 +12:00
self.clear()
2015-06-11 01:57:44 +12:00
for i in range(self.mdlStatus.rowCount()):
item = self.mdlStatus.item(i, 0)
if item:
self.addItem(item.text())
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()
self.updateSelectedItem()
2016-02-07 00:34:22 +13:00
def setCurrentModelIndexes(self, indexes):
self._indexes = []
self._index = None
2016-02-07 00:34:22 +13:00
for i in indexes:
if i.isValid():
if i.column() != self._column:
i = i.sibling(i.row(), self._column)
self._indexes.append(i)
2016-02-07 00:34:22 +13:00
2015-06-11 18:55:24 +12:00
self.updateItems()
self.updateSelectedItem()
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 getStatus(self, index):
item = index.internalPointer()
status = item.data(self._column)
2016-02-07 00:34:22 +13:00
if not status:
status = 0
return int(status)
2016-02-07 00:34:22 +13:00
def updateSelectedItem(self):
2016-02-07 00:34:22 +13:00
if self._updating:
return
2016-02-07 00:34:22 +13:00
if self._index:
status = self.getStatus(self._index)
self.setCurrentIndex(status)
2016-02-07 00:34:22 +13:00
elif self._indexes:
statuses = []
same = True
2016-02-07 00:34:22 +13:00
for i in self._indexes:
statuses.append(self.getStatus(i))
2016-02-07 00:34:22 +13:00
for s in statuses[1:]:
if s != statuses[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.setCurrentIndex(statuses[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.currentIndex())
2016-02-07 00:34:22 +13:00
elif self._indexes:
2015-06-11 18:55:24 +12:00
value = self.currentIndex()
2016-02-07 00:34:22 +13:00
2015-06-11 18:55:24 +12:00
if self._various:
if value == 0:
return
2016-02-07 00:34:22 +13:00
2015-06-11 18:55:24 +12:00
value -= 1
2016-02-07 00:34:22 +13:00
self._updating = True
for i in self._indexes:
2015-06-11 18:55:24 +12:00
self.mdlOutline.setData(i, value)
2016-02-07 00:34:22 +13:00
self._updating = False