Update padding to use CssListProperty instead of NumericProperty.

This commit is contained in:
Ian Foote 2013-03-24 20:20:47 +00:00
parent fd1b2c6bd1
commit 93c1aa25d5
1 changed files with 38 additions and 22 deletions

View File

@ -61,7 +61,7 @@ You can check the `examples/widgets/boxlayout_poshint.py` for a live example.
__all__ = ('BoxLayout', )
from kivy.uix.layout import Layout
from kivy.properties import NumericProperty, OptionProperty
from kivy.properties import NumericProperty, OptionProperty, CssListProperty
class BoxLayout(Layout):
@ -75,11 +75,23 @@ class BoxLayout(Layout):
0.
'''
padding = NumericProperty(0)
padding = CssListProperty([0, 0, 0, 0])
'''Padding between layout box and children, in pixels.
:data:`padding` is a :class:`~kivy.properties.NumericProperty`, default to
0.
padding[0] represents the left padding, padding[1] the right padding,
padding[2] the top padding and padding[3] the bottom padding.
If padding is given only two arguments, the first will represent left and
right padding, and the second top and bottom padding.
If padding is given only one argument, it will represent all four
directions.
.. versionchanged:: 1.7.0
Replaced NumericProperty with CssListProperty.
:data:`padding` is a :class:`~kivy.properties.CssListProperty`, default to
[0, 0, 0, 0].
'''
orientation = OptionProperty('horizontal', options=(
@ -110,16 +122,20 @@ class BoxLayout(Layout):
selfy = self.y
selfw = self.width
selfh = self.height
padding = self.padding
padding_left = self.padding[0]
padding_right = self.padding[1]
padding_top = self.padding[2]
padding_bottom = self.padding[3]
spacing = self.spacing
orientation = self.orientation
padding2 = padding * 2
padding_x = padding_left + padding_right
padding_y = padding_top + padding_bottom
# calculate maximum space used by size_hint
stretch_weight_x = 0.
stretch_weight_y = 0.
minimum_size_x = padding2 + spacing * (len_children - 1)
minimum_size_y = minimum_size_x
minimum_size_x = padding_x + spacing * (len_children - 1)
minimum_size_y = padding_y + spacing * (len_children - 1)
for w in self.children:
shw = w.size_hint_x
shh = w.size_hint_y
@ -133,7 +149,7 @@ class BoxLayout(Layout):
stretch_weight_y += shh
if orientation == 'horizontal':
x = y = padding
x = padding_left
stretch_space = max(0.0, selfw - minimum_size_x)
for c in reversed(self.children):
shw = c.size_hint_x
@ -141,21 +157,21 @@ class BoxLayout(Layout):
w = c.width
h = c.height
cx = selfx + x
cy = selfy + y
cy = selfy + padding_bottom
if shw:
w = stretch_space * shw / stretch_weight_x
if shh:
h = shh * (selfh - padding2)
h = shh * (selfh - padding_y)
for key, value in c.pos_hint.iteritems():
posy = value * (selfh - padding2)
posy = value * (selfh - padding_y)
if key == 'y':
cy += y + posy
cy += padding_bottom + posy
elif key == 'top':
cy += y + posy - h
cy += padding_bottom + posy - h
elif key == 'center_y':
cy += y - h / 2. + posy
cy += padding_bottom - h / 2. + posy
c.x = cx
c.y = cy
@ -164,29 +180,29 @@ class BoxLayout(Layout):
x += w + spacing
if orientation == 'vertical':
x = y = padding
y = padding_bottom
stretch_space = max(0.0, selfh - minimum_size_y)
for c in self.children:
shw = c.size_hint_x
shh = c.size_hint_y
w = c.width
h = c.height
cx = selfx + x
cx = selfx + padding_left
cy = selfy + y
if shh:
h = stretch_space * shh / stretch_weight_y
if shw:
w = shw * (selfw - padding2)
w = shw * (selfw - padding_x)
for key, value in c.pos_hint.iteritems():
posx = value * (selfw - padding2)
posx = value * (selfw - padding_x)
if key == 'x':
cx += x + posx
cx += padding_left + posx
elif key == 'right':
cx += x + posx - w
cx += padding_left + posx - w
elif key == 'center_x':
cx += x - w / 2. + posx
cx += padding_left - w / 2. + posx
c.x = cx
c.y = cy