+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();