reimplement markers

This commit is contained in:
louisnw
2024-05-25 14:19:44 +01:00
parent a52cd8f4a7
commit f5488fbf22

View File

@ -1,4 +1,5 @@
import asyncio import asyncio
import json
import os import os
from base64 import b64decode from base64 import b64decode
from datetime import datetime from datetime import datetime
@ -147,6 +148,7 @@ class SeriesCommon(Pane):
self.num_decimals = 2 self.num_decimals = 2
self.offset = 0 self.offset = 0
self.data = pd.DataFrame() self.data = pd.DataFrame()
self.markers = {}
def _set_interval(self, df: pd.DataFrame): def _set_interval(self, df: pd.DataFrame):
if not pd.api.types.is_datetime64_any_dtype(df['time']): if not pd.api.types.is_datetime64_any_dtype(df['time']):
@ -245,6 +247,9 @@ class SeriesCommon(Pane):
self._last_bar = series self._last_bar = series
self.run_script(f'{self.id}.series.update({js_data(series)})') self.run_script(f'{self.id}.series.update({js_data(series)})')
def _update_markers(self):
self.run_script(f'{self.id}.series.setMarkers({json.dumps(list(self.markers.values()))})')
def marker_list(self, markers: list): def marker_list(self, markers: list):
""" """
Creates multiple markers.\n Creates multiple markers.\n
@ -258,16 +263,17 @@ class SeriesCommon(Pane):
""" """
markers = markers.copy() markers = markers.copy()
marker_ids = [] marker_ids = []
for i, marker in enumerate(markers): for marker in markers:
markers[i]['time'] = self._single_datetime_format(markers[i]['time']) marker_id = self.win._id_gen.generate()
markers[i]['position'] = marker_position(markers[i]['position']) self.markers[marker_id] = {
markers[i]['shape'] = marker_shape(markers[i]['shape']) "time": self._single_datetime_format(marker['time']),
markers[i]['id'] = self.win._id_gen.generate() "position": marker_position(marker['position']),
marker_ids.append(markers[i]['id']) "color": marker['color'],
self.run_script(f""" "shape": marker_shape(marker['shape']),
{self.id}.markers.push(...{markers}) "text": marker['text'],
{self.id}.series.setMarkers({self.id}.markers) }
""") marker_ids.append(marker_id)
self._update_markers()
return marker_ids return marker_ids
def marker(self, time: Optional[datetime] = None, position: MARKER_POSITION = 'below', def marker(self, time: Optional[datetime] = None, position: MARKER_POSITION = 'below',
@ -287,29 +293,23 @@ class SeriesCommon(Pane):
except TypeError: except TypeError:
raise TypeError('Chart marker created before data was set.') raise TypeError('Chart marker created before data was set.')
marker_id = self.win._id_gen.generate() marker_id = self.win._id_gen.generate()
self.run_script(f"""
{self.id}.markers.push({{ self.markers[marker_id] = {
time: {time if isinstance(formatted_time, float) else f"'{formatted_time}'"}, "time": formatted_time,
position: '{marker_position(position)}', "position": marker_position(position),
color: '{color}', "color": color,
shape: '{marker_shape(shape)}', "shape": marker_shape(shape),
text: '{text}', "text": text,
id: '{marker_id}' }
}}); self._update_markers()
{self.id}.series.setMarkers({self.id}.markers)""")
return marker_id return marker_id
def remove_marker(self, marker_id: str): def remove_marker(self, marker_id: str):
""" """
Removes the marker with the given id.\n Removes the marker with the given id.\n
""" """
self.run_script(f''' self.markers.pop(marker_id)
{self.id}.markers.forEach(function (marker) {{ self._update_markers()
if ('{marker_id}' === marker.id) {{
{self.id}.markers.splice({self.id}.markers.indexOf(marker), 1)
{self.id}.series.setMarkers({self.id}.markers)
}}
}});''')
def horizontal_line(self, price: NUM, color: str = 'rgb(122, 146, 202)', width: int = 2, def horizontal_line(self, price: NUM, color: str = 'rgb(122, 146, 202)', width: int = 2,
style: LINE_STYLE = 'solid', text: str = '', axis_label_visible: bool = True, style: LINE_STYLE = 'solid', text: str = '', axis_label_visible: bool = True,
@ -333,7 +333,7 @@ class SeriesCommon(Pane):
""" """
Clears the markers displayed on the data.\n Clears the markers displayed on the data.\n
""" """
self.run_script(f'''{self.id}.markers = []; {self.id}.series.setMarkers([])''') self.markers.clear()
# def clear_horizontal_lines(self): # def clear_horizontal_lines(self):
# """ # """
@ -464,8 +464,6 @@ class Histogram(SeriesCommon):
priceScaleId: '{self.id}', priceScaleId: '{self.id}',
priceFormat: {{type: "volume"}}, priceFormat: {{type: "volume"}},
}}), }}),
markers: [],
horizontal_lines: [],
name: '{name}', name: '{name}',
color: '{color}', color: '{color}',
precision: 2, precision: 2,