1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import wx
20
21 from timelinelib.canvas.appearance import Appearance
22 from timelinelib.canvas.backgrounddrawers.defaultbgdrawer import DefaultBackgroundDrawer
23 from timelinelib.canvas.drawing import get_drawer
24 from timelinelib.canvas.drawing.viewproperties import ViewProperties
25 from timelinelib.canvas.eventboxdrawers.defaulteventboxdrawer import DefaultEventBoxDrawer
26 from timelinelib.canvas.events import create_timeline_redrawn_event
27 from timelinelib import DEBUG_ENABLED
28 from timelinelib.monitoring import Monitoring
29 from timelinelib.wxgui.components.font import Font
30
31
32 CHOICE_WHOLE_PERIOD = _("Whole Timeline")
33 CHOICE_VISIBLE_PERIOD = _("Visible Period")
34 CHOICES = (CHOICE_WHOLE_PERIOD, CHOICE_VISIBLE_PERIOD)
38
57
58 @property
60 return self.drawing_algorithm.scene
61
64
71
74
77
80
83
86
88 """Inform what timeline to draw."""
89 self._unregister_timeline(self.timeline)
90 if timeline is None:
91 self._set_null_timeline()
92 else:
93 self._set_non_null_timeline(timeline)
94
96 self._fast_draw = value
97
99 old_period = self.view_properties.displayed_period
100 new_period = navigation_fn(old_period)
101 MIN_ZOOM_DELTA, min_zoom_error_text = self.time_type.get_min_zoom_delta()
102 if new_period.delta() < MIN_ZOOM_DELTA:
103 raise ValueError(min_zoom_error_text)
104 min_time = self.time_type.get_min_time()
105 if min_time is not None and new_period.start_time < min_time:
106 raise ValueError(_("Can't scroll more to the left"))
107 max_time = self.time_type.get_max_time()
108 if max_time is not None and new_period.end_time > max_time:
109 raise ValueError(_("Can't scroll more to the right"))
110 self.view_properties.displayed_period = new_period
111 self.redraw_timeline()
112
114 self.timeline = None
115 self.time_type = None
116 self.view.Disable()
117
129
142
144 if timeline is not None:
145 timeline.unregister(self._timeline_changed)
146
148 """Return currently displayed time period."""
149 if self.timeline is None:
150 raise Exception(_("No timeline set"))
151 return self.view_properties.displayed_period
152
154 self._redraw_timeline()
155
157 self._redraw_timeline()
158
163
170
172 return self.drawing_algorithm.get_time(x)
173
176
177 - def event_at(self, x, y, alt_down=False):
178 return self.drawing_algorithm.event_at(x, y, alt_down)
179
182
185
188
191
194
197
202
207
210
213
220
223
226
230
233
236
239
242
248
250 return self._search_choice_functions[search_period](events)
251
254
256 events = self.view_properties.filter_events(events)
257 period = self.view_properties.displayed_period
258 return [e for e in events if period.overlaps(e.get_time_period())]
259
262
263 - def snap(self, time):
264 return self.drawing_algorithm.snap(time)
265
270
273
276
280
284
287
290
292 self._redraw_timeline()
293
298
305
307
308 def display_monitor_result(dc):
309 (width, height) = self.view.GetSize()
310 redraw_time = self.monitoring.timer_elapsed_ms
311 self.monitoring.count_timeline_redraw()
312 dc.SetTextForeground((255, 0, 0))
313 dc.SetFont(Font(12, weight=wx.FONTWEIGHT_BOLD))
314 index, is_in_transaction, history = self.timeline.transactions_status()
315 dc.DrawText("Undo buffer size: %d" % len(history), width - 300, height - 100)
316 dc.DrawText("Undo buffer pos: %d" % index, width - 300, height - 80)
317 dc.DrawText("Redraw count: %d" % self.monitoring._timeline_redraw_count, width - 300, height - 60)
318 dc.DrawText("Last redraw time: %.3f ms" % redraw_time, width - 300, height - 40)
319
320 def fn_draw(dc):
321 self.monitoring.timer_start()
322 self.drawing_algorithm.draw(dc, self.timeline, self.view_properties, self.appearance, fast_draw=self._fast_draw)
323 self.monitoring.timer_end()
324 if DEBUG_ENABLED:
325 display_monitor_result(dc)
326 self._fast_draw = False
327
328 if self.timeline and self.view_properties.displayed_period:
329 self.view_properties.divider_position = (float(self.view.GetDividerPosition()) / 100.0)
330 self.view.RedrawSurface(fn_draw)
331 self.view.PostEvent(create_timeline_redrawn_event())
332
334 """
335 The drawer interface:
336 methods:
337 draw(d, t, p, a, f)
338 set_event_box_drawer(d)
339 set_background_drawer(d)
340 get_time(x)
341 event_with_rect_at(x, y, k)
342 event_at(x, y, k)
343 event_is_period(p)
344 snap(t)
345 get_events_in_rect(r)
346 get_hidden_event_count()
347 increment_font_size()
348 decrement_font_size()
349 get_closest_overlapping_event(...)
350 balloon_at(c)
351 properties:
352 scene
353 """
354 if drawer is not None:
355 self.drawing_algorithm = drawer
356 else:
357 self.drawing_algorithm = get_drawer()
358