"bracket"-ify fills bar + labels and try to evenly space the pane sections
							parent
							
								
									1fc9047746
								
							
						
					
					
						commit
						75f50f4b7e
					
				| 
						 | 
					@ -155,6 +155,10 @@ class FontScaledDelegate(QStyledItemDelegate):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FieldsForm(QWidget):
 | 
					class FieldsForm(QWidget):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    godwidget: 'GodWidget'  # noqa
 | 
				
			||||||
 | 
					    vbox: QVBoxLayout
 | 
				
			||||||
 | 
					    form: QFormLayout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(
 | 
					    def __init__(
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -172,41 +176,46 @@ class FieldsForm(QWidget):
 | 
				
			||||||
            QSizePolicy.Expanding,
 | 
					            QSizePolicy.Expanding,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # XXX: not sure why we have to create this here exactly
 | 
				
			||||||
 | 
					        # (instead of in the pane creation routine) but it's
 | 
				
			||||||
 | 
					        # here and is managed by downstream layout routines.
 | 
				
			||||||
 | 
					        # best guess is that you have to create layouts in order
 | 
				
			||||||
 | 
					        # of hierarchy in order for things to display correctly?
 | 
				
			||||||
 | 
					        # TODO: we may want to hand this *down* from some "pane manager"
 | 
				
			||||||
 | 
					        # thing eventually?
 | 
				
			||||||
        self.vbox = QVBoxLayout(self)
 | 
					        self.vbox = QVBoxLayout(self)
 | 
				
			||||||
        self.vbox.setAlignment(Qt.AlignTop)
 | 
					        self.vbox.setAlignment(Qt.AlignVCenter)
 | 
				
			||||||
        self.vbox.setContentsMargins(0, 4, 4, 4)
 | 
					        self.vbox.setContentsMargins(0, 4, 3, 6)
 | 
				
			||||||
        self.vbox.setSpacing(0)
 | 
					        self.vbox.setSpacing(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # split layout for the (<label>: |<widget>|) parameters entry
 | 
					        # split layout for the (<label>: |<widget>|) parameters entry
 | 
				
			||||||
        self.form = QFormLayout(self)
 | 
					        self.form = QFormLayout(self)
 | 
				
			||||||
        self.form.setAlignment(Qt.AlignCenter | Qt.AlignLeft)
 | 
					        self.form.setAlignment(Qt.AlignTop | Qt.AlignLeft)
 | 
				
			||||||
        self.form.setContentsMargins(0, 0, 0, 0)
 | 
					        self.form.setContentsMargins(0, 0, 0, 0)
 | 
				
			||||||
        self.form.setSpacing(4)
 | 
					        self.form.setSpacing(3)
 | 
				
			||||||
        self.form.setHorizontalSpacing(0)
 | 
					        self.form.setHorizontalSpacing(0)
 | 
				
			||||||
        # self.vbox.addStretch()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.vbox.addLayout(self.form, stretch=3/8)
 | 
					        self.vbox.addLayout(self.form, stretch=1/3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.labels: dict[str, QLabel] = {}
 | 
					        self.labels: dict[str, QLabel] = {}
 | 
				
			||||||
        self.fields: dict[str, QWidget] = {}
 | 
					        self.fields: dict[str, QWidget] = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._font_size = _font_small.px_size - 2
 | 
					        self._font_size = _font_small.px_size - 2
 | 
				
			||||||
        self.vbox.addSpacing(0.375 * self._font_size)
 | 
					 | 
				
			||||||
        self._max_item_width: (float, float) = 0, 0
 | 
					        self._max_item_width: (float, float) = 0, 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def add_field_label(
 | 
					    def add_field_label(
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        name: str,
 | 
					        name: str,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        font_size: Optional[int] = None,
 | 
					        font_size: Optional[int] = None,
 | 
				
			||||||
        font_color: str = 'default_lightest',
 | 
					        font_color: str = 'default_lightest',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        **vbox_kwargs,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ) -> QtGui.QLabel:
 | 
					    ) -> QtGui.QLabel:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # add label to left of search bar
 | 
					        # add label to left of search bar
 | 
				
			||||||
        self.label = label = QtGui.QLabel()
 | 
					        self.label = label = QtGui.QLabel()
 | 
				
			||||||
        font_size = font_size or self._font_size - 3
 | 
					        font_size = font_size or self._font_size - 2
 | 
				
			||||||
        label.setStyleSheet(
 | 
					        label.setStyleSheet(
 | 
				
			||||||
            f"""QLabel {{
 | 
					            f"""QLabel {{
 | 
				
			||||||
                color : {hcolor(font_color)};
 | 
					                color : {hcolor(font_color)};
 | 
				
			||||||
| 
						 | 
					@ -338,7 +347,7 @@ async def handle_field_input(
 | 
				
			||||||
            Qt.Key_Space,  # i feel like this is the "native" one
 | 
					            Qt.Key_Space,  # i feel like this is the "native" one
 | 
				
			||||||
            Qt.Key_Alt,
 | 
					            Qt.Key_Alt,
 | 
				
			||||||
        }:
 | 
					        }:
 | 
				
			||||||
            fields.godwidget.setFocus() #linkedsplits.chart._vb.setFocus()
 | 
					            fields.godwidget.setFocus()  # linkedsplits.chart._vb.setFocus()
 | 
				
			||||||
            fields.godwidget.linkedsplits.focus()
 | 
					            fields.godwidget.linkedsplits.focus()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            widget.clearFocus()
 | 
					            widget.clearFocus()
 | 
				
			||||||
| 
						 | 
					@ -395,39 +404,47 @@ async def open_form(
 | 
				
			||||||
def mk_health_bar(
 | 
					def mk_health_bar(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fields: FieldsForm,
 | 
					    fields: FieldsForm,
 | 
				
			||||||
    h: int = 200,
 | 
					    pane_vbox: QVBoxLayout,
 | 
				
			||||||
 | 
					    bar_h: int = 250,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
) -> (QHBoxLayout, QProgressBar):
 | 
					) -> (QHBoxLayout, QProgressBar):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    w = fields.width()
 | 
					    w = fields.width()
 | 
				
			||||||
    # indent = 18
 | 
					    # indent = 18
 | 
				
			||||||
    bracket_val = 0.375 * w
 | 
					    # bracket_val = 0.375 * 0.666 * w
 | 
				
			||||||
    indent = bracket_val / 1.625
 | 
					    # indent = bracket_val / (1 + 5/8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # title label
 | 
					    # TODO: once things are sized to screen
 | 
				
			||||||
    pps_label = fields.add_field_label(
 | 
					    label_font = DpiAwareFont()
 | 
				
			||||||
        'pps',
 | 
					    label_font._set_qfont_px_size(_font.px_size - 6)
 | 
				
			||||||
        font_size=_font_small.px_size,
 | 
					    br = label_font.boundingRect(f'{3.32:.1f}% port')
 | 
				
			||||||
 | 
					    w, h = br.width(), br.height()
 | 
				
			||||||
 | 
					    bar_h = 8/3 * w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # PnL on lhs
 | 
				
			||||||
 | 
					    bar_labels_lhs = QVBoxLayout(fields)
 | 
				
			||||||
 | 
					    left_label = fields.add_field_label(
 | 
				
			||||||
 | 
					        dedent(f"""
 | 
				
			||||||
 | 
					        -{30}% PnL
 | 
				
			||||||
 | 
					        """),
 | 
				
			||||||
 | 
					        font_size=_font.px_size - 6,
 | 
				
			||||||
 | 
					        font_color='gunmetal',
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    section_hbox = QHBoxLayout(fields)
 | 
					    bar_labels_lhs.addSpacing(5/8 * bar_h)
 | 
				
			||||||
    section_hbox.addSpacing(indent - 2)  # pair with bar indent
 | 
					    bar_labels_lhs.addWidget(
 | 
				
			||||||
    section_hbox.addWidget(
 | 
					        left_label,
 | 
				
			||||||
        pps_label,
 | 
					 | 
				
			||||||
        alignment=Qt.AlignLeft | Qt.AlignTop,
 | 
					        alignment=Qt.AlignLeft | Qt.AlignTop,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fields.vbox.addLayout(section_hbox)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # TODO: spec this based on remaining space?
 | 
					 | 
				
			||||||
    fields.vbox.addSpacing(6)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    hbox = QHBoxLayout(fields)
 | 
					    hbox = QHBoxLayout(fields)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    hbox.addSpacing(indent)  # push to right a bit
 | 
					    hbox.addLayout(bar_labels_lhs)
 | 
				
			||||||
 | 
					    # hbox.addSpacing(indent)  # push to right a bit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # config
 | 
					    # config
 | 
				
			||||||
    hbox.setSpacing(indent * 0.375)
 | 
					    # hbox.setSpacing(indent * 0.375)
 | 
				
			||||||
 | 
					    hbox.setSpacing(0)
 | 
				
			||||||
    hbox.setAlignment(Qt.AlignTop | Qt.AlignLeft)
 | 
					    hbox.setAlignment(Qt.AlignTop | Qt.AlignLeft)
 | 
				
			||||||
    hbox.setContentsMargins(0, 0, 0, 0)
 | 
					    hbox.setContentsMargins(0, 0, 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -438,14 +455,18 @@ def mk_health_bar(
 | 
				
			||||||
        dedent(f"""
 | 
					        dedent(f"""
 | 
				
			||||||
        {3.32:.1f}% port
 | 
					        {3.32:.1f}% port
 | 
				
			||||||
        """),
 | 
					        """),
 | 
				
			||||||
        font_size=_font.px_size - 5,
 | 
					        font_size=_font.px_size - 6,
 | 
				
			||||||
 | 
					        # font_color='default_spotlight',
 | 
				
			||||||
 | 
					        font_color='gunmetal',
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bottom_label = fields.add_field_label(
 | 
					    bottom_label = fields.add_field_label(
 | 
				
			||||||
        dedent(f"""
 | 
					        dedent(f"""
 | 
				
			||||||
        {5e3/4/1e3:.1f}k step\n
 | 
					        {5e3/4/1e3:.2f}k $fill\n
 | 
				
			||||||
        """),
 | 
					        """),
 | 
				
			||||||
        font_size=_font.px_size - 5,
 | 
					        font_size=_font.px_size - 6,
 | 
				
			||||||
 | 
					        # font_color='default_spotlight',
 | 
				
			||||||
 | 
					        font_color='gunmetal',
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bar = QProgressBar(fields)
 | 
					    bar = QProgressBar(fields)
 | 
				
			||||||
| 
						 | 
					@ -470,9 +491,8 @@ def mk_health_bar(
 | 
				
			||||||
    slot_margin_px = 2
 | 
					    slot_margin_px = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO: compute "used height" thus far and mostly fill the rest
 | 
					    # TODO: compute "used height" thus far and mostly fill the rest
 | 
				
			||||||
    h = 200
 | 
					 | 
				
			||||||
    slot_height_px = math.floor(
 | 
					    slot_height_px = math.floor(
 | 
				
			||||||
        (h - 2*border_size_px)/slots
 | 
					        (bar_h - 2*border_size_px)/slots
 | 
				
			||||||
    ) - slot_margin_px*1
 | 
					    ) - slot_margin_px*1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bar.setOrientation(Qt.Vertical)
 | 
					    bar.setOrientation(Qt.Vertical)
 | 
				
			||||||
| 
						 | 
					@ -493,7 +513,7 @@ def mk_health_bar(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        QProgressBar::chunk {{
 | 
					        QProgressBar::chunk {{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            background-color: {hcolor('default_lightest')};
 | 
					            background-color: {hcolor('default_spotlight')};
 | 
				
			||||||
            color: {hcolor('papas_special')};
 | 
					            color: {hcolor('papas_special')};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            border-radius: 2px;
 | 
					            border-radius: 2px;
 | 
				
			||||||
| 
						 | 
					@ -511,12 +531,12 @@ def mk_health_bar(
 | 
				
			||||||
    # width: 10px;
 | 
					    # width: 10px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bar.setRange(0, slots)
 | 
					    bar.setRange(0, slots)
 | 
				
			||||||
    bar.setValue(slots)
 | 
					    bar.setValue(1)
 | 
				
			||||||
    bar.setFormat('')
 | 
					    bar.setFormat('')
 | 
				
			||||||
    bar.setMinimumHeight(h)
 | 
					    bar.setMinimumHeight(bar_h)
 | 
				
			||||||
    bar.setMaximumHeight(h + slots*slot_margin_px)
 | 
					    bar.setMaximumHeight(bar_h + slots*slot_margin_px)
 | 
				
			||||||
    bar.setMinimumWidth(bracket_val)
 | 
					    bar.setMinimumWidth(h * 1.375)
 | 
				
			||||||
    bar.setMaximumWidth(bracket_val)
 | 
					    bar.setMaximumWidth(h * 1.375)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return hbox, bar
 | 
					    return hbox, bar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -524,28 +544,27 @@ def mk_health_bar(
 | 
				
			||||||
def mk_order_pane_layout(
 | 
					def mk_order_pane_layout(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fields: FieldsForm,
 | 
					    fields: FieldsForm,
 | 
				
			||||||
 | 
					    font_size: int = _font_small.px_size - 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
) -> FieldsForm:
 | 
					) -> FieldsForm:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # fh = form.form.sizeHint().height()
 | 
					    # TODO: maybe just allocate the whole fields form here
 | 
				
			||||||
 | 
					    # and expect an async ctx entry?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    w, h = fields.width(), fields.height()
 | 
					    fields._font_size = font_size
 | 
				
			||||||
    print(f'w, h: {w, h}')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO: spec this based on remaining space?
 | 
					    # top level pane layout
 | 
				
			||||||
    # fields.vbox.addSpacing(36)
 | 
					    # XXX: see ``FieldsForm.__init__()`` for why we can't do basic
 | 
				
			||||||
    fields.vbox.addSpacing((5/8) * h)
 | 
					    # config of the vbox here
 | 
				
			||||||
 | 
					    vbox = fields.vbox
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # info label on RHS
 | 
					    # _, h = fields.width(), fields.height()
 | 
				
			||||||
    # {30}% PnL\n
 | 
					    # print(f'w, h: {w, h}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    hbox, bar = mk_health_bar(fields)
 | 
					    hbox, bar = mk_health_bar(fields, pane_vbox=vbox)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # TODO: move the ``.vbox`` from fields obj to top of routine
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # add pp fill bar + spacing
 | 
					    # add pp fill bar + spacing
 | 
				
			||||||
    fields.vbox.addLayout(hbox, stretch=5/8)
 | 
					    vbox.addLayout(hbox, stretch=1/3)
 | 
				
			||||||
    fields.vbox.addSpacing(36)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    feed_label = fields.add_field_label(
 | 
					    feed_label = fields.add_field_label(
 | 
				
			||||||
        dedent("""
 | 
					        dedent("""
 | 
				
			||||||
| 
						 | 
					@ -557,13 +576,16 @@ def mk_order_pane_layout(
 | 
				
			||||||
        font_size=_font.px_size - 5,
 | 
					        font_size=_font.px_size - 5,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    feed_label.setMaximumHeight(feed_label.height())
 | 
					 | 
				
			||||||
    fields.vbox.addSpacing(3/8 * h)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # add feed info label
 | 
					    # add feed info label
 | 
				
			||||||
    fields.vbox.addWidget(
 | 
					    vbox.addWidget(
 | 
				
			||||||
        feed_label,
 | 
					        feed_label,
 | 
				
			||||||
        alignment=Qt.AlignBottom, # | Qt.AlignVCenter,
 | 
					        alignment=Qt.AlignBottom,
 | 
				
			||||||
 | 
					        stretch=1/3,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # TODO: handle resize events and appropriately scale this
 | 
				
			||||||
 | 
					    # to the sidepane height?
 | 
				
			||||||
 | 
					    # https://doc.qt.io/qt-5/layout.html#adding-widgets-to-a-layout
 | 
				
			||||||
 | 
					    vbox.setSpacing(36)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return fields
 | 
					    return fields
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue