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
import weakref
from contextlib import ExitStack
from contextlib import contextmanager
from typing import Generator
from typing import List

from silx.gui import qt

from .. 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: with _getIconQFile(name) as qfile: icon = qt.QIcon(qfile.fileName()) cached_icons[name] = icon else: icon = cached_icons[name] return icon
@contextmanager def _getIconQFile(name: str) -> Generator[qt.QFile, None, None]: """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 """ with ExitStack() as stack: for format_ in _get_supported_formats(): ctx = resources.resource_path("icons", f"{name}.{format_}") path = stack.enter_context(ctx) if not path.exists(): continue yield qt.QFile(str(path)) return raise ValueError("Not an icon name: %s" % name)