ffmpeg tip fix, status tweaks, clip popup tweaks
[goodguy/history.git] / cinelerra-5.1 / cinelerra / clippopup.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 1997-2012 Adam Williams <broadcast at earthling dot net>
5  *
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.
10  *
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.
15  *
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
19  *
20  */
21
22 #include "assetedit.h"
23 #include "clippopup.h"
24 #include "assetremove.h"
25 #include "awindow.h"
26 #include "awindowgui.h"
27 #include "bcsignals.h"
28 #include "clipedit.h"
29 #include "cwindow.h"
30 #include "cwindowgui.h"
31 #include "edl.h"
32 #include "filexml.h"
33 #include "language.h"
34 #include "localsession.h"
35 #include "mainerror.h"
36 #include "mainsession.h"
37 #include "mwindow.h"
38 #include "mwindowgui.h"
39 #include "tracks.h"
40 #include "vwindow.h"
41 #include "vwindowgui.h"
42
43
44
45 ClipPopup::ClipPopup(MWindow *mwindow, AWindowGUI *gui)
46  : BC_PopupMenu(0, 0, 0, "", 0)
47 {
48         this->mwindow = mwindow;
49         this->gui = gui;
50 }
51
52 ClipPopup::~ClipPopup()
53 {
54 }
55
56 void ClipPopup::create_objects()
57 {
58         BC_MenuItem *menu_item;
59         BC_SubMenu *submenu;
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(new ClipPopupDelete(mwindow, this));
73 }
74
75 void ClipPopup::paste_assets()
76 {
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");
81
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
86
87         gui->unlock_window();
88         mwindow->gui->unlock_window();
89         mwindow->cwindow->gui->unlock_window();
90 }
91
92 void ClipPopup::match_size()
93 {
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();
99 }
100
101 void ClipPopup::match_rate()
102 {
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();
108 }
109
110 void ClipPopup::match_all()
111 {
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();
117 }
118
119 int ClipPopup::update()
120 {
121         format->update();
122         gui->collect_assets();
123         return 0;
124 }
125
126
127 ClipPopupInfo::ClipPopupInfo(MWindow *mwindow, ClipPopup *popup)
128  : BC_MenuItem(_("Info..."))
129 {
130         this->mwindow = mwindow;
131         this->popup = popup;
132 }
133
134 ClipPopupInfo::~ClipPopupInfo()
135 {
136 }
137
138 int ClipPopupInfo::handle_event()
139 {
140         if(mwindow->session->drag_assets->total)
141         {
142                 mwindow->awindow->asset_edit->edit_asset(
143                         mwindow->session->drag_assets->values[0]);
144         }
145         else
146         if(mwindow->session->drag_clips->total)
147         {
148                 popup->gui->awindow->clip_edit->edit_clip(
149                         mwindow->session->drag_clips->values[0]);
150         }
151         return 1;
152 }
153
154
155 ClipPopupSort::ClipPopupSort(MWindow *mwindow, ClipPopup *popup)
156  : BC_MenuItem(_("Sort items"))
157 {
158         this->mwindow = mwindow;
159         this->popup = popup;
160 }
161
162 ClipPopupSort::~ClipPopupSort()
163 {
164 }
165
166 int ClipPopupSort::handle_event()
167 {
168         mwindow->awindow->gui->sort_assets();
169         return 1;
170 }
171
172
173 ClipPopupView::ClipPopupView(MWindow *mwindow, ClipPopup *popup)
174  : BC_MenuItem(_("View"))
175 {
176         this->mwindow = mwindow;
177         this->popup = popup;
178 }
179
180 ClipPopupView::~ClipPopupView()
181 {
182 }
183
184 int ClipPopupView::handle_event()
185 {
186         VWindow *vwindow = mwindow->get_viewer(1, DEFAULT_VWINDOW);
187         vwindow->gui->lock_window("ClipPopupView::handle_event");
188
189         if(mwindow->session->drag_assets->total)
190                 vwindow->change_source(
191                         mwindow->session->drag_assets->values[0]);
192         else
193         if(mwindow->session->drag_clips->total)
194                 vwindow->change_source(
195                         mwindow->session->drag_clips->values[0]);
196
197         vwindow->gui->unlock_window();
198         return 1;
199 }
200
201
202 ClipPopupViewWindow::ClipPopupViewWindow(MWindow *mwindow, ClipPopup *popup)
203  : BC_MenuItem(_("View in new window"))
204 {
205         this->mwindow = mwindow;
206         this->popup = popup;
207 }
208
209 ClipPopupViewWindow::~ClipPopupViewWindow()
210 {
211 }
212
213 int ClipPopupViewWindow::handle_event()
214 {
215 // Find window with nothing
216         VWindow *vwindow = mwindow->get_viewer(1);
217
218 // TODO: create new vwindow or change current vwindow
219         vwindow->gui->lock_window("ClipPopupView::handle_event");
220
221         if(mwindow->session->drag_assets->total)
222                 vwindow->change_source(
223                         mwindow->session->drag_assets->values[0]);
224         else
225         if(mwindow->session->drag_clips->total)
226                 vwindow->change_source(
227                         mwindow->session->drag_clips->values[0]);
228
229         vwindow->gui->unlock_window();
230         return 1;
231 }
232
233
234 ClipPopupCopy::ClipPopupCopy(MWindow *mwindow, ClipPopup *popup)
235  : BC_MenuItem(_("Copy"))
236 {
237         this->mwindow = mwindow;
238         this->popup = popup;
239 }
240 ClipPopupCopy::~ClipPopupCopy()
241 {
242 }
243
244 int ClipPopupCopy::handle_event()
245 {
246         MWindowGUI *gui = mwindow->gui;
247         gui->lock_window("ClipPopupCopy::handle_event");
248         if( mwindow->session->drag_clips->total > 0 ) {
249                 FileXML file;
250                 EDL *edl = mwindow->session->drag_clips->values[0];
251                 double start = 0, end = edl->tracks->total_length();
252                 edl->copy(start, end, 1, 0, 0, &file, "", 1);
253                 const char *file_string = file.string();
254                 long file_length = strlen(file_string);
255                 gui->get_clipboard()->to_clipboard(file_string, file_length,
256                         SECONDARY_SELECTION);
257                 gui->get_clipboard()->to_clipboard(file_string, file_length,
258                         BC_PRIMARY_SELECTION);
259         }
260         gui->unlock_window(); 
261         return 1;
262 }
263
264
265 ClipPopupPaste::ClipPopupPaste(MWindow *mwindow, ClipPopup *popup)
266  : BC_MenuItem(_("Paste"))
267 {
268         this->mwindow = mwindow;
269         this->popup = popup;
270 }
271
272 ClipPopupPaste::~ClipPopupPaste()
273 {
274 }
275
276 int ClipPopupPaste::handle_event()
277 {
278         popup->paste_assets();
279         return 1;
280 }
281
282
283 ClipMatchSize::ClipMatchSize(MWindow *mwindow, ClipPopup *popup)
284  : BC_MenuItem(_("Match project size"))
285 {
286         this->mwindow = mwindow;
287         this->popup = popup;
288 }
289
290 int ClipMatchSize::handle_event()
291 {
292         popup->match_size();
293         return 1;
294 }
295
296
297 ClipMatchRate::ClipMatchRate(MWindow *mwindow, ClipPopup *popup)
298  : BC_MenuItem(_("Match frame rate"))
299 {
300         this->mwindow = mwindow;
301         this->popup = popup;
302 }
303
304 int ClipMatchRate::handle_event()
305 {
306         popup->match_rate();
307         return 1;
308 }
309
310
311 ClipMatchAll::ClipMatchAll(MWindow *mwindow, ClipPopup *popup)
312  : BC_MenuItem(_("Match all"))
313 {
314         this->mwindow = mwindow;
315         this->popup = popup;
316 }
317
318 int ClipMatchAll::handle_event()
319 {
320         popup->match_all();
321         return 1;
322 }
323
324
325 ClipPopupDelete::ClipPopupDelete(MWindow *mwindow, ClipPopup *popup)
326  : BC_MenuItem(_("Delete"))
327 {
328         this->mwindow = mwindow;
329         this->popup = popup;
330 }
331
332
333 ClipPopupDelete::~ClipPopupDelete()
334 {
335 }
336
337 int ClipPopupDelete::handle_event()
338 {
339         mwindow->remove_assets_from_project(1, 1,
340                 mwindow->session->drag_assets,
341                 mwindow->session->drag_clips);
342         return 1;
343 }
344
345
346 ClipPasteToFolder::ClipPasteToFolder(MWindow *mwindow)
347  : BC_MenuItem(_("Paste Clip"))
348 {
349         this->mwindow = mwindow;
350 }
351
352 int ClipPasteToFolder::handle_event()
353 {
354         MWindowGUI *gui = mwindow->gui;
355         gui->lock_window("ClipPasteToFolder::handle_event 1");
356         int64_t len = gui->get_clipboard()->clipboard_len(SECONDARY_SELECTION);
357         if( len ) {
358                 char *string = new char[len + 1];
359                 gui->get_clipboard()->from_clipboard(string, len, BC_PRIMARY_SELECTION);
360                 const char *clip_header = "<EDL VERSION=";
361                 if( !strncmp(clip_header, string, strlen(clip_header)) ) {
362                         FileXML file;
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: "));
370                 }
371                 else {
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);
376                 }
377                 delete [] string;
378         }
379         else {
380                 eprintf("paste buffer empty");
381         }
382         gui->unlock_window();
383         return 1;
384 }
385
386
387 ClipListMenu::ClipListMenu(MWindow *mwindow, AWindowGUI *gui)
388  : BC_PopupMenu(0, 0, 0, "", 0)
389 {
390         this->mwindow = mwindow;
391         this->gui = gui;
392 }
393
394 ClipListMenu::~ClipListMenu()
395 {
396 }
397
398 void ClipListMenu::create_objects()
399 {
400         add_item(format = new AWindowListFormat(mwindow));
401         add_item(new AWindowListSort(mwindow));
402         add_item(new ClipPasteToFolder(mwindow));
403         update();
404 }
405
406 void ClipListMenu::update()
407 {
408         format->update();
409 }
410