bsd lang segv fix, enable bsd lv2, lv2 gui enable fix, proxy/ffmpeg toggle resize...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / clippopup.C
index a364947a94269793fc6db9c92221f263e97cc167..df439311dc32d95819f75335a8f11b0db4cad808 100644 (file)
@@ -32,6 +32,7 @@
 #include "edit.h"
 #include "edits.h"
 #include "edl.h"
+#include "edlsession.h"
 #include "filexml.h"
 #include "language.h"
 #include "localsession.h"
@@ -219,21 +220,18 @@ ClipPopupViewWindow::~ClipPopupViewWindow()
 
 int ClipPopupViewWindow::handle_event()
 {
-// Find window with nothing
-       VWindow *vwindow = mwindow->get_viewer(1);
-
-// TODO: create new vwindow or change current vwindow
-       vwindow->gui->lock_window("ClipPopupView::handle_event");
-
-       if( mwindow->session->drag_assets->total )
-               vwindow->change_source(
-                       mwindow->session->drag_assets->values[0]);
-       else
-       if( mwindow->session->drag_clips->total )
-               vwindow->change_source(
-                       mwindow->session->drag_clips->values[0]);
-
-       vwindow->gui->unlock_window();
+       for( int i=0; i<mwindow->session->drag_assets->size(); ++i ) {
+               VWindow *vwindow = mwindow->get_viewer(1);
+               vwindow->gui->lock_window("ClipPopupView::handle_event 1");
+               vwindow->change_source(mwindow->session->drag_assets->get(i));
+               vwindow->gui->unlock_window();
+       }
+       for( int i=0; i<mwindow->session->drag_clips->size(); ++i ) {
+               VWindow *vwindow = mwindow->get_viewer(1);
+               vwindow->gui->lock_window("ClipPopupView::handle_event 2");
+               vwindow->change_source(mwindow->session->drag_clips->get(i));
+               vwindow->gui->unlock_window();
+       }
        return 1;
 }
 
@@ -253,10 +251,14 @@ int ClipPopupCopy::handle_event()
        MWindowGUI *gui = mwindow->gui;
        gui->lock_window("ClipPopupCopy::handle_event");
        if( mwindow->session->drag_clips->total > 0 ) {
-               FileXML file;
                EDL *edl = mwindow->session->drag_clips->values[0];
+               EDL *copy_edl = new EDL; // no parent or assets wont be copied
+               copy_edl->create_objects();
+               copy_edl->copy_all(edl);
+               FileXML file;
                double start = 0, end = edl->tracks->total_length();
-               edl->copy(start, end, 1, &file, "", 1);
+               copy_edl->copy(start, end, 1, &file, "", 1);
+               copy_edl->remove_user();
                const char *file_string = file.string();
                long file_length = strlen(file_string);
                gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
@@ -428,33 +430,30 @@ int ClipPopupNest::handle_event()
 {
        MWindowGUI *gui = mwindow->gui;
        gui->lock_window("ClipPopupNest::handle_event 1");
-       if( mwindow->session->drag_clips->total > 0 ) {
+       if( mwindow->edl->session->proxy_scale != 1 ) {
+               eprintf("Nesting not allowed when proxy scale != 1");
+       }
+       else if( mwindow->session->drag_clips->total > 0 ) {
                EDL *edl = mwindow->edl;
+               time_t dt;      time(&dt);
+               struct tm dtm;  localtime_r(&dt, &dtm);
+               char path[BCSTRLEN];
+               sprintf(path, _("Nested_%02d%02d%02d-%02d%02d%02d"),
+                       dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday,
+                       dtm.tm_hour, dtm.tm_min, dtm.tm_sec);
                EDL *clip = mwindow->session->drag_clips->values[0];
-               EDL *clip_edl = new EDL;  // no parent for nested clip
-               clip_edl->create_objects();
-               clip_edl->copy_all(clip);
-               EDL *new_clip = new EDL(edl);
-               new_clip->create_objects();
+               EDL *nested = edl->new_nested(clip, path);
+               EDL *new_clip = edl->create_nested_clip(nested);
                new_clip->awindow_folder = AW_CLIP_FOLDER;
+                sprintf(new_clip->local_session->clip_icon,
+                        "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);
                snprintf(new_clip->local_session->clip_title,
                        sizeof(new_clip->local_session->clip_title),
                        _("Nested: %s"), clip->local_session->clip_title);
                strcpy(new_clip->local_session->clip_notes,
                        clip->local_session->clip_notes);
-               time_t dt;      time(&dt);
-               struct tm dtm;  localtime_r(&dt, &dtm);
-               char path[BCSTRLEN];
-               sprintf(path, _("Nested_%02d%02d%02d-%02d%02d%02d"),
-                       dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday,
-                       dtm.tm_hour, dtm.tm_min, dtm.tm_sec);
-               clip_edl->set_path(path);
-               sprintf(new_clip->local_session->clip_icon,
-                       "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_clip->set_path(path);
-               new_clip->to_nested(clip_edl);
                int idx = edl->clips.number_of(clip);
                if( idx >= 0 ) {
                        edl->clips[idx] = new_clip;
@@ -462,9 +461,8 @@ int ClipPopupNest::handle_event()
                }
                else
                        edl->clips.append(new_clip);
-               mwindow->mainindexes->add_next_asset(0, clip_edl);
+               mwindow->mainindexes->add_next_asset(0, nested);
                mwindow->mainindexes->start_build();
-               clip_edl->remove_user();
                popup->gui->async_update_assets();
        }
        gui->unlock_window();
@@ -494,7 +492,9 @@ int ClipPopupUnNest::handle_event()
                nested_edl = edit && !edit->next && !edit->asset ? edit->nested_edl : 0;
                while( nested_edl && (track=track->next)!=0 ) {
                        Edit *edit = track->edits->first;
-                       if( !edit || edit->next || edit->nested_edl != nested_edl )
+                       if( !edit || edit->next ||
+                           ( edit->nested_edl != nested_edl &&
+                             strcmp(edit->nested_edl->path, nested_edl->path) ) )
                                nested_edl = 0;
                }
                if( nested_edl ) {