Source code for pyface.tree.tree_model
# (C) Copyright 2005-2023 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!
""" Model for tree views. """
from traits.api import Any, HasTraits, Event
from .node_event import NodeEvent
[docs]class TreeModel(HasTraits):
""" Model for tree views. """
# 'TreeModel' interface ------------------------------------------------
# The root of the model.
root = Any()
# Fired when nodes in the tree have changed in some way that affects their
# appearance but NOT their structure or position in the tree.
nodes_changed = Event(NodeEvent)
# Fired when nodes have been inserted into the tree.
nodes_inserted = Event(NodeEvent)
# Fired when nodes have been removed from the tree.
nodes_removed = Event(NodeEvent)
# Fired when nodes have been replaced in the tree.
nodes_replaced = Event(NodeEvent)
# Fire when the structure of the tree has changed DRASTICALLY from a given
# node down.
structure_changed = Event(NodeEvent)
# ------------------------------------------------------------------------
# 'TreeModel' interface.
# ------------------------------------------------------------------------
[docs] def has_children(self, node):
""" Returns True if a node has children, otherwise False.
This method is provided in case the model has an efficient way to
determine whether or not a node has any children without having to
actually get the children themselves.
"""
raise NotImplementedError()
[docs] def get_children(self, node):
""" Returns the children of a node. """
raise NotImplementedError()
[docs] def get_drag_value(self, node):
""" Get the value that is dragged for a node.
By default the drag value is the node itself.
"""
return node
[docs] def can_drop(self, node, obj):
""" Returns True if a node allows an object to be dropped onto it. """
return False
[docs] def drop(self, node, obj):
""" Drops an object onto a node. """
raise NotImplementedError()
[docs] def get_image(self, node, selected, expanded):
""" Returns the label image for a node.
Return None (the default) if no image is required.
"""
return None
[docs] def get_key(self, node):
""" Generate a unique key for a node. """
try:
key = hash(node)
except:
key = id(node)
return key
[docs] def get_selection_value(self, node):
""" Get the value that is used when a node is selected.
By default the selection value is the node itself.
"""
return node
[docs] def get_text(self, node):
""" Returns the label text for a node.
Return None if no text is required. By default we return 'str(node)'.
"""
return str(node)
[docs] def can_set_text(self, node, text):
""" Returns True if the node's label can be set. """
return len(text.strip()) > 0
[docs] def set_text(self, node, text):
""" Sets the label text for a node. """
pass
[docs] def is_collapsible(self, node):
""" Returns True if the node is collapsible, otherwise False. """
return True
[docs] def is_draggable(self, node):
""" Returns True if the node is draggable, otherwise False. """
return True
[docs] def is_editable(self, node):
""" Returns True if the node is editable, otherwise False.
If the node is editable, its text can be set via the UI.
"""
return False
[docs] def is_expandable(self, node):
""" Returns True if the node is expandanble, otherwise False. """
return True
[docs] def add_listener(self, node):
""" Adds a listener for changes to a node. """
pass
[docs] def remove_listener(self, node):
""" Removes a listener for changes to a node. """
pass
[docs] def fire_nodes_changed(self, node, children):
""" Fires the nodes changed event. """
self.nodes_changed = NodeEvent(node=node, children=children)
[docs] def fire_nodes_inserted(self, node, children):
""" Fires the nodes inserted event. """
self.nodes_inserted = NodeEvent(node=node, children=children)
[docs] def fire_nodes_removed(self, node, children):
""" Fires the nodes removed event. """
self.nodes_removed = NodeEvent(node=node, children=children)
[docs] def fire_nodes_replaced(self, node, old_children, new_children):
""" Fires the nodes removed event. """
self.nodes_replaced = NodeEvent(
node=node, old_children=old_children, children=new_children
)
[docs] def fire_structure_changed(self, node):
""" Fires the structure changed event. """
self.structure_changed = NodeEvent(node=node)
return