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):
index = self.lstPlots.currentIndex()
index = self.lstPlots.currentPlotIndex()
if not index.isValid():
self.tabPlot.setEnabled(False)
@ -476,14 +476,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# Plots
self.lstPlots.setPlotModel(self.mdlPlots)
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.lstSubPlots.setModel(self.mdlPlots)
#self.txtSubPlotSummary.setModel(self.mdlPlots)
#self.txtSubPlotSummary.setColumn(1)
self.lstSubPlots.selectionModel().currentChanged.connect(self.changeCurrentSubPlot)
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.btnRmSubPlot.clicked.connect(self.mdlPlots.removeSubPlot)
self.btnRmPlotPerso.clicked.connect(self.mdlPlots.removePlotPerso)
@ -499,6 +499,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.tabPlot.setEnabled(False)
self.lstOutlinePlots.setPlotModel(self.mdlPlots)
self.lstOutlinePlots.setShowSubPlot(True)
# Outline
self.treeRedacOutline.setModel(self.mdlOutline)
self.treePlanOutline.setModelPersos(self.mdlPersos)

View file

@ -30,7 +30,20 @@ class plotModel(QStandardItemModel):
plots[2-toInt(importance)].append(ID)
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()):
_ID = self.item(i, Plot.ID.value).text()
if _ID == ID or toInt(_ID) == ID:
@ -46,7 +59,7 @@ class plotModel(QStandardItemModel):
return QModelIndex()
def currentIndex(self):
i = self.mw.lstPlots.selectionModel().currentIndex()
i = self.mw.lstPlots.currentIndex()
if i .isValid():
return i
else:
@ -85,7 +98,7 @@ class plotModel(QStandardItemModel):
####################################################################################################
def addSubPlot(self):
index = self.mw.lstPlots.currentIndex()
index = self.mw.lstPlots.currentPlotIndex()
if not index.isValid():
return
@ -122,7 +135,7 @@ class plotModel(QStandardItemModel):
####################################################################################################
def addPlotPerso(self, v):
index = self.mw.lstPlots.currentIndex()
index = self.mw.lstPlots.currentPlotIndex()
if index.isValid():
if not self.item(index.row(), Plot.persos.value):
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.verticalLayout_10 = QtWidgets.QVBoxLayout(self.groupBox_2)
self.verticalLayout_10.setObjectName("verticalLayout_10")
self.lstPlots = plotListView(self.groupBox_2)
self.lstPlots = plotTreeView(self.groupBox_2)
self.lstPlots.setObjectName("lstPlots")
self.lstPlots.headerItem().setText(0, "1")
self.lstPlots.header().setVisible(False)
self.verticalLayout_10.addWidget(self.lstPlots)
self.horizontalLayout_15 = QtWidgets.QHBoxLayout()
self.horizontalLayout_15.setObjectName("horizontalLayout_15")
@ -715,16 +717,10 @@ class Ui_MainWindow(object):
self.splitterOutlineH = QtWidgets.QSplitter(self.lytTabOutline)
self.splitterOutlineH.setOrientation(QtCore.Qt.Horizontal)
self.splitterOutlineH.setObjectName("splitterOutlineH")
self.treeWidget_2 = QtWidgets.QTreeWidget(self.splitterOutlineH)
self.treeWidget_2.setDragEnabled(True)
self.treeWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
self.treeWidget_2.setObjectName("treeWidget_2")
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.lstOutlinePlots = plotTreeView(self.splitterOutlineH)
self.lstOutlinePlots.setDragEnabled(True)
self.lstOutlinePlots.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
self.lstOutlinePlots.setObjectName("lstOutlinePlots")
self.layoutWidget = QtWidgets.QWidget(self.splitterOutlineH)
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout_14 = QtWidgets.QVBoxLayout(self.layoutWidget)
@ -1115,10 +1111,10 @@ class Ui_MainWindow(object):
self.menubar.addAction(self.menuHelp.menuAction())
self.retranslateUi(MainWindow)
self.tabMain.setCurrentIndex(3)
self.tabMain.setCurrentIndex(5)
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)
@ -1201,16 +1197,6 @@ class Ui_MainWindow(object):
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.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.btnRedacFolderText.setText(_translate("MainWindow", "Text"))
self.btnRedacFolderCork.setText(_translate("MainWindow", "Index cards"))
@ -1272,12 +1258,12 @@ class Ui_MainWindow(object):
self.actSettings.setText(_translate("MainWindow", "Settings"))
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.editors.editorWidget import editorWidget
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.plotTreeView import plotTreeView
from ui.views.textEditView import textEditView
from ui.sldImportance import sldImportance

View file

@ -18,7 +18,7 @@
<item>
<widget class="QTabWidget" name="tabMain">
<property name="currentIndex">
<number>3</number>
<number>5</number>
</property>
<property name="documentMode">
<bool>true</bool>
@ -916,7 +916,16 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
<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>
<layout class="QHBoxLayout" name="horizontalLayout_15">
@ -975,7 +984,7 @@
</widget>
<widget class="QTabWidget" name="tabPlot">
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<property name="documentMode">
<bool>true</bool>
@ -1326,48 +1335,13 @@
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeWidget" name="treeWidget_2">
<widget class="plotTreeView" name="lstOutlinePlots">
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum>
</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 class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_14">
@ -2198,9 +2172,9 @@
<container>1</container>
</customwidget>
<customwidget>
<class>plotListView</class>
<extends>QListWidget</extends>
<header>ui.views.plotListView.h</header>
<class>plotTreeView</class>
<extends>QTreeWidget</extends>
<header>ui.views.plotTreeView.h</header>
</customwidget>
</customwidgets>
<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)