From 812e95da016e334b8856b24aba14db809da3f774 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 20 Aug 2010 12:01:13 +0000 Subject: Allow drag when creating a MIDI region. Fixes #3363. git-svn-id: svn://localhost/ardour2/branches/3.0@7657 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_drag.cc | 43 ++++++++++++++++-------------------------- gtk2_ardour/editor_drag.h | 8 ++++---- gtk2_ardour/editor_mouse.cc | 10 +++++++--- gtk2_ardour/midi_streamview.cc | 2 +- gtk2_ardour/midi_time_axis.cc | 11 +++++------ gtk2_ardour/midi_time_axis.h | 2 +- gtk2_ardour/step_editor.cc | 7 ++++++- 7 files changed, 40 insertions(+), 43 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 09d43fe300..d4b918adf2 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1523,51 +1523,40 @@ RegionSpliceDrag::aborted () RegionCreateDrag::RegionCreateDrag (Editor* e, ArdourCanvas::Item* i, TimeAxisView* v) : Drag (e, i), - _view (v) + _view (dynamic_cast (v)) { - + assert (_view); } void -RegionCreateDrag::start_grab (GdkEvent* event, Gdk::Cursor *) -{ - _dest_trackview = _view; - - Drag::start_grab (event); -} - - -void -RegionCreateDrag::motion (GdkEvent* /*event*/, bool first_move) +RegionCreateDrag::motion (GdkEvent *, bool first_move) { if (first_move) { - // TODO: create region-create-drag region view here - } + /* don't use a zero-length region otherwise its region view will be hidden when it is created */ + _region = _view->add_region (grab_frame(), 1, false); + } else { + if (_drags->current_pointer_frame() < grab_frame()) { + _region->set_position (_drags->current_pointer_frame(), this); + } - // TODO: resize region-create-drag region view here + /* again, don't use a zero-length region (see above) */ + framecnt_t const len = abs (_drags->current_pointer_frame() - grab_frame ()); + _region->set_length (len < 1 ? 1 : len, this); + } } void RegionCreateDrag::finished (GdkEvent* event, bool movement_occurred) { - MidiTimeAxisView* mtv = dynamic_cast (_dest_trackview); - - if (!mtv) { - return; - } - - if (!movement_occurred) { - mtv->add_region (grab_frame ()); - } else { - motion (event, false); - // TODO: create region-create-drag region here + if (movement_occurred) { + _editor->commit_reversible_command (); } } void RegionCreateDrag::aborted () { - /* XXX: TODO */ + /* XXX */ } NoteResizeDrag::NoteResizeDrag (Editor* e, ArdourCanvas::Item* i) diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index fc04f83b3d..d710e3a639 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -44,6 +44,7 @@ namespace Gnome { class Editor; class EditorCursor; class TimeAxisView; +class MidiTimeAxisView; class Drag; /** Class to manage current drags */ @@ -180,7 +181,7 @@ protected: return _grab_y; } - double grab_frame () const { + ARDOUR::framepos_t grab_frame () const { return _grab_frame; } @@ -348,14 +349,13 @@ class RegionCreateDrag : public Drag public: RegionCreateDrag (Editor *, ArdourCanvas::Item *, TimeAxisView *); - void start_grab (GdkEvent *, Gdk::Cursor* c = 0); void motion (GdkEvent *, bool); void finished (GdkEvent *, bool); void aborted (); private: - TimeAxisView* _view; - TimeAxisView* _dest_trackview; + MidiTimeAxisView* _view; + boost::shared_ptr _region; }; /** Drags to resize MIDI notes */ diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 58ef93bd37..b54fe21c0d 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -683,8 +683,10 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case StreamItem: if (internal_editing()) { - _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); - return true; + if (dynamic_cast (clicked_axisview)) { + _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); + return true; + } } else { _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event); return true; @@ -812,7 +814,9 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case StreamItem: if (internal_editing()) { - _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); + if (dynamic_cast (clicked_axisview)) { + _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); + } return true; } else { _drags->set (new RubberbandSelectDrag (this, item), event); diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index cf58224766..3bd46959de 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -136,7 +136,7 @@ MidiStreamView::create_region_view (boost::shared_ptr r, bool /*wfd*/, b RegionView* region_view = new MidiRegionView (_canvas_group, _trackview, region, _samples_per_unit, region_color); - + region_view->init (region_color, false); return region_view; diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index 41b811c97d..5979e315a8 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -1004,7 +1004,7 @@ MidiTimeAxisView::automation_child_menu_item (Evoral::Parameter param) } boost::shared_ptr -MidiTimeAxisView::add_region (framepos_t pos) +MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit) { Editor* real_editor = dynamic_cast (&_editor); @@ -1012,10 +1012,7 @@ MidiTimeAxisView::add_region (framepos_t pos) playlist()->clear_history (); real_editor->snap_to (pos, 0); - const Meter& m = _session->tempo_map().meter_at(pos); - const Tempo& t = _session->tempo_map().tempo_at(pos); - double length = floor (m.frames_per_bar(t, _session->frame_rate())); - + boost::shared_ptr src = _session->create_midi_source_for_session (view()->trackview().track().get(), view()->trackview().track()->name()); PropertyList plist; @@ -1029,7 +1026,9 @@ MidiTimeAxisView::add_region (framepos_t pos) playlist()->add_region (region, pos); _session->add_command (new StatefulDiffCommand (playlist())); - real_editor->commit_reversible_command(); + if (commit) { + real_editor->commit_reversible_command (); + } return boost::dynamic_pointer_cast(region); } diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h index 73c48f2613..748f6ebbe6 100644 --- a/gtk2_ardour/midi_time_axis.h +++ b/gtk2_ardour/midi_time_axis.h @@ -69,7 +69,7 @@ class MidiTimeAxisView : public RouteTimeAxisView void set_height (uint32_t); void hide (); - boost::shared_ptr add_region (ARDOUR::framepos_t pos); + boost::shared_ptr add_region (ARDOUR::framepos_t, ARDOUR::framecnt_t, bool); void show_all_automation (); void show_existing_automation (); diff --git a/gtk2_ardour/step_editor.cc b/gtk2_ardour/step_editor.cc index f94c4ca989..481c60d7aa 100644 --- a/gtk2_ardour/step_editor.cc +++ b/gtk2_ardour/step_editor.cc @@ -96,7 +96,12 @@ StepEditor::prepare_step_edit_region () step_edit_region_view = dynamic_cast (rv); } else { - step_edit_region = _mtv.add_region (step_edit_insert_position); + + const Meter& m = _mtv.session()->tempo_map().meter_at (step_edit_insert_position); + const Tempo& t = _mtv.session()->tempo_map().tempo_at (step_edit_insert_position); + + step_edit_region = _mtv.add_region (step_edit_insert_position, floor (m.frames_per_bar (t, _mtv.session()->frame_rate())), true); + RegionView* rv = _mtv.midi_view()->find_view (step_edit_region); step_edit_region_view = dynamic_cast(rv); } -- cgit v1.2.3