+void
+RouteTimeAxisView::update_rec_display ()
+{
+ RouteUI::update_rec_display ();
+ name_entry.set_sensitive (!_route->record_enabled());
+}
+
+void
+RouteTimeAxisView::set_layer_display (LayerDisplay d)
+{
+ if (_view) {
+ _view->set_layer_display (d);
+ }
+}
+
+LayerDisplay
+RouteTimeAxisView::layer_display () const
+{
+ if (_view) {
+ return _view->layer_display ();
+ }
+
+ /* we don't know, since we don't have a _view, so just return something */
+ return Overlaid;
+}
+
+
+
+boost::shared_ptr<AutomationTimeAxisView>
+RouteTimeAxisView::automation_child(Evoral::Parameter param)
+{
+ AutomationTracks::iterator i = _automation_tracks.find(param);
+ if (i != _automation_tracks.end())
+ return i->second->track;
+ else
+ return boost::shared_ptr<AutomationTimeAxisView>();
+}
+
+void
+RouteTimeAxisView::fast_update ()
+{
+ gm.get_level_meter().update_meters ();
+}
+
+void
+RouteTimeAxisView::hide_meter ()
+{
+ clear_meter ();
+ gm.get_level_meter().hide_meters ();
+}
+
+void
+RouteTimeAxisView::show_meter ()
+{
+ reset_meter ();
+}
+
+void
+RouteTimeAxisView::reset_meter ()
+{
+ if (Config->get_show_track_meters()) {
+ gm.get_level_meter().setup_meters (height-5);
+ } else {
+ hide_meter ();
+ }
+}
+
+void
+RouteTimeAxisView::clear_meter ()
+{
+ gm.get_level_meter().clear_meters ();
+}
+
+void
+RouteTimeAxisView::meter_changed (void *src)
+{
+ ENSURE_GUI_THREAD (bind (mem_fun(*this, &RouteTimeAxisView::meter_changed), src));
+ reset_meter();
+}
+
+void
+RouteTimeAxisView::io_changed (IOChange change, void *src)
+{
+ reset_meter ();
+}
+
+void
+RouteTimeAxisView::build_underlay_menu(Gtk::Menu* parent_menu) {
+ using namespace Menu_Helpers;
+
+ if(!_underlay_streams.empty()) {
+ MenuList& parent_items = parent_menu->items();
+ Menu* gs_menu = manage (new Menu);
+ gs_menu->set_name ("ArdourContextMenu");
+ MenuList& gs_items = gs_menu->items();
+
+ parent_items.push_back (MenuElem (_("Underlays"), *gs_menu));
+
+ for(UnderlayList::iterator it = _underlay_streams.begin(); it != _underlay_streams.end(); ++it) {
+ gs_items.push_back(MenuElem(string_compose(_("Remove \"%1\""), (*it)->trackview().name()),
+ bind(mem_fun(*this, &RouteTimeAxisView::remove_underlay), *it)));
+ }
+ }
+}
+
+bool
+RouteTimeAxisView::set_underlay_state()
+{
+ if(!underlay_xml_node) {
+ return false;
+ }
+
+ XMLNodeList nlist = underlay_xml_node->children();
+ XMLNodeConstIterator niter;
+ XMLNode *child_node;
+
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+ child_node = *niter;
+
+ if(child_node->name() != "Underlay") {
+ continue;
+ }
+
+ XMLProperty* prop = child_node->property ("id");
+ if (prop) {
+ PBD::ID id (prop->value());
+
+ RouteTimeAxisView* v = _editor.get_route_view_by_id (id);
+
+ if (v) {
+ add_underlay(v->view(), false);
+ }
+ }
+ }
+
+ return false;
+}
+
+void
+RouteTimeAxisView::add_underlay(StreamView* v, bool update_xml)
+{
+ if(!v) {
+ return;
+ }
+
+ RouteTimeAxisView& other = v->trackview();
+
+ if(find(_underlay_streams.begin(), _underlay_streams.end(), v) == _underlay_streams.end()) {
+ if(find(other._underlay_mirrors.begin(), other._underlay_mirrors.end(), this) != other._underlay_mirrors.end()) {
+ fatal << _("programming error: underlay reference pointer pairs are inconsistent!") << endmsg;
+ /*NOTREACHED*/
+ }
+
+ _underlay_streams.push_back(v);
+ other._underlay_mirrors.push_back(this);
+
+ v->foreach_regionview(mem_fun(*this, &RouteTimeAxisView::add_ghost));
+
+ if(update_xml) {
+ if(!underlay_xml_node) {
+ ensure_xml_node();
+ underlay_xml_node = xml_node->add_child("Underlays");
+ }
+
+ XMLNode* node = underlay_xml_node->add_child("Underlay");
+ XMLProperty* prop = node->add_property("id");
+ prop->set_value(v->trackview().route()->id().to_s());
+ }
+ }
+}
+
+void
+RouteTimeAxisView::remove_underlay(StreamView* v)
+{
+ if(!v) {
+ return;
+ }
+
+ UnderlayList::iterator it = find(_underlay_streams.begin(), _underlay_streams.end(), v);
+ RouteTimeAxisView& other = v->trackview();
+
+ if(it != _underlay_streams.end()) {
+ UnderlayMirrorList::iterator gm = find(other._underlay_mirrors.begin(), other._underlay_mirrors.end(), this);
+
+ if(gm == other._underlay_mirrors.end()) {
+ fatal << _("programming error: underlay reference pointer pairs are inconsistent!") << endmsg;
+ /*NOTREACHED*/
+ }
+
+ v->foreach_regionview(mem_fun(*this, &RouteTimeAxisView::remove_ghost));
+
+ _underlay_streams.erase(it);
+ other._underlay_mirrors.erase(gm);
+
+ if(underlay_xml_node) {
+ underlay_xml_node->remove_nodes_and_delete("id", v->trackview().route()->id().to_s());
+ }
+ }
+}
+