diff --git a/piker/ui/_interaction.py b/piker/ui/_interaction.py index 0764f880..a6e70240 100644 --- a/piker/ui/_interaction.py +++ b/piker/ui/_interaction.py @@ -18,9 +18,11 @@ Chart view box primitives. """ from dataclasses import dataclass, field +from math import floor from typing import Optional, Dict import pyqtgraph as pg +from PyQt5.QtCore import QPointF from pyqtgraph import ViewBox, Point, QtCore, QtGui from pyqtgraph import functions as fn import numpy as np @@ -107,8 +109,8 @@ class SelectRect(QtGui.QGraphicsRectItem): def mouse_drag_released( self, - p1: QtCore.QPointF, - p2: QtCore.QPointF + p1: QPointF, + p2: QPointF ) -> None: """Called on final button release for mouse drag with start and end positions. @@ -118,8 +120,8 @@ class SelectRect(QtGui.QGraphicsRectItem): def set_pos( self, - p1: QtCore.QPointF, - p2: QtCore.QPointF + p1: QPointF, + p2: QPointF ) -> None: """Set position of selection rect and accompanying label, move label to match. @@ -494,15 +496,17 @@ class ChartView(ViewBox): else: mask = self.state['mouseEnabled'][:] + chart = self.linked_charts.chart + # don't zoom more then the min points setting - l, lbar, rbar, r = self.linked_charts.chart.bars_range() + l, lbar, rbar, r = chart.bars_range() vl = r - l if ev.delta() > 0 and vl <= _min_points_to_show: log.debug("Max zoom bruh...") return - if ev.delta() < 0 and vl >= len(self.linked_charts.chart._ohlc) + 666: + if ev.delta() < 0 and vl >= len(chart._ohlc) + 666: log.debug("Min zoom bruh...") return @@ -527,10 +531,34 @@ class ChartView(ViewBox): # This seems like the most "intuitive option, a hybrid of # tws and tv styles - last_bar = pg.Point(int(rbar)) + last_bar = pg.Point(int(rbar)) + 1 + + ryaxis = chart.getAxis('right') + r_axis_x = ryaxis.pos().x() + + end_of_l1 = pg.Point( + round( + chart._vb.mapToView( + pg.Point(r_axis_x - chart._max_l1_line_len) + # QPointF(chart._max_l1_line_len, 0) + ).x() + ) + ) # .x() + + # self.state['viewRange'][0][1] = end_of_l1 + + # focal = pg.Point((last_bar.x() + end_of_l1)/2) + + focal = min( + last_bar, + end_of_l1, + key=lambda p: p.x() + ) + # breakpoint() + # focal = pg.Point(last_bar.x() + end_of_l1) self._resetTarget() - self.scaleBy(s, last_bar) + self.scaleBy(s, focal) ev.accept() self.sigRangeChangedManually.emit(mask)