]> git.saurik.com Git - wxWidgets.git/blame - 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
CommitLineData
d14a1e28
RD
1#----------------------------------------------------------------------
2# Name: wxPython.lib.anchors
3# Purpose: A class that provides an easy to use interface over layout
4# constraints for anchored layout.
5#
6# Author: Riaan Booysen
7#
8# Created: 15-Dec-2000
9# RCS-ID: $Id$
10# Copyright: (c) 2000 by Total Control Software
11# Licence: wxWindows license
12#----------------------------------------------------------------------
b881fc78
RD
13# 11/30/2003 - Jeff Grimmett (grimmtooth@softhome.net)
14#
15# o Updated for wx namespace
16# o Tested with updated demo
17#
1fded56b 18
b881fc78 19import wx
1fded56b 20
b881fc78
RD
21class LayoutAnchors(wx.LayoutConstraints):
22 """ A class that implements Delphi's Anchors with wx.LayoutConstraints.
d14a1e28
RD
23
24 Anchored sides maintain the distance from the edge of the
25 control to the same edge of the parent.
26 When neither side is selected, the control keeps the same
27 relative position to both sides.
28
29 The current position and size of the control and it's parent
30 is used when setting up the constraints. To change the size or
31 position of an already anchored control, set the constraints to
32 None, reposition or resize and reapply the anchors.
33
34 Examples:
35
36 Let's anchor the right and bottom edge of a control and
37 resize it's parent.
38
39 ctrl.SetConstraints(LayoutAnchors(ctrl, left=0, top=0, right=1, bottom=1))
40
41 +=========+ +===================+
42 | +-----+ | | |
43 | | * | -> | |
44 | +--*--+ | | +-----+ |
45 +---------+ | | * |
46 | +--*--+ |
47 +-------------------+
48 * = anchored edge
49
50 When anchored on both sides the control will stretch horizontally.
51
52 ctrl.SetConstraints(LayoutAnchors(ctrl, 1, 0, 1, 1))
53
54 +=========+ +===================+
55 | +-----+ | | |
56 | * * | -> | |
57 | +--*--+ | | +---------------+ |
58 +---------+ | * ctrl * |
59 | +-------*-------+ |
60 +-------------------+
61 * = anchored edge
62 """
b881fc78
RD
63 def __init__(self, control, left=1, top=1, right=0, bottom=0):
64 wx.LayoutConstraints.__init__(self)
d14a1e28
RD
65 parent = control.GetParent()
66 if not parent: return
67
68 pPos, pSize = parent.GetPosition(), parent.GetClientSize()
69 cPos, cSize = control.GetPosition(), control.GetSize()
70
b881fc78
RD
71 self.setConstraintSides(self.left, wx.Left, left,
72 self.right, wx.Right, right,
73 self.width, wx.Width, self.centreX,
fd3f2efe 74 cPos.x, cSize.width, pSize.width, parent)
d14a1e28 75
b881fc78
RD
76 self.setConstraintSides(self.top, wx.Top, top,
77 self.bottom, wx.Bottom, bottom,
78 self.height, wx.Height, self.centreY,
fd3f2efe 79 cPos.y, cSize.height, pSize.height, parent)
d14a1e28
RD
80
81 def setConstraintSides(self, side1, side1Edge, side1Anchor,
82 side2, side2Edge, side2Anchor,
83 size, sizeEdge, centre,
84 cPos, cSize, pSize, parent):
85 if side2Anchor:
86 side2.SameAs(parent, side2Edge, pSize - (cPos + cSize))
b881fc78 87
d14a1e28
RD
88 if side1Anchor:
89 side1.SameAs(parent, side1Edge, cPos)
b881fc78 90
d14a1e28
RD
91 if not side2Anchor:
92 size.AsIs()
93 else:
94 size.AsIs()
b881fc78 95
d14a1e28
RD
96 if not side2Anchor:
97 centre.PercentOf(parent, sizeEdge,
98 int(((cPos + cSize / 2.0) / pSize)*100))
b881fc78 99