1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 from timelinelib.canvas.data.base import ItemBase
20 from timelinelib.canvas.data.immutable import ImmutableEvent
21 from timelinelib.canvas.data.item import TimelineItem
22 from timelinelib.canvas.drawing.drawers import get_progress_color
23
24
25 DEFAULT_COLOR = (200, 200, 200)
26 EXPORTABLE_FIELDS = (_("Text"), _("Description"), _("Start"), _("End"), _("Category"),
27 _("Fuzzy"), _("Locked"), _("Ends Today"), _("Hyperlink"),
28 _("Progress"), _("Progress Color"), _("Done Color"), _("Alert"),
29 _("Is Container"), _("Is Subevent"))
30
31
32 -class Event(ItemBase, TimelineItem):
33
35 ItemBase.__init__(self, db, id_, immutable_value)
36 self._category = None
37 self._categories = []
38 self._container = None
39 self._milestone = False
40
47
49 self._update_category_id()
50 self._update_category_ids()
51 self._update_container_id()
52 self._update_sort_order()
53 with self._db.transaction("Save event") as t:
54 t.save_event(self._immutable_value, self.ensure_id())
55 return self
56
59
71
73 if self._categories == list():
74 self._immutable_value = self._immutable_value.update(
75 category_ids={}
76 )
77 else:
78 ids = [c.id for c in self._categories]
79
80 dic = {k: None for k in ids}
81 self._immutable_value = self._immutable_value.update(
82 category_ids=dic
83 )
84
96
100
105
122
124 return not (self == other)
125
127 raise NotImplementedError("I don't believe this is in use.")
128
130 raise NotImplementedError("I don't believe this is in use.")
131
133 raise NotImplementedError("I don't believe this is in use.")
134
136 raise NotImplementedError("I don't believe this is in use.")
137
139 return "%s<id=%r, text=%r, time_period=%r, ...>" % (
140 self.__class__.__name__,
141 self.get_id(),
142 self.get_text(),
143 self.get_time_period()
144 )
145
148
149 - def get_text(self):
150 return self._immutable_value.text
151
152 - def set_text(self, text):
153 self._immutable_value = self._immutable_value.update(text=text.strip())
154 return self
155
156 text = property(get_text, set_text)
157
159 return self._category
160
166
168 self._category = category
169 return self
170
171 category = property(get_category, set_category)
172
174 return self._categories
175
185
187 return self._container
188
196
197 container = property(get_container, set_container)
198
200 return self._immutable_value.fuzzy
201
203 self._immutable_value = self._immutable_value.update(fuzzy=fuzzy)
204 return self
205
206 fuzzy = property(get_fuzzy, set_fuzzy)
207
209 return self._immutable_value.locked
210
214
215 locked = property(get_locked, set_locked)
216
219
224
225 ends_today = property(get_ends_today, set_ends_today)
226
229
233
234 description = property(get_description, set_description)
235
237 return self._immutable_value.icon
238
240 self._immutable_value = self._immutable_value.update(icon=icon)
241 return self
242
243 icon = property(get_icon, set_icon)
244
247
251
252 hyperlink = property(get_hyperlink, set_hyperlink)
253
255 return self._immutable_value.alert
256
258 self._immutable_value = self._immutable_value.update(alert=alert)
259 return self
260
261 alert = property(get_alert, set_alert)
262
264 return self._immutable_value.progress
265
269
270 progress = property(get_progress, set_progress)
271
274
278
279 sort_order = property(get_sort_order, set_sort_order)
280
286
290
291 default_color = property(get_default_color, set_default_color)
292
298
308
309 - def update(self, start_time, end_time, text, category=None, fuzzy=None,
310 locked=None, ends_today=None):
323
325 """
326 Return data with the given id or None if no data with that id exists.
327
328 See set_data for information how ids map to data.
329 """
330 if event_id == "description":
331 return self.description
332 elif event_id == "icon":
333 return self.icon
334 elif event_id == "hyperlink":
335 return self.hyperlink
336 elif event_id == "alert":
337 return self.alert
338 elif event_id == "progress":
339 return self.progress
340 elif event_id == "default_color":
341 if "default_color" in self._immutable_value:
342 return self._immutable_value.default_color
343 else:
344 return None
345 else:
346 raise Exception("should not happen")
347
349 """
350 Set data with the given id.
351
352 Here is how ids map to data:
353
354 description - string
355 icon - wx.Bitmap
356 """
357 if event_id == "description":
358 self.description = data
359 elif event_id == "icon":
360 self.icon = data
361 elif event_id == "hyperlink":
362 self.hyperlink = data
363 elif event_id == "alert":
364 self.alert = data
365 elif event_id == "progress":
366 self.progress = data
367 elif event_id == "default_color":
368 self.default_color = data
369 else:
370 raise Exception("should not happen")
371
377
381
382 data = property(get_whole_data, set_whole_data)
383
385 """Return True if the event has associated data, or False if not."""
386 for event_id in DATA_FIELDS:
387 if self.get_data(event_id) is not None:
388 return True
389 return False
390
392 """Return True if the event has associated data to be displayed in a balloon."""
393 return (self.get_data("description") is not None or
394 self.get_data("icon") is not None)
395
397 """Returns a unicode label describing the event."""
398 event_label = "%s (%s)" % (
399 self.text,
400 time_type.format_period(self.get_time_period()),
401 )
402 duration_label = self._get_duration_label(time_type)
403 if duration_label != "":
404 return "%s %s: %s" % (event_label, _("Duration"), duration_label)
405 else:
406 return event_label
407
413
416
419
422
425
427 self._milestone = value
428
430 return self._milestone
431
432
433 DATA_FIELDS = [
434 "description",
435 "icon",
436 "hyperlink",
437 "alert",
438 "progress",
439 "default_color",
440 ]
441