mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-05-06 14:02:25 +12:00
276 lines
8.8 KiB
Python
276 lines
8.8 KiB
Python
#!/usr/bin/env python
|
|
#--!-- coding: utf8 --!--
|
|
|
|
from qt import *
|
|
from enums import *
|
|
from functions import *
|
|
import collections
|
|
|
|
class worldModel(QStandardItemModel):
|
|
|
|
def __init__(self, parent):
|
|
QStandardItemModel.__init__(self, 0, 3, parent)
|
|
self.mw = mainWindow()
|
|
|
|
###############################################################################
|
|
# SELECTION
|
|
###############################################################################
|
|
|
|
def selectedItem(self):
|
|
"Returns the item selected in mw.treeWorld. invisibleRootItem if None."
|
|
index = self.selectedIndex()
|
|
item = self.itemFromIndex(index)
|
|
if item:
|
|
return item
|
|
else:
|
|
return self.invisibleRootItem()
|
|
|
|
def selectedIndex(self):
|
|
"Returns the selected index in the treeView."
|
|
if self.mw.treeWorld.selectedIndexes():
|
|
return self.mw.treeWorld.currentIndex()
|
|
else:
|
|
return QModelIndex()
|
|
|
|
def selectedIndexes(self):
|
|
return self.mw.treeWorld.selectedIndexes()
|
|
|
|
###############################################################################
|
|
# GETTERS
|
|
###############################################################################
|
|
|
|
def ID(self, index):
|
|
"Returns the ID of the given index."
|
|
index = index.sibling(index.row(), World.ID.value)
|
|
return self.data(index)
|
|
|
|
def name(self, index):
|
|
"Returns the name of the given index."
|
|
index = index.sibling(index.row(), World.name.value)
|
|
return self.data(index)
|
|
|
|
def description(self, index):
|
|
index = index.sibling(index.row(), World.description.value)
|
|
return self.data(index)
|
|
|
|
def conflict(self, index):
|
|
index = index.sibling(index.row(), World.conflict.value)
|
|
return self.data(index)
|
|
|
|
def passion(self, index):
|
|
index = index.sibling(index.row(), World.passion.value)
|
|
return self.data(index)
|
|
|
|
def itemID(self, item):
|
|
"Returns the ID of the given item."
|
|
index = self.indexFromItem(item)
|
|
return self.ID(index)
|
|
|
|
def children(self, item):
|
|
"Returns a list of all item's children."
|
|
c = []
|
|
for i in range(item.rowCount()):
|
|
c.append(item.child(i))
|
|
return c
|
|
|
|
def listAll(self):
|
|
"Returns a list of tupple ``(name, ID, path)`` for all items."
|
|
lst = []
|
|
|
|
def readAll(item):
|
|
name = item.text()
|
|
ID = self.itemID(item)
|
|
path = self.path(item)
|
|
if name and ID:
|
|
lst.append((name, ID, path))
|
|
for c in self.children(item):
|
|
readAll(c)
|
|
|
|
readAll(self.invisibleRootItem())
|
|
|
|
return lst
|
|
|
|
def indexByID(self, ID):
|
|
"Returns the index of item whose ID is ID."
|
|
return self.indexFromItem(self.itemByID(ID))
|
|
|
|
def itemByID(self, ID):
|
|
"Returns the item whose ID is ID."
|
|
def browse(item):
|
|
if self.itemID(item) == ID:
|
|
return item
|
|
for c in self.children(item):
|
|
r = browse(c)
|
|
if r:
|
|
return r
|
|
|
|
r = browse(self.invisibleRootItem())
|
|
return r if r else None
|
|
|
|
def path(self, item):
|
|
"Returns the path to the item in the form of 'ancestor > ... > grand-parent > parent'."
|
|
path = []
|
|
while item.parent():
|
|
item = item.parent()
|
|
path.append(item.text())
|
|
path = " > ".join(path)
|
|
return path
|
|
|
|
###############################################################################
|
|
# ADDING AND REMOVE
|
|
###############################################################################
|
|
|
|
def addItem(self, title=None, parent=None):
|
|
"Adds an item, and returns it."
|
|
if not parent:
|
|
parent = self.selectedItem()
|
|
if not title:
|
|
title = self.tr("New item")
|
|
name = QStandardItem(title)
|
|
_id = QStandardItem(self.getUniqueID())
|
|
row = [name, _id] + [QStandardItem() for i in range(2, len(World))]
|
|
parent.appendRow(row)
|
|
return name
|
|
|
|
def getUniqueID(self):
|
|
"Returns an unused ID"
|
|
|
|
parentItem = self.invisibleRootItem()
|
|
vals = []
|
|
|
|
def collectIDs(item):
|
|
vals.append(int(self.itemID(item)))
|
|
for c in self.children(item):
|
|
collectIDs(c)
|
|
|
|
for c in self.children(parentItem):
|
|
collectIDs(c)
|
|
|
|
k = 0
|
|
while k in vals: k += 1
|
|
return str(k)
|
|
|
|
def removeItem(self):
|
|
while self.selectedIndexes():
|
|
index = self.selectedIndexes()[0]
|
|
self.removeRows(index.row(), 1, index.parent())
|
|
|
|
###############################################################################
|
|
# TEMPLATES
|
|
###############################################################################
|
|
|
|
def dataSets(self):
|
|
"Returns sets of empty data that can guide the writer for world building."
|
|
dataset = {
|
|
self.tr("Fantasy world building"): [
|
|
(self.tr("Physical"), [
|
|
self.tr("Climate"),
|
|
self.tr("Topography"),
|
|
self.tr("Astronomy"),
|
|
self.tr("Natural ressources"),
|
|
self.tr("Wild life"),
|
|
self.tr("Flora"),
|
|
self.tr("History"),
|
|
self.tr("Races"),
|
|
self.tr("Diseases"),
|
|
]),
|
|
(self.tr("Cultural"), [
|
|
self.tr("Customs"),
|
|
self.tr("Food"),
|
|
self.tr("Languages"),
|
|
self.tr("Education"),
|
|
self.tr("Dresses"),
|
|
self.tr("Science"),
|
|
self.tr("Calendar"),
|
|
self.tr("Bodily language"),
|
|
self.tr("Ethics"),
|
|
self.tr("Religion"),
|
|
self.tr("Government"),
|
|
self.tr("Politics"),
|
|
self.tr("Gender roles"),
|
|
self.tr("Music and arts"),
|
|
self.tr("Architecture"),
|
|
self.tr("Military"),
|
|
self.tr("Technology"),
|
|
self.tr("Courtship"),
|
|
self.tr("Demography"),
|
|
self.tr("Transportation"),
|
|
self.tr("Medicine"),
|
|
]),
|
|
(self.tr("Magic system"), [
|
|
self.tr("Rules"),
|
|
self.tr("Organization"),
|
|
self.tr("Magical objects"),
|
|
self.tr("Magical places"),
|
|
self.tr("Magical races"),
|
|
]),
|
|
self.tr("Important places"),
|
|
self.tr("Important objects"),
|
|
]
|
|
}
|
|
return dataset
|
|
|
|
def emptyDataMenu(self):
|
|
"Returns a menu with the empty data sets."
|
|
self.menu = QMenu("menu")
|
|
for name in self.dataSets():
|
|
a = QAction(name, self.menu)
|
|
a.triggered.connect(self.setEmptyData)
|
|
self.menu.addAction(a)
|
|
return self.menu
|
|
|
|
def setEmptyData(self):
|
|
"Called from the menu generated with ``emptyDataMenu``."
|
|
act = self.sender()
|
|
data = self.dataSets()[act.text()]
|
|
|
|
def addItems(data, parent):
|
|
for d in data:
|
|
if len(d) == 1 or type(d) == str:
|
|
self.addItem(d, parent)
|
|
else:
|
|
i = self.addItem(d[0], parent)
|
|
addItems(d[1], i)
|
|
|
|
addItems(data, None)
|
|
self.mw.treeWorld.expandAll()
|
|
|
|
###############################################################################
|
|
# APPEARANCE
|
|
###############################################################################
|
|
|
|
def data(self, index, role=Qt.EditRole):
|
|
level = 0
|
|
i = index
|
|
while i.parent() != QModelIndex():
|
|
i = i.parent()
|
|
level += 1
|
|
|
|
if role == Qt.BackgroundRole:
|
|
if level == 0:
|
|
return QBrush(lightBlue())
|
|
|
|
if role == Qt.TextAlignmentRole:
|
|
if level == 0:
|
|
return Qt.AlignCenter
|
|
|
|
if role == Qt.FontRole:
|
|
if level in [0, 1]:
|
|
f = qApp.font()
|
|
f.setBold(True)
|
|
return f
|
|
|
|
if role == Qt.ForegroundRole:
|
|
if level == 0:
|
|
return QBrush(Qt.darkBlue)
|
|
|
|
if role == Qt.SizeHintRole:
|
|
fm = QFontMetrics(qApp.font())
|
|
h = fm.height()
|
|
if level == 0:
|
|
return QSize(0, h + 12)
|
|
elif level == 1:
|
|
return QSize(0, h + 6)
|
|
|
|
return QStandardItemModel.data(self, index, role)
|
|
|