tweak zoom/fullscr to remember cwdw scale after fullscr
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / vwindowgui.C
index 44a9948c28c755c1c3a74b93a0495a0c02f5c57b..7c1d51e0a0df80a702a4fd34d5cc526055f4eed1 100644 (file)
@@ -31,6 +31,7 @@
 #include "edl.h"
 #include "edlsession.h"
 #include "filesystem.h"
+#include "file.h"
 #include "filexml.h"
 #include "fonts.h"
 #include "keys.h"
@@ -67,11 +68,7 @@ VWindowGUI::VWindowGUI(MWindow *mwindow, VWindow *vwindow)
        mwindow->session->vwindow_y,
        mwindow->session->vwindow_w,
        mwindow->session->vwindow_h,
-       100,
-       100,
-       1,
-       1,
-       0) // Hide it
+       xS(100), yS(100), 1, 1, 0) // Hide it
 {
        this->mwindow = mwindow;
        this->vwindow = vwindow;
@@ -86,7 +83,7 @@ VWindowGUI::VWindowGUI(MWindow *mwindow, VWindow *vwindow)
 
 VWindowGUI::~VWindowGUI()
 {
-       vwindow->playback_engine->interrupt_playback(1);
+       vwindow->stop_playback(1);
        sources.remove_all_objects();
        labels.remove_all_objects();
        delete canvas;
@@ -135,7 +132,7 @@ void VWindowGUI::draw_wave()
        delete cache;
        delete canvas->refresh_frame;
        canvas->refresh_frame = vframe;
-       canvas->draw_refresh(1);
+       canvas->refresh(1);
 }
 
 void VWindowGUI::change_source(EDL *edl, const char *title)
@@ -241,8 +238,18 @@ void VWindowGUI::create_objects()
        canvas = new VWindowCanvas(mwindow, this);
        canvas->create_objects(mwindow->edl);
        canvas->use_vwindow();
-
-
+       char vsplash_path[BCTEXTLEN];
+       int vsplash_len = sizeof(vsplash_path)-1;
+       snprintf(vsplash_path, vsplash_len, "%s/vsplash.png", File::get_cindat_path());
+       VFrame *vsplash = VFramePng::vframe_png(vsplash_path);
+       if( vsplash ) {
+               BC_WindowBase *vcanvas = canvas->get_canvas();
+               vcanvas->draw_vframe(vsplash,
+                       0,0, vcanvas->get_w(), vcanvas->get_h(),
+                       0,0, vsplash->get_w(), vsplash->get_h(), 0);
+               vcanvas->flash(1);
+               delete vsplash;
+       }
 //printf("VWindowGUI::create_objects 1\n");
        add_subwindow(timebar = new VTimeBar(mwindow,
                this,
@@ -357,18 +364,10 @@ int VWindowGUI::keypress_event()
                mwindow->redo_entry(this);
                break;
        case 'f':
-               unlock_window();
-               if( canvas->get_fullscreen() )
-                       canvas->stop_fullscreen();
-               else
-                       canvas->start_fullscreen();
-               lock_window("VWindowGUI::keypress_event 1");
+               canvas->set_fullscreen(canvas->get_fullscreen() ? 0 : 1);
                break;
        case ESC:
-               unlock_window();
-               if( canvas->get_fullscreen() )
-                       canvas->stop_fullscreen();
-               lock_window("VWindowGUI::keypress_event 2");
+               canvas->set_fullscreen(0);
                break;
        case KEY_F1:
        case KEY_F2:
@@ -457,7 +456,7 @@ void VWindowGUI::drag_motion()
        int need_highlight = cursor_above() && get_cursor_over_window() ? 1 : 0;
        if( highlighted == need_highlight ) return;
        highlighted = need_highlight;
-       canvas->draw_refresh();
+       canvas->refresh(1);
 }
 
 int VWindowGUI::drag_stop()
@@ -467,7 +466,7 @@ int VWindowGUI::drag_stop()
        if( highlighted &&
            mwindow->session->current_operation == DRAG_ASSET ) {
                highlighted = 0;
-               canvas->draw_refresh();
+               canvas->refresh(1);
                unlock_window();
 
                Indexable *indexable =
@@ -701,17 +700,13 @@ void VWindowEditing::panel_fit_selection() {}
 void VWindowEditing::panel_fit_autos(int all) {}
 void VWindowEditing::panel_set_editing_mode(int mode) {}
 void VWindowEditing::panel_set_auto_keyframes(int v) {}
+void VWindowEditing::panel_set_span_keyframes(int v) {}
 void VWindowEditing::panel_set_labels_follow_edits(int v) {}
 
 
 VWindowSource::VWindowSource(MWindow *mwindow, VWindowGUI *vwindow, int x, int y)
- : BC_PopupTextBox(vwindow,
-       &vwindow->sources,
-       "",
-       x,
-       y,
-       200,
-       200)
+ : BC_PopupTextBox(vwindow, &vwindow->sources, "",
+       x, y, xS(200), yS(200))
 {
        this->mwindow = mwindow;
        this->vwindow = vwindow;
@@ -812,6 +807,13 @@ void VWindowCanvas::zoom_resize_window(float percentage)
        gui->resize_event(new_w, new_h);
 }
 
+void VWindowCanvas::zoom_auto()
+{
+       EDL *edl = gui->vwindow->get_edl();
+       if(!edl) edl = mwindow->edl;
+       set_zoom(edl, 0);
+}
+
 void VWindowCanvas::close_source()
 {
        gui->vwindow->interrupt_playback(1);
@@ -823,37 +825,31 @@ void VWindowCanvas::draw_refresh(int flush)
 {
        EDL *edl = gui->vwindow->get_edl();
 
-       if(!get_canvas()->get_video_on()) get_canvas()->clear_box(0, 0, get_canvas()->get_w(), get_canvas()->get_h());
-       if(!get_canvas()->get_video_on() && refresh_frame && edl)
-       {
-               float in_x1, in_y1, in_x2, in_y2;
-               float out_x1, out_y1, out_x2, out_y2;
-               get_transfers(edl,
-                       in_x1, in_y1, in_x2, in_y2,
-                       out_x1, out_y1, out_x2, out_y2);
+       if( !get_canvas()->get_video_on() ) {
+               int cw = get_canvas()->get_w(), ch = get_canvas()->get_h();
+               get_canvas()->clear_box(0, 0, cw, ch);
+               int ow = edl ? get_output_w(edl) : 0;
+               int oh = edl ? get_output_h(edl) : 0;
+               if( ow > 0 && oh > 0 && refresh_frame ) {
+                       float in_x1, in_y1, in_x2, in_y2;
+                       float out_x1, out_y1, out_x2, out_y2;
+                       get_transfers(edl,
+                               in_x1, in_y1, in_x2, in_y2,
+                               out_x1, out_y1, out_x2, out_y2);
 // input scaled from session to refresh frame coordinates
-               int ow = get_output_w(edl);
-               int oh = get_output_h(edl);
-               int rw = refresh_frame->get_w();
-               int rh = refresh_frame->get_h();
-               float xs = (float)rw / ow;
-               float ys = (float)rh / oh;
-               in_x1 *= xs;  in_x2 *= xs;
-               in_y1 *= ys;  in_y2 *= ys;
-               get_canvas()->draw_vframe(refresh_frame,
-                               (int)out_x1,
-                               (int)out_y1,
-                               (int)(out_x2 - out_x1),
-                               (int)(out_y2 - out_y1),
-                               (int)in_x1,
-                               (int)in_y1,
-                               (int)(in_x2 - in_x1),
-                               (int)(in_y2 - in_y1),
+                       int rw = refresh_frame->get_w();
+                       int rh = refresh_frame->get_h();
+                       float xs = (float)rw / ow;
+                       float ys = (float)rh / oh;
+                       in_x1 *= xs;  in_x2 *= xs;
+                       in_y1 *= ys;  in_y2 *= ys;
+                       get_canvas()->draw_vframe(refresh_frame,
+                               (int)out_x1, (int)out_y1,
+                               (int)(out_x2 - out_x1), (int)(out_y2 - out_y1),
+                               (int)in_x1, (int)in_y1,
+                               (int)(in_x2 - in_x1), (int)(in_y2 - in_y1),
                                0);
-       }
-
-       if(!get_canvas()->get_video_on())
-       {
+               }
                draw_overlays();
                get_canvas()->flash(flush);
        }