X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Feditpopup.C;h=4150beee73da49c1aeb2573106e7b616e4db86f2;hb=c57aa3e2800e06f890e644dc54c9e0bba6d0851a;hp=0f2c9645856e968b6ba99e21dd62199979082981;hpb=af4a324887dc0828d96beb4858bf6fb1db1c2ae2;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/editpopup.C b/cinelerra-5.1/cinelerra/editpopup.C index 0f2c9645..4150beee 100644 --- a/cinelerra-5.1/cinelerra/editpopup.C +++ b/cinelerra-5.1/cinelerra/editpopup.C @@ -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,7 +65,10 @@ EditPopup::~EditPopup() void EditPopup::create_objects() { + add_item(open_edl = new EditPopupOpenEDL(mwindow, this)); add_item(new EditPopupClearSelect(mwindow, this)); + add_item(new EditPopupSelectEdits(mwindow, this)); + add_item(new EditPopupDeselectEdits(mwindow, this)); add_item(new EditPopupCopy(mwindow, this)); add_item(new EditPopupCut(mwindow, this)); add_item(new EditPopupMute(mwindow, this)); @@ -72,7 +77,11 @@ 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)); + add_item(new EditPopupTimecode(mwindow, this)); } int EditPopup::activate_menu(Track *track, Edit *edit, @@ -83,9 +92,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); + return 1; +} + EditPopupClearSelect::EditPopupClearSelect(MWindow *mwindow, EditPopup *popup) : BC_MenuItem(_("Clear Select"),_("Ctrl-Shift-A"),'A') { @@ -97,8 +157,35 @@ EditPopupClearSelect::EditPopupClearSelect(MWindow *mwindow, EditPopup *popup) int EditPopupClearSelect::handle_event() { - mwindow->edl->tracks->clear_selected_edits(); - popup->gui->draw_overlays(1); + mwindow->clear_select(); + return 1; +} + +EditPopupSelectEdits::EditPopupSelectEdits(MWindow *mwindow, EditPopup *popup) + : BC_MenuItem(_("Select Edits"),_("Ctrl-Alt-'"),'\'') +{ + this->mwindow = mwindow; + this->popup = popup; + set_ctrl(1); + set_alt(1); +} + +int EditPopupSelectEdits::handle_event() +{ + mwindow->select_edits(1); + return 1; +} + +EditPopupDeselectEdits::EditPopupDeselectEdits(MWindow *mwindow, EditPopup *popup) + : BC_MenuItem(_("Deselect Edits")) +{ + this->mwindow = mwindow; + this->popup = popup; +} + +int EditPopupDeselectEdits::handle_event() +{ + mwindow->select_edits(0); return 1; } @@ -146,11 +233,12 @@ int EditPopupCut::handle_event() } EditPopupCutPack::EditPopupCutPack(MWindow *mwindow, EditPopup *popup) - : BC_MenuItem(_("Cut pack"),_("Ctrl-z"),'z') + : BC_MenuItem(_("Cut pack"),_("Ctrl-Alt-z"),'z') { this->mwindow = mwindow; this->popup = popup; set_ctrl(1); + set_alt(); } int EditPopupCutPack::handle_event() @@ -160,7 +248,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; @@ -251,3 +339,64 @@ 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; +} + +EditPopupTimecode::EditPopupTimecode(MWindow *mwindow, EditPopup *popup) + : BC_MenuItem(_("Timecode"),_("Ctrl-!"),'!') +{ + this->mwindow = mwindow; + this->popup = popup; + set_ctrl(1); +} + +int EditPopupTimecode::handle_event() +{ + if( mwindow->session->current_operation != NO_OPERATION ) return 1; + Edit *edit = popup->edit; + if( !edit || !edit->asset ) return 1; + Asset *asset = edit->asset; + double timecode = asset->timecode != -2 ? asset->timecode : + FFMPEG::get_timecode(asset->path, + edit->track->data_type, edit->channel, + mwindow->edl->session->frame_rate); + asset->timecode = timecode; + if( timecode >= 0 ) { + int64_t pos = edit->startproject + edit->startsource; + double position = edit->track->from_units(pos); + mwindow->set_timecode_offset(timecode - position); + } + else + mwindow->set_timecode_offset(0); + return 1; +} +