New Feature: Multi-Pane Charts
- Added the create_subchart method to Chart. - Added the SubChart class. - Added an inner_width and inner_height parameter to Chart. - The time_scale method can now disable the time scale completely. Bugs: - Fixed a bug which prevented markers from being placed on charts with a timescale less than a day.
This commit is contained in:
@ -1,3 +1,5 @@
|
||||
from typing import Literal
|
||||
from uuid import UUID
|
||||
import webview
|
||||
from multiprocessing import Queue
|
||||
|
||||
@ -9,10 +11,10 @@ _result_q = Queue()
|
||||
|
||||
class Webview(LWC):
|
||||
def __init__(self, chart):
|
||||
super().__init__(chart.volume_enabled)
|
||||
super().__init__(chart.volume_enabled, chart.inner_width, chart.inner_height)
|
||||
self.chart = chart
|
||||
self.started = False
|
||||
self._click_func_code('pywebview.api.onClick(data)')
|
||||
self._js_api_code = 'pywebview.api.onClick'
|
||||
|
||||
self.webview = webview.create_window('', html=self._html, on_top=chart.on_top, js_api=self._js_api,
|
||||
width=chart.width, height=chart.height, x=chart.x, y=chart.y)
|
||||
@ -24,8 +26,15 @@ class Webview(LWC):
|
||||
self.loaded = True
|
||||
while len(self.js_queue) > 0:
|
||||
func, args, kwargs = self.js_queue[0]
|
||||
getattr(self, func)(*args)
|
||||
|
||||
if 'SUB' in func:
|
||||
c_id = args[0]
|
||||
args = args[1:]
|
||||
getattr(self._subcharts[c_id], func.replace('SUB', ''))(*args)
|
||||
else:
|
||||
getattr(self, func)(*args)
|
||||
del self.js_queue[0]
|
||||
|
||||
_loop(self.chart, controller=self)
|
||||
|
||||
def show(self):
|
||||
@ -34,27 +43,40 @@ class Webview(LWC):
|
||||
else:
|
||||
webview.start(debug=self.chart.debug)
|
||||
|
||||
def create_line(self, color: str = 'rgba(214, 237, 255, 0.6)', width: int = 2):
|
||||
return super().create_line(color, width).id
|
||||
|
||||
def hide(self): self.webview.hide()
|
||||
|
||||
def exit(self):
|
||||
self.webview.destroy()
|
||||
del self
|
||||
|
||||
def create_line(self, color: str = 'rgba(214, 237, 255, 0.6)', width: int = 2):
|
||||
return super().create_line(color, width).id
|
||||
|
||||
def create_sub_chart(self, volume_enabled: bool = True, position: Literal['left', 'right', 'top', 'bottom'] = 'left',
|
||||
width: float = 0.5, height: float = 0.5, sync: bool | UUID = False):
|
||||
return super()._pywebview_sub_chart(volume_enabled, position, width, height, sync)
|
||||
|
||||
|
||||
def _loop(chart, controller=None):
|
||||
wv = Webview(chart) if not controller else controller
|
||||
chart._result_q.put(wv.id)
|
||||
while 1:
|
||||
obj = wv
|
||||
func, args = chart._q.get()
|
||||
|
||||
if 'SUB' in func:
|
||||
obj = obj._subcharts[args[0]]
|
||||
args = args[1:]
|
||||
func = func.replace('SUB', '')
|
||||
|
||||
try:
|
||||
result = getattr(wv, func)(*args)
|
||||
result = getattr(obj, func)(*args)
|
||||
except KeyError as e:
|
||||
return
|
||||
if func == 'show':
|
||||
chart._exit.set()
|
||||
elif func == 'exit':
|
||||
chart._exit.set()
|
||||
|
||||
chart._result_q.put(result) if result is not None else None
|
||||
|
||||
|
||||
Reference in New Issue
Block a user