color_input.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from typing import Any, Optional
  2. from ..events import Handler, ValueChangeEventArguments
  3. from .button import Button as button
  4. from .color_picker import ColorPicker as color_picker
  5. from .mixins.disableable_element import DisableableElement
  6. from .mixins.value_element import ValueElement
  7. class ColorInput(ValueElement, DisableableElement):
  8. LOOPBACK = False
  9. def __init__(self,
  10. label: Optional[str] = None, *,
  11. placeholder: Optional[str] = None,
  12. value: str = '',
  13. on_change: Optional[Handler[ValueChangeEventArguments]] = None,
  14. preview: bool = False,
  15. ) -> None:
  16. """Color Input
  17. This element extends Quasar's `QInput <https://quasar.dev/vue-components/input>`_ component with a color picker.
  18. :param label: displayed label for the color input
  19. :param placeholder: text to show if no color is selected
  20. :param value: the current color value
  21. :param on_change: callback to execute when the value changes
  22. :param preview: change button background to selected color (default: False)
  23. """
  24. super().__init__(tag='q-input', value=value, on_value_change=on_change)
  25. if label is not None:
  26. self._props['label'] = label
  27. if placeholder is not None:
  28. self._props['placeholder'] = placeholder
  29. with self.add_slot('append'):
  30. self.picker = color_picker(on_pick=lambda e: self.set_value(e.color))
  31. self.button = button(on_click=self.open_picker, icon='colorize') \
  32. .props('flat round', remove='color').classes('cursor-pointer')
  33. self.preview = preview
  34. self._update_preview()
  35. def open_picker(self) -> None:
  36. """Open the color picker"""
  37. if self.value:
  38. self.picker.set_color(self.value)
  39. self.picker.open()
  40. def _handle_value_change(self, value: Any) -> None:
  41. super()._handle_value_change(value)
  42. self._update_preview()
  43. def _update_preview(self) -> None:
  44. if not self.preview:
  45. return
  46. self.button.style(f'''
  47. background-color: {(self.value or "#fff").split(";", 1)[0]};
  48. text-shadow: 2px 0 #fff, -2px 0 #fff, 0 2px #fff, 0 -2px #fff, 1px 1px #fff, -1px -1px #fff, 1px -1px #fff, -1px 1px #fff;
  49. ''')