switch (ev->type) {
case GDK_KEY_PRESS:
+ cerr << "EV KEY\n";
if (_note && ev->key.keyval == GDK_Delete) {
+ cerr << "EV DELETE KEY\n";
selected(true);
_region.start_remove_command();
_region.command_remove_note(this);
if (select_mod) {
_region.note_selected(this, true);
}
- Keyboard::magic_widget_grab_focus();
_item->grab_focus();
+ Keyboard::magic_widget_grab_focus();
_region.note_entered(this);
break;
last_y = event_y;
drag_delta_x = 0;
drag_delta_note = 0;
+ _region.note_selected(this, true);
}
return true;
switch (_state) {
case Pressed: // Clicked
- _state = None;
-
- if (_selected && !select_mod && _region.selection_size() > 1)
- _region.unique_select(this);
- else if (_selected)
- _region.note_deselected(this, select_mod);
- else
- _region.note_selected(this, select_mod);
+ if (_region.midi_view()->editor.current_midi_edit_mode() == Editing::MidiEditSelect) {
+ _state = None;
+
+ if (_selected && !select_mod && _region.selection_size() > 1)
+ _region.unique_select(this);
+ else if (_selected)
+ _region.note_deselected(this, select_mod);
+ else
+ _region.note_selected(this, select_mod);
+ } else if (_region.midi_view()->editor.current_midi_edit_mode() == Editing::MidiEditErase) {
+ _region.start_remove_command();
+ _region.command_remove_note(this);
+ _region.apply_command();
+ }
return true;
case Dragging: // Dropped
: RegionView (parent, tv, r, spu, basic_color)
, _default_note_length(0.0)
, _active_notes(0)
+ , _note_group(new ArdourCanvas::Group(*parent))
, _delta_command(NULL)
- , _command_mode(None)
+ , _mouse_state(None)
+ , _pressed_button(0)
{
+ _note_group->raise_to_top();
}
MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, boost::shared_ptr<MidiRegion> r, double spu,
: RegionView (parent, tv, r, spu, basic_color, visibility)
, _default_note_length(0.0)
, _active_notes(0)
+ , _note_group(new ArdourCanvas::Group(*parent))
, _delta_command(NULL)
- , _command_mode(None)
+ , _mouse_state(None)
+ , _pressed_button(0)
{
+ _note_group->raise_to_top();
}
void
bool
MidiRegionView::canvas_event(GdkEvent* ev)
{
- enum State { None, Pressed, SelectDragging, AddDragging };
- static int press_button = 0;
- static State _state;
+ static bool delete_mod = false;
+ static Editing::MidiEditMode original_mode;
static double drag_start_x, drag_start_y;
static double last_x, last_y;
double event_x, event_y;
+ nframes_t event_frame = 0;
static ArdourCanvas::SimpleRect* drag_rect = NULL;
if (trackview.editor.current_mouse_mode() != MouseNote)
return false;
+ // Mmmm, spaghetti
+
switch (ev->type) {
case GDK_KEY_PRESS:
- if (ev->key.keyval == GDK_Delete) {
+ 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;
}
break;
case GDK_KEY_RELEASE:
- if (_command_mode == Remove && ev->key.keyval == GDK_Delete) {
- delete_selection();
- apply_command();
- trackview.editor.set_midi_edit_mode(MidiEditSelect);
+ if (ev->key.keyval == GDK_Delete) {
+ if (_mouse_state == EraseDragging) {
+ delete_selection();
+ apply_command();
+ }
+ if (delete_mod) {
+ trackview.editor.set_midi_edit_mode(original_mode);
+ delete_mod = false;
+ }
}
break;
case GDK_BUTTON_PRESS:
//group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, ev->button.time);
- _state = Pressed;
- press_button = ev->button.button;
+ _mouse_state = Pressed;
+ _pressed_button = ev->button.button;
//cerr << "PRESSED: " << press_button << endl;
return true;
event_x = ev->motion.x;
event_y = ev->motion.y;
group->w2i(event_x, event_y);
+
+ event_frame = trackview.editor.pixel_to_frame(event_x);
+ trackview.editor.snap_to(event_frame);
- switch (_state) {
+ switch (_mouse_state) {
case Pressed: // Drag start
- if (press_button == 1 && _command_mode != Remove) { // Select rect start
+ // Select rect 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;
drag_rect->property_fill_color_rgba()
= ARDOUR_UI::config()->canvasvar_MidiSelectRectFill.get();
- _state = SelectDragging;
+ _mouse_state = SelectDragging;
return true;
- } else if (press_button == 3) { // Add note drag start
+ // 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;
last_y = event_y;
drag_start_x = event_x;
drag_start_y = event_y;
-
- nframes_t event_frame = midi_view()->editor.pixel_to_frame(event_x);
- midi_view()->editor.snap_to(event_frame);
drag_rect = new ArdourCanvas::SimpleRect(*group);
- drag_rect->property_x1() = midi_view()->editor.frame_to_pixel(event_frame);
+ drag_rect->property_x1() = trackview.editor.frame_to_pixel(event_frame);
drag_rect->property_y1() = midi_stream_view()->note_to_y(midi_stream_view()->y_to_note(event_y));
drag_rect->property_x2() = event_x;
drag_rect->property_fill_color_rgba() = 0xFFFFFF66;
- _state = AddDragging;
+ _mouse_state = AddDragging;
return true;
+
+ // Eraser drag start
+ } else if (trackview.editor.current_midi_edit_mode() == MidiEditErase) {
+ cerr << "ERASE DRAGGING\n";
+ _mouse_state = EraseDragging;
+ return false; // ?
}
break;
event_y = t_y;
}
- if (_state == AddDragging) {
- nframes_t event_frame = midi_view()->editor.pixel_to_frame(event_x);
- midi_view()->editor.snap_to(event_frame);
- event_x = midi_view()->editor.frame_to_pixel(event_frame);
- }
+ if (_mouse_state == AddDragging)
+ event_x = trackview.editor.frame_to_pixel(event_frame);
if (drag_rect)
drag_rect->property_x2() = event_x;
- if (drag_rect && _state == SelectDragging) {
+ if (drag_rect && _mouse_state == SelectDragging) {
drag_rect->property_y2() = event_y;
update_drag_selection(drag_start_x, event_x, drag_start_y, event_y);
last_x = event_x;
last_y = event_y;
+ case EraseDragging:
return true;
+
default:
- _state = None;
+ _mouse_state = None;
break;
}
break;
event_y = ev->motion.y;
group->w2i(event_x, event_y);
group->ungrab(ev->button.time);
- switch (_state) {
+ event_frame = trackview.editor.pixel_to_frame(event_x);
+
+ switch (_mouse_state) {
case Pressed: // Clicked
- if (ev->button.button == 1) {
+ switch (trackview.editor.current_midi_edit_mode()) {
+ case MidiEditSelect:
clear_selection();
- } else if (ev->button.button == 3) {
- nframes_t event_frame = midi_view()->editor.pixel_to_frame(event_x);
- midi_view()->editor.snap_to(event_frame);
- event_x = midi_view()->editor.frame_to_pixel(event_frame);
+ break;
+ case MidiEditPencil:
+ trackview.editor.snap_to(event_frame);
+ event_x = trackview.editor.frame_to_pixel(event_frame);
create_note_at(event_x, event_y, _default_note_length);
+ default:
+ break;
}
- _state = None;
+ _mouse_state = None;
return true;
case SelectDragging: // Select drag done
- _state = None;
+ _mouse_state = None;
delete drag_rect;
drag_rect = NULL;
return true;
case AddDragging: // Add drag done
- _state = None;
+ _mouse_state = None;
if (drag_rect->property_x2() > drag_rect->property_x1() + 2) {
create_note_at(drag_rect->property_x1(), drag_rect->property_y1(),
trackview.editor.pixel_to_frame(
}
printf("\n\n");*/
- ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group();
+ //ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group();
+ ArdourCanvas::Group* const group = _note_group;
if (midi_view()->note_mode() == Sustained) {
if ((ev.buffer()[0] & 0xF0) == MIDI_CMD_NOTE_ON) {
void
MidiRegionView::move_selection(double dx, double dy)
{
+ cerr << "MOVE SELECTION: " << dx << ", " << dy << endl;
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i)
(*i)->item()->move(dx, dy);
}
/* This stuff is a bit boilerplatey ATM. Work in progress. */
inline void start_remove_command() {
- _command_mode = Remove;
if (!_delta_command)
_delta_command = _model->new_delta_command();
}
inline void start_delta_command() {
- _command_mode = Delta;
if (!_delta_command)
_delta_command = _model->new_delta_command();
}
}
void note_entered(ArdourCanvas::CanvasMidiEvent* ev) {
- if (_command_mode == Remove && _delta_command && ev->note()) {
+ cerr << "ENTERED, STATE = " << _mouse_state << endl;
+ if (_mouse_state == EraseDragging) {
+ start_delta_command();
ev->selected(true);
_delta_command->remove(*ev->note());
}
void abort_command() {
delete _delta_command;
_delta_command = NULL;
- _command_mode = None;
clear_selection();
}
_model->apply_command(_delta_command);
_delta_command = NULL;
}
- _command_mode = None;
midi_view()->midi_track()->diskstream()->playlist_modified();
}
boost::shared_ptr<ARDOUR::MidiModel> _model;
std::vector<ArdourCanvas::CanvasMidiEvent*> _events;
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;
typedef std::set<ArdourCanvas::CanvasMidiEvent*> Selection;
Selection _selection;
-
- enum CommandMode { None, Remove, Delta };
- CommandMode _command_mode;
};
#endif /* __gtk_ardour_midi_region_view_h__ */