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:])
 | |
| 
 |