Fix stacking of MIDI stream views to match that of audio.
authorDavid Robillard <d@drobilla.net>
Sun, 14 Sep 2008 18:08:58 +0000 (18:08 +0000)
committerDavid Robillard <d@drobilla.net>
Sun, 14 Sep 2008 18:08:58 +0000 (18:08 +0000)
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

gtk2_ardour/audio_streamview.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_streamview.cc

index 0e3dda0bd680b234e0a0800f07914ce63a996bac..7ab0a07f6f728fd11e006e33a2ece8bed4fb1a90 100644 (file)
@@ -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);
        }
 }
 
index 7a05fcdc56a0e1925fdec16f33f6c4b6ffa36be6..24a6fb47efd9c60d8d48026694c48ea07691850e 100644 (file)
@@ -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));
        
index 2f414405a068b6629a850169a5ecec473587c198..5ad459cb346283ca427db9438b465ba43f5a3f8f 100644 (file)
@@ -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) {
 
index 5b162dc510c5a4e309659376a4e18b7762b07716..8c258059841ff237c1263fdff675f202ee7b4b1e 100644 (file)
@@ -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();