summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_drag.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor_drag.cc')
-rw-r--r--gtk2_ardour/editor_drag.cc124
1 files changed, 97 insertions, 27 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index bba3938d52..435137168c 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -3100,45 +3100,51 @@ RubberbandSelectDrag::motion (GdkEvent* event, bool)
_editor->rubberband_rect->raise_to_top();
show_verbose_cursor_time (pf);
+
+ do_select_things (event, true);
}
}
void
-RubberbandSelectDrag::finished (GdkEvent* event, bool movement_occurred)
+RubberbandSelectDrag::do_select_things (GdkEvent* event, bool drag_in_progress)
{
- if (movement_occurred) {
-
- motion (event, false);
+ framepos_t x1;
+ framepos_t x2;
+
+ if (grab_frame() < last_pointer_frame()) {
+ x1 = grab_frame ();
+ x2 = last_pointer_frame ();
+ } else {
+ x2 = grab_frame ();
+ x1 = last_pointer_frame ();
+ }
- double y1,y2;
- if (_drags->current_pointer_y() < grab_y()) {
- y1 = _drags->current_pointer_y();
- y2 = grab_y();
- } else {
- y2 = _drags->current_pointer_y();
- y1 = grab_y();
- }
+ double y1;
+ double y2;
+
+ if (_drags->current_pointer_y() < grab_y()) {
+ y1 = _drags->current_pointer_y();
+ y2 = grab_y();
+ } else {
+ y2 = _drags->current_pointer_y();
+ y1 = grab_y();
+ }
+ select_things (event->button.state, x1, x2, y1, y2, drag_in_progress);
+}
- Selection::Operation op = ArdourKeyboard::selection_type (event->button.state);
+void
+RubberbandSelectDrag::finished (GdkEvent* event, bool movement_occurred)
+{
+ if (movement_occurred) {
- _editor->begin_reversible_command (_("rubberband selection"));
+ motion (event, false);
+ do_select_things (event, false);
- if (grab_frame() < last_pointer_frame()) {
- _editor->select_all_within (grab_frame(), last_pointer_frame() - 1, y1, y2, _editor->track_views, op, false);
- } else {
- _editor->select_all_within (last_pointer_frame(), grab_frame() - 1, y1, y2, _editor->track_views, op, false);
- }
+ } else {
- _editor->commit_reversible_command ();
+ deselect_things ();
- } else {
- if (!getenv("ARDOUR_SAE")) {
- _editor->selection->clear_tracks();
- }
- _editor->selection->clear_regions();
- _editor->selection->clear_points ();
- _editor->selection->clear_lines ();
}
_editor->rubberband_rect->hide();
@@ -4227,3 +4233,67 @@ PatchChangeDrag::setup_pointer_frame_offset ()
_pointer_frame_offset = raw_grab_frame() - _region_view->source_beats_to_absolute_frames (_patch_change->patch()->time());
}
+MidiRubberbandSelectDrag::MidiRubberbandSelectDrag (Editor* e, MidiRegionView* rv)
+ : RubberbandSelectDrag (e, rv->get_canvas_frame ())
+ , _region_view (rv)
+{
+
+}
+
+void
+MidiRubberbandSelectDrag::select_things (int button_state, framepos_t x1, framepos_t x2, double y1, double y2, bool drag_in_progress)
+{
+ framepos_t const p = _region_view->region()->position ();
+ double const y = _region_view->midi_view()->y_position ();
+
+ x1 = max ((framepos_t) 0, x1 - p);
+ x2 = max ((framepos_t) 0, x2 - p);
+ y1 = max (0.0, y1 - y);
+ y2 = max (0.0, y2 - y);
+
+ _region_view->update_drag_selection (
+ _editor->frame_to_pixel (x1),
+ _editor->frame_to_pixel (x2),
+ y1,
+ y2,
+ Keyboard::modifier_state_contains (button_state, Keyboard::TertiaryModifier)
+ );
+}
+
+void
+MidiRubberbandSelectDrag::deselect_things ()
+{
+ /* XXX */
+}
+
+EditorRubberbandSelectDrag::EditorRubberbandSelectDrag (Editor* e, ArdourCanvas::Item* i)
+ : RubberbandSelectDrag (e, i)
+{
+
+}
+
+void
+EditorRubberbandSelectDrag::select_things (int button_state, framepos_t x1, framepos_t x2, double y1, double y2, bool drag_in_progress)
+{
+ if (drag_in_progress) {
+ /* We just want to select things at the end of the drag, not during it */
+ return;
+ }
+
+ Selection::Operation op = ArdourKeyboard::selection_type (button_state);
+
+ _editor->begin_reversible_command (_("rubberband selection"));
+ _editor->select_all_within (x1, x2 - 1, y1, y2, _editor->track_views, op, false);
+ _editor->commit_reversible_command ();
+}
+
+void
+EditorRubberbandSelectDrag::deselect_things ()
+{
+ if (!getenv("ARDOUR_SAE")) {
+ _editor->selection->clear_tracks();
+ }
+ _editor->selection->clear_regions();
+ _editor->selection->clear_points ();
+ _editor->selection->clear_lines ();
+}