8000 MEP22 Navigation toolbar coexistence TODELETE by fariza · Pull Request #2759 · matplotlib/matplotlib · GitHub
[go: up one dir, main page]

Skip to content

MEP22 Navigation toolbar coexistence TODELETE #2759

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 38 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
dda0cdc
navigation and toolbar coexistence
fariza Jan 23, 2014
10f5dc7
mod keypress in figuremanager
fariza Jan 23, 2014
08a6020
extra files
fariza Jan 23, 2014
c6c0ad3
helper methods in toolbar and navigation
fariza Jan 24, 2014
1fc29fa
Adding doc to base methods
fariza Jan 24, 2014
979875e
property for active_toggle
fariza Jan 26, 2014
c5c4f0f
simulate click
fariza Jan 27, 2014
97dfda7
pep8 backend_tools
fariza Jan 27, 2014
6b647ad
activate renamed to trigger
fariza Jan 28, 2014
99667aa
toggle tools using enable/disable from its trigger method
fariza Jan 29, 2014
6c19579
simplifying _handle_toggle
fariza Jan 29, 2014
0495aac
reducing number of locks
fariza Jan 29, 2014
fb46fc1
pep8 correction
fariza Jan 29, 2014
d49c431
changing toggle and persistent attributes for issubclass
fariza Feb 4, 2014
5ba6210
bug in combined key press
fariza Feb 4, 2014
7ca8626
untoggle zoom and pan from keypress while toggled
fariza Feb 4, 2014
dcc0f16
classmethods for default tools modification
fariza Feb 6, 2014
bc703e0
six fixes
fariza Apr 24, 2014
68dc711
adding zaxis and some pep8
fariza May 1, 2014
bb9f1c7
removing legacy method dynamic update
fariza May 6, 2014
2c2e649
tk backend
fariza May 6, 2014
a99367f
pep8
fariza May 6, 2014
3d1be34
example working with Tk
fariza May 6, 2014
afdd34c
cleanup
fariza May 7, 2014
5b49c7a
duplicate code in keymap tool initialization
fariza Jul 24, 2014
773db88
grammar corrections
fariza Jul 24, 2014
2ca6926
moving views and positions to tools
fariza Jul 24, 2014
661417d
The views positions mixin automatically adds the clear as axobserver
fariza Jul 25, 2014
90ab64f
bug when navigation was not defined
fariza Jul 25, 2014
55dd149
Small refactor so that we first initiate the Navigation (ToolManager)…
OceanWolf Jul 28, 2014
15ac091
Update for Sphinx documentation
OceanWolf Jul 28, 2014
8cd241c
Moved default_tool initilisation to FigureManagerBase and cleaned.
OceanWolf Jul 29, 2014
39f5b74
Fix navigation
OceanWolf Jul 29, 2014
b20dade
Temporary fix to backends
OceanWolf Jul 29, 2014
ff94301
Merge pull request #1 from OceanWolf/navigation-toolbar-coexistence-e…
fariza Jul 29, 2014
2cb4501
removing persistent tools
fariza Sep 3, 2014
9d3c977
removing unregister
fariza Sep 4, 2014
6e0b7e6
change cursor inmediately after toggle
fariza Sep 5, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
tk backend
  • Loading branch information
