From d58ae6a66264dcda4fcc2eab522e49fb3d57a81c Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Thu, 4 Jun 2015 07:08:49 +0200 Subject: [PATCH] Many things working great now --- src/mainWindow.py | 19 +++- src/models/outlineModel.py | 8 ++ src/models/persosProxyModel.py | 163 +++++++++++++++++++++++++++++++ src/ui/cmbOutlinePersoChoser.py | 53 ++++++++++ src/ui/cmbOutlineStatusChoser.py | 52 ++++++++++ src/ui/mainWindow.py | 20 ++-- src/ui/mainWindow.ui | 16 +-- test_project/outline.xml | 12 +-- test_project/perso.xml | 4 +- test_project/persoInfos.xml | 4 +- 10 files changed, 314 insertions(+), 37 deletions(-) create mode 100644 src/models/persosProxyModel.py create mode 100644 src/ui/cmbOutlinePersoChoser.py create mode 100644 src/ui/cmbOutlineStatusChoser.py diff --git a/src/mainWindow.py b/src/mainWindow.py index 82619f31..2d96d0bc 100644 --- a/src/mainWindow.py +++ b/src/mainWindow.py @@ -12,6 +12,7 @@ from ui.treeOutlineDelegates import * from loadSave import * from enums import * from models.outlineModel import * +from models.persosProxyModel import * class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): @@ -84,10 +85,15 @@ class MainWindow(QMainWindow, Ui_MainWindow): # Persos self.mdlPersos = QStandardItemModel(0, 10) + self.mdlPersosProxy = persosProxyModel() + self.mdlPersosProxy.setSourceModel(self.mdlPersos) + self.mdlPersosInfos = QStandardItemModel(1, 0) self.mdlPersosInfos.insertColumn(0, [QStandardItem("ID")]) self.mdlPersosInfos.setHorizontalHeaderLabels(["Description"]) - self.lstPersos.setModel(self.mdlPersos) + #self.lstPersos.setModel(self.mdlPersos) + self.lstPersos.setModel(self.mdlPersosProxy) + self.tblPersoInfos.setModel(self.mdlPersosInfos) self.tblPersoInfos.setRowHidden(0, True) @@ -114,7 +120,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.sldPersoImportance.importanceChanged.connect(self.mprPersos.submit) self.mprPersos.setCurrentIndex(0) - self.lstPersos.selectionModel().currentChanged.connect(self.mprPersos.setCurrentModelIndex) self.lstPersos.selectionModel().currentChanged.connect(self.changeCurrentPerso) self.tabPersos.currentChanged.connect(self.resizePersosInfos) @@ -180,6 +185,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.treeRedacOutline.selectionModel().currentChanged.connect(self.cmbRedacStatus.setCurrentModelIndex) self.treeRedacOutline.selectionModel().currentChanged.connect(lambda idx: self.lblRedacPOV.setHidden(idx.internalPointer().isFolder())) self.treeRedacOutline.selectionModel().currentChanged.connect(lambda idx: self.cmbRedacPOV.setHidden(idx.internalPointer().isFolder())) + self.treePlanOutline.selectionModel().currentChanged.connect(lambda idx: self.lblPlanPOV.setHidden(idx.internalPointer().isFolder())) + self.treePlanOutline.selectionModel().currentChanged.connect(lambda idx: self.cmbPlanPOV.setHidden(idx.internalPointer().isFolder())) #Debug @@ -260,12 +267,14 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.mdlPersos.setItem(i, Perso.ID.value, item) def removePerso(self): - i = self.lstPersos.currentIndex() + i = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) self.mdlPersos.takeRow(i.row()) self.mdlPersosInfos.takeColumn(i.row()+1) def changeCurrentPerso(self, trash=None): - idx = self.lstPersos.currentIndex() + idx = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()) + + self.mprPersos.setCurrentModelIndex(idx) pid = self.mdlPersos.item(idx.row(), Perso.ID.value).text() for c in range(self.mdlPersosInfos.columnCount()): pid2 = self.mdlPersosInfos.item(0, c).text() @@ -277,7 +286,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.tblPersoInfos.resizeColumnToContents(0) w = self.tblPersoInfos.viewport().width() w2 = self.tblPersoInfos.columnWidth(0) - current = self.lstPersos.currentIndex().row() + 1 + current = self.mdlPersosProxy.mapToSource(self.lstPersos.currentIndex()).row() + 1 self.tblPersoInfos.setColumnWidth(current, w - w2) diff --git a/src/models/outlineModel.py b/src/models/outlineModel.py index 24dbe13f..de02a2cb 100644 --- a/src/models/outlineModel.py +++ b/src/models/outlineModel.py @@ -323,12 +323,17 @@ class outlineItem(): return self._data[Outline(column)] else: return None + elif role == Qt.DecorationRole and column == Outline.title.value: if self.isFolder(): return QIcon.fromTheme("folder") elif self.isScene(): return QIcon.fromTheme("document-new") + elif role == Qt.ForegroundRole and column == Outline.title.value: + if not self.isCompile(): + return QBrush(Qt.gray) + elif role == Qt.CheckStateRole and column == Outline.compile.value: if Outline(column) in self._data and self._data[Outline(column)]: return Qt.Checked @@ -358,6 +363,9 @@ class outlineItem(): def isFolder(self): return self._data[Outline.type] == "folder" + def isCompile(self): + return Outline.compile in self._data and self._data[Outline.compile] + def isScene(self): return self._data[Outline.type] == "scene" diff --git a/src/models/persosProxyModel.py b/src/models/persosProxyModel.py new file mode 100644 index 00000000..afbdcdc2 --- /dev/null +++ b/src/models/persosProxyModel.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python +#--!-- coding: utf8 --!-- + +from __future__ import print_function +from __future__ import unicode_literals + +from qt import * +from enums import * +from models.outlineModel import * + +from enum import Enum +from lxml import etree as ET + +class persosProxyModel(QAbstractProxyModel): + + newStatuses = pyqtSignal() + + def __init__(self, parent=None): + QAbstractProxyModel.__init__(self, parent) + + self.rootItem = QStandardItem() + self.p1 = QStandardItem("Principal") + self.p2 = QStandardItem("Secondaire") + self.p3 = QStandardItem("Mineur") + + self.cats = [ + self.p1, + self.p2, + self.p3 + ] + + + def mapFromSource(self, sourceIndex): + if not sourceIndex.isValid(): + return QModelIndex() + + row = sourceIndex.row() + item = sourceIndex.internalPointer() + + if row in self._map[0]: + row = self._map[0].index(row) + 1 + elif row in self._map[1]: + row = len(self._map[0]) + 1 + self._map[1].index(row) + 1 + elif row in self._map[2]: + row = len(self._map[0]) + 1 + len(self._map[1]) + 1 + self._map[2].index(row) + 1 + + return self.createIndex(row, sourceIndex.column(), item) + + def flags(self, index): + if not index.isValid(): + return Qt.NoItemFlags + + if index.isValid() and not self.mapToSource(index).isValid(): + return Qt.NoItemFlags#Qt.ItemIsEnabled + else: + return Qt.ItemIsEnabled | Qt.ItemIsSelectable + + def mapToSource(self, proxyIndex): + if not proxyIndex.isValid(): + return QModelIndex() + + row = proxyIndex.row() + + if row == 0: + return QModelIndex() + elif row < len(self._map[0]) + 1: + row = self._map[0][row-1] + elif row == len(self._map[0]) + 1: + return QModelIndex() + elif row < len(self._map[0]) + 1 + len(self._map[1]) + 1: + row = self._map[1][row - 2 - len(self._map[0])] + elif row == len(self._map[0]) + 1 + len(self._map[1]) + 1: + return QModelIndex() + else: + row = self._map[2][row - 3 - len(self._map[0]) - len(self._map[1])] + + item = proxyIndex.internalPointer() + + return self.sourceModel().createIndex(row, proxyIndex.column(), item) + + def setSourceModel(self, model): + QAbstractProxyModel.setSourceModel(self, model) + self.sourceModel().dataChanged.connect(self.mapModel) + self.sourceModel().rowsInserted.connect(self.mapModel) + self.sourceModel().rowsRemoved.connect(self.mapModel) + self.sourceModel().rowsMoved.connect(self.mapModel) + + self.mapModel() + + + def mapModel(self): + self.beginResetModel() + src = self.sourceModel() + + self._map = [[], [], []] + + for i in range(src.rowCount()): + item = src.item(i, Perso.importance.value) + ID = src.item(i, Perso.ID.value) + + if item: + imp = int(item.text()) + else: + imp = 0 + + self._map[2-imp].append(i) + self.endResetModel() + + def numberOfPersosByImportance(self): + return [len(i) for i in self._map] + + def data(self, index, role=Qt.DisplayRole): + row = index.row() + + if index.isValid() and not self.mapToSource(index).isValid(): + if role == Qt.DisplayRole: + n = self.numberOfPersosByImportance() + p = 0 if row == 0 else \ + 1 if row == n[0] + 1 else \ + 2 + + return self.cats[p].text() + else: + return self.sourceModel().data(self.mapToSource(index), role) + + def index(self, row, column, parent): + + n = self.numberOfPersosByImportance() + + if row == 0 or row == n[0] + 1 or row == n[0]+n[1]+2: + p = 0 if row == 0 else \ + 1 if row == n[0] + 1 else \ + 2 + + return self.createIndex(row, column, self.cats[p]) + + else: + if row < len(self._map[0]) + 1: + nrow = self._map[0][row - 1] + elif row < len(self._map[0]) + 1 + len(self._map[1]) + 1: + nrow = self._map[1][row - 2 - len(self._map[0])] + else: + nrow = self._map[2][row - 3 - len(self._map[0]) - len(self._map[1])] + + + return self.mapFromSource(self.sourceModel().index(nrow, column, QModelIndex())) + + def parent(self, index=QModelIndex()): + return QModelIndex() + + def rowCount(self, parent=QModelIndex()): + return self.sourceModel().rowCount(QModelIndex())+3 + + def columnCount(self, parent=QModelIndex()): + return self.sourceModel().columnCount(QModelIndex()) + + def item(self, row, col, parent=QModelIndex()): + idx = self.mapToSource(self.index(row, col, parent)) + return self.sourceModel().item(idx.row(), idx.column()) + + + #def setData(self, index, value, role=Qt.EditRole): + #pass \ No newline at end of file diff --git a/src/ui/cmbOutlinePersoChoser.py b/src/ui/cmbOutlinePersoChoser.py new file mode 100644 index 00000000..ae25000c --- /dev/null +++ b/src/ui/cmbOutlinePersoChoser.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +#--!-- coding: utf8 --!-- + +from __future__ import print_function +from __future__ import unicode_literals + +from qt import * +from enums import * + +class cmbOutlinePersoChoser(QComboBox): + + def __init__(self, parent=None): + QComboBox.__init__(self, parent) + self.activated[int].connect(self.changed) + self.currentModelIndex = None + + def setModels(self, mdlPersos, mdlOutline): + self.mdlPersos = mdlPersos + self.mdlPersos.dataChanged.connect(self.updateItems) + self.mdlOutline = mdlOutline + self.mdlOutline.dataChanged.connect(self.updateSelectedItem) + + def updateSelectedItem(self, idx1=None, idx2=None): + if not self.currentModelIndex: + self.setCurrentIndex(0) + else: + item = self.currentModelIndex.internalPointer() + POV = item.data(Outline.POV) + idx = self.findData(POV) + if idx <> -1: + self.setCurrentIndex(idx) + else: + self.setCurrentIndex(0) + + def changed(self, idx): + if self.currentModelIndex: + modelIndex = self.mdlOutline.index(self.currentModelIndex.row(), Outline.POV.value, self.currentModelIndex.parent()) + self.mdlOutline.setData(modelIndex, self.currentData()) + + def setCurrentModelIndex(self, idx): + self.currentModelIndex = idx + self.updateSelectedItem() + + def updateItems(self): + self.clear() + self.addItem("") + for i in range(self.mdlPersos.rowCount()): + try: + self.addItem(self.mdlPersos.item(i, Perso.name.value).text(), self.mdlPersos.item(i, Perso.ID.value).text()) + except: + pass + if self.currentModelIndex: + self.updateSelectedItem() \ No newline at end of file diff --git a/src/ui/cmbOutlineStatusChoser.py b/src/ui/cmbOutlineStatusChoser.py new file mode 100644 index 00000000..b9812d3e --- /dev/null +++ b/src/ui/cmbOutlineStatusChoser.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +#--!-- coding: utf8 --!-- + +from __future__ import print_function +from __future__ import unicode_literals + +from qt import * +from enums import * + +class cmbOutlineStatusChoser(QComboBox): + + def __init__(self, parent=None): + QComboBox.__init__(self, parent) + self.activated[int].connect(self.changed) + self.currentModelIndex = None + self.setEditable(True) + self.setAutoFillBackground(True) + + def setModel(self, mdlOutline): + self.mdlOutline = mdlOutline + self.mdlOutline.dataChanged.connect(self.updateItems) + self.mdlOutline.dataChanged.connect(self.updateSelectedItem) + self.mdlOutline.newStatuses.connect(self.updateItems) + self.updateItems() + + def updateSelectedItem(self, idx1=None, idx2=None): + if not self.currentModelIndex: + self.setCurrentIndex(0) + else: + item = self.currentModelIndex.internalPointer() + self.setCurrentIndex(self.findText(item.data(Outline.status.value))) + + def changed(self, idx): + if self.currentModelIndex: + modelIndex = self.mdlOutline.index(self.currentModelIndex.row(), Outline.status.value, self.currentModelIndex.parent()) + self.mdlOutline.setData(modelIndex, self.currentText()) + + def setCurrentModelIndex(self, idx): + self.currentModelIndex = idx + self.updateSelectedItem() + + def updateItems(self): + + self.clear() + + self.addItem("") + + for status in self.mdlOutline.statuses: + self.addItem(status) + + if self.currentModelIndex: + self.updateSelectedItem() \ No newline at end of file diff --git a/src/ui/mainWindow.py b/src/ui/mainWindow.py index 83055005..4884c9ab 100644 --- a/src/ui/mainWindow.py +++ b/src/ui/mainWindow.py @@ -268,7 +268,6 @@ class Ui_MainWindow(object): self.verticalLayout_8.setObjectName("verticalLayout_8") self.lstPersos = QtWidgets.QListView(self.groupBox) self.lstPersos.setDragEnabled(True) - self.lstPersos.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.lstPersos.setObjectName("lstPersos") self.verticalLayout_8.addWidget(self.lstPersos) self.horizontalLayout_14 = QtWidgets.QHBoxLayout() @@ -710,9 +709,9 @@ class Ui_MainWindow(object): self.verticalLayout_13.setObjectName("verticalLayout_13") self.horizontalLayout_11 = QtWidgets.QHBoxLayout() self.horizontalLayout_11.setObjectName("horizontalLayout_11") - self.label_9 = QtWidgets.QLabel(self.groupbox) - self.label_9.setObjectName("label_9") - self.horizontalLayout_11.addWidget(self.label_9) + self.lblPlanPOV = QtWidgets.QLabel(self.groupbox) + self.lblPlanPOV.setObjectName("lblPlanPOV") + self.horizontalLayout_11.addWidget(self.lblPlanPOV) self.cmbPlanPOV = cmbOutlinePersoChoser(self.groupbox) self.cmbPlanPOV.setFrame(False) self.cmbPlanPOV.setObjectName("cmbPlanPOV") @@ -866,7 +865,6 @@ class Ui_MainWindow(object): sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbRedacPOV.sizePolicy().hasHeightForWidth()) self.cmbRedacPOV.setSizePolicy(sizePolicy) - self.cmbRedacPOV.setFrame(False) self.cmbRedacPOV.setObjectName("cmbRedacPOV") self.formLayout_5.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cmbRedacPOV) self.label_30 = QtWidgets.QLabel(self.groupBox_4) @@ -878,7 +876,7 @@ class Ui_MainWindow(object): sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cmbRedacStatus.sizePolicy().hasHeightForWidth()) self.cmbRedacStatus.setSizePolicy(sizePolicy) - self.cmbRedacStatus.setFrame(False) + self.cmbRedacStatus.setEditable(True) self.cmbRedacStatus.setObjectName("cmbRedacStatus") self.formLayout_5.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.cmbRedacStatus) self.label_32 = QtWidgets.QLabel(self.groupBox_4) @@ -1045,7 +1043,7 @@ class Ui_MainWindow(object): self.menubar.addAction(self.menu_Aide.menuAction()) self.retranslateUi(MainWindow) - self.tabMain.setCurrentIndex(6) + self.tabMain.setCurrentIndex(2) self.tabSummary.setCurrentIndex(0) self.tabPersos.setCurrentIndex(0) self.tabPlot.setCurrentIndex(0) @@ -1160,8 +1158,8 @@ class Ui_MainWindow(object): self.treeWidget_2.topLevelItem(1).child(0).setText(0, _translate("MainWindow", "Scène 1")) self.treeWidget_2.topLevelItem(1).child(1).setText(0, _translate("MainWindow", "Scène 2")) self.treeWidget_2.setSortingEnabled(__sortingEnabled) - self.groupbox.setTitle(_translate("MainWindow", "Détails de la scène")) - self.label_9.setText(_translate("MainWindow", "POV")) + self.groupbox.setTitle(_translate("MainWindow", "Détails")) + self.lblPlanPOV.setText(_translate("MainWindow", "POV")) self.txtPlanSummarySentance.setPlaceholderText(_translate("MainWindow", "Résumé de la scène en une ligne")) self.tabMain.setTabText(self.tabMain.indexOf(self.lytTabOutline), _translate("MainWindow", "Plan")) self.groupBox_4.setTitle(_translate("MainWindow", "Propriétés")) @@ -1211,7 +1209,7 @@ class Ui_MainWindow(object): self.actShowHelp.setText(_translate("MainWindow", "Afficher les &bulles d\'aide")) self.actShowHelp.setShortcut(_translate("MainWindow", "Ctrl+Shift+B")) -from ui.collapsibleGroupBox import collapsibleGroupBox -from ui.cmbOutlineStatusChoser import cmbOutlineStatusChoser from ui.sldImportance import sldImportance +from ui.cmbOutlineStatusChoser import cmbOutlineStatusChoser +from ui.collapsibleGroupBox import collapsibleGroupBox from ui.cmbOutlinePersoChoser import cmbOutlinePersoChoser diff --git a/src/ui/mainWindow.ui b/src/ui/mainWindow.ui index 3b27b409..c7fdf5aa 100644 --- a/src/ui/mainWindow.ui +++ b/src/ui/mainWindow.ui @@ -18,7 +18,7 @@ - 6 + 2 true @@ -506,9 +506,6 @@ true - - QAbstractItemView::InternalMove - @@ -1352,13 +1349,13 @@ - Détails de la scène + Détails - + POV @@ -1670,9 +1667,6 @@ 0 - - false - @@ -1690,8 +1684,8 @@ 0 - - false + + true diff --git a/test_project/outline.xml b/test_project/outline.xml index 81e4b3b1..3f719978 100644 --- a/test_project/outline.xml +++ b/test_project/outline.xml @@ -1,21 +1,21 @@ - + - + - + - + - + - + diff --git a/test_project/perso.xml b/test_project/perso.xml index 7d328aaf..d79204e6 100644 --- a/test_project/perso.xml +++ b/test_project/perso.xml @@ -40,7 +40,7 @@ Pour voir. Ginette 1 - + 1 @@ -53,7 +53,7 @@ Pour voir. Nouveau perso avec un nom pas très long 2 - + 0 diff --git a/test_project/persoInfos.xml b/test_project/persoInfos.xml index 5d53d5bc..7506fba4 100644 --- a/test_project/persoInfos.xml +++ b/test_project/persoInfos.xml @@ -24,12 +24,12 @@ Age 42 12 - + 11 Animal préféré Pingouin - Crevette aquatique +