undo fixes, viewer change_source rework, cleanup
[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                 unlock_window();
428
429                 Indexable *indexable = mwindow->session->drag_assets->size() ?
430                         mwindow->session->drag_assets->get(0) :
431                         0;
432                 EDL *edl = mwindow->session->drag_clips->size() ?
433                         mwindow->session->drag_clips->get(0) :
434                         0;
435                 if(indexable)
436                         vwindow->change_source(indexable);
437                 else
438                 if(edl)
439                         vwindow->change_source(edl);
440                 lock_window("VWindowGUI::drag_stop");
441                 return 1;
442         }
443
444         return 0;
445 }
446
447
448 void VWindowGUI::update_meters()
449 {
450         if(mwindow->edl->session->vwindow_meter != meters->visible)
451         {
452                 meters->set_meters(meters->meter_count,
453                         mwindow->edl->session->vwindow_meter);
454                 mwindow->theme->get_vwindow_sizes(this);
455                 resize_event(get_w(), get_h());
456         }
457 }
458
459
460
461 VWindowMeters::VWindowMeters(MWindow *mwindow,
462         VWindowGUI *gui,
463         int x,
464         int y,
465         int h)
466  : MeterPanel(mwindow,
467                 gui,
468                 x,
469                 y,
470                 -1,
471                 h,
472                 mwindow->edl->session->audio_channels,
473                 mwindow->edl->session->vwindow_meter,
474                 0,
475                 0)
476 {
477         this->mwindow = mwindow;
478         this->gui = gui;
479 }
480
481 VWindowMeters::~VWindowMeters()
482 {
483 }
484
485 int VWindowMeters::change_status_event(int new_status)
486 {
487         mwindow->edl->session->vwindow_meter = new_status;
488         gui->update_meters();
489         return 1;
490 }
491
492
493
494
495
496
497
498 VWindowEditing::VWindowEditing(MWindow *mwindow, VWindow *vwindow)
499  : EditPanel(mwindow,
500                 vwindow->gui,
501                 mwindow->theme->vedit_x,
502                 mwindow->theme->vedit_y,
503                 EDITING_ARROW,
504                 0,
505                 0,
506                 1,
507                 1,
508                 0,
509                 0,
510                 1,
511                 0,
512                 0,
513                 0,
514                 0, // locklabels
515                 1,
516                 1,
517                 1,
518                 0,
519                 0,
520                 0)
521 {
522         this->mwindow = mwindow;
523         this->vwindow = vwindow;
524 }
525
526 VWindowEditing::~VWindowEditing()
527 {
528 }
529
530 void VWindowEditing::copy_selection()
531 {
532         vwindow->copy();
533 }
534
535 void VWindowEditing::splice_selection()
536 {
537         if(vwindow->get_edl())
538         {
539                 mwindow->gui->lock_window("VWindowEditing::splice_selection");
540                 mwindow->splice(vwindow->get_edl());
541                 mwindow->gui->unlock_window();
542         }
543 }
544
545 void VWindowEditing::overwrite_selection()
546 {
547         if(vwindow->get_edl())
548         {
549                 mwindow->gui->lock_window("VWindowEditing::overwrite_selection");
550                 mwindow->overwrite(vwindow->get_edl());
551                 mwindow->gui->unlock_window();
552         }
553 }
554
555 void VWindowEditing::toggle_label()
556 {
557         if(vwindow->get_edl())
558         {
559                 EDL *edl = vwindow->get_edl();
560                 edl->labels->toggle_label(edl->local_session->get_selectionstart(1),
561                         edl->local_session->get_selectionend(1));
562                 vwindow->gui->timebar->update(1);
563         }
564 }
565
566 void VWindowEditing::prev_label()
567 {
568         if(vwindow->get_edl())
569         {
570                 EDL *edl = vwindow->get_edl();
571                 vwindow->gui->unlock_window();
572                 vwindow->playback_engine->interrupt_playback(1);
573                 vwindow->gui->lock_window("VWindowEditing::prev_label");
574
575                 Label *current = edl->labels->prev_label(
576                         edl->local_session->get_selectionstart(1));
577
578
579                 if(!current)
580                 {
581                         edl->local_session->set_selectionstart(0);
582                         edl->local_session->set_selectionend(0);
583                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
584                         vwindow->gui->timebar->update(1);
585                 }
586                 else
587                 {
588                         edl->local_session->set_selectionstart(current->position);
589                         edl->local_session->set_selectionend(current->position);
590                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
591                         vwindow->gui->timebar->update(1);
592                 }
593         }
594 }
595
596 void VWindowEditing::next_label()
597 {
598         if(vwindow->get_edl())
599         {
600                 EDL *edl = vwindow->get_edl();
601                 Label *current = edl->labels->next_label(
602                         edl->local_session->get_selectionstart(1));
603                 if(!current)
604                 {
605                         vwindow->gui->unlock_window();
606                         vwindow->playback_engine->interrupt_playback(1);
607                         vwindow->gui->lock_window("VWindowEditing::next_label 1");
608
609                         double position = edl->tracks->total_length();
610                         edl->local_session->set_selectionstart(position);
611                         edl->local_session->set_selectionend(position);
612                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
613                         vwindow->gui->timebar->update(1);
614                 }
615                 else
616                 {
617                         vwindow->gui->unlock_window();
618                         vwindow->playback_engine->interrupt_playback(1);
619                         vwindow->gui->lock_window("VWindowEditing::next_label 2");
620
621                         edl->local_session->set_selectionstart(current->position);
622                         edl->local_session->set_selectionend(current->position);
623                         vwindow->update_position(CHANGE_NONE, 0, 1, 0);
624                         vwindow->gui->timebar->update(1);
625                 }
626         }
627 }
628
629 double VWindowEditing::get_position()
630 {
631         EDL *edl = vwindow->get_edl();
632         double position = !edl ? 0 : edl->local_session->get_selectionstart(1);
633         return position;
634 }
635
636 void VWindowEditing::set_position(double position)
637 {
638         EDL *edl = vwindow->get_edl();
639         if( !edl ) return;
640         if( get_position() != position ) {
641                 if( position < 0 ) position = 0;
642                 edl->local_session->set_selectionstart(position);
643                 edl->local_session->set_selectionend(position);
644                 vwindow->update_position(CHANGE_NONE, 0, 1);
645         }
646 }
647
648 void VWindowEditing::set_inpoint()
649 {
650         vwindow->set_inpoint();
651 }
652
653 void VWindowEditing::set_outpoint()
654 {
655         vwindow->set_outpoint();
656 }
657
658 void VWindowEditing::unset_inoutpoint()
659 {
660         vwindow->unset_inoutpoint();
661 }
662
663
664 void VWindowEditing::to_clip()
665 {
666         EDL *edl = vwindow->get_edl();
667         if( !edl ) return;
668         mwindow->to_clip(edl, _("viewer window: "));
669 }
670
671 VWindowSource::VWindowSource(MWindow *mwindow, VWindowGUI *vwindow, int x, int y)
672  : BC_PopupTextBox(vwindow,
673         &vwindow->sources,
674         "",
675         x,
676         y,
677         200,
678         200)
679 {
680         this->mwindow = mwindow;
681         this->vwindow = vwindow;
682 }
683
684 VWindowSource::~VWindowSource()
685 {
686 }
687
688 int VWindowSource::handle_event()
689 {
690         return 1;
691 }
692
693
694 VWindowTransport::VWindowTransport(MWindow *mwindow,
695         VWindowGUI *gui,
696         int x,
697         int y)
698  : PlayTransport(mwindow,
699         gui,
700         x,
701         y)
702 {
703         this->gui = gui;
704 }
705
706 EDL* VWindowTransport::get_edl()
707 {
708         return gui->vwindow->get_edl();
709 }
710
711
712 void VWindowTransport::goto_start()
713 {
714         gui->unlock_window();
715         handle_transport(REWIND, 1);
716         gui->lock_window("VWindowTransport::goto_start");
717         gui->vwindow->goto_start();
718 }
719
720 void VWindowTransport::goto_end()
721 {
722         gui->unlock_window();
723         handle_transport(GOTO_END, 1);
724         gui->lock_window("VWindowTransport::goto_end");
725         gui->vwindow->goto_end();
726 }
727
728
729
730
731 VWindowCanvas::VWindowCanvas(MWindow *mwindow, VWindowGUI *gui)
732  : Canvas(mwindow,
733         gui,
734         mwindow->theme->vcanvas_x,
735         mwindow->theme->vcanvas_y,
736         mwindow->theme->vcanvas_w,
737         mwindow->theme->vcanvas_h,
738         0, 0, 0)
739 {
740 //printf("VWindowCanvas::VWindowCanvas %d %d\n", __LINE__, mwindow->theme->vcanvas_x);
741         this->mwindow = mwindow;
742         this->gui = gui;
743 }
744
745 void VWindowCanvas::zoom_resize_window(float percentage)
746 {
747         EDL *edl = gui->vwindow->get_edl();
748         if(!edl) edl = mwindow->edl;
749
750         int canvas_w, canvas_h;
751         int new_w, new_h;
752
753 // Get required canvas size
754         calculate_sizes(edl->get_aspect_ratio(),
755                 edl->session->output_w,
756                 edl->session->output_h,
757                 percentage,
758                 canvas_w,
759                 canvas_h);
760
761 // Estimate window size from current borders
762         new_w = canvas_w + (gui->get_w() - mwindow->theme->vcanvas_w);
763         new_h = canvas_h + (gui->get_h() - mwindow->theme->vcanvas_h);
764
765         mwindow->session->vwindow_w = new_w;
766         mwindow->session->vwindow_h = new_h;
767
768         mwindow->theme->get_vwindow_sizes(gui);
769
770 // Estimate again from new borders
771         new_w = canvas_w + (mwindow->session->vwindow_w - mwindow->theme->vcanvas_w);
772         new_h = canvas_h + (mwindow->session->vwindow_h - mwindow->theme->vcanvas_h);
773
774
775         gui->resize_window(new_w, new_h);
776         gui->resize_event(new_w, new_h);
777 }
778
779 void VWindowCanvas::close_source()
780 {
781         gui->unlock_window();
782         gui->vwindow->playback_engine->interrupt_playback(1);
783         gui->lock_window("VWindowCanvas::close_source");
784         gui->vwindow->delete_source(1, 1);
785 }
786
787
788 void VWindowCanvas::draw_refresh(int flush)
789 {
790         EDL *edl = gui->vwindow->get_edl();
791
792         if(!get_canvas()->get_video_on()) get_canvas()->clear_box(0, 0, get_canvas()->get_w(), get_canvas()->get_h());
793         if(!get_canvas()->get_video_on() && refresh_frame && edl)
794         {
795                 float in_x1, in_y1, in_x2, in_y2;
796                 float out_x1, out_y1, out_x2, out_y2;
797                 get_transfers(edl,
798                         in_x1,
799                         in_y1,
800                         in_x2,
801                         in_y2,
802                         out_x1,
803                         out_y1,
804                         out_x2,
805                         out_y2);
806                 get_canvas()->draw_vframe(refresh_frame,
807                                 (int)out_x1,
808                                 (int)out_y1,
809                                 (int)(out_x2 - out_x1),
810                                 (int)(out_y2 - out_y1),
811                                 (int)in_x1,
812                                 (int)in_y1,
813                                 (int)(in_x2 - in_x1),
814                                 (int)(in_y2 - in_y1),
815                                 0);
816         }
817
818         if(!get_canvas()->get_video_on())
819         {
820                 draw_overlays();
821                 get_canvas()->flash(flush);
822         }
823 }
824
825 void VWindowCanvas::draw_overlays()
826 {
827         if( gui->highlighted )
828         {
829                 get_canvas()->set_color(WHITE);
830                 get_canvas()->set_inverse();
831                 get_canvas()->draw_rectangle(0, 0, get_canvas()->get_w(), get_canvas()->get_h());
832                 get_canvas()->draw_rectangle(1, 1, get_canvas()->get_w() - 2, get_canvas()->get_h() - 2);
833                 get_canvas()->set_opaque();
834         }
835 }
836
837 int VWindowCanvas::get_fullscreen()
838 {
839         return mwindow->session->vwindow_fullscreen;
840 }
841
842 void VWindowCanvas::set_fullscreen(int value)
843 {
844         mwindow->session->vwindow_fullscreen = value;
845 }
846
847
848
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 #if 0
884 void VWindowGUI::update_points()
885 {
886         EDL *edl = vwindow->get_edl();
887
888 //printf("VWindowGUI::update_points 1\n");
889         if(!edl) return;
890
891 //printf("VWindowGUI::update_points 2\n");
892         long pixel = (long)((double)edl->local_session->in_point /
893                 edl->tracks->total_length() *
894                 (mwindow->theme->vtimebar_w -
895                         2 *
896                         mwindow->theme->in_point[0]->get_w())) +
897                 mwindow->theme->in_point[0]->get_w();
898
899 //printf("VWindowGUI::update_points 3 %d\n", edl->local_session->in_point);
900         if(in_point)
901         {
902 //printf("VWindowGUI::update_points 3.1\n");
903                 if(edl->local_session->in_point >= 0)
904                 {
905 //printf("VWindowGUI::update_points 4\n");
906                         if(edl->local_session->in_point != in_point->position ||
907                                 in_point->pixel != pixel)
908                         {
909                                 in_point->pixel = pixel;
910                                 in_point->reposition();
911                         }
912
913 //printf("VWindowGUI::update_points 5\n");
914                         in_point->position = edl->local_session->in_point;
915
916 //printf("VWindowGUI::update_points 6\n");
917                         if(edl->equivalent(in_point->position, edl->local_session->get_selectionstart(1)) ||
918                                 edl->equivalent(in_point->position, edl->local_session->get_selectionend(1)))
919                                 in_point->update(1);
920                         else
921                                 in_point->update(0);
922 //printf("VWindowGUI::update_points 7\n");
923                 }
924                 else
925                 {
926                         delete in_point;
927                         in_point = 0;
928                 }
929         }
930         else
931         if(edl->local_session->in_point >= 0)
932         {
933 //printf("VWindowGUI::update_points 8 %p\n", mwindow->theme->in_point);
934                 add_subwindow(in_point =
935                         new VWindowInPoint(mwindow,
936                                 0,
937                                 this,
938                                 pixel,
939                                 edl->local_session->in_point));
940 //printf("VWindowGUI::update_points 9\n");
941         }
942 //printf("VWindowGUI::update_points 10\n");
943
944         pixel = (long)((double)edl->local_session->out_point /
945                 (edl->tracks->total_length() + 0.5) *
946                 (mwindow->theme->vtimebar_w -
947                         2 *
948                         mwindow->theme->in_point[0]->get_w())) +
949                 mwindow->theme->in_point[0]->get_w() *
950                 2;
951
952         if(out_point)
953         {
954                 if(edl->local_session->out_point >= 0 && pixel >= 0 && pixel <= mwindow->theme->vtimebar_w)
955                 {
956                         if(edl->local_session->out_point != out_point->position ||
957                                 out_point->pixel != pixel)
958                         {
959                                 out_point->pixel = pixel;
960                                 out_point->reposition();
961                         }
962                         out_point->position = edl->local_session->out_point;
963
964                         if(edl->equivalent(out_point->position, edl->local_session->get_selectionstart(1)) ||
965                                 edl->equivalent(out_point->position, edl->local_session->get_selectionend(1)))
966                                 out_point->update(1);
967                         else
968                                 out_point->update(0);
969                 }
970                 else
971                 {
972                         delete out_point;
973                         out_point = 0;
974                 }
975         }
976         else
977         if(edl->local_session->out_point >= 0 && pixel >= 0 && pixel <= mwindow->theme->vtimebar_w)
978         {
979                 add_subwindow(out_point =
980                         new VWindowOutPoint(mwindow,
981                                 0,
982                                 this,
983                                 pixel,
984                                 edl->local_session->out_point));
985         }
986 }
987
988
989 void VWindowGUI::update_labels()
990 {
991         EDL *edl = vwindow->get_edl();
992         int output = 0;
993
994         for(Label *current = edl->labels->first;
995                 current;
996                 current = NEXT)
997         {
998                 long pixel = (long)((current->position - edl->local_session->view_start) / edl->local_session->zoom_sample);
999
1000                 if(pixel >= 0 && pixel < mwindow->theme->vtimebar_w)
1001                 {
1002 // Create new label
1003                         if(output >= labels.total)
1004                         {
1005                                 LabelGUI *new_label;
1006                                 add_subwindow(new_label = new LabelGUI(mwindow, this, pixel, 0, current->position));
1007                                 labels.append(new_label);
1008                         }
1009                         else
1010 // Reposition old label
1011                         if(labels.values[output]->pixel != pixel)
1012                         {
1013                                 labels.values[output]->pixel = pixel;
1014                                 labels.values[output]->position = current->position;
1015                                 labels.values[output]->reposition();
1016                         }
1017
1018                         if(mwindow->edl->local_session->get_selectionstart(1) <= current->position &&
1019                                 mwindow->edl->local_session->get_selectionend(1) >= current->position)
1020                                 labels.values[output]->update(1);
1021                         else
1022                         if(labels.values[output]->get_value())
1023                                 labels.values[output]->update(0);
1024                         output++;
1025                 }
1026         }
1027
1028 // Delete excess labels
1029         while(labels.total > output)
1030         {
1031                 labels.remove_object();
1032         }
1033 }
1034
1035
1036
1037 VWindowInPoint::VWindowInPoint(MWindow *mwindow,
1038                 TimeBar *timebar,
1039                 VWindowGUI *gui,
1040                 long pixel,
1041                 double position)
1042  : InPointGUI(mwindow,
1043                 timebar,
1044                 pixel,
1045                 position)
1046 {
1047         this->gui = gui;
1048 }
1049
1050 int VWindowInPoint::handle_event()
1051 {
1052         EDL *edl = gui->vwindow->get_edl();
1053
1054         if(edl)
1055         {
1056                 double position = edl->align_to_frame(this->position, 0);
1057
1058                 edl->local_session->set_selectionstart(position);
1059                 edl->local_session->set_selectionend(position);
1060                 gui->timebar->update(1);
1061
1062 // Que the VWindow
1063                 mwindow->vwindow->update_position(CHANGE_NONE, 0, 1, 0);
1064         }
1065         return 1;
1066 }
1067
1068
1069
1070 VWindowOutPoint::VWindowOutPoint(MWindow *mwindow,
1071                 TimeBar *timebar,
1072                 VWindowGUI *gui,
1073                 long pixel,
1074                 double position)
1075  : OutPointGUI(mwindow,
1076                 timebar,
1077                 pixel,
1078                 position)
1079 {
1080         this->gui = gui;
1081 }
1082
1083 int VWindowOutPoint::handle_event()
1084 {
1085         EDL *edl = gui->vwindow->get_edl();
1086
1087         if(edl)
1088         {
1089                 double position = edl->align_to_frame(this->position, 0);
1090
1091                 edl->local_session->set_selectionstart(position);
1092                 edl->local_session->set_selectionend(position);
1093                 gui->timebar->update(1);
1094
1095 // Que the VWindow
1096                 mwindow->vwindow->update_position(CHANGE_NONE, 0, 1, 0);
1097         }
1098
1099         return 1;
1100 }
1101
1102
1103
1104 #endif
1105