repair default keyframe load, tweak init default histogram threshold
[goodguy/history.git] / cinelerra-5.1 / cinelerra / cwindowtool.C
index f326635636e1240070d28c29711e564457e41a85..f0f372a5aba2f82315f2ee38d7a232af060e21a8 100644 (file)
@@ -83,6 +83,7 @@ void CWindowTool::start_tool(int operation)
 //printf("CWindowTool::start_tool 1\n");
        if(current_tool != operation)
        {
+               int previous_tool = current_tool;
                current_tool = operation;
                switch(operation)
                {
@@ -104,6 +105,10 @@ void CWindowTool::start_tool(int operation)
                        case CWINDOW_RULER:
                                new_gui = new CWindowRulerGUI(mwindow, this);
                                break;
+                       case CWINDOW_PROTECT:
+                               mwindow->edl->session->tool_window = 0;
+                               gui->composite_panel->operation[CWINDOW_TOOL_WINDOW]->update(0);
+                               // fall thru
                        default:
                                result = 1;
                                stop_tool();
@@ -120,13 +125,11 @@ void CWindowTool::start_tool(int operation)
                        output_lock->lock("CWindowTool::start_tool");
                        this->tool_gui = new_gui;
                        tool_gui->create_objects();
-
-                       if(mwindow->edl->session->tool_window &&
-                               mwindow->session->show_cwindow) tool_gui->show_window();
-                       tool_gui->lock_window("CWindowTool::start_tool 1");
-                       tool_gui->flush();
-                       tool_gui->unlock_window();
-
+                       if( previous_tool == CWINDOW_PROTECT || previous_tool == CWINDOW_NONE ) {
+                               mwindow->edl->session->tool_window = 1;
+                               gui->composite_panel->operation[CWINDOW_TOOL_WINDOW]->update(1);
+                       }
+                       update_show_window();
 
 // Signal thread to run next tool GUI
                        input_lock->unlock();
@@ -289,9 +292,29 @@ int CWindowToolGUI::close_event()
 
 int CWindowToolGUI::keypress_event()
 {
-       if(get_keypress() == 'w' || get_keypress() == 'W')
+       int result = 0;
+
+       switch( get_keypress() ) {
+       case 'w':
+       case 'W':
                return close_event();
-       return 0;
+       case KEY_F1:
+       case KEY_F2:
+       case KEY_F3:
+       case KEY_F4:
+       case KEY_F5:
+       case KEY_F6:
+       case KEY_F7:
+       case KEY_F8:
+       case KEY_F9:
+       case KEY_F10:
+       case KEY_F11:
+       case KEY_F12:
+               resend_event(thread->gui);
+               result = 1;
+       }
+
+       return result;
 }
 
 int CWindowToolGUI::translation_event()
@@ -546,7 +569,7 @@ void CWindowEyedropGUI::update()
        rgb_hex->update(rgb_text);
        
        float y, u, v;
-       YUV::rgb_to_yuv_f(r, g, b, y, u, v);
+       YUV::yuv.rgb_to_yuv_f(r, g, b, y, u, v);
        this->y->update(y);
        this->u->update(u);  u += 0.5;
        this->v->update(v);  v += 0.5;
@@ -794,8 +817,7 @@ void CWindowCameraGUI::update_preview()
        mwindow->gui->draw_overlays(1);
        mwindow->sync_parameters(CHANGE_PARAMS);
        mwindow->gui->unlock_window();
-       mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-                       CHANGE_NONE, mwindow->edl, 1);
+       mwindow->cwindow->refresh_frame(CHANGE_NONE);
        mwindow->cwindow->gui->lock_window("CWindowCameraGUI::update_preview");
        mwindow->cwindow->gui->canvas->draw_refresh();
        mwindow->cwindow->gui->unlock_window();
@@ -891,7 +913,9 @@ void CWindowCameraGUI::update()
        if(z_auto) {
                float value = z_auto->get_value();
                z->update(value);
+               thread->gui->lock_window("CWindowCameraGUI::update");
                thread->gui->composite_panel->cpanel_zoom->update(value);
+               thread->gui->unlock_window();
        }
 
        if( x_auto && y_auto && z_auto )
@@ -1239,8 +1263,7 @@ void CWindowProjectorGUI::update_preview()
        mwindow->sync_parameters(CHANGE_PARAMS);
        mwindow->gui->draw_overlays(1);
        mwindow->gui->unlock_window();
-       mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-                       CHANGE_NONE, mwindow->edl, 1);
+       mwindow->cwindow->refresh_frame(CHANGE_NONE);
        mwindow->cwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
        mwindow->cwindow->gui->canvas->draw_refresh();
        mwindow->cwindow->gui->unlock_window();
