X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fcwindowtool.C;h=d7a4ec6cf95de294bcf14c5d36b15ef8752f8d9c;hp=64c3c78e4fea9b1b4b3f3e59331645774c37fb0c;hb=ddfda6a8cc59bda4dc734973c1c5fecaa31ea487;hpb=0df48ad2d876409c5beeae2e21933a728ea76c33 diff --git a/cinelerra-5.1/cinelerra/cwindowtool.C b/cinelerra-5.1/cinelerra/cwindowtool.C index 64c3c78e..d7a4ec6c 100644 --- a/cinelerra-5.1/cinelerra/cwindowtool.C +++ b/cinelerra-5.1/cinelerra/cwindowtool.C @@ -37,6 +37,7 @@ #include "filexml.h" #include "floatauto.h" #include "floatautos.h" +#include "gwindowgui.h" #include "keys.h" #include "language.h" #include "localsession.h" @@ -52,6 +53,7 @@ #include "tracks.h" #include "trackcanvas.h" #include "transportque.h" +#include "zoombar.h" CWindowTool::CWindowTool(MWindow *mwindow, CWindowGUI *gui) @@ -271,6 +273,7 @@ CWindowToolGUI::CWindowToolGUI(MWindow *mwindow, this->mwindow = mwindow; this->thread = thread; current_operation = 0; + span = 1; edge = 0; } CWindowToolGUI::~CWindowToolGUI() @@ -325,6 +328,23 @@ int CWindowToolGUI::translation_event() return 0; } +void CWindowToolGUI::update_auto(Track *track, int idx, CWindowCoord *vp) +{ + FloatAuto *float_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto( + track->automation->autos[idx], 1); + if( !float_auto ) return; + float v = float_auto->get_value(edge); + float t = atof(vp->get_text()); + if( v == t ) return; + float_auto->bump_value(t, edge, span); + if( idx == AUTOMATION_PROJECTOR_Z || idx == AUTOMATION_CAMERA_Z ) { + mwindow->gui->lock_window("CWindowToolGUI::update_auto"); + mwindow->gui->draw_overlays(1); + mwindow->gui->unlock_window(); + } + update(); + update_preview(); +} void CWindowToolGUI::update_preview(int changed_edl) { @@ -343,25 +363,161 @@ void CWindowToolGUI::draw_preview(int changed_edl) } -CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int log_increment = 0) +CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int type) : BC_TumbleTextBox(gui, (float)value, (float)-65536, (float)65536, x, y, xS(70), 3) { this->gui = gui; - set_log_floatincrement(log_increment); + this->type = type; + slider = 0; + range = 0; } -CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value) +CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value, int type) : BC_TumbleTextBox(gui, (int64_t)value, (int64_t)-65536, (int64_t)65536, x, y, xS(70)) { this->gui = gui; + this->type = type; + slider = 0; + range = 0; +} + +void CWindowCoord::create_objects() +{ + BC_TumbleTextBox::create_objects(); + if( type >= 0 ) { + float v = atof(get_text()); + int xs10 = xS(10); + int x1 = get_x() + BC_TumbleTextBox::get_w() + xs10, y1 = get_y(); + gui->add_subwindow(min_tumbler = new CWindowToolAutoRangeTumbler(this, x1, y1, + 0, _("Range min"))); + x1 += min_tumbler->get_w() + xs10; + int group = Automation::autogrouptype(type, 0); + float min = gui->mwindow->edl->local_session->automation_mins[group]; + float max = gui->mwindow->edl->local_session->automation_maxs[group]; + gui->add_subwindow(slider = new CWindowCoordSlider(this, + x1, y1, xS(150), min, max, v)); + x1 += slider->get_w() + xS(10); + gui->add_subwindow(max_tumbler = new CWindowToolAutoRangeTumbler(this, x1, y1, + 1, _("Range max"))); + x1 += max_tumbler->get_w() + xS(10); + gui->add_subwindow(range_reset = new CWindowToolAutoRangeReset(this, x1, y1)); + x1 += range_reset->get_w() + xS(10); + gui->add_subwindow(range_text = new CWindowToolAutoRangeTextBox(this, x1, y1)); + range_text->update_range(); + x1 += range_text->get_w() + xS(10); + gui->add_subwindow(range = new CWindowCoordRangeTumbler(this, x1, y1)); + } +} + +void CWindowCoord::update_gui(float value) +{ + BC_TumbleTextBox::update(value); + if( slider ) { + int group = Automation::autogrouptype(type, 0); + LocalSession *local_session = gui->mwindow->edl->local_session; + slider->update(slider->get_pointer_motion_range(), value, + local_session->automation_mins[group], + local_session->automation_maxs[group]); + int x1 = range->get_x() + range->get_w() + xS(5); + int y1 = range->get_y() + yS(5), d = xS(16); + gui->set_color(GWindowGUI::auto_colors[type]); + gui->draw_disc(x1, y1, d, d); + } } + int CWindowCoord::handle_event() { + if( slider ) + slider->update(atof(get_text())); gui->event_caller = this; gui->handle_event(); return 1; } +CWindowCoordSlider::CWindowCoordSlider(CWindowCoord *coord, + int x, int y, int w, float mn, float mx, float value) + : BC_FSlider(x, y, 0, w, w, mn, mx, value) +{ + this->coord = coord; + set_precision(0.01); +} + +CWindowCoordSlider::~CWindowCoordSlider() +{ +} + +int CWindowCoordSlider::handle_event() +{ + float value = get_value(); + coord->update(value); + coord->gui->event_caller = coord; + coord->gui->handle_event(); + return 1; +} + +CWindowCoordRangeTumbler::CWindowCoordRangeTumbler(CWindowCoord *coord, int x, int y) + : BC_Tumbler(x, y) +{ + this->coord = coord; +} +CWindowCoordRangeTumbler::~CWindowCoordRangeTumbler() +{ +} + +int CWindowCoordRangeTumbler::update(float scale) +{ + CWindowCoordSlider *slider = coord->slider; + MWindow *mwindow = coord->gui->mwindow; + LocalSession *local_session = mwindow->edl->local_session; + int group = Automation::autogrouptype(coord->type, 0); + float min = local_session->automation_mins[group]; + float max = local_session->automation_maxs[group]; + if( min >= max ) { + switch( group ) { + case AUTOGROUPTYPE_ZOOM: min = 0.005; max = 5.0; break; + case AUTOGROUPTYPE_X: min = -1000; max = 1000; break; + case AUTOGROUPTYPE_Y: min = -1000; max = 1000; break; + } + } + switch( group ) { + case AUTOGROUPTYPE_ZOOM: { // exp + float lmin = log(min), lmax = log(max); + float lr = (lmax - lmin) * scale; + if( (min = exp(lmin - lr)) < ZOOM_MIN ) min = ZOOM_MIN; + if( (max = exp(lmax + lr)) > ZOOM_MAX ) max = ZOOM_MAX; + break; } + case AUTOGROUPTYPE_X: + case AUTOGROUPTYPE_Y: { // linear + float dr = (max - min) * scale; + if( (min -= dr) < XY_MIN ) min = XY_MIN; + if( (max += dr) > XY_MAX ) max = XY_MAX; + break; } + } + slider->update(slider->get_pointer_motion_range(), + slider->get_value(), min, max); + unlock_window(); + MWindowGUI *mgui = mwindow->gui; + mgui->lock_window("CWindowCoordRangeTumbler::update"); + local_session->zoombar_showautotype = group; + local_session->automation_mins[group] = min; + local_session->automation_maxs[group] = max; + mgui->zoombar->update_autozoom(); + mgui->draw_overlays(0); + mgui->update_patchbay(); + mgui->flash_canvas(1); + mgui->unlock_window(); + lock_window("CWindowCoordRangeTumbler::update"); + return coord->range_text->update_range(); +} + +int CWindowCoordRangeTumbler::handle_up_event() +{ + return update(0.125); +} +int CWindowCoordRangeTumbler::handle_down_event() +{ + return update(-0.1); +} CWindowCropApply::CWindowCropApply(MWindow *mwindow, CWindowCropGUI *crop_gui, int x, int y) : BC_GenericButton(x, y, _("Apply")) @@ -636,8 +792,8 @@ void CWindowEyedropGUI::update() float 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; + this->u->update(u += 0.5); + this->v->update(v += 0.5); int yx = 255*y + 0.5; bclamp(yx,0,255); int ux = 255*u + 0.5; bclamp(ux,0,255); @@ -692,30 +848,27 @@ struct _CVD { const char* tooltip; }; -const _CVD Camera_Crv_Smooth = - { FloatAuto::SMOOTH, - true, - "tan_smooth", - N_("\"smooth\" Curve on current Camera Keyframes") - }; -const _CVD Camera_Crv_Linear = - { FloatAuto::LINEAR, - true, - "tan_linear", - N_("\"linear\" Curve on current Camera Keyframes") - }; -const _CVD Projector_Crv_Smooth = - { FloatAuto::SMOOTH, - false, - "tan_smooth", - N_("\"smooth\" Curve on current Projector Keyframes") - }; -const _CVD Projector_Crv_Linear = - { FloatAuto::LINEAR, - false, - "tan_linear", - N_("\"linear\" Curve on current Projector Keyframes") - }; +const _CVD Camera_Crv_Smooth = { FloatAuto::SMOOTH, true, "tan_smooth", + N_("\"smooth\" Curve on current Camera Keyframes") }; +const _CVD Camera_Crv_Linear = { FloatAuto::LINEAR, true, "tan_linear", + N_("\"linear\" Curve on current Camera Keyframes") }; +const _CVD Camera_Crv_Tangent = { FloatAuto::TFREE, true, "tan_tangent", + N_("\"tangent\" Curve on current Camera Keyframes") }; +const _CVD Camera_Crv_Free = { FloatAuto::FREE, true, "tan_free", + N_("\"free\" Curve on current Camera Keyframes") }; +const _CVD Camera_Crv_Bump = { FloatAuto::BUMP, true, "tan_bump", + N_("\"bump\" Curve on current Camera Keyframes") }; + +const _CVD Projector_Crv_Smooth = { FloatAuto::SMOOTH, false, "tan_smooth", + N_("\"smooth\" Curve on current Projector Keyframes") }; +const _CVD Projector_Crv_Linear = { FloatAuto::LINEAR, false, "tan_linear", + N_("\"linear\" Curve on current Projector Keyframes") }; +const _CVD Projector_Crv_Tangent = { FloatAuto::TFREE, false, "tan_tangent", + N_("\"tangent\" Curve on current Projector Keyframes") }; +const _CVD Projector_Crv_Free = { FloatAuto::FREE, false, "tan_free", + N_("\"free\" Curve on current Projector Keyframes") }; +const _CVD Projector_Crv_Bump = { FloatAuto::BUMP, false, "tan_bump", + N_("\"bump\" Curve on current Projector Keyframes") }; // Implementation Class für Keyframe Curve Mode buttons // @@ -728,17 +881,19 @@ const _CVD Projector_Crv_Linear = class CWindowCurveToggle : public BC_Toggle { public: - CWindowCurveToggle(_CVD mode, MWindow *mwindow, CWindowToolGUI *gui, int x, int y); + CWindowCurveToggle(const _CVD &mode, + MWindow *mwindow, CWindowToolGUI *gui, int x, int y); void check_toggle_state(FloatAuto *x, FloatAuto *y, FloatAuto *z); int handle_event(); private: - _CVD cfg; + const _CVD &cfg; MWindow *mwindow; CWindowToolGUI *gui; }; -CWindowCurveToggle::CWindowCurveToggle(_CVD mode, MWindow *mwindow, CWindowToolGUI *gui, int x, int y) +CWindowCurveToggle::CWindowCurveToggle(const _CVD &mode, + MWindow *mwindow, CWindowToolGUI *gui, int x, int y) : BC_Toggle(x, y, mwindow->theme->get_image_set(mode.icon_id), false), cfg(mode) { @@ -796,7 +951,7 @@ int CWindowEyedropCheckBox::handle_event() CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread) - : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Camera"), xS(170), yS(170)) + : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Camera"), xS(580), yS(200)) { } CWindowCameraGUI::~CWindowCameraGUI() @@ -805,67 +960,86 @@ CWindowCameraGUI::~CWindowCameraGUI() void CWindowCameraGUI::create_objects() { - int xs10 = xS(10), xs15 = xS(15); + int xs5 = xS(5), xs10 = xS(10), xs15 = xS(15), xs25 = xS(25); int ys10 = yS(10), ys30 = yS(30); - int x = xs10, y = ys10, x1; + int x = xs10, y = ys10; Track *track = mwindow->cwindow->calculate_affected_track(); FloatAuto *x_auto = 0, *y_auto = 0, *z_auto = 0; BC_Title *title; BC_Button *button; + span = 1; edge = 0; lock_window("CWindowCameraGUI::create_objects"); if( track ) { mwindow->cwindow->calculate_affected_autos(track, &x_auto, &y_auto, &z_auto, 1, 0, 0, 0); } + int x1 = x; + add_subwindow(bar1 = new BC_TitleBar(x1, y, xS(340), xs10, xs10, _("Position"))); + x1 += bar1->get_w() + xS(35); + add_subwindow(bar2 = new BC_TitleBar(x1, y, get_w()-x1-xs10, xs10, xs10, _("Range"))); + y += bar1->get_h() + ys10; add_subwindow(title = new BC_Title(x, y, "X:")); - x += title->get_w(); - this->x = new CWindowCoord(this, x, y, - x_auto ? x_auto->get_value() : (float)0); + x1 = x + title->get_w() + xS(3); + float xvalue = x_auto ? x_auto->get_value() : 0; + this->x = new CWindowCoord(this, x1, y, xvalue, AUTOMATION_CAMERA_X); this->x->create_objects(); - - + this->x->range->set_tooltip(_("expand X range")); y += ys30; - x = xs10; - add_subwindow(title = new BC_Title(x, y, "Y:")); - x += title->get_w(); - this->y = new CWindowCoord(this, x, y, - y_auto ? y_auto->get_value() : (float)0); + add_subwindow(title = new BC_Title(x = xs10, y, "Y:")); + float yvalue = y_auto ? y_auto->get_value() : 0; + this->y = new CWindowCoord(this, x1, y, yvalue, AUTOMATION_CAMERA_Y); this->y->create_objects(); + this->y->range->set_tooltip(_("expand Y range")); y += ys30; - x = xs10; - add_subwindow(title = new BC_Title(x, y, "Z:")); - x += title->get_w(); - this->z = new CWindowCoord(this, x, y, - z_auto ? z_auto->get_value() : (float)1); + add_subwindow(title = new BC_Title(x = xs10, y, "Z:")); + float zvalue = z_auto ? z_auto->get_value() : 1; + this->z = new CWindowCoord(this, x1, y, zvalue, AUTOMATION_CAMERA_Z); this->z->create_objects(); this->z->set_increment(0.01); - - y += ys30; - x1 = xs10; + this->z->range->set_tooltip(_("expand Zoom range")); + y += ys30 + ys10; + + x1 = x; + add_subwindow(bar3 = new BC_TitleBar(x1, y, xS(180)-x1, xs5, xs5, _("Justify"))); + x1 += bar3->get_w() + xS(35); + add_subwindow(bar4 = new BC_TitleBar(x1, y, xS(375)-x1, xs5, xs5, _("Curve type"))); + x1 += bar4->get_w() + xS(25); + add_subwindow(bar5 = new BC_TitleBar(x1, y, get_w()-xS(60)-x1, xs5, xs5, _("Keyframe"))); + y += bar3->get_h() + ys10; + + x1 = x; add_subwindow(button = new CWindowCameraLeft(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowCameraCenter(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowCameraRight(mwindow, this, x1, y)); -// additional Buttons to control the curve mode of the "current" keyframe - x1 += button->get_w() + xs15; - add_subwindow(this->t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y)); - x1 += button->get_w() + xs10; - add_subwindow(this->t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y)); - - y += button->get_h(); - x1 = xs10; + x1 += button->get_w() + xs25; add_subwindow(button = new CWindowCameraTop(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowCameraMiddle(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowCameraBottom(mwindow, this, x1, y)); - x1 += button->get_w() + xs15; - add_subwindow(this->add_keyframe = new CWindowCameraAddKeyframe(mwindow, this, x1, y)); - x1 += button->get_w() + xs10; - add_subwindow(this->reset = new CWindowCameraReset(mwindow, this, x1, y)); + x1 += button->get_w() + xS(35); + add_subwindow(t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y)); + x1 += t_smooth->get_w() + xs10; + add_subwindow(t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y)); + x1 += t_linear->get_w() + xs10; + add_subwindow(t_tangent = new CWindowCurveToggle(Camera_Crv_Tangent, mwindow, this, x1, y)); + x1 += t_tangent->get_w() + xs10; + add_subwindow(t_free = new CWindowCurveToggle(Camera_Crv_Free, mwindow, this, x1, y)); + x1 += t_free->get_w() + xs10; + add_subwindow(t_bump = new CWindowCurveToggle(Camera_Crv_Bump, mwindow, this, x1, y)); + x1 += button->get_w() + xs25; + y += yS(5); + add_subwindow(add_keyframe = new CWindowCameraAddKeyframe(mwindow, this, x1, y)); + x1 += add_keyframe->get_w() + xs15; + add_subwindow(auto_edge = new CWindowCurveAutoEdge(mwindow, this, x1, y)); + x1 += auto_edge->get_w() + xs10; + add_subwindow(auto_span = new CWindowCurveAutoSpan(mwindow, this, x1, y)); + x1 += auto_span->get_w() + xS(50); + add_subwindow(reset = new CWindowCameraReset(mwindow, this, x1, y)); // fill in current auto keyframe values, set toggle states. this->update(); @@ -874,62 +1048,16 @@ void CWindowCameraGUI::create_objects() void CWindowCameraGUI::handle_event() { - FloatAuto *x_auto = 0; - FloatAuto *y_auto = 0; - FloatAuto *z_auto = 0; Track *track = mwindow->cwindow->calculate_affected_track(); - if(track) - { - mwindow->undo->update_undo_before(_("camera"), this); - if(event_caller == x) - { - x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto( - track->automation->autos[AUTOMATION_CAMERA_X], 1); - if(x_auto) - { - x_auto->set_value(atof(x->get_text())); - update(); - update_preview(); - } - } - else - if(event_caller == y) - { - y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto( - track->automation->autos[AUTOMATION_CAMERA_Y], 1); - if(y_auto) - { - y_auto->set_value(atof(y->get_text())); - update(); - update_preview(); - } - } - else - if(event_caller == z) - { - z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto( - track->automation->autos[AUTOMATION_CAMERA_Z], 1); - if(z_auto) - { - float zoom = atof(z->get_text()); - if(zoom > 100.) zoom = 100.; - else - if(zoom < 0.01) zoom = 0.01; - // Doesn't allow user to enter from scratch - // if(zoom != atof(z->get_text())) - // z->update(zoom); - - z_auto->set_value(zoom); - mwindow->gui->lock_window("CWindowCameraGUI::handle_event"); - mwindow->gui->draw_overlays(1); - mwindow->gui->unlock_window(); - update(); - update_preview(); - } - } - - mwindow->undo->update_undo_after(_("camera"), LOAD_ALL); - } + if( !track ) return; + mwindow->undo->update_undo_before(_("camera"), this); + if( event_caller == x ) + update_auto(track, AUTOMATION_CAMERA_X, x); + else if( event_caller == y ) + update_auto(track, AUTOMATION_CAMERA_Y, y); + else if( event_caller == z ) + update_auto(track, AUTOMATION_CAMERA_Z, z); + mwindow->undo->update_undo_after(_("camera"), LOAD_ALL); } void CWindowCameraGUI::update() @@ -938,31 +1066,199 @@ void CWindowCameraGUI::update() FloatAuto *y_auto = 0; FloatAuto *z_auto = 0; Track *track = mwindow->cwindow->calculate_affected_track(); + int bg_color = get_resources()->text_background; + int hi_color = bg_color ^ 0x444444; if( track ) { mwindow->cwindow->calculate_affected_autos(track, &x_auto, &y_auto, &z_auto, 1, 0, 0, 0); } - if(x_auto) - x->update(x_auto->get_value()); - if(y_auto) - y->update(y_auto->get_value()); - if(z_auto) { - float value = z_auto->get_value(); - z->update(value); + if( x_auto ) { + int color = (edge || span) && x_auto->curve_mode == FloatAuto::BUMP ? + hi_color : bg_color; + x->get_textbox()->set_back_color(color); + float xvalue = x_auto->get_value(edge); + x->update_gui(xvalue); + } + if( y_auto ) { + int color = (edge || span) && y_auto->curve_mode == FloatAuto::BUMP ? + hi_color : bg_color; + y->get_textbox()->set_back_color(color); + float yvalue = y_auto->get_value(edge); + y->update_gui(yvalue); + } + if( z_auto ) { + int color = (edge || span) && z_auto->curve_mode == FloatAuto::BUMP ? + hi_color : bg_color; + z->get_textbox()->set_back_color(color); + float zvalue = z_auto->get_value(edge); + z->update_gui(zvalue); thread->gui->lock_window("CWindowCameraGUI::update"); - thread->gui->composite_panel->cpanel_zoom->update(value); + thread->gui->composite_panel->cpanel_zoom->update(zvalue); thread->gui->unlock_window(); } - if( x_auto && y_auto && z_auto ) - { + if( x_auto && y_auto && z_auto ) { t_smooth->check_toggle_state(x_auto, y_auto, z_auto); t_linear->check_toggle_state(x_auto, y_auto, z_auto); + t_tangent->check_toggle_state(x_auto, y_auto, z_auto); + t_free->check_toggle_state(x_auto, y_auto, z_auto); + t_bump->check_toggle_state(x_auto, y_auto, z_auto); } + x->range_text->update_range(); + y->range_text->update_range(); + z->range_text->update_range(); } +CWindowToolAutoRangeTumbler::CWindowToolAutoRangeTumbler(CWindowCoord *coord, int x, int y, + int use_max, const char *tip) + : BC_Tumbler(x, y, coord->gui->mwindow->theme->get_image_set("auto_range"), + TUMBLER_HORZ) +{ + this->coord = coord; + this->use_max = use_max; + set_tooltip(tip); +} +int CWindowToolAutoRangeTumbler::handle_up_event() +{ + coord->gui->mwindow->update_autorange(coord->type, 1, use_max); + coord->range_text->update_range(); + return 1; +} + +int CWindowToolAutoRangeTumbler::handle_down_event() +{ + coord->gui->mwindow->update_autorange(coord->type, 0, use_max); + coord->range_text->update_range(); + return 1; +} + +CWindowToolAutoRangeReset::CWindowToolAutoRangeReset(CWindowCoord *coord, int x, int y) + : BC_Button(x, y, coord->gui->mwindow->theme->get_image_set("reset_button")) +{ + this->coord = coord; + set_tooltip(_("Reset")); +} + +int CWindowToolAutoRangeReset::handle_event() +{ + float v = 0; + int group = Automation::autogrouptype(coord->type, 0); + MWindow *mwindow = coord->gui->mwindow; + LocalSession *local_session = mwindow->edl->local_session; + float min = local_session->automation_mins[group]; + float max = local_session->automation_maxs[group]; + switch( group ) { + case AUTOGROUPTYPE_ZOOM: // exp + min = 0.005; max= 5.000; v = 1; + break; + case AUTOGROUPTYPE_X: + max = mwindow->edl->session->output_w; + min = -max; + break; + case AUTOGROUPTYPE_Y: + max = mwindow->edl->session->output_h; + min = -max; + break; + } + local_session->automation_mins[group] = min; + local_session->automation_maxs[group] = max; + coord->range_text->update_range(); + unlock_window(); + MWindowGUI *mgui = mwindow->gui; + mgui->lock_window("CWindowToolAutoRangeReset::update"); + int color = GWindowGUI::auto_colors[coord->type]; + mgui->zoombar->update_autozoom(group, color); + mgui->draw_overlays(0); + mgui->update_patchbay(); + mgui->flash_canvas(1); + mgui->unlock_window(); + mwindow->save_backup(); + lock_window("CWindowToolAutoRangeReset::update"); + CWindowCoordSlider *slider = coord->slider; + slider->update(slider->get_pointer_motion_range(), v, min, max); + return slider->handle_event(); +} + +CWindowToolAutoRangeTextBox::CWindowToolAutoRangeTextBox(CWindowCoord *coord, int x, int y) + : BC_TextBox(x, y, xS(130), 1, "0.000 to 0.000") +{ + this->coord = coord; + set_tooltip(_("Automation range")); +} + +int CWindowToolAutoRangeTextBox::button_press_event() +{ + if (!is_event_win()) return 0; + int use_max = get_cursor_x() < get_w()/2 ? 0 : 1; + switch( get_buttonpress() ) { + case WHEEL_UP: + coord->gui->mwindow->update_autorange(coord->type, 1, use_max); + break; + case WHEEL_DOWN: + coord->gui->mwindow->update_autorange(coord->type, 0, use_max); + break; + default: + return BC_TextBox::button_press_event(); + } + return coord->range_text->update_range(); +} + +int CWindowToolAutoRangeTextBox::handle_event() +{ + float imin, imax; + if( sscanf(this->get_text(),"%f to%f",&imin, &imax) == 2 ) { + MWindow *mwindow = coord->gui->mwindow; + int group = Automation::autogrouptype(coord->type, 0); + LocalSession *local_session = mwindow->edl->local_session; + float min = imin, max = imax; + switch( group ) { + case AUTOGROUPTYPE_ZOOM: + if( min < ZOOM_MIN ) min = ZOOM_MIN; + if( max > ZOOM_MAX ) max = ZOOM_MAX; + break; + case AUTOGROUPTYPE_X: + case AUTOGROUPTYPE_Y: + if( min < XY_MIN ) min = XY_MIN; + if( max > XY_MAX ) max = XY_MAX; + break; + } + if( max > min ) { + local_session->automation_mins[group] = min; + local_session->automation_maxs[group] = max; + if( min != imin || max != imax ) update_range(); + mwindow->gui->lock_window("CWindowToolAutoRangeTextBox::handle_event"); + int color = GWindowGUI::auto_colors[coord->type]; + mwindow->gui->zoombar->update_autozoom(group, color); + mwindow->gui->draw_overlays(0); + mwindow->gui->update_patchbay(); + mwindow->gui->flash_canvas(1); + mwindow->gui->unlock_window(); + } + } + return 1; +} + +int CWindowToolAutoRangeTextBox::update_range() +{ + char string[BCSTRLEN]; + LocalSession *local_session = coord->gui->mwindow->edl->local_session; + int group = Automation::autogrouptype(coord->type, 0); + float min = local_session->automation_mins[group]; + float max = local_session->automation_maxs[group]; + switch( group ) { + case AUTOGROUPTYPE_ZOOM: + sprintf(string, "%0.03f to %0.03f\n", min, max); + break; + case AUTOGROUPTYPE_X: + case AUTOGROUPTYPE_Y: + sprintf(string, "%0.0f to %.0f\n", min, max); + break; + } + update(string); + return 1; +} CWindowCameraLeft::CWindowCameraLeft(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y) @@ -1202,12 +1498,46 @@ CWindowCameraReset::CWindowCameraReset(MWindow *mwindow, int CWindowCameraReset::handle_event() { + mwindow->edl->local_session->reset_view_limits(); + CWindowCameraGUI *gui = (CWindowCameraGUI *)this->gui; return gui->press(&CWindowCanvas::reset_camera); } +CWindowCurveAutoEdge::CWindowCurveAutoEdge(MWindow *mwindow, + CWindowToolGUI *gui, int x, int y) + : BC_Toggle(x, y, mwindow->theme->get_image_set("bump_edge"), gui->edge) +{ + this->mwindow = mwindow; + this->gui = gui; + set_tooltip(_("Bump edit edge left/right")); +} + +int CWindowCurveAutoEdge::handle_event() +{ + gui->edge = get_value(); + gui->update(); + return 1; +} + +CWindowCurveAutoSpan::CWindowCurveAutoSpan(MWindow *mwindow, + CWindowToolGUI *gui, int x, int y) + : BC_Toggle(x, y, mwindow->theme->get_image_set("bump_span"), gui->span) +{ + this->mwindow = mwindow; + this->gui = gui; + set_tooltip(_("Bump spans to next/prev")); +} + +int CWindowCurveAutoSpan::handle_event() +{ + gui->span = get_value(); + gui->update(); + return 1; +} + CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread) - : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Projector"), xS(170), yS(170)) + : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Projector"), xS(580), yS(200)) { } CWindowProjectorGUI::~CWindowProjectorGUI() @@ -1215,67 +1545,87 @@ CWindowProjectorGUI::~CWindowProjectorGUI() } void CWindowProjectorGUI::create_objects() { - int xs10 = xS(10), xs15 = xS(15); - int ys30 = yS(30); - int x = xs10, y = yS(10); + int xs5 = xS(5), xs10 = xS(10), xs15 = xS(15), xs25 = xS(25); + int ys10 = yS(10), ys30 = yS(30); + int x = xs10, y = ys10; Track *track = mwindow->cwindow->calculate_affected_track(); FloatAuto *x_auto = 0; FloatAuto *y_auto = 0; FloatAuto *z_auto = 0; BC_Title *title; BC_Button *button; + span = 1; edge = 0; lock_window("CWindowProjectorGUI::create_objects"); if( track ) { mwindow->cwindow->calculate_affected_autos(track, &x_auto, &y_auto, &z_auto, 0, 0, 0, 0); } - - add_subwindow(title = new BC_Title(x, y, "X:")); - x += title->get_w(); - this->x = new CWindowCoord(this, x, y, - x_auto ? x_auto->get_value() : (float)0); + int x1 = x; + add_subwindow(bar1 = new BC_TitleBar(x1, y, xS(340), xs10, xs10, _("Position"))); + x1 += bar1->get_w() + xS(35); + add_subwindow(bar2 = new BC_TitleBar(x1, y, get_w()-x1-xs10, xs10, xs10, _("Range"))); + y += bar1->get_h() + ys10; + add_subwindow(title = new BC_Title(x = xs10, y, "X:")); + x1 = x + title->get_w() + xS(3); + float xvalue = x_auto ? x_auto->get_value() : 0; + this->x = new CWindowCoord(this, x1, y, xvalue, AUTOMATION_PROJECTOR_X); this->x->create_objects(); + this->x->range->set_tooltip(_("expand X range")); y += ys30; - x = xs10; - add_subwindow(title = new BC_Title(x, y, "Y:")); - x += title->get_w(); - this->y = new CWindowCoord(this, x, y, - y_auto ? y_auto->get_value() : (float)0); + add_subwindow(title = new BC_Title(x = xs10, y, "Y:")); + float yvalue = y_auto ? y_auto->get_value() : 0; + this->y = new CWindowCoord(this, x1, y, yvalue, AUTOMATION_PROJECTOR_Y); this->y->create_objects(); + this->y->range->set_tooltip(_("expand Y range")); y += ys30; - x = xs10; - add_subwindow(title = new BC_Title(x, y, "Z:")); - x += title->get_w(); - this->z = new CWindowCoord(this, x, y, - z_auto ? z_auto->get_value() : (float)1); + add_subwindow(title = new BC_Title(x = xs10, y, "Z:")); + float zvalue = z_auto ? z_auto->get_value() : 1; + this->z = new CWindowCoord(this, x1, y, zvalue, AUTOMATION_PROJECTOR_Z); this->z->create_objects(); + this->z->range->set_tooltip(_("expand Zoom range")); this->z->set_increment(0.01); + y += ys30 + ys10; - y += ys30; - int x1 = xs10; + x1 = x; + add_subwindow(bar3 = new BC_TitleBar(x1, y, xS(180)-x1, xs5, xs5, _("Justify"))); + x1 += bar3->get_w() + xS(35); + add_subwindow(bar4 = new BC_TitleBar(x1, y, xS(375)-x1, xs5, xs5, _("Curve type"))); + x1 += bar4->get_w() + xS(25); + add_subwindow(bar5 = new BC_TitleBar(x1, y, get_w()-xS(60)-x1, xs5, xs5, _("Keyframe"))); + y += bar3->get_h() + ys10; + + x1 = x; add_subwindow(button = new CWindowProjectorLeft(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowProjectorCenter(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowProjectorRight(mwindow, this, x1, y)); -// additional Buttons to control the curve mode of the "current" keyframe - x1 += button->get_w() + xs15; - add_subwindow(this->t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y)); - x1 += button->get_w() + xs10; - add_subwindow(this->t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y)); - - y += button->get_h(); - x1 = xs10; + x1 += button->get_w() + xs25; add_subwindow(button = new CWindowProjectorTop(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowProjectorMiddle(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowProjectorBottom(mwindow, this, x1, y)); - x1 += button->get_w() + xs15; - add_subwindow(this->add_keyframe = new CWindowProjectorAddKeyframe(mwindow, this, x1, y)); - x1 += button->get_w() + xs10; - add_subwindow(this->reset = new CWindowProjectorReset(mwindow, this, x1, y)); + x1 += button->get_w() + xS(35); + add_subwindow(t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y)); + x1 += t_smooth->get_w() + xs10; + add_subwindow(t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y)); + x1 += t_linear->get_w() + xs10; + add_subwindow(t_tangent = new CWindowCurveToggle(Projector_Crv_Tangent, mwindow, this, x1, y)); + x1 += t_tangent->get_w() + xs10; + add_subwindow(t_free = new CWindowCurveToggle(Projector_Crv_Free, mwindow, this, x1, y)); + x1 += t_free->get_w() + xs10; + add_subwindow(t_bump = new CWindowCurveToggle(Projector_Crv_Bump, mwindow, this, x1, y)); + x1 += button->get_w() + xs25; + y += yS(5); + add_subwindow(add_keyframe = new CWindowProjectorAddKeyframe(mwindow, this, x1, y)); + x1 += add_keyframe->get_w() + xs15; + add_subwindow(auto_edge = new CWindowCurveAutoEdge(mwindow, this, x1, y)); + x1 += auto_edge->get_w() + xs10; + add_subwindow(auto_span = new CWindowCurveAutoSpan(mwindow, this, x1, y)); + x1 += auto_span->get_w() + xS(50); + add_subwindow(reset = new CWindowProjectorReset(mwindow, this, x1, y)); // fill in current auto keyframe values, set toggle states. this->update(); @@ -1284,61 +1634,16 @@ void CWindowProjectorGUI::create_objects() void CWindowProjectorGUI::handle_event() { - FloatAuto *x_auto = 0; - FloatAuto *y_auto = 0; - FloatAuto *z_auto = 0; Track *track = mwindow->cwindow->calculate_affected_track(); - - if(track) - { - mwindow->undo->update_undo_before(_("projector"), this); - if(event_caller == x) - { - x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto( - track->automation->autos[AUTOMATION_PROJECTOR_X], 1); - if(x_auto) - { - x_auto->set_value(atof(x->get_text())); - update(); - update_preview(); - } - } - else - if(event_caller == y) - { - y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto( - track->automation->autos[AUTOMATION_PROJECTOR_Y], 1); - if(y_auto) - { - y_auto->set_value(atof(y->get_text())); - update(); - update_preview(); - } - } - else - if(event_caller == z) - { - z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto( - track->automation->autos[AUTOMATION_PROJECTOR_Z], 1); - if(z_auto) - { - float zoom = atof(z->get_text()); - 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); - - mwindow->gui->lock_window("CWindowProjectorGUI::handle_event"); - mwindow->gui->draw_overlays(1); - mwindow->gui->unlock_window(); - - update(); - update_preview(); - } - } - mwindow->undo->update_undo_after(_("projector"), LOAD_ALL); - } + if( !track ) return; + mwindow->undo->update_undo_before(_("projector"), this); + if( event_caller == x ) + update_auto(track, AUTOMATION_PROJECTOR_X, x); + else if( event_caller == y ) + update_auto(track, AUTOMATION_PROJECTOR_Y, y); + else if( event_caller == z ) + update_auto(track, AUTOMATION_PROJECTOR_Z, z); + mwindow->undo->update_undo_after(_("projector"), LOAD_ALL); } void CWindowProjectorGUI::update() @@ -1347,28 +1652,48 @@ void CWindowProjectorGUI::update() FloatAuto *y_auto = 0; FloatAuto *z_auto = 0; Track *track = mwindow->cwindow->calculate_affected_track(); + int bg_color = get_resources()->text_background; + int hi_color = bg_color ^ 0x444444; if( track ) { mwindow->cwindow->calculate_affected_autos(track, &x_auto, &y_auto, &z_auto, 0, 0, 0, 0); } - if(x_auto) - x->update(x_auto->get_value()); - if(y_auto) - y->update(y_auto->get_value()); - if(z_auto) { - float value = z_auto->get_value(); - z->update(value); + if( x_auto ) { + int color = (edge || span) && x_auto->curve_mode == FloatAuto::BUMP ? + hi_color : bg_color; + x->get_textbox()->set_back_color(color); + float xvalue = x_auto->get_value(edge); + x->update_gui(xvalue); + } + if( y_auto ) { + int color = (edge || span) && y_auto->curve_mode == FloatAuto::BUMP ? + hi_color : bg_color; + y->get_textbox()->set_back_color(color); + float yvalue = y_auto->get_value(edge); + y->update_gui(yvalue); + } + if( z_auto ) { + int color = (edge || span) && z_auto->curve_mode == FloatAuto::BUMP ? + hi_color : bg_color; + z->get_textbox()->set_back_color(color); + float zvalue = z_auto->get_value(edge); + z->update_gui(zvalue); thread->gui->lock_window("CWindowProjectorGUI::update"); - thread->gui->composite_panel->cpanel_zoom->update(value); + thread->gui->composite_panel->cpanel_zoom->update(zvalue); thread->gui->unlock_window(); } - if( x_auto && y_auto && z_auto ) - { + if( x_auto && y_auto && z_auto ) { t_smooth->check_toggle_state(x_auto, y_auto, z_auto); t_linear->check_toggle_state(x_auto, y_auto, z_auto); + t_tangent->check_toggle_state(x_auto, y_auto, z_auto); + t_free->check_toggle_state(x_auto, y_auto, z_auto); + t_bump->check_toggle_state(x_auto, y_auto, z_auto); } + x->range_text->update_range(); + y->range_text->update_range(); + z->range_text->update_range(); } CWindowProjectorLeft::CWindowProjectorLeft(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y) @@ -1574,6 +1899,8 @@ CWindowProjectorReset::CWindowProjectorReset(MWindow *mwindow, int CWindowProjectorReset::handle_event() { + mwindow->edl->local_session->reset_view_limits(); + CWindowProjectorGUI *gui = (CWindowProjectorGUI *)this->gui; return gui->press(&CWindowCanvas::reset_projector); } @@ -1608,7 +1935,7 @@ int CWindowMaskOnTrack::handle_event() if( k >= 0 ) { track_item = (CWindowMaskItem *)track_items[k]; Track *track = track_item ? mwindow->edl->tracks->get_track_by_id(track_item->id) : 0; - if( track && track->record ) track_id = track->get_id(); + if( track && track->is_armed() ) track_id = track->get_id(); } else track_id = mwindow->cwindow->mask_track_id; @@ -1632,7 +1959,7 @@ void CWindowMaskOnTrack::update_items() for( Track *track=mwindow->edl->tracks->first; track; track=track->next ) { if( track->data_type != TRACK_VIDEO ) continue; MaskAutos *mask_autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK]; - int color = !track->record ? RED : mask_autos->first ? high_color : -1; + int color = !track->is_armed() ? RED : mask_autos->first ? high_color : -1; MaskAuto *mask_auto = (MaskAuto*)mask_autos->default_auto; for( int i=0; color<0 && imasks.size(); ++i ) if( mask_auto->masks[i]->points.size() > 0 ) color = high_color; @@ -1680,7 +2007,7 @@ int CWindowMaskTrackTumbler::do_event(int dir) track_item = items[0]; } Track *track = track_item ? mwindow->edl->tracks->get_track_by_id(track_item->id) : 0; - int track_id = track_item && track && track->record ? track_item->id : -1; + int track_id = track_item && track && track->is_armed() ? track_item->id : -1; gui->mask_on_track->set_back_color(track_id >= 0 ? gui->get_resources()->text_background : gui->get_resources()->text_background_disarmed); @@ -2889,7 +3216,7 @@ void CWindowMaskGUI::update() //printf("CWindowMaskGUI::update 1\n"); get_keyframe(track, autos, keyframe, mask, point, 0); mwindow->cwindow->mask_track_id = track ? track->get_id() : -1; - mask_on_track->set_back_color(!track || track->record ? + mask_on_track->set_back_color(!track || track->is_armed() ? get_resources()->text_background : get_resources()->text_background_disarmed); mask_on_track->update_items(); @@ -3082,7 +3409,7 @@ int CWindowMaskGUI::save_mask(const char *nm) int i = masks.size(); while( --i >= 0 ) { if( strcmp(masks[i]->name, nm) ) continue; - masks.remove_object_number(i); + masks.remove_object_number(i++); } mask = new SubMask(0, -1); strncpy(mask->name, nm, sizeof(mask->name)-1); @@ -3100,7 +3427,7 @@ int CWindowMaskGUI::del_mask(const char *nm) int i = masks.size(); while( --i >= 0 ) { if( strcmp(masks[i]->name, nm) ) continue; - masks.remove_object_number(i); + masks.remove_object_number(i++); } save_masks(masks); masks.remove_all_objects();