1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 __maintainer__ = 'Florian Boucault <florian@fluendo.com>'
19
20
21 import os, math
22 import weakref
23
24 from twisted.internet import reactor
25
26 import pgm
27
28 from pgm.timing import implicit
29 from pgm.graph.image import Image
30
31 from poblenou_widgets.circular_list import *
32
33 from elisa.core import common
34 from elisa.core.media_manager import MediaProviderNotFound
35 from elisa.core import plugin_registry
36
37 from list_cache import CacheList
38
39 BaseNodeView = plugin_registry.get_component_class('base:node_view')
40
42
43 supported_controllers = ('poblenou:node_controller',)
44
46 super(NodeView, self).__init__()
47 self.context_path = 'pigment:pigment_context'
48 self.context_handle = None
49
50
51
52 self._update_delay = 0.400
53 self._update_delayed_call = None
54 self._update_needed = True
55
56 self._representation = None
57
58
59 self._menu = None
60 self._animated_menu = None
61
62
63 self._preloaded_children = 25
64
65 self._opacity = [0, 5, 25]
66
79
88
92
99
101 canvas = self.frontend.context.canvas
102
103 old_menu_widget = self._menu
104
105 self._create_list_menu()
106
107 if old_menu_widget != None:
108 old_widgets = old_menu_widget.widgets
109 old_animated_widgets = old_menu_widget.animated_widgets
110 old_selection = old_menu_widget.selected_item
111 self.root.root_group.remove(old_menu_widget)
112
113 for animated_widget in old_animated_widgets:
114 animated_widget.stop_animations()
115
116 for widget in old_widgets:
117 self._menu.append(widget)
118
119 self._menu.selected_item = old_selection
120
121
122 self._menu.fg_color = (255, 255, 255, 255)
123 self._menu.bg_color = (0, 0, 0, 0)
124
125 self.root.root_group.add(self._menu)
126
127 self._animated_menu = implicit.AnimatedObject(self._menu)
128 menu = self._animated_menu
129 menu.mode = implicit.REPLACE
130 menu.setup_next_animations(duration = 350,
131 transformation = implicit.DECELERATE)
132 self.context_handle = self._animated_menu
133
134 self._scale_menu()
135 self._menu.visible = True
136
138
139 canvas = self.frontend.context.canvas
140
141 x = 0.0
142 y = canvas.height * (1.0 - 0.560)
143 z_step = 500.0
144 self._hidden_position = (x, y, 500.0)
145 self._position = [(x, y, z) for z in range(-z_step*3, 0.0, z_step)]
146 self._selected_position = (x, y, 0.0)
147
148
149 self._menu.width = canvas.width
150 self._menu.height = canvas.height/3.0
151 self._menu.visible_items = 11
152
153 if self.controller.selected:
154 self._menu.opacity = 255
155 self._menu.position = self._selected_position
156 self.hide_parents(2)
157 self.hide_children()
158 else:
159 self._animated_menu.position = self._hidden_position
160 self._animated_menu.opacity = 0
161
188
207
208 def error(error):
209 self.warning(error)
210 image_path = self.frontend.theme.get_media('unknown_icon')
211 image.set_from_file(image_path)
212 image.set_name(image_path)
213
214 dfr2.addCallback(display).addErrback(error)
215
216 def error(error):
217 self.warning(error)
218 image_path = self.frontend.theme.get_media('unknown_icon')
219 image.set_from_file(image_path)
220 image.set_name(image_path)
221
222 dfr.addCallback(got_media_type).addErrback(error)
223
224
229
231 super(NodeView, self).attribute_set(origin, key, old_value, new_value)
232 if key == 'current_index':
233 self.debug("new index for %s: %s" % (self, new_value))
234
235 if self._menu != None:
236 if new_value == old_value:
237 return
238
239 self._cache_menu.current_index = new_value
240 if self.controller.selected:
241
242
243
244 if self._update_delayed_call == None or \
245 not self._update_delayed_call.active():
246 self._update_selection()
247 self._update_needed = False
248
249 def update_if_needed():
250 if self._update_needed:
251 self._update_selection()
252 self._update_needed = False
253 call = reactor.callLater(self._update_delay,
254 update_if_needed)
255 self._update_delayed_call = call
256
257 call = reactor.callLater(self._update_delay,
258 update_if_needed)
259 self._update_delayed_call = call
260 else:
261 self._update_needed = True
262
263 elif key == 'selected':
264 self.debug("%s (un)selected: %s" % (self, new_value))
265 if new_value:
266 if self._animated_menu != None:
267 self._animated_menu.opacity = 255
268 self._animated_menu.position = self._selected_position
269
270 self._update_selection()
271
272 self.hide_parents(2)
273 self.hide_children()
274
275 self.root.display_loading(self.controller.model.loading)
276
277 elif key == 'loading':
278 self.debug("%s loading: %s" % (self, new_value))
279 if new_value == old_value or not self.controller.selected:
280 return
281
282 if new_value == True:
283 self.root.display_loading(True)
284 else:
285 if self.controller.model.has_children:
286 self.root.display_loading(False)
287 else:
288 self.root.display_empty(True)
289
290 elif key == 'thumbnail_source':
291 if self._representation != None:
292 widget = self._representation()
293 if widget != None:
294 self._thumbnail_source_to_image(new_value, widget)
295
296 elif key == 'theme_icon':
297 widget = None
298 if self._representation != None:
299 widget = self._representation()
300
301 if self.controller.model.thumbnail_source == None and \
302 widget != None:
303 icon = self.controller.model.theme_icon
304 image_path = self.frontend.theme.get_media(icon)
305 widget.set_from_file(image_path)
306
307 elif key == 'visualisation_mode':
308 self.info("Switching to %s mode" % new_value)
309 self._create_menu()
310
311 elif key == 'has_children':
312 if isinstance(self.parent, NodeView):
313 self.parent._display_arrow()
314
315 if new_value:
316 self.root.display_loading(False)
317
325
331
333 if self._menu != None:
334 self._animated_menu.opacity = 0
335 self._animated_menu.position = self._hidden_position
336
347
348 - def removed(self, elements, position):
349 self.debug("%s got a REMOVED at %s for %s elements" % \
350 (self, position, len(elements)))
351
352
353 if len(elements) > 1:
354 self.warning("Support for multiple elements removal not yet \
355 implemented")
356 return
357
358 self._cache_menu.pop(position)
359 super(NodeView, self).removed(elements, position)
360
361 if len(self) == 0:
362 self.debug("Menu of %s is empty: setting it to None" % self)
363 self._menu = None
364 elif self.controller.selected:
365 self.debug("%s is updating the menu" % self)
366 self._update_selection()
367
371
382
393
427