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->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();
+ 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();
+ 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();
+ 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();
+ 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();
}
}
-void MWindow::set_proxy(int use_scaler, int new_scale,
- ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
+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 ) {
}
// change original assets to proxy assets
- for( int i=0; i<proxy_assets->size(); i++ ) {
+ 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;