Source code for apptools.selection.list_selection
# (C) Copyright 2005-2024 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!
from traits.api import HasTraits, List, provides, Str
from apptools.selection.i_selection import IListSelection
[docs]@provides(IListSelection)
class ListSelection(HasTraits):
"""Selection for ordered sequences of items.
This is the default implementation of the :class:`~.IListSelection`
interface.
"""
#### 'ISelection' protocol ################################################
#: ID of the selection provider that created this selection object.
provider_id = Str
[docs] def is_empty(self):
""" Is the selection empty? """
return len(self.items) == 0
#### 'IListSelection' protocol ############################################
#: Selected objects.
items = List
#: Indices of the selected objects in the selection provider.
indices = List
#### 'ListSelection' class protocol #######################################
[docs] @classmethod
def from_available_items(cls, provider_id, selected, all_items):
"""Create a list selection given a list of all available items.
Fills in the required information (in particular, the indices) based
on a list of selected items and a list of all available items.
.. note::
- The list of available items must not contain any duplicate items.
- It is expected that ``selected`` is populated by items in
``all_items``.
"""
number_of_items = len(all_items)
indices = []
for item in selected:
for index in range(number_of_items):
if all_items[index] is item:
indices.append(index)
break
else:
msg = "Selected item: {!r}, could not be found"
raise ValueError(msg.format(item))
return cls(provider_id=provider_id, items=selected, indices=indices)