Attempt to make `.default_view()` time-index ready
As in make the call to `Flume.slice_from_time()` to try and convert any time index values from the view range to array-indices; all untested atm. Also drop some old/unused/moved methods: - `._set_xlimits()` - `.bars_range()` - `.curve_width_pxs()` and fix some `flow` -> `viz` var naming.pre_viz_calls
							parent
							
								
									301bfa2463
								
							
						
					
					
						commit
						fc993146b6
					
				| 
						 | 
					@ -60,7 +60,7 @@ from ._style import (
 | 
				
			||||||
    hcolor,
 | 
					    hcolor,
 | 
				
			||||||
    CHART_MARGINS,
 | 
					    CHART_MARGINS,
 | 
				
			||||||
    _xaxis_at,
 | 
					    _xaxis_at,
 | 
				
			||||||
    _min_points_to_show,
 | 
					    # _min_points_to_show,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from ..data.feed import (
 | 
					from ..data.feed import (
 | 
				
			||||||
    Feed,
 | 
					    Feed,
 | 
				
			||||||
| 
						 | 
					@ -951,41 +951,10 @@ class ChartPlotWidget(pg.PlotWidget):
 | 
				
			||||||
    def focus(self) -> None:
 | 
					    def focus(self) -> None:
 | 
				
			||||||
        self.view.setFocus()
 | 
					        self.view.setFocus()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _set_xlimits(
 | 
					 | 
				
			||||||
        self,
 | 
					 | 
				
			||||||
        xfirst: int,
 | 
					 | 
				
			||||||
        xlast: int
 | 
					 | 
				
			||||||
    ) -> None:
 | 
					 | 
				
			||||||
        """Set view limits (what's shown in the main chart "pane")
 | 
					 | 
				
			||||||
        based on max/min x/y coords.
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        self.setLimits(
 | 
					 | 
				
			||||||
            xMin=xfirst,
 | 
					 | 
				
			||||||
            xMax=xlast,
 | 
					 | 
				
			||||||
            minXRange=_min_points_to_show,
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def view_range(self) -> tuple[int, int]:
 | 
					    def view_range(self) -> tuple[int, int]:
 | 
				
			||||||
        vr = self.viewRect()
 | 
					        vr = self.viewRect()
 | 
				
			||||||
        return int(vr.left()), int(vr.right())
 | 
					        return int(vr.left()), int(vr.right())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def bars_range(self) -> tuple[int, int, int, int]:
 | 
					 | 
				
			||||||
        '''
 | 
					 | 
				
			||||||
        Return a range tuple for the bars present in view.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        '''
 | 
					 | 
				
			||||||
        main_flow = self._vizs[self.name]
 | 
					 | 
				
			||||||
        ifirst, l, lbar, rbar, r, ilast = main_flow.datums_range()
 | 
					 | 
				
			||||||
        return l, lbar, rbar, r
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def curve_width_pxs(
 | 
					 | 
				
			||||||
        self,
 | 
					 | 
				
			||||||
    ) -> float:
 | 
					 | 
				
			||||||
        _, lbar, rbar, _ = self.bars_range()
 | 
					 | 
				
			||||||
        return self.view.mapViewToDevice(
 | 
					 | 
				
			||||||
            QLineF(lbar, 0, rbar, 0)
 | 
					 | 
				
			||||||
        ).length()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def pre_l1_xs(self) -> tuple[float, float]:
 | 
					    def pre_l1_xs(self) -> tuple[float, float]:
 | 
				
			||||||
        '''
 | 
					        '''
 | 
				
			||||||
        Return the view x-coord for the value just before
 | 
					        Return the view x-coord for the value just before
 | 
				
			||||||
| 
						 | 
					@ -1038,37 +1007,65 @@ class ChartPlotWidget(pg.PlotWidget):
 | 
				
			||||||
        Set the view box to the "default" startup view of the scene.
 | 
					        Set the view box to the "default" startup view of the scene.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        '''
 | 
					        '''
 | 
				
			||||||
        flow = self._vizs.get(self.name)
 | 
					        viz = self.get_viz(self.name)
 | 
				
			||||||
        if not flow:
 | 
					        if not viz:
 | 
				
			||||||
            log.warning(f'`Viz` for {self.name} not loaded yet?')
 | 
					            log.warning(f'`Viz` for {self.name} not loaded yet?')
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        arr = flow.shm.array
 | 
					        renderer = viz._src_r
 | 
				
			||||||
        index = arr['index']
 | 
					        if renderer is None:
 | 
				
			||||||
        # times = arr['time']
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # these will be epoch time floats
 | 
					        (
 | 
				
			||||||
        xfirst, xlast = index[0], index[-1]
 | 
					            start,
 | 
				
			||||||
        l, lbar, rbar, r = self.bars_range()
 | 
					            l,
 | 
				
			||||||
 | 
					            datum_start,
 | 
				
			||||||
 | 
					            datum_stop,
 | 
				
			||||||
 | 
					            r,
 | 
				
			||||||
 | 
					            stop,
 | 
				
			||||||
 | 
					        ) = viz.datums_range()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        view = self.view
 | 
					        array = viz.shm.array
 | 
				
			||||||
 | 
					        index_field = renderer.fmtr.index_field
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if index_field == 'time':
 | 
				
			||||||
 | 
					            vr = viz.plot.viewRect()
 | 
				
			||||||
 | 
					            (
 | 
				
			||||||
 | 
					                abs_slc,
 | 
				
			||||||
 | 
					                read_slc,
 | 
				
			||||||
 | 
					                mask,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ) = viz.flume.slice_from_time(
 | 
				
			||||||
 | 
					                array,
 | 
				
			||||||
 | 
					                start_t=vr.left(),
 | 
				
			||||||
 | 
					                stop_t=vr.right(),
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            iv_arr = array[mask]
 | 
				
			||||||
 | 
					            index = iv_arr['index']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # these must be array-index-ints (hence the slice from time
 | 
				
			||||||
 | 
					        # above).
 | 
				
			||||||
 | 
					        x_start, x_stop = index[0], index[-1]
 | 
				
			||||||
 | 
					        l, lbar, rbar, r = viz.bars_range()
 | 
				
			||||||
 | 
					        view: ChartView = viz.plot.vb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (
 | 
					        if (
 | 
				
			||||||
            rbar < 0
 | 
					            rbar < 0
 | 
				
			||||||
            or l < xfirst
 | 
					            or l < x_start
 | 
				
			||||||
            or l < 0
 | 
					            or l < 0
 | 
				
			||||||
            or (rbar - lbar) < 6
 | 
					            or (rbar - lbar) < 6
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # TODO: set fixed bars count on screen that approx includes as
 | 
					            # TODO: set fixed bars count on screen that approx includes as
 | 
				
			||||||
            # many bars as possible before a downsample line is shown.
 | 
					            # many bars as possible before a downsample line is shown.
 | 
				
			||||||
            begin = xlast - bars_from_y
 | 
					            begin = x_stop - bars_from_y
 | 
				
			||||||
            view.setXRange(
 | 
					            view.setXRange(
 | 
				
			||||||
                min=begin,
 | 
					                min=begin,
 | 
				
			||||||
                max=xlast,
 | 
					                max=x_stop,
 | 
				
			||||||
                padding=0,
 | 
					                padding=0,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            # re-get range
 | 
					            # re-get range
 | 
				
			||||||
            l, lbar, rbar, r = self.bars_range()
 | 
					            l, lbar, rbar, r = viz.bars_range()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # we get the L1 spread label "length" in view coords
 | 
					        # we get the L1 spread label "length" in view coords
 | 
				
			||||||
        # terms now that we've scaled either by user control
 | 
					        # terms now that we've scaled either by user control
 | 
				
			||||||
| 
						 | 
					@ -1076,21 +1073,21 @@ class ChartPlotWidget(pg.PlotWidget):
 | 
				
			||||||
        # above.
 | 
					        # above.
 | 
				
			||||||
        if not y_offset:
 | 
					        if not y_offset:
 | 
				
			||||||
            marker_pos, l1_len = self.pre_l1_xs()
 | 
					            marker_pos, l1_len = self.pre_l1_xs()
 | 
				
			||||||
            end = xlast + l1_len + 1
 | 
					            end = x_stop + l1_len + 1
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            end = xlast + y_offset + 1
 | 
					            end = x_stop + y_offset + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        begin = end - (r - l)
 | 
					        begin = end - (r - l)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # for debugging
 | 
					        # for debugging
 | 
				
			||||||
        # print(
 | 
					        print(
 | 
				
			||||||
        #     # f'bars range: {brange}\n'
 | 
					            # f'bars range: {brange}\n'
 | 
				
			||||||
        #     f'xlast: {xlast}\n'
 | 
					            f'x_stop: {x_stop}\n'
 | 
				
			||||||
        #     f'marker pos: {marker_pos}\n'
 | 
					            f'marker pos: {marker_pos}\n'
 | 
				
			||||||
        #     f'l1 len: {l1_len}\n'
 | 
					            f'l1 len: {l1_len}\n'
 | 
				
			||||||
        #     f'begin: {begin}\n'
 | 
					            f'begin: {begin}\n'
 | 
				
			||||||
        #     f'end: {end}\n'
 | 
					            f'end: {end}\n'
 | 
				
			||||||
        # )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # remove any custom user yrange setttings
 | 
					        # remove any custom user yrange setttings
 | 
				
			||||||
        if self._static_yrange == 'axis':
 | 
					        if self._static_yrange == 'axis':
 | 
				
			||||||
| 
						 | 
					@ -1254,17 +1251,17 @@ class ChartPlotWidget(pg.PlotWidget):
 | 
				
			||||||
                **graphics_kwargs,
 | 
					                **graphics_kwargs,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        flow = self._vizs[data_key] = Viz(
 | 
					        viz = self._vizs[data_key] = Viz(
 | 
				
			||||||
            data_key,
 | 
					            data_key,
 | 
				
			||||||
            pi,
 | 
					            pi,
 | 
				
			||||||
            shm,
 | 
					            shm,
 | 
				
			||||||
            flume,
 | 
					            flume,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            is_ohlc=is_ohlc,
 | 
					            is_ohlc=is_ohlc,
 | 
				
			||||||
            # register curve graphics with this flow
 | 
					            # register curve graphics with this viz
 | 
				
			||||||
            graphics=graphics,
 | 
					            graphics=graphics,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        assert isinstance(flow.shm, ShmArray)
 | 
					        assert isinstance(viz.shm, ShmArray)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # TODO: this probably needs its own method?
 | 
					        # TODO: this probably needs its own method?
 | 
				
			||||||
        if overlay:
 | 
					        if overlay:
 | 
				
			||||||
| 
						 | 
					@ -1321,7 +1318,7 @@ class ChartPlotWidget(pg.PlotWidget):
 | 
				
			||||||
        # understand.
 | 
					        # understand.
 | 
				
			||||||
        pi.addItem(graphics)
 | 
					        pi.addItem(graphics)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return flow
 | 
					        return viz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def draw_ohlc(
 | 
					    def draw_ohlc(
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
| 
						 | 
					@ -1446,6 +1443,7 @@ class ChartPlotWidget(pg.PlotWidget):
 | 
				
			||||||
                r,
 | 
					                r,
 | 
				
			||||||
                last,
 | 
					                last,
 | 
				
			||||||
            ) = bars_range or viz.datums_range()
 | 
					            ) = bars_range or viz.datums_range()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            profiler(f'{self.name} got bars range')
 | 
					            profiler(f'{self.name} got bars range')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            key = round(lbar), round(rbar)
 | 
					            key = round(lbar), round(rbar)
 | 
				
			||||||
| 
						 | 
					@ -1470,4 +1468,4 @@ class ChartPlotWidget(pg.PlotWidget):
 | 
				
			||||||
        self,
 | 
					        self,
 | 
				
			||||||
        key: str,
 | 
					        key: str,
 | 
				
			||||||
    ) -> Viz:
 | 
					    ) -> Viz:
 | 
				
			||||||
        return self._vizs[key]
 | 
					        return self._vizs.get(key)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue