Skip to content
This repository has been archived by the owner on Oct 10, 2024. It is now read-only.

Asset fetch second fix #222

Merged
merged 8 commits into from
Nov 19, 2020
31 changes: 19 additions & 12 deletions avalon/tools/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import re
import time
import logging
import collections

Expand Down Expand Up @@ -340,7 +341,7 @@ class AssetModel(TreeModel):
ObjectIdRole = QtCore.Qt.UserRole + 3
subsetColorsRole = QtCore.Qt.UserRole + 4

doc_fetched = QtCore.Signal()
doc_fetched = QtCore.Signal(bool)
refreshed = QtCore.Signal(bool)

# Asset document projection
Expand Down Expand Up @@ -441,13 +442,16 @@ def _add_hierarchy(self, assets, parent=None, silos=None):

self.asset_colors[asset["_id"]] = []

def on_doc_fetched(self):
def on_doc_fetched(self, was_stopped):
if was_stopped:
self.stop_fetch_thread()
return

self.beginResetModel()

assets_by_parent = self._doc_payload.get("assets_by_parent")
silos = self._doc_payload.get("silos")
if assets_by_parent is not None:

# Build the hierarchical tree items recursively
self._add_hierarchy(
assets_by_parent,
Expand All @@ -456,13 +460,16 @@ def on_doc_fetched(self):
)

self.endResetModel()
has_content = bool(assets_by_parent) or bool(silos)

has_content = bool(assets_by_parent) or bool(silos)
self.refreshed.emit(has_content)

self.stop_fetch_thread()

def fetch(self):
self._doc_payload = self._fetch() or {}
self.doc_fetched.emit()
# Emit doc fetched only if was not stopped
self.doc_fetched.emit(self._doc_fetching_stop)

def _fetch(self):
if not self.dbcon.Session.get("AVALON_PROJECT"):
Expand Down Expand Up @@ -504,16 +511,16 @@ def stop_fetch_thread(self):
if self._doc_fetching_thread is not None:
self._doc_fetching_stop = True
while self._doc_fetching_thread.isRunning():
pass
time.sleep(0.001)
self._doc_fetching_thread = None

def refresh(self):
def refresh(self, force=False):
"""Refresh the data for the model."""
# Skip fetch if there is already other thread fetching documents
if (
self._doc_fetching_thread is not None
and self._doc_fetching_thread.isRunning()
):
return
if self._doc_fetching_thread is not None:
if not force:
return
self.stop_fetch_thread()

# Clear model items
self.clear()
Expand Down
15 changes: 13 additions & 2 deletions avalon/tools/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class AssetWidget(QtWidgets.QWidget):
"""

refresh_triggered = QtCore.Signal() # on model refresh
refreshed = QtCore.Signal()
selection_changed = QtCore.Signal() # on view selection change
current_changed = QtCore.Signal() # on view current index change

Expand Down Expand Up @@ -100,6 +101,7 @@ def on_refreshed(has_item):
self.set_loading_state(loading=False, empty=not has_item)
self._restore_model_selection()
self.model.refreshed.disconnect()
self.refreshed.emit()
print("Duration: %.3fs" % (time.time() - time_start))

self.model.refreshed.connect(on_refreshed)
Expand Down Expand Up @@ -224,8 +226,13 @@ def _store_model_selection(self):

def _restore_model_selection(self):
model = self.view.model()
expanded = self.model_selection.pop("expanded", None)
selected = self.model_selection.pop("selected", None)
not_set = object()
expanded = self.model_selection.pop("expanded", not_set)
selected = self.model_selection.pop("selected", not_set)

if expanded is not_set or selected is not_set:
return

if expanded:
for index in lib.iter_model_rows(
model, column=0, include_root=False
Expand All @@ -250,6 +257,10 @@ def _restore_model_selection(self):
# Ensure item is visible
self.view.scrollTo(index)
selection_model.select(index, flags)
else:
asset_name = self.dbcon.Session.get("AVALON_ASSET")
if asset_name:
self.select_assets([asset_name])


class OptionalMenu(QtWidgets.QMenu):
Expand Down