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:
parent
70597dbc0e
commit
812e95da01
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue