]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/wxPython/lib/sizers/shape.py
new contributions
[wxWidgets.git] / utils / wxPython / lib / sizers / shape.py
diff --git a/utils/wxPython/lib/sizers/shape.py b/utils/wxPython/lib/sizers/shape.py
new file mode 100644 (file)
index 0000000..cd38c23
--- /dev/null
@@ -0,0 +1,97 @@
+#----------------------------------------------------------------------
+# 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)