Skip to content

Commit 39ff708

Browse files
OceanWolftacaswell
authored andcommitted
Refactored making FigureManager a *figure* manager, plus added missing methods.
1 parent f046e01 commit 39ff708

File tree

6 files changed

+45
-30
lines changed

6 files changed

+45
-30
lines changed

lib/matplotlib/backend_bases.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import sys
4747
import time
4848
import warnings
49+
import weakref
4950

5051
import numpy as np
5152
import matplotlib.cbook as cbook
@@ -1745,7 +1746,7 @@ class FigureCanvasBase(object):
17451746
register_backend('tiff', 'matplotlib.backends.backend_agg',
17461747
'Tagged Image File Format')
17471748

1748-
def __init__(self, figure):
1749+
def __init__(self, figure, manager=None):
17491750
self._is_idle_drawing = True
17501751
self._is_saving = False
17511752
figure.set_canvas(self)
@@ -1760,6 +1761,7 @@ def __init__(self, figure):
17601761
self.scroll_pick_id = self.mpl_connect('scroll_event', self.pick)
17611762
self.mouse_grabber = None # the axes currently grabbing mouse
17621763
self.toolbar = None # NavigationToolbar2 will set me
1764+
self.manager = manager
17631765
self._is_idle_drawing = False
17641766

17651767
@contextmanager
@@ -2464,6 +2466,19 @@ def stop_event_loop_default(self):
24642466
"""
24652467
self._looping = False
24662468

2469+
def destroy(self):
2470+
pass
2471+
2472+
@property
2473+
def manager(self):
2474+
if self._manager is not None:
2475+
return self._manager()
2476+
2477+
@manager.setter
2478+
def manager(self, manager):
2479+
if manager is not None:
2480+
self._manager = weakref.ref(manager)
2481+
24672482

24682483
def key_press_handler(event, canvas, toolbar=None):
24692484
"""
@@ -2665,6 +2680,9 @@ def destroy(self):
26652680
def set_fullscreen(self, fullscreen):
26662681
pass
26672682

2683+
def set_default_size(self, w, h):
2684+
self.resize(w, h)
2685+
26682686
def resize(self, w, h):
26692687
""""For gui backends, resize the window (in pixels)."""
26702688
pass

lib/matplotlib/backend_managers.py

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,25 @@ def __init__(self, s, fm):
3030

3131

3232
class FigureManager(cbook.EventEmitter):
33-
def __init__(self, canvas, num):
33+
def __init__(self, figure, num):
3434
cbook.EventEmitter.__init__(self)
35-
self.canvas = canvas
36-
canvas.manager = self
3735
self.num = num
3836

39-
self.key_press_handler_id = self.canvas.mpl_connect('key_press_event',
40-
self.key_press)
41-
4237
self.mainloop = MainLoop()
4338
self.window = Window('Figure %d' % num)
4439
self.window.mpl_connect('window_destroy_event', self._destroy)
4540

41+
self.canvas = FigureCanvas(figure, self)
42+
43+
self.key_press_handler_id = self.canvas.mpl_connect('key_press_event',
44+
self.key_press)
45+
4646
w = int(self.canvas.figure.bbox.width)
4747
h = int(self.canvas.figure.bbox.height)
4848

4949
self.window.add_element_to_window(self.canvas, True, True, 0, True)
5050

51-
self.toolbar = self._get_toolbar(canvas)
51+
self.toolbar = self._get_toolbar()
5252
if self.toolbar is not None:
5353
h += self.window.add_element_to_window(self.toolbar,
5454
False, False, 0)
@@ -64,8 +64,6 @@ def notify_axes_change(fig):
6464
self.toolbar.update()
6565
self.canvas.figure.add_axobserver(notify_axes_change)
6666

67-
self.canvas.grab_focus()
68-
6967
def key_press(self, event):
7068
"""
7169
Implement the default mpl key bindings defined at
@@ -111,21 +109,21 @@ def set_window_title(self, title):
111109
"""
112110
self.window.set_window_title(title)
113111

