viewer window playback tweaks
[goodguy/history.git] / cinelerra-5.1 / cinelerra / vwindowgui.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 1997-2011 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 "asset.h"
23 #include "assets.h"
24 #include "awindowgui.h"
25 #include "awindow.h"
26 #include "canvas.h"
27 #include "clip.h"
28 #include "clipedit.h"
29 #include "edl.h"
30 #include "edlsession.h"
31 #include "filesystem.h"
32 #include "filexml.h"
33 #include "fonts.h"
34 #include "keys.h"
35 #include "labels.h"
36 #include "language.h"
37 #include "localsession.h"
38 #include "mainclock.h"
39 #include "mainmenu.h"
40 #include "mainsession.h"
41 #include "mainundo.h"
42 #include "meterpanel.h"
43 #include "mwindowgui.h"
44 #include "mwindow.h"
45 #include "playtransport.h"
46 #include "preferences.h"
47 #include "theme.h"
48 #include "timebar.h"
49 #include "tracks.h"
50 #include "vframe.h"
51 #include "vplayback.h"
52 #include "vtimebar.h"
53 #include "vwindowgui.h"
54 #include "vwindow.h"
55
56
57
58
59 VWindowGUI::VWindowGUI(MWindow *mwindow, VWindow *vwindow)
60  : BC_Window(_(PROGRAM_NAME ": Viewer"),
61         mwindow->session->vwindow_x,
62         mwindow->session->vwindow_y,
63         mwindow->session->vwindow_w,
64         mwindow->session->vwindow_h,
65         100,
66         100,
67         1,
68         1,
69         0) // Hide it
70 {
71         this->mwindow = mwindow;
72         this->vwindow = vwindow;
73         canvas = 0;
74         transport = 0;
75         edit_panel = 0;
76         meters = 0;
77 //      source = 0;
78         strcpy(loaded_title, "");
79         highlighted = 0;
80 }
81
82 VWindowGUI::~VWindowGUI()
83 {
84         vwindow->playback_engine->interrupt_playback(1);
85         sources.remove_all_objects();
86         labels.remove_all_objects();
87         delete canvas;
88         delete transport;
89         delete edit_panel;
90         delete meters;
91 //      delete source;
92 }
93
94 void VWindowGUI::change_source(EDL *edl, const char *title)
95 {
96 //printf("VWindowGUI::change_source %d\n", __LINE__);
97
98         update_sources(title);
99         strcpy(loaded_title, title);
100         char string[BCTEXTLEN];
101         if(title[0])
102                 sprintf(string, _(PROGRAM_NAME ": %s"), title);
103         else
104                 sprintf(string, _(PROGRAM_NAME ": Viewer"));
105
106         lock_window("VWindowGUI::change_source");
107         canvas->clear();
108         timebar->update(0);
109         set_title(string);
110         unlock_window();
111 }
112
113
114 // Get source list from master EDL
115 void VWindowGUI::update_sources(const char *title)
116 {
117         lock_window("VWindowGUI::update_sources");
118
119 //printf("VWindowGUI::update_sources 1\n");
120         sources.remove_all_objects();
121 //printf("VWindowGUI::update_sources 2\n");
122
123
124
125         for(int i = 0;
126                 i < mwindow->edl->clips.total;
127                 i++)
128         {
129                 char *clip_title = mwindow->edl->clips.values[i]->local_session->clip_title;
130                 int exists = 0;
131
132                 for(int j = 0; j < sources.total; j++)
133                 {
134                         if(!strcasecmp(sources.values[j]->get_text(), clip_title))
135                         {
136                                 exists = 1;
137                         }
138                 }
139
140                 if(!exists)
141                 {
142                         sources.append(new BC_ListBoxItem(clip_title));
143                 }
144         }
145 //printf("VWindowGUI::update_sources 3\n");
146
147         FileSystem fs;
148         for(Asset *current = mwindow->edl->assets->first;
149                 current;
150                 current = NEXT)
151         {
152                 char clip_title[BCTEXTLEN];
153                 fs.extract_name(clip_title, current->path);
154                 int exists = 0;
155
156                 for(int j = 0; j < sources.total; j++)
157                 {
158                         if(!strcasecmp(sources.values[j]->get_text(), clip_title))
159                         {
160                                 exists = 1;
161                         }
162                 }
163
164                 if(!exists)
165                 {
166                         sources.append(new BC_ListBoxItem(clip_title));
167                 }
168         }
169
170 //printf("VWindowGUI::update_sources 4\n");
171
172 //      source->update_list(&sources);
173 //      source->update(title);
174         unlock_window();
175 }
176
177 void VWindowGUI::create_objects()
178 {
179         in_point = 0;
180         out_point = 0;
181         lock_window("VWindowGUI::create_objects");
182         set_icon(mwindow->theme->get_image("vwindow_icon"));
183
184 //printf("VWindowGUI::create_objects 1\n");
185         mwindow->theme->get_vwindow_sizes(this);
186         mwindow->theme->draw_vwindow_bg(this);
187         flash(0);
188
189         meters = new VWindowMeters(mwindow,
190                 this,
191                 mwindow->theme->vmeter_x,
192                 mwindow->theme->vmeter_y,
193                 mwindow->theme->vmeter_h);
194         meters->create_objects();
195
196 //printf("VWindowGUI::create_objects 1\n");
197 // Requires meters to build
198         edit_panel = new VWindowEditing(mwindow, vwindow);
199         edit_panel->set_meters(meters);
200         edit_panel->create_objects();
201
202 //printf("VWindowGUI::create_objects 1\n");
203         transport = new VWindowTransport(mwindow,
204                 this,
205                 mwindow->theme->vtransport_x,
206                 mwindow->theme->vtransport_y);
207         transport->create_objects();
208
209 //printf("VWindowGUI::create_objects 1\n");
210 //      add_subwindow(fps_title = new BC_Title(mwindow->theme->vedit_x, y, ""));
211     add_subwindow(clock = new MainClock(mwindow,
212                 mwindow->theme->vtime_x,
213                 mwindow->theme->vtime_y,
214                 mwindow->theme->vtime_w));
215
216         canvas = new VWindowCanvas(mwindow, this);
217         canvas->create_objects(mwindow->edl);
218         canvas->use_vwindow();
219
220
221 //printf("VWindowGUI::create_objects 1\n");
222         add_subwindow(timebar = new VTimeBar(mwindow,
223                 this,
224                 mwindow->theme->vtimebar_x,
225                 mwindow->theme->vtimebar_y,
226                 mwindow->theme->vtimebar_w,
227                 mwindow->theme->vtimebar_h));
228         timebar->create_objects();
229 //printf("VWindowGUI::create_objects 2\n");
230
231
232 //printf("VWindowGUI::create_objects 1\n");
233 //      source = new VWindowSource(mwindow,
234 //              this,
235 //              mwindow->theme->vsource_x,
236 //              mwindow->theme->vsource_y);
237 //      source->create_objects();
238         update_sources(_("None"));
239
240 //printf("VWindowGUI::create_objects 2\n");
241         deactivate();
242
243         show_window();
244         unlock_window();
245 }
246
247 int VWindowGUI::resize_event(int w, int h)
248 {
249         mwindow->session->vwindow_x = get_x();
250         mwindow->session->vwindow_y = get_y();
251         mwindow->session->vwindow_w = w;
252         mwindow->session->vwindow_h = h;
253
254         mwindow->theme->get_vwindow_sizes(this);
255         mwindow->theme->draw_vwindow_bg(this);
256         flash(0);
257
258 //printf("VWindowGUI::resize_event %d %d\n", __LINE__, mwindow->theme->vedit_y);
259         edit_panel->reposition_buttons(mwindow->theme->vedit_x,
260                 mwindow->theme->vedit_y);
261
262         timebar->resize_event();
263         transport->reposition_buttons(mwindow->theme->vtransport_x,
264                 mwindow->theme->vtransport_y);
265         clock->reposition_window(mwindow->theme->vtime_x,
266                 mwindow->theme->vtime_y,
267                 mwindow->theme->vtime_w,
268                 clock->get_h());
269         canvas->reposition_window(0,
270                 mwindow->theme->vcanvas_x,
271                 mwindow->theme->vcanvas_y,
272                 mwindow->theme->vcanvas_w,
273                 mwindow->theme->vcanvas_h);
274 //printf("VWindowGUI::resize_event %d %d\n", __LINE__, mwindow->theme->vcanvas_x);
275 //      source->reposition_window(mwindow->theme->vsource_x,
276 //              mwindow->theme->vsource_y);
277         meters->reposition_window(mwindow->theme->vmeter_x,
278                 mwindow->theme->vmeter_y,
279                 -1,
280                 mwindow->theme->vmeter_h);
281
282         BC_WindowBase::resize_event(w, h);
283         return 1;
284 }
285
286
287
288
289
290 int VWindowGUI::translation_event()
291 {
292         mwindow->session->vwindow_x = get_x();
293         mwindow->session->vwindow_y = get_y();
294         return 0;
295 }
296
297 int VWindowGUI::close_event()
298 {
299         hide_window();
300         int i = mwindow->vwindows.size();
301         while( --i >= 0 && mwindow->vwindows.get(i)->gui != this );
302         if( i > 0 ) {
303                 set_done(0);
304                 return 1;
305         }
306
307         mwindow->session->show_vwindow = 0;
308         unlock_window();
309
310         mwindow->gui->lock_window("VWindowGUI::close_event");
311         mwindow->gui->mainmenu->show_vwindow->set_checked(0);
312         mwindow->gui->unlock_window();
313
314         lock_window("VWindowGUI::close_event");
315         mwindow->save_defaults();
316         return 1;
317 }
318
319 int VWindowGUI::keypress_event()
320 {
321         int result = 0;
322         switch(get_keypress())
323         {
324                 case 'w':
325                 case 'W':
326                         close_event();
327                         result = 1;
328                         break;
329                 case 'z':
330                         mwindow->undo_entry(this);
331                         break;
332                 case 'Z':
333                         mwindow->redo_entry(this);
334                         break;
335                 case 'f':
336                         unlock_window();
337                         if(mwindow->session->vwindow_fullscreen)
338                                 canvas->stop_fullscreen();
339                         else
340                                 canvas->start_fullscreen();
341                         lock_window("VWindowGUI::keypress_event 1");
342                         break;
343                 case ESC:
344                         unlock_window();
345                         if(mwindow->session->vwindow_fullscreen)
346                                 canvas->stop_fullscreen();
347                         lock_window("VWindowGUI::keypress_event 2");
348                         break;
349         }
350         if(!result) result = transport->keypress_event();
351
352         return result;
353 }
354
355 int VWindowGUI::button_press_event()
356 {
357         if( get_buttonpress() == LEFT_BUTTON && canvas->get_canvas() &&
358             canvas->get_canvas()->get_cursor_over_window() ) {
359                 PlaybackEngine *playback_engine = vwindow->playback_engine;
360                 unlock_window();
361                 if( playback_engine->is_playing_back ) {
362                         transport->handle_transport(STOP, 1);
363                 }
364                 else {
365                         transport->handle_transport(NORMAL_FWD, 1);
366                 }
367                 vwindow->gui->lock_window("VWindowEditing::prev_label");
368                 return 1;
369         }
370         if(canvas->get_canvas())
371                 return canvas->button_press_event_base(canvas->get_canvas());
372         return 0;
373 }
374
375 int VWindowGUI::cursor_leave_event()
376 {
377         if(canvas->get_canvas())
378                 return canvas->cursor_leave_event_base(canvas->get_canvas());
379         return 0;
380 }
381
382 int VWindowGUI::cursor_enter_event()
383 {
384         if(canvas->get_canvas())
385                 return canvas->cursor_enter_event_base(canvas->get_canvas());
386         return 0;
387 }
388
389 int VWindowGUI::button_release_event()
390 {
391         if(canvas->get_canvas())
392                 return canvas->button_release_event();
393         return 0;
394 }
395
396 int VWindowGUI::cursor_motion_event()
397 {
398         if(canvas->get_canvas())
399         {
400                 canvas->get_canvas()->unhide_cursor();
401                 return canvas->cursor_motion_event();
402         }
403         return 0;
404 }
405
406
407 void VWindowGUI::drag_motion()
408 {
409 // Window hidden
410         if(get_hidden()) return;
411         if(mwindow->session->current_operation != DRAG_ASSET) return;
412         int need_highlight = cursor_above() && get_cursor_over_window() ? 1 : 0;
413         if( highlighted == need_highlight ) return;
414         highlighted = need_highlight;
415         canvas->draw_refresh();
416 }
417
418 int VWindowGUI::drag_stop()
419 {
420         if(get_hidden()) return 0;
421
422         if(highlighted &&
423                 mwindow->session->current_operation == DRAG_ASSET)
424         {
425                 highlighted = 0;
426                 canvas->draw_refresh();
427
428                 Indexable *indexable = mwindow->session->drag_assets->size() ?
429                         mwindow->session->drag_assets->get(0) :
430                         0;
431                 EDL *edl = mwindow->session->drag_clips->size() ?
432                         mwindow->session->drag_clips->get(0) :
433                         0;
434                 if( vwindow->playback_engine->is_playing_back ) {
435                         unlock_window();
436                         vwindow->stop_playback(1);
437                         lock_window("VWindowGUI::drag_stop");
438                 }
439
440                 if(indexable)
441                         vwindow->change_source(indexable);
442                 else
443                 if(edl)
444                         vwindow->change_source(edl);
445                 return 1;
446         }
447
448         return 0;
449 }
450
451
452 void VWindowGUI::update_meters()
453 {
454         if(mwindow->edl->session->vwindow_meter != meters->visible)
455         {
456                 meters->set_meters(meters->meter_count,
457                         mwindow->edl->session->vwindow_meter);
458                 mwindow->theme->get_vwindow_sizes(this);
459                 resize_event(get_w(), get_h());
460         }
461 }
462
463
464
465 VWindowMeters::VWindowMeters(MWindow *mwindow,
466         VWindowGUI *gui,
467         int x,
468         int y,
469         int h)
470  : MeterPanel(mwindow,
471                 gui,
472                 x,
473                 y,
474                 -1,
475                 h,
476                 mwindow->edl->session->audio_channels,
477                 mwindow->edl->session->vwindow_meter,
478                 0,
479                 0)
480 {
481         this->mwindow = mwindow;
482         this->gui = gui;
483 }
484
485 VWindowMeters::~VWindowMeters()
486 {
487 }
488
489 int VWindowMeters::change_status_event(int new_status)
490 {
491         mwindow->edl->session->vwindow_meter = new_status;
492         gui->update_meters();
493         return 1;
494 }
495
496
497
498
499
500
501
502 VWindowEditing::VWindowEditing(MWindow *mwindow, VWindow *vwindow)
503  : EditPanel(mwindow,
504                 vwindow->gui,
505                 mwindow->theme->vedit_x,
506                 mwindow->theme->vedit_y,
507                 EDITING_ARROW,
508                 0,
509                 0,
510                 1,
511                 1,
512                 0,
513                 0,
514                 1,
515                 0,
516                 0,
517                 0,
518                 0, // locklabels
519                 1,
520                 1,
521                 1,
522                 0,
523                 0,
524                 0)
525 {
526         this->mwindow = mwindow;
527         this->vwindow = vwindow;
528 }
529
530 VWindowEditing::~VWindowEditing()
531 {
532 }
533
534 void VWindowEditing::copy_selection()
535 {
536         vwindow->copy();
537 }
538
539 void VWindowEditing::splice_selection()
540 {
541         if(vwindow->get_edl())
542         {
543                 mwindow->gui->lock_window("VWindowEditing::splice_selection");
544                 mwindow->splice(vwindow->get_edl());
545                 mwindow->gui->unlock_window();
546         }
547 }
548
549 void VWindowEditing::overwrite_selection()
550 {
551         if(vwindow->get_edl())
552         {
553                 mwindow->gui->lock_window("VWindowEditing::overwrite_selection");
554                 mwindow->overwrite(vwindow->get_edl());
555                 mwindow->gui->unlock_window();
556         }
557 }
558
559 void VWindowEditing::toggle_label()
560 {
561         if(vwindow->get_edl())
562         {
563                 EDL *edl = vwindow->get_edl();
564                 edl->labels->toggle_label(edl->local_session->get_selectionstart(1),
565                         edl->local_session->get_selectionend(1));
566                 vwindow->gui->timebar->update(1);
567         }
568 }
569
570 void VWindowEditing::prev_label()
571 {
572         if(vwindow->get_edl())
573         {
574                 EDL *edl = vwindow->get_edl();
575                 vwindow->gui->unlock_window();
576                 vwindow->playback_engine->interrupt_playback(1);
577                 vwindow->gui->lock_window("VWindowEditing::prev_label");
578
579                 Label *current = edl->labels->prev_label(
580                         edl->local_session->get_selectionstart(1));
581
582
583                 if(!current)
584                 {
585                         edl->local_session->set_selectionstart(0);
586                         edl->local_session->set_selectionend(0);
587                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
588                         vwindow->gui->timebar->update(1);
589                 }
590                 else
591                 {
592                         edl->local_session->set_selectionstart(current->position);
593                         edl->local_session->set_selectionend(current->position);
594                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
595                         vwindow->gui->timebar->update(1);
596                 }
597         }
598 }
599
600 void VWindowEditing::next_label()
601 {
602         if(vwindow->get_edl())
603         {
604                 EDL *edl = vwindow->get_edl();
605                 Label *current = edl->labels->next_label(
606                         edl->local_session->get_selectionstart(1));
607                 if(!current)
608                 {
609                         vwindow->gui->unlock_window();
610                         vwindow->playback_engine->interrupt_playback(1);
611                         vwindow->gui->lock_window("VWindowEditing::next_label 1");
612
613                         double position = edl->tracks->total_length();
614                         edl->local_session->set_selectionstart(position);
615                         edl->local_session->set_selectionend(position);
616                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
617                         vwindow->gui->timebar->update(1);
618                 }
619                 else
620                 {
621                         vwindow->gui->unlock_window();
622                         vwindow->playback_engine->interrupt_playback(1);
623                         vwindow->gui->lock_window("VWindowEditing::next_label 2");
624
625                         edl->local_session->set_selectionstart(current->position);
626                         edl->local_session->set_selectionend(current->position);
627                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
628                         vwindow->gui->timebar->update(1);
629                 }
630         }
631 }
632
633 double VWindowEditing::get_position()
634 {
635         EDL *edl = vwindow->get_edl();
636         double position = !edl ? 0 : edl->local_session->get_selectionstart(1);
637         return position;
638 }
639
640 void VWindowEditing::set_position(double position)
641 {
642         EDL *edl = vwindow->get_edl();
643         if( !edl ) return;
644         if( get_position() != position ) {
645                 if( position < 0 ) position = 0;
646                 edl->local_session->set_selectionstart(position);
647                 edl->local_session->set_selectionend(position);
648                 vwindow->update_position(CHANGE_NONE, 0, 1);
649         }
650 }
651
652 void VWindowEditing::set_inpoint()
653 {
654         vwindow->set_inpoint();
655 }
656
657 void VWindowEditing::set_outpoint()
658 {
659         vwindow->set_outpoint();
660 }
661
662 void VWindowEditing::unset_inoutpoint()
663 {
664         vwindow->unset_inoutpoint();
665 }
666
667
668 void VWindowEditing::to_clip()
669 {
670         EDL *edl = vwindow->get_edl();
671         if( !edl ) return;
672         mwindow->to_clip(edl, _("viewer window: "));
673 }
674
675 VWindowSource::VWindowSource(MWindow *mwindow, VWindowGUI *vwindow, int x, int y)
676  : BC_PopupTextBox(vwindow,
677         &vwindow->sources,
678         "",
679         x,
680         y,
681         200,
682         200)
683 {
684         this->mwindow = mwindow;
685         this->vwindow = vwindow;
686 }
687
688 VWindowSource::~VWindowSource()
689 {
690 }
691
692 int VWindowSource::handle_event()
693 {
694         return 1;
695 }
696
697
698 VWindowTransport::VWindowTransport(MWindow *mwindow,
699         VWindowGUI *gui,
700         int x,
701         int y)
702  : PlayTransport(mwindow,
703         gui,
704         x,
705         y)
706 {
707         this->gui = gui;
708 }
709
710 EDL* VWindowTransport::get_edl()
711 {
712         return gui->vwindow->get_edl();
713 }
714
715
716 void VWindowTransport::goto_start()
717 {
718         gui->unlock_window();
719         handle_transport(REWIND, 1);
720         gui->lock_window("VWindowTransport::goto_start");
721         gui->vwindow->goto_start();
722 }
723
724 void VWindowTransport::goto_end()
725 {
726         gui->unlock_window();
727         handle_transport(GOTO_END, 1);
728         gui->lock_window("VWindowTransport::goto_end");
729         gui->vwindow->goto_end();
730 }
731
732
733
734
735 VWindowCanvas::VWindowCanvas(MWindow *mwindow, VWindowGUI *gui)
736  : Canvas(mwindow,
737         gui,
738         mwindow->theme->vcanvas_x,
739         mwindow->theme->vcanvas_y,
740         mwindow->theme->vcanvas_w,
741         mwindow->theme->vcanvas_h,
742         0, 0, 0)
743 {
744 //printf("VWindowCanvas::VWindowCanvas %d %d\n", __LINE__, mwindow->theme->vcanvas_x);
745         this->mwindow = mwindow;
746         this->gui = gui;
747 }
748
749 void VWindowCanvas::zoom_resize_window(float percentage)
750 {
751         EDL *edl = gui->vwindow->get_edl();
752         if(!edl) edl = mwindow->edl;
753
754         int canvas_w, canvas_h;
755         int new_w, new_h;
756
757 // Get required canvas size
758         calculate_sizes(edl->get_aspect_ratio(),
759                 edl->session->output_w,
760                 edl->session->output_h,
761                 percentage,
762                 canvas_w,
763                 canvas_h);
764
765 // Estimate window size from current borders
766         new_w = canvas_w + (gui->get_w() - mwindow->theme->vcanvas_w);
767         new_h = canvas_h + (gui->get_h() - mwindow->theme->vcanvas_h);
768
769         mwindow->session->vwindow_w = new_w;
770         mwindow->session->vwindow_h = new_h;
771
772         mwindow->theme->get_vwindow_sizes(gui);
773
774 // Estimate again from new borders
775         new_w = canvas_w + (mwindow->session->vwindow_w - mwindow->theme->vcanvas_w);
776         new_h = canvas_h + (mwindow->session->vwindow_h - mwindow->theme->vcanvas_h);
777
778
779         gui->resize_window(new_w, new_h);
780         gui->resize_event(new_w, new_h);
781 }
782
783 void VWindowCanvas::close_source()
784 {
785         gui->unlock_window();
786         gui->vwindow->playback_engine->interrupt_playback(1);
787         gui->lock_window("VWindowCanvas::close_source");
788         gui->vwindow->delete_source(1, 1);
789 }
790
791
792 void VWindowCanvas::draw_refresh(int flush)
793 {
794         EDL *edl = gui->vwindow->get_edl();
795
796         if(!get_canvas()->get_video_on()) get_canvas()->clear_box(0, 0, get_canvas()->get_w(), get_canvas()->get_h());
797         if(!get_canvas()->get_video_on() && refresh_frame && edl)
798         {
799                 float in_x1, in_y1, in_x2, in_y2;
800                 float out_x1, out_y1, out_x2, out_y2;
801                 get_transfers(edl,
802                         in_x1,
803                         in_y1,
804                         in_x2,
805                         in_y2,
806                         out_x1,
807                         out_y1,
808                         out_x2,
809                         out_y2);
810                 get_canvas()->draw_vframe(refresh_frame,
811                                 (int)out_x1,
812                                 (int)out_y1,
813                                 (int)(out_x2 - out_x1),
814                                 (int)(out_y2 - out_y1),
815                                 (int)in_x1,
816                                 (int)in_y1,
817                                 (int)(in_x2 - in_x1),
818                                 (int)(in_y2 - in_y1),
819                                 0);
820         }
821
822         if(!get_canvas()->get_video_on())
823         {
824                 draw_overlays();
825                 get_canvas()->flash(flush);
826         }
827 }
828
829 void VWindowCanvas::draw_overlays()
830 {
831         if( gui->highlighted )
832         {
833                 get_canvas()->set_color(WHITE);
834                 get_canvas()->set_inverse();
835                 get_canvas()->draw_rectangle(0, 0, get_canvas()->get_w(), get_canvas()->get_h());
836                 get_canvas()->draw_rectangle(1, 1, get_canvas()->get_w() - 2, get_canvas()->get_h() - 2);
837                 get_canvas()->set_opaque();
838         }
839 }
840
841 int VWindowCanvas::get_fullscreen()
842 {
843         return mwindow->session->vwindow_fullscreen;
844 }
845
846 void VWindowCanvas::set_fullscreen(int value)
847 {
848         mwindow->session->vwindow_fullscreen = value;
849 }
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887 #if 0
888 void VWindowGUI::update_points()
889 {
890         EDL *edl = vwindow->get_edl();
891
892 //printf("VWindowGUI::update_points 1\n");
893         if(!edl) return;
894
895 //printf("VWindowGUI::update_points 2\n");
896         long pixel = (long)((double)edl->local_session->in_point /
897                 edl->tracks->total_length() *
898                 (mwindow->theme->vtimebar_w -
899                         2 *
900                         mwindow->theme->in_point[0]->get_w())) +
901                 mwindow->theme->in_point[0]->get_w();
902
903 //printf("VWindowGUI::update_points 3 %d\n", edl->local_session->in_point);
904         if(in_point)
905         {
906 //printf("VWindowGUI::update_points 3.1\n");
907                 if(edl->local_session->in_point >= 0)
908                 {
909 //printf("VWindowGUI::update_points 4\n");
910                         if(edl->local_session->in_point != in_point->position ||
911                                 in_point->pixel != pixel)
912                         {
913                                 in_point->pixel = pixel;
914                                 in_point->reposition();
915                         }
916
917 //printf("VWindowGUI::update_points 5\n");
918                         in_point->position = edl->local_session->in_point;
919
920 //printf("VWindowGUI::update_points 6\n");
921                         if(edl->equivalent(in_point->position, edl->local_session->get_selectionstart(1)) ||
922                                 edl->equivalent(in_point->position, edl->local_session->get_selectionend(1)))
923                                 in_point->update(1);
924                         else
925                                 in_point->update(0);
926 //printf("VWindowGUI::update_points 7\n");
927                 }
928                 else
929                 {
930                         delete in_point;
931                         in_point = 0;
932                 }
933         }
934         else
935         if(edl->local_session->in_point >= 0)
936         {
937 //printf("VWindowGUI::update_points 8 %p\n", mwindow->theme->in_point);
938                 add_subwindow(in_point =
939                         new VWindowInPoint(mwindow,
940                                 0,
941                                 this,
942                                 pixel,
943                                 edl->local_session->in_point));
944 //printf("VWindowGUI::update_points 9\n");
945         }
946 //printf("VWindowGUI::update_points 10\n");
947
948         pixel = (long)((double)edl->local_session->out_point /
949                 (edl->tracks->total_length() + 0.5) *
950                 (mwindow->theme->vtimebar_w -
951                         2 *
952                         mwindow->theme->in_point[0]->get_w())) +
953                 mwindow->theme->in_point[0]->get_w() *
954                 2;
955
956         if(out_point)
957         {
958                 if(edl->local_session->out_point >= 0 && pixel >= 0 && pixel <= mwindow->theme->vtimebar_w)
959                 {
960                         if(edl->local_session->out_point != out_point->position ||
961                                 out_point->pixel != pixel)
962                         {
963                                 out_point->pixel = pixel;
964                                 out_point->reposition();
965                         }
966                         out_point->position = edl->local_session->out_point;
967
968                         if(edl->equivalent(out_point->position, edl->local_session->get_selectionstart(1)) ||
969                                 edl->equivalent(out_point->position, edl->local_session->get_selectionend(1)))
970                                 out_point->update(1);
971                         else
972                                 out_point->update(0);
973                 }
974                 else
975                 {
976                         delete out_point;
977                         out_point = 0;
978                 }
979         }
980         else
981         if(edl->local_session->out_point >= 0 && pixel >= 0 && pixel <= mwindow->theme->vtimebar_w)
982         {
983                 add_subwindow(out_point =
984                         new VWindowOutPoint(mwindow,
985                                 0,
986                                 this,
987                                 pixel,
988                                 edl->local_session->out_point));
989         }
990 }
991
992
993 void VWindowGUI::update_labels()
994 {
995         EDL *edl = vwindow->get_edl();
996         int output = 0;
997
998         for(Label *current = edl->labels->first;
999                 current;
1000                 current = NEXT)
1001         {
1002                 long pixel = (long)((current->position - edl->local_session->view_start) / edl->local_session->zoom_sample);
1003
1004                 if(pixel >= 0 && pixel < mwindow->theme->vtimebar_w)
1005                 {
1006 // Create new label
1007                         if(output >= labels.total)
1008                         {
1009                                 LabelGUI *new_label;
1010                                 add_subwindow(new_label = new LabelGUI(mwindow, this, pixel, 0, current->position));
1011                                 labels.append(new_label);
1012                         }
1013                         else
1014 // Reposition old label
1015                         if(labels.values[output]->pixel != pixel)
1016                         {
1017                                 labels.values[output]->pixel = pixel;
1018                                 labels.values[output]->position = current->position;
1019                                 labels.values[output]->reposition();
1020                         }
1021
1022                         if(mwindow->edl->local_session->get_selectionstart(1) <= current->position &&
1023                                 mwindow->edl->local_session->get_selectionend(1) >= current->position)
1024                                 labels.values[output]->update(1);
1025                         else
1026                         if(labels.values[output]->get_value())
1027                                 labels.values[output]->update(0);
1028                         output++;
1029                 }
1030         }
1031
1032 // Delete excess labels
1033         while(labels.total > output)
1034         {
1035                 labels.remove_object();
1036         }
1037 }
1038
1039
1040
1041 VWindowInPoint::VWindowInPoint(MWindow *mwindow,
1042                 TimeBar *timebar,
1043                 VWindowGUI *gui,
1044                 long pixel,
1045                 double position)
1046  : InPointGUI(mwindow,
1047                 timebar,
1048                 pixel,
1049                 position)
1050 {
1051         this->gui = gui;
1052 }
1053
1054 int VWindowInPoint::handle_event()
1055 {
1056         EDL *edl = gui->vwindow->get_edl();
1057
1058         if(edl)
1059         {
1060                 double position = edl->align_to_frame(this->position, 0);
1061
1062                 edl->local_session->set_selectionstart(position);
1063                 edl->local_session->set_selectionend(position);
1064                 gui->timebar->update(1);
1065
1066 // Que the VWindow
1067                 mwindow->vwindow->update_position(CHANGE_NONE, 0, 1, 0);
1068         }
1069         return 1;
1070 }
1071
1072
1073
1074 VWindowOutPoint::VWindowOutPoint(MWindow *mwindow,
1075                 TimeBar *timebar,
1076                 VWindowGUI *gui,
1077                 long pixel,
1078                 double position)
1079  : OutPointGUI(mwindow,
1080                 timebar,
1081                 pixel,
1082                 position)
1083 {
1084         this->gui = gui;
1085 }
1086
1087 int VWindowOutPoint::handle_event()
1088 {
1089         EDL *edl = gui->vwindow->get_edl();
1090
1091         if(edl)
1092         {
1093                 double position = edl->align_to_frame(this->position, 0);
1094
1095                 edl->local_session->set_selectionstart(position);
1096                 edl->local_session->set_selectionend(position);
1097                 gui->timebar->update(1);
1098
1099 // Que the VWindow
1100                 mwindow->vwindow->update_position(CHANGE_NONE, 0, 1, 0);
1101         }
1102
1103         return 1;
1104 }
1105
1106
1107
1108 #endif
1109