X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fcwindowtool.C;h=88a524d7806aa07c98033798c42a827859a93607;hb=6ca0a7892ec6459a54fcb3ba3a223d1ddc5ce402;hp=fb4e895b24e2932f925cca95f8eed168f8ffb234;hpb=8095c6d2685554310e70f32a1274c902188897a4;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/cwindowtool.C b/cinelerra-5.1/cinelerra/cwindowtool.C index fb4e895b..88a524d7 100644 --- a/cinelerra-5.1/cinelerra/cwindowtool.C +++ b/cinelerra-5.1/cinelerra/cwindowtool.C @@ -133,6 +133,7 @@ void CWindowTool::start_tool(int operation) mwindow->edl->session->tool_window = 1; gui->composite_panel->operation[CWINDOW_TOOL_WINDOW]->update(1); } + mwindow->edl->session->tool_window = new_gui ? 1 : 0; update_show_window(); // Signal thread to run next tool GUI @@ -360,7 +361,7 @@ CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int l } CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value) - : BC_TumbleTextBox(gui, (int64_t)value, (int64_t)-65536, (int64_t)65536, x, y, 70, 3) + : BC_TumbleTextBox(gui, (int64_t)value, (int64_t)-65536, (int64_t)65536, x, y, 70) { this->gui = gui; } @@ -372,20 +373,20 @@ int CWindowCoord::handle_event() } -CWindowCropOK::CWindowCropOK(MWindow *mwindow, CWindowToolGUI *gui, int x, int y) - : BC_GenericButton(x, y, _("Do it")) +CWindowCropApply::CWindowCropApply(MWindow *mwindow, CWindowCropGUI *crop_gui, int x, int y) + : BC_GenericButton(x, y, _("Apply")) { this->mwindow = mwindow; - this->gui = gui; + this->crop_gui = crop_gui; } -int CWindowCropOK::handle_event() +int CWindowCropApply::handle_event() { - mwindow->crop_video(); + mwindow->crop_video(crop_gui->crop_mode->mode); return 1; } -int CWindowCropOK::keypress_event() +int CWindowCropApply::keypress_event() { if(get_keypress() == 0xd) { @@ -395,7 +396,50 @@ int CWindowCropOK::keypress_event() return 0; } +const char *CWindowCropOpMode::crop_ops[] = { + N_("Reformat"), + N_("Resize"), + N_("Shrink"), +}; +CWindowCropOpMode::CWindowCropOpMode(MWindow *mwindow, CWindowCropGUI *crop_gui, + int mode, int x, int y) + : BC_PopupMenu(x, y, 140, _(crop_ops[mode]), 1) +{ + this->mwindow = mwindow; + this->crop_gui = crop_gui; + this->mode = mode; +} +CWindowCropOpMode::~CWindowCropOpMode() +{ +} + +void CWindowCropOpMode::create_objects() +{ + for( int id=0,nid=sizeof(crop_ops)/sizeof(crop_ops[0]); idpopup = popup; + this->id = id; +} + +int CWindowCropOpItem::handle_event() +{ + popup->set_text(get_text()); + popup->mode = id; + return popup->handle_event(); +} @@ -430,17 +474,19 @@ void CWindowCropGUI::create_objects() add_subwindow(title = new BC_Title(x, y, _("W:"))); column1 = MAX(column1, title->get_w()); y += pad; - add_subwindow(new CWindowCropOK(mwindow, thread->tool_gui, x, y)); + add_subwindow(new CWindowCropApply(mwindow, this, x, y)); x += column1 + 5; y = 10; x1 = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_x1); x1->create_objects(); + x1->set_boundaries((int64_t)0, (int64_t)65536); y += pad; width = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_x2 - mwindow->edl->session->crop_x1); width->create_objects(); + width->set_boundaries((int64_t)1, (int64_t)65536); x += x1->get_w() + 10; @@ -458,10 +504,19 @@ void CWindowCropGUI::create_objects() y1 = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_y1); y1->create_objects(); + y1->set_boundaries((int64_t)0, (int64_t)65536); y += pad; + height = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_y2 - mwindow->edl->session->crop_y1); height->create_objects(); + height->set_boundaries((int64_t)1, (int64_t)65536); + y += pad; + + add_subwindow(crop_mode = new CWindowCropOpMode(mwindow, this, + CROP_REFORMAT, x, y)); + crop_mode->create_objects(); + unlock_window(); } @@ -807,6 +862,11 @@ void CWindowCameraGUI::create_objects() 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() + 15; + add_subwindow(this->t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y)); + x1 += button->get_w() + 10; + add_subwindow(this->t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y)); y += button->get_h(); x1 = 10; @@ -815,11 +875,10 @@ void CWindowCameraGUI::create_objects() add_subwindow(button = new CWindowCameraMiddle(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowCameraBottom(mwindow, this, x1, y)); -// additional Buttons to control the curve mode of the "current" keyframe x1 += button->get_w() + 15; - add_subwindow(this->t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y)); - x1 += button->get_w(); - add_subwindow(this->t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y)); + add_subwindow(this->add_keyframe = new CWindowCameraAddKeyframe(mwindow, this, x1, y)); + x1 += button->get_w() + 10; + add_subwindow(this->reset = new CWindowCameraReset(mwindow, this, x1, y)); // fill in current auto keyframe values, set toggle states. this->update(); @@ -1139,6 +1198,34 @@ int CWindowCameraBottom::handle_event() return 1; } +CWindowCameraAddKeyframe::CWindowCameraAddKeyframe(MWindow *mwindow, + CWindowToolGUI *gui, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("keyframe_button")) +{ + this->mwindow = mwindow; + this->gui = gui; + set_tooltip(_("Add Keyframe: Shift-F11")); +} + +int CWindowCameraAddKeyframe::handle_event() +{ + return gui->press(&CWindowCanvas::camera_keyframe); +} + +CWindowCameraReset::CWindowCameraReset(MWindow *mwindow, + CWindowToolGUI *gui, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("reset_button")) +{ + this->mwindow = mwindow; + this->gui = gui; + set_tooltip(_("Reset Camera: F11")); +} + +int CWindowCameraReset::handle_event() +{ + return gui->press(&CWindowCanvas::reset_camera); +} + CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread) : CWindowToolGUI(mwindow, @@ -1195,6 +1282,11 @@ void CWindowProjectorGUI::create_objects() 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() + 15; + add_subwindow(this->t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y)); + x1 += button->get_w() + 10; + add_subwindow(this->t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y)); y += button->get_h(); x1 = 10; @@ -1203,12 +1295,10 @@ void CWindowProjectorGUI::create_objects() add_subwindow(button = new CWindowProjectorMiddle(mwindow, this, x1, y)); x1 += button->get_w(); add_subwindow(button = new CWindowProjectorBottom(mwindow, this, x1, y)); - -// additional Buttons to control the curve mode of the "current" keyframe x1 += button->get_w() + 15; - add_subwindow(this->t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y)); - x1 += button->get_w(); - add_subwindow(this->t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y)); + add_subwindow(this->add_keyframe = new CWindowProjectorAddKeyframe(mwindow, this, x1, y)); + x1 += button->get_w() + 10; + add_subwindow(this->reset = new CWindowProjectorReset(mwindow, this, x1, y)); // fill in current auto keyframe values, set toggle states. this->update(); @@ -1486,6 +1576,44 @@ int CWindowProjectorBottom::handle_event() return 1; } +CWindowProjectorAddKeyframe::CWindowProjectorAddKeyframe(MWindow *mwindow, + CWindowToolGUI *gui, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("keyframe_button")) +{ + this->mwindow = mwindow; + this->gui = gui; + set_tooltip(_("Add Keyframe: Shift-F12")); +} + +int CWindowProjectorAddKeyframe::handle_event() +{ + return gui->press(&CWindowCanvas::projector_keyframe); +} + +CWindowProjectorReset::CWindowProjectorReset(MWindow *mwindow, + CWindowToolGUI *gui, int x, int y) + : BC_Button(x, y, mwindow->theme->get_image_set("reset_button")) +{ + this->mwindow = mwindow; + this->gui = gui; + set_tooltip(_("Reset Projector: F12")); +} + +int CWindowProjectorReset::handle_event() +{ + return gui->press(&CWindowCanvas::reset_projector); +} + +int CWindowToolGUI::press(void (CWindowCanvas::*fn)()) +{ + unlock_window(); + CWindowGUI *cw_gui = thread->gui; + cw_gui->lock_window("CWindowGUI::press"); + (cw_gui->canvas->*fn)(); + cw_gui->unlock_window(); + lock_window("CWindowToolGUI::press"); + return 1; +} CWindowMaskOnTrack::CWindowMaskOnTrack(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y, int w, const char *text) @@ -1922,16 +2050,6 @@ int CWindowMaskDelPoint::handle_event() return 1; } -int CWindowMaskDelPoint::keypress_event() -{ - if( get_keypress() == BACKSPACE || - get_keypress() == DELETE ) - return handle_event(); - return 0; -} - - - CWindowMaskAffectedPoint::CWindowMaskAffectedPoint(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y) @@ -2087,7 +2205,7 @@ int CWindowMaskDrawBoundary::handle_event() CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y) - : BC_TumbleTextBox(gui, 0, -FEATHER_MAX, FEATHER_MAX, x, y, 64, 2) + : BC_TumbleTextBox(gui, 0, INT_MIN, INT_MAX, x, y, 64, 2) { this->mwindow = mwindow; this->gui = gui; @@ -2134,7 +2252,6 @@ int CWindowMaskFeather::update_value(float v) if( !gui->mask_enables[i]->get_value() ) continue; SubMask *sub_mask = keyframe->get_submask(i); float feather = sub_mask->feather + change; - bclamp(feather, -FEATHER_MAX, FEATHER_MAX); sub_mask->feather = feather; } #ifdef USE_KEYFRAME_SPANNING @@ -2150,13 +2267,15 @@ int CWindowMaskFeather::update_value(float v) int CWindowMaskFeather::handle_event() { float v = atof(get_text()); + if( fabsf(v) > MAX_FEATHER ) + BC_TumbleTextBox::update((float)(v>=0 ? MAX_FEATHER : -MAX_FEATHER)); gui->feather_slider->update(v); return gui->feather->update_value(v); } CWindowMaskFeatherSlider::CWindowMaskFeatherSlider(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y, int w, float v) - : BC_FSlider(x, y, 0, w, w, -FEATHER_MAX, FEATHER_MAX, v) + : BC_FSlider(x, y, 0, w, w, -FEATHER_MAX-5, FEATHER_MAX+5, v) { this->mwindow = mwindow; this->gui = gui; @@ -2164,6 +2283,7 @@ CWindowMaskFeatherSlider::CWindowMaskFeatherSlider(MWindow *mwindow, timer = new Timer(); stick = 0; last_v = 0; + max = FEATHER_MAX; } CWindowMaskFeatherSlider::~CWindowMaskFeatherSlider() @@ -2173,32 +2293,46 @@ CWindowMaskFeatherSlider::~CWindowMaskFeatherSlider() int CWindowMaskFeatherSlider::handle_event() { + int sticky = 0; float v = get_value(); - if( stick > 0 ) { - int64_t ms = timer->get_difference(); - if( ms < 250 && --stick > 0 ) { - if( get_value() == 0 ) return 1; - update(v = 0); + if( fabsf(v) > MAX_FEATHER ) + v = v>=0 ? MAX_FEATHER : -MAX_FEATHER; + if( stick && timer->get_difference() >= 250 ) + stick = 0; // no events for .25 sec + if( stick && (last_v * (v-last_v)) < 0 ) + stick = 0; // dv changed direction + if( stick ) { + if( --stick > 0 ) { + timer->update(); + update(last_v); + return 1; } - else { - stick = 0; - last_v = v; + if( last_v ) { + max *= 1.25; + if( max > MAX_FEATHER ) max = MAX_FEATHER; + update(get_w(), v=last_v, -max-5, max+5); + button_release_event(); } } - else if( (last_v>=0 && v<0) || (last_v<0 && v>=0) ) { - stick = 16; - v = 0; - } - else - last_v = v; - timer->update(); + else if( v > max ) { v = max; sticky = 24; } + else if( v < -max ) { v = -max; sticky = 24; } + else if( v>=0 ? last_v<0 : last_v>=0 ) { v = 0; sticky = 16; } + if( sticky ) { update(v); stick = sticky; timer->update(); } + last_v = v; gui->feather->BC_TumbleTextBox::update(v); return gui->feather->update_value(v); } int CWindowMaskFeatherSlider::update(float v) { - return BC_FSlider::update(v); + float vv = fabsf(v); + if( vv > MAX_FEATHER ) vv = MAX_FEATHER; + while( max < vv ) max *= 1.25; + return update(get_w(), v, -max-5, max+5); +} +int CWindowMaskFeatherSlider::update(int r, float v, float mn, float mx) +{ + return BC_FSlider::update(r, v, mn, mx); } CWindowMaskFade::CWindowMaskFade(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y) @@ -2597,7 +2731,7 @@ void CWindowMaskGUI::create_objects() } add_subwindow(mask_unclr = new CWindowMaskUnclear(mwindow, this, clr_x, y)); y += mask_enables[0]->get_h() + 2*margin; - add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Presets shapes"))); + add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Preset Shapes"))); y += title_bar->get_h() + margin; add_subwindow(mask_shape_sqr = new CWindowMaskShape(mwindow, this, "mask_prst_sqr_images", MASK_SHAPE_SQUARE, t[0], y, _("Square"))); @@ -2706,7 +2840,6 @@ void CWindowMaskGUI::create_objects() "Shift+LMB: move an end point\n" "Ctrl+LMB: move a control point\n" "Alt+LMB: to drag translate the mask\n" - "Shift+Key Delete: to delete the point\n" "Shift+MMB: Set Pivot Point at pointer\n" "Wheel: rotate around Pivot Point\n" "Shift+Wheel: scale around Pivot Point\n" @@ -3330,7 +3463,7 @@ CWindowMaskDelete::CWindowMaskDelete(MWindow *mwindow, { this->mwindow = mwindow; this->gui = gui; - set_tooltip(_("delete preset")); + set_tooltip(_("Delete preset")); } int CWindowMaskDelete::handle_event() @@ -3614,6 +3747,3 @@ void CWindowRulerGUI::handle_event() { } - - -