X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fcwindowtool.C;h=25c436afb4647b4916b77f979dacdc69fe09467d;hb=aeec663c0a88a7ee81a820e758264050a7c4b37e;hp=9e022d8f114676d9e6f20dcb3caeba7ca3ecd2fd;hpb=a9a62511f2f31cf17307d877ec4e345bf0925aee;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/cwindowtool.C b/cinelerra-5.1/cinelerra/cwindowtool.C index 9e022d8f..25c436af 100644 --- a/cinelerra-5.1/cinelerra/cwindowtool.C +++ b/cinelerra-5.1/cinelerra/cwindowtool.C @@ -1922,16 +1922,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 +2077,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 +2124,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 +2139,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 +2155,7 @@ CWindowMaskFeatherSlider::CWindowMaskFeatherSlider(MWindow *mwindow, timer = new Timer(); stick = 0; last_v = 0; + max = FEATHER_MAX; } CWindowMaskFeatherSlider::~CWindowMaskFeatherSlider() @@ -2173,32 +2165,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 +2603,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 +2712,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" @@ -2810,47 +2815,53 @@ void CWindowMaskGUI::update() void CWindowMaskGUI::handle_event() { - if( event_caller != this->x && - event_caller != this->y ) return; - Track *track; - MaskAuto *keyframe; - MaskAutos *autos; - SubMask *mask; - MaskPoint *point; - get_keyframe(track, autos, keyframe, mask, point, 0); - - mwindow->undo->update_undo_before(_("mask point"), this); - - if( point ) { - float px = atof(x->get_text()); - float py = atof(y->get_text()); - float dx = px - point->x, dy = py - point->y; + int redraw = 0; + if( event_caller == this->focus_x || + event_caller == this->focus_y ) { + redraw = 1; + } + else if( event_caller == this->x || + event_caller == this->y ) { + Track *track; + MaskAuto *keyframe; + MaskAutos *autos; + SubMask *mask; + MaskPoint *point; + get_keyframe(track, autos, keyframe, mask, point, 0); + + mwindow->undo->update_undo_before(_("mask point"), this); + + if( point ) { + float px = atof(x->get_text()); + float py = atof(y->get_text()); + float dx = px - point->x, dy = py - point->y; #ifdef USE_KEYFRAME_SPANNING // Create temp keyframe - MaskAuto temp_keyframe(mwindow->edl, autos); - temp_keyframe.copy_data(keyframe); + MaskAuto temp_keyframe(mwindow->edl, autos); + temp_keyframe.copy_data(keyframe); // Get affected point in temp keyframe - mask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask); + mask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask); #endif - - MaskPoints &points = mask->points; - int gang = gang_point->get_value(); - int k = mwindow->cwindow->gui->affected_point; - int n = gang ? points.size() : k+1; - for( int i=gang? 0 : k; i= points.size() ) continue; - MaskPoint *point = points[i]; - point->x += dx; point->y += dy; - } - + MaskPoints &points = mask->points; + int gang = gang_point->get_value(); + int k = mwindow->cwindow->gui->affected_point; + int n = gang ? points.size() : k+1; + for( int i=gang? 0 : k; i= points.size() ) continue; + MaskPoint *point = points[i]; + point->x += dx; point->y += dy; + } #ifdef USE_KEYFRAME_SPANNING // Commit to spanned keyframes - autos->update_parameter(&temp_keyframe); + autos->update_parameter(&temp_keyframe); #endif + } + mwindow->undo->update_undo_after(_("mask point"), LOAD_AUTOMATION); + redraw = 1; } - update_preview(); - mwindow->undo->update_undo_after(_("mask point"), LOAD_AUTOMATION); + if( redraw ) + update_preview(); } void CWindowMaskGUI::set_focused(int v, float cx, float cy) @@ -3324,7 +3335,7 @@ CWindowMaskDelete::CWindowMaskDelete(MWindow *mwindow, { this->mwindow = mwindow; this->gui = gui; - set_tooltip(_("delete preset")); + set_tooltip(_("Delete preset")); } int CWindowMaskDelete::handle_event()