Touch select (hold left <Shift> or <Control>).

Fix crash on note delete.


git-svn-id: svn://localhost/ardour2/trunk@2286 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
David Robillard 2007-08-10 19:16:21 +00:00
parent e14ab95dc5
commit 1ead67fbd7
3 changed files with 38 additions and 37 deletions

View File

@ -66,7 +66,7 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
static double last_x, last_y;
double event_x, event_y, dx, dy;
nframes_t event_frame;
bool select_mod = false;
bool select_mod;
if (_region.get_time_axis_view().editor.current_mouse_mode() != Editing::MouseNote)
return false;
@ -90,14 +90,9 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
break;
case GDK_ENTER_NOTIFY:
select_mod = (ev->motion.state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK));
cerr << "ENTER: " << select_mod << " - " << ev->motion.state << endl;
if (select_mod) {
_region.note_selected(this, true);
}
_region.note_entered(this);
_item->grab_focus();
Keyboard::magic_widget_grab_focus();
_region.note_entered(this);
break;
case GDK_LEAVE_NOTIFY:
@ -110,7 +105,6 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
return true;
case GDK_MOTION_NOTIFY:
select_mod = (ev->motion.state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK));
event_x = ev->motion.x;
event_y = ev->motion.y;
//cerr << "MOTION @ " << event_x << ", " << event_y << endl;
@ -118,7 +112,7 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
switch (_state) {
case Pressed: // Drag begin
if (!select_mod) {
if (_region.mouse_state() != MidiRegionView::SelectTouchDragging) {
_item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
_state = Dragging;

View File

@ -147,20 +147,20 @@ 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();
trackview.editor.set_midi_edit_mode(MidiEditErase);
start_remove_command();
_mouse_state = EraseDragging;
_mouse_state = EraseTouchDragging;
} else if (ev->key.keyval == GDK_Shift_L || ev->key.keyval == GDK_Control_L) {
_mouse_state = SelectTouchDragging;
}
return true;
case GDK_KEY_RELEASE:
cerr << "REGION KEY RELEASE\n";
if (ev->key.keyval == GDK_Delete) {
if (_mouse_state == EraseDragging) {
if (_mouse_state == EraseTouchDragging) {
delete_selection();
apply_command();
}
@ -168,14 +168,15 @@ MidiRegionView::canvas_event(GdkEvent* ev)
trackview.editor.set_midi_edit_mode(original_mode);
delete_mod = false;
}
} else if (ev->key.keyval == GDK_Shift_L || ev->key.keyval == GDK_Control_L) {
_mouse_state = None;
}
return true;
case GDK_BUTTON_PRESS:
//group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, ev->button.time);
_mouse_state = Pressed;
if (_mouse_state != SelectTouchDragging && _mouse_state != EraseTouchDragging)
_mouse_state = Pressed;
_pressed_button = ev->button.button;
//cerr << "PRESSED: " << press_button << endl;
return true;
case GDK_ENTER_NOTIFY:
@ -197,7 +198,6 @@ MidiRegionView::canvas_event(GdkEvent* ev)
// 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,
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
last_x = event_x;
@ -216,12 +216,11 @@ MidiRegionView::canvas_event(GdkEvent* ev)
drag_rect->property_fill_color_rgba()
= ARDOUR_UI::config()->canvasvar_MidiSelectRectFill.get();
_mouse_state = SelectDragging;
_mouse_state = SelectRectDragging;
return true;
// Add note drag start
} else if (trackview.editor.current_midi_edit_mode() == MidiEditPencil) {
cerr << "PENCIL START\n";
group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
last_x = event_x;
@ -245,14 +244,13 @@ MidiRegionView::canvas_event(GdkEvent* ev)
// Eraser drag start
} else if (trackview.editor.current_midi_edit_mode() == MidiEditErase) {
cerr << "ERASE DRAGGING\n";
_mouse_state = EraseDragging;
return false; // ?
_mouse_state = EraseTouchDragging;
return false; // Don't ask me...
}
break;
return false;
case SelectDragging: // Select drag motion
case SelectRectDragging: // Select drag motion
case AddDragging: // Add note drag motion
if (ev->motion.is_hint) {
int t_x;
@ -272,7 +270,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
else
drag_rect->property_x1() = event_x;
if (drag_rect && _mouse_state == SelectDragging) {
if (drag_rect && _mouse_state == SelectRectDragging) {
if (event_y > drag_start_y)
drag_rect->property_y2() = event_y;
else
@ -284,11 +282,11 @@ MidiRegionView::canvas_event(GdkEvent* ev)
last_x = event_x;
last_y = event_y;
case EraseDragging:
return true;
case EraseTouchDragging:
case SelectTouchDragging:
return false;
default:
_mouse_state = None;
break;
}
break;
@ -315,7 +313,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
}
_mouse_state = None;
return true;
case SelectDragging: // Select drag done
case SelectRectDragging: // Select drag done
_mouse_state = None;
delete drag_rect;
drag_rect = NULL;
@ -661,7 +659,9 @@ MidiRegionView::unique_select(ArdourCanvas::CanvasMidiEvent* ev)
_selection.clear();
_selection.insert(ev);
ev->selected(true);
if ( ! ev->selected())
ev->selected(true);
}
void
@ -671,7 +671,9 @@ MidiRegionView::note_selected(ArdourCanvas::CanvasMidiEvent* ev, bool add)
clear_selection_except(ev);
_selection.insert(ev);
ev->selected(true);
if ( ! ev->selected())
ev->selected(true);
}
@ -682,7 +684,9 @@ MidiRegionView::note_deselected(ArdourCanvas::CanvasMidiEvent* ev, bool add)
clear_selection_except(ev);
_selection.erase(ev);
ev->selected(false);
if (ev->selected())
ev->selected(false);
}

View File

@ -112,11 +112,12 @@ class MidiRegionView : public RegionView
}
void note_entered(ArdourCanvas::CanvasMidiEvent* ev) {
cerr << "ENTERED, STATE = " << _mouse_state << endl;
if (_mouse_state == EraseDragging) {
if (ev->note() && _mouse_state == EraseTouchDragging) {
start_delta_command();
ev->selected(true);
_delta_command->remove(*ev->note());
} else if (_mouse_state == SelectTouchDragging) {
note_selected(ev, true);
}
}
@ -142,7 +143,10 @@ class MidiRegionView : public RegionView
void move_selection(double dx, double dy);
void note_dropped(ArdourCanvas::CanvasMidiEvent* ev, double dt, uint8_t dnote);
enum MouseState { None, Pressed, SelectTouchDragging, SelectRectDragging, AddDragging, EraseTouchDragging };
MouseState mouse_state() const { return _mouse_state; }
protected:
/* this constructor allows derived types
@ -182,8 +186,7 @@ class MidiRegionView : public RegionView
ArdourCanvas::CanvasNote** _active_notes;
ArdourCanvas::Group* _note_group;
ARDOUR::MidiModel::DeltaCommand* _delta_command;
enum MouseState { None, Pressed, SelectDragging, AddDragging, EraseDragging };
MouseState _mouse_state;
int _pressed_button;