add bins/folders, fix listbox bad wdw ref, hide vicons fix, remove sort by time
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindowedit.C
index b406c7b207f12c4d421eedb58e25b045e3292519..65a2d916c97fdb0dc523a433a6f4917a484a0bb2 100644 (file)
@@ -325,55 +325,66 @@ void MWindow::clear(int clear_handle)
        }
 }
 
+void MWindow::update_gui(int changed_edl)
+{
+       restart_brender();
+       update_plugin_guis();
+       if( changed_edl ) {
+               gui->update(1, 2, 1, 1, 1, 1, 0);
+               cwindow->update(1, 0, 0, 0, 1);
+               cwindow->refresh_frame(CHANGE_EDL);
+       }
+       else {
+               gui->draw_overlays(1);
+               sync_parameters(CHANGE_PARAMS);
+               gui->update_patchbay();
+               cwindow->update(1, 0, 0);
+       }
+}
+
 void MWindow::set_automation_mode(int mode)
 {
        undo->update_undo_before();
+       speed_before();
        edl->tracks->set_automation_mode(
                edl->local_session->get_selectionstart(),
                edl->local_session->get_selectionend(),
                mode);
+       int changed_edl = speed_after(1);
        save_backup();
        char string[BCSTRLEN];
        sprintf(string,"set %s", FloatAuto::curve_name(mode));
-       undo->update_undo_after(string, LOAD_AUTOMATION);
-
-       restart_brender();
-       update_plugin_guis();
-       gui->draw_overlays(1);
-       sync_parameters(CHANGE_PARAMS);
-       gui->update_patchbay();
-       cwindow->update(1, 0, 0);
+       undo->update_undo_after(string,
+               !changed_edl ? LOAD_AUTOMATION :
+                       LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
+       update_gui(changed_edl);
 }
 
 void MWindow::clear_automation()
 {
        undo->update_undo_before();
+       speed_before();
        edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
                edl->local_session->get_selectionend());
+       int changed_edl = speed_after(1);
        save_backup();
-       undo->update_undo_after(_("clear keyframes"), LOAD_AUTOMATION);
-
-       restart_brender();
-       update_plugin_guis();
-       gui->draw_overlays(1);
-       sync_parameters(CHANGE_PARAMS);
-       gui->update_patchbay();
-       cwindow->update(1, 0, 0);
+       undo->update_undo_after(_("clear keyframes"),
+               !changed_edl ? LOAD_AUTOMATION :
+                       LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
+       update_gui(changed_edl);
 }
 
 int MWindow::clear_default_keyframe()
 {
        undo->update_undo_before();
+       speed_before();
        edl->tracks->clear_default_keyframe();
+       int changed_edl = speed_after(1);
        save_backup();
-       undo->update_undo_after(_("clear default keyframe"), LOAD_AUTOMATION);
-
-       restart_brender();
-       gui->draw_overlays(1);
-       sync_parameters(CHANGE_PARAMS);
-       gui->update_patchbay();
-       cwindow->update(1, 0, 0);
-
+       undo->update_undo_after(_("clear default keyframe"),
+               !changed_edl ? LOAD_AUTOMATION :
+                       LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
+       update_gui(changed_edl);
        return 0;
 }
 
@@ -593,21 +604,16 @@ void MWindow::cut_right_label()
 int MWindow::cut_automation()
 {
        undo->update_undo_before();
-
+       speed_before();
        copy_automation();
-
        edl->tracks->clear_automation(edl->local_session->get_selectionstart(),
                edl->local_session->get_selectionend());
+       int changed_edl = speed_after(1);
        save_backup();
-       undo->update_undo_after(_("cut keyframes"), LOAD_AUTOMATION);
-
-
-       restart_brender();
-       update_plugin_guis();
-       gui->draw_overlays(1);
-       sync_parameters(CHANGE_PARAMS);
-       gui->update_patchbay();
-       cwindow->update(1, 0, 0);
+       undo->update_undo_after(_("cut keyframes"),
+               !changed_edl ? LOAD_AUTOMATION :
+                       LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
+       update_gui(changed_edl);
        return 0;
 }
 
@@ -615,18 +621,15 @@ int MWindow::cut_default_keyframe()
 {
 
        undo->update_undo_before();
+       speed_before();
        copy_default_keyframe();
        edl->tracks->clear_default_keyframe();
-       undo->update_undo_after(_("cut default keyframe"), LOAD_AUTOMATION);
-
-       restart_brender();
-       gui->draw_overlays(1);
-       sync_parameters(CHANGE_PARAMS);
-       gui->update_patchbay();
-       cwindow->update(1, 0, 0);
+       int changed_edl = speed_after(1);
        save_backup();
-
-
+       undo->update_undo_after(_("cut default keyframe"),
+               !changed_edl ? LOAD_AUTOMATION :
+                       LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
+       update_gui(changed_edl);
        return 0;
 }
 
@@ -1062,10 +1065,16 @@ void MWindow::overwrite(EDL *source, int all)
 {
        FileXML file;
 
+       LocalSession *src = source->local_session;
        double src_start = all ? 0 :
-               source->local_session->get_selectionstart();
-       double overwrite_len = all ? source->tracks->total_length() :
-               source->local_session->get_selectionend() - src_start;
+               src->inpoint_valid() ? src->get_inpoint() :
+               src->outpoint_valid() ? 0 :
+                       src->get_selectionstart();
+       double src_end = all ? source->tracks->total_length() :
+               src->outpoint_valid() ? src->get_outpoint() :
+               src->inpoint_valid() ? source->tracks->total_length() :
+                       src->get_selectionend();
+       double overwrite_len = src_end - src_start;
        double dst_start = edl->local_session->get_selectionstart();
        double dst_len = edl->local_session->get_selectionend() - dst_start;
 
@@ -1207,17 +1216,16 @@ if( debug ) printf("MWindow::load_assets %d\n", __LINE__);
                EDL *new_edl = new EDL;
                new_edl->create_objects();
                new_edl->copy_session(edl);
-               new_edls.append(new_edl);
-
                if( !indexable->is_asset ) {
                        EDL *nested_edl = (EDL*)indexable;
-                       new_edl->to_nested(nested_edl);
-                       new_edl->local_session->set_clip_path(nested_edl);
+                       new_edl->create_nested(nested_edl);
+                       new_edl->set_path(indexable->path);
                }
                else {
                        Asset *asset = (Asset*)indexable;
                        asset_to_edl(new_edl, asset);
                }
+               new_edls.append(new_edl);
 
                if( labels ) {
                        for( RecordLabel *label=labels->first; label; label=label->next ) {
@@ -1244,26 +1252,23 @@ int MWindow::paste_automation()
 
        if( len ) {
                undo->update_undo_before();
+               speed_before();
                char *string = new char[len];
                gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
                FileXML file;
                file.read_from_string(string);
-
+               delete [] string;
                double start = edl->local_session->get_selectionstart();
                double end = edl->local_session->get_selectionend();
                edl->tracks->clear_automation(start, end);
                edl->tracks->paste_automation(start, &file, 0, 1,
                        edl->session->typeless_keyframes);
+               int changed_edl = speed_after(1);
                save_backup();
-               undo->update_undo_after(_("paste keyframes"), LOAD_AUTOMATION);
-               delete [] string;
-
-               restart_brender();
-               update_plugin_guis();
-               gui->draw_overlays(1);
-               sync_parameters(CHANGE_PARAMS);
-               gui->update_patchbay();
-               cwindow->update(1, 0, 0);
+               undo->update_undo_after(_("paste keyframes"),
+                       !changed_edl ? LOAD_AUTOMATION :
+                               LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
+               update_gui(changed_edl);
        }
 
        return 0;
@@ -1275,24 +1280,22 @@ int MWindow::paste_default_keyframe()
 
        if( len ) {
                undo->update_undo_before();
+               speed_before();
                char *string = new char[len];
                gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
                FileXML file;
                file.read_from_string(string);
+               delete [] string;
                double start = edl->local_session->get_selectionstart();
                edl->tracks->paste_automation(start, &file, 1, 0,
                        edl->session->typeless_keyframes);
 //             edl->tracks->paste_default_keyframe(&file);
-               undo->update_undo_after(_("paste default keyframe"), LOAD_AUTOMATION);
-
-               restart_brender();
-               update_plugin_guis();
-               gui->draw_overlays(1);
-               sync_parameters(CHANGE_PARAMS);
-               gui->update_patchbay();
-               cwindow->update(1, 0, 0);
-               delete [] string;
+               int changed_edl = speed_after(1);
+               undo->update_undo_after(_("paste default keyframe"),
+                       !changed_edl ? LOAD_AUTOMATION :
+                               LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR);
                save_backup();
+               update_gui(changed_edl);
        }
 
        return 0;
@@ -1559,7 +1562,7 @@ int MWindow::paste_edls(ArrayList<EDL*> *new_edls, int load_mode,
                        edl->add_clip(new_edl->clips[j]);
                }
                for( int j=0; j<new_edl->nested_edls.size(); ++j ) {
-                       edl->nested_edls.get_copy(new_edl->nested_edls[j]);
+                       edl->nested_edls.get_nested(new_edl->nested_edls[j]);
                }
 
                if( new_edl->total_vwindow_edls() ) {
@@ -1601,7 +1604,11 @@ void MWindow::paste_silence()
 {
        double start = edl->local_session->get_selectionstart();
        double end = edl->local_session->get_selectionend();
-       undo->update_undo_before();
+       if( EQUIV(start, end) ) {
+               if( edl->session->frame_rate > 0 )
+                       end += 1./edl->session->frame_rate;
+       }
+       undo->update_undo_before(_("silence"), this);
        edl->paste_silence(start, end,
                edl->session->labels_follow_edits,
                edl->session->plugins_follow_edits,
@@ -1654,11 +1661,6 @@ void MWindow::paste_transition()
        PluginServer *server = session->drag_pluginservers->values[0];
 
        undo->update_undo_before();
-       if( server->audio )
-               strcpy(edl->session->default_atransition, server->title);
-       else
-               strcpy(edl->session->default_vtransition, server->title);
-
        edl->tracks->paste_transition(server, session->edit_highlighted);
        save_backup();
        undo->update_undo_after(_("transition"), LOAD_EDITS);
@@ -1675,7 +1677,6 @@ void MWindow::paste_transitions(int track_type, char *title)
        double start = edl->local_session->get_selectionstart();
        double end = edl->local_session->get_selectionend();
        edl->tracks->paste_transitions(start, end, track_type, title);
-
        save_backup();
        undo->update_undo_after(_("attach transitions"), LOAD_EDITS);
 
@@ -1797,7 +1798,7 @@ void MWindow::align_edits()
 
 void MWindow::set_edit_length(double length)
 {
-       gui->lock_window("MWindow::detach_transitions 1");
+       gui->lock_window("MWindow::set_edit_length 1");
 
        undo->update_undo_before();
        double start = edl->local_session->get_selectionstart();
@@ -1817,7 +1818,7 @@ void MWindow::set_edit_length(double length)
 
 void MWindow::set_transition_length(Transition *transition, double length)
 {
-       gui->lock_window("MWindow::detach_transitions 1");
+       gui->lock_window("MWindow::set_transition_length 1");
 
        undo->update_undo_before();
        //double start = edl->local_session->get_selectionstart();
@@ -1836,7 +1837,7 @@ void MWindow::set_transition_length(Transition *transition, double length)
 
 void MWindow::set_transition_length(double length)
 {
-       gui->lock_window("MWindow::detach_transitions 1");
+       gui->lock_window("MWindow::set_transition_length 2");
 
        undo->update_undo_before();
        double start = edl->local_session->get_selectionstart();
@@ -1880,6 +1881,7 @@ void MWindow::redo_entry(BC_WindowBase *calling_window_gui)
        update_plugin_guis();
 
        gui->update(1, 2, 1, 1, 1, 1, 1);
+       gui->update_proxy_toggle();
        gui->unlock_window();
        cwindow->update(1, 1, 1, 1, 1);
        cwindow->gui->unlock_window();
@@ -1892,9 +1894,6 @@ void MWindow::redo_entry(BC_WindowBase *calling_window_gui)
                }
        }
 
-       if( calling_window_gui != gui )
-               gui->unlock_window();
-
        awindow->gui->async_update_assets();
 
        cwindow->refresh_frame(CHANGE_ALL);
@@ -1994,12 +1993,16 @@ void MWindow::unset_inoutpoint(int is_mwindow)
 void MWindow::splice(EDL *source, int all)
 {
        FileXML file;
+       LocalSession *src = source->local_session;
 
        undo->update_undo_before();
        double source_start = all ? 0 :
-               source->local_session->get_selectionstart();
+               src->inpoint_valid() ? src->get_inpoint() :
+               src->outpoint_valid() ? 0 : src->get_selectionstart();
        double source_end = all ? source->tracks->total_length() :
-               source->local_session->get_selectionend();
+               src->outpoint_valid() ? src->get_outpoint() :
+               src->inpoint_valid() ? source->tracks->total_length() :
+                       src->get_selectionend();
        source->copy(source_start, source_end, 1, &file, "", 1);
 //file.dump();
        double start = edl->local_session->get_selectionstart();
@@ -2054,9 +2057,9 @@ void MWindow::save_clip(EDL *new_edl, const char *txt)
                n = snprintf(cp, sz, "%s", txt);
                cp += n;  sz -= n;
        }
-       n = snprintf(cp, sz, 
+       n = snprintf(cp, sz,
                "%02d/%02d/%02d %02d:%02d:%02d,  +%s\n",
-               dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday, 
+               dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday,
                dtm.tm_hour, dtm.tm_min, dtm.tm_sec, duration);
        cp += n;  sz -= n;
        if( path && *path ) {
@@ -2071,6 +2074,7 @@ void MWindow::save_clip(EDL *new_edl, const char *txt)
                "clip_%02d%02d%02d-%02d%02d%02d.png",
                dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday,
                dtm.tm_hour, dtm.tm_min, dtm.tm_sec);
+       new_edl->awindow_folder = AW_CLIP_FOLDER;
        edl->update_assets(new_edl);
        int cur_x, cur_y;
        gui->get_abs_cursor(cur_x, cur_y, 0);
@@ -2086,14 +2090,16 @@ void MWindow::save_clip(EDL *new_edl, const char *txt)
 void MWindow::to_clip(EDL *edl, const char *txt, int all)
 {
        FileXML file;
-       double start, end;
+       LocalSession *src = edl->local_session;
 
        gui->lock_window("MWindow::to_clip 1");
-       start = all ? 0 :
-               edl->local_session->get_selectionstart();
-       end = all ? edl->tracks->total_length() :
-               edl->local_session->get_selectionend();
-
+       double start = all ? 0 :
+               src->inpoint_valid() ? src->get_inpoint() :
+               src->outpoint_valid() ? 0 : src->get_selectionstart();
+       double end = all ? edl->tracks->total_length() :
+               src->outpoint_valid() ? src->get_outpoint() :
+               src->inpoint_valid() ? edl->tracks->total_length() :
+                       src->get_selectionend();
        if( EQUIV(end, start) ) {
                start = 0;
                end = edl->tracks->total_length();
@@ -2202,6 +2208,7 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui)
        update_plugin_guis();
 
        gui->update(1, 2, 1, 1, 1, 1, 1);
+       gui->update_proxy_toggle();
        gui->unlock_window();
        cwindow->update(1, 1, 1, 1, 1);
        cwindow->gui->unlock_window();
@@ -2214,9 +2221,6 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui)
                }
        }
 
-       if( calling_window_gui != gui )
-               gui->unlock_window();
-
        awindow->gui->async_update_assets();
 
        cwindow->refresh_frame(CHANGE_ALL);
@@ -2227,18 +2231,30 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui)
 void MWindow::new_folder(const char *new_folder)
 {
        undo->update_undo_before();
-       edl->new_folder(new_folder);
+       if( edl->new_folder(new_folder) ) {
+               MainError::show_error(_("create new folder failed"));
+       }
        undo->update_undo_after(_("new folder"), LOAD_ALL);
        awindow->gui->async_update_assets();
 }
 
 void MWindow::delete_folder(char *folder)
 {
-//     undo->update_undo_after(_("delete folder"), LOAD_ALL);
+       undo->update_undo_before();
+       if( edl->delete_folder(folder) < 0 ) {
+               MainError::show_error(_("delete folder failed"));
+       }
+       undo->update_undo_after(_("del folder"), LOAD_ALL);
+       awindow->gui->async_update_assets();
 }
 
 void MWindow::select_point(double position)
 {
+       gui->unlock_window();
+       gui->stop_drawing();
+       cwindow->stop_playback(0);
+       gui->lock_window("MWindow::select_point");
+
        edl->local_session->set_selectionstart(position);
        edl->local_session->set_selectionend(position);
 
@@ -2318,102 +2334,21 @@ void MWindow::remap_audio(int pattern)
        }
 }
 
-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::rescale_proxy(EDL *clip, int orig_scale, int new_scale)
+{
+       edl->rescale_proxy(orig_scale, new_scale);
 }
 
 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;
-                               }
-                       }
-               }
-       }
+       ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
+{
+       edl->add_proxy(use_scaler, orig_assets, proxy_assets);
 }
 
 void MWindow::cut_commercials()
 {
+#ifdef HAVE_COMMERCIAL
        undo->update_undo_before();
        commercials->scan_media();
        edl->optimize();
@@ -2425,6 +2360,63 @@ void MWindow::cut_commercials()
        gui->update(1, 2, 1, 1, 1, 1, 0);
        cwindow->update(1, 0, 0, 0, 1);
        cwindow->refresh_frame(CHANGE_EDL);
+#endif
+}
+
+int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl)
+{
+       int result = 0;
+       Track *old_track = old_edl->tracks->first;
+       Track *new_track = new_edl->tracks->first;
+       for( ; old_track && new_track; old_track=old_track->next, new_track=new_track->next ) {
+               if( old_track->data_type != new_track->data_type ) continue;
+               FloatAutos *old_speeds = (FloatAutos *)old_track->automation->autos[AUTOMATION_SPEED];
+               FloatAutos *new_speeds = (FloatAutos *)new_track->automation->autos[AUTOMATION_SPEED];
+               if( !old_speeds || !new_speeds ) continue;
+               FloatAuto *old_speed = (FloatAuto *)old_speeds->first;
+               FloatAuto *new_speed = (FloatAuto *)new_speeds->first;
+               while( old_speed && new_speed && old_speed->equals(new_speed) ) {
+                       old_speed = (FloatAuto *)old_speed->next;
+                       new_speed = (FloatAuto *)new_speed->next;
+               }
+               Edit *old_edit = old_track->edits->first;
+               Edit *new_edit = new_track->edits->first;
+               for( ; old_edit && new_edit; old_edit=old_edit->next, new_edit=new_edit->next ) {
+                       int64_t edit_start = old_edit->startproject, edit_end = edit_start + old_edit->length;
+                       if( old_speed || new_speed ) {
+                               double orig_start = old_speeds->automation_integral(0, edit_start, PLAY_FORWARD);
+                               double orig_end   = old_speeds->automation_integral(0, edit_end, PLAY_FORWARD);
+                               edit_start = new_speeds->speed_position(orig_start);
+                               edit_end = new_speeds->speed_position(orig_end);
+                               result = 1;
+                       }
+                       new_edit->startproject = edit_start;
+                       new_edit->length = edit_end - edit_start;
+               }
+       }
+       return result;
 }
 
+void MWindow::speed_before()
+{
+       if( !speed_edl ) {
+               speed_edl = new EDL;
+               speed_edl->create_objects();
+       }
+       speed_edl->copy_all(edl);
+}
+
+int MWindow::speed_after(int done)
+{
+       int result = 0;
+       if( speed_edl ) {
+               if( done >= 0 )
+                       result = normalize_speed(speed_edl, edl);
+               if( done != 0 ) {
+                       speed_edl->remove_user();
+                       speed_edl = 0;
+               }
+       }
+       return result;
+}