118 lines
3.7 KiB
Python
118 lines
3.7 KiB
Python
|
|
import darkdetect
|
|
from omegaconf import OmegaConf
|
|
from PyQt6 import QtGui
|
|
import re
|
|
from src import settings
|
|
|
|
|
|
config = settings.icons
|
|
|
|
path = config.path
|
|
|
|
|
|
class Icon:
|
|
def __init__(self, icon_type, widget=None, recolor=True, color=None):
|
|
"""Set an icon to a widget or window. Recolors the icon if needed
|
|
|
|
Args:
|
|
icon_type (str): Name of the icon in the config file
|
|
widget (Any, optional): Object the icon will be added to. Defaults to None.
|
|
recolor (bool, optional): If Icon should be recolored. Defaults to True.
|
|
color (str, optional): Color type to use. Configured in config file. Defaults to None.
|
|
"""
|
|
assert (
|
|
icon_type in settings.icons.icons.keys()
|
|
), f"Icon {icon_type} not in config file"
|
|
assert (
|
|
color in settings.icons.colors.keys() or color is None
|
|
), f"Color {color} not in config file"
|
|
icon = settings.icons.get(icon_type)
|
|
dark = darkdetect.isDark()
|
|
if dark:
|
|
self.color = config.colors.dark
|
|
else:
|
|
self.color = config.colors.light
|
|
if color:
|
|
self.color = config.colors[color]
|
|
self.icon = QtGui.QIcon()
|
|
self.icon_path = path + icon
|
|
recolor = (
|
|
False
|
|
if icon_type.endswith(".ico") or icon_type.endswith(".png")
|
|
else recolor
|
|
)
|
|
self.add_icon(self.icon_path, recolor)
|
|
if widget is not None:
|
|
try:
|
|
widget.setIcon(self.icon)
|
|
except AttributeError:
|
|
widget.setWindowIcon(self.icon)
|
|
|
|
def add_icon(self, icon_path,recolor=False):
|
|
icon = self.changeColor(icon_path,recolor)
|
|
|
|
# use icon bytes to create a pixmap
|
|
pixmap = QtGui.QPixmap()
|
|
pixmap.loadFromData(icon)
|
|
|
|
self.icon.addPixmap(
|
|
pixmap,
|
|
QtGui.QIcon.Mode.Normal,
|
|
QtGui.QIcon.State.Off,
|
|
)
|
|
|
|
def overwriteColor(self):
|
|
# take the icon, read it as bytes and change the color in fill
|
|
icon = self.changeColor(self.icon_path)
|
|
cicon = str(icon)
|
|
fill = re.search(r"fill=\"(.*?)\"", cicon).group(1)
|
|
stroke = re.search(r"stroke=\"(.*?)\"", cicon)
|
|
if stroke:
|
|
stroke = stroke.group(1)
|
|
|
|
if fill and stroke:
|
|
# replace stroke
|
|
newicon = icon.replace(stroke.encode(), config.color.encode())
|
|
else:
|
|
newicon = icon.replace(fill.encode(), config.color.encode())
|
|
|
|
pixmap = QtGui.QPixmap()
|
|
pixmap.loadFromData(newicon)
|
|
|
|
self.icon.addPixmap(
|
|
pixmap,
|
|
QtGui.QIcon.Mode.Normal,
|
|
QtGui.QIcon.State.Off,
|
|
)
|
|
return self.icon
|
|
|
|
|
|
def changeColor(self,icon_path,recolor) -> bytes:
|
|
"""change the color of the svg icon to the color set in the config file
|
|
|
|
Args:
|
|
icon_path (str): the path to the icon, usually icons/[name].svg
|
|
|
|
Returns:
|
|
icon: a byte representation of the icon with the new color
|
|
"""
|
|
color = self.color
|
|
with open(icon_path, "rb") as file:
|
|
icon = file.read()
|
|
if recolor:
|
|
cicon = str(icon)
|
|
|
|
try:
|
|
fill = re.search(r"fill=\"(.*?)\"", cicon).group(1)
|
|
except AttributeError:
|
|
fill = None
|
|
if fill:
|
|
icon = icon.replace(fill.encode(), color.encode())
|
|
return icon
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("This is a module and can not be executed directly.")
|