Using QTreeWidget for plot, finally

This commit is contained in:
Olivier Keshavjee 2015-06-22 20:30:43 +02:00
parent 28ba9f812d
commit 8d0e83a3b3
6 changed files with 186 additions and 190 deletions

View file

@ -293,7 +293,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
#################################################################################################### ####################################################################################################
def changeCurrentPlot(self): def changeCurrentPlot(self):
index = self.lstPlots.currentIndex() index = self.lstPlots.currentPlotIndex()
if not index.isValid(): if not index.isValid():
self.tabPlot.setEnabled(False) self.tabPlot.setEnabled(False)
@ -476,14 +476,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# Plots # Plots
self.lstPlots.setPlotModel(self.mdlPlots) self.lstPlots.setPlotModel(self.mdlPlots)
self.txtPlotFilter.textChanged.connect(self.lstPlots.setFilter) self.txtPlotFilter.textChanged.connect(self.lstPlots.setFilter)
self.lstPlots.currentRowChanged.connect(self.changeCurrentPlot) self.lstPlots.currentItemChanged.connect(self.changeCurrentPlot)
self.lstPlotPerso.setModel(self.mdlPlots) self.lstPlotPerso.setModel(self.mdlPlots)
self.lstSubPlots.setModel(self.mdlPlots) self.lstSubPlots.setModel(self.mdlPlots)
#self.txtSubPlotSummary.setModel(self.mdlPlots) #self.txtSubPlotSummary.setModel(self.mdlPlots)
#self.txtSubPlotSummary.setColumn(1) #self.txtSubPlotSummary.setColumn(1)
self.lstSubPlots.selectionModel().currentChanged.connect(self.changeCurrentSubPlot) self.lstSubPlots.selectionModel().currentChanged.connect(self.changeCurrentSubPlot)
self.btnAddPlot.clicked.connect(self.mdlPlots.addPlot) self.btnAddPlot.clicked.connect(self.mdlPlots.addPlot)
self.btnRmPlot.clicked.connect(lambda: self.mdlPlots.removePlot(self.lstPlots.currentIndex())) self.btnRmPlot.clicked.connect(lambda: self.mdlPlots.removePlot(self.lstPlots.currentPlotIndex()))
self.btnAddSubPlot.clicked.connect(self.mdlPlots.addSubPlot) self.btnAddSubPlot.clicked.connect(self.mdlPlots.addSubPlot)
self.btnRmSubPlot.clicked.connect(self.mdlPlots.removeSubPlot) self.btnRmSubPlot.clicked.connect(self.mdlPlots.removeSubPlot)
self.btnRmPlotPerso.clicked.connect(self.mdlPlots.removePlotPerso) self.btnRmPlotPerso.clicked.connect(self.mdlPlots.removePlotPerso)
@ -499,6 +499,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.tabPlot.setEnabled(False) self.tabPlot.setEnabled(False)
self.lstOutlinePlots.setPlotModel(self.mdlPlots)
self.lstOutlinePlots.setShowSubPlot(True)
# Outline # Outline
self.treeRedacOutline.setModel(self.mdlOutline) self.treeRedacOutline.setModel(self.mdlOutline)
self.treePlanOutline.setModelPersos(self.mdlPersos) self.treePlanOutline.setModelPersos(self.mdlPersos)

View file

@ -30,7 +30,20 @@ class plotModel(QStandardItemModel):
plots[2-toInt(importance)].append(ID) plots[2-toInt(importance)].append(ID)
return plots return plots
def getNameByID(self, ID): def getSubPlotsByID(self, ID):
index = self.getIndexFromID(ID)
if not index.isValid():
return
index = index.sibling(index.row(), Plot.subplots.value)
item = self.itemFromIndex(index)
lst = []
for i in range(item.rowCount()):
_ID = item.child(i, Plot.ID.value).text()
name = item.child(i, Plot.name.value).text()
lst.append((_ID, name))
return lst
def getPlotNameByID(self, ID):
for i in range(self.rowCount()): for i in range(self.rowCount()):
_ID = self.item(i, Plot.ID.value).text() _ID = self.item(i, Plot.ID.value).text()
if _ID == ID or toInt(_ID) == ID: if _ID == ID or toInt(_ID) == ID:
@ -46,7 +59,7 @@ class plotModel(QStandardItemModel):
return QModelIndex() return QModelIndex()
def currentIndex(self): def currentIndex(self):
i = self.mw.lstPlots.selectionModel().currentIndex() i = self.mw.lstPlots.currentIndex()
if i .isValid(): if i .isValid():
return i return i
else: else:
@ -85,7 +98,7 @@ class plotModel(QStandardItemModel):
#################################################################################################### ####################################################################################################
def addSubPlot(self): def addSubPlot(self):
index = self.mw.lstPlots.currentIndex() index = self.mw.lstPlots.currentPlotIndex()
if not index.isValid(): if not index.isValid():
return return
@ -122,7 +135,7 @@ class plotModel(QStandardItemModel):
#################################################################################################### ####################################################################################################
def addPlotPerso(self, v): def addPlotPerso(self, v):
index = self.mw.lstPlots.currentIndex() index = self.mw.lstPlots.currentPlotIndex()
if index.isValid(): if index.isValid():
if not self.item(index.row(), Plot.persos.value): if not self.item(index.row(), Plot.persos.value):
self.setItem(index.row(), Plot.persos.value, QStandardItem()) self.setItem(index.row(), Plot.persos.value, QStandardItem())

