Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9275214

Browse files
committed
draggable legend now optionally blitted
svn path=/trunk/matplotlib/; revision=8105
1 parent ce36f80 commit 9275214

4 files changed

Lines changed: 38 additions & 17 deletions

File tree

examples/animation/draggable_legend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
ax.add_artist(ab)
3939

40-
d3 = ab.draggable()
40+
d3 = ab.draggable(use_blit=True)
4141

4242

4343
plt.show()

lib/matplotlib/legend.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@
3939

4040

4141
class DraggableLegend(DraggableOffsetBox):
42-
def __init__(self, legend):
42+
def __init__(self, legend, use_blit=False):
4343
self.legend=legend
44-
DraggableOffsetBox.__init__(self, legend, legend._legend_box)
44+
DraggableOffsetBox.__init__(self, legend, legend._legend_box,
45+
use_blit=use_blit)
4546

4647
def artist_picker(self, legend, evt):
4748
return self.legend.legendPatch.contains(evt)
@@ -917,7 +918,7 @@ def _find_best_position(self, width, height, renderer, consider=None):
917918
return ox, oy
918919

919920

920-
def draggable(self, state=None):
921+
def draggable(self, state=None, use_blit=False):
921922
"""
922923
Set the draggable state -- if state is
923924
@@ -939,7 +940,7 @@ def draggable(self, state=None):
939940

940941
if state:
941942
if self._draggable is None:
942-
self._draggable = DraggableLegend(self)
943+
self._draggable = DraggableLegend(self, use_blit)
943944
else:
944945
if self._draggable is not None:
945946
self._draggable.disconnect()

lib/matplotlib/offsetbox.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,10 +1416,11 @@ def finalize_offset(self):
14161416
the normalized axes coordinate and set a relavant attribute.
14171417
14181418
"""
1419-
def __init__(self, ref_artist):
1419+
def __init__(self, ref_artist, use_blit=False):
14201420
self.ref_artist = ref_artist
14211421
self.got_artist = False
1422-
1422+
self._use_blit = use_blit
1423+
14231424
self.canvas = self.ref_artist.figure.canvas
14241425
c2 = self.canvas.mpl_connect('pick_event', self.on_pick)
14251426
c3 = self.canvas.mpl_connect('button_release_event', self.on_release)
@@ -1432,23 +1433,44 @@ def on_motion(self, evt):
14321433
dx = evt.x - self.mouse_x
14331434
dy = evt.y - self.mouse_y
14341435
self.update_offset(dx, dy)
1436+
self.canvas.draw()
1437+
1438+
def on_motion_blit(self, evt):
1439+
if self.got_artist:
1440+
dx = evt.x - self.mouse_x
1441+
dy = evt.y - self.mouse_y
1442+
self.update_offset(dx, dy)
1443+
self.canvas.restore_region(self.background)
1444+
self.ref_artist.draw(self.ref_artist.figure._cachedRenderer)
1445+
self.canvas.blit(self.ref_artist.figure.bbox)
14351446

14361447
def on_pick(self, evt):
14371448
if evt.artist == self.ref_artist:
14381449

1439-
self.save_offset()
14401450
self.mouse_x = evt.mouseevent.x
14411451
self.mouse_y = evt.mouseevent.y
14421452
self.got_artist = True
14431453

1444-
self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion)
1454+
if self._use_blit:
1455+
self.ref_artist.set_animated(True)
1456+
self.canvas.draw()
1457+
self.background = self.canvas.copy_from_bbox(self.ref_artist.figure.bbox)
1458+
self.ref_artist.draw(self.ref_artist.figure._cachedRenderer)
1459+
self.canvas.blit(self.ref_artist.figure.bbox)
1460+
self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion_blit)
1461+
else:
1462+
self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion)
1463+
self.save_offset()
14451464

14461465
def on_release(self, event):
14471466
if self.got_artist:
14481467
self.finalize_offset()
14491468
self.got_artist = False
14501469
self.canvas.mpl_disconnect(self._c1)
14511470

1471+
if self._use_blit:
1472+
self.ref_artist.set_animated(False)
1473+
14521474
def disconnect(self):
14531475
'disconnect the callbacks'
14541476
for cid in self.cids:
@@ -1468,8 +1490,8 @@ def finalize_offset(self):
14681490

14691491

14701492
class DraggableOffsetBox(DraggableBase):
1471-
def __init__(self, ref_artist, offsetbox):
1472-
DraggableBase.__init__(self, ref_artist)
1493+
def __init__(self, ref_artist, offsetbox, use_blit=False):
1494+
DraggableBase.__init__(self, ref_artist, use_blit=use_blit)
14731495
self.offsetbox = offsetbox
14741496

14751497
def save_offset(self):
@@ -1482,7 +1504,6 @@ def save_offset(self):
14821504
def update_offset(self, dx, dy):
14831505
loc_in_canvas = self.offsetbox_x + dx, self.offsetbox_y + dy
14841506
self.offsetbox.set_offset(loc_in_canvas)
1485-
self.offsetbox.figure.canvas.draw()
14861507

14871508
def get_loc_in_canvas(self):
14881509

@@ -1496,8 +1517,8 @@ def get_loc_in_canvas(self):
14961517

14971518

14981519
class DraggableAnnotation(DraggableBase):
1499-
def __init__(self, annotation):
1500-
DraggableBase.__init__(self, annotation)
1520+
def __init__(self, annotation, use_blit=False):
1521+
DraggableBase.__init__(self, annotation, use_blit=use_blit)
15011522
self.annotation = annotation
15021523

15031524
def save_offset(self):
@@ -1519,7 +1540,6 @@ def update_offset(self, dx, dy):
15191540
ann.xytext = self.ox + dx, self.oy + dy
15201541
x, y = ann.xytext
15211542
xy = ann._get_xy(x, y, ann.textcoords)
1522-
self.canvas.draw()
15231543

15241544
def finalize_offset(self):
15251545
loc_in_canvas = self.annotation.xytext

lib/matplotlib/text.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,7 +1537,7 @@ def _check_xy(self, renderer, xy_pixel):
15371537
return True
15381538

15391539

1540-
def draggable(self, state=None):
1540+
def draggable(self, state=None, use_blit=False):
15411541
"""
15421542
Set the draggable state -- if state is
15431543
@@ -1560,7 +1560,7 @@ def draggable(self, state=None):
15601560

15611561
if state:
15621562
if self._draggable is None:
1563-
self._draggable = DraggableAnnotation(self)
1563+
self._draggable = DraggableAnnotation(self, use_blit)
15641564
else:
15651565
if self._draggable is not None:
15661566
self._draggable.disconnect()

0 commit comments

Comments
 (0)