From 83552ef2100415e87db9725549146a296f6c5e6a Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Sun, 28 Jun 2015 23:46:51 +0200 Subject: [PATCH] Working on curstom Perso Model --- src/mainWindow.py | 262 ++++++++++++++++++---------------- src/models/persosModel.py | 125 ++++++++++++++++ src/models/plotModel.py | 22 +-- src/ui/mainWindow.py | 20 +-- src/ui/mainWindow.ui | 19 ++- src/ui/views/persoTreeView.py | 121 ++++++++++++++++ src/ui/welcome.py | 14 +- 7 files changed, 420 insertions(+), 163 deletions(-) create mode 100644 src/models/persosModel.py create mode 100644 src/ui/views/persoTreeView.py diff --git a/src/mainWindow.py b/src/mainWindow.py index e50b8e37..0dabb47b 100644 --- a/src/mainWindow.py +++ b/src/mainWindow.py @@ -8,8 +8,9 @@ from ui.helpLabel import helpLabel from loadSave import * from enums import * from models.outlineModel import * +from models.persosModel import * from models.plotModel import * -from models.persosProxyModel import * +#from models.persosProxyModel import * from functions import * from settingsWindow import * import settings @@ -119,118 +120,134 @@ class MainWindow(QMainWindow, Ui_MainWindow): # PERSOS ############################################################################### - def createPerso(self): - """Creates a perso by adding a row in mdlPersos - and a column in mdlPersosInfos with same ID""" - p = QStandardItem(self.tr("New character")) - pid = self.getPersosID() - #self.checkPersosID() # Attributes a persoID (which is logically pid) - self.mdlPersos.appendRow([p, QStandardItem(pid), QStandardItem("0")]) + #def createPerso(self): + #"""Creates a perso by adding a row in mdlPersos + #and a column in mdlPersosInfos with same ID""" + #p = QStandardItem(self.tr("New character")) + #pid = self.getPersosID() + ##self.checkPersosID() # Attributes a persoID (which is logically pid) + #self.mdlPersos.appendRow([p, QStandardItem(pid), QStandardItem("0")]) - self.setPersoColor(self.mdlPersos.rowCount() - 1, - randomColor(QColor(Qt.white))) + #self.setPersoColor(self.mdlPersos.rowCount() - 1, + #randomColor(QColor(Qt.white))) - # Add column in persos infos - self.mdlPersosInfos.insertColumn(self.mdlPersosInfos.columnCount(), - [QStandardItem(pid)]) - self.mdlPersosInfos.setHorizontalHeaderItem( - self.mdlPersosInfos.columnCount() - 1, - QStandardItem("Valeur")) + ## Add column in persos infos + #self.mdlPersosInfos.insertColumn(self.mdlPersosInfos.columnCount(), + #[QStandardItem(pid)]) + #self.mdlPersosInfos.setHorizontalHeaderItem( + #self.mdlPersosInfos.columnCount() - 1, + #QStandardItem("Valeur")) - def getPersosID(self): - """Returns an unused perso ID (row 1).""" - vals = [] - for i in range(self.mdlPersos.rowCount()): - item = self.mdlPersos.item(i, Perso.ID.value) - if item and item.text(): - vals.append(int(item.text())) + #def getPersosID(self): + #"""Returns an unused perso ID (row 1).""" + #vals = [] + #for i in range(self.mdlPersos.rowCount()): + #item = self.mdlPersos.item(i, Perso.ID.value) + #if item and item.text(): + #vals.append(int(item.text())) - k = 0 - while k in vals: - k += 1 - return str(k) + #k = 0 + #while k in vals: + #k += 1 + #return str(k) - def checkPersosID(self): - """Checks whether some persos ID (row 1) are empty. - If so, assign an ID""" - for i in range(self.mdlPersos.rowCount()): - item = self.mdlPersos.item(i, Perso.ID.value) - if not item: - item = QStandardItem() - item.setText(self.getPersosID()) - self.mdlPersos.setItem(i, Perso.ID.value, item) + #def checkPersosID(self): + #"""Checks whether some persos ID (row 1) are empty. + #If so, assign an ID""" + #for i in range(self.mdlPersos.rowCount()): + #item = self.mdlPersos.item(i, Perso.ID.value) + #if not item: + #item = QStandardItem() + #item.setText(self.getPersosID()) + #self.mdlPersos.setItem(i, Perso.ID.value, item) - def removePerso(self): - if self.mdlPersosProxy: - i = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) - else: - i = self.lstPersos.currentIndex() - self.mdlPersos.takeRow(i.row()) - self.mdlPersosInfos.takeColumn(i.row() + 1) + #def removePerso(self): + #if self.mdlPersosProxy: + #i = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) + #else: + #i = self.lstPersos.currentIndex() + #self.mdlPersos.takeRow(i.row()) + #self.mdlPersosInfos.takeColumn(i.row() + 1) def changeCurrentPerso(self, trash=None): - if self.mdlPersosProxy: - idx = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) - else: - idx = self.lstPersos.currentIndex() + + index = self.lstPersos.currentPersoIndex() - self.mprPersos.setCurrentModelIndex(idx) + if not index.isValid(): + self.tabPlot.setEnabled(False) + return - # Button color - self.updatePersoColor() + self.tabPersos.setEnabled(True) + # FIXME + #self.txtPlotName.setCurrentModelIndex(index) + #self.txtPlotDescription.setCurrentModelIndex(index) + #self.txtPlotResult.setCurrentModelIndex(index) + #self.sldPlotImportance.setCurrentModelIndex(index) + + ## Button color + self.mdlPersos.updatePersoColor(index) + + + #if self.mdlPersosProxy: + #idx = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) + #else: + #idx = self.lstPersos.currentIndex() - # detailed infos - pid = self.mdlPersos.item(idx.row(), Perso.ID.value).text() - for c in range(self.mdlPersosInfos.columnCount()): - pid2 = self.mdlPersosInfos.item(0, c).text() - self.tblPersoInfos.setColumnHidden(c, c != 0 and pid != pid2) + #self.mprPersos.setCurrentModelIndex(idx) - self.resizePersosInfos() - def updatePersoColor(self): - if self.mdlPersosProxy: - idx = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) - else: - idx = self.lstPersos.currentIndex() + ## detailed infos + #pid = self.mdlPersos.item(idx.row(), Perso.ID.value).text() + #for c in range(self.mdlPersosInfos.columnCount()): + #pid2 = self.mdlPersosInfos.item(0, c).text() + #self.tblPersoInfos.setColumnHidden(c, c != 0 and pid != pid2) - icon = self.mdlPersos.item(idx.row()).icon() - color = iconColor(icon).name() if icon else "" - self.btnPersoColor.setStyleSheet("background:{};".format(color)) + #self.resizePersosInfos() - def resizePersosInfos(self): - self.tblPersoInfos.resizeColumnToContents(0) - w = self.tblPersoInfos.viewport().width() - w2 = self.tblPersoInfos.columnWidth(0) + #def updatePersoColor(self): + #if self.mdlPersosProxy: + #idx = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) + #else: + #idx = self.lstPersos.currentIndex() - if self.mdlPersosProxy: - current = self.mdlPersosProxy.mapToSource( - self.lstPersos.currentIndex()).row() + 1 - else: - current = self.lstPersos.currentIndex().row() + 1 + #icon = self.mdlPersos.item(idx.row()).icon() + #color = iconColor(icon).name() if icon else "" + #self.btnPersoColor.setStyleSheet("background:{};".format(color)) - self.tblPersoInfos.setColumnWidth(current, w - w2) + #def resizePersosInfos(self): + #self.tblPersoInfos.resizeColumnToContents(0) + #w = self.tblPersoInfos.viewport().width() + #w2 = self.tblPersoInfos.columnWidth(0) - def chosePersoColor(self): - if self.mdlPersosProxy: - idx = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) - else: - idx = self.lstPersos.currentIndex() + #if self.mdlPersosProxy: + #current = self.mdlPersosProxy.mapToSource( + #self.lstPersos.currentIndex()).row() + 1 + #else: + #current = self.lstPersos.currentIndex().row() + 1 - item = self.mdlPersos.item(idx.row(), Perso.name.value) - if item: - color = iconColor(item.icon()) - else: - color = Qt.white - self.colorDialog = QColorDialog(color, self) - color = self.colorDialog.getColor(color) - if color.isValid(): - self.setPersoColor(idx.row(), color) - self.updatePersoColor() + #self.tblPersoInfos.setColumnWidth(current, w - w2) - def setPersoColor(self, row, color): - px = QPixmap(32, 32) - px.fill(color) - self.mdlPersos.item(row, Perso.name.value).setIcon(QIcon(px)) + #def chosePersoColor(self): + #if self.mdlPersosProxy: + #idx = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) + #else: + #idx = self.lstPersos.currentIndex() + + #item = self.mdlPersos.item(idx.row(), Perso.name.value) + #if item: + #color = iconColor(item.icon()) + #else: + #color = Qt.white + #self.colorDialog = QColorDialog(color, self) + #color = self.colorDialog.getColor(color) + #if color.isValid(): + #self.setPersoColor(idx.row(), color) + #self.updatePersoColor() + + #def setPersoColor(self, row, color): + #px = QPixmap(32, 32) + #px.fill(color) + #self.mdlPersos.item(row, Perso.name.value).setIcon(QIcon(px)) ############################################################################### # PLOTS @@ -349,7 +366,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.mdlFlatData.dataChanged.connect(self.startTimerNoChanges) self.mdlOutline.dataChanged.connect(self.startTimerNoChanges) self.mdlPersos.dataChanged.connect(self.startTimerNoChanges) - self.mdlPersosInfos.dataChanged.connect(self.startTimerNoChanges) + #self.mdlPersosInfos.dataChanged.connect(self.startTimerNoChanges) self.mdlStatus.dataChanged.connect(self.startTimerNoChanges) self.mdlLabels.dataChanged.connect(self.startTimerNoChanges) @@ -364,7 +381,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): #FIXME: set Window's name: project name # Stuff - self.checkPersosID() + #self.checkPersosID() # Should'n be necessary any longer # Show main Window self.stack.setCurrentIndex(1) @@ -447,8 +464,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): "flatModel.xml")) files.append((saveStandardItemModelXML(self.mdlPersos), "perso.xml")) - files.append((saveStandardItemModelXML(self.mdlPersosInfos), - "persoInfos.xml")) + #files.append((saveStandardItemModelXML(self.mdlPersosInfos), + #"persoInfos.xml")) files.append((saveStandardItemModelXML(self.mdlLabels), "labels.xml")) files.append((saveStandardItemModelXML(self.mdlStatus), @@ -470,9 +487,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): def loadEmptyDatas(self): self.mdlFlatData = QStandardItemModel(self) - self.mdlPersos = QStandardItemModel(self) - self.mdlPersosProxy = persosProxyModel(self) - self.mdlPersosInfos = QStandardItemModel(self) + self.mdlPersos = persosModel(self) + #self.mdlPersosProxy = persosProxyModel(self) + #self.mdlPersosInfos = QStandardItemModel(self) self.mdlLabels = QStandardItemModel(self) self.mdlStatus = QStandardItemModel(self) self.mdlPlots = plotModel(self) @@ -497,11 +514,11 @@ class MainWindow(QMainWindow, Ui_MainWindow): errors.append("perso.xml") - if "persoInfos.xml" in files: - loadStandardItemModelXML(self.mdlPersosInfos, - files["persoInfos.xml"], fromString=True) - else: - errors.append("perso.xml") + #if "persoInfos.xml" in files: + #loadStandardItemModelXML(self.mdlPersosInfos, + #files["persoInfos.xml"], fromString=True) + #else: + #errors.append("perso.xml") if "labels.xml" in files: loadStandardItemModelXML(self.mdlLabels, @@ -550,9 +567,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): def makeUIConnections(self): "Connections that have to be made once only, event when new project is loaded." - self.btnAddPerso.clicked.connect(self.createPerso, AUC) - self.btnRmPerso.clicked.connect(self.removePerso, AUC) - self.btnPersoColor.clicked.connect(self.chosePersoColor, AUC) + self.lstPersos.currentItemChanged.connect(self.changeCurrentPerso, AUC) self.txtPlotFilter.textChanged.connect(self.lstPlots.setFilter, AUC) self.lstPlots.currentItemChanged.connect(self.changeCurrentPlot, AUC) @@ -609,17 +624,22 @@ class MainWindow(QMainWindow, Ui_MainWindow): widget.setCurrentModelIndex(self.mdlFlatData.index(0, col)) # Persos - if self.mdlPersosProxy: - self.mdlPersosProxy.setSourceModel(self.mdlPersos) - self.lstPersos.setModel(self.mdlPersosProxy) - else: - self.lstPersos.setModel(self.mdlPersos) + self.lstPersos.setPersosModel(self.mdlPersos) + self.btnAddPerso.clicked.connect(self.mdlPersos.addPerso, AUC) + self.btnRmPerso.clicked.connect(self.mdlPersos.removePerso, AUC) + self.btnPersoColor.clicked.connect(self.mdlPersos.chosePersoColor, AUC) + #if self.mdlPersosProxy: + #self.mdlPersosProxy.setSourceModel(self.mdlPersos) + #self.lstPersos.setModel(self.mdlPersosProxy) + #else: + #self.lstPersos.setModel(self.mdlPersos) - self.tblPersoInfos.setModel(self.mdlPersosInfos) - self.tblPersoInfos.setRowHidden(0, True) - - self.btnPersoAddInfo.clicked.connect(lambda: - self.mdlPersosInfos.insertRow(self.mdlPersosInfos.rowCount()), AUC) + #self.tblPersoInfos.setModel(self.mdlPersosInfos) + #self.tblPersoInfos.setRowHidden(0, True) + + #FIXME + #self.btnPersoAddInfo.clicked.connect(lambda: + #self.mdlPersosInfos.insertRow(self.mdlPersosInfos.rowCount()), AUC) self.mprPersos = QDataWidgetMapper() self.mprPersos.setModel(self.mdlPersos) @@ -643,8 +663,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.mprPersos.setCurrentIndex(0) self.lstPersos.selectionModel().currentChanged.connect( - self.changeCurrentPerso, AUC) - self.tabPersos.currentChanged.connect(self.resizePersosInfos) + self.mdlPersos.updatePersoColor, AUC) + #self.tabPersos.currentChanged.connect(self.resizePersosInfos) # Plots self.lstPlots.setPlotModel(self.mdlPlots) @@ -712,7 +732,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.mdlFlatData.setVerticalHeaderLabels(["Infos générales", "Summary"]) self.tblDebugFlatData.setModel(self.mdlFlatData) self.tblDebugPersos.setModel(self.mdlPersos) - self.tblDebugPersosInfos.setModel(self.mdlPersosInfos) + #self.tblDebugPersosInfos.setModel(self.mdlPersosInfos) self.tblDebugPlots.setModel(self.mdlPlots) self.tblDebugPlotsPersos.setModel(self.mdlPlots) self.tblDebugSubPlots.setModel(self.mdlPlots) diff --git a/src/models/persosModel.py b/src/models/persosModel.py new file mode 100644 index 00000000..0bcb101f --- /dev/null +++ b/src/models/persosModel.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python +#--!-- coding: utf8 --!-- + +from qt import * +from enums import * +from functions import * + +class persosModel(QStandardItemModel): + + def __init__(self, parent): + QStandardItemModel.__init__(self, 0, 3, parent) + self.setHorizontalHeaderLabels([i.name for i in Plot]) + self.mw = mainWindow() + #self._proxy = plotsProxyModel() + #self._proxy.setSourceModel(self) + +############################################################################### +# QUERRIES +############################################################################### + + def getPersosByImportance(self): + persos = [[], [], []] + for i in range(self.rowCount()): + importance = self.item(i, Perso.importance.value).text() + ID = self.item(i, Perso.ID.value).text() + persos[2-toInt(importance)].append(ID) + return persos + + def getPersoNameByID(self, ID): + for i in range(self.rowCount()): + _ID = self.item(i, Perso.ID.value).text() + if _ID == ID or toInt(_ID) == ID: + name = self.item(i, Perso.name.value).text() + return name + return None + + def getIndexFromID(self, ID): + for i in range(self.rowCount()): + _ID = self.item(i, Perso.ID.value).text() + if _ID == ID or toInt(_ID) == ID: + return self.index(i, 0) + return QModelIndex() + + def getPersoColorByID(self, ID): + idx = self.getIndexFromID(ID) + return self.getPersoColorName(idx) + + def getPersoColorName(self, index): + icon = self.item(index.row()).icon() + return iconColor(icon).name() if icon else "" + + def currentListIndex(self): + i = self.mw.lstPersos.currentIndex() + if i .isValid(): + return i + else: + return None + + def currentPersoIndex(self): + return self.mw.lstPersos.currentPersoIndex() + +############################################################################### +# ADDING / REMOVING +############################################################################### + + def addPerso(self): + """Creates a perso by adding a row in mdlPersos + and a column in mdlPersosInfos with same ID""" + p = QStandardItem(self.tr("New character")) + self.setPersoColor(p, randomColor(QColor(Qt.white))) + pid = self.getUniqueID() + self.appendRow([p, QStandardItem(pid), QStandardItem("0")]) + + def getUniqueID(self, parent=QModelIndex()): + """Returns an unused perso ID (row 1).""" + vals = [] + for i in range(self.rowCount(parent)): + index = self.index(i, Perso.ID.value, parent) + if index.isValid() and index.data(): + vals.append(int(index.data())) + + k = 0 + while k in vals: + k += 1 + return str(k) + + def removePerso(self): + index = self.currentPersoIndex() + self.takeRow(index.row()) + + def setPersoColor(self, item, color): + px = QPixmap(32, 32) + px.fill(color) + item.setIcon(QIcon(px)) + + def chosePersoColor(self): + idx = self.currentPersoIndex() + item = self.item(idx.row(), Perso.name.value) + if item: + color = iconColor(item.icon()) + else: + color = Qt.white + self.colorDialog = QColorDialog(color, self) + color = self.colorDialog.getColor(color) + if color.isValid(): + self.setPersoColor(item, color) + self.updatePersoColor(idx) + +############################################################################### +# UI +############################################################################### + + def updatePersoColor(self, idx): + #idx = self.currentPersoIndex() + color = self.getPersoColorName(idx) + self.mw.btnPersoColor.setStyleSheet("background:{};".format(color)) + + +############################################################################### +# PERSO INFOS +############################################################################### + + def addPersoInfo(self): + #FIXME + pass diff --git a/src/models/plotModel.py b/src/models/plotModel.py index cd8f880e..0eb940cd 100644 --- a/src/models/plotModel.py +++ b/src/models/plotModel.py @@ -4,7 +4,6 @@ from qt import * from enums import * from functions import * -from models.plotsProxyModel import * class plotModel(QStandardItemModel): @@ -12,8 +11,6 @@ class plotModel(QStandardItemModel): QStandardItemModel.__init__(self, 0, 3, parent) self.setHorizontalHeaderLabels([i.name for i in Plot]) self.mw = mainWindow() - #self._proxy = plotsProxyModel() - #self._proxy.setSourceModel(self) self.updatePlotPersoButton() self.mw.mdlPersos.dataChanged.connect(self.updatePlotPersoButton) @@ -185,21 +182,4 @@ class plotModel(QStandardItemModel): menus[2-imp].addAction(a) mpr.mapped.connect(self.addPlotPerso) - self.mw.btnAddPlotPerso.setMenu(menu) - -#################################################################################################### -# PROXY MODEL (UNUSED) # -#################################################################################################### - - def viewModel(self): - "Returns proxy model if any, else self" - if self._proxy: - return self._proxy - else: - return self - - def toSource(self, index): - if self._proxy: - return self._proxy.mapToSource(index) - else: - return index \ No newline at end of file + self.mw.btnAddPlotPerso.setMenu(menu) \ No newline at end of file diff --git a/src/ui/mainWindow.py b/src/ui/mainWindow.py index 65c80f1d..bb15ddbd 100644 --- a/src/ui/mainWindow.py +++ b/src/ui/mainWindow.py @@ -331,10 +331,11 @@ class Ui_MainWindow(object): self.groupBox.setObjectName("groupBox") self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout_8.setObjectName("verticalLayout_8") - self.lstPersos = QtWidgets.QListView(self.groupBox) + self.lstPersos = persoTreeView(self.groupBox) self.lstPersos.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.lstPersos.setDragEnabled(True) self.lstPersos.setObjectName("lstPersos") + self.lstPersos.headerItem().setText(0, "1") self.verticalLayout_8.addWidget(self.lstPersos) self.horizontalLayout_14 = QtWidgets.QHBoxLayout() self.horizontalLayout_14.setObjectName("horizontalLayout_14") @@ -1036,10 +1037,10 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) self.stack.setCurrentIndex(1) - self.tabMain.setCurrentIndex(6) + self.tabMain.setCurrentIndex(2) self.tabSummary.setCurrentIndex(0) self.tabPersos.setCurrentIndex(0) - self.tabPlot.setCurrentIndex(1) + self.tabPlot.setCurrentIndex(0) self.comboBox_2.setCurrentIndex(0) self.stkPlotSummary.setCurrentIndex(0) self.tabRedacInfos.setCurrentIndex(0) @@ -1175,12 +1176,13 @@ class Ui_MainWindow(object): self.actCloseProject.setText(_translate("MainWindow", "Close project")) from ui.views.plotTreeView import plotTreeView -from ui.views.metadataView import metadataView -from ui.welcome import welcome -from ui.views.basicItemView import basicItemView -from ui.views.textEditView import textEditView from ui.views.outlineView import outlineView -from ui.sldImportance import sldImportance -from ui.views.treeView import treeView +from ui.views.persoTreeView import persoTreeView from ui.views.lineEditView import lineEditView +from ui.views.textEditView import textEditView +from ui.sldImportance import sldImportance from ui.editors.mainEditor import mainEditor +from ui.views.metadataView import metadataView +from ui.views.basicItemView import basicItemView +from ui.views.treeView import treeView +from ui.welcome import welcome diff --git a/src/ui/mainWindow.ui b/src/ui/mainWindow.ui index 2c49cb39..61eb8260 100644 --- a/src/ui/mainWindow.ui +++ b/src/ui/mainWindow.ui @@ -109,7 +109,7 @@ - 6 + 2 true @@ -663,13 +663,18 @@ - + Qt::ScrollBarAlwaysOff true + + + 1 + + @@ -1075,7 +1080,7 @@ - 1 + 0 true @@ -2045,6 +2050,11 @@
ui.editors.mainEditor.h
1 + + persoTreeView + QTreeWidget +
ui.views.persoTreeView.h
+
@@ -2145,7 +2155,4 @@ - - - diff --git a/src/ui/views/persoTreeView.py b/src/ui/views/persoTreeView.py new file mode 100644 index 00000000..01f99e60 --- /dev/null +++ b/src/ui/views/persoTreeView.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +#--!-- coding: utf8 --!-- + +from qt import * +from enums import * +from functions import * +import settings + +class persoTreeView(QTreeWidget): + + def __init__(self, parent=None): + QTreeWidget.__init__(self, parent) + self._model = None + self._catRow = [-1, -1, -1] + self._filter = "" + self._lastID = -1 + self._updating = False + self.setRootIsDecorated(False) + self.setIndentation(10) + + self.setColumnCount(1) + self._rootItem = QTreeWidgetItem() + self.insertTopLevelItem(0, self._rootItem) + + def setPersosModel(self, model): + self._model = model + self._model.dataChanged.connect(self.updateMaybe) + self._model.rowsInserted.connect(self.updateMaybe2) + self._model.rowsRemoved.connect(self.updateMaybe2) + self.updateItems() + + def setFilter(self, text): + self._filter = text + self.updateItems() + + def updateMaybe(self, topLeft, bottomRight): + if topLeft.parent() != QModelIndex(): + return + + if topLeft.column() <= Perso.name.value <= bottomRight.column(): + # Update name + self.updateNames() + + elif topLeft.column() <= Perso.importance.value <= bottomRight.column(): + # Importance changed + self.updateItems() + + def updateMaybe2(self, parent, first, last): + "Rows inserted or removed" + if parent == QModelIndex(): + self.updateItems() + + def updateNames(self): + for i in range(self.topLevelItemCount()): + item = self.topLevelItem(i) + + for c in range(item.childCount()): + sub = item.child(c) + ID = sub.data(0, Qt.UserRole) + if ID: + name = self._model.getPersoNameByID(ID) + sub.setText(0, name) + + def updateItems(self): + if not self._model: + return + + if self.currentItem(): + self._lastID = self.currentItem().data(0, Qt.UserRole) + + self._updating = True + self.clear() + persos = self._model.getPersosByImportance() + + h = [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")] + for i in range(3): + cat = QTreeWidgetItem(self, [h[i]]) + cat.setBackground(0, QBrush(QColor(Qt.blue).lighter(190))) + cat.setForeground(0, QBrush(Qt.darkBlue)) + cat.setTextAlignment(0, Qt.AlignCenter) + f = cat.font(0) + f.setBold(True) + cat.setFont(0, f) + self.addTopLevelItem(cat) + #cat.setChildIndicatorPolicy(cat.DontShowIndicator) + + for ID in persos[i]: + name = self._model.getPersoNameByID(ID) + if not self._filter.lower() in name.lower(): + continue + item = QTreeWidgetItem(cat, [name]) + item.setData(0, Qt.UserRole, ID) + px = QPixmap(32, 32) + color = QColor(self._model.getPersoColorByID(ID)) + px.fill(color) + item.setIcon(0, QIcon(px)) + + if ID == self._lastID: + self.setCurrentItem(item) + + self.expandAll() + self._updating = False + + def getItemByID(self, ID): + for i in range(self.topLevelItemCount()): + if self.topLevelItem(i).data(0, Qt.UserRole) == ID: + return self.topLevelItem(i) + + def currentPersoIndex(self): + ID = None + if self.currentItem(): + ID = self.currentItem().data(0, Qt.UserRole) + + return self._model.getIndexFromID(ID) + + def mouseDoubleClickEvent(self, event): + item = self.currentItem() + # Catching double clicks to forbid collapsing of toplevel items + if item.parent(): + QTreeWidget.mouseDoubleClickEvent(self, event) + \ No newline at end of file diff --git a/src/ui/welcome.py b/src/ui/welcome.py index 0b0a4a30..f24a658f 100644 --- a/src/ui/welcome.py +++ b/src/ui/welcome.py @@ -5,8 +5,9 @@ from qt import * from functions import * from ui.welcome_ui import * from models.outlineModel import * +from models.persosModel import * from models.plotModel import * -from models.persosProxyModel import * +#from models.persosProxyModel import * import settings import locale import imp @@ -320,13 +321,14 @@ class welcome(QWidget, Ui_welcome): self.mw.mdlFlatData = QStandardItemModel(2, 8, self.mw) # Persos - self.mw.mdlPersos = QStandardItemModel(0, 0, self.mw) + #self.mw.mdlPersos = QStandardItemModel(0, 0, self.mw) + self.mw.mdlPersos = persosModel(self.mw) #self.mdlPersosProxy = None # persosProxyModel() # None - self.mw.mdlPersosProxy = persosProxyModel(self.mw) + #self.mw.mdlPersosProxy = persosProxyModel(self.mw) - self.mw.mdlPersosInfos = QStandardItemModel(1, 0, self.mw) - self.mw.mdlPersosInfos.insertColumn(0, [QStandardItem("ID")]) - self.mw.mdlPersosInfos.setHorizontalHeaderLabels(["Description"]) + #self.mw.mdlPersosInfos = QStandardItemModel(1, 0, self.mw) + #self.mw.mdlPersosInfos.insertColumn(0, [QStandardItem("ID")]) + #self.mw.mdlPersosInfos.setHorizontalHeaderLabels(["Description"]) # Labels self.mw.mdlLabels = QStandardItemModel(self.mw)