From 2a9042b1b184d63bc0b54e471f86ba8a9c8b9de1 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 7 Nov 2022 15:33:52 -0500 Subject: [PATCH] Make all UI entrypoints accept an fqsn `list` This is to prep for multi-symbol feeds and charts so we accept a sequence of fqsns to the top level entrypoints as well as the `.data.feed.open_feed()` API (though we're not actually supporting true multiplexed feeds nor shm lookups per fqsn yet). --- piker/ui/_app.py | 16 ++++++++++------ piker/ui/_chart.py | 24 ++++++++++++++++-------- piker/ui/_display.py | 35 +++++++++++++++++++---------------- 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/piker/ui/_app.py b/piker/ui/_app.py index a31fd2da..38a4db20 100644 --- a/piker/ui/_app.py +++ b/piker/ui/_app.py @@ -66,7 +66,7 @@ async def _async_main( # implicit required argument provided by ``qtractor_run()`` main_widget: GodWidget, - sym: str, + syms: list[str], brokernames: str, loglevel: str, @@ -113,12 +113,16 @@ async def _async_main( # godwidget.hbox.addWidget(search) godwidget.search = search - symbol, _, provider = sym.rpartition('.') + symbols: list[str] = [] + + for sym in syms: + symbol, _, provider = sym.rpartition('.') + symbols.append(symbol) # this internally starts a ``display_symbol_data()`` task above - order_mode_ready = await godwidget.load_symbol( + order_mode_ready = await godwidget.load_symbols( provider, - symbol, + symbols, loglevel ) @@ -166,7 +170,7 @@ async def _async_main( def _main( - sym: str, + syms: list[str], brokernames: [str], piker_loglevel: str, tractor_kwargs, @@ -178,7 +182,7 @@ def _main( ''' run_qtractor( func=_async_main, - args=(sym, brokernames, piker_loglevel), + args=(syms, brokernames, piker_loglevel), main_widget_type=GodWidget, tractor_kwargs=tractor_kwargs, ) diff --git a/piker/ui/_chart.py b/piker/ui/_chart.py index bb2d4448..f61ed1d7 100644 --- a/piker/ui/_chart.py +++ b/piker/ui/_chart.py @@ -186,10 +186,10 @@ class GodWidget(QWidget): ) -> tuple[LinkedSplits, LinkedSplits]: # type: ignore return self._chart_cache.get(symbol_key) - async def load_symbol( + async def load_symbols( self, providername: str, - symbol_key: str, + symbol_keys: list[str], loglevel: str, reset: bool = False, @@ -200,12 +200,20 @@ class GodWidget(QWidget): Expects a ``numpy`` structured array containing all the ohlcv fields. ''' - # our symbol key style is always lower case - symbol_key = symbol_key.lower() + fqsns: list[str] = [] - # fully qualified symbol name (SNS i guess is what we're making?) - fqsn = '.'.join([symbol_key, providername]) - all_linked = self.get_chart_symbol(fqsn) + # our symbol key style is always lower case + for key in list(map(str.lower, symbol_keys)): + + # fully qualified symbol name (SNS i guess is what we're making?) + fqsn = '.'.join([key, providername]) + fqsns.append(fqsn) + + # NOTE: for now we use the first symbol in the set as the "key" + # for the overlay of feeds on the chart. + group_key = fqsns[0] + + all_linked = self.get_chart_symbol(group_key) order_mode_started = trio.Event() if not self.vbox.isEmpty(): @@ -238,7 +246,7 @@ class GodWidget(QWidget): display_symbol_data, self, providername, - symbol_key, + fqsns, loglevel, order_mode_started, ) diff --git a/piker/ui/_display.py b/piker/ui/_display.py index 0a98b4a8..af4f8361 100644 --- a/piker/ui/_display.py +++ b/piker/ui/_display.py @@ -947,7 +947,7 @@ async def link_views_with_region( async def display_symbol_data( godwidget: GodWidget, provider: str, - sym: str, + fqsns: list[str], loglevel: str, order_mode_started: trio.Event, @@ -961,11 +961,6 @@ async def display_symbol_data( ''' sbar = godwidget.window.status_bar - loading_sym_key = sbar.open_status( - f'loading {sym}.{provider} ->', - group_key=True - ) - # historical data fetch # brokermod = brokers.get_brokermod(provider) @@ -974,10 +969,18 @@ async def display_symbol_data( # clear_on_next=True, # group_key=loading_sym_key, # ) - fqsn = '.'.join((sym, provider)) + + for fqsn in fqsns: + + loading_sym_key = sbar.open_status( + f'loading {fqsn} ->', + group_key=True + ) + + first_fqsn = fqsns[0] async with open_feed( - [fqsn], + fqsns, loglevel=loglevel, # limit to at least display's FPS @@ -988,7 +991,7 @@ async def display_symbol_data( ohlcv: ShmArray = feed.rt_shm hist_ohlcv: ShmArray = feed.hist_shm - symbol = feed.symbols[sym] + symbol = feed.symbols[first_fqsn] fqsn = symbol.front_fqsn() step_size_s = 1 @@ -1025,7 +1028,7 @@ async def display_symbol_data( godwidget.pp_pane = pp_pane # create main OHLC chart - chart = rt_linked.plot_ohlc_main( + ohlc_chart = rt_linked.plot_ohlc_main( symbol, ohlcv, # in the case of history chart we explicitly set `False` @@ -1033,8 +1036,8 @@ async def display_symbol_data( sidepane=pp_pane, ) - chart._feeds[symbol.key] = feed - chart.setFocus() + ohlc_chart._feeds[symbol.key] = feed + ohlc_chart.setFocus() # XXX: FOR SOME REASON THIS IS CAUSING HANGZ!?! # plot historical vwap if available @@ -1044,7 +1047,7 @@ async def display_symbol_data( # and 'bar_wap' in bars.dtype.fields # ): # wap_in_history = True - # chart.draw_curve( + # ohlc_chart.draw_curve( # name='bar_wap', # shm=ohlcv, # color='default_light', @@ -1105,7 +1108,7 @@ async def display_symbol_data( await trio.sleep(0) # size view to data prior to order mode init - chart.default_view() + ohlc_chart.default_view() rt_linked.graphics_cycle() await trio.sleep(0) @@ -1119,7 +1122,7 @@ async def display_symbol_data( godwidget.resize_all() await link_views_with_region( - chart, + ohlc_chart, hist_chart, feed, ) @@ -1135,7 +1138,7 @@ async def display_symbol_data( ): if not vlm_chart: # trigger another view reset if no sub-chart - chart.default_view() + ohlc_chart.default_view() rt_linked.mode = mode