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._container = None
38 self._milestone = False
39
46
48 self._update_category_id()
49 self._update_container_id()
50 self._update_sort_order()
51 with self._db.transaction("Save event") as t:
52 t.save_event(self._immutable_value, self.ensure_id())
53 return self
54
57
69
81
85
90
106
108 return not (self == other)
109
111 raise NotImplementedError("I don't believe this is in use.")
112
114 raise NotImplementedError("I don't believe this is in use.")
115
117 raise NotImplementedError("I don't believe this is in use.")
118
120 raise NotImplementedError("I don't believe this is in use.")
121
123 return "%s<id=%r, text=%r, time_period=%r, ...>" % (
124 self.__class__.__name__,
125 self.get_id(),
126 self.get_text(),
127 self.get_time_period()
128 )
129
132
133 - def get_text(self):
134 return self._immutable_value.text
135
136 - def set_text(self, text):
137 self._immutable_value = self._immutable_value.update(text=text.strip())
138 return self
139
140 text = property(get_text, set_text)
141
143 return self._category
144
150
152 self._category = category
153 return self
154
155 category = property(get_category, set_category)
156
158 return self._container
159
167
168 container = property(get_container, set_container)
169
171 return self._immutable_value.fuzzy
172
174 self._immutable_value = self._immutable_value.update(fuzzy=fuzzy)
175 return self
176
177 fuzzy = property(get_fuzzy, set_fuzzy)
178
180 return self._immutable_value.locked
181
185
186 locked = property(get_locked, set_locked)
187
190
195
196 ends_today = property(get_ends_today, set_ends_today)
197
200
204
205 description = property(get_description, set_description)
206
208 return self._immutable_value.icon
209
211 self._immutable_value = self._immutable_value.update(icon=icon)
212 return self
213
214 icon = property(get_icon, set_icon)
215
218
222
223 hyperlink = property(get_hyperlink, set_hyperlink)
224
226 return self._immutable_value.alert
227
229 self._immutable_value = self._immutable_value.update(alert=alert)
230 return self
231
232 alert = property(get_alert, set_alert)
233
235 return self._immutable_value.progress
236
240
241 progress = property(get_progress, set_progress)
242
245
249
250 sort_order = property(get_sort_order, set_sort_order)
251
257
261
262 default_color = property(get_default_color, set_default_color)
263
269
279
280 - def update(self, start_time, end_time, text, category=None, fuzzy=None,
281 locked=None, ends_today=None):
294
296 """
297 Return data with the given id or None if no data with that id exists.
298
299 See set_data for information how ids map to data.
300 """
301 if event_id == "description":
302 return self.description
303 elif event_id == "icon":
304 return self.icon
305 elif event_id == "hyperlink":
306 return self.hyperlink
307 elif event_id == "alert":
308 return self.alert
309 elif event_id == "progress":
310 return self.progress
311 elif event_id == "default_color":
312 if "default_color" in self._immutable_value:
313 return self._immutable_value.default_color
314 else:
315 return None
316 else:
317 raise Exception("should not happen")
318
320 """
321 Set data with the given id.
322
323 Here is how ids map to data:
324
325 description - string
326 icon - wx.Bitmap
327 """
328 if event_id == "description":
329 self.description = data
330 elif event_id == "icon":
331 self.icon = data
332 elif event_id == "hyperlink":
333 self.hyperlink = data
334 elif event_id == "alert":
335 self.alert = data
336 elif event_id == "progress":
337 self.progress = data
338 elif event_id == "default_color":
339 self.default_color = data
340 else:
341 raise Exception("should not happen")
342
348
352
353 data = property(get_whole_data, set_whole_data)
354
356 """Return True if the event has associated data, or False if not."""
357 for event_id in DATA_FIELDS:
358 if self.get_data(event_id) is not None:
359 return True
360 return False
361
363 """Return True if the event has associated data to be displayed in a balloon."""
364 return (self.get_data("description") is not None or
365 self.get_data("icon") is not None)
366
368 """Returns a unicode label describing the event."""
369 event_label = u"%s (%s)" % (
370 self.text,
371 time_type.format_period(self.get_time_period()),
372 )
373 duration_label = self._get_duration_label(time_type)
374 if duration_label != "":
375 return u"%s %s: %s" % (event_label, _("Duration"), duration_label)
376 else:
377 return event_label
378
384
387
390
393
396
398 self._milestone = value
399
401 return self._milestone
402
403
404 DATA_FIELDS = [
405 "description",
406 "icon",
407 "hyperlink",
408 "alert",
409 "progress",
410 "default_color",
411 ]
412