4 * Copyright (C) 2008-2014 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include "bctimer.inc"
30 #include "edithandles.inc"
32 #include "floatauto.inc"
33 #include "floatautos.inc"
35 #include "indexable.h"
36 #include "keyframe.inc"
37 #include "mwindow.inc"
38 #include "mwindowgui.inc"
40 #include "pluginset.inc"
41 #include "plugintoggles.inc"
42 #include "resourcepixmap.inc"
43 #include "timelinepane.inc"
46 #include "transitionhandles.inc"
49 // NORMAL_DRAW causes incremental drawing of pixmaps. Used for navigation and index refresh.
50 // FORCE_REDRAW causes all resource pixmaps to be redrawn from scratch. Used by editing.
51 // IGNORE_THREAD causes resource pixmaps to ignore picon thread. Used by Piconthread.
53 #define FORCE_REDRAW 2
54 #define IGNORE_THREAD 3
56 class TrackCanvas : public BC_SubWindow
59 TrackCanvas(MWindow *mwindow, MWindowGUI *gui);
60 TrackCanvas(MWindow *mwindow, TimelinePane *pane, int x, int y, int w, int h);
63 void create_objects();
65 int drag_start_event();
66 int cursor_leave_event();
68 void draw_resources(int mode = 0,
69 int indexes_only = 0, // Redraw only certain audio resources with indexes
70 Indexable *indexable = 0);
71 void draw_highlight_rectangle(int x, int y, int w, int h);
72 void draw_playback_cursor();
73 void draw_highlighting();
74 // User can either call draw or draw_overlays to copy a fresh
75 // canvas and just draw the overlays over it
77 void update_handles();
78 // Convert edit coords to transition coords
79 void get_transition_coords(int64_t &x, int64_t &y, int64_t &w, int64_t &h);
80 void get_handle_coords(Edit *edit,
86 int get_drag_values(float *percentage,
92 void draw_title(Edit *edit,
97 void draw_automation();
98 void draw_inout_points();
99 void draw_auto(Auto *current,
104 void draw_floatauto(Auto *current,
113 int test_auto(Auto *current,
121 int test_floatauto(Auto *current,
133 void draw_floatline(int center_pixel,
144 int test_floatline(int center_pixel,
154 void draw_toggleline(int center_pixel,
159 int test_toggleline(Autos *autos,
168 int do_keyframes(int cursor_x,
176 int do_float_autos(Track *track,
185 Auto* &auto_instance);
186 int do_int_autos(Track *track,
195 Auto* &auto_instance);
196 int do_autos(Track *track,
203 Auto* &auto_instance,
205 int do_plugin_autos(Track *track,
210 Plugin* &keyframe_plugin,
211 KeyFrame* &keyframe_instance);
214 void calculate_viewport(Track *track,
224 // Convert percentage position inside track to value.
225 // if is_toggle is 1, the result is either 0 or 1.
226 // if reference is nonzero and a FloatAuto,
227 // the result is made relative to the value in reference.
228 float percentage_to_value(float percentage,
232 // Get x and y of a FloatAuto relative to center_pixel
233 void calculate_auto_position(double *x,
243 void synchronize_autos(float change, Track *skip, FloatAuto *fauto, int fill_gangs);
246 void draw_brender_start();
247 void draw_loop_points();
248 void draw_transitions();
249 void draw_drag_handle();
251 void refresh_plugintoggles();
252 void update_edit_handles(Edit *edit, int64_t edit_x, int64_t edit_y, int64_t edit_w, int64_t edit_h);
253 void update_transitions();
254 void update_keyframe_handles(Track *track);
255 // Draw everything to synchronize with the view.
256 void draw(int mode = 0, int hide_cursor = 1);
257 // Draw resources during index building
258 void draw_indexes(Indexable *indexable);
259 // Get location of edit on screen without boundary checking
260 void edit_dimensions(Edit *edit, int64_t &x, int64_t &y, int64_t &w, int64_t &h);
261 void track_dimensions(Track *track, int64_t &x, int64_t &y, int64_t &w, int64_t &h);
262 void plugin_dimensions(Plugin *plugin, int64_t &x, int64_t &y, int64_t &w, int64_t &h);
263 void get_pixmap_size(Edit *edit, int64_t edit_x, int64_t edit_w, int64_t &pixmap_x, int64_t &pixmap_w, int64_t &pixmap_h);
264 ResourcePixmap* create_pixmap(Edit *edit, int64_t edit_x, int64_t pixmap_x, int64_t pixmap_w, int64_t pixmap_h);
265 void update_cursor(int flush);
266 // Get edit and handle the cursor is over
267 int do_edit_handles(int cursor_x,
272 // Get plugin and handle the cursor if over
273 int do_plugin_handles(int cursor_x,
278 // Get edit the cursor is over
279 int do_edits(int cursor_x,
287 int do_tracks(int cursor_x,
290 int test_resources(int cursor_x, int cursor_y);
291 int do_plugins(int cursor_x,
297 int do_transitions(int cursor_x,
302 void draw_cropped_line(int x1,
308 int button_press_event();
309 int button_release_event();
310 int cursor_motion_event();
313 int repeat_event(int64_t duration);
314 void start_dragscroll();
315 void stop_dragscroll();
316 int start_selection(double position);
317 int drag_motion_event();
318 int drag_stop_event();
319 int drag_motion(Track **over_track,
321 PluginSet **over_pluginset,
322 Plugin **over_plugin);
323 int drag_stop(int *redraw);
324 void end_edithandle_selection();
325 void end_pluginhandle_selection();
326 // Number of seconds spanned by the trackcanvas
327 double time_visible();
328 void update_drag_handle();
329 int update_drag_edit();
330 int update_drag_floatauto(int cursor_x, int cursor_y);
331 int update_drag_toggleauto(int cursor_x, int cursor_y);
332 int update_drag_auto(int cursor_x, int cursor_y);
333 int update_drag_pluginauto(int cursor_x, int cursor_y);
335 // Update status bar to reflect drag operation
336 void update_drag_caption();
341 // Display hourglass if timer expired
343 // get the relevant patchbay by traversing the panes
344 // Patchbay* get_patchbay();
349 // Allows overlays to get redrawn without redrawing the resources
350 BC_Pixmap *background_pixmap;
351 BC_Pixmap *transition_pixmap;
352 EditHandles *edit_handles;
353 // TransitionHandles *transition_handles;
354 BC_Pixmap *keyframe_pixmap;
355 BC_Pixmap *camerakeyframe_pixmap;
356 BC_Pixmap *modekeyframe_pixmap;
357 BC_Pixmap *pankeyframe_pixmap;
358 BC_Pixmap *projectorkeyframe_pixmap;
359 BC_Pixmap *maskkeyframe_pixmap;
362 // Currently in a drag scroll operation
364 // Don't stop hourglass if it was never started before the operation.
365 int hourglass_enabled;
366 // position used by timebar, when the timebar needs to draw a highlight
367 double timebar_position;
369 // Temporary for picon drawing
371 // Timer for hourglass
372 Timer *resource_timer;
374 // Plugin toggle interfaces
375 ArrayList<PluginOn*> plugin_on_toggles;
376 ArrayList<PluginShow*> plugin_show_toggles;
381 void draw_paste_destination();
383 // ====================================== cursor selection type
386 double selection_midpoint; // division between current ends