Rename crosshair (type) to cursor
Since the "crosshair" is growing more and more UX implementation details it probably makes sense to call it what it is; a python level mouse abstraction. Add 2 internal sets: `_hovered` for allowing mouse hovered objects to register themselves to other cursor aware components, and `_trackers` for allowing scene items to "track" cursor movements via a `on_tracked_source()` callback.basic_alerts
							parent
							
								
									14dad08d98
								
							
						
					
					
						commit
						08aa5984ec
					
				|  | @ -17,7 +17,7 @@ | |||
| Mouse interaction graphics | ||||
| 
 | ||||
| """ | ||||
| from typing import Optional, Tuple | ||||
| from typing import Optional, Tuple, Set, Dict | ||||
| 
 | ||||
| import inspect | ||||
| import numpy as np | ||||
|  | @ -198,7 +198,7 @@ class ContentsLabel(pg.LabelItem): | |||
|             self.setText(f"{name}: {data:.2f}") | ||||
| 
 | ||||
| 
 | ||||
| class CrossHair(pg.GraphicsObject): | ||||
| class Cursor(pg.GraphicsObject): | ||||
| 
 | ||||
|     def __init__( | ||||
|         self, | ||||
|  | @ -217,11 +217,21 @@ class CrossHair(pg.GraphicsObject): | |||
|             style=QtCore.Qt.DashLine, | ||||
|         ) | ||||
|         self.lsc = linkedsplitcharts | ||||
|         self.graphics = {} | ||||
|         self.plots = [] | ||||
|         self.graphics: Dict[str, pg.GraphicsObject] = {} | ||||
|         self.plots: List['PlotChartWidget'] = []  # type: ignore # noqa | ||||
|         self.active_plot = None | ||||
|         self.digits = digits | ||||
|         self._lastx = None | ||||
|         self.digits: int = digits | ||||
|         self._datum_xy: Tuple[int, float] = (0, 0) | ||||
| 
 | ||||
|         self._hovered: Set[pg.GraphicsObject] = set() | ||||
|         self._trackers: Set[pg.GraphicsObject] = set() | ||||
| 
 | ||||
|     def add_hovered( | ||||
|         self, | ||||
|         item: pg.GraphicsObject, | ||||
|     ) -> None: | ||||
|         assert getattr(item, 'delete'), f"{item} must define a ``.delete()``" | ||||
|         self._hovered.add(item) | ||||
| 
 | ||||
|     def add_plot( | ||||
|         self, | ||||
|  | @ -293,7 +303,11 @@ class CrossHair(pg.GraphicsObject): | |||
|     ) -> LineDot: | ||||
|         # if this plot contains curves add line dot "cursors" to denote | ||||
|         # the current sample under the mouse | ||||
|         cursor = LineDot(curve, index=plot._ohlc[-1]['index'], plot=plot) | ||||
|         cursor = LineDot( | ||||
|             curve, | ||||
|             index=plot._ohlc[-1]['index'], | ||||
|             plot=plot | ||||
|         ) | ||||
|         plot.addItem(cursor) | ||||
|         self.graphics[plot].setdefault('cursors', []).append(cursor) | ||||
|         return cursor | ||||
|  | @ -336,15 +350,21 @@ class CrossHair(pg.GraphicsObject): | |||
|         # update y-range items | ||||
|         self.graphics[plot]['hl'].setY(y) | ||||
| 
 | ||||
| 
 | ||||
|         self.graphics[self.active_plot]['yl'].update_label( | ||||
|             abs_pos=pos, value=y | ||||
|         ) | ||||
| 
 | ||||
|         # Update x if cursor changed after discretization calc | ||||
|         # (this saves draw cycles on small mouse moves) | ||||
|         lastx = self._lastx | ||||
|         lastx, lasty = self._datum_xy | ||||
|         ix = round(x)  # since bars are centered around index | ||||
| 
 | ||||
|         # update all trackers | ||||
|         for item in self._trackers: | ||||
|             # print(f'setting {item} with {(ix, y)}') | ||||
|             item.on_tracked_source(ix, y) | ||||
| 
 | ||||
|         if ix != lastx: | ||||
|             for plot, opts in self.graphics.items(): | ||||
| 
 | ||||
|  | @ -355,7 +375,6 @@ class CrossHair(pg.GraphicsObject): | |||
|                 plot.update_contents_labels(ix) | ||||
| 
 | ||||
|                 # update all subscribed curve dots | ||||
|                 # first = plot._ohlc[0]['index'] | ||||
|                 for cursor in opts.get('cursors', ()): | ||||
|                     cursor.setIndex(ix) | ||||
| 
 | ||||
|  | @ -371,7 +390,7 @@ class CrossHair(pg.GraphicsObject): | |||
|                 value=x, | ||||
|             ) | ||||
| 
 | ||||
|         self._lastx = ix | ||||
|         self._datum_xy = ix, y | ||||
| 
 | ||||
|     def boundingRect(self): | ||||
|         try: | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue