X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Fmidi_streamview.cc;h=9258cf027d385973dd4080f64bcce0a4c881cc31;hb=0077923dea412ecbd0abe8734237597dd59c2f5a;hp=3d2c54d87f12730452ff4c4a4889fbbe0c59d10b;hpb=6e912a0aa31313636e2957ec0aa97d4103ee117f;p=ardour.git diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 3d2c54d87f..9258cf027d 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -34,8 +34,6 @@ #include "ardour/session.h" #include "ardour/smf_source.h" -#include "ardour_ui.h" -#include "global_signals.h" #include "gui_thread.h" #include "midi_region_view.h" #include "midi_streamview.h" @@ -46,6 +44,7 @@ #include "region_view.h" #include "rgb_macros.h" #include "selection.h" +#include "ui_config.h" #include "utils.h" #include "i18n.h" @@ -76,7 +75,7 @@ MidiStreamView::MidiStreamView (MidiTimeAxisView& tv) can be put below ghost regions from MIDI underlays */ _note_lines = new ArdourCanvas::LineSet (_canvas_group, ArdourCanvas::LineSet::Horizontal); - + _note_lines->Event.connect( sigc::bind(sigc::mem_fun(_trackview.editor(), &PublicEditor::canvas_stream_view_event), @@ -86,7 +85,7 @@ MidiStreamView::MidiStreamView (MidiTimeAxisView& tv) color_handler (); - ColorsChanged.connect(sigc::mem_fun(*this, &MidiStreamView::color_handler)); + UIConfiguration::instance().ColorsChanged.connect(sigc::mem_fun(*this, &MidiStreamView::color_handler)); note_range_adjustment.set_page_size(_highest_note - _lowest_note); note_range_adjustment.set_value(_lowest_note); @@ -153,12 +152,6 @@ MidiStreamView::add_region_view_internal (boost::shared_ptr r, bool wait region_views.push_front (region_view); - if (_trackview.editor().internal_editing()) { - region_view->hide_rect (); - } else { - region_view->show_rect (); - } - /* display events and find note range */ display_region (region_view, wait_for_data); @@ -330,7 +323,7 @@ MidiStreamView::draw_note_lines() */ if (i <= highest_note()) { - _note_lines->add (y, 1.0, ARDOUR_UI::config()->color ("piano roll black outline")); + _note_lines->add (y, 1.0, UIConfiguration::instance().color ("piano roll black outline")); } /* now add a thicker line/bar which covers the entire vertical @@ -343,16 +336,16 @@ MidiStreamView::draw_note_lines() case 6: case 8: case 10: - color = ARDOUR_UI::config()->color_mod ("piano roll black", "piano roll black"); + color = UIConfiguration::instance().color_mod ("piano roll black", "piano roll black"); break; default: - color = ARDOUR_UI::config()->color_mod ("piano roll white", "piano roll white"); + color = UIConfiguration::instance().color_mod ("piano roll white", "piano roll white"); break; } double h = y - prev_y; double mid = y + (h/2.0); - + if (height > 1.0) { // XXX ? should that not be h >= 1 ? _note_lines->add (mid, h, color); } @@ -449,7 +442,7 @@ MidiStreamView::setup_rec_box () _trackview.session()->record_status() == Session::Recording && _trackview.track()->record_enabled()) { - if (Config->get_show_waveforms_while_recording() && rec_regions.size() == rec_rects.size()) { + if (UIConfiguration::instance().get_show_waveforms_while_recording() && rec_regions.size() == rec_rects.size()) { /* add a new region, but don't bother if they set show-waveforms-while-recording mid-record */ @@ -572,9 +565,9 @@ MidiStreamView::color_handler () draw_note_lines (); if (_trackview.is_midi_track()) { - canvas_rect->set_fill_color (ARDOUR_UI::config()->color_mod ("midi track base", "midi track base")); + canvas_rect->set_fill_color (UIConfiguration::instance().color_mod ("midi track base", "midi track base")); } else { - canvas_rect->set_fill_color (ARDOUR_UI::config()->color ("midi bus base")); + canvas_rect->set_fill_color (UIConfiguration::instance().color ("midi bus base")); } } @@ -626,7 +619,7 @@ MidiStreamView::update_rec_box () uint8_t MidiStreamView::y_to_note (double y) const { - int const n = ((contents_height() - y - 1) / contents_height() * (double)contents_note_range()) + int const n = ((contents_height() - y) / contents_height() * (double)contents_note_range()) + lowest_note(); if (n < 0) { @@ -635,7 +628,8 @@ MidiStreamView::y_to_note (double y) const return 127; } - return n; + /* min due to rounding and/or off-by-one errors */ + return min ((uint8_t) n, highest_note()); } /** Suspend updates to the regions' note ranges and our @@ -654,21 +648,47 @@ void MidiStreamView::resume_updates () { _updates_suspended = false; - + draw_note_lines (); apply_note_range_to_regions (); _canvas_group->redraw (); } -void -MidiStreamView::leave_internal_edit_mode () +struct RegionPositionSorter { + bool operator() (RegionView* a, RegionView* b) { + return a->region()->position() < b->region()->position(); + } +}; + +bool +MidiStreamView::paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx) { - StreamView::leave_internal_edit_mode (); - for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) { - MidiRegionView* mrv = dynamic_cast (*i); - if (mrv) { - mrv->clear_selection (); + /* Paste into the first region which starts on or before pos. Only called when + using an internal editing tool. */ + + if (region_views.empty()) { + return false; + } + + region_views.sort (RegionView::PositionOrder()); + + list::const_iterator prev = region_views.begin (); + + for (list::const_iterator i = region_views.begin(); i != region_views.end(); ++i) { + if ((*i)->region()->position() > pos) { + break; } + prev = i; } + + boost::shared_ptr r = (*prev)->region (); + + /* If *prev doesn't cover pos, it's no good */ + if (r->position() > pos || ((r->position() + r->length()) < pos)) { + return false; + } + + MidiRegionView* mrv = dynamic_cast (*prev); + return mrv ? mrv->paste(pos, selection, ctx) : false; }