Source code for traitsui.instance_choice

# (C) Copyright 2004-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!

""" Defines the various instance descriptors used by the instance editor and
    instance editor factory classes.
"""

from abc import abstractmethod

from traits.api import (
    ABCHasStrictTraits,
    Str,
    Any,
    Dict,
    Tuple,
    Callable,
    Bool,
)

from .ui_traits import AView

from .helper import user_name_for


[docs]class InstanceChoiceItem(ABCHasStrictTraits): # ------------------------------------------------------------------------- # Trait definitions: # ------------------------------------------------------------------------- #: User interface name for the item name = Str() #: View associated with this item view = AView #: Does this item create new instances? is_factory = Bool(False)
[docs] def get_name(self, object=None): """Returns the name of the item.""" return self.name
[docs] def get_view(self): """Returns the view associated with the object.""" return self.view
[docs] @abstractmethod def get_object(self): """Returns the object associated with the item.""" pass
[docs] @abstractmethod def is_compatible(self, object): """Indicates whether a specified object is compatible with the item.""" pass
[docs] def is_selectable(self): """Indicates whether the item can be selected by the user.""" return True
[docs] def is_droppable(self): """Indicates whether the item supports drag and drop.""" return False
[docs]class InstanceChoice(InstanceChoiceItem): # ------------------------------------------------------------------------- # Trait definitions: # ------------------------------------------------------------------------- #: Object associated with the item object = Any() #: The name of the object trait containing its user interface name: name_trait = Str("name")
[docs] def get_name(self, object=None): """Returns the name of the item.""" if self.name != "": return self.name name = getattr(self.object, self.name_trait, None) if isinstance(name, str): return name return user_name_for(self.object.__class__.__name__)
[docs] def get_object(self): """Returns the object associated with the item.""" return self.object
[docs] def is_compatible(self, object): """Indicates whether a specified object is compatible with the item.""" return object is self.object
[docs]class InstanceFactoryChoice(InstanceChoiceItem): # ------------------------------------------------------------------------- # Trait definitions: # ------------------------------------------------------------------------- #: Indicates whether an instance compatible with this item can be dragged #: and dropped rather than created droppable = Bool(False) #: Indicates whether the item can be selected by the user selectable = Bool(True) #: A class (or other callable) that can be used to create an item #: compatible with this item klass = Callable() #: Tuple of arguments to pass to **klass** to create an instance args = Tuple() #: Dictionary of arguments to pass to **klass** to create an instance kw_args = Dict(Str, Any) #: Does this item create new instances? This value overrides the default. is_factory = True
[docs] def get_name(self, object=None): """Returns the name of the item.""" if self.name != "": return self.name name = getattr(object, "name", None) if isinstance(name, str): return name if issubclass(type(self.klass), type): klass = self.klass else: klass = self.get_object().__class__ return user_name_for(klass.__name__)
[docs] def get_object(self): """Returns the object associated with the item.""" return self.klass(*self.args, **self.kw_args)
[docs] def is_droppable(self): """Indicates whether the item supports drag and drop.""" return self.droppable
[docs] def is_compatible(self, object): """Indicates whether a specified object is compatible with the item.""" if issubclass(type(self.klass), type): return isinstance(object, self.klass) return isinstance(object, self.get_object().__class__)
[docs] def is_selectable(self): """Indicates whether the item can be selected by the user.""" return self.selectable
[docs]class InstanceDropChoice(InstanceFactoryChoice): # ------------------------------------------------------------------------- # Trait definitions: # ------------------------------------------------------------------------- #: Indicates whether an instance compatible with this item can be dragged #: and dropped rather than created . This value overrides the default. droppable = True #: Indicates whether the item can be selected by the user. This value #: overrides the default. selectable = False #: Does this item create new instances? This value overrides the default. is_factory = False