#include "edlsession.h"
#include "floatauto.h"
#include "floatautos.h"
+#include "gwindowgui.h"
#include "indexstate.h"
#include "intauto.h"
#include "intautos.h"
{
int64_t edit_x, edit_y, edit_w, edit_h;
edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
-
- if(cursor_x >= edit_x &&
- cursor_y >= edit_y &&
- cursor_x < edit_x + edit_w &&
- cursor_y < edit_y + edit_h)
- {
+ if( cursor_y < edit_y || cursor_y >= edit_y + edit_h ) continue;
+ if( cursor_x >= edit_x && cursor_x < edit_x + edit_w ) {
*over_edit = edit;
break;
}
+ if( edit != track->edits->last ) continue;
+ if( mwindow->session->current_operation != DRAG_ATRANSITION &&
+ mwindow->session->current_operation != DRAG_VTRANSITION ) continue;
+ if( !edit->silence() ) {
+ // add silence to allow drag transition past last edit
+ // will be deleted by Edits::optimize if not used
+ double length = mwindow->edl->session->default_transition_length;
+ int64_t start = edit->startproject+edit->length;
+ int64_t units = track->to_units(length, 1);
+ track->edits->create_silence(start, start+units);
+ continue;
+ }
+ if( cursor_x >= edit_x ) { *over_edit = edit; break; }
}
for(int i = 0; i < track->plugin_set.total; i++)
}
if( !*over_track )
- *over_track = pane->is_over_patchbay();
+ *over_track = pane->over_patchbay();
return 0;
}
(cursor_y = get_relative_cursor_y()) >= 0 && cursor_y < get_h() )
over_window = 1;
else {
- Track *track = pane->is_over_patchbay();
+ Track *track = pane->over_patchbay();
if( track && mwindow->session->track_highlighted == track )
over_window = 1;
}
}
}
-static int auto_colors[AUTOMATION_TOTAL] =
-{
- BLUE,
- RED,
- GREEN,
- BLUE,
- RED,
- GREEN,
- BLUE,
- WHITE,
- 0,
- 0,
- 0,
- WHITE
-};
-
// The operations which correspond to each automation type
-static int auto_operations[AUTOMATION_TOTAL] =
+int TrackCanvas::auto_operations[AUTOMATION_TOTAL] =
{
DRAG_MUTE,
DRAG_CAMERA_X,
auto_keyframe, grouptype);
result = do_float_autos(track, autos,
- cursor_x, cursor_y, draw,
- buttonpress, 0, 0, auto_colors[i],
+ cursor_x, cursor_y, draw, buttonpress,
+ 0, 0, GWindowGUI::auto_colors[i],
auto_keyframe, grouptype);
break; }
buttonpress, 1, 1, MDGREY,
auto_keyframe);
result = do_int_autos(track, autos,
- cursor_x, cursor_y, draw,
- buttonpress, 0, 0, auto_colors[i],
+ cursor_x, cursor_y, draw, buttonpress,
+ 0, 0, GWindowGUI::auto_colors[i],
auto_keyframe);
break; }
}
return result;
}
+void TrackCanvas::draw_keyframe_reticle()
+{
+ int keyframe_hairline = mwindow->preferences->keyframe_reticle;
+ if( keyframe_hairline == HAIRLINE_NEVER ) return;
+
+ int current_op = mwindow->session->current_operation, dragging = 0;
+ for( int i=0; !dragging && i<AUTOMATION_TOTAL; ++i )
+ if( current_op == auto_operations[i] ) dragging = 1;
+
+ if( keyframe_hairline == HAIRLINE_DRAGGING && dragging ) {
+ if( mwindow->session->drag_auto && get_buttonpress() == 1 ) {
+ draw_hairline(mwindow->session->drag_auto, RED);
+ return;
+ }
+ }
+
+ if( keyframe_hairline == HAIRLINE_ALWAYS || ( get_buttonpress() == 2 &&
+ keyframe_hairline == HAIRLINE_DRAGGING && dragging ) ) {
+ for( Track *track = mwindow->edl->tracks->first; track;
+ track=track->next ) {
+ Automation *automation = track->automation;
+ for( int i=0; i<AUTOMATION_TOTAL; ++i ) {
+ if( !mwindow->edl->session->auto_conf->autos[i] ) continue;
+ // automation visible
+ Autos *autos = automation->autos[i];
+ if( !autos ) continue;
+ for( Auto *auto_keyframe=autos->first; auto_keyframe;
+ auto_keyframe = auto_keyframe->next ) {
+ draw_hairline(auto_keyframe, GREEN);
+ }
+ }
+
+ if( dragging && mwindow->session->drag_auto ) {
+ draw_hairline(mwindow->session->drag_auto, RED);
+ }
+ }
+ }
+}
+
void TrackCanvas::draw_auto(Auto *current,
int x,
int y,
return result;
}
+int TrackCanvas::draw_hairline(Auto *auto_keyframe, int color)
+{
+ Track *track = auto_keyframe->autos->track;
+ int autogrouptype = auto_keyframe->autos->get_type();
+
+ int center_pixel;
+ double view_start, unit_start;
+ double view_end, unit_end, yscale;
+ double zoom_sample, zoom_units;
+
+ calculate_viewport(track, view_start, unit_start, view_end, unit_end,
+ yscale, center_pixel, zoom_sample, zoom_units);
+
+ double ax = 0, ay = 0;
+ calculate_auto_position(&ax, &ay, 0, 0, 0, 0,
+ auto_keyframe, unit_start, zoom_units, yscale, autogrouptype);
+
+ set_color(color);
+ draw_line(ax, 0, ax, get_h());
+ return 0;
+}
+
void TrackCanvas::draw_overlays()
{
int new_cursor, update_cursor, rerender;
// Playback cursor
draw_playback_cursor();
+ draw_keyframe_reticle();
+
show_window(0);
}
switch(mwindow->edl->session->editing_mode) {
// Test handles and resource boundaries and highlight a track
case EDITING_ARROW: {
- if( mwindow->edl->session->auto_conf->transitions &&
- do_transitions(cursor_x, cursor_y,
+ if( do_transitions(cursor_x, cursor_y,
1, new_cursor, update_cursor) ) break;
if( do_keyframes(cursor_x, cursor_y,
mwindow->edl->session->sample_rate;
//printf("TrackCanvas::button_press_event %d\n", position);
- if(mwindow->edl->session->auto_conf->transitions &&
- do_transitions(cursor_x, cursor_y,
+ if( do_transitions(cursor_x, cursor_y,
1, new_cursor, update_cursor)) break;
if(do_keyframes(cursor_x, cursor_y,
0, get_buttonpress(), new_cursor,
if( do_tracks(cursor_x, cursor_y, 1) ) break;
// Highlight selection
+ if( get_buttonpress() != LEFT_BUTTON ) break;
rerender = start_selection(position);
mwindow->session->current_operation = SELECT_REGION;
update_cursor = 1;
if( update_overlay ) {
gui->draw_overlays(1);
}
-
- if( update_cursor > 0 ) {
+ if( update_cursor < 0 ) {
+// double_click edit
+ gui->swindow->update_selection();
+ }
+ if( update_cursor ) {
gui->update_timebar(0);
gui->hide_cursor(0);
gui->show_cursor(1);
gui->zoombar->update();
gui->flash_canvas(1);
}
- else if(update_cursor < 0) {
- gui->swindow->update_selection();
- }
}
return result;
}