View file

@ -487,8 +487,10 @@ class Ui_MainWindow(object):
self.groupBox_2.setObjectName("groupBox_2") self.groupBox_2.setObjectName("groupBox_2")
self.verticalLayout_10 = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout_10 = QtWidgets.QVBoxLayout(self.groupBox_2)
self.verticalLayout_10.setObjectName("verticalLayout_10") self.verticalLayout_10.setObjectName("verticalLayout_10")
self.lstPlots = plotListView(self.groupBox_2) self.lstPlots = plotTreeView(self.groupBox_2)
self.lstPlots.setObjectName("lstPlots") self.lstPlots.setObjectName("lstPlots")
self.lstPlots.headerItem().setText(0, "1")
self.lstPlots.header().setVisible(False)
self.verticalLayout_10.addWidget(self.lstPlots) self.verticalLayout_10.addWidget(self.lstPlots)
self.horizontalLayout_15 = QtWidgets.QHBoxLayout() self.horizontalLayout_15 = QtWidgets.QHBoxLayout()
self.horizontalLayout_15.setObjectName("horizontalLayout_15") self.horizontalLayout_15.setObjectName("horizontalLayout_15")
@ -715,16 +717,10 @@ class Ui_MainWindow(object):
self.splitterOutlineH = QtWidgets.QSplitter(self.lytTabOutline) self.splitterOutlineH = QtWidgets.QSplitter(self.lytTabOutline)
self.splitterOutlineH.setOrientation(QtCore.Qt.Horizontal) self.splitterOutlineH.setOrientation(QtCore.Qt.Horizontal)
self.splitterOutlineH.setObjectName("splitterOutlineH") self.splitterOutlineH.setObjectName("splitterOutlineH")
self.treeWidget_2 = QtWidgets.QTreeWidget(self.splitterOutlineH) self.lstOutlinePlots = plotTreeView(self.splitterOutlineH)
self.treeWidget_2.setDragEnabled(True) self.lstOutlinePlots.setDragEnabled(True)
self.treeWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly) self.lstOutlinePlots.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
self.treeWidget_2.setObjectName("treeWidget_2") self.lstOutlinePlots.setObjectName("lstOutlinePlots")
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget_2)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget_2)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
self.layoutWidget = QtWidgets.QWidget(self.splitterOutlineH) self.layoutWidget = QtWidgets.QWidget(self.splitterOutlineH)
self.layoutWidget.setObjectName("layoutWidget") self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout_14 = QtWidgets.QVBoxLayout(self.layoutWidget) self.verticalLayout_14 = QtWidgets.QVBoxLayout(self.layoutWidget)
@ -1115,10 +1111,10 @@ class Ui_MainWindow(object):
self.menubar.addAction(self.menuHelp.menuAction()) self.menubar.addAction(self.menuHelp.menuAction())
self.retranslateUi(MainWindow) self.retranslateUi(MainWindow)
self.tabMain.setCurrentIndex(3) self.tabMain.setCurrentIndex(5)
self.tabSummary.setCurrentIndex(0) self.tabSummary.setCurrentIndex(0)
self.tabPersos.setCurrentIndex(0) self.tabPersos.setCurrentIndex(0)
self.tabPlot.setCurrentIndex(1) self.tabPlot.setCurrentIndex(0)
self.comboBox_2.setCurrentIndex(0) self.comboBox_2.setCurrentIndex(0)
self.stkPlotSummary.setCurrentIndex(0) self.stkPlotSummary.setCurrentIndex(0)
self.tabRedacInfos.setCurrentIndex(0) self.tabRedacInfos.setCurrentIndex(0)
@ -1201,16 +1197,6 @@ class Ui_MainWindow(object):
self.comboBox_2.setItemText(2, _translate("MainWindow", "Full")) self.comboBox_2.setItemText(2, _translate("MainWindow", "Full"))
self.tabMain.setTabText(self.tabMain.indexOf(self.lytTabPlot), _translate("MainWindow", "Plots")) self.tabMain.setTabText(self.tabMain.indexOf(self.lytTabPlot), _translate("MainWindow", "Plots"))
self.tabMain.setTabText(self.tabMain.indexOf(self.tab_5), _translate("MainWindow", "Context")) self.tabMain.setTabText(self.tabMain.indexOf(self.tab_5), _translate("MainWindow", "Context"))
self.treeWidget_2.headerItem().setText(0, _translate("MainWindow", "Scenes list"))
__sortingEnabled = self.treeWidget_2.isSortingEnabled()
self.treeWidget_2.setSortingEnabled(False)
self.treeWidget_2.topLevelItem(0).setText(0, _translate("MainWindow", "Intrigue général"))
self.treeWidget_2.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "Scène 1"))
self.treeWidget_2.topLevelItem(0).child(1).setText(0, _translate("MainWindow", "Scène 2"))
self.treeWidget_2.topLevelItem(1).setText(0, _translate("MainWindow", "Intrigue secondaire"))
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.tabMain.setTabText(self.tabMain.indexOf(self.lytTabOutline), _translate("MainWindow", "Outline")) self.tabMain.setTabText(self.tabMain.indexOf(self.lytTabOutline), _translate("MainWindow", "Outline"))
self.btnRedacFolderText.setText(_translate("MainWindow", "Text")) self.btnRedacFolderText.setText(_translate("MainWindow", "Text"))
self.btnRedacFolderCork.setText(_translate("MainWindow", "Index cards")) self.btnRedacFolderCork.setText(_translate("MainWindow", "Index cards"))
@ -1272,12 +1258,12 @@ class Ui_MainWindow(object):
self.actSettings.setText(_translate("MainWindow", "Settings")) self.actSettings.setText(_translate("MainWindow", "Settings"))
self.actSettings.setShortcut(_translate("MainWindow", "F8")) self.actSettings.setShortcut(_translate("MainWindow", "F8"))
from ui.views.textEditView import textEditView
from ui.views.basicItemView import basicItemView
from ui.views.lineEditView import lineEditView
from ui.views.plotListView import plotListView
from ui.views.outlineView import outlineView from ui.views.outlineView import outlineView
from ui.editors.editorWidget import editorWidget from ui.editors.editorWidget import editorWidget
from ui.views.metadataView import metadataView from ui.views.metadataView import metadataView
from ui.sldImportance import sldImportance from ui.views.lineEditView import lineEditView
from ui.views.basicItemView import basicItemView
from ui.views.treeView import treeView from ui.views.treeView import treeView
from ui.views.plotTreeView import plotTreeView
from ui.views.textEditView import textEditView
from ui.sldImportance import sldImportance

