Source code for enamlnative.widgets.fragment
"""
Copyright (c) 2017-2022, CodeLV.
Distributed under the terms of the MIT License.
The full license is in the file LICENSE, distributed with this software.
Created on May 20, 2017
"""
from atom.api import Bool, ForwardTyped, Typed, observe
from enaml.core.conditional import Conditional, new_scope
from enaml.core.declarative import d_
from enaml.widgets.toolkit_object import ProxyToolkitObject, ToolkitObject
class ProxyFragment(ProxyToolkitObject):
"""The abstract definition of a proxy fragment object."""
#: A reference to the Label declaration.
declaration = ForwardTyped(lambda: Fragment)
def set_cached(self, cached):
raise NotImplementedError
def set_defer_loading(self, defer):
raise NotImplementedError
[docs]class Fragment(Conditional, ToolkitObject):
"""Fragment a "sub" activity with a lifecycle, view, and state.
A fragment has no "widget" but it can have child
widgets that will define it's view. The children are rendered
when the fragment's view is requested.
"""
#: A reference to the proxy object.
proxy = Typed(ProxyFragment)
#: Don't destroy the view once loaded
cached = d_(Bool())
#: Defer loading of child nodes
defer_loading = d_(Bool(True))
[docs] def refresh_items(self):
"""Refresh the items of the pattern.
This method destroys the old items and creates and initializes
the new items.
It is overridden to NOT insert the children to the parent. The Fragment
adapter handles this.
"""
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()
#: Insert items into THIS node, NOT the PARENT
# if len(items) > 0:
# self.parent.insert_children(self, items)
self.items = items
@observe("cached", "defer_loading")
def _update_proxy(self, change):
"""Update the proxy"""
super()._update_proxy(change)