114-
def show_popup(self, msg):
115-
"""
116-
Display message in a popup -- GUI only
117-
"""
118-
pass
119-
120-
def _get_toolbar(self, canvas):
112+
def _get_toolbar(self):
121113
# must be inited after the window, drawingArea and figure
122114
# attrs are set
123115
if rcParams['toolbar'] == 'toolbar2':
124-
toolbar = Toolbar2(canvas, self.window)
116+
toolbar = Toolbar2(self.canvas, self.window)
125117
else:
126118
toolbar = None
127119
return toolbar
128120

121+
def show_popup(self, msg):
122+
"""
123+
Display message in a popup -- GUI only
124+
"""
125+
pass
126+
129127

130128
class ToolEvent(object):
131129
"""Event for tool manipulation (add/remove)"""
@@ -553,17 +551,16 @@ def new_figure_manager(num, *args, **kwargs):
553551
Create a new figure manager instance
554552
"""
555553
show = kwargs.pop('show', None)
556-
if old_new_figure_manager is None:
554+
if old_new_figure_manager is None: # Test if we can use the new code
557555
FigureClass = kwargs.pop('FigureClass', Figure)
558556
thisFig = FigureClass(*args, **kwargs)
559557
manager = new_figure_manager_given_figure(num, thisFig)
560-
else: # TODO remove once Gcf removed from backends.
558+
else: # TODO remove once Gcf removed from backends. Default to old code.
561559
manager = old_new_figure_manager(num, *args, **kwargs)
562560
manager.mainloop = MainLoop
563561
return manager
564562

565563

566564
def new_figure_manager_given_figure(num, figure):
567-
canvas = FigureCanvas(figure)
568-
manager = FigureManager(canvas, num)
565+
manager = FigureManager(figure, num)
569566
return manager

lib/matplotlib/backends/backend_gtk3.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,8 @@ class FigureCanvasGTK3(Gtk.DrawingArea, FigureCanvasBase):
192192
Gdk.EventMask.POINTER_MOTION_HINT_MASK|
193193
Gdk.EventMask.SCROLL_MASK)
194194

195-
def __init__(self, figure):
196-
FigureCanvasBase.__init__(self, figure)
195+
def __init__(self, figure, manager=None):
196+
FigureCanvasBase.__init__(self, figure, manager)
197197
GObject.GObject.__init__(self)
198198

199199
self._idle_draw_id = 0

lib/matplotlib/backends/backend_gtk3agg.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121

2222
class FigureCanvasGTK3Agg(backend_gtk3.FigureCanvasGTK3,
2323
backend_agg.FigureCanvasAgg):
24-
def __init__(self, figure):
25-
backend_gtk3.FigureCanvasGTK3.__init__(self, figure)
24+
def __init__(self, figure, manager=None):
25+
backend_gtk3.FigureCanvasGTK3.__init__(self, figure, manager)
2626
self._bbox_queue = []
2727

2828
def _renderer_init(self):

lib/matplotlib/backends/backend_gtk3cairo.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ def set_context(self, ctx):
2222

2323
class FigureCanvasGTK3Cairo(backend_gtk3.FigureCanvasGTK3,
2424
backend_cairo.FigureCanvasCairo):
25-
def __init__(self, figure):
26-
backend_gtk3.FigureCanvasGTK3.__init__(self, figure)
25+
def __init__(self, figure, manager=None):
26+
backend_gtk3.FigureCanvasGTK3.__init__(self, figure, manager)
2727

2828
def _renderer_init(self):
2929
"""use cairo renderer"""

lib/matplotlib/figure.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1643,7 +1643,7 @@ def __setstate__(self, state):
16431643

16441644
if restore_to_pylab:
16451645
# lazy import to avoid circularity
1646-
# XXX clean on removal of Gcf from backends
1646+
# TODO clean on removal of Gcf from backends
16471647
import matplotlib.pyplot as plt
16481648
import matplotlib._pylab_helpers as pylab_helpers
16491649
import matplotlib.backend_managers as managers
@@ -1654,7 +1654,7 @@ def __setstate__(self, state):
16541654
self)
16551655
mgr.mainloop = plt._show
16561656
else:
1657-
mgr = managers.new_figure_manager_given_figure(num, self)
1657+
mgr = managers.FigureManager(self, num)
16581658

16591659
# XXX The following is a copy and paste from pyplot. Consider
16601660
# factoring to pylab_helpers

0 commit comments

Comments
 (0)