diff options
Diffstat (limited to 'examples/icons.py')
-rw-r--r-- | examples/icons.py | 102 |
1 files changed, 86 insertions, 16 deletions
diff --git a/examples/icons.py b/examples/icons.py index a6f0ada..673ca6f 100644 --- a/examples/icons.py +++ b/examples/icons.py @@ -2,7 +2,7 @@ # coding: utf-8 # /*########################################################################## # -# Copyright (c) 2016-2017 European Synchrotron Radiation Facility +# Copyright (c) 2016-2018 European Synchrotron Radiation Facility # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,12 +24,52 @@ # # ###########################################################################*/ """ -Display available project icons using Qt. +Display icons available in silx. """ + import functools +import os.path from silx.gui import qt import silx.gui.icons +import silx.resources + + +class AnimatedToolButton(qt.QToolButton): + """ToolButton which support animated icons""" + + def __init__(self, parent=None): + super(AnimatedToolButton, self).__init__(parent) + self.__animatedIcon = None + + def setIcon(self, icon): + if isinstance(icon, silx.gui.icons.AbstractAnimatedIcon): + self._setAnimatedIcon(icon) + else: + self._setAnimatedIcon(None) + super(AnimatedToolButton, self).setIcon(icon) + + def _setAnimatedIcon(self, icon): + if self.__animatedIcon is not None: + self.__animatedIcon.unregister(self) + self.__animatedIcon.iconChanged.disconnect(self.__updateIcon) + self.__animatedIcon = icon + if self.__animatedIcon is not None: + self.__animatedIcon.register(self) + self.__animatedIcon.iconChanged.connect(self.__updateIcon) + i = self.__animatedIcon.currentIcon() + else: + i = qt.QIcon() + super(AnimatedToolButton, self).setIcon(i) + + def __updateIcon(self, icon): + super(AnimatedToolButton, self).setIcon(icon) + + def icon(self): + if self.__animatedIcon is not None: + return self.__animatedIcon + else: + return super(AnimatedToolButton, self).icon() class IconPreview(qt.QMainWindow): @@ -66,6 +106,28 @@ class IconPreview(qt.QMainWindow): button.setChecked(True) return panel + def getAllAvailableIcons(self): + def isAnIcon(name): + if silx.resources.is_dir("gui/icons/" + name): + return False + _, ext = os.path.splitext(name) + return ext in [".svg", ".png"] + icons = silx.resources.list_dir("gui/icons") + # filter out sub-directories + icons = filter(isAnIcon, icons) + # remove extension + icons = [i.split(".")[0] for i in icons] + # remove duplicated names + icons = set(icons) + # sort by names + return icons + + def getAllAvailableAnimatedIcons(self): + icons = silx.resources.list_dir("gui/icons") + icons = filter(lambda x: silx.resources.exists("gui/icons/%s/00.png" % x), icons) + icons = filter(lambda x: not silx.resources.is_dir("gui/icons/%s/00.png" % x), icons) + return icons + def createIconPanel(self, parent): panel = qt.QWidget(parent) layout = qt.QGridLayout() @@ -74,25 +136,33 @@ class IconPreview(qt.QMainWindow): self.tools = [] - import silx.resources - - icons = silx.resources.list_dir("gui/icons") - # filter out sub-directories - icons = filter(lambda x: not silx.resources.is_dir("gui/icons/" + x), icons) - # remove extension - icons = [i.split(".")[0] for i in icons] - # remove duplicated names - icons = set(icons) - # sort by names + # Sort together animated and non animated icons + fix_icons = self.getAllAvailableIcons() + animated_icons = self.getAllAvailableAnimatedIcons() + icons = [] + icons.extend([(i, "_") for i in fix_icons]) + icons.extend([(i, "anim") for i in animated_icons]) icons = sorted(icons) - for i, icon_name in enumerate(icons): + for i, icon_info in enumerate(icons): + icon_name, icon_kind = icon_info col, line = i / 10, i % 10 - icon = silx.gui.icons.getQIcon(icon_name) - tool = qt.QToolButton(panel) + if icon_kind == "anim": + tool = AnimatedToolButton(panel) + try: + icon = silx.gui.icons.getAnimatedIcon(icon_name) + except ValueError: + icon = qt.QIcon() + tool.setToolTip("Animated icon '%s'" % icon_name) + else: + tool = qt.QToolButton(panel) + try: + icon = silx.gui.icons.getQIcon(icon_name) + except ValueError: + icon = qt.QIcon() + tool.setToolTip("Icon '%s'" % icon_name) tool.setIcon(icon) tool.setIconSize(qt.QSize(32, 32)) - tool.setToolTip(icon_name) layout.addWidget(tool, col, line) self.tools.append(tool) |