summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-09-14 18:08:58 +0000
committerDavid Robillard <d@drobilla.net>2008-09-14 18:08:58 +0000
commit5befe852184c09175ce62f2df3b017b03c6999ef (patch)
tree6de87b4a914ad78a02546bb04e68cf88159f3e3d
parent23a73ec6825a5c8e6ffbfd4de955a3c5bee09583 (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
-rw-r--r--gtk2_ardour/audio_streamview.cc19
-rw-r--r--gtk2_ardour/editor_mouse.cc13
-rw-r--r--gtk2_ardour/midi_region_view.cc4
-rw-r--r--gtk2_ardour/midi_streamview.cc52
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();