diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 301e9ddcb4..5d170954ae 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -242,6 +242,16 @@ MidiStreamView::update_data_note_range(uint8_t min, uint8_t max) return dirty; } +void +MidiStreamView::set_layer_display (LayerDisplay d) +{ + if (d != Overlaid) { + return; + } + + StreamView::set_layer_display (d); +} + void MidiStreamView::redisplay_track () { diff --git a/gtk2_ardour/midi_streamview.h b/gtk2_ardour/midi_streamview.h index 59cf2da9d7..3cf5f9a08e 100644 --- a/gtk2_ardour/midi_streamview.h +++ b/gtk2_ardour/midi_streamview.h @@ -77,6 +77,8 @@ class MidiStreamView : public StreamView void update_note_range(uint8_t note_num); + void set_layer_display (LayerDisplay); + bool can_change_layer_display() const { return false; } void redisplay_track (); inline double contents_height() const diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 2bb7577319..25edb7a720 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -632,21 +632,27 @@ RouteTimeAxisView::build_display_menu () int overlaid = 0; int stacked = 0; + int unchangeable = 0; TrackSelection const & s = _editor.get_selection().tracks; + for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) { StreamView* v = (*i)->view (); if (!v) { continue; } - switch (v->layer_display ()) { - case Overlaid: - ++overlaid; - break; - case Stacked: - case Expanded: - ++stacked; - break; + if (v->can_change_layer_display()) { + switch (v->layer_display ()) { + case Overlaid: + ++overlaid; + break; + case Stacked: + case Expanded: + ++stacked; + break; + } + } else { + unchangeable++; } } @@ -664,12 +670,20 @@ RouteTimeAxisView::build_display_menu () i->set_inconsistent (overlaid != 0 && stacked != 0); i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_layer_display), Overlaid, true)); + if (unchangeable) { + i->set_sensitive (false); + } + layers_items.push_back (RadioMenuElem (layers_group, _("Stacked"))); i = dynamic_cast (&layers_items.back ()); i->set_active (overlaid == 0 && stacked != 0); i->set_inconsistent (overlaid != 0 && stacked != 0); i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_layer_display), Stacked, true)); + if (unchangeable) { + i->set_sensitive (false); + } + _ignore_set_layer_display = false; items.push_back (MenuElem (_("Layers"), *layers_menu)); diff --git a/gtk2_ardour/streamview.h b/gtk2_ardour/streamview.h index 8a56040afb..834890f57d 100644 --- a/gtk2_ardour/streamview.h +++ b/gtk2_ardour/streamview.h @@ -76,7 +76,8 @@ public: virtual int set_samples_per_pixel (double); gdouble get_samples_per_pixel () const { return _samples_per_pixel; } - void set_layer_display (LayerDisplay); + virtual void set_layer_display (LayerDisplay); + virtual bool can_change_layer_display() const { return true; } LayerDisplay layer_display () const { return _layer_display; } ArdourCanvas::Container* canvas_item() { return _canvas_group; }