From 79dc5c91f722194c3bc6b97d6575e80084d8d122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 22 Mar 2018 14:21:09 +0100 Subject: [PATCH] Gracefully handle download errors in texture browser --- blender_cloud/icons/error.png | Bin 0 -> 10885 bytes blender_cloud/pillar.py | 6 +++- blender_cloud/texture_browser.py | 57 ++++++++++++++++++++----------- 3 files changed, 42 insertions(+), 21 deletions(-) create mode 100644 blender_cloud/icons/error.png diff --git a/blender_cloud/icons/error.png b/blender_cloud/icons/error.png new file mode 100644 index 0000000000000000000000000000000000000000..6f501e73ffdbf1b2192057f70bd8f086791b5583 GIT binary patch literal 10885 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 C-q{ua literal 0 HcmV?d00001 diff --git a/blender_cloud/pillar.py b/blender_cloud/pillar.py index b0bfbb5..5e690d5 100755 --- a/blender_cloud/pillar.py +++ b/blender_cloud/pillar.py @@ -632,7 +632,11 @@ async def download_texture_thumbnail(texture_node, desired_size: str, # Cached headers are stored next to thumbnails in sidecar files. header_store = '%s.headers' % thumb_path - await download_to_file(thumb_url, thumb_path, header_store=header_store, future=future) + try: + await download_to_file(thumb_url, thumb_path, header_store=header_store, future=future) + except requests.exceptions.HTTPError as ex: + log.error('Unable to download %s: %s', thumb_url, ex) + thumb_path = 'ERROR' loop.call_soon_threadsafe(thumbnail_loaded, texture_node, file_desc, thumb_path) diff --git a/blender_cloud/texture_browser.py b/blender_cloud/texture_browser.py index c3aeb07..20abe9b 100644 --- a/blender_cloud/texture_browser.py +++ b/blender_cloud/texture_browser.py @@ -82,6 +82,7 @@ class MenuItem: DEFAULT_ICONS = { 'FOLDER': os.path.join(library_icons_path, 'folder.png'), 'SPINNER': os.path.join(library_icons_path, 'spinner.png'), + 'ERROR': os.path.join(library_icons_path, 'error.png'), } FOLDER_NODE_TYPES = {'group_texture', 'group_hdri', UpNode.NODE_TYPE, ProjectNode.NODE_TYPE} @@ -99,6 +100,7 @@ class MenuItem: self.node = node # pillarsdk.Node, contains 'node_type' key to indicate type self.file_desc = file_desc # pillarsdk.File object, or None if a 'folder' node. self.label_text = label_text + self.small_text = self._small_text_from_node() self._thumb_path = '' self.icon = None self._is_folder = node['node_type'] in self.FOLDER_NODE_TYPES @@ -118,6 +120,26 @@ class MenuItem: self.width = 0 self.height = 0 + def _small_text_from_node(self) -> str: + """Return the components of the texture (i.e. which map types are available).""" + + if not self.node: + return '' + + try: + node_files = self.node.properties.files + except AttributeError: + # Happens for nodes that don't have .properties.files. + return '' + if not node_files: + return '' + + map_types = {f.map_type for f in node_files if f.map_type} + map_types.discard('color') # all textures have colour + if not map_types: + return '' + return ', '.join(sorted(map_types)) + def sort_key(self): """Key for sorting lists of MenuItems.""" return self._order, self.label_text @@ -159,6 +181,11 @@ class MenuItem: if label_text is not None: self.label_text = label_text + if thumb_path == 'ERROR': + self.small_text = 'This open is broken' + else: + self.small_text = self._small_text_from_node() + @property def is_folder(self) -> bool: return self._is_folder @@ -185,15 +212,17 @@ class MenuItem: bgl.glRectf(self.x, self.y, self.x + self.width, self.y + self.height) texture = self.icon - err = texture.gl_load(filter=bgl.GL_NEAREST, mag=bgl.GL_NEAREST) - assert not err, 'OpenGL error: %i' % err + if texture: + err = texture.gl_load(filter=bgl.GL_NEAREST, mag=bgl.GL_NEAREST) + assert not err, 'OpenGL error: %i' % err bgl.glColor4f(0.0, 0.0, 1.0, 0.5) # bgl.glLineWidth(1.5) # ------ TEXTURE ---------# - bgl.glBindTexture(bgl.GL_TEXTURE_2D, texture.bindcode[0]) - bgl.glEnable(bgl.GL_TEXTURE_2D) + if texture: + bgl.glBindTexture(bgl.GL_TEXTURE_2D, texture.bindcode[0]) + bgl.glEnable(bgl.GL_TEXTURE_2D) bgl.glBlendFunc(bgl.GL_SRC_ALPHA, bgl.GL_ONE_MINUS_SRC_ALPHA) bgl.glColor4f(1, 1, 1, 1) @@ -210,7 +239,8 @@ class MenuItem: bgl.glDisable(bgl.GL_TEXTURE_2D) bgl.glDisable(bgl.GL_BLEND) - texture.gl_free() + if texture: + texture.gl_free() # draw some text font_id = 0 @@ -221,24 +251,11 @@ class MenuItem: blf.size(font_id, self.text_size, text_dpi) blf.draw(font_id, self.label_text) - # Draw the components of the texture (i.e. which map types are available) - try: - node_files = self.node.properties.files - except AttributeError: - # Happens for nodes that don't have .properties.files. - node_files = None - if not node_files: - return - - map_types = {f.map_type for f in node_files if f.map_type} - map_types.discard('color') # all textures have colour - if not map_types: - return - + # draw the small text bgl.glColor4f(1.0, 1.0, 1.0, 0.5) blf.size(font_id, self.text_size_small, text_dpi) blf.position(font_id, text_x, self.y + 0.5 * self.text_size_small, 0) - blf.draw(font_id, ', '.join(sorted(map_types))) + blf.draw(font_id, self.small_text) def hits(self, mouse_x: int, mouse_y: int) -> bool: return self.x < mouse_x < self.x + self.width and self.y < mouse_y < self.y + self.height