#include "awindowgui.h"
#include "bcsignals.h"
#include "clipedit.h"
+#include "clipedls.h"
#include "cwindow.h"
#include "cwindowgui.h"
+#include "edit.h"
+#include "edits.h"
#include "edl.h"
+#include "edlsession.h"
#include "filexml.h"
#include "language.h"
#include "localsession.h"
#include "mainerror.h"
+#include "mainindexes.h"
#include "mainsession.h"
#include "mwindow.h"
#include "mwindowgui.h"
+#include "track.h"
#include "tracks.h"
#include "vwindow.h"
#include "vwindowgui.h"
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(menu_item = new BC_MenuItem(_("Match...")));
menu_item->add_submenu(submenu = new BC_SubMenu());
int ClipPopupView::handle_event()
{
VWindow *vwindow = mwindow->get_viewer(1, DEFAULT_VWINDOW);
- vwindow->gui->lock_window("ClipPopupView::handle_event");
if( mwindow->session->drag_assets->total )
vwindow->change_source(
vwindow->change_source(
mwindow->session->drag_clips->values[0]);
- vwindow->gui->unlock_window();
return 1;
}
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;
}
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, 0, 0, &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);
format->update();
}
+
+ClipPopupNest::ClipPopupNest(MWindow *mwindow, ClipPopup *popup)
+ : BC_MenuItem(_("Nest"))
+{
+ this->mwindow = mwindow;
+ this->popup = popup;
+}
+ClipPopupNest::~ClipPopupNest()
+{
+}
+
+int ClipPopupNest::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->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);
+ 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();
+ return 1;
+}
+
+
+ClipPopupUnNest::ClipPopupUnNest(MWindow *mwindow, ClipPopup *popup)
+ : BC_MenuItem(_("UnNest"))
+{
+ this->mwindow = mwindow;
+ this->popup = popup;
+}
+ClipPopupUnNest::~ClipPopupUnNest()
+{
+}
+
+int ClipPopupUnNest::handle_event()
+{
+ EDL *nested_edl = 0;
+ MWindowGUI *gui = mwindow->gui;
+ gui->lock_window("ClipPopupUnNest::handle_event 1");
+ if( mwindow->session->drag_clips->total > 0 ) {
+ 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->awindow_folder = 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();
+ }
+ }
+ gui->unlock_window();
+ return 1;
+}
+