Files
krowlog/src/ui/colorbutton.py
Andreas Huber a640b35c87 rename ravenlog to krowlog
There is a database named RavenDB.
KrowLog starts with a K, which is a) distinctive and b) has an association to KDE.
2022-02-12 10:48:38 +01:00

102 lines
3.8 KiB
Python

import re
from PySide6.QtGui import QColor, QPixmap, QIcon
from PySide6.QtWidgets import QWidget, QHBoxLayout, QPushButton, QColorDialog, QSizePolicy, QComboBox
from src.i18n import _
class ColorButton(QWidget):
def __init__(self, color: str, parent=None):
super(ColorButton, self).__init__(parent)
self.setSizePolicy(QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed))
self.layout = QHBoxLayout(self)
self.color = color
colors = {
# red
_('Strawberry Cream'): 'ff8080',
_('Pale Crimson'): 'e61919',
# orange
_('Broken Buttercup'): 'ffd080',
_('Passion Fruit Sugar'): 'ffa200',
# yellow
_('Sunrise Yellow'): 'fff080',
_('Magical Mustard'): 'ccb400',
# green
_('Trendy Green'): 'aaff80',
_('Garden Of Sweden'): '44cc00',
# blue
_('Light Sky Blue'): '80c6ff',
_('True Blue'): '0073d1',
# purple
_('Fairy Topia'): 'ff80f4',
_('Magenta Bachiego'): 'cc00bb',
# grey
_('Breeze of Mist'): 'eaeaea',
_('Light Grey'): 'cccccc',
_('Grey'): '999999',
}
self.color_drop_down = QComboBox()
self.layout.addWidget(self.color_drop_down)
self.color_drop_down.currentIndexChanged.connect(self._color_selected)
self.color_drop_down.addItem(QIcon(self._color_pixmap("ffffffff")), _("transparent"), "None")
for color_name in colors.keys():
color_value = colors[color_name]
self.color_drop_down.addItem(QIcon(self._color_pixmap(color_value)), color_name, color_value)
if color == color_name or color == color_value:
self.color_drop_down.setCurrentIndex(self.color_drop_down.count() - 1)
self.btn_color_picker = QPushButton(QIcon.fromTheme("color-picker"), _("custom"))
self.layout.addWidget(self.btn_color_picker)
self.btn_color_picker.pressed.connect(self._update_color)
self.btn_color_picker.setSizePolicy(QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed))
def _color_selected(self, index: int):
self.color = self.color_drop_down.currentData()
def set_color(self, color: str):
self.color = color
for index in range(0, self.color_drop_down.count()):
item_value = self.color_drop_down.itemData(index)
if item_value == color:
self.color_drop_down.setCurrentIndex(index)
return
# color not yet present -> add it
self.color_drop_down.addItem(QIcon(self._color_pixmap(color)), color, color)
self.color_drop_down.setCurrentIndex(self.color_drop_down.count() - 1)
def _update_color(self):
new_color = QColorDialog.getColor(self._to_qcolor(self.color))
if new_color.isValid():
color = self._to_hex(new_color)
self.set_color(color)
@staticmethod
def _is_hex_color(color: str):
return re.match("[0-9a-f]{6}", color, flags=re.IGNORECASE)
def _color_pixmap(self, color: str) -> QPixmap:
pixmap = QPixmap(40, 40)
qcolor = self._to_qcolor(color)
pixmap.fill((qcolor))
return pixmap
def _to_qcolor(self, color: str):
if self._is_hex_color(color):
red = int(color[0:2], 16)
green = int(color[2:4], 16)
blue = int(color[4:6], 16)
return QColor(red, green, blue)
elif color in QColor().colorNames():
return QColor(color)
return QColor(255, 255, 255)
def _to_hex(self, color: QColor) -> str:
red = "{0:0{1}x}".format(color.red(), 2)
green = "{0:0{1}x}".format(color.green(), 2)
blue = "{0:0{1}x}".format(color.blue(), 2)
return red + green + blue