+KeyframeHidePopup::KeyframeHidePopup(MWindow *mwindow, MWindowGUI *gui)
+ : BC_PopupMenu(0, 0, 0, "", 0)
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ this->keyframe_autos = 0;
+}
+
+KeyframeHidePopup::~KeyframeHidePopup()
+{
+}
+
+void KeyframeHidePopup::create_objects()
+{
+ add_item(new KeyframeHideItem(mwindow, this));
+}
+
+int KeyframeHidePopup::update(Autos *autos)
+{
+ this->keyframe_autos = autos;
+ return 0;
+}
+
+KeyframeHideItem::KeyframeHideItem(MWindow *mwindow, KeyframeHidePopup *popup)
+ : BC_MenuItem(_("Hide keyframe type"))
+{
+ this->mwindow = mwindow;
+ this->popup = popup;
+}
+
+
+int KeyframeHideItem::handle_event()
+{
+ if( popup->keyframe_autos )
+ mwindow->set_auto_visibility(popup->keyframe_autos, 0);
+ return 1;
+}
+
+
+
+KeyMutePatch::KeyMutePatch(MWindow *mwindow, PatchGUI *patch, int x, int y)
+ : BC_SubWindow(x, y, 100, 20, GWindowGUI::auto_colors[AUTOMATION_MUTE])
+{
+ this->mwindow = mwindow;
+ this->patch = patch;
+}
+
+void KeyMutePatch::create_objects()
+{
+ key_mute_checkbox = new KeyMuteValue(this);
+ add_subwindow(key_mute_checkbox);
+ key_mute_checkbox->activate();
+ show_window();
+}
+
+KeyMuteValue::KeyMuteValue(KeyMutePatch *key_mute_patch)
+ : BC_CheckBox(0,0, key_mute_patch->mwindow->
+ get_int_auto(key_mute_patch->patch, AUTOMATION_MUTE)->value,
+ _("Mute"), MEDIUMFONT, RED)
+{
+ this->key_mute_patch = key_mute_patch;
+}
+
+int KeyMuteValue::button_release_event()
+{
+ BC_CheckBox::button_release_event();
+ MWindowGUI *mgui = key_mute_patch->mwindow->gui;
+ delete mgui->keyvalue_popup;
+ mgui->keyvalue_popup = 0;
+ return 1;
+}
+
+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);
+ mwindow->undo->update_undo_before(_("mute"), need_undo ? 0 : this);
+ IntAuto *current = (IntAuto*)mute_autos->get_auto_for_editing(position);
+ current->value = this->get_value();
+ mwindow->undo->update_undo_after(_("mute"), LOAD_AUTOMATION);
+ patch->change_source = 0;
+
+ mwindow->sync_parameters(CHANGE_PARAMS);
+ if( mwindow->edl->session->auto_conf->autos[AUTOMATION_MUTE] ) {
+ mwindow->gui->update_patchbay();
+ mwindow->gui->draw_overlays(1);
+ }
+ return 1;
+}
+
+KeySpeedPatch::KeySpeedPatch(MWindow *mwindow, PatchGUI *patch, int x, int y)
+ : BC_SubWindow(x,y, 200,20, GWindowGUI::auto_colors[AUTOMATION_SPEED])
+{
+ this->mwindow = mwindow;
+ this->patch = patch;
+}
+
+void KeySpeedPatch::create_objects()
+{
+ 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();
+}
+
+int KeySpeedPatch::cursor_enter_event()
+{
+ if( is_event_win() )
+ mwindow->speed_before();
+ return 1;
+}
+
+int KeySpeedPatch::cursor_leave_event()
+{
+ if( is_event_win() ) {
+ mwindow->speed_after(1);
+ mwindow->resync_guis();
+ }
+ return 1;
+}
+
+void KeySpeedPatch::update(float v)
+{
+ key_speed_text->update(v);
+ key_speed_slider->update(v);
+ update_speed(v);
+}
+
+void KeySpeedPatch::update_speed(float v)
+{
+ patch->change_source = 1;
+ double position = mwindow->edl->local_session->get_selectionstart(1);
+ Track *track = patch->track;
+ Autos *speed_autos = 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);
+ float change = v - current->get_value();
+ current->set_value(v);
+ if( track->gang && track->record ) {
+ TrackCanvas *track_canvas = patch->patchbay->pane->canvas;
+ track_canvas->fill_ganged_autos(1, change, track, current);
+ track_canvas->update_ganged_autos(0, track, current);
+ track_canvas->clear_ganged_autos();
+ }
+ 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);
+ }
+}
+
+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;
+ 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());
+ }
+ key_speed_patch->update(get_value());
+ return 1;
+}