Move all anchor funcs to new mod
							parent
							
								
									ee5d5b0cef
								
							
						
					
					
						commit
						0ddeded03d
					
				| 
						 | 
				
			
			@ -18,6 +18,11 @@
 | 
			
		|||
Anchor funtions for UI placement of annotions.
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
from typing import Callable
 | 
			
		||||
 | 
			
		||||
from PyQt5.QtCore import QPointF
 | 
			
		||||
 | 
			
		||||
from ._label import Label
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def marker_right_points(
 | 
			
		||||
| 
						 | 
				
			
			@ -26,8 +31,13 @@ def marker_right_points(
 | 
			
		|||
    marker_size: int = 20,
 | 
			
		||||
 | 
			
		||||
) -> (float, float, float):
 | 
			
		||||
    '''Return x-dimension, y-axis-aware, level-line marker oriented scene values.
 | 
			
		||||
 | 
			
		||||
    # chart = self._chart
 | 
			
		||||
    X values correspond to set the end of a level line, end of
 | 
			
		||||
    a paried level line marker, and the right most side of the "right"
 | 
			
		||||
    axis respectively.
 | 
			
		||||
 | 
			
		||||
    '''
 | 
			
		||||
    l1_len = chart._max_l1_line_len
 | 
			
		||||
    ryaxis = chart.getAxis('right')
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -38,3 +48,110 @@ def marker_right_points(
 | 
			
		|||
    line_end = marker_right - (6/16 * marker_size)
 | 
			
		||||
 | 
			
		||||
    return line_end, marker_right, r_axis_x
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def vbr_left(
 | 
			
		||||
    label: Label,
 | 
			
		||||
 | 
			
		||||
) -> Callable[..., float]:
 | 
			
		||||
    """Return a closure which gives the scene x-coordinate for the
 | 
			
		||||
    leftmost point of the containing view box.
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    return label.vbr().left
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def right_axis(
 | 
			
		||||
 | 
			
		||||
    chart: 'ChartPlotWidget',  # noqa
 | 
			
		||||
    label: Label,
 | 
			
		||||
 | 
			
		||||
    side: str = 'left',
 | 
			
		||||
    offset: float = 10,
 | 
			
		||||
    avoid_book: bool = True,
 | 
			
		||||
    # width: float = None,
 | 
			
		||||
 | 
			
		||||
) -> Callable[..., float]:
 | 
			
		||||
    '''Return a position closure which gives the scene x-coordinate for
 | 
			
		||||
    the x point on the right y-axis minus the width of the label given
 | 
			
		||||
    it's contents.
 | 
			
		||||
 | 
			
		||||
    '''
 | 
			
		||||
    ryaxis = chart.getAxis('right')
 | 
			
		||||
 | 
			
		||||
    if side == 'left':
 | 
			
		||||
 | 
			
		||||
        if avoid_book:
 | 
			
		||||
            def right_axis_offset_by_w() -> float:
 | 
			
		||||
 | 
			
		||||
                # l1 spread graphics x-size
 | 
			
		||||
                l1_len = chart._max_l1_line_len
 | 
			
		||||
 | 
			
		||||
                # sum of all distances "from" the y-axis
 | 
			
		||||
                right_offset = l1_len + label.w + offset
 | 
			
		||||
 | 
			
		||||
                return ryaxis.pos().x() - right_offset
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            def right_axis_offset_by_w() -> float:
 | 
			
		||||
 | 
			
		||||
                return ryaxis.pos().x() - (label.w + offset)
 | 
			
		||||
 | 
			
		||||
        return right_axis_offset_by_w
 | 
			
		||||
 | 
			
		||||
    elif 'right':
 | 
			
		||||
 | 
			
		||||
        # axis_offset = ryaxis.style['tickTextOffset'][0]
 | 
			
		||||
 | 
			
		||||
        def on_axis() -> float:
 | 
			
		||||
 | 
			
		||||
            return ryaxis.pos().x()  # + axis_offset - 2
 | 
			
		||||
 | 
			
		||||
        return on_axis
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def update_pp_nav(
 | 
			
		||||
 | 
			
		||||
    chartview: 'ChartView',  # noqa
 | 
			
		||||
    line: 'LevelLine',  # noqa
 | 
			
		||||
 | 
			
		||||
) -> None:
 | 
			
		||||
    '''Show a pp off-screen indicator for a level label.
 | 
			
		||||
 | 
			
		||||
    This is like in fps games where you have a gps "nav" indicator
 | 
			
		||||
    but your teammate is outside the range of view, except in 2D, on
 | 
			
		||||
    the y-dimension.
 | 
			
		||||
 | 
			
		||||
    '''
 | 
			
		||||
    vr = chartview.state['viewRange']
 | 
			
		||||
    ymn, ymx = vr[1]
 | 
			
		||||
    level = line.value()
 | 
			
		||||
 | 
			
		||||
    marker = line._marker
 | 
			
		||||
    label = marker.label
 | 
			
		||||
 | 
			
		||||
    _, marker_right, _ = marker_right_points(line._chart)
 | 
			
		||||
 | 
			
		||||
    if level > ymx:  # pin to top of view
 | 
			
		||||
        marker.setPos(
 | 
			
		||||
            QPointF(
 | 
			
		||||
                marker_right,
 | 
			
		||||
                marker._height/3,
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    elif level < ymn:  # pin to bottom of view
 | 
			
		||||
 | 
			
		||||
        marker.setPos(
 | 
			
		||||
            QPointF(
 | 
			
		||||
                marker_right,
 | 
			
		||||
                chartview.height() - 4/3*marker._height,
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        # pp line is viewable so show marker normally
 | 
			
		||||
        marker.update()
 | 
			
		||||
 | 
			
		||||
    # re-anchor label (i.e. trigger call of ``arrow_tr()`` from above
 | 
			
		||||
    label.update()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -223,61 +223,3 @@ class Label:
 | 
			
		|||
 | 
			
		||||
    def delete(self) -> None:
 | 
			
		||||
        self.vb.scene().removeItem(self.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# anchoring helper funcs
 | 
			
		||||
 | 
			
		||||
def vbr_left(label) -> Callable[..., float]:
 | 
			
		||||
    """Return a closure which gives the scene x-coordinate for the
 | 
			
		||||
    leftmost point of the containing view box.
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    return label.vbr().left
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def right_axis(
 | 
			
		||||
 | 
			
		||||
    chart: 'ChartPlotWidget',  # noqa
 | 
			
		||||
    label: 'Label',  # noqa
 | 
			
		||||
    side: str = 'left',
 | 
			
		||||
    offset: float = 10,
 | 
			
		||||
    avoid_book: bool = True,
 | 
			
		||||
    width: float = None,
 | 
			
		||||
 | 
			
		||||
) -> Callable[..., float]:
 | 
			
		||||
    """Return a position closure which gives the scene x-coordinate for
 | 
			
		||||
    the x point on the right y-axis minus the width of the label given
 | 
			
		||||
    it's contents.
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    ryaxis = chart.getAxis('right')
 | 
			
		||||
 | 
			
		||||
    if side == 'left':
 | 
			
		||||
 | 
			
		||||
        if avoid_book:
 | 
			
		||||
            def right_axis_offset_by_w() -> float:
 | 
			
		||||
 | 
			
		||||
                # l1 spread graphics x-size
 | 
			
		||||
                l1_len = chart._max_l1_line_len
 | 
			
		||||
 | 
			
		||||
                # sum of all distances "from" the y-axis
 | 
			
		||||
                right_offset = l1_len + label.w + offset
 | 
			
		||||
 | 
			
		||||
                return ryaxis.pos().x() - right_offset
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            def right_axis_offset_by_w() -> float:
 | 
			
		||||
 | 
			
		||||
                return ryaxis.pos().x() - (label.w + offset)
 | 
			
		||||
 | 
			
		||||
        return right_axis_offset_by_w
 | 
			
		||||
 | 
			
		||||
    elif 'right':
 | 
			
		||||
 | 
			
		||||
        # axis_offset = ryaxis.style['tickTextOffset'][0]
 | 
			
		||||
 | 
			
		||||
        def on_axis() -> float:
 | 
			
		||||
 | 
			
		||||
            return ryaxis.pos().x()  # + axis_offset - 2
 | 
			
		||||
 | 
			
		||||
        return on_axis
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,7 @@
 | 
			
		|||
Lines for orders, alerts, L2.
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from functools import partial
 | 
			
		||||
from math import floor
 | 
			
		||||
from typing import Tuple, Optional, List
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,8 +28,13 @@ from PyQt5 import QtCore, QtGui, QtWidgets
 | 
			
		|||
from PyQt5.QtCore import QPointF
 | 
			
		||||
 | 
			
		||||
from ._annotate import mk_marker, qgo_draw_markers
 | 
			
		||||
from ._anchors import marker_right_points
 | 
			
		||||
from ._label import Label, vbr_left, right_axis
 | 
			
		||||
from ._anchors import (
 | 
			
		||||
    marker_right_points,
 | 
			
		||||
    vbr_left,
 | 
			
		||||
    right_axis,
 | 
			
		||||
    update_pp_nav,
 | 
			
		||||
)
 | 
			
		||||
from ._label import Label
 | 
			
		||||
from ._style import hcolor, _font
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -785,46 +791,6 @@ def position_line(
 | 
			
		|||
    # sanity check
 | 
			
		||||
    line.update_labels({'level': level})
 | 
			
		||||
 | 
			
		||||
    def update_pp_nav(chartview):
 | 
			
		||||
        '''Show a pp off-screen indicator when order mode is activated.
 | 
			
		||||
 | 
			
		||||
        This is like in fps games where you have a gps "nav" indicator
 | 
			
		||||
        but your teammate is outside the range of view, except in 2D, on
 | 
			
		||||
        the y-dimension.
 | 
			
		||||
        '''
 | 
			
		||||
        vr = vb.state['viewRange']
 | 
			
		||||
        ymn, ymx = vr[1]
 | 
			
		||||
        level = line.value()
 | 
			
		||||
 | 
			
		||||
        marker = line._marker
 | 
			
		||||
        label = marker.label
 | 
			
		||||
 | 
			
		||||
        _, marker_right, _ = marker_right_points(line._chart)
 | 
			
		||||
 | 
			
		||||
        if level > ymx:  # pin to top of view
 | 
			
		||||
            marker.setPos(
 | 
			
		||||
                QPointF(
 | 
			
		||||
                    marker_right,
 | 
			
		||||
                    marker._height/3,
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        elif level < ymn:  # pin to bottom of view
 | 
			
		||||
 | 
			
		||||
            marker.setPos(
 | 
			
		||||
                QPointF(
 | 
			
		||||
                    marker_right,
 | 
			
		||||
                    vb.height() - 4/3*marker._height,
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            # pp line is viewable so show marker normally
 | 
			
		||||
            marker.update()
 | 
			
		||||
 | 
			
		||||
        # re-anchor label (i.e. trigger call of ``arrow_tr()`` from above
 | 
			
		||||
        label.update()
 | 
			
		||||
 | 
			
		||||
    vb.sigRangeChanged.connect(update_pp_nav)
 | 
			
		||||
    vb.sigRangeChanged.connect(partial(update_pp_nav, chartview=vb, line=line))
 | 
			
		||||
 | 
			
		||||
    return line
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue