630edaac3c
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30188 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
169 lines
5.3 KiB
Python
169 lines
5.3 KiB
Python
|
|
import wx # This module uses the new wx namespace
|
|
|
|
#----------------------------------------------------------------------
|
|
gbsDescription = """\
|
|
The wx.GridBagSizer is similar to the wx.FlexGridSizer except the items are explicitly positioned
|
|
in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this
|
|
static text is positioned at (0,0) and it spans 7 columns.
|
|
"""
|
|
|
|
|
|
class TestFrame(wx.Frame):
|
|
def __init__(self):
|
|
wx.Frame.__init__(self, None, -1, "wx.GridBagSizer")
|
|
p = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL
|
|
| wx.CLIP_CHILDREN
|
|
| wx.FULL_REPAINT_ON_RESIZE
|
|
)
|
|
p.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
|
|
|
|
gbs = self.gbs = wx.GridBagSizer(5, 5)
|
|
|
|
gbs.Add( wx.StaticText(p, -1, gbsDescription),
|
|
(0,0), (1,7), wx.ALIGN_CENTER | wx.ALL, 5)
|
|
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(1,0)"), (1,0) )
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(1,1)"), (1,1) )
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(2,0)"), (2,0) )
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(2,1)"), (2,1) )
|
|
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(3,2), span(1,2)\nthis row and col are growable", style=wx.TE_MULTILINE),
|
|
(3,2), (1,2), flag=wx.EXPAND )
|
|
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(4,3), span(3,1)", style=wx.TE_MULTILINE),
|
|
(4,3), (3,1), wx.EXPAND)
|
|
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(5,4)"), (5,4), flag=wx.EXPAND )
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(6,5)"), (6,5), flag=wx.EXPAND )
|
|
gbs.Add( wx.TextCtrl(p, -1, "pos(7,6)"), (7,6) )
|
|
|
|
moveBtn1 = wx.Button(p, -1, "Move this to (3,6)")
|
|
moveBtn2 = wx.Button(p, -1, "Move this to (3,6)");
|
|
gbs.Add( moveBtn1, (10,2) )
|
|
gbs.Add( moveBtn2, (10,3) )
|
|
|
|
hideBtn = wx.Button(p, -1, "Hide this item -->")
|
|
gbs.Add(hideBtn, (12, 3))
|
|
|
|
hideTxt = wx.TextCtrl(p, -1, "pos(12,4), size(150, -1)", size = (150,-1))
|
|
gbs.Add( hideTxt, (12,4) )
|
|
|
|
showBtn = wx.Button(p, -1, "<-- Show it again")
|
|
gbs.Add(showBtn, (12, 5))
|
|
showBtn.Disable()
|
|
self.hideBtn = hideBtn
|
|
self.showBtn = showBtn
|
|
self.hideTxt = hideTxt
|
|
|
|
self.Bind(wx.EVT_BUTTON, self.OnHideButton, hideBtn)
|
|
self.Bind(wx.EVT_BUTTON, self.OnShowButton, showBtn)
|
|
self.Bind(wx.EVT_BUTTON, self.OnMoveButton, moveBtn1)
|
|
self.Bind(wx.EVT_BUTTON, self.OnMoveButton, moveBtn2)
|
|
|
|
# Add a spacer at the end to ensure some extra space at the bottom
|
|
gbs.Add((10,10), (14,7))
|
|
|
|
gbs.AddGrowableRow(3)
|
|
gbs.AddGrowableCol(2)
|
|
|
|
p.SetSizerAndFit(gbs)
|
|
self.SetClientSize(p.GetSize())
|
|
|
|
|
|
def OnHideButton(self, evt):
|
|
self.gbs.Hide(self.hideTxt)
|
|
self.hideBtn.Disable()
|
|
self.showBtn.Enable()
|
|
self.gbs.Layout()
|
|
|
|
|
|
def OnShowButton(self, evt):
|
|
self.gbs.Show(self.hideTxt)
|
|
self.hideBtn.Enable()
|
|
self.showBtn.Disable()
|
|
self.gbs.Layout()
|
|
|
|
|
|
def OnMoveButton(self, evt):
|
|
btn = evt.GetEventObject()
|
|
curPos = self.gbs.GetItemPosition(btn)
|
|
|
|
# if it's already at the "other" spot then move it back
|
|
if curPos == (3,6):
|
|
self.gbs.SetItemPosition(btn, self.lastPos)
|
|
btn.SetLabel("Move this to (3,6)")
|
|
else:
|
|
if self.gbs.CheckForIntersectionPos( (3,6), (1,1) ):
|
|
wx.MessageBox("""\
|
|
wx.GridBagSizer will not allow items to be in the same cell as
|
|
another item, so this operation will fail. You will also get an
|
|
assert when compiled in debug mode.""",
|
|
"Warning", wx.OK | wx.ICON_INFORMATION)
|
|
|
|
try:
|
|
if self.gbs.SetItemPosition(btn, (3,6)):
|
|
self.lastPos = curPos
|
|
btn.SetLabel("Move it back")
|
|
except wx.PyAssertionError:
|
|
pass
|
|
|
|
self.gbs.Layout()
|
|
|
|
|
|
def OnLeftDown(self, evt):
|
|
pt = evt.GetPosition()
|
|
item = self.gbs.FindItemAtPoint(pt)
|
|
if item is None:
|
|
print "no item at", `pt`
|
|
else:
|
|
print "item found: ", `item.GetPos()`, "--", `item.GetSpan()`
|
|
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
class TestPanel(wx.Panel):
|
|
def __init__(self, parent, log):
|
|
self.log = log
|
|
wx.Panel.__init__(self, parent, -1)
|
|
|
|
b = wx.Button(self, -1, "Show the GridBagSizer sample", (50,50))
|
|
self.Bind(wx.EVT_BUTTON, self.OnButton, b)
|
|
|
|
|
|
def OnButton(self, evt):
|
|
win = TestFrame()
|
|
win.Show(True)
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
|
|
def runTest(frame, nb, log):
|
|
win = TestPanel(nb, log)
|
|
return win
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
|
|
|
|
overview = """<html><body>
|
|
<h2><center>wx.GridBagSizer</center></h2>
|
|
|
|
The wx.GridBagSizer is more or less a port of the the RowColSizer (that
|
|
has been in the wxPython.lib package for quite some time) to C++. It
|
|
allows items to be placed at specific layout grid cells, and items can
|
|
span across more than one row or column.
|
|
</body></html>
|
|
"""
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys,os
|
|
import run
|
|
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
|
|
|