From: Robin Dunn Date: Sat, 11 Nov 2006 07:40:41 +0000 (+0000) Subject: Added wx.CollapsiblePane X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/73470a17475531b34303622f4e1d76f0755903c5 Added wx.CollapsiblePane git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43301 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/wxPython/demo/CollapsiblePane.py b/wxPython/demo/CollapsiblePane.py new file mode 100644 index 0000000000..4e0b993a3a --- /dev/null +++ b/wxPython/demo/CollapsiblePane.py @@ -0,0 +1,119 @@ + +import wx + +#---------------------------------------------------------------------- + +label1 = "Click here to show pane" +label2 = "Click here to hide pane" + +btnlbl1 = "call Expand(True)" +btnlbl2 = "call Expand(False)" + + +class TestPanel(wx.Panel): + def __init__(self, parent, log): + self.log = log + wx.Panel.__init__(self, parent, -1) + + title = wx.StaticText(self, label="wx.CollapsiblePane") + title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD)) + title.SetForegroundColour("blue") + + self.cp = cp = wx.CollapsiblePane(self, label=label1) + self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged, cp) + self.MakePaneContent(cp.GetPane()) + + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetSizer(sizer) + sizer.Add(title, 0, wx.ALL, 25) + sizer.Add(cp, 0, wx.RIGHT|wx.LEFT|wx.EXPAND, 25) + + self.btn = btn = wx.Button(self, label=btnlbl1) + self.Bind(wx.EVT_BUTTON, self.OnToggle, btn) + sizer.Add(btn, 0, wx.ALL, 25) + + + def OnToggle(self, evt): + self.cp.Collapse(self.cp.IsExpanded()) + self.OnPaneChanged() + + + def OnPaneChanged(self, evt=None): + self.log.write('wx.EVT_COLLAPSIBLEPANE_CHANGED') + self.Layout() + if self.cp.IsExpanded(): + self.cp.SetLabel(label2) + self.btn.SetLabel(btnlbl2) + else: + self.cp.SetLabel(label1) + self.btn.SetLabel(btnlbl1) + self.btn.SetInitialSize() + + + def MakePaneContent(self, pane): + '''Just make a few controls to put on the collapsible pane''' + nameLbl = wx.StaticText(pane, -1, "Name:") + name = wx.TextCtrl(pane, -1, ""); + + addrLbl = wx.StaticText(pane, -1, "Address:") + addr1 = wx.TextCtrl(pane, -1, ""); + addr2 = wx.TextCtrl(pane, -1, ""); + + cstLbl = wx.StaticText(pane, -1, "City, State, Zip:") + city = wx.TextCtrl(pane, -1, "", size=(150,-1)); + state = wx.TextCtrl(pane, -1, "", size=(50,-1)); + zip = wx.TextCtrl(pane, -1, "", size=(70,-1)); + + addrSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5) + addrSizer.Add((10,10)) + addrSizer.Add((10,10)) + addrSizer.AddGrowableCol(1) + addrSizer.Add(nameLbl, 0, + wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) + addrSizer.Add(name, 0, wx.EXPAND) + addrSizer.Add(addrLbl, 0, + wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) + addrSizer.Add(addr1, 0, wx.EXPAND) + addrSizer.Add((10,10)) + addrSizer.Add(addr2, 0, wx.EXPAND) + + addrSizer.Add(cstLbl, 0, + wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) + + cstSizer = wx.BoxSizer(wx.HORIZONTAL) + cstSizer.Add(city, 1) + cstSizer.Add(state, 0, wx.LEFT|wx.RIGHT, 5) + cstSizer.Add(zip) + addrSizer.Add(cstSizer, 0, wx.EXPAND) + + pane.SetSizer(addrSizer) + + + +#---------------------------------------------------------------------- + +def runTest(frame, nb, log): + win = TestPanel(nb, log) + return win + +#---------------------------------------------------------------------- + + + +overview = """ +

wx.CollapsiblePane

