void MWindow::clear_entry()
{
undo->update_undo_before();
- clear(1);
+ clear(1, 1);
edl->optimize();
save_backup();
send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1);
}
-void MWindow::clear(int clear_handle)
+void MWindow::clear(int clear_handle, int deglitch)
{
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
edl->session->plugins_follow_edits,
edl->session->autos_follow_edits);
}
+
+// always needed by paste operations
+ if(deglitch)
+ {
+ edl->deglitch(start);
+ }
}
void MWindow::set_automation_mode(int mode)
edl->copy(start, end, 0, 0, 0, &file, "", 1);
const char *file_string = file.string();
long file_length = strlen(file_string);
- gui->get_clipboard()->to_clipboard(file_string, file_length,
- SECONDARY_SELECTION);
- gui->get_clipboard()->to_clipboard(file_string, file_length,
- BC_PRIMARY_SELECTION);
+ gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
+ gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
save_backup();
return 0;
}
edl->tracks->copy_automation(start, end, &file, 0, 1);
const char *file_string = file.string();
long file_length = strlen(file_string);
- gui->get_clipboard()->to_clipboard(file_string, file_length,
- BC_PRIMARY_SELECTION);
- gui->get_clipboard()->to_clipboard(file_string, file_length,
- SECONDARY_SELECTION);
+ gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
+ gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
return 0;
}
edl->tracks->copy_automation(start, end, &file, 1, 0);
const char *file_string = file.string();
long file_length = strlen(file_string);
- gui->get_clipboard()->to_clipboard(file_string, file_length,
- BC_PRIMARY_SELECTION);
- gui->get_clipboard()->to_clipboard(file_string, file_length,
- SECONDARY_SELECTION);
+ gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
+ gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
return 0;
}
void MWindow::cut()
{
- undo->update_undo_before();
-
double start = edl->local_session->get_selectionstart();
double end = edl->local_session->get_selectionend();
+ cut(start, end);
+}
+void MWindow::cut(double start, double end, double new_position)
+{
+ undo->update_undo_before();
copy(start, end);
edl->clear(start, end,
edl->session->labels_follow_edits,
edl->session->plugins_follow_edits,
edl->session->autos_follow_edits);
+ edl->deglitch(start);
edl->optimize();
save_backup();
undo->update_undo_after(_("cut"), LOAD_EDITS | LOAD_TIMEBAR);
-
+ if( new_position >= 0 ) {
+ edl->local_session->set_selectionstart(new_position);
+ edl->local_session->set_selectionend(new_position);
+ }
restart_brender();
update_plugin_guis();
gui->update(1, 2, 1, 1, 1, 1, 0);
send_command(CURRENT_FRAME, CHANGE_EDL, edl, 1);
}
+void MWindow::snap_left_edit()
+{
+ double start_pos = edl->local_session->get_selectionstart(1);
+ double position = edl->prev_edit(start_pos);
+ if( position < start_pos )
+ cut(position, start_pos, position);
+}
+
+void MWindow::snap_right_edit()
+{
+ double end_pos = edl->local_session->get_selectionend(1);
+ double position = edl->next_edit(end_pos);
+ if( end_pos < position )
+ cut(end_pos, position, end_pos);
+}
+
+void MWindow::snap_left_label()
+{
+ double start_pos = edl->local_session->get_selectionstart(1);
+ Label *left_label = edl->labels->prev_label(start_pos);
+ if( !left_label ) return;
+ double position = left_label->position;
+ if( position < start_pos )
+ cut(position, start_pos, position);
+}
+
+void MWindow::snap_right_label()
+{
+ double end_pos = edl->local_session->get_selectionend(1);
+ Label *right_label = edl->labels->next_label(end_pos);
+ if( !right_label ) return;
+ double position = right_label->position;
+ if( end_pos < position )
+ cut(end_pos, position, end_pos);
+}
+
int MWindow::cut_automation()
{
undo->update_undo_before();
if( (session->drag_handle == 1 && edit_mode != MOVE_NO_EDITS) ||
(session->drag_handle == 0 && edit_mode == MOVE_ONE_EDIT) ) {
+//printf("MWindow::finish_modify_handles %d\n", __LINE__);
edl->local_session->set_selectionstart(session->drag_position);
edl->local_session->set_selectionend(session->drag_position);
+ edl->deglitch(session->drag_position);
}
else
if( edit_mode != MOVE_NO_EDITS ) {
+//printf("MWindow::finish_modify_handles %d\n", __LINE__);
edl->local_session->set_selectionstart(session->drag_start);
edl->local_session->set_selectionend(session->drag_start);
+ edl->deglitch(session->drag_start);
}
+// clamp the selection to 0
if( edl->local_session->get_selectionstart(1) < 0 ) {
edl->local_session->set_selectionstart(0);
edl->local_session->set_selectionend(0);
edl->paste_silence(start, end, 0,
edl->session->plugins_follow_edits,
edl->session->autos_follow_edits);
+ edl->deglitch(start);
+ edl->deglitch(end);
+
+
save_backup();
undo->update_undo_after(_("mute"), LOAD_EDITS);
int edit_plugins,
int edit_autos)
{
- clear(0);
+ clear(0, 1);
// Want to insert with assets shared with the master EDL.
insert(start, file,
{
double start = edl->local_session->get_selectionstart();
//double end = edl->local_session->get_selectionend();
- int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
+ int64_t len = gui->clipboard_len(BC_PRIMARY_SELECTION);
if( len ) {
- char *string = new char[len + 1];
+ char *string = new char[len];
undo->update_undo_before();
- gui->get_clipboard()->from_clipboard(string, len, BC_PRIMARY_SELECTION);
+ gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
FileXML file;
file.read_from_string(string);
- clear(0);
+ clear(0, 1);
insert(start, &file,
edl->session->labels_follow_edits,
}
void MWindow::load_assets(ArrayList<Indexable*> *new_assets,
- double position,
- int load_mode,
- Track *first_track,
- RecordLabels *labels,
- int edit_labels,
- int edit_plugins,
- int edit_autos,
- int overwrite)
+ double position, int load_mode, Track *first_track, RecordLabels *labels,
+ int edit_labels, int edit_plugins, int edit_autos, int overwrite)
{
+ if( load_mode == LOADMODE_RESOURCESONLY )
+ load_mode = LOADMODE_ASSETSONLY;
const int debug = 0;
if( debug ) printf("MWindow::load_assets %d\n", __LINE__);
if( position < 0 ) position = edl->local_session->get_selectionstart();
int MWindow::paste_automation()
{
- int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
+ int64_t len = gui->clipboard_len(BC_PRIMARY_SELECTION);
if( len ) {
undo->update_undo_before();
- char *string = new char[len + 1];
- gui->get_clipboard()->from_clipboard(string,
- len,
- BC_PRIMARY_SELECTION);
+ char *string = new char[len];
+ gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
FileXML file;
file.read_from_string(string);
int MWindow::paste_default_keyframe()
{
- int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
+ int64_t len = gui->clipboard_len(BC_PRIMARY_SELECTION);
if( len ) {
undo->update_undo_before();
- char *string = new char[len + 1];
- gui->get_clipboard()->from_clipboard(string,
- len,
- BC_PRIMARY_SELECTION);
+ char *string = new char[len];
+ gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
FileXML file;
file.read_from_string(string);
double start = edl->local_session->get_selectionstart();
}
//PRINT_TRACE
// Insert edl
- if( load_mode != LOADMODE_RESOURCESONLY ) {
+ if( load_mode != LOADMODE_RESOURCESONLY &&
+ load_mode != LOADMODE_ASSETSONLY ) {
// Insert labels
//printf("MWindow::paste_edls %f %f\n", current_position, edl_length);
if( load_mode == LOADMODE_PASTE ||
edl->session->labels_follow_edits,
edl->session->plugins_follow_edits,
edl->session->autos_follow_edits);
+ edl->deglitch(start);
+ edl->deglitch(end);
edl->optimize();
save_backup();
undo->update_undo_after(_("silence"), LOAD_EDITS | LOAD_TIMEBAR);
edl->update_assets(new_edl);
int cur_x, cur_y;
- gui->get_abs_cursor_xy(cur_x, cur_y, 0);
+ gui->get_abs_cursor(cur_x, cur_y, 0);
gui->unlock_window();
awindow->clip_edit->create_clip(new_edl, cur_x, cur_y);
edl->session->labels_follow_edits,
edl->session->plugins_follow_edits,
edl->session->autos_follow_edits);
+ edl->deglitch(0);
+ edl->deglitch(edl->local_session->get_selectionend() -
+ edl->local_session->get_selectionstart());
+
save_backup();
undo->update_undo_after(_("trim selection"), LOAD_EDITS | LOAD_TIMEBAR);
}
}
+void MWindow::set_proxy(int use_scaler, int new_scale, int auto_scale,
+ ArrayList<Indexable*> *orig_assets,
+ ArrayList<Indexable*> *proxy_assets)
+{
+ int orig_use_scaler = edl->session->proxy_use_scaler;
+ int orig_scale = edl->session->proxy_scale;
+// rescale to full size asset in read_frame
+ edl->session->proxy_use_scaler = use_scaler;
+ edl->session->proxy_scale = new_scale;
+ edl->session->proxy_auto_scale = auto_scale;
+
+ if( use_scaler ) {
+ for( int i=0; i<proxy_assets->size(); ++i ) {
+ Asset *proxy_asset = (Asset *)proxy_assets->get(i);
+ proxy_asset->width = orig_assets->get(i)->get_w();
+ proxy_asset->height = orig_assets->get(i)->get_h();
+ }
+ new_scale = 1;
+ }
+
+ if( !orig_use_scaler && new_scale != orig_scale ) {
+// project size
+ float orig_w = (float)edl->session->output_w * orig_scale;
+ float orig_h = (float)edl->session->output_h * orig_scale;
+ edl->session->output_w = Units::round(orig_w / new_scale);
+ edl->session->output_h = Units::round(orig_h / new_scale);
+
+// track sizes
+ for( Track *track=edl->tracks->first; track; track=track->next ) {
+ if( track->data_type != TRACK_VIDEO ) continue;
+ orig_w = (float)track->track_w * orig_scale;
+ orig_h = (float)track->track_h * orig_scale;
+ track->track_w = Units::round(orig_w / new_scale);
+ track->track_h = Units::round(orig_h / new_scale);
+ ((MaskAutos*)track->automation->autos[AUTOMATION_MASK])->
+ set_proxy(orig_scale, new_scale);
+ ((FloatAutos*)track->automation->autos[AUTOMATION_CAMERA_X])->
+ set_proxy(orig_scale, new_scale);
+ ((FloatAutos*)track->automation->autos[AUTOMATION_CAMERA_Y])->
+ set_proxy(orig_scale, new_scale);
+ ((FloatAutos*)track->automation->autos[AUTOMATION_PROJECTOR_X])->
+ set_proxy(orig_scale, new_scale);
+ ((FloatAutos*)track->automation->autos[AUTOMATION_PROJECTOR_Y])->
+ set_proxy(orig_scale, new_scale);
+ }
+ }
+
+// change original assets to proxy assets
+ int awindow_folder = use_scaler || new_scale != 1 ? AW_PROXY_FOLDER : AW_MEDIA_FOLDER;
+ for( int i=0,n=proxy_assets->size(); i<n; ++i ) {
+ Asset *proxy_asset = edl->assets->update((Asset *)proxy_assets->get(i));
+ proxy_asset->awindow_folder = awindow_folder;
+// replace track contents
+ for( Track *track = edl->tracks->first; track; track = track->next ) {
+ if( track->data_type != TRACK_VIDEO ) continue;
+ for( Edit *edit = track->edits->first; edit; edit = edit->next ) {
+ if( !edit->asset ) continue;
+ if( !strcmp(edit->asset->path, orig_assets->get(i)->path) ) {
+ edit->asset = proxy_asset;
+ }
+ }
+ }
+ }
+}
+
+void MWindow::add_proxy(int use_scaler,
+ ArrayList<Indexable*> *orig_assets,
+ ArrayList<Indexable*> *proxy_assets)
+{
+ if( use_scaler ) {
+ for( int i=0,n=proxy_assets->size(); i<n; ++i ) {
+ Asset *proxy_asset = (Asset *)proxy_assets->get(i);
+ proxy_asset->width = orig_assets->get(i)->get_w();
+ proxy_asset->height = orig_assets->get(i)->get_h();
+ }
+ }
+
+// change original assets to proxy assets
+ for( int i=0,n=proxy_assets->size(); i<n; ++i ) {
+ Asset *proxy_asset = edl->assets->update((Asset *)proxy_assets->get(i));
+ proxy_asset->awindow_folder = AW_PROXY_FOLDER;
+// replace track contents
+ for( Track *track = edl->tracks->first; track; track = track->next ) {
+ if( track->data_type != TRACK_VIDEO ) continue;
+ for( Edit *edit = track->edits->first; edit; edit = edit->next ) {
+ if( !edit->asset ) continue;
+ if( !strcmp(edit->asset->path, orig_assets->get(i)->path) ) {
+ edit->asset = proxy_asset;
+ }
+ }
+ }
+ }
+}
+
void MWindow::cut_commercials()
{
undo->update_undo_before();