search fixes, preset fixes, ladspa icon logging, igor pref theme, drag btn rollover
[goodguy/history.git] / cinelerra-5.1 / cinelerra / cpanel.C
index e6c5cff575997abb1fc635944ee535f883e31cc2..1e6ef8d3e5348a86a3b599c88f42c90f911c76c5 100644 (file)
  *
  */
 
+#include "automation.h"
 #include "cpanel.h"
+#include "cwindow.h"
 #include "cwindowgui.h"
 #include "cwindowtool.h"
 #include "edl.h"
 #include "edlsession.h"
+#include "floatauto.h"
 #include "language.h"
 #include "mbuttons.h"
 #include "mwindow.h"
+#include "mwindowgui.h"
 #include "theme.h"
+#include "track.h"
 
 
 
@@ -73,18 +78,27 @@ void CPanel::create_objects()
        subwindow->add_subwindow(operation[CWINDOW_TOOL_WINDOW] = new CPanelToolWindow(mwindow, this, x, y));
        y += operation[CWINDOW_TOOL_WINDOW]->get_h();
        subwindow->add_subwindow(operation[CWINDOW_TITLESAFE] = new CPanelTitleSafe(mwindow, this, x, y));
+       y += operation[CWINDOW_TITLESAFE]->get_h();
+       x += (w - BC_Slider::get_span(1)) / 2;  y += 15;
+       subwindow->add_subwindow(cpanel_zoom = new CPanelZoom(mwindow, this, x, y, h-y-20));
 }
 
-void CPanel::reposition_buttons(int x, int y)
+void CPanel::reposition_buttons(int x, int y, int h)
 {
        this->x = x;
        this->y = y;
+       this->h = h;
 
        for(int i = 0; i < CPANEL_OPERATIONS; i++)
        {
                operation[i]->reposition_window(x, y);
                y += operation[i]->get_h();
        }
+       x += (w - BC_Slider::get_span(1)) / 2;
+       y += 15;
+       h = this->h - this->y;
+       cpanel_zoom->reposition_window(x, y, w, h-y-20);
+       cpanel_zoom->set_pointer_motion_range(h);
 }
 
 
@@ -114,6 +128,13 @@ void CPanel::set_operation(int value)
                                operation[i]->update(1);
                }
        }
+       if( operation[CWINDOW_ZOOM]->get_value() ||
+           operation[CWINDOW_CAMERA]->get_value() ||
+           operation[CWINDOW_PROJECTOR]->get_value() ) {
+               cpanel_zoom->set_shown(1);
+       }
+       else
+               cpanel_zoom->set_shown(0);
 }
 
 
@@ -347,3 +368,77 @@ int CPanelTitleSafe::handle_event()
        return 1;
 }
 
+CPanelZoom::CPanelZoom(MWindow *mwindow, CPanel *gui, int x, int y, int h)
+ : BC_FSlider(x, y, 1, h, h, -2., 2., 0, 0)
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+       set_precision(0.001);
+       set_tooltip(_("Zoom"));
+}
+CPanelZoom::~CPanelZoom()
+{
+}
+int CPanelZoom::handle_event()
+{
+       FloatAuto *z_auto = 0;
+       int aidx = -1;
+       float value = get_value();
+       BC_FSlider::update(value);
+       double zoom = pow(10.,value);
+       switch( mwindow->edl->session->cwindow_operation ) {
+       case CWINDOW_ZOOM:
+               gui->subwindow->zoom_canvas(zoom, 1);
+               break;
+       case CWINDOW_CAMERA:
+               aidx = AUTOMATION_CAMERA_Z;
+               break;
+       case CWINDOW_PROJECTOR:
+               aidx = AUTOMATION_PROJECTOR_Z;
+               break;
+       }
+       if( aidx < 0 ) return 1;
+       Track *track = mwindow->cwindow->calculate_affected_track();
+       if( !track ) return 1;
+       z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
+                       track->automation->autos[aidx], 1);
+       if( !z_auto ) return 1;
+       z_auto->set_value(zoom);
+       gui->subwindow->update_tool();
+       mwindow->gui->lock_window("CPanelZoom::handle_event 1");
+       mwindow->gui->draw_overlays(1);
+       mwindow->gui->unlock_window();
+       mwindow->sync_parameters(CHANGE_PARAMS);
+       return 1;
+}
+
+int CPanelZoom::set_shown(int shown)
+{
+       if( shown ) {
+               show();
+               update(gui->subwindow->canvas->get_zoom());
+       }
+       else
+               hide();
+       return 1;
+}
+
+char *CPanelZoom::get_caption()
+{
+       double value = get_value();
+       int frac = value >= 0. ? 1 : value >= -1. ? 2 : 3;
+       double zoom = pow(10., value);
+       char *caption = BC_Slider::get_caption();
+       sprintf(caption, "%.*f", frac, zoom);
+       return caption;
+}
+
+void CPanelZoom::update(float zoom)
+{
+       if( !is_hidden() ) {
+               if( zoom < 0.01 ) zoom = 0.01;
+               float value = log10f(zoom);
+               BC_FSlider::update(value);
+       }
+}
+