fix awdw solo vicon crash, fix nested clip for binfolders, open edit edl
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / editpopup.C
index 11299c29e081dff0fb9ff3ecef131c7daff94c25..45d7d87a0a696e918e9fb337d97de799858c1b27 100644 (file)
@@ -29,6 +29,7 @@
 #include "edl.h"
 #include "edlsession.h"
 #include "file.h"
+#include "filexml.h"
 #include "keys.h"
 #include "language.h"
 #include "localsession.h"
@@ -55,6 +56,7 @@ EditPopup::EditPopup(MWindow *mwindow, MWindowGUI *gui)
        plugin = 0;
        pluginset = 0;
        position = 0;
+       open_edl = 0;
 }
 
 EditPopup::~EditPopup()
@@ -63,6 +65,7 @@ EditPopup::~EditPopup()
 
 void EditPopup::create_objects()
 {
+       add_item(open_edl = new EditPopupOpenEDL(mwindow, this));
        add_item(new EditPopupClearSelect(mwindow, this));
        add_item(new EditPopupCopy(mwindow, this));
        add_item(new EditPopupCut(mwindow, this));
@@ -72,7 +75,10 @@ void EditPopup::create_objects()
        add_item(new EditPopupMutePack(mwindow, this));
        add_item(new EditPopupPaste(mwindow, this));
        add_item(new EditPopupOverwrite(mwindow, this));
+       add_item(new BC_MenuItem("-"));
        add_item(new EditPopupOverwritePlugins(mwindow, this));
+       add_item(new EditCollectEffects(mwindow, this));
+       add_item(new EditPasteEffects(mwindow, this));
 }
 
 int EditPopup::activate_menu(Track *track, Edit *edit,
@@ -83,9 +89,60 @@ int EditPopup::activate_menu(Track *track, Edit *edit,
        this->pluginset = pluginset;
        this->plugin = plugin;
        this->position = position;
+       int enable = !edit ? 0 :
+               edit->nested_edl ? 1 :
+               !edit->asset ? 0 :
+               edit->asset->format == FILE_REF ? 1 : 0;
+       open_edl->set_enabled(enable);
        return BC_PopupMenu::activate_menu();
 }
 
+EditPopupOpenEDL::EditPopupOpenEDL(MWindow *mwindow, EditPopup *popup)
+ : BC_MenuItem(_("Open EDL"))
+{
+       this->mwindow = mwindow;
+       this->popup = popup;
+       set_ctrl(1);
+       set_shift(1);
+}
+
+int EditPopupOpenEDL::handle_event()
+{
+       Edit *edit = popup->edit;
+       if( !edit ) return 1;
+       EDL *edl = 0;
+       Indexable *idxbl = 0;
+       if( edit->asset && edit->asset->format == FILE_REF ) {
+               FileXML xml_file;
+               const char *filename = edit->asset->path;
+               if( xml_file.read_from_file(filename, 1) ) {
+                       eprintf(_("Error: unable to open:\n  %s"), filename);
+                       return 1;
+               }
+               edl = new EDL;
+               edl->create_objects();
+               if( edl->load_xml(&xml_file, LOAD_ALL) ) {
+                       eprintf(_("Error: unable to load:\n  %s"), filename);
+                       edl->remove_user();
+                       return 1;
+               }
+               idxbl = edit->asset;
+       }
+       else if( edit->nested_edl ) {
+               edl = edit->nested_edl;
+               edl->add_user();
+               idxbl = edl;
+       }
+       else {
+               char edit_title[BCTEXTLEN];
+               edit->get_title(edit_title);
+               eprintf(_("Edit is not EDL: %s"), edit_title);
+               return 1;
+       }
+       mwindow->stack_push(edl, idxbl, edit);
+       return 1;
+}
+
 EditPopupClearSelect::EditPopupClearSelect(MWindow *mwindow, EditPopup *popup)
  : BC_MenuItem(_("Clear Select"),_("Ctrl-Shift-A"),'A')
 {
@@ -159,7 +216,7 @@ int EditPopupCutPack::handle_event()
 }
 
 EditPopupMute::EditPopupMute(MWindow *mwindow, EditPopup *popup)
- : BC_MenuItem(_("Mute"),_("Ctrl-m"),'m')
+ : BC_MenuItem(C_("Mute"),_("Ctrl-m"),'m')
 {
        this->mwindow = mwindow;
        this->popup = popup;
@@ -250,3 +307,36 @@ int EditPopupOverwritePlugins::handle_event()
        return 1;
 }
 
+
+EditCollectEffects::EditCollectEffects(MWindow *mwindow, EditPopup *popup)
+ : BC_MenuItem(_("Collect Effects"))
+{
+       this->mwindow = mwindow;
+       this->popup = popup;
+       set_ctrl(1);
+}
+
+int EditCollectEffects::handle_event()
+{
+       if( mwindow->session->current_operation == NO_OPERATION )
+               mwindow->collect_effects();
+       return 1;
+}
+
+EditPasteEffects::EditPasteEffects(MWindow *mwindow, EditPopup *popup)
+ : BC_MenuItem(_("Paste Effects"))
+{
+       this->mwindow = mwindow;
+       this->popup = popup;
+       set_ctrl(1);
+       set_shift(1);
+}
+
+int EditPasteEffects::handle_event()
+{
+       if( mwindow->session->current_operation == NO_OPERATION )
+               mwindow->paste_effects();
+       return 1;
+}
+
+