# $Id: Alignment.py,v 1.1.2.1 2007/01/28 11:24:30 marcusva Exp $
#
# Copyright (c) 2007, Marcus von Appen
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
"""A widget which controls the alignment of its child."""
from Bin import Bin
from Constants import *
import base
class Alignment (Bin):
"""Alignment (width, height) -> Alignment
A Bin widget class which controls the alignment of its child.
The Alignment widget allows its child to be aligned at its edges
using the 'align' attribute and set_align() method. Dependant on the
alignment type (see also ALIGN_TYPES) the child will be placed
differently within the Alignment.
alignment.align = ALIGN_TOP
alignment.set_align (ALIGN_TOP)
However, not every alignment make sense, so a ALIGN_TOP | ALIGN_BOTTOM
would cause the widget to be placed at the top. The priority
order for the alignment follows. The lower the value, the higher the
priority.
Alignment Priority
-----------------------
ALIGN_TOP 0
ALIGN_BOTTOM 1
ALIGN_LEFT 0
ALIGN_RIGHT 1
ALIGN_NONE 2
Default action (invoked by activate()):
None
Mnemonic action (invoked by activate_mnemonic()):
None
Attributes:
align - Alignment of the child.
"""
def __init__ (self, width, height):
Bin.__init__ (self)
self._align = ALIGN_NONE
self.minsize = width, height
def set_align (self, align):
"""A.set_align (...) -> None
Sets the alignment for the child.
Raises a TypeError, if the passed argument is not a value from
ALIGN_TYPES.
"""
if not constants_is_align (align):
raise TypeError ("align must be a value from ALIGN_TYPES")
self._align = align
self.dirty = True
def draw_bg (self):
"""A.draw_bg () -> Surface
Draws the Alignment background surface and returns it.
Creates the visible surface of the Alignment and returns it to the
caller.
"""
return base.GlobalStyle.engine.draw_alignment (self)
def draw (self):
"""B.draw () -> None
Draws the Alignment surface and places its child on it.
"""
Bin.draw (self)
rect = self.image.get_rect ()
if self.child:
self.child.center = rect.center
if self.align & ALIGN_TOP == ALIGN_TOP:
self.child.top = rect.top + self.padding
elif self.align & ALIGN_BOTTOM == ALIGN_BOTTOM:
self.child.bottom = rect.bottom - self.padding
if self.align & ALIGN_LEFT == ALIGN_LEFT:
self.child.left = rect.left + self.padding
elif self.align & ALIGN_RIGHT == ALIGN_RIGHT:
self.child.right = rect.right - self.padding
self.image.blit (self.child.image, self.child.rect)
align = property (lambda self: self._align,
lambda self, var: self.set_align (var),
doc = "The alignment to use for the child.")
syntax highlighted by Code2HTML, v. 0.9.1