add bump floatautos, add time_references for align timecodes, add menuitem create_key...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / apatchgui.C
index 59d18244c34260c9f4d26a1874f86bc22234d112..3960dda8c67b9c01841d19bf6d38c3698e9dbd37 100644 (file)
@@ -182,14 +182,12 @@ void APatchGUI::update_faders(float v)
        double position = mwindow->edl->local_session->get_selectionstart(1);
        Autos *fade_autos = atrack->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);
-
+       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_AUDIO, track);
+               patchbay->synchronize_faders(change, TRACK_AUDIO, track, edge, span);
        mwindow->undo->update_undo_after(_("fade"), LOAD_AUTOMATION);
        change_source = 0;
 
@@ -220,33 +218,64 @@ int AFadePatch::handle_event()
        return 1;
 }
 
-AKeyFadePatch::AKeyFadePatch(MWindow *mwindow, APatchGUI *patch, int x, int y)
- : BC_SubWindow(x,y, xS(200),yS(20), GWindowGUI::auto_colors[AUTOMATION_FADE])
+AKeyFadePatch::AKeyFadePatch(MWindow *mwindow, APatchGUI *gui,
+                       int bump, int x, int y)
+ : BC_SubWindow(x,y, xS(200)+4,yS(bump ? 50 : 24)+4,
+               GWindowGUI::auto_colors[AUTOMATION_FADE])
 {
        this->mwindow = mwindow;
-       this->patch = patch;
+       this->gui = gui;
+}
+AKeyFadePatch::~AKeyFadePatch()
+{
 }
 
 void AKeyFadePatch::create_objects()
 {
-       int x = 0, y = 0;
-       float v = mwindow->get_float_auto(patch, AUTOMATION_FADE)->get_value();
+       int x = 2, x1 = x, y = 0, dy = 0;
+       FloatAuto *fade_auto = mwindow->get_float_auto(gui, AUTOMATION_FADE);
+       float v = fade_auto->get_value(gui->edge);
        add_subwindow(akey_fade_text = new AKeyFadeText(this, x, y, xS(64), v));
        x += akey_fade_text->get_w();
+       dy = bmax(dy, akey_fade_text->get_h());
        VFrame **lok_images = mwindow->theme->get_image_set("lok");
-       int w1 = get_w() - x - lok_images[0]->get_w();
+       int w1 = get_w()-2 - x - lok_images[0]->get_w();
        add_subwindow(akey_fade_slider = new AKeyFadeSlider(this, x, y, w1, v));
        x += akey_fade_slider->get_w();
+       dy = bmax(dy, akey_fade_slider->get_h());
        add_subwindow(akey_fade_ok = new AKeyFadeOK(this, x, y, lok_images));
+       dy = bmax(dy, akey_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 AKeyPatchAutoEdge(mwindow, this, x1, y));
+               x1 += auto_edge->get_w() + xS(15);
+               add_subwindow(auto_span = new AKeyPatchAutoSpan(mwindow, this, x1, y));
+       }
+       draw_3d_border(0,0, get_w(), get_h(), 0);
        activate();
        show_window();
 }
 
+void AKeyFadePatch::set_edge(int edge)
+{
+       gui->edge = edge;
+       FloatAuto *fade_auto = mwindow->get_float_auto(gui, AUTOMATION_FADE);
+       float v = fade_auto->get_value(edge);
+       update(v);
+}
+
+void AKeyFadePatch::set_span(int span)
+{
+       gui->span = span;
+}
+
 void AKeyFadePatch::update(float v)
 {
        akey_fade_text->update(v);
        akey_fade_slider->update(v);
-       patch->update_faders(v);
+       gui->update_faders(v);
 }
 
 AKeyFadeOK::AKeyFadeOK(AKeyFadePatch *akey_fade_patch, int x, int y, VFrame **images)
@@ -257,9 +286,8 @@ AKeyFadeOK::AKeyFadeOK(AKeyFadePatch *akey_fade_patch, int x, int y, VFrame **im
 
 int AKeyFadeOK::handle_event()
 {
-       MWindowGUI *mgui = akey_fade_patch->mwindow->gui;
-       delete mgui->keyvalue_popup;
-       mgui->keyvalue_popup = 0;
+       MWindow *mwindow = akey_fade_patch->mwindow;
+       mwindow->gui->close_keyvalue_popup();
        return 1;
 }
 
@@ -278,7 +306,7 @@ int AKeyFadeText::handle_event()
 }
 
 AKeyFadeSlider::AKeyFadeSlider(AKeyFadePatch *akey_fade_patch, int x, int y, int w, float v)
- : AFadePatch(akey_fade_patch->patch, x, y, w, v)
+ : AFadePatch(akey_fade_patch->gui, x, y, w, v)
 {
        this->akey_fade_patch = akey_fade_patch;
 }
@@ -310,19 +338,13 @@ int APanPatch::handle_event()
        double position = mwindow->edl->local_session->get_selectionstart(1);
        Autos *pan_autos = patch->atrack->automation->autos[AUTOMATION_PAN];
        int need_undo = !pan_autos->auto_exists_for_editing(position);
-
        mwindow->undo->update_undo_before(_("pan"), need_undo ? 0 : this);
-
        current = (PanAuto*)pan_autos->get_auto_for_editing(position);
-
        current->handle_x = get_stick_x();
        current->handle_y = get_stick_y();
        memcpy(current->values, get_values(), sizeof(float) * mwindow->edl->session->audio_channels);
-
        mwindow->undo->update_undo_after(_("pan"), LOAD_AUTOMATION);
-
        mwindow->sync_parameters(CHANGE_PARAMS);
-
        if( need_undo && mwindow->edl->session->auto_conf->autos[AUTOMATION_PAN] ) {
                mwindow->gui->draw_overlays(1);
        }
@@ -374,3 +396,35 @@ AMixPatch::~AMixPatch()
 {
 }
 
+AKeyPatchAutoEdge::AKeyPatchAutoEdge(MWindow *mwindow,
+               AKeyFadePatch *patch, int x, int y)
+ : BC_Toggle(x, y, mwindow->theme->get_image_set("bump_edge"),
+                patch->gui->span,_("Edge"))
+{
+       this->mwindow = mwindow;
+       this->patch = patch;
+       set_tooltip(_("Bump uses left edge"));
+}
+
+int AKeyPatchAutoEdge::handle_event()
+{
+       patch->set_edge(get_value());
+       return 1;
+}
+
+AKeyPatchAutoSpan::AKeyPatchAutoSpan(MWindow *mwindow,
+               AKeyFadePatch *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 AKeyPatchAutoSpan::handle_event()
+{
+       patch->set_span(get_value());
+       return 1;
+}
+