splashgui text clr, faders/speed keyframe popup slider rework, reticle rework
[goodguy/history.git] / cinelerra-5.1 / cinelerra / keyframepopup.C
index cef8b2701a62e2aaeaba0f724d493f3426242d65..362e51e804031be158d68f80661aea4ba2a413e0 100644 (file)
@@ -34,6 +34,7 @@
 #include "gwindow.h"
 #include "gwindowgui.h"
 #include "intauto.h"
+#include "keys.h"
 #include "keyframe.h"
 #include "keyframepopup.h"
 #include "language.h"
@@ -45,6 +46,7 @@
 #include "mwindow.h"
 #include "patchbay.h"
 #include "patchgui.h"
+#include "theme.h"
 #include "timelinepane.h"
 #include "track.h"
 #include "vtrack.h"
@@ -571,13 +573,18 @@ KeyMuteValue::KeyMuteValue(KeyMutePatch *key_mute_patch)
 int KeyMuteValue::button_release_event()
 {
        BC_CheckBox::button_release_event();
-       return 0;
+       MWindowGUI *mgui = key_mute_patch->mwindow->gui;
+       delete mgui->keyvalue_popup;
+       mgui->keyvalue_popup = 0;
+       return 1;
 }
 
-void KeyMuteValue::update_edl()
+int KeyMuteValue::handle_event()
 {
        MWindow *mwindow = key_mute_patch->mwindow;
        PatchGUI *patch = key_mute_patch->patch;
+
+       patch->change_source = 1;
        double position = mwindow->edl->local_session->get_selectionstart(1);
        Autos *mute_autos = patch->track->automation->autos[AUTOMATION_MUTE];
        int need_undo = !mute_autos->auto_exists_for_editing(position);
@@ -585,17 +592,10 @@ void KeyMuteValue::update_edl()
        IntAuto *current = (IntAuto*)mute_autos->get_auto_for_editing(position);
        current->value = this->get_value();
        mwindow->undo->update_undo_after(_("mute"), LOAD_AUTOMATION);
-}
-
-int KeyMuteValue::handle_event()
-{
-       MWindow *mwindow = key_mute_patch->mwindow;
-       PatchGUI *patch = key_mute_patch->patch;
-       patch->change_source = 1;
-       update_edl();
        patch->change_source = 0;
+
        mwindow->sync_parameters(CHANGE_PARAMS);
-       if(mwindow->edl->session->auto_conf->autos[AUTOMATION_MUTE]) {
+       if( mwindow->edl->session->auto_conf->autos[AUTOMATION_MUTE] ) {
                mwindow->gui->update_patchbay();
                mwindow->gui->draw_overlays(1);
        }
@@ -611,64 +611,115 @@ KeySpeedPatch::KeySpeedPatch(MWindow *mwindow, PatchGUI *patch, int x, int y)
 
 void KeySpeedPatch::create_objects()
 {
-       key_speed_slider = new KeySpeedValue(this);
-       add_subwindow(key_speed_slider);
-       key_speed_slider->activate();
+       int x = 0, y = 0;
+       float v = mwindow->get_float_auto(patch, AUTOMATION_SPEED)->get_value();
+       add_subwindow(key_speed_text = new KeySpeedText(this, x, y, 64, v));
+       x += key_speed_text->get_w();
+       VFrame **lok_images = mwindow->theme->get_image_set("lok");
+       int w1 = get_w() - x - lok_images[0]->get_w();
+       add_subwindow(key_speed_slider = new KeySpeedSlider(this, x, y, w1, v));
+       x += key_speed_slider->get_w();
+       add_subwindow(key_speed_ok = new KeySpeedOK(this, x, y, lok_images));
+       activate();
        show_window();
 }
 
-KeySpeedValue::KeySpeedValue(KeySpeedPatch *key_speed_patch)
- : BC_FSlider(0,0, 0, key_speed_patch->get_w(), key_speed_patch->get_w(),
-       key_speed_patch->mwindow->edl->local_session->automation_mins[AUTOGROUPTYPE_SPEED],
-       key_speed_patch->mwindow->edl->local_session->automation_maxs[AUTOGROUPTYPE_SPEED],
-       key_speed_patch->mwindow->get_float_auto(key_speed_patch->patch, AUTOMATION_SPEED)->get_value())
+int KeySpeedPatch::cursor_enter_event()
 {
-       this->key_speed_patch = key_speed_patch;
-       key_speed_patch->mwindow->speed_before();
-       set_precision(0.01);
+       if( is_event_win() )
+               mwindow->speed_before();
+       return 1;
 }
 
-KeySpeedValue::~KeySpeedValue()
+int KeySpeedPatch::cursor_leave_event()
 {
+       if( is_event_win() ) {
+               mwindow->speed_after(1);
+               mwindow->resync_guis();
+       }
+       return 1;
 }
 
-int KeySpeedValue::button_release_event()
+void KeySpeedPatch::update(float v)
 {
-       BC_FSlider::button_release_event();
-       key_speed_patch->mwindow->speed_after(1);
-       key_speed_patch->mwindow->resync_guis();
-       return 0;
+       key_speed_text->update(v);
+       key_speed_slider->update(v);
+       update_speed(v);
 }
 
-void KeySpeedValue::update_edl()
+void KeySpeedPatch::update_speed(float v)
 {
-       MWindow *mwindow = key_speed_patch->mwindow;
-       PatchGUI *patch = key_speed_patch->patch;
+       patch->change_source = 1;
        double position = mwindow->edl->local_session->get_selectionstart(1);
        Autos *speed_autos = patch->track->automation->autos[AUTOMATION_SPEED];
        int need_undo = !speed_autos->auto_exists_for_editing(position);
+
        mwindow->undo->update_undo_before(_("speed"), need_undo ? 0 : this);
        FloatAuto *current = (FloatAuto*)speed_autos->get_auto_for_editing(position);
-       current->set_value(get_value());
+       current->set_value(v);
        mwindow->undo->update_undo_after(_("speed"), LOAD_AUTOMATION+LOAD_EDITS);
+       patch->change_source = 0;
+
+       mwindow->sync_parameters(CHANGE_PARAMS);
+       if(mwindow->edl->session->auto_conf->autos[AUTOMATION_SPEED]) {
+               mwindow->gui->draw_overlays(1);
+       }
 }
 
-int KeySpeedValue::handle_event()
+KeySpeedOK::KeySpeedOK(KeySpeedPatch *key_speed_patch, int x, int y, VFrame **images)
+ : BC_Button(x, y, images)
+{
+       this->key_speed_patch = key_speed_patch;
+}
+
+int KeySpeedOK::handle_event()
 {
        MWindow *mwindow = key_speed_patch->mwindow;
-       PatchGUI *patch = key_speed_patch->patch;
+       mwindow->speed_after(1);
+       mwindow->resync_guis();
+       MWindowGUI *mgui = mwindow->gui;
+       delete mgui->keyvalue_popup;
+       mgui->keyvalue_popup = 0;
+       return 1;
+}
+
+KeySpeedText::KeySpeedText(KeySpeedPatch *key_speed_patch, int x, int y, int w, float v)
+ : BC_TextBox(x, y, w, 1, v, 1, MEDIUMFONT, 2)
+{
+       this->key_speed_patch = key_speed_patch;
+}
+
+int KeySpeedText::handle_event()
+{
+       float v = atof(get_text());
+       key_speed_patch->update(v);
+       return get_keypress() != RETURN ? 1 :
+               key_speed_patch->key_speed_ok->handle_event();
+}
+
+KeySpeedSlider::KeySpeedSlider(KeySpeedPatch *key_speed_patch,
+               int x, int y, int w, float v)
+ : BC_FSlider(x, y, 0, w, w,
+       key_speed_patch->mwindow->edl->local_session->automation_mins[AUTOGROUPTYPE_SPEED],
+       key_speed_patch->mwindow->edl->local_session->automation_maxs[AUTOGROUPTYPE_SPEED],
+       v)
+{
+       this->key_speed_patch = key_speed_patch;
+       key_speed_patch->mwindow->speed_before();
+       set_precision(0.01);
+}
+
+KeySpeedSlider::~KeySpeedSlider()
+{
+}
+
+int KeySpeedSlider::handle_event()
+{
        if( shift_down() ) {
                update(1.0);
                set_tooltip(get_caption());
        }
-
-       patch->change_source = 1;
-       update_edl();
-       patch->change_source = 0;
-       mwindow->sync_parameters(CHANGE_PARAMS);
-       if(mwindow->edl->session->auto_conf->autos[AUTOMATION_SPEED]) {
-               mwindow->gui->draw_overlays(1);
-       }
+       key_speed_patch->update(get_value());
        return 1;
 }