use ProjectHandler object instead of passing dbcon changes and simplified project handling in Launcher tool

This commit is contained in:
iLLiCiTiT 2021-06-21 19:08:35 +02:00
parent e63b943519
commit 480900a1cc
2 changed files with 32 additions and 58 deletions

View file

@ -20,25 +20,15 @@ from .constants import (
class ProjectBar(QtWidgets.QWidget):
project_changed = QtCore.Signal(int)
# Project list will be refreshed each 10000 msecs
refresh_interval = 10000
def __init__(self, dbcon, parent=None):
def __init__(self, project_handler, parent=None):
super(ProjectBar, self).__init__(parent)
self.dbcon = dbcon
model = ProjectModel(dbcon)
model.hide_invisible = True
project_combobox = QtWidgets.QComboBox(self)
# Change delegate so stylysheets are applied
project_delegate = QtWidgets.QStyledItemDelegate(project_combobox)
project_combobox.setItemDelegate(project_delegate)
project_combobox.setModel(model)
project_combobox.setModel(project_handler.model)
project_combobox.setRootModelIndex(QtCore.QModelIndex())
layout = QtWidgets.QHBoxLayout(self)
@ -51,19 +41,20 @@ class ProjectBar(QtWidgets.QWidget):
)
refresh_timer = QtCore.QTimer()
refresh_timer.setInterval(self.refresh_interval)
refresh_timer.setInterval(project_handler.refresh_interval)
self.model = model
self.project_handler = project_handler
self.project_delegate = project_delegate
self.project_combobox = project_combobox
self.refresh_timer = refresh_timer
# Signals
refresh_timer.timeout.connect(self._on_refresh_timeout)
self.project_combobox.currentIndexChanged.connect(self.project_changed)
self.project_combobox.currentIndexChanged.connect(self.on_index_change)
project_handler.project_changed.connect(self._on_project_change)
# Set current project by default if it's set.
project_name = self.dbcon.Session.get("AVALON_PROJECT")
project_name = project_handler.current_project
if project_name:
self.set_project(project_name)
@ -79,7 +70,12 @@ class ProjectBar(QtWidgets.QWidget):
elif self.isActiveWindow():
# Refresh projects if window is active
self.model.refresh()
self.project_handler.refresh_model()
def _on_project_change(self, project_name):
if self.get_current_project() == project_name:
return
self.set_project(project_name)
def get_current_project(self):
return self.project_combobox.currentText()
@ -88,14 +84,18 @@ class ProjectBar(QtWidgets.QWidget):
index = self.project_combobox.findText(project_name)
if index < 0:
# Try refresh combobox model
self.refresh()
self.project_handler.refresh_model()
index = self.project_combobox.findText(project_name)
if index >= 0:
self.project_combobox.setCurrentIndex(index)
def refresh(self):
self.model.refresh()
def on_index_change(self, idx):
if not self.isVisible():
return
project_name = self.get_current_project()
self.project_handler.set_project(project_name)
class ActionBar(QtWidgets.QWidget):

View file

@ -89,46 +89,37 @@ class ProjectIconView(QtWidgets.QListView):
class ProjectsPanel(QtWidgets.QWidget):
"""Projects Page"""
project_clicked = QtCore.Signal(str)
# Refresh projects each 10000 msecs
refresh_interval = 10000
def __init__(self, dbcon, parent=None):
def __init__(self, project_handler, parent=None):
super(ProjectsPanel, self).__init__(parent=parent)
layout = QtWidgets.QVBoxLayout(self)
self.dbcon = dbcon
self.dbcon.install()
view = ProjectIconView(parent=self)
view.setSelectionMode(QtWidgets.QListView.NoSelection)
flick = FlickCharm(parent=self)
flick.activateOn(view)
model = ProjectModel(self.dbcon)
model.hide_invisible = True
view.setModel(model)
view.setModel(project_handler.model)
layout.addWidget(view)
refresh_timer = QtCore.QTimer()
refresh_timer.setInterval(self.refresh_interval)
refresh_timer.setInterval(project_handler.refresh_interval)
refresh_timer.timeout.connect(self._on_refresh_timeout)
view.clicked.connect(self.on_clicked)
self.model = model
self.view = view
self.refresh_timer = refresh_timer
self.project_handler = project_handler
def on_clicked(self, index):
if index.isValid():
project_name = index.data(QtCore.Qt.DisplayRole)
self.project_clicked.emit(project_name)
self.project_handler.set_project(project_name)
def showEvent(self, event):
self.model.refresh()
self.project_handler.refresh_model()
if not self.refresh_timer.isActive():
self.refresh_timer.start()
super(ProjectsPanel, self).showEvent(event)
@ -140,7 +131,7 @@ class ProjectsPanel(QtWidgets.QWidget):
elif self.isActiveWindow():
# Refresh projects if window is active
self.model.refresh()
self.project_handler.refresh_model()
class AssetsPanel(QtWidgets.QWidget):
@ -148,7 +139,7 @@ class AssetsPanel(QtWidgets.QWidget):
back_clicked = QtCore.Signal()
session_changed = QtCore.Signal()
def __init__(self, dbcon, parent=None):
def __init__(self, project_handler, dbcon, parent=None):
super(AssetsPanel, self).__init__(parent=parent)
self.dbcon = dbcon
@ -163,7 +154,7 @@ class AssetsPanel(QtWidgets.QWidget):
btn_back = QtWidgets.QPushButton(project_bar_widget)
btn_back.setIcon(btn_back_icon)
project_bar = ProjectBar(self.dbcon, project_bar_widget)
project_bar = ProjectBar(project_handler, project_bar_widget)
layout.addWidget(btn_back)
layout.addWidget(project_bar)
@ -206,24 +197,19 @@ class AssetsPanel(QtWidgets.QWidget):
layout.addWidget(body)
# signals
project_bar.project_changed.connect(self.on_project_changed)
project_handler.project_changed.connect(self.on_project_changed)
assets_widget.selection_changed.connect(self.on_asset_changed)
assets_widget.refreshed.connect(self.on_asset_changed)
tasks_widget.task_changed.connect(self.on_task_change)
btn_back.clicked.connect(self.back_clicked)
self.project_handler = project_handler
self.project_bar = project_bar
self.assets_widget = assets_widget
self.tasks_widget = tasks_widget
self._btn_back = btn_back
# Force initial refresh for the assets since we might not be
# trigging a Project switch if we click the project that was set
# prior to launching the Launcher
# todo: remove this behavior when AVALON_PROJECT is not required
assets_widget.refresh()
def showEvent(self, event):
super(AssetsPanel, self).showEvent(event)
@ -232,19 +218,7 @@ class AssetsPanel(QtWidgets.QWidget):
btn_size = self.project_bar.height()
self._btn_back.setFixedSize(QtCore.QSize(btn_size, btn_size))
def set_project(self, project):
before = self.project_bar.get_current_project()
if before == project:
self.assets_widget.refresh()
return
self.project_bar.set_project(project)
self.on_project_changed()
def on_project_changed(self):
project_name = self.project_bar.get_current_project()
self.dbcon.Session["AVALON_PROJECT"] = project_name
self.session_changed.emit()
self.assets_widget.refresh()