View file

@ -18,7 +18,7 @@
<item> <item>
<widget class="QTabWidget" name="tabMain"> <widget class="QTabWidget" name="tabMain">
<property name="currentIndex"> <property name="currentIndex">
<number>3</number> <number>5</number>
</property> </property>
<property name="documentMode"> <property name="documentMode">
<bool>true</bool> <bool>true</bool>
@ -916,7 +916,16 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_10"> <layout class="QVBoxLayout" name="verticalLayout_10">
<item> <item>
<widget class="plotListView" name="lstPlots"/> <widget class="plotTreeView" name="lstPlots">
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_15"> <layout class="QHBoxLayout" name="horizontalLayout_15">
@ -975,7 +984,7 @@
</widget> </widget>
<widget class="QTabWidget" name="tabPlot"> <widget class="QTabWidget" name="tabPlot">
<property name="currentIndex"> <property name="currentIndex">
<number>1</number> <number>0</number>
</property> </property>
<property name="documentMode"> <property name="documentMode">
<bool>true</bool> <bool>true</bool>
@ -1326,48 +1335,13 @@
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<widget class="QTreeWidget" name="treeWidget_2"> <widget class="plotTreeView" name="lstOutlinePlots">
<property name="dragEnabled"> <property name="dragEnabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="dragDropMode"> <property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum> <enum>QAbstractItemView::DragOnly</enum>
</property> </property>
<column>
<property name="text">
<string>Scenes list</string>
</property>
</column>
<item>
<property name="text">
<string>Intrigue général</string>
</property>
<item>
<property name="text">
<string>Scène 1</string>
</property>
</item>
<item>
<property name="text">
<string>Scène 2</string>
</property>
</item>
</item>
<item>
<property name="text">
<string>Intrigue secondaire</string>
</property>
<item>
<property name="text">
<string>Scène 1</string>
</property>
</item>
<item>
<property name="text">
<string>Scène 2</string>
</property>
</item>
</item>
</widget> </widget>
<widget class="QWidget" name="layoutWidget"> <widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_14"> <layout class="QVBoxLayout" name="verticalLayout_14">
@ -2198,9 +2172,9 @@
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>plotListView</class> <class>plotTreeView</class>
<extends>QListWidget</extends> <extends>QTreeWidget</extends>
<header>ui.views.plotListView.h</header> <header>ui.views.plotTreeView.h</header>
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>

