From 198de1efacdafd71cdbc8f204ef270ada368cd08 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 14 Apr 2022 10:04:18 -0400 Subject: [PATCH] Port ui components to use flows, drop all late assignments of shm --- piker/ui/_axes.py | 5 +++-- piker/ui/_cursor.py | 13 +++++++------ piker/ui/_display.py | 33 ++++++++++++++++----------------- piker/ui/_editors.py | 2 +- piker/ui/_fsp.py | 38 ++++++++++---------------------------- 5 files changed, 37 insertions(+), 54 deletions(-) diff --git a/piker/ui/_axes.py b/piker/ui/_axes.py index 2363cc84..29af498e 100644 --- a/piker/ui/_axes.py +++ b/piker/ui/_axes.py @@ -223,8 +223,9 @@ class DynamicDateAxis(Axis): ) -> List[str]: chart = self.linkedsplits.chart - bars = chart._arrays[chart.name] - shm = self.linkedsplits.chart._shm + flow = chart._flows[chart.name] + shm = flow.shm + bars = shm.array first = shm._first.value bars_len = len(bars) diff --git a/piker/ui/_cursor.py b/piker/ui/_cursor.py index c902fcb8..84d35fb0 100644 --- a/piker/ui/_cursor.py +++ b/piker/ui/_cursor.py @@ -243,13 +243,13 @@ class ContentsLabels: def update_labels( self, index: int, - # array_name: str, ) -> None: - # for name, (label, update) in self._labels.items(): for chart, name, label, update in self._labels: - array = chart._arrays[name] + flow = chart._flows[name] + array = flow.shm.array + if not ( index >= 0 and index < array[-1]['index'] @@ -258,8 +258,6 @@ class ContentsLabels: print('WTF out of range?') continue - # array = chart._arrays[name] - # call provided update func with data point try: label.show() @@ -461,9 +459,12 @@ class Cursor(pg.GraphicsObject): ) -> LineDot: # if this plot contains curves add line dot "cursors" to denote # the current sample under the mouse + main_flow = plot._flows[plot.name] + # read out last index + i = main_flow.shm.array[-1]['index'] cursor = LineDot( curve, - index=plot._arrays[plot.name][-1]['index'], + index=i, plot=plot ) plot.addItem(cursor) diff --git a/piker/ui/_display.py b/piker/ui/_display.py index cf468852..81a36983 100644 --- a/piker/ui/_display.py +++ b/piker/ui/_display.py @@ -406,9 +406,8 @@ def graphics_update_cycle( ): # TODO: make it so this doesn't have to be called # once the $vlm is up? - vlm_chart.update_graphics_from_array( + vlm_chart.update_graphics_from_flow( 'volume', - array, # UGGGh, see ``maxmin()`` impl in `._fsp` for # the overlayed plotitems... we need a better @@ -434,6 +433,11 @@ def graphics_update_cycle( vars['last_mx_vlm'] = mx_vlm_in_view for curve_name, flow in vlm_chart._flows.items(): + + if not flow.render: + print(f'skipping flow {curve_name}?') + continue + update_fsp_chart( vlm_chart, flow, @@ -498,9 +502,8 @@ def graphics_update_cycle( or i_diff > 0 or trigger_all ): - chart.update_graphics_from_array( + chart.update_graphics_from_flow( chart.name, - array, ) # iterate in FIFO order per tick-frame @@ -513,8 +516,9 @@ def graphics_update_cycle( # tick frames to determine the y-range for chart # auto-scaling. # TODO: we need a streaming minmax algo here, see def above. - mx = max(price + tick_margin, mx) - mn = min(price - tick_margin, mn) + if liv: + mx = max(price + tick_margin, mx) + mn = min(price - tick_margin, mn) if typ in clear_types: @@ -537,9 +541,8 @@ def graphics_update_cycle( if wap_in_history: # update vwap overlay line - chart.update_graphics_from_array( + chart.update_graphics_from_flow( 'bar_wap', - array, ) # L1 book label-line updates @@ -555,7 +558,7 @@ def graphics_update_cycle( if ( label is not None - # and liv + and liv ): label.update_fields( {'level': price, 'size': size} @@ -569,7 +572,7 @@ def graphics_update_cycle( typ in _tick_groups['asks'] # TODO: instead we could check if the price is in the # y-view-range? - # and liv + and liv ): l1.ask_label.update_fields({'level': price, 'size': size}) @@ -577,7 +580,7 @@ def graphics_update_cycle( typ in _tick_groups['bids'] # TODO: instead we could check if the price is in the # y-view-range? - # and liv + and liv ): l1.bid_label.update_fields({'level': price, 'size': size}) @@ -684,9 +687,10 @@ async def display_symbol_data( # create main OHLC chart chart = linked.plot_ohlc_main( symbol, - bars, + ohlcv, sidepane=pp_pane, ) + chart.default_view() chart._feeds[symbol.key] = feed chart.setFocus() @@ -706,10 +710,6 @@ async def display_symbol_data( # size view to data once at outset chart.cv._set_yrange() - # TODO: a data view api that makes this less shit - chart._shm = ohlcv - chart._flows[chart.data_key].shm = ohlcv - # NOTE: we must immediately tell Qt to show the OHLC chart # to avoid a race where the subplots get added/shown to # the linked set *before* the main price chart! @@ -772,6 +772,5 @@ async def display_symbol_data( sbar._status_groups[loading_sym_key][1]() # let the app run.. bby - chart.default_view() # linked.graphics_cycle() await trio.sleep_forever() diff --git a/piker/ui/_editors.py b/piker/ui/_editors.py index 9a99d2f7..03fd208e 100644 --- a/piker/ui/_editors.py +++ b/piker/ui/_editors.py @@ -343,7 +343,7 @@ class SelectRect(QtGui.QGraphicsRectItem): nbars = ixmx - ixmn + 1 chart = self._chart - data = chart._arrays[chart.name][ixmn:ixmx] + data = chart._flows[chart.name].shm.array[ixmn:ixmx] if len(data): std = data['close'].std() diff --git a/piker/ui/_fsp.py b/piker/ui/_fsp.py index 52763375..9aa10fb3 100644 --- a/piker/ui/_fsp.py +++ b/piker/ui/_fsp.py @@ -93,9 +93,8 @@ def update_fsp_chart( # update graphics # NOTE: this does a length check internally which allows it # staying above the last row check below.. - chart.update_graphics_from_array( + chart.update_graphics_from_flow( graphics_name, - array, array_key=array_key or graphics_name, ) @@ -106,9 +105,6 @@ def update_fsp_chart( # read from last calculated value and update any label last_val_sticky = chart._ysticks.get(graphics_name) if last_val_sticky: - # array = shm.array[array_key] - # if len(array): - # value = array[-1] last = last_row[array_key] last_val_sticky.update_from_data(-1, last) @@ -246,20 +242,18 @@ async def run_fsp_ui( chart.draw_curve( name=name, - data=shm.array, + shm=shm, overlay=True, color='default_light', array_key=name, **conf.get('chart_kwargs', {}) ) - # specially store ref to shm for lookup in display loop - chart._flows[name].shm = shm else: # create a new sub-chart widget for this fsp chart = linkedsplits.add_plot( name=name, - array=shm.array, + shm=shm, array_key=name, sidepane=sidepane, @@ -271,12 +265,6 @@ async def run_fsp_ui( **conf.get('chart_kwargs', {}) ) - # XXX: ONLY for sub-chart fsps, overlays have their - # data looked up from the chart's internal array set. - # TODO: we must get a data view api going STAT!! - chart._shm = shm - chart._flows[chart.data_key].shm = shm - # should **not** be the same sub-chart widget assert chart.name != linkedsplits.chart.name @@ -626,7 +614,7 @@ async def open_vlm_displays( shm = ohlcv chart = linked.add_plot( name='volume', - array=shm.array, + shm=shm, array_key='volume', sidepane=sidepane, @@ -639,7 +627,6 @@ async def open_vlm_displays( # the curve item internals are pretty convoluted. style='step', ) - chart._flows['volume'].shm = ohlcv # force 0 to always be in view def maxmin( @@ -666,11 +653,6 @@ async def open_vlm_displays( # chart.hideAxis('right') # chart.showAxis('left') - # XXX: ONLY for sub-chart fsps, overlays have their - # data looked up from the chart's internal array set. - # TODO: we must get a data view api going STAT!! - chart._shm = shm - # send back new chart to caller task_status.started(chart) @@ -685,9 +667,9 @@ async def open_vlm_displays( last_val_sticky.update_from_data(-1, value) - vlm_curve = chart.update_graphics_from_array( + vlm_curve = chart.update_graphics_from_flow( 'volume', - shm.array, + # shm.array, ) # size view to data once at outset @@ -795,9 +777,8 @@ async def open_vlm_displays( color = 'bracket' curve, _ = chart.draw_curve( - # name='dolla_vlm', name=name, - data=shm.array, + shm=shm, array_key=name, overlay=pi, color=color, @@ -812,7 +793,6 @@ async def open_vlm_displays( # ``.draw_curve()``. flow = chart._flows[name] assert flow.plot is pi - flow.shm = shm chart_curves( fields, @@ -847,7 +827,9 @@ async def open_vlm_displays( # liquidity events (well at least on low OHLC periods - 1s). vlm_curve.hide() chart.removeItem(vlm_curve) - chart._flows.pop('volume') + vflow = chart._flows['volume'] + vflow.render = False + # avoid range sorting on volume once disabled chart.view.disable_auto_yrange()