X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_region_view.cc;h=aa964749ff8ad4d6507bb04132ef7105617ea2fc;hb=a7f4f660956250cc98cc519321ad5b8e715f9d0f;hp=361b020b18ebe1d0665fb93272b6f8e99a126908;hpb=4297071b3f7360b17d81ef9cf36b8d75d46d2818;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 361b020b18..aa964749ff 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -65,7 +65,7 @@ using namespace PBD; using namespace Editing; using namespace ArdourCanvas; -MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisViewPtr tv, +MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, boost::shared_ptr r, double spu, Gdk::Color const & basic_color) : RegionView (parent, tv, r, spu, basic_color) , _force_channel(-1) @@ -84,7 +84,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisViewPt _note_group->raise_to_top(); } -MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisViewPtr tv, +MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, boost::shared_ptr r, double spu, Gdk::Color& basic_color, TimeAxisViewItem::Visibility visibility) : RegionView (parent, tv, r, spu, basic_color, false, visibility) @@ -163,7 +163,7 @@ MidiRegionView::init (Gdk::Color const & basic_color, bool wfd) compute_colors (basic_color); - set_height (trackview->current_height()); + set_height (trackview.current_height()); region_muted (); region_sync_changed (); @@ -195,6 +195,12 @@ MidiRegionView::init (Gdk::Color const & basic_color, bool wfd) bool MidiRegionView::canvas_event(GdkEvent* ev) { + PublicEditor& editor (trackview.editor()); + + if (!editor.internal_editing()) { + return false; + } + static double drag_start_x, drag_start_y; static double last_x, last_y; double event_x, event_y; @@ -202,11 +208,6 @@ MidiRegionView::canvas_event(GdkEvent* ev) static ArdourCanvas::SimpleRect* drag_rect = NULL; - if (trackview->editor().current_mouse_mode() != MouseNote) - return false; - - const Editing::MidiEditMode midi_edit_mode = trackview->editor().current_midi_edit_mode(); - switch (ev->type) { case GDK_KEY_PRESS: if (ev->key.keyval == GDK_Shift_L || ev->key.keyval == GDK_Control_L) { @@ -253,8 +254,8 @@ MidiRegionView::canvas_event(GdkEvent* ev) group->w2i(event_x, event_y); // convert event_x to global frame - event_frame = trackview->editor().pixel_to_frame(event_x) + _region->position(); - trackview->editor().snap_to(event_frame); + event_frame = trackview.editor().pixel_to_frame(event_x) + _region->position(); + trackview.editor().snap_to(event_frame); // convert event_frame back to local coordinates relative to position event_frame -= _region->position(); @@ -262,7 +263,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) case Pressed: // Drag start // Select drag start - if (_pressed_button == 1 && midi_edit_mode == MidiEditSelect) { + if (_pressed_button == 1 && editor.current_mouse_mode() == MouseRange) { group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); last_x = event_x; @@ -285,7 +286,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) return true; // Add note drag start - } else if (midi_edit_mode == MidiEditPencil) { + } else if (editor.current_mouse_mode() == MouseObject) { group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); last_x = event_x; @@ -294,7 +295,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) drag_start_y = event_y; drag_rect = new ArdourCanvas::SimpleRect(*group); - drag_rect->property_x1() = trackview->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)); @@ -323,7 +324,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) } if (_mouse_state == AddDragging) - event_x = trackview->editor().frame_to_pixel(event_frame); + event_x = trackview.editor().frame_to_pixel(event_frame); if (drag_rect) { if (event_x > drag_start_x) @@ -357,7 +358,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) event_y = ev->motion.y; group->w2i(event_x, event_y); group->ungrab(ev->button.time); - event_frame = trackview->editor().pixel_to_frame(event_x); + event_frame = trackview.editor().pixel_to_frame(event_x); if (_pressed_button != 1) { return false; @@ -365,12 +366,12 @@ MidiRegionView::canvas_event(GdkEvent* ev) switch (_mouse_state) { case Pressed: // Clicked - switch (midi_edit_mode) { - case MidiEditSelect: - case MidiEditResize: + switch (editor.current_mouse_mode()) { + case MouseRange: + case MouseTimeFX: clear_selection(); break; - case MidiEditPencil: + case MouseObject: create_note_at(event_x, event_y, _default_note_length); default: break; } @@ -385,7 +386,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) _mouse_state = None; if (drag_rect->property_x2() > drag_rect->property_x1() + 2) { const double x = drag_rect->property_x1(); - const double length = trackview->editor().pixel_to_frame( + const double length = trackview.editor().pixel_to_frame( drag_rect->property_x2() - drag_rect->property_x1()); create_note_at(x, drag_rect->property_y1(), frames_to_beats(length)); @@ -410,7 +411,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) void MidiRegionView::create_note_at(double x, double y, double length) { - MidiTimeAxisViewPtr mtv = boost::dynamic_pointer_cast (trackview); + MidiTimeAxisView* const mtv = dynamic_cast(&trackview); MidiStreamView* const view = mtv->midi_view(); double note = midi_stream_view()->y_to_note(y); @@ -419,7 +420,7 @@ MidiRegionView::create_note_at(double x, double y, double length) assert(note <= 127.0); // Start of note in frames relative to region start - nframes64_t start_frames = snap_frame_to_frame(trackview->editor().pixel_to_frame(x)); + nframes64_t start_frames = snap_frame_to_frame(trackview.editor().pixel_to_frame(x)); assert(start_frames >= 0); // Snap length @@ -434,7 +435,7 @@ MidiRegionView::create_note_at(double x, double y, double length) MidiModel::DeltaCommand* cmd = _model->new_delta_command("add note"); cmd->add(new_note); - _model->apply_command(trackview->session(), cmd); + _model->apply_command(trackview.session(), cmd); } @@ -512,7 +513,7 @@ MidiRegionView::apply_command() _marked_for_selection.insert((*i)->note()); } - _model->apply_command(trackview->session(), _delta_command); + _model->apply_command(trackview.session(), _delta_command); _delta_command = NULL; midi_view()->midi_track()->diskstream()->playlist_modified(); @@ -628,7 +629,7 @@ MidiRegionView::display_sysexes() string text = str.str(); ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group(); - const double x = trackview->editor().frame_to_pixel(beats_to_frames(time)); + const double x = trackview.editor().frame_to_pixel(beats_to_frames(time)); double height = midi_stream_view()->contents_height(); @@ -745,7 +746,7 @@ MidiRegionView::apply_note_range (uint8_t min, uint8_t max, bool force) note->property_y1() = y1; note->property_y2() = y2; } else if (CanvasHit* hit = dynamic_cast(event)) { - double x = trackview->editor().frame_to_pixel( + double x = trackview.editor().frame_to_pixel( beats_to_frames(event->note()->time()) - _region->start()); const double diamond_size = midi_stream_view()->note_height() / 2.0; double y = midi_stream_view()->note_to_y(event->note()->note()) @@ -762,12 +763,12 @@ MidiRegionView::apply_note_range (uint8_t min, uint8_t max, bool force) } GhostRegion* -MidiRegionView::add_ghost (TimeAxisViewPtr tv) +MidiRegionView::add_ghost (TimeAxisView& tv) { CanvasNote* note; double unit_position = _region->position () / samples_per_unit; - MidiTimeAxisViewPtr mtv = boost::dynamic_pointer_cast (tv); + MidiTimeAxisView* mtv = dynamic_cast(&tv); MidiGhostRegion* ghost; if (mtv && mtv->midi_view()) { @@ -831,7 +832,7 @@ MidiRegionView::resolve_note(uint8_t note, double end_time) if (_active_notes && _active_notes[note]) { const nframes64_t end_time_frames = beats_to_frames(end_time); - _active_notes[note]->property_x2() = trackview->editor().frame_to_pixel(end_time_frames); + _active_notes[note]->property_x2() = trackview.editor().frame_to_pixel(end_time_frames); _active_notes[note]->property_outline_what() = (guint32) 0xF; // all edges _active_notes[note] = NULL; } @@ -849,7 +850,7 @@ MidiRegionView::extend_active_notes() for (unsigned i=0; i < 128; ++i) { if (_active_notes[i]) { - _active_notes[i]->property_x2() = trackview->editor().frame_to_pixel(_region->length()); + _active_notes[i]->property_x2() = trackview.editor().frame_to_pixel(_region->length()); } } } @@ -857,11 +858,11 @@ MidiRegionView::extend_active_notes() void MidiRegionView::play_midi_note(boost::shared_ptr note) { - if (!trackview->editor().sound_notes()) { + if (!trackview.editor().sound_notes()) { return; } - boost::shared_ptr route_ui = boost::dynamic_pointer_cast (trackview); + RouteUI* route_ui = dynamic_cast (&trackview); assert(route_ui); route_ui->midi_track()->write_immediate_event( @@ -877,7 +878,7 @@ MidiRegionView::play_midi_note(boost::shared_ptr note) bool MidiRegionView::play_midi_note_off(boost::shared_ptr note) { - boost::shared_ptr route_ui = boost::dynamic_pointer_cast (trackview); + RouteUI* route_ui = dynamic_cast (&trackview); assert(route_ui); route_ui->midi_track()->write_immediate_event( @@ -916,12 +917,12 @@ MidiRegionView::add_note(const boost::shared_ptr note) CanvasNoteEvent* event = 0; - const double x = trackview->editor().frame_to_pixel(note_start_frames - _region->start()); + const double x = trackview.editor().frame_to_pixel(note_start_frames - _region->start()); if (midi_view()->note_mode() == Sustained) { const double y1 = midi_stream_view()->note_to_y(note->note()); const double note_endpixel = - trackview->editor().frame_to_pixel(note_end_frames - _region->start()); + trackview.editor().frame_to_pixel(note_end_frames - _region->start()); CanvasNote* ev_rect = new CanvasNote(*this, *group, note); ev_rect->property_x1() = x; @@ -929,7 +930,7 @@ MidiRegionView::add_note(const boost::shared_ptr note) if (note->length() > 0) { ev_rect->property_x2() = note_endpixel; } else { - ev_rect->property_x2() = trackview->editor().frame_to_pixel(_region->length()); + ev_rect->property_x2() = trackview.editor().frame_to_pixel(_region->length()); } ev_rect->property_y2() = y1 + floor(midi_stream_view()->note_height()); @@ -996,7 +997,7 @@ MidiRegionView::add_pgm_change(PCEvent& program, const string& displaytext) assert(program.time >= 0); ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group(); - const double x = trackview->editor().frame_to_pixel(beats_to_frames(program.time)); + const double x = trackview.editor().frame_to_pixel(beats_to_frames(program.time)); double height = midi_stream_view()->contents_height(); @@ -1319,9 +1320,9 @@ MidiRegionView::note_dropped(CanvasNoteEvent* ev, double dt, uint8_t dnote) nframes64_t start_frames = beats_to_frames((*i)->note()->time()); if (dt >= 0) { - start_frames += snap_frame_to_frame(trackview->editor().pixel_to_frame(dt)); + start_frames += snap_frame_to_frame(trackview.editor().pixel_to_frame(dt)); } else { - start_frames -= snap_frame_to_frame(trackview->editor().pixel_to_frame(-dt)); + start_frames -= snap_frame_to_frame(trackview.editor().pixel_to_frame(-dt)); } copy->set_time(frames_to_beats(start_frames)); @@ -1361,7 +1362,7 @@ MidiRegionView::note_dropped(CanvasNoteEvent* ev, double dt, uint8_t dnote) nframes64_t MidiRegionView::snap_pixel_to_frame(double x) { - PublicEditor& editor = trackview->editor(); + PublicEditor& editor = trackview.editor(); // x is region relative, convert it to global absolute frames nframes64_t frame = editor.pixel_to_frame(x) + _region->position(); editor.snap_to(frame); @@ -1371,7 +1372,7 @@ MidiRegionView::snap_pixel_to_frame(double x) nframes64_t MidiRegionView::snap_frame_to_frame(nframes64_t x) { - PublicEditor& editor = trackview->editor(); + PublicEditor& editor = trackview.editor(); // x is region relative, convert it to global absolute frames nframes64_t frame = x + _region->position(); editor.snap_to(frame); @@ -1381,14 +1382,14 @@ MidiRegionView::snap_frame_to_frame(nframes64_t x) double MidiRegionView::snap_to_pixel(double x) { - return (double) trackview->editor().frame_to_pixel(snap_pixel_to_frame(x)); + return (double) trackview.editor().frame_to_pixel(snap_pixel_to_frame(x)); } double MidiRegionView::get_position_pixels() { nframes64_t region_frame = get_position(); - return trackview->editor().frame_to_pixel(region_frame); + return trackview.editor().frame_to_pixel(region_frame); } nframes64_t