"""Office-style ribbon icons: flat, two-tone, drawn from SVG at whatever size QML asks for. image://icon/[/] — the colour overrides the dark-gray ink (for white-on-green chrome). """ from PySide6.QtCore import QByteArray, QRectF, Qt from PySide6.QtGui import QImage, QPainter from PySide6.QtQuick import QQuickImageProvider from PySide6.QtSvg import QSvgRenderer INK = "#444444" GREEN = "#217346" BLUE = "#2B7CD3" RED = "#D13438" ORANGE = "#E8912D" LIGHT = "#FFFFFF" # Each icon is SVG body markup on a 32×32 grid; {ink} is the main colour. ICONS = { "play": f'', "pause": '', "stop": '', "previous": '', "next": '', "shuffle": '' '', "repeat": '' '', "repeat_one": '' f'', "volume": '', "mute": f'', "vocals": '', "vocals_off": f'', "mixer": f'', "queue_add": f'', "play_next": f'', "playlist_new": f'', "playlist_add": f'', "delete_rows": f'', "refresh": f'', "plex": f'', "database": f'', "server": f'', "sort_az": f'AZ', "sort_za": f'ZA', "filter": '', "sigma": '', "search": '', "lightbulb": '', "grid": f'', "freeze": f'', "headings": 'A B12', "pane": f'', "zoom": '', "chart": f'', "styles": '', "info": f'', "account": '', "options": '', "back": '', "close": '', "minimize": '', "maximize": '', "restore": '', "save": '', "undo": '', "redo": '', "excel": f'', "dropdown": '', "sort_up": '', "sort_down": '', "left": '', "right": '', "plus": '', "normal_view": '', "page_view": '', "break_view": '', "function": 'fx', "check": f'', "cancel": f'', } class IconProvider(QQuickImageProvider): def __init__(self): super().__init__(QQuickImageProvider.ImageType.Image) def requestImage(self, id_, size, requested): name, _, ink = id_.partition("/") w = requested.width() if requested.width() > 0 else 32 h = requested.height() if requested.height() > 0 else w body = ICONS.get(name, ICONS["grid"]).replace("{ink}", "#" + ink if ink else INK) svg = f'{body}' img = QImage(w, h, QImage.Format.Format_ARGB32_Premultiplied) img.fill(Qt.GlobalColor.transparent) p = QPainter(img) p.setRenderHint(QPainter.RenderHint.Antialiasing) QSvgRenderer(QByteArray(svg.encode())).render(p, QRectF(0, 0, w, h)) p.end() if size is not None: size.setWidth(w) size.setHeight(h) return img