Add a `ChartnPane` composite for every symbol

fsp_feeds
Tyler Goodlet 2021-08-23 14:48:53 -04:00
parent 206af0d575
commit c4d5ca008e
1 changed files with 79 additions and 59 deletions

View File

@ -201,7 +201,7 @@ class GodWidget(QWidget):
# XXX: pretty sure we don't need this
# remove any existing plots?
# XXX: ahh we might want to support cache unloading..
self.vbox.removeWidget(self.linkedsplits)
# self.vbox.removeWidget(self.linkedsplits)
# switching to a new viewable chart
if linkedsplits is None or reset:
@ -231,13 +231,13 @@ class GodWidget(QWidget):
# XXX: since the pp config is a singleton widget we have to
# also switch it over to the new chart's interal-layout
self.linkedsplits.chart.qframe.hbox.removeWidget(self.pp_pane)
# self.linkedsplits.chart.qframe.hbox.removeWidget(self.pp_pane)
chart = linkedsplits.chart
await chart.resume_all_feeds()
chart.qframe.hbox.addWidget(
self.pp_pane,
alignment=Qt.AlignTop
)
# chart.qframe.hbox.addWidget(
# self.pp_pane,
# alignment=Qt.AlignTop
# )
# chart is already in memory so just focus it
if self.linkedsplits:
@ -271,6 +271,39 @@ class GodWidget(QWidget):
self.linkedsplits.chart.setFocus()
class ChartnPane(QFrame):
'''One-off ``QFrame`` composite which pairs a chart
+ sidepane (often a ``FieldsForm`` + other widgets if
provided) forming a, sort of, "chart row" with a side panel
for configuration and display of off-chart data.
See composite widgets docs for deats:
https://doc.qt.io/qt-5/qwidget.html#composite-widgets
'''
sidepane: FieldsForm
hbox: QtGui.QHBoxLayout
chart: Optional['ChartPlotWidget'] = None
def __init__(
self,
sidepane: FieldsForm,
parent=None,
) -> None:
super().__init__(parent)
self.sidepane = sidepane
self.chart = None
hbox = self.hbox = QtGui.QHBoxLayout(self)
hbox.setAlignment(Qt.AlignTop | Qt.AlignLeft)
hbox.setContentsMargins(0, 0, 0, 0)
hbox.setSpacing(3)
class LinkedSplits(QWidget):
'''
Widget that holds a central chart plus derived
@ -333,7 +366,7 @@ class LinkedSplits(QWidget):
def set_split_sizes(
self,
prop: float = 0.625 # proportion allocated to consumer subcharts
prop: float = 0.375 # proportion allocated to consumer subcharts
) -> None:
'''Set the proportion of space allocated for linked subcharts.
@ -360,6 +393,7 @@ class LinkedSplits(QWidget):
symbol: Symbol,
array: np.ndarray,
sidepane: FieldsForm,
style: str = 'bar',
@ -382,7 +416,7 @@ class LinkedSplits(QWidget):
style=style,
_is_main=True,
sidepane=self.godwidget.pp_pane,
sidepane=sidepane,
)
# add crosshair graphic
self.chart.addItem(self.cursor)
@ -442,35 +476,7 @@ class LinkedSplits(QWidget):
self.xaxis.hide()
self.xaxis = xaxis
# TODO: probably should formalize and call this something else?
class ChartnPane(QFrame):
'''One-off ``QFrame`` composite which pairs a chart + sidepane
``FieldsForm`` (if provided).
See composite widgets docs for deats:
https://doc.qt.io/qt-5/qwidget.html#composite-widgets
'''
sidepane: FieldsForm
hbox: QtGui.QHBoxLayout
chart: Optional['ChartPlotWidget'] = None
def __init__(
self,
parent=None,
) -> None:
super().__init__(parent)
self.sidepane = sidepane
hbox = self.hbox = QtGui.QHBoxLayout(self)
hbox.setAlignment(Qt.AlignTop | Qt.AlignLeft)
hbox.setContentsMargins(0, 0, 0, 0)
hbox.setSpacing(3)
qframe = ChartnPane(self.splitter)
qframe = ChartnPane(sidepane=sidepane, parent=self.splitter)
cpw = ChartPlotWidget(
@ -500,12 +506,11 @@ class LinkedSplits(QWidget):
assert cpw.parent() == qframe
# add sidepane **after** chart; place it on axis side
if sidepane:
qframe.hbox.addWidget(
sidepane,
alignment=Qt.AlignTop
)
cpw.sidepane = sidepane
qframe.hbox.addWidget(
sidepane,
alignment=Qt.AlignTop
)
cpw.sidepane = sidepane
# give viewbox as reference to chart
# allowing for kb controls and interactions on **this** widget
@ -1401,10 +1406,6 @@ async def run_fsp(
period: int
sidepane: FieldsForm = mk_form(
model=FspConfig(
name=display_name,
period=14,
),
parent=linkedsplits.godwidget,
fields_schema={
'name': {
@ -1421,6 +1422,10 @@ async def run_fsp(
},
},
)
sidepane.model = FspConfig(
name=display_name,
period=14,
)
async with (
portal.open_stream_from(
@ -1533,11 +1538,14 @@ async def run_fsp(
done()
i = 0
# update chart graphics
async for value in stream:
# chart isn't actively shown so just skip render cycle
if chart.linked.isHidden():
print(f'{i} unseen fsp cyclce')
i += 1
continue
now = time.time()
@ -1709,7 +1717,18 @@ async def display_symbol_data(
linkedsplits = godwidget.linkedsplits
linkedsplits._symbol = symbol
chart = linkedsplits.plot_ohlc_main(symbol, bars)
# generate order mode side-pane UI
# A ``FieldsForm`` form to configure order entry
pp_pane: FieldsForm = mk_order_pane_layout(godwidget)
# add as next-to-y-axis singleton pane
godwidget.pp_pane = pp_pane
chart = linkedsplits.plot_ohlc_main(
symbol,
bars,
sidepane=pp_pane,
)
chart._feeds[symbol.key] = feed
chart.setFocus()
@ -1771,7 +1790,11 @@ async def display_symbol_data(
},
})
async with trio.open_nursery() as n:
async with (
trio.open_nursery() as n,
):
# load initial fsp chain (otherwise known as "indicators")
n.start_soon(
spawn_fsps,
@ -1876,12 +1899,6 @@ async def _async_main(
sbar = godwidget.window.status_bar
starting_done = sbar.open_status('starting ze sexy chartz')
# generate order mode side-pane UI
# A ``FieldsForm`` form to configure order entry
pp_pane: FieldsForm = mk_order_pane_layout(godwidget)
# add as next-to-y-axis singleton pane
godwidget.pp_pane = pp_pane
async with (
trio.open_nursery() as root_n,
):
@ -1925,6 +1942,9 @@ async def _async_main(
await order_mode_ready.wait()
# load account names from ``brokers.toml``
# accounts = brokers.config.load_accounts()
# start handling peripherals input for top level widgets
async with (
@ -1945,10 +1965,10 @@ async def _async_main(
),
# pp pane kb inputs
open_form_input_handling(
pp_pane,
focus_next=godwidget,
)
# open_form_input_handling(
# pp_pane,
# focus_next=godwidget,
# )
):
# remove startup status text
starting_done()