add view thumbnail size pref, rework vicon view popup, add view popup zoom scale
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / vicon.C
index f9978b26ebf0e917b1d7f6852a26b72dbf670c6d..296b3b08f7b4205974552e0ffaada438215fa74e 100644 (file)
@@ -45,20 +45,31 @@ draw_vframe(VIconThread *vt, BC_WindowBase *wdw, int x, int y)
 {
        VFrame *vfrm = frame();
        if( !vfrm ) return;
-       int sx0 = 0, sx1 = sx0 + vt->view_w;
-       int sy0 = 0, sy1 = sy0 + vt->view_h;
+       int sx0 = 0, sx1 = sx0 + vt->vw;
+       int sy0 = 0, sy1 = sy0 + vt->vh;
        int dx0 = x, dx1 = dx0 + vw;
        int dy0 = y, dy1 = dy0 + vh;
-       if( (x=vt->draw_x0-dx0) > 0 ) { sx0 += (x*vt->view_w)/vw;  dx0 = vt->draw_x0; }
-       if( (x=dx1-vt->draw_x1) > 0 ) { sx1 -= (x*vt->view_w)/vw;  dx1 = vt->draw_x1; }
-       if( (y=vt->draw_y0-dy0) > 0 ) { sy0 += (y*vt->view_h)/vh;  dy0 = vt->draw_y0; }
-       if( (y=dy1-vt->draw_y1) > 0 ) { sy1 -= (y*vt->view_h)/vh;  dy1 = vt->draw_y1; }
+       if( (x=vt->draw_x0-dx0) > 0 ) { sx0 += (x*vt->vw)/vw;  dx0 = vt->draw_x0; }
+       if( (x=dx1-vt->draw_x1) > 0 ) { sx1 -= (x*vt->vw)/vw;  dx1 = vt->draw_x1; }
+       if( (y=vt->draw_y0-dy0) > 0 ) { sy0 += (y*vt->vh)/vh;  dy0 = vt->draw_y0; }
+       if( (y=dy1-vt->draw_y1) > 0 ) { sy1 -= (y*vt->vh)/vh;  dy1 = vt->draw_y1; }
        int sw = sx1 - sx0, sh = sy1 - sy0;
        int dw = dx1 - dx0, dh = dy1 - dy0;
        if( dw > 0 && dh > 0 && sw > 0 && sh > 0 )
                wdw->draw_vframe(vfrm, dx0,dy0, dw,dh, sx0,sy0, sw,sh);
 }
 
+
+int VIconThread::cursor_inside(int x, int y)
+{
+       if( !viewing ) return 0;
+       int vx = viewing->get_vx();
+       if( x < vx || x >= vx+vw ) return 0;
+       int vy = viewing->get_vy();
+       if( y < vy || y >= vy+vh ) return 0;
+       return 1;
+}
+
 void VIconThread::
 set_drawing_area(int x0, int y0, int x1, int y1)
 {
@@ -91,15 +102,15 @@ void VIconThread::remove_vicon(int i)
 
 
 VIconThread::
-VIconThread(BC_WindowBase *wdw, int vw, int vh)
+VIconThread(BC_WindowBase *wdw, int vw, int vh, int view_w, int view_h)
  : Thread(1, 0, 0)
 {
        this->wdw = wdw;
-       this->view_win = 0;  this->vicon = 0;
-       this->view_w = vw;   this->view_h = vh;
-       this->viewing = 0;
-       this->draw_x0 = 0;   this->draw_x1 = wdw->get_w();
-       this->draw_y0 = 0;   this->draw_y1 = wdw->get_h();
+       this->vw = vw;         this->vh = vh;
+       this->view_w = view_w; this->view_h = view_h;
+       this->view_win = 0;    this->vicon = 0;    this->viewing = 0;
+       this->draw_x0 = 0;     this->draw_x1 = wdw->get_w();
+       this->draw_y0 = 0;     this->draw_y1 = wdw->get_h();
        draw_lock = new Condition(0, "VIconThread::draw_lock", 1);
        timer = new Timer();
        this->refresh_rate = VICON_RATE;
@@ -141,17 +152,26 @@ void VIconThread::
 stop_drawing()
 {
        wdw->lock_window("VIconThread::stop_drawing");
-       set_view_popup(0);
+       close_view_popup();
        if( !interrupted )
                interrupted = 1;
        stop_age = timer->get_difference();
        wdw->unlock_window();
 }
 
+void VIconThread::
+stop_viewing()
+{
+       if( viewing ) {
+               viewing->stop_audio();
+               viewing = 0;
+       }
+}
+
 int VIconThread::keypress_event(int key)
 {
        if( key != ESC ) return 0;
-       set_view_popup(0);
+       close_view_popup();
        return 1;
 }
 
@@ -172,6 +192,7 @@ int ViewPopup::keypress_event()
        return vt->keypress_event(key);
 }
 
+
 ViewPopup::ViewPopup(VIconThread *vt, VFrame *frame, int x, int y, int w, int h)
  : BC_Popup(vt->wdw, x, y, w, h, BLACK)
 {
@@ -183,12 +204,6 @@ ViewPopup::~ViewPopup()
        vt->wdw->set_active_subwindow(0);
 }
 
-void ViewPopup::draw_vframe(VFrame *frame)
-{
-       if( !frame ) return;
-       BC_WindowBase::draw_vframe(frame, 0,0, get_w(),get_h());
-}
-
 ViewPopup *VIconThread::new_view_window(VFrame *frame)
 {
        BC_WindowBase *parent = wdw->get_parent();
@@ -205,6 +220,17 @@ ViewPopup *VIconThread::new_view_window(VFrame *frame)
        return vwin;
 }
 
+int ViewPopup::zoom_scale(int dir)
+{
+       int view_h = vt->view_h + dir*vt->view_h/10 + dir;
+       bclamp(view_h, 16,512);
+       vt->view_h = view_h;
+       vt->view_w = view_h * vt->vw/vt->vh;
+       vt->stop_viewing();
+       return 1;
+}
+
+
 void VIconThread::
 reset_images()
 {
@@ -222,21 +248,31 @@ void VIconThread::add_vicon(VIcon *vip)
        t_heap[i] = vip;
 }
 
-int VIconThread::del_vicon(VIcon *&vicon)
+int VIconThread::del_vicon(VIcon *vicon)
 {
        int i = t_heap.size();
        while( --i >= 0 && t_heap[i] != vicon );
        if( i < 0 ) return 0;
        remove_vicon(i);
-       delete vicon;  vicon = 0;
        return 1;
 }
 
+void ViewPopup::draw_vframe(VFrame *frame)
+{
+       if( !frame ) return;
+       BC_WindowBase::draw_vframe(frame, 0,0, get_w(),get_h());
+}
+
 void VIconThread::set_view_popup(VIcon *vicon)
 {
        this->vicon = vicon;
 }
 
+void VIconThread::close_view_popup()
+{
+       set_view_popup(0);
+}
+
 int VIconThread::
 update_view()
 {
@@ -317,7 +353,7 @@ run()
                                draw(next);
                                if( !next->seq_no ) {
                                        next->cycle_start = now;
-                                       if( next->playing_audio )
+                                       if( next->playing_audio > 0 )
                                                next->start_audio();
                                }
                                int64_t ref_no = (now - next->cycle_start) / 1000. * refresh_rate;