1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#----------------------------------------------------------------------------
# Name: NavCanvas.py
# Purpose: Combines FloatCanvas with Navigation controls
#
# Author:
#
# Created:
# Version:
# Date:
# Licence:
# Tags: phoenix-port, unittest, documented, py3-port
#----------------------------------------------------------------------------
"""
Combines :class:`~lib.floatcanvas.FloatCanvas.FloatCanvas` with Navigation
controls onto a :class:`Panel`
In the following very simple sample ``self`` is a frame, but it could be another
container type control::
from wx.lib.floatcanvas import NavCanvas, FloatCanvas
#Add the Canvas
self.Canvas = NavCanvas.NavCanvas(self, -1,
size=(500, 500),
ProjectionFun=None,
Debug=0,
BackgroundColor="White",
).Canvas
# add a circle
cir = FloatCanvas.Circle((10, 10), 100)
self.Canvas.AddObject(cir)
# add a rectangle
rect = FloatCanvas.Rectangle((110, 10), (100, 100), FillColor='Red')
self.Canvas.AddObject(rect)
self.Canvas.Draw()
Many samples are available in the `wxPhoenix/samples/floatcanvas` folder.
"""
import wx
from . import FloatCanvas, Resources, GUIMode
class NavCanvas(wx.Panel):
"""
:class:`~lib.floatcanvas.NavCanvas.NavCanvas` encloses a
:class:`~lib.floatcanvas.FloatCanvas.FloatCanvas` in a :class:`Panel` and
adds a Navigation toolbar.
"""
def __init__(self,
parent,
id = wx.ID_ANY,
size = wx.DefaultSize,
**kwargs):
"""
Default class constructor.
:param wx.Window `parent`: parent window. Must not be ``None``;
:param integer `id`: window identifier. A value of -1 indicates a default value;
:param `size`: a tuple or :class:`wx.Size`
:param `**kwargs`: will be passed on to :class:`~lib.floatcanvas.FloatCanvas.FloatCanvas`
"""
wx.Panel.__init__(self, parent, id, size=size)
self.Modes = [("Pointer", GUIMode.GUIMouse(), Resources.getPointerBitmap()),
("Zoom In", GUIMode.GUIZoomIn(), Resources.getMagPlusBitmap()),
("Zoom Out", GUIMode.GUIZoomOut(), Resources.getMagMinusBitmap()),
("Pan", GUIMode.GUIMove(), Resources.getHandBitmap()),
]
self.BuildToolbar()
## Create the vertical sizer for the toolbar and Panel
box = wx.BoxSizer(wx.VERTICAL)
box.Add(self.ToolBar, 0, wx.ALL | wx.ALIGN_LEFT | wx.GROW, 4)
self.Canvas = FloatCanvas.FloatCanvas(self, **kwargs)
box.Add(self.Canvas, 1, wx.GROW)
self.SetSizerAndFit(box)
# default to first mode
#self.ToolBar.ToggleTool(self.PointerTool.GetId(), True)
self.Canvas.SetMode(self.Modes[0][1])
return None
def BuildToolbar(self):
"""
Build the default tool bar, can be over-ridden in a subclass to add
extra tools etc.
"""
tb = wx.ToolBar(self)
self.ToolBar = tb
tb.SetToolBitmapSize((24,24))
self.AddToolbarModeButtons(tb, self.Modes)
self.AddToolbarZoomButton(tb)
tb.Realize()
## fixme: remove this when the bug is fixed!
#wx.CallAfter(self.HideShowHack) # this required on wxPython 2.8.3 on OS-X
def AddToolbarModeButtons(self, tb, Modes):
"""
Add the mode buttons to the tool bar.
:param ToolBar `tb`: the toolbar instance
:param list `Modes`: a list of modes to add, out of the box valid modes
are subclassed from :class:`~lib.floatcanvas.GUIMode.GUIBase` or modes
can also be user defined.
"""
self.ModesDict = {}
for Mode in Modes:
tool = tb.AddTool(wx.ID_ANY, label=Mode[0],
shortHelp=Mode[0],
bitmap=wx.BitmapBundle(Mode[2]),
kind=wx.ITEM_RADIO)
self.Bind(wx.EVT_TOOL, self.SetMode, tool)
self.ModesDict[tool.GetId()]=Mode[1]
#self.ZoomOutTool = tb.AddRadioTool(wx.ID_ANY, bitmap=Resources.getMagMinusBitmap(), shortHelp = "Zoom Out")
#self.Bind(wx.EVT_TOOL, lambda evt : self.SetMode(Mode=self.GUIZoomOut), self.ZoomOutTool)
def AddToolbarZoomButton(self, tb):
"""
Add the zoom button to the tool bar.
:param ToolBar `tb`: the toolbar instance
"""
tb.AddSeparator()
self.ZoomButton = wx.Button(tb, label="Zoom To Fit")
tb.AddControl(self.ZoomButton)
self.ZoomButton.Bind(wx.EVT_BUTTON, self.ZoomToFit)
def HideShowHack(self):
##fixme: remove this when the bug is fixed!
"""
Hack to hide and show button on toolbar to get around OS-X bug on
wxPython2.8 on OS-X
"""
self.ZoomButton.Hide()
self.ZoomButton.Show()
def SetMode(self, event):
"""Event handler to set the mode."""
Mode = self.ModesDict[event.GetId()]
self.Canvas.SetMode(Mode)
def ZoomToFit(self, event):
"""Event handler to zoom to fit."""
self.Canvas.ZoomToBB()
self.Canvas.SetFocus() # Otherwise the focus stays on the Button, and wheel events are lost.
|