X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvpatchgui.C;h=cab73d7991dc39f099008edd7fd06bdd58669d4a;hb=a6b1f3c0c5c17c3a26758abc46bcb46100308c66;hp=5fa6eb94355e40854b483fca6637c6221de9f0ae;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/vpatchgui.C b/cinelerra-5.1/cinelerra/vpatchgui.C index 5fa6eb94..cab73d79 100644 --- a/cinelerra-5.1/cinelerra/vpatchgui.C +++ b/cinelerra-5.1/cinelerra/vpatchgui.C @@ -96,7 +96,12 @@ int VPatchGUI::update(int x, int y) delete fade; fade = 0; } else { - fade->update(fade->get_w(), mwindow->get_float_auto(this, AUTOMATION_FADE)->get_value(), + FloatAuto *previous = 0, *next = 0; + double unit_position = mwindow->edl->local_session->get_selectionstart(1); + int64_t unit_pos = vtrack->to_units(unit_position, 0); + FloatAutos *ptr = (FloatAutos*)track->automation->autos[AUTOMATION_FADE]; + float value = ptr->get_value(unit_pos, PLAY_FORWARD, previous, next); + fade->update(fade->get_w(), value, mwindow->edl->local_session->automation_mins[AUTOGROUPTYPE_VIDEO_FADE], mwindow->edl->local_session->automation_maxs[AUTOGROUPTYPE_VIDEO_FADE]); } @@ -104,7 +109,7 @@ int VPatchGUI::update(int x, int y) else if( h >= y2 ) { int64_t v = mwindow->get_float_auto(this, AUTOMATION_FADE)->get_value(); patchbay->add_subwindow(fade = new VFadePatch(this, x1+x, y1+y, - patchbay->get_w() - 10, v)); + patchbay->get_w() - xS(10), v)); } y1 = y2; @@ -125,13 +130,13 @@ int VPatchGUI::update(int x, int y) } } else if( h >= y2 ) { - patchbay->add_subwindow(mix = new VMixPatch(mwindow, this, x1+x, y1+y+5)); + patchbay->add_subwindow(mix = new VMixPatch(mwindow, this, x1+x, y1+y+yS(5))); x1 += mix->get_w(); patchbay->add_subwindow(mode = new VModePatch(mwindow, this, x1+x, y1+y)); mode->create_objects(); x1 += mode->get_w(); patchbay->add_subwindow(nudge = new NudgePatch(mwindow, this, x1+x, y1+y, - patchbay->get_w() - x1-x - 10)); + patchbay->get_w() - x1-x - xS(10))); } y1 = y2; @@ -156,14 +161,12 @@ void VPatchGUI::update_faders(float v) double position = mwindow->edl->local_session->get_selectionstart(1); Autos *fade_autos = vtrack->automation->autos[AUTOMATION_FADE]; int need_undo = !fade_autos->auto_exists_for_editing(position); - mwindow->undo->update_undo_before(_("fade"), need_undo ? 0 : this); FloatAuto *current = (FloatAuto*)fade_autos->get_auto_for_editing(position); - float change = v - current->get_value(); - current->set_value(v); - - if( track->gang && track->record ) - patchbay->synchronize_faders(change, TRACK_AUDIO, track); + float change = v - current->get_value(edge); + current->bump_value(v, edge, span); + if( track->is_ganged() && track->is_armed() ) + patchbay->synchronize_faders(change, TRACK_VIDEO, track, edge, span); mwindow->undo->update_undo_after(_("fade"), LOAD_AUTOMATION); change_source = 0; @@ -184,33 +187,64 @@ int VFadePatch::handle_event() return 1; } -VKeyFadePatch::VKeyFadePatch(MWindow *mwindow, VPatchGUI *patch, int x, int y) - : BC_SubWindow(x,y, 200,20, GWindowGUI::auto_colors[AUTOMATION_FADE]) +VKeyFadePatch::VKeyFadePatch(MWindow *mwindow, VPatchGUI *gui, + int bump, int x, int y) + : BC_SubWindow(x,y, xS(200),yS(bump ? 50 : 24), + GWindowGUI::auto_colors[AUTOMATION_FADE]) { this->mwindow = mwindow; - this->patch = patch; + this->gui = gui; +} +VKeyFadePatch::~VKeyFadePatch() +{ } void VKeyFadePatch::create_objects() { - int x = 0, y = 0; - int64_t v = mwindow->get_float_auto(patch, AUTOMATION_FADE)->get_value(); - add_subwindow(vkey_fade_text = new VKeyFadeText(this, x, y, 64, v)); + int x = 0, x1 = x, y = 0, dy = 0; + FloatAuto *fade_auto = mwindow->get_float_auto(gui, AUTOMATION_FADE); + int64_t v = fade_auto->get_value(gui->edge); + add_subwindow(vkey_fade_text = new VKeyFadeText(this, x, y, xS(64), v)); x += vkey_fade_text->get_w(); + dy = bmax(dy, vkey_fade_text->get_h()); VFrame **lok_images = mwindow->theme->get_image_set("lok"); int w1 = get_w() - x - lok_images[0]->get_w(); add_subwindow(vkey_fade_slider = new VKeyFadeSlider(this, x, y, w1, v)); x += vkey_fade_slider->get_w(); + dy = bmax(dy, vkey_fade_slider->get_h()); add_subwindow(vkey_fade_ok = new VKeyFadeOK(this, x, y, lok_images)); + dy = bmax(dy, vkey_fade_ok->get_h()); + if( fade_auto->is_bump() ) { + y += dy; + set_color(get_resources()->get_bg_color()); + draw_box(0,y, get_w(),get_h()); + add_subwindow(auto_edge = new VKeyPatchAutoEdge(mwindow, this, x1, y)); + x1 += auto_edge->get_w() + xS(15); + add_subwindow(auto_span = new VKeyPatchAutoSpan(mwindow, this, x1, y)); + } + draw_3d_border(0,0, get_w(), get_h(), 0); activate(); show_window(); } +void VKeyFadePatch::set_edge(int edge) +{ + gui->edge = edge; + FloatAuto *fade_auto = mwindow->get_float_auto(gui, AUTOMATION_FADE); + int64_t v = fade_auto->get_value(edge); + update(v); +} + +void VKeyFadePatch::set_span(int span) +{ + gui->span = span; +} + void VKeyFadePatch::update(int64_t v) { vkey_fade_text->update(v); vkey_fade_slider->update(v); - patch->update_faders(v); + gui->update_faders(v); } VKeyFadeOK::VKeyFadeOK(VKeyFadePatch *vkey_fade_patch, int x, int y, VFrame **images) @@ -221,9 +255,8 @@ VKeyFadeOK::VKeyFadeOK(VKeyFadePatch *vkey_fade_patch, int x, int y, VFrame **im int VKeyFadeOK::handle_event() { - MWindowGUI *mgui = vkey_fade_patch->mwindow->gui; - delete mgui->keyvalue_popup; - mgui->keyvalue_popup = 0; + MWindow *mwindow = vkey_fade_patch->mwindow; + mwindow->gui->close_keyvalue_popup(); return 1; } @@ -243,7 +276,7 @@ int VKeyFadeText::handle_event() VKeyFadeSlider::VKeyFadeSlider(VKeyFadePatch *vkey_fade_patch, int x, int y, int w, int64_t v) - : VFadePatch(vkey_fade_patch->patch, x,y, w, v) + : VFadePatch(vkey_fade_patch->gui, x,y, w, v) { this->vkey_fade_patch = vkey_fade_patch; } @@ -257,8 +290,8 @@ int VKeyFadeSlider::handle_event() VModePatch::VModePatch(MWindow *mwindow, VPatchGUI *patch, int x, int y) - : BC_PopupMenu(x, y, patch->patchbay->mode_icons[0]->get_w() + 20, - "", 1, mwindow->theme->get_image_set("mode_popup", 0), 10) + : BC_PopupMenu(x, y, patch->patchbay->mode_icons[0]->get_w() + xS(20), + "", 1, mwindow->theme->get_image_set("mode_popup", 0), 0) { this->mwindow = mwindow; this->patch = patch; @@ -294,14 +327,10 @@ int VModePatch::handle_event() double position = mwindow->edl->local_session->get_selectionstart(1); Autos *mode_autos = patch->vtrack->automation->autos[AUTOMATION_MODE]; int need_undo = !mode_autos->auto_exists_for_editing(position); - mwindow->undo->update_undo_before(_("mode"), need_undo ? 0 : this); - current = (IntAuto*)mode_autos->get_auto_for_editing(position); current->value = mode; - mwindow->undo->update_undo_after(_("mode"), LOAD_AUTOMATION); - mwindow->sync_parameters(CHANGE_PARAMS); if( mwindow->edl->session->auto_conf->autos[AUTOMATION_MODE] ) { @@ -484,3 +513,35 @@ VMixPatch::~VMixPatch() { } +VKeyPatchAutoEdge::VKeyPatchAutoEdge(MWindow *mwindow, + VKeyFadePatch *patch, int x, int y) + : BC_Toggle(x, y, mwindow->theme->get_image_set("bump_edge"), + patch->gui->edge,_("Edge")) +{ + this->mwindow = mwindow; + this->patch = patch; + set_tooltip(_("Bump uses left edge")); +} + +int VKeyPatchAutoEdge::handle_event() +{ + patch->set_edge(get_value()); + return 1; +} + +VKeyPatchAutoSpan::VKeyPatchAutoSpan(MWindow *mwindow, + VKeyFadePatch *patch, int x, int y) + : BC_Toggle(x, y, mwindow->theme->get_image_set("bump_span"), + patch->gui->span,_("Span")) +{ + this->mwindow = mwindow; + this->patch = patch; + set_tooltip(_("Bump spans to next")); +} + +int VKeyPatchAutoSpan::handle_event() +{ + patch->set_span(get_value()); + return 1; +} +