olaf neophyte and de.po updates, valgrind tweaks, delete green lady, inkscape dpi=96
[goodguy/history.git] / cinelerra-5.1 / cinelerra / vwindow.C
index 8de4eb73170154add8af0a090bb621e81107e84c..df7bef70e0b0b24e7520084b02ca256ef29b3d5d 100644 (file)
@@ -77,26 +77,20 @@ void VWindow::delete_source(int do_main_edl, int update_gui)
 //printf("VWindow::delete_source %d %d %p %p\n", __LINE__, gui->get_window_lock(), edl, indexable);
        if(do_main_edl) mwindow->edl->remove_vwindow_edl(get_edl());
 
-       if(edl)
-       {
+       if( edl ) {
                edl->Garbage::remove_user();
-//printf("VWindow::delete_source %d\n", __LINE__);
                edl = 0;
        }
 
-//     if(mwindow->edl->vwindow_edl && !mwindow->edl->vwindow_edl_shared)
-//     {
-//             mwindow->edl->vwindow_edl->Garbage::remove_user();
-//             mwindow->edl->vwindow_edl = 0;
-//             mwindow->edl->vwindow_edl_shared = 0;
-//     }
-
-//printf("VWindow::delete_source %d\n", __LINE__);
-       if(indexable) indexable->Garbage::remove_user();
-       indexable = 0;
+       if( indexable ) {
+               indexable->Garbage::remove_user();
+               indexable = 0;
+       }
 
-       if(update_gui) gui->change_source(0, _("Viewer"));
-//printf("VWindow::delete_source %d\n", __LINE__);
+       if( update_gui ) {
+               gui->change_source(0, _("Viewer"));
+               gui->clock->clear();
+       }
 }
 
 
@@ -137,8 +131,6 @@ void VWindow::handle_done_event(int result)
        }
 }
 
-
-
 BC_Window* VWindow::new_gui()
 {
 //printf("VWindow::create_objects 1\n");
@@ -164,6 +156,12 @@ BC_Window* VWindow::new_gui()
        return gui;
 }
 
