Source code for cgl.ui.widgets.containers.tree
import logging
from PySide6 import QtCore, QtGui, QtWidgets
from cgl.ui.util import UISettings
from cgl.ui.widgets.base import StateSavers
from cgl.ui.widgets.combo import AdvComboBox
FILEPATH = 1
FILENAME = 0
FILETYPE = 2
FRANGE = 3
TAGS = 4
KEEP_CLIENT_NAMING = 5
SCOPE = 6
SEQ = 7
SHOT = 8
TASK = 9
PUBLISH_FILEPATH = 10
PUBLISH_DATE = 11
STATUS = 12
PARENT = 13
[docs]
class ProductionComboDelegate(QtWidgets.QItemDelegate):
index_changed = QtCore.Signal(object)
def __init__(self, parent, items):
QtWidgets.QItemDelegate.__init__(self, parent)
self.items = items
[docs]
def createEditor(self, parent):
combo = AdvComboBox(parent)
combo.addItems(self.items)
combo.setEnabled(True)
if not self.items:
combo.setEnabled(False)
combo.currentIndexChanged.connect(self.send_index_change)
return combo
[docs]
def send_index_change(self):
logging.info(self.__dict__)
self.index_changed.emit(self.sender().currentText())
[docs]
class LJTreeModel(QtGui.QStandardItemModel):
def __init__(self, parent=None):
QtGui.QStandardItemModel.__init__(self)
[docs]
class LJTreeWidget(QtWidgets.QTreeView):
nothing_selected = QtCore.Signal()
selected = QtCore.Signal(object)
files_added = QtCore.Signal(object)
header_labels = []
def __init__(self, parent=None, parents=None, model=None):
QtWidgets.QTreeView.__init__(self, parent)
StateSavers.remember_me(self)
self.items_ = []
if not model:
self.model = LJTreeModel()
else:
self.model = model
self.setModel(self.model)
self.setAcceptDrops(True)
self.setDropIndicatorShown(True)
self.setUniformRowHeights(True)
# connect items
if parents:
self.populate_tree(parents)
self.clicked.connect(self.row_selected)
self.activated.connect(self.row_selected)
self.horizontalScrollBar().setEnabled(False)
self.height_hint = 200
self.width_hint = 400
self.path_object = None
self.setMinimumHeight(200)
self.setMaximumHeight(200)
[docs]
def populate_from_data_frame(self, path_object, data_frame, header):
self.height_hint = 150
self.path_object = path_object
for row in data_frame.itertuples():
filename_item = QtGui.QStandardItem(row.Filename)
filename_item.setIcon(QtGui.QIcon(get_file_icon(row.Filename)))
if 'Parent' in data_frame:
row_list = [filename_item,
QtGui.QStandardItem(row.Filepath),
QtGui.QStandardItem(row.Filetype),
QtGui.QStandardItem(row.Frame_Range),
QtGui.QStandardItem(row.Tags),
QtGui.QStandardItem(row.Keep_Client_Naming),
QtGui.QStandardItem(row.Scope),
QtGui.QStandardItem(row.Seq),
QtGui.QStandardItem(row.Shot),
QtGui.QStandardItem(row.Task),
QtGui.QStandardItem(row.Publish_Filepath),
QtGui.QStandardItem(row.Publish_Date),
QtGui.QStandardItem(row.Status),
QtGui.QStandardItem(row.Parent)]
if row.Parent == 'self':
self.model.appendRow(row_list)
else:
# parent = find the row where filename matches 'parent'
items = self.model.findItems(str(row.Parent), column=FILENAME)
if items:
parent = items[-1]
parent.appendRow(row_list)
self.model.setHorizontalHeaderLabels(header)
self.header().setResizeMode(QtWidgets.QHeaderView.ResizeToContents)
self.header().setMinimumSectionSize(140)
# scopes_del = ProductionComboDelegate(self, scopes)
# scopes_del.index_changed.connect(self.scope_changed)
# self.setItemDelegateForColumn(SCOPE, scopes_del)
self.hideColumn(FILEPATH)
self.hideColumn(FILETYPE)
self.hideColumn(KEEP_CLIENT_NAMING)
# self.hideColumn(SEQ)
# self.hideColumn(SHOT)
self.hideColumn(SCOPE)
self.hideColumn(TASK)
self.hideColumn(TAGS)
# self.hideColumn(PUBLISH_FILEPATH)
self.hideColumn(PARENT)
# resize the tree view to the actual stuff.
self.setMinimumWidth(self.width_hint)
# self.setMinimumHeight(400)
[docs]
def set_header_labels(self, mdl, headers):
self.header_labels = headers
mdl.setHorizontalHeaderLabels(headers)
[docs]
def row_count(self):
logging.info('row count:', self.model.rowCount())
return self.model.rowCount()
[docs]
def column_count(self):
logging.info('column count:', self.model.columnCount())
return self.model.columnCount()
[docs]
def set_text(self, row, column_number, new_text):
parent = None
if row.parent().row() != -1:
parent = row.parent()
if parent:
self.model.itemFromIndex(parent.child(row.row(), column_number)).setText(new_text)
else:
self.model.item(row.row(), column_number).setText(new_text)
[docs]
def row_selected(self):
items = []
row = []
parent = None
if self.selectionModel():
logging.info(1)
logging.info(self.model)
for r in self.selectionModel().selectedRows():
if r.parent().row() != -1:
parent = r.parent()
for column in range(self.column_count()):
logging.info(column, self.model.item(r.row(), column).text())
if parent:
item = parent.child(r.row(), column).data(QtCore.Qt.DisplayRole)
else:
item = self.model.item(r.row(), column).text()
row.append(item)
items.append(row)
else:
logging.info('No data to select')
self.items_ = items
try:
self.selected.emit(items)
except IndexError:
logging.info('nothing selected')
self.nothing_selected.emit()
[docs]
def select_row_by_text(self, text, column=0):
# search all the items in the table view and select the one that has 'text' in it.
# .setSelection() is a massive part of figuring this out.
row_count = self.model().rowCount()
data = []
for row in range(0, row_count + 1):
src_index = self.model().index(row, column)
data = self.model().data(src_index, QtCore.Qt.DisplayRole)
if data == text:
self.selectRow(row)
self.selected.emit([data])
[docs]
def clear(self):
"""
:return:
"""
self.model = LJTreeModel()
self.setModel(self.model)
self.setAcceptDrops(True)
[docs]
@staticmethod
def on_closing():
settings = UISettings.settings()
logging.info(settings, 'Need to adjust this code')
# hheading = self.horizontalHeader()
# settings.setValue(widget_name(self) + ":hheading", hheading.saveState())
# def resizeEvent(self, event):
# # TODO - this doesn't work on mac, but does on windows
# """ Resize all sections to content and user interactive """
# super(LJTreeWidget, self).resizeEvent(event)
# header = self.header()
# total_width = 0
# for column in range(header.count()):
# try:
# header.setResizeMode(column, QtWidgets.QHeaderView.ResizeToContents)
# width = header.sectionSize(column)
# header.setResizeMode(column, QtWidgets.QHeaderView.Interactive)
# header.resizeSection(column, width)
# total_width += width
# except AttributeError:
# logging.info('PySide6 compatibility issue: setResizeMode')
# for row in range(self.row_count()):
# self.height_hint += 24
# self.width_hint = total_width
# self.sizeHint()
#
# def sizeHint(self):
# return QtCore.QSize(self.height_hint, self.width_hint)
[docs]
def dropEvent(self, event):
logging.info('dropping like its hot')
logging.info(self.height_hint)
logging.info(event.mimeData())
# if e.mimeData().hasUrls:
# e.setDropAction(QtCore.Qt.CopyAction)
# e.accept()
# file_list = []
# for url in e.mimeData().urls():
# file_list.append(str(url.toLocalFile()))
# self.files_added.emit(file_list)
# else:
# e.ignore()