mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 23:35:03 +01:00
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
7 changed files with 40 additions and 43 deletions
|
|
@ -1523,51 +1523,40 @@ RegionSpliceDrag::aborted ()
|
||||||
|
|
||||||
RegionCreateDrag::RegionCreateDrag (Editor* e, ArdourCanvas::Item* i, TimeAxisView* v)
|
RegionCreateDrag::RegionCreateDrag (Editor* e, ArdourCanvas::Item* i, TimeAxisView* v)
|
||||||
: Drag (e, i),
|
: Drag (e, i),
|
||||||
_view (v)
|
_view (dynamic_cast<MidiTimeAxisView*> (v))
|
||||||
{
|
{
|
||||||
|
assert (_view);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RegionCreateDrag::start_grab (GdkEvent* event, Gdk::Cursor *)
|
RegionCreateDrag::motion (GdkEvent *, bool first_move)
|
||||||
{
|
|
||||||
_dest_trackview = _view;
|
|
||||||
|
|
||||||
Drag::start_grab (event);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
RegionCreateDrag::motion (GdkEvent* /*event*/, bool first_move)
|
|
||||||
{
|
{
|
||||||
if (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
|
void
|
||||||
RegionCreateDrag::finished (GdkEvent* event, bool movement_occurred)
|
RegionCreateDrag::finished (GdkEvent* event, bool movement_occurred)
|
||||||
{
|
{
|
||||||
MidiTimeAxisView* mtv = dynamic_cast<MidiTimeAxisView*> (_dest_trackview);
|
if (movement_occurred) {
|
||||||
|
_editor->commit_reversible_command ();
|
||||||
if (!mtv) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!movement_occurred) {
|
|
||||||
mtv->add_region (grab_frame ());
|
|
||||||
} else {
|
|
||||||
motion (event, false);
|
|
||||||
// TODO: create region-create-drag region here
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RegionCreateDrag::aborted ()
|
RegionCreateDrag::aborted ()
|
||||||
{
|
{
|
||||||
/* XXX: TODO */
|
/* XXX */
|
||||||
}
|
}
|
||||||
|
|
||||||
NoteResizeDrag::NoteResizeDrag (Editor* e, ArdourCanvas::Item* i)
|
NoteResizeDrag::NoteResizeDrag (Editor* e, ArdourCanvas::Item* i)
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ namespace Gnome {
|
||||||
class Editor;
|
class Editor;
|
||||||
class EditorCursor;
|
class EditorCursor;
|
||||||
class TimeAxisView;
|
class TimeAxisView;
|
||||||
|
class MidiTimeAxisView;
|
||||||
class Drag;
|
class Drag;
|
||||||
|
|
||||||
/** Class to manage current drags */
|
/** Class to manage current drags */
|
||||||
|
|
@ -180,7 +181,7 @@ protected:
|
||||||
return _grab_y;
|
return _grab_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
double grab_frame () const {
|
ARDOUR::framepos_t grab_frame () const {
|
||||||
return _grab_frame;
|
return _grab_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -348,14 +349,13 @@ class RegionCreateDrag : public Drag
|
||||||
public:
|
public:
|
||||||
RegionCreateDrag (Editor *, ArdourCanvas::Item *, TimeAxisView *);
|
RegionCreateDrag (Editor *, ArdourCanvas::Item *, TimeAxisView *);
|
||||||
|
|
||||||
void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
|
|
||||||
void motion (GdkEvent *, bool);
|
void motion (GdkEvent *, bool);
|
||||||
void finished (GdkEvent *, bool);
|
void finished (GdkEvent *, bool);
|
||||||
void aborted ();
|
void aborted ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TimeAxisView* _view;
|
MidiTimeAxisView* _view;
|
||||||
TimeAxisView* _dest_trackview;
|
boost::shared_ptr<ARDOUR::Region> _region;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Drags to resize MIDI notes */
|
/** Drags to resize MIDI notes */
|
||||||
|
|
|
||||||
|
|
@ -683,8 +683,10 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
|
||||||
|
|
||||||
case StreamItem:
|
case StreamItem:
|
||||||
if (internal_editing()) {
|
if (internal_editing()) {
|
||||||
_drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
|
if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
|
||||||
return true;
|
_drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
|
_drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -812,7 +814,9 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
|
||||||
|
|
||||||
case StreamItem:
|
case StreamItem:
|
||||||
if (internal_editing()) {
|
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;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
_drags->set (new RubberbandSelectDrag (this, item), event);
|
_drags->set (new RubberbandSelectDrag (this, item), event);
|
||||||
|
|
|
||||||
|
|
@ -1004,7 +1004,7 @@ MidiTimeAxisView::automation_child_menu_item (Evoral::Parameter param)
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<MidiRegion>
|
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);
|
Editor* real_editor = dynamic_cast<Editor*> (&_editor);
|
||||||
|
|
||||||
|
|
@ -1012,9 +1012,6 @@ MidiTimeAxisView::add_region (framepos_t pos)
|
||||||
playlist()->clear_history ();
|
playlist()->clear_history ();
|
||||||
|
|
||||||
real_editor->snap_to (pos, 0);
|
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(),
|
boost::shared_ptr<Source> src = _session->create_midi_source_for_session (view()->trackview().track().get(),
|
||||||
view()->trackview().track()->name());
|
view()->trackview().track()->name());
|
||||||
|
|
@ -1029,7 +1026,9 @@ MidiTimeAxisView::add_region (framepos_t pos)
|
||||||
playlist()->add_region (region, pos);
|
playlist()->add_region (region, pos);
|
||||||
_session->add_command (new StatefulDiffCommand (playlist()));
|
_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);
|
return boost::dynamic_pointer_cast<MidiRegion>(region);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ class MidiTimeAxisView : public RouteTimeAxisView
|
||||||
void set_height (uint32_t);
|
void set_height (uint32_t);
|
||||||
void hide ();
|
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_all_automation ();
|
||||||
void show_existing_automation ();
|
void show_existing_automation ();
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,12 @@ StepEditor::prepare_step_edit_region ()
|
||||||
step_edit_region_view = dynamic_cast<MidiRegionView*> (rv);
|
step_edit_region_view = dynamic_cast<MidiRegionView*> (rv);
|
||||||
|
|
||||||
} else {
|
} 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);
|
RegionView* rv = _mtv.midi_view()->find_view (step_edit_region);
|
||||||
step_edit_region_view = dynamic_cast<MidiRegionView*>(rv);
|
step_edit_region_view = dynamic_cast<MidiRegionView*>(rv);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue