1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 from common import *
25 from widget import Widget
26 from listbox import GenericListmodel
27
29 """
30 A dropdown or combo box widget for selecting lists of strings.
31
32 New Attributes
33 ==============
34
35 - items: A List of strings. This can be treated like an ordinary python list.
36 but only strings are allowed.
37 - selected: The index of the selected item in the list. Starting from C{0} to C{len(items)-1}.
38 A negative value indicates, that no item is selected.
39 - selected_item: The selected string itself, or C{None} - if no string is selected.
40
41 Data
42 ====
43 The selected attribute can be read and set via L{distributeData} and L{collectData}.
44 The list items can be set via L{distributeInitialData}.
45 """
46
47 DEFAULT_ITEMS = []
48
49 - def __init__(self,
50 parent = None,
51 name = None,
52 size = None,
53 min_size = None,
54 max_size = None,
55 helptext = None,
56 position = None,
57 style = None,
58 hexpand = None,
59 vexpand = None,
60 font = None,
61 base_color = None,
62 background_color = None,
63 foreground_color = None,
64 selection_color = None,
65 border_size = None,
66 position_technique = None,
67 is_focusable = None,
68 comment = None,
69 items = None,
70 selected = None):
71
72 if items is None:
73 self._items = GenericListmodel(*self.DEFAULT_ITEMS)
74 else:
75 if type(items) is list:
76 self._items = GenericListmodel(*items)
77 else:
78 raise RuntimeError("items parameter must be a list!")
79
80 if selected is not None and items is not None:
81 if len(items) > 0 and selected < len(items) and selected > 0:
82 self.selected = selected
83 else:
84 raise RuntimeError("Invalid selected item index specified for dropdown!")
85 elif selected is None and items is not None:
86 if len(items) > 0:
87 self.selected = 0
88
89 self.real_widget = fife.DropDown(self._items)
90 super(DropDown,self).__init__(parent=parent,
91 name=name,
92 size=size,
93 min_size=min_size,
94 max_size=max_size,
95 helptext=helptext,
96 position=position,
97 style=style,
98 hexpand=hexpand,
99 vexpand=vexpand,
100 font=font,
101 base_color=base_color,
102 background_color=background_color,
103 foreground_color=foreground_color,
104 selection_color=selection_color,
105 border_size=border_size,
106 position_technique=position_technique,
107 is_focusable=is_focusable,
108 comment=comment)
109
110
111 self.accepts_initial_data = True
112 self._realSetInitialData = self._setItems
113
114 self.accepts_data = True
115 self._realSetData = self._setSelected
116 self._realGetData = self._getSelected
117
118 - def clone(self, prefix):
119
120 itemsList = []
121
122 for i in range(self.items.getNumberOfElements()):
123 itemsList.append(self.items.getElementAt(i))
124
125 dropdownClone = DropDown(None,
126 self._createNameWithPrefix(prefix),
127 self.size,
128 self.min_size,
129 self.max_size,
130 self.helptext,
131 self.position,
132 self.style,
133 self.hexpand,
134 self.vexpand,
135 self.font,
136 self.base_color,
137 self.background_color,
138 self.foreground_color,
139 self.selection_color,
140 self.border_size,
141 self.position_technique,
142 self.is_focusable,
143 self.comment,
144 itemsList,
145 self.selected)
146
147 return dropdownClone
148
149 - def resizeToContent(self,recurse=True):
150
151
152 _item_widths = map(self.real_font.getWidth, map(text2gui, map(unicode, self._items))) + [self.real_font.getHeight()]
153 max_w = max(_item_widths)
154 self.width = max_w
155 self.height = (self.real_font.getHeight() + 2)
156
159
160
161
162
163 if id(items) != id(self._items):
164 self._items.clear()
165 self._items.extend(items)
166 items = property(_getItems,_setItems)
167
170 selected = property(_getSelected,_setSelected)
172 if 0 <= self.selected < len(self._items):
173 return self._items[self.selected]
174 return None
175 selected_item = property(_getSelectedItem)
176