]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wx/lib/anchors.py
The new OGL doesn't have to be compatible with the bugs in the old
[wxWidgets.git] / wxPython / wx / lib / anchors.py
index 779cb6f043c369f8369933ae16ea67fa2a07222b..af7cd8abfebf4be64acc5d35179d1ab4efea2c3f 100644 (file)
@@ -1,11 +1,99 @@
+#----------------------------------------------------------------------
+# Name:        wxPython.lib.anchors
+# Purpose:     A class that provides an easy to use interface over layout
+#              constraints for anchored layout.
+#
+# Author:      Riaan Booysen
+#
+# Created:     15-Dec-2000
+# RCS-ID:      $Id$
+# Copyright:   (c) 2000 by Total Control Software
+# Licence:     wxWindows license
+#----------------------------------------------------------------------
+# 11/30/2003 - Jeff Grimmett (grimmtooth@softhome.net)
+#
+# o Updated for wx namespace
+# o Tested with updated demo
+# 
 
-"""Renamer stub: provides a way to drop the wx prefix from wxPython objects."""
+import  wx
 
-__cvsid__ = "$Id$"
-__revision__ = "$Revision$"[11:-2]
+class LayoutAnchors(wx.LayoutConstraints):
+    """ A class that implements Delphi's Anchors with wx.LayoutConstraints.
+
+        Anchored sides maintain the distance from the edge of the
+        control to the same edge of the parent.
+        When neither side is selected, the control keeps the same
+        relative position to both sides.
+
+        The current position and size of the control and it's parent
+        is used when setting up the constraints. To change the size or
+        position of an already anchored control, set the constraints to
+        None, reposition or resize and reapply the anchors.
+
+        Examples:
+
+        Let's anchor the right and bottom edge of a control and
+        resize it's parent.
+
+        ctrl.SetConstraints(LayoutAnchors(ctrl, left=0, top=0, right=1, bottom=1))
+
+        +=========+         +===================+
+        | +-----+ |         |                   |
+        | |     * |   ->    |                   |
+        | +--*--+ |         |           +-----+ |
+        +---------+         |           |     * |
+                            |           +--*--+ |
+                            +-------------------+
+        * = anchored edge
+
+        When anchored on both sides the control will stretch horizontally.
+
+        ctrl.SetConstraints(LayoutAnchors(ctrl, 1, 0, 1, 1))
+
+        +=========+         +===================+
+        | +-----+ |         |                   |
+        | *     * |   ->    |                   |
+        | +--*--+ |         | +---------------+ |
+        +---------+         | *     ctrl      * |
+                            | +-------*-------+ |
+                            +-------------------+
+        * = anchored edge
+    """
+    def __init__(self, control, left=1, top=1, right=0, bottom=0):
+        wx.LayoutConstraints.__init__(self)
+        parent = control.GetParent()
+        if not parent: return
+
+        pPos, pSize = parent.GetPosition(), parent.GetClientSize()
+        cPos, cSize = control.GetPosition(), control.GetSize()
+
+        self.setConstraintSides(self.left, wx.Left, left,
+                                self.right, wx.Right, right,
+                                self.width, wx.Width, self.centreX,
+                                cPos.x, cSize.width, pSize.width, parent)
+
+        self.setConstraintSides(self.top, wx.Top, top,
+                                self.bottom, wx.Bottom, bottom,
+                                self.height, wx.Height, self.centreY,
+                                cPos.y, cSize.height, pSize.height, parent)
+
+    def setConstraintSides(self, side1, side1Edge, side1Anchor,
+                                 side2, side2Edge, side2Anchor,
+                                 size, sizeEdge, centre,
+                                 cPos, cSize, pSize, parent):
+        if side2Anchor:
+            side2.SameAs(parent, side2Edge, pSize - (cPos + cSize))
+
+        if side1Anchor:
+            side1.SameAs(parent, side1Edge, cPos)
+
+            if not side2Anchor:
+                size.AsIs()
+        else:
+            size.AsIs()
+            
+            if not side2Anchor:
+                centre.PercentOf(parent, sizeEdge,
+                                 int(((cPos + cSize / 2.0) / pSize)*100))
 
-from wx import _rename
-from wxPython.lib import anchors
-_rename(globals(), anchors.__dict__, modulename='lib.anchors')
-del anchors
-del _rename