dblclk label folder item is goto, fix no-drag trns if not drawn, amp up pane divider...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mainundo.C
index 0c149cd40acc445d8626a060b7f7cae831ce0e00..5b0a70bd2ec77e9b3d584a9fe8a617f743f928f5 100644 (file)
@@ -25,6 +25,7 @@
 #include "clipedls.h"
 #include "edl.h"
 #include "filexml.h"
+#include "indexfile.h"
 #include "mainindexes.h"
 #include "mainmenu.h"
 #include "mainsession.h"
@@ -186,7 +187,9 @@ int MainUndo::redo_load_flags()
 
 int MainUndo::undo()
 {
+       mwindow->gui->close_keyvalue_popup();
        mwindow->undo_commercial();
+
        UndoStackItem *current = undo_stack->current;
        if( current ) {
                undo_stack->current = next_undo();
@@ -195,11 +198,9 @@ int MainUndo::undo()
        }
        if( current ) {
 // Set the redo text to the current description
-               if( mwindow->gui ) {
-                       UndoStackItem *next = NEXT;
-                       mwindow->gui->mainmenu->redo->
-                               update_caption(next ? next->get_description() : "");
-               }
+               UndoStackItem *next = NEXT;
+               mwindow->gui->mainmenu->redo->
+                       update_caption(next ? next->get_description() : "");
                char *current_data = current->get_data();
                if( current_data ) {
                        FileXML file;
@@ -209,23 +210,21 @@ int MainUndo::undo()
 //printf("MainUndo::undo %d %s\n", __LINE__, current->get_filename());
                        mwindow->set_filename(current->get_filename());
 
-                       if( mwindow->gui ) {
 // Now update the menu with the after entry
-                               UndoStackItem *prev = PREVIOUS;
-                               mwindow->gui->mainmenu->undo->
-                                       update_caption(prev ? prev->get_description() : "");
-                       }
+                       UndoStackItem *prev = PREVIOUS;
+                       mwindow->gui->mainmenu->undo->
+                               update_caption(prev ? prev->get_description() : "");
                }
        }
 
+       mwindow->reset_caches(1);
        reset_creators();
-       mwindow->reset_caches();
        return 0;
 }
 
-
 int MainUndo::redo()
 {
+       mwindow->gui->close_keyvalue_popup();
        UndoStackItem *current = next_redo();
        if( current ) {
                undo_stack->current = current;
@@ -245,8 +244,8 @@ int MainUndo::redo()
                                update_caption(current ? current->get_description() : "");
                }
        }
+       mwindow->reset_caches(1);
        reset_creators();
-       mwindow->reset_caches();
 //dump();
        return 0;
 }
@@ -255,25 +254,31 @@ int MainUndo::redo()
 // Here the master EDL loads
 int MainUndo::load_from_undo(FileXML *file, uint32_t load_flags)
 {
-       delete mwindow->gui->keyvalue_popup;
-       mwindow->gui->keyvalue_popup = 0;
-
+       mwindow->hide_plugins();
        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 ) {
-               mwindow->edl->remove_user();
+       EDL *prev_edl = mwindow->edl;
+       if( (load_flags & LOAD_ALL) == LOAD_ALL )
                mwindow->init_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);
+               mwindow->mainindexes->add_indexable(asset);
        }
-       for( int i=0; i<mwindow->edl->nested_edls.size(); ++i ) {
-               EDL *nested_edl = mwindow->edl->nested_edls[i];
-               mwindow->mainindexes->add_next_asset(0, nested_edl);
+       if( prev_edl != mwindow->edl ) {
+               for( int i=0; i<mwindow->edl->nested_edls.size(); ++i ) {
+                       EDL *nested_edl = mwindow->edl->nested_edls[i];
+                       if( !nested_edl->path[0] ) continue;
+                       int k = prev_edl->nested_edls.size();
+                       while( --k >= 0 && // if nested edl was updated, force index rebuild
+                               strcmp(nested_edl->path, prev_edl->nested_edls[k]->path) );
+                       if( k >= 0 && prev_edl->nested_edls[k]->equivalent_output(nested_edl) >= 0 )
+                               IndexFile::delete_index_files(mwindow->preferences, nested_edl);
+                       mwindow->mainindexes->add_indexable(nested_edl);
+               }
+               prev_edl->remove_user();
        }
        mwindow->mainindexes->start_build();
        mwindow->update_plugin_guis(1);