]>
Commit | Line | Data |
---|---|---|
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 | 19 | import wx |
1fded56b | 20 | |
b881fc78 RD |
21 | class 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 |