#include "edlsession.h"
#include "floatauto.h"
#include "floatautos.h"
+#include "gwindowgui.h"
#include "indexstate.h"
#include "intauto.h"
#include "intautos.h"
int cursor_y = get_relative_cursor_y();
if( get_cursor_over_window() &&
- cursor_x >= 0 && cursor_y >= 0 &&
+ cursor_x >= 0 && cursor_y >= 0 &&
cursor_x < get_w() && cursor_y < get_h() )
{
//printf("TrackCanvas::drag_motion %d %d\n", __LINE__, pane->number);
{
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;
}
double asset_duration = 0;
int64_t asset_length_units = 0;
int64_t position = 0;
-
+
if(mwindow->session->current_operation == DRAG_ASSET &&
mwindow->session->drag_assets->total) {
Indexable *indexable = mwindow->session->drag_assets->values[0];
if (video_length < 0) {
if(mwindow->edl->session->si_useduration)
video_length = mwindow->edl->session->si_duration;
- else
- video_length = 1.0 / mwindow->edl->session->frame_rate ;
+ else
+ video_length = 1.0 / mwindow->edl->session->frame_rate ;
}
asset_duration = video_length / indexable->get_frame_rate();
}
else {
printf("DRAG_ASSET error: Asset dropped, but both drag_clips and drag_assets total is zero\n");
}
-
+
asset_length_units = mwindow->session->track_highlighted->to_units(asset_duration, 1);
position = drop_edit_position (&insertion, NULL, asset_length_units);
if( position == -1 ) {
result = 1;
break; // Do not do anything
}
-
+
double position_f = mwindow->session->track_highlighted->from_units(position);
Track *track = mwindow->session->track_highlighted;
// // FIXME, we should create an mwindow/EDL method that overwrites, without clearing the keyframes and autos
// // Unfortunately, this is _a lot_ of work to do right
// printf("Problematic insertion\n");
-// mwindow->edl->tracks->clear(position_f,
+// mwindow->edl->tracks->clear(position_f,
// position_f + asset_duration, 0);
// }
mwindow->paste_assets(position_f, track, !insertion);
result = 1;
break; // Do not do anything
}
-
+
double position_f = mwindow->session->track_highlighted->from_units(position);
Track *track = mwindow->session->track_highlighted;
mwindow->move_edits(mwindow->session->drag_edits,
}
// Get the x coordinate
- x = Units::to_int64(position *
+ x = Units::to_int64(position *
mwindow->edl->session->sample_rate /
- mwindow->edl->local_session->zoom_sample) -
+ mwindow->edl->local_session->zoom_sample) -
mwindow->edl->local_session->view_start[pane->number];
double paste_position = -1.;
//printf("TrackCanvas::draw_loop_points 7\n");
}
-void TrackCanvas::draw_brender_start()
+void TrackCanvas::draw_brender_range()
{
if(mwindow->preferences->use_brender)
{
- int64_t x = Units::round(mwindow->edl->session->brender_start *
+ int64_t x1 = Units::round(mwindow->edl->session->brender_start *
+ mwindow->edl->session->sample_rate /
+ mwindow->edl->local_session->zoom_sample -
+ mwindow->edl->local_session->view_start[pane->number]);
+ if(MWindowGUI::visible(x1, x1 + 1, 0, get_w()))
+ {
+ set_color(RED);
+ draw_line(x1, 0, x1, get_h());
+ }
+ int64_t x2 = Units::round(mwindow->edl->session->brender_end *
mwindow->edl->session->sample_rate /
mwindow->edl->local_session->zoom_sample -
mwindow->edl->local_session->view_start[pane->number]);
- if(MWindowGUI::visible(x, x + 1, 0, get_w()))
+ if(MWindowGUI::visible(x2, x2 + 1, 0, get_w()))
{
set_color(RED);
- draw_line(x, 0, x, get_h());
+ draw_line(x2, 0, x2, get_h());
}
}
}
-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,
int grouptype = automation.autogrouptype(i, track);
if(draw) // Do dropshadow
result = do_float_autos(track, autos,
- cursor_x, cursor_y, draw,
+ cursor_x, cursor_y, draw,
buttonpress, 1, 1, MDGREY,
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; }
case Autos::AUTOMATION_TYPE_INT: {
if(draw) // Do dropshadow
result = do_int_autos(track, autos,
- cursor_x, cursor_y, draw,
+ cursor_x, cursor_y, draw,
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; }
}
gui->keyframe_menu->activate_menu();
rerender = 1; // the position changes
}
+ else if( autos )
+ {
+ gui->keyframe_hide->update(autos);
+ gui->keyframe_hide->activate_menu();
+ rerender = 1; // the position changes
+ }
if(buttonpress == 1 && ctrl_down() &&
AUTOMATION_TYPE_FLOAT == autos->get_type())
rerender = 1; // special case: curve mode changed
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,
}
-void TrackCanvas::draw_floatauto(FloatAuto *current,
- int x,
- int y,
- int in_x,
- int in_y,
- int out_x,
- int out_y,
- int center_pixel,
+void TrackCanvas::draw_floatauto(FloatAuto *current,
+ int x,
+ int y,
+ int in_x,
+ int in_y,
+ int out_x,
+ int out_y,
+ int center_pixel,
int zoom_track,
int color)
{
draw_box(x1, y1, x2 - x1, y2 - y1);
}
-// show bezier control points (only) if this
+// show bezier control points (only) if this
// floatauto doesn't adjust it's tangents automatically
if(current->curve_mode != FloatAuto::FREE &&
current->curve_mode != FloatAuto::TFREE)
y += center_pixel;
cp_y += center_pixel;
-
+
// drawing the tangent as a dashed line...
int const dash = HANDLE_W;
int const gap = HANDLE_W / 2;
float sx = 3 * (cp_x - x) / 4.;
float ex = 0;
-
+
// q is the x displacement for a unit line of slope
float q = (sx > 0 ? 1 : -1) / sqrt(1 + slope * slope);
-
+
float dist = 1/q * sx;
if( dist > dash )
ex = sx - q * dash;
-
+
set_color(color);
- do {
+ do {
float sy = slope * sx, ey = slope * ex;
draw_line(quantize(sx + x), quantize(sy + y), quantize(ex + x), quantize(ey + y));
sx = ex - q * gap;
}
-inline
+inline
float levered_position(float position, float ref_pos)
{
- if( 1e-6 > fabs(ref_pos) || isnan(ref_pos))
+ if( 1e-6 > fabs(ref_pos) || isnan(ref_pos))
return 0.0;
return ref_pos / position;
}
int TrackCanvas::test_floatauto(FloatAuto *current, int x, int y, int in_x,
- int in_y, int out_x, int out_y, int center_pixel, int zoom_track,
+ int in_y, int out_x, int out_y, int center_pixel, int zoom_track,
int cursor_x, int cursor_y, int buttonpress, int autogrouptype)
{
int result = 0;
if( WITHIN(x1,x2,y1,y2))
{ // cursor hits node
result = 1;
-
+
if(buttonpress && (buttonpress != 3))
{
INIT_DRAG(current->position, value_to_percentage(current->get_value(), autogrouptype))
// could be ctrl-click or ctrl-drag
// click would cycle through tangent modes
((FloatAuto*)current)->toggle_curve_mode();
-
+
// drag will start dragging the tangent, if applicable
INIT_DRAG(current->position, value_to_percentage(current->get_value(), autogrouptype))
mwindow->session->drag_handle = 0;
}
}
-
+
float lever = 0.0; // we use the tangent as a draggable lever. 1.0 is at the ctrl point
// Test in control
#undef WITHIN
#undef INIT_DRAG
-// if(buttonpress)
-// 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",
+// if(buttonpress)
+// 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",
// mwindow->session->drag_handle,
// ctrl_down(),
// cursor_x,
// Not using slope intercept
x1 = MAX(0, x1);
- int prev_y = y1;
+ int prev_y = y1 + center_pixel;
// Call by reference fails for some reason here
// (int)(center_pixel - yscale / 2),
// (int)(center_pixel + yscale / 2 - 1));
+//printf("draw_line(%d,%d, %d,%d)\n", x - 1, prev_y , x, y);
draw_line(x - 1, prev_y , x, y );
}
prev_y = y;
{
Auto *current;
mwindow->undo->update_undo_before();
- current = mwindow->session->drag_auto = autos->insert_auto(position1);
+ double position = autos->track->from_units(position1);
+ position = mwindow->edl->align_to_frame(position, 0);
+ int64_t new_position = autos->track->to_units(position,0);
+ current = mwindow->session->drag_auto = autos->insert_auto(new_position);
((FloatAuto*)current)->set_value(value);
mwindow->session->drag_start_percentage = value_to_percentage(value, autogrouptype);
mwindow->session->drag_start_position = current->position;
autos->first ? autos->first : autos->default_auto;
double ax = 0, ay = 0, ax2 = 0, ay2 = 0;
- if( first_auto )
+ if( first_auto ) {
calculate_auto_position(&ax, &ay, 0, 0, 0, 0,
first_auto, unit_start, zoom_units, yscale, autogrouptype);
-
+ }
if( current )
current = NEXT;
else {
(int)ax, (int)ax2, cursor_x, cursor_y,
buttonpress, autogrouptype);
}
- if( draw )
+ if( draw )
draw_floatline(center_pixel,
(FloatAuto*)previous, (FloatAuto*)current,
(FloatAutos*)autos, unit_start, zoom_units, yscale,
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;
// Loop points
draw_loop_points();
- draw_brender_start();
+ draw_brender_range();
// Highlighted areas
draw_highlighting();
// Playback cursor
draw_playback_cursor();
+ draw_keyframe_reticle();
+
show_window(0);
}
// not really editing the node, rather start editing the curve
// tangent is editable and drag movement is significant
if( (FloatAuto::FREE == current->curve_mode ||
- FloatAuto::TFREE==current->curve_mode) &&
+ FloatAuto::TFREE==current->curve_mode) &&
(fabs(x) > HANDLE_W / 2 || fabs(y) > HANDLE_W / 2))
mwindow->session->drag_handle = x < 0 ? 1 : 2;
}
if(value != old_value || position != current->position) {
result = 1;
- float change = value - old_value;
+ float change = value - old_value;
current->adjust_to_new_coordinates(position, value);
synchronize_autos(change, current->autos->track, current, 0);
show_message(current, 1,", %.2f", current->get_value());
double position_f = current->autos->track->from_units(current->position);
double center_f = (mwindow->edl->local_session->get_selectionstart(1) +
- mwindow->edl->local_session->get_selectionend(1)) /
+ mwindow->edl->local_session->get_selectionend(1)) /
2;
if(!shift_down())
{
//PluginAutos *pluginautos = (PluginAutos *)current->autos;
PluginSet *pluginset;
Plugin *plugin = 0;
-// figure out the correct pluginset & correct plugin
+// figure out the correct pluginset & correct plugin
int found = 0;
for(int i = 0; i < track->plugin_set.total; i++)
{
currentkeyframe;
currentkeyframe = (KeyFrame *) currentkeyframe->next)
{
- if (currentkeyframe == current)
+ if (currentkeyframe == current)
{
found = 1;
break;
}
-
+
}
- if (found) break;
+ if (found) break;
}
- if (found) break;
+ if (found) break;
}
mwindow->session->plugin_highlighted = plugin;
double position_f = current->autos->track->from_units(current->position);
double center_f = (mwindow->edl->local_session->get_selectionstart(1) +
- mwindow->edl->local_session->get_selectionend(1)) /
+ mwindow->edl->local_session->get_selectionend(1)) /
2;
if(!shift_down())
{
switch(mwindow->session->current_operation)
{
case DRAG_FADE:
-
+
break;
}
}
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;
}
// Extend a border
if(shift_down())
{
- double midpoint = (mwindow->edl->local_session->get_selectionstart(1) +
+ double midpoint = (mwindow->edl->local_session->get_selectionstart(1) +
mwindow->edl->local_session->get_selectionend(1)) / 2;
if(position < midpoint)
// Que the CWindow
rerender = 1;
}
-
+
return rerender;
}
double TrackCanvas::time_visible()
{
- return (double)get_w() *
- mwindow->edl->local_session->zoom_sample /
+ return (double)get_w() *
+ mwindow->edl->local_session->zoom_sample /
mwindow->edl->session->sample_rate;
}
FloatAuto::curve_name(((FloatAuto*)current)->curve_mode));
}
char string2[BCTEXTLEN];
- Units::totext(string2,
+ Units::totext(string2,
current->autos->track->from_units(current->position),
mwindow->edl->session->time_format,
mwindow->edl->session->sample_rate,
// else
// return gui->pane[BOTTOM_LEFT_PANE]->patchbay;
// }
-//
+//
// return 0;
// }