+void VWindow::handle_close_event(int result)
+{
+       delete playback_engine;
+       playback_engine = 0;
+}
+
 
 EDL* VWindow::get_edl()
 {
@@ -179,7 +177,10 @@ Indexable* VWindow::get_source()
 void VWindow::change_source(int edl_number)
 {
        if(!is_running()) return;
+       if( playback_engine->is_playing_back )
+               stop_playback(1);
 
+       gui->lock_window("VWindow::change_source 1");
 //printf("VWindow::change_source %d %p\n", __LINE__, mwindow->edl->get_vwindow_edl(edl_number));
        if( edl_number >= 0 && edl_number < mwindow->edl->total_vwindow_edls() &&
                 mwindow->edl->get_vwindow_edl(edl_number) )
@@ -196,73 +197,58 @@ void VWindow::change_source(int edl_number)
 //             indexable = 0;
 //             mwindow->edl->vwindow_edl_shared = 0;
        }
+       gui->unlock_window();
 }
 
 void VWindow::change_source(Indexable *indexable)
 {
+       if( !indexable->is_asset ) {
+               change_source((EDL*)indexable);
+               return;
+       }
        if(!running()) return;
-//     if(asset && this->asset &&
-//             asset->id == this->asset->id &&
-//             asset == this->asset) return;
+       if( playback_engine->is_playing_back )
+               stop_playback(1);
 
-//printf("VWindow::change_source %d\n", __LINE__);
+       gui->lock_window("VWindow::change_source 2");
 
        char title[BCTEXTLEN];
        FileSystem fs;
        fs.extract_name(title, indexable->path);
-//printf("VWindow::change_source 1\n");
-
        delete_source(1, 0);
-//printf("VWindow::change_source 1\n");
-
-// Generate EDL off of main EDL for cutting
-       Asset *asset = 0;
-       EDL *nested_edl = 0;
-       if(indexable->is_asset)
-       {
-               this->indexable = asset = new Asset;
-               asset->copy_from((Asset*)indexable, 0);
-       }
-       else
-       {
-               this->indexable = nested_edl = new EDL;
-               nested_edl->create_objects();
-               nested_edl->copy_all((EDL*)indexable);
-       }
 
 // Create EDL
        this->edl = new EDL(mwindow->edl);
        this->edl->create_objects();
        mwindow->edl->append_vwindow_edl(this->edl, 1);
 
-//     mwindow->edl->vwindow_edl = new EDL(mwindow->edl);
-//     mwindow->edl->vwindow_edl_shared = 0;
-//     mwindow->edl->vwindow_edl->create_objects();
-
-//printf("VWindow::change_source 1 %d %p %p\n", __LINE__, asset, nested_edl);
-       if(asset)
-               mwindow->asset_to_edl(this->edl, asset);
-       else
-               mwindow->edl_to_nested(this->edl, nested_edl);
+// Generate EDL off of main EDL for cutting
+       Asset *asset = new Asset;
+       asset->copy_from((Asset*)indexable, 0);
+       this->indexable = asset;
+       mwindow->asset_to_edl(this->edl, asset);
 
 // Update GUI
        gui->change_source(this->edl, title);
        update_position(CHANGE_ALL, 1, 1, 1);
 
-
-
-//printf("VWindow::change_source 2\n");
+       gui->unlock_window();
 }
 
 void VWindow::change_source(EDL *edl)
 {
        if(!running()) return;
+       if( playback_engine->is_playing_back )
+               stop_playback(1);
+
 //printf("VWindow::change_source %d %p\n", __LINE__, edl);
 // EDLs are identical
 //     if(edl && mwindow->edl->vwindow_edl &&
 //             edl->id == mwindow->edl->vwindow_edl->id) return;
        if(edl && get_edl() && edl->id == get_edl()->id) return;
 
+       gui->lock_window("VWindow::change_source 3");
+
        delete_source(1, 0);
 
        if(edl)
@@ -270,7 +256,8 @@ void VWindow::change_source(EDL *edl)
                mwindow->edl->append_vwindow_edl(edl, 1);
                this->edl = edl;
                this->edl->Garbage::add_user();
-
+               edl->local_session->preview_start = 0;
+               edl->local_session->preview_end = -1;
 //             mwindow->edl->vwindow_edl = edl;
 // in order not to later delete edl if it is shared
 //             edl->Garbage::add_user();
@@ -282,6 +269,7 @@ void VWindow::change_source(EDL *edl)
        }
        else
                gui->change_source(edl, _("Viewer"));
+       gui->unlock_window();
 }
 
 
@@ -316,6 +304,7 @@ void VWindow::update(int do_timebar)
 {
        if(do_timebar)
                gui->timebar->update(1);
+       gui->edit_panel->update();
 }
 
 void VWindow::update_position(int change_type,
@@ -333,6 +322,7 @@ void VWindow::update_position(int change_type,
                double position = edl->local_session->get_selectionstart(1);
                if(lock_window) gui->lock_window("VWindow::update_position");
                gui->clock->update(position);
+               gui->timebar->update(1);
                if(lock_window) gui->unlock_window();
        }
 }
@@ -394,22 +384,21 @@ void VWindow::unset_inoutpoint()
        }
 }
 
-void VWindow::copy()
+void VWindow::copy(int all)
 {
        EDL *edl = get_edl();
        if(edl)
        {
-               double start = edl->local_session->get_selectionstart();
-               double end = edl->local_session->get_selectionend();
+               double start = all ? 0 :
+                       edl->local_session->get_selectionstart();
+               double end = all ? edl->tracks->total_length() :
+                       edl->local_session->get_selectionend();
+               EDL *copy_edl = new EDL; // no parent or assets wont be copied
+               copy_edl->create_objects();
+               copy_edl->copy_all(edl);
                FileXML file;
-               edl->copy(start,
-                       end,
-                       0,
-                       0,
-                       0,
-                       &file,
-                       "",
-                       1);
+               copy_edl->copy(start, end, 0, &file, "", 1);
+               copy_edl->remove_user();
                const char *file_string = file.string();
                long file_length = strlen(file_string);
                mwindow->gui->lock_window();