diff options
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 95 |
1 files changed, 52 insertions, 43 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 138b53b316..b4acdc7f5e 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -353,6 +353,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) // Select drag start if (_pressed_button == 1 && editor.current_mouse_mode() == MouseObject) { + cerr << "MRV start select grab\n"; group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); last_x = event_x; @@ -376,6 +377,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) // Add note drag start } else if (editor.current_mouse_mode() == MouseRange) { + cerr << "MRV start note grab\n"; group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); last_x = event_x; @@ -1680,7 +1682,7 @@ MidiRegionView::frames_to_beats(nframes64_t frames) const } void -MidiRegionView::begin_resizing(CanvasNote::NoteEnd note_end) +MidiRegionView::begin_resizing(bool at_front) { _resize_data.clear(); @@ -1714,37 +1716,37 @@ MidiRegionView::begin_resizing(CanvasNote::NoteEnd note_end) ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get()); resize_data->resize_rect = resize_rect; - - if (note_end == CanvasNote::NOTE_ON) { - resize_data->current_x = note->x1(); - } else { // NOTE_OFF - resize_data->current_x = note->x2(); - } - _resize_data.push_back(resize_data); } } } void -MidiRegionView::update_resizing(CanvasNote::NoteEnd note_end, double x, bool relative) +MidiRegionView::update_resizing (bool at_front, double delta_x, bool relative) { for (std::vector<NoteResizeData *>::iterator i = _resize_data.begin(); i != _resize_data.end(); ++i) { SimpleRect* resize_rect = (*i)->resize_rect; CanvasNote* canvas_note = (*i)->canvas_note; - const double region_start = get_position_pixels(); + double current_x; - if (relative) { - (*i)->current_x = (*i)->current_x + x; + if (at_front) { + if (relative) { + current_x = canvas_note->x1() + delta_x; + } else { + // x is in track relative, transform it to region relative + current_x = delta_x - region_start; + } } else { - // x is in track relative, transform it to region relative - (*i)->current_x = x - region_start; + if (relative) { + current_x = canvas_note->x2() + delta_x; + } else { + // x is in track relative, transform it to region relative + current_x = delta_x - region_start; + } } - - double current_x = (*i)->current_x; - - if (note_end == CanvasNote::NOTE_ON) { + + if (at_front) { resize_rect->property_x1() = snap_to_pixel(current_x); resize_rect->property_x2() = canvas_note->x2(); } else { @@ -1755,40 +1757,47 @@ MidiRegionView::update_resizing(CanvasNote::NoteEnd note_end, double x, bool rel } void -MidiRegionView::commit_resizing(CanvasNote::NoteEnd note_end, double event_x, bool relative) +MidiRegionView::commit_resizing (bool at_front, double delta_x, bool relative) { - start_delta_command(_("resize notes")); + start_diff_command(_("resize notes")); for (std::vector<NoteResizeData *>::iterator i = _resize_data.begin(); i != _resize_data.end(); ++i) { CanvasNote* canvas_note = (*i)->canvas_note; SimpleRect* resize_rect = (*i)->resize_rect; - double current_x = (*i)->current_x; - const double position = get_position_pixels(); + const double region_start = get_position_pixels(); + double current_x; - if (!relative) { - // event_x is in track relative, transform it to region relative - current_x = event_x - position; + if (at_front) { + if (relative) { + current_x = canvas_note->x1() + delta_x; + } else { + // x is in track relative, transform it to region relative + current_x = delta_x - region_start; + } + } else { + if (relative) { + current_x = canvas_note->x2() + delta_x; + } else { + // x is in track relative, transform it to region relative + current_x = delta_x - region_start; + } } - - // because snapping works on world coordinates we have to transform current_x - // to world coordinates before snapping and transform it back afterwards - nframes64_t current_frame = snap_pixel_to_frame(current_x); - // transform to region start relative - current_frame += _region->start(); - const boost::shared_ptr<NoteType> copy(new NoteType(*(canvas_note->note().get()))); + current_x = snap_pixel_to_frame (current_x); + current_x = frames_to_beats (current_x); - // resize beginning of note - if (note_end == CanvasNote::NOTE_ON && current_frame < copy->end_time()) { - delta_remove_note(canvas_note); - copy->on_event().time() = current_frame; - delta_add_note(copy, _selection.find(canvas_note) != _selection.end()); + if (at_front && current_x < canvas_note->note()->end_time()) { + + diff_add_change (canvas_note, MidiModel::DiffCommand::StartTime, current_x); } - // resize end of note - if (note_end == CanvasNote::NOTE_OFF && current_frame > copy->time()) { - delta_remove_note(canvas_note); - copy->off_event().time() = current_frame; - delta_add_note(copy, _selection.find(canvas_note) != _selection.end()); + + if (!at_front) { + double len = current_x - canvas_note->note()->time(); + + if (len > 0) { + /* XXX convert to beats */ + diff_add_change (canvas_note, MidiModel::DiffCommand::Length, len); + } } delete resize_rect; @@ -1796,7 +1805,7 @@ MidiRegionView::commit_resizing(CanvasNote::NoteEnd note_end, double event_x, bo } _resize_data.clear(); - apply_delta(); + apply_diff(); } void |