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();
315 if(get_cursor_over_window() &&
318 cursor_x < get_w() &&
321 // Find the edit and track the cursor is over
322 for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
324 int64_t track_x, track_y, track_w, track_h;
325 track_dimensions(track, track_x, track_y, track_w, track_h);
327 if(cursor_y >= track_y &&
328 cursor_y < track_y + track_h)
331 for(Edit *edit = track->edits->first; edit; edit = edit->next)
333 int64_t edit_x, edit_y, edit_w, edit_h;
334 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
336 if(cursor_x >= edit_x &&
337 cursor_y >= edit_y &&
338 cursor_x < edit_x + edit_w &&
339 cursor_y < edit_y + edit_h)
346 for(int i = 0; i < track->plugin_set.total; i++)
348 PluginSet *pluginset = track->plugin_set.values[i];
352 for(Plugin *plugin = (Plugin*)pluginset->first;
354 plugin = (Plugin*)plugin->next)
356 int64_t plugin_x, plugin_y, plugin_w, plugin_h;
357 plugin_dimensions(plugin, plugin_x, plugin_y, plugin_w, plugin_h);
359 if(cursor_y >= plugin_y &&
360 cursor_y < plugin_y + plugin_h)
362 over_pluginset = plugin->plugin_set;
364 if(cursor_x >= plugin_x &&
365 cursor_x < plugin_x + plugin_w)
367 over_plugin = plugin;
378 if(mwindow->session->track_highlighted != over_track)
380 mwindow->session->track_highlighted = over_track;
384 if(mwindow->session->edit_highlighted != over_edit)
386 mwindow->session->edit_highlighted = over_edit;
390 if(mwindow->session->pluginset_highlighted != over_pluginset)
392 mwindow->session->pluginset_highlighted = over_pluginset;
396 if(mwindow->session->plugin_highlighted != over_plugin)
398 mwindow->session->plugin_highlighted = over_plugin;
402 //printf("TrackCanvas::drag_motion 2 %p\n", mwindow->session->track_highlighted);
405 lock_window("TrackCanvas::drag_motion");
414 int TrackCanvas::drag_start_event()
419 int new_cursor, update_cursor;
421 if(mwindow->session->current_operation != NO_OPERATION) return 0;
425 if(test_plugins(get_drag_x(),
435 if(test_edits(get_drag_x(),
451 int TrackCanvas::drag_motion_event()
453 return drag_motion();
456 int TrackCanvas::cursor_leave_event()
458 // because drag motion calls get_cursor_over_window we can be sure that
459 // all highlights get deleted now
465 int TrackCanvas::drag_stop_event()
467 int result = drag_stop();
478 int TrackCanvas::drag_stop()
480 // In most cases the editing routine redraws and not the drag_stop
481 int result = 0, redraw = 0;
483 switch(mwindow->session->current_operation)
485 case DRAG_VTRANSITION:
486 case DRAG_ATRANSITION:
487 if(mwindow->session->edit_highlighted)
489 if((mwindow->session->current_operation == DRAG_ATRANSITION &&
490 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
491 (mwindow->session->current_operation == DRAG_VTRANSITION &&
492 mwindow->session->track_highlighted->data_type == TRACK_VIDEO))
494 mwindow->session->current_operation = NO_OPERATION;
495 mwindow->paste_transition();
505 // Behavior for dragged plugins is limited by the fact that a shared plugin
506 // can only refer to a standalone plugin that exists in the same position in
507 // time. Dragging a plugin from one point in time to another can't produce
508 // a shared plugin to the original plugin. In this case we relocate the
509 // plugin instead of sharing it.
510 case DRAG_AEFFECT_COPY:
511 case DRAG_VEFFECT_COPY:
512 if(mwindow->session->track_highlighted &&
513 ((mwindow->session->current_operation == DRAG_AEFFECT_COPY &&
514 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
515 (mwindow->session->current_operation == DRAG_VEFFECT_COPY &&
516 mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
518 mwindow->session->current_operation = NO_OPERATION;
520 // Insert shared plugin in source
521 if(mwindow->session->track_highlighted != mwindow->session->drag_plugin->track &&
522 !mwindow->session->plugin_highlighted &&
523 !mwindow->session->pluginset_highlighted)
525 // Move plugin if different startproject
526 mwindow->move_effect(mwindow->session->drag_plugin,
528 mwindow->session->track_highlighted,
533 // Move source to different location
534 if(mwindow->session->pluginset_highlighted)
536 //printf("TrackCanvas::drag_stop 6\n");
537 if(mwindow->session->plugin_highlighted)
539 mwindow->move_effect(mwindow->session->drag_plugin,
540 mwindow->session->plugin_highlighted->plugin_set,
542 mwindow->session->plugin_highlighted->startproject);
546 mwindow->move_effect(mwindow->session->drag_plugin,
547 mwindow->session->pluginset_highlighted,
549 mwindow->session->pluginset_highlighted->length());
554 // Move to a new plugin set between two edits
555 if(mwindow->session->edit_highlighted)
557 mwindow->move_effect(mwindow->session->drag_plugin,
559 mwindow->session->track_highlighted,
560 mwindow->session->edit_highlighted->startproject);
564 // Move to a new plugin set
565 if(mwindow->session->track_highlighted)
567 mwindow->move_effect(mwindow->session->drag_plugin,
569 mwindow->session->track_highlighted,
578 if(mwindow->session->track_highlighted &&
579 ((mwindow->session->current_operation == DRAG_AEFFECT &&
580 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
581 (mwindow->session->current_operation == DRAG_VEFFECT &&
582 mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
584 // Drop all the effects
585 PluginSet *plugin_set = mwindow->session->pluginset_highlighted;
586 Track *track = mwindow->session->track_highlighted;
588 double length = track->get_length();
590 if(mwindow->session->plugin_highlighted)
592 start = track->from_units(mwindow->session->plugin_highlighted->startproject);
593 length = track->from_units(mwindow->session->plugin_highlighted->length);
594 if(length <= 0) length = track->get_length();
597 if(mwindow->session->pluginset_highlighted)
599 start = track->from_units(plugin_set->length());
600 length = track->get_length() - start;
601 if(length <= 0) length = track->get_length();
604 if(mwindow->edl->local_session->get_selectionend() >
605 mwindow->edl->local_session->get_selectionstart())
607 start = mwindow->edl->local_session->get_selectionstart();
608 length = mwindow->edl->local_session->get_selectionend() -
609 mwindow->edl->local_session->get_selectionstart();
611 // Move to a point between two edits
613 // if(mwindow->session->edit_highlighted)
615 // start = mwindow->session->track_highlighted->from_units(
616 // mwindow->session->edit_highlighted->startproject);
617 // length = mwindow->session->track_highlighted->from_units(
618 // mwindow->session->edit_highlighted->length);
621 mwindow->insert_effects_canvas(start, length);
624 if (mwindow->session->track_highlighted)
625 result = 1; // we have to cleanup
629 if(mwindow->session->track_highlighted)
631 int64_t position = mwindow->session->edit_highlighted ?
632 mwindow->session->edit_highlighted->startproject :
633 mwindow->session->track_highlighted->edits->length();
634 double position_f = mwindow->session->track_highlighted->from_units(position);
635 Track *track = mwindow->session->track_highlighted;
636 mwindow->paste_assets(position_f, track);
637 result = 1; // need to be one no matter what, since we have track highlited so we have to cleanup....
642 mwindow->session->current_operation = NO_OPERATION;
643 if(mwindow->session->track_highlighted)
645 if(mwindow->session->track_highlighted->data_type == mwindow->session->drag_edit->track->data_type)
647 int64_t position = mwindow->session->edit_highlighted ?
648 mwindow->session->edit_highlighted->startproject :
649 mwindow->session->track_highlighted->edits->length();
650 double position_f = mwindow->session->track_highlighted->from_units(position);
651 Track *track = mwindow->session->track_highlighted;
652 mwindow->move_edits(mwindow->session->drag_edits,
662 // since we don't have subwindows we have to terminate any drag operation
665 if (mwindow->session->track_highlighted
666 || mwindow->session->edit_highlighted
667 || mwindow->session->plugin_highlighted
668 || mwindow->session->pluginset_highlighted)
670 mwindow->session->track_highlighted = 0;
671 mwindow->session->edit_highlighted = 0;
672 mwindow->session->plugin_highlighted = 0;
673 mwindow->session->pluginset_highlighted = 0;
674 mwindow->session->current_operation = NO_OPERATION;
678 //printf("TrackCanvas::drag_stop %d %d\n", redraw, mwindow->session->current_operation);
681 mwindow->edl->tracks->update_y_pixels(mwindow->theme);
682 gui->get_scrollbars();
684 gui->patchbay->update();
685 gui->cursor->update();
694 void TrackCanvas::draw(int force, int hide_cursor)
696 // Swap pixmap layers
697 TRACE("TrackCanvas::draw 1")
698 if(get_w() != background_pixmap->get_w() ||
699 get_h() != background_pixmap->get_h())
701 delete background_pixmap;
702 background_pixmap = new BC_Pixmap(this, get_w(), get_h());
705 TRACE("TrackCanvas::draw 10")
706 // Cursor disappears after resize when this is called.
707 // Cursor doesn't redraw after editing when this isn't called.
708 if(gui->cursor && hide_cursor) gui->cursor->hide();
709 TRACE("TrackCanvas::draw 20")
710 draw_top_background(get_parent(), 0, 0, get_w(), get_h(), background_pixmap);
711 TRACE("TrackCanvas::draw 30")
712 draw_resources(force);
713 TRACE("TrackCanvas::draw 40")
718 void TrackCanvas::update_cursor()
720 switch(mwindow->edl->session->editing_mode)
722 case EDITING_ARROW: set_cursor(ARROW_CURSOR); break;
723 case EDITING_IBEAM: set_cursor(IBEAM_CURSOR); break;
728 void TrackCanvas::draw_indexes(Asset *asset)
730 // Don't redraw raw samples
731 if(asset->index_zoom > mwindow->edl->local_session->zoom_sample)
734 draw_resources(0, 1, asset);
742 void TrackCanvas::draw_resources(int force,
746 // Age resource pixmaps for deletion
748 for(int i = 0; i < resource_pixmaps.total; i++)
749 resource_pixmaps.values[i]->visible--;
752 resource_pixmaps.remove_all_objects();
754 //printf("TrackCanvas::draw_resources 1 %d %d\n", force, indexes_only);
757 for(Track *current = mwindow->edl->tracks->first;
761 //printf("TrackCanvas::draw_resources 2\n");
762 for(Edit *edit = current->edits->first; edit; edit = edit->next)
764 //printf("TrackCanvas::draw_resources 3\n");
765 if(!edit->asset) continue;
766 //printf("TrackCanvas::draw_resources 4\n");
769 if(edit->track->data_type != TRACK_AUDIO) continue;
770 if(!edit->asset->test_path(index_asset->path)) continue;
773 int64_t edit_x, edit_y, edit_w, edit_h;
774 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
775 //printf("TrackCanvas::draw_resources 10\n");
778 if(MWindowGUI::visible(edit_x, edit_x + edit_w, 0, get_w()) &&
779 MWindowGUI::visible(edit_y, edit_y + edit_h, 0, get_h()))
781 int64_t pixmap_x, pixmap_w, pixmap_h;
783 //printf("TrackCanvas::draw_resources 20\n");
784 // Search for existing pixmap containing edit
785 for(int i = 0; i < resource_pixmaps.total; i++)
787 ResourcePixmap* pixmap = resource_pixmaps.values[i];
788 //printf("TrackCanvas::draw_resources 30\n");
789 // Same pointer can be different edit if editing took place
790 if(pixmap->edit_id == edit->id)
792 //printf("TrackCanvas::draw_resources 40\n");
796 //printf("TrackCanvas::draw_resources 50\n");
799 // Get new size, offset of pixmap needed
800 get_pixmap_size(edit,
806 //printf("TrackCanvas::draw_resources 60\n");
809 if(pixmap_w && pixmap_h)
811 // Create pixmap if it doesn't exist
812 ResourcePixmap* pixmap = create_pixmap(edit,
817 //printf("TrackCanvas::draw_resources 70\n");
818 // Resize it if it's bigger
819 if(pixmap_w > pixmap->pixmap_w ||
820 pixmap_h > pixmap->pixmap_h)
821 pixmap->resize(pixmap_w, pixmap_h);
822 //printf("TrackCanvas::draw_resources 80\n");
823 pixmap->draw_data(edit,
831 //printf("TrackCanvas::draw_resources 90\n");
832 // Resize it if it's smaller
833 if(pixmap_w < pixmap->pixmap_w ||
834 pixmap_h < pixmap->pixmap_h)
835 pixmap->resize(pixmap_w, pixmap_h);
836 //printf("TrackCanvas::draw_resources 100\n");
837 // Copy pixmap to background canvas
838 background_pixmap->draw_pixmap(pixmap,
843 //printf("TrackCanvas::draw_resources 110\n");
848 //printf("TrackCanvas::draw_resources 200\n");
850 // Delete unused pixmaps
852 for(int i = resource_pixmaps.total - 1; i >= 0; i--)
853 if(resource_pixmaps.values[i]->visible < -5)
855 delete resource_pixmaps.values[i];
856 resource_pixmaps.remove(resource_pixmaps.values[i]);
860 ResourcePixmap* TrackCanvas::create_pixmap(Edit *edit,
866 ResourcePixmap *result = 0;
868 for(int i = 0; i < resource_pixmaps.total; i++)
870 //printf("TrackCanvas::create_pixmap 1 %d %d\n", edit->id, resource_pixmaps.values[i]->edit->id);
871 if(resource_pixmaps.values[i]->edit_id == edit->id)
873 result = resource_pixmaps.values[i];
880 //printf("TrackCanvas::create_pixmap 2\n");
881 result = new ResourcePixmap(mwindow,
886 resource_pixmaps.append(result);
889 // result->resize(pixmap_w, pixmap_h);
893 void TrackCanvas::get_pixmap_size(Edit *edit,
901 // Align x on frame boundaries
904 // switch(edit->edits->track->data_type)
916 if(pixmap_x + pixmap_w > get_w())
918 pixmap_w = get_w() - pixmap_x;
925 // int64_t picon_w = (int64_t)(edit->picon_w() + 0.5);
926 // int64_t frame_w = (int64_t)(edit->frame_w() + 0.5);
927 // int64_t pixel_increment = MAX(picon_w, frame_w);
928 // int64_t pixmap_x1 = edit_x;
929 // int64_t pixmap_x2 = edit_x + edit_w;
933 // pixmap_x1 = (int64_t)((double)-edit_x / pixel_increment) *
938 // if(pixmap_x2 > get_w())
940 // pixmap_x2 = (int64_t)((double)(get_w() - edit_x) / pixel_increment + 1) *
944 // pixmap_x = pixmap_x1;
945 // pixmap_w = pixmap_x2 - pixmap_x1;
950 pixmap_h = mwindow->edl->local_session->zoom_track;
951 if(mwindow->edl->session->show_titles) pixmap_h += mwindow->theme->title_bg_data->get_h();
952 //printf("get_pixmap_size %d %d %d %d\n", edit_x, edit_w, pixmap_x, pixmap_w);
955 void TrackCanvas::edit_dimensions(Edit *edit,
961 //printf("TrackCanvas::edit_dimensions 1 %p\n", edit->track);
962 w = Units::round(edit->track->from_units(edit->length) *
963 mwindow->edl->session->sample_rate /
964 mwindow->edl->local_session->zoom_sample);
965 //printf("TrackCanvas::edit_dimensions 1\n");
969 //printf("TrackCanvas::edit_dimensions 1\n");
970 x = Units::round(edit->track->from_units(edit->startproject) *
971 mwindow->edl->session->sample_rate /
972 mwindow->edl->local_session->zoom_sample -
973 mwindow->edl->local_session->view_start);
975 //printf("TrackCanvas::edit_dimensions 1\n");
976 y = edit->edits->track->y_pixel;
977 //printf("TrackCanvas::edit_dimensions 1\n");
979 if(mwindow->edl->session->show_titles)
980 h += mwindow->theme->title_bg_data->get_h();
981 //printf("TrackCanvas::edit_dimensions 2\n");
984 void TrackCanvas::track_dimensions(Track *track, int64_t &x, int64_t &y, int64_t &w, int64_t &h)
989 h = track->vertical_span(mwindow->theme);
993 void TrackCanvas::draw_paste_destination()
995 int cursor_x = get_cursor_x();
996 int cursor_y = get_cursor_y();
997 int current_atrack = 0;
998 int current_vtrack = 0;
999 int current_aedit = 0;
1000 int current_vedit = 0;
1005 //printf("TrackCanvas::draw_paste_destination 1\n");
1006 if((mwindow->session->current_operation == DRAG_ASSET &&
1007 (mwindow->session->drag_assets->total ||
1008 mwindow->session->drag_clips->total)) ||
1009 (mwindow->session->current_operation == DRAG_EDIT &&
1010 mwindow->session->drag_edits->total))
1012 //printf("TrackCanvas::draw_paste_destination 1\n");
1017 if(mwindow->session->current_operation == DRAG_ASSET &&
1018 mwindow->session->drag_assets->total)
1019 asset = mwindow->session->drag_assets->values[0];
1021 if(mwindow->session->current_operation == DRAG_ASSET &&
1022 mwindow->session->drag_clips->total)
1023 clip = mwindow->session->drag_clips->values[0];
1025 // Get destination track
1026 for(Track *dest = mwindow->session->track_highlighted;
1032 // Get source width in pixels
1036 // Use start of highlighted edit
1037 if(mwindow->session->edit_highlighted)
1038 position = mwindow->session->track_highlighted->from_units(
1039 mwindow->session->edit_highlighted->startproject);
1041 // Use end of highlighted track, disregarding effects
1042 position = mwindow->session->track_highlighted->from_units(
1043 mwindow->session->track_highlighted->edits->length());
1045 // Get the x coordinate
1046 x = Units::to_int64(position *
1047 mwindow->edl->session->sample_rate /
1048 mwindow->edl->local_session->zoom_sample) -
1049 mwindow->edl->local_session->view_start;
1051 if(dest->data_type == TRACK_AUDIO)
1053 if(asset && current_atrack < asset->channels)
1055 w = Units::to_int64((double)asset->audio_length /
1056 asset->sample_rate *
1057 mwindow->edl->session->sample_rate /
1058 mwindow->edl->local_session->zoom_sample);
1063 if(clip && current_atrack < clip->tracks->total_audio_tracks())
1065 w = Units::to_int64((double)clip->tracks->total_length() *
1066 mwindow->edl->session->sample_rate /
1067 mwindow->edl->local_session->zoom_sample);
1068 //printf("draw_paste_destination %d\n", x);
1073 if(mwindow->session->current_operation == DRAG_EDIT &&
1074 current_aedit < mwindow->session->drag_edits->total)
1077 while(current_aedit < mwindow->session->drag_edits->total &&
1078 mwindow->session->drag_edits->values[current_aedit]->track->data_type != TRACK_AUDIO)
1081 if(current_aedit < mwindow->session->drag_edits->total)
1083 edit = mwindow->session->drag_edits->values[current_aedit];
1084 w = Units::to_int64(edit->length / mwindow->edl->local_session->zoom_sample);
1092 if(dest->data_type == TRACK_VIDEO)
1094 //printf("draw_paste_destination 1\n");
1095 if(asset && current_vtrack < asset->layers)
1097 w = Units::to_int64((double)asset->video_length /
1099 mwindow->edl->session->sample_rate /
1100 mwindow->edl->local_session->zoom_sample);
1105 if(clip && current_vtrack < clip->tracks->total_video_tracks())
1107 w = Units::to_int64(clip->tracks->total_length() *
1108 mwindow->edl->session->sample_rate /
1109 mwindow->edl->local_session->zoom_sample);
1114 if(mwindow->session->current_operation == DRAG_EDIT &&
1115 current_vedit < mwindow->session->drag_edits->total)
1117 //printf("draw_paste_destination 2\n");
1119 while(current_vedit < mwindow->session->drag_edits->total &&
1120 mwindow->session->drag_edits->values[current_vedit]->track->data_type != TRACK_VIDEO)
1123 if(current_vedit < mwindow->session->drag_edits->total)
1125 //printf("draw_paste_destination 3\n");
1126 edit = mwindow->session->drag_edits->values[current_vedit];
1127 w = Units::to_int64(edit->track->from_units(edit->length) *
1128 mwindow->edl->session->sample_rate /
1129 mwindow->edl->local_session->zoom_sample);
1139 int y = dest->y_pixel;
1140 int h = dest->vertical_span(mwindow->theme);
1143 //printf("TrackCanvas::draw_paste_destination 2 %d %d %d %d\n", x, y, w, h);
1144 if(x < -BC_INFINITY)
1146 w -= -BC_INFINITY - x;
1147 x += -BC_INFINITY - x;
1150 draw_highlight_rectangle(x, y, w, h);
1157 void TrackCanvas::plugin_dimensions(Plugin *plugin, int64_t &x, int64_t &y, int64_t &w, int64_t &h)
1159 x = Units::round(plugin->track->from_units(plugin->startproject) *
1160 mwindow->edl->session->sample_rate /
1161 mwindow->edl->local_session->zoom_sample -
1162 mwindow->edl->local_session->view_start);
1163 w = Units::round(plugin->track->from_units(plugin->length) *
1164 mwindow->edl->session->sample_rate /
1165 mwindow->edl->local_session->zoom_sample);
1166 y = plugin->track->y_pixel +
1167 mwindow->edl->local_session->zoom_track +
1168 plugin->plugin_set->get_number() *
1169 mwindow->theme->plugin_bg_data->get_h();
1170 if(mwindow->edl->session->show_titles)
1171 y += mwindow->theme->title_bg_data->get_h();
1172 h = mwindow->theme->plugin_bg_data->get_h();
1175 int TrackCanvas::resource_h()
1177 return mwindow->edl->local_session->zoom_track;
1180 void TrackCanvas::draw_highlight_rectangle(int x, int y, int w, int h)
1192 w = MIN(w, get_w() + 20);
1193 h = MIN(h, get_h() + 20);
1196 draw_rectangle(x, y, w, h);
1197 draw_rectangle(x + 1, y + 1, w - 2, h - 2);
1199 //printf("TrackCanvas::draw_highlight_rectangle %d %d %d %d\n", x, y, w, h);
1202 void TrackCanvas::draw_playback_cursor()
1204 // Called before playback_cursor exists
1205 // if(mwindow->playback_cursor && mwindow->playback_cursor->visible)
1207 // mwindow->playback_cursor->visible = 0;
1208 // mwindow->playback_cursor->draw();
1212 void TrackCanvas::get_handle_coords(Edit *edit, int64_t &x, int64_t &y, int64_t &w, int64_t &h, int side)
1214 int handle_w = mwindow->theme->edithandlein_data[0]->get_w();
1215 int handle_h = mwindow->theme->edithandlein_data[0]->get_h();
1217 edit_dimensions(edit, x, y, w, h);
1219 if(mwindow->edl->session->show_titles)
1221 y += mwindow->theme->title_bg_data->get_h();
1228 if(side == EDIT_OUT)
1237 void TrackCanvas::get_transition_coords(int64_t &x, int64_t &y, int64_t &w, int64_t &h)
1239 //printf("TrackCanvas::get_transition_coords 1\n");
1240 // int transition_w = mwindow->theme->transitionhandle_data[0]->get_w();
1241 // int transition_h = mwindow->theme->transitionhandle_data[0]->get_h();
1242 int transition_w = 30;
1243 int transition_h = 30;
1244 //printf("TrackCanvas::get_transition_coords 1\n");
1246 if(mwindow->edl->session->show_titles)
1247 y += mwindow->theme->title_bg_data->get_h();
1248 //printf("TrackCanvas::get_transition_coords 2\n");
1250 y += (h - mwindow->theme->title_bg_data->get_h()) / 2 - transition_h / 2;
1251 x -= transition_w / 2;
1257 void TrackCanvas::draw_highlighting()
1261 //printf("TrackCanvas::draw_highlighting 1 %p %d\n", mwindow->session->track_highlighted, mwindow->session->current_operation);
1265 switch(mwindow->session->current_operation)
1267 case DRAG_ATRANSITION:
1268 case DRAG_VTRANSITION:
1269 //printf("TrackCanvas::draw_highlighting 1 %p %p\n",
1270 // mwindow->session->track_highlighted, mwindow->session->edit_highlighted);
1271 if(mwindow->session->edit_highlighted)
1273 //printf("TrackCanvas::draw_highlighting 2\n");
1274 if((mwindow->session->current_operation == DRAG_ATRANSITION &&
1275 mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1276 (mwindow->session->current_operation == DRAG_VTRANSITION &&
1277 mwindow->session->track_highlighted->data_type == TRACK_VIDEO))
1279 //printf("TrackCanvas::draw_highlighting 2\n");
1280 edit_dimensions(mwindow->session->edit_highlighted, x, y, w, h);
1281 //printf("TrackCanvas::draw_highlighting 2\n");
1283 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1284 MWindowGUI::visible(y, y + h, 0, get_h()))
1287 get_transition_coords(x, y, w, h);
1289 //printf("TrackCanvas::draw_highlighting 3\n");
1296 // Dragging a new effect from the Resource window
1299 if(mwindow->session->track_highlighted &&
1300 ((mwindow->session->current_operation == DRAG_AEFFECT && mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1301 (mwindow->session->current_operation == DRAG_VEFFECT && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
1303 // Put it before another plugin
1304 if(mwindow->session->plugin_highlighted)
1306 plugin_dimensions(mwindow->session->plugin_highlighted,
1311 //printf("TrackCanvas::draw_highlighting 1 %d %d\n", x, w);
1314 // Put it after a plugin set
1315 if(mwindow->session->pluginset_highlighted &&
1316 mwindow->session->pluginset_highlighted->last)
1318 plugin_dimensions((Plugin*)mwindow->session->pluginset_highlighted->last,
1323 //printf("TrackCanvas::draw_highlighting 1 %d %d\n", x, w);
1324 int64_t track_x, track_y, track_w, track_h;
1325 track_dimensions(mwindow->session->track_highlighted,
1333 mwindow->session->track_highlighted->get_length() *
1334 mwindow->edl->session->sample_rate /
1335 mwindow->edl->local_session->zoom_sample -
1336 mwindow->edl->local_session->view_start) -
1338 //printf("TrackCanvas::draw_highlighting 2 %d\n", w);
1339 if(w <= 0) w = track_w;
1343 track_dimensions(mwindow->session->track_highlighted,
1349 //printf("TrackCanvas::draw_highlighting 1 %d %d %d %d\n", x, y, w, h);
1350 // Put it in a new plugin set determined by the selected range
1351 if(mwindow->edl->local_session->get_selectionend() >
1352 mwindow->edl->local_session->get_selectionstart())
1354 x = Units::to_int64(mwindow->edl->local_session->get_selectionstart() *
1355 mwindow->edl->session->sample_rate /
1356 mwindow->edl->local_session->zoom_sample -
1357 mwindow->edl->local_session->view_start);
1358 w = Units::to_int64((mwindow->edl->local_session->get_selectionend() -
1359 mwindow->edl->local_session->get_selectionstart()) *
1360 mwindow->edl->session->sample_rate /
1361 mwindow->edl->local_session->zoom_sample);
1363 // Put it in a new plugin set determined by an edit boundary
1365 // if(mwindow->session->edit_highlighted)
1367 // int64_t temp_y, temp_h;
1368 // edit_dimensions(mwindow->session->edit_highlighted,
1374 // Put it at the beginning of the track in a new plugin set
1377 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1378 MWindowGUI::visible(y, y + h, 0, get_h()))
1380 //printf("TrackCanvas::draw_highlighting 1\n");
1387 if(mwindow->session->track_highlighted)
1389 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1391 if(MWindowGUI::visible(y, y + h, 0, get_h()))
1393 draw_paste_destination();
1398 // Dragging an effect from the timeline
1399 case DRAG_AEFFECT_COPY:
1400 case DRAG_VEFFECT_COPY:
1401 if((mwindow->session->plugin_highlighted || mwindow->session->track_highlighted) &&
1402 ((mwindow->session->current_operation == DRAG_AEFFECT_COPY && mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
1403 (mwindow->session->current_operation == DRAG_VEFFECT_COPY && mwindow->session->track_highlighted->data_type == TRACK_VIDEO)))
1405 // Put it before another plugin
1406 if(mwindow->session->plugin_highlighted)
1407 plugin_dimensions(mwindow->session->plugin_highlighted, x, y, w, h);
1409 // Put it after a plugin set
1410 if(mwindow->session->pluginset_highlighted &&
1411 mwindow->session->pluginset_highlighted->last)
1413 plugin_dimensions((Plugin*)mwindow->session->pluginset_highlighted->last, x, y, w, h);
1417 if(mwindow->session->track_highlighted)
1419 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1421 // Put it in a new plugin set determined by an edit boundary
1422 if(mwindow->session->edit_highlighted)
1424 int64_t temp_y, temp_h;
1425 edit_dimensions(mwindow->session->edit_highlighted,
1431 // Put it in a new plugin set at the start of the track
1434 // Calculate length of plugin based on data type of track and units
1435 if(mwindow->session->track_highlighted->data_type == TRACK_VIDEO)
1437 w = (int64_t)((double)mwindow->session->drag_plugin->length /
1438 mwindow->edl->session->frame_rate *
1439 mwindow->edl->session->sample_rate /
1440 mwindow->edl->local_session->zoom_sample);
1444 w = (int64_t)mwindow->session->drag_plugin->length /
1445 mwindow->edl->local_session->zoom_sample;
1448 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1449 MWindowGUI::visible(y, y + h, 0, get_h()))
1458 //printf("TrackCanvas::draw_highlighting 1\n");
1459 if(mwindow->session->track_highlighted)
1461 track_dimensions(mwindow->session->track_highlighted, x, y, w, h);
1463 if(MWindowGUI::visible(y, y + h, 0, get_h()))
1465 draw_paste_destination();
1476 draw_highlight_rectangle(x, y, w, h);
1480 void TrackCanvas::draw_plugins()
1482 char string[BCTEXTLEN];
1484 for(Track *track = mwindow->edl->tracks->first;
1486 track = track->next)
1488 if(track->expand_view)
1490 for(int i = 0; i < track->plugin_set.total; i++)
1492 PluginSet *pluginset = track->plugin_set.values[i];
1494 for(Plugin *plugin = (Plugin*)pluginset->first; plugin; plugin = (Plugin*)plugin->next)
1496 int64_t total_x, y, total_w, h;
1497 plugin_dimensions(plugin, total_x, y, total_w, h);
1499 if(MWindowGUI::visible(total_x, total_x + total_w, 0, get_w()) &&
1500 MWindowGUI::visible(y, y + h, 0, get_h()) &&
1501 plugin->plugin_type != PLUGIN_NONE)
1503 int x = total_x, w = total_w, left_margin = 5;
1509 if(w + x > get_w()) w -= (w + x) - get_w();
1516 mwindow->theme->plugin_bg_data,
1519 set_font(MEDIUMFONT_3D);
1520 plugin->calculate_title(string, 0);
1522 // Truncate string to int64_test visible in background
1523 int len = strlen(string), j;
1524 for(j = len; j >= 0; j--)
1526 if(left_margin + get_text_width(MEDIUMFONT_3D, string) > w)
1534 // Justify the text on the left boundary of the edit if it is visible.
1535 // Otherwise justify it on the left side of the screen.
1536 int text_x = total_x + left_margin;
1537 text_x = MAX(left_margin, text_x);
1539 y + get_text_ascent(MEDIUMFONT_3D) + 2,
1551 void TrackCanvas::draw_inout_points()
1556 void TrackCanvas::draw_drag_handle()
1558 if(mwindow->session->current_operation == DRAG_EDITHANDLE2 ||
1559 mwindow->session->current_operation == DRAG_PLUGINHANDLE2)
1561 //printf("TrackCanvas::draw_drag_handle 1 %ld %ld\n", mwindow->session->drag_sample, mwindow->edl->local_session->view_start);
1562 int64_t pixel1 = Units::round(mwindow->session->drag_position *
1563 mwindow->edl->session->sample_rate /
1564 mwindow->edl->local_session->zoom_sample -
1565 mwindow->edl->local_session->view_start);
1566 //printf("TrackCanvas::draw_drag_handle 2 %d\n", pixel1);
1569 //printf("TrackCanvas::draw_drag_handle 3\n");
1570 draw_line(pixel1, 0, pixel1, get_h());
1572 //printf("TrackCanvas::draw_drag_handle 4\n");
1577 void TrackCanvas::draw_transitions()
1581 for(Track *track = mwindow->edl->tracks->first;
1583 track = track->next)
1585 for(Edit *edit = track->edits->first;
1589 if(edit->transition)
1591 edit_dimensions(edit, x, y, w, h);
1592 get_transition_coords(x, y, w, h);
1594 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
1595 MWindowGUI::visible(y, y + h, 0, get_h()))
1597 PluginServer *server = mwindow->scan_plugindb(edit->transition->title,
1599 draw_vframe(server->picon,
1606 server->picon->get_w(),
1607 server->picon->get_h());
1614 void TrackCanvas::draw_loop_points()
1616 //printf("TrackCanvas::draw_loop_points 1\n");
1617 if(mwindow->edl->local_session->loop_playback)
1619 //printf("TrackCanvas::draw_loop_points 2\n");
1620 int64_t x = Units::round(mwindow->edl->local_session->loop_start *
1621 mwindow->edl->session->sample_rate /
1622 mwindow->edl->local_session->zoom_sample -
1623 mwindow->edl->local_session->view_start);
1624 //printf("TrackCanvas::draw_loop_points 3\n");
1626 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
1629 draw_line(x, 0, x, get_h());
1631 //printf("TrackCanvas::draw_loop_points 4\n");
1633 x = Units::round(mwindow->edl->local_session->loop_end *
1634 mwindow->edl->session->sample_rate /
1635 mwindow->edl->local_session->zoom_sample -
1636 mwindow->edl->local_session->view_start);
1637 //printf("TrackCanvas::draw_loop_points 5\n");
1639 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
1642 draw_line(x, 0, x, get_h());
1644 //printf("TrackCanvas::draw_loop_points 6\n");
1646 //printf("TrackCanvas::draw_loop_points 7\n");
1649 void TrackCanvas::draw_brender_start()
1651 if(mwindow->preferences->use_brender)
1653 int64_t x = Units::round(mwindow->edl->session->brender_start *
1654 mwindow->edl->session->sample_rate /
1655 mwindow->edl->local_session->zoom_sample -
1656 mwindow->edl->local_session->view_start);
1658 if(MWindowGUI::visible(x, x + 1, 0, get_w()))
1661 draw_line(x, 0, x, get_h());
1666 int TrackCanvas::do_keyframes(int cursor_x,
1674 int current_tool = 0;
1676 EDLSession *session = mwindow->edl->session;
1678 for(Track *track = mwindow->edl->tracks->first;
1680 track = track->next)
1682 Automation *automation = track->automation;
1684 //printf("TrackCanvas::draw_keyframes 1\n");
1685 if(!result && session->auto_conf->fade)
1687 result = do_float_autos(track,
1688 automation->fade_autos,
1694 if(result && mwindow->session->current_operation == DRAG_FADE)
1698 if(result && buttonpress)
1700 synchronize_autos(0, track, (FloatAuto*)mwindow->session->drag_auto, 1);
1701 mwindow->session->current_operation = DRAG_FADE;
1702 update_drag_caption();
1706 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1708 if(!result && session->auto_conf->czoom && automation->czoom_autos)
1710 result = do_float_autos(track,
1711 automation->czoom_autos,
1717 if(result && mwindow->session->current_operation == DRAG_CZOOM)
1721 if(result && buttonpress)
1723 mwindow->session->current_operation = DRAG_CZOOM;
1724 update_drag_caption();
1728 //printf("TrackCanvas::draw_keyframes 2 %d\n", result);
1729 if(!result && session->auto_conf->pzoom && automation->pzoom_autos)
1731 result = do_float_autos(track,
1732 automation->pzoom_autos,
1738 if(result && mwindow->session->current_operation == DRAG_PZOOM)
1742 if(result && buttonpress)
1744 mwindow->session->current_operation = DRAG_PZOOM;
1745 update_drag_caption();
1749 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1750 if(!result && session->auto_conf->mute)
1752 result = do_toggle_autos(track,
1753 automation->mute_autos,
1759 if(result && mwindow->session->current_operation == DRAG_MUTE)
1763 if(result && buttonpress)
1765 mwindow->session->current_operation = DRAG_MUTE;
1766 update_drag_caption();
1770 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1771 if(!result && session->auto_conf->camera && automation->camera_autos)
1773 result = do_autos(track,
1774 automation->camera_autos,
1779 camerakeyframe_pixmap);
1780 if(result && mwindow->session->current_operation == DRAG_CAMERA)
1784 if(result && buttonpress)
1786 mwindow->session->current_operation = DRAG_CAMERA_PRE;
1787 update_drag_caption();
1792 if(!result && session->auto_conf->mode && automation->mode_autos)
1794 result = do_autos(track,
1795 automation->mode_autos,
1800 modekeyframe_pixmap);
1801 if(result && mwindow->session->current_operation == DRAG_MODE)
1805 if(result && buttonpress)
1807 mwindow->session->current_operation = DRAG_MODE_PRE;
1808 update_drag_caption();
1813 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1814 if(!result && session->auto_conf->projector && automation->projector_autos)
1816 result = do_autos(track,
1817 automation->projector_autos,
1822 projectorkeyframe_pixmap);
1823 if(result && mwindow->session->current_operation == DRAG_PROJECTOR)
1827 if(result && buttonpress)
1829 mwindow->session->current_operation = DRAG_PROJECTOR_PRE;
1830 update_drag_caption();
1835 if(!result && session->auto_conf->mask && automation->mask_autos)
1837 result = do_autos(track,
1838 automation->mask_autos,
1843 maskkeyframe_pixmap);
1844 if(result && mwindow->session->current_operation == DRAG_MASK)
1848 if(result && buttonpress)
1850 mwindow->session->current_operation = DRAG_MASK_PRE;
1851 update_drag_caption();
1856 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1857 if(!result && session->auto_conf->pan && automation->pan_autos)
1859 result = do_autos(track,
1860 automation->pan_autos,
1865 pankeyframe_pixmap);
1866 if(result && mwindow->session->current_operation == DRAG_PAN)
1870 if(result && buttonpress)
1872 mwindow->session->current_operation = DRAG_PAN_PRE;
1873 update_drag_caption();
1878 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1879 if(!result && session->auto_conf->plugins)
1883 result = do_plugin_autos(track,
1890 if(result && mwindow->session->current_operation == DRAG_PLUGINKEY)
1894 if(result && (buttonpress == 1))
1896 mwindow->session->current_operation = DRAG_PLUGINKEY_PRE;
1897 update_drag_caption();
1901 if(result && (buttonpress == 3))
1903 gui->keyframe_menu->update(plugin, keyframe);
1904 gui->keyframe_menu->activate_menu();
1905 rerender = 1; // the position changes
1908 //printf("TrackCanvas::draw_keyframes 1 %d\n", result);
1911 if(mwindow->session->current_operation == DRAG_FADE ||
1912 mwindow->session->current_operation == DRAG_CZOOM ||
1913 mwindow->session->current_operation == DRAG_PZOOM ||
1914 mwindow->session->current_operation == DRAG_PLAY ||
1915 mwindow->session->current_operation == DRAG_MUTE ||
1916 mwindow->session->current_operation == DRAG_CAMERA ||
1917 mwindow->session->current_operation == DRAG_CAMERA_PRE ||
1918 mwindow->session->current_operation == DRAG_MASK ||
1919 mwindow->session->current_operation == DRAG_MASK_PRE ||
1920 mwindow->session->current_operation == DRAG_MODE ||
1921 mwindow->session->current_operation == DRAG_MODE_PRE ||
1922 mwindow->session->current_operation == DRAG_PAN ||
1923 mwindow->session->current_operation == DRAG_PAN_PRE ||
1924 mwindow->session->current_operation == DRAG_PLUGINKEY ||
1925 mwindow->session->current_operation == DRAG_PLUGINKEY_PRE ||
1926 mwindow->session->current_operation == DRAG_PROJECTOR ||
1927 mwindow->session->current_operation == DRAG_PROJECTOR_PRE)
1932 //printf("TrackCanvas::draw_keyframes 2 %d\n", result);
1936 new_cursor = UPRIGHT_ARROW_CURSOR;
1940 //printf("TrackCanvas::do_keyframes 3 %d\n", result);
1944 void TrackCanvas::draw_auto(Auto *current,
1952 char string[BCTEXTLEN];
1954 x1 = x - HANDLE_W / 2;
1955 x2 = x + HANDLE_W / 2;
1956 y1 = center_pixel + y - HANDLE_W / 2;
1957 y2 = center_pixel + y + HANDLE_W / 2;
1959 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
1960 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
1963 draw_box(x1 + 1, y1 + 1, x2 - x1, y2 - y1);
1965 draw_box(x1, y1, x2 - x1, y2 - y1);
1968 void TrackCanvas::draw_floatauto(Auto *current,
1980 int in_x1, in_y1, in_x2, in_y2;
1981 int out_x1, out_y1, out_x2, out_y2;
1982 char string[BCTEXTLEN];
1985 x1 = x - HANDLE_W / 2;
1986 x2 = x + HANDLE_W / 2;
1987 y1 = center_pixel + y - HANDLE_W / 2;
1988 y2 = center_pixel + y + HANDLE_W / 2;
1990 CLAMP(y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
1991 CLAMP(y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
1994 draw_box(x1 + 1, y1 + 1, x2 - x1, y2 - y1);
1996 draw_box(x1, y1, x2 - x1, y2 - y1);
1999 in_x1 = in_x - HANDLE_W / 2;
2000 in_x2 = in_x + HANDLE_W / 2;
2001 in_y1 = center_pixel + in_y - HANDLE_W / 2;
2002 in_y2 = center_pixel + in_y + HANDLE_W / 2;
2004 CLAMP(in_y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2005 CLAMP(in_y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2006 CLAMP(in_y, -zoom_track / 2, zoom_track / 2);
2009 draw_line(x + 1, center_pixel + y + 1, in_x + 1, center_pixel + in_y + 1);
2010 draw_box(in_x1 + 1, in_y1 + 1, in_x2 - in_x1, in_y2 - in_y1);
2012 draw_line(x, center_pixel + y, in_x, center_pixel + in_y);
2013 draw_box(in_x1, in_y1, in_x2 - in_x1, in_y2 - in_y1);
2018 out_x1 = out_x - HANDLE_W / 2;
2019 out_x2 = out_x + HANDLE_W / 2;
2020 out_y1 = center_pixel + out_y - HANDLE_W / 2;
2021 out_y2 = center_pixel + out_y + HANDLE_W / 2;
2023 CLAMP(out_y1, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2024 CLAMP(out_y2, center_pixel + -zoom_track / 2, center_pixel + zoom_track / 2);
2025 CLAMP(out_y, -zoom_track / 2, zoom_track / 2);
2029 draw_line(x + 1, center_pixel + y + 1, out_x + 1, center_pixel + out_y + 1);
2030 draw_box(out_x1 + 1, out_y1 + 1, out_x2 - out_x1, out_y2 - out_y1);
2032 draw_line(x, center_pixel + y, out_x, center_pixel + out_y);
2033 draw_box(out_x1, out_y1, out_x2 - out_x1, out_y2 - out_y1);
2037 int TrackCanvas::test_auto(Auto *current,
2047 char string[BCTEXTLEN];
2050 x1 = x - HANDLE_W / 2;
2051 x2 = x + HANDLE_W / 2;
2052 y1 = center_pixel + y - HANDLE_W / 2;
2053 y2 = center_pixel + y + HANDLE_W / 2;
2055 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
2056 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
2057 //printf("test_auto 1 %d %d %d %d %d %d\n", cursor_x, cursor_y, x1, x2, y1, y2);
2059 if(cursor_x >= x1 && cursor_x < x2 && cursor_y >= y1 && cursor_y < y2)
2061 //printf("test_auto 2 %d\n", buttonpress);
2064 //printf("test_auto 3\n");
2065 mwindow->session->drag_auto = current;
2066 mwindow->session->drag_start_percentage = current->value_to_percentage();
2067 mwindow->session->drag_start_position = current->position;
2068 mwindow->session->drag_origin_x = cursor_x;
2069 mwindow->session->drag_origin_y = cursor_y;
2077 int TrackCanvas::test_floatauto(Auto *current,
2091 int in_x1, in_y1, in_x2, in_y2;
2092 int out_x1, out_y1, out_x2, out_y2;
2093 char string[BCTEXTLEN];
2096 x1 = x - HANDLE_W / 2;
2097 x2 = x + HANDLE_W / 2;
2098 y1 = center_pixel + y - HANDLE_W / 2;
2099 y2 = center_pixel + y + HANDLE_W / 2;
2101 if(y1 < center_pixel + -zoom_track / 2) y1 = center_pixel + -zoom_track / 2;
2102 if(y2 > center_pixel + zoom_track / 2) y2 = center_pixel + zoom_track / 2;
2104 in_x1 = in_x - HANDLE_W / 2;
2105 in_x2 = in_x + HANDLE_W / 2;
2106 in_y1 = center_pixel + in_y - HANDLE_W / 2;
2107 in_y2 = center_pixel + in_y + HANDLE_W / 2;
2109 if(in_y1 < center_pixel + -zoom_track / 2) in_y1 = center_pixel + -zoom_track / 2;
2110 if(in_y2 > center_pixel + zoom_track / 2) in_y2 = center_pixel + zoom_track / 2;
2112 out_x1 = out_x - HANDLE_W / 2;
2113 out_x2 = out_x + HANDLE_W / 2;
2114 out_y1 = center_pixel + out_y - HANDLE_W / 2;
2115 out_y2 = center_pixel + out_y + HANDLE_W / 2;
2117 if(out_y1 < center_pixel + -zoom_track / 2) out_y1 = center_pixel + -zoom_track / 2;
2118 if(out_y2 > center_pixel + zoom_track / 2) out_y2 = center_pixel + zoom_track / 2;
2122 //printf("TrackCanvas::test_floatauto %d %d %d %d %d %d\n", cursor_x, cursor_y, x1, x2, y1, y2);
2132 mwindow->session->drag_auto = current;
2133 mwindow->session->drag_start_percentage = current->value_to_percentage();
2134 mwindow->session->drag_start_position = current->position;
2135 mwindow->session->drag_origin_x = cursor_x;
2136 mwindow->session->drag_origin_y = cursor_y;
2137 mwindow->session->drag_handle = 0;
2144 cursor_x >= in_x1 &&
2146 cursor_y >= in_y1 &&
2148 current->position > 0)
2152 mwindow->session->drag_auto = current;
2153 mwindow->session->drag_start_percentage =
2154 current->invalue_to_percentage();
2155 mwindow->session->drag_start_position =
2156 ((FloatAuto*)current)->control_in_position;
2157 mwindow->session->drag_origin_x = cursor_x;
2158 mwindow->session->drag_origin_y = cursor_y;
2159 mwindow->session->drag_handle = 1;
2166 cursor_x >= out_x1 &&
2167 cursor_x < out_x2 &&
2168 cursor_y >= out_y1 &&
2173 mwindow->session->drag_auto = current;
2174 mwindow->session->drag_start_percentage =
2175 current->outvalue_to_percentage();
2176 mwindow->session->drag_start_position =
2177 ((FloatAuto*)current)->control_out_position;
2178 mwindow->session->drag_origin_x = cursor_x;
2179 mwindow->session->drag_origin_y = cursor_y;
2180 mwindow->session->drag_handle = 2;
2186 // 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",
2187 // mwindow->session->drag_handle,
2196 void TrackCanvas::draw_floatline(int center_pixel,
2197 FloatAuto *previous,
2209 // Solve bezier equation for either every pixel or a certain large number of
2214 // Not using slope intercept
2221 // Call by reference fails for some reason here
2222 FloatAuto *previous1 = previous, *next1 = next;
2223 for(int x = x1; x < x2; x++)
2225 int64_t position = (int64_t)(unit_start + x * zoom_units);
2226 float value = autos->get_value(position, PLAY_FORWARD, previous1, next1);
2228 int y = (int)(center_pixel +
2229 (autos->value_to_percentage(value) - 0.5) * -yscale);
2234 draw_line(x - 1, prev_y + 1, x, y + 1);
2236 draw_line(x - 1, prev_y, x, y);
2243 // set_color(BLACK);
2244 // draw_line(x1, center_pixel + y1 + 1, x2, center_pixel + y2 + 1);
2245 // set_color(WHITE);
2246 // draw_line(x1, center_pixel + y1, x2, center_pixel + y2);
2254 void TrackCanvas::synchronize_autos(float change, Track *skip, FloatAuto *fauto, int fill_gangs)
2256 if (fill_gangs == 1 && skip->gang) // fill mwindow->session->drag_auto_gang
2258 for(Track *current = mwindow->edl->tracks->first;
2262 if(current->data_type == skip->data_type &&
2267 FloatAutos *fade_autos = current->automation->fade_autos;
2268 double position = skip->from_units(fauto->position);
2269 FloatAuto *previous = 0, *next = 0;
2271 float init_value = fade_autos->get_value(fauto->position, PLAY_FORWARD, previous, next);
2272 FloatAuto *keyframe;
2273 keyframe = (FloatAuto*)fade_autos->get_auto_at_position(position);
2277 // create keyframe at exactly this point in time
2278 keyframe = (FloatAuto*)fade_autos->insert_auto(fauto->position);
2279 keyframe->value = init_value;
2283 // keyframe exists, just change it
2284 keyframe->value += change;
2287 keyframe->position = fauto->position;
2288 keyframe->control_out_position = fauto->control_out_position;
2289 keyframe->control_in_position = fauto->control_in_position;
2290 keyframe->control_out_value = fauto->control_out_value;
2291 keyframe->control_in_value = fauto->control_in_value;
2293 mwindow->session->drag_auto_gang->append((Auto *)keyframe);
2297 if (fill_gangs == 0) // move the gangs
2301 for (int i = 0; i < mwindow->session->drag_auto_gang->total; i++)
2303 FloatAuto *keyframe = (FloatAuto *)mwindow->session->drag_auto_gang->values[i];
2305 keyframe->value += change;
2306 keyframe->position = fauto->position;
2307 if(skip->data_type == TRACK_AUDIO)
2308 CLAMP(keyframe->value, INFINITYGAIN, MAX_AUDIO_FADE);
2310 CLAMP(keyframe->value, 0, MAX_VIDEO_FADE);
2311 keyframe->control_out_position = fauto->control_out_position;
2312 keyframe->control_in_position = fauto->control_in_position;
2313 keyframe->control_out_value = fauto->control_out_value;
2314 keyframe->control_in_value = fauto->control_in_value;
2318 if (fill_gangs == -1) // remove the gangs
2320 for (int i = 0; i < mwindow->session->drag_auto_gang->total; i++)
2322 FloatAuto *keyframe = (FloatAuto *)mwindow->session->drag_auto_gang->values[i];
2323 keyframe->autos->remove_nonsequential(
2326 mwindow->session->drag_auto_gang->remove_all();
2331 int TrackCanvas::test_floatline(int center_pixel,
2345 int64_t position = (int64_t)(unit_start + cursor_x * zoom_units);
2346 // Call by reference fails for some reason here
2347 FloatAuto *previous = 0, *next = 0;
2348 float value = autos->get_value(position, PLAY_FORWARD, previous, next);
2349 int y = (int)(center_pixel +
2350 (autos->value_to_percentage(value) - 0.5) * -yscale);
2352 if(cursor_x >= x1 &&
2354 cursor_y >= y - HANDLE_W / 2 &&
2355 cursor_y < y + HANDLE_W / 2 &&
2363 mwindow->undo->update_undo_before(_("keyframe"), LOAD_AUTOMATION);
2367 current = mwindow->session->drag_auto = autos->insert_auto(position);
2368 ((FloatAuto*)current)->value = value;
2369 mwindow->session->drag_start_percentage = current->value_to_percentage();
2370 mwindow->session->drag_start_position = current->position;
2371 mwindow->session->drag_origin_x = cursor_x;
2372 mwindow->session->drag_origin_y = cursor_y;
2373 mwindow->session->drag_handle = 0;
2382 void TrackCanvas::draw_toggleline(int center_pixel,
2390 draw_line(x1, center_pixel + y1 + 1, x2, center_pixel + y1 + 1);
2392 draw_line(x1, center_pixel + y1, x2, center_pixel + y1);
2397 draw_line(x2 + 1, center_pixel + y1, x2 + 1, center_pixel + y2);
2399 draw_line(x2, center_pixel + y1, x2, center_pixel + y2);
2403 int TrackCanvas::test_toggleline(Autos *autos,
2414 if(cursor_x >= x1 && cursor_x < x2)
2416 int miny = center_pixel + y1 - HANDLE_W / 2;
2417 int maxy = center_pixel + y1 + HANDLE_W / 2;
2418 if(cursor_y >= miny && cursor_y < maxy)
2424 mwindow->undo->update_undo_before(_("keyframe"), LOAD_AUTOMATION);
2428 double position = (double)(cursor_x +
2429 mwindow->edl->local_session->view_start) *
2430 mwindow->edl->local_session->zoom_sample /
2431 mwindow->edl->session->sample_rate;
2432 int64_t unit_position = autos->track->to_units(position, 0);
2433 int new_value = (int)((IntAutos*)autos)->get_automation_constant(unit_position, unit_position);
2435 current = mwindow->session->drag_auto = autos->insert_auto(unit_position);
2436 ((IntAuto*)current)->value = new_value;
2437 mwindow->session->drag_start_percentage = current->value_to_percentage();
2438 mwindow->session->drag_start_position = current->position;
2439 mwindow->session->drag_origin_x = cursor_x;
2440 mwindow->session->drag_origin_y = cursor_y;
2448 void TrackCanvas::calculate_viewport(Track *track,
2449 double &view_start, // Seconds
2450 int64_t &unit_start,
2451 double &view_end, // Seconds
2455 double &zoom_sample,
2458 view_start = (double)mwindow->edl->local_session->view_start *
2459 mwindow->edl->local_session->zoom_sample /
2460 mwindow->edl->session->sample_rate;
2461 unit_start = track->to_units(view_start, 0);
2462 view_end = (double)(mwindow->edl->local_session->view_start +
2464 mwindow->edl->local_session->zoom_sample /
2465 mwindow->edl->session->sample_rate;
2466 unit_end = (int64_t)(track->to_units(view_end, 1));
2467 yscale = mwindow->edl->local_session->zoom_track;
2468 center_pixel = (int)(track->y_pixel + yscale / 2) +
2469 (mwindow->edl->session->show_titles ?
2470 mwindow->theme->title_bg_data->get_h() :
2472 zoom_sample = mwindow->edl->local_session->zoom_sample;
2474 zoom_units = track->to_doubleunits(zoom_sample / mwindow->edl->session->sample_rate);
2477 int TrackCanvas::do_float_autos(Track *track,
2495 double ax, ay, ax2, ay2;
2496 double in_x2, in_y2, out_x2, out_y2;
2501 calculate_viewport(track,
2513 // Get first auto before start
2516 for(current = autos->last;
2517 current && current->position >= unit_start;
2523 ax = (double)(current->position - unit_start) / zoom_units;
2524 ay = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
2529 current = autos->first ? autos->first : autos->default_auto;
2533 ay = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
2543 //printf("TrackCanvas::do_float_autos 1\n");
2554 ax2 = (double)(current->position - unit_start) / zoom_units;
2555 ay2 = (((FloatAuto*)current)->value_to_percentage() - 0.5) * -yscale;
2556 in_x2 = (double)(current->position +
2557 ((FloatAuto*)current)->control_in_position -
2560 in_y2 = (((FloatAuto*)current)->invalue_to_percentage() - 0.5) * -yscale;
2561 out_x2 = (double)(current->position +
2562 ((FloatAuto*)current)->control_out_position -
2565 out_y2 = (((FloatAuto*)current)->outvalue_to_percentage() - 0.5) * -yscale;
2574 slope = (ay2 - ay) / (ax2 - ax);
2580 ay2 = ay + slope * (get_w() - ax);
2585 ay = ay + slope * (0 - ax);
2603 if(current && !result)
2605 if(current != autos->default_auto)
2610 result = test_floatauto(current,
2625 draw_floatauto(current,
2642 // Draw joining line
2649 result = test_floatline(center_pixel,
2655 // Exclude auto coverage from the end of the line. The auto overlaps
2656 (int)ax2 - HANDLE_W / 2,
2664 draw_floatline(center_pixel,
2665 (FloatAuto*)previous,
2666 (FloatAuto*)current,
2694 current->position <= unit_end &&
2697 //printf("TrackCanvas::do_float_autos 100\n");
2706 if(ax < get_w() && !result)
2714 result = test_floatline(center_pixel,
2727 draw_floatline(center_pixel,
2728 (FloatAuto*)previous,
2729 (FloatAuto*)current,
2752 int TrackCanvas::do_toggle_autos(Track *track,
2769 double ax, ay, ax2, ay2;
2771 calculate_viewport(track,
2782 double high = -yscale * 0.8 / 2;
2783 double low = yscale * 0.8 / 2;
2785 // Get first auto before start
2787 for(current = autos->last; current && current->position >= unit_start; current = PREVIOUS)
2793 ay = ((IntAuto*)current)->value > 0 ? high : low;
2798 current = autos->first ? autos->first : autos->default_auto;
2802 ay = ((IntAuto*)current)->value > 0 ? high : low;
2815 ax2 = (double)(current->position - unit_start) / zoom_units;
2816 ay2 = ((IntAuto*)current)->value > 0 ? high : low;
2824 if(ax2 > get_w()) ax2 = get_w();
2826 if(current && !result)
2828 if(current != autos->default_auto)
2834 result = test_auto(current,
2862 result = test_toggleline(autos,
2875 draw_toggleline(center_pixel,
2884 }while(current && current->position <= unit_end && !result);
2886 if(ax < get_w() && !result)
2894 result = test_toggleline(autos,
2906 draw_toggleline(center_pixel,
2916 int TrackCanvas::do_autos(Track *track,
2935 calculate_viewport(track,
2947 for(current = autos->first; current && !result; current = NEXT)
2949 if(current->position >= unit_start && current->position < unit_end)
2952 x = (int64_t)((double)(current->position - unit_start) /
2953 zoom_units - (pixmap->get_w() / 2 + 0.5));
2954 y = center_pixel - pixmap->get_h() / 2;
2958 if(cursor_x >= x && cursor_y >= y &&
2959 cursor_x < x + pixmap->get_w() &&
2960 cursor_y < y + pixmap->get_h())
2966 mwindow->session->drag_auto = current;
2967 mwindow->session->drag_start_position = current->position;
2968 mwindow->session->drag_origin_x = cursor_x;
2969 mwindow->session->drag_origin_y = cursor_y;
2971 double position = autos->track->from_units(current->position);
2972 double center = (mwindow->edl->local_session->selectionstart +
2973 mwindow->edl->local_session->selectionend) /
2978 mwindow->edl->local_session->selectionstart = position;
2979 mwindow->edl->local_session->selectionend = position;
2982 if(position < center)
2984 mwindow->edl->local_session->selectionstart = position;
2987 mwindow->edl->local_session->selectionend = position;
2992 draw_pixmap(pixmap, x, y);
2998 int TrackCanvas::do_plugin_autos(Track *track,
3003 Plugin* &keyframe_plugin,
3004 KeyFrame* &keyframe_instance)
3017 if(!track->expand_view) return 0;
3019 calculate_viewport(track,
3031 for(int i = 0; i < track->plugin_set.total && !result; i++)
3033 PluginSet *plugin_set = track->plugin_set.values[i];
3034 int center_pixel = (int)(track->y_pixel +
3035 mwindow->edl->local_session->zoom_track +
3036 (i + 0.5) * mwindow->theme->plugin_bg_data->get_h() +
3037 (mwindow->edl->session->show_titles ? mwindow->theme->title_bg_data->get_h() : 0));
3039 for(Plugin *plugin = (Plugin*)plugin_set->first;
3041 plugin = (Plugin*)plugin->next)
3043 for(KeyFrame *keyframe = (KeyFrame*)plugin->keyframes->first;
3044 keyframe && !result;
3045 keyframe = (KeyFrame*)keyframe->next)
3047 //printf("TrackCanvas::draw_plugin_autos 3 %d\n", keyframe->position);
3048 if(keyframe->position >= unit_start && keyframe->position < unit_end)
3050 int64_t x = (int64_t)((keyframe->position - unit_start) / zoom_units);
3051 int y = center_pixel - keyframe_pixmap->get_h() / 2;
3053 //printf("TrackCanvas::draw_plugin_autos 4 %d %d\n", x, center_pixel);
3056 if(cursor_x >= x && cursor_y >= y &&
3057 cursor_x < x + keyframe_pixmap->get_w() &&
3058 cursor_y < y + keyframe_pixmap->get_h())
3061 keyframe_plugin = plugin;
3062 keyframe_instance = keyframe;
3066 mwindow->session->drag_auto = keyframe;
3067 mwindow->session->drag_start_position = keyframe->position;
3068 mwindow->session->drag_origin_x = cursor_x;
3069 mwindow->session->drag_origin_y = cursor_y;
3071 double position = track->from_units(keyframe->position);
3072 double center = (mwindow->edl->local_session->selectionstart +
3073 mwindow->edl->local_session->selectionend) /
3078 mwindow->edl->local_session->selectionstart = position;
3079 mwindow->edl->local_session->selectionend = position;
3082 if(position < center)
3084 mwindow->edl->local_session->selectionstart = position;
3087 mwindow->edl->local_session->selectionend = position;
3092 draw_pixmap(keyframe_pixmap,
3099 //printf("TrackCanvas::draw_plugin_autos 5\n");
3103 void TrackCanvas::draw_overlays()
3105 int new_cursor, update_cursor, rerender;
3106 //TRACE("TrackCanvas::draw_overlays 1")
3108 // Move background pixmap to foreground pixmap
3109 draw_pixmap(background_pixmap,
3116 //TRACE("TrackCanvas::draw_overlays 10")
3119 draw_inout_points();
3121 //TRACE("TrackCanvas::draw_overlays 11");
3123 if(mwindow->edl->session->auto_conf->transitions) draw_transitions();
3125 //TRACE("TrackCanvas::draw_overlays 12");
3129 //TRACE("TrackCanvas::draw_overlays 13");
3132 draw_brender_start();
3134 //TRACE("TrackCanvas::draw_overlays 14");
3135 // Highlighted areas
3136 draw_highlighting();
3138 //TRACE("TrackCanvas::draw_overlays 15");
3148 //TRACE("TrackCanvas::draw_overlays 16\n");
3150 if(gui->cursor) gui->cursor->restore();
3152 //TRACE("TrackCanvas::draw_overlays 17\n");
3156 //TRACE("TrackCanvas::draw_overlays 20");
3158 draw_playback_cursor();
3162 int TrackCanvas::activate()
3166 get_top_level()->deactivate();
3168 set_active_subwindow(this);
3169 gui->cursor->activate();
3174 int TrackCanvas::deactivate()
3179 gui->cursor->deactivate();
3185 void TrackCanvas::update_drag_handle()
3187 double new_position;
3190 (double)(get_cursor_x() + mwindow->edl->local_session->view_start) *
3191 mwindow->edl->local_session->zoom_sample /
3192 mwindow->edl->session->sample_rate;
3194 mwindow->edl->align_to_frame(new_position, 0);
3197 if(new_position != mwindow->session->drag_position)
3199 mwindow->session->drag_position = new_position;
3200 gui->mainclock->update(new_position);
3201 // Que the CWindow. Doesn't do anything if selectionstart and selection end
3203 // mwindow->cwindow->update(1, 0, 0);
3207 int TrackCanvas::update_drag_edit()
3216 #define UPDATE_DRAG_HEAD(do_clamp) \
3218 int x = cursor_x - mwindow->session->drag_origin_x; \
3219 int y = cursor_y - mwindow->session->drag_origin_y; \
3221 if(!current->autos->track->record) return 0; \
3222 double view_start; \
3223 int64_t unit_start; \
3228 double zoom_sample; \
3229 double zoom_units; \
3231 mwindow->undo->update_undo_before(_("tweek"), LOAD_AUTOMATION); \
3232 calculate_viewport(current->autos->track, \
3242 float percentage = (float)(mwindow->session->drag_origin_y - cursor_y) / \
3243 MAX(128, yscale) + \
3244 mwindow->session->drag_start_percentage; \
3245 if(do_clamp) CLAMP(percentage, 0, 1); \
3247 int64_t position = Units::to_int64(zoom_units * \
3248 (cursor_x - mwindow->session->drag_origin_x) + \
3249 mwindow->session->drag_start_position); \
3251 if((do_clamp) && position < 0) position = 0;
3261 int TrackCanvas::update_drag_floatauto(int cursor_x, int cursor_y)
3263 FloatAuto *current = (FloatAuto*)mwindow->session->drag_auto;
3265 UPDATE_DRAG_HEAD(mwindow->session->drag_handle == 0);
3269 //printf("TrackCanvas::update_drag_floatauto %ld %d\n",
3271 //mwindow->session->drag_handle);
3273 switch(mwindow->session->drag_handle)
3277 // Snap to nearby values
3278 old_value = current->value;
3285 value = ((FloatAuto*)current)->percentage_to_value(percentage);
3287 if(current->previous)
3289 value1 = ((FloatAuto*)current->previous)->value;
3290 distance1 = fabs(value - value1);
3291 current->value = value1;
3296 value2 = ((FloatAuto*)current->next)->value;
3297 distance2 = fabs(value - value2);
3298 if(!current->previous || distance2 < distance1)
3300 current->value = value2;
3304 if(!current->previous && !current->next)
3306 current->value = ((FloatAutos*)current->autos)->default_;
3308 value = current->value;
3311 value = ((FloatAuto*)current)->percentage_to_value(percentage);
3313 //printf("TrackCanvas::update_drag_floatauto 1 %f\n", value);
3314 if(value != old_value || position != current->position)
3317 float change = value - old_value;
3318 current->value = value;
3319 current->position = position;
3320 synchronize_autos(change, current->autos->track, current, 0);
3322 char string[BCTEXTLEN], string2[BCTEXTLEN];
3323 Units::totext(string2,
3324 current->autos->track->from_units(current->position),
3325 mwindow->edl->session->time_format,
3326 mwindow->edl->session->sample_rate,
3327 mwindow->edl->session->frame_rate,
3328 mwindow->edl->session->frames_per_foot);
3329 sprintf(string, "%s, %.2f", string2, current->value);
3330 gui->show_message(string);
3336 value = ((FloatAuto*)current)->percentage_to_invalue(percentage);
3337 position = MIN(0, position);
3338 if(value != current->control_in_value ||
3339 position != current->control_in_position)
3342 current->control_in_value = value;
3343 current->control_in_position = position;
3344 synchronize_autos(0, current->autos->track, current, 0);
3346 char string[BCTEXTLEN], string2[BCTEXTLEN];
3347 Units::totext(string2,
3348 current->autos->track->from_units(current->control_in_position),
3349 mwindow->edl->session->time_format,
3350 mwindow->edl->session->sample_rate,
3351 mwindow->edl->session->frame_rate,
3352 mwindow->edl->session->frames_per_foot);
3353 sprintf(string, "%s, %.2f", string2, current->control_in_value);
3354 gui->show_message(string);
3360 value = ((FloatAuto*)current)->percentage_to_outvalue(percentage);
3361 position = MAX(0, position);
3362 if(value != current->control_out_value ||
3363 position != current->control_out_position)
3366 current->control_out_value = value;
3367 current->control_out_position = position;
3368 synchronize_autos(0, current->autos->track, current, 0);
3370 char string[BCTEXTLEN], string2[BCTEXTLEN];
3371 Units::totext(string2,
3372 current->autos->track->from_units(
3373 ((FloatAuto*)current)->control_out_position),
3374 mwindow->edl->session->time_format,
3375 mwindow->edl->session->sample_rate,
3376 mwindow->edl->session->frame_rate,
3377 mwindow->edl->session->frames_per_foot);
3378 sprintf(string, "%s, %.2f",
3380 ((FloatAuto*)current)->control_out_value);
3381 gui->show_message(string);
3389 int TrackCanvas::update_drag_toggleauto(int cursor_x, int cursor_y)
3391 IntAuto *current = (IntAuto*)mwindow->session->drag_auto;
3393 UPDATE_DRAG_HEAD(1);
3395 int value = ((IntAuto*)current)->percentage_to_value(percentage);
3397 if(value != current->value || position != current->position)
3400 current->value = value;
3401 current->position = position;
3403 char string[BCTEXTLEN], string2[BCTEXTLEN];
3404 Units::totext(string2,
3405 current->autos->track->from_units(current->position),
3406 mwindow->edl->session->time_format,
3407 mwindow->edl->session->sample_rate,
3408 mwindow->edl->session->frame_rate,
3409 mwindow->edl->session->frames_per_foot);
3410 sprintf(string, "%s, %d", string2, current->value);
3411 gui->show_message(string);
3417 // Autos which can't change value through dragging.
3419 int TrackCanvas::update_drag_auto(int cursor_x, int cursor_y)
3421 Auto *current = (Auto*)mwindow->session->drag_auto;
3425 if(position != current->position)
3428 current->position = position;
3430 char string[BCTEXTLEN];
3431 Units::totext(string,
3432 current->autos->track->from_units(current->position),
3433 mwindow->edl->session->time_format,
3434 mwindow->edl->session->sample_rate,
3435 mwindow->edl->session->frame_rate,
3436 mwindow->edl->session->frames_per_foot);
3437 gui->show_message(string);
3439 double position_f = current->autos->track->from_units(current->position);
3440 double center_f = (mwindow->edl->local_session->selectionstart +
3441 mwindow->edl->local_session->selectionend) /
3445 mwindow->edl->local_session->selectionstart = position_f;
3446 mwindow->edl->local_session->selectionend = position_f;
3449 if(position_f < center_f)
3451 mwindow->edl->local_session->selectionstart = position_f;
3454 mwindow->edl->local_session->selectionend = position_f;
3461 void TrackCanvas::update_drag_caption()
3463 switch(mwindow->session->current_operation)
3473 int TrackCanvas::cursor_motion_event()
3475 int result, cursor_x, cursor_y;
3476 int update_clock = 0;
3477 int update_zoom = 0;
3478 int update_scroll = 0;
3479 int update_overlay = 0;
3480 int update_cursor = 0;
3483 double position = 0;
3484 //printf("TrackCanvas::cursor_motion_event 1\n");
3488 switch(mwindow->edl->session->editing_mode)
3490 case EDITING_ARROW: new_cursor = ARROW_CURSOR; break;
3491 case EDITING_IBEAM: new_cursor = IBEAM_CURSOR; break;
3494 switch(mwindow->session->current_operation)
3496 case DRAG_EDITHANDLE1:
3497 // Outside threshold. Upgrade status
3498 //printf("TrackCanvas::cursor_motion_event 1\n");
3499 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
3501 //printf("TrackCanvas::cursor_motion_event 2\n");
3502 mwindow->session->current_operation = DRAG_EDITHANDLE2;
3507 case DRAG_EDITHANDLE2:
3508 update_drag_handle();
3512 case DRAG_PLUGINHANDLE1:
3513 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
3515 //printf("TrackCanvas::cursor_motion_event 2\n");
3516 mwindow->session->current_operation = DRAG_PLUGINHANDLE2;
3521 case DRAG_PLUGINHANDLE2:
3522 update_drag_handle();
3526 // Rubber band curves
3528 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
3532 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
3536 rerender = update_overlay = update_drag_floatauto(get_cursor_x(), get_cursor_y());
3540 rerender = update_overlay = update_drag_toggleauto(get_cursor_x(), get_cursor_y());
3544 rerender = update_overlay = update_drag_toggleauto(get_cursor_x(), get_cursor_y());
3547 // Keyframe icons are sticky
3549 case DRAG_CAMERA_PRE:
3552 case DRAG_PROJECTOR_PRE:
3553 case DRAG_PLUGINKEY_PRE:
3554 if(labs(get_cursor_x() - mwindow->session->drag_origin_x) > HANDLE_W)
3556 //printf("TrackCanvas::cursor_motion_event 2\n");
3557 mwindow->session->current_operation++;
3566 case DRAG_PROJECTOR:
3567 case DRAG_PLUGINKEY:
3568 rerender = update_overlay =
3569 update_drag_auto(get_cursor_x(), get_cursor_y());
3574 cursor_x = get_cursor_x();
3575 cursor_y = get_cursor_y();
3576 position = (double)(cursor_x + mwindow->edl->local_session->view_start) *
3577 mwindow->edl->local_session->zoom_sample /
3578 mwindow->edl->session->sample_rate;
3580 position = mwindow->edl->align_to_frame(position, 0);
3581 position = MAX(position, 0);
3583 if(position < selection_midpoint1)
3585 mwindow->edl->local_session->selectionend = selection_midpoint1;
3586 mwindow->edl->local_session->selectionstart = position;
3588 mwindow->cwindow->update(1, 0, 0, 0, 1);
3589 // Update the faders
3590 mwindow->update_plugin_guis();
3591 gui->patchbay->update();
3595 mwindow->edl->local_session->selectionstart = selection_midpoint1;
3596 mwindow->edl->local_session->selectionend = position;
3597 // Don't que the CWindow
3599 //printf("TrackCanvas::cursor_motion_event 1 %f %f %f\n", position, mwindow->edl->local_session->selectionstart, mwindow->edl->local_session->selectionend);
3601 gui->cursor->hide();
3602 gui->cursor->draw();
3612 if(is_event_win() && cursor_inside())
3615 cursor_x = get_cursor_x();
3616 position = (double)cursor_x *
3617 (double)mwindow->edl->local_session->zoom_sample /
3618 (double)mwindow->edl->session->sample_rate +
3619 (double)mwindow->edl->local_session->view_start *
3620 (double)mwindow->edl->local_session->zoom_sample /
3621 (double)mwindow->edl->session->sample_rate;
3622 position = mwindow->edl->align_to_frame(position, 0);
3626 if(mwindow->edl->session->auto_conf->transitions &&
3627 test_transitions(get_cursor_x(),
3637 if(do_keyframes(get_cursor_x(),
3649 if(test_edit_handles(get_cursor_x(),
3658 // Plugin boundaries
3659 if(test_plugin_handles(get_cursor_x(),
3668 if(test_edits(get_cursor_x(),
3683 //printf("TrackCanvas::cursor_motion_event 1\n");
3684 if(update_cursor && new_cursor != get_cursor())
3686 set_cursor(new_cursor);
3689 //printf("TrackCanvas::cursor_motion_event 1 %d\n", rerender);
3692 mwindow->restart_brender();
3693 mwindow->sync_parameters(CHANGE_PARAMS);
3694 mwindow->update_plugin_guis();
3695 mwindow->cwindow->update(1, 0, 0, 0, 1);
3697 gui->patchbay->update();
3703 if(!mwindow->cwindow->playback_engine->is_playing_back)
3704 gui->mainclock->update(position);
3709 gui->zoombar->update();
3715 (cursor_x >= get_w() || cursor_x < 0 || cursor_y >= get_h() || cursor_y < 0))
3719 (cursor_x < get_w() && cursor_x >= 0 && cursor_y < get_h() && cursor_y >= 0))
3731 //printf("TrackCanvas::cursor_motion_event 100\n");
3735 void TrackCanvas::start_dragscroll()
3740 set_repeat(BC_WindowBase::get_resources()->scroll_repeat);
3741 //printf("TrackCanvas::start_dragscroll 1\n");
3745 void TrackCanvas::stop_dragscroll()
3750 unset_repeat(BC_WindowBase::get_resources()->scroll_repeat);
3751 //printf("TrackCanvas::stop_dragscroll 1\n");
3755 int TrackCanvas::repeat_event(int64_t duration)
3757 if(!drag_scroll) return 0;
3758 if(duration != BC_WindowBase::get_resources()->scroll_repeat) return 0;
3760 int sample_movement = 0;
3761 int track_movement = 0;
3762 int64_t x_distance = 0;
3763 int64_t y_distance = 0;
3764 double position = 0;
3767 switch(mwindow->session->current_operation)
3770 //printf("TrackCanvas::repeat_event 1 %d\n", mwindow->edl->local_session->view_start);
3771 if(get_cursor_x() > get_w())
3773 x_distance = get_cursor_x() - get_w();
3774 sample_movement = 1;
3777 if(get_cursor_x() < 0)
3779 x_distance = get_cursor_x();
3780 sample_movement = 1;
3783 if(get_cursor_y() > get_h())
3785 y_distance = get_cursor_y() - get_h();
3789 if(get_cursor_y() < 0)
3791 y_distance = get_cursor_y();
3801 position = (double)(get_cursor_x() +
3802 mwindow->edl->local_session->view_start +
3804 mwindow->edl->local_session->zoom_sample /
3805 mwindow->edl->session->sample_rate;
3806 position = mwindow->edl->align_to_frame(position, 0);
3807 position = MAX(position, 0);
3809 //printf("TrackCanvas::repeat_event 1 %f\n", position);
3810 switch(mwindow->session->current_operation)
3813 if(position < selection_midpoint1)
3815 mwindow->edl->local_session->selectionend = selection_midpoint1;
3816 mwindow->edl->local_session->selectionstart = position;
3818 mwindow->cwindow->update(1, 0, 0);
3819 // Update the faders
3820 mwindow->update_plugin_guis();
3821 gui->patchbay->update();
3825 mwindow->edl->local_session->selectionstart = selection_midpoint1;
3826 mwindow->edl->local_session->selectionend = position;
3827 // Don't que the CWindow
3832 mwindow->samplemovement(mwindow->edl->local_session->view_start +
3838 mwindow->trackmovement(mwindow->edl->local_session->track_start +
3845 int TrackCanvas::button_release_event()
3847 int redraw = 0, update_overlay = 0, result = 0;
3849 switch(mwindow->session->current_operation)
3851 case DRAG_EDITHANDLE2:
3852 mwindow->session->current_operation = NO_OPERATION;
3856 end_edithandle_selection();
3859 case DRAG_EDITHANDLE1:
3860 mwindow->session->current_operation = NO_OPERATION;
3865 case DRAG_PLUGINHANDLE2:
3866 mwindow->session->current_operation = NO_OPERATION;
3870 end_pluginhandle_selection();
3873 case DRAG_PLUGINHANDLE1:
3874 mwindow->session->current_operation = NO_OPERATION;
3880 synchronize_autos(0, 0, 0, -1); // delete the drag_auto_gang first and remove out of order keys
3889 case DRAG_PROJECTOR:
3890 case DRAG_PLUGINKEY:
3891 mwindow->session->current_operation = NO_OPERATION;
3892 mwindow->session->drag_handle = 0;
3893 // Remove any out-of-order keyframe
3894 if(mwindow->session->drag_auto)
3896 mwindow->session->drag_auto->autos->remove_nonsequential(
3897 mwindow->session->drag_auto);
3898 // mwindow->session->drag_auto->autos->optimize();
3901 mwindow->undo->update_undo_after();
3906 case DRAG_AEFFECT_COPY:
3907 case DRAG_VEFFECT_COPY:
3908 // Trap in drag stop
3914 if(mwindow->session->current_operation)
3916 mwindow->session->current_operation = NO_OPERATION;
3918 // Traps button release events
3924 cursor_motion_event();
3940 int TrackCanvas::test_edit_handles(int cursor_x,
3946 Edit *edit_result = 0;
3947 int handle_result = 0;
3950 for(Track *track = mwindow->edl->tracks->first;
3952 track = track->next)
3954 for(Edit *edit = track->edits->first;
3958 int64_t edit_x, edit_y, edit_w, edit_h;
3959 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
3961 if(cursor_x >= edit_x && cursor_x <= edit_x + edit_w &&
3962 cursor_y >= edit_y && cursor_y < edit_y + edit_h)
3964 if(cursor_x < edit_x + HANDLE_W)
3971 if(cursor_x >= edit_x + edit_w - HANDLE_W)
3989 if(handle_result == 0)
3991 position = edit_result->track->from_units(edit_result->startproject);
3992 new_cursor = LEFT_CURSOR;
3995 if(handle_result == 1)
3997 position = edit_result->track->from_units(edit_result->startproject + edit_result->length);
3998 new_cursor = RIGHT_CURSOR;
4001 // Reposition cursor
4004 mwindow->session->drag_edit = edit_result;
4005 mwindow->session->drag_handle = handle_result;
4006 mwindow->session->drag_button = get_buttonpress() - 1;
4007 mwindow->session->drag_position = position;
4008 mwindow->session->current_operation = DRAG_EDITHANDLE1;
4009 mwindow->session->drag_origin_x = get_cursor_x();
4010 mwindow->session->drag_origin_y = get_cursor_y();
4011 mwindow->session->drag_start = position;
4013 int rerender = start_selection(position);
4015 mwindow->cwindow->update(1, 0, 0);
4016 gui->timebar->update_highlights();
4017 gui->zoombar->update();
4018 gui->cursor->hide();
4019 gui->cursor->draw();
4029 int TrackCanvas::test_plugin_handles(int cursor_x,
4035 Plugin *plugin_result = 0;
4036 int handle_result = 0;
4039 for(Track *track = mwindow->edl->tracks->first;
4041 track = track->next)
4043 for(int i = 0; i < track->plugin_set.total && !result; i++)
4045 PluginSet *plugin_set = track->plugin_set.values[i];
4046 for(Plugin *plugin = (Plugin*)plugin_set->first;
4048 plugin = (Plugin*)plugin->next)
4050 int64_t plugin_x, plugin_y, plugin_w, plugin_h;
4051 plugin_dimensions(plugin, plugin_x, plugin_y, plugin_w, plugin_h);
4053 if(cursor_x >= plugin_x && cursor_x <= plugin_x + plugin_w &&
4054 cursor_y >= plugin_y && cursor_y < plugin_y + plugin_h)
4056 if(cursor_x < plugin_x + HANDLE_W)
4058 plugin_result = plugin;
4063 if(cursor_x >= plugin_x + plugin_w - HANDLE_W)
4065 plugin_result = plugin;
4074 //printf("TrackCanvas::test_plugin_handles %d %d %d\n", button_press, handle_result, result);
4079 if(handle_result == 0)
4081 position = plugin_result->track->from_units(plugin_result->startproject);
4082 new_cursor = LEFT_CURSOR;
4085 if(handle_result == 1)
4087 position = plugin_result->track->from_units(plugin_result->startproject + plugin_result->length);
4088 new_cursor = RIGHT_CURSOR;
4093 mwindow->session->drag_plugin = plugin_result;
4094 mwindow->session->drag_handle = handle_result;
4095 mwindow->session->drag_button = get_buttonpress() - 1;
4096 mwindow->session->drag_position = position;
4097 mwindow->session->current_operation = DRAG_PLUGINHANDLE1;
4098 mwindow->session->drag_origin_x = get_cursor_x();
4099 mwindow->session->drag_origin_y = get_cursor_y();
4100 mwindow->session->drag_start = position;
4102 int rerender = start_selection(position);
4103 if(rerender) mwindow->cwindow->update(1, 0, 0);
4104 gui->timebar->update_highlights();
4105 gui->zoombar->update();
4106 gui->cursor->hide();
4107 gui->cursor->draw();
4118 int TrackCanvas::test_tracks(int cursor_x,
4123 for(Track *track = mwindow->edl->tracks->first;
4125 track = track->next)
4127 int64_t track_x, track_y, track_w, track_h;
4128 track_dimensions(track, track_x, track_y, track_w, track_h);
4131 get_buttonpress() == 3 &&
4132 cursor_y >= track_y &&
4133 cursor_y < track_y + track_h)
4135 gui->edit_menu->update(track, 0);
4136 gui->edit_menu->activate_menu();
4143 int TrackCanvas::test_edits(int cursor_x,
4153 int over_edit_handle = 0;
4155 //printf("TrackCanvas::test_edits 1\n");
4156 for(Track *track = mwindow->edl->tracks->first;
4158 track = track->next)
4160 for(Edit *edit = track->edits->first;
4164 int64_t edit_x, edit_y, edit_w, edit_h;
4165 //printf("TrackCanvas::test_edits 1\n");
4166 edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
4168 // Cursor inside a track
4169 // Cursor inside an edit
4170 if(cursor_x >= edit_x && cursor_x < edit_x + edit_w &&
4171 cursor_y >= edit_y && cursor_y < edit_y + edit_h)
4173 // Select duration of edit
4174 //printf("TrackCanvas::test_edits 2\n");
4177 if(get_double_click() && !drag_start)
4179 //printf("TrackCanvas::test_edits 3\n");
4180 mwindow->edl->local_session->selectionstart =
4181 edit->track->from_units(edit->startproject);
4182 mwindow->edl->local_session->selectionend =
4183 edit->track->from_units(edit->startproject) +
4184 edit->track->from_units(edit->length);
4185 if(mwindow->edl->session->cursor_on_frames)
4187 mwindow->edl->local_session->selectionstart =
4188 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionstart, 0);
4189 mwindow->edl->local_session->selectionend =
4190 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionend, 1);
4200 if(mwindow->edl->session->editing_mode == EDITING_ARROW)
4202 // Need to create drag window
4203 mwindow->session->current_operation = DRAG_EDIT;
4204 mwindow->session->drag_edit = edit;
4205 //printf("TrackCanvas::test_edits 2\n");
4207 // Drag only one edit
4210 mwindow->session->drag_edits->remove_all();
4211 mwindow->session->drag_edits->append(edit);
4214 // Construct list of all affected edits
4216 mwindow->edl->tracks->get_affected_edits(
4217 mwindow->session->drag_edits,
4218 edit->track->from_units(edit->startproject),
4221 mwindow->session->drag_origin_x = cursor_x;
4222 mwindow->session->drag_origin_y = cursor_y;
4224 drag_popup = new BC_DragWindow(gui,
4225 mwindow->theme->clip_icon,
4226 get_abs_cursor_x(0) - mwindow->theme->clip_icon->get_w() / 2,
4227 get_abs_cursor_y(0) - mwindow->theme->clip_icon->get_h() / 2);
4228 //printf("TrackCanvas::test_edits 3 %p\n", drag_popup);
4240 int TrackCanvas::test_resources(int cursor_x, int cursor_y)
4245 int TrackCanvas::test_plugins(int cursor_x,
4258 //printf("TrackCanvas::test_plugins 1\n");
4259 for(track = mwindow->edl->tracks->first;
4261 track = track->next)
4263 for(int i = 0; i < track->plugin_set.total && !done; i++)
4265 PluginSet *plugin_set = track->plugin_set.values[i];
4266 for(plugin = (Plugin*)plugin_set->first;
4268 plugin = (Plugin*)plugin->next)
4270 plugin_dimensions(plugin, x, y, w, h);
4271 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
4272 MWindowGUI::visible(y, y + h, 0, get_h()))
4274 if(cursor_x >= x && cursor_x < x + w &&
4275 cursor_y >= y && cursor_y < y + h)
4285 //printf("TrackCanvas::test_plugins 1\n");
4288 // Start plugin popup
4291 //printf("TrackCanvas::test_plugins 2\n");
4292 if(get_buttonpress() == 3)
4294 gui->plugin_menu->update(plugin);
4295 gui->plugin_menu->activate_menu();
4299 // Select range of plugin on doubleclick over plugin
4300 if (get_double_click() && !drag_start)
4302 mwindow->edl->local_session->selectionstart =
4303 plugin->track->from_units(plugin->startproject);
4304 mwindow->edl->local_session->selectionend =
4305 plugin->track->from_units(plugin->startproject) +
4306 plugin->track->from_units(plugin->length);
4307 if(mwindow->edl->session->cursor_on_frames)
4309 mwindow->edl->local_session->selectionstart =
4310 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionstart, 0);
4311 mwindow->edl->local_session->selectionend =
4312 mwindow->edl->align_to_frame(mwindow->edl->local_session->selectionend, 1);
4318 //printf("TrackCanvas::test_plugins 3\n");
4324 //printf("TrackCanvas::test_plugins 4\n");
4325 if(mwindow->edl->session->editing_mode == EDITING_ARROW)
4327 //printf("TrackCanvas::test_plugins 5\n");
4328 if(plugin->track->data_type == TRACK_AUDIO)
4329 mwindow->session->current_operation = DRAG_AEFFECT_COPY;
4331 if(plugin->track->data_type == TRACK_VIDEO)
4332 mwindow->session->current_operation = DRAG_VEFFECT_COPY;
4334 mwindow->session->drag_plugin = plugin;
4335 //printf("TrackCanvas::test_plugins 6\n");
4342 switch(plugin->plugin_type)
4344 case PLUGIN_STANDALONE:
4346 PluginServer *server = mwindow->scan_plugindb(
4348 plugin->track->data_type);
4349 VFrame *frame = server->picon;
4350 //printf("TrackCanvas::test_plugins 7\n");
4351 drag_popup = new BC_DragWindow(gui,
4353 get_abs_cursor_x(0) - frame->get_w() / 2,
4354 get_abs_cursor_y(0) - frame->get_h() / 2);
4358 case PLUGIN_SHAREDPLUGIN:
4359 case PLUGIN_SHAREDMODULE:
4360 drag_popup = new BC_DragWindow(gui,
4361 mwindow->theme->clip_icon,
4362 get_abs_cursor_x(0) - mwindow->theme->clip_icon->get_w() / 2,
4363 get_abs_cursor_y(0) - mwindow->theme->clip_icon->get_h() / 2);
4365 //printf("test plugins %d %p\n", mwindow->edl->session->editing_mode, mwindow->session->drag_plugin);
4368 //printf("TrackCanvas::test_plugins 9 %p\n");
4370 //printf("TrackCanvas::test_plugins 10\n");
4376 //printf("TrackCanvas::test_plugins 11\n");
4380 int TrackCanvas::test_transitions(int cursor_x,
4386 Transition *transition = 0;
4390 for(Track *track = mwindow->edl->tracks->first;
4392 track = track->next)
4394 for(Edit *edit = track->edits->first;
4398 if(edit->transition)
4400 edit_dimensions(edit, x, y, w, h);
4401 get_transition_coords(x, y, w, h);
4403 if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
4404 MWindowGUI::visible(y, y + h, 0, get_h()))
4406 if(cursor_x >= x && cursor_x < x + w &&
4407 cursor_y >= y && cursor_y < y + h)
4409 transition = edit->transition;
4423 new_cursor = UPRIGHT_ARROW_CURSOR;
4426 if(get_buttonpress() == 3)
4428 gui->transition_menu->update(transition);
4429 gui->transition_menu->activate_menu();
4436 int TrackCanvas::button_press_event()
4439 int cursor_x, cursor_y;
4440 int new_cursor, update_cursor;
4442 //printf("TrackCanvas::button_press_event 1\n");
4443 cursor_x = get_cursor_x();
4444 cursor_y = get_cursor_y();
4446 if(is_event_win() && cursor_inside())
4453 if(get_buttonpress() == 1)
4455 gui->unlock_window();
4456 gui->mbuttons->transport->handle_transport(STOP, 1);
4457 gui->lock_window("TrackCanvas::button_press_event");
4460 int update_overlay = 0, update_cursor = 0, rerender = 0;
4462 if(get_buttonpress() == 4)
4464 //printf("TrackCanvas::button_press_event 1\n");
4465 mwindow->move_up(get_h() / 10);
4469 if(get_buttonpress() == 5)
4471 //printf("TrackCanvas::button_press_event 2\n");
4472 mwindow->move_down(get_h() / 10);
4476 switch(mwindow->edl->session->editing_mode)
4478 // Test handles and resource boundaries and highlight a track
4483 if(mwindow->edl->session->auto_conf->transitions &&
4484 test_transitions(cursor_x,
4493 if(do_keyframes(cursor_x,
4504 // Test edit boundaries
4505 if(test_edit_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
4510 // Test plugin boundaries
4511 if(test_plugin_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
4516 if(test_edits(cursor_x, cursor_y, 1, 0, update_cursor, rerender, new_cursor, update_cursor))
4521 if(test_plugins(cursor_x, cursor_y, 0, 1, update_cursor, rerender))
4526 if(test_resources(cursor_x, cursor_y))
4531 if(test_tracks(cursor_x, cursor_y, 1))
4538 // Test handles only and select a region
4541 double position = (double)cursor_x *
4542 mwindow->edl->local_session->zoom_sample /
4543 mwindow->edl->session->sample_rate +
4544 (double)mwindow->edl->local_session->view_start *
4545 mwindow->edl->local_session->zoom_sample /
4546 mwindow->edl->session->sample_rate;
4547 //printf("TrackCanvas::button_press_event %d\n", position);
4549 if(mwindow->edl->session->auto_conf->transitions &&
4550 test_transitions(cursor_x,
4559 if(do_keyframes(cursor_x,
4571 // Test edit boundaries
4572 if(test_edit_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
4577 // Test plugin boundaries
4578 if(test_plugin_handles(cursor_x, cursor_y, 1, new_cursor, update_cursor))
4583 if(test_edits(cursor_x, cursor_y, 1, 0, update_cursor, rerender, new_cursor, update_cursor))
4588 if(test_plugins(cursor_x, cursor_y, 0, 1, update_cursor, rerender))
4593 if(test_tracks(cursor_x, cursor_y, 1))
4597 // Highlight selection
4600 rerender = start_selection(position);
4601 mwindow->session->current_operation = SELECT_REGION;
4612 mwindow->cwindow->update(1, 0, 0, 0, 1);
4614 mwindow->update_plugin_guis();
4615 gui->patchbay->update();
4626 gui->timebar->update_highlights();
4627 gui->cursor->hide();
4628 gui->cursor->show();
4629 gui->zoombar->update();
4640 int TrackCanvas::start_selection(double position)
4643 position = mwindow->edl->align_to_frame(position, 0);
4648 double midpoint = (mwindow->edl->local_session->selectionstart +
4649 mwindow->edl->local_session->selectionend) / 2;
4651 if(position < midpoint)
4653 mwindow->edl->local_session->selectionstart = position;
4654 selection_midpoint1 = mwindow->edl->local_session->selectionend;
4660 mwindow->edl->local_session->selectionend = position;
4661 selection_midpoint1 = mwindow->edl->local_session->selectionstart;
4662 // Don't que the CWindow for the end
4666 // Start a new selection
4668 //printf("TrackCanvas::start_selection %f\n", position);
4669 mwindow->edl->local_session->selectionstart =
4670 mwindow->edl->local_session->selectionend =
4672 selection_midpoint1 = position;
4680 void TrackCanvas::end_edithandle_selection()
4682 mwindow->modify_edithandles();
4685 void TrackCanvas::end_pluginhandle_selection()
4687 mwindow->modify_pluginhandles();
4691 double TrackCanvas::time_visible()
4693 return (double)get_w() *
4694 mwindow->edl->local_session->zoom_sample /
4695 mwindow->edl->session->sample_rate;
4738 void TrackCanvas::draw_automation()
4743 int TrackCanvas::set_index_file(int flash, Asset *asset)
4749 int TrackCanvas::button_release()
4755 int TrackCanvas::auto_reposition(int &cursor_x, int &cursor_y, int64_t cursor_position)
4761 int TrackCanvas::draw_floating_handle(int flash)
4766 int TrackCanvas::draw_loop_point(int64_t position, int flash)
4771 int TrackCanvas::draw_playback_cursor(int pixel, int flash)
4777 int TrackCanvas::update_handle_selection(int64_t cursor_position)
4782 int TrackCanvas::end_translation()