X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_time_axis.cc;h=992a19df0e0c75dd3c94aa2bfeb0f3a58e237e4e;hb=5db22a33c1ec13a14dd6654bf08b0ecd377ae67d;hp=411a14b2be36306ca6d0feea00dacd58d00e4e3c;hpb=6991a07902cc844b87c895aa56de613c96b88b4f;p=ardour.git diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 411a14b2be..992a19df0e 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -83,7 +83,7 @@ #include "ardour/track.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; @@ -95,8 +95,7 @@ using namespace std; using std::list; RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas) - : AxisView(sess) - , RouteUI(sess) + : RouteUI(sess) , TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas) , _view (0) , parent_canvas (canvas) @@ -124,6 +123,17 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan number_label.set_fallthrough_to_parent (true); sess->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::parameter_changed, this, _1), gui_context()); + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::parameter_changed)); + + parameter_changed ("editor-stereo-only-meters"); +} + +void +RouteTimeAxisView::route_property_changed (const PBD::PropertyChange& what_changed) +{ + if (what_changed.contains (ARDOUR::Properties::name)) { + label_view (); + } } void @@ -168,9 +178,9 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) playlist_button.set_name ("route button"); automation_button.set_name ("route button"); - route_group_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false); - playlist_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::playlist_click)); - automation_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::automation_click)); + route_group_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false); + playlist_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::playlist_click), false); + automation_button.signal_button_press_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::automation_click), false); if (is_track()) { @@ -188,8 +198,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) gm.set_fader_name ("AudioTrackFader"); } - rec_enable_button->set_sensitive (_session->writable()); - /* set playlist button tip to the current playlist, and make it update when it changes */ update_playlist_tip (); track()->PlaylistChanged.connect (*this, invalidator (*this), ui_bind(&RouteTimeAxisView::update_playlist_tip, this), gui_context()); @@ -291,7 +299,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) _y_position = -1; _route->processors_changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::processors_changed, this, _1), gui_context()); - _route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::route_property_changed, this, _1), gui_context()); if (is_track()) { @@ -313,8 +320,8 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) PropertyList* plist = new PropertyList(); - plist->add (ARDOUR::Properties::mute, true); - plist->add (ARDOUR::Properties::solo, true); + plist->add (ARDOUR::Properties::group_mute, true); + plist->add (ARDOUR::Properties::group_solo, true); route_group_menu = new RouteGroupMenu (_session, plist); @@ -341,6 +348,15 @@ RouteTimeAxisView::~RouteTimeAxisView () CatchDeletion (this); } +string +RouteTimeAxisView::name() const +{ + if (_route) { + return _route->name(); + } + return string(); +} + void RouteTimeAxisView::post_construct () { @@ -363,7 +379,7 @@ RouteTimeAxisView::setup_processor_menu_and_curves () _route->foreach_processor (sigc::mem_fun (*this, &RouteTimeAxisView::add_existing_processor_automation_curves)); } -gint +bool RouteTimeAxisView::route_group_click (GdkEventButton *ev) { if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { @@ -377,9 +393,15 @@ RouteTimeAxisView::route_group_click (GdkEventButton *ev) r.push_back (route ()); route_group_menu->build (r); - route_group_menu->menu()->popup (ev->button, ev->time); + if (ev->button == 1) { + Gtkmm2ext::anchored_menu_popup(route_group_menu->menu(), + &route_group_button, + "", 1, ev->time); + } else { + route_group_menu->menu()->popup (ev->button, ev->time); + } - return false; + return true; } void @@ -429,10 +451,8 @@ RouteTimeAxisView::update_track_number_visibility () if (tnw & 1) --tnw; number_label.set_size_request(tnw, -1); number_label.show (); - name_hbox.set_size_request(TimeAxisView::name_width_px - 2 - tnw, -1); // -2 = cellspacing } else { number_label.hide (); - name_hbox.set_size_request(TimeAxisView::name_width_px, -1); } } @@ -441,14 +461,12 @@ RouteTimeAxisView::parameter_changed (string const & p) { if (p == "track-name-number") { update_track_number_visibility(); - } -} - -void -RouteTimeAxisView::route_property_changed (const PropertyChange& what_changed) -{ - if (what_changed.contains (ARDOUR::Properties::name)) { - label_view (); + } else if (p == "editor-stereo-only-meters") { + if (UIConfiguration::instance().get_editor_stereo_only_meters()) { + gm.get_level_meter().set_max_audio_meter_count (2); + } else { + gm.get_level_meter().set_max_audio_meter_count (0); + } } } @@ -460,20 +478,32 @@ RouteTimeAxisView::take_name_changed (void *src) } } -void -RouteTimeAxisView::playlist_click () +bool +RouteTimeAxisView::playlist_click (GdkEventButton *ev) { - build_playlist_menu (); + if (ev->button != 1) { + return true; + } + + build_playlist_menu (); conditionally_add_to_selection (); - playlist_action_menu->popup (1, gtk_get_current_event_time()); + Gtkmm2ext::anchored_menu_popup(playlist_action_menu, &playlist_button, + "", 1, ev->time); + return true; } -void -RouteTimeAxisView::automation_click () +bool +RouteTimeAxisView::automation_click (GdkEventButton *ev) { + if (ev->button != 1) { + return true; + } + conditionally_add_to_selection (); build_automation_action_menu (false); - automation_action_menu->popup (1, gtk_get_current_event_time()); + Gtkmm2ext::anchored_menu_popup(automation_action_menu, &automation_button, + "", 1, ev->time); + return true; } void @@ -496,13 +526,13 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) automation_action_menu->set_name ("ArdourContextMenu"); items.push_back (MenuElem (_("Show All Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_all_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_all_automation), for_selection))); items.push_back (MenuElem (_("Show Existing Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_existing_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::show_existing_automation), for_selection))); items.push_back (MenuElem (_("Hide All Automation"), - sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection))); + sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::hide_all_automation), for_selection))); /* Attach the plugin submenu. It may have previously been used elsewhere, so it was detached above @@ -547,7 +577,7 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) items.push_back (CheckMenuElem (_("Pan"), sigc::mem_fun (*this, &RouteTimeAxisView::update_pan_track_visibility))); pan_automation_item = dynamic_cast (&items.back ()); pan_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && - (!pan_tracks.empty() && string_is_affirmative (pan_tracks.front()->gui_property ("visible")))); + (!pan_tracks.empty() && string_is_affirmative (pan_tracks.front()->gui_property ("visible")))); set const & params = _route->pannable()->what_can_be_automated (); for (set::const_iterator p = params.begin(); p != params.end(); ++p) { @@ -585,11 +615,6 @@ RouteTimeAxisView::build_display_menu () } build_size_menu (); items.push_back (MenuElem (_("Height"), *_size_menu)); - - items.push_back (SeparatorElem()); - - items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog))); - items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1); items.push_back (SeparatorElem()); // Hook for derived classes to add type specific stuff @@ -607,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++; } } @@ -639,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)); @@ -663,8 +702,8 @@ RouteTimeAxisView::build_display_menu () int styles = 0; boost::shared_ptr first_track; - for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) { - RouteTimeAxisView* r = dynamic_cast (*i); + for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) { + RouteTimeAxisView* r = dynamic_cast (*t); if (!r || !r->is_track ()) { continue; } @@ -709,8 +748,6 @@ RouteTimeAxisView::build_display_menu () break; } - RadioMenuItem* i; - if (!inconsistent && first_track) { alignment_items.push_back (RadioMenuElem (align_group, _("Automatic (based on I/O connections)"))); @@ -749,6 +786,7 @@ RouteTimeAxisView::build_display_menu () /* show nothing */ } +#ifdef XXX_OLD_DESTRUCTIVE_API_XXX Menu* mode_menu = manage (new Menu); MenuList& mode_items = mode_menu->items (); mode_menu->set_name ("ArdourContextMenu"); @@ -759,8 +797,8 @@ RouteTimeAxisView::build_display_menu () int tape = 0; int non_layered = 0; - for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) { - RouteTimeAxisView* r = dynamic_cast (*i); + for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) { + RouteTimeAxisView* r = dynamic_cast (*t); if (!r || !r->is_track ()) { continue; } @@ -797,6 +835,7 @@ RouteTimeAxisView::build_display_menu () i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0)); items.push_back (MenuElem (_("Record Mode"), *mode_menu)); +#endif items.push_back (SeparatorElem()); @@ -865,6 +904,7 @@ RouteTimeAxisView::build_display_menu () items.push_back (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks))); } +#ifdef XXX_OLD_DESTRUCTIVE_API_XXX void RouteTimeAxisView::set_track_mode (TrackMode mode, bool apply_to_selection) { @@ -888,6 +928,7 @@ RouteTimeAxisView::set_track_mode (TrackMode mode, bool apply_to_selection) track()->set_mode (mode); } } +#endif void RouteTimeAxisView::show_timestretch (framepos_t start, framepos_t end, int layers, int layer) @@ -1101,20 +1142,25 @@ RouteTimeAxisView::rename_current_playlist () prompter.set_title (_("Rename Playlist")); prompter.set_prompt (_("New name for playlist:")); - prompter.set_initial_text (pl->name()); prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + prompter.set_initial_text (pl->name()); prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: + while (true) { + if (prompter.run () != Gtk::RESPONSE_ACCEPT) { + break; + } prompter.get_result (name); if (name.length()) { - pl->set_name (name); + if (_session->playlists->by_name (name)) { + MessageDialog msg (_("Given playlist name is not unique.")); + msg.run (); + prompter.set_initial_text (Playlist::bump_name (name, *_session)); + } else { + pl->set_name (name); + break; + } } - break; - - default: - break; } } @@ -1154,7 +1200,7 @@ RouteTimeAxisView::resolve_new_group_playlist_name(std::string &basename, vector } void -RouteTimeAxisView::use_copy_playlist (bool prompt, vector > const & playlists_before_op) +RouteTimeAxisView::use_new_playlist (bool prompt, vector > const & playlists_before_op, bool copy) { string name; @@ -1170,92 +1216,55 @@ RouteTimeAxisView::use_copy_playlist (bool prompt, vectorname(); - if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { - name = resolve_new_group_playlist_name(name, playlists_before_op); + if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) { + name = resolve_new_group_playlist_name(name,playlists_before_op); } while (_session->playlists->by_name(name)) { name = Playlist::bump_name (name, *_session); } - // TODO: The prompter "new" button should be de-activated if the user - // specifies a playlist name which already exists in the session. - if (prompt) { + // TODO: The prompter "new" button should be de-activated if the user + // specifies a playlist name which already exists in the session. ArdourPrompter prompter (true); - prompter.set_title (_("New Copy Playlist")); - prompter.set_prompt (_("Name for new playlist:")); + if (copy) { + prompter.set_title (_("New Copy Playlist")); + prompter.set_prompt (_("Name for playlist copy:")); + } else { + prompter.set_title (_("New Playlist")); + prompter.set_prompt (_("Name for new playlist:")); + } prompter.set_initial_text (name); prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, true); prompter.show_all (); - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: + while (true) { + if (prompter.run () != Gtk::RESPONSE_ACCEPT) { + return; + } prompter.get_result (name); - break; - - default: - return; + if (name.length()) { + if (_session->playlists->by_name (name)) { + MessageDialog msg (_("Given playlist name is not unique.")); + msg.run (); + prompter.set_initial_text (Playlist::bump_name (name, *_session)); + } else { + break; + } + } } } if (name.length()) { - tr->use_copy_playlist (); - tr->playlist()->set_name (name); - } -} - -void -RouteTimeAxisView::use_new_playlist (bool prompt, vector > const & playlists_before_op) -{ - string name; - - boost::shared_ptr tr = track (); - if (!tr || tr->destructive()) { - return; - } - - boost::shared_ptr pl = tr->playlist(); - if (!pl) { - return; - } - - name = pl->name(); - - if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { - name = resolve_new_group_playlist_name(name,playlists_before_op); - } - - while (_session->playlists->by_name(name)) { - name = Playlist::bump_name (name, *_session); - } - - - if (prompt) { - - ArdourPrompter prompter (true); - - prompter.set_title (_("New Playlist")); - prompter.set_prompt (_("Name for new playlist:")); - prompter.set_initial_text (name); - prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT); - prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, true); - - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: - prompter.get_result (name); - break; - - default: - return; + if (copy) { + tr->use_copy_playlist (); + } else { + tr->use_new_playlist (); } - } - - if (name.length()) { - tr->use_new_playlist (); tr->playlist()->set_name (name); } } @@ -1405,12 +1414,6 @@ RouteTimeAxisView::route_group () const return _route->route_group(); } -string -RouteTimeAxisView::name() const -{ - return _route->name(); -} - boost::shared_ptr RouteTimeAxisView::playlist () const { @@ -1423,33 +1426,30 @@ RouteTimeAxisView::playlist () const } } -void -RouteTimeAxisView::name_entry_changed () +bool +RouteTimeAxisView::name_entry_changed (string const& str) { - TimeAxisView::name_entry_changed (); - - string x = name_entry->get_text (); - - if (x == _route->name()) { - return; + if (str == _route->name()) { + return true; } + string x = str; + strip_whitespace_edges (x); - if (x.length() == 0) { - name_entry->set_text (_route->name()); - return; + if (x.empty()) { + return false; } if (_session->route_name_internal (x)) { - ARDOUR_UI::instance()->popup_error (string_compose (_("You cannot create a track with that name as it is reserved for %1"), - PROGRAM_NAME)); - name_entry->grab_focus (); + ARDOUR_UI::instance()->popup_error (string_compose (_("The name \"%1\" is reserved for %2"), x, PROGRAM_NAME)); + return false; } else if (RouteUI::verify_new_route_name (x)) { _route->set_name (x); - } else { - name_entry->grab_focus (); + return true; } + + return false; } boost::shared_ptr @@ -1589,7 +1589,7 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) } bool -RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx) +RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num) { if (!is_track()) { return false; @@ -1623,7 +1623,7 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte framecnt_t amount = extent.second - extent.first; pl->ripple(pos, amount * ctx.times, boost::shared_ptr()); } - pl->paste (*p, pos, ctx.times); + pl->paste (*p, pos, ctx.times, sub_num); vector cmds; pl->rdiff (cmds); @@ -1683,7 +1683,7 @@ RouteTimeAxisView::build_playlist_menu () playlist_items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteTimeAxisView::rename_current_playlist))); playlist_items.push_back (SeparatorElem()); - if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::select.property_id)) { + if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) { playlist_items.push_back (MenuElem (_("New..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::new_playlists), this))); playlist_items.push_back (MenuElem (_("New Copy..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::copy_playlists), this))); @@ -1727,7 +1727,7 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr RouteGroup* rg = route_group(); - if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) { + if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) { std::string group_string = "." + rg->name() + "."; std::string take_name = pl->name(); @@ -1773,7 +1773,7 @@ void RouteTimeAxisView::update_playlist_tip () { RouteGroup* rg = route_group (); - if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) { + if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) { string group_string = "." + rg->name() + "."; string take_name = track()->playlist()->name(); @@ -1818,13 +1818,12 @@ RouteTimeAxisView::map_frozen () switch (track()->freeze_state()) { case Track::Frozen: playlist_button.set_sensitive (false); - rec_enable_button->set_sensitive (false); break; default: playlist_button.set_sensitive (true); - rec_enable_button->set_sensitive (true); break; } + RouteUI::map_frozen (); } void @@ -2081,7 +2080,7 @@ RouteTimeAxisView::show_existing_automation (bool apply_to_selection) for (list::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) { for (vector::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) { - if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) { + if ((*i)->processor->control((*ii)->what)->list()->size() > 0) { (*ii)->menu_item->set_active (true); } } @@ -2489,7 +2488,11 @@ RouteTimeAxisView::can_edit_name () const { /* we do not allow track name changes if it is record enabled */ - return !_route->record_enabled(); + boost::shared_ptr trk (boost::dynamic_pointer_cast (_route)); + if (!trk) { + return true; + } + return !trk->rec_enable_control()->get_value(); } void @@ -2639,7 +2642,7 @@ RouteTimeAxisView::set_underlay_state() continue; } - XMLProperty* prop = child_node->property ("id"); + XMLProperty const * prop = child_node->property ("id"); if (prop) { PBD::ID id (prop->value()); @@ -2681,7 +2684,7 @@ RouteTimeAxisView::add_underlay (StreamView* v, bool /*update_xml*/) } XMLNode* node = underlay_xml_node->add_child("Underlay"); - XMLProperty* prop = node->add_property("id"); + XMLProperty const * prop = node->add_property("id"); prop->set_value(v->trackview().route()->id().to_s()); } #endif @@ -2720,7 +2723,7 @@ RouteTimeAxisView::remove_underlay (StreamView* v) void RouteTimeAxisView::set_button_names () { - if (_route && _route->solo_safe()) { + if (_route && _route->solo_safe_control()->solo_safe()) { solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive)); } else { solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive)); @@ -2921,3 +2924,21 @@ RouteTimeAxisView::remove_child (boost::shared_ptr c) } } } + +Gdk::Color +RouteTimeAxisView::color () const +{ + return route_color (); +} + +bool +RouteTimeAxisView::marked_for_display () const +{ + return !_route->presentation_info().hidden(); +} + +bool +RouteTimeAxisView::set_marked_for_display (bool yn) +{ + return RouteUI::mark_hidden (!yn); +}