Handle left axis case for x-axis label placement
For wtv cucked reason all the viewbox/scene coordinate calcs do **not** include a left axis in the geo (likely because it's a hacked in widget + layout thing managed by `PlotItem`). Detect if there's a left axis and if so use it in the label placement scene coords calc. ToDo: probably make this a non-move calc and only recompute any time the axis changes. Other: - rate limit mouse events down to the 60 (ish) Hz for now - change one last lingering `'ohlc'` array lookup - fix `.mouseMoved()` "event" type annotvlm_plotz
							parent
							
								
									e93edc2acb
								
							
						
					
					
						commit
						d0693e2967
					
				| 
						 | 
				
			
			@ -24,7 +24,7 @@ from typing import Optional, Callable
 | 
			
		|||
import inspect
 | 
			
		||||
import numpy as np
 | 
			
		||||
import pyqtgraph as pg
 | 
			
		||||
from PyQt5 import QtCore, QtGui, QtWidgets
 | 
			
		||||
from PyQt5 import QtCore, QtWidgets
 | 
			
		||||
from PyQt5.QtCore import QPointF, QRectF
 | 
			
		||||
 | 
			
		||||
from ._style import (
 | 
			
		||||
| 
						 | 
				
			
			@ -43,8 +43,8 @@ log = get_logger(__name__)
 | 
			
		|||
# latency (in terms of perceived lag in cross hair) so really be sure
 | 
			
		||||
# there's an improvement if you want to change it!
 | 
			
		||||
 | 
			
		||||
_mouse_rate_limit = 120  # TODO; should we calc current screen refresh rate?
 | 
			
		||||
_debounce_delay = 1 / 40
 | 
			
		||||
_mouse_rate_limit = 58  # TODO; should we calc current screen refresh rate?
 | 
			
		||||
_debounce_delay = 1 / 60
 | 
			
		||||
_ch_label_opac = 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +64,7 @@ class LineDot(pg.CurvePoint):
 | 
			
		|||
 | 
			
		||||
    ) -> None:
 | 
			
		||||
        # scale from dpi aware font size
 | 
			
		||||
        size = int(_font.px_size  * 0.375)
 | 
			
		||||
        size = int(_font.px_size * 0.375)
 | 
			
		||||
 | 
			
		||||
        pg.CurvePoint.__init__(
 | 
			
		||||
            self,
 | 
			
		||||
| 
						 | 
				
			
			@ -246,12 +246,16 @@ class ContentsLabels:
 | 
			
		|||
        # for name, (label, update) in self._labels.items():
 | 
			
		||||
        for chart, name, label, update in self._labels:
 | 
			
		||||
 | 
			
		||||
            if not (index >= 0 and index < chart._arrays['ohlc'][-1]['index']):
 | 
			
		||||
            array = chart._arrays[name]
 | 
			
		||||
            if not (
 | 
			
		||||
                index >= 0
 | 
			
		||||
                and index < array[-1]['index']
 | 
			
		||||
            ):
 | 
			
		||||
                # out of range
 | 
			
		||||
                print('out of range?')
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            array = chart._arrays[name]
 | 
			
		||||
            # array = chart._arrays[name]
 | 
			
		||||
 | 
			
		||||
            # call provided update func with data point
 | 
			
		||||
            try:
 | 
			
		||||
| 
						 | 
				
			
			@ -462,12 +466,15 @@ class Cursor(pg.GraphicsObject):
 | 
			
		|||
 | 
			
		||||
    def mouseMoved(
 | 
			
		||||
        self,
 | 
			
		||||
        evt: 'tuple[QMouseEvent]',  # noqa
 | 
			
		||||
    ) -> None:  # noqa
 | 
			
		||||
        """Update horizonal and vertical lines when mouse moves inside
 | 
			
		||||
        coords: tuple[QPointF],  # noqa
 | 
			
		||||
 | 
			
		||||
    ) -> None:
 | 
			
		||||
        '''
 | 
			
		||||
        Update horizonal and vertical lines when mouse moves inside
 | 
			
		||||
        either the main chart or any indicator subplot.
 | 
			
		||||
        """
 | 
			
		||||
        pos = evt[0]
 | 
			
		||||
 | 
			
		||||
        '''
 | 
			
		||||
        pos = coords[0]
 | 
			
		||||
 | 
			
		||||
        # find position inside active plot
 | 
			
		||||
        try:
 | 
			
		||||
| 
						 | 
				
			
			@ -516,28 +523,37 @@ class Cursor(pg.GraphicsObject):
 | 
			
		|||
                # with cursor movement
 | 
			
		||||
                self.contents_labels.update_labels(ix)
 | 
			
		||||
 | 
			
		||||
            vl_x = ix + line_offset
 | 
			
		||||
            for plot, opts in self.graphics.items():
 | 
			
		||||
 | 
			
		||||
                # update the chart's "contents" label
 | 
			
		||||
                # plot.update_contents_labels(ix)
 | 
			
		||||
 | 
			
		||||
                # move the vertical line to the current "center of bar"
 | 
			
		||||
                opts['vl'].setX(ix + line_offset)
 | 
			
		||||
                opts['vl'].setX(vl_x)
 | 
			
		||||
 | 
			
		||||
                # update all subscribed curve dots
 | 
			
		||||
                for cursor in opts.get('cursors', ()):
 | 
			
		||||
                    cursor.setIndex(ix)
 | 
			
		||||
 | 
			
		||||
                # update the label on the bottom of the crosshair
 | 
			
		||||
                if 'bottom' in plot.plotItem.axes:
 | 
			
		||||
                axes = plot.plotItem.axes
 | 
			
		||||
 | 
			
		||||
                # TODO: make this an up-front calc that we update
 | 
			
		||||
                # on axis-widget resize events.
 | 
			
		||||
                # left axis offset width for calcuating
 | 
			
		||||
                # absolute x-axis label placement.
 | 
			
		||||
                left_axis_width = 0
 | 
			
		||||
 | 
			
		||||
                if 'bottom' in axes:
 | 
			
		||||
 | 
			
		||||
                    left = axes.get('left')
 | 
			
		||||
                    if left:
 | 
			
		||||
                        left_axis_width = left['item'].width()
 | 
			
		||||
 | 
			
		||||
                    # map back to abs (label-local) coordinates
 | 
			
		||||
                    self.xaxis_label.update_label(
 | 
			
		||||
 | 
			
		||||
                        # XXX: requires:
 | 
			
		||||
                        # https://github.com/pyqtgraph/pyqtgraph/pull/1418
 | 
			
		||||
                        # otherwise gobbles tons of CPU..
 | 
			
		||||
 | 
			
		||||
                        # map back to abs (label-local) coordinates
 | 
			
		||||
                        abs_pos=plot.mapFromView(QPointF(ix + line_offset, iy)),
 | 
			
		||||
                        abs_pos=(
 | 
			
		||||
                            plot.mapFromView(QPointF(vl_x, iy)) -
 | 
			
		||||
                            QPointF(left_axis_width, 0)
 | 
			
		||||
                        ),
 | 
			
		||||
                        value=ix,
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue