X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e1ea357c6725c152a7b93281b6ce5c6ad67f949e..6147ee3451b04a2c91471e25d6efe0b2f53ed639:/utils/wxPython/lib/sizers/shape.py?ds=sidebyside diff --git a/utils/wxPython/lib/sizers/shape.py b/utils/wxPython/lib/sizers/shape.py new file mode 100644 index 0000000000..cd38c23421 --- /dev/null +++ b/utils/wxPython/lib/sizers/shape.py @@ -0,0 +1,97 @@ +#---------------------------------------------------------------------- +# 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)