X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fcwindowtool.C;h=f0f372a5aba2f82315f2ee38d7a232af060e21a8;hb=04031cc2a664d2a6d9d2a37954c55cc68742d78c;hp=4730d81de975816b71ab68391508ba2cf40f33b7;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/cwindowtool.C b/cinelerra-5.1/cinelerra/cwindowtool.C index 4730d81d..f0f372a5 100644 --- a/cinelerra-5.1/cinelerra/cwindowtool.C +++ b/cinelerra-5.1/cinelerra/cwindowtool.C @@ -1,7 +1,6 @@ - /* * CINELERRA - * Copyright (C) 2008-2014 Adam Williams + * Copyright (C) 2008-2017 Adam Williams * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,8 +18,11 @@ * */ +#include +#include + #include "automation.h" -#include "cicolors.h" +#include "bccolors.h" #include "clip.h" #include "condition.h" #include "cpanel.h" @@ -81,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) { @@ -102,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(); @@ -118,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(); @@ -287,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() @@ -457,16 +482,8 @@ void CWindowCropGUI::update() } - - - - CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread) - : CWindowToolGUI(mwindow, - thread, - _(PROGRAM_NAME ": Color"), - 200, - 250) + : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Color"), 220, 290) { } @@ -477,11 +494,13 @@ CWindowEyedropGUI::~CWindowEyedropGUI() void CWindowEyedropGUI::create_objects() { int margin = mwindow->theme->widget_border; - int x = margin; - int y = margin; - int x2 = 70; + int x = 10 + margin; + int y = 10 + margin; + int x2 = 70, x3 = x2 + 60; lock_window("CWindowEyedropGUI::create_objects"); - BC_Title *title1, *title2, *title3, *title4, *title5, *title6, *title7; + BC_Title *title0, *title1, *title2, *title3, *title4, *title5, *title6, *title7; + add_subwindow(title0 = new BC_Title(x, y,_("X,Y:"))); + y += title0->get_h() + margin; add_subwindow(title7 = new BC_Title(x, y, _("Radius:"))); y += BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1) + margin; @@ -498,50 +517,72 @@ void CWindowEyedropGUI::create_objects() y += title5->get_h() + margin; add_subwindow(title6 = new BC_Title(x, y, "V:")); + add_subwindow(current = new BC_Title(x2, title0->get_y(), "")); radius = new CWindowCoord(this, x2, title7->get_y(), mwindow->edl->session->eyedrop_radius); radius->create_objects(); radius->set_boundaries((int64_t)0, (int64_t)255); - add_subwindow(red = new BC_Title(x2, title1->get_y(), "0")); add_subwindow(green = new BC_Title(x2, title2->get_y(), "0")); add_subwindow(blue = new BC_Title(x2, title3->get_y(), "0")); + add_subwindow(rgb_hex = new BC_Title(x3, red->get_y(), "#000000")); add_subwindow(this->y = new BC_Title(x2, title4->get_y(), "0")); add_subwindow(this->u = new BC_Title(x2, title5->get_y(), "0")); add_subwindow(this->v = new BC_Title(x2, title6->get_y(), "0")); + add_subwindow(yuv_hex = new BC_Title(x3, this->y->get_y(), "#000000")); - y = title6->get_y() + this->v->get_h() + margin; + y = title6->get_y() + this->v->get_h() + 2*margin; add_subwindow(sample = new BC_SubWindow(x, y, 50, 50)); + y += sample->get_h() + margin; + add_subwindow(use_max = new CWindowEyedropCheckBox(mwindow, this, x, y)); update(); unlock_window(); } void CWindowEyedropGUI::update() { - radius->update((int64_t)mwindow->edl->session->eyedrop_radius); + char string[BCTEXTLEN]; + sprintf(string, "%d, %d", + thread->gui->eyedrop_x, + thread->gui->eyedrop_y); + current->update(string); - red->update(mwindow->edl->local_session->red); - green->update(mwindow->edl->local_session->green); - blue->update(mwindow->edl->local_session->blue); + radius->update((int64_t)mwindow->edl->session->eyedrop_radius); + LocalSession *local_session = mwindow->edl->local_session; + int use_max = local_session->use_max; + float r = use_max ? local_session->red_max : local_session->red; + float g = use_max ? local_session->green_max : local_session->green; + float b = use_max ? local_session->blue_max : local_session->blue; + this->red->update(r); + this->green->update(g); + this->blue->update(b); + + int rx = 255*r + 0.5; bclamp(rx,0,255); + int gx = 255*g + 0.5; bclamp(gx,0,255); + int bx = 255*b + 0.5; bclamp(bx,0,255); + char rgb_text[BCSTRLEN]; + sprintf(rgb_text, "#%02x%02x%02x", rx, gx, bx); + rgb_hex->update(rgb_text); + float y, u, v; - YUV::rgb_to_yuv_f(mwindow->edl->local_session->red, - mwindow->edl->local_session->green, - mwindow->edl->local_session->blue, - y, - u, - v); + YUV::yuv.rgb_to_yuv_f(r, g, b, y, u, v); this->y->update(y); - this->u->update(u); - this->v->update(v); - - int red = (int)(CLIP(mwindow->edl->local_session->red, 0, 1) * 0xff); - int green = (int)(CLIP(mwindow->edl->local_session->green, 0, 1) * 0xff); - int blue = (int)(CLIP(mwindow->edl->local_session->blue, 0, 1) * 0xff); - sample->set_color((red << 16) | (green << 8) | blue); + this->u->update(u); u += 0.5; + this->v->update(v); v += 0.5; + + int yx = 255*y + 0.5; bclamp(yx,0,255); + int ux = 255*u + 0.5; bclamp(ux,0,255); + int vx = 255*v + 0.5; bclamp(vx,0,255); + char yuv_text[BCSTRLEN]; + sprintf(yuv_text, "#%02x%02x%02x", yx, ux, vx); + yuv_hex->update(yuv_text); + + int rgb = (rx << 16) | (gx << 8) | (bx << 0); + sample->set_color(rgb); sample->draw_box(0, 0, sample->get_w(), sample->get_h()); sample->set_color(BLACK); sample->draw_rectangle(0, 0, sample->get_w(), sample->get_h()); @@ -590,28 +631,27 @@ const _CVD Camera_Crv_Smooth = { FloatAuto::SMOOTH, true, "tan_smooth", - _("\"smooth\" Curve on current Camera Keyframes") + N_("\"smooth\" Curve on current Camera Keyframes") }; const _CVD Camera_Crv_Linear = { FloatAuto::LINEAR, true, "tan_linear", - _("\"linear\" Curve on current Camera Keyframes") + N_("\"linear\" Curve on current Camera Keyframes") }; const _CVD Projector_Crv_Smooth = { FloatAuto::SMOOTH, false, "tan_smooth", - _("\"smooth\" Curve on current Projector Keyframes") + N_("\"smooth\" Curve on current Projector Keyframes") }; const _CVD Projector_Crv_Linear = { FloatAuto::LINEAR, false, "tan_linear", - _("\"linear\" Curve on current Projector Keyframes") + N_("\"linear\" Curve on current Projector Keyframes") }; - // Implementation Class für Keyframe Curve Mode buttons // // This button reflects the state of the "current" keyframe @@ -639,7 +679,7 @@ CWindowCurveToggle::CWindowCurveToggle(_CVD mode, MWindow *mwindow, CWindowToolG { this->gui = gui; this->mwindow = mwindow; - set_tooltip(cfg.tooltip); + set_tooltip(_(cfg.tooltip)); } void CWindowCurveToggle::check_toggle_state(FloatAuto *x, FloatAuto *y, FloatAuto *z) @@ -675,8 +715,21 @@ int CWindowCurveToggle::handle_event() } +CWindowEyedropCheckBox::CWindowEyedropCheckBox(MWindow *mwindow, + CWindowEyedropGUI *gui, int x, int y) + : BC_CheckBox(x, y, mwindow->edl->local_session->use_max, _("Use maximum")) +{ + this->mwindow = mwindow; + this->gui = gui; +} - +int CWindowEyedropCheckBox::handle_event() +{ + mwindow->edl->local_session->use_max = get_value(); + + gui->update(); + return 1; +} CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread) @@ -759,16 +812,12 @@ void CWindowCameraGUI::create_objects() void CWindowCameraGUI::update_preview() { - mwindow->restart_brender(); - mwindow->sync_parameters(CHANGE_PARAMS); - - mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, - mwindow->edl, - 1); mwindow->gui->lock_window("CWindowCameraGUI::update_preview"); + mwindow->restart_brender(); mwindow->gui->draw_overlays(1); + mwindow->sync_parameters(CHANGE_PARAMS); mwindow->gui->unlock_window(); + 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(); @@ -818,9 +867,9 @@ void CWindowCameraGUI::handle_event() if(z_auto) { float zoom = atof(z->get_text()); - if(zoom > 10) zoom = 10; + if(zoom > 100.) zoom = 100.; else - if(zoom < 0) zoom = 0; + if(zoom < 0.01) zoom = 0.01; // Doesn't allow user to enter from scratch // if(zoom != atof(z->get_text())) // z->update(zoom); @@ -861,8 +910,13 @@ void CWindowCameraGUI::update() x->update(x_auto->get_value()); if(y_auto) y->update(y_auto->get_value()); - if(z_auto) - z->update(z_auto->get_value()); + 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 ) { @@ -1120,21 +1174,6 @@ int CWindowCameraBottom::handle_event() } - - - - - - - - - - - - - - - CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread) : CWindowToolGUI(mwindow, thread, @@ -1219,16 +1258,12 @@ void CWindowProjectorGUI::create_objects() void CWindowProjectorGUI::update_preview() { + mwindow->gui->lock_window("CWindowProjectorGUI::update_preview"); mwindow->restart_brender(); mwindow->sync_parameters(CHANGE_PARAMS); - mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, - mwindow->edl, - 1); - // TODO: really need to lock the main window?? - mwindow->gui->lock_window("CWindowProjectorGUI::update_preview"); mwindow->gui->draw_overlays(1); mwindow->gui->unlock_window(); + 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(); @@ -1278,9 +1313,8 @@ void CWindowProjectorGUI::handle_event() if(z_auto) { float zoom = atof(z->get_text()); - if(zoom > 10000) zoom = 10000; - else - if(zoom < 0) zoom = 0; + if(zoom > 100.) zoom = 100.; + else if(zoom < 0.01) zoom = 0.01; // if (zoom != atof(z->get_text())) // z->update(zoom); z_auto->set_value(zoom); @@ -1320,8 +1354,13 @@ void CWindowProjectorGUI::update() x->update(x_auto->get_value()); if(y_auto) y->update(y_auto->get_value()); - if(z_auto) - z->update(z_auto->get_value()); + 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 ) { @@ -1330,44 +1369,6 @@ void CWindowProjectorGUI::update() } } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CWindowProjectorLeft::CWindowProjectorLeft(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y) : BC_Button(x, y, mwindow->theme->get_image_set("left_justify")) { @@ -1576,12 +1577,6 @@ int CWindowProjectorBottom::handle_event() } - - - - - - CWindowMaskMode::CWindowMaskMode(MWindow *mwindow, CWindowToolGUI *gui, int x, int y, const char *text) : BC_PopupMenu(x, y, 220, text, 1) @@ -1679,6 +1674,7 @@ int CWindowMaskDelete::handle_event() Track *track; MaskPoint *point; SubMask *mask; + int total_points = 0; // Get existing keyframe ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0); @@ -1693,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++) @@ -1705,6 +1704,8 @@ int CWindowMaskDelete::handle_event() submask->points.remove_object( submask->points.values[submask->points.total - 1]); } + total_points = submask->points.total; + // Commit change to span of keyframes ((MaskAutos*)track->automation->autos[AUTOMATION_MASK])->update_parameter(&temp_keyframe); #else @@ -1712,8 +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; @@ -1727,7 +1728,7 @@ int CWindowMaskDelete::handle_event() submask->points.remove_object( submask->points.values[submask->points.total - 1]); } - + total_points = submask->points.total; if(current == (MaskAuto*)autos->default_auto) current = (MaskAuto*)autos->first; @@ -1735,6 +1736,9 @@ int CWindowMaskDelete::handle_event() current = (MaskAuto*)NEXT; } #endif + if( mwindow->cwindow->gui->affected_point >= total_points ) + mwindow->cwindow->gui->affected_point = + total_points > 0 ? total_points-1 : 0; gui->update(); gui->update_preview(); @@ -1860,6 +1864,47 @@ int CWindowMaskNumber::handle_event() } +CWindowMaskAffectedPoint::CWindowMaskAffectedPoint(MWindow *mwindow, + CWindowToolGUI *gui, int x, int y) + : BC_TumbleTextBox(gui, + (int64_t)mwindow->cwindow->gui->affected_point, + (int64_t)0, INT64_MAX, x, y, 100) +{ + this->mwindow = mwindow; + this->gui = gui; +} + +CWindowMaskAffectedPoint::~CWindowMaskAffectedPoint() +{ +} + +int CWindowMaskAffectedPoint::handle_event() +{ + int total_points = 0; + int affected_point = atol(get_text()); + Track *track = mwindow->cwindow->calculate_affected_track(); + if(track) { + MaskAutos *autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK]; + MaskAuto *keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(autos, 0); + if( keyframe ) { + SubMask *mask = keyframe->get_submask(mwindow->edl->session->cwindow_mask); + total_points = mask->points.size(); + } + } + int active_point = affected_point; + if( affected_point >= total_points ) + affected_point = total_points - 1; + else if( affected_point < 0 ) + affected_point = 0; + if( active_point != affected_point ) + update((int64_t)affected_point); + mwindow->cwindow->gui->affected_point = affected_point; + gui->update(); + gui->update_preview(); + return 1; +} + + @@ -1898,7 +1943,7 @@ int CWindowMaskFeather::handle_event() mask, point, create_it); if(track) - { + { #ifdef USE_KEYFRAME_SPANNING // Create temp keyframe MaskAuto temp_keyframe(mwindow->edl, autos); @@ -1949,7 +1994,7 @@ int CWindowMaskValue::handle_event() #else int create_it = 1; #endif - + mwindow->undo->update_undo_before(_("mask value"), this); ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, create_it); @@ -2001,6 +2046,30 @@ int CWindowMaskBeforePlugins::handle_event() } +CWindowDisableOpenGLMasking::CWindowDisableOpenGLMasking(CWindowToolGUI *gui, int x, int y) + : BC_CheckBox(x, y, 1, _("Disable OpenGL masking")) +{ + this->gui = gui; +} + +int CWindowDisableOpenGLMasking::handle_event() +{ + Track *track; + MaskAutos *autos; + MaskAuto *keyframe; + SubMask *mask; + MaskPoint *point; + ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 1); + + if (keyframe) { + keyframe->disable_opengl_masking = get_value(); + gui->update_preview(); + } + return 1; +} + + + @@ -2008,19 +2077,20 @@ int CWindowMaskBeforePlugins::handle_event() CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread) - : CWindowToolGUI(mwindow, - thread, - _(PROGRAM_NAME ": Mask"), - 330, - 280) + : CWindowToolGUI(mwindow, thread, + _(PROGRAM_NAME ": Mask"), 330, 320) { this->mwindow = mwindow; this->thread = thread; + number = 0; + active_point = 0; + feather = 0; } CWindowMaskGUI::~CWindowMaskGUI() { lock_window("CWindowMaskGUI::~CWindowMaskGUI"); delete number; + delete active_point; delete feather; unlock_window(); } @@ -2044,6 +2114,11 @@ void CWindowMaskGUI::create_objects() add_subwindow(value = new CWindowMaskValue(mwindow, this, x + title->get_w() + margin, y)); y += value->get_h() + margin; add_subwindow(delete_point = new CWindowMaskDelete(mwindow, this, x, y)); + int x1 = x + delete_point->get_w() + 2*margin; + add_subwindow(title = new BC_Title(x1, y, _("Point:"))); + x1 += title->get_w() + margin; + active_point = new CWindowMaskAffectedPoint(mwindow, this, x1, y); + active_point->create_objects(); y += delete_point->get_h() + margin; add_subwindow(title = new BC_Title(x, y, _("Mask number:"))); number = new CWindowMaskNumber(mwindow, @@ -2067,19 +2142,18 @@ void CWindowMaskGUI::create_objects() x = 10; y += this->y->get_h() + margin; - add_subwindow(title = new BC_Title(x, y, _("Press Ctrl to move a point"))); + add_subwindow(title = new BC_Title(x, y, _("Press Shift to move an end point"))); y += title->get_h() + margin; - add_subwindow(title = new BC_Title(x, y, _("Press Alt to translate the mask"))); + 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, _("Press Shift to edit bezier curve"))); - + 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; -// add_subwindow(title = new BC_Title(x, y, _("Apply mask before plugins:"))); - add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this, - 10, - y)); -// this->apply_before_plugins->create_objects(); + add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this, 10, y)); + y += this->apply_before_plugins->get_h() + margin; + add_subwindow(this->disable_opengl_masking = new CWindowDisableOpenGLMasking(this, 10, y)); update(); unlock_window(); @@ -2147,10 +2221,12 @@ void CWindowMaskGUI::update() feather->update((int64_t)autos->get_feather(position_i, PLAY_FORWARD)); value->update((int64_t)autos->get_value(position_i, PLAY_FORWARD)); apply_before_plugins->update((int64_t)keyframe->apply_before_plugins); + disable_opengl_masking->update((int64_t)keyframe->disable_opengl_masking); } } -//printf("CWindowMaskGUI::update 1\n"); +//printf("CWindowMaskGUI::update 1\n"); + active_point->update((int64_t)mwindow->cwindow->gui->affected_point); number->update((int64_t)mwindow->edl->session->cwindow_mask); //printf("CWindowMaskGUI::update 1\n"); @@ -2211,12 +2287,12 @@ void CWindowMaskGUI::handle_event() void CWindowMaskGUI::update_preview() { + mwindow->gui->lock_window("CWindowMaskGUI::update_preview"); mwindow->restart_brender(); mwindow->sync_parameters(CHANGE_PARAMS); - mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_NONE, - mwindow->edl, - 1); + mwindow->gui->draw_overlays(1); + mwindow->gui->unlock_window(); + 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(); @@ -2238,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)); @@ -2276,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); }