Source code for enaml.core.conditional

# 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 Bool, List

from .compiler_nodes import new_scope
from .declarative import d_
from .pattern import Pattern

[docs] class Conditional(Pattern): """ A pattern object that represents conditional objects. When the `condition` attribute is True, the conditional will create its child items and insert them into its parent; when False, the old items will be destroyed. """ #: The condition variable. If this is True, a copy of the children #: will be inserted into the parent. Otherwise, the old copies will #: be destroyed. condition = d_(Bool(True)) #: The list of items created by the conditional. This list should #: not be manipulated directly by user code. items = List() #-------------------------------------------------------------------------- # Lifetime API #--------------------------------------------------------------------------
[docs] def destroy(self): """ A reimplemented destructor. The conditional will release the owned items on destruction. """ super(Conditional, self).destroy() del self.items
#-------------------------------------------------------------------------- # Observers #-------------------------------------------------------------------------- def _observe_condition(self, change): """ A private observer for the `condition` attribute. If the condition changes while the conditional is active, the items will be refreshed. """ if change['type'] == 'update' and self.is_initialized: self.refresh_items() #-------------------------------------------------------------------------- # Pattern API #--------------------------------------------------------------------------
[docs] def pattern_items(self): """ Get a list of items created by the pattern. """ return self.items[:]
[docs] def refresh_items(self): """ Refresh the items of the pattern. This method destroys the old items and creates and initializes the new items. """ items = [] if self.condition: for nodes, key, f_locals in self.pattern_nodes: with new_scope(key, f_locals): for node in nodes: child = node(None) if isinstance(child, list): items.extend(child) else: items.append(child) for old in self.items: if not old.is_destroyed: old.destroy() if len(items) > 0: self.parent.insert_children(self, items) self.items = items