summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-08-20 12:01:13 +0000
committerCarl Hetherington <carl@carlh.net>2010-08-20 12:01:13 +0000
commit812e95da016e334b8856b24aba14db809da3f774 (patch)
treed23003eb133c335bcb7e4de78adc82be58050e54
parent70597dbc0e6fe7222d51c9d40f59510171c8e2f0 (diff)
Allow drag when creating a MIDI region. Fixes #3363.
git-svn-id: svn://localhost/ardour2/branches/3.0@7657 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/editor_drag.cc43
-rw-r--r--gtk2_ardour/editor_drag.h8
-rw-r--r--gtk2_ardour/editor_mouse.cc10
-rw-r--r--gtk2_ardour/midi_streamview.cc2
-rw-r--r--gtk2_ardour/midi_time_axis.cc11
-rw-r--r--gtk2_ardour/midi_time_axis.h2
-rw-r--r--gtk2_ardour/step_editor.cc7
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<MidiTimeAxisView*> (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<MidiTimeAxisView*> (_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<ARDOUR::Region> _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<MidiTimeAxisView*> (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<MidiTimeAxisView*> (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<Region> 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<MidiRegion>
-MidiTimeAxisView::add_region (framepos_t pos)
+MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit)
{
Editor* real_editor = dynamic_cast<Editor*> (&_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<Source> 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<MidiRegion>(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<ARDOUR::MidiRegion> add_region (ARDOUR::framepos_t pos);
+ boost::shared_ptr<ARDOUR::MidiRegion> 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<MidiRegionView*> (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<MidiRegionView*>(rv);
}