Source code for enaml.widgets.constraints_widget

#------------------------------------------------------------------------------
# Copyright (c) 2013, Nucleic Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file LICENSE, distributed with this software.
#------------------------------------------------------------------------------
from atom.api import List, ForwardTyped, Typed

from enaml.core.declarative import d_, observe
from enaml.layout.constrainable import ConstrainableMixin, PolicyEnum

from .widget import Widget, ProxyWidget


class ProxyConstraintsWidget(ProxyWidget):
    """ The abstract definition of a proxy ConstraintsWidget object.

    """
    #: A reference to the ConstraintsWidget declaration.
    declaration = ForwardTyped(lambda: ConstraintsWidget)

    def request_relayout(self):
        raise NotImplementedError


[docs] class ConstraintsWidget(Widget, ConstrainableMixin): """ A Widget subclass which adds constraint information. A ConstraintsWidget is augmented with symbolic constraint variables which define a box model on the widget. This box model is used to declare constraints between this widget and other components which participate in constraints-based layout. Constraints are added to a widget by assigning a list to the 'constraints' attribute. This list may contain raw Constraint objects, which are created by manipulating the symbolic constraint variables, or ConstraintHelper objects which generate Constraint objects on request. """ #: The list of user-specified constraints or ConstraintHelpers. constraints = d_(List()) # Redefine the policy enums as declarative members. The docs on # the ConstrainableMixin class provide their full explanation. hug_width = d_(PolicyEnum('strong')) hug_height = d_(PolicyEnum('strong')) resist_width = d_(PolicyEnum('strong')) resist_height = d_(PolicyEnum('strong')) limit_width = d_(PolicyEnum('ignore')) limit_height = d_(PolicyEnum('ignore')) #: A reference to the ProxyConstraintsWidget object. proxy = Typed(ProxyConstraintsWidget) #-------------------------------------------------------------------------- # Observers #-------------------------------------------------------------------------- @observe( 'constraints', 'hug_width', 'hug_height', 'resist_width', 'resist_height', 'limit_width', 'limit_height', 'visible') def _layout_invalidated(self, change): """ An observer which will relayout the proxy widget. """ if change['type'] == 'update': self.request_relayout() #-------------------------------------------------------------------------- # Public API #--------------------------------------------------------------------------
[docs] def request_relayout(self): """ Request a relayout from the proxy widget. This will invoke the 'request_relayout' method on an active proxy. The proxy should collapse the requests as necessary. """ if self.proxy_is_active: self.proxy.request_relayout()
[docs] def when(self, switch): """ A method which returns `self` or None based on the truthness of the argument. This can be useful to easily turn off the effects of an object in constraints-based layout. Parameters ---------- switch : bool A boolean which indicates whether this instance or None should be returned. Returns ------- result : self or None If 'switch' is boolean True, self is returned. Otherwise, None is returned. """ if switch: return self
[docs] def layout_constraints(self): """ Get the constraints to use for this component's layout. This method may be overridden by subclasses as needed to create custom constraints. It will be called when the relayout request has been made by the layout engine. The default implementation will return the list of 'constraints' defined by the user. """ return self.constraints