Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / zwindowgui.C
index bada1625e68e7fff709ccd62edaa0ead71857325..94b52e1c802e642f119af86bd19a0b60a1abe199 100644 (file)
@@ -39,7 +39,7 @@
 
 ZWindowGUI::ZWindowGUI(MWindow *mwindow, ZWindow *zwindow, Mixer *mixer)
  : BC_Window(zwindow->title, mixer->x, mixer->y, mixer->w, mixer->h,
-       100, 75, 1, 1, 0)
+       xS(100), yS(75), 1, 1, 0)
 {
        this->mwindow = mwindow;
        this->zwindow = zwindow;
@@ -47,6 +47,9 @@ ZWindowGUI::ZWindowGUI(MWindow *mwindow, ZWindow *zwindow, Mixer *mixer)
        canvas = 0;
        playback_engine = 0;
        highlighted = 0;
+       playable = zwindow->playable;
+// *** CONTEXT_HELP ***
+       context_help_set_keyword("Multi-Camera");
 }
 
 ZWindowGUI::~ZWindowGUI()
@@ -59,7 +62,8 @@ void ZWindowGUI::create_objects()
 {
        lock_window("ZWindowGUI::create_objects");
 
-       canvas = new ZWindowCanvas(mwindow, this, 10,10, get_w()-20,get_h()-20);
+       canvas = new ZWindowCanvas(mwindow, this,
+                       xS(10),yS(10), get_w()-xS(20),get_h()-yS(20));
        canvas->create_objects(mwindow->edl);
        playback_engine = new PlaybackEngine(mwindow, canvas);
        playback_engine->create_objects();
@@ -71,7 +75,8 @@ void ZWindowGUI::create_objects()
 
 int ZWindowGUI::resize_event(int w, int h)
 {
-       canvas->reposition_window(0, 10,10, w-20,h-20);
+       canvas->reposition_window(0,
+                       xS(10),yS(10), w-xS(20),h-yS(20));
        zwindow->reposition(get_x(), get_y(), w, h);
        BC_WindowBase::resize_event(w, h);
        return 1;
@@ -83,7 +88,7 @@ int ZWindowGUI::translation_event()
 
 int ZWindowGUI::close_event()
 {
-       set_done(0);
+       set_done(1);
        return 1;
 }
 
@@ -94,26 +99,26 @@ int ZWindowGUI::keypress_event()
                close_event();
                return 1;
        }
-       unlock_window();
        int result = 1;
        switch( key ) {
-       case 'f':
-               if( mwindow->session->zwindow_fullscreen )
-                       canvas->stop_fullscreen();
-               else
-                       canvas->start_fullscreen();
-               break;
+       case 'f': {
+               int on = canvas->get_fullscreen() ? 0 : 1;
+               canvas->set_fullscreen(on, 1);
+               break; }
        case ESC:
-               if( mwindow->session->zwindow_fullscreen )
-                       canvas->stop_fullscreen();
+               canvas->set_fullscreen(0, 1);
                break;
        default:
+               unlock_window();
                mwindow->gui->lock_window("ZWindowGUI::keypress_event");
                result = mwindow->gui->mbuttons->transport->do_keypress(key);
                mwindow->gui->unlock_window();
+               lock_window("ZWindowGUI::keypress_event 1");
        }
 
-       lock_window("ZWindowGUI::keypress_event 1");
+       if( !result )
+               result = context_help_check_and_show();
+
        return result;
 }
 
@@ -130,7 +135,7 @@ int ZWindowGUI::button_press_event()
                        start = mwindow->edl->tracks->total_recordable_length();
                        if( start < 0 ) start = end;
                }