fariza committed May 6, 2014
commit 2c2e649070b707d1aff721c6ff82931e5c4d282c
3 changes: 2 additions & 1 deletion examples/user_interfaces/navigation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import matplotlib
matplotlib.use('GTK3Cairo')
# matplotlib.use('GTK3Cairo')
matplotlib.use('TkAGG')
matplotlib.rcParams['toolbar'] = 'navigation'
import matplotlib.pyplot as plt
from matplotlib.backend_tools import ToolBase
Expand Down
7 changes: 6 additions & 1 deletion lib/matplotlib/backend_bases.py
Original file line number Diff line number Diff line change
Expand Up @@ -3379,6 +3379,9 @@ def add_tool(self, tool):
"""

tool_cls = self._get_cls_to_instantiate(tool)
if tool_cls is False:
warnings.warn('Impossible to find class for %s' % str(tool))
return
name = tool_cls.name

if name is None:
Expand All @@ -3400,9 +3403,11 @@ def add_tool(self, tool):
self._keys[k] = name

if self.toolbar and tool_cls.position is not None:
# TODO: better search for images, they are not always in the
# datapath
basedir = os.path.join(rcParams['datapath'], 'images')
if tool_cls.image is not None:
fname = os.path.join(basedir, tool_cls.image + '.png')
fname = os.path.join(basedir, tool_cls.image)
else:
fname = None
toggle = issubclass(tool_cls, tools.ToolToggleBase)
Expand Down
14 changes: 7 additions & 7 deletions lib/matplotlib/backend_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ class ToolHome(ToolBase):

description = 'Reset original view'
name = 'Home'
image = 'home'
image = 'home.png'
keymap = rcParams['keymap.home']
position = -1

Expand All @@ -312,7 +312,7 @@ class ToolBack(ToolBase):

description = 'Back to previous view'
name = 'Back'
image = 'back'
image = 'back.png'
keymap = rcParams['keymap.back']
position = -1

Expand All @@ -328,7 +328,7 @@ class ToolForward(ToolBase):

description = 'Forward to next view'
name = 'Forward'
image = 'forward'
image = 'forward.png'
keymap = rcParams['keymap.forward']
position = -1

Expand All @@ -344,7 +344,7 @@ class ConfigureSubplotsBase(ToolPersistentBase):

description = 'Configure subplots'
name = 'Subplots'
image = 'subplots'
image = 'subplots.png'
position = -1


Expand All @@ -353,7 +353,7 @@ class SaveFigureBase(ToolBase):

description = 'Save the figure'
name = 'Save'
image = 'filesave'
image = 'filesave.png'
position = -1
keymap = rcParams['keymap.save']

Expand All @@ -363,7 +363,7 @@ class ToolZoom(ToolToggleBase):

description = 'Zoom to rectangle'
name = 'Zoom'
image = 'zoom_to_rect'
image = 'zoom_to_rect.png'
position = -1
keymap = rcParams['keymap.zoom']
cursor = cursors.SELECT_REGION
Expand Down Expand Up @@ -597,7 +597,7 @@ class ToolPan(ToolToggleBase):
keymap = rcParams['keymap.pan']
name = 'Pan'
description = 'Pan axes with left mouse, zoom with right'
image = 'move'
image = 'move.png'
position = -1
cursor = cursors.MOVE

Expand Down
193 changes: 187 additions & 6 deletions lib/matplotlib/backends/backend_tkagg.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
from matplotlib.backend_bases import RendererBase, GraphicsContextBase
from matplotlib.backend_bases import FigureManagerBase, FigureCanvasBase
from matplotlib.backend_bases import NavigationToolbar2, cursors, TimerBase
from matplotlib.backend_bases import ShowBase
from matplotlib.backend_bases import ShowBase, ToolbarBase, NavigationBase
from matplotlib.backend_tools import SaveFigureBase, ConfigureSubplotsBase
from matplotlib._pylab_helpers import Gcf

from matplotlib.figure import Figure
Expand Down Expand Up @@ -531,23 +532,34 @@ def __init__(self, canvas, num, window):
self.set_window_title("Figure %d" % num)
self.canvas = canvas
self._num = num
self.navigation = None
_, _, w, h = canvas.figure.bbox.bounds
w, h = int(w), int(h)
self.window.minsize(int(w*3/4),int(h*3/4))
if matplotlib.rcParams['toolbar']=='toolbar2':
self.toolbar = NavigationToolbar2TkAgg( canvas, self.window )
else:
self.toolbar = None
self.toolbar = self._get_toolbar(canvas)
if self.toolbar is not None:
self.toolbar.update()
self.canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
self._shown = False

def notify_axes_change(fig):
'this will be called whenever the current axes is changed'
if self.toolbar != None: self.toolbar.update()
if self.navigation is not None:
self.navigation.update()
elif self.toolbar is not None: self.toolbar.update()
self.canvas.figure.add_axobserver(notify_axes_change)

def _get_toolbar(self, canvas):
if matplotlib.rcParams['toolbar']=='toolbar2':
toolbar = NavigationToolbar2TkAgg( canvas, self.window )
elif matplotlib.rcParams['toolbar'] == 'navigation':
self.navigation = NavigationTk(canvas, ToolbarTk)
toolbar = self.navigation.toolbar
else:
self.navigation = NavigationTk(canvas, None)
toolbar = None
return toolbar

def resize(self, width, height=None):
# before 09-12-22, the resize method takes a single *event*
# parameter. On the other hand, the resize method of other
Expand Down Expand Up @@ -874,5 +886,174 @@ def hidetip(self):
if tw:
tw.destroy()


class NavigationTk(NavigationBase):
def __init__(self, *args, **kwargs):
NavigationBase.__init__(self, *args, **kwargs)

def set_cursor(self, cursor):
self.canvas.manager.window.configure(cursor=cursord[cursor])

def draw_rubberband(self, event, caller, x0, y0, x1, y1):
if not self.canvas.widgetlock.available(caller):
return
height = self.canvas.figure.bbox.height
y0 = height-y0
y1 = height-y1
try: self.lastrect
except AttributeError: pass
else: self.canvas._tkcanvas.delete(self.lastrect)
self.lastrect = self.canvas._tkcanvas.create_rectangle(x0, y0, x1, y1)

def remove_rubberband(self, event, caller):
try: self.lastrect
except AttributeError: pass
else:
self.canvas._tkcanvas.delete(self.lastrect)
del self.lastrect


class ToolbarTk(ToolbarBase, Tk.Frame):
def __init__(self, manager):
ToolbarBase.__init__(self, manager)
xmin, xmax = self.manager.canvas.figure.bbox.intervalx
height, width = 50, xmax-xmin
Tk.Frame.__init__(self, master=self.manager.window,
width=int(width), height=int(height),
borderwidth=2)
self._toolitems = {}
self._add_message()

def _add_toolitem(self, name, tooltip_text, image_file, position,
toggle):

button = self._Button(name, image_file, toggle)
if tooltip_text is not None:
ToolTip.createToolTip(button, tooltip_text)
self._toolitems[name] = button

def _Button(self, text, file, toggle):
extension='.ppm'
if file is not None:
img_file = os.path.join(rcParams['datapath'], 'images', file )
im = Tk.PhotoImage(master=self, file=img_file)
else:
im = None

if not toggle:
b = Tk.Button(
master=self, text=text, padx=2, pady=2, image=im,
command=lambda: self._button_click(text))
else:
b = Tk.Checkbutton(master=self, text=text, padx=2, pady=2,
image=im, indicatoron=False,
command=lambda: self._button_click(text))
b._ntimage = im
b.pack(side=Tk.LEFT)
return b

def _button_click(self, name):
self.manager.navigation._toolbar_callback(name)

def _toggle(self, name, callback=False):
if name not in self._toolitems:
self.set_message('%s Not in toolbar' % name)
return
self._toolitems[name].toggle()
if callback:
self._button_click(name)

def _add_message(self):
self.message = Tk.StringVar(master=self)
self._message_label = Tk.Label(master=self, textvariable=self.message)
self._message_label.pack(side=Tk.RIGHT)
self.pack(side=Tk.BOTTOM, fill=Tk.X)

def set_message(self, s):
self.message.set(s)

def _remove_toolitem(self, name):
self._toolitems[name].pack_forget()
del self._toolitems[name]

def set_toolitem_visibility(self, name, visible):
pass

class SaveFigureTk(SaveFigureBase):
def trigger(self, *args):
from six.moves import tkinter_tkfiledialog, tkinter_messagebox
filetypes = self.figure.canvas.get_supported_filetypes().copy()
default_filetype = self.figure.canvas.get_default_filetype()

# Tk doesn't provide a way to choose a default filetype,
# so we just have to put it first
default_filetype_name = filetypes[default_filetype]
del filetypes[default_filetype]

sorted_filetypes = list(six.iteritems(filetypes))
sorted_filetypes.sort()
sorted_filetypes.insert(0, (default_filetype, default_filetype_name))

tk_filetypes = [
(name, '*.%s' % ext) for (ext, name) in sorted_filetypes]

# adding a default extension seems to break the
# asksaveasfilename dialog when you choose various save types
# from the dropdown. Passing in the empty string seems to
# work - JDH!
#defaultextension = self.figure.canvas.get_default_filetype()
defaultextension = ''
initialdir = rcParams.get('savefig.directory', '')
initialdir = os.path.expanduser(initialdir)
initialfile = self.figure.canvas.get_default_filename()
fname = tkinter_tkfiledialog.asksaveasfilename(
master=self.figure.canvas.manager.window,
title='Save the figure',
filetypes=tk_filetypes,
defaultextension=defaultextension,
initialdir=initialdir,
initialfile=initialfile,
)

if fname == "" or fname == ():
return
else:
if initialdir == '':
# explicitly missing key or empty str signals to use cwd
rcParams['savefig.directory'] = initialdir
else:
# save dir for next time
rcParams['savefig.directory'] = os.path.dirname(six.text_type(fname))
try:
# This method will handle the delegation to the correct type
self.figure.canvas.print_figure(fname)
except Exception as e:
tkinter_messagebox.showerror("Error saving file", str(e))


class ConfigureSubplotsTk(ConfigureSubplotsBase):
def __init__(self, *args, **kwargs):
ConfigureSubplotsBase.__init__(self, *args, **kwargs)
toolfig = Figure(figsize=(6,3))
self.window = Tk.Tk()

canvas = FigureCanvasTkAgg(toolfig, master=self.window)
toolfig.subplots_adjust(top=0.9)
tool = SubplotTool(self.figure, toolfig)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
self.window.protocol("WM_DELETE_WINDOW", self.destroy)

def trigger(self, event):
self.window.lift()

def destroy(self, *args, **kwargs):
self.unregister()
self.window.destroy()


SaveFigure = SaveFigureTk
ConfigureSubplots = ConfigureSubplotsTk

FigureCanvas = FigureCanvasTkAgg
FigureManager = FigureManagerTkAgg
0