carousel.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from __future__ import annotations
  2. from typing import Any, Callable, Optional, Union, cast
  3. from .. import context
  4. from .mixins.disableable_element import DisableableElement
  5. from .mixins.value_element import ValueElement
  6. class Carousel(ValueElement):
  7. def __init__(self, *,
  8. value: Union[str, CarouselSlide, None] = None,
  9. on_value_change: Optional[Callable[..., Any]] = None,
  10. animated: bool = False,
  11. arrows: bool = False,
  12. navigation: bool = False,
  13. ) -> None:
  14. """Carousel
  15. This element represents `Quasar's QCarousel <https://quasar.dev/vue-components/carousel#qcarousel-api>`_ component.
  16. It contains individual carousel slides.
  17. :param value: `ui.carousel_slide` or name of the slide to be initially selected (default: `None` meaning the first slide)
  18. :param on_value_change: callback to be executed when the selected slide changes
  19. :param animated: whether to animate slide transitions (default: `False`)
  20. :param arrows: whether to show arrows for manual slide navigation (default: `False`)
  21. :param navigation: whether to show navigation dots for manual slide navigation (default: `False`)
  22. """
  23. super().__init__(tag='q-carousel', value=value, on_value_change=on_value_change)
  24. self._props['animated'] = animated
  25. self._props['arrows'] = arrows
  26. self._props['navigation'] = navigation
  27. def _value_to_model_value(self, value: Any) -> Any:
  28. return value._props['name'] if isinstance(value, CarouselSlide) else value # pylint: disable=protected-access
  29. def _handle_value_change(self, value: Any) -> None:
  30. super()._handle_value_change(value)
  31. names = [slide._props['name'] for slide in self] # pylint: disable=protected-access
  32. for i, slide in enumerate(self):
  33. done = i < names.index(value) if value in names else False
  34. slide.props(f':done={done}')
  35. def next(self) -> None:
  36. """Show the next slide."""
  37. self.run_method('next')
  38. def previous(self) -> None:
  39. """Show the previous slide."""
  40. self.run_method('previous')
  41. class CarouselSlide(DisableableElement):
  42. def __init__(self, name: Optional[str] = None) -> None:
  43. """Carousel Slide
  44. This element represents `Quasar's QCarouselSlide <https://quasar.dev/vue-components/carousel#qcarouselslide-api>`_ component.
  45. It is a child of a `ui.carousel` element.
  46. :param name: name of the slide (will be the value of the `ui.carousel` element, auto-generated if `None`)
  47. """
  48. super().__init__(tag='q-carousel-slide')
  49. self.carousel = cast(ValueElement, context.get_slot().parent)
  50. name = name or f'slide_{len(self.carousel.default_slot.children)}'
  51. self._props['name'] = name
  52. self._classes = ['nicegui-carousel-slide']
  53. if self.carousel.value is None:
  54. self.carousel.value = name