12
12
from __future__ import (absolute_import , division , print_function ,
13
13
unicode_literals )
14
14
15
+ import copy
15
16
import six
16
17
from six .moves import zip
17
18
@@ -1163,19 +1164,8 @@ def ignore(self, event):
1163
1164
return event .inaxes != self .ax
1164
1165
1165
1166
# If a button was pressed, check if the release-button is the
1166
- # same. If event is out of axis, limit the data coordinates to axes
1167
- # boundaries.
1168
- if event .button == self .eventpress .button and event .inaxes != self .ax :
1169
- (xdata , ydata ) = self .ax .transData .inverted ().transform_point (
1170
- (event .x , event .y ))
1171
- x0 , x1 = self .ax .get_xbound ()
1172
- y0 , y1 = self .ax .get_ybound ()
1173
- xdata = max (x0 , xdata )
1174
- xdata = min (x1 , xdata )
1175
- ydata = max (y0 , ydata )
1176
- ydata = min (y1 , ydata )
1177
- event .xdata = xdata
1178
- event .ydata = ydata
1167
+ # same.
1168
+ if event .button == self .eventpress .button :
1179
1169
return False
1180
1170
1181
1171
# If a button was pressed, check if the release-button is the
@@ -1206,17 +1196,31 @@ def update(self):
1206
1196
self .canvas .draw_idle ()
1207
1197
return False
1208
1198
1199
+ def _get_data (self , event ):
1200
+ """Limit the xdata and ydata to the axes limits"""
1201
+ x0 , x1 = self .ax .get_xbound ()
1202
+ y0 , y1 = self .ax .get_ybound ()
1203
+ xdata = max (x0 , event .xdata )
1204
+ xdata = min (x1 , xdata )
1205
+ ydata = max (y0 , event .ydata )
1206
+ ydata = min (y1 , ydata )
1207
+ return xdata , ydata
1208
+
1209
1209
def press (self , event ):
1210
1210
"""Button press handler"""
1211
1211
if not self .ignore (event ):
1212
- self .eventpress = event
1212
+ self .eventpress = copy .copy (event )
1213
+ self .eventpress .xdata , self .eventpress .ydata = (
1214
+ self ._get_data (event ))
1213
1215
return True
1214
1216
return False
1215
1217
1216
1218
def release (self , event ):
1217
1219
"""Button release event"""
1218
1220
if not self .ignore (event ) and not self .eventpress is None :
1219
- self .eventrelease = event
1221
+ self .eventrelease = copy .copy (event )
1222
+ self .eventrelease .xdata , self .eventrelease .ydata = (
1223
+ self ._get_data (event ))
1220
1224
return True
1221
1225
else :
1222
1226
return False
@@ -1363,10 +1367,11 @@ def press(self, event):
1363
1367
if self .span_stays :
1364
1368
self .stay_rect .set_visible (False )
1365
1369
1370
+ xdata , ydata = self ._get_data (event )
1366
1371
if self .direction == 'horizontal' :
1367
- self .pressv = event . xdata
1372
+ self .pressv = xdata
1368
1373
else :
1369
- self .pressv = event . ydata
1374
+ self .pressv = ydata
1370
1375
return False
1371
1376
1372
1377
def release (self , event ):
@@ -1386,10 +1391,11 @@ def release(self, event):
1386
1391
1387
1392
self .canvas .draw ()
1388
1393
vmin = self .pressv
1394
+ xdata , ydata = self ._get_data (event )
1389
1395
if self .direction == 'horizontal' :
1390
- vmax = event . xdata or self .prev [0 ]
1396
+ vmax = xdata or self .prev [0 ]
1391
1397
else :
1392
- vmax = event . ydata or self .prev [1 ]
1398
+ vmax = ydata or self .prev [1 ]
1393
1399
1394
1400
if vmin > vmax :
1395
1401
vmin , vmax = vmax , vmin
@@ -1404,7 +1410,7 @@ def onmove(self, event):
1404
1410
"""on motion notify event"""
1405
1411
if self .pressv is None or self .ignore (event ):
1406
1412
return
1407
- x , y = event . xdata , event . ydata
1413
+ x , y = self . _get_data ( event )
1408
1414
self .prev = x , y
1409
1415
if self .direction == 'horizontal' :
1410
1416
v = x
@@ -1423,10 +1429,11 @@ def onmove(self, event):
1423
1429
1424
1430
if self .onmove_callback is not None :
1425
1431
vmin = self .pressv
1432
+ xdata , ydata = self ._get_data (event )
1426
1433
if self .direction == 'horizontal' :
1427
- vmax = event . xdata or self .prev [0 ]
1434
+ vmax = xdata or self .prev [0 ]
1428
1435
else :
1429
- vmax = event . ydata or self .prev [1 ]
1436
+ vmax = ydata or self .prev [1 ]
1430
1437
1431
1438
if vmin > vmax :
1432
1439
vmin , vmax = vmax , vmin
@@ -1609,7 +1616,8 @@ def onmove(self, event):
1609
1616
"""on motion notify event if box/line is wanted"""
1610
1617
if self .eventpress is None or self .ignore (event ):
1611
1618
return
1612
- x , y = event .xdata , event .ydata # actual position (with
1619
+
1620
+ x , y = self ._get_data (event ) # actual position (with
1613
1621
# (button still pressed)
1614
1622
if self .drawtype == 'box' :
1615
1623
minx , maxx = self .eventpress .xdata , x # click-x and actual mouse-x
@@ -1695,7 +1703,7 @@ def onpress(self, event):
1695
1703
def press (self , event ):
1696
1704
if not _SelectorWidget .press (self , event ):
1697
1705
return
1698
- self .verts = [(event . xdata , event . ydata )]
1706
+ self .verts = [self . _get_data (event )]
1699
1707
self .line .set_visible (True )
1700
1708
1701
1709
def onrelease (self , event ):
@@ -1705,7 +1713,7 @@ def release(self, event):
1705
1713
if not _SelectorWidget .release (self , event ):
1706
1714
return
1707
1715
if self .verts is not None :
1708
- self .verts .append ((event . xdata , event . ydata ))
1716
+ self .verts .append (self . _get_data (event ))
1709
1717
self .onselect (self .verts )
1710
1718
self .line .set_data ([[], []])
1711
1719
self .line .set_visible (False )
@@ -1714,7 +1722,7 @@ def release(self, event):
1714
1722
def onmove (self , event ):
1715
1723
if self .ignore (event ) or self .verts is None :
1716
1724
return
1717
- self .verts .append ((event . xdata , event . ydata ))
1725
+ self .verts .append (self . _get_data (event ))
1718
1726
1719
1727
self .line .set_data (list (zip (* self .verts )))
1720
1728
0 commit comments