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)
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 //printf("TrackCanvas::drag_motion 2 %p\n", mwindow->session->track_highlighted);
410 lock_window("TrackCanvas::drag_motion");
419 int TrackCanvas::drag_start_event()
424 int new_cursor, update_cursor;
426 if(mwindow->session->current_operation != NO_OPERATION) return 0;
430 if(test_plugins(get_drag_x(),
440 if(test_edits(get_drag_x(),
456 int TrackCanvas::drag_motion_event()
458 return drag_motion();
461 int TrackCanvas::cursor_leave_event()
463 // because drag motion calls get_cursor_over_window we can be sure that
464 // all highlights get deleted now
470 int TrackCanvas::drag_stop_event()
472 int result = drag_stop();
483 int TrackCanvas::drag_stop()
485 // In most cases the editing routine redraws and not the drag_stop
486 int result = 0, redraw = 0;
488 switch(mwindow->session->current_operation)
490 case DRAG_VTRANSITION:
491 case DRAG_ATRANSITION:
492 if(mwindow->session->edit_highlighted)
494 if((mwindow->session->current_operation == DRAG_ATRANSITION &&
495 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
496 (mwindow->session->current_operation == DRAG_VTRANSITION &&
497 mwindow->session->track_highlighted->data_type == TRACK_VIDEO))
499 mwindow->session->current_operation = NO_OPERATION;
500 mwindow->paste_transition();
510 // Behavior for dragged plugins is limited by the fact that a shared plugin
511 // can only refer to a standalone plugin that exists in the same position in
512 // time. Dragging a plugin from one point in time to another can't produce
513 // a shared plugin to the original plugin. In this case we relocate the
514 // plugin instead of sharing it.
515 case DRAG_AEFFECT_COPY:
516 case DRAG_VEFFECT_COPY:
517 if(mwindow->session->track_highlighted &&
518 ((mwindow->session->current_operation == DRAG_AEFFECT_COPY &&
519 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
520 (mwindow->session->current_operation == DRAG_VEFFECT_COPY &&
521 mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
523 mwindow->session->current_operation = NO_OPERATION;
525 // Insert shared plugin in source
526 if(mwindow->session->track_highlighted != mwindow->session->drag_plugin->track &&
527 !mwindow->session->plugin_highlighted &&
528 !mwindow->session->pluginset_highlighted)
530 // Move plugin if different startproject
531 mwindow->move_effect(mwindow->session->drag_plugin,
533 mwindow->session->track_highlighted,
538 // Move source to different location
539 if(mwindow->session->pluginset_highlighted)
541 //printf("TrackCanvas::drag_stop 6\n");
542 if(mwindow->session->plugin_highlighted)
544 mwindow->move_effect(mwindow->session->drag_plugin,
545 mwindow->session->plugin_highlighted->plugin_set,
547 mwindow->session->plugin_highlighted->startproject);
551 mwindow->move_effect(mwindow->session->drag_plugin,
552 mwindow->session->pluginset_highlighted,
554 mwindow->session->pluginset_highlighted->length());
559 // Move to a new plugin set between two edits
560 if(mwindow->session->edit_highlighted)
562 mwindow->move_effect(mwindow->session->drag_plugin,
564 mwindow->session->track_highlighted,
565 mwindow->session->edit_highlighted->startproject);
569 // Move to a new plugin set
570 if(mwindow->session->track_highlighted)
572 mwindow->move_effect(mwindow->session->drag_plugin,
574 mwindow->session->track_highlighted,
583 if(mwindow->session->track_highlighted &&
584 ((mwindow->session->current_operation == DRAG_AEFFECT &&
585 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
586 (mwindow->session->current_operation == DRAG_VEFFECT &&
587 mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
589 // Drop all the effects
590 PluginSet *plugin_set = mwindow->session->pluginset_highlighted;
591 Track *track = mwindow->session->track_highlighted;
593 double length = track->get_length();
595 if(mwindow->session->plugin_highlighted)
597 start = track->from_units(mwindow->session->plugin_highlighted->startproject);
598 length = track->from_units(mwindow->session->plugin_highlighted->length);
599 if(length <= 0) length = track->get_length();
602 if(mwindow->session->pluginset_highlighted)
604 start = track->from_units(plugin_set->length());
605 length = track->get_length() - start;
606 if(length <= 0) length = track->get_length();
609 if(mwindow->edl->local_session->get_selectionend() >
610 mwindow->edl->local_session->get_selectionstart())
612 start = mwindow->edl->local_session->get_selectionstart();
613 length = mwindow->edl->local_session->get_selectionend() -
614 mwindow->edl->local_session->get_selectionstart();
616 // Move to a point between two edits
618 if(mwindow->session->edit_highlighted)
620 start = mwindow->session->track_highlighted->from_units(
621 mwindow->session->edit_highlighted->startproject);
622 length = mwindow->session->track_highlighted->from_units(
623 mwindow->session->edit_highlighted->length);
626 mwindow->insert_effects_canvas(start, length);
629 if (mwindow->session->track_highlighted)
630 result = 1; // we have to cleanup
634 if(mwindow->session->track_highlighted)
636 int64_t position = mwindow->session->edit_highlighted ?
637 mwindow->session->edit_highlighted->startproject :
638 mwindow->session->track_highlighted->edits->length();
639 double position_f = mwindow->session->track_highlighted->from_units(position);
640 Track *track = mwindow->session->track_highlighted;
641 mwindow->paste_assets(position_f, track);
642 result = 1; // need to be one no matter what, since we have track highlited so we have to cleanup....
647 mwindow->session->current_operation = NO_OPERATION;
648 if(mwindow->session->track_highlighted)
650 if(mwindow->session->track_highlighted->data_type == mwindow->session->drag_edit->track->data_type)
652 int64_t position = mwindow->session->edit_highlighted ?
653 mwindow->session->edit_highlighted->startproject :
654 mwindow->session->track_highlighted->edits->length();
655 double position_f = mwindow->session->track_highlighted->from_units(position);
656 Track *track = mwindow->session->track_highlighted;
657 mwindow->move_edits(mwindow->session->drag_edits,
667 // since we don't have subwindows we have to terminate any drag operation
670 if (mwindow->session->track_highlighted
671 || mwindow->session->edit_highlighted
672 || mwindow->session->plugin_highlighted
673 || mwindow->session->pluginset_highlighted)
675 mwindow->session->track_highlighted = 0;
676 mwindow->session->edit_highlighted = 0;
677 mwindow->session->plugin_highlighted = 0;
678 mwindow->session->pluginset_highlighted = 0;
679 mwindow->session->current_operation = NO_OPERATION;
683 //printf("TrackCanvas::drag_stop %d %d\n", redraw, mwindow->session->current_operation);
686 mwindow->edl->tracks->update_y_pixels(mwindow->theme);
687 gui->get_scrollbars();
689 gui->patchbay->update();
690 gui->cursor->update();
699 void TrackCanvas::draw(int force, int hide_cursor)
701 // Swap pixmap layers
702 TRACE("TrackCanvas::draw 1")
703 if(get_w() != background_pixmap->get_w() ||
704 get_h() != background_pixmap->get_h())
706 delete background_pixmap;
707 background_pixmap = new BC_Pixmap(this, get_w(), get_h());
710 TRACE("TrackCanvas::draw 10")
711 // Cursor disappears after resize when this is called.
712 // Cursor doesn't redraw after editing when this isn't called.
713 if(gui->cursor && hide_cursor) gui->cursor->hide();
714 TRACE("TrackCanvas::draw 20")
715 draw_top_background(get_parent(), 0, 0, get_w(), get_h(), background_pixmap);
716 TRACE("TrackCanvas::draw 30")
717 draw_resources(force);
718 TRACE("TrackCanvas::draw 40")
723 void TrackCanvas::update_cursor()
725 switch(mwindow->edl->session->editing_mode)
727 case EDITING_ARROW: set_cursor(ARROW_CURSOR); break;
728 case EDITING_IBEAM: set_cursor(IBEAM_CURSOR); break;
733 void TrackCanvas::draw_indexes(Asset *asset)
735 // Don't redraw raw samples
736 if(asset->index_zoom > mwindow->edl->local_session->zoom_sample)
739 draw_resources(0, 1, asset);
747 void TrackCanvas::draw_resources(int force,
751 // Age resource pixmaps for deletion
753 for(int i = 0; i < resource_pixmaps.total; i++)
754 resource_pixmaps.values[i]->visible--;
757 resource_pixmaps.remove_all_objects();
759 //printf("TrackCanvas::draw_resources 1 %d %d\n", force, indexes_only);
762 for(Track *current = mwindow->edl->tracks->first;
766 //printf("TrackCanvas::draw_resources 2\n");
767 for(Edit *edit = current->edits->first; edit; edit = edit->next)
769 //printf("TrackCanvas::draw_resources 3\n");
770 if(!edit->asset) continue;
771 //printf("TrackCanvas::draw_resources 4\n");
774 if(edit->track->data_type != TRACK_AUDIO) continue;
775 if(!edit->asset->test_path(index_asset->path)) continue;
778 int64_t edit_x, edit_y, edit_w, edit_h;
779 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
780 //printf("TrackCanvas::draw_resources 10\n");
783 if(MWindowGUI::visible(edit_x, edit_x + edit_w, 0, get_w()) &&
784 MWindowGUI::visible(edit_y, edit_y + edit_h, 0, get_h()))
786 int64_t pixmap_x, pixmap_w, pixmap_h;
788 //printf("TrackCanvas::draw_resources 20\n");
789 // Search for existing pixmap containing edit
790 for(int i = 0; i < resource_pixmaps.total; i++)
792 ResourcePixmap* pixmap = resource_pixmaps.values[i];
793 //printf("TrackCanvas::draw_resources 30\n");
794 // Same pointer can be different edit if editing took place
795 if(pixmap->edit_id == edit->id)
797 //printf("TrackCanvas::draw_resources 40\n");
801 //printf("TrackCanvas::draw_resources 50\n");
804 // Get new size, offset of pixmap needed
805 get_pixmap_size(edit,
811 //printf("TrackCanvas::draw_resources 60\n");
814 if(pixmap_w && pixmap_h)
816 // Create pixmap if it doesn't exist
817 ResourcePixmap* pixmap = create_pixmap(edit,
822 //printf("TrackCanvas::draw_resources 70\n");
823 // Resize it if it's bigger
824 if(pixmap_w > pixmap->pixmap_w ||
825 pixmap_h > pixmap->pixmap_h)
826 pixmap->resize(pixmap_w, pixmap_h);
827 //printf("TrackCanvas::draw_resources 80\n");
828 pixmap->draw_data(edit,
836 //printf("TrackCanvas::draw_resources 90\n");
837 // Resize it if it's smaller
838 if(pixmap_w < pixmap->pixmap_w ||
839 pixmap_h < pixmap->pixmap_h)
840 pixmap->resize(pixmap_w, pixmap_h);
841 //printf("TrackCanvas::draw_resources 100\n");
842 // Copy pixmap to background canvas
843 background_pixmap->draw_pixmap(pixmap,
848 //printf("TrackCanvas::draw_resources 110\n");
853 //printf("TrackCanvas::draw_resources 200\n");
855 // Delete unused pixmaps
857 for(int i = resource_pixmaps.total - 1; i >= 0; i--)
858 if(resource_pixmaps.values[i]->visible < -5)
860 delete resource_pixmaps.values[i];
861 resource_pixmaps.remove(resource_pixmaps.values[i]);
865 ResourcePixmap* TrackCanvas::create_pixmap(Edit *edit,
871 ResourcePixmap *result = 0;
873 for(int i = 0; i < resource_pixmaps.total; i++)
875 //printf("TrackCanvas::create_pixmap 1 %d %d\n", edit->id, resource_pixmaps.values[i]->edit->id);
876 if(resource_pixmaps.values[i]->edit_id == edit->id)
878 result = resource_pixmaps.values[i];
885 //printf("TrackCanvas::create_pixmap 2\n");
886 result = new ResourcePixmap(mwindow,
891 resource_pixmaps.append(result);
894 // result->resize(pixmap_w, pixmap_h);
898 void TrackCanvas::get_pixmap_size(Edit *edit,
906 // Align x on frame boundaries
909 // switch(edit->edits->track->data_type)
921 if(pixmap_x + pixmap_w > get_w())
923 pixmap_w = get_w() - pixmap_x;
930 // int64_t picon_w = (int64_t)(edit->picon_w() + 0.5);
931 // int64_t frame_w = (int64_t)(edit->frame_w() + 0.5);
932 // int64_t pixel_increment = MAX(picon_w, frame_w);
933 // int64_t pixmap_x1 = edit_x;
934 // int64_t pixmap_x2 = edit_x + edit_w;
938 // pixmap_x1 = (int64_t)((double)-edit_x / pixel_increment) *
943 // if(pixmap_x2 > get_w())
945 // pixmap_x2 = (int64_t)((double)(get_w() - edit_x) / pixel_increment + 1) *
949 // pixmap_x = pixmap_x1;
950 // pixmap_w = pixmap_x2 - pixmap_x1;
955 pixmap_h = mwindow->edl->local_session->zoom_track;
956 if(mwindow->edl->session->show_titles) pixmap_h += mwindow->theme->title_bg_data->get_h();
957 //printf("get_pixmap_size %d %d %d %d\n", edit_x, edit_w, pixmap_x, pixmap_w);
960 void TrackCanvas::edit_dimensions(Edit *edit,
966 //printf("TrackCanvas::edit_dimensions 1 %p\n", edit->track);
970 //printf("TrackCanvas::edit_dimensions 1\n");
971 x = Units::round(edit->track->from_units(edit->startproject) *
972 mwindow->edl->session->sample_rate /
973 mwindow->edl->local_session->zoom_sample -
974 mwindow->edl->local_session->view_start);
976 // Method for calculating w so when edits are together we never get off by one error due to rounding
977 int64_t x_next = Units::round(edit->track->from_units(edit->startproject + edit->length) *
978 mwindow->edl->session->sample_rate /
979 mwindow->edl->local_session->zoom_sample -
980 mwindow->edl->local_session->view_start);
983 //printf("TrackCanvas::edit_dimensions 1\n");
984 y = edit->edits->track->y_pixel;
985 //printf("TrackCanvas::edit_dimensions 1\n");
987 if(mwindow->edl->session->show_titles)
988 h += mwindow->theme->title_bg_data->get_h();
989 //printf("TrackCanvas::edit_dimensions 2\n");
992 void TrackCanvas::track_dimensions(Track *track, int64_t &x, int64_t &y, int64_t &w, int64_t &h)
997 h = track->vertical_span(mwindow->theme);
1001 void TrackCanvas::draw_paste_destination()
1003 int current_atrack = 0;
1004 int current_vtrack = 0;
1005 int current_aedit = 0;
1006 int current_vedit = 0;
1011 //printf("TrackCanvas::draw_paste_destination 1\n");
1012 if((mwindow->session->current_operation == DRAG_ASSET &&
1013 (mwindow->session->drag_assets->total ||
1014 mwindow->session->drag_clips->total)) ||
1015 (mwindow->session->current_operation == DRAG_EDIT &&
1016 mwindow->session->drag_edits->total))
1018 //printf("TrackCanvas::draw_paste_destination 1\n");
1023 if(mwindow->session->current_operation == DRAG_ASSET &&
1024 mwindow->session->drag_assets->total)
1025 asset = mwindow->session->drag_assets->values[0];
1027 if(mwindow->session->current_operation == DRAG_ASSET &&
1028 mwindow->session->drag_clips->total)
1029 clip = mwindow->session->drag_clips->values[0];
1031 // Get destination track
1032 for(Track *dest = mwindow->session->track_highlighted;
1038 // Get source width in pixels
1042 // Use start of highlighted edit
1043 if(mwindow->session->edit_highlighted)
1044 position = mwindow->session->track_highlighted->from_units(
1045 mwindow->session->edit_highlighted->startproject);
1047 // Use end of highlighted track, disregarding effects
1048 position = mwindow->session->track_highlighted->from_units(
1049 mwindow->session->track_highlighted->edits->length());
1051 // Get the x coordinate
1052 x = Units::to_int64(position *
1053 mwindow->edl->session->sample_rate /
1054 mwindow->edl->local_session->zoom_sample) -
1055 mwindow->edl->local_session->view_start;
1057 if(dest->data_type == TRACK_AUDIO)
1059 if(asset && current_atrack < asset->channels)
1061 w = Units::to_int64((double)asset->audio_length /
1062 asset->sample_rate *
1063 mwindow->edl->session->sample_rate /
1064 mwindow->edl->local_session->zoom_sample);
1069 if(clip && current_atrack < clip->tracks->total_audio_tracks())
1071 w = Units::to_int64((double)clip->tracks->total_length() *
1072 mwindow->edl->session->sample_rate /
1073 mwindow->edl->local_session->zoom_sample);
1074 //printf("draw_paste_destination %d\n", x);
1079 if(mwindow->session->current_operation == DRAG_EDIT &&
1080 current_aedit < mwindow->session->drag_edits->total)
1083 while(current_aedit < mwindow->session->drag_edits->total &&
1084 mwindow->session->drag_edits->values[current_aedit]->track->data_type != TRACK_AUDIO)
1087 if(current_aedit < mwindow->session->drag_edits->total)
1089 edit = mwindow->session->drag_edits->values[current_aedit];
1090 w = Units::to_int64(edit->length / mwindow->edl->local_session->zoom_sample);
1098 if(dest->data_type == TRACK_VIDEO)
1100 //printf("draw_paste_destination 1\n");
1101 if(asset && current_vtrack < asset->layers)
1103 w = Units::to_int64((double)asset->video_length /
1105 mwindow->edl->session->sample_rate /
1106 mwindow->edl->local_session->zoom_sample);
1111 if(clip && current_vtrack < clip->tracks->total_video_tracks())
1113 w = Units::to_int64(clip->tracks->total_length() *
1114 mwindow->edl->session->sample_rate /
1115 mwindow->edl->local_session->zoom_sample);
1120 if(mwindow->session->current_operation == DRAG_EDIT &&
1121 current_vedit < mwindow->session->drag_edits->total)
1123 //printf("draw_paste_destination 2\n");
1125 while(current_vedit < mwindow->session->drag_edits->total &&
1126 mwindow->session->drag_edits->values[current_vedit]->track->data_type != TRACK_VIDEO)
1129 if(current_vedit < mwindow->session->drag_edits->total)
1131 //printf("draw_paste_destination 3\n");
1132 edit = mwindow->session->drag_edits->values[current_vedit];
1133 w = Units::to_int64(edit->track->from_units(edit->length) *
1134 mwindow->edl->session->sample_rate /
1135 mwindow->edl->local_session->zoom_sample);
1145 int y = dest->y_pixel;
1146 int h = dest->vertical_span(mwindow->theme);
1149 //printf("TrackCanvas::draw_paste_destination 2 %d %d %d %d\n", x, y, w, h);
1150 if(x < -BC_INFINITY)
1152 w -= -BC_INFINITY - x;
1153 x += -BC_INFINITY - x;
1156 draw_highlight_rectangle(x, y, w, h);
1163 void TrackCanvas::plugin_dimensions(Plugin *plugin, int64_t &x, int64_t &y, int64_t &w, int64_t &h)
1165 x = Units::round(plugin->track->from_units(plugin->startproject) *
1166 mwindow->edl->session->sample_rate /
1167 mwindow->edl->local_session->zoom_sample -
1168 mwindow->edl->local_session->view_start);
1169 w = Units::round(plugin->track->from_units(plugin->length) *
1170 mwindow->edl->session->sample_rate /
1171 mwindow->edl->local_session->zoom_sample);
1172 y = plugin->track->y_pixel +
1173 mwindow->edl->local_session->zoom_track +
1174 plugin->plugin_set->get_number() *
1175 mwindow->theme->plugin_bg_data->get_h();
1176 if(mwindow->edl->session->show_titles)
1177 y += mwindow->theme->title_bg_data->get_h();
1178 h = mwindow->theme->plugin_bg_data->get_h();
1181 int TrackCanvas::resource_h()
1183 return mwindow->edl->local_session->zoom_track;
1186 void TrackCanvas::draw_highlight_rectangle(int x, int y, int w, int h)
1198 w = MIN(w, get_w() + 20);
1199 h = MIN(h, get_h() + 20);
1202 draw_rectangle(x, y, w, h);
1203 draw_rectangle(x + 1, y + 1, w - 2, h - 2);
1205 //printf("TrackCanvas::draw_highlight_rectangle %d %d %d %d\n", x, y, w, h);
1208 void TrackCanvas::draw_playback_cursor()
1210 // Called before playback_cursor exists
1211 // if(mwindow->playback_cursor && mwindow->playback_cursor->visible)
1213 // mwindow->playback_cursor->visible = 0;
1214 // mwindow->playback_cursor->draw();
1218 void TrackCanvas::get_handle_coords(Edit *edit, int64_t &x, int64_t &y, int64_t &w, int64_t &h, int side)
1220 int handle_w = mwindow->theme->edithandlein_data[0]->get_w();
1221 int handle_h = mwindow->theme->edithandlein_data[0]->get_h();
1223 edit_dimensions(edit, x, y, w, h);
1225 if(mwindow->edl->session->show_titles)
1227 y += mwindow->theme->title_bg_data->get_h();
1234 if(side == EDIT_OUT)
1243 void TrackCanvas::get_transition_coords(int64_t &x, int64_t &y, int64_t &w, int64_t &h)
1245 //printf("TrackCanvas::get_transition_coords 1\n");
1246 // int transition_w = mwindow->theme->transitionhandle_data[0]->get_w();
1247 // int transition_h = mwindow->theme->transitionhandle_data[0]->get_h();
1248 int transition_w = 30;
1249 int transition_h = 30;
1250 //printf("TrackCanvas::get_transition_coords 1\n");
1252 if(mwindow->edl->session->show_titles)
1253 y += mwindow->theme->title_bg_data->get_h();
1254 //printf("TrackCanvas::get_transition_coords 2\n");
1256 y += (h - mwindow->theme->title_bg_data->get_h()) / 2 - transition_h / 2;
1257 x -= transition_w / 2;
1263 void TrackCanvas::draw_highlighting()
1267 //printf("TrackCanvas::draw_highlighting 1 %p %d\n", mwindow->session->track_highlighted, mwindow->session->current_operation);
1271 switch(mwindow->session->current_operation)
1273 case DRAG_ATRANSITION:
1274 case DRAG_VTRANSITION:
1275 //printf("TrackCanvas::draw_highlighting 1 %p %p\n",
1276 // mwindow->session->track_highlighted, mwindow->session->edit_highlighted);
1277 if(mwindow->session->edit_highlighted)
1279 //printf("TrackCanvas::draw_highlighting 2\n");
1280 if((mwindow->session->current_operation == DRAG_ATRANSITION &&
1281 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1282 (mwindow->session->current_operation == DRAG_VTRANSITION &&
1283 mwindow->session->track_highlighted->data_type == TRACK_VIDEO))
1285 //printf("TrackCanvas::draw_highlighting 2\n");
1286 edit_dimensions(mwindow->session->edit_highlighted, x, y, w, h);
1287 //printf("TrackCanvas::draw_highlighting 2\n");
1289 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1290 MWindowGUI::visible(y, y + h, 0, get_h()))
1293 get_transition_coords(x, y, w, h);
1295 //printf("TrackCanvas::draw_highlighting 3\n");
1302 // Dragging a new effect from the Resource window
1305 if(mwindow->session->track_highlighted &&
1306 ((mwindow->session->current_operation == DRAG_AEFFECT && mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1307 (mwindow->session->current_operation == DRAG_VEFFECT && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
1309 // Put it before another plugin
1310 if(mwindow->session->plugin_highlighted)
1312 plugin_dimensions(mwindow->session->plugin_highlighted,
1317 //printf("TrackCanvas::draw_highlighting 1 %d %d\n", x, w);
1320 // Put it after a plugin set
1321 if(mwindow->session->pluginset_highlighted &&
1322 mwindow->session->pluginset_highlighted->last)
1324 plugin_dimensions((Plugin*)mwindow->session->pluginset_highlighted->last,
1329 //printf("TrackCanvas::draw_highlighting 1 %d %d\n", x, w);
1330 int64_t track_x, track_y, track_w, track_h;
1331 track_dimensions(mwindow->session->track_highlighted,
1339 mwindow->session->track_highlighted->get_length() *
1340 mwindow->edl->session->sample_rate /
1341 mwindow->edl->local_session->zoom_sample -
1342 mwindow->edl->local_session->view_start) -
1344 //printf("TrackCanvas::draw_highlighting 2 %d\n", w);
1345 if(w <= 0) w = track_w;
1349 track_dimensions(mwindow->session->track_highlighted,
1355 //printf("TrackCanvas::draw_highlighting 1 %d %d %d %d\n", x, y, w, h);
1356 // Put it in a new plugin set determined by the selected range
1357 if(mwindow->edl->local_session->get_selectionend() >
1358 mwindow->edl->local_session->get_selectionstart())
1360 x = Units::to_int64(mwindow->edl->local_session->get_selectionstart() *
1361 mwindow->edl->session->sample_rate /
1362 mwindow->edl->local_session->zoom_sample -
1363 mwindow->edl->local_session->view_start);
1364 w = Units::to_int64((mwindow->edl->local_session->get_selectionend() -
1365 mwindow->edl->local_session->get_selectionstart()) *
1366 mwindow->edl->session->sample_rate /
1367 mwindow->edl->local_session->zoom_sample);
1369 // Put it in a new plugin set determined by an edit boundary
1371 if(mwindow->session->edit_highlighted)
1373 int64_t temp_y, temp_h;
1374 edit_dimensions(mwindow->session->edit_highlighted,
1380 // Put it at the beginning of the track in a new plugin set
1383 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1384 MWindowGUI::visible(y, y + h, 0, get_h()))
1386 //printf("TrackCanvas::draw_highlighting 1\n");
1393 if(mwindow->session->track_highlighted)
1395 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1397 if(MWindowGUI::visible(y, y + h, 0, get_h()))
1399 draw_paste_destination();
1404 // Dragging an effect from the timeline
1405 case DRAG_AEFFECT_COPY:
1406 case DRAG_VEFFECT_COPY:
1407 if((mwindow->session->plugin_highlighted || mwindow->session->track_highlighted) &&
1408 ((mwindow->session->current_operation == DRAG_AEFFECT_COPY && mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1409 (mwindow->session->current_operation == DRAG_VEFFECT_COPY && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
1411 // Put it before another plugin
1412 if(mwindow->session->plugin_highlighted)
1413 plugin_dimensions(mwindow->session->plugin_highlighted, x, y, w, h);
1415 // Put it after a plugin set
1416 if(mwindow->session->pluginset_highlighted &&
1417 mwindow->session->pluginset_highlighted->last)
1419 plugin_dimensions((Plugin*)mwindow->session->pluginset_highlighted->last, x, y, w, h);
1423 if(mwindow->session->track_highlighted)
1425 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1427 // Put it in a new plugin set determined by an edit boundary
1428 if(mwindow->session->edit_highlighted)
1430 int64_t temp_y, temp_h;
1431 edit_dimensions(mwindow->session->edit_highlighted,
1437 // Put it in a new plugin set at the start of the track
1440 // Calculate length of plugin based on data type of track and units
1441 if(mwindow->session->track_highlighted->data_type == TRACK_VIDEO)
1443 w = (int64_t)((double)mwindow->session->drag_plugin->length /
1444 mwindow->edl->session->frame_rate *
1445 mwindow->edl->session->sample_rate /
1446 mwindow->edl->local_session->zoom_sample);
1450 w = (int64_t)mwindow->session->drag_plugin->length /
1451 mwindow->edl->local_session->zoom_sample;
1454 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1455 MWindowGUI::visible(y, y + h, 0, get_h()))
1462 case DRAG_PLUGINKEY:
1463 if(mwindow->session->plugin_highlighted &&
1464 mwindow->session->current_operation == DRAG_PLUGINKEY)
1466 // Just highlight the plugin
1467 plugin_dimensions(mwindow->session->plugin_highlighted, x, y, w, h);
1469 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1470 MWindowGUI::visible(y, y + h, 0, get_h()))
1478 //printf("TrackCanvas::draw_highlighting 1\n");
1479 if(mwindow->session->track_highlighted)
1481 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1483 if(MWindowGUI::visible(y, y + h, 0, get_h()))
1485 draw_paste_destination();
1494 draw_highlight_rectangle(x, y, w, h);
1498 void TrackCanvas::draw_plugins()
1500 char string[BCTEXTLEN];
1502 for(Track *track = mwindow->edl->tracks->first;
1504 track = track->next)
1506 if(track->expand_view)
1508 for(int i = 0; i < track->plugin_set.total; i++)
1510 PluginSet *pluginset = track->plugin_set.values[i];
1512 for(Plugin *plugin = (Plugin*)pluginset->first; plugin; plugin = (Plugin*)plugin->next)
1514 int64_t total_x, y, total_w, h;
1515 plugin_dimensions(plugin, total_x, y, total_w, h);
1517 if(MWindowGUI::visible(total_x, total_x + total_w, 0, get_w()) &&
1518 MWindowGUI::visible(y, y + h, 0, get_h()) &&
1519 plugin->plugin_type != PLUGIN_NONE)
1521 int x = total_x, w = total_w, left_margin = 5;
1527 if(w + x > get_w()) w -= (w + x) - get_w();
1534 mwindow->theme->plugin_bg_data,
1537 set_font(MEDIUMFONT_3D);
1538 plugin->calculate_title(string, 0);
1540 // Truncate string to int64_test visible in background
1541 int len = strlen(string), j;
1542 for(j = len; j >= 0; j--)
1544 if(left_margin + get_text_width(MEDIUMFONT_3D, string) > w)
1552 // Justify the text on the left boundary of the edit if it is visible.
1553 // Otherwise justify it on the left side of the screen.
1554 int text_x = total_x + left_margin;
1555 text_x = MAX(left_margin, text_x);
1557 y + get_text_ascent(MEDIUMFONT_3D) + 2,
1569 void TrackCanvas::draw_inout_points()
1574 void TrackCanvas::draw_drag_handle()
1576 if(mwindow->session->current_operation == DRAG_EDITHANDLE2 ||
1577 mwindow->session->current_operation == DRAG_PLUGINHANDLE2)
1579 //printf("TrackCanvas::draw_drag_handle 1 %ld %ld\n", mwindow->session->drag_sample, mwindow->edl->local_session->view_start);
1580 int64_t pixel1 = Units::round(mwindow->session->drag_position *
1581 mwindow->edl->session->sample_rate /
1582 mwindow->edl->local_session->zoom_sample -
1583 mwindow->edl->local_session->view_start);
1584 //printf("TrackCanvas::draw_drag_handle 2 %d\n", pixel1);
1587 //printf("TrackCanvas::draw_drag_handle 3\n");
1588 draw_line(pixel1, 0, pixel1, get_h());
1590 //printf("TrackCanvas::draw_drag_handle 4\n");
1595 void TrackCanvas::draw_transitions()
1599 for(Track *track = mwindow->edl->tracks->first;
1601 track = track->next)
1603 for(Edit *edit = track->edits->first;
1607 if(edit->transition)
1609 int64_t strip_w, strip_x, strip_y;
1610 edit_dimensions(edit, x, y, w, h);
1613 if(mwindow->edl->session->show_titles)
1614 strip_y += mwindow->theme->title_bg_data->get_h();
1616 get_transition_coords(x, y, w, h);
1617 strip_w = Units::round(edit->track->from_units(edit->transition->length) *
1618 mwindow->edl->session->sample_rate /
1619 mwindow->edl->local_session->zoom_sample);
1621 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1622 MWindowGUI::visible(y, y + h, 0, get_h()))
1624 PluginServer *server = mwindow->scan_plugindb(edit->transition->title,
1626 draw_vframe(server->picon,
1633 server->picon->get_w(),
1634 server->picon->get_h());
1636 if(MWindowGUI::visible(strip_x, strip_x + strip_w, 0, get_w()) &&
1637 MWindowGUI::visible(strip_y, strip_y + h, 0, get_h()))
1639 int x = strip_x, w = strip_w, left_margin = 5;
1645 if(w + x > get_w()) w -= (w + x) - get_w();
1653 mwindow->theme->plugin_bg_data,
1662 void TrackCanvas::draw_loop_points()
1664 //printf("TrackCanvas::draw_loop_points 1\n");
1665 if(mwindow->edl->local_session->loop_playback)
1667 //printf("TrackCanvas::draw_loop_points 2\n");
1668 int64_t x = Units::round(mwindow->edl->local_session->loop_start *
1669 mwindow->edl->session->sample_rate /
1670 mwindow->edl->local_session->zoom_sample -
1671 mwindow->edl->local_session->view_start);
1672 //printf("TrackCanvas::draw_loop_points 3\n");
1674 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
1677 draw_line(x, 0, x, get_h());
1679 //printf("TrackCanvas::draw_loop_points 4\n");
1681 x = Units::round(mwindow->edl->local_session->loop_end *
1682 mwindow->edl->session->sample_rate /
1683 mwindow->edl->local_session->zoom_sample -
1684 mwindow->edl->local_session->view_start);
1685 //printf("TrackCanvas::draw_loop_points 5\n");
1687 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
1690 draw_line(x, 0, x, get_h());
1692 //printf("TrackCanvas::draw_loop_points 6\n");
1694 //printf("TrackCanvas::draw_loop_points 7\n");
1697 void TrackCanvas::draw_brender_start()
1699 if(mwindow->preferences->use_brender)
1701 int64_t x = Units::round(mwindow->edl->session->brender_start *
1702 mwindow->edl->session->sample_rate /
1703 mwindow->edl->local_session->zoom_sample -
1704 mwindow->edl->local_session->view_start);
1706 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
1709 draw_line(x, 0, x, get_h());
1714 int TrackCanvas::do_keyframes(int cursor_x,
1722 // Note: button 3 (right mouse button) is not eaten to allow
1723 // track context menu to appear
1724 int current_tool = 0;
1726 EDLSession *session = mwindow->edl->session;
1728 for(Track *track = mwindow->edl->tracks->first;
1730 track = track->next)
1732 Automation *automation = track->automation;
1734 //printf("TrackCanvas::draw_keyframes 1\n");
1735 if(!result && session->auto_conf->fade)
1737 Auto *auto_keyframe;
1738 result = do_float_autos(track,
1739 automation->fade_autos,
1746 if(result && mwindow->session->current_operation == DRAG_FADE && (buttonpress != 3))
1750 if(result && buttonpress && (buttonpress != 3))
1752 synchronize_autos(0, track, (FloatAuto*)mwindow->session->drag_auto, 1);
1753 mwindow->session->current_operation = DRAG_FADE;
1754 update_drag_caption();
1756 if (result && (buttonpress == 3))
1758 gui->keyframe_menu->update(automation, automation->fade_autos, auto_keyframe);
1759 gui->keyframe_menu->activate_menu();
1760 rerender = 1; // the position changes
1764 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1766 if(!result && session->auto_conf->czoom && automation->czoom_autos)
1768 Auto *auto_keyframe;
1769 result = do_float_autos(track,
1770 automation->czoom_autos,
1777 if(result && mwindow->session->current_operation == DRAG_CZOOM && (buttonpress != 3))
1781 if(result && buttonpress && (buttonpress != 3))
1783 mwindow->session->current_operation = DRAG_CZOOM;
1784 update_drag_caption();
1786 if (result && (buttonpress == 3))
1788 gui->keyframe_menu->update(automation, automation->czoom_autos, auto_keyframe);
1789 gui->keyframe_menu->activate_menu();
1790 rerender = 1; // the position changes
1794 //printf("TrackCanvas::draw_keyframes 2 %d\n", result);
1795 if(!result && session->auto_conf->pzoom && automation->pzoom_autos)
1797 Auto *auto_keyframe;
1798 result = do_float_autos(track,
1799 automation->pzoom_autos,
1806 if(result && mwindow->session->current_operation == DRAG_PZOOM && (buttonpress != 3))
1810 if(result && buttonpress && (buttonpress != 3))
1812 mwindow->session->current_operation = DRAG_PZOOM;
1813 update_drag_caption();
1815 if (result && (buttonpress == 3))
1817 gui->keyframe_menu->update(automation, automation->pzoom_autos, auto_keyframe);
1818 gui->keyframe_menu->activate_menu();
1819 rerender = 1; // the position changes
1823 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1824 if(!result && session->auto_conf->mute)
1826 Auto *auto_keyframe;
1827 result = do_toggle_autos(track,
1828 automation->mute_autos,
1835 if(result && mwindow->session->current_operation == DRAG_MUTE && (buttonpress != 3))
1839 if(result && buttonpress && (buttonpress != 3))
1841 mwindow->session->current_operation = DRAG_MUTE;
1842 update_drag_caption();
1844 if (result && (buttonpress == 3))
1846 gui->keyframe_menu->update(automation, automation->mute_autos, auto_keyframe);
1847 gui->keyframe_menu->activate_menu();
1848 rerender = 1; // the position changes
1852 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1853 if(!result && session->auto_conf->camera && automation->camera_autos)
1855 Auto *auto_keyframe;
1856 result = do_autos(track,
1857 automation->camera_autos,
1862 camerakeyframe_pixmap,
1864 if(result && mwindow->session->current_operation == DRAG_CAMERA && (buttonpress != 3))
1868 if(result && buttonpress && (buttonpress != 3))
1870 mwindow->session->current_operation = DRAG_CAMERA_PRE;
1871 update_drag_caption();
1874 if (result && (buttonpress == 3))
1876 gui->keyframe_menu->update(automation, automation->camera_autos, auto_keyframe);
1877 gui->keyframe_menu->activate_menu();
1878 rerender = 1; // the position changes
1883 if(!result && session->auto_conf->mode && automation->mode_autos)
1885 Auto *auto_keyframe;
1886 result = do_autos(track,
1887 automation->mode_autos,
1892 modekeyframe_pixmap,
1894 if(result && mwindow->session->current_operation == DRAG_MODE && (buttonpress != 3))
1898 if(result && buttonpress && (buttonpress != 3))
1900 mwindow->session->current_operation = DRAG_MODE_PRE;
1901 update_drag_caption();
1904 if (result && (buttonpress == 3))
1906 gui->keyframe_menu->update(automation, automation->mode_autos, auto_keyframe);
1907 gui->keyframe_menu->activate_menu();
1908 rerender = 1; // the position changes
1912 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1913 if(!result && session->auto_conf->projector && automation->projector_autos)
1915 Auto *auto_keyframe;
1916 result = do_autos(track,
1917 automation->projector_autos,
1922 projectorkeyframe_pixmap,
1924 if(result && mwindow->session->current_operation == DRAG_PROJECTOR && (buttonpress != 3))
1928 if(result && buttonpress && (buttonpress != 3))
1930 mwindow->session->current_operation = DRAG_PROJECTOR_PRE;
1931 update_drag_caption();
1934 if (result && (buttonpress == 3))
1936 gui->keyframe_menu->update(automation, automation->projector_autos, auto_keyframe);
1937 gui->keyframe_menu->activate_menu();
1938 rerender = 1; // the position changes
1942 if(!result && session->auto_conf->mask && automation->mask_autos)
1944 Auto *auto_keyframe;
1945 result = do_autos(track,
1946 automation->mask_autos,
1951 maskkeyframe_pixmap,
1953 if(result && mwindow->session->current_operation == DRAG_MASK && (buttonpress != 3))
1957 if(result && buttonpress && (buttonpress != 3))
1959 mwindow->session->current_operation = DRAG_MASK_PRE;
1960 update_drag_caption();
1963 if (result && (buttonpress == 3))
1965 gui->keyframe_menu->update(automation, automation->mask_autos, auto_keyframe);
1966 gui->keyframe_menu->activate_menu();
1967 rerender = 1; // the position changes
1971 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1972 if(!result && session->auto_conf->pan && automation->pan_autos)
1974 Auto *auto_keyframe;
1975 result = do_autos(track,
1976 automation->pan_autos,
1984 if(result && mwindow->session->current_operation == DRAG_PAN && (buttonpress != 3))
1988 if(result && buttonpress && (buttonpress != 3))
1990 mwindow->session->current_operation = DRAG_PAN_PRE;
1991 update_drag_caption();
1994 if (result && (buttonpress == 3))
1996 gui->keyframe_menu->update(automation, automation->pan_autos, auto_keyframe);
1997 gui->keyframe_menu->activate_menu();
1998 rerender = 1; // the position changes
2002 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2003 if(!result && session->auto_conf->plugins)
2007 result = do_plugin_autos(track,
2014 if(result && mwindow->session->current_operation == DRAG_PLUGINKEY)
2018 if(result && (buttonpress == 1))
2020 mwindow->session->current_operation = DRAG_PLUGINKEY_PRE;
2021 update_drag_caption();
2024 if (result && (buttonpress == 3))
2026 gui->keyframe_menu->update(plugin, keyframe);
2027 gui->keyframe_menu->activate_menu();
2028 rerender = 1; // the position changes
2031 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
2034 if(mwindow->session->current_operation == DRAG_FADE ||
2035 mwindow->session->current_operation == DRAG_CZOOM ||
2036 mwindow->session->current_operation == DRAG_PZOOM ||
2037 mwindow->session->current_operation == DRAG_PLAY ||
2038 mwindow->session->current_operation == DRAG_MUTE ||
2039 mwindow->session->current_operation == DRAG_CAMERA ||
2040 mwindow->session->current_operation == DRAG_CAMERA_PRE ||
2041 mwindow->session->current_operation == DRAG_MASK ||
2042 mwindow->session->current_operation == DRAG_MASK_PRE ||
2043 mwindow->session->current_operation == DRAG_MODE ||
2044 mwindow->session->current_operation == DRAG_MODE_PRE ||
2045 mwindow->session->current_operation == DRAG_PAN ||
2046 mwindow->session->current_operation == DRAG_PAN_PRE ||
2047 mwindow->session->current_operation == DRAG_PLUGINKEY ||
2048 mwindow->session->current_operation == DRAG_PLUGINKEY_PRE ||
2049 mwindow->session->current_operation == DRAG_PROJECTOR ||
2050 mwindow->session->current_operation == DRAG_PROJECTOR_PRE)
2055 //printf("TrackCanvas::draw_keyframes 2 %d\n", result);
2059 new_cursor = UPRIGHT_ARROW_CURSOR;
2063 //printf("TrackCanvas::do_keyframes 3 %d\n", result);
2067 void TrackCanvas::draw_auto(Auto *current,
2075 char string[BCTEXTLEN];
2077 x1 = x - HANDLE_W / 2;
2078 x2 = x + HANDLE_W / 2;
2079 y1 = center_pixel + y - HANDLE_W / 2;
2080 y2 = center_pixel + y + HANDLE_W / 2;
2082 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
2083 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
2086 draw_box(x1 + 1, y1 + 1, x2 - x1, y2 - y1);
2088 draw_box(x1, y1, x2 - x1, y2 - y1);
2091 void TrackCanvas::draw_floatauto(Auto *current,
2103 int in_x1, in_y1, in_x2, in_y2;
2104 int out_x1, out_y1, out_x2, out_y2;
2105 char string[BCTEXTLEN];
2108 x1 = x - HANDLE_W / 2;
2109 x2 = x + HANDLE_W / 2;
2110 y1 = center_pixel + y - HANDLE_W / 2;
2111 y2 = center_pixel + y + HANDLE_W / 2;
2113 CLAMP(y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2114 CLAMP(y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2117 draw_box(x1 + 1, y1 + 1, x2 - x1, y2 - y1);
2119 draw_box(x1, y1, x2 - x1, y2 - y1);
2122 in_x1 = in_x - HANDLE_W / 2;
2123 in_x2 = in_x + HANDLE_W / 2;
2124 in_y1 = center_pixel + in_y - HANDLE_W / 2;
2125 in_y2 = center_pixel + in_y + HANDLE_W / 2;
2127 CLAMP(in_y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2128 CLAMP(in_y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2129 CLAMP(in_y, -zoom_track / 2, zoom_track / 2);
2132 draw_line(x + 1, center_pixel + y + 1, in_x + 1, center_pixel + in_y + 1);
2133 draw_box(in_x1 + 1, in_y1 + 1, in_x2 - in_x1, in_y2 - in_y1);
2135 draw_line(x, center_pixel + y, in_x, center_pixel + in_y);
2136 draw_box(in_x1, in_y1, in_x2 - in_x1, in_y2 - in_y1);
2141 out_x1 = out_x - HANDLE_W / 2;
2142 out_x2 = out_x + HANDLE_W / 2;
2143 out_y1 = center_pixel + out_y - HANDLE_W / 2;
2144 out_y2 = center_pixel + out_y + HANDLE_W / 2;
2146 CLAMP(out_y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2147 CLAMP(out_y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2148 CLAMP(out_y, -zoom_track / 2, zoom_track / 2);
2152 draw_line(x + 1, center_pixel + y + 1, out_x + 1, center_pixel + out_y + 1);
2153 draw_box(out_x1 + 1, out_y1 + 1, out_x2 - out_x1, out_y2 - out_y1);
2155 draw_line(x, center_pixel + y, out_x, center_pixel + out_y);
2156 draw_box(out_x1, out_y1, out_x2 - out_x1, out_y2 - out_y1);
2160 int TrackCanvas::test_auto(Auto *current,
2170 char string[BCTEXTLEN];
2173 x1 = x - HANDLE_W / 2;
2174 x2 = x + HANDLE_W / 2;
2175 y1 = center_pixel + y - HANDLE_W / 2;
2176 y2 = center_pixel + y + HANDLE_W / 2;
2178 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
2179 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
2180 //printf("test_auto 1 %d %d %d %d %d %d\n", cursor_x, cursor_y, x1, x2, y1, y2);
2182 if(cursor_x >= x1 && cursor_x < x2 && cursor_y >= y1 && cursor_y < y2)
2184 //printf("test_auto 2 %d\n", buttonpress);
2185 if(buttonpress && buttonpress != 3)
2187 //printf("test_auto 3\n");
2188 mwindow->session->drag_auto = current;
2189 mwindow->session->drag_start_percentage = current->value_to_percentage();
2190 mwindow->session->drag_start_position = current->position;
2191 mwindow->session->drag_origin_x = cursor_x;
2192 mwindow->session->drag_origin_y = cursor_y;
2200 int TrackCanvas::test_floatauto(Auto *current,
2214 int in_x1, in_y1, in_x2, in_y2;
2215 int out_x1, out_y1, out_x2, out_y2;
2216 char string[BCTEXTLEN];
2219 x1 = x - HANDLE_W / 2;
2220 x2 = x + HANDLE_W / 2;
2221 y1 = center_pixel + y - HANDLE_W / 2;
2222 y2 = center_pixel + y + HANDLE_W / 2;
2224 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
2225 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
2227 in_x1 = in_x - HANDLE_W / 2;
2228 in_x2 = in_x + HANDLE_W / 2;
2229 in_y1 = center_pixel + in_y - HANDLE_W / 2;
2230 in_y2 = center_pixel + in_y + HANDLE_W / 2;
2232 if(in_y1 < center_pixel + -zoom_track / 2) in_y1 = center_pixel + -zoom_track / 2;
2233 if(in_y2 > center_pixel + zoom_track / 2) in_y2 = center_pixel + zoom_track / 2;
2235 out_x1 = out_x - HANDLE_W / 2;
2236 out_x2 = out_x + HANDLE_W / 2;
2237 out_y1 = center_pixel + out_y - HANDLE_W / 2;
2238 out_y2 = center_pixel + out_y + HANDLE_W / 2;
2240 if(out_y1 < center_pixel + -zoom_track / 2) out_y1 = center_pixel + -zoom_track / 2;
2241 if(out_y2 > center_pixel + zoom_track / 2) out_y2 = center_pixel + zoom_track / 2;
2245 //printf("TrackCanvas::test_floatauto %d %d %d %d %d %d\n", cursor_x, cursor_y, x1, x2, y1, y2);
2253 if(buttonpress && (buttonpress != 3))
2255 mwindow->session->drag_auto = current;
2256 mwindow->session->drag_start_percentage = current->value_to_percentage();
2257 mwindow->session->drag_start_position = current->position;
2258 mwindow->session->drag_origin_x = cursor_x;
2259 mwindow->session->drag_origin_y = cursor_y;
2260 mwindow->session->drag_handle = 0;
2267 cursor_x >= in_x1 &&
2269 cursor_y >= in_y1 &&
2271 current->position > 0)
2273 if(buttonpress && (buttonpress != 3))
2275 mwindow->session->drag_auto = current;
2276 mwindow->session->drag_start_percentage =
2277 current->invalue_to_percentage();
2278 mwindow->session->drag_start_position =
2279 ((FloatAuto*)current)->control_in_position;
2280 mwindow->session->drag_origin_x = cursor_x;
2281 mwindow->session->drag_origin_y = cursor_y;
2282 mwindow->session->drag_handle = 1;
2289 cursor_x >= out_x1 &&
2290 cursor_x < out_x2 &&
2291 cursor_y >= out_y1 &&
2294 if(buttonpress && (buttonpress != 3))
2296 mwindow->session->drag_auto = current;
2297 mwindow->session->drag_start_percentage =
2298 current->outvalue_to_percentage();
2299 mwindow->session->drag_start_position =
2300 ((FloatAuto*)current)->control_out_position;
2301 mwindow->session->drag_origin_x = cursor_x;
2302 mwindow->session->drag_origin_y = cursor_y;
2303 mwindow->session->drag_handle = 2;
2309 // 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",
2310 // mwindow->session->drag_handle,
2319 void TrackCanvas::draw_floatline(int center_pixel,
2320 FloatAuto *previous,
2332 // Solve bezier equation for either every pixel or a certain large number of
2337 // Not using slope intercept
2344 // Call by reference fails for some reason here
2345 FloatAuto *previous1 = previous, *next1 = next;
2346 for(int x = x1; x < x2; x++)
2348 int64_t position = (int64_t)(unit_start + x * zoom_units);
2349 float value = autos->get_value(position, PLAY_FORWARD, previous1, next1);
2351 int y = (int)(center_pixel +
2352 (autos->value_to_percentage(value) - 0.5) * -yscale);
2357 draw_line(x - 1, prev_y + 1, x, y + 1);
2359 draw_line(x - 1, prev_y, x, y);
2366 // set_color(BLACK);
2367 // draw_line(x1, center_pixel + y1 + 1, x2, center_pixel + y2 + 1);
2368 // set_color(WHITE);
2369 // draw_line(x1, center_pixel + y1, x2, center_pixel + y2);
2377 void TrackCanvas::synchronize_autos(float change, Track *skip, FloatAuto *fauto, int fill_gangs)
2379 if (fill_gangs == 1 && skip->gang) // fill mwindow->session->drag_auto_gang
2381 for(Track *current = mwindow->edl->tracks->first;
2385 if(current->data_type == skip->data_type &&
2390 FloatAutos *fade_autos = current->automation->fade_autos;
2391 double position = skip->from_units(fauto->position);
2392 FloatAuto *previous = 0, *next = 0;
2394 float init_value = fade_autos->get_value(fauto->position, PLAY_FORWARD, previous, next);
2395 FloatAuto *keyframe;
2396 keyframe = (FloatAuto*)fade_autos->get_auto_at_position(position);
2400 // create keyframe at exactly this point in time
2401 keyframe = (FloatAuto*)fade_autos->insert_auto(fauto->position);
2402 keyframe->value = init_value;
2406 // keyframe exists, just change it
2407 keyframe->value += change;
2410 keyframe->position = fauto->position;
2411 keyframe->control_out_position = fauto->control_out_position;
2412 keyframe->control_in_position = fauto->control_in_position;
2413 keyframe->control_out_value = fauto->control_out_value;
2414 keyframe->control_in_value = fauto->control_in_value;
2416 mwindow->session->drag_auto_gang->append((Auto *)keyframe);
2420 if (fill_gangs == 0) // move the gangs
2424 for (int i = 0; i < mwindow->session->drag_auto_gang->total; i++)
2426 FloatAuto *keyframe = (FloatAuto *)mwindow->session->drag_auto_gang->values[i];
2428 keyframe->value += change;
2429 keyframe->position = fauto->position;
2430 if(skip->data_type == TRACK_AUDIO)
2431 CLAMP(keyframe->value, INFINITYGAIN, MAX_AUDIO_FADE);
2433 CLAMP(keyframe->value, 0, MAX_VIDEO_FADE);
2434 keyframe->control_out_position = fauto->control_out_position;
2435 keyframe->control_in_position = fauto->control_in_position;
2436 keyframe->control_out_value = fauto->control_out_value;
2437 keyframe->control_in_value = fauto->control_in_value;
2441 if (fill_gangs == -1) // remove the gangs
2443 for (int i = 0; i < mwindow->session->drag_auto_gang->total; i++)
2445 FloatAuto *keyframe = (FloatAuto *)mwindow->session->drag_auto_gang->values[i];
2446 keyframe->autos->remove_nonsequential(
2449 mwindow->session->drag_auto_gang->remove_all();
2454 int TrackCanvas::test_floatline(int center_pixel,
2468 int64_t position = (int64_t)(unit_start + cursor_x * zoom_units);
2469 // Call by reference fails for some reason here
2470 FloatAuto *previous = 0, *next = 0;
2471 float value = autos->get_value(position, PLAY_FORWARD, previous, next);
2472 int y = (int)(center_pixel +
2473 (autos->value_to_percentage(value) - 0.5) * -yscale);
2475 if(cursor_x >= x1 &&
2477 cursor_y >= y - HANDLE_W / 2 &&
2478 cursor_y < y + HANDLE_W / 2 &&
2486 mwindow->undo->update_undo_before(_("keyframe"), LOAD_AUTOMATION);
2490 current = mwindow->session->drag_auto = autos->insert_auto(position);
2491 ((FloatAuto*)current)->value = value;
2492 mwindow->session->drag_start_percentage = current->value_to_percentage();
2493 mwindow->session->drag_start_position = current->position;
2494 mwindow->session->drag_origin_x = cursor_x;
2495 mwindow->session->drag_origin_y = cursor_y;
2496 mwindow->session->drag_handle = 0;
2505 void TrackCanvas::draw_toggleline(int center_pixel,
2513 draw_line(x1, center_pixel + y1 + 1, x2, center_pixel + y1 + 1);
2515 draw_line(x1, center_pixel + y1, x2, center_pixel + y1);
2520 draw_line(x2 + 1, center_pixel + y1, x2 + 1, center_pixel + y2);
2522 draw_line(x2, center_pixel + y1, x2, center_pixel + y2);
2526 int TrackCanvas::test_toggleline(Autos *autos,
2537 if(cursor_x >= x1 && cursor_x < x2)
2539 int miny = center_pixel + y1 - HANDLE_W / 2;
2540 int maxy = center_pixel + y1 + HANDLE_W / 2;
2541 if(cursor_y >= miny && cursor_y < maxy)
2547 mwindow->undo->update_undo_before(_("keyframe"), LOAD_AUTOMATION);
2551 double position = (double)(cursor_x +
2552 mwindow->edl->local_session->view_start) *
2553 mwindow->edl->local_session->zoom_sample /
2554 mwindow->edl->session->sample_rate;
2555 int64_t unit_position = autos->track->to_units(position, 0);
2556 int new_value = (int)((IntAutos*)autos)->get_automation_constant(unit_position, unit_position);
2558 current = mwindow->session->drag_auto = autos->insert_auto(unit_position);
2559 ((IntAuto*)current)->value = new_value;
2560 mwindow->session->drag_start_percentage = current->value_to_percentage();
2561 mwindow->session->drag_start_position = current->position;
2562 mwindow->session->drag_origin_x = cursor_x;
2563 mwindow->session->drag_origin_y = cursor_y;
2571 void TrackCanvas::calculate_viewport(Track *track,
2572 double &view_start, // Seconds
2574 double &view_end, // Seconds
2578 double &zoom_sample,
2581 view_start = (double)mwindow->edl->local_session->view_start *
2582 mwindow->edl->local_session->zoom_sample /
2583 mwindow->edl->session->sample_rate;
2584 unit_start = track->to_doubleunits(view_start);
2585 view_end = (double)(mwindow->edl->local_session->view_start +
2587 mwindow->edl->local_session->zoom_sample /
2588 mwindow->edl->session->sample_rate;
2589 unit_end = track->to_doubleunits(view_end);
2590 yscale = mwindow->edl->local_session->zoom_track;
2591 center_pixel = (int)(track->y_pixel + yscale / 2) +
2592 (mwindow->edl->session->show_titles ?
2593 mwindow->theme->title_bg_data->get_h() :
2595 zoom_sample = mwindow->edl->local_session->zoom_sample;
2597 zoom_units = track->to_doubleunits(zoom_sample / mwindow->edl->session->sample_rate);
2600 int TrackCanvas::do_float_autos(Track *track,
2607 Auto * &auto_instance)
2619 double ax, ay, ax2, ay2;
2620 double in_x2, in_y2, out_x2, out_y2;
2627 calculate_viewport(track,
2639 // Get first auto before start
2642 for(current = autos->last;
2643 current && current->position >= unit_start;
2649 ax = (double)(current->position - unit_start) / zoom_units;
2650 ay = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
2655 current = autos->first ? autos->first : autos->default_auto;
2659 ay = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
2669 //printf("TrackCanvas::do_float_autos 1\n");
2680 ax2 = (double)(current->position - unit_start) / zoom_units;
2681 ay2 = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
2682 in_x2 = (double)(current->position +
2683 ((FloatAuto*)current)->control_in_position -
2686 in_y2 = (((FloatAuto*)current)->invalue_to_percentage() - 0.5) * -yscale;
2687 out_x2 = (double)(current->position +
2688 ((FloatAuto*)current)->control_out_position -
2691 out_y2 = (((FloatAuto*)current)->outvalue_to_percentage() - 0.5) * -yscale;
2700 slope = (ay2 - ay) / (ax2 - ax);
2706 ay2 = ay + slope * (get_w() - ax);
2711 ay = ay + slope * (0 - ax);
2729 if(current && !result)
2731 if(current != autos->default_auto)
2736 result = test_floatauto(current,
2749 auto_instance = current;
2753 draw_floatauto(current,
2770 // Draw joining line
2775 if(track->record && buttonpress != 3)
2777 result = test_floatline(center_pixel,
2783 // Exclude auto coverage from the end of the line. The auto overlaps
2784 (int)ax2 - HANDLE_W / 2,
2792 draw_floatline(center_pixel,
2793 (FloatAuto*)previous,
2794 (FloatAuto*)current,
2822 current->position <= unit_end &&
2825 //printf("TrackCanvas::do_float_autos 100\n");
2834 if(ax < get_w() && !result)
2840 if(track->record && buttonpress != 3)
2842 result = test_floatline(center_pixel,
2855 draw_floatline(center_pixel,
2856 (FloatAuto*)previous,
2857 (FloatAuto*)current,
2880 int TrackCanvas::do_toggle_autos(Track *track,
2887 Auto * &auto_instance)
2898 double ax, ay, ax2, ay2;
2902 calculate_viewport(track,
2913 double high = -yscale * 0.8 / 2;
2914 double low = yscale * 0.8 / 2;
2916 // Get first auto before start
2918 for(current = autos->last; current && current->position >= unit_start; current = PREVIOUS)
2924 ay = ((IntAuto*)current)->value > 0 ? high : low;
2929 current = autos->first ? autos->first : autos->default_auto;
2933 ay = ((IntAuto*)current)->value > 0 ? high : low;
2946 ax2 = (double)(current->position - unit_start) / zoom_units;
2947 ay2 = ((IntAuto*)current)->value > 0 ? high : low;
2955 if(ax2 > get_w()) ax2 = get_w();
2957 if(current && !result)
2959 if(current != autos->default_auto)
2965 result = test_auto(current,
2974 auto_instance = current;
2993 if(track->record && buttonpress != 3)
2995 result = test_toggleline(autos,
3008 draw_toggleline(center_pixel,
3017 }while(current && current->position <= unit_end && !result);
3019 if(ax < get_w() && !result)
3025 if(track->record && buttonpress != 3)
3027 result = test_toggleline(autos,
3039 draw_toggleline(center_pixel,
3049 int TrackCanvas::do_autos(Track *track,
3056 Auto * &auto_instance)
3069 calculate_viewport(track,
3082 for(current = autos->first; current && !result; current = NEXT)
3084 if(current->position >= unit_start && current->position < unit_end)
3087 x = (int64_t)((double)(current->position - unit_start) /
3088 zoom_units - (pixmap->get_w() / 2 + 0.5));
3089 y = center_pixel - pixmap->get_h() / 2;
3093 if(cursor_x >= x && cursor_y >= y &&
3094 cursor_x < x + pixmap->get_w() &&
3095 cursor_y < y + pixmap->get_h())
3098 auto_instance = current;
3100 if(buttonpress && (buttonpress != 3))
3102 mwindow->session->drag_auto = current;
3103 mwindow->session->drag_start_position = current->position;
3104 mwindow->session->drag_origin_x = cursor_x;
3105 mwindow->session->drag_origin_y = cursor_y;
3107 double position = autos->track->from_units(current->position);
3108 double center = (mwindow->edl->local_session->selectionstart +
3109 mwindow->edl->local_session->selectionend) /
3114 mwindow->edl->local_session->selectionstart = position;
3115 mwindow->edl->local_session->selectionend = position;
3118 if(position < center)
3120 mwindow->edl->local_session->selectionstart = position;
3123 mwindow->edl->local_session->selectionend = position;
3128 draw_pixmap(pixmap, x, y);
3134 // so this means it is always >0 when keyframe is found
3135 int TrackCanvas::do_plugin_autos(Track *track,
3140 Plugin* &keyframe_plugin,
3141 KeyFrame* &keyframe_instance)
3154 if(!track->expand_view) return 0;
3156 calculate_viewport(track,
3168 for(int i = 0; i < track->plugin_set.total && !result; i++)
3170 PluginSet *plugin_set = track->plugin_set.values[i];
3171 int center_pixel = (int)(track->y_pixel +
3172 mwindow->edl->local_session->zoom_track +
3173 (i + 0.5) * mwindow->theme->plugin_bg_data->get_h() +
3174 (mwindow->edl->session->show_titles ? mwindow->theme->title_bg_data->get_h() : 0));
3176 for(Plugin *plugin = (Plugin*)plugin_set->first;
3178 plugin = (Plugin*)plugin->next)
3180 for(KeyFrame *keyframe = (KeyFrame*)plugin->keyframes->first;
3181 keyframe && !result;
3182 keyframe = (KeyFrame*)keyframe->next)
3184 //printf("TrackCanvas::draw_plugin_autos 3 %d\n", keyframe->position);
3185 if(keyframe->position >= unit_start && keyframe->position < unit_end)
3187 int64_t x = (int64_t)((keyframe->position - unit_start) / zoom_units);
3188 int y = center_pixel - keyframe_pixmap->get_h() / 2;
3190 //printf("TrackCanvas::draw_plugin_autos 4 %d %d\n", x, center_pixel);
3193 if(cursor_x >= x && cursor_y >= y &&
3194 cursor_x < x + keyframe_pixmap->get_w() &&
3195 cursor_y < y + keyframe_pixmap->get_h())
3198 keyframe_plugin = plugin;
3199 keyframe_instance = keyframe;
3203 mwindow->session->drag_auto = keyframe;
3204 mwindow->session->drag_start_position = keyframe->position;
3205 mwindow->session->drag_origin_x = cursor_x;
3206 mwindow->session->drag_origin_y = cursor_y;
3208 double position = track->from_units(keyframe->position);
3209 double center = (mwindow->edl->local_session->selectionstart +
3210 mwindow->edl->local_session->selectionend) /
3215 mwindow->edl->local_session->selectionstart = position;
3216 mwindow->edl->local_session->selectionend = position;
3219 if(position < center)
3221 mwindow->edl->local_session->selectionstart = position;
3224 mwindow->edl->local_session->selectionend = position;
3229 draw_pixmap(keyframe_pixmap,
3236 //printf("TrackCanvas::draw_plugin_autos 5\n");
3240 void TrackCanvas::draw_overlays()
3242 int new_cursor, update_cursor, rerender;
3243 //TRACE("TrackCanvas::draw_overlays 1")
3245 // Move background pixmap to foreground pixmap
3246 draw_pixmap(background_pixmap,
3253 //TRACE("TrackCanvas::draw_overlays 10")
3256 draw_inout_points();
3258 //TRACE("TrackCanvas::draw_overlays 11");
3260 if(mwindow->edl->session->auto_conf->transitions) draw_transitions();
3262 //TRACE("TrackCanvas::draw_overlays 12");
3266 //TRACE("TrackCanvas::draw_overlays 13");
3269 draw_brender_start();
3271 //TRACE("TrackCanvas::draw_overlays 14");
3272 // Highlighted areas
3273 draw_highlighting();
3275 //TRACE("TrackCanvas::draw_overlays 15");
3285 //TRACE("TrackCanvas::draw_overlays 16\n");
3287 if(gui->cursor) gui->cursor->restore();
3289 //TRACE("TrackCanvas::draw_overlays 17\n");
3293 //TRACE("TrackCanvas::draw_overlays 20");
3295 draw_playback_cursor();
3299 int TrackCanvas::activate()
3303 get_top_level()->deactivate();
3305 set_active_subwindow(this);
3306 gui->cursor->activate();
3311 int TrackCanvas::deactivate()
3316 gui->cursor->deactivate();
3322 void TrackCanvas::update_drag_handle()
3324 double new_position;
3327 (double)(get_cursor_x() + mwindow->edl->local_session->view_start) *
3328 mwindow->edl->local_session->zoom_sample /
3329 mwindow->edl->session->sample_rate;
3331 mwindow->edl->align_to_frame(new_position, 0);
3334 if(new_position != mwindow->session->drag_position)
3336 mwindow->session->drag_position = new_position;
3337 gui->mainclock->update(new_position);
3338 // Que the CWindow. Doesn't do anything if selectionstart and selection end
3340 // mwindow->cwindow->update(1, 0, 0);
3344 int TrackCanvas::update_drag_edit()
3353 #define UPDATE_DRAG_HEAD(do_clamp) \
3355 int x = cursor_x - mwindow->session->drag_origin_x; \
3356 int y = cursor_y - mwindow->session->drag_origin_y; \
3358 if(!current->autos->track->record) return 0; \
3359 double view_start; \
3360 double unit_start; \
3365 double zoom_sample; \
3366 double zoom_units; \
3368 mwindow->undo->update_undo_before(_("tweek"), LOAD_AUTOMATION); \
3369 calculate_viewport(current->autos->track, \
3379 float percentage = (float)(mwindow->session->drag_origin_y - cursor_y) / \
3380 MAX(128, yscale) + \
3381 mwindow->session->drag_start_percentage; \
3382 if(do_clamp) CLAMP(percentage, 0, 1); \
3384 int64_t position = Units::to_int64(zoom_units * \
3385 (cursor_x - mwindow->session->drag_origin_x) + \
3386 mwindow->session->drag_start_position); \
3388 if((do_clamp) && position < 0) position = 0;
3398 int TrackCanvas::update_drag_floatauto(int cursor_x, int cursor_y)
3400 FloatAuto *current = (FloatAuto*)mwindow->session->drag_auto;
3402 UPDATE_DRAG_HEAD(mwindow->session->drag_handle == 0);
3406 //printf("TrackCanvas::update_drag_floatauto %ld %d\n",
3408 //mwindow->session->drag_handle);
3410 switch(mwindow->session->drag_handle)
3414 // Snap to nearby values
3415 old_value = current->value;
3422 value = ((FloatAuto*)current)->percentage_to_value(percentage);
3424 if(current->previous)
3426 value1 = ((FloatAuto*)current->previous)->value;
3427 distance1 = fabs(value - value1);
3428 current->value = value1;
3433 value2 = ((FloatAuto*)current->next)->value;
3434 distance2 = fabs(value - value2);
3435 if(!current->previous || distance2 < distance1)
3437 current->value = value2;
3441 if(!current->previous && !current->next)
3443 current->value = ((FloatAutos*)current->autos)->default_;
3445 value = current->value;
3448 value = ((FloatAuto*)current)->percentage_to_value(percentage);
3450 //printf("TrackCanvas::update_drag_floatauto 1 %f\n", value);
3451 if(value != old_value || position != current->position)
3454 float change = value - old_value;
3455 current->value = value;
3456 current->position = position;
3457 synchronize_autos(change, current->autos->track, current, 0);
3459 char string[BCTEXTLEN], string2[BCTEXTLEN];
3460 Units::totext(string2,
3461 current->autos->track->from_units(current->position),
3462 mwindow->edl->session->time_format,
3463 mwindow->edl->session->sample_rate,
3464 mwindow->edl->session->frame_rate,
3465 mwindow->edl->session->frames_per_foot);
3466 sprintf(string, "%s, %.2f", string2, current->value);
3467 gui->show_message(string);
3473 value = ((FloatAuto*)current)->percentage_to_invalue(percentage);
3474 position = MIN(0, position);
3475 if(value != current->control_in_value ||
3476 position != current->control_in_position)
3479 current->control_in_value = value;
3480 current->control_in_position = position;
3481 synchronize_autos(0, current->autos->track, current, 0);
3483 char string[BCTEXTLEN], string2[BCTEXTLEN];
3484 Units::totext(string2,
3485 current->autos->track->from_units(current->control_in_position),
3486 mwindow->edl->session->time_format,
3487 mwindow->edl->session->sample_rate,
3488 mwindow->edl->session->frame_rate,
3489 mwindow->edl->session->frames_per_foot);
3490 sprintf(string, "%s, %.2f", string2, current->control_in_value);
3491 gui->show_message(string);
3497 value = ((FloatAuto*)current)->percentage_to_outvalue(percentage);
3498 position = MAX(0, position);
3499 if(value != current->control_out_value ||
3500 position != current->control_out_position)
3503 current->control_out_value = value;
3504 current->control_out_position = position;
3505 synchronize_autos(0, current->autos->track, current, 0);
3507 char string[BCTEXTLEN], string2[BCTEXTLEN];
3508 Units::totext(string2,
3509 current->autos->track->from_units(
3510 ((FloatAuto*)current)->control_out_position),
3511 mwindow->edl->session->time_format,
3512 mwindow->edl->session->sample_rate,
3513 mwindow->edl->session->frame_rate,
3514 mwindow->edl->session->frames_per_foot);
3515 sprintf(string, "%s, %.2f",
3517 ((FloatAuto*)current)->control_out_value);
3518 gui->show_message(string);
3526 int TrackCanvas::update_drag_toggleauto(int cursor_x, int cursor_y)
3528 IntAuto *current = (IntAuto*)mwindow->session->drag_auto;
3530 UPDATE_DRAG_HEAD(1);
3532 int value = ((IntAuto*)current)->percentage_to_value(percentage);
3534 if(value != current->value || position != current->position)
3537 current->value = value;
3538 current->position = position;
3540 char string[BCTEXTLEN], string2[BCTEXTLEN];
3541 Units::totext(string2,
3542 current->autos->track->from_units(current->position),
3543 mwindow->edl->session->time_format,
3544 mwindow->edl->session->sample_rate,
3545 mwindow->edl->session->frame_rate,
3546 mwindow->edl->session->frames_per_foot);
3547 sprintf(string, "%s, %d", string2, current->value);
3548 gui->show_message(string);
3554 // Autos which can't change value through dragging.
3556 int TrackCanvas::update_drag_auto(int cursor_x, int cursor_y)
3558 Auto *current = (Auto*)mwindow->session->drag_auto;
3561 if(position != current->position)
3564 current->position = position;
3566 char string[BCTEXTLEN];
3567 Units::totext(string,
3568 current->autos->track->from_units(current->position),
3569 mwindow->edl->session->time_format,
3570 mwindow->edl->session->sample_rate,
3571 mwindow->edl->session->frame_rate,
3572 mwindow->edl->session->frames_per_foot);
3573 gui->show_message(string);
3575 double position_f = current->autos->track->from_units(current->position);
3576 double center_f = (mwindow->edl->local_session->selectionstart +
3577 mwindow->edl->local_session->selectionend) /
3581 mwindow->edl->local_session->selectionstart = position_f;
3582 mwindow->edl->local_session->selectionend = position_f;
3585 if(position_f < center_f)
3587 mwindow->edl->local_session->selectionstart = position_f;
3590 mwindow->edl->local_session->selectionend = position_f;
3597 int TrackCanvas::update_drag_pluginauto(int cursor_x, int cursor_y)
3599 KeyFrame *current = (KeyFrame*)mwindow->session->drag_auto;
3602 if(position != current->position)
3604 // printf("uida: autos: %p, track: %p ta: %p\n", current->autos, current->autos->track, current->autos->track->automation);
3605 Track *track = current->autos->track;
3606 PluginAutos *pluginautos = (PluginAutos *)current->autos;
3607 PluginSet *pluginset;
3609 // figure out the correct pluginset & correct plugin
3611 for(int i = 0; i < track->plugin_set.total; i++)
3613 pluginset = track->plugin_set.values[i];
3614 for(plugin = (Plugin *)pluginset->first; plugin; plugin = (Plugin *)plugin->next)
3616 KeyFrames *keyframes = plugin->keyframes;
3617 for(KeyFrame *currentkeyframe = (KeyFrame *)keyframes->first; currentkeyframe; currentkeyframe = (KeyFrame *) currentkeyframe->next)
3619 if (currentkeyframe == current)
3631 mwindow->session->plugin_highlighted = plugin;
3632 mwindow->session->track_highlighted = track;
3634 current->position = position;
3636 char string[BCTEXTLEN];
3637 Units::totext(string,
3638 current->autos->track->from_units(current->position),
3639 mwindow->edl->session->time_format,
3640 mwindow->edl->session->sample_rate,
3641 mwindow->edl->session->frame_rate,
3642 mwindow->edl->session->frames_per_foot);
3643 gui->show_message(string);
3645 double position_f = current->autos->track->from_units(current->position);
3646 double center_f = (mwindow->edl->local_session->selectionstart +
3647 mwindow->edl->local_session->selectionend) /
3651 mwindow->edl->local_session->selectionstart = position_f;
3652 mwindow->edl->local_session->selectionend = position_f;
3655 if(position_f < center_f)
3657 mwindow->edl->local_session->selectionstart = position_f;
3660 mwindow->edl->local_session->selectionend = position_f;
3667 void TrackCanvas::update_drag_caption()
3669 switch(mwindow->session->current_operation)
3679 int TrackCanvas::cursor_motion_event()
3681 int result, cursor_x, cursor_y;
3682 int update_clock = 0;
3683 int update_zoom = 0;
3684 int update_scroll = 0;
3685 int update_overlay = 0;
3686 int update_cursor = 0;
3689 double position = 0;
3690 //printf("TrackCanvas::cursor_motion_event 1\n");
3694 switch(mwindow->edl->session->editing_mode)
3696 case EDITING_ARROW: new_cursor = ARROW_CURSOR; break;
3697 case EDITING_IBEAM: new_cursor = IBEAM_CURSOR; break;
3700 switch(mwindow->session->current_operation)
3702 case DRAG_EDITHANDLE1:
3703 // Outside threshold. Upgrade status
3704 //printf("TrackCanvas::cursor_motion_event 1\n");
3705 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
3707 //printf("TrackCanvas::cursor_motion_event 2\n");
3708 mwindow->session->current_operation = DRAG_EDITHANDLE2;
3713 case DRAG_EDITHANDLE2:
3714 update_drag_handle();
3718 case DRAG_PLUGINHANDLE1:
3719 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
3721 //printf("TrackCanvas::cursor_motion_event 2\n");
3722 mwindow->session->current_operation = DRAG_PLUGINHANDLE2;
3727 case DRAG_PLUGINHANDLE2:
3728 update_drag_handle();
3732 // Rubber band curves
3734 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
3738 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
3742 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
3746 rerender = update_overlay = update_drag_toggleauto(get_cursor_x(), get_cursor_y());
3750 rerender = update_overlay = update_drag_toggleauto(get_cursor_x(), get_cursor_y());
3753 // Keyframe icons are sticky
3755 case DRAG_CAMERA_PRE:
3758 case DRAG_PROJECTOR_PRE:
3759 case DRAG_PLUGINKEY_PRE:
3760 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
3762 //printf("TrackCanvas::cursor_motion_event 2\n");
3763 mwindow->session->current_operation++;
3772 case DRAG_PROJECTOR:
3773 rerender = update_overlay =
3774 update_drag_auto(get_cursor_x(), get_cursor_y());
3776 case DRAG_PLUGINKEY:
3777 rerender = update_overlay =
3778 update_drag_pluginauto(get_cursor_x(), get_cursor_y());
3783 cursor_x = get_cursor_x();
3784 cursor_y = get_cursor_y();
3785 position = (double)(cursor_x + mwindow->edl->local_session->view_start) *
3786 mwindow->edl->local_session->zoom_sample /
3787 mwindow->edl->session->sample_rate;
3789 position = mwindow->edl->align_to_frame(position, 0);
3790 position = MAX(position, 0);
3792 if(position < selection_midpoint1)
3794 mwindow->edl->local_session->selectionend = selection_midpoint1;
3795 mwindow->edl->local_session->selectionstart = position;
3797 mwindow->cwindow->update(1, 0, 0, 0, 1);
3798 // Update the faders
3799 mwindow->update_plugin_guis();
3800 gui->patchbay->update();
3804 mwindow->edl->local_session->selectionstart = selection_midpoint1;
3805 mwindow->edl->local_session->selectionend = position;
3806 // Don't que the CWindow
3808 //printf("TrackCanvas::cursor_motion_event 1 %f %f %f\n", position, mwindow->edl->local_session->selectionstart, mwindow->edl->local_session->selectionend);
3810 gui->cursor->hide();
3811 gui->cursor->draw();
3821 if(is_event_win() && cursor_inside())
3824 cursor_x = get_cursor_x();
3825 position = (double)cursor_x *
3826 (double)mwindow->edl->local_session->zoom_sample /
3827 (double)mwindow->edl->session->sample_rate +
3828 (double)mwindow->edl->local_session->view_start *
3829 (double)mwindow->edl->local_session->zoom_sample /
3830 (double)mwindow->edl->session->sample_rate;
3831 position = mwindow->edl->align_to_frame(position, 0);
3835 if(mwindow->edl->session->auto_conf->transitions &&
3836 test_transitions(get_cursor_x(),
3846 if(do_keyframes(get_cursor_x(),
3858 if(test_edit_handles(get_cursor_x(),
3867 // Plugin boundaries
3868 if(test_plugin_handles(get_cursor_x(),
3877 if(test_edits(get_cursor_x(),
3892 //printf("TrackCanvas::cursor_motion_event 1\n");
3893 if(update_cursor && new_cursor != get_cursor())
3895 set_cursor(new_cursor);
3898 //printf("TrackCanvas::cursor_motion_event 1 %d\n", rerender);
3901 mwindow->restart_brender();
3902 mwindow->sync_parameters(CHANGE_PARAMS);
3903 mwindow->update_plugin_guis();
3904 mwindow->cwindow->update(1, 0, 0, 0, 1);
3906 gui->patchbay->update();
3912 if(!mwindow->cwindow->playback_engine->is_playing_back)
3913 gui->mainclock->update(position);
3918 gui->zoombar->update();
3924 (cursor_x >= get_w() || cursor_x < 0 || cursor_y >= get_h() || cursor_y < 0))
3928 (cursor_x < get_w() && cursor_x >= 0 && cursor_y < get_h() && cursor_y >= 0))
3940 //printf("TrackCanvas::cursor_motion_event 100\n");
3944 void TrackCanvas::start_dragscroll()
3949 set_repeat(BC_WindowBase::get_resources()->scroll_repeat);
3950 //printf("TrackCanvas::start_dragscroll 1\n");
3954 void TrackCanvas::stop_dragscroll()
3959 unset_repeat(BC_WindowBase::get_resources()->scroll_repeat);
3960 //printf("TrackCanvas::stop_dragscroll 1\n");
3964 int TrackCanvas::repeat_event(int64_t duration)
3966 if(!drag_scroll) return 0;
3967 if(duration != BC_WindowBase::get_resources()->scroll_repeat) return 0;
3969 int sample_movement = 0;
3970 int track_movement = 0;
3971 int64_t x_distance = 0;
3972 int64_t y_distance = 0;
3973 double position = 0;
3976 switch(mwindow->session->current_operation)
3979 //printf("TrackCanvas::repeat_event 1 %d\n", mwindow->edl->local_session->view_start);
3980 if(get_cursor_x() > get_w())
3982 x_distance = get_cursor_x() - get_w();
3983 sample_movement = 1;
3986 if(get_cursor_x() < 0)
3988 x_distance = get_cursor_x();
3989 sample_movement = 1;
3992 if(get_cursor_y() > get_h())
3994 y_distance = get_cursor_y() - get_h();
3998 if(get_cursor_y() < 0)
4000 y_distance = get_cursor_y();
4010 position = (double)(get_cursor_x() +
4011 mwindow->edl->local_session->view_start +
4013 mwindow->edl->local_session->zoom_sample /
4014 mwindow->edl->session->sample_rate;
4015 position = mwindow->edl->align_to_frame(position, 0);
4016 position = MAX(position, 0);
4018 //printf("TrackCanvas::repeat_event 1 %f\n", position);
4019 switch(mwindow->session->current_operation)
4022 if(position < selection_midpoint1)
4024 mwindow->edl->local_session->selectionend = selection_midpoint1;
4025 mwindow->edl->local_session->selectionstart = position;
4027 mwindow->cwindow->update(1, 0, 0);
4028 // Update the faders
4029 mwindow->update_plugin_guis();
4030 gui->patchbay->update();
4034 mwindow->edl->local_session->selectionstart = selection_midpoint1;
4035 mwindow->edl->local_session->selectionend = position;
4036 // Don't que the CWindow
4041 mwindow->samplemovement(mwindow->edl->local_session->view_start +
4047 mwindow->trackmovement(mwindow->edl->local_session->track_start +
4054 int TrackCanvas::button_release_event()
4056 int redraw = 0, update_overlay = 0, result = 0;
4058 switch(mwindow->session->current_operation)
4060 case DRAG_EDITHANDLE2:
4061 mwindow->session->current_operation = NO_OPERATION;
4065 end_edithandle_selection();
4068 case DRAG_EDITHANDLE1:
4069 mwindow->session->current_operation = NO_OPERATION;
4074 case DRAG_PLUGINHANDLE2:
4075 mwindow->session->current_operation = NO_OPERATION;
4079 end_pluginhandle_selection();
4082 case DRAG_PLUGINHANDLE1:
4083 mwindow->session->current_operation = NO_OPERATION;
4089 synchronize_autos(0, 0, 0, -1); // delete the drag_auto_gang first and remove out of order keys
4098 case DRAG_PROJECTOR:
4099 case DRAG_PLUGINKEY:
4100 mwindow->session->current_operation = NO_OPERATION;
4101 mwindow->session->drag_handle = 0;
4102 // Remove any out-of-order keyframe
4103 if(mwindow->session->drag_auto)
4105 mwindow->session->drag_auto->autos->remove_nonsequential(
4106 mwindow->session->drag_auto);
4107 // mwindow->session->drag_auto->autos->optimize();
4110 mwindow->undo->update_undo_after();
4115 case DRAG_AEFFECT_COPY:
4116 case DRAG_VEFFECT_COPY:
4117 // Trap in drag stop
4123 if(mwindow->session->current_operation)
4125 mwindow->session->current_operation = NO_OPERATION;
4127 // Traps button release events
4133 cursor_motion_event();
4149 int TrackCanvas::test_edit_handles(int cursor_x,
4155 Edit *edit_result = 0;
4156 int handle_result = 0;
4159 for(Track *track = mwindow->edl->tracks->first;
4161 track = track->next)
4163 for(Edit *edit = track->edits->first;
4167 int64_t edit_x, edit_y, edit_w, edit_h;
4168 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
4170 if(cursor_x >= edit_x && cursor_x <= edit_x + edit_w &&
4171 cursor_y >= edit_y && cursor_y < edit_y + edit_h)
4173 if(cursor_x < edit_x + HANDLE_W)
4180 if(cursor_x >= edit_x + edit_w - HANDLE_W)
4198 if(handle_result == 0)
4200 position = edit_result->track->from_units(edit_result->startproject);
4201 new_cursor = LEFT_CURSOR;
4204 if(handle_result == 1)
4206 position = edit_result->track->from_units(edit_result->startproject + edit_result->length);
4207 new_cursor = RIGHT_CURSOR;
4210 // Reposition cursor
4213 mwindow->session->drag_edit = edit_result;
4214 mwindow->session->drag_handle = handle_result;
4215 mwindow->session->drag_button = get_buttonpress() - 1;
4216 mwindow->session->drag_position = position;
4217 mwindow->session->current_operation = DRAG_EDITHANDLE1;
4218 mwindow->session->drag_origin_x = get_cursor_x();
4219 mwindow->session->drag_origin_y = get_cursor_y();
4220 mwindow->session->drag_start = position;
4222 int rerender = start_selection(position);
4224 mwindow->cwindow->update(1, 0, 0);
4225 gui->timebar->update_highlights();
4226 gui->zoombar->update();
4227 gui->cursor->hide();
4228 gui->cursor->draw();
4238 int TrackCanvas::test_plugin_handles(int cursor_x,
4244 Plugin *plugin_result = 0;
4245 int handle_result = 0;
4248 for(Track *track = mwindow->edl->tracks->first;
4250 track = track->next)
4252 for(int i = 0; i < track->plugin_set.total && !result; i++)
4254 PluginSet *plugin_set = track->plugin_set.values[i];
4255 for(Plugin *plugin = (Plugin*)plugin_set->first;
4257 plugin = (Plugin*)plugin->next)
4259 int64_t plugin_x, plugin_y, plugin_w, plugin_h;
4260 plugin_dimensions(plugin, plugin_x, plugin_y, plugin_w, plugin_h);
4262 if(cursor_x >= plugin_x && cursor_x <= plugin_x + plugin_w &&
4263 cursor_y >= plugin_y && cursor_y < plugin_y + plugin_h)
4265 if(cursor_x < plugin_x + HANDLE_W)
4267 plugin_result = plugin;
4272 if(cursor_x >= plugin_x + plugin_w - HANDLE_W)
4274 plugin_result = plugin;
4281 if(result && shift_down())
4282 mwindow->session->trim_edits = plugin_set;
4286 //printf("TrackCanvas::test_plugin_handles %d %d %d\n", button_press, handle_result, result);
4291 if(handle_result == 0)
4293 position = plugin_result->track->from_units(plugin_result->startproject);
4294 new_cursor = LEFT_CURSOR;
4297 if(handle_result == 1)
4299 position = plugin_result->track->from_units(plugin_result->startproject + plugin_result->length);
4300 new_cursor = RIGHT_CURSOR;
4305 mwindow->session->drag_plugin = plugin_result;
4306 mwindow->session->drag_handle = handle_result;
4307 mwindow->session->drag_button = get_buttonpress() - 1;
4308 mwindow->session->drag_position = position;
4309 mwindow->session->current_operation = DRAG_PLUGINHANDLE1;
4310 mwindow->session->drag_origin_x = get_cursor_x();
4311 mwindow->session->drag_origin_y = get_cursor_y();
4312 mwindow->session->drag_start = position;
4314 int rerender = start_selection(position);
4315 if(rerender) mwindow->cwindow->update(1, 0, 0);
4316 gui->timebar->update_highlights();
4317 gui->zoombar->update();
4318 gui->cursor->hide();
4319 gui->cursor->draw();
4330 int TrackCanvas::test_tracks(int cursor_x,
4335 for(Track *track = mwindow->edl->tracks->first;
4337 track = track->next)
4339 int64_t track_x, track_y, track_w, track_h;
4340 track_dimensions(track, track_x, track_y, track_w, track_h);
4343 get_buttonpress() == 3 &&
4344 cursor_y >= track_y &&
4345 cursor_y < track_y + track_h)
4347 gui->edit_menu->update(track, 0);
4348 gui->edit_menu->activate_menu();
4355 int TrackCanvas::test_edits(int cursor_x,
4365 int over_edit_handle = 0;
4367 //printf("TrackCanvas::test_edits 1\n");
4368 for(Track *track = mwindow->edl->tracks->first;
4370 track = track->next)
4372 for(Edit *edit = track->edits->first;
4376 int64_t edit_x, edit_y, edit_w, edit_h;
4377 //printf("TrackCanvas::test_edits 1\n");
4378 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
4380 // Cursor inside a track
4381 // Cursor inside an edit
4382 if(cursor_x >= edit_x && cursor_x < edit_x + edit_w &&
4383 cursor_y >= edit_y && cursor_y < edit_y + edit_h)
4385 // Select duration of edit
4386 //printf("TrackCanvas::test_edits 2\n");
4389 if(get_double_click() && !drag_start)
4391 //printf("TrackCanvas::test_edits 3\n");
4392 mwindow->edl->local_session->selectionstart =
4393 edit->track->from_units(edit->startproject);
4394 mwindow->edl->local_session->selectionend =
4395 edit->track->from_units(edit->startproject) +
4396 edit->track->from_units(edit->length);
4397 if(mwindow->edl->session->cursor_on_frames)
4399 mwindow->edl->local_session->selectionstart =
4400 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionstart, 0);
4401 mwindow->edl->local_session->selectionend =
4402 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionend, 1);
4410 if(drag_start && track->record)
4412 if(mwindow->edl->session->editing_mode == EDITING_ARROW)
4414 // Need to create drag window
4415 mwindow->session->current_operation = DRAG_EDIT;
4416 mwindow->session->drag_edit = edit;
4417 //printf("TrackCanvas::test_edits 2\n");
4419 // Drag only one edit
4422 mwindow->session->drag_edits->remove_all();
4423 mwindow->session->drag_edits->append(edit);
4426 // Construct list of all affected edits
4428 mwindow->edl->tracks->get_affected_edits(
4429 mwindow->session->drag_edits,
4430 edit->track->from_units(edit->startproject),
4433 mwindow->session->drag_origin_x = cursor_x;
4434 mwindow->session->drag_origin_y = cursor_y;
4436 drag_popup = new BC_DragWindow(gui,
4437 mwindow->theme->clip_icon,
4438 get_abs_cursor_x(0) - mwindow->theme->clip_icon->get_w() / 2,
4439 get_abs_cursor_y(0) - mwindow->theme->clip_icon->get_h() / 2);
4440 //printf("TrackCanvas::test_edits 3 %p\n", drag_popup);
4452 int TrackCanvas::test_resources(int cursor_x, int cursor_y)
4457 int TrackCanvas::test_plugins(int cursor_x,
4470 //printf("TrackCanvas::test_plugins 1\n");
4471 for(track = mwindow->edl->tracks->first;
4473 track = track->next)
4475 if(!track->expand_view) continue;
4478 for(int i = 0; i < track->plugin_set.total && !done; i++)
4480 // first check if plugins are visible at all
4481 if (!track->expand_view)
4483 PluginSet *plugin_set = track->plugin_set.values[i];
4484 for(plugin = (Plugin*)plugin_set->first;
4486 plugin = (Plugin*)plugin->next)
4488 plugin_dimensions(plugin, x, y, w, h);
4489 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
4490 MWindowGUI::visible(y, y + h, 0, get_h()))
4492 if(cursor_x >= x && cursor_x < x + w &&
4493 cursor_y >= y && cursor_y < y + h)
4503 //printf("TrackCanvas::test_plugins 1\n");
4506 // Start plugin popup
4509 //printf("TrackCanvas::test_plugins 2\n");
4510 if(get_buttonpress() == 3)
4512 gui->plugin_menu->update(plugin);
4513 gui->plugin_menu->activate_menu();
4517 // Select range of plugin on doubleclick over plugin
4518 if (get_double_click() && !drag_start)
4520 mwindow->edl->local_session->selectionstart =
4521 plugin->track->from_units(plugin->startproject);
4522 mwindow->edl->local_session->selectionend =
4523 plugin->track->from_units(plugin->startproject) +
4524 plugin->track->from_units(plugin->length);
4525 if(mwindow->edl->session->cursor_on_frames)
4527 mwindow->edl->local_session->selectionstart =
4528 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionstart, 0);
4529 mwindow->edl->local_session->selectionend =
4530 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionend, 1);
4536 //printf("TrackCanvas::test_plugins 3\n");
4540 if(drag_start && plugin->track->record)
4542 //printf("TrackCanvas::test_plugins 4\n");
4543 if(mwindow->edl->session->editing_mode == EDITING_ARROW)
4545 //printf("TrackCanvas::test_plugins 5\n");
4546 if(plugin->track->data_type == TRACK_AUDIO)
4547 mwindow->session->current_operation = DRAG_AEFFECT_COPY;
4549 if(plugin->track->data_type == TRACK_VIDEO)
4550 mwindow->session->current_operation = DRAG_VEFFECT_COPY;
4552 mwindow->session->drag_plugin = plugin;
4553 //printf("TrackCanvas::test_plugins 6\n");
4560 switch(plugin->plugin_type)
4562 case PLUGIN_STANDALONE:
4564 PluginServer *server = mwindow->scan_plugindb(
4566 plugin->track->data_type);
4569 VFrame *frame = server->picon;
4570 //printf("TrackCanvas::test_plugins 7\n");
4571 drag_popup = new BC_DragWindow(gui,
4573 get_abs_cursor_x(0) - frame->get_w() / 2,
4574 get_abs_cursor_y(0) - frame->get_h() / 2);
4579 case PLUGIN_SHAREDPLUGIN:
4580 case PLUGIN_SHAREDMODULE:
4581 drag_popup = new BC_DragWindow(gui,
4582 mwindow->theme->clip_icon,
4583 get_abs_cursor_x(0) - mwindow->theme->clip_icon->get_w() / 2,
4584 get_abs_cursor_y(0) - mwindow->theme->clip_icon->get_h() / 2);
4586 //printf("test plugins %d %p\n", mwindow->edl->session->editing_mode, mwindow->session->drag_plugin);
4589 //printf("TrackCanvas::test_plugins 9 %p\n");
4591 //printf("TrackCanvas::test_plugins 10\n");
4597 //printf("TrackCanvas::test_plugins 11\n");
4601 int TrackCanvas::test_transitions(int cursor_x,
4607 Transition *transition = 0;
4611 for(Track *track = mwindow->edl->tracks->first;
4613 track = track->next)
4615 for(Edit *edit = track->edits->first;
4619 if(edit->transition)
4621 edit_dimensions(edit, x, y, w, h);
4622 get_transition_coords(x, y, w, h);
4624 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
4625 MWindowGUI::visible(y, y + h, 0, get_h()))
4627 if(cursor_x >= x && cursor_x < x + w &&
4628 cursor_y >= y && cursor_y < y + h)
4630 transition = edit->transition;
4644 new_cursor = UPRIGHT_ARROW_CURSOR;
4647 if(get_buttonpress() == 3)
4649 gui->transition_menu->update(transition);
4650 gui->transition_menu->activate_menu();
4657 int TrackCanvas::button_press_event()
4660 int cursor_x, cursor_y;
4661 int new_cursor, update_cursor;
4663 //printf("TrackCanvas::button_press_event 1\n");
4664 cursor_x = get_cursor_x();
4665 cursor_y = get_cursor_y();
4666 mwindow->session->trim_edits = 0;
4668 if(is_event_win() && cursor_inside())
4675 if(get_buttonpress() == 1)
4677 gui->unlock_window();
4678 gui->mbuttons->transport->handle_transport(STOP, 1);
4679 gui->lock_window("TrackCanvas::button_press_event");
4682 int update_overlay = 0, update_cursor = 0, rerender = 0;
4684 if(get_buttonpress() == 4)
4686 //printf("TrackCanvas::button_press_event 1\n");
4687 mwindow->move_up(get_h() / 10);
4691 if(get_buttonpress() == 5)
4693 //printf("TrackCanvas::button_press_event 2\n");
4694 mwindow->move_down(get_h() / 10);
4698 switch(mwindow->edl->session->editing_mode)
4700 // Test handles and resource boundaries and highlight a track
4705 if(mwindow->edl->session->auto_conf->transitions &&
4706 test_transitions(cursor_x,
4715 if(do_keyframes(cursor_x,
4726 // Test edit boundaries
4727 if(test_edit_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
4732 // Test plugin boundaries
4733 if(test_plugin_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
4738 if(test_edits(cursor_x, cursor_y, 1, 0, update_cursor, rerender, new_cursor, update_cursor))
4743 if(test_plugins(cursor_x, cursor_y, 0, 1, update_cursor, rerender))
4748 if(test_resources(cursor_x, cursor_y))
4753 if(test_tracks(cursor_x, cursor_y, 1))
4760 // Test handles only and select a region
4763 double position = (double)cursor_x *
4764 mwindow->edl->local_session->zoom_sample /
4765 mwindow->edl->session->sample_rate +
4766 (double)mwindow->edl->local_session->view_start *
4767 mwindow->edl->local_session->zoom_sample /
4768 mwindow->edl->session->sample_rate;
4769 //printf("TrackCanvas::button_press_event %d\n", position);
4771 if(mwindow->edl->session->auto_conf->transitions &&
4772 test_transitions(cursor_x,
4781 if(do_keyframes(cursor_x,
4793 // Test edit boundaries
4794 if(test_edit_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
4799 // Test plugin boundaries
4800 if(test_plugin_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
4805 if(test_edits(cursor_x, cursor_y, 1, 0, update_cursor, rerender, new_cursor, update_cursor))
4810 if(test_plugins(cursor_x, cursor_y, 0, 1, update_cursor, rerender))
4815 if(test_tracks(cursor_x, cursor_y, 1))
4819 // Highlight selection
4822 rerender = start_selection(position);
4823 mwindow->session->current_operation = SELECT_REGION;
4834 mwindow->cwindow->update(1, 0, 0, 0, 1);
4836 mwindow->update_plugin_guis();
4837 gui->patchbay->update();
4848 gui->timebar->update_highlights();
4849 gui->cursor->hide();
4850 gui->cursor->show();
4851 gui->zoombar->update();
4862 int TrackCanvas::start_selection(double position)
4865 position = mwindow->edl->align_to_frame(position, 0);
4870 double midpoint = (mwindow->edl->local_session->selectionstart +
4871 mwindow->edl->local_session->selectionend) / 2;
4873 if(position < midpoint)
4875 mwindow->edl->local_session->selectionstart = position;
4876 selection_midpoint1 = mwindow->edl->local_session->selectionend;
4882 mwindow->edl->local_session->selectionend = position;
4883 selection_midpoint1 = mwindow->edl->local_session->selectionstart;
4884 // Don't que the CWindow for the end
4888 // Start a new selection
4890 //printf("TrackCanvas::start_selection %f\n", position);
4891 mwindow->edl->local_session->selectionstart =
4892 mwindow->edl->local_session->selectionend =
4894 selection_midpoint1 = position;
4902 void TrackCanvas::end_edithandle_selection()
4904 mwindow->modify_edithandles();
4907 void TrackCanvas::end_pluginhandle_selection()
4909 mwindow->modify_pluginhandles();
4913 double TrackCanvas::time_visible()
4915 return (double)get_w() *
4916 mwindow->edl->local_session->zoom_sample /
4917 mwindow->edl->session->sample_rate;
4960 void TrackCanvas::draw_automation()
4965 int TrackCanvas::set_index_file(int flash, Asset *asset)
4971 int TrackCanvas::button_release()
4977 int TrackCanvas::auto_reposition(int &cursor_x, int &cursor_y, int64_t cursor_position)
4983 int TrackCanvas::draw_floating_handle(int flash)
4988 int TrackCanvas::draw_loop_point(int64_t position, int flash)
4993 int TrackCanvas::draw_playback_cursor(int pixel, int flash)
4999 int TrackCanvas::update_handle_selection(int64_t cursor_position)
5004 int TrackCanvas::end_translation()