Added wx.CollapsiblePane

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43301 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2006-11-11 07:40:41 +00:00
parent 037c7b4c7b
commit 73470a1747
6 changed files with 310 additions and 28 deletions

View File

@@ -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 = """<html><body>
<h2><center>wx.CollapsiblePane</center></h2>
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.
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

View File

@@ -69,6 +69,7 @@ _treeList = [
'AnimateCtrl', 'AnimateCtrl',
'AlphaDrawing', 'AlphaDrawing',
'GraphicsContext', 'GraphicsContext',
'CollapsiblePane',
]), ]),
# managed windows == things with a (optional) caption you can close # managed windows == things with a (optional) caption you can close
@@ -177,6 +178,7 @@ _treeList = [
'Calendar', 'Calendar',
'CalendarCtrl', 'CalendarCtrl',
'CheckListCtrlMixin', 'CheckListCtrlMixin',
'CollapsiblePane',
'ContextHelp', 'ContextHelp',
'DatePickerCtrl', 'DatePickerCtrl',
'DynamicSashWindow', 'DynamicSashWindow',
@@ -1255,27 +1257,23 @@ class wxPythonDemo(wx.Frame):
# Create a TreeCtrl # Create a TreeCtrl
tID = wx.NewId() tID = wx.NewId()
leftPanel = wx.Panel(splitter)
self.filter = wx.TextCtrl(leftPanel)
self.filter.Bind(wx.EVT_TEXT, self.RecreateTree)
self.treeMap = {} 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 wx.TR_DEFAULT_STYLE #| wx.TR_HAS_VARIABLE_ROW_HEIGHT
) )
root = self.tree.AddRoot("wxPython Overview") self.root = self.tree.AddRoot("wxPython Overview")
firstChild = None self.RecreateTree()
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.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, id=tID) 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_ITEM_COLLAPSED, self.OnItemCollapsed, id=tID)
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=tID) self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=tID)
self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown) self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown)
# Set up a wx.html.HtmlWindow on the Overview Notebook page # Set up a wx.html.HtmlWindow on the Overview Notebook page
# we put it in a panel first because there seems to be a # we put it in a panel first because there seems to be a
# refresh bug of some sort (wxGTK) when it is directly in # 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. # add the windows to the splitter and split it.
splitter2.SplitHorizontally(self.nb, self.log, -160) 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) splitter.SetMinimumPaneSize(120)
splitter2.SetMinimumPaneSize(60) splitter2.SetMinimumPaneSize(60)
@@ -1335,7 +1338,7 @@ class wxPythonDemo(wx.Frame):
# select initial items # select initial items
self.nb.SetSelection(0) self.nb.SetSelection(0)
self.tree.SelectItem(root) self.tree.SelectItem(self.root)
# Load 'Main' module # Load 'Main' module
self.LoadDemo(self.overviewText) 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): def WriteText(self, text):
if text[-1:] == '\n': if text[-1:] == '\n':
text = text[:-1] text = text[:-1]

View File

@@ -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 2.7.2.0
------- -------
* 7-Nov-2006 * 7-Nov-2006

View File

@@ -189,8 +189,7 @@ wxpExtensions.append(ext)
# Extension for the GDI module # Extension for the GDI module
swig_sources = run_swig(['gdi.i'], 'src', GENDIR, PKGDIR, swig_sources = run_swig(['gdi.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps + USE_SWIG, swig_force, swig_args, swig_deps +
['src/__gdi_rename.i', ['src/_bitmap.i',
'src/_bitmap.i',
'src/_colour.i', 'src/_colour.i',
'src/_dc.i', 'src/_dc.i',
'src/_graphics.i', 'src/_graphics.i',
@@ -233,9 +232,7 @@ wxpExtensions.append(ext)
# Extension for the windows module # Extension for the windows module
swig_sources = run_swig(['windows.i'], 'src', GENDIR, PKGDIR, swig_sources = run_swig(['windows.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps + USE_SWIG, swig_force, swig_args, swig_deps +
['src/__windows_rename.i', ['src/_panel.i',
'src/__windows_reverse.txt',
'src/_panel.i',
'src/_toplvl.i', 'src/_toplvl.i',
'src/_statusbar.i', 'src/_statusbar.i',
'src/_splitter.i', 'src/_splitter.i',
@@ -267,9 +264,7 @@ wxpExtensions.append(ext)
# Extension for the controls module # Extension for the controls module
swig_sources = run_swig(['controls.i'], 'src', GENDIR, PKGDIR, swig_sources = run_swig(['controls.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps + USE_SWIG, swig_force, swig_args, swig_deps +
[ 'src/__controls_rename.i', [ 'src/_toolbar.i',
'src/__controls_reverse.txt',
'src/_toolbar.i',
'src/_button.i', 'src/_button.i',
'src/_checkbox.i', 'src/_checkbox.i',
'src/_choice.i', 'src/_choice.i',
@@ -293,6 +288,7 @@ swig_sources = run_swig(['controls.i'], 'src', GENDIR, PKGDIR,
'src/_datectrl.i', 'src/_datectrl.i',
'src/_hyperlink.i', 'src/_hyperlink.i',
'src/_picker.i', 'src/_picker.i',
'src/_collpane.i',
], ],
True) True)
ext = Extension('_controls_', swig_sources, ext = Extension('_controls_', swig_sources,
@@ -312,9 +308,7 @@ wxpExtensions.append(ext)
# Extension for the misc module # Extension for the misc module
swig_sources = run_swig(['misc.i'], 'src', GENDIR, PKGDIR, swig_sources = run_swig(['misc.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps + USE_SWIG, swig_force, swig_args, swig_deps +
[ 'src/__misc_rename.i', [ 'src/_settings.i',
'src/__misc_reverse.txt',
'src/_settings.i',
'src/_functions.i', 'src/_functions.i',
'src/_misc.i', 'src/_misc.i',
'src/_tipdlg.i', 'src/_tipdlg.i',
@@ -445,8 +439,7 @@ wxpExtensions.append(ext)
swig_sources = run_swig(['xrc.i'], 'src', GENDIR, PKGDIR, swig_sources = run_swig(['xrc.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps + USE_SWIG, swig_force, swig_args, swig_deps +
[ 'src/_xrc_rename.i', [ 'src/_xrc_ex.py',
'src/_xrc_ex.py',
'src/_xmlres.i', 'src/_xmlres.i',
'src/_xmlsub.i', 'src/_xmlsub.i',
'src/_xml.i', 'src/_xml.i',

133
wxPython/src/_collpane.i Normal file
View File

@@ -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 <wx/collpane.h>
%}
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);
};
//---------------------------------------------------------------------------

View File

@@ -61,6 +61,8 @@ MAKE_CONST_WXSTRING_NOSWIG(ControlNameStr);
%include _datectrl.i %include _datectrl.i
%include _hyperlink.i %include _hyperlink.i
%include _picker.i %include _picker.i
%include _collpane.i
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------