File: list_selection.py

package info (click to toggle)
python-apptools 5.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,552 kB
  • sloc: python: 9,868; makefile: 80
file content (67 lines) | stat: -rw-r--r-- 2,280 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# (C) Copyright 2005-2025 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


@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

    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 #######################################

    @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)