View file

@ -1,113 +0,0 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from functions import *
import settings
class plotListView(QListWidget):
def __init__(self, parent=None):
QListWidget.__init__(self, parent)
self._model = None
self._catRow = [-1, -1, -1]
self._catCheckedState = [True, True, True]
self._filter = ""
self._lastID = 1
self._updating = False
self.currentItemChanged.connect(self._currentItemChanged)
def setPlotModel(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() <= Plot.name.value <= bottomRight.column():
# Update name
self.updateNames()
elif topLeft.column() <= Plot.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.count()):
ID = self.item(i).data(Qt.UserRole)
if ID:
name = self._model.getNameByID(ID)
self.item(i).setText(name)
def updateItems(self):
self._updating = True
self.clear()
plots = self._model.getPlotsByImportance()
h = [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")]
for i in range(3):
b = QPushButton(h[i])
b.setCheckable(True)
#b.setFlat(True)
b.setChecked(self._catCheckedState[i])
b.toggled.connect(self.updateCatState)
if self._catCheckedState[i]:
b.setStyleSheet("background:#e6e6ff; color:darkBlue; border-radius:0px; font:bold;")
else:
b.setStyleSheet("background:#EEE; color:333; border-radius:0px; font:bold;")
self.addItem(h[i])
self.setItemWidget(self.item(self.count()-1), b)
self._catRow[i] = self.count()-1
if self._catCheckedState[i]:
for ID in plots[i]:
name = self._model.getNameByID(ID)
if not self._filter.lower() in name.lower():
continue
item = QListWidgetItem(name)
item.setData(Qt.UserRole, ID)
self.addItem(item)
self.setCurrentItem(self.getItemByID(self._lastID))
self._updating = False
def updateCatState(self):
for i in range(3):
row = self._catRow[i]
b = self.itemWidget(self.item(row))
self._catCheckedState[i] = b.isChecked()
self.updateItems()
def _currentItemChanged(self, current, previous):
if self._updating:
return
if current.data(Qt.UserRole):
self._lastID = current.data(Qt.UserRole)
def getItemByID(self, ID):
for i in range(self.count()):
if self.item(i).data(Qt.UserRole) == ID:
return self.item(i)
def currentIndex(self):
ID = None
if self.currentItem():
ID = self.currentItem().data(Qt.UserRole)
return self._model.getIndexFromID(ID)

View file

@ -0,0 +1,133 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from functions import *
import settings
class plotTreeView(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._showSubPlot = False
self.setRootIsDecorated(False)
self.setIndentation(10)
self.setColumnCount(1)
self._rootItem = QTreeWidgetItem()
self.insertTopLevelItem(0, self._rootItem)
#self.currentItemChanged.connect(self._currentItemChanged)
def setShowSubPlot(self, v):
self._showSubPlot = v
self.updateItems()
def setPlotModel(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() <= Plot.name.value <= bottomRight.column():
# Update name
self.updateNames()
elif topLeft.column() <= Plot.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.getPlotNameByID(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()
plots = self._model.getPlotsByImportance()
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 plots[i]:
name = self._model.getPlotNameByID(ID)
if not self._filter.lower() in name.lower():
continue
item = QTreeWidgetItem(cat, [name])
item.setData(0, Qt.UserRole, ID)
if self._showSubPlot:
f = item.font(0)
f.setBold(True)
item.setFont(0, f)
for subID, name in self._model.getSubPlotsByID(ID):
sub = QTreeWidgetItem(item, [name])
sub.setData(0, Qt.UserRole, "{}:{}".format(ID, subID))
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 currentPlotIndex(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)