+++ /dev/null
-#----------------------------------------------------------------------
-# 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)