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] @staticmethod def setEditorData(editor, index): logging.info(editor, index)
[docs] def send_index_change(self): logging.info(self.__dict__) self.index_changed.emit(self.sender().currentText())
[docs] @staticmethod def reload_items(items): logging.info(items)
[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_directory(self, directory): pass
[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()