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
24 #include "bcsignals.h"
29 #include "edlsession.h"
30 #include "filesystem.h"
32 #include "indexable.h"
34 #include "localsession.h"
35 #include "mainclock.h"
37 #include "mainsession.h"
39 #include "mwindowgui.h"
40 #include "playbackengine.h"
42 #include "transportque.h"
43 #include "vplayback.h"
45 #include "vtracking.h"
47 #include "vwindowgui.h"
50 VWindow::VWindow(MWindow *mwindow)
53 this->mwindow = mwindow;
66 //printf("VWindow::~VWindow 1\n");
67 delete playback_engine;
68 //printf("VWindow::~VWindow 1\n");
69 delete playback_cursor;
72 //printf("VWindow::~VWindow 2\n");
75 void VWindow::delete_source(int do_main_edl, int update_gui)
77 //printf("VWindow::delete_source %d %d %p %p\n", __LINE__, gui->get_window_lock(), edl, indexable);
78 if(do_main_edl) mwindow->edl->remove_vwindow_edl(get_edl());
82 edl->Garbage::remove_user();
83 //printf("VWindow::delete_source %d\n", __LINE__);
87 // if(mwindow->edl->vwindow_edl && !mwindow->edl->vwindow_edl_shared)
89 // mwindow->edl->vwindow_edl->Garbage::remove_user();
90 // mwindow->edl->vwindow_edl = 0;
91 // mwindow->edl->vwindow_edl_shared = 0;
94 //printf("VWindow::delete_source %d\n", __LINE__);
95 if(indexable) indexable->Garbage::remove_user();
98 if(update_gui) gui->change_source(0, _("Viewer"));
99 //printf("VWindow::delete_source %d\n", __LINE__);
103 void VWindow::load_defaults()
107 void VWindow::create_objects()
112 void VWindow::handle_done_event(int result)
114 playback_engine->interrupt_playback(1);
116 if( mwindow->in_destructor ) return;
119 for(int i = 0; i < mwindow->vwindows.size(); i++)
122 //printf("VWindow::handle_done_event %d %d\n", __LINE__, mwindow->vwindows.get(i)->is_running());
123 if(mwindow->vwindows.get(i)->is_running()) total++;
125 // subtract ourselves
128 // Update the menu if no viewers visible
131 mwindow->gui->lock_window("VWindowGUI::close_event");
132 mwindow->gui->mainmenu->show_vwindow->set_checked(0);
133 mwindow->gui->unlock_window();
135 mwindow->session->show_vwindow = 0;
136 mwindow->save_defaults();
142 BC_Window* VWindow::new_gui()
144 //printf("VWindow::create_objects 1\n");
145 gui = new VWindowGUI(mwindow, this);
146 //printf("VWindow::create_objects 1\n");
147 gui->create_objects();
148 //printf("VWindow::create_objects 1\n");
150 playback_engine = new VPlayback(mwindow, this, gui->canvas);
151 //printf("VWindow::create_objects 1\n");
153 // Start command loop
154 playback_engine->create_objects();
155 //printf("VWindow::create_objects 1\n");
156 gui->transport->set_engine(playback_engine);
157 //printf("VWindow::create_objects 1\n");
158 playback_cursor = new VTracking(mwindow, this);
159 //printf("VWindow::create_objects 1\n");
160 playback_cursor->create_objects();
161 //printf("VWindow::create_objects 2\n");
163 clip_edit = new ClipEdit(mwindow, 0, this);
168 EDL* VWindow::get_edl()
170 // return mwindow->edl->vwindow_edl;
174 Indexable* VWindow::get_source()
176 return this->indexable;
179 void VWindow::change_source(int edl_number)
181 if(!is_running()) return;
183 //printf("VWindow::change_source %d %p\n", __LINE__, mwindow->edl->get_vwindow_edl(edl_number));
184 if( edl_number >= 0 && edl_number < mwindow->edl->total_vwindow_edls() &&
185 mwindow->edl->get_vwindow_edl(edl_number) )
187 this->edl = mwindow->edl->get_vwindow_edl(edl_number);
188 this->edl->Garbage::add_user();
189 gui->change_source(get_edl(), get_edl()->local_session->clip_title);
190 update_position(CHANGE_ALL, 1, 1, 1);
195 // if(indexable) indexable->Garbage::remove_user();
197 // mwindow->edl->vwindow_edl_shared = 0;
201 void VWindow::change_source(Indexable *indexable)
203 if(!running()) return;
204 // if(asset && this->asset &&
205 // asset->id == this->asset->id &&
206 // asset == this->asset) return;
208 //printf("VWindow::change_source %d\n", __LINE__);
210 char title[BCTEXTLEN];
212 fs.extract_name(title, indexable->path);
213 //printf("VWindow::change_source 1\n");
216 //printf("VWindow::change_source 1\n");
218 // Generate EDL off of main EDL for cutting
221 if(indexable->is_asset)
223 this->indexable = asset = new Asset;
224 asset->copy_from((Asset*)indexable, 0);
228 this->indexable = nested_edl = new EDL;
229 nested_edl->create_objects();
230 nested_edl->copy_all((EDL*)indexable);
234 this->edl = new EDL(mwindow->edl);
235 this->edl->create_objects();
236 mwindow->edl->append_vwindow_edl(this->edl, 1);
238 // mwindow->edl->vwindow_edl = new EDL(mwindow->edl);
239 // mwindow->edl->vwindow_edl_shared = 0;
240 // mwindow->edl->vwindow_edl->create_objects();
242 //printf("VWindow::change_source 1 %d %p %p\n", __LINE__, asset, nested_edl);
244 mwindow->asset_to_edl(this->edl, asset);
246 mwindow->edl_to_nested(this->edl, nested_edl);
249 gui->change_source(this->edl, title);
250 update_position(CHANGE_ALL, 1, 1, 1);
254 //printf("VWindow::change_source 2\n");
257 void VWindow::change_source(EDL *edl)
259 if(!running()) return;
260 //printf("VWindow::change_source %d %p\n", __LINE__, edl);
261 // EDLs are identical
262 // if(edl && mwindow->edl->vwindow_edl &&
263 // edl->id == mwindow->edl->vwindow_edl->id) return;
264 if(edl && get_edl() && edl->id == get_edl()->id) return;
270 mwindow->edl->append_vwindow_edl(edl, 1);
272 this->edl->Garbage::add_user();
274 // mwindow->edl->vwindow_edl = edl;
275 // in order not to later delete edl if it is shared
276 // edl->Garbage::add_user();
277 // mwindow->edl->vwindow_edl_shared = 1;
280 gui->change_source(edl, edl->local_session->clip_title);
281 update_position(CHANGE_ALL, 1, 1, 1);
284 gui->change_source(edl, _("Viewer"));
288 void VWindow::goto_start()
292 get_edl()->local_session->set_selectionstart(0);
293 get_edl()->local_session->set_selectionend(0);
294 update_position(CHANGE_NONE,
301 void VWindow::goto_end()
305 double position = get_edl()->tracks->total_length();
306 get_edl()->local_session->set_selectionstart(position);
307 get_edl()->local_session->set_selectionend(position);
308 update_position(CHANGE_NONE,
315 void VWindow::update(int do_timebar)
318 gui->timebar->update(1);
321 void VWindow::update_position(int change_type,
326 EDL *edl = get_edl();
329 //printf("VWindow::update_position %d\n", __LINE__);
331 playback_engine->que->send_command(CURRENT_FRAME,
336 double position = edl->local_session->get_selectionstart(1);
337 if(lock_window) gui->lock_window("VWindow::update_position");
338 gui->clock->update(position);
339 if(lock_window) gui->unlock_window();
347 int VWindow::update_position(double position)
349 EDL *edl = get_edl();
352 gui->unlock_window();
354 playback_engine->interrupt_playback(1);
356 position = mwindow->edl->align_to_frame(position, 0);
357 position = MAX(0, position);
359 edl->local_session->set_selectionstart(position);
360 edl->local_session->set_selectionend(position);
362 gui->lock_window("VWindow::update_position 1");
363 update_position(CHANGE_NONE, 0, 1, 0);
369 void VWindow::set_inpoint()
371 EDL *edl = get_edl();
374 edl->set_inpoint(edl->local_session->get_selectionstart(1));
375 gui->timebar->update(1);
379 void VWindow::set_outpoint()
381 EDL *edl = get_edl();
384 edl->set_outpoint(edl->local_session->get_selectionstart(1));
385 gui->timebar->update(1);
389 void VWindow::clear_inpoint()
391 EDL *edl = get_edl();
394 edl->local_session->unset_inpoint();
395 gui->timebar->update(1);
399 void VWindow::clear_outpoint()
401 EDL *edl = get_edl();
404 edl->local_session->unset_outpoint();
405 gui->timebar->update(1);
411 EDL *edl = get_edl();
414 double start = edl->local_session->get_selectionstart();
415 double end = edl->local_session->get_selectionend();
425 const char *file_string = file.string();
426 long file_length = strlen(file_string);
427 mwindow->gui->lock_window();
428 mwindow->gui->to_clipboard(file_string, file_length, BC_PRIMARY_SELECTION);
429 mwindow->gui->to_clipboard(file_string, file_length, SECONDARY_SELECTION);
430 mwindow->gui->unlock_window();
434 void VWindow::splice_selection()
438 void VWindow::overwrite_selection()