4 * Copyright (C) 1997-2012 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "assetedit.h"
23 #include "clippopup.h"
24 #include "assetremove.h"
26 #include "awindowgui.h"
27 #include "bcsignals.h"
30 #include "cwindowgui.h"
34 #include "localsession.h"
35 #include "mainerror.h"
36 #include "mainsession.h"
38 #include "mwindowgui.h"
41 #include "vwindowgui.h"
45 ClipPopup::ClipPopup(MWindow *mwindow, AWindowGUI *gui)
46 : BC_PopupMenu(0, 0, 0, "", 0)
48 this->mwindow = mwindow;
52 ClipPopup::~ClipPopup()
56 void ClipPopup::create_objects()
58 BC_MenuItem *menu_item;
60 add_item(info = new ClipPopupInfo(mwindow, this));
61 add_item(format = new AWindowListFormat(mwindow, gui));
62 add_item(new ClipPopupSort(mwindow, this));
63 add_item(view = new ClipPopupView(mwindow, this));
64 add_item(view_window = new ClipPopupViewWindow(mwindow, this));
65 add_item(new ClipPopupCopy(mwindow, this));
66 add_item(new ClipPopupPaste(mwindow, this));
67 add_item(menu_item = new BC_MenuItem(_("Match...")));
68 menu_item->add_submenu(submenu = new BC_SubMenu());
69 submenu->add_submenuitem(new ClipMatchSize(mwindow, this));
70 submenu->add_submenuitem(new ClipMatchRate(mwindow, this));
71 submenu->add_submenuitem(new ClipMatchAll(mwindow, this));
72 add_item(new ClipPopupDelete(mwindow, this));
75 void ClipPopup::paste_assets()
77 // Collect items into the drag vectors for temporary storage
78 gui->lock_window("ClipPopup::paste_assets");
79 mwindow->gui->lock_window("ClipPopup::paste_assets");
80 mwindow->cwindow->gui->lock_window("ClipPopup::paste_assets");
82 gui->collect_assets();
83 mwindow->paste_assets(mwindow->edl->local_session->get_selectionstart(1),
84 mwindow->edl->tracks->first,
85 0); // do not overwrite
88 mwindow->gui->unlock_window();
89 mwindow->cwindow->gui->unlock_window();
92 void ClipPopup::match_size()
94 // Collect items into the drag vectors for temporary storage
95 gui->collect_assets();
96 mwindow->gui->lock_window("ClipPopup::match_size");
97 mwindow->asset_to_size();
98 mwindow->gui->unlock_window();
101 void ClipPopup::match_rate()
103 // Collect items into the drag vectors for temporary storage
104 gui->collect_assets();
105 mwindow->gui->lock_window("ClipPopup::match_rate");
106 mwindow->asset_to_rate();
107 mwindow->gui->unlock_window();
110 void ClipPopup::match_all()
112 // Collect items into the drag vectors for temporary storage
113 gui->collect_assets();
114 mwindow->gui->lock_window("ClipPopup::match_rate");
115 mwindow->asset_to_all();
116 mwindow->gui->unlock_window();
119 int ClipPopup::update()
122 gui->collect_assets();
127 ClipPopupInfo::ClipPopupInfo(MWindow *mwindow, ClipPopup *popup)
128 : BC_MenuItem(_("Info..."))
130 this->mwindow = mwindow;
134 ClipPopupInfo::~ClipPopupInfo()
138 int ClipPopupInfo::handle_event()
141 popup->gui->get_abs_cursor(cur_x, cur_y, 0);
143 if( mwindow->session->drag_assets->total ) {
144 AssetEdit *asset_edit = mwindow->awindow->get_asset_editor();
145 asset_edit->edit_asset(
146 mwindow->session->drag_assets->values[0], cur_x, cur_y);
149 if( mwindow->session->drag_clips->total ) {
150 popup->gui->awindow->clip_edit->edit_clip(
151 mwindow->session->drag_clips->values[0], cur_x, cur_y);
157 ClipPopupSort::ClipPopupSort(MWindow *mwindow, ClipPopup *popup)
158 : BC_MenuItem(_("Sort items"))
160 this->mwindow = mwindow;
164 ClipPopupSort::~ClipPopupSort()
168 int ClipPopupSort::handle_event()
170 mwindow->awindow->gui->sort_assets(0);
175 ClipPopupView::ClipPopupView(MWindow *mwindow, ClipPopup *popup)
176 : BC_MenuItem(_("View"))
178 this->mwindow = mwindow;
182 ClipPopupView::~ClipPopupView()
186 int ClipPopupView::handle_event()
188 VWindow *vwindow = mwindow->get_viewer(1, DEFAULT_VWINDOW);
189 vwindow->gui->lock_window("ClipPopupView::handle_event");
191 if( mwindow->session->drag_assets->total )
192 vwindow->change_source(
193 mwindow->session->drag_assets->values[0]);
195 if( mwindow->session->drag_clips->total )
196 vwindow->change_source(
197 mwindow->session->drag_clips->values[0]);
199 vwindow->gui->unlock_window();
204 ClipPopupViewWindow::ClipPopupViewWindow(MWindow *mwindow, ClipPopup *popup)
205 : BC_MenuItem(_("View in new window"))
207 this->mwindow = mwindow;
211 ClipPopupViewWindow::~ClipPopupViewWindow()
215 int ClipPopupViewWindow::handle_event()
217 // Find window with nothing
218 VWindow *vwindow = mwindow->get_viewer(1);
220 // TODO: create new vwindow or change current vwindow
221 vwindow->gui->lock_window("ClipPopupView::handle_event");
223 if( mwindow->session->drag_assets->total )
224 vwindow->change_source(
225 mwindow->session->drag_assets->values[0]);
227 if( mwindow->session->drag_clips->total )
228 vwindow->change_source(
229 mwindow->session->drag_clips->values[0]);
231 vwindow->gui->unlock_window();
236 ClipPopupCopy::ClipPopupCopy(MWindow *mwindow, ClipPopup *popup)
237 : BC_MenuItem(_("Copy"))
239 this->mwindow = mwindow;
242 ClipPopupCopy::~ClipPopupCopy()
246 int ClipPopupCopy::handle_event()
248 MWindowGUI *gui = mwindow->gui;
249 gui->lock_window("ClipPopupCopy::handle_event");
250 if( mwindow->session->drag_clips->total > 0 ) {
252 EDL *edl = mwindow->session->drag_clips->values[0];
253 double start = 0, end = edl->tracks->total_length();
254 edl->copy(start, end, 1, 0, 0, &file, "", 1);
255 const char *file_string = file.string();
256 long file_length = strlen(file_string);
257 gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
258 gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
260 gui->unlock_window();
265 ClipPopupPaste::ClipPopupPaste(MWindow *mwindow, ClipPopup *popup)
266 : BC_MenuItem(_("Paste"))
268 this->mwindow = mwindow;
272 ClipPopupPaste::~ClipPopupPaste()
276 int ClipPopupPaste::handle_event()
278 popup->paste_assets();
283 ClipMatchSize::ClipMatchSize(MWindow *mwindow, ClipPopup *popup)
284 : BC_MenuItem(_("Match project size"))
286 this->mwindow = mwindow;
290 int ClipMatchSize::handle_event()
297 ClipMatchRate::ClipMatchRate(MWindow *mwindow, ClipPopup *popup)
298 : BC_MenuItem(_("Match frame rate"))
300 this->mwindow = mwindow;
304 int ClipMatchRate::handle_event()
311 ClipMatchAll::ClipMatchAll(MWindow *mwindow, ClipPopup *popup)
312 : BC_MenuItem(_("Match all"))
314 this->mwindow = mwindow;
318 int ClipMatchAll::handle_event()
325 ClipPopupDelete::ClipPopupDelete(MWindow *mwindow, ClipPopup *popup)
326 : BC_MenuItem(_("Delete"))
328 this->mwindow = mwindow;
333 ClipPopupDelete::~ClipPopupDelete()
337 int ClipPopupDelete::handle_event()
339 mwindow->remove_assets_from_project(1, 1,
340 mwindow->session->drag_assets,
341 mwindow->session->drag_clips);
346 ClipPasteToFolder::ClipPasteToFolder(MWindow *mwindow)
347 : BC_MenuItem(_("Paste Clip"))
349 this->mwindow = mwindow;
352 int ClipPasteToFolder::handle_event()
354 MWindowGUI *gui = mwindow->gui;
355 gui->lock_window("ClipPasteToFolder::handle_event 1");
356 int64_t len = gui->clipboard_len(BC_PRIMARY_SELECTION);
358 char *string = new char[len];
359 gui->from_clipboard(string, len, BC_PRIMARY_SELECTION);
360 const char *clip_header = "<EDL VERSION=";
361 if( !strncmp(clip_header, string, strlen(clip_header)) ) {
363 file.read_from_string(string);
364 EDL *edl = mwindow->edl;
365 EDL *new_edl = new EDL(mwindow->edl);
366 new_edl->create_objects();
367 new_edl->load_xml(&file, LOAD_ALL);
368 edl->update_assets(new_edl);
369 mwindow->save_clip(new_edl, _("paste clip: "));
372 char *cp = strchr(string, '\n');
373 if( cp-string < 32 ) *cp = 0;
374 else if( len > 32 ) string[32] = 0;
375 eprintf("paste buffer is not EDL:\n%s", string);
380 eprintf("paste buffer empty");
382 gui->unlock_window();
387 ClipListMenu::ClipListMenu(MWindow *mwindow, AWindowGUI *gui)
388 : BC_PopupMenu(0, 0, 0, "", 0)
390 this->mwindow = mwindow;
394 ClipListMenu::~ClipListMenu()
398 void ClipListMenu::create_objects()
400 add_item(format = new AWindowListFormat(mwindow, gui));
401 add_item(new AWindowListSort(mwindow, gui));
402 add_item(new ClipPasteToFolder(mwindow));
406 void ClipListMenu::update()