Source code for enable.simple_layout

# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
"""Helper functions for a simple layout algorithm -- the same one used by
   OverlayPlotContainer.  Designed to be called from a container, but
   separated out because they are useful from ViewPort and Container"""


[docs]def simple_container_get_preferred_size(container, components=None): """ Returns the size (width,height) that is preferred for this component. Overrides PlotComponent. """ if container.fixed_preferred_size is not None: return container.fixed_preferred_size if container.resizable == "": return container.outer_bounds if components is None: components = container.components fit_components = getattr(container, "fit_components", "") # this is used to determine if we should use our default bounds no_visible_components = True max_width = 0.0 max_height = 0.0 if fit_components != "": for component in components: if not container._should_layout(component): continue no_visible_components = False pref_size = None if "h" in fit_components: pref_size = component.get_preferred_size() if pref_size[0] > max_width: max_width = pref_size[0] if "v" in fit_components: if pref_size is None: pref_size = component.get_preferred_size() if pref_size[1] > max_height: max_height = pref_size[1] if "h" not in fit_components: max_width = container.width if no_visible_components or (max_width == 0): max_width = container.default_size[0] if "v" not in fit_components: max_height = container.height if no_visible_components or (max_height == 0): max_height = container.default_size[1] # Add in our padding and border container._cached_preferred_size = ( max_width + container.hpadding, max_height + container.vpadding, ) return container._cached_preferred_size
[docs]def simple_container_do_layout(container, components=None): """ Actually performs a layout (called by do_layout()). """ if components is None: components = container.components x = container.x y = container.y width = container.width height = container.height for component in components: if hasattr(container, "_should_layout"): if not container._should_layout(component): continue position = list(component.outer_position) bounds = list(component.outer_bounds) if "h" in component.resizable: position[0] = 0 bounds[0] = width if "v" in component.resizable: position[1] = 0 bounds[1] = height # Set both bounds at once. This is a slight perforance fix because # it only fires two trait events instead of four. It is also needed # in order for the event-based aspect ratio enforcement code to work. component.outer_position = position component.outer_bounds = bounds # Tell all of our components to do a layout for component in components: component.do_layout()