summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/editor_drag.cc12
-rw-r--r--gtk2_ardour/midi_region_view.cc32
-rw-r--r--gtk2_ardour/midi_region_view.h16
3 files changed, 29 insertions, 31 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 7c8c192cdd..25a0fd1885 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -1592,15 +1592,15 @@ NoteResizeDrag::NoteResizeDrag (Editor* e, ArdourCanvas::Item* i)
void
NoteResizeDrag::start_grab (GdkEvent* event, Gdk::Cursor *)
{
- Gdk::Cursor cursor;
- ArdourCanvas::CanvasNote* cnote = dynamic_cast<ArdourCanvas::CanvasNote*>(_item);
+ Gdk::Cursor cursor;
+ ArdourCanvas::CanvasNote* cnote = dynamic_cast<ArdourCanvas::CanvasNote*>(_item);
Drag::start_grab (event);
region = &cnote->region_view();
- double region_start = region->get_position_pixels();
- double middle_point = region_start + cnote->x1() + (cnote->x2() - cnote->x1()) / 2.0L;
+ double const region_start = region->get_position_pixels();
+ double const middle_point = region_start + cnote->x1() + (cnote->x2() - cnote->x1()) / 2.0L;
if (grab_x() <= middle_point) {
cursor = Gdk::Cursor(Gdk::LEFT_SIDE);
@@ -1644,7 +1644,7 @@ NoteResizeDrag::motion (GdkEvent* /*event*/, bool /*first_move*/)
{
MidiRegionSelection& ms (_editor->get_selection().midi_regions);
for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) {
- (*r)->update_resizing (at_front, _drags->current_pointer_x() - grab_x(), relative);
+ (*r)->update_resizing (dynamic_cast<ArdourCanvas::CanvasNote*>(_item), at_front, _drags->current_pointer_x() - grab_x(), relative);
}
}
@@ -1653,7 +1653,7 @@ NoteResizeDrag::finished (GdkEvent*, bool /*movement_occurred*/)
{
MidiRegionSelection& ms (_editor->get_selection().midi_regions);
for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) {
- (*r)->commit_resizing (at_front, _drags->current_pointer_x() - grab_x(), relative);
+ (*r)->commit_resizing (dynamic_cast<ArdourCanvas::CanvasNote*>(_item), at_front, _drags->current_pointer_x() - grab_x(), relative);
}
}
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 63852fdf9d..bb1ad082f6 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -2107,8 +2107,17 @@ MidiRegionView::begin_resizing (bool /*at_front*/)
}
}
+/** Update resizing notes while user drags.
+ * @param primary `primary' note for the drag; ie the one that is used as the reference in non-relative mode.
+ * @param at_front which end of the note (true == note on, false == note off)
+ * @param delta_x change in mouse position since the start of the drag
+ * @param relative true if relative resizing is taking place, false if absolute resizing. This only makes
+ * a difference when multiple notes are being resized; in relative mode, each note's length is changed by the
+ * amount of the drag. In non-relative mode, all selected notes are set to have the same start or end point
+ * as the \a primary note.
+ */
void
-MidiRegionView::update_resizing (bool at_front, double delta_x, bool relative)
+MidiRegionView::update_resizing (ArdourCanvas::CanvasNote* primary, 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;
@@ -2119,15 +2128,13 @@ MidiRegionView::update_resizing (bool at_front, double delta_x, bool relative)
if (relative) {
current_x = canvas_note->x1() + delta_x;
} else {
- // x is in track relative, transform it to region relative
- current_x = delta_x - get_position_pixels();
+ current_x = primary->x1() + delta_x;
}
} 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 - get_end_position_pixels ();
+ current_x = primary->x2() + delta_x;
}
}
@@ -2141,30 +2148,33 @@ MidiRegionView::update_resizing (bool at_front, double delta_x, bool relative)
}
}
+
+/** Finish resizing notes when the user releases the mouse button.
+ * Parameters the same as for \a update_resizing().
+ */
void
-MidiRegionView::commit_resizing (bool at_front, double delta_x, bool relative)
+MidiRegionView::commit_resizing (ArdourCanvas::CanvasNote* primary, bool at_front, double delta_x, bool relative)
{
start_diff_command(_("resize notes"));
+ CanvasNote* first = _resize_data.empty() ? 0 : _resize_data.front()->canvas_note;
+
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;
- const double region_start = get_position_pixels();
double current_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 = region_start + delta_x;
+ current_x = primary->x1() + delta_x;
}
} else {
if (relative) {
current_x = canvas_note->x2() + delta_x;
} else {
- // x is in track relative, transform it to region relative
- current_x = region_start + delta_x;
+ current_x = primary->x2() + delta_x;
}
}
diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h
index cb360159d9..1f2d53980e 100644
--- a/gtk2_ardour/midi_region_view.h
+++ b/gtk2_ardour/midi_region_view.h
@@ -219,20 +219,8 @@ class MidiRegionView : public RegionView
*/
void begin_resizing(bool at_front);
- /** Update resizing notes while user drags.
- * @param at_front which end of the note (true == note on, false == note off)
- * @param x the difference in mouse motion, ie the motion difference if relative=true
- * or the absolute mouse position (track-relative) if relative is false
- * @param relative true if relative resizing is taking place, false if absolute resizing
- */
- void update_resizing(bool at_front, double x, bool relative);
-
- /** Finish resizing notes when the user releases the mouse button.
- * @param at_front which end of the note (true == note on, false == note off)
- * @param event_x the absolute mouse position (track-relative)
- * @param relative true if relative resizing is taking place, false if absolute resizing
- */
- void commit_resizing(bool at_front, double event_x, bool relative);
+ void update_resizing (ArdourCanvas::CanvasNote *, bool, double, bool);
+ void commit_resizing (ArdourCanvas::CanvasNote *, bool, double, bool);
/** Adjust the velocity on a note, and the selection if applicable.
* @param velocity the relative or absolute velocity