X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_time_axis.cc;h=33baf3a5116cfb59a193bf29ce1643b334d6bf6e;hb=9e5b7db89f381c70232fab35dc21fd885863f998;hp=d0e116c97130c9984beb6977a91434c29c476418;hpb=52d67203a10d3223f9f283fb56803b7979a0c2bd;p=ardour.git diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index d0e116c971..33baf3a511 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -59,8 +59,8 @@ #include "ardour_ui.h" #include "ardour_button.h" +#include "audio_streamview.h" #include "debug.h" -#include "global_signals.h" #include "route_time_axis.h" #include "automation_time_axis.h" #include "enums.h" @@ -76,6 +76,8 @@ #include "rgb_macros.h" #include "selection.h" #include "streamview.h" +#include "tooltips.h" +#include "ui_config.h" #include "utils.h" #include "route_group_menu.h" @@ -179,15 +181,15 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) } if (is_midi_track()) { - ARDOUR_UI::instance()->set_tip(*rec_enable_button, _("Record (Right-click for Step Edit)")); + set_tooltip(*rec_enable_button, _("Record (Right-click for Step Edit)")); gm.set_fader_name ("MidiTrackFader"); } else { - ARDOUR_UI::instance()->set_tip(*rec_enable_button, _("Record")); + set_tooltip(*rec_enable_button, _("Record")); 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()); @@ -249,10 +251,10 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) controls_table.attach (route_group_button, 4, 5, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 0, 0); controls_table.attach (gm.get_gain_slider(), 0, 2, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 1, 0); } - - ARDOUR_UI::instance()->set_tip(*solo_button,_("Solo")); - ARDOUR_UI::instance()->set_tip(*mute_button,_("Mute")); - ARDOUR_UI::instance()->set_tip(route_group_button, _("Route Group")); + + set_tooltip(*solo_button,_("Solo")); + set_tooltip(*mute_button,_("Mute")); + set_tooltip(route_group_button, _("Route Group")); mute_button->set_tweaks(ArdourButton::TrackHeader); solo_button->set_tweaks(ArdourButton::TrackHeader); @@ -262,9 +264,9 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) route_group_button.set_tweaks(ArdourButton::TrackHeader); if (is_midi_track()) { - ARDOUR_UI::instance()->set_tip(automation_button, _("MIDI Controllers and Automation")); + set_tooltip(automation_button, _("MIDI Controllers and Automation")); } else { - ARDOUR_UI::instance()->set_tip(automation_button, _("Automation")); + set_tooltip(automation_button, _("Automation")); } update_track_number_visibility(); @@ -304,10 +306,10 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) /* pick up the correct freeze state */ map_frozen (); - } + } _editor.ZoomChanged.connect (sigc::mem_fun(*this, &RouteTimeAxisView::reset_samples_per_pixel)); - ColorsChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::color_handler)); + UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::color_handler)); PropertyList* plist = new PropertyList(); @@ -322,7 +324,7 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) RouteTimeAxisView::~RouteTimeAxisView () { cleanup_gui_properties (); - + for (list::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) { delete *i; } @@ -503,9 +505,9 @@ RouteTimeAxisView::build_automation_action_menu (bool 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 + so it was detached above */ - + if (!subplugin_menu.items().empty()) { items.push_back (SeparatorElem ()); items.push_back (MenuElem (_("Processor automation"), subplugin_menu)); @@ -517,7 +519,7 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) if (gain_track) { items.push_back (CheckMenuElem (_("Fader"), sigc::mem_fun (*this, &RouteTimeAxisView::update_gain_track_visibility))); gain_automation_item = dynamic_cast (&items.back ()); - gain_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && + gain_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && (gain_track && string_is_affirmative (gain_track->gui_property ("visible")))); _main_automation_menu_map[Evoral::Parameter(GainAutomation)] = gain_automation_item; @@ -535,7 +537,7 @@ RouteTimeAxisView::build_automation_action_menu (bool for_selection) if (mute_track) { items.push_back (CheckMenuElem (_("Mute"), sigc::mem_fun (*this, &RouteTimeAxisView::update_mute_track_visibility))); mute_automation_item = dynamic_cast (&items.back ()); - mute_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && + mute_automation_item->set_active ((!for_selection || _editor.get_selection().tracks.size() == 1) && (mute_track && string_is_affirmative (mute_track->gui_property ("visible")))); _main_automation_menu_map[Evoral::Parameter(MuteAutomation)] = mute_automation_item; @@ -632,7 +634,7 @@ RouteTimeAxisView::build_display_menu () */ _ignore_set_layer_display = true; - + layers_items.push_back (RadioMenuElem (layers_group, _("Overlaid"))); RadioMenuItem* i = dynamic_cast (&layers_items.back ()); i->set_active (overlaid != 0 && stacked == 0); @@ -644,7 +646,7 @@ RouteTimeAxisView::build_display_menu () 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)); - + _ignore_set_layer_display = false; items.push_back (MenuElem (_("Layers"), *layers_menu)); @@ -736,12 +738,12 @@ RouteTimeAxisView::build_display_menu () break; } - alignment_items.push_back (RadioMenuElem (align_group, _("Align With Existing Material"))); + alignment_items.push_back (RadioMenuElem (align_group, _("Align with Existing Material"))); i = dynamic_cast (&alignment_items.back()); i->set_active (existing != 0 && capture == 0 && automatic == 0); i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseExistingMaterial, true)); - alignment_items.push_back (RadioMenuElem (align_group, _("Align With Capture Time"))); + alignment_items.push_back (RadioMenuElem (align_group, _("Align with Capture Time"))); i = dynamic_cast (&alignment_items.back()); i->set_active (existing == 0 && capture != 0 && automatic == 0); i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseCaptureTime, true)); @@ -811,7 +813,7 @@ RouteTimeAxisView::build_display_menu () } route_group_menu->detach (); - + WeakRouteList r; for (TrackSelection::iterator i = _editor.get_selection().tracks.begin(); i != _editor.get_selection().tracks.end(); ++i) { RouteTimeAxisView* rtv = dynamic_cast (*i); @@ -819,19 +821,19 @@ RouteTimeAxisView::build_display_menu () r.push_back (rtv->route ()); } } - + if (r.empty ()) { r.push_back (route ()); } route_group_menu->build (r); items.push_back (MenuElem (_("Group"), *route_group_menu->menu ())); - + build_automation_action_menu (true); items.push_back (MenuElem (_("Automation"), *automation_action_menu)); - + items.push_back (SeparatorElem()); - + int active = 0; int inactive = 0; TrackSelection const & s = _editor.get_selection().tracks; @@ -862,8 +864,12 @@ RouteTimeAxisView::build_display_menu () items.push_back (SeparatorElem()); items.push_back (MenuElem (_("Hide"), sigc::bind (sigc::mem_fun(_editor, &PublicEditor::hide_track_in_display), this, true))); - items.push_front (SeparatorElem()); - items.push_front (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks))); + if (_route && !_route->is_master()) { + items.push_back (SeparatorElem()); + items.push_back (MenuElem (_("Duplicate..."), boost::bind (&ARDOUR_UI::start_duplicate_routes, ARDOUR_UI::instance()))); + } + items.push_back (SeparatorElem()); + items.push_back (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks))); } void @@ -921,8 +927,8 @@ RouteTimeAxisView::show_timestretch (framepos_t start, framepos_t end, int layer if (timestretch_rect == 0) { timestretch_rect = new ArdourCanvas::Rectangle (canvas_display ()); - timestretch_rect->set_fill_color (ArdourCanvas::HSV (ARDOUR_UI::config()->color ("time stretch fill")).mod (ARDOUR_UI::config()->modifier ("time stretch fill")).color()); - timestretch_rect->set_outline_color (ARDOUR_UI::config()->color ("time stretch outline")); + timestretch_rect->set_fill_color (ArdourCanvas::HSV (UIConfiguration::instance().color ("time stretch fill")).mod (UIConfiguration::instance().modifier ("time stretch fill")).color()); + timestretch_rect->set_outline_color (UIConfiguration::instance().color ("time stretch outline")); } timestretch_rect->show (); @@ -1342,6 +1348,10 @@ RouteTimeAxisView::set_selected_points (PointSelection& points) for (Children::iterator i = children.begin(); i != children.end(); ++i) { (*i)->set_selected_points (points); } + AudioStreamView* asv = dynamic_cast(_view); + if (asv) { + asv->set_selected_points (points); + } } void @@ -1544,11 +1554,11 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) vector cmds; playlist->rdiff (cmds); _session->add_commands (cmds); - + _session->add_command (new StatefulDiffCommand (playlist)); } break; - + case Cut: if ((what_we_got = playlist->cut (time)) != 0) { _editor.get_cut_buffer().add (what_we_got); @@ -1614,6 +1624,7 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte pos += _editor.get_paste_offset(pos, ctx.count, duration); pl->clear_changes (); + pl->clear_owned_changes (); if (Config->get_edit_mode() == Ripple) { std::pair extent = (*p)->get_extent_with_endspace(); framecnt_t amount = extent.second - extent.first; @@ -1694,7 +1705,7 @@ RouteTimeAxisView::build_playlist_menu () playlist_items.push_back (MenuElem (_("Clear Current"), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::clear_playlists), this))); playlist_items.push_back (SeparatorElem()); - playlist_items.push_back (MenuElem(_("Select From All..."), sigc::mem_fun(*this, &RouteTimeAxisView::show_playlist_selector))); + playlist_items.push_back (MenuElem(_("Select from All..."), sigc::mem_fun(*this, &RouteTimeAxisView::show_playlist_selector))); } void @@ -1720,29 +1731,29 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr } track()->use_playlist (pl); - + RouteGroup* rg = route_group(); - + if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) { std::string group_string = "." + rg->name() + "."; - + std::string take_name = pl->name(); std::string::size_type idx = take_name.find(group_string); - + if (idx == std::string::npos) return; - + take_name = take_name.substr(idx + group_string.length()); // find the bit containing the take number / name - + boost::shared_ptr rl (rg->route_list()); - + for (RouteList::const_iterator i = rl->begin(); i != rl->end(); ++i) { if ((*i) == this->route()) { continue; } std::string playlist_name = (*i)->name()+group_string+take_name; - + boost::shared_ptr track = boost::dynamic_pointer_cast(*i); if (!track) { continue; @@ -1752,7 +1763,7 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr /* Don't change playlists of frozen tracks */ continue; } - + boost::shared_ptr ipl = session()->playlists->by_name(playlist_name); if (!ipl) { // No playlist for this track for this take yet, make it @@ -1771,28 +1782,28 @@ RouteTimeAxisView::update_playlist_tip () RouteGroup* rg = route_group (); if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) { string group_string = "." + rg->name() + "."; - + string take_name = track()->playlist()->name(); string::size_type idx = take_name.find(group_string); - + if (idx != string::npos) { /* find the bit containing the take number / name */ take_name = take_name.substr (idx + group_string.length()); /* set the playlist button tooltip to the take name */ - ARDOUR_UI::instance()->set_tip ( + set_tooltip ( playlist_button, string_compose(_("Take: %1.%2"), - Glib::Markup::escape_text(rg->name()), - Glib::Markup::escape_text(take_name)) + Gtkmm2ext::markup_escape_text (rg->name()), + Gtkmm2ext::markup_escape_text (take_name)) ); - + return; } } /* set the playlist button tooltip to the playlist name */ - ARDOUR_UI::instance()->set_tip (playlist_button, _("Playlist") + std::string(": ") + Glib::Markup::escape_text(track()->playlist()->name())); + set_tooltip (playlist_button, _("Playlist") + std::string(": ") + Gtkmm2ext::markup_escape_text (track()->playlist()->name())); } @@ -1828,11 +1839,11 @@ RouteTimeAxisView::color_handler () { //case cTimeStretchOutline: if (timestretch_rect) { - timestretch_rect->set_outline_color (ARDOUR_UI::config()->color ("time stretch outline")); + timestretch_rect->set_outline_color (UIConfiguration::instance().color ("time stretch outline")); } //case cTimeStretchFill: if (timestretch_rect) { - timestretch_rect->set_fill_color (ARDOUR_UI::config()->color ("time stretch fill")); + timestretch_rect->set_fill_color (UIConfiguration::instance().color ("time stretch fill")); } reset_meter(); @@ -2202,10 +2213,10 @@ RouteTimeAxisView::add_processor_automation_curve (boost::shared_ptr boost::shared_ptr control = boost::dynamic_pointer_cast(processor->control(what, true)); - + pan->view = boost::shared_ptr( new AutomationTimeAxisView (_session, _route, processor, control, control->parameter (), - _editor, *this, false, parent_canvas, + _editor, *this, false, parent_canvas, processor->describe_parameter (what), processor->name())); pan->view->Hiding.connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::processor_automation_track_hidden), pan, processor)); @@ -2244,7 +2255,7 @@ RouteTimeAxisView::add_existing_processor_automation_curves (boost::weak_ptrwhat_has_data (existing); for (set::iterator i = existing.begin(); i != existing.end(); ++i) { - + Evoral::Parameter param (*i); boost::shared_ptr al; @@ -2269,7 +2280,7 @@ RouteTimeAxisView::add_automation_child (Evoral::Parameter param, boost::shared_ /* existing state overrides "show" argument */ string s = track->gui_property ("visible"); - if (!s.empty()) { + if (!s.empty()) { show = string_is_affirmative (s); } @@ -2326,14 +2337,10 @@ RouteTimeAxisView::add_processor_to_subplugin_menu (boost::weak_ptr p } if (x == processor_automation.end()) { - rai = new ProcessorAutomationInfo (processor); processor_automation.push_back (rai); - } else { - rai = *x; - } /* any older menu was deleted at the top of processors_changed() @@ -2356,9 +2363,13 @@ RouteTimeAxisView::add_processor_to_subplugin_menu (boost::weak_ptr p string name = processor->describe_parameter (*i); + if (name == X_("hidden")) { + continue; + } + items.push_back (CheckMenuElem (name)); mitem = dynamic_cast (&items.back()); - + _subplugin_menu_map[*i] = mitem; if (has_visible_automation.find((*i)) != has_visible_automation.end()) { @@ -2382,6 +2393,10 @@ RouteTimeAxisView::add_processor_to_subplugin_menu (boost::weak_ptr p mitem->signal_toggled().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::processor_menu_item_toggled), rai, pan)); } + if (items.size() == 0) { + return; + } + /* add the menu for this processor, because the subplugin menu is always cleared at the top of processors_changed(). this is the result of some poor design in gtkmm and/or @@ -2407,7 +2422,7 @@ RouteTimeAxisView::processor_menu_item_toggled (RouteTimeAxisView::ProcessorAuto if (pan->view && pan->view->set_marked_for_display (showit)) { redraw = true; } - + if (redraw && !no_redraw) { request_redraw (); } @@ -2496,7 +2511,7 @@ RouteTimeAxisView::set_layer_display (LayerDisplay d, bool apply_to_selection) if (_ignore_set_layer_display) { return; } - + if (apply_to_selection) { _editor.get_selection().tracks.foreach_route_time_axis (boost::bind (&RouteTimeAxisView::set_layer_display, _1, d, false)); } else { @@ -2555,7 +2570,7 @@ RouteTimeAxisView::show_meter () void RouteTimeAxisView::reset_meter () { - if (ARDOUR_UI::config()->get_show_track_meters()) { + if (UIConfiguration::instance().get_show_track_meters()) { int meter_width = 3; if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) { meter_width = 6; @@ -2577,7 +2592,7 @@ RouteTimeAxisView::meter_changed () { ENSURE_GUI_THREAD (*this, &RouteTimeAxisView::meter_changed) reset_meter(); - if (_route && !no_redraw) { + if (_route && !no_redraw && UIConfiguration::instance().get_show_track_meters()) { request_redraw (); } // reset peak when meter point changes @@ -2721,16 +2736,16 @@ RouteTimeAxisView::set_button_names () switch (Config->get_listen_position()) { case AfterFaderListen: solo_button->set_text (S_("AfterFader|A")); - ARDOUR_UI::instance()->set_tip (*solo_button, _("After-fade listen (AFL)")); + set_tooltip (*solo_button, _("After-fade listen (AFL)")); break; case PreFaderListen: solo_button->set_text (S_("PreFader|P")); - ARDOUR_UI::instance()->set_tip (*solo_button, _("Pre-fade listen (PFL)")); + set_tooltip (*solo_button, _("Pre-fade listen (PFL)")); break; } } else { solo_button->set_text (S_("Solo|S")); - ARDOUR_UI::instance()->set_tip (*solo_button, _("Solo")); + set_tooltip (*solo_button, _("Solo")); } mute_button->set_text (S_("Mute|M")); } @@ -2780,7 +2795,6 @@ RouteTimeAxisView::create_trim_automation_child (const Evoral::Parameter& param, { boost::shared_ptr c = _route->trim()->gain_control(); if (!c || ! _route->trim()->active()) { - error << "Route has no trim automation, unable to add automation track view." << endmsg; return; } @@ -2903,7 +2917,7 @@ void RouteTimeAxisView::remove_child (boost::shared_ptr c) { TimeAxisView::remove_child (c); - + boost::shared_ptr a = boost::dynamic_pointer_cast (c); if (a) { for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {