From 1aafdeb7d4c681adfb3523dbb163f2830136d838 Mon Sep 17 00:00:00 2001 From: Tony S Yu Date: Thu, 13 Dec 2012 00:23:30 -0500 Subject: [PATCH] ENH: Overhaul callback system. Remove `on_update` callback and add `on_move` and `on_release` callbacks arguments. Also, prefix callback functions with `callback_` for clarity. --- skimage/viewer/canvastools/base.py | 20 ++++++++++---------- skimage/viewer/canvastools/linetool.py | 25 +++++++++++++++---------- skimage/viewer/canvastools/recttool.py | 15 ++++++++------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/skimage/viewer/canvastools/base.py b/skimage/viewer/canvastools/base.py index 2642df57..37329d6a 100644 --- a/skimage/viewer/canvastools/base.py +++ b/skimage/viewer/canvastools/base.py @@ -9,13 +9,18 @@ except ImportError: __all__ = ['CanvasToolBase', 'ToolHandles'] +def _pass(*args): + pass + + class CanvasToolBase(object): """Base canvas tool for matplotlib axes. Parameters ---------- """ - def __init__(self, ax, useblit=True, on_update=None, on_enter=None): + def __init__(self, ax, on_move=None, on_enter=None, on_release=None, + useblit=True): self.ax = ax self.canvas = ax.figure.canvas self.cids = [] @@ -26,13 +31,9 @@ class CanvasToolBase(object): self.connect_event('draw_event', self._blit_on_draw_event) self.useblit = useblit - if on_update is None: - on_update = lambda *args: None - self.on_update = on_update - - if on_enter is None: - on_enter = lambda *args: None - self.on_enter = on_enter + self.callback_on_move = _pass if on_move is None else on_move + self.callback_on_enter = _pass if on_enter is None else on_enter + self.callback_on_release = _pass if on_release is None else on_release self.connect_event('key_press_event', self._on_key_press) @@ -81,11 +82,10 @@ class CanvasToolBase(object): self.canvas.blit(self.ax.bbox) else: self.canvas.draw_idle() - self.on_update(self.geometry) def _on_key_press(self, event): if event.key == 'enter': - self.on_enter(self.geometry) + self.callback_on_enter(self.geometry) self.set_visible(False) self.redraw() diff --git a/skimage/viewer/canvastools/linetool.py b/skimage/viewer/canvastools/linetool.py index b19c3736..fba44b69 100644 --- a/skimage/viewer/canvastools/linetool.py +++ b/skimage/viewer/canvastools/linetool.py @@ -15,7 +15,7 @@ class LineTool(CanvasToolBase): """ Parameters ---------- - on_update : function + on_move : function Function accepting end points of line as the only argument. Attributes @@ -23,10 +23,10 @@ class LineTool(CanvasToolBase): end_pts : 2D array End points of line ((x1, y1), (x2, y2)). """ - def __init__(self, ax, x, y, on_update=None, on_enter=None, maxdist=10, - lineprops=None): - super(LineTool, self).__init__(ax, on_update=on_update, - on_enter=on_enter) + def __init__(self, ax, x, y, on_move=None, on_enter=None, on_release=None, + maxdist=10, lineprops=None): + super(LineTool, self).__init__(ax, on_move=on_move, on_enter=on_enter, + on_release=on_release) props = dict(color='r', linewidth=1, alpha=0.4, solid_capstyle='butt') props.update(lineprops if lineprops is not None else {}) @@ -47,7 +47,7 @@ class LineTool(CanvasToolBase): def on_enter(pts): x, y = np.transpose(pts) print "length = %0.2f" % np.sqrt(np.diff(x)**2 + np.diff(y)**2) - self.on_enter = on_enter + self.callback_on_enter = on_enter self.connect_event('button_press_event', self.on_mouse_press) self.connect_event('button_release_event', self.on_mouse_release) @@ -68,6 +68,7 @@ class LineTool(CanvasToolBase): if event.button != 1: return self._active_pt = None + self.callback_on_release(self.geometry) def on_move(self, event): if event.button != 1 or self._active_pt is None: @@ -75,6 +76,7 @@ class LineTool(CanvasToolBase): if not self.ax.in_axes(event): return self.update(event.xdata, event.ydata) + self.callback_on_move(self.geometry) def update(self, x, y): if x is not None: @@ -92,10 +94,13 @@ class LineTool(CanvasToolBase): class ThickLineTool(LineTool): - def __init__(self, ax, x, y, on_update=None, on_enter=None, maxdist=10, - lineprops=None): - super(ThickLineTool, self).__init__(ax, x, y, on_update=on_update, - on_enter=on_enter, maxdist=maxdist, + def __init__(self, ax, x, y, on_move=None, on_enter=None, on_release=None, + maxdist=10, lineprops=None): + super(ThickLineTool, self).__init__(ax, x, y, + on_move=on_move, + on_enter=on_enter, + on_release=on_release, + maxdist=maxdist, lineprops=lineprops) self.connect_event('scroll_event', self.on_scroll) diff --git a/skimage/viewer/canvastools/recttool.py b/skimage/viewer/canvastools/recttool.py index ba189b4b..5eeb6f23 100644 --- a/skimage/viewer/canvastools/recttool.py +++ b/skimage/viewer/canvastools/recttool.py @@ -25,7 +25,6 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase): rectprops : dict Properties for :class:`matplotlib.patches.Rectangle`. This class redefines defaults in :class:`matplotlib.widgets.RectangleSelector`. - kwargs : see :class:`matplotlib.widgets.RectangleSelector`. Attributes ---------- @@ -33,10 +32,10 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase): Rectangle extents: (xmin, xmax, ymin, ymax). """ - def __init__(self, ax, on_update=None, on_enter=None, rectprops=None, - maxdist=10, **kwargs): - CanvasToolBase.__init__(self, ax, on_update=on_update, - on_enter=on_enter) + def __init__(self, ax, on_move=None, on_enter=None, on_release=None, + maxdist=10, rectprops=None): + CanvasToolBase.__init__(self, ax, on_move=on_move, + on_enter=on_enter, on_release=on_release) props = dict(edgecolor=None, facecolor='r', alpha=0.15) props.update(rectprops if rectprops is not None else {}) @@ -56,7 +55,7 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase): if on_enter is None: def on_enter(extents): print "(xmin=%.3g, xmax=%.3g, ymin=%.3g, ymax=%.3g)" % extents - self.on_enter = on_enter + self.callback_on_enter = on_enter props = dict(mec=props['edgecolor']) self._corner_order = ['NW', 'NE', 'SE', 'SW'] @@ -112,6 +111,7 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase): # Undo hiding of rectangle and redraw. self.set_visible(True) self.redraw() + self.callback_on_release(self.geometry) def press(self, event): self._set_active_handle(event) @@ -176,6 +176,7 @@ class RectangleTool(mwidgets.RectangleSelector, CanvasToolBase): self._edge_handles.set_data(*self.edge_centers) self.redraw() + self.callback_on_move(self.geometry) @property def geometry(self): @@ -192,4 +193,4 @@ if __name__ == '__main__': rect_tool = RectangleTool(ax) plt.show() print "Final selection:", - rect_tool.on_enter(rect_tool.extents) + rect_tool.callback_on_enter(rect_tool.extents)