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
+