Icon: handle image loading errors
If the icon can't be found, fall back on showing a generic icon. Useful when activity/content bundles specify a bad icon, which is unfortunately true for most content bundles in current existance (because the icon field was previously unused).
This commit is contained in:
parent
f46ac7ba6a
commit
670fc44b1a
@ -130,19 +130,19 @@ class _IconBuffer(object):
|
|||||||
|
|
||||||
return attach_x, attach_y
|
return attach_x, attach_y
|
||||||
|
|
||||||
def _get_icon_info(self):
|
def _get_icon_info(self, file_name, icon_name):
|
||||||
icon_info = _IconInfo()
|
icon_info = _IconInfo()
|
||||||
|
|
||||||
if self.file_name:
|
if file_name:
|
||||||
icon_info.file_name = self.file_name
|
icon_info.file_name = file_name
|
||||||
elif self.icon_name:
|
elif icon_name:
|
||||||
theme = Gtk.IconTheme.get_default()
|
theme = Gtk.IconTheme.get_default()
|
||||||
|
|
||||||
size = 50
|
size = 50
|
||||||
if self.width is not None:
|
if self.width is not None:
|
||||||
size = self.width
|
size = self.width
|
||||||
|
|
||||||
info = theme.lookup_icon(self.icon_name, int(size), 0)
|
info = theme.lookup_icon(icon_name, int(size), 0)
|
||||||
if info:
|
if info:
|
||||||
attach_x, attach_y = self._get_attach_points(info, size)
|
attach_x, attach_y = self._get_attach_points(info, size)
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ class _IconBuffer(object):
|
|||||||
del info
|
del info
|
||||||
else:
|
else:
|
||||||
logging.warning('No icon with the name %s was found in the '
|
logging.warning('No icon with the name %s was found in the '
|
||||||
'theme.', self.icon_name)
|
'theme.', icon_name)
|
||||||
|
|
||||||
return icon_info
|
return icon_info
|
||||||
|
|
||||||
@ -250,21 +250,40 @@ class _IconBuffer(object):
|
|||||||
if cache_key in self._surface_cache:
|
if cache_key in self._surface_cache:
|
||||||
return self._surface_cache[cache_key]
|
return self._surface_cache[cache_key]
|
||||||
|
|
||||||
icon_info = self._get_icon_info()
|
# We run two attempts at finding the icon. First, we try the icon
|
||||||
if icon_info.file_name is None:
|
# requested by the user. If that fails, we fall back on
|
||||||
|
# document-generic. If that doesn't work out, bail.
|
||||||
|
icon_width = None
|
||||||
|
for (file_name, icon_name) in ((self.file_name, self.icon_name),
|
||||||
|
(None, 'document-generic')):
|
||||||
|
icon_info = self._get_icon_info(file_name, icon_name)
|
||||||
|
if icon_info.file_name is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
is_svg = icon_info.file_name.endswith('.svg')
|
||||||
|
|
||||||
|
if is_svg:
|
||||||
|
try:
|
||||||
|
handle = self._load_svg(icon_info.file_name)
|
||||||
|
icon_width = handle.props.width
|
||||||
|
icon_height = handle.props.height
|
||||||
|
break
|
||||||
|
except IOError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
path = icon_info.file_name
|
||||||
|
pixbuf = GdkPixbuf.Pixbuf.new_from_file(path)
|
||||||
|
icon_width = pixbuf.get_width()
|
||||||
|
icon_height = pixbuf.get_height()
|
||||||
|
break
|
||||||
|
except GObject.GError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if icon_width is None:
|
||||||
|
# Neither attempt found an icon for us to use
|
||||||
return None
|
return None
|
||||||
|
|
||||||
is_svg = icon_info.file_name.endswith('.svg')
|
|
||||||
|
|
||||||
if is_svg:
|
|
||||||
handle = self._load_svg(icon_info.file_name)
|
|
||||||
icon_width = handle.props.width
|
|
||||||
icon_height = handle.props.height
|
|
||||||
else:
|
|
||||||
pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon_info.file_name)
|
|
||||||
icon_width = pixbuf.get_width()
|
|
||||||
icon_height = pixbuf.get_height()
|
|
||||||
|
|
||||||
badge_info = self._get_badge_info(icon_info, icon_width, icon_height)
|
badge_info = self._get_badge_info(icon_info, icon_width, icon_height)
|
||||||
|
|
||||||
padding = badge_info.icon_padding
|
padding = badge_info.icon_padding
|
||||||
|
Loading…
Reference in New Issue
Block a user