Fix rect select to work in all directions.
git-svn-id: svn://localhost/ardour2/trunk@2284 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
8eded9b7bc
commit
078151e4d4
|
@ -73,7 +73,7 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
|
|||
|
||||
switch (ev->type) {
|
||||
case GDK_KEY_PRESS:
|
||||
cerr << "EV KEY\n";
|
||||
cerr << "EV KEY PRESS\n";
|
||||
if (_note && ev->key.keyval == GDK_Delete) {
|
||||
cerr << "EV DELETE KEY\n";
|
||||
selected(true);
|
||||
|
@ -83,6 +83,7 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
|
|||
break;
|
||||
|
||||
case GDK_KEY_RELEASE:
|
||||
cerr << "EV KEY RELEASE\n";
|
||||
if (ev->key.keyval == GDK_Delete) {
|
||||
_region.apply_command();
|
||||
}
|
||||
|
|
|
@ -147,6 +147,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
|||
|
||||
switch (ev->type) {
|
||||
case GDK_KEY_PRESS:
|
||||
cerr << "REGION KEY PRESS\n";
|
||||
if (ev->key.keyval == GDK_Delete && !delete_mod) {
|
||||
delete_mod = true;
|
||||
original_mode = trackview.editor.current_midi_edit_mode();
|
||||
|
@ -154,9 +155,10 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
|||
start_remove_command();
|
||||
_mouse_state = EraseDragging;
|
||||
}
|
||||
break;
|
||||
return true;
|
||||
|
||||
case GDK_KEY_RELEASE:
|
||||
cerr << "REGION KEY RELEASE\n";
|
||||
if (ev->key.keyval == GDK_Delete) {
|
||||
if (_mouse_state == EraseDragging) {
|
||||
delete_selection();
|
||||
|
@ -167,7 +169,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
|||
delete_mod = false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
return true;
|
||||
|
||||
case GDK_BUTTON_PRESS:
|
||||
//group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, ev->button.time);
|
||||
|
@ -193,7 +195,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
|||
switch (_mouse_state) {
|
||||
case Pressed: // Drag start
|
||||
|
||||
// Select rect start
|
||||
// Select drag start
|
||||
if (_pressed_button == 1 && trackview.editor.current_midi_edit_mode() == MidiEditSelect) {
|
||||
cerr << "SELECT START\n";
|
||||
group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
||||
|
@ -250,8 +252,8 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
|||
|
||||
break;
|
||||
|
||||
case SelectDragging: // Select rect motion
|
||||
case AddDragging: // Add note rect motion
|
||||
case SelectDragging: // Select drag motion
|
||||
case AddDragging: // Add note drag motion
|
||||
if (ev->motion.is_hint) {
|
||||
int t_x;
|
||||
int t_y;
|
||||
|
@ -265,11 +267,17 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
|||
event_x = trackview.editor.frame_to_pixel(event_frame);
|
||||
|
||||
if (drag_rect)
|
||||
drag_rect->property_x2() = event_x;
|
||||
if (event_x > drag_start_x)
|
||||
drag_rect->property_x2() = event_x;
|
||||
else
|
||||
drag_rect->property_x1() = event_x;
|
||||
|
||||
if (drag_rect && _mouse_state == SelectDragging) {
|
||||
drag_rect->property_y2() = event_y;
|
||||
|
||||
if (event_y > drag_start_y)
|
||||
drag_rect->property_y2() = event_y;
|
||||
else
|
||||
drag_rect->property_y1() = event_y;
|
||||
|
||||
update_drag_selection(drag_start_x, event_x, drag_start_y, event_y);
|
||||
}
|
||||
|
||||
|
@ -679,16 +687,32 @@ MidiRegionView::note_deselected(ArdourCanvas::CanvasMidiEvent* ev, bool add)
|
|||
|
||||
|
||||
void
|
||||
MidiRegionView::update_drag_selection(double last_x, double x, double last_y, double y)
|
||||
MidiRegionView::update_drag_selection(double x1, double x2, double y1, double y2)
|
||||
{
|
||||
const double last_y = std::min(y1, y2);
|
||||
const double y = std::max(y1, y2);
|
||||
|
||||
// FIXME: so, so, so much slower than this should be
|
||||
for (std::vector<CanvasMidiEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
|
||||
if ((*i)->x1() >= last_x && (*i)->x1() <= x && (*i)->y1() >= last_y && (*i)->y1() <= y) {
|
||||
(*i)->selected(true);
|
||||
_selection.insert(*i);
|
||||
} else {
|
||||
(*i)->selected(false);
|
||||
_selection.erase(*i);
|
||||
|
||||
if (x1 < x2) {
|
||||
for (std::vector<CanvasMidiEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
|
||||
if ((*i)->x1() >= x1 && (*i)->x1() <= x2 && (*i)->y1() >= last_y && (*i)->y1() <= y) {
|
||||
(*i)->selected(true);
|
||||
_selection.insert(*i);
|
||||
} else {
|
||||
(*i)->selected(false);
|
||||
_selection.erase(*i);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (std::vector<CanvasMidiEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
|
||||
if ((*i)->x2() <= x1 && (*i)->x2() >= x2 && (*i)->y1() >= last_y && (*i)->y1() <= y) {
|
||||
(*i)->selected(true);
|
||||
_selection.insert(*i);
|
||||
} else {
|
||||
(*i)->selected(false);
|
||||
_selection.erase(*i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user