X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmainundo.C;h=14268e1d37709f5d0b57e17cb4b89c919c53450d;hp=4a921cf4e082191a7065f80397eb3e0866204525;hb=502b6f3b6fd04f6b01c6d70dcb81aa304dd0db1c;hpb=4a90ef3ae46465c0634f81916b79e279e4bd9961 diff --git a/cinelerra-5.1/cinelerra/mainundo.C b/cinelerra-5.1/cinelerra/mainundo.C index 4a921cf4..14268e1d 100644 --- a/cinelerra-5.1/cinelerra/mainundo.C +++ b/cinelerra-5.1/cinelerra/mainundo.C @@ -200,14 +200,14 @@ int MainUndo::undo() mwindow->gui->mainmenu->redo-> update_caption(next ? next->get_description() : ""); } - FileXML file; char *current_data = current->get_data(); if( current_data ) { + FileXML file; file.read_from_string(current_data); + delete [] current_data; load_from_undo(&file, current->get_flags()); //printf("MainUndo::undo %d %s\n", __LINE__, current->get_filename()); mwindow->set_filename(current->get_filename()); - delete [] current_data; if( mwindow->gui ) { // Now update the menu with the after entry @@ -231,21 +231,18 @@ int MainUndo::redo() undo_stack->current = current; char *current_data = current->get_data(); if( current_data ) { - FileXML file; mwindow->set_filename(current->get_filename()); + FileXML file; file.read_from_string(current_data); load_from_undo(&file, current->get_flags()); delete [] current_data; - - if( mwindow->gui ) { // Update menu - mwindow->gui->mainmenu->undo-> - update_caption(current->get_description()); + mwindow->gui->mainmenu->undo-> + update_caption(current->get_description()); // Get next after entry - if( (current=NEXT) ) current = NEXT; - mwindow->gui->mainmenu->redo-> - update_caption(current ? current->get_description() : ""); - } + if( (current=NEXT) ) current = NEXT; + mwindow->gui->mainmenu->redo-> + update_caption(current ? current->get_description() : ""); } } reset_creators(); @@ -258,8 +255,17 @@ int MainUndo::redo() // Here the master EDL loads int MainUndo::load_from_undo(FileXML *file, uint32_t load_flags) { - if( load_flags & LOAD_SESSION ) + if( load_flags & LOAD_SESSION ) { + mwindow->gui->unlock_window(); mwindow->close_mixers(); + mwindow->gui->lock_window("MainUndo::load_from_undo"); + } + if( (load_flags & LOAD_ALL) == LOAD_ALL ) { + EDL *edl = new EDL; + edl->create_objects(); + mwindow->edl->remove_user(); + mwindow->edl = edl; + } mwindow->edl->load_xml(file, load_flags); for( Asset *asset=mwindow->edl->assets->first; asset; asset=asset->next ) { mwindow->mainindexes->add_next_asset(0, asset); @@ -270,8 +276,11 @@ int MainUndo::load_from_undo(FileXML *file, uint32_t load_flags) } mwindow->mainindexes->start_build(); mwindow->update_plugin_guis(1); - if( load_flags & LOAD_SESSION ) + if( load_flags & LOAD_SESSION ) { + mwindow->gui->unlock_window(); mwindow->open_mixers(); + mwindow->gui->lock_window("MainUndo::load_from_undo"); + } return 0; } @@ -289,3 +298,30 @@ void MainUndo::dump(FILE *fp) undo_stack->dump(fp); } +void MainUndo::save(FILE *fp) +{ + undo_stack->save(fp); +} + +void MainUndo::load(FILE *fp) +{ + undo_stack->load(fp); + UndoStackItem *current = undo_stack->current; + char *current_data = current ? current->get_data() : 0; + if( !current_data ) return; + mwindow->gui->lock_window("MainUndo::load"); + UndoStackItem *next = current->next; + mwindow->gui->mainmenu->redo-> + update_caption(next ? next->get_description() : ""); + mwindow->set_filename(current->get_filename()); + FileXML file; + file.read_from_string(current_data); + load_from_undo(&file, LOAD_ALL); + delete [] current_data; + UndoStackItem *prev = current->previous; + mwindow->gui->mainmenu->undo-> + update_caption(prev ? prev->get_description() : ""); + mwindow->update_project(LOADMODE_REPLACE); + mwindow->gui->unlock_window(); +} +