1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Wrappers for the wxAUI classes.
7 // Created: 5-July-2006
9 // Copyright: (c) 2006 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
14 "The wx.aui moduleis an Advanced User Interface library that aims to
15 implement \"cutting-edge\" interface usability and design features so
16 developers can quickly and easily create beautiful and usable
17 application interfaces.
19 **Vision and Design Principles**
21 wx.aui attempts to encapsulate the following aspects of the user
24 * Frame Management: Frame management provides the means to open,
25 move and hide common controls that are needed to interact with the
26 document, and allow these configurations to be saved into
27 different perspectives and loaded at a later time.
29 * Toolbars: Toolbars are a specialized subset of the frame
30 management system and should behave similarly to other docked
31 components. However, they also require additional functionality,
32 such as \"spring-loaded\" rebar support, \"chevron\" buttons and
33 end-user customizability.
35 * Modeless Controls: Modeless controls expose a tool palette or set
36 of options that float above the application content while allowing
37 it to be accessed. Usually accessed by the toolbar, these controls
38 disappear when an option is selected, but may also be \"torn off\"
39 the toolbar into a floating frame of their own.
41 * Look and Feel: Look and feel encompasses the way controls are
42 drawn, both when shown statically as well as when they are being
43 moved. This aspect of user interface design incorporates \"special
44 effects\" such as transparent window dragging as well as frame
47 **PyAUI adheres to the following principles**
49 - Use native floating frames to obtain a native look and feel for
52 - Use existing wxPython code where possible, such as sizer
53 implementation for frame management;
55 - Use standard wxPython coding conventions.
60 The following example shows a simple implementation that utilizes
61 `wx.aui.FrameManager` to manage three text controls in a frame window::
66 class MyFrame(wx.Frame):
68 def __init__(self, parent, id=-1, title='wx.aui Test',
69 size=(800, 600), style=wx.DEFAULT_FRAME_STYLE):
70 wx.Frame.__init__(self, parent, id, title, pos, size, style)
72 self._mgr = wx.aui.FrameManager(self)
74 # create several text controls
75 text1 = wx.TextCtrl(self, -1, 'Pane 1 - sample text',
76 wx.DefaultPosition, wx.Size(200,150),
77 wx.NO_BORDER | wx.TE_MULTILINE)
79 text2 = wx.TextCtrl(self, -1, 'Pane 2 - sample text',
80 wx.DefaultPosition, wx.Size(200,150),
81 wx.NO_BORDER | wx.TE_MULTILINE)
83 text3 = wx.TextCtrl(self, -1, 'Main content window',
84 wx.DefaultPosition, wx.Size(200,150),
85 wx.NO_BORDER | wx.TE_MULTILINE)
87 # add the panes to the manager
88 self._mgr.AddPane(text1, wx.LEFT, 'Pane Number One')
89 self._mgr.AddPane(text2, wx.BOTTOM, 'Pane Number Two')
90 self._mgr.AddPane(text3, wx.CENTER)
92 # tell the manager to 'commit' all the changes just made
95 self.Bind(wx.EVT_CLOSE, self.OnClose)
98 def OnClose(self, event):
99 # deinitialize the frame manager
106 frame = MyFrame(None)
114 %module(package="wx", docstring=DOCSTRING) aui
117 #include "wx/wxPython/wxPython.h"
118 #include "wx/wxPython/pyclasses.h"
119 #include <wx/aui/aui.h>
122 //---------------------------------------------------------------------------
127 %pythoncode { wx = _core }
128 %pythoncode { __docfilter__ = wx.__DocFilter(globals()) }
131 %include _aui_docstrings.i
133 //---------------------------------------------------------------------------
137 #define WXDLLIMPEXP_AUI
139 #define wxDEPRECATED(decl)
142 // We'll let SWIG handle the function overloading for these
143 %ignore wxPaneInfo::MaxSize(int x, int y);
144 %ignore wxPaneInfo::MinSize(int x, int y);
145 %ignore wxPaneInfo::BestSize(int x, int y);
146 %ignore wxPaneInfo::FloatingPosition(int x, int y);
147 %ignore wxPaneInfo::FloatingSize(int x, int y);
149 // But for these we will do the overloading (see %pythoncode below) so let's
150 // rename the C++ versions
151 %rename(_GetPaneByWidget) wxFrameManager::GetPane(wxWindow* window);
152 %rename(_GetPaneByName) wxFrameManager::GetPane(const wxString& name);
154 %rename(_AddPane1) wxFrameManager::AddPane(wxWindow* window, const wxPaneInfo& pane_info);
155 %rename(_AddPane2) wxFrameManager::AddPane(wxWindow* window, int direction = wxLEFT,
156 const wxString& caption = wxEmptyString);
159 // A typemap for the return value of wxFrameManager::GetAllPanes
160 %typemap(out) wxPaneInfoArray& {
161 $result = PyList_New(0);
162 for (size_t i=0; i < $1->GetCount(); i++) {
163 PyObject* pane_obj = SWIG_NewPointerObj((void*)(&$1->Item(i)), SWIGTYPE_p_wxPaneInfo, 0);
164 PyList_Append($result, pane_obj);
169 //---------------------------------------------------------------------------
170 // Get all our defs from the REAL header files.
171 %include framemanager.h
176 //---------------------------------------------------------------------------
177 // Methods to inject into the FrameManager class that will sort out calls to
178 // the overloaded versions of GetPane and AddPane
180 %extend wxFrameManager {
182 def GetPane(self, item):
184 GetPane(self, window_or_info item) -> PaneInfo
186 GetPane is used to search for a `PaneInfo` object either by
187 widget reference or by pane name, which acts as a unique id
188 for a window pane. The returned `PaneInfo` object may then be
189 modified to change a pane's look, state or position. After one
190 or more modifications to the `PaneInfo`, `FrameManager.Update`
191 should be called to realize the changes to the user interface.
193 If the lookup failed (meaning the pane could not be found in
194 the manager) GetPane returns an empty `PaneInfo`, a condition
195 which can be checked by calling `PaneInfo.IsOk`.
197 if isinstance(item, wx.Window):
198 return self._GetPaneByWidget(item)
200 return self._GetPaneByName(item)
202 def AddPane(self, window, info=None, caption=None):
204 AddPane(self, window, info=None, caption=None) -> bool
206 AddPane tells the frame manager to start managing a child
207 window. There are two versions of this function. The first
208 verison accepts a `PaneInfo` object for the ``info`` parameter
209 and allows the full spectrum of pane parameter
210 possibilities. (Say that 3 times fast!)
212 The second version is used for simpler user interfaces which
213 do not require as much configuration. In this case the
214 ``info`` parameter specifies the direction property of the
215 pane info, and defaults to ``wx.LEFT``. The pane caption may
216 also be specified as an extra parameter in this form.
218 if type(info) == PaneInfo:
219 return self._AddPane1(window, info)
226 return self._AddPane2(window, info, caption)
229 // For backwards compatibility
231 SetFrame = wx._deprecated(SetManagedWindow,
232 "SetFrame is deprecated, use `SetManagedWindow` instead.")
233 GetFrame = wx._deprecated(GetManagedWindow,
234 "GetFrame is deprecated, use `GetManagedWindow` instead.")
238 //---------------------------------------------------------------------------
241 class wxPyDockArt : public wxDefaultDockArt
243 wxPyDockArt() : wxDefaultDockArt() {}
245 DEC_PYCALLBACK_INT_INT(GetMetric);
246 DEC_PYCALLBACK_VOID_INTINT(SetMetric);
247 DEC_PYCALLBACK__INTFONT(SetFont);
248 DEC_PYCALLBACK_FONT_INT(GetFont);
249 DEC_PYCALLBACK_COLOUR_INT(GetColour);
250 DEC_PYCALLBACK__INTCOLOUR(SetColour);
252 virtual void DrawSash(wxDC& dc,
257 wxPyBlock_t blocked = wxPyBeginBlockThreads();
258 if ((found = wxPyCBH_findCallback(m_myInst, "DrawSash"))) {
259 PyObject* odc = wxPyMake_wxObject(&dc, false);
260 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
261 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OiO)",
262 odc, orientation, orect));
266 wxPyEndBlockThreads(blocked);
268 wxDefaultDockArt::DrawSash(dc, orientation, rect);
271 virtual void DrawBackground(wxDC& dc,
276 wxPyBlock_t blocked = wxPyBeginBlockThreads();
277 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBackground"))) {
278 PyObject* odc = wxPyMake_wxObject(&dc, false);
279 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
280 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OiO)",
281 odc, orientation, orect));
285 wxPyEndBlockThreads(blocked);
287 wxDefaultDockArt::DrawBackground(dc, orientation, rect);
290 virtual void DrawCaption(wxDC& dc,
291 const wxString& text,
296 wxPyBlock_t blocked = wxPyBeginBlockThreads();
297 if ((found = wxPyCBH_findCallback(m_myInst, "DrawCaption"))) {
298 PyObject* odc = wxPyMake_wxObject(&dc, false);
299 PyObject* otext = wx2PyString(text);
300 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
301 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxPaneInfo"), 0);
302 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOOO)",
303 odc, otext, orect, opane));
309 wxPyEndBlockThreads(blocked);
311 wxDefaultDockArt::DrawCaption(dc, text, rect, pane);
314 virtual void DrawGripper(wxDC& dc,
319 wxPyBlock_t blocked = wxPyBeginBlockThreads();
320 if ((found = wxPyCBH_findCallback(m_myInst, "DrawGripper"))) {
321 PyObject* odc = wxPyMake_wxObject(&dc, false);
322 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
323 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxPaneInfo"), 0);
324 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, orect, opane));
329 wxPyEndBlockThreads(blocked);
331 wxDefaultDockArt::DrawGripper(dc, rect, pane);
334 virtual void DrawBorder(wxDC& dc,
339 wxPyBlock_t blocked = wxPyBeginBlockThreads();
340 if ((found = wxPyCBH_findCallback(m_myInst, "DrawBorder"))) {
341 PyObject* odc = wxPyMake_wxObject(&dc, false);
342 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
343 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxPaneInfo"), 0);
344 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", odc, orect, opane));
349 wxPyEndBlockThreads(blocked);
351 wxDefaultDockArt::DrawBorder(dc, rect, pane);
354 virtual void DrawPaneButton(wxDC& dc,
361 wxPyBlock_t blocked = wxPyBeginBlockThreads();
362 if ((found = wxPyCBH_findCallback(m_myInst, "DrawPaneButton"))) {
363 PyObject* odc = wxPyMake_wxObject(&dc, false);
364 PyObject* orect = wxPyConstructObject((void*)&rect, wxT("wxRect"), 0);
365 PyObject* opane = wxPyConstructObject((void*)&pane, wxT("wxPaneInfo"), 0);
366 wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OiIOO)",
367 odc, button, button_state,
373 wxPyEndBlockThreads(blocked);
375 wxDefaultDockArt::DrawPaneButton(dc, button, button_state, rect, pane);
382 IMP_PYCALLBACK_INT_INT(wxPyDockArt, wxDefaultDockArt, GetMetric);
383 IMP_PYCALLBACK_VOID_INTINT(wxPyDockArt, wxDefaultDockArt, SetMetric);
384 IMP_PYCALLBACK__INTFONT(wxPyDockArt, wxDefaultDockArt, SetFont);
385 IMP_PYCALLBACK_FONT_INT(wxPyDockArt, wxDefaultDockArt, GetFont);
386 IMP_PYCALLBACK_COLOUR_INT(wxPyDockArt, wxDefaultDockArt, GetColour);
387 IMP_PYCALLBACK__INTCOLOUR(wxPyDockArt, wxDefaultDockArt, SetColour);
393 "This version of the `DockArt` class has been instrumented to be
394 subclassable in Python and to reflect all calls to the C++ base class
395 methods to the Python methods implemented in the derived class.", "");
397 class wxPyDockArt : public wxDefaultDockArt
399 %pythonAppend wxPyDockArt "self._setCallbackInfo(self, PyDockArt)"
407 #undef WXDLLIMPEXP_AUI
409 //---------------------------------------------------------------------------