@@ -1334,7 +1357,9 @@ void CWindowProjectorGUI::update()
        if(z_auto) {
                float value = z_auto->get_value();
                z->update(value);
+               thread->gui->lock_window("CWindowProjectorGUI::update");
                thread->gui->composite_panel->cpanel_zoom->update(value);
+               thread->gui->unlock_window();
        }
 
        if( x_auto && y_auto && z_auto )
@@ -1664,6 +1689,9 @@ int CWindowMaskDelete::handle_event()
                temp_keyframe.copy_data(keyframe);
 // Update parameter
                SubMask *submask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask);
+               if( shift_down() )
+                       submask->points.remove_all_objects();
+
                for(int i = mwindow->cwindow->gui->affected_point;
                        i < submask->points.total - 1;
                        i++)
@@ -1685,6 +1713,8 @@ int CWindowMaskDelete::handle_event()
                        current; )
                {
                        SubMask *submask = current->get_submask(mwindow->edl->session->cwindow_mask);
+                       if( shift_down() )
+                               submask->points.remove_all_objects();
 
                        for(int i = mwindow->cwindow->gui->affected_point;
                                i < submask->points.total - 1;
@@ -2047,11 +2077,8 @@ int CWindowDisableOpenGLMasking::handle_event()
 
 
 CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow,
-       thread,
-       _(PROGRAM_NAME ": Mask"),
-       330,
-       310)
+ : CWindowToolGUI(mwindow, thread,
+       _(PROGRAM_NAME ": Mask"), 330, 320)
 {
        this->mwindow = mwindow;
        this->thread = thread;
@@ -2119,6 +2146,8 @@ void CWindowMaskGUI::create_objects()
        y += title->get_h() + margin;
        add_subwindow(title = new BC_Title(x, y, _("Press Ctrl to move a control point")));
        y += title->get_h() + margin;
+       add_subwindow(title = new BC_Title(x, y, _("Shift+click Delete to delete the mask")));
+       y += title->get_h() + margin;
        add_subwindow(title = new BC_Title(x, y, _("Press Alt to translate the mask")));
        y += 30;
 
@@ -2263,8 +2292,7 @@ void CWindowMaskGUI::update_preview()
        mwindow->sync_parameters(CHANGE_PARAMS);
        mwindow->gui->draw_overlays(1);
        mwindow->gui->unlock_window();
-       mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-                       CHANGE_NONE, mwindow->edl, 1);
+       mwindow->cwindow->refresh_frame(CHANGE_NONE);
        mwindow->cwindow->gui->lock_window("CWindowMaskGUI::update_preview");
        mwindow->cwindow->gui->canvas->draw_refresh();
        mwindow->cwindow->gui->unlock_window();
@@ -2286,30 +2314,32 @@ CWindowRulerGUI::~CWindowRulerGUI()
 
 void CWindowRulerGUI::create_objects()
 {
-       int x = 10, y = 10;
+       int x = 10, y = 10, x1 = 100;
        BC_Title *title;
 
        lock_window("CWindowRulerGUI::create_objects");
        add_subwindow(title = new BC_Title(x, y, _("Current:")));
-       add_subwindow(current = new BC_Title(x + title->get_w() + 10, y, ""));
+       add_subwindow(current = new BC_TextBox(x1, y, 200, 1, ""));
        y += title->get_h() + 5;
-
        add_subwindow(title = new BC_Title(x, y, _("Point 1:")));
-       add_subwindow(point1 = new BC_Title(x + title->get_w() + 10, y, ""));
+       add_subwindow(point1 = new BC_TextBox(x1, y, 200, 1, ""));
        y += title->get_h() + 5;
-
        add_subwindow(title = new BC_Title(x, y, _("Point 2:")));
-       add_subwindow(point2 = new BC_Title(x + title->get_w() + 10, y, ""));
+       add_subwindow(point2 = new BC_TextBox(x1, y, 200, 1, ""));
+       y += title->get_h() + 5;
+       add_subwindow(title = new BC_Title(x, y, _("Deltas:")));
+       add_subwindow(deltas = new BC_TextBox(x1, y, 200, 1, ""));
        y += title->get_h() + 5;
-
        add_subwindow(title = new BC_Title(x, y, _("Distance:")));
-       add_subwindow(distance = new BC_Title(x + title->get_w() + 10, y, ""));
+       add_subwindow(distance = new BC_TextBox(x1, y, 200, 1, ""));
        y += title->get_h() + 5;
        add_subwindow(title = new BC_Title(x, y, _("Angle:")));
-       add_subwindow(angle = new BC_Title(x + title->get_w() + 10, y, ""));
+       add_subwindow(angle = new BC_TextBox(x1, y, 200, 1, ""));
        y += title->get_h() + 10;
        char string[BCTEXTLEN];
-       sprintf(string, _("Press Ctrl to lock ruler to the\nnearest 45%c angle."), 0xb0);
+       sprintf(string,
+                _("Press Ctrl to lock ruler to the\nnearest 45%c%c angle."),
+               0xc2, 0xb0); // degrees utf
        add_subwindow(title = new BC_Title(x,
                y,
                string));
@@ -2324,42 +2354,27 @@ void CWindowRulerGUI::create_objects()
 
 void CWindowRulerGUI::update()
 {
-       double distance_value =
-               sqrt(SQR(mwindow->edl->session->ruler_x2 - mwindow->edl->session->ruler_x1) +
-               SQR(mwindow->edl->session->ruler_y2 - mwindow->edl->session->ruler_y1));
-       double angle_value = atan((mwindow->edl->session->ruler_y2 - mwindow->edl->session->ruler_y1) /
-               (mwindow->edl->session->ruler_x2 - mwindow->edl->session->ruler_x1)) *
-               360 /
-               2 /
-               M_PI;
-
-       if(EQUIV(distance_value, 0.0))
-       {
-               angle_value = 0.0;
-       }
-       else
-       if(angle_value < 0)
-       {
-               angle_value *= -1;
-       }
-
        char string[BCTEXTLEN];
-       sprintf(string, "%d, %d",
-               mwindow->session->cwindow_output_x,
-               mwindow->session->cwindow_output_y);
+       int cx = mwindow->session->cwindow_output_x;
+       int cy = mwindow->session->cwindow_output_y;
+       sprintf(string, "%d, %d", cx, cy);
        current->update(string);
-       sprintf(string, "%.0f, %.0f",
-               mwindow->edl->session->ruler_x1,
-               mwindow->edl->session->ruler_y1);
+       double x1 = mwindow->edl->session->ruler_x1;
+       double y1 = mwindow->edl->session->ruler_y1;
+       sprintf(string, "%.0f, %.0f", x1, y1);
        point1->update(string);
-       sprintf(string, "%.0f, %.0f",
-               mwindow->edl->session->ruler_x2,
-               mwindow->edl->session->ruler_y2);
+       double x2 = mwindow->edl->session->ruler_x2;
+       double y2 = mwindow->edl->session->ruler_y2;
+       sprintf(string, "%.0f, %.0f", x2, y2);
        point2->update(string);
-
-       sprintf(string, _("%0.01f pixels"), distance_value);
+       double dx = x2 - x1, dy = y2 - y1;
+       sprintf(string, "%s%.0f, %s%.0f", (dx>=0? "+":""), dx, (dy>=0? "+":""), dy);
+       deltas->update(string);
+       double d = sqrt(dx*dx + dy*dy);
+       sprintf(string, _("%0.01f pixels"), d);
        distance->update(string);
-       sprintf(string, "%0.02f %c", angle_value, 0xb0);
+       double a = d > 0 ? (atan2(-dy, dx) * 180/M_PI) : 0.;
+       sprintf(string, "%0.02f %c%c", a, 0xc2, 0xb0);
        angle->update(string);
 }