Merge pull request #2345 from pypeclub/bugfix/clear_asset_model_on_project_change

Assets Widget: Clear model on project change
This commit is contained in:
Jakub Trllo 2021-11-30 14:28:43 +01:00 committed by GitHub
commit 13e33a74f3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -347,14 +347,22 @@ class AssetModel(QtGui.QStandardItemModel):
return self.get_indexes_by_asset_ids(asset_ids)
def refresh(self, force=False):
"""Refresh the data for the model."""
def refresh(self, force=False, clear=False):
"""Refresh the data for the model.
Args:
force (bool): Stop currently running refresh start new refresh.
clear (bool): Clear model before refresh thread starts.
"""
# Skip fetch if there is already other thread fetching documents
if self._refreshing:
if not force:
return
self.stop_refresh()
if clear:
self._clear_items()
# Fetch documents from mongo
# Restart payload
self._refreshing = True
@ -379,15 +387,18 @@ class AssetModel(QtGui.QStandardItemModel):
continue
item.setData(colors, ASSET_UNDERLINE_COLORS_ROLE)
def _clear_items(self):
root_item = self.invisibleRootItem()
root_item.removeRows(0, root_item.rowCount())
self._items_by_asset_id = {}
self._items_with_color_by_id = {}
def _on_docs_fetched(self):
# Make sure refreshing did not change
# - since this line is refreshing sequential and
# triggering of new refresh will happen when this method is done
if not self._refreshing:
root_item = self.invisibleRootItem()
root_item.removeRows(0, root_item.rowCount())
self._items_by_asset_id = {}
self._items_with_color_by_id = {}
self._clear_items()
return
# Collect asset documents as needed
@ -419,8 +430,6 @@ class AssetModel(QtGui.QStandardItemModel):
parent_id, parent_item = asset_items_queue.popleft()
# Skip if there are no children
children_ids = asset_ids_by_parents[parent_id]
if not children_ids:
continue
# Go through current children of parent item
# - find out items that were deleted and skip creation of already
@ -626,6 +635,7 @@ class AssetsWidget(QtWidgets.QWidget):
self._model = model
self._proxy = proxy
self._view = view
self._last_project_name = None
self.model_selection = {}
@ -634,7 +644,12 @@ class AssetsWidget(QtWidgets.QWidget):
return self._model.refreshing
def refresh(self):
self._refresh_model()
project_name = self.dbcon.Session.get("AVALON_PROJECT")
clear_model = False
if project_name != self._last_project_name:
clear_model = True
self._last_project_name = project_name
self._refresh_model(clear_model)
def stop_refresh(self):
self._model.stop_refresh()
@ -680,14 +695,14 @@ class AssetsWidget(QtWidgets.QWidget):
self._set_loading_state(loading=False, empty=not has_item)
self.refreshed.emit()
def _refresh_model(self):
def _refresh_model(self, clear=False):
# Store selection
self._set_loading_state(loading=True, empty=True)
# Trigger signal before refresh is called
self.refresh_triggered.emit()
# Refresh model
self._model.refresh()
self._model.refresh(clear=clear)
def _set_loading_state(self, loading, empty):
self._view.set_loading_state(loading, empty)