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));
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(menu_item = new BC_MenuItem(_("Remove...")));
73 menu_item->add_submenu(submenu = new BC_SubMenu());
74 submenu->add_submenuitem(new ClipPopupProjectRemove(mwindow, this));
75 submenu->add_submenuitem(new ClipPopupDiskRemove(mwindow, this));
78 void ClipPopup::paste_assets()
80 // Collect items into the drag vectors for temporary storage
81 gui->lock_window("ClipPopup::paste_assets");
82 mwindow->gui->lock_window("ClipPopup::paste_assets");
83 mwindow->cwindow->gui->lock_window("ClipPopup::paste_assets");
85 gui->collect_assets();
86 mwindow->paste_assets(mwindow->edl->local_session->get_selectionstart(1),
87 mwindow->edl->tracks->first,
88 0); // do not overwrite
91 mwindow->gui->unlock_window();
92 mwindow->cwindow->gui->unlock_window();
95 void ClipPopup::match_size()
97 // Collect items into the drag vectors for temporary storage
98 gui->collect_assets();
99 mwindow->gui->lock_window("ClipPopup::match_size");
100 mwindow->asset_to_size();
101 mwindow->gui->unlock_window();
104 void ClipPopup::match_rate()
106 // Collect items into the drag vectors for temporary storage
107 gui->collect_assets();
108 mwindow->gui->lock_window("ClipPopup::match_rate");
109 mwindow->asset_to_rate();
110 mwindow->gui->unlock_window();
113 void ClipPopup::match_all()
115 // Collect items into the drag vectors for temporary storage
116 gui->collect_assets();
117 mwindow->gui->lock_window("ClipPopup::match_rate");
118 mwindow->asset_to_all();
119 mwindow->gui->unlock_window();
122 int ClipPopup::update()
125 gui->collect_assets();
130 ClipPopupInfo::ClipPopupInfo(MWindow *mwindow, ClipPopup *popup)
131 : BC_MenuItem(_("Info..."))
133 this->mwindow = mwindow;
137 ClipPopupInfo::~ClipPopupInfo()
141 int ClipPopupInfo::handle_event()
143 if(mwindow->session->drag_assets->total)
145 mwindow->awindow->asset_edit->edit_asset(
146 mwindow->session->drag_assets->values[0]);
149 if(mwindow->session->drag_clips->total)
151 popup->gui->awindow->clip_edit->edit_clip(
152 mwindow->session->drag_clips->values[0]);
158 ClipPopupSort::ClipPopupSort(MWindow *mwindow, ClipPopup *popup)
159 : BC_MenuItem(_("Sort items"))
161 this->mwindow = mwindow;
165 ClipPopupSort::~ClipPopupSort()
169 int ClipPopupSort::handle_event()
171 mwindow->awindow->gui->sort_assets();
176 ClipPopupView::ClipPopupView(MWindow *mwindow, ClipPopup *popup)
177 : BC_MenuItem(_("View"))
179 this->mwindow = mwindow;
183 ClipPopupView::~ClipPopupView()
187 int ClipPopupView::handle_event()
189 VWindow *vwindow = mwindow->get_viewer(1, DEFAULT_VWINDOW);
190 vwindow->gui->lock_window("ClipPopupView::handle_event");
192 if(mwindow->session->drag_assets->total)
193 vwindow->change_source(
194 mwindow->session->drag_assets->values[0]);
196 if(mwindow->session->drag_clips->total)
197 vwindow->change_source(
198 mwindow->session->drag_clips->values[0]);
200 vwindow->gui->unlock_window();
205 ClipPopupViewWindow::ClipPopupViewWindow(MWindow *mwindow, ClipPopup *popup)
206 : BC_MenuItem(_("View in new window"))
208 this->mwindow = mwindow;
212 ClipPopupViewWindow::~ClipPopupViewWindow()
216 int ClipPopupViewWindow::handle_event()
218 // Find window with nothing
219 VWindow *vwindow = mwindow->get_viewer(1);
221 // TODO: create new vwindow or change current vwindow
222 vwindow->gui->lock_window("ClipPopupView::handle_event");
224 if(mwindow->session->drag_assets->total)
225 vwindow->change_source(
226 mwindow->session->drag_assets->values[0]);
228 if(mwindow->session->drag_clips->total)
229 vwindow->change_source(
230 mwindow->session->drag_clips->values[0]);
232 vwindow->gui->unlock_window();
237 ClipPopupCopy::ClipPopupCopy(MWindow *mwindow, ClipPopup *popup)
238 : BC_MenuItem(_("Copy"))
240 this->mwindow = mwindow;
243 ClipPopupCopy::~ClipPopupCopy()
247 int ClipPopupCopy::handle_event()
249 MWindowGUI *gui = mwindow->gui;
250 gui->lock_window("ClipPopupCopy::handle_event");
251 if( mwindow->session->drag_clips->total > 0 ) {
253 EDL *edl = mwindow->session->drag_clips->values[0];
254 double start = 0, end = edl->tracks->total_length();
255 edl->copy(start, end, 1, 0, 0, &file, "", 1);
256 const char *file_string = file.string();
257 long file_length = strlen(file_string);
258 gui->get_clipboard()->to_clipboard(file_string, file_length,
259 SECONDARY_SELECTION);
260 gui->get_clipboard()->to_clipboard(file_string, file_length,
261 BC_PRIMARY_SELECTION);
263 gui->unlock_window();
268 ClipPopupPaste::ClipPopupPaste(MWindow *mwindow, ClipPopup *popup)
269 : BC_MenuItem(_("Paste"))
271 this->mwindow = mwindow;
275 ClipPopupPaste::~ClipPopupPaste()
279 int ClipPopupPaste::handle_event()
281 popup->paste_assets();
286 ClipMatchSize::ClipMatchSize(MWindow *mwindow, ClipPopup *popup)
287 : BC_MenuItem(_("Match project size"))
289 this->mwindow = mwindow;
293 int ClipMatchSize::handle_event()
300 ClipMatchRate::ClipMatchRate(MWindow *mwindow, ClipPopup *popup)
301 : BC_MenuItem(_("Match frame rate"))
303 this->mwindow = mwindow;
307 int ClipMatchRate::handle_event()
314 ClipMatchAll::ClipMatchAll(MWindow *mwindow, ClipPopup *popup)
315 : BC_MenuItem(_("Match all"))
317 this->mwindow = mwindow;
321 int ClipMatchAll::handle_event()
328 ClipPopupProjectRemove::ClipPopupProjectRemove(MWindow *mwindow, ClipPopup *popup)
329 : BC_MenuItem(_("Remove from project"))
331 this->mwindow = mwindow;
336 ClipPopupProjectRemove::~ClipPopupProjectRemove()
340 int ClipPopupProjectRemove::handle_event()
342 mwindow->remove_assets_from_project(1,
344 mwindow->session->drag_assets,
345 mwindow->session->drag_clips);
350 ClipPopupDiskRemove::ClipPopupDiskRemove(MWindow *mwindow, ClipPopup *popup)
351 : BC_MenuItem(_("Remove from disk"))
353 this->mwindow = mwindow;
357 ClipPopupDiskRemove::~ClipPopupDiskRemove()
361 int ClipPopupDiskRemove::handle_event()
363 mwindow->awindow->asset_remove->start();
368 ClipPasteToFolder::ClipPasteToFolder(MWindow *mwindow)
369 : BC_MenuItem(_("Paste Clip"))
371 this->mwindow = mwindow;
374 int ClipPasteToFolder::handle_event()
376 MWindowGUI *gui = mwindow->gui;
377 gui->lock_window("ClipPasteToFolder::handle_event 1");
378 int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
380 char *string = new char[len + 1];
381 gui->get_clipboard()->from_clipboard(string, len, BC_PRIMARY_SELECTION);
382 const char *clip_header = "<EDL VERSION=";
383 if( !strncmp(clip_header, string, strlen(clip_header)) ) {
385 file.read_from_string(string);
386 EDL *edl = mwindow->edl;
387 EDL *new_edl = new EDL(mwindow->edl);
388 new_edl->create_objects();
389 new_edl->load_xml(&file, LOAD_ALL);
390 edl->update_assets(new_edl);
391 mwindow->save_clip(new_edl, _("paste clip: "));
394 char *cp = strchr(string, '\n');
395 if( cp-string < 32 ) *cp = 0;
396 else if( len > 32 ) string[32] = 0;
397 eprintf("paste buffer is not EDL:\n%s", string);
402 eprintf("paste buffer empty");
404 gui->unlock_window();
409 ClipListMenu::ClipListMenu(MWindow *mwindow, AWindowGUI *gui)
410 : BC_PopupMenu(0, 0, 0, "", 0)
412 this->mwindow = mwindow;
416 ClipListMenu::~ClipListMenu()
420 void ClipListMenu::create_objects()
422 add_item(format = new AWindowListFormat(mwindow));
423 add_item(new AWindowListSort(mwindow));
424 add_item(new ClipPasteToFolder(mwindow));
428 void ClipListMenu::update()