Drop position-line factory from lines module, add endpoint getter

fsp_feeds
Tyler Goodlet 2021-07-21 20:06:14 -04:00
parent 444421bddf
commit d3457cd423
1 changed files with 33 additions and 108 deletions

View File

@ -28,12 +28,11 @@ from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QPointF from PyQt5.QtCore import QPointF
from PyQt5.QtGui import QGraphicsPathItem from PyQt5.QtGui import QGraphicsPathItem
from ._annotate import mk_marker, qgo_draw_markers from ._annotate import mk_marker_path, qgo_draw_markers
from ._anchors import ( from ._anchors import (
marker_right_points, marker_right_points,
vbr_left, vbr_left,
right_axis, right_axis,
update_pp_nav,
gpath_pin, gpath_pin,
) )
from ._label import Label from ._label import Label
@ -121,8 +120,6 @@ class LevelLine(pg.InfiniteLine):
self._on_drag_end = lambda l: None self._on_drag_end = lambda l: None
self._y_incr_mult = 1 / chart._lc._symbol.tick_size self._y_incr_mult = 1 / chart._lc._symbol.tick_size
self._last_scene_y: float = 0
self._right_end_sc: float = 0 self._right_end_sc: float = 0
def txt_offsets(self) -> Tuple[int, int]: def txt_offsets(self) -> Tuple[int, int]:
@ -351,11 +348,12 @@ class LevelLine(pg.InfiniteLine):
# order lines.. not sure wtf is up with that. # order lines.. not sure wtf is up with that.
# for now we're just using it on the position line. # for now we're just using it on the position line.
elif self._marker: elif self._marker:
# TODO: make this label update part of a scene-aware-marker
# composed annotation
self._marker.setPos( self._marker.setPos(
QPointF(marker_right, self.scene_y()) QPointF(marker_right, self.scene_y())
) )
# TODO: make this label update part of a scene-aware-marker
# composed annotation
if hasattr(self._marker, 'label'): if hasattr(self._marker, 'label'):
self._marker.label.update() self._marker.label.update()
@ -379,21 +377,26 @@ class LevelLine(pg.InfiniteLine):
super().hide() super().hide()
if self._marker: if self._marker:
self._marker.hide() self._marker.hide()
self._marker.label.hide() # self._marker.label.hide()
def hide(self) -> None: def show(self) -> None:
super().show() super().show()
if self._marker: if self._marker:
self._marker.show() self._marker.show()
self._marker.label.show() # self._marker.label.show()
def scene_right_xy(self) -> QPointF:
return self.getViewBox().mapFromView(
QPointF(0, self.value())
)
def scene_y(self) -> float: def scene_y(self) -> float:
return self.getViewBox().mapFromView(Point(0, self.value())).y() return self.getViewBox().mapFromView(
Point(0, self.value())
).y()
def scene_endpoint(self) -> QPointF:
if not self._right_end_sc:
line_end, _, _ = marker_right_points(self._chart)
self._right_end_sc = line_end - 10
return QPointF(self._right_end_sc, self.scene_y())
def add_marker( def add_marker(
self, self,
@ -414,7 +417,6 @@ class LevelLine(pg.InfiniteLine):
path.setPos(QPointF(rsc, self.scene_y())) path.setPos(QPointF(rsc, self.scene_y()))
return path return path
# self.update()
def hoverEvent(self, ev): def hoverEvent(self, ev):
"""Mouse hover callback. """Mouse hover callback.
@ -630,18 +632,25 @@ def order_line(
# resetting the graphics item transform intermittently # resetting the graphics item transform intermittently
# the old way which is still somehow faster? # the old way which is still somehow faster?
path = mk_marker( path = QGraphicsPathItem(
mk_marker_path(
marker_style, marker_style,
# the "position" here is now ignored since we modified # the "position" here is now ignored since we modified
# internals to pin markers to the right end of the line # internals to pin markers to the right end of the line
marker_size, # marker_size,
# uncommment for the old transform / .pain() marker method # uncommment for the old transform / .paint() marker method
# use_qgpath=False, # use_qgpath=False,
) )
)
path.scale(marker_size, marker_size)
# XXX: this is our new approach but seems slower? # XXX: this is our new approach but seems slower?
path = line.add_marker(mk_marker(marker_style, marker_size)) path = line.add_marker(path)
# XXX: old
# path = line.add_marker(mk_marker(marker_style, marker_size))
line._marker = path line._marker = path
assert not line.markers assert not line.markers
@ -717,87 +726,3 @@ def order_line(
line.update_labels({'level': level}) line.update_labels({'level': level})
return line return line
def position_line(
chart,
size: float,
level: float,
orient_v: str = 'bottom',
) -> LevelLine:
'''Convenience routine to add a line graphic representing an order
execution submitted to the EMS via the chart's "order mode".
'''
hcolor = 'default_light'
line = level_line(
chart,
level,
color=hcolor,
add_label=False,
hl_on_hover=False,
movable=False,
hide_xhair_on_hover=False,
use_marker_margin=True,
only_show_markers_on_hover=False,
always_show_labels=True,
)
# hide position marker when out of view (for now)
vb = line.getViewBox()
# arrow marker
# scale marker size with dpi-aware font size
font_size = _font.font.pixelSize()
# scale marker size with dpi-aware font size
arrow_size = floor(1.375 * font_size)
if size > 0:
style = '|<'
elif size < 0:
style = '>|'
arrow_path = mk_marker(style, size=arrow_size)
path_br = arrow_path.mapToScene(
arrow_path.path()
).boundingRect()
# monkey-cache height for sizing on pp nav-hub
arrow_path._height = path_br.height()
arrow_path._width = path_br.width()
marker_label = Label(
view=vb,
fmt_str='pp',
color=hcolor,
update_on_range_change=False,
)
arrow_path.label = marker_label
marker_label.scene_anchor = partial(
gpath_pin,
gpath=arrow_path,
label=marker_label,
)
line._labels.append(marker_label)
marker_label.render()
marker_label.show()
# XXX: uses new marker drawing approach
line.add_marker(arrow_path)
line.set_level(level)
# sanity check
line.update_labels({'level': level})
vb.sigRangeChanged.connect(partial(update_pp_nav, chartview=vb, line=line))
return line