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
33
51
52 @property
54 return self.drawing_algorithm.scene
55
58
65
68
71
74
77
79 return self.view_properties
80
82 """Inform what timeline to draw."""
83 self._unregister_timeline(self.timeline)
84 if timeline is None:
85 self._set_null_timeline()
86 else:
87 self._set_non_null_timeline(timeline)
88
90 self._fast_draw = value
91
93 old_period = self.view_properties.displayed_period
94 new_period = navigation_fn(old_period)
95 MIN_ZOOM_DELTA, min_zoom_error_text = self.time_type.get_min_zoom_delta()
96 if new_period.delta() < MIN_ZOOM_DELTA:
97 raise ValueError(min_zoom_error_text)
98 min_time = self.time_type.get_min_time()
99 if min_time is not None and new_period.start_time < min_time:
100 raise ValueError(_("Can't scroll more to the left"))
101 max_time = self.time_type.get_max_time()
102 if max_time is not None and new_period.end_time > max_time:
103 raise ValueError(_("Can't scroll more to the right"))
104 self.view_properties.displayed_period = new_period
105 self.redraw_timeline()
106
108 self.timeline = None
109 self.time_type = None
110 self.view.Disable()
111
113 self.timeline = timeline
114 self.time_type = timeline.get_time_type()
115 self.timeline.register(self._timeline_changed)
116 self.view_properties.unlisten(self._redraw_timeline)
117 properties_loaded = self._load_view_properties()
118 if properties_loaded:
119 self.view_properties.listen_for_any(self._redraw_timeline)
120 self._redraw_timeline()
121 self.view.Enable()
122 self.view.SetFocus()
123
125 properties_loaded = True
126 try:
127 self.view_properties.clear_db_specific()
128 self.timeline.load_view_properties(self.view_properties)
129 if self.view_properties.displayed_period is None:
130 default_tp = self.time_type.get_default_time_period()
131 self.view_properties.displayed_period = default_tp
132 self.view_properties.hscroll_amount = 0
133 except Exception:
134 properties_loaded = False
135 return properties_loaded
136
138 if timeline is not None:
139 timeline.unregister(self._timeline_changed)
140
142 """Return currently displayed time period."""
143 if self.timeline is None:
144 raise Exception(_("No timeline set"))
145 return self.view_properties.displayed_period
146
148 self._redraw_timeline()
149
151 self._redraw_timeline()
152
154 selected_event_ids = self.view_properties.get_selected_event_ids()
155 nbr_of_selected_event_ids = len(selected_event_ids)
156 return nbr_of_selected_event_ids == 1
157
159 selected_event_ids = self.view_properties.get_selected_event_ids()
160 if len(selected_event_ids) > 0:
161 event_id = selected_event_ids[0]
162 return self.timeline.find_event_with_id(event_id)
163 return None
164
166 return self.drawing_algorithm.get_time(x)
167
170
171 - def event_at(self, x, y, alt_down=False):
172 return self.drawing_algorithm.event_at(x, y, alt_down)
173
176
179
182
185
188
190 return self.view_properties.hovered_event
191
196
201
204
207
209 if period is None:
210 self.view_properties.period_selection = None
211 else:
212 self.view_properties.period_selection = (period.start_time, period.end_time)
213 self._redraw_timeline()
214
217
220
224
227
230
233
236
239
240 - def snap(self, time):
241 return self.drawing_algorithm.snap(time)
242
247
250
253
257
261
264
267
269 self._redraw_timeline()
270
272 self.timeline = None
273 self.view_properties = ViewProperties()
274 self.dragscroll_timer_running = False
275
282
284
285 def display_monitor_result(dc):
286 (width, height) = self.view.GetSizeTuple()
287 redraw_time = self.monitoring.timer_elapsed_ms
288 self.monitoring.count_timeline_redraw()
289 dc.SetTextForeground((255, 0, 0))
290 dc.SetFont(Font(12, weight=wx.FONTWEIGHT_BOLD))
291 index, is_in_transaction, history = self.timeline.transactions_status()
292 dc.DrawText("Undo buffer size: %d" % len(history), width - 300, height - 100)
293 dc.DrawText("Undo buffer pos: %d" % index, width - 300, height - 80)
294 dc.DrawText("Redraw count: %d" % self.monitoring._timeline_redraw_count, width - 300, height - 60)
295 dc.DrawText("Last redraw time: %.3f ms" % redraw_time, width - 300, height - 40)
296
297 def fn_draw(dc):
298 self.monitoring.timer_start()
299 self.drawing_algorithm.draw(dc, self.timeline, self.view_properties, self.appearance, fast_draw=self._fast_draw)
300 self.monitoring.timer_end()
301 if DEBUG_ENABLED:
302 display_monitor_result(dc)
303 self._fast_draw = False
304
305 if self.timeline and self.view_properties.displayed_period:
306 self.view_properties.divider_position = (float(self.view.GetDividerPosition()) / 100.0)
307 self.view.redraw_surface(fn_draw)
308 self.view.PostEvent(create_timeline_redrawn_event())
309
311 """
312 The drawer interface:
313 methods:
314 draw(d, t, p, a, f)
315 set_event_box_drawer(d)
316 set_background_drawer(d)
317 get_time(x)
318 event_with_rect_at(x, y, k)
319 event_at(x, y, k)
320 event_is_period(p)
321 snap(t)
322 get_events_in_rect(r)
323 get_hidden_event_count()
324 increment_font_size()
325 decrement_font_size()
326 get_closest_overlapping_event(...)
327 balloon_at(c)
328 properties:
329 scene
330 """
331 if drawer is not None:
332 self.drawing_algorithm = drawer
333 else:
334 self.drawing_algorithm = get_drawer()
335