+ +A collapsable panel is a container with an embedded button-like +control which can be used by the user to collapse or expand the pane's +contents. + + +""" + + + +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) + diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index 2b441e9dfc..784878f3ce 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -69,6 +69,7 @@ _treeList = [ 'AnimateCtrl', 'AlphaDrawing', 'GraphicsContext', + 'CollapsiblePane', ]), # managed windows == things with a (optional) caption you can close @@ -177,6 +178,7 @@ _treeList = [ 'Calendar', 'CalendarCtrl', 'CheckListCtrlMixin', + 'CollapsiblePane', 'ContextHelp', 'DatePickerCtrl', 'DynamicSashWindow', @@ -1255,27 +1257,23 @@ class wxPythonDemo(wx.Frame): # Create a TreeCtrl tID = wx.NewId() + leftPanel = wx.Panel(splitter) + + self.filter = wx.TextCtrl(leftPanel) + self.filter.Bind(wx.EVT_TEXT, self.RecreateTree) + self.treeMap = {} - self.tree = wx.TreeCtrl(splitter, tID, style = + self.tree = wx.TreeCtrl(leftPanel, tID, style = wx.TR_DEFAULT_STYLE #| wx.TR_HAS_VARIABLE_ROW_HEIGHT ) - root = self.tree.AddRoot("wxPython Overview") - firstChild = None - for item in _treeList: - child = self.tree.AppendItem(root, item[0]) - if not firstChild: firstChild = child - for childItem in item[1]: - theDemo = self.tree.AppendItem(child, childItem) - self.treeMap[childItem] = theDemo - - self.tree.Expand(root) - self.tree.Expand(firstChild) + self.root = self.tree.AddRoot("wxPython Overview") + self.RecreateTree() self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, id=tID) self.tree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, id=tID) self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=tID) self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown) - + # Set up a wx.html.HtmlWindow on the Overview Notebook page # we put it in a panel first because there seems to be a # refresh bug of some sort (wxGTK) when it is directly in @@ -1319,7 +1317,12 @@ class wxPythonDemo(wx.Frame): # add the windows to the splitter and split it. splitter2.SplitHorizontally(self.nb, self.log, -160) - splitter.SplitVertically(self.tree, splitter2, 200) + leftBox = wx.BoxSizer(wx.VERTICAL) + leftBox.Add(self.tree, 1, wx.EXPAND) + leftBox.Add(wx.StaticText(leftPanel, label = "Filter Demos:"), 0, wx.TOP|wx.LEFT, 5) + leftBox.Add(self.filter, 0, wx.EXPAND|wx.ALL, 5) + leftPanel.SetSizer(leftBox) + splitter.SplitVertically(leftPanel, splitter2, 220) splitter.SetMinimumPaneSize(120) splitter2.SetMinimumPaneSize(60) @@ -1335,7 +1338,7 @@ class wxPythonDemo(wx.Frame): # select initial items self.nb.SetSelection(0) - self.tree.SelectItem(root) + self.tree.SelectItem(self.root) # Load 'Main' module self.LoadDemo(self.overviewText) @@ -1353,6 +1356,27 @@ class wxPythonDemo(wx.Frame): #--------------------------------------------- + + def RecreateTree(self, evt=None): + self.tree.DeleteAllItems() + self.root = self.tree.AddRoot("wxPython Overview") + firstChild = None + filter = self.filter.GetValue() + for category, items in _treeList: + if filter: + items = [item for item in items if filter in item.lower()] + if items: + child = self.tree.AppendItem(self.root, category) + if not firstChild: firstChild = child + for childItem in items: + theDemo = self.tree.AppendItem(child, childItem) + self.treeMap[childItem] = theDemo + + self.tree.Expand(self.root) + if firstChild: + self.tree.Expand(firstChild) + + def WriteText(self, text): if text[-1:] == '\n': text = text[:-1] diff --git a/wxPython/docs/CHANGES.txt b/wxPython/docs/CHANGES.txt index bf9e02ae6a..b273f6230f 100644 --- a/wxPython/docs/CHANGES.txt +++ b/wxPython/docs/CHANGES.txt @@ -2,6 +2,17 @@ Recent Changes for wxPython ===================================================================== +2.8.0.0 +------- +* + +Lots of fixes and updates to AUI classes. + +Added wx.CollapsiblePane. + + + + 2.7.2.0 ------- * 7-Nov-2006 diff --git a/wxPython/setup.py b/wxPython/setup.py index f0068aa9ec..c9dfc483ea 100755 --- a/wxPython/setup.py +++ b/wxPython/setup.py @@ -189,8 +189,7 @@ wxpExtensions.append(ext) # Extension for the GDI module swig_sources = run_swig(['gdi.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + - ['src/__gdi_rename.i', - 'src/_bitmap.i', + ['src/_bitmap.i', 'src/_colour.i', 'src/_dc.i', 'src/_graphics.i', @@ -233,9 +232,7 @@ wxpExtensions.append(ext) # Extension for the windows module swig_sources = run_swig(['windows.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + - ['src/__windows_rename.i', - 'src/__windows_reverse.txt', - 'src/_panel.i', + ['src/_panel.i', 'src/_toplvl.i', 'src/_statusbar.i', 'src/_splitter.i', @@ -267,9 +264,7 @@ wxpExtensions.append(ext) # Extension for the controls module swig_sources = run_swig(['controls.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + - [ 'src/__controls_rename.i', - 'src/__controls_reverse.txt', - 'src/_toolbar.i', + [ 'src/_toolbar.i', 'src/_button.i', 'src/_checkbox.i', 'src/_choice.i', @@ -293,6 +288,7 @@ swig_sources = run_swig(['controls.i'], 'src', GENDIR, PKGDIR, 'src/_datectrl.i', 'src/_hyperlink.i', 'src/_picker.i', + 'src/_collpane.i', ], True) ext = Extension('_controls_', swig_sources, @@ -312,9 +308,7 @@ wxpExtensions.append(ext) # Extension for the misc module swig_sources = run_swig(['misc.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + - [ 'src/__misc_rename.i', - 'src/__misc_reverse.txt', - 'src/_settings.i', + [ 'src/_settings.i', 'src/_functions.i', 'src/_misc.i', 'src/_tipdlg.i', @@ -445,8 +439,7 @@ wxpExtensions.append(ext) swig_sources = run_swig(['xrc.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + - [ 'src/_xrc_rename.i', - 'src/_xrc_ex.py', + [ 'src/_xrc_ex.py', 'src/_xmlres.i', 'src/_xmlsub.i', 'src/_xml.i', diff --git a/wxPython/src/_collpane.i b/wxPython/src/_collpane.i new file mode 100644 index 0000000000..58ba3fa13f --- /dev/null +++ b/wxPython/src/_collpane.i @@ -0,0 +1,133 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: _collpane.i +// Purpose: SWIG interface for wxCollapsiblePane +// +// Author: Robin Dunn +// +// Created: 10-Nov-2006 +// RCS-ID: $Id$ +// Copyright: (c) 2006 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +// Not a %module + + +//--------------------------------------------------------------------------- +%newgroup + +%{ +#include +%} + +MAKE_CONST_WXSTRING(CollapsiblePaneNameStr); + +enum { + wxCP_DEFAULT_STYLE, + wxCP_NO_TLW_RESIZE +}; + + + +MustHaveApp(wxCollapsiblePane); +DocStr(wxCollapsiblePane, +"A collapsable pane is a container with an embedded button-like +control which can be used by the user to collapse or expand the pane's +contents. + +Once constructed you should use the `GetPane` function to access the +pane and add your controls inside it (i.e. use the window returned +from `GetPane` as the parent for the controls which must go in the +pane, NOT the wx.CollapsiblePane itself!). + +Note that because of its nature of control which can dynamically (and +drastically) change its size at run-time under user-input, when +putting a wx.CollapsiblePane inside a `wx.Sizer` you should be careful +to add it with a proportion value of zero; this is because otherwise +all other windows with non-zero proportion values would automatically +get resized each time the user expands or collapses the pane window, +usually resulting a weird, flickering effect.", ""); + +class wxCollapsiblePane : public wxControl +{ +public: + %pythonAppend wxCollapsiblePane "self._setOORInfo(self)"; + %pythonAppend wxCollapsiblePane() ""; + + DocCtorStr( + wxCollapsiblePane(wxWindow *parent, + wxWindowID winid = -1, + const wxString& label = wxPyEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCP_DEFAULT_STYLE, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxPyCollapsiblePaneNameStr), + "Create and show a wx.CollapsiblePane", ""); + + DocCtorStrName( + wxCollapsiblePane(), + "Precreate a wx.CollapsiblePane for 2-phase creation.", "", + PreCollapsiblePane); + + + DocDeclStr( + bool , Create(wxWindow *parent, + wxWindowID winid =-1, + const wxString& label = wxPyEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCP_DEFAULT_STYLE, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxPyCollapsiblePaneNameStr), + "", ""); + + + + + DocDeclStr( + virtual void , Collapse(bool collapse = true), + "Collapses or expands the pane window.", ""); + + DocDeclStr( + void , Expand(), + "Same as Collapse(False).", ""); + + + DocDeclStr( + virtual bool , IsCollapsed() const, + "Returns ``True`` if the pane window is currently hidden.", ""); + + DocDeclStr( + bool , IsExpanded() const, + "Returns ``True`` if the pane window is currently shown.", ""); + + + DocDeclStr( + virtual wxWindow *, GetPane() const, + "Returns a reference to the pane window. Use the returned `wx.Window` +as the parent of widgets to make them part of the collapsible area.", ""); + +}; + + + +//--------------------------------------------------------------------------- + + +%constant wxEventType wxEVT_COMMAND_COLLPANE_CHANGED; +%pythoncode { + EVT_COLLAPSIBLEPANE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_COLLPANE_CHANGED, 1 ) +} + +class wxCollapsiblePaneEvent : public wxCommandEvent +{ +public: + //wxCollapsiblePaneEvent() {} + wxCollapsiblePaneEvent(wxObject *generator, int id, bool collapsed); + + bool GetCollapsed() const; + void SetCollapsed(bool c); +}; + +//--------------------------------------------------------------------------- diff --git a/wxPython/src/controls.i b/wxPython/src/controls.i index f508c2c09a..073ac752c7 100644 --- a/wxPython/src/controls.i +++ b/wxPython/src/controls.i @@ -61,6 +61,8 @@ MAKE_CONST_WXSTRING_NOSWIG(ControlNameStr); %include _datectrl.i %include _hyperlink.i %include _picker.i +%include _collpane.i + //--------------------------------------------------------------------------- //---------------------------------------------------------------------------