X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Fmidi_region_view.cc;h=db3f4760bc3c1bfa5a8d46ae63de004eefaf6c32;hb=cc2e6aeac32f963ac4215c157d562278a5013b71;hp=d681bb43deceb32b4bb74c8e94fd8b5bed5d7aa5;hpb=5e5c71614664d02e1160454f080505fbcc2078aa;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index d681bb43de..db3f4760bc 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -89,7 +89,7 @@ PBD::Signal1 MidiRegionView::SelectionCleared; #define MIDI_BP_ZERO ((Config->get_first_midi_bank_is_zero())?0:1) MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, - boost::shared_ptr r, double spu, Gdk::Color const & basic_color) + boost::shared_ptr r, double spu, uint32_t basic_color) : RegionView (parent, tv, r, spu, basic_color) , _current_range_min(0) , _current_range_max(0) @@ -125,7 +125,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & } MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, - boost::shared_ptr r, double spu, Gdk::Color& basic_color, + boost::shared_ptr r, double spu, uint32_t basic_color, TimeAxisViewItem::Visibility visibility) : RegionView (parent, tv, r, spu, basic_color, false, visibility) , _current_range_min(0) @@ -164,7 +164,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & void MidiRegionView::parameter_changed (std::string const & p) { - if (p == "diplay-first-midi-bank-as-zero") { + if (p == "display-first-midi-bank-as-zero") { if (_enable_display) { redisplay_model(); } @@ -197,13 +197,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other) , pre_press_cursor (0) , _note_player (0) { - Gdk::Color c; - int r,g,b,a; - - UINT_TO_RGBA (other.fill_color, &r, &g, &b, &a); - c.set_rgb_p (r/255.0, g/255.0, b/255.0); - - init (c, false); + init (false); } MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr region) @@ -231,17 +225,11 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptrmidi_source(0)->model(); _enable_display = false; - RegionView::init (basic_color, false); - - compute_colors (basic_color); + RegionView::init (false); set_height (trackview.current_height()); @@ -350,8 +336,8 @@ MidiRegionView::canvas_group_event(GdkEvent* ev) if ((!trackview.editor().internal_editing() && trackview.editor().current_mouse_mode() != MouseGain) || (trackview.editor().current_mouse_mode() == MouseTimeFX) || (trackview.editor().current_mouse_mode() == MouseZoom)) { - // handle non-draw modes elsewhere - return false; + // handle non-internal-edit/non-draw modes elsewhere + return RegionView::canvas_group_event (ev); } switch (ev->type) { @@ -389,13 +375,6 @@ MidiRegionView::canvas_group_event(GdkEvent* ev) return trackview.editor().canvas_region_view_event (ev, group, this); } -void -MidiRegionView::remove_ghost_note () -{ - delete _ghost_note; - _ghost_note = 0; -} - bool MidiRegionView::enter_notify (GdkEventCrossing* ev) { @@ -657,9 +636,13 @@ MidiRegionView::motion (GdkEventMotion* ev) default: break; + } - return false; + /* we may be dragging some non-note object (eg. patch-change, sysex) + */ + + return editor.drags()->motion_handler ((GdkEvent *) ev, false); } @@ -1118,7 +1101,7 @@ MidiRegionView::redisplay_model() MidiModel::Notes& notes (_model->notes()); _optimization_iterator = _events.begin(); - bool empty_when_starting = !_events.empty(); + bool empty_when_starting = _events.empty(); for (MidiModel::Notes::iterator n = notes.begin(); n != notes.end(); ++n) { @@ -1127,8 +1110,8 @@ MidiRegionView::redisplay_model() bool visible; if (note_in_region_range (note, visible)) { - - if (empty_when_starting && (cne = find_canvas_note (note)) != 0) { + + if (!empty_when_starting && (cne = find_canvas_note (note)) != 0) { cne->validate (); @@ -1153,8 +1136,8 @@ MidiRegionView::redisplay_model() } } else { - - if (empty_when_starting && (cne = find_canvas_note (note)) != 0) { + + if (!empty_when_starting && (cne = find_canvas_note (note)) != 0) { cne->validate (); cne->hide (); } @@ -1164,7 +1147,7 @@ MidiRegionView::redisplay_model() /* remove note items that are no longer valid */ - if (empty_when_starting) { + if (!empty_when_starting) { for (Events::iterator i = _events.begin(); i != _events.end(); ) { if (!(*i)->valid ()) { @@ -1379,14 +1362,12 @@ MidiRegionView::reset_width_dependent_items (double pixel_width) void MidiRegionView::set_height (double height) { - static const double FUDGE = 2.0; - const double old_height = _height; + double old_height = _height; RegionView::set_height(height); - _height = height - FUDGE; - apply_note_range(midi_stream_view()->lowest_note(), - midi_stream_view()->highest_note(), - height != old_height + FUDGE); + apply_note_range (midi_stream_view()->lowest_note(), + midi_stream_view()->highest_note(), + height != old_height); if (name_text) { name_text->raise_to_top(); @@ -1439,10 +1420,7 @@ MidiRegionView::apply_note_range (uint8_t min, uint8_t max, bool force) cnote->set_y1 (y1); } else if (Hit* chit = dynamic_cast(event)) { - - const double diamond_size = update_hit (chit); - - chit->set_height (diamond_size); + update_hit (chit); } } } @@ -1526,8 +1504,9 @@ MidiRegionView::resolve_note(uint8_t note, double end_time) const framepos_t end_time_frames = region_beats_to_region_frames(end_time); _active_notes[note]->set_x1 (trackview.editor().sample_to_pixel(end_time_frames)); - _active_notes[note]->set_outline_what (0xf); + _active_notes[note]->set_outline_all (); _active_notes[note] = 0; + } } @@ -1657,15 +1636,18 @@ MidiRegionView::update_note (Note* ev, bool update_ghost_regions) Note* const old_rect = _active_notes[note->note()]; boost::shared_ptr old_note = old_rect->note(); old_rect->set_x1 (x); - old_rect->set_outline_what (0xF); + old_rect->set_outline_all (); } _active_notes[note->note()] = ev; } /* outline all but right edge */ - ev->set_outline_what (0x1 & 0x4 & 0x8); + ev->set_outline_what (ArdourCanvas::Rectangle::What ( + ArdourCanvas::Rectangle::TOP| + ArdourCanvas::Rectangle::LEFT| + ArdourCanvas::Rectangle::BOTTOM)); } else { /* outline all edges */ - ev->set_outline_what (0xF); + ev->set_outline_all (); } if (update_ghost_regions) { @@ -1678,19 +1660,18 @@ MidiRegionView::update_note (Note* ev, bool update_ghost_regions) } } -double +void MidiRegionView::update_hit (Hit* ev) { boost::shared_ptr note = ev->note(); const framepos_t note_start_frames = source_beats_to_region_frames(note->time()); const double x = trackview.editor().sample_to_pixel(note_start_frames); - const double diamond_size = midi_stream_view()->note_height() / 2.0; - const double y = midi_stream_view()->note_to_y(note->note()) + ((diamond_size-2) / 4.0); + const double diamond_size = midi_stream_view()->note_height(); + const double y = midi_stream_view()->note_to_y(note->note()) + (diamond_size/2.0); ev->set_position (ArdourCanvas::Duple (x, y)); - - return diamond_size; + ev->set_height (diamond_size); } /** Add a MIDI note to the view (with length). @@ -1704,8 +1685,6 @@ MidiRegionView::add_note(const boost::shared_ptr note, bool visible) { NoteBase* event = 0; - //ArdourCanvas::Group* const group = (ArdourCanvas::Group*) get_canvas_group(); - if (midi_view()->note_mode() == Sustained) { Note* ev_rect = new Note (*this, _note_group, note); @@ -2135,32 +2114,39 @@ MidiRegionView::invert_selection () void MidiRegionView::select_matching_notes (uint8_t notenum, uint16_t channel_mask, bool add, bool extend) { + bool have_selection = !_selection.empty(); uint8_t low_note = 127; uint8_t high_note = 0; MidiModel::Notes& notes (_model->notes()); _optimization_iterator = _events.begin(); + + if (extend && !have_selection) { + extend = false; + } + /* scan existing selection to get note range */ + + for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { + if ((*i)->note()->note() < low_note) { + low_note = (*i)->note()->note(); + } + if ((*i)->note()->note() > high_note) { + high_note = (*i)->note()->note(); + } + } + if (!add) { clear_selection (); - } - if (extend && _selection.empty()) { - extend = false; + if (!extend && (low_note == high_note) && (high_note == notenum)) { + /* only note previously selected is the one we are + * reselecting. treat this as cancelling the selection. + */ + return; + } } if (extend) { - - /* scan existing selection to get note range */ - - for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { - if ((*i)->note()->note() < low_note) { - low_note = (*i)->note()->note(); - } - if ((*i)->note()->note() > high_note) { - high_note = (*i)->note()->note(); - } - } - low_note = min (low_note, notenum); high_note = max (high_note, notenum); } @@ -3073,7 +3059,7 @@ MidiRegionView::nudge_notes (bool forward) return; } - Evoral::MusicalTime delta = region_frames_to_region_beats (fabs (distance)); + Evoral::MusicalTime delta = region_frames_to_region_beats (fabs ((double)distance)); if (!forward) { delta = -delta; @@ -3291,7 +3277,7 @@ MidiRegionView::selection_as_cut_buffer () const { Notes notes; - for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { + for (Selection::const_iterator i = _selection.begin(); i != _selection.end(); ++i) { NoteType* n = (*i)->note().get(); notes.insert (boost::shared_ptr (new NoteType (*n))); } @@ -3541,6 +3527,13 @@ MidiRegionView::create_ghost_note (double x, double y) show_verbose_cursor (_ghost_note->note ()); } +void +MidiRegionView::remove_ghost_note () +{ + delete _ghost_note; + _ghost_note = 0; +} + void MidiRegionView::snap_changed () {