diff options
author | David Robillard <d@drobilla.net> | 2008-09-14 18:08:58 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-09-14 18:08:58 +0000 |
commit | 5befe852184c09175ce62f2df3b017b03c6999ef (patch) | |
tree | 6de87b4a914ad78a02546bb04e68cf88159f3e3d /gtk2_ardour | |
parent | 23a73ec6825a5c8e6ffbfd4de955a3c5bee09583 (diff) |
Fix stacking of MIDI stream views to match that of audio.
Make copy and brush operations type generic (i.e. fix brushing for MIDI regions).
git-svn-id: svn://localhost/ardour2/branches/3.0@3724 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/audio_streamview.cc | 19 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 13 | ||||
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 4 | ||||
-rw-r--r-- | gtk2_ardour/midi_streamview.cc | 52 |
4 files changed, 59 insertions, 29 deletions
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 0e3dda0bd6..7ab0a07f6f 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -392,8 +392,9 @@ AudioStreamView::redisplay_diskstream () apl->foreach_crossfade (this, &AudioStreamView::add_crossfade); } - RegionViewList copy; + RegionViewList copy; + /* Place regions */ for (i = region_views.begin(); i != region_views.end(); ) { tmp = i; tmp++; @@ -407,10 +408,8 @@ AudioStreamView::redisplay_diskstream () (*i)->enable_display(true); } - /* - sort regionviews by layer so that when we call region_layered () - the canvas layering works out (in non-stacked mode). - */ + /* Sort regionviews by layer so that when we call region_layered () + the canvas layering works out (in non-stacked mode). */ if (copy.size() == 0) { copy.push_front((*i)); @@ -433,7 +432,6 @@ AudioStreamView::redisplay_diskstream () } for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) { - if ((*j)->region()->layer() >= (*i)->region()->layer()) { copy.insert(j, (*i)); break; @@ -456,12 +454,11 @@ AudioStreamView::redisplay_diskstream () xi = tmpx; } - /* now fix canvas layering */ - + /* Fix canvas layering */ for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) { - (*j)->enable_display(true); - (*j)->set_height (height); - region_layered (*j); + (*j)->enable_display(true); + (*j)->set_height (height); + region_layered (*j); } } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 7a05fcdc56..24a6fb47ef 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -3212,9 +3212,8 @@ Editor::possibly_copy_regions_during_grab (GdkEvent* event) continue; } - const boost::shared_ptr<const Region> original = arv->region(); + const boost::shared_ptr<const Region> original = rv->region(); boost::shared_ptr<Region> region_copy = RegionFactory::create (original); - boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (region_copy); nrv->get_canvas_group()->show (); new_regionviews.push_back (nrv); @@ -3918,7 +3917,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event disappear on copying regions */ - //rv->get_time_axis_view().reveal_dependent_views (*rv); + //rv->get_time_axis_view().reveal_dependent_views (*rv); } else if (changed_tracks) { new_region = RegionFactory::create (rv->region()); @@ -5546,10 +5545,6 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes64_t pos) { /* no brushing without a useful snap setting */ - // FIXME - AudioRegionView* arv = dynamic_cast<AudioRegionView*>(rv); - assert(arv); - switch (snap_mode) { case SnapMagnetic: return; /* can't work because it allows region to be placed anywhere */ @@ -5571,7 +5566,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes64_t pos) return; } - RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(&arv->get_time_axis_view()); + RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(&rv->get_time_axis_view()); if (rtv == 0 || !rtv->is_track()) { return; @@ -5581,7 +5576,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes64_t pos) double speed = rtv->get_diskstream()->speed(); XMLNode &before = playlist->get_state(); - playlist->add_region (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (arv->audio_region())), (nframes64_t) (pos * speed)); + playlist->add_region (RegionFactory::create (rv->region()), (nframes64_t) (pos * speed)); XMLNode &after = playlist->get_state(); session->add_command(new MementoCommand<Playlist>(*playlist.get(), &before, &after)); diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 2f414405a0..5ad459cb34 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -618,6 +618,10 @@ void MidiRegionView::set_y_position_and_height (double y, double h) { RegionView::set_y_position_and_height(y, h - 1); + + /* XXX why is this code here */ + + _height = h; if (_enable_display) { diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 5b162dc510..8c25805984 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -190,21 +190,23 @@ MidiStreamView::redisplay_diskstream () mrv->midi_region()->midi_source(0)->load_model(); } - //_lowest_note = 60; // middle C - //_highest_note = _lowest_note + 11; - if (_trackview.is_midi_track()) { - _trackview.get_diskstream()->playlist()->foreach_region (static_cast<StreamView*>(this), &StreamView::add_region_view); + _trackview.get_diskstream()->playlist()->foreach_region ( + static_cast<StreamView*>(this), &StreamView::add_region_view); } /* Always display at least one octave */ if (_highest_note == 127) { - if (_lowest_note > (127 - 11)) + if (_lowest_note > (127 - 11)) { _lowest_note = 127 - 11; + } } else if (_highest_note < _lowest_note + 11) { _highest_note = _lowest_note + 11; } + RegionViewList copy; + + /* Place regions */ for (i = region_views.begin(); i != region_views.end(); ) { tmp = i; tmp++; @@ -216,16 +218,48 @@ MidiStreamView::redisplay_diskstream () (*i)->enable_display(true); (*i)->set_y_position_and_height(0, height); // apply note range } + + /* Sort regionviews by layer so that when we call region_layered () + the canvas layering works out (in non-stacked mode). */ + + if (copy.size() == 0) { + copy.push_front((*i)); + i = tmp; + continue; + } + + RegionViewList::iterator k = copy.begin(); + RegionViewList::iterator l = copy.end(); + l--; + + if ((*i)->region()->layer() <= (*k)->region()->layer()) { + copy.push_front((*i)); + i = tmp; + continue; + } else if ((*i)->region()->layer() >= (*l)->region()->layer()) { + copy.push_back((*i)); + i = tmp; + continue; + } + + for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) { + if ((*j)->region()->layer() >= (*i)->region()->layer()) { + copy.insert(j, (*i)); + break; + } + } i = tmp; } - /* now fix layering */ - - for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) { - region_layered (*i); + /* Fix canvas layering */ + for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) { + (*j)->enable_display(true); + (*j)->set_height (height); + region_layered (*j); } + /* Update note range and draw note lines */ note_range_adjustment.set_page_size(_highest_note - _lowest_note); note_range_adjustment.set_value(_lowest_note); NoteRangeChanged(); |