Source code for traitsui.editors.list_editor
# (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 list editor factory for the traits user interface toolkits..
"""
from traits.api import (
Any,
BaseTraitHandler,
Bool,
Callable,
Dict,
Enum,
HasTraits,
Instance,
Int,
Property,
PrototypedFrom,
Range,
Str,
Tuple,
)
from traitsui.editor_factory import EditorFactory
from traitsui.helper import DockStyle
from traitsui.item import Item
from traitsui.toolkit import toolkit_object
from traitsui.ui_traits import style_trait, AView
from traitsui.view import View
# -------------------------------------------------------------------------
# Trait definitions:
# -------------------------------------------------------------------------
#: Trait whose value is a BaseTraitHandler object
handler_trait = Instance(BaseTraitHandler)
#: The visible number of rows displayed
rows_trait = Range(1, 50, 5, desc="the number of list rows to display")
#: The visible number of columns displayed
columns_trait = Range(1, 10, 1, desc="the number of list columns to display")
editor_trait = Instance(EditorFactory)
[docs]class ListEditor(EditorFactory):
"""Editor factory for list editors."""
# -------------------------------------------------------------------------
# Trait definitions:
# -------------------------------------------------------------------------
#: The editor to use for each list item:
editor = editor_trait
#: Can the list be reorganized, or have items added and deleted.
mutable = Bool(True)
#: Should the scrollbars be displayed if the list is too long.
scrollable = Bool(True, sync_value=True)
#: The style of editor to use for each item:
style = style_trait
#: The trait handler for each list item:
trait_handler = handler_trait
#: The number of list rows to display:
rows = rows_trait
#: The number of list columns to create:
columns = columns_trait
#: Use a notebook for a custom view?
use_notebook = Bool(False)
#: Show a right-click context menu for the notebook tabs? (Qt only)
show_notebook_menu = Bool(False)
#: Factory that will be called to create and add a new element to this
#: list. If None, the default value for the trait of interest is used.
item_factory = Callable()
#: Tuple of positional arguments to be passed to the default factory
#: callable when creating new elements
item_factory_args = Tuple()
#: Dictionary of keyword arguments to be passed to the default factory
#: callable when creating new elements
item_factory_kwargs = Dict()
# -- Notebook Specific Traits ---------------------------------------------
#: Are notebook items deletable?
deletable = Bool(False)
#: The extended name of the trait on each page object which should be used
#: to determine whether or not an individual page should be deletable.
deletable_trait = Str()
#: FIXME: Currently, this trait is used only in the wx backend.
#: The DockWindow graphical theme
dock_theme = Any()
#: FIXME: Currently, this trait is used only in the wx backend.
#: Dock page style to use for each DockControl:
dock_style = DockStyle
#: Export class for each item in a notebook:
export = Str()
#: Name of the view to use in notebook mode:
view = AView
#: The type of UI to construct ('panel', 'subpanel', etc)
ui_kind = Enum("subpanel", "panel")
#: A factory function that can be used to define that actual object to be
#: edited (i.e. view_object = factory( object )):
factory = Callable()
#: Extended name to use for each notebook page. It can be either the actual
#: name or the name of an attribute on the object in the form:
#: '.name[.name...]'
page_name = Str()
#: Name of the [object.]trait[.trait...] to synchronize notebook page
#: selection with:
selected = Str()
# -------------------------------------------------------------------------
# Traits view definition:
# -------------------------------------------------------------------------
traits_view = View(
[
["use_notebook{Use a notebook in a custom view}", "|[Style]"],
[
Item("page_name", enabled_when="object.use_notebook"),
Item("view", enabled_when="object.use_notebook"),
"|[Notebook options]",
],
[
Item("rows", enabled_when="not object.use_notebook"),
"|[Number of list rows to display]<>",
],
]
)
# -------------------------------------------------------------------------
# 'Editor' factory methods:
# -------------------------------------------------------------------------
def _get_custom_editor_class(self):
if self.use_notebook:
return toolkit_object("list_editor:NotebookEditor")
return toolkit_object("list_editor:CustomEditor")
# -------------------------------------------------------------------------
# 'ListItemProxy' class:
# This class is used to update the list editors when the object changes
# external to the editor.
# -------------------------------------------------------------------------
[docs]class ListItemProxy(HasTraits):
#: The list proxy:
list = Property()
#: The item proxies index into the original list:
index = Int()
#: Delegate all other traits to the original object:
_ = PrototypedFrom("_zzz_object")
#: Define all of the private internal use values (the funny names are an
#: attempt to avoid name collisions with delegated trait names):
_zzz_inited = Any()
_zzz_object = Any()
_zzz_name = Any()
def __init__(self, object, name, index, trait, value):
super().__init__()
self._zzz_inited = False
self._zzz_object = object
self._zzz_name = name
self.index = index
if trait is not None:
self.add_trait("value", trait)
self.value = value
self._zzz_inited = self.index < len(self.list)
def _get_list(self):
return getattr(self._zzz_object, self._zzz_name)
def _value_changed(self, old_value, new_value):
if self._zzz_inited:
self.list[self.index] = new_value
# This alias is deprecated and will be removed in TraitsUI 8.
ToolkitEditorFactory = ListEditor