-               if( (end-start) > 1e-4 ) {
+               if( (end-start) > 1e-4 && zwindow->edl ) {
                        LocalSession *zlocal_session = zwindow->edl->local_session;
                        zlocal_session->set_selectionstart(end);
                        zlocal_session->set_selectionend(end);
@@ -184,14 +189,64 @@ int ZWindowGUI::draw_overlays()
 {
        BC_WindowBase *cvs = canvas->get_canvas();
        if( !cvs || cvs->get_video_on() ) return 0;
-       if( highlighted != zwindow->highlighted ) {
-               highlighted = zwindow->highlighted;
-               cvs->set_color(WHITE);
-               cvs->set_inverse();
-               cvs->draw_rectangle(0, 0, cvs->get_w(), cvs->get_h());
-               cvs->draw_rectangle(1, 1, cvs->get_w() - 2, cvs->get_h() - 2);
-               cvs->set_opaque();
-       }
+       set_highlighted(zwindow->highlighted);
+       if( !playable ) set_playable(-1);
+       return 1;
+}
+
+void ZWindowGUI::set_highlighted(int v)
+{
+       if( highlighted == v ) return;
+       highlighted = v;
+       BC_WindowBase *cvs = canvas->get_canvas();
+       cvs->set_color(WHITE);
+       cvs->set_inverse();
+       cvs->draw_rectangle(0, 0, cvs->get_w(), cvs->get_h());
+       cvs->draw_rectangle(1, 1, cvs->get_w() - 2, cvs->get_h() - 2);
+       cvs->set_opaque();
+}
+
+void ZWindowGUI::set_playable(int v)
+{
+       if( playable == v ) return;
+       playable = v>0 ? 1 : 0;
+       zwindow->playable = playable;
+       BC_WindowBase *cvs = canvas->get_canvas();
+       cvs->set_color(WHITE);
+       cvs->set_inverse();
+       int dx = cvs->get_w()/16+1, dy = cvs->get_h()/16+1;
+       int x = xS(5), y = yS(5), lw = (dx + dy)/16+1;
+       cvs->set_line_width(lw);
+       cvs->draw_line(x, y, x+dx, y+dy);
+       cvs->draw_line(x, y+dy, x+dx, y);
+       cvs->set_opaque();
+       cvs->set_line_width(1);
+}
+
+
+ZWindowCanvasTileMixers::ZWindowCanvasTileMixers(ZWindowCanvas *canvas)
+ : BC_MenuItem(_("Tile Mixers"))
+{
+       this->canvas = canvas;
+}
+int ZWindowCanvasTileMixers::handle_event()
+{
+       canvas->mwindow->tile_mixers();
+       return 1;
+}
+
+ZWindowCanvasPlayable::ZWindowCanvasPlayable(ZWindowCanvas *canvas)
+ : BC_MenuItem(_("Playable"))
+{
+       this->canvas = canvas;
+       set_checked(canvas->gui->zwindow->playable);
+}
+int ZWindowCanvasPlayable::handle_event()
+{
+       int v = !get_checked() ? 1 : 0;
+       set_checked(v);
+       canvas->gui->set_playable(v);
+       canvas->get_canvas()->flash(1);
        return 1;
 }
 
@@ -203,6 +258,13 @@ ZWindowCanvas::ZWindowCanvas(MWindow *mwindow, ZWindowGUI *gui,
        this->gui = gui;
 }
 
+void ZWindowCanvas::create_objects(EDL *edl)
+{
+       Canvas::create_objects(edl);
+       canvas_menu->add_item(new ZWindowCanvasTileMixers(this));
+       canvas_menu->add_item(new ZWindowCanvasPlayable(this));
+}
+
 void ZWindowCanvas::close_source()
 {
        gui->unlock_window();
@@ -215,7 +277,6 @@ void ZWindowCanvas::close_source()
        }
 }
 
-
 void ZWindowCanvas::draw_refresh(int flush)
 {
        EDL *edl = gui->zwindow->edl;
@@ -241,18 +302,52 @@ void ZWindowCanvas::draw_refresh(int flush)
        
        if( gui->draw_overlays() )
                dirty = 1;
-
        if( dirty )
                cvs->flash(flush);
 }
 
-int ZWindowCanvas::get_fullscreen()
+float ZWindowCanvas::get_auto_zoom()
 {
-       return mwindow->session->zwindow_fullscreen;
+       EDL *edl = gui->zwindow->edl;
+       if( !edl ) edl = mwindow->edl;
+       float conformed_w, conformed_h;
+       edl->calculate_conformed_dimensions(0, conformed_w, conformed_h);
+       BC_WindowBase *window = get_canvas();
+       int cw = window ? window->get_w() : w;
+       int ch = window ? window->get_h() : h;
+       float zoom_x = cw / conformed_w;
+       float zoom_y = ch / conformed_h;
+       return zoom_x < zoom_y ? zoom_x : zoom_y;
 }
 
-void ZWindowCanvas::set_fullscreen(int value)
+float ZWindowCanvas::get_zoom()
 {
-       mwindow->session->zwindow_fullscreen = value;
+        return gui->zwindow->zoom;
+}
+void ZWindowCanvas::update_zoom(int x, int y, float zoom)
+{
+        gui->zwindow->zoom = zoom;
+}
+
+void ZWindowCanvas::zoom_auto()
+{
+       EDL *edl = gui->zwindow->edl;
+       if( !edl ) edl = mwindow->edl;
+        set_zoom(edl, 0);
+}
+
+void ZWindowCanvas::zoom_resize_window(float zoom)
+{
+       if( !zoom ) zoom = get_auto_zoom();
+       EDL *edl = gui->zwindow->edl;
+       if( !edl ) edl = mwindow->edl;
+       int ow = edl->session->output_w, oh = edl->session->output_h;
+       int canvas_w, canvas_h;
+       calculate_sizes(mwindow->edl->get_aspect_ratio(), ow, oh,
+               zoom, canvas_w, canvas_h);
+       int new_w = canvas_w + xS(20);
+       int new_h = canvas_h + yS(20);
+       gui->resize_window(new_w, new_h);
+       gui->resize_event(new_w, new_h);
 }