X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_region_view.cc;h=154cd158dc25bf325300d4a98dbb0b7f389e8f02;hb=ec1ef5d6b574258d6451aa60749c4241f3c42f5f;hp=196f0f09603e7a80079892c252095967fc92a08f;hpb=f758ed0f4123605235dc83c70d5fdef2e8aa8947;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 196f0f0960..154cd158dc 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -116,10 +116,10 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & _note_group->raise_to_top(); PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys)); - Config->ParameterChanged.connect (*this, invalidator (*this), ui_bind (&MidiRegionView::parameter_changed, this, _1), gui_context()); + Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&MidiRegionView::parameter_changed, this, _1), gui_context()); connect_to_diskstream (); - SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), ui_bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); + SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); } MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, @@ -155,7 +155,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & connect_to_diskstream (); - SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), ui_bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); + SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); } void @@ -245,7 +245,7 @@ MidiRegionView::init (Gdk::Color const & basic_color, bool wfd) PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys)); CanvasNoteEvent::CanvasNoteEventDeleted.connect (note_delete_connection, MISSING_INVALIDATOR, - ui_bind (&MidiRegionView::maybe_remove_deleted_note_from_selection, this, _1), + boost::bind (&MidiRegionView::maybe_remove_deleted_note_from_selection, this, _1), gui_context()); if (wfd) { @@ -288,13 +288,13 @@ MidiRegionView::init (Gdk::Color const & basic_color, bool wfd) sigc::mem_fun(this, &MidiRegionView::midi_patch_settings_changed)); trackview.editor().SnapChanged.connect(snap_changed_connection, invalidator(*this), - ui_bind(&MidiRegionView::snap_changed, this), + boost::bind (&MidiRegionView::snap_changed, this), gui_context()); - Config->ParameterChanged.connect (*this, invalidator (*this), ui_bind (&MidiRegionView::parameter_changed, this, _1), gui_context()); + Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&MidiRegionView::parameter_changed, this, _1), gui_context()); connect_to_diskstream (); - SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), ui_bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); + SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ()); } const boost::shared_ptr @@ -308,7 +308,7 @@ MidiRegionView::connect_to_diskstream () { midi_view()->midi_track()->DataRecorded.connect( *this, invalidator(*this), - ui_bind(&MidiRegionView::data_recorded, this, _1), + boost::bind (&MidiRegionView::data_recorded, this, _1), gui_context()); } @@ -380,7 +380,7 @@ bool MidiRegionView::enter_notify (GdkEventCrossing* ev) { trackview.editor().MouseModeChanged.connect ( - _mouse_mode_connection, invalidator (*this), ui_bind (&MidiRegionView::mouse_mode_changed, this), gui_context () + _mouse_mode_connection, invalidator (*this), boost::bind (&MidiRegionView::mouse_mode_changed, this), gui_context () ); if (trackview.editor().current_mouse_mode() == MouseDraw && _mouse_state != AddDragging) { @@ -435,7 +435,7 @@ MidiRegionView::button_press (GdkEventButton* ev) Editor* editor = dynamic_cast (&trackview.editor()); MouseMode m = editor->current_mouse_mode(); - + if (m == MouseObject && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier())) { pre_press_cursor = editor->get_canvas_cursor (); editor->set_canvas_cursor (editor->cursors()->midi_pencil); @@ -480,6 +480,11 @@ MidiRegionView::button_release (GdkEventButton* ev) case Pressed: // Clicked switch (editor.current_mouse_mode()) { + case MouseRange: + /* no motion occured - simple click */ + clear_selection (); + break; + case MouseObject: case MouseTimeFX: { @@ -595,20 +600,23 @@ MidiRegionView::motion (GdkEventMotion* ev) _mouse_state = AddDragging; remove_ghost_note (); editor.verbose_cursor()->hide (); - cerr << "starting note create drag\n"; - return true; - } else { + } else if (m == MouseObject) { editor.drags()->set (new MidiRubberbandSelectDrag (dynamic_cast (&editor), this), (GdkEvent *) ev); _mouse_state = SelectRectDragging; return true; + } else if (m == MouseRange) { + editor.drags()->set (new MidiVerticalSelectDrag (dynamic_cast (&editor), this), (GdkEvent *) ev); + _mouse_state = SelectVerticalDragging; + return true; } } return false; case SelectRectDragging: + case SelectVerticalDragging: case AddDragging: editor.drags()->motion_handler ((GdkEvent *) ev, false); break; @@ -803,7 +811,7 @@ void MidiRegionView::show_list_editor () { if (!_list_editor) { - _list_editor = new MidiListEditor (trackview.session(), midi_region()); + _list_editor = new MidiListEditor (trackview.session(), midi_region(), midi_view()->midi_track()); } _list_editor->present (); } @@ -1388,7 +1396,7 @@ MidiRegionView::add_ghost (TimeAxisView& tv) ghost->set_duration (_region->length() / samples_per_unit); ghosts.push_back (ghost); - GhostRegion::CatchDeletion.connect (*this, invalidator (*this), ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); + GhostRegion::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RegionView::remove_ghost, this, _1), gui_context()); return ghost; } @@ -2208,6 +2216,38 @@ MidiRegionView::update_drag_selection(double x1, double x2, double y1, double y2 } } +void +MidiRegionView::update_vertical_drag_selection (double y1, double y2, bool extend) +{ + if (y1 > y2) { + swap (y1, y2); + } + + // TODO: Make this faster by storing the last updated selection rect, and only + // adjusting things that are in the area that appears/disappeared. + // We probably need a tree to be able to find events in O(log(n)) time. + + for (Events::iterator i = _events.begin(); i != _events.end(); ++i) { + + /* check if any corner of the note is inside the rect + + Notes: + 1) this is computing "touched by", not "contained by" the rect. + 2) this does not require that events be sorted in time. + */ + + if (((*i)->y1() >= y1 && (*i)->y1() <= y2)) { + // within y- (note-) range + if (!(*i)->selected()) { + add_to_selection (*i); + } + } else if ((*i)->selected() && !extend) { + // Not inside rectangle + remove_from_selection (*i); + } + } +} + void MidiRegionView::remove_from_selection (CanvasNoteEvent* ev) { @@ -2913,7 +2953,7 @@ MidiRegionView::nudge_notes (bool forward) framepos_t ref_point = source_beats_to_absolute_frames ((*(_selection.begin()))->note()->time()); framepos_t unused; - framepos_t distance; + framecnt_t distance; if (trackview.editor().snap_mode() == Editing::SnapOff) { @@ -3026,10 +3066,12 @@ void MidiRegionView::note_mouse_position (float x_fraction, float /*y_fraction*/, bool can_set_cursor) { Editor* editor = dynamic_cast(&trackview.editor()); + Editing::MouseMode mm = editor->current_mouse_mode(); + bool trimmable = (mm == MouseObject || mm == MouseTimeFX || mm == MouseDraw); - if (x_fraction > 0.0 && x_fraction < 0.2) { + if (trimmable && x_fraction > 0.0 && x_fraction < 0.2) { editor->set_canvas_cursor (editor->cursors()->left_side_trim); - } else if (x_fraction >= 0.8 && x_fraction < 1.0) { + } else if (trimmable && x_fraction >= 0.8 && x_fraction < 1.0) { editor->set_canvas_cursor (editor->cursors()->right_side_trim); } else { if (pre_enter_cursor && can_set_cursor) { @@ -3173,7 +3215,7 @@ MidiRegionView::paste (framepos_t pos, float times, const MidiCutBuffer& mcb) Evoral::MusicalTime end_point = 0; duration = (*mcb.notes().rbegin())->end_time() - (*mcb.notes().begin())->time(); - paste_pos_beats = region_frames_to_region_beats (pos - _region->position()); + paste_pos_beats = absolute_frames_to_source_beats (pos); beat_delta = (*mcb.notes().begin())->time() - paste_pos_beats; paste_pos_beats = 0; @@ -3211,7 +3253,7 @@ MidiRegionView::paste (framepos_t pos, float times, const MidiCutBuffer& mcb) DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("Paste extended region from %1 to %2\n", region_end, end_frame)); _region->clear_changes (); - _region->set_length (end_frame); + _region->set_length (end_frame - _region->position()); trackview.session()->add_command (new StatefulDiffCommand (_region)); }