Package Gnumed :: Package timelinelib :: Package canvas :: Package data :: Module event
[frames] | no frames]

Source Code for Module Gnumed.timelinelib.canvas.data.event

  1  # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018  Rickard Lindberg, Roger Lindberg 
  2  # 
  3  # This file is part of Timeline. 
  4  # 
  5  # Timeline is free software: you can redistribute it and/or modify 
  6  # it under the terms of the GNU General Public License as published by 
  7  # the Free Software Foundation, either version 3 of the License, or 
  8  # (at your option) any later version. 
  9  # 
 10  # Timeline is distributed in the hope that it will be useful, 
 11  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 13  # GNU General Public License for more details. 
 14  # 
 15  # You should have received a copy of the GNU General Public License 
 16  # along with Timeline.  If not, see <http://www.gnu.org/licenses/>. 
 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
34 - def __init__(self, db=None, id_=None, immutable_value=ImmutableEvent()):
35 ItemBase.__init__(self, db, id_, immutable_value) 36 self._category = None 37 self._container = None 38 self._milestone = False
39
40 - def duplicate(self, target_db=None):
41 duplicate = ItemBase.duplicate(self, target_db=target_db) 42 if duplicate.db is self.db: 43 duplicate.category = self.category 44 duplicate.sort_order = None 45 return duplicate
46
47 - def save(self):
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
55 - def reload(self):
56 return self._db.find_event_with_id(self.id)
57
58 - def _update_category_id(self):
59 if self.category is None: 60 self._immutable_value = self._immutable_value.update( 61 category_id=None 62 ) 63 elif self.category.id is None: 64 raise Exception("Unknown category") 65 else: 66 self._immutable_value = self._immutable_value.update( 67 category_id=self.category.id 68 )
69
70 - def _update_container_id(self):
71 if self.container is None: 72 self._immutable_value = self._immutable_value.update( 73 container_id=None 74 ) 75 elif self.container.id is None: 76 raise Exception("Unknown container") 77 else: 78 self._immutable_value = self._immutable_value.update( 79 container_id=self.container.id 80 )
81
82 - def _update_sort_order(self):
83 if self.sort_order is None: 84 self.sort_order = 1 + self.db.get_max_sort_order()
85
86 - def delete(self):
87 with self._db.transaction("Delete event") as t: 88 t.delete_event(self.id) 89 self.id = None
90
91 - def __eq__(self, other):
92 return (isinstance(other, Event) and 93 self.get_fuzzy() == other.get_fuzzy() and 94 self.get_locked() == other.get_locked() and 95 self.get_ends_today() == other.get_ends_today() and 96 self.get_id() == other.get_id() and 97 self.get_time_period().start_time == other.get_time_period().start_time and 98 (self.get_time_period().end_time == other.get_time_period().end_time or self.get_ends_today()) and 99 self.get_text() == other.get_text() and 100 self.get_category() == other.get_category() and 101 self.get_description() == other.get_description() and 102 self.get_hyperlink() == other.get_hyperlink() and 103 self.get_progress() == other.get_progress() and 104 self.get_alert() == other.get_alert() and 105 self.get_icon() == other.get_icon() and 106 self.get_default_color() == other.get_default_color())
107
108 - def __ne__(self, other):
109 return not (self == other)
110
111 - def __lt__(self, other):
112 raise NotImplementedError("I don't believe this is in use.")
113
114 - def __gt__(self, other):
115 raise NotImplementedError("I don't believe this is in use.")
116
117 - def __le__(self, other):
118 raise NotImplementedError("I don't believe this is in use.")
119
120 - def __ge__(self, other):
121 raise NotImplementedError("I don't believe this is in use.")
122
123 - def __repr__(self):
124 return "%s<id=%r, text=%r, time_period=%r, ...>" % ( 125 self.__class__.__name__, 126 self.get_id(), 127 self.get_text(), 128 self.get_time_period() 129 )
130
131 - def set_end_time(self, time):
133
134 - def get_text(self):
135 return self._immutable_value.text
136
137 - def set_text(self, text):
138 self._immutable_value = self._immutable_value.update(text=text.strip()) 139 return self
140 141 text = property(get_text, set_text) 142
143 - def get_category(self):
144 return self._category
145
146 - def get_category_name(self):
147 if self.get_category(): 148 return self.get_category().get_name() 149 else: 150 return None
151
152 - def set_category(self, category):
153 self._category = category 154 return self
155 156 category = property(get_category, set_category) 157
158 - def get_container(self):
159 return self._container
160
161 - def set_container(self, container):
162 if self._container is not None: 163 self._container.unregister_subevent(self) 164 self._container = container 165 if self._container is not None: 166 self._container.register_subevent(self) 167 return self
168 169 container = property(get_container, set_container) 170
171 - def get_fuzzy(self):
172 return self._immutable_value.fuzzy
173
174 - def set_fuzzy(self, fuzzy):
175 self._immutable_value = self._immutable_value.update(fuzzy=fuzzy) 176 return self
177 178 fuzzy = property(get_fuzzy, set_fuzzy) 179
180 - def get_locked(self):
181 return self._immutable_value.locked
182
183 - def set_locked(self, locked):
184 self._immutable_value = self._immutable_value.update(locked=locked) 185 return self
186 187 locked = property(get_locked, set_locked) 188
189 - def get_ends_today(self):
190 return self._immutable_value.ends_today
191
192 - def set_ends_today(self, ends_today):
193 if not self.locked: 194 self._immutable_value = self._immutable_value.update(ends_today=ends_today) 195 return self
196 197 ends_today = property(get_ends_today, set_ends_today) 198
199 - def get_description(self):
200 return self._immutable_value.description
201
202 - def set_description(self, description):
203 self._immutable_value = self._immutable_value.update(description=description) 204 return self
205 206 description = property(get_description, set_description) 207
208 - def get_icon(self):
209 return self._immutable_value.icon
210
211 - def set_icon(self, icon):
212 self._immutable_value = self._immutable_value.update(icon=icon) 213 return self
214 215 icon = property(get_icon, set_icon) 216 219 223 224 hyperlink = property(get_hyperlink, set_hyperlink) 225
226 - def get_alert(self):
227 return self._immutable_value.alert
228
229 - def set_alert(self, alert):
230 self._immutable_value = self._immutable_value.update(alert=alert) 231 return self
232 233 alert = property(get_alert, set_alert) 234
235 - def get_progress(self):
236 return self._immutable_value.progress
237
238 - def set_progress(self, progress):
239 self._immutable_value = self._immutable_value.update(progress=progress) 240 return self
241 242 progress = property(get_progress, set_progress) 243
244 - def get_sort_order(self):
245 return self._immutable_value.sort_order
246
247 - def set_sort_order(self, sort_order):
248 self._immutable_value = self._immutable_value.update(sort_order=sort_order) 249 return self
250 251 sort_order = property(get_sort_order, set_sort_order) 252
253 - def get_default_color(self):
254 color = self._immutable_value.default_color 255 if color is None: 256 color = DEFAULT_COLOR 257 return color
258
259 - def set_default_color(self, color):
260 self._immutable_value = self._immutable_value.update(default_color=color) 261 return self
262 263 default_color = property(get_default_color, set_default_color) 264
265 - def get_done_color(self):
266 if self.category: 267 return self.category.get_done_color() 268 else: 269 return get_progress_color(DEFAULT_COLOR)
270
271 - def get_progress_color(self):
272 category = self.category 273 if category: 274 if self.get_progress() == 100: 275 return category.get_done_color() 276 else: 277 return category.get_progress_color() 278 else: 279 return get_progress_color(DEFAULT_COLOR)
280
281 - def update(self, start_time, end_time, text, category=None, fuzzy=None, 282 locked=None, ends_today=None):
283 """Change the event data.""" 284 self.update_period(start_time, end_time) 285 self.text = text.strip() 286 self.category = category 287 if ends_today is not None: 288 if not self.locked: 289 self.ends_today = ends_today 290 if fuzzy is not None: 291 self.fuzzy = fuzzy 292 if locked is not None: 293 self.locked = locked 294 return self
295
296 - def get_data(self, event_id):
297 """ 298 Return data with the given id or None if no data with that id exists. 299 300 See set_data for information how ids map to data. 301 """ 302 if event_id == "description": 303 return self.description 304 elif event_id == "icon": 305 return self.icon 306 elif event_id == "hyperlink": 307 return self.hyperlink 308 elif event_id == "alert": 309 return self.alert 310 elif event_id == "progress": 311 return self.progress 312 elif event_id == "default_color": 313 if "default_color" in self._immutable_value: 314 return self._immutable_value.default_color 315 else: 316 return None 317 else: 318 raise Exception("should not happen")
319
320 - def set_data(self, event_id, data):
321 """ 322 Set data with the given id. 323 324 Here is how ids map to data: 325 326 description - string 327 icon - wx.Bitmap 328 """ 329 if event_id == "description": 330 self.description = data 331 elif event_id == "icon": 332 self.icon = data 333 elif event_id == "hyperlink": 334 self.hyperlink = data 335 elif event_id == "alert": 336 self.alert = data 337 elif event_id == "progress": 338 self.progress = data 339 elif event_id == "default_color": 340 self.default_color = data 341 else: 342 raise Exception("should not happen")
343
344 - def get_whole_data(self):
345 data = {} 346 for event_id in DATA_FIELDS: 347 data[event_id] = self.get_data(event_id) 348 return data
349
350 - def set_whole_data(self, data):
351 for event_id in DATA_FIELDS: 352 self.set_data(event_id, data.get(event_id, None))
353 354 data = property(get_whole_data, set_whole_data) 355
356 - def has_data(self):
357 """Return True if the event has associated data, or False if not.""" 358 for event_id in DATA_FIELDS: 359 if self.get_data(event_id) is not None: 360 return True 361 return False
362
363 - def has_balloon_data(self):
364 """Return True if the event has associated data to be displayed in a balloon.""" 365 return (self.get_data("description") is not None or 366 self.get_data("icon") is not None)
367
368 - def get_label(self, time_type):
369 """Returns a unicode label describing the event.""" 370 event_label = u"%s (%s)" % ( 371 self.text, 372 time_type.format_period(self.get_time_period()), 373 ) 374 duration_label = self._get_duration_label(time_type) 375 if duration_label != "": 376 return u"%s %s: %s" % (event_label, _("Duration"), duration_label) 377 else: 378 return event_label
379
380 - def _get_duration_label(self, time_type):
381 label = time_type.format_delta(self.time_span()) 382 if label == "0": 383 label = "" 384 return label
385
386 - def is_container(self):
387 return False
388
389 - def is_subevent(self):
390 return False
391
392 - def is_milestone(self):
393 return False
394
395 - def get_exportable_fields(self):
396 return EXPORTABLE_FIELDS
397
398 - def set_milestone(self, value):
399 self._milestone = value
400
401 - def get_milestone(self):
402 return self._milestone
403 404 405 DATA_FIELDS = [ 406 "description", 407 "icon", 408 "hyperlink", 409 "alert", 410 "progress", 411 "default_color", 412 ] 413