move files into a package structure
This commit is contained in:
101
raven/ui/colorbutton.py
Normal file
101
raven/ui/colorbutton.py
Normal file
@@ -0,0 +1,101 @@
|
||||
import re
|
||||
|
||||
from PySide6.QtGui import QColor, QPixmap, QIcon
|
||||
from PySide6.QtWidgets import QWidget, QHBoxLayout, QPushButton, QColorDialog, QSizePolicy, QComboBox
|
||||
from raven.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
|
||||
Reference in New Issue
Block a user