1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import gobject
24 import gtk
25
26 from flumotion.common import planet, errors, common, log
27
28
31 """
32 @param admingtk: the GTK Admin with its nodes
33 @type admingtk: L{flumotion.component.base.admin_gtk.BaseAdminGtk}
34
35 """
36 gtk.Notebook.__init__(self)
37 self.admingtk = admingtk
38 admingtk.setup()
39 self.nodes = admingtk.getNodes()
40 self._setup_pages()
41 self.show()
42
43 - def _setup_pages(self):
44 for name, node in self.nodes.items():
45 table = gtk.Table(1,1)
46 table.show()
47 table.add(gtk.Label('Loading UI for %s...' % name))
48 title = node.title
49 if not title:
50
51
52 self.warning("Component node %s does not have a "
53 "translateable title. Please file a bug." % name)
54
55
56 title = name
57
58 label = gtk.Label(title)
59 label.show()
60 self.append_page(table, label)
61
62 def got_widget(w, name, table, node):
63
64 if w.get_parent():
65 w.get_parent().remove(w)
66 map(table.remove, table.get_children())
67 table.add(w)
68 w.show()
69 node.render().addCallback(got_widget, name, table, node)
70
71 (OBJECT_UNSET,
72 OBJECT_INACTIVE,
73 OBJECT_ACTIVE) = range(3)
74
76 logCategory = 'componentview'
77
86
89
93
97
98 def no_bundle(failure):
99 failure.trap(errors.NoBundleError)
100 self.debug(
101 'No specific GTK admin for this component, using default')
102 return ("flumotion/component/base/admin_gtk.py", "BaseAdminGtk")
103
104 def got_entry_point((filename, procname)):
105
106
107
108
109 modname = common.pathToModuleName(filename)
110 return admin.getBundledFunction(modname, procname)
111
112 def got_factory(factory):
113
114 return lambda: NodeBook(factory(state, admin))
115
116 def sleeping_component(failure):
117 failure.trap(errors.SleepingComponentError)
118 return lambda: gtk.Label('Component %s is still sleeping' %
119 state.get('name'))
120
121 admin = self.get_admin_for_object(state)
122 if not isinstance(state, planet.AdminComponentState):
123 return not_component_state
124
125 d = admin.callRemote('getEntryByType', state, 'admin/gtk')
126 d.addErrback(no_bundle)
127 d.addCallback(got_entry_point)
128 d.addCallback(got_factory)
129 d.addErrback(sleeping_component)
130 return d
131
135 def set(state, key, value):
136 if key == 'mood':
137 if (value != planet.moods.lost.value
138 and value != planet.moods.sleeping.value):
139 self._set_state(OBJECT_ACTIVE)
140 else:
141 self._set_state(OBJECT_INACTIVE)
142
143 assert self.object is not None
144 self.object.addListener(self, invalidate=invalidate,
145 set=set)
146 if self.object.hasKey('mood'):
147 set(self.object, 'mood', self.object.get('mood'))
148
150 def got_widget_constructor(proc, callStamp):
151 if callStamp != self._callStamp:
152
153
154
155 self.debug('ignoring widget constructor %r, state %d, '
156 'callstamps %d/%d', proc, self._state,
157 callStamp, self._callStamp)
158 return
159 assert self.widget == None
160 self.widget = proc()
161 self.widget.show()
162 self.pack_start(self.widget, True, True)
163 return self.widget
164
165 self._callStamp += 1
166 callStamp = self._callStamp
167 d = self.get_widget_constructor(self.object)
168 d.addCallback(got_widget_constructor, callStamp)
169
171
172 self._callStamp += 1
173 if self.widget:
174 self.remove(self.widget)
175
176 if hasattr(self.widget, 'admingtk'):
177 if self.widget.admingtk:
178
179 if hasattr(self.widget.admingtk, 'cleanup'):
180 self.widget.admingtk.cleanup()
181 del self.widget.admingtk
182 self.widget = None
183
187
205
211
212 gobject.type_register(ComponentView)
213