1 """
2 I provide the event/notification framework for Advene.
3
4 This framework is implemented on top of GTK (GObject) events. However, Advene
5 object do not inherit GObject, since they do not provide other functionalities
6 than events.
7 """
8
9 from advene.util.synchronized import enter_cs, exit_cs
10
11 import gobject
12
14 """
15 Base class of event delegate.
16 """
18 gobject.GObject.__init__(self)
19 self._boss = boss
20
22 """
23 Class for event-delegate for packages.
24 """
25 pass
26
28 """
29 Class for event-delegate for elements.
30 """
31 pass
32
34 original_handler = args[-1]
35 args = args[:-1]
36 return original_handler(gobj._boss, *args)
37
39 """
40 This mixin class assumes that the mixed-in class will provide a
41 `_make_event_delegate` method returning an instance of the appropriate
42 subclass of EventDelegate.
43 """
44
45 __event_delegate = None
46 __disabling_count = 0
47
48 - def connect(self, detailed_signal, handler, *args):
60
62 """Disconnect the handler associated to the given handler_id."""
63 assert self.has_handler(handler_id), "Handler-id %d is not connected" % handler_id
64 return self.__event_delegate.disconnect(handler_id)
65
67 """
68 Return True iff the given handler_id represents a connected handler.
69
70 NB: this has been renamed from GObject.handler_is_connected to comply
71 with Advene coding style (methode names should start with a verb).
72 """
73 return self.__event_delegate is not None \
74 and self.__event_delegate.handler_is_connected(handler_id)
75
77 """
78 Prevent the handler identified by handler_id to be invoked until it is
79 unblocked.
80
81 NB: this has been renamed from GObject.handler_block to comply
82 with Advene coding style (methode names should start with a verb).
83 """
84 assert self.has_handler(handler_id), "Handler-id %d is not connected" % handler_id
85 return self.__event_delegate.handler_block(handler_id)
86
88 """
89 Unblock the blocked handler identified by handler_id so it can be
90 invoked again.
91
92 NB: this has been renamed from GObject.handler_unblock to comply
93 with Advene coding style (methode names should start with a verb).
94 """
95 assert self.has_handler(handler_id), "Handler-id %d is not connected" % handler_id
96 return self.__event_delegate.handler_unblock(handler_id)
97
98 - def emit(self, detailed_signal, *args):
99 """
100 Cause the object to emit the signal specified by detailed_signal.
101 The additional parameters must match the number and type of the
102 required signal handler parameters.
103 """
104 if self.__event_delegate is not None and self.__disabling_count == 0:
105 return self.__event_delegate.emit(detailed_signal, *args)
106
108 """
109 Like emit, but lazy_params is assumed to be a function returning an
110 iterable of the params to send to emit.
111 The rationale is that, since emit does nothing if we have no
112 EventDelegate, the parameters would not be evaluated.
113 """
114 if self.__event_delegate is not None:
115 return self.__event_delegate.emit(*lazy_params())
116
118 """
119 Stop the current emission of the signal specified by detailed_signal.
120 Any signal handlers in the list still to be run will not be
121 invoked.
122 """
123 assert self.__event_delegate is not None
124 return self.__event_delegate.stop_emission(detailed_signal)
125
126
127
128 handler_is_connected = has_handler
129 handler_block = block_handler
130 handler_unblock = unblock_handler
131
132
133
135 """
136 Disable all event emission for this object, until
137 `exit_no_event_section` is called.
138
139 Not also that a "no event section is a critical section for the object
140 (in the sense of the `advene.util.synchronized` module).
141 """
142 enter_cs(self)
143 self.__disabling_count += 1
144
146 """
147 Re-enables all event emission for this object.
148
149 :see-also: `enter_no_event_section`
150 """
151 self.__disabling_count -= 1
152 exit_cs(self)
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175 gobject.signal_new("pre-modified", EventDelegate,
176 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
177 gobject.TYPE_NONE, (object,object,))
178
179 gobject.signal_new("modified", EventDelegate,
180 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
181 gobject.TYPE_NONE, (object,object,))
182
183
184
185
186
187
188
189
190
191
192
193
194
195 gobject.signal_new("pre-modified-meta", EventDelegate,
196 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
197 gobject.TYPE_NONE, (object,object,))
198
199 gobject.signal_new("modified-meta", EventDelegate,
200 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
201 gobject.TYPE_NONE, (object,object,))
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217 gobject.signal_new("created", PackageEventDelegate,
218 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
219 gobject.TYPE_NONE, (object,))
220
221
222
223
224
225
226
227
228
229
230
231
232
233 gobject.signal_new("package-closed", PackageEventDelegate,
234 gobject.SIGNAL_RUN_FIRST,
235 gobject.TYPE_NONE, (object, object,))
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257 gobject.signal_new("media", PackageEventDelegate,
258 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
259 gobject.TYPE_NONE, (object,str,object,))
260
261 gobject.signal_new("annotation", PackageEventDelegate,
262 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
263 gobject.TYPE_NONE, (object,str,object,))
264
265 gobject.signal_new("relation", PackageEventDelegate,
266 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
267 gobject.TYPE_NONE, (object,str,object,))
268
269 gobject.signal_new("tag", PackageEventDelegate,
270 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
271 gobject.TYPE_NONE, (object,str,object,))
272
273 gobject.signal_new("list", PackageEventDelegate,
274 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
275 gobject.TYPE_NONE, (object,str,object,))
276
277 gobject.signal_new("query", PackageEventDelegate,
278 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
279 gobject.TYPE_NONE, (object,str,object,))
280
281 gobject.signal_new("view", PackageEventDelegate,
282 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
283 gobject.TYPE_NONE, (object,str,object,))
284
285 gobject.signal_new("resource", PackageEventDelegate,
286 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
287 gobject.TYPE_NONE, (object,str,object,))
288
289 gobject.signal_new("import", PackageEventDelegate,
290 gobject.SIGNAL_RUN_FIRST|gobject.SIGNAL_DETAILED,
291 gobject.TYPE_NONE, (object,str,object,))
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314 gobject.signal_new("pre-modified-items", ElementEventDelegate,
315 gobject.SIGNAL_RUN_FIRST,
316 gobject.TYPE_NONE, (object, object,))
317
318 gobject.signal_new("modified-items", ElementEventDelegate,
319 gobject.SIGNAL_RUN_FIRST,
320 gobject.TYPE_NONE, (object, object,))
321
322
323
324
325
326
327
328
329
330
331 gobject.signal_new("modified-content-data", ElementEventDelegate,
332 gobject.SIGNAL_RUN_FIRST,
333 gobject.TYPE_NONE, (object,))
334
335
336
337
338
339
340
341
342 gobject.signal_new("pre-renamed", ElementEventDelegate,
343 gobject.SIGNAL_RUN_FIRST,
344 gobject.TYPE_NONE, ())
345
346 gobject.signal_new("renamed", ElementEventDelegate,
347 gobject.SIGNAL_RUN_FIRST,
348 gobject.TYPE_NONE, ())
349
350
351
352
353
354
355
356
357 gobject.signal_new("pre-deleted", ElementEventDelegate,
358 gobject.SIGNAL_RUN_FIRST,
359 gobject.TYPE_NONE, ())
360
361 gobject.signal_new("deleted", ElementEventDelegate,
362 gobject.SIGNAL_RUN_FIRST,
363 gobject.TYPE_NONE, ())
364
365
366
367
368
369
370
371
372
373 gobject.signal_new("added-tag", ElementEventDelegate,
374 gobject.SIGNAL_RUN_FIRST,
375 gobject.TYPE_NONE, (object,))
376
377
378
379
380
381
382
383
384
385 gobject.signal_new("removed-tag", ElementEventDelegate,
386 gobject.SIGNAL_RUN_FIRST,
387 gobject.TYPE_NONE, (object,))
388
389
390
391
392
393
394
395
396
397 gobject.signal_new("added", ElementEventDelegate,
398 gobject.SIGNAL_RUN_FIRST,
399 gobject.TYPE_NONE, (object,))
400
401
402
403
404
405
406
407
408
409 gobject.signal_new("removed", ElementEventDelegate,
410 gobject.SIGNAL_RUN_FIRST,
411 gobject.TYPE_NONE, (object,))
412
413
414
415