toaruos/util/python-demos/icon_cache.py

55 lines
1.6 KiB
Python

"""
Library for caching Cairo surfaces for icons by name and size.
"""
import os
import cairo
import yutani
icon_directories = {
16: [
"/usr/share/icons/16",
"/usr/share/icons/external/16",
"/usr/share/icons/24",
"/usr/share/icons/external/24",
"/usr/share/icons/48",
"/usr/share/icons/external/48",
"/usr/share/icons",
"/usr/share/icons/external",
],
24: [
"/usr/share/icons/24",
"/usr/share/icons/external/24",
"/usr/share/icons/48",
"/usr/share/icons/external/48",
"/usr/share/icons",
"/usr/share/icons/external",
],
48: [
"/usr/share/icons/48",
"/usr/share/icons/external/48",
"/usr/share/icons",
"/usr/share/icons/external",
"/usr/share/icons/24",
"/usr/share/icons/external/24",
],
}
icon_cache = {24:{},48:{},16:{}}
def get_icon(name,size=24,fallback='applications-generic'):
"""Find an icon in the icon cache or fetch it if possible."""
if not name:
return get_icon(fallback,size)
if not name in icon_cache[size]:
for directory in icon_directories[size]:
path = f"{directory}/{name}.bmp"
if os.access(path,os.R_OK):
#icon = cairo.ImageSurface.create_from_png(f"{directory}/{name}.png")
icon = yutani.Sprite.from_file(f"{directory}/{name}.bmp").get_cairo_surface()
icon_cache[size][name] = icon
return icon
return get_icon(fallback,size)
else:
return icon_cache[size][name]