return bdr
#----------------------------------------------------------------------
+
+def makeShapes(win):
+ box =wxBoxSizer(wxVERTICAL)
+ box.Add(wxStaticLine(win, -1), 0)
+ for line in (
+ (wxANCHOR_NW, "NorthWest"),
+ (wxANCHOR_NORTH, "North"),
+ (wxANCHOR_NE, "NorthEast")
+ ), (
+ (wxANCHOR_WEST, "West"),
+ (wxANCHOR_NONE, "Center"),
+ (wxANCHOR_EAST, "East")
+ ), (
+ (wxANCHOR_SW, "SouthWest"),
+ (wxANCHOR_SOUTH, "South"),
+ (wxANCHOR_SE, "SouthEast")
+ ):
+ linebox =wxBoxSizer(wxHORIZONTAL)
+ linebox.Add(wxStaticLine(win, -1, style=wxVERTICAL), 0)
+ for (anchor, label) in line:
+ sizer =wxShapeSizer(anchor)
+ sizer.Add(wxButton(win, -1, label, size=wxSize(100, 50)))
+ linebox.Add(sizer, 1)
+ linebox.Add(wxStaticLine(win, -1, style=wxVERTICAL), 0)
+ box.Add(linebox, 1)
+ box.Add(wxStaticLine(win, -1), 0)
+ return box
+
#----------------------------------------------------------------------
def makeBoxInBox(win):
("", None, ""),
+
+ ("Proportional resize", makeShapes,
+ "The wxShapeSizer preserves the original proportions of the window."
+ ),
+
+ ("", None, ""),
+
("Boxes inside of boxes", makeBoxInBox,
"This one shows nesting of boxes within boxes within boxes, using both "
"orientations. Notice also that button seven has a greater weighting "
class TestSelectionPanel(wxPanel):
- def __init__(self, parent, frame):
+ def __init__(self, parent, frame=NULL):
wxPanel.__init__(self, parent, -1)
self.frame = frame
from sizer import *
from box import *
from border import *
+from shape import *
#----------------------------------------------------------------------------
if not os.environ.has_key('WXP_OLDSIZERS'):
dlg = wxMessageDialog(None,
- "Since wxWindows now includes sizers the classes in\n"
- "wxPython.lib.sizers have been depreciated. Please\n"
- "see the Reference Manual for details of the new classes.\n"
- "\n"
- "To contiunue using wxPython.lib.sizers without this\n"
- "message you can set the WXP_OLDSIZERS envronment \n"
- "variable to any value.",
+"""\
+Since the wxWindows library now includes its own sizers, the
+classes in wxPython.lib.sizers have been depreciated. Please
+see the Reference Manual for details of the new classes.
+
+To contiunue using wxPython.lib.sizers without this
+message you can set the WXP_OLDSIZERS envronment
+variable to any value.
+""",
"Depreciated Feature",
wxOK | wxICON_EXCLAMATION)
dlg.ShowModal()
--- /dev/null
+#----------------------------------------------------------------------
+# Name: wxPython.lib.sizers.shape
+# Purpose: A Sizer that preserves the shape (proportions)
+# of the managed window
+#
+# Created: 7-October-1999
+# RCS-ID: $Id$
+# Copyright: SIA "ANK"
+# Licence: wxWindows license
+#----------------------------------------------------------------------
+
+from sizer import wxSizer
+
+wxANCHOR_NONE = 0
+wxANCHOR_NORTH = 1
+wxANCHOR_SOUTH = 2
+wxANCHOR_EAST = 4
+wxANCHOR_WEST = 8
+wxANCHOR_NW = wxANCHOR_NORTH | wxANCHOR_WEST
+wxANCHOR_NE = wxANCHOR_NORTH | wxANCHOR_EAST
+wxANCHOR_SW = wxANCHOR_SOUTH | wxANCHOR_WEST
+wxANCHOR_SE = wxANCHOR_SOUTH | wxANCHOR_EAST
+
+#----------------------------------------------------------------------
+
+class wxShapeSizer(wxSizer):
+ """
+ wxShapeSizer
+
+ This sizer preserves the proportional dimensions of the managed
+ window, leaving empty space either in horizontal or vertical
+ dimension.
+
+ By default, the managed window is centered within allowed size.
+ You may specify an anchor parameter to leave all of the extra
+ space on one side: wxANCHOR_NORTH and wxANCHOR_SOUTH manage
+ vertical dimension, leaving extra space on the bottom or top side,
+ respectively; wxANCHOR_EAST and wxANCHOR_WEST do the same in
+ horizontal dimension. wxANCHOR_NW, wxANCHOR_NE, wxANCHOR_SW
+ and wxANCHOR_SE are short-cut names for combinations north+west,
+ north+east, south+west, south+east.
+
+ If both anchors are specified in either direction, south and east
+ take precedence over north and west, respectively. (Because of
+ gravity, widgets tend to fall down.)
+ """
+ def __init__(self, anchor =wxANCHOR_NONE):
+ wxSizer.__init__(self)
+ self.anchor =anchor
+
+ def Add(self, widget):
+ if self.children:
+ raise ValueError("wxShapeSizer can only contain one child.")
+
+ wxSizer.Add(self, widget)
+
+ def CalcMin(self):
+ isSizer, widget, width, height, borderSize = self.children[0]
+
+ if isSizer:
+ width, height = widget.CalcMin()
+
+ return width, height
+
+ def RecalcSizes(self):
+ isSizer, widget, width, height, borderSize = self.children[0]
+ width =self.size.width
+ height =self.size.height
+ px =self.origin.x
+ py =self.origin.y
+ anchor =self.anchor
+ # get current dimensions of the managed window
+ w, h =self.CalcMin()
+ ratio =float(w) /h
+ # in what direction space should be added:
+ # -1: horisontal
+ # 1: vertical
+ # 0: shape is ok
+ dir =cmp(ratio /width *height, 1)
+ if dir <0:
+ # recalculate width
+ old_width =width
+ width =height *ratio
+ if anchor & wxANCHOR_EAST:
+ px =px +old_width -width
+ elif not (anchor & wxANCHOR_WEST):
+ px =px +(old_width -width) /2
+ elif dir >0:
+ # recalculate height
+ old_height =height
+ height =width /ratio
+ if anchor & wxANCHOR_SOUTH:
+ py =py +old_height -height
+ elif not (anchor & wxANCHOR_NORTH):
+ py =py +(old_height -height) /2
+
+ widget.SetDimensions(px, py, width, height)