diff --git a/fsl/fslview/controls/timeseriescontrolpanel.py b/fsl/fslview/controls/timeseriescontrolpanel.py index 7a853d7fae7f66962bd7a4922b45f000e608f50b..fbc77512f7609833c7ef984e7e293597f8ee4c1c 100644 --- a/fsl/fslview/controls/timeseriescontrolpanel.py +++ b/fsl/fslview/controls/timeseriescontrolpanel.py @@ -34,10 +34,11 @@ class TimeSeriesControlPanel(fslpanel.FSLViewPanel): self.__xlabel = props.makeWidget(self, tsPanel, 'xlabel') self.__ylabel = props.makeWidget(self, tsPanel, 'ylabel') - self.__xmin = props.makeWidget(self, tsPanel, 'xmin') - self.__xmax = props.makeWidget(self, tsPanel, 'xmax') - self.__ymin = props.makeWidget(self, tsPanel, 'ymin') - self.__ymax = props.makeWidget(self, tsPanel, 'ymax') + limits = props.makeListWidgets(self, tsPanel, 'limits') + self.__xmin = limits[0] + self.__xmax = limits[1] + self.__ymin = limits[2] + self.__ymax = limits[3] self.__lblLabel = wx.StaticText(self) self.__xlblLabel = wx.StaticText(self) diff --git a/fsl/fslview/views/timeseriespanel.py b/fsl/fslview/views/timeseriespanel.py index 2f77c253082f734142b04e5eaf93b4c45aceb40c..fce9c00a4228226a9752fa8dd1e4a0a02b10b029 100644 --- a/fsl/fslview/views/timeseriespanel.py +++ b/fsl/fslview/views/timeseriespanel.py @@ -70,10 +70,7 @@ class TimeSeriesPanel(plotpanel.PlotPanel): smooth = props.Boolean(default=False) xlabel = props.String() ylabel = props.String() - xmin = props.Real() - xmax = props.Real() - ymin = props.Real() - ymax = props.Real() + limits = props.Bounds(ndims=2) def export(self, *a): @@ -194,30 +191,24 @@ class TimeSeriesPanel(plotpanel.PlotPanel): def __calcLimits(self, xlims, ylims): - if (self.autoScale and self.__mouseDown is None) or \ - (self.xmin == self.xmax) or \ - (self.ymin == self.ymax): - xmin = min([lim[0] for lim in xlims]) - xmax = max([lim[1] for lim in xlims]) - ymin = min([lim[0] for lim in ylims]) - ymax = max([lim[1] for lim in ylims]) - else: - xmin = self.xmin - xmax = self.xmax - ymin = self.ymin - ymax = self.ymax - - for prop in ['xmin', 'xmax', 'ymin', 'ymax']: - self.disableListener(prop, self._name) - self.xmin = xmin - self.xmax = xmax - self.ymin = ymin - self.ymax = ymax - for prop in ['xmin', 'xmax', 'ymin', 'ymax']: - self.enableListener(prop, self._name) + xmin = min([lim[0] for lim in xlims]) + xmax = max([lim[1] for lim in xlims]) + ymin = min([lim[0] for lim in ylims]) + ymax = max([lim[1] for lim in ylims]) - return (xmin, xmax), (ymin, ymax) + if (self.autoScale and self.__mouseDown is None): + + self.disableListener('limits', self._name) + self.limits[:] = [xmin, xmax, ymin, ymax] + self.enableListener('limits', self._name) + else: + xmin = self.limits.xlo + xmax = self.limits.xhi + ymin = self.limits.ylo + ymax = self.limits.yhi + + return (xmin, xmax), (ymin, ymax) def _draw(self, *a): @@ -380,8 +371,7 @@ class TimeSeriesPanel(plotpanel.PlotPanel): else: self.__zoomMode = False self.__mouseDown = ev.xdata, ev.ydata - self.__mouseDownLimits = ((self.xmin, self.xmax), - (self.ymin, self.ymax)) + self.__mouseDownLimits = (self.limits.x, self.limits.y) def __onMouseUp(self, ev): @@ -398,16 +388,9 @@ class TimeSeriesPanel(plotpanel.PlotPanel): if self.__zoomMode: newxlim, newylim = self.__zoomLimits(ev) else: newxlim, newylim = self.__panLimits( ev) - for prop in ['xmin', 'xmax', 'ymin', 'ymax']: - self.disableListener(prop, self._name) - - self.xmin = newxlim[0] - self.xmax = newxlim[1] - self.ymin = newylim[0] - self.ymax = newylim[1] - - for prop in ['xmin', 'xmax', 'ymin', 'ymax']: - self.enableListener(prop, self._name) + self.disableListener('limits', self._name) + self.limits[:] = newxlim + newylim + self.enableListener('limits', self._name) self._draw() @@ -422,14 +405,23 @@ class TimeSeriesPanel(plotpanel.PlotPanel): xmid = xlim[0] + 0.5 * xlen ymid = ylim[0] + 0.5 * ylen - xdist = 2 * (ev.xdata - self.__mouseDown[0]) - ydist = 2 * (ev.ydata - self.__mouseDown[1]) + mdx, mdy = self.__mouseDown + evx, evy = ev.xdata, ev.ydata + + mdx = (mdx - xlim[0]) / xlen + mdy = (mdy - ylim[0]) / ylen + + evx = (evx - self.limits.xlo) / self.limits.xlen + evy = (evy - self.limits.ylo) / self.limits.ylen + + xdist = 2 * xlen * (evx - mdx) + ydist = 2 * ylen * (evy - mdy) - newxlen = xlen * xlen / (xlen + xdist) - newylen = ylen * ylen / (ylen + ydist) + newxlen = abs(xlen - xdist) + newylen = abs(ylen - ydist) - newxlim = (xmid - newxlen * 0.5, xmid + newxlen * 0.5) - newylim = (ymid - newylen * 0.5, ymid + newylen * 0.5) + newxlim = [xmid - newxlen * 0.5, xmid + newxlen * 0.5] + newylim = [ymid - newylen * 0.5, ymid + newylen * 0.5] return newxlim, newylim @@ -439,5 +431,5 @@ class TimeSeriesPanel(plotpanel.PlotPanel): xdist = self.__mouseDown[0] - mouseEv.xdata ydist = self.__mouseDown[1] - mouseEv.ydata - return ((self.xmin + xdist, self.xmax + xdist), - (self.ymin + ydist, self.ymax + ydist)) + return ((self.limits.xlo + xdist, self.limits.xhi + xdist), + (self.limits.ylo + ydist, self.limits.yhi + ydist))