Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / clippopup.C
index 595155c0d8440c9fd5fc06c2bf28f8a618ae7477..d473e195af2d2331d535c282f0eb9214d0282e7a 100644 (file)
@@ -65,13 +65,14 @@ void ClipPopup::create_objects()
        BC_SubMenu *submenu;
        add_item(info = new ClipPopupInfo(mwindow, this));
        add_item(format = new AWindowListFormat(mwindow, gui));
-       add_item(new ClipPopupSort(mwindow, this));
+       add_item(sort = new ClipPopupSort(mwindow, this));
+       add_item(open_edl = new ClipPopupOpenEDL(mwindow, this));
+       add_item(close_edl = new ClipPopupCloseEDL(mwindow, gui));
+       add_item(to_media = new ClipPopupToMedia(mwindow, this));
        add_item(view = new ClipPopupView(mwindow, this));
        add_item(view_window = new ClipPopupViewWindow(mwindow, this));
-       add_item(new ClipPopupCopy(mwindow, this));
-       add_item(new ClipPopupNest(mwindow, this));
-       add_item(new ClipPopupUnNest(mwindow, this));
-       add_item(new ClipPopupPaste(mwindow, this));
+       add_item(copy = new ClipPopupCopy(mwindow, this));
+       add_item(paste = new ClipPopupPaste(mwindow, this));
        add_item(menu_item = new BC_MenuItem(_("Match...")));
        menu_item->add_submenu(submenu = new BC_SubMenu());
        submenu->add_submenuitem(new ClipMatchSize(mwindow, this));
@@ -128,6 +129,12 @@ int ClipPopup::update()
 {
        format->update();
        gui->collect_assets();
+       EDL *clip = !mwindow->session->drag_clips->size() ? 0 :
+               mwindow->session->drag_clips->get(0);
+       int enable_open = clip ? 1 : 0;
+       open_edl->set_enabled(enable_open);
+       int enable_close = mwindow->stack.size() > 0 ? 1 : 0;
+       close_edl->set_enabled(enable_close);
        return 0;
 }
 
@@ -344,8 +351,7 @@ ClipPopupDelete::~ClipPopupDelete()
 int ClipPopupDelete::handle_event()
 {
        popup->gui->unlock_window();
-       mwindow->remove_assets_from_project(1, 1,
-               mwindow->session->drag_assets,
+       mwindow->remove_assets_from_project(1, 1, 0, 0,
                mwindow->session->drag_clips);
        popup->gui->lock_window("ClipPopupDelete::handle_event");
        return 1;
@@ -379,7 +385,7 @@ int ClipPasteToFolder::handle_event()
                }
                else {
                        char *cp = strchr(string, '\n');
-                       if( cp-string < 32 ) *cp = 0;
+                       if( cp && cp-string < 32 ) *cp = 0;
                        else if( len > 32 ) string[32] = 0;
                        eprintf("paste buffer is not EDL:\n%s", string);
                }
@@ -407,6 +413,7 @@ ClipListMenu::~ClipListMenu()
 void ClipListMenu::create_objects()
 {
        add_item(format = new AWindowListFormat(mwindow, gui));
+       add_item(close_edl = new ClipPopupCloseEDL(mwindow, gui));
        add_item(new AWindowListSort(mwindow, gui));
        add_item(new ClipPasteToFolder(mwindow));
        update();
@@ -415,107 +422,71 @@ void ClipListMenu::create_objects()
 void ClipListMenu::update()
 {
        format->update();
+       int enable_close = mwindow->stack.size() > 0 ? 1 : 0;
+       close_edl->set_enabled(enable_close);
 }
 
 
-ClipPopupNest::ClipPopupNest(MWindow *mwindow, ClipPopup *popup)
- : BC_MenuItem(_("Nest"))
+ClipPopupToMedia::ClipPopupToMedia(MWindow *mwindow, ClipPopup *popup)
+ : BC_MenuItem(_("Nest to Media"))
 {
        this->mwindow = mwindow;
        this->popup = popup;
 }
-ClipPopupNest::~ClipPopupNest()
+ClipPopupToMedia::~ClipPopupToMedia()
 {
 }
 
-int ClipPopupNest::handle_event()
+int ClipPopupToMedia::handle_event()
 {
-       MWindowGUI *gui = mwindow->gui;
-       gui->lock_window("ClipPopupNest::handle_event 1");
-       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 *nested = edl->new_nested(clip, path);
-               EDL *new_clip = edl->create_nested_clip(nested);
-               new_clip->folder_no = 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);
-               int idx = edl->clips.number_of(clip);
-               if( idx >= 0 ) {
-                       edl->clips[idx] = new_clip;
-                       clip->remove_user();
-               }
-               else
-                       edl->clips.append(new_clip);
-               mwindow->mainindexes->add_next_asset(0, nested);
-               mwindow->mainindexes->start_build();
-               popup->gui->async_update_assets();
-       }
-       gui->unlock_window();
+       if( mwindow->edl->session->proxy_state != PROXY_ACTIVE )
+               mwindow->clip_to_media();
+       else
+               eprintf("Nesting not allowed when proxy active");
        return 1;
 }
 
 
-ClipPopupUnNest::ClipPopupUnNest(MWindow *mwindow, ClipPopup *popup)
- : BC_MenuItem(_("UnNest"))
+ClipPopupOpenEDL::ClipPopupOpenEDL(MWindow *mwindow, ClipPopup *popup)
+ : BC_MenuItem(_("Open EDL"))
 {
        this->mwindow = mwindow;
        this->popup = popup;
 }
-ClipPopupUnNest::~ClipPopupUnNest()
+
+ClipPopupOpenEDL::~ClipPopupOpenEDL()
 {
 }
 
-int ClipPopupUnNest::handle_event()
+int ClipPopupOpenEDL::handle_event()
 {
-       EDL *nested_edl = 0;
-       MWindowGUI *gui = mwindow->gui;
-       gui->lock_window("ClipPopupUnNest::handle_event 1");
-       if( mwindow->session->drag_clips->total > 0 ) {
+       int clips_total = mwindow->session->drag_clips->total;
+       if( clips_total ) {
+               popup->unlock_window();
                EDL *clip = mwindow->session->drag_clips->values[0];
-               Track *track = clip->tracks->first;
-               Edit *edit = track ? track->edits->first : 0;
-               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 &&
-                             strcmp(edit->nested_edl->path, nested_edl->path) ) )
-                               nested_edl = 0;
-               }
-               if( nested_edl ) {
-                       EDL *edl = mwindow->edl;
-                       EDL *new_clip = new EDL(edl);
-                       new_clip->create_objects();
-                       new_clip->copy_all(nested_edl);
-                       new_clip->folder_no = AW_CLIP_FOLDER;
-                       int idx = edl->clips.number_of(clip);
-                       if( idx >= 0 ) {
-                               edl->clips[idx] = new_clip;
-                               clip->remove_user();
-                       }
-                       else
-                               edl->clips.append(new_clip);
-                       popup->gui->async_update_assets();
-               }
+               mwindow->stack_push(clip, 0);
+               popup->lock_window("ClipPopupOpenEDL::handle_event");
        }
+       return 1;
+}
+
+ClipPopupCloseEDL::ClipPopupCloseEDL(MWindow *mwindow, AWindowGUI *gui)
+ : BC_MenuItem(_("Close EDL"))
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+}
+ClipPopupCloseEDL::~ClipPopupCloseEDL()
+{
+}
+
+int ClipPopupCloseEDL::handle_event()
+{
        gui->unlock_window();
+       mwindow->gui->lock_window("ClipPopupCloseEDL::handle_event");
+       mwindow->stack_pop();
+       mwindow->gui->unlock_window();
+       gui->lock_window("ClipPopupCloseEDL::handle_event");
        return 1;
 }