Module albow.core.ui.AlbowRect
Source code
import logging
from pygame import Rect
from albow.core.RectUtility import RectUtility
from albow.vectors import subtract
from albow.vectors import add
class AlbowRect:
left = RectUtility.rect_property('left')
right = RectUtility.rect_property('right')
top = RectUtility.rect_property('top')
bottom = RectUtility.rect_property('bottom')
width = RectUtility.rect_property('width')
height = RectUtility.rect_property('height')
size = RectUtility.rect_property('size')
topleft = RectUtility.rect_property('topleft')
topright = RectUtility.rect_property('topright')
bottomleft = RectUtility.rect_property('bottomleft')
bottomright = RectUtility.rect_property('bottomright')
midleft = RectUtility.rect_property('midleft')
midright = RectUtility.rect_property('midright')
midtop = RectUtility.rect_property('midtop')
midbottom = RectUtility.rect_property('midbottom')
center = RectUtility.rect_property('center')
centerx = RectUtility.rect_property('centerx')
centery = RectUtility.rect_property('centery')
debug_resize = False
def __init__(self, thePygameRect: Rect = None):
self.logger = logging.getLogger(__name__)
self.subwidgets = []
self.parent = None
self.anchor = 'lt'
"""
A string specifying how this widget is to change in size and position when its parent widget changes size. The
letters 'l', 'r', 't' and 'b' are used to anchor the widget to the left, right, top or bottom sides of its
parent. Anchoring it to both left and right, or both top and bottom, causes the widget to stretch or shrink when
its parent changes in width or height.
"""
if thePygameRect and not isinstance(thePygameRect, Rect):
raise TypeError("AlbowRect rect not a pygame.Rect")
self._rect = Rect(thePygameRect or (0, 0, 100, 100))
def get_rect(self):
return self._rect
def set_rect(self, x):
old_size = self._rect.size
self._rect = Rect(x)
self._resized(old_size[0], old_size[1])
rect = property(get_rect, set_rect)
"""
bounds in parent's coordinates
"""
def _resized(self, old_width, old_height):
"""
Args:
old_width:
old_height:
"""
new_width, new_height = self._rect.size
dw = new_width - old_width
dh = new_height - old_height
if dw or dh:
self.resized(dw, dh)
def resized(self, dw, dh):
"""
Called when the widget changes size as a result of assigning to its width, height or size attributes,
with (dw, dh) being the amount of the change. The default is to call parent_resized on each of its subwidgets.
Args:
dw: width
dh: height
"""
if self.debug_resize:
self.logger.info(f"AlbowRect.resized: {self} by: ({dw}, {dh}) to {self.size}")
for widget in self.subwidgets:
widget.parent_resized(dw, dh)
def parent_resized(self, dw, dh):
"""
Called when the widget's parent changes size as a result of assigning to its width, height or size
attributes, with (dw, dh) being the amount of the change. The default is to resize and/or reposition
the widget according to its anchor attribute.
Args:
dw: Width
dh: Height
"""
debug_resize = self.debug_resize or self.parent.debug_resize
if debug_resize:
self.logger.info(f"AlbowRect.parent_resized {self}, by ({dw}, {dh})")
left, top, width, height = self._rect
move = False
resize = False
anchor = self.anchor
if dw and 'r' in anchor:
if 'l' in anchor:
resize = True
width += dw
else:
move = True
left += dw
if dh and 'b' in anchor:
if 't' in anchor:
resize = True
height += dh
else:
move = True
top += dh
if resize:
if debug_resize:
self.logger.info(f"AlbowRect.parent_resized: changing rect to ({left}, {top}, {width}, {height})")
self.rect = (left, top, width, height)
elif move:
if debug_resize:
self.logger.info(f"AlbowRect.parent_resized: moving to (%{left},{top})")
self._rect.topleft = (left, top)
def global_to_local(self, p):
"""
Converts the given coordinate pair from PyGame screen coordinates to the widget's local coordinate system.
Args:
p: The global coordinates
Returns: The widget's local coordinates
"""
return subtract(p, self.local_to_global_offset())
def local_to_global(self, p):
"""
Converts the given coordinate pair from the widget's local coordinate system to PyGame screen coordinates.
Args:
p: Widget local coordinates
Returns: global coordinates
"""
return add(p, self.local_to_global_offset())
def local_to_global_offset(self):
d = self.topleft
parent = self.parent
if parent:
d = add(d, parent.local_to_global_offset())
return d
def get_global_rect(self):
p = self.local_to_global_offset()
pTuple = tuple(p)
s = self.rect.size
return Rect(pTuple, s)
Classes
class AlbowRect (thePygameRect=None)
-
Source code
class AlbowRect: left = RectUtility.rect_property('left') right = RectUtility.rect_property('right') top = RectUtility.rect_property('top') bottom = RectUtility.rect_property('bottom') width = RectUtility.rect_property('width') height = RectUtility.rect_property('height') size = RectUtility.rect_property('size') topleft = RectUtility.rect_property('topleft') topright = RectUtility.rect_property('topright') bottomleft = RectUtility.rect_property('bottomleft') bottomright = RectUtility.rect_property('bottomright') midleft = RectUtility.rect_property('midleft') midright = RectUtility.rect_property('midright') midtop = RectUtility.rect_property('midtop') midbottom = RectUtility.rect_property('midbottom') center = RectUtility.rect_property('center') centerx = RectUtility.rect_property('centerx') centery = RectUtility.rect_property('centery') debug_resize = False def __init__(self, thePygameRect: Rect = None): self.logger = logging.getLogger(__name__) self.subwidgets = [] self.parent = None self.anchor = 'lt' """ A string specifying how this widget is to change in size and position when its parent widget changes size. The letters 'l', 'r', 't' and 'b' are used to anchor the widget to the left, right, top or bottom sides of its parent. Anchoring it to both left and right, or both top and bottom, causes the widget to stretch or shrink when its parent changes in width or height. """ if thePygameRect and not isinstance(thePygameRect, Rect): raise TypeError("AlbowRect rect not a pygame.Rect") self._rect = Rect(thePygameRect or (0, 0, 100, 100)) def get_rect(self): return self._rect def set_rect(self, x): old_size = self._rect.size self._rect = Rect(x) self._resized(old_size[0], old_size[1]) rect = property(get_rect, set_rect) """ bounds in parent's coordinates """ def _resized(self, old_width, old_height): """ Args: old_width: old_height: """ new_width, new_height = self._rect.size dw = new_width - old_width dh = new_height - old_height if dw or dh: self.resized(dw, dh) def resized(self, dw, dh): """ Called when the widget changes size as a result of assigning to its width, height or size attributes, with (dw, dh) being the amount of the change. The default is to call parent_resized on each of its subwidgets. Args: dw: width dh: height """ if self.debug_resize: self.logger.info(f"AlbowRect.resized: {self} by: ({dw}, {dh}) to {self.size}") for widget in self.subwidgets: widget.parent_resized(dw, dh) def parent_resized(self, dw, dh): """ Called when the widget's parent changes size as a result of assigning to its width, height or size attributes, with (dw, dh) being the amount of the change. The default is to resize and/or reposition the widget according to its anchor attribute. Args: dw: Width dh: Height """ debug_resize = self.debug_resize or self.parent.debug_resize if debug_resize: self.logger.info(f"AlbowRect.parent_resized {self}, by ({dw}, {dh})") left, top, width, height = self._rect move = False resize = False anchor = self.anchor if dw and 'r' in anchor: if 'l' in anchor: resize = True width += dw else: move = True left += dw if dh and 'b' in anchor: if 't' in anchor: resize = True height += dh else: move = True top += dh if resize: if debug_resize: self.logger.info(f"AlbowRect.parent_resized: changing rect to ({left}, {top}, {width}, {height})") self.rect = (left, top, width, height) elif move: if debug_resize: self.logger.info(f"AlbowRect.parent_resized: moving to (%{left},{top})") self._rect.topleft = (left, top) def global_to_local(self, p): """ Converts the given coordinate pair from PyGame screen coordinates to the widget's local coordinate system. Args: p: The global coordinates Returns: The widget's local coordinates """ return subtract(p, self.local_to_global_offset()) def local_to_global(self, p): """ Converts the given coordinate pair from the widget's local coordinate system to PyGame screen coordinates. Args: p: Widget local coordinates Returns: global coordinates """ return add(p, self.local_to_global_offset()) def local_to_global_offset(self): d = self.topleft parent = self.parent if parent: d = add(d, parent.local_to_global_offset()) return d def get_global_rect(self): p = self.local_to_global_offset() pTuple = tuple(p) s = self.rect.size return Rect(pTuple, s)
Subclasses
Class variables
var debug_resize
var rect
-
bounds in parent's coordinates
Instance variables
var anchor
-
A string specifying how this widget is to change in size and position when its parent widget changes size. The letters 'l', 'r', 't' and 'b' are used to anchor the widget to the left, right, top or bottom sides of its parent. Anchoring it to both left and right, or both top and bottom, causes the widget to stretch or shrink when its parent changes in width or height.
var bottom
-
Source code
def get(self): return getattr(self._rect, name)
var bottomleft
-
Source code
def get(self): return getattr(self._rect, name)
var bottomright
-
Source code
def get(self): return getattr(self._rect, name)
var center
-
Source code
def get(self): return getattr(self._rect, name)
var centerx
-
Source code
def get(self): return getattr(self._rect, name)
var centery
-
Source code
def get(self): return getattr(self._rect, name)
var height
-
Source code
def get(self): return getattr(self._rect, name)
var left
-
Source code
def get(self): return getattr(self._rect, name)
var midbottom
-
Source code
def get(self): return getattr(self._rect, name)
var midleft
-
Source code
def get(self): return getattr(self._rect, name)
var midright
-
Source code
def get(self): return getattr(self._rect, name)
var midtop
-
Source code
def get(self): return getattr(self._rect, name)
var right
-
Source code
def get(self): return getattr(self._rect, name)
var size
-
Source code
def get(self): return getattr(self._rect, name)
var top
-
Source code
def get(self): return getattr(self._rect, name)
var topleft
-
Source code
def get(self): return getattr(self._rect, name)
var topright
-
Source code
def get(self): return getattr(self._rect, name)
var width
-
Source code
def get(self): return getattr(self._rect, name)
Methods
def get_global_rect(self)
-
Source code
def get_global_rect(self): p = self.local_to_global_offset() pTuple = tuple(p) s = self.rect.size return Rect(pTuple, s)
def get_rect(self)
-
Source code
def get_rect(self): return self._rect
def global_to_local(self, p)
-
Converts the given coordinate pair from PyGame screen coordinates to the widget's local coordinate system.
Args
p
- The global coordinates
Returns
:The
widget's
local
coordinates
Source code
def global_to_local(self, p): """ Converts the given coordinate pair from PyGame screen coordinates to the widget's local coordinate system. Args: p: The global coordinates Returns: The widget's local coordinates """ return subtract(p, self.local_to_global_offset())
def local_to_global(self, p)
-
Converts the given coordinate pair from the widget's local coordinate system to PyGame screen coordinates.
Args
p
- Widget local coordinates
Returns
:global
coordinates
Source code
def local_to_global(self, p): """ Converts the given coordinate pair from the widget's local coordinate system to PyGame screen coordinates. Args: p: Widget local coordinates Returns: global coordinates """ return add(p, self.local_to_global_offset())
def local_to_global_offset(self)
-
Source code
def local_to_global_offset(self): d = self.topleft parent = self.parent if parent: d = add(d, parent.local_to_global_offset()) return d
def parent_resized(self, dw, dh)
-
Called when the widget's parent changes size as a result of assigning to its width, height or size attributes, with (dw, dh) being the amount of the change. The default is to resize and/or reposition the widget according to its anchor attribute.
Args
dw
- Width
dh
- Height
Source code
def parent_resized(self, dw, dh): """ Called when the widget's parent changes size as a result of assigning to its width, height or size attributes, with (dw, dh) being the amount of the change. The default is to resize and/or reposition the widget according to its anchor attribute. Args: dw: Width dh: Height """ debug_resize = self.debug_resize or self.parent.debug_resize if debug_resize: self.logger.info(f"AlbowRect.parent_resized {self}, by ({dw}, {dh})") left, top, width, height = self._rect move = False resize = False anchor = self.anchor if dw and 'r' in anchor: if 'l' in anchor: resize = True width += dw else: move = True left += dw if dh and 'b' in anchor: if 't' in anchor: resize = True height += dh else: move = True top += dh if resize: if debug_resize: self.logger.info(f"AlbowRect.parent_resized: changing rect to ({left}, {top}, {width}, {height})") self.rect = (left, top, width, height) elif move: if debug_resize: self.logger.info(f"AlbowRect.parent_resized: moving to (%{left},{top})") self._rect.topleft = (left, top)
def resized(self, dw, dh)
-
Called when the widget changes size as a result of assigning to its width, height or size attributes, with (dw, dh) being the amount of the change. The default is to call parent_resized on each of its subwidgets.
Args
dw
- width
dh
- height
Source code
def resized(self, dw, dh): """ Called when the widget changes size as a result of assigning to its width, height or size attributes, with (dw, dh) being the amount of the change. The default is to call parent_resized on each of its subwidgets. Args: dw: width dh: height """ if self.debug_resize: self.logger.info(f"AlbowRect.resized: {self} by: ({dw}, {dh}) to {self.size}") for widget in self.subwidgets: widget.parent_resized(dw, dh)
def set_rect(self, x)
-
Source code
def set_rect(self, x): old_size = self._rect.size self._rect = Rect(x) self._resized(old_size[0], old_size[1])