dont use dictionaries to store widgets as it's hard for orientation in code

This commit is contained in:
iLLiCiTiT 2021-01-06 19:08:38 +01:00
parent 3a70e1276d
commit 709ef29c03

View file

@ -421,67 +421,72 @@ class FilesWidget(QtWidgets.QWidget):
# (setting parent doesn't work as it hides the message box) # (setting parent doesn't work as it hides the message box)
self._messagebox = None self._messagebox = None
widgets = { files_view = FilesView(self)
"filter": QtWidgets.QLineEdit(),
"list": FilesView(),
"open": QtWidgets.QPushButton("Open"),
"browse": QtWidgets.QPushButton("Browse"),
"save": QtWidgets.QPushButton("Save As")
}
delegates = { # Create the Files model
"time": PrettyTimeDelegate()
}
# Create the files model
extensions = set(self.host.file_extensions()) extensions = set(self.host.file_extensions())
self.model = FilesModel(file_extensions=extensions) files_model = FilesModel(file_extensions=extensions)
self.proxy = QtCore.QSortFilterProxyModel()
self.proxy.setSourceModel(self.model) # Create proxy model for files to be able sort and filter
self.proxy.setDynamicSortFilter(True) proxy_model = QtCore.QSortFilterProxyModel()
self.proxy.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) proxy_model.setSourceModel(files_model)
proxy_model.setDynamicSortFilter(True)
proxy_model.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive)
# Set up the file list tree view # Set up the file list tree view
widgets["list"].setModel(self.proxy) files_view.setModel(proxy_model)
widgets["list"].setSortingEnabled(True) files_view.setSortingEnabled(True)
widgets["list"].setContextMenuPolicy(QtCore.Qt.CustomContextMenu) files_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
# Date modified delegate # Date modified delegate
widgets["list"].setItemDelegateForColumn(1, delegates["time"]) time_delegate = PrettyTimeDelegate()
widgets["list"].setIndentation(3) # smaller indentation files_view.setItemDelegateForColumn(1, time_delegate)
files_view.setIndentation(3) # smaller indentation
# Default to a wider first filename column it is what we mostly care # Default to a wider first filename column it is what we mostly care
# about and the date modified is relatively small anyway. # about and the date modified is relatively small anyway.
widgets["list"].setColumnWidth(0, 330) files_view.setColumnWidth(0, 330)
widgets["filter"].textChanged.connect(self.proxy.setFilterFixedString) # Filtering input
widgets["filter"].setPlaceholderText("Filter files..") filter_input = QtWidgets.QLineEdit(self)
filter_input.textChanged.connect(proxy_model.setFilterFixedString)
filter_input.setPlaceholderText("Filter files..")
# Home Page # Home Page
# Build buttons widget for files widget # Build buttons widget for files widget
buttons = QtWidgets.QWidget() btns_widget = QtWidgets.QWidget(self)
layout = QtWidgets.QHBoxLayout(buttons) btn_save = QtWidgets.QPushButton("Save As", btns_widget)
layout.setContentsMargins(0, 0, 0, 0) btn_browse = QtWidgets.QPushButton("Browse", btns_widget)
layout.addWidget(widgets["open"]) btn_open = QtWidgets.QPushButton("Open", btns_widget)
layout.addWidget(widgets["browse"])
layout.addWidget(widgets["save"]) btns_layout = QtWidgets.QHBoxLayout(btns_widget)
btns_layout.setContentsMargins(0, 0, 0, 0)
btns_layout.addWidget(btn_open)
btns_layout.addWidget(btn_browse)
btns_layout.addWidget(btn_save)
# Build files widgets for home page # Build files widgets for home page
layout = QtWidgets.QVBoxLayout(self) main_layout = QtWidgets.QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0) main_layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(widgets["filter"]) main_layout.addWidget(filter_input)
layout.addWidget(widgets["list"]) main_layout.addWidget(files_view)
layout.addWidget(buttons) main_layout.addWidget(btns_widget)
widgets["list"].doubleClickedLeft.connect(self.on_open_pressed) # Register signal callbacks
widgets["list"].customContextMenuRequested.connect( files_view.doubleClickedLeft.connect(self.on_open_pressed)
self.on_context_menu files_view.customContextMenuRequested.connect(self.on_context_menu)
)
widgets["open"].pressed.connect(self.on_open_pressed)
widgets["browse"].pressed.connect(self.on_browse_pressed)
widgets["save"].pressed.connect(self.on_save_as_pressed)
self.widgets = widgets btn_open.pressed.connect(self.on_open_pressed)
self.delegates = delegates btn_browse.pressed.connect(self.on_browse_pressed)
btn_save.pressed.connect(self.on_save_as_pressed)
# Store widgets
self.files_view = files_view
self.files_model = files_model
self.btn_open = btn_open
self.btn_browse = btn_browse
self.btn_save = btn_save
def set_asset_task(self, asset, task): def set_asset_task(self, asset, task):
self._asset = asset self._asset = asset
@ -495,11 +500,11 @@ class FilesWidget(QtWidgets.QWidget):
self.root = self.host.work_root(session) self.root = self.host.work_root(session)
exists = os.path.exists(self.root) exists = os.path.exists(self.root)
self.widgets["browse"].setEnabled(exists) self.btn_browse.setEnabled(exists)
self.widgets["open"].setEnabled(exists) self.btn_open.setEnabled(exists)
self.model.set_root(self.root) self.files_model.set_root(self.root)
else: else:
self.model.set_root(None) self.files_model.set_root(None)
def _get_session(self): def _get_session(self):
"""Return a modified session for the current asset and task""" """Return a modified session for the current asset and task"""
@ -615,14 +620,12 @@ class FilesWidget(QtWidgets.QWidget):
def _get_selected_filepath(self): def _get_selected_filepath(self):
"""Return current filepath selected in view""" """Return current filepath selected in view"""
model = self.model selection = self.files_view.selectionModel()
view = self.widgets["list"]
selection = view.selectionModel()
index = selection.currentIndex() index = selection.currentIndex()
if not index.isValid(): if not index.isValid():
return return
return index.data(model.FilePathRole) return index.data(self.files_model.FilePathRole)
def on_open_pressed(self): def on_open_pressed(self):
path = self._get_selected_filepath() path = self._get_selected_filepath()
@ -715,14 +718,13 @@ class FilesWidget(QtWidgets.QWidget):
def refresh(self): def refresh(self):
"""Refresh listed files for current selection in the interface""" """Refresh listed files for current selection in the interface"""
self.model.refresh() self.files_model.refresh()
if self.auto_select_latest_modified: if self.auto_select_latest_modified:
tools_lib.schedule(self._select_last_modified_file, 100) tools_lib.schedule(self._select_last_modified_file, 100)
def on_context_menu(self, point): def on_context_menu(self, point):
view = self.widgets["list"] index = self.files_view.indexAt(point)
index = view.indexAt(point)
if not index.isValid(): if not index.isValid():
return return
@ -741,16 +743,15 @@ class FilesWidget(QtWidgets.QWidget):
menu.addAction(action) menu.addAction(action)
# Show the context action menu # Show the context action menu
global_point = view.mapToGlobal(point) global_point = self.files_view.mapToGlobal(point)
action = menu.exec_(global_point) action = menu.exec_(global_point)
if not action: if not action:
return return
def _select_last_modified_file(self): def _select_last_modified_file(self):
"""Utility function to select the file with latest date modified""" """Utility function to select the file with latest date modified"""
role = self.model.DateModifiedRole role = self.files_model.DateModifiedRole
view = self.widgets["list"] model = self.files_view.model()
model = view.model()
highest_index = None highest_index = None
highest = 0 highest = 0
@ -765,7 +766,7 @@ class FilesWidget(QtWidgets.QWidget):
highest = modified highest = modified
if highest_index: if highest_index:
view.setCurrentIndex(highest_index) self.files_view.setCurrentIndex(highest_index)
class Window(QtWidgets.QMainWindow): class Window(QtWidgets.QMainWindow):
@ -777,49 +778,49 @@ class Window(QtWidgets.QMainWindow):
self.setWindowTitle(self.title) self.setWindowTitle(self.title)
self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowCloseButtonHint) self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowCloseButtonHint)
pages = { pages_widget = QtWidgets.QStackedWidget(self)
"home": QtWidgets.QWidget()
}
widgets = { home_page_widget = QtWidgets.QWidget(pages_widget)
"pages": QtWidgets.QStackedWidget(), home_body_widget = QtWidgets.QWidget(home_page_widget)
"body": QtWidgets.QWidget(),
"assets": AssetWidget(io),
"tasks": TasksWidget(),
"files": FilesWidget()
}
self.setCentralWidget(widgets["pages"]) assets_widget = AssetWidget(io, parent=home_body_widget)
widgets["pages"].addWidget(pages["home"]) tasks_widget = TasksWidget(home_body_widget)
files_widget = FilesWidget(home_body_widget)
self.setCentralWidget(pages_widget)
pages_widget.addWidget(home_page_widget)
# Build home # Build home
layout = QtWidgets.QVBoxLayout(pages["home"]) layout = QtWidgets.QVBoxLayout(home_page_widget)
layout.addWidget(widgets["body"]) layout.addWidget(home_body_widget)
# Build home - body # Build home - body
layout = QtWidgets.QVBoxLayout(widgets["body"]) body_layout = QtWidgets.QVBoxLayout(home_body_widget)
split = QtWidgets.QSplitter() split = QtWidgets.QSplitter(home_body_widget)
split.addWidget(widgets["assets"]) split.addWidget(assets_widget)
split.addWidget(widgets["tasks"]) split.addWidget(tasks_widget)
split.addWidget(widgets["files"]) split.addWidget(files_widget)
split.setStretchFactor(0, 1) split.setStretchFactor(0, 1)
split.setStretchFactor(1, 1) split.setStretchFactor(1, 1)
split.setStretchFactor(2, 3) split.setStretchFactor(2, 3)
layout.addWidget(split) body_layout.addWidget(split)
# Add top margin for tasks to align it visually with files as # Add top margin for tasks to align it visually with files as
# the files widget has a filter field which tasks does not. # the files widget has a filter field which tasks does not.
widgets["tasks"].setContentsMargins(0, 32, 0, 0) tasks_widget.setContentsMargins(0, 32, 0, 0)
# Connect signals # Connect signals
widgets["assets"].current_changed.connect(self.on_asset_changed) assets_widget.current_changed.connect(self.on_asset_changed)
widgets["tasks"].task_changed.connect(self.on_task_changed) tasks_widget.task_changed.connect(self.on_task_changed)
self.assets_widget = assets_widget
self.tasks_widget = tasks_widget
self.files_widget = files_widget
self.widgets = widgets
self.refresh() self.refresh()
# Force focus on the open button by default, required for Houdini. # Force focus on the open button by default, required for Houdini.
self.widgets["files"].widgets["open"].setFocus() files_widget.btn_open.setFocus()
self.resize(900, 600) self.resize(900, 600)
@ -854,46 +855,45 @@ class Window(QtWidgets.QMainWindow):
) )
# Select the asset # Select the asset
self.widgets["assets"].select_assets([asset], expand=True) self.assets_widget.select_assets([asset], expand=True)
# Force a refresh on Tasks? # Force a refresh on Tasks?
self.widgets["tasks"].set_asset(asset_document) self.tasks_widget.set_asset(asset_document)
if "task" in context: if "task" in context:
self.widgets["tasks"].select_task(context["task"]) self.tasks_widget.select_task(context["task"])
def refresh(self): def refresh(self):
# Refresh asset widget # Refresh asset widget
self.widgets["assets"].refresh() self.assets_widget.refresh()
self._on_task_changed() self._on_task_changed()
def _on_asset_changed(self): def _on_asset_changed(self):
asset = self.widgets["assets"].get_selected_assets() or None asset = self.assets_widget.get_selected_assets() or None
if not asset: if not asset:
# Force disable the other widgets if no # Force disable the other widgets if no
# active selection # active selection
self.widgets["tasks"].setEnabled(False) self.tasks_widget.setEnabled(False)
self.widgets["files"].setEnabled(False) self.files_widget.setEnabled(False)
else: else:
asset = asset[0] asset = asset[0]
self.widgets["tasks"].setEnabled(True) self.tasks_widget.setEnabled(True)
self.widgets["tasks"].set_asset(asset) self.tasks_widget.set_asset(asset)
def _on_task_changed(self): def _on_task_changed(self):
asset = self.widgets["assets"].get_selected_assets() or None asset = self.assets_widget.get_selected_assets() or None
if asset is not None: if asset is not None:
asset = asset[0] asset = asset[0]
task = self.widgets["tasks"].get_current_task() task = self.tasks_widget.get_current_task()
self.widgets["tasks"].setEnabled(bool(asset)) self.tasks_widget.setEnabled(bool(asset))
self.widgets["files"].setEnabled(all([bool(task), bool(asset)]))
files = self.widgets["files"] self.files_widget.setEnabled(all([bool(task), bool(asset)]))
files.set_asset_task(asset, task) self.files_widget.set_asset_task(asset, task)
files.refresh() self.files_widget.refresh()
def validate_host_requirements(host): def validate_host_requirements(host):
@ -939,17 +939,18 @@ def show(root=None, debug=False, parent=None, use_context=True, save=True):
api.Session["AVALON_TASK"] = "Testing" api.Session["AVALON_TASK"] = "Testing"
with tools_lib.application(): with tools_lib.application():
window = Window(parent=parent) window = Window(parent=parent)
window.refresh() window.refresh()
if use_context: if use_context:
context = {"asset": api.Session["AVALON_ASSET"], context = {
"silo": api.Session["AVALON_SILO"], "asset": api.Session["AVALON_ASSET"],
"task": api.Session["AVALON_TASK"]} "silo": api.Session["AVALON_SILO"],
"task": api.Session["AVALON_TASK"]
}
window.set_context(context) window.set_context(context)
window.widgets["files"].widgets["save"].setEnabled(save) window.files_widget.btn_save.setEnabled(save)
window.show() window.show()
window.setStyleSheet(style.load_stylesheet()) window.setStyleSheet(style.load_stylesheet())