Source code for editor.widgets.complex.tree_stacked
from PySide6.QtCore import Qt, QEvent
from PySide6.QtWidgets import QStackedWidget, QSplitter, QScrollArea, QWidget
from PySide6.QtGui import QStandardItem, QStandardItemModel
from editor.widgets.complex.tree_view import TreeView
[docs]class TreeStackedWidget(QSplitter):
def __init__(self, parent):
super().__init__(parent)
self.itemIndexTable = {}
self.tree = self.createTreeView()
self.stacked = self.createStackedView()
self.addWidget(self.tree)
self.addWidget(self.stacked)
self.setOrientation(Qt.Horizontal)
self.setChildrenCollapsible(False)
self.setSizes([100, 300])
[docs] def eventFilter(self, obj, evt):
if obj == self.tree and evt.type() == QEvent.KeyPress:
key = evt.key()
if key == Qt.Key_Right or key == Qt.Key_Left or key == Qt.Key_Up or key == Qt.Key_Down:
self.tree.keyPressEvent(evt)
return True
return False
[docs] def createTreeView(self):
tree = TreeView(self)
tree.setModel(QStandardItemModel())
tree.selectionModel().currentChanged.connect(self.onCurrentChanged)
tree.installEventFilter(self)
return tree
[docs] def createStackedView(self):
stacked = QStackedWidget(self)
stacked.addWidget(self.createStackedEmpty())
stacked.setCurrentIndex(0)
return stacked
[docs] def affirmTabItem(self, name, parent):
for i in range(parent.rowCount()):
child = parent.child(i)
if child.text() == name:
return child
newItem = QStandardItem(name)
parent.appendRow(newItem)
return newItem
[docs] def addStackedWidget(self, path, widget):
model = self.tree.model()
curr = model.invisibleRootItem()
for name in path.split('/'): curr = self.affirmTabItem(name, curr)
area = QScrollArea(self)
area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
area.setWidgetResizable(True)
area.setWidget(widget)
idx = self.stacked.addWidget(area)
self.itemIndexTable[ path ] = idx
[docs] def setCurrentPath(self, path):
if path not in self.itemIndexTable:
self.stacked.setCurrentIndex(0)
else:
self.stacked.setCurrentIndex(self.itemIndexTable[ path ])
[docs] def onCurrentChanged(self, curr, prev):
if curr == prev: return
if not curr.isValid():
self.stacked.setCurrentIndex(0)
else:
self.setCurrentPath(self.path(curr))
[docs] def path(self, index):
path = index.data()
parent = index.parent()
if parent.isValid(): path = self.path(parent) + '/' + path
return path