1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """widget holder displaying a component specific views"""
23
24 import gettext
25 import os
26
27 import gobject
28 import gtk
29
30 from flumotion.common import componentui, log
31 from flumotion.common.common import pathToModuleName
32 from flumotion.common.errors import NoBundleError, SleepingComponentError
33 from flumotion.common.planet import AdminComponentState, moods
34
35
36 componentui
37
38 __version__ = "$Rev: 6990 $"
39 _ = gettext.gettext
40 _DEBUG_ONLY_PAGES = ['Eaters', 'Feeders', 'Properties']
41 (COMPONENT_UNSET,
42 COMPONENT_INACTIVE,
43 COMPONENT_ACTIVE) = range(3)
44
45
47 """A placeholder contains a Widget subclass of a specific
48 component.
49 """
50
54
56 """Set if debug should be enabled.
57 Not all pages are visible unless debugging is set to true
58 @param enable: if debug should be enabled
59 """
60
62 """Called when the placeholder is inactivated, eg
63 detached from the parent"""
64
65
67 """This is a placeholder containing a notebook with tabs
68 """
69 logCategory = 'nodebook'
70
72 """
73 @param admingtk: the GTK Admin with its nodes
74 @type admingtk: L{flumotion.component.base.admin_gtk.BaseAdminGtk}
75 """
76 self._debugEnabled = False
77 self._admingtk = admingtk
78 self._notebook = None
79 self._pageWidgets = {}
80
81 self._notebook = gtk.Notebook()
82 admingtk.setup()
83 self.nodes = admingtk.getNodes()
84 self._appendPages()
85 self._notebook.show()
86
87
90
92 if self._admingtk:
93
94 if hasattr(self._admingtk, 'cleanup'):
95 self._admingtk.cleanup()
96 self._admingtk = None
97
99 self._debugEnabled = enabled
100 if self._admingtk:
101 self._admingtk.setDebugEnabled(enabled)
102 for name in _DEBUG_ONLY_PAGES:
103 widget = self._pageWidgets.get(name)
104 if widget is None:
105 continue
106 widget.set_property('visible', enabled)
107
116
117 - def _addPage(self, name):
118 node = self.nodes.get(name)
119 assert node is not None, name
120
121 table = gtk.Table(1, 1)
122 table.add(gtk.Label(_('Loading UI for %s...') % name))
123 label = self._getTitleLabel(node, name)
124 label.show()
125 self._notebook.append_page(table, label)
126
127 d = node.render()
128 d.addCallback(self._renderWidget, table)
129 return table
130
131 - def _appendPages(self):
132 for name in self.nodes.keys():
133 table = self._addPage(name)
134 self._pageWidgets[name] = table
135
136 if name in _DEBUG_ONLY_PAGES:
137 if self._debugEnabled:
138 continue
139 table.show()
140
153
154
156 """This is a placeholder with a label, with or without a text"""
159
162
163
165 """This is a placeholder used to display a Planet"""
167 self._widget = gtk.Label('')
168
171
172
174 logCategory = 'componentview'
175
177 gtk.VBox.__init__(self)
178 self._admin = None
179 self._currentComponentState = None
180 self._currentPlaceholder = None
181 self._debugEnabled = False
182 self._state = COMPONENT_UNSET
183
184 self._planetPlaceholder = PlanetPlaceholder()
185 self._addPlaceholder(self._planetPlaceholder)
186
187
188
190 """Find out if debug is enabled
191 @returns: if debug is enabled
192 @rtype: bool
193 """
194 return self._debugEnabled
195
197 """Sets if debug should be enabled
198 @param enabled: if debug should be enabled
199 @type enabled: bool
200 """
201 self._debugEnabled = enabled
202 if self._currentPlaceholder:
203 self._currentPlaceholder.setDebugEnabled(enabled)
204
214
216 """Sets a single global admin for the component view
217 @param admin: the admin
218 @type admin: L{flumotion.admin.model.AdminModel}
219 """
220 self._admin = admin
221
223 """Get the admin for a specific component
224 @param component: component
225 @type component: L{flumotion.common.component.AdminComponentState}
226 @returns: the admin
227 @rtype: L{flumotion.admin.model.AdminModel}
228 """
229
230 return self._admin
231
232
233
235 if not isinstance(placeholder, Placeholder):
236 raise AssertionError(
237 "placeholder must be a Placeholder subclass, not %r" % (
238 placeholder,))
239
240 widget = placeholder.getWidget()
241 widget.show()
242 self.pack_start(widget, True, True)
243
244 placeholder.setDebugEnabled(self._debugEnabled)
245 self._currentPlaceholder = placeholder
246
252
262
263 def oldVersion(failure):
264
265
266
267
268
269
270
271 failure.trap(AttributeError)
272
273 return admin.callRemote(
274 'getEntryByType', componentState, 'admin/gtk')
275
276 def gotEntryPoint((filename, procname)):
277
278
279
280 filename = filename.replace('/', os.path.sep)
281
282
283 modname = pathToModuleName(filename)
284 return admin.getBundledFunction(modname, procname)
285
286 def gotFactory(factory):
287
288 return NotebookPlaceholder(factory(componentState, admin))
289
290 def sleepingComponent(failure):
291 failure.trap(SleepingComponentError)
292 return LabelPlaceholder(_('Component %s is still sleeping') %
293 componentState.get('name'))
294
295 admin = self.getAdminForComponent(componentState)
296 componentType = componentState.get('type')
297 d = admin.callRemote('getEntryByType', componentType, 'admin/gtk')
298 d.addErrback(oldVersion)
299 d.addErrback(noBundle)
300 d.addCallback(gotEntryPoint)
301 d.addCallback(gotFactory)
302 d.addErrback(sleepingComponent)
303 return d
304
308 def set_(state, key, value):
309 if key != 'mood':
310 return
311 if value not in [moods.lost.value,
312 moods.sleeping.value,
313 moods.sad.value]:
314 self._setState(COMPONENT_ACTIVE)
315 else:
316 self._setState(COMPONENT_INACTIVE)
317
318 current = self._currentComponentState
319 assert current is not None
320 current.addListener(self, invalidate=invalidate, set_=set_)
321 if current.hasKey('mood'):
322 set_(current, 'mood', current.get('mood'))
323
325 def gotWidgetConstructor(placeholder, oldComponentState):
326 if oldComponentState != self._currentComponentState:
327
328
329
330 self.debug('ignoring component %r, state %d, state %r/%r' % (
331 placeholder, self._state,
332 oldComponentState, self._currentComponentState))
333 return
334 self._removePlaceholder(self._planetPlaceholder)
335 self._addPlaceholder(placeholder)
336
337 d = self._getWidgetConstructor(self._currentComponentState)
338 d.addCallback(gotWidgetConstructor, self._currentComponentState)
339
343
345 if self._currentComponentState:
346 self._currentComponentState.removeListener(self)
347 self._currentComponentState = None
348
366
367 gobject.type_register(ComponentView)
368