From e32d7de7a606c2533dc53f501bdca60e7aef3270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 14 Mar 2016 18:12:29 +0100 Subject: [PATCH] Earlier calling of thumbnail_loading callback This means that some information isn't available to the callback yet, but it can show the filename & spinner logo much sooner. --- blender_cloud/gui.py | 48 ++++++++++++++++++++++++++------ blender_cloud/icons/spinner.png | Bin 0 -> 2433 bytes blender_cloud/pillar.py | 5 ++-- 3 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 blender_cloud/icons/spinner.png diff --git a/blender_cloud/gui.py b/blender_cloud/gui.py index dcaf566..5cae997 100644 --- a/blender_cloud/gui.py +++ b/blender_cloud/gui.py @@ -54,16 +54,17 @@ class MenuItem: DEFAULT_ICONS = { 'FOLDER': os.path.join(library_icons_path, 'folder.png'), + 'SPINNER': os.path.join(library_icons_path, 'spinner.png'), } def __init__(self, node_uuid: str, file_desc, thumb_path: str, label_text): - self.node_uuid = node_uuid # pillarsdk.Node UUID + self.node_uuid = node_uuid # pillarsdk.Node UUID of a texture node self.file_desc = file_desc # pillarsdk.File object, or None if a 'folder' node. self.label_text = label_text + self._thumb_path = '' + self.icon = None - thumb_path = self.DEFAULT_ICONS.get(thumb_path, thumb_path) self.thumb_path = thumb_path - self.icon = bpy.data.images.load(filepath=thumb_path) # Updated when drawing the image self.x = 0 @@ -71,6 +72,23 @@ class MenuItem: self.width = 0 self.height = 0 + @property + def thumb_path(self) -> str: + return self._thumb_path + + @thumb_path.setter + def thumb_path(self, new_thumb_path: str): + self._thumb_path = self.DEFAULT_ICONS.get(new_thumb_path, new_thumb_path) + if self._thumb_path: + self.icon = bpy.data.images.load(filepath=self._thumb_path) + else: + self.icon = None + + def update(self, file_desc, thumb_path: str, label_text): + self.file_desc = file_desc # pillarsdk.File object, or None if a 'folder' node. + self.thumb_path = thumb_path + self.label_text = label_text + @property def is_folder(self) -> bool: return self.file_desc is None @@ -143,6 +161,7 @@ class BlenderCloudBrowser(bpy.types.Operator): async_task = None # asyncio task for fetching thumbnails timer = None + _menu_item_lock = threading.Lock() current_path = '' current_display_content = [] loaded_images = set() @@ -240,16 +259,27 @@ class BlenderCloudBrowser(bpy.types.Operator): self.loaded_images.clear() self.current_display_content.clear() - def add_menu_item(self, *args, menu_item_lock=threading.Lock()) -> MenuItem: + def add_menu_item(self, *args) -> MenuItem: menu_item = MenuItem(*args) # Just make this thread-safe to be on the safe side. - with menu_item_lock: + with self._menu_item_lock: self.current_display_content.append(menu_item) self.loaded_images.add(menu_item.icon.filepath_raw) return menu_item + def update_menu_item(self, node_uuid, *args) -> MenuItem: + # Just make this thread-safe to be on the safe side. + with self._menu_item_lock: + for menu_item in self.current_display_content: + if menu_item.node_uuid == node_uuid: + menu_item.update(*args) + self.loaded_images.add(menu_item.icon.filepath_raw) + break + else: + raise ValueError('Unable to find MenuItem(node_uuid=%r)' % node_uuid) + async def async_download_previews(self, context, thumbnails_directory): # If we have a node UUID, we fetch the textures # FIXME: support mixture of sub-nodes and textures under one node. @@ -264,13 +294,13 @@ class BlenderCloudBrowser(bpy.types.Operator): # region.tag_redraw() pass - def thumbnail_loading(node_uuid, file_desc): - # TODO: add MenuItem + def thumbnail_loading(node_uuid, texture_node): + self.add_menu_item(node_uuid, None, 'SPINNER', texture_node['name']) redraw() def thumbnail_loaded(node_uuid, file_desc, thumb_path): - # Add MenuItem; TODO: update MenuItem added above - self.add_menu_item(node_uuid, file_desc, thumb_path, file_desc['filename']) + # update MenuItem added above + self.update_menu_item(node_uuid, file_desc, thumb_path, file_desc['filename']) redraw() if self.node_uuid: diff --git a/blender_cloud/icons/spinner.png b/blender_cloud/icons/spinner.png new file mode 100644 index 0000000000000000000000000000000000000000..48de394f3f35a726e46461eddb2f5daabd7523da GIT binary patch literal 2433 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