sams folder icons, snap drag, sort folders, in/out ptr bug, interp bg fix, filebox...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindowedit.C
index 85b5f7439b1e94918e04d4955f3fb3e23b4c64cd..0e4121b121ae18e17b414cedc264912507ac5cc0 100644 (file)
@@ -512,11 +512,14 @@ void MWindow::crop_video()
 
 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,
@@ -527,7 +530,10 @@ void MWindow::cut()
        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);
@@ -536,6 +542,42 @@ void MWindow::cut()
                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();
@@ -2274,14 +2316,16 @@ void MWindow::remap_audio(int pattern)
        }
 }
 
-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 ) {
@@ -2320,8 +2364,39 @@ void MWindow::set_proxy(int use_scaler, int new_scale,
        }
 
 // 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;