Source code for est.gui.icons
"""Set of icons for buttons.
Use :func:`getQIcon` to create Qt QIcon from the name identifying an icon.
"""
import logging
from typing import List
import weakref
from silx.gui import qt
from est import resources
_logger = logging.getLogger(__name__)
_cached_icons = None
"""Cache loaded icons in a weak structure"""
[docs]
def getIconCache():
"""Get access to all cached icons
:rtype: dict
"""
global _cached_icons
if _cached_icons is None:
_cached_icons = weakref.WeakValueDictionary()
# Clean up the cache before leaving the application
# See https://github.com/silx-kit/silx/issues/1771
qt.QApplication.instance().aboutToQuit.connect(cleanIconCache)
return _cached_icons
[docs]
def cleanIconCache():
"""Clean up the icon cache"""
_cached_icons.clear()
_supported_formats = None
"""Order of file format extension to check"""
def _get_supported_formats() -> List[str]:
global _supported_formats
if _supported_formats is None:
_supported_formats = []
supported_formats = qt.supportedImageFormats()
order = ["mng", "gif", "svg", "png", "jpg"]
for format_ in order:
if format_ in supported_formats:
_supported_formats.append(format_)
if len(_supported_formats) == 0:
_logger.error("No format supported for icons")
else:
_logger.debug("Format %s supported", ", ".join(_supported_formats))
return _supported_formats
[docs]
def getQIcon(name: str) -> qt.QIcon:
"""Create a QIcon from its name.
:param str name: Name of the icon.
:return: Corresponding QIcon
:raises: ValueError when name is not known
"""
cached_icons = getIconCache()
if name not in cached_icons:
qfile = _getQFile(f"icons/{name}")
icon = qt.QIcon(qfile.fileName())
cached_icons[name] = icon
else:
icon = cached_icons[name]
return icon
def _getQFile(name: str) -> qt.QFile:
"""Create a QFile from an icon name. Filename is found
according to supported Qt formats.
:param str name: Name of the icon.
:return: Corresponding QFile
:rtype: qt.QFile
:raises: ValueError when name is not known
"""
for format_ in _get_supported_formats():
try:
filename = resources.resource_path("%s.%s" % (name, format_))
except FileNotFoundError:
continue
return qt.QFile(str(filename))
raise ValueError("Not an icon name: %s" % name)