|
@@ -1,9 +1,8 @@
|
|
|
from typing import Callable, Dict, List, Optional
|
|
|
|
|
|
from ..element import Element
|
|
|
-from ..events import (ChartEventArguments, ChartPointEventArguments, ChartSeriesEventArguments, GenericEventArguments,
|
|
|
- handle_event)
|
|
|
-from ..helpers import KWONLY_SLOTS
|
|
|
+from ..events import (ChartPointClickEventArguments, ChartPointDragEventArguments, ChartPointDragStartEventArguments,
|
|
|
+ ChartPointDropEventArguments, GenericEventArguments, handle_event)
|
|
|
|
|
|
|
|
|
class Chart(Element,
|
|
@@ -13,8 +12,11 @@ class Chart(Element,
|
|
|
|
|
|
def __init__(self, options: Dict, *,
|
|
|
type: str = 'chart', extras: List[str] = [],
|
|
|
- on_event: Optional[Callable] = None,
|
|
|
- on_drag_drop: Optional[Callable] = None) -> None:
|
|
|
+ on_point_click: Optional[Callable] = None,
|
|
|
+ on_point_drag_start: Optional[Callable] = None,
|
|
|
+ on_point_drag: Optional[Callable] = None,
|
|
|
+ on_point_drop: Optional[Callable] = None,
|
|
|
+ ) -> None:
|
|
|
"""Chart
|
|
|
|
|
|
An element to create a chart using `Highcharts <https://www.highcharts.com/>`_.
|
|
@@ -27,75 +29,64 @@ class Chart(Element,
|
|
|
:param options: dictionary of Highcharts options
|
|
|
:param type: chart type (e.g. "chart", "stockChart", "mapChart", ...; default: "chart")
|
|
|
:param extras: list of extra dependencies to include (e.g. "annotations", "arc-diagram", "solid-gauge", ...)
|
|
|
- :param on_change: callback to execute when value changes
|
|
|
+ :param on_point_click: callback function that is called when a point is clicked
|
|
|
+ :param on_point_drag_start: callback function that is called when a point drag starts
|
|
|
+ :param on_point_drag: callback function that is called when a point is dragged
|
|
|
+ :param on_point_drop: callback function that is called when a point is dropped
|
|
|
"""
|
|
|
super().__init__()
|
|
|
self._props['type'] = type
|
|
|
self._props['options'] = options
|
|
|
self._props['extras'] = extras
|
|
|
self.libraries.extend(library for library in self.extra_libraries if library.path.stem in extras)
|
|
|
- if on_event is not None:
|
|
|
- self._props['on_event_set'] = True
|
|
|
- if on_drag_drop is not None:
|
|
|
- self._props['on_drag_drop_set'] = True
|
|
|
- self._on_event = on_event
|
|
|
- self._on_drag_drop = on_drag_drop
|
|
|
- self.on('on_event', self.handle_event)
|
|
|
- self.on('on_point_drag_drop', self.handle_drag_drop)
|
|
|
|
|
|
- def handle_event(self, e: ChartEventArguments) -> None:
|
|
|
- event_type = e.args.get('event_type', None)
|
|
|
- if event_type == 'point_click':
|
|
|
- arguments = ChartPointEventArguments(
|
|
|
- sender=self,
|
|
|
- client=self.client,
|
|
|
- event_type=event_type,
|
|
|
- point_index=e.args.get('point_index', None),
|
|
|
- point_x=e.args.get('point_x', None),
|
|
|
- point_y=e.args.get('point_y', None),
|
|
|
- series_index=e.args.get('series_index', None),
|
|
|
- )
|
|
|
- else:
|
|
|
- arguments = ChartEventArguments(
|
|
|
- sender=self,
|
|
|
- client=self.client,
|
|
|
- event_type=event_type,
|
|
|
- )
|
|
|
+ if on_point_click:
|
|
|
+ def handle_point_click(e: GenericEventArguments) -> None:
|
|
|
+ handle_event(on_point_click, ChartPointClickEventArguments(
|
|
|
+ sender=self,
|
|
|
+ client=self.client,
|
|
|
+ event_type='point_click',
|
|
|
+ point_index=e.args['point_index'],
|
|
|
+ point_x=e.args['point_x'],
|
|
|
+ point_y=e.args['point_y'],
|
|
|
+ series_index=e.args['series_index'],
|
|
|
+ ))
|
|
|
+ self.on('pointClick', handle_point_click, ['point_index', 'point_x', 'point_y', 'series_index'])
|
|
|
|
|
|
- handle_event(self._on_event, arguments)
|
|
|
+ if on_point_drag_start:
|
|
|
+ def handle_point_dragStart(_: GenericEventArguments) -> None:
|
|
|
+ handle_event(on_point_drag_start, ChartPointDragStartEventArguments(
|
|
|
+ sender=self,
|
|
|
+ client=self.client,
|
|
|
+ event_type='point_drag_start',
|
|
|
+ ))
|
|
|
+ self.on('pointDragStart', handle_point_dragStart, [])
|
|
|
|
|
|
- def handle_drag_drop(self, e: ChartEventArguments) -> None:
|
|
|
- event_type = e.args.get('event_type', None)
|
|
|
- if event_type == 'point_drag_start':
|
|
|
- arguments = ChartEventArguments(
|
|
|
- sender=self,
|
|
|
- client=self.client,
|
|
|
- event_type=event_type,
|
|
|
- )
|
|
|
- elif event_type == 'point_drag':
|
|
|
- arguments = ChartPointEventArguments(
|
|
|
- sender=self,
|
|
|
- client=self.client,
|
|
|
- event_type=event_type,
|
|
|
- point_index=e.args.get('point_index', None),
|
|
|
- point_x=e.args.get('point_x', None),
|
|
|
- point_y=e.args.get('point_y', None),
|
|
|
- series_index=e.args.get('series_index', None),
|
|
|
- )
|
|
|
- elif event_type == 'point_drop':
|
|
|
- arguments = ChartSeriesEventArguments(
|
|
|
- sender=self,
|
|
|
- client=self.client,
|
|
|
- event_type=event_type,
|
|
|
- point_index=e.args.get('point_index', None),
|
|
|
- point_x=e.args.get('point_x', None),
|
|
|
- point_y=e.args.get('point_y', None),
|
|
|
- series_index=e.args.get('series_index', None),
|
|
|
- series_name=e.args.get('series_name', None),
|
|
|
- series_x=e.args.get('series_x', None),
|
|
|
- series_y=e.args.get('series_y', None),
|
|
|
- )
|
|
|
- handle_event(self._on_drag_drop, arguments)
|
|
|
+ if on_point_drag:
|
|
|
+ def handle_point_drag(e: GenericEventArguments) -> None:
|
|
|
+ handle_event(on_point_drag, ChartPointDragEventArguments(
|
|
|
+ sender=self,
|
|
|
+ client=self.client,
|
|
|
+ event_type='point_drag',
|
|
|
+ point_index=e.args['point_index'],
|
|
|
+ point_x=e.args['point_x'],
|
|
|
+ point_y=e.args['point_y'],
|
|
|
+ series_index=e.args['series_index'],
|
|
|
+ ))
|
|
|
+ self.on('pointDrag', handle_point_drag, ['point_index', 'point_x', 'point_y', 'series_index'])
|
|
|
+
|
|
|
+ if on_point_drop:
|
|
|
+ def handle_point_drop(e: GenericEventArguments) -> None:
|
|
|
+ handle_event(on_point_drop, ChartPointDropEventArguments(
|
|
|
+ sender=self,
|
|
|
+ client=self.client,
|
|
|
+ event_type='point_drop',
|
|
|
+ point_index=e.args['point_index'],
|
|
|
+ point_x=e.args['point_x'],
|
|
|
+ point_y=e.args['point_y'],
|
|
|
+ series_index=e.args['series_index'],
|
|
|
+ ))
|
|
|
+ self.on('pointDrop', handle_point_drop, ['point_index', 'point_x', 'point_y', 'series_index'])
|
|
|
|
|
|
@property
|
|
|
def options(self) -> Dict:
|