Allow drag when creating a MIDI region. Fixes #3363.

git-svn-id: svn://localhost/ardour2/branches/3.0@7657 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2010-08-20 12:01:13 +00:00
parent 70597dbc0e
commit 812e95da01
7 changed files with 40 additions and 43 deletions

View File

@ -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)

View File

@ -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 */

View File

@ -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);

View File

@ -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;

View File

@ -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);
}

View File

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

View File

@ -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);
}