2003-11-12 16:34:20 -05:00
|
|
|
#----------------------------------------------------------------------
|
|
|
|
# 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
|
|
|
|
#----------------------------------------------------------------------
|
2003-12-16 19:34:40 -05:00
|
|
|
# 11/30/2003 - Jeff Grimmett (grimmtooth@softhome.net)
|
|
|
|
#
|
|
|
|
# o Updated for wx namespace
|
|
|
|
# o Tested with updated demo
|
|
|
|
#
|
2003-07-02 19:13:10 -04:00
|
|
|
|
2003-12-16 19:34:40 -05:00
|
|
|
import wx
|
2003-07-02 19:13:10 -04:00
|
|
|
|
2003-12-16 19:34:40 -05:00
|
|
|
class LayoutAnchors(wx.LayoutConstraints):
|
2004-06-17 01:52:01 -04:00
|
|
|
"""
|
|
|
|
A class that implements Delphi's Anchors with wx.LayoutConstraints.
|
2003-11-12 16:34:20 -05:00
|
|
|
|
2004-06-17 01:52:01 -04:00
|
|
|
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.
|
2003-11-12 16:34:20 -05:00
|
|
|
|
2004-06-17 01:52:01 -04:00
|
|
|
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.
|
2003-11-12 16:34:20 -05:00
|
|
|
|
2004-06-17 01:52:01 -04:00
|
|
|
Examples::
|
2003-11-12 16:34:20 -05:00
|
|
|
|
|
|
|
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
|
2004-06-17 01:52:01 -04:00
|
|
|
|
2003-11-12 16:34:20 -05:00
|
|
|
"""
|
2003-12-16 19:34:40 -05:00
|
|
|
def __init__(self, control, left=1, top=1, right=0, bottom=0):
|
|
|
|
wx.LayoutConstraints.__init__(self)
|
2003-11-12 16:34:20 -05:00
|
|
|
parent = control.GetParent()
|
|
|
|
if not parent: return
|
|
|
|
|
|
|
|
pPos, pSize = parent.GetPosition(), parent.GetClientSize()
|
|
|
|
cPos, cSize = control.GetPosition(), control.GetSize()
|
|
|
|
|
2003-12-16 19:34:40 -05:00
|
|
|
self.setConstraintSides(self.left, wx.Left, left,
|
|
|
|
self.right, wx.Right, right,
|
|
|
|
self.width, wx.Width, self.centreX,
|
2003-11-22 17:57:49 -05:00
|
|
|
cPos.x, cSize.width, pSize.width, parent)
|
2003-11-12 16:34:20 -05:00
|
|
|
|
2003-12-16 19:34:40 -05:00
|
|
|
self.setConstraintSides(self.top, wx.Top, top,
|
|
|
|
self.bottom, wx.Bottom, bottom,
|
|
|
|
self.height, wx.Height, self.centreY,
|
2003-11-22 17:57:49 -05:00
|
|
|
cPos.y, cSize.height, pSize.height, parent)
|
2003-11-12 16:34:20 -05:00
|
|
|
|
|
|
|
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))
|
2003-12-16 19:34:40 -05:00
|
|
|
|
2003-11-12 16:34:20 -05:00
|
|
|
if side1Anchor:
|
|
|
|
side1.SameAs(parent, side1Edge, cPos)
|
2003-12-16 19:34:40 -05:00
|
|
|
|
2003-11-12 16:34:20 -05:00
|
|
|
if not side2Anchor:
|
|
|
|
size.AsIs()
|
|
|
|
else:
|
|
|
|
size.AsIs()
|
2003-12-16 19:34:40 -05:00
|
|
|
|
2003-11-12 16:34:20 -05:00
|
|
|
if not side2Anchor:
|
|
|
|
centre.PercentOf(parent, sizeEdge,
|
|
|
|
int(((cPos + cSize / 2.0) / pSize)*100))
|
2003-12-16 19:34:40 -05:00
|
|
|
|