mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-05-14 09:52:27 +12:00
Using QTreeWidget for plot, finally
This commit is contained in:
parent
28ba9f812d
commit
8d0e83a3b3
|
@ -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)
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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/>
|
||||
|
|
|
@ -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)
|
133
src/ui/views/plotTreeView.py
Normal file
133
src/ui/views/plotTreeView.py
Normal 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)
|
||||
|
Loading…
Reference in a new issue