Source code for enaml.widgets.flow_area
#------------------------------------------------------------------------------
# Copyright (c) 2012, Enthought, Inc.
# All rights reserved.
#------------------------------------------------------------------------------
from traits.api import Enum, Range, Property, cached_property
from enaml.core.trait_types import CoercingInstance
from enaml.layout.geometry import Box
from .constraints_widget import ConstraintsWidget
from .flow_item import FlowItem
[docs]class FlowArea(ConstraintsWidget):
""" A widget which lays out its children in flowing manner, wrapping
around at the end of the available space.
"""
#: The flow direction of the layout.
direction = Enum(
'left_to_right', 'right_to_left', 'top_to_bottom', 'bottom_to_top'
)
#: The alignment of a line of items within the layout.
align = Enum('leading', 'trailing', 'center', 'justify')
#: The amount of horizontal space to place between items.
horizontal_spacing = Range(low=0, value=10)
#: The amount of vertical space to place between items.
vertical_spacing = Range(low=0, value=10)
#: The margins to use around the outside of the flow area.
margins = CoercingInstance(Box, (10, 10, 10, 10))
#: A read only property which returns the area's flow items.
flow_items = Property(depends_on='children')
#: A FlowArea expands freely in width and height by default.
hug_width = 'ignore'
hug_height = 'ignore'
#--------------------------------------------------------------------------
# Initialization
#--------------------------------------------------------------------------
[docs] def snapshot(self):
""" Returns the snapshot dict for the FlowArea.
"""
snap = super(FlowArea, self).snapshot()
snap['direction'] = self.direction
snap['align'] = self.align
snap['horizontal_spacing'] = self.horizontal_spacing
snap['vertical_spacing'] = self.vertical_spacing
snap['margins'] = self.margins
return snap
[docs] def bind(self):
""" Bind the change handler for the FlowItem.
"""
super(FlowArea, self).bind()
attrs = (
'direction', 'align', 'horizontal_spacing','vertical_spacing',
'margins',
)
self.publish_attributes(*attrs)
#--------------------------------------------------------------------------
# Private API
#--------------------------------------------------------------------------
@cached_property
def _get_flow_items(self):
""" The getter for the 'flow_items' property.
Returns
-------
result : tuple
The tuple of FlowItem children defined for this area.
"""
isinst = isinstance
items = (c for c in self.children if isinst(c, FlowItem))
return tuple(items)