3 #include "automation.h"
5 #include "bezierauto.h"
6 #include "bezierautos.h"
12 #include "cwindowgui.h"
13 #include "edithandles.h"
14 #include "editpopup.h"
17 #include "edlsession.h"
18 #include "floatauto.h"
19 #include "floatautos.h"
22 #include "keyframepopup.h"
23 #include "keyframes.h"
25 #include "localsession.h"
26 #include "mainclock.h"
27 #include "maincursor.h"
29 #include "maskautos.h"
33 #include "mwindowgui.h"
37 #include "playbackengine.h"
38 #include "playtransport.h"
40 #include "pluginpopup.h"
41 #include "pluginset.h"
42 #include "pluginserver.h"
43 #include "preferences.h"
44 #include "resourcepixmap.h"
45 #include "mainsession.h"
46 #include "transitionhandles.h"
47 #include "transitionpopup.h"
48 #include "transportque.h"
52 #include "trackcanvas.h"
54 #include "transition.h"
56 #include "apatchgui.inc"
57 #include "vpatchgui.inc"
61 TrackCanvas::TrackCanvas(MWindow *mwindow, MWindowGUI *gui)
62 : BC_SubWindow(mwindow->theme->mcanvas_x,
63 mwindow->theme->mcanvas_y,
67 this->mwindow = mwindow;
70 selection_midpoint1 = selection_midpoint2 = 0;
75 translate_selected = 0;
84 TrackCanvas::~TrackCanvas()
86 for(int i = 0; i < resource_pixmaps.total; i++)
87 delete resource_pixmaps.values[i];
88 // delete transition_handles;
90 delete keyframe_pixmap;
91 delete camerakeyframe_pixmap;
92 delete modekeyframe_pixmap;
93 delete pankeyframe_pixmap;
94 delete projectorkeyframe_pixmap;
95 delete maskkeyframe_pixmap;
96 delete background_pixmap;
97 if(temp_picon) delete temp_picon;
100 int TrackCanvas::create_objects()
102 background_pixmap = new BC_Pixmap(this, get_w(), get_h());
103 // transition_handles = new TransitionHandles(mwindow, this);
104 edit_handles = new EditHandles(mwindow, this);
105 keyframe_pixmap = new BC_Pixmap(this, mwindow->theme->keyframe_data, PIXMAP_ALPHA);
106 camerakeyframe_pixmap = new BC_Pixmap(this, mwindow->theme->camerakeyframe_data, PIXMAP_ALPHA);
107 modekeyframe_pixmap = new BC_Pixmap(this, mwindow->theme->modekeyframe_data, PIXMAP_ALPHA);
108 pankeyframe_pixmap = new BC_Pixmap(this, mwindow->theme->pankeyframe_data, PIXMAP_ALPHA);
109 projectorkeyframe_pixmap = new BC_Pixmap(this, mwindow->theme->projectorkeyframe_data, PIXMAP_ALPHA);
110 maskkeyframe_pixmap = new BC_Pixmap(this, mwindow->theme->maskkeyframe_data, PIXMAP_ALPHA);
117 void TrackCanvas::resize_event()
119 //printf("TrackCanvas::resize_event 1\n");
122 //printf("TrackCanvas::resize_event 2\n");
125 int TrackCanvas::keypress_event()
129 switch(get_keypress())
134 mwindow->move_left();
141 mwindow->move_right();
149 mwindow->expand_sample();
162 mwindow->zoom_in_sample();
167 mwindow->zoom_in_y();
188 mwindow->move_down();
193 mwindow->zoom_in_t();
199 int cursor_x = get_relative_cursor_x();
200 int cursor_y = get_relative_cursor_y();
201 if(get_keypress() == TAB)
203 // Switch the record button
204 for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
206 int64_t track_x, track_y, track_w, track_h;
207 track_dimensions(track, track_x, track_y, track_w, track_h);
209 if(cursor_y >= track_y &&
210 cursor_y < track_y + track_h)
222 Track *this_track = 0;
223 for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
225 int64_t track_x, track_y, track_w, track_h;
226 track_dimensions(track, track_x, track_y, track_w, track_h);
228 if(cursor_y >= track_y &&
229 cursor_y < track_y + track_h)
237 int total_selected = mwindow->edl->tracks->total_of(Tracks::RECORD);
239 // nothing previously selected
240 if(total_selected == 0)
242 mwindow->edl->tracks->select_all(Tracks::RECORD,
246 if(total_selected == 1)
248 // this patch was previously the only one on
249 if(this_track && this_track->record)
251 mwindow->edl->tracks->select_all(Tracks::RECORD,
254 // another patch was previously the only one on
257 mwindow->edl->tracks->select_all(Tracks::RECORD,
260 this_track->record = 1;
265 if(total_selected > 1)
267 mwindow->edl->tracks->select_all(Tracks::RECORD,
270 this_track->record = 1;
282 mwindow->cwindow->update(0, 1, 1);
288 // since things under cursor have changed...
290 cursor_motion_event();
295 int TrackCanvas::drag_motion()
298 int cursor_x = get_relative_cursor_x();
299 int cursor_y = get_relative_cursor_y();
300 Track *over_track = 0;
302 PluginSet *over_pluginset = 0;
303 Plugin *over_plugin = 0;
309 drag_popup->cursor_motion_event();
313 // there's no point in drawing highlights has until drag operation has been set
314 if (!mwindow->session->current_operation)
317 if(get_cursor_over_window() &&
320 cursor_x < get_w() &&
323 // Find the edit and track the cursor is over
324 for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
326 int64_t track_x, track_y, track_w, track_h;
327 track_dimensions(track, track_x, track_y, track_w, track_h);
329 if(cursor_y >= track_y &&
330 cursor_y < track_y + track_h)
333 for(Edit *edit = track->edits->first; edit; edit = edit->next)
335 int64_t edit_x, edit_y, edit_w, edit_h;
336 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
338 if(cursor_x >= edit_x &&
339 cursor_y >= edit_y &&
340 cursor_x < edit_x + edit_w &&
341 cursor_y < edit_y + edit_h)
348 for(int i = 0; i < track->plugin_set.total; i++)
350 PluginSet *pluginset = track->plugin_set.values[i];
354 for(Plugin *plugin = (Plugin*)pluginset->first;
356 plugin = (Plugin*)plugin->next)
358 int64_t plugin_x, plugin_y, plugin_w, plugin_h;
359 plugin_dimensions(plugin, plugin_x, plugin_y, plugin_w, plugin_h);
361 if(cursor_y >= plugin_y &&
362 cursor_y < plugin_y + plugin_h)
364 over_pluginset = plugin->plugin_set;
366 if(cursor_x >= plugin_x &&
367 cursor_x < plugin_x + plugin_w)
369 over_plugin = plugin;
380 if (!over_track) // check for pastes from patchbay
381 over_track = mwindow->gui->patchbay->is_over_track();
383 if(mwindow->session->track_highlighted != over_track)
385 mwindow->session->track_highlighted = over_track;
389 if(mwindow->session->edit_highlighted != over_edit)
391 mwindow->session->edit_highlighted = over_edit;
395 if(mwindow->session->pluginset_highlighted != over_pluginset)
397 mwindow->session->pluginset_highlighted = over_pluginset;
401 if(mwindow->session->plugin_highlighted != over_plugin)
403 mwindow->session->plugin_highlighted = over_plugin;
407 if (mwindow->session->current_operation == DRAG_ASSET ||
408 mwindow->session->current_operation == DRAG_EDIT)
414 //printf("TrackCanvas::drag_motion 2 %p\n", mwindow->session->track_highlighted);
417 lock_window("TrackCanvas::drag_motion");
426 int TrackCanvas::drag_start_event()
431 int new_cursor, update_cursor;
433 if(mwindow->session->current_operation != NO_OPERATION) return 0;
437 if(test_plugins(get_drag_x(),
447 if(test_edits(get_drag_x(),
463 int TrackCanvas::drag_motion_event()
465 return drag_motion();
468 int TrackCanvas::cursor_leave_event()
470 // because drag motion calls get_cursor_over_window we can be sure that
471 // all highlights get deleted now
477 int TrackCanvas::drag_stop_event()
479 int result = drag_stop();
490 int TrackCanvas::drag_stop()
492 // In most cases the editing routine redraws and not the drag_stop
493 int result = 0, redraw = 0;
495 int insertion = 0; // used in drag and drop mode
496 switch(mwindow->session->current_operation)
498 case DRAG_VTRANSITION:
499 case DRAG_ATRANSITION:
500 if(mwindow->session->edit_highlighted)
502 if((mwindow->session->current_operation == DRAG_ATRANSITION &&
503 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
504 (mwindow->session->current_operation == DRAG_VTRANSITION &&
505 mwindow->session->track_highlighted->data_type == TRACK_VIDEO))
507 mwindow->session->current_operation = NO_OPERATION;
508 mwindow->paste_transition();
518 // Behavior for dragged plugins is limited by the fact that a shared plugin
519 // can only refer to a standalone plugin that exists in the same position in
520 // time. Dragging a plugin from one point in time to another can't produce
521 // a shared plugin to the original plugin. In this case we relocate the
522 // plugin instead of sharing it.
523 case DRAG_AEFFECT_COPY:
524 case DRAG_VEFFECT_COPY:
525 if(mwindow->session->track_highlighted &&
526 ((mwindow->session->current_operation == DRAG_AEFFECT_COPY &&
527 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
528 (mwindow->session->current_operation == DRAG_VEFFECT_COPY &&
529 mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
531 mwindow->session->current_operation = NO_OPERATION;
533 // Insert shared plugin in source
534 if(mwindow->session->track_highlighted != mwindow->session->drag_plugin->track &&
535 !mwindow->session->plugin_highlighted &&
536 !mwindow->session->pluginset_highlighted)
538 // Move plugin if different startproject
539 mwindow->move_effect(mwindow->session->drag_plugin,
541 mwindow->session->track_highlighted,
546 // Move source to different location
547 if(mwindow->session->pluginset_highlighted)
549 //printf("TrackCanvas::drag_stop 6\n");
550 if(mwindow->session->plugin_highlighted)
552 mwindow->move_effect(mwindow->session->drag_plugin,
553 mwindow->session->plugin_highlighted->plugin_set,
555 mwindow->session->plugin_highlighted->startproject);
559 mwindow->move_effect(mwindow->session->drag_plugin,
560 mwindow->session->pluginset_highlighted,
562 mwindow->session->pluginset_highlighted->length());
567 // Move to a new plugin set between two edits
568 if(mwindow->session->edit_highlighted)
570 mwindow->move_effect(mwindow->session->drag_plugin,
572 mwindow->session->track_highlighted,
573 mwindow->session->edit_highlighted->startproject);
577 // Move to a new plugin set
578 if(mwindow->session->track_highlighted)
580 mwindow->move_effect(mwindow->session->drag_plugin,
582 mwindow->session->track_highlighted,
591 if(mwindow->session->track_highlighted &&
592 ((mwindow->session->current_operation == DRAG_AEFFECT &&
593 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
594 (mwindow->session->current_operation == DRAG_VEFFECT &&
595 mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
597 // Drop all the effects
598 PluginSet *plugin_set = mwindow->session->pluginset_highlighted;
599 Track *track = mwindow->session->track_highlighted;
601 double length = track->get_length();
603 if(mwindow->session->plugin_highlighted)
605 start = track->from_units(mwindow->session->plugin_highlighted->startproject);
606 length = track->from_units(mwindow->session->plugin_highlighted->length);
607 if(length <= 0) length = track->get_length();
610 if(mwindow->session->pluginset_highlighted)
612 start = track->from_units(plugin_set->length());
613 length = track->get_length() - start;
614 if(length <= 0) length = track->get_length();
617 if(mwindow->edl->local_session->get_selectionend() >
618 mwindow->edl->local_session->get_selectionstart())
620 start = mwindow->edl->local_session->get_selectionstart();
621 length = mwindow->edl->local_session->get_selectionend() -
622 mwindow->edl->local_session->get_selectionstart();
624 // Move to a point between two edits
626 if(mwindow->session->edit_highlighted)
628 start = mwindow->session->track_highlighted->from_units(
629 mwindow->session->edit_highlighted->startproject);
630 length = mwindow->session->track_highlighted->from_units(
631 mwindow->session->edit_highlighted->length);
634 mwindow->insert_effects_canvas(start, length);
637 if (mwindow->session->track_highlighted)
638 result = 1; // we have to cleanup
642 if(mwindow->session->track_highlighted)
644 float asset_length_float;
645 int64_t asset_length_units;
646 int64_t position = 0;
648 if(mwindow->session->current_operation == DRAG_ASSET &&
649 mwindow->session->drag_assets->total)
651 Asset *asset = mwindow->session->drag_assets->values[0];
653 // we use video if we are over video and audio if we are over audio
654 if (asset->video_data && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)
655 asset_length_float = asset->video_length / asset->frame_rate;
657 asset_length_float = asset->audio_length / asset->sample_rate;
659 if(mwindow->session->current_operation == DRAG_ASSET &&
660 mwindow->session->drag_clips->total)
662 EDL *clip = mwindow->session->drag_clips->values[0];
663 asset_length_float = clip->tracks->total_length();
666 asset_length_units = mwindow->session->track_highlighted->to_units(asset_length_float, 0);
667 position = get_drop_position (&insertion, NULL, asset_length_units);
671 break; // Do not do anything
674 double position_f = mwindow->session->track_highlighted->from_units(position);
675 Track *track = mwindow->session->track_highlighted;
679 // FIXME, we should create an mwindow/EDL method that overwrites, without clearing the keyframes and autos
680 // Unfortunately, this is _a lot_ of work to do right
681 mwindow->edl->tracks->clear(position_f,
682 position_f + asset_length_float, 0);
684 mwindow->paste_assets(position_f, track);
685 result = 1; // need to be one no matter what, since we have track highlited so we have to cleanup....
690 mwindow->session->current_operation = NO_OPERATION;
691 if(mwindow->session->track_highlighted)
693 if(mwindow->session->track_highlighted->data_type == mwindow->session->drag_edit->track->data_type)
695 int64_t position = 0;
697 position = get_drop_position (&insertion, mwindow->session->drag_edit, mwindow->session->drag_edit->length);
702 break; // Do not do anything
705 double position_f = mwindow->session->track_highlighted->from_units(position);
706 Track *track = mwindow->session->track_highlighted;
707 mwindow->move_edits(mwindow->session->drag_edits,
718 // since we don't have subwindows we have to terminate any drag operation
721 if (mwindow->session->track_highlighted
722 || mwindow->session->edit_highlighted
723 || mwindow->session->plugin_highlighted
724 || mwindow->session->pluginset_highlighted)
726 mwindow->session->track_highlighted = 0;
727 mwindow->session->edit_highlighted = 0;
728 mwindow->session->plugin_highlighted = 0;
729 mwindow->session->pluginset_highlighted = 0;
730 mwindow->session->current_operation = NO_OPERATION;
734 //printf("TrackCanvas::drag_stop %d %d\n", redraw, mwindow->session->current_operation);
737 mwindow->edl->tracks->update_y_pixels(mwindow->theme);
738 gui->get_scrollbars();
740 gui->patchbay->update();
741 gui->cursor->update();
750 int64_t TrackCanvas::get_drop_position (int *is_insertion, Edit *moved_edit, int64_t moved_edit_length)
754 // get the canvas/track position
755 int cursor_x = get_relative_cursor_x();
756 double pos = (double)cursor_x *
757 mwindow->edl->local_session->zoom_sample /
758 mwindow->edl->session->sample_rate +
759 (double)mwindow->edl->local_session->view_start *
760 mwindow->edl->local_session->zoom_sample /
761 mwindow->edl->session->sample_rate;
762 // convert to track's units to operate with them
763 Track *track = mwindow->session->track_highlighted;
764 // cursor relative position - depending on where we started the drag inside the edit
765 int64_t cursor_position;
766 if (moved_edit) // relative cursor position depends upon grab point
767 cursor_position = track->to_units (pos - (mwindow->session->drag_position - moved_edit->track->from_units(moved_edit->startproject)), 1);
768 else // for clips and assets acts as they were grabbed in the middle
769 cursor_position = track->to_units (pos , 1) - moved_edit_length / 2;
771 // we use real cursor position for affinity calculations
772 int64_t real_cursor_position = track->to_units (pos, 0);
773 if (cursor_position < 0) cursor_position = 0;
774 if (real_cursor_position < 0) real_cursor_position = 0;
775 int64_t position = -1;
776 int64_t span_start = 0;
777 int64_t span_length = 0;
779 int last_ignore = 0; // used to make sure we can ignore the last edit if that is what we are dragging
781 if (!track->edits->last)
783 // No edits -> no problems!
784 position = cursor_position;
788 Edit *fake_edit = new Edit(mwindow->edl, track);
789 int last2 = 0; // last2 is a hack that let us make virtual edits at the end so thing works for last edit also
790 // we do this by appending two VERY long virtual edits at the end
792 for (Edit *edit = track->edits->first; edit || last2 < 2; )
795 if (!edit && last_ignore)
797 span_length += 100000000000000LL;
802 ((moved_edit && edit == moved_edit && edit->previous && !edit->previous->asset) ||
803 (moved_edit && edit->previous == moved_edit && !edit->asset)))
805 span_length += edit->length; // our fake edit spans over the edit we are moving
808 { // This is a virtual edit
809 fake_edit->startproject = span_start;
810 fake_edit->length = span_length;
811 int64_t edit_x, edit_y, edit_w, edit_h;
812 edit_dimensions(fake_edit, edit_x, edit_y, edit_w, edit_h);
813 if (labs(edit_x - cursor_x) < HANDLE_W) // cursor is close to the beginning of an edit -> insertion
816 position = span_start;
818 if (labs(edit_x + edit_w - cursor_x) < HANDLE_W) // cursor is close to the end of an edit -> insertion
821 position = span_start + span_length;
824 if (!span_asset && // we have enough empty space to position the edit where user wants
825 span_start <= cursor_position &&
826 span_start + span_length >= cursor_position + moved_edit_length)
828 position = cursor_position;
830 if (!span_asset & // we are inside an empty edit, but cannot push the edit as far as user wants, so 'resist moving it further'
831 real_cursor_position >= span_start &&
832 real_cursor_position < span_start + span_length &&
833 span_length >= moved_edit_length)
835 if (llabs(real_cursor_position - span_start) < llabs(real_cursor_position - span_start - span_length))
836 position = span_start;
838 position = span_start + span_length - moved_edit_length;
840 if (cursor_x > edit_x && cursor_x <= edit_x + edit_w / 2) // we are inside an nonempty edit, - snap to left
843 position = span_start;
845 if (cursor_x > edit_x + edit_w / 2 && cursor_x <= edit_x + edit_w) // we are inside an nonempty edit, - snap to right
848 position = span_start + span_length;
855 // This is the new edit
858 span_length = edit->length;
859 span_start = edit->startproject;
861 if (!edit->asset || (!moved_edit || moved_edit == edit))
863 if (moved_edit && moved_edit == edit)
871 span_start = span_length + span_start;
872 span_length = 100000000000000LL;
887 if (real_cursor_position == 0)
892 // printf("rcp: %lli, position: %lli, insertion: %i\n", real_cursor_position, position, *is_insertion);
898 void TrackCanvas::draw(int force, int hide_cursor)
900 // Swap pixmap layers
901 TRACE("TrackCanvas::draw 1")
902 if(get_w() != background_pixmap->get_w() ||
903 get_h() != background_pixmap->get_h())
905 delete background_pixmap;
906 background_pixmap = new BC_Pixmap(this, get_w(), get_h());
909 TRACE("TrackCanvas::draw 10")
910 // Cursor disappears after resize when this is called.
911 // Cursor doesn't redraw after editing when this isn't called.
912 if(gui->cursor && hide_cursor) gui->cursor->hide();
913 TRACE("TrackCanvas::draw 20")
914 draw_top_background(get_parent(), 0, 0, get_w(), get_h(), background_pixmap);
915 TRACE("TrackCanvas::draw 30")
916 draw_resources(force);
917 TRACE("TrackCanvas::draw 40")
922 void TrackCanvas::update_cursor()
924 switch(mwindow->edl->session->editing_mode)
926 case EDITING_ARROW: set_cursor(ARROW_CURSOR); break;
927 case EDITING_IBEAM: set_cursor(IBEAM_CURSOR); break;
932 void TrackCanvas::draw_indexes(Asset *asset)
934 // Don't redraw raw samples
935 if(asset->index_zoom > mwindow->edl->local_session->zoom_sample)
938 draw_resources(0, 1, asset);
946 void TrackCanvas::draw_resources(int force,
950 // Age resource pixmaps for deletion
952 for(int i = 0; i < resource_pixmaps.total; i++)
953 resource_pixmaps.values[i]->visible--;
956 resource_pixmaps.remove_all_objects();
958 //printf("TrackCanvas::draw_resources 1 %d %d\n", force, indexes_only);
961 for(Track *current = mwindow->edl->tracks->first;
965 //printf("TrackCanvas::draw_resources 2\n");
966 for(Edit *edit = current->edits->first; edit; edit = edit->next)
968 //printf("TrackCanvas::draw_resources 3\n");
969 if(!edit->asset) continue;
970 //printf("TrackCanvas::draw_resources 4\n");
973 if(edit->track->data_type != TRACK_AUDIO) continue;
974 if(!edit->asset->test_path(index_asset->path)) continue;
977 int64_t edit_x, edit_y, edit_w, edit_h;
978 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
979 //printf("TrackCanvas::draw_resources 10\n");
982 if(MWindowGUI::visible(edit_x, edit_x + edit_w, 0, get_w()) &&
983 MWindowGUI::visible(edit_y, edit_y + edit_h, 0, get_h()))
985 int64_t pixmap_x, pixmap_w, pixmap_h;
987 //printf("TrackCanvas::draw_resources 20\n");
988 // Search for existing pixmap containing edit
989 for(int i = 0; i < resource_pixmaps.total; i++)
991 ResourcePixmap* pixmap = resource_pixmaps.values[i];
992 //printf("TrackCanvas::draw_resources 30\n");
993 // Same pointer can be different edit if editing took place
994 if(pixmap->edit_id == edit->id)
996 //printf("TrackCanvas::draw_resources 40\n");
1000 //printf("TrackCanvas::draw_resources 50\n");
1003 // Get new size, offset of pixmap needed
1004 get_pixmap_size(edit,
1010 //printf("TrackCanvas::draw_resources 60\n");
1013 if(pixmap_w && pixmap_h)
1015 // Create pixmap if it doesn't exist
1016 ResourcePixmap* pixmap = create_pixmap(edit,
1021 //printf("TrackCanvas::draw_resources 70\n");
1022 // Resize it if it's bigger
1023 if(pixmap_w > pixmap->pixmap_w ||
1024 pixmap_h > pixmap->pixmap_h)
1025 pixmap->resize(pixmap_w, pixmap_h);
1026 //printf("TrackCanvas::draw_resources 80\n");
1027 pixmap->draw_data(edit,
1035 //printf("TrackCanvas::draw_resources 90\n");
1036 // Resize it if it's smaller
1037 if(pixmap_w < pixmap->pixmap_w ||
1038 pixmap_h < pixmap->pixmap_h)
1039 pixmap->resize(pixmap_w, pixmap_h);
1040 //printf("TrackCanvas::draw_resources 100\n");
1041 // Copy pixmap to background canvas
1042 background_pixmap->draw_pixmap(pixmap,
1047 //printf("TrackCanvas::draw_resources 110\n");
1052 //printf("TrackCanvas::draw_resources 200\n");
1054 // Delete unused pixmaps
1056 for(int i = resource_pixmaps.total - 1; i >= 0; i--)
1057 if(resource_pixmaps.values[i]->visible < -5)
1059 delete resource_pixmaps.values[i];
1060 resource_pixmaps.remove(resource_pixmaps.values[i]);
1064 ResourcePixmap* TrackCanvas::create_pixmap(Edit *edit,
1070 ResourcePixmap *result = 0;
1072 for(int i = 0; i < resource_pixmaps.total; i++)
1074 //printf("TrackCanvas::create_pixmap 1 %d %d\n", edit->id, resource_pixmaps.values[i]->edit->id);
1075 if(resource_pixmaps.values[i]->edit_id == edit->id)
1077 result = resource_pixmaps.values[i];
1084 //printf("TrackCanvas::create_pixmap 2\n");
1085 result = new ResourcePixmap(mwindow,
1090 resource_pixmaps.append(result);
1093 // result->resize(pixmap_w, pixmap_h);
1097 void TrackCanvas::get_pixmap_size(Edit *edit,
1105 // Align x on frame boundaries
1108 // switch(edit->edits->track->data_type)
1110 // case TRACK_AUDIO:
1116 pixmap_w -= -edit_x;
1120 if(pixmap_x + pixmap_w > get_w())
1122 pixmap_w = get_w() - pixmap_x;
1127 // case TRACK_VIDEO:
1129 // int64_t picon_w = (int64_t)(edit->picon_w() + 0.5);
1130 // int64_t frame_w = (int64_t)(edit->frame_w() + 0.5);
1131 // int64_t pixel_increment = MAX(picon_w, frame_w);
1132 // int64_t pixmap_x1 = edit_x;
1133 // int64_t pixmap_x2 = edit_x + edit_w;
1135 // if(pixmap_x1 < 0)
1137 // pixmap_x1 = (int64_t)((double)-edit_x / pixel_increment) *
1138 // pixel_increment +
1142 // if(pixmap_x2 > get_w())
1144 // pixmap_x2 = (int64_t)((double)(get_w() - edit_x) / pixel_increment + 1) *
1145 // pixel_increment +
1148 // pixmap_x = pixmap_x1;
1149 // pixmap_w = pixmap_x2 - pixmap_x1;
1154 pixmap_h = mwindow->edl->local_session->zoom_track;
1155 if(mwindow->edl->session->show_titles) pixmap_h += mwindow->theme->title_bg_data->get_h();
1156 //printf("get_pixmap_size %d %d %d %d\n", edit_x, edit_w, pixmap_x, pixmap_w);
1159 void TrackCanvas::edit_dimensions(Edit *edit,
1165 //printf("TrackCanvas::edit_dimensions 1 %p\n", edit->track);
1169 //printf("TrackCanvas::edit_dimensions 1\n");
1170 x = Units::round(edit->track->from_units(edit->startproject) *
1171 mwindow->edl->session->sample_rate /
1172 mwindow->edl->local_session->zoom_sample -
1173 mwindow->edl->local_session->view_start);
1175 // Method for calculating w so when edits are together we never get off by one error due to rounding
1176 int64_t x_next = Units::round(edit->track->from_units(edit->startproject + edit->length) *
1177 mwindow->edl->session->sample_rate /
1178 mwindow->edl->local_session->zoom_sample -
1179 mwindow->edl->local_session->view_start);
1182 //printf("TrackCanvas::edit_dimensions 1\n");
1183 y = edit->edits->track->y_pixel;
1184 //printf("TrackCanvas::edit_dimensions 1\n");
1186 if(mwindow->edl->session->show_titles)
1187 h += mwindow->theme->title_bg_data->get_h();
1188 //printf("TrackCanvas::edit_dimensions 2\n");
1191 void TrackCanvas::track_dimensions(Track *track, int64_t &x, int64_t &y, int64_t &w, int64_t &h)
1196 h = track->vertical_span(mwindow->theme);
1200 void TrackCanvas::draw_paste_destination()
1202 int current_atrack = 0;
1203 int current_vtrack = 0;
1204 int current_aedit = 0;
1205 int current_vedit = 0;
1211 //printf("TrackCanvas::draw_paste_destination 1\n");
1212 if((mwindow->session->current_operation == DRAG_ASSET &&
1213 (mwindow->session->drag_assets->total ||
1214 mwindow->session->drag_clips->total)) ||
1215 (mwindow->session->current_operation == DRAG_EDIT &&
1216 mwindow->session->drag_edits->total))
1218 //printf("TrackCanvas::draw_paste_destination 1\n");
1223 if(mwindow->session->current_operation == DRAG_ASSET &&
1224 mwindow->session->drag_assets->total)
1225 asset = mwindow->session->drag_assets->values[0];
1227 if(mwindow->session->current_operation == DRAG_ASSET &&
1228 mwindow->session->drag_clips->total)
1229 clip = mwindow->session->drag_clips->values[0];
1231 // Get destination track
1232 for(Track *dest = mwindow->session->track_highlighted;
1238 // Get source width in pixels
1242 // Use start of highlighted edit
1243 if(mwindow->session->edit_highlighted)
1244 position = mwindow->session->track_highlighted->from_units(
1245 mwindow->session->edit_highlighted->startproject);
1247 // Use end of highlighted track, disregarding effects
1248 position = mwindow->session->track_highlighted->from_units(
1249 mwindow->session->track_highlighted->edits->length());
1252 if(dest->data_type == TRACK_AUDIO)
1254 if(asset && current_atrack < asset->channels)
1257 w = Units::to_int64((double)asset->audio_length /
1258 asset->sample_rate *
1259 mwindow->edl->session->sample_rate /
1260 mwindow->edl->local_session->zoom_sample);
1262 // FIXME: more obvious, get_drop_position should be called only ONCE - for highlighted track
1263 int64_t asset_length;
1264 // we use video if we are over video and audio if we are over audio
1265 if (asset->video_data && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)
1266 asset_length = mwindow->session->track_highlighted->to_units(asset->video_length / asset->frame_rate, 0);
1268 asset_length = mwindow->session->track_highlighted->to_units(asset->audio_length / asset->sample_rate, 0);
1270 position = mwindow->session->track_highlighted->from_units(get_drop_position(&insertion, NULL, asset_length));
1280 if(clip && current_atrack < clip->tracks->total_audio_tracks())
1282 w = Units::to_int64((double)clip->tracks->total_length() *
1283 mwindow->edl->session->sample_rate /
1284 mwindow->edl->local_session->zoom_sample);
1285 //printf("draw_paste_destination %d\n", x);
1286 int64_t asset_length = mwindow->session->track_highlighted->to_units((double)clip->tracks->total_length(), 0);
1288 position = mwindow->session->track_highlighted->from_units(get_drop_position(&insertion, NULL, asset_length));
1298 if(mwindow->session->current_operation == DRAG_EDIT &&
1299 current_aedit < mwindow->session->drag_edits->total)
1302 while(current_aedit < mwindow->session->drag_edits->total &&
1303 mwindow->session->drag_edits->values[current_aedit]->track->data_type != TRACK_AUDIO)
1306 if(current_aedit < mwindow->session->drag_edits->total)
1308 edit = mwindow->session->drag_edits->values[current_aedit];
1309 w = Units::to_int64(edit->length / mwindow->edl->local_session->zoom_sample);
1311 position = mwindow->session->track_highlighted->from_units(get_drop_position(&insertion, mwindow->session->drag_edit, mwindow->session->drag_edit->length));
1324 if(dest->data_type == TRACK_VIDEO)
1326 //printf("draw_paste_destination 1\n");
1327 if(asset && current_vtrack < asset->layers)
1329 w = Units::to_int64((double)asset->video_length /
1331 mwindow->edl->session->sample_rate /
1332 mwindow->edl->local_session->zoom_sample);
1333 int64_t asset_length = mwindow->session->track_highlighted->to_units((double)asset->video_length /
1334 asset->frame_rate, 0);
1336 position = mwindow->session->track_highlighted->from_units(get_drop_position(&insertion, NULL, asset_length));
1346 if(clip && current_vtrack < clip->tracks->total_video_tracks())
1348 w = Units::to_int64(clip->tracks->total_length() *
1349 mwindow->edl->session->sample_rate /
1350 mwindow->edl->local_session->zoom_sample);
1351 int64_t asset_length = mwindow->session->track_highlighted->to_units((double)clip->tracks->total_length(), 0);
1353 position = mwindow->session->track_highlighted->from_units(get_drop_position(&insertion, NULL, asset_length));
1363 if(mwindow->session->current_operation == DRAG_EDIT &&
1364 current_vedit < mwindow->session->drag_edits->total)
1366 //printf("draw_paste_destination 2\n");
1368 while(current_vedit < mwindow->session->drag_edits->total &&
1369 mwindow->session->drag_edits->values[current_vedit]->track->data_type != TRACK_VIDEO)
1372 if(current_vedit < mwindow->session->drag_edits->total)
1374 //printf("draw_paste_destination 3\n");
1375 edit = mwindow->session->drag_edits->values[current_vedit];
1376 w = Units::to_int64(edit->track->from_units(edit->length) *
1377 mwindow->edl->session->sample_rate /
1378 mwindow->edl->local_session->zoom_sample);
1380 position = mwindow->session->track_highlighted->from_units(get_drop_position(&insertion, mwindow->session->drag_edit, mwindow->session->drag_edit->length));
1395 // Get the x coordinate
1396 x = Units::to_int64(position *
1397 mwindow->edl->session->sample_rate /
1398 mwindow->edl->local_session->zoom_sample) -
1399 mwindow->edl->local_session->view_start;
1400 int y = dest->y_pixel;
1401 int h = dest->vertical_span(mwindow->theme);
1404 //printf("TrackCanvas::draw_paste_destination 2 %d %d %d %d\n", x, y, w, h);
1406 draw_highlight_insertion(x, y, w, h);
1408 draw_highlight_rectangle(x, y, w, h);
1417 void TrackCanvas::plugin_dimensions(Plugin *plugin, int64_t &x, int64_t &y, int64_t &w, int64_t &h)
1419 x = Units::round(plugin->track->from_units(plugin->startproject) *
1420 mwindow->edl->session->sample_rate /
1421 mwindow->edl->local_session->zoom_sample -
1422 mwindow->edl->local_session->view_start);
1423 w = Units::round(plugin->track->from_units(plugin->length) *
1424 mwindow->edl->session->sample_rate /
1425 mwindow->edl->local_session->zoom_sample);
1426 y = plugin->track->y_pixel +
1427 mwindow->edl->local_session->zoom_track +
1428 plugin->plugin_set->get_number() *
1429 mwindow->theme->plugin_bg_data->get_h();
1430 if(mwindow->edl->session->show_titles)
1431 y += mwindow->theme->title_bg_data->get_h();
1432 h = mwindow->theme->plugin_bg_data->get_h();
1435 int TrackCanvas::resource_h()
1437 return mwindow->edl->local_session->zoom_track;
1440 void TrackCanvas::draw_highlight_rectangle(int x, int y, int w, int h)
1443 // if we have to draw a highlighted rectangle completely on the left or completely on the right of the viewport,
1444 // just draw arrows, so user has indication that something is there
1445 // FIXME: get better colors
1449 draw_triangle_left(0, y + h /6, h * 2/3, h * 2/3, BLACK, GREEN, YELLOW, RED, BLUE);
1454 draw_triangle_right(get_w() - h * 2/3, y + h /6, h * 2/3, h * 2/3, BLACK, GREEN, YELLOW, RED, BLUE);
1458 // Fix bug in heroines & cvs version as of 22.8.2005:
1459 // If we grab when zoomed in and zoom out while dragging, when edit gets really narrow strange things start happening
1460 if (w >= 0 && w < 3) {x -= w /2; w = 3;};
1471 w = MIN(w, get_w() + 20);
1472 h = MIN(h, get_h() + 20);
1475 draw_rectangle(x, y, w, h);
1476 draw_rectangle(x + 1, y + 1, w - 2, h - 2);
1478 //printf("TrackCanvas::draw_highlight_rectangle %d %d %d %d\n", x, y, w, h);
1481 void TrackCanvas::draw_highlight_insertion(int x, int y, int w, int h)
1484 // if we have to draw a highlighted rectangle completely on the left or completely on the right of the viewport,
1485 // just draw arrows, so user has indication that something is there
1486 // FIXME: get better colors
1495 /* these don't look so good
1497 draw_line(x, y, x, y+h);
1498 draw_line(x - h2 * 2, y + h1*2, x - h2, y+h1*2);
1499 draw_line(x - h2 * 2, y + h1*2+1, x - h2, y+h1*2+1);
1500 draw_line(x - h2 * 2, y + h1*6, x - h2, y+h1*6);
1501 draw_line(x - h2 * 2, y + h1*6+1, x - h2, y+h1*6+1);
1503 draw_triangle_right(x - h2, y + h1, h2, h2, BLACK, GREEN, YELLOW, RED, BLUE);
1504 draw_triangle_right(x - h2, y + h1*5, h2, h2, BLACK, GREEN, YELLOW, RED, BLUE);
1506 /* draw_line(x + h2 * 2, y + h1*2, x + h2, y+h1*2);
1507 draw_line(x + h2 * 2, y + h1*2+1, x + h2, y+h1*2+1);
1508 draw_line(x + h2 * 2, y + h1*6, x + h2, y+h1*6);
1509 draw_line(x - h2 * 2, y + h1*6+1, x + h2, y+h1*6+1);
1511 draw_triangle_left(x, y + h1, h2, h2, BLACK, GREEN, YELLOW, RED, BLUE);
1512 draw_triangle_left(x, y + h1*5, h2, h2, BLACK, GREEN, YELLOW, RED, BLUE);
1514 // draw the box centred around x
1516 // Fix bug in heroines & cvs version as of 22.8.2005:
1517 // If we grab when zoomed in and zoom out while dragging, when edit gets really narrow strange things start happening
1518 if (w >= 0 && w < 3) {x -= w /2; w = 3;};
1529 w = MIN(w, get_w() + 20);
1530 h = MIN(h, get_h() + 20);
1533 draw_rectangle(x, y, w, h);
1534 draw_rectangle(x + 1, y + 1, w - 2, h - 2);
1536 //printf("TrackCanvas::draw_highlight_insertion %d %d %d %d\n", x, y, w, h);
1539 void TrackCanvas::draw_playback_cursor()
1541 // Called before playback_cursor exists
1542 // if(mwindow->playback_cursor && mwindow->playback_cursor->visible)
1544 // mwindow->playback_cursor->visible = 0;
1545 // mwindow->playback_cursor->draw();
1549 void TrackCanvas::get_handle_coords(Edit *edit, int64_t &x, int64_t &y, int64_t &w, int64_t &h, int side)
1551 int handle_w = mwindow->theme->edithandlein_data[0]->get_w();
1552 int handle_h = mwindow->theme->edithandlein_data[0]->get_h();
1554 edit_dimensions(edit, x, y, w, h);
1556 if(mwindow->edl->session->show_titles)
1558 y += mwindow->theme->title_bg_data->get_h();
1565 if(side == EDIT_OUT)
1574 void TrackCanvas::get_transition_coords(int64_t &x, int64_t &y, int64_t &w, int64_t &h)
1576 //printf("TrackCanvas::get_transition_coords 1\n");
1577 // int transition_w = mwindow->theme->transitionhandle_data[0]->get_w();
1578 // int transition_h = mwindow->theme->transitionhandle_data[0]->get_h();
1579 int transition_w = 30;
1580 int transition_h = 30;
1581 //printf("TrackCanvas::get_transition_coords 1\n");
1583 if(mwindow->edl->session->show_titles)
1584 y += mwindow->theme->title_bg_data->get_h();
1585 //printf("TrackCanvas::get_transition_coords 2\n");
1587 y += (h - mwindow->theme->title_bg_data->get_h()) / 2 - transition_h / 2;
1588 x -= transition_w / 2;
1594 void TrackCanvas::draw_highlighting()
1598 //printf("TrackCanvas::draw_highlighting 1 %p %d\n", mwindow->session->track_highlighted, mwindow->session->current_operation);
1602 switch(mwindow->session->current_operation)
1604 case DRAG_ATRANSITION:
1605 case DRAG_VTRANSITION:
1606 //printf("TrackCanvas::draw_highlighting 1 %p %p\n",
1607 // mwindow->session->track_highlighted, mwindow->session->edit_highlighted);
1608 if(mwindow->session->edit_highlighted)
1610 //printf("TrackCanvas::draw_highlighting 2\n");
1611 if((mwindow->session->current_operation == DRAG_ATRANSITION &&
1612 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1613 (mwindow->session->current_operation == DRAG_VTRANSITION &&
1614 mwindow->session->track_highlighted->data_type == TRACK_VIDEO))
1616 //printf("TrackCanvas::draw_highlighting 2\n");
1617 edit_dimensions(mwindow->session->edit_highlighted, x, y, w, h);
1618 //printf("TrackCanvas::draw_highlighting 2\n");
1620 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1621 MWindowGUI::visible(y, y + h, 0, get_h()))
1624 get_transition_coords(x, y, w, h);
1626 //printf("TrackCanvas::draw_highlighting 3\n");
1633 // Dragging a new effect from the Resource window
1636 if(mwindow->session->track_highlighted &&
1637 ((mwindow->session->current_operation == DRAG_AEFFECT && mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1638 (mwindow->session->current_operation == DRAG_VEFFECT && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
1640 // Put it before another plugin
1641 if(mwindow->session->plugin_highlighted)
1643 plugin_dimensions(mwindow->session->plugin_highlighted,
1648 //printf("TrackCanvas::draw_highlighting 1 %d %d\n", x, w);
1651 // Put it after a plugin set
1652 if(mwindow->session->pluginset_highlighted &&
1653 mwindow->session->pluginset_highlighted->last)
1655 plugin_dimensions((Plugin*)mwindow->session->pluginset_highlighted->last,
1660 //printf("TrackCanvas::draw_highlighting 1 %d %d\n", x, w);
1661 int64_t track_x, track_y, track_w, track_h;
1662 track_dimensions(mwindow->session->track_highlighted,
1670 mwindow->session->track_highlighted->get_length() *
1671 mwindow->edl->session->sample_rate /
1672 mwindow->edl->local_session->zoom_sample -
1673 mwindow->edl->local_session->view_start) -
1675 //printf("TrackCanvas::draw_highlighting 2 %d\n", w);
1676 if(w <= 0) w = track_w;
1680 track_dimensions(mwindow->session->track_highlighted,
1686 //printf("TrackCanvas::draw_highlighting 1 %d %d %d %d\n", x, y, w, h);
1687 // Put it in a new plugin set determined by the selected range
1688 if(mwindow->edl->local_session->get_selectionend() >
1689 mwindow->edl->local_session->get_selectionstart())
1691 x = Units::to_int64(mwindow->edl->local_session->get_selectionstart() *
1692 mwindow->edl->session->sample_rate /
1693 mwindow->edl->local_session->zoom_sample -
1694 mwindow->edl->local_session->view_start);
1695 w = Units::to_int64((mwindow->edl->local_session->get_selectionend() -
1696 mwindow->edl->local_session->get_selectionstart()) *
1697 mwindow->edl->session->sample_rate /
1698 mwindow->edl->local_session->zoom_sample);
1700 // Put it in a new plugin set determined by an edit boundary
1702 if(mwindow->session->edit_highlighted)
1704 int64_t temp_y, temp_h;
1705 edit_dimensions(mwindow->session->edit_highlighted,
1711 // Put it at the beginning of the track in a new plugin set
1714 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1715 MWindowGUI::visible(y, y + h, 0, get_h()))
1717 //printf("TrackCanvas::draw_highlighting 1\n");
1724 if(mwindow->session->track_highlighted)
1726 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1728 if(MWindowGUI::visible(y, y + h, 0, get_h()))
1730 draw_paste_destination();
1735 // Dragging an effect from the timeline
1736 case DRAG_AEFFECT_COPY:
1737 case DRAG_VEFFECT_COPY:
1738 if((mwindow->session->plugin_highlighted || mwindow->session->track_highlighted) &&
1739 ((mwindow->session->current_operation == DRAG_AEFFECT_COPY && mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1740 (mwindow->session->current_operation == DRAG_VEFFECT_COPY && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
1742 // Put it before another plugin
1743 if(mwindow->session->plugin_highlighted)
1744 plugin_dimensions(mwindow->session->plugin_highlighted, x, y, w, h);
1746 // Put it after a plugin set
1747 if(mwindow->session->pluginset_highlighted &&
1748 mwindow->session->pluginset_highlighted->last)
1750 plugin_dimensions((Plugin*)mwindow->session->pluginset_highlighted->last, x, y, w, h);
1754 if(mwindow->session->track_highlighted)
1756 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1758 // Put it in a new plugin set determined by an edit boundary
1759 if(mwindow->session->edit_highlighted)
1761 int64_t temp_y, temp_h;
1762 edit_dimensions(mwindow->session->edit_highlighted,
1768 // Put it in a new plugin set at the start of the track
1771 // Calculate length of plugin based on data type of track and units
1772 if(mwindow->session->track_highlighted->data_type == TRACK_VIDEO)
1774 w = (int64_t)((double)mwindow->session->drag_plugin->length /
1775 mwindow->edl->session->frame_rate *
1776 mwindow->edl->session->sample_rate /
1777 mwindow->edl->local_session->zoom_sample);
1781 w = (int64_t)mwindow->session->drag_plugin->length /
1782 mwindow->edl->local_session->zoom_sample;
1785 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1786 MWindowGUI::visible(y, y + h, 0, get_h()))
1793 case DRAG_PLUGINKEY:
1794 if(mwindow->session->plugin_highlighted &&
1795 mwindow->session->current_operation == DRAG_PLUGINKEY)
1797 // Just highlight the plugin
1798 plugin_dimensions(mwindow->session->plugin_highlighted, x, y, w, h);
1800 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1801 MWindowGUI::visible(y, y + h, 0, get_h()))
1809 //printf("TrackCanvas::draw_highlighting 1\n");
1810 if(mwindow->session->track_highlighted)
1812 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1814 if(MWindowGUI::visible(y, y + h, 0, get_h()))
1816 draw_paste_destination();
1825 draw_highlight_rectangle(x, y, w, h);
1829 void TrackCanvas::draw_plugins()
1831 char string[BCTEXTLEN];
1833 for(Track *track = mwindow->edl->tracks->first;
1835 track = track->next)
1837 if(track->expand_view)
1839 for(int i = 0; i < track->plugin_set.total; i++)
1841 PluginSet *pluginset = track->plugin_set.values[i];
1843 for(Plugin *plugin = (Plugin*)pluginset->first; plugin; plugin = (Plugin*)plugin->next)
1845 int64_t total_x, y, total_w, h;
1846 plugin_dimensions(plugin, total_x, y, total_w, h);
1848 if(MWindowGUI::visible(total_x, total_x + total_w, 0, get_w()) &&
1849 MWindowGUI::visible(y, y + h, 0, get_h()) &&
1850 plugin->plugin_type != PLUGIN_NONE)
1852 int x = total_x, w = total_w, left_margin = 5;
1858 if(w + x > get_w()) w -= (w + x) - get_w();
1865 mwindow->theme->plugin_bg_data,
1868 set_font(MEDIUMFONT_3D);
1869 plugin->calculate_title(string, 0);
1871 // Truncate string to int64_test visible in background
1872 int len = strlen(string), j;
1873 for(j = len; j >= 0; j--)
1875 if(left_margin + get_text_width(MEDIUMFONT_3D, string) > w)
1883 // Justify the text on the left boundary of the edit if it is visible.
1884 // Otherwise justify it on the left side of the screen.
1885 int text_x = total_x + left_margin;
1886 text_x = MAX(left_margin, text_x);
1888 y + get_text_ascent(MEDIUMFONT_3D) + 2,
1900 void TrackCanvas::draw_inout_points()
1905 void TrackCanvas::draw_drag_handle()
1907 if(mwindow->session->current_operation == DRAG_EDITHANDLE2 ||
1908 mwindow->session->current_operation == DRAG_PLUGINHANDLE2)
1910 //printf("TrackCanvas::draw_drag_handle 1 %ld %ld\n", mwindow->session->drag_sample, mwindow->edl->local_session->view_start);
1911 int64_t pixel1 = Units::round(mwindow->session->drag_position *
1912 mwindow->edl->session->sample_rate /
1913 mwindow->edl->local_session->zoom_sample -
1914 mwindow->edl->local_session->view_start);
1915 //printf("TrackCanvas::draw_drag_handle 2 %d\n", pixel1);
1918 //printf("TrackCanvas::draw_drag_handle 3\n");
1919 draw_line(pixel1, 0, pixel1, get_h());
1921 //printf("TrackCanvas::draw_drag_handle 4\n");
1926 void TrackCanvas::draw_transitions()
1930 for(Track *track = mwindow->edl->tracks->first;
1932 track = track->next)
1934 for(Edit *edit = track->edits->first;
1938 if(edit->transition)
1940 int64_t strip_w, strip_x, strip_y;
1941 edit_dimensions(edit, x, y, w, h);
1944 if(mwindow->edl->session->show_titles)
1945 strip_y += mwindow->theme->title_bg_data->get_h();
1947 get_transition_coords(x, y, w, h);
1948 strip_w = Units::round(edit->track->from_units(edit->transition->length) *
1949 mwindow->edl->session->sample_rate /
1950 mwindow->edl->local_session->zoom_sample);
1952 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1953 MWindowGUI::visible(y, y + h, 0, get_h()))
1955 PluginServer *server = mwindow->scan_plugindb(edit->transition->title,
1957 draw_vframe(server->picon,
1964 server->picon->get_w(),
1965 server->picon->get_h());
1967 if(MWindowGUI::visible(strip_x, strip_x + strip_w, 0, get_w()) &&
1968 MWindowGUI::visible(strip_y, strip_y + h, 0, get_h()))
1970 int x = strip_x, w = strip_w, left_margin = 5;
1976 if(w + x > get_w()) w -= (w + x) - get_w();
1984 mwindow->theme->plugin_bg_data,
1993 void TrackCanvas::draw_loop_points()
1995 //printf("TrackCanvas::draw_loop_points 1\n");
1996 if(mwindow->edl->local_session->loop_playback)
1998 //printf("TrackCanvas::draw_loop_points 2\n");
1999 int64_t x = Units::round(mwindow->edl->local_session->loop_start *
2000 mwindow->edl->session->sample_rate /
2001 mwindow->edl->local_session->zoom_sample -
2002 mwindow->edl->local_session->view_start);
2003 //printf("TrackCanvas::draw_loop_points 3\n");
2005 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
2008 draw_line(x, 0, x, get_h());
2010 //printf("TrackCanvas::draw_loop_points 4\n");
2012 x = Units::round(mwindow->edl->local_session->loop_end *
2013 mwindow->edl->session->sample_rate /
2014 mwindow->edl->local_session->zoom_sample -
2015 mwindow->edl->local_session->view_start);
2016 //printf("TrackCanvas::draw_loop_points 5\n");
2018 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
2021 draw_line(x, 0, x, get_h());
2023 //printf("TrackCanvas::draw_loop_points 6\n");
2025 //printf("TrackCanvas::draw_loop_points 7\n");
2028 void TrackCanvas::draw_brender_start()
2030 if(mwindow->preferences->use_brender)
2032 int64_t x = Units::round(mwindow->edl->session->brender_start *
2033 mwindow->edl->session->sample_rate /
2034 mwindow->edl->local_session->zoom_sample -
2035 mwindow->edl->local_session->view_start);
2037 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
2040 draw_line(x, 0, x, get_h());
2045 int TrackCanvas::do_keyframes(int cursor_x,
2053 // Note: button 3 (right mouse button) is not eaten to allow
2054 // track context menu to appear
2055 int current_tool = 0;
2057 EDLSession *session = mwindow->edl->session;
2059 for(Track *track = mwindow->edl->tracks->first;
2061 track = track->next)
2063 Automation *automation = track->automation;
2065 //printf("TrackCanvas::draw_keyframes 1\n");
2066 if(!result && session->auto_conf->fade)
2068 Auto *auto_keyframe;
2069 result = do_float_autos(track,
2070 automation->fade_autos,
2077 if(result && mwindow->session->current_operation == DRAG_FADE && (buttonpress != 3))
2081 if(result && buttonpress && (buttonpress != 3))
2083 synchronize_autos(0, track, (FloatAuto*)mwindow->session->drag_auto, 1);
2084 mwindow->session->current_operation = DRAG_FADE;
2085 update_drag_caption();
2087 if (result && (buttonpress == 3))
2089 gui->keyframe_menu->update(automation, automation->fade_autos, auto_keyframe);
2090 gui->keyframe_menu->activate_menu();
2091 rerender = 1; // the position changes
2095 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2097 if(!result && session->auto_conf->czoom && automation->czoom_autos)
2099 Auto *auto_keyframe;
2100 result = do_float_autos(track,
2101 automation->czoom_autos,
2108 if(result && mwindow->session->current_operation == DRAG_CZOOM && (buttonpress != 3))
2112 if(result && buttonpress && (buttonpress != 3))
2114 mwindow->session->current_operation = DRAG_CZOOM;
2115 update_drag_caption();
2117 if (result && (buttonpress == 3))
2119 gui->keyframe_menu->update(automation, automation->czoom_autos, auto_keyframe);
2120 gui->keyframe_menu->activate_menu();
2121 rerender = 1; // the position changes
2125 //printf("TrackCanvas::draw_keyframes 2 %d\n", result);
2126 if(!result && session->auto_conf->pzoom && automation->pzoom_autos)
2128 Auto *auto_keyframe;
2129 result = do_float_autos(track,
2130 automation->pzoom_autos,
2137 if(result && mwindow->session->current_operation == DRAG_PZOOM && (buttonpress != 3))
2141 if(result && buttonpress && (buttonpress != 3))
2143 mwindow->session->current_operation = DRAG_PZOOM;
2144 update_drag_caption();
2146 if (result && (buttonpress == 3))
2148 gui->keyframe_menu->update(automation, automation->pzoom_autos, auto_keyframe);
2149 gui->keyframe_menu->activate_menu();
2150 rerender = 1; // the position changes
2154 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2155 if(!result && session->auto_conf->mute)
2157 Auto *auto_keyframe;
2158 result = do_toggle_autos(track,
2159 automation->mute_autos,
2166 if(result && mwindow->session->current_operation == DRAG_MUTE && (buttonpress != 3))
2170 if(result && buttonpress && (buttonpress != 3))
2172 mwindow->session->current_operation = DRAG_MUTE;
2173 update_drag_caption();
2175 if (result && (buttonpress == 3))
2177 gui->keyframe_menu->update(automation, automation->mute_autos, auto_keyframe);
2178 gui->keyframe_menu->activate_menu();
2179 rerender = 1; // the position changes
2183 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2184 if(!result && session->auto_conf->camera && automation->camera_autos)
2186 Auto *auto_keyframe;
2187 result = do_autos(track,
2188 automation->camera_autos,
2193 camerakeyframe_pixmap,
2195 if(result && mwindow->session->current_operation == DRAG_CAMERA && (buttonpress != 3))
2199 if(result && buttonpress && (buttonpress != 3))
2201 mwindow->session->current_operation = DRAG_CAMERA_PRE;
2202 update_drag_caption();
2205 if (result && (buttonpress == 3))
2207 gui->keyframe_menu->update(automation, automation->camera_autos, auto_keyframe);
2208 gui->keyframe_menu->activate_menu();
2209 rerender = 1; // the position changes
2214 if(!result && session->auto_conf->mode && automation->mode_autos)
2216 Auto *auto_keyframe;
2217 result = do_autos(track,
2218 automation->mode_autos,
2223 modekeyframe_pixmap,
2225 if(result && mwindow->session->current_operation == DRAG_MODE && (buttonpress != 3))
2229 if(result && buttonpress && (buttonpress != 3))
2231 mwindow->session->current_operation = DRAG_MODE_PRE;
2232 update_drag_caption();
2235 if (result && (buttonpress == 3))
2237 gui->keyframe_menu->update(automation, automation->mode_autos, auto_keyframe);
2238 gui->keyframe_menu->activate_menu();
2239 rerender = 1; // the position changes
2243 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2244 if(!result && session->auto_conf->projector && automation->projector_autos)
2246 Auto *auto_keyframe;
2247 result = do_autos(track,
2248 automation->projector_autos,
2253 projectorkeyframe_pixmap,
2255 if(result && mwindow->session->current_operation == DRAG_PROJECTOR && (buttonpress != 3))
2259 if(result && buttonpress && (buttonpress != 3))
2261 mwindow->session->current_operation = DRAG_PROJECTOR_PRE;
2262 update_drag_caption();
2265 if (result && (buttonpress == 3))
2267 gui->keyframe_menu->update(automation, automation->projector_autos, auto_keyframe);
2268 gui->keyframe_menu->activate_menu();
2269 rerender = 1; // the position changes
2273 if(!result && session->auto_conf->mask && automation->mask_autos)
2275 Auto *auto_keyframe;
2276 result = do_autos(track,
2277 automation->mask_autos,
2282 maskkeyframe_pixmap,
2284 if(result && mwindow->session->current_operation == DRAG_MASK && (buttonpress != 3))
2288 if(result && buttonpress && (buttonpress != 3))
2290 mwindow->session->current_operation = DRAG_MASK_PRE;
2291 update_drag_caption();
2294 if (result && (buttonpress == 3))
2296 gui->keyframe_menu->update(automation, automation->mask_autos, auto_keyframe);
2297 gui->keyframe_menu->activate_menu();
2298 rerender = 1; // the position changes
2302 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2303 if(!result && session->auto_conf->pan && automation->pan_autos)
2305 Auto *auto_keyframe;
2306 result = do_autos(track,
2307 automation->pan_autos,
2315 if(result && mwindow->session->current_operation == DRAG_PAN && (buttonpress != 3))
2319 if(result && buttonpress && (buttonpress != 3))
2321 mwindow->session->current_operation = DRAG_PAN_PRE;
2322 update_drag_caption();
2325 if (result && (buttonpress == 3))
2327 gui->keyframe_menu->update(automation, automation->pan_autos, auto_keyframe);
2328 gui->keyframe_menu->activate_menu();
2329 rerender = 1; // the position changes
2333 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2334 if(!result && session->auto_conf->plugins)
2338 result = do_plugin_autos(track,
2345 if(result && mwindow->session->current_operation == DRAG_PLUGINKEY)
2349 if(result && (buttonpress == 1))
2351 mwindow->session->current_operation = DRAG_PLUGINKEY_PRE;
2352 update_drag_caption();
2355 if (result && (buttonpress == 3))
2357 gui->keyframe_menu->update(plugin, keyframe);
2358 gui->keyframe_menu->activate_menu();
2359 rerender = 1; // the position changes
2362 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2365 if(mwindow->session->current_operation == DRAG_FADE ||
2366 mwindow->session->current_operation == DRAG_CZOOM ||
2367 mwindow->session->current_operation == DRAG_PZOOM ||
2368 mwindow->session->current_operation == DRAG_PLAY ||
2369 mwindow->session->current_operation == DRAG_MUTE ||
2370 mwindow->session->current_operation == DRAG_CAMERA ||
2371 mwindow->session->current_operation == DRAG_CAMERA_PRE ||
2372 mwindow->session->current_operation == DRAG_MASK ||
2373 mwindow->session->current_operation == DRAG_MASK_PRE ||
2374 mwindow->session->current_operation == DRAG_MODE ||
2375 mwindow->session->current_operation == DRAG_MODE_PRE ||
2376 mwindow->session->current_operation == DRAG_PAN ||
2377 mwindow->session->current_operation == DRAG_PAN_PRE ||
2378 mwindow->session->current_operation == DRAG_PLUGINKEY ||
2379 mwindow->session->current_operation == DRAG_PLUGINKEY_PRE ||
2380 mwindow->session->current_operation == DRAG_PROJECTOR ||
2381 mwindow->session->current_operation == DRAG_PROJECTOR_PRE)
2386 //printf("TrackCanvas::draw_keyframes 2 %d\n", result);
2390 new_cursor = UPRIGHT_ARROW_CURSOR;
2394 //printf("TrackCanvas::do_keyframes 3 %d\n", result);
2398 void TrackCanvas::draw_auto(Auto *current,
2406 char string[BCTEXTLEN];
2408 x1 = x - HANDLE_W / 2;
2409 x2 = x + HANDLE_W / 2;
2410 y1 = center_pixel + y - HANDLE_W / 2;
2411 y2 = center_pixel + y + HANDLE_W / 2;
2413 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
2414 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
2417 draw_box(x1 + 1, y1 + 1, x2 - x1, y2 - y1);
2419 draw_box(x1, y1, x2 - x1, y2 - y1);
2422 void TrackCanvas::draw_floatauto(Auto *current,
2434 int in_x1, in_y1, in_x2, in_y2;
2435 int out_x1, out_y1, out_x2, out_y2;
2436 char string[BCTEXTLEN];
2439 x1 = x - HANDLE_W / 2;
2440 x2 = x + HANDLE_W / 2;
2441 y1 = center_pixel + y - HANDLE_W / 2;
2442 y2 = center_pixel + y + HANDLE_W / 2;
2444 CLAMP(y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2445 CLAMP(y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2448 draw_box(x1 + 1, y1 + 1, x2 - x1, y2 - y1);
2450 draw_box(x1, y1, x2 - x1, y2 - y1);
2453 in_x1 = in_x - HANDLE_W / 2;
2454 in_x2 = in_x + HANDLE_W / 2;
2455 in_y1 = center_pixel + in_y - HANDLE_W / 2;
2456 in_y2 = center_pixel + in_y + HANDLE_W / 2;
2458 CLAMP(in_y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2459 CLAMP(in_y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2460 CLAMP(in_y, -zoom_track / 2, zoom_track / 2);
2463 draw_line(x + 1, center_pixel + y + 1, in_x + 1, center_pixel + in_y + 1);
2464 draw_box(in_x1 + 1, in_y1 + 1, in_x2 - in_x1, in_y2 - in_y1);
2466 draw_line(x, center_pixel + y, in_x, center_pixel + in_y);
2467 draw_box(in_x1, in_y1, in_x2 - in_x1, in_y2 - in_y1);
2472 out_x1 = out_x - HANDLE_W / 2;
2473 out_x2 = out_x + HANDLE_W / 2;
2474 out_y1 = center_pixel + out_y - HANDLE_W / 2;
2475 out_y2 = center_pixel + out_y + HANDLE_W / 2;
2477 CLAMP(out_y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2478 CLAMP(out_y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2479 CLAMP(out_y, -zoom_track / 2, zoom_track / 2);
2483 draw_line(x + 1, center_pixel + y + 1, out_x + 1, center_pixel + out_y + 1);
2484 draw_box(out_x1 + 1, out_y1 + 1, out_x2 - out_x1, out_y2 - out_y1);
2486 draw_line(x, center_pixel + y, out_x, center_pixel + out_y);
2487 draw_box(out_x1, out_y1, out_x2 - out_x1, out_y2 - out_y1);
2491 int TrackCanvas::test_auto(Auto *current,
2501 char string[BCTEXTLEN];
2504 x1 = x - HANDLE_W / 2;
2505 x2 = x + HANDLE_W / 2;
2506 y1 = center_pixel + y - HANDLE_W / 2;
2507 y2 = center_pixel + y + HANDLE_W / 2;
2509 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
2510 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
2511 //printf("test_auto 1 %d %d %d %d %d %d\n", cursor_x, cursor_y, x1, x2, y1, y2);
2513 if(cursor_x >= x1 && cursor_x < x2 && cursor_y >= y1 && cursor_y < y2)
2515 //printf("test_auto 2 %d\n", buttonpress);
2516 if(buttonpress && buttonpress != 3)
2518 //printf("test_auto 3\n");
2519 mwindow->session->drag_auto = current;
2520 mwindow->session->drag_start_percentage = current->value_to_percentage();
2521 mwindow->session->drag_start_position = current->position;
2522 mwindow->session->drag_origin_x = cursor_x;
2523 mwindow->session->drag_origin_y = cursor_y;
2531 int TrackCanvas::test_floatauto(Auto *current,
2545 int in_x1, in_y1, in_x2, in_y2;
2546 int out_x1, out_y1, out_x2, out_y2;
2547 char string[BCTEXTLEN];
2550 x1 = x - HANDLE_W / 2;
2551 x2 = x + HANDLE_W / 2;
2552 y1 = center_pixel + y - HANDLE_W / 2;
2553 y2 = center_pixel + y + HANDLE_W / 2;
2555 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
2556 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
2558 in_x1 = in_x - HANDLE_W / 2;
2559 in_x2 = in_x + HANDLE_W / 2;
2560 in_y1 = center_pixel + in_y - HANDLE_W / 2;
2561 in_y2 = center_pixel + in_y + HANDLE_W / 2;
2563 if(in_y1 < center_pixel + -zoom_track / 2) in_y1 = center_pixel + -zoom_track / 2;
2564 if(in_y2 > center_pixel + zoom_track / 2) in_y2 = center_pixel + zoom_track / 2;
2566 out_x1 = out_x - HANDLE_W / 2;
2567 out_x2 = out_x + HANDLE_W / 2;
2568 out_y1 = center_pixel + out_y - HANDLE_W / 2;
2569 out_y2 = center_pixel + out_y + HANDLE_W / 2;
2571 if(out_y1 < center_pixel + -zoom_track / 2) out_y1 = center_pixel + -zoom_track / 2;
2572 if(out_y2 > center_pixel + zoom_track / 2) out_y2 = center_pixel + zoom_track / 2;
2576 //printf("TrackCanvas::test_floatauto %d %d %d %d %d %d\n", cursor_x, cursor_y, x1, x2, y1, y2);
2584 if(buttonpress && (buttonpress != 3))
2586 mwindow->session->drag_auto = current;
2587 mwindow->session->drag_start_percentage = current->value_to_percentage();
2588 mwindow->session->drag_start_position = current->position;
2589 mwindow->session->drag_origin_x = cursor_x;
2590 mwindow->session->drag_origin_y = cursor_y;
2591 mwindow->session->drag_handle = 0;
2598 cursor_x >= in_x1 &&
2600 cursor_y >= in_y1 &&
2602 current->position > 0)
2604 if(buttonpress && (buttonpress != 3))
2606 mwindow->session->drag_auto = current;
2607 mwindow->session->drag_start_percentage =
2608 current->invalue_to_percentage();
2609 mwindow->session->drag_start_position =
2610 ((FloatAuto*)current)->control_in_position;
2611 mwindow->session->drag_origin_x = cursor_x;
2612 mwindow->session->drag_origin_y = cursor_y;
2613 mwindow->session->drag_handle = 1;
2620 cursor_x >= out_x1 &&
2621 cursor_x < out_x2 &&
2622 cursor_y >= out_y1 &&
2625 if(buttonpress && (buttonpress != 3))
2627 mwindow->session->drag_auto = current;
2628 mwindow->session->drag_start_percentage =
2629 current->outvalue_to_percentage();
2630 mwindow->session->drag_start_position =
2631 ((FloatAuto*)current)->control_out_position;
2632 mwindow->session->drag_origin_x = cursor_x;
2633 mwindow->session->drag_origin_y = cursor_y;
2634 mwindow->session->drag_handle = 2;
2640 // printf("TrackCanvas::test_floatauto 2 drag_handle=%d ctrl_down=%d cursor_x=%d cursor_y=%d x1=%d x2=%d y1=%d y2=%d\n",
2641 // mwindow->session->drag_handle,
2650 void TrackCanvas::draw_floatline(int center_pixel,
2651 FloatAuto *previous,
2663 // Solve bezier equation for either every pixel or a certain large number of
2668 // Not using slope intercept
2675 // Call by reference fails for some reason here
2676 FloatAuto *previous1 = previous, *next1 = next;
2677 for(int x = x1; x < x2; x++)
2679 int64_t position = (int64_t)(unit_start + x * zoom_units);
2680 float value = autos->get_value(position, PLAY_FORWARD, previous1, next1);
2682 int y = (int)(center_pixel +
2683 (autos->value_to_percentage(value) - 0.5) * -yscale);
2688 draw_line(x - 1, prev_y + 1, x, y + 1);
2690 draw_line(x - 1, prev_y, x, y);
2697 // set_color(BLACK);
2698 // draw_line(x1, center_pixel + y1 + 1, x2, center_pixel + y2 + 1);
2699 // set_color(WHITE);
2700 // draw_line(x1, center_pixel + y1, x2, center_pixel + y2);
2708 void TrackCanvas::synchronize_autos(float change, Track *skip, FloatAuto *fauto, int fill_gangs)
2710 if (fill_gangs == 1 && skip->gang) // fill mwindow->session->drag_auto_gang
2712 for(Track *current = mwindow->edl->tracks->first;
2716 if(current->data_type == skip->data_type &&
2721 FloatAutos *fade_autos = current->automation->fade_autos;
2722 double position = skip->from_units(fauto->position);
2723 FloatAuto *previous = 0, *next = 0;
2725 float init_value = fade_autos->get_value(fauto->position, PLAY_FORWARD, previous, next);
2726 FloatAuto *keyframe;
2727 keyframe = (FloatAuto*)fade_autos->get_auto_at_position(position);
2731 // create keyframe at exactly this point in time
2732 keyframe = (FloatAuto*)fade_autos->insert_auto(fauto->position);
2733 keyframe->value = init_value;
2737 // keyframe exists, just change it
2738 keyframe->value += change;
2741 keyframe->position = fauto->position;
2742 keyframe->control_out_position = fauto->control_out_position;
2743 keyframe->control_in_position = fauto->control_in_position;
2744 keyframe->control_out_value = fauto->control_out_value;
2745 keyframe->control_in_value = fauto->control_in_value;
2747 mwindow->session->drag_auto_gang->append((Auto *)keyframe);
2751 if (fill_gangs == 0) // move the gangs
2755 for (int i = 0; i < mwindow->session->drag_auto_gang->total; i++)
2757 FloatAuto *keyframe = (FloatAuto *)mwindow->session->drag_auto_gang->values[i];
2759 keyframe->value += change;
2760 keyframe->position = fauto->position;
2761 if(skip->data_type == TRACK_AUDIO)
2762 CLAMP(keyframe->value, INFINITYGAIN, MAX_AUDIO_FADE);
2764 CLAMP(keyframe->value, 0, MAX_VIDEO_FADE);
2765 keyframe->control_out_position = fauto->control_out_position;
2766 keyframe->control_in_position = fauto->control_in_position;
2767 keyframe->control_out_value = fauto->control_out_value;
2768 keyframe->control_in_value = fauto->control_in_value;
2772 if (fill_gangs == -1) // remove the gangs
2774 for (int i = 0; i < mwindow->session->drag_auto_gang->total; i++)
2776 FloatAuto *keyframe = (FloatAuto *)mwindow->session->drag_auto_gang->values[i];
2777 keyframe->autos->remove_nonsequential(
2780 mwindow->session->drag_auto_gang->remove_all();
2785 int TrackCanvas::test_floatline(int center_pixel,
2799 int64_t position = (int64_t)(unit_start + cursor_x * zoom_units);
2800 // Call by reference fails for some reason here
2801 FloatAuto *previous = 0, *next = 0;
2802 float value = autos->get_value(position, PLAY_FORWARD, previous, next);
2803 int y = (int)(center_pixel +
2804 (autos->value_to_percentage(value) - 0.5) * -yscale);
2806 if(cursor_x >= x1 &&
2808 cursor_y >= y - HANDLE_W / 2 &&
2809 cursor_y < y + HANDLE_W / 2 &&
2817 mwindow->undo->update_undo_before(_("keyframe"), LOAD_AUTOMATION);
2821 current = mwindow->session->drag_auto = autos->insert_auto(position);
2822 ((FloatAuto*)current)->value = value;
2823 mwindow->session->drag_start_percentage = current->value_to_percentage();
2824 mwindow->session->drag_start_position = current->position;
2825 mwindow->session->drag_origin_x = cursor_x;
2826 mwindow->session->drag_origin_y = cursor_y;
2827 mwindow->session->drag_handle = 0;
2836 void TrackCanvas::draw_toggleline(int center_pixel,
2844 draw_line(x1, center_pixel + y1 + 1, x2, center_pixel + y1 + 1);
2846 draw_line(x1, center_pixel + y1, x2, center_pixel + y1);
2851 draw_line(x2 + 1, center_pixel + y1, x2 + 1, center_pixel + y2);
2853 draw_line(x2, center_pixel + y1, x2, center_pixel + y2);
2857 int TrackCanvas::test_toggleline(Autos *autos,
2868 if(cursor_x >= x1 && cursor_x < x2)
2870 int miny = center_pixel + y1 - HANDLE_W / 2;
2871 int maxy = center_pixel + y1 + HANDLE_W / 2;
2872 if(cursor_y >= miny && cursor_y < maxy)
2878 mwindow->undo->update_undo_before(_("keyframe"), LOAD_AUTOMATION);
2882 double position = (double)(cursor_x +
2883 mwindow->edl->local_session->view_start) *
2884 mwindow->edl->local_session->zoom_sample /
2885 mwindow->edl->session->sample_rate;
2886 int64_t unit_position = autos->track->to_units(position, 0);
2887 int new_value = (int)((IntAutos*)autos)->get_automation_constant(unit_position, unit_position);
2889 current = mwindow->session->drag_auto = autos->insert_auto(unit_position);
2890 ((IntAuto*)current)->value = new_value;
2891 mwindow->session->drag_start_percentage = current->value_to_percentage();
2892 mwindow->session->drag_start_position = current->position;
2893 mwindow->session->drag_origin_x = cursor_x;
2894 mwindow->session->drag_origin_y = cursor_y;
2902 void TrackCanvas::calculate_viewport(Track *track,
2903 double &view_start, // Seconds
2905 double &view_end, // Seconds
2909 double &zoom_sample,
2912 view_start = (double)mwindow->edl->local_session->view_start *
2913 mwindow->edl->local_session->zoom_sample /
2914 mwindow->edl->session->sample_rate;
2915 unit_start = track->to_doubleunits(view_start);
2916 view_end = (double)(mwindow->edl->local_session->view_start +
2918 mwindow->edl->local_session->zoom_sample /
2919 mwindow->edl->session->sample_rate;
2920 unit_end = track->to_doubleunits(view_end);
2921 yscale = mwindow->edl->local_session->zoom_track;
2922 center_pixel = (int)(track->y_pixel + yscale / 2) +
2923 (mwindow->edl->session->show_titles ?
2924 mwindow->theme->title_bg_data->get_h() :
2926 zoom_sample = mwindow->edl->local_session->zoom_sample;
2928 zoom_units = track->to_doubleunits(zoom_sample / mwindow->edl->session->sample_rate);
2931 int TrackCanvas::do_float_autos(Track *track,
2938 Auto * &auto_instance)
2950 double ax, ay, ax2, ay2;
2951 double in_x2, in_y2, out_x2, out_y2;
2958 calculate_viewport(track,
2970 // Get first auto before start
2973 for(current = autos->last;
2974 current && current->position >= unit_start;
2980 ax = (double)(current->position - unit_start) / zoom_units;
2981 ay = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
2986 current = autos->first ? autos->first : autos->default_auto;
2990 ay = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
3000 //printf("TrackCanvas::do_float_autos 1\n");
3011 ax2 = (double)(current->position - unit_start) / zoom_units;
3012 ay2 = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
3013 in_x2 = (double)(current->position +
3014 ((FloatAuto*)current)->control_in_position -
3017 in_y2 = (((FloatAuto*)current)->invalue_to_percentage() - 0.5) * -yscale;
3018 out_x2 = (double)(current->position +
3019 ((FloatAuto*)current)->control_out_position -
3022 out_y2 = (((FloatAuto*)current)->outvalue_to_percentage() - 0.5) * -yscale;
3031 slope = (ay2 - ay) / (ax2 - ax);
3037 ay2 = ay + slope * (get_w() - ax);
3042 ay = ay + slope * (0 - ax);
3060 if(current && !result)
3062 if(current != autos->default_auto)
3067 result = test_floatauto(current,
3080 auto_instance = current;
3084 draw_floatauto(current,
3101 // Draw joining line
3106 if(track->record && buttonpress != 3)
3108 result = test_floatline(center_pixel,
3114 // Exclude auto coverage from the end of the line. The auto overlaps
3115 (int)ax2 - HANDLE_W / 2,
3123 draw_floatline(center_pixel,
3124 (FloatAuto*)previous,
3125 (FloatAuto*)current,
3153 current->position <= unit_end &&
3156 //printf("TrackCanvas::do_float_autos 100\n");
3165 if(ax < get_w() && !result)
3171 if(track->record && buttonpress != 3)
3173 result = test_floatline(center_pixel,
3186 draw_floatline(center_pixel,
3187 (FloatAuto*)previous,
3188 (FloatAuto*)current,
3211 int TrackCanvas::do_toggle_autos(Track *track,
3218 Auto * &auto_instance)
3229 double ax, ay, ax2, ay2;
3233 calculate_viewport(track,
3244 double high = -yscale * 0.8 / 2;
3245 double low = yscale * 0.8 / 2;
3247 // Get first auto before start
3249 for(current = autos->last; current && current->position >= unit_start; current = PREVIOUS)
3255 ay = ((IntAuto*)current)->value > 0 ? high : low;
3260 current = autos->first ? autos->first : autos->default_auto;
3264 ay = ((IntAuto*)current)->value > 0 ? high : low;
3277 ax2 = (double)(current->position - unit_start) / zoom_units;
3278 ay2 = ((IntAuto*)current)->value > 0 ? high : low;
3286 if(ax2 > get_w()) ax2 = get_w();
3288 if(current && !result)
3290 if(current != autos->default_auto)
3296 result = test_auto(current,
3305 auto_instance = current;
3324 if(track->record && buttonpress != 3)
3326 result = test_toggleline(autos,
3339 draw_toggleline(center_pixel,
3348 }while(current && current->position <= unit_end && !result);
3350 if(ax < get_w() && !result)
3356 if(track->record && buttonpress != 3)
3358 result = test_toggleline(autos,
3370 draw_toggleline(center_pixel,
3380 int TrackCanvas::do_autos(Track *track,
3387 Auto * &auto_instance)
3400 calculate_viewport(track,
3413 for(current = autos->first; current && !result; current = NEXT)
3415 if(current->position >= unit_start && current->position < unit_end)
3418 x = (int64_t)((double)(current->position - unit_start) /
3419 zoom_units - (pixmap->get_w() / 2 + 0.5));
3420 y = center_pixel - pixmap->get_h() / 2;
3424 if(cursor_x >= x && cursor_y >= y &&
3425 cursor_x < x + pixmap->get_w() &&
3426 cursor_y < y + pixmap->get_h())
3429 auto_instance = current;
3431 if(buttonpress && (buttonpress != 3))
3433 mwindow->session->drag_auto = current;
3434 mwindow->session->drag_start_position = current->position;
3435 mwindow->session->drag_origin_x = cursor_x;
3436 mwindow->session->drag_origin_y = cursor_y;
3438 double position = autos->track->from_units(current->position);
3439 double center = (mwindow->edl->local_session->selectionstart +
3440 mwindow->edl->local_session->selectionend) /
3445 mwindow->edl->local_session->selectionstart = position;
3446 mwindow->edl->local_session->selectionend = position;
3449 if(position < center)
3451 mwindow->edl->local_session->selectionstart = position;
3454 mwindow->edl->local_session->selectionend = position;
3459 draw_pixmap(pixmap, x, y);
3465 // so this means it is always >0 when keyframe is found
3466 int TrackCanvas::do_plugin_autos(Track *track,
3471 Plugin* &keyframe_plugin,
3472 KeyFrame* &keyframe_instance)
3485 if(!track->expand_view) return 0;
3487 calculate_viewport(track,
3499 for(int i = 0; i < track->plugin_set.total && !result; i++)
3501 PluginSet *plugin_set = track->plugin_set.values[i];
3502 int center_pixel = (int)(track->y_pixel +
3503 mwindow->edl->local_session->zoom_track +
3504 (i + 0.5) * mwindow->theme->plugin_bg_data->get_h() +
3505 (mwindow->edl->session->show_titles ? mwindow->theme->title_bg_data->get_h() : 0));
3507 for(Plugin *plugin = (Plugin*)plugin_set->first;
3509 plugin = (Plugin*)plugin->next)
3511 for(KeyFrame *keyframe = (KeyFrame*)plugin->keyframes->first;
3512 keyframe && !result;
3513 keyframe = (KeyFrame*)keyframe->next)
3515 //printf("TrackCanvas::draw_plugin_autos 3 %d\n", keyframe->position);
3516 if(keyframe->position >= unit_start && keyframe->position < unit_end)
3518 int64_t x = (int64_t)((keyframe->position - unit_start) / zoom_units);
3519 int y = center_pixel - keyframe_pixmap->get_h() / 2;
3521 //printf("TrackCanvas::draw_plugin_autos 4 %d %d\n", x, center_pixel);
3524 if(cursor_x >= x && cursor_y >= y &&
3525 cursor_x < x + keyframe_pixmap->get_w() &&
3526 cursor_y < y + keyframe_pixmap->get_h())
3529 keyframe_plugin = plugin;
3530 keyframe_instance = keyframe;
3534 mwindow->session->drag_auto = keyframe;
3535 mwindow->session->drag_start_position = keyframe->position;
3536 mwindow->session->drag_origin_x = cursor_x;
3537 mwindow->session->drag_origin_y = cursor_y;
3539 double position = track->from_units(keyframe->position);
3540 double center = (mwindow->edl->local_session->selectionstart +
3541 mwindow->edl->local_session->selectionend) /
3546 mwindow->edl->local_session->selectionstart = position;
3547 mwindow->edl->local_session->selectionend = position;
3550 if(position < center)
3552 mwindow->edl->local_session->selectionstart = position;
3555 mwindow->edl->local_session->selectionend = position;
3560 draw_pixmap(keyframe_pixmap,
3567 //printf("TrackCanvas::draw_plugin_autos 5\n");
3571 void TrackCanvas::draw_overlays()
3573 int new_cursor, update_cursor, rerender;
3574 //TRACE("TrackCanvas::draw_overlays 1")
3576 // Move background pixmap to foreground pixmap
3577 draw_pixmap(background_pixmap,
3584 //TRACE("TrackCanvas::draw_overlays 10")
3587 draw_inout_points();
3589 //TRACE("TrackCanvas::draw_overlays 11");
3591 if(mwindow->edl->session->auto_conf->transitions) draw_transitions();
3593 //TRACE("TrackCanvas::draw_overlays 12");
3597 //TRACE("TrackCanvas::draw_overlays 13");
3600 draw_brender_start();
3602 //TRACE("TrackCanvas::draw_overlays 14");
3603 // Highlighted areas
3604 draw_highlighting();
3606 //TRACE("TrackCanvas::draw_overlays 15");
3616 //TRACE("TrackCanvas::draw_overlays 16\n");
3618 if(gui->cursor) gui->cursor->restore();
3620 //TRACE("TrackCanvas::draw_overlays 17\n");
3624 //TRACE("TrackCanvas::draw_overlays 20");
3626 draw_playback_cursor();
3630 int TrackCanvas::activate()
3634 get_top_level()->deactivate();
3636 set_active_subwindow(this);
3637 gui->cursor->activate();
3642 int TrackCanvas::deactivate()
3647 gui->cursor->deactivate();
3653 void TrackCanvas::update_drag_handle()
3655 double new_position;
3658 (double)(get_cursor_x() + mwindow->edl->local_session->view_start) *
3659 mwindow->edl->local_session->zoom_sample /
3660 mwindow->edl->session->sample_rate;
3662 mwindow->edl->align_to_frame(new_position, 0);
3665 if(new_position != mwindow->session->drag_position)
3667 mwindow->session->drag_position = new_position;
3668 gui->mainclock->update(new_position);
3669 // Que the CWindow. Doesn't do anything if selectionstart and selection end
3671 // mwindow->cwindow->update(1, 0, 0);
3675 int TrackCanvas::update_drag_edit()
3684 #define UPDATE_DRAG_HEAD(do_clamp) \
3686 int x = cursor_x - mwindow->session->drag_origin_x; \
3687 int y = cursor_y - mwindow->session->drag_origin_y; \
3689 if(!current->autos->track->record) return 0; \
3690 double view_start; \
3691 double unit_start; \
3696 double zoom_sample; \
3697 double zoom_units; \
3699 mwindow->undo->update_undo_before(_("tweek"), LOAD_AUTOMATION); \
3700 calculate_viewport(current->autos->track, \
3710 float percentage = (float)(mwindow->session->drag_origin_y - cursor_y) / \
3711 MAX(128, yscale) + \
3712 mwindow->session->drag_start_percentage; \
3713 if(do_clamp) CLAMP(percentage, 0, 1); \
3715 int64_t position = Units::to_int64(zoom_units * \
3716 (cursor_x - mwindow->session->drag_origin_x) + \
3717 mwindow->session->drag_start_position); \
3719 if((do_clamp) && position < 0) position = 0;
3729 int TrackCanvas::update_drag_floatauto(int cursor_x, int cursor_y)
3731 FloatAuto *current = (FloatAuto*)mwindow->session->drag_auto;
3733 UPDATE_DRAG_HEAD(mwindow->session->drag_handle == 0);
3737 //printf("TrackCanvas::update_drag_floatauto %ld %d\n",
3739 //mwindow->session->drag_handle);
3741 switch(mwindow->session->drag_handle)
3745 // Snap to nearby values
3746 old_value = current->value;
3753 value = ((FloatAuto*)current)->percentage_to_value(percentage);
3755 if(current->previous)
3757 value1 = ((FloatAuto*)current->previous)->value;
3758 distance1 = fabs(value - value1);
3759 current->value = value1;
3764 value2 = ((FloatAuto*)current->next)->value;
3765 distance2 = fabs(value - value2);
3766 if(!current->previous || distance2 < distance1)
3768 current->value = value2;
3772 if(!current->previous && !current->next)
3774 current->value = ((FloatAutos*)current->autos)->default_;
3776 value = current->value;
3779 value = ((FloatAuto*)current)->percentage_to_value(percentage);
3781 //printf("TrackCanvas::update_drag_floatauto 1 %f\n", value);
3782 if(value != old_value || position != current->position)
3785 float change = value - old_value;
3786 current->value = value;
3787 current->position = position;
3788 synchronize_autos(change, current->autos->track, current, 0);
3790 char string[BCTEXTLEN], string2[BCTEXTLEN];
3791 Units::totext(string2,
3792 current->autos->track->from_units(current->position),
3793 mwindow->edl->session->time_format,
3794 mwindow->edl->session->sample_rate,
3795 mwindow->edl->session->frame_rate,
3796 mwindow->edl->session->frames_per_foot);
3797 sprintf(string, "%s, %.2f", string2, current->value);
3798 gui->show_message(string);
3804 value = ((FloatAuto*)current)->percentage_to_invalue(percentage);
3805 position = MIN(0, position);
3806 if(value != current->control_in_value ||
3807 position != current->control_in_position)
3810 current->control_in_value = value;
3811 current->control_in_position = position;
3812 synchronize_autos(0, current->autos->track, current, 0);
3814 char string[BCTEXTLEN], string2[BCTEXTLEN];
3815 Units::totext(string2,
3816 current->autos->track->from_units(current->control_in_position),
3817 mwindow->edl->session->time_format,
3818 mwindow->edl->session->sample_rate,
3819 mwindow->edl->session->frame_rate,
3820 mwindow->edl->session->frames_per_foot);
3821 sprintf(string, "%s, %.2f", string2, current->control_in_value);
3822 gui->show_message(string);
3828 value = ((FloatAuto*)current)->percentage_to_outvalue(percentage);
3829 position = MAX(0, position);
3830 if(value != current->control_out_value ||
3831 position != current->control_out_position)
3834 current->control_out_value = value;
3835 current->control_out_position = position;
3836 synchronize_autos(0, current->autos->track, current, 0);
3838 char string[BCTEXTLEN], string2[BCTEXTLEN];
3839 Units::totext(string2,
3840 current->autos->track->from_units(
3841 ((FloatAuto*)current)->control_out_position),
3842 mwindow->edl->session->time_format,
3843 mwindow->edl->session->sample_rate,
3844 mwindow->edl->session->frame_rate,
3845 mwindow->edl->session->frames_per_foot);
3846 sprintf(string, "%s, %.2f",
3848 ((FloatAuto*)current)->control_out_value);
3849 gui->show_message(string);
3857 int TrackCanvas::update_drag_toggleauto(int cursor_x, int cursor_y)
3859 IntAuto *current = (IntAuto*)mwindow->session->drag_auto;
3861 UPDATE_DRAG_HEAD(1);
3863 int value = ((IntAuto*)current)->percentage_to_value(percentage);
3865 if(value != current->value || position != current->position)
3868 current->value = value;
3869 current->position = position;
3871 char string[BCTEXTLEN], string2[BCTEXTLEN];
3872 Units::totext(string2,
3873 current->autos->track->from_units(current->position),
3874 mwindow->edl->session->time_format,
3875 mwindow->edl->session->sample_rate,
3876 mwindow->edl->session->frame_rate,
3877 mwindow->edl->session->frames_per_foot);
3878 sprintf(string, "%s, %d", string2, current->value);
3879 gui->show_message(string);
3885 // Autos which can't change value through dragging.
3887 int TrackCanvas::update_drag_auto(int cursor_x, int cursor_y)
3889 Auto *current = (Auto*)mwindow->session->drag_auto;
3892 if(position != current->position)
3895 current->position = position;
3897 char string[BCTEXTLEN];
3898 Units::totext(string,
3899 current->autos->track->from_units(current->position),
3900 mwindow->edl->session->time_format,
3901 mwindow->edl->session->sample_rate,
3902 mwindow->edl->session->frame_rate,
3903 mwindow->edl->session->frames_per_foot);
3904 gui->show_message(string);
3906 double position_f = current->autos->track->from_units(current->position);
3907 double center_f = (mwindow->edl->local_session->selectionstart +
3908 mwindow->edl->local_session->selectionend) /
3912 mwindow->edl->local_session->selectionstart = position_f;
3913 mwindow->edl->local_session->selectionend = position_f;
3916 if(position_f < center_f)
3918 mwindow->edl->local_session->selectionstart = position_f;
3921 mwindow->edl->local_session->selectionend = position_f;
3928 int TrackCanvas::update_drag_pluginauto(int cursor_x, int cursor_y)
3930 KeyFrame *current = (KeyFrame*)mwindow->session->drag_auto;
3933 if(position != current->position)
3935 // printf("uida: autos: %p, track: %p ta: %p\n", current->autos, current->autos->track, current->autos->track->automation);
3936 Track *track = current->autos->track;
3937 PluginAutos *pluginautos = (PluginAutos *)current->autos;
3938 PluginSet *pluginset;
3940 // figure out the correct pluginset & correct plugin
3942 for(int i = 0; i < track->plugin_set.total; i++)
3944 pluginset = track->plugin_set.values[i];
3945 for(plugin = (Plugin *)pluginset->first; plugin; plugin = (Plugin *)plugin->next)
3947 KeyFrames *keyframes = plugin->keyframes;
3948 for(KeyFrame *currentkeyframe = (KeyFrame *)keyframes->first; currentkeyframe; currentkeyframe = (KeyFrame *) currentkeyframe->next)
3950 if (currentkeyframe == current)
3962 mwindow->session->plugin_highlighted = plugin;
3963 mwindow->session->track_highlighted = track;
3965 current->position = position;
3967 char string[BCTEXTLEN];
3968 Units::totext(string,
3969 current->autos->track->from_units(current->position),
3970 mwindow->edl->session->time_format,
3971 mwindow->edl->session->sample_rate,
3972 mwindow->edl->session->frame_rate,
3973 mwindow->edl->session->frames_per_foot);
3974 gui->show_message(string);
3976 double position_f = current->autos->track->from_units(current->position);
3977 double center_f = (mwindow->edl->local_session->selectionstart +
3978 mwindow->edl->local_session->selectionend) /
3982 mwindow->edl->local_session->selectionstart = position_f;
3983 mwindow->edl->local_session->selectionend = position_f;
3986 if(position_f < center_f)
3988 mwindow->edl->local_session->selectionstart = position_f;
3991 mwindow->edl->local_session->selectionend = position_f;
3998 void TrackCanvas::update_drag_caption()
4000 switch(mwindow->session->current_operation)
4010 int TrackCanvas::cursor_motion_event()
4012 int result, cursor_x, cursor_y;
4013 int update_clock = 0;
4014 int update_zoom = 0;
4015 int update_scroll = 0;
4016 int update_overlay = 0;
4017 int update_cursor = 0;
4020 double position = 0;
4021 //printf("TrackCanvas::cursor_motion_event 1\n");
4025 switch(mwindow->edl->session->editing_mode)
4027 case EDITING_ARROW: new_cursor = ARROW_CURSOR; break;
4028 case EDITING_IBEAM: new_cursor = IBEAM_CURSOR; break;
4031 switch(mwindow->session->current_operation)
4033 case DRAG_EDITHANDLE1:
4034 // Outside threshold. Upgrade status
4035 //printf("TrackCanvas::cursor_motion_event 1\n");
4036 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
4038 //printf("TrackCanvas::cursor_motion_event 2\n");
4039 mwindow->session->current_operation = DRAG_EDITHANDLE2;
4044 case DRAG_EDITHANDLE2:
4045 update_drag_handle();
4049 case DRAG_PLUGINHANDLE1:
4050 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
4052 //printf("TrackCanvas::cursor_motion_event 2\n");
4053 mwindow->session->current_operation = DRAG_PLUGINHANDLE2;
4058 case DRAG_PLUGINHANDLE2:
4059 update_drag_handle();
4063 // Rubber band curves
4065 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
4069 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
4073 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
4077 rerender = update_overlay = update_drag_toggleauto(get_cursor_x(), get_cursor_y());
4081 rerender = update_overlay = update_drag_toggleauto(get_cursor_x(), get_cursor_y());
4084 // Keyframe icons are sticky
4086 case DRAG_CAMERA_PRE:
4089 case DRAG_PROJECTOR_PRE:
4090 case DRAG_PLUGINKEY_PRE:
4091 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
4093 //printf("TrackCanvas::cursor_motion_event 2\n");
4094 mwindow->session->current_operation++;
4103 case DRAG_PROJECTOR:
4104 rerender = update_overlay =
4105 update_drag_auto(get_cursor_x(), get_cursor_y());
4107 case DRAG_PLUGINKEY:
4108 rerender = update_overlay =
4109 update_drag_pluginauto(get_cursor_x(), get_cursor_y());
4114 cursor_x = get_cursor_x();
4115 cursor_y = get_cursor_y();
4116 position = (double)(cursor_x + mwindow->edl->local_session->view_start) *
4117 mwindow->edl->local_session->zoom_sample /
4118 mwindow->edl->session->sample_rate;
4120 position = mwindow->edl->align_to_frame(position, 0);
4121 position = MAX(position, 0);
4123 if(position < selection_midpoint1)
4125 mwindow->edl->local_session->selectionend = selection_midpoint1;
4126 mwindow->edl->local_session->selectionstart = position;
4128 mwindow->cwindow->update(1, 0, 0, 0, 1);
4129 // Update the faders
4130 mwindow->update_plugin_guis();
4131 gui->patchbay->update();
4135 mwindow->edl->local_session->selectionstart = selection_midpoint1;
4136 mwindow->edl->local_session->selectionend = position;
4137 // Don't que the CWindow
4139 //printf("TrackCanvas::cursor_motion_event 1 %f %f %f\n", position, mwindow->edl->local_session->selectionstart, mwindow->edl->local_session->selectionend);
4141 gui->cursor->hide();
4142 gui->cursor->draw();
4152 if(is_event_win() && cursor_inside())
4155 cursor_x = get_cursor_x();
4156 position = (double)cursor_x *
4157 (double)mwindow->edl->local_session->zoom_sample /
4158 (double)mwindow->edl->session->sample_rate +
4159 (double)mwindow->edl->local_session->view_start *
4160 (double)mwindow->edl->local_session->zoom_sample /
4161 (double)mwindow->edl->session->sample_rate;
4162 position = mwindow->edl->align_to_frame(position, 0);
4166 if(mwindow->edl->session->auto_conf->transitions &&
4167 test_transitions(get_cursor_x(),
4177 if(do_keyframes(get_cursor_x(),
4189 if(test_edit_handles(get_cursor_x(),
4198 // Plugin boundaries
4199 if(test_plugin_handles(get_cursor_x(),
4208 if(test_edits(get_cursor_x(),
4223 //printf("TrackCanvas::cursor_motion_event 1\n");
4224 if(update_cursor && new_cursor != get_cursor())
4226 set_cursor(new_cursor);
4229 //printf("TrackCanvas::cursor_motion_event 1 %d\n", rerender);
4232 mwindow->restart_brender();
4233 mwindow->sync_parameters(CHANGE_PARAMS);
4234 mwindow->update_plugin_guis();
4235 mwindow->cwindow->update(1, 0, 0, 0, 1);
4237 gui->patchbay->update();
4243 if(!mwindow->cwindow->playback_engine->is_playing_back)
4244 gui->mainclock->update(position);
4249 gui->zoombar->update();
4255 (cursor_x >= get_w() || cursor_x < 0 || cursor_y >= get_h() || cursor_y < 0))
4259 (cursor_x < get_w() && cursor_x >= 0 && cursor_y < get_h() && cursor_y >= 0))
4271 //printf("TrackCanvas::cursor_motion_event 100\n");
4275 void TrackCanvas::start_dragscroll()
4280 set_repeat(BC_WindowBase::get_resources()->scroll_repeat);
4281 //printf("TrackCanvas::start_dragscroll 1\n");
4285 void TrackCanvas::stop_dragscroll()
4290 unset_repeat(BC_WindowBase::get_resources()->scroll_repeat);
4291 //printf("TrackCanvas::stop_dragscroll 1\n");
4295 int TrackCanvas::repeat_event(int64_t duration)
4297 if(!drag_scroll) return 0;
4298 if(duration != BC_WindowBase::get_resources()->scroll_repeat) return 0;
4300 int sample_movement = 0;
4301 int track_movement = 0;
4302 int64_t x_distance = 0;
4303 int64_t y_distance = 0;
4304 double position = 0;
4307 switch(mwindow->session->current_operation)
4310 //printf("TrackCanvas::repeat_event 1 %d\n", mwindow->edl->local_session->view_start);
4311 if(get_cursor_x() > get_w())
4313 x_distance = get_cursor_x() - get_w();
4314 sample_movement = 1;
4317 if(get_cursor_x() < 0)
4319 x_distance = get_cursor_x();
4320 sample_movement = 1;
4323 if(get_cursor_y() > get_h())
4325 y_distance = get_cursor_y() - get_h();
4329 if(get_cursor_y() < 0)
4331 y_distance = get_cursor_y();
4341 position = (double)(get_cursor_x() +
4342 mwindow->edl->local_session->view_start +
4344 mwindow->edl->local_session->zoom_sample /
4345 mwindow->edl->session->sample_rate;
4346 position = mwindow->edl->align_to_frame(position, 0);
4347 position = MAX(position, 0);
4349 //printf("TrackCanvas::repeat_event 1 %f\n", position);
4350 switch(mwindow->session->current_operation)
4353 if(position < selection_midpoint1)
4355 mwindow->edl->local_session->selectionend = selection_midpoint1;
4356 mwindow->edl->local_session->selectionstart = position;
4358 mwindow->cwindow->update(1, 0, 0);
4359 // Update the faders
4360 mwindow->update_plugin_guis();
4361 gui->patchbay->update();
4365 mwindow->edl->local_session->selectionstart = selection_midpoint1;
4366 mwindow->edl->local_session->selectionend = position;
4367 // Don't que the CWindow
4372 mwindow->samplemovement(mwindow->edl->local_session->view_start +
4378 mwindow->trackmovement(mwindow->edl->local_session->track_start +
4385 int TrackCanvas::button_release_event()
4387 int redraw = 0, update_overlay = 0, result = 0;
4389 switch(mwindow->session->current_operation)
4391 case DRAG_EDITHANDLE2:
4392 mwindow->session->current_operation = NO_OPERATION;
4396 end_edithandle_selection();
4399 case DRAG_EDITHANDLE1:
4400 mwindow->session->current_operation = NO_OPERATION;
4405 case DRAG_PLUGINHANDLE2:
4406 mwindow->session->current_operation = NO_OPERATION;
4410 end_pluginhandle_selection();
4413 case DRAG_PLUGINHANDLE1:
4414 mwindow->session->current_operation = NO_OPERATION;
4420 synchronize_autos(0, 0, 0, -1); // delete the drag_auto_gang first and remove out of order keys
4429 case DRAG_PROJECTOR:
4430 case DRAG_PLUGINKEY:
4431 mwindow->session->current_operation = NO_OPERATION;
4432 mwindow->session->drag_handle = 0;
4433 // Remove any out-of-order keyframe
4434 if(mwindow->session->drag_auto)
4436 mwindow->session->drag_auto->autos->remove_nonsequential(
4437 mwindow->session->drag_auto);
4438 // mwindow->session->drag_auto->autos->optimize();
4441 mwindow->undo->update_undo_after();
4446 case DRAG_AEFFECT_COPY:
4447 case DRAG_VEFFECT_COPY:
4448 // Trap in drag stop
4454 if(mwindow->session->current_operation)
4456 mwindow->session->current_operation = NO_OPERATION;
4458 // Traps button release events
4464 cursor_motion_event();
4480 int TrackCanvas::test_edit_handles(int cursor_x,
4486 Edit *edit_result = 0;
4487 int handle_result = 0;
4490 for(Track *track = mwindow->edl->tracks->first;
4492 track = track->next)
4494 for(Edit *edit = track->edits->first;
4498 int64_t edit_x, edit_y, edit_w, edit_h;
4499 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
4501 if(cursor_x >= edit_x && cursor_x <= edit_x + edit_w &&
4502 cursor_y >= edit_y && cursor_y < edit_y + edit_h)
4504 if(cursor_x < edit_x + HANDLE_W)
4511 if(cursor_x >= edit_x + edit_w - HANDLE_W)
4529 if(handle_result == 0)
4531 position = edit_result->track->from_units(edit_result->startproject);
4532 new_cursor = LEFT_CURSOR;
4535 if(handle_result == 1)
4537 position = edit_result->track->from_units(edit_result->startproject + edit_result->length);
4538 new_cursor = RIGHT_CURSOR;
4541 // Reposition cursor
4544 mwindow->session->drag_edit = edit_result;
4545 mwindow->session->drag_handle = handle_result;
4546 mwindow->session->drag_button = get_buttonpress() - 1;
4547 mwindow->session->drag_position = position;
4548 mwindow->session->current_operation = DRAG_EDITHANDLE1;
4549 mwindow->session->drag_origin_x = get_cursor_x();
4550 mwindow->session->drag_origin_y = get_cursor_y();
4551 mwindow->session->drag_start = position;
4553 int rerender = start_selection(position);
4555 mwindow->cwindow->update(1, 0, 0);
4556 gui->timebar->update_highlights();
4557 gui->zoombar->update();
4558 gui->cursor->hide();
4559 gui->cursor->draw();
4569 int TrackCanvas::test_plugin_handles(int cursor_x,
4575 Plugin *plugin_result = 0;
4576 int handle_result = 0;
4579 for(Track *track = mwindow->edl->tracks->first;
4581 track = track->next)
4583 for(int i = 0; i < track->plugin_set.total && !result; i++)
4585 PluginSet *plugin_set = track->plugin_set.values[i];
4586 for(Plugin *plugin = (Plugin*)plugin_set->first;
4588 plugin = (Plugin*)plugin->next)
4590 int64_t plugin_x, plugin_y, plugin_w, plugin_h;
4591 plugin_dimensions(plugin, plugin_x, plugin_y, plugin_w, plugin_h);
4593 if(cursor_x >= plugin_x && cursor_x <= plugin_x + plugin_w &&
4594 cursor_y >= plugin_y && cursor_y < plugin_y + plugin_h)
4596 if(cursor_x < plugin_x + HANDLE_W)
4598 plugin_result = plugin;
4603 if(cursor_x >= plugin_x + plugin_w - HANDLE_W)
4605 plugin_result = plugin;
4612 if(result && shift_down())
4613 mwindow->session->trim_edits = plugin_set;
4617 //printf("TrackCanvas::test_plugin_handles %d %d %d\n", button_press, handle_result, result);
4622 if(handle_result == 0)
4624 position = plugin_result->track->from_units(plugin_result->startproject);
4625 new_cursor = LEFT_CURSOR;
4628 if(handle_result == 1)
4630 position = plugin_result->track->from_units(plugin_result->startproject + plugin_result->length);
4631 new_cursor = RIGHT_CURSOR;
4636 mwindow->session->drag_plugin = plugin_result;
4637 mwindow->session->drag_handle = handle_result;
4638 mwindow->session->drag_button = get_buttonpress() - 1;
4639 mwindow->session->drag_position = position;
4640 mwindow->session->current_operation = DRAG_PLUGINHANDLE1;
4641 mwindow->session->drag_origin_x = get_cursor_x();
4642 mwindow->session->drag_origin_y = get_cursor_y();
4643 mwindow->session->drag_start = position;
4645 int rerender = start_selection(position);
4646 if(rerender) mwindow->cwindow->update(1, 0, 0);
4647 gui->timebar->update_highlights();
4648 gui->zoombar->update();
4649 gui->cursor->hide();
4650 gui->cursor->draw();
4661 int TrackCanvas::test_tracks(int cursor_x,
4666 for(Track *track = mwindow->edl->tracks->first;
4668 track = track->next)
4670 int64_t track_x, track_y, track_w, track_h;
4671 track_dimensions(track, track_x, track_y, track_w, track_h);
4674 get_buttonpress() == 3 &&
4675 cursor_y >= track_y &&
4676 cursor_y < track_y + track_h)
4678 gui->edit_menu->update(track, 0);
4679 gui->edit_menu->activate_menu();
4686 int TrackCanvas::test_edits(int cursor_x,
4696 int over_edit_handle = 0;
4698 //printf("TrackCanvas::test_edits 1\n");
4699 for(Track *track = mwindow->edl->tracks->first;
4701 track = track->next)
4703 for(Edit *edit = track->edits->first;
4707 int64_t edit_x, edit_y, edit_w, edit_h;
4708 //printf("TrackCanvas::test_edits 1\n");
4709 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
4711 // Cursor inside a track
4712 // Cursor inside an edit
4713 if(cursor_x >= edit_x && cursor_x < edit_x + edit_w &&
4714 cursor_y >= edit_y && cursor_y < edit_y + edit_h)
4716 // Select duration of edit
4717 //printf("TrackCanvas::test_edits 2\n");
4720 if(get_double_click() && !drag_start)
4722 //printf("TrackCanvas::test_edits 3\n");
4723 mwindow->edl->local_session->selectionstart =
4724 edit->track->from_units(edit->startproject);
4725 mwindow->edl->local_session->selectionend =
4726 edit->track->from_units(edit->startproject) +
4727 edit->track->from_units(edit->length);
4728 if(mwindow->edl->session->cursor_on_frames)
4730 mwindow->edl->local_session->selectionstart =
4731 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionstart, 0);
4732 mwindow->edl->local_session->selectionend =
4733 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionend, 1);
4741 if(drag_start && track->record)
4743 if(mwindow->edl->session->editing_mode == EDITING_ARROW)
4745 // Need to create drag window
4746 mwindow->session->current_operation = DRAG_EDIT;
4747 mwindow->session->drag_edit = edit;
4748 //printf("TrackCanvas::test_edits 2\n");
4750 // Drag only one edit
4753 mwindow->session->drag_edits->remove_all();
4754 mwindow->session->drag_edits->append(edit);
4757 // Construct list of all affected edits
4759 mwindow->edl->tracks->get_affected_edits(
4760 mwindow->session->drag_edits,
4761 edit->track->from_units(edit->startproject),
4764 mwindow->session->drag_origin_x = cursor_x;
4765 mwindow->session->drag_origin_y = cursor_y;
4766 // Where the drag started, so we know relative position inside the edit later
4767 mwindow->session->drag_position = (double)cursor_x *
4768 mwindow->edl->local_session->zoom_sample /
4769 mwindow->edl->session->sample_rate +
4770 (double)mwindow->edl->local_session->view_start *
4771 mwindow->edl->local_session->zoom_sample /
4772 mwindow->edl->session->sample_rate;
4774 drag_popup = new BC_DragWindow(gui,
4775 mwindow->theme->clip_icon,
4776 get_abs_cursor_x(0) - mwindow->theme->clip_icon->get_w() / 2,
4777 get_abs_cursor_y(0) - mwindow->theme->clip_icon->get_h() / 2);
4778 //printf("TrackCanvas::test_edits 3 %p\n", drag_popup);
4790 int TrackCanvas::test_resources(int cursor_x, int cursor_y)
4795 int TrackCanvas::test_plugins(int cursor_x,
4808 //printf("TrackCanvas::test_plugins 1\n");
4809 for(track = mwindow->edl->tracks->first;
4811 track = track->next)
4813 if(!track->expand_view) continue;
4816 for(int i = 0; i < track->plugin_set.total && !done; i++)
4818 // first check if plugins are visible at all
4819 if (!track->expand_view)
4821 PluginSet *plugin_set = track->plugin_set.values[i];
4822 for(plugin = (Plugin*)plugin_set->first;
4824 plugin = (Plugin*)plugin->next)
4826 plugin_dimensions(plugin, x, y, w, h);
4827 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
4828 MWindowGUI::visible(y, y + h, 0, get_h()))
4830 if(cursor_x >= x && cursor_x < x + w &&
4831 cursor_y >= y && cursor_y < y + h)
4841 //printf("TrackCanvas::test_plugins 1\n");
4844 // Start plugin popup
4847 //printf("TrackCanvas::test_plugins 2\n");
4848 if(get_buttonpress() == 3)
4850 gui->plugin_menu->update(plugin);
4851 gui->plugin_menu->activate_menu();
4855 // Select range of plugin on doubleclick over plugin
4856 if (get_double_click() && !drag_start)
4858 mwindow->edl->local_session->selectionstart =
4859 plugin->track->from_units(plugin->startproject);
4860 mwindow->edl->local_session->selectionend =
4861 plugin->track->from_units(plugin->startproject) +
4862 plugin->track->from_units(plugin->length);
4863 if(mwindow->edl->session->cursor_on_frames)
4865 mwindow->edl->local_session->selectionstart =
4866 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionstart, 0);
4867 mwindow->edl->local_session->selectionend =
4868 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionend, 1);
4874 //printf("TrackCanvas::test_plugins 3\n");
4878 if(drag_start && plugin->track->record)
4880 //printf("TrackCanvas::test_plugins 4\n");
4881 if(mwindow->edl->session->editing_mode == EDITING_ARROW)
4883 //printf("TrackCanvas::test_plugins 5\n");
4884 if(plugin->track->data_type == TRACK_AUDIO)
4885 mwindow->session->current_operation = DRAG_AEFFECT_COPY;
4887 if(plugin->track->data_type == TRACK_VIDEO)
4888 mwindow->session->current_operation = DRAG_VEFFECT_COPY;
4890 mwindow->session->drag_plugin = plugin;
4891 //printf("TrackCanvas::test_plugins 6\n");
4898 switch(plugin->plugin_type)
4900 case PLUGIN_STANDALONE:
4902 PluginServer *server = mwindow->scan_plugindb(
4904 plugin->track->data_type);
4907 VFrame *frame = server->picon;
4908 //printf("TrackCanvas::test_plugins 7\n");
4909 drag_popup = new BC_DragWindow(gui,
4911 get_abs_cursor_x(0) - frame->get_w() / 2,
4912 get_abs_cursor_y(0) - frame->get_h() / 2);
4917 case PLUGIN_SHAREDPLUGIN:
4918 case PLUGIN_SHAREDMODULE:
4919 drag_popup = new BC_DragWindow(gui,
4920 mwindow->theme->clip_icon,
4921 get_abs_cursor_x(0) - mwindow->theme->clip_icon->get_w() / 2,
4922 get_abs_cursor_y(0) - mwindow->theme->clip_icon->get_h() / 2);
4924 //printf("test plugins %d %p\n", mwindow->edl->session->editing_mode, mwindow->session->drag_plugin);
4927 //printf("TrackCanvas::test_plugins 9 %p\n");
4929 //printf("TrackCanvas::test_plugins 10\n");
4935 //printf("TrackCanvas::test_plugins 11\n");
4939 int TrackCanvas::test_transitions(int cursor_x,
4945 Transition *transition = 0;
4949 for(Track *track = mwindow->edl->tracks->first;
4951 track = track->next)
4953 for(Edit *edit = track->edits->first;
4957 if(edit->transition)
4959 edit_dimensions(edit, x, y, w, h);
4960 get_transition_coords(x, y, w, h);
4962 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
4963 MWindowGUI::visible(y, y + h, 0, get_h()))
4965 if(cursor_x >= x && cursor_x < x + w &&
4966 cursor_y >= y && cursor_y < y + h)
4968 transition = edit->transition;
4982 new_cursor = UPRIGHT_ARROW_CURSOR;
4985 if(get_buttonpress() == 3)
4987 gui->transition_menu->update(transition);
4988 gui->transition_menu->activate_menu();
4995 int TrackCanvas::button_press_event()
4998 int cursor_x, cursor_y;
4999 int new_cursor, update_cursor;
5001 //printf("TrackCanvas::button_press_event 1\n");
5002 cursor_x = get_cursor_x();
5003 cursor_y = get_cursor_y();
5004 mwindow->session->trim_edits = 0;
5006 if(is_event_win() && cursor_inside())
5008 double position = (double)cursor_x *
5009 mwindow->edl->local_session->zoom_sample /
5010 mwindow->edl->session->sample_rate +
5011 (double)mwindow->edl->local_session->view_start *
5012 mwindow->edl->local_session->zoom_sample /
5013 mwindow->edl->session->sample_rate;
5021 if(get_buttonpress() == 1)
5023 gui->unlock_window();
5024 gui->mbuttons->transport->handle_transport(STOP, 1);
5025 gui->lock_window("TrackCanvas::button_press_event");
5028 int update_overlay = 0, update_cursor = 0, rerender = 0;
5030 if(get_buttonpress() == 4)
5032 //printf("TrackCanvas::button_press_event 1\n");
5035 mwindow->zoom_in_sample(position);
5039 mwindow->move_up(get_h() / 10);
5044 if(get_buttonpress() == 5)
5046 //printf("TrackCanvas::button_press_event 2\n");
5049 mwindow->expand_sample(position);
5054 mwindow->move_down(get_h() / 10);
5059 switch(mwindow->edl->session->editing_mode)
5061 // Test handles and resource boundaries and highlight a track
5066 if(mwindow->edl->session->auto_conf->transitions &&
5067 test_transitions(cursor_x,
5076 if(do_keyframes(cursor_x,
5087 // Test edit boundaries
5088 if(test_edit_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
5093 // Test plugin boundaries
5094 if(test_plugin_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
5099 if(test_edits(cursor_x, cursor_y, 1, 0, update_cursor, rerender, new_cursor, update_cursor))
5104 if(test_plugins(cursor_x, cursor_y, 0, 1, update_cursor, rerender))
5109 if(test_resources(cursor_x, cursor_y))
5114 if(test_tracks(cursor_x, cursor_y, 1))
5121 // Test handles only and select a region
5124 //printf("TrackCanvas::button_press_event %d\n", position);
5126 if(mwindow->edl->session->auto_conf->transitions &&
5127 test_transitions(cursor_x,
5136 if(do_keyframes(cursor_x,
5148 // Test edit boundaries
5149 if(test_edit_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
5154 // Test plugin boundaries
5155 if(test_plugin_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
5160 if(test_edits(cursor_x, cursor_y, 1, 0, update_cursor, rerender, new_cursor, update_cursor))
5165 if(test_plugins(cursor_x, cursor_y, 0, 1, update_cursor, rerender))
5170 if(test_tracks(cursor_x, cursor_y, 1))
5174 // Highlight selection
5177 rerender = start_selection(position);
5178 mwindow->session->current_operation = SELECT_REGION;
5189 mwindow->cwindow->update(1, 0, 0, 0, 1);
5191 mwindow->update_plugin_guis();
5192 gui->patchbay->update();
5203 gui->timebar->update_highlights();
5204 gui->cursor->hide();
5205 gui->cursor->show();
5206 gui->zoombar->update();
5217 int TrackCanvas::start_selection(double position)
5220 position = mwindow->edl->align_to_frame(position, 0);
5225 double midpoint = (mwindow->edl->local_session->selectionstart +
5226 mwindow->edl->local_session->selectionend) / 2;
5228 if(position < midpoint)
5230 mwindow->edl->local_session->selectionstart = position;
5231 selection_midpoint1 = mwindow->edl->local_session->selectionend;
5237 mwindow->edl->local_session->selectionend = position;
5238 selection_midpoint1 = mwindow->edl->local_session->selectionstart;
5239 // Don't que the CWindow for the end
5243 // Start a new selection
5245 //printf("TrackCanvas::start_selection %f\n", position);
5246 mwindow->edl->local_session->selectionstart =
5247 mwindow->edl->local_session->selectionend =
5249 selection_midpoint1 = position;
5257 void TrackCanvas::end_edithandle_selection()
5259 mwindow->modify_edithandles();
5262 void TrackCanvas::end_pluginhandle_selection()
5264 mwindow->modify_pluginhandles();
5268 double TrackCanvas::time_visible()
5270 return (double)get_w() *
5271 mwindow->edl->local_session->zoom_sample /
5272 mwindow->edl->session->sample_rate;
5315 void TrackCanvas::draw_automation()
5320 int TrackCanvas::set_index_file(int flash, Asset *asset)
5326 int TrackCanvas::button_release()
5332 int TrackCanvas::auto_reposition(int &cursor_x, int &cursor_y, int64_t cursor_position)
5338 int TrackCanvas::draw_floating_handle(int flash)
5343 int TrackCanvas::draw_loop_point(int64_t position, int flash)
5348 int TrackCanvas::draw_playback_cursor(int pixel, int flash)
5354 int TrackCanvas::update_handle_selection(int64_t cursor_position)
5359 int TrackCanvas::end_translation()