X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_ui.cc;h=d3e34ddf33b63d6e8053b1e462b3bf4b0cb7c22d;hb=7022456b4fc49bbef6a0f308f6f6557d659eff52;hp=9b6e25cbc5486d3f055dc29e215f77d7737121f6;hpb=d1c6e8b6d805b2f74fe12ed42bc1f416ddd48674;p=ardour.git diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 9b6e25cbc5..d3e34ddf33 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -61,13 +61,18 @@ using namespace ARDOUR; using namespace PBD; uint32_t RouteUI::_max_invert_buttons = 3; -sigc::signal > RouteUI::BusSendDisplayChanged; +PBD::Signal1 > RouteUI::BusSendDisplayChanged; boost::weak_ptr RouteUI::_showing_sends_to; RouteUI::RouteUI (ARDOUR::Session* sess) : AxisView(sess) + , mute_menu(0) + , solo_menu(0) + , sends_menu(0) + , record_menu(0) + , _invert_menu(0) { - init (); + if (sess) init (); } RouteUI::~RouteUI() @@ -166,7 +171,7 @@ RouteUI::init () monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press)); monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release)); - BusSendDisplayChanged.connect (sigc::mem_fun (*this, &RouteUI::bus_send_display_changed)); + BusSendDisplayChanged.connect_same_thread (*this, boost::bind(&RouteUI::bus_send_display_changed, this, _1)); } void @@ -229,14 +234,18 @@ RouteUI::set_route (boost::shared_ptr rp) rec_enable_button->show(); rec_enable_button->set_controllable (t->rec_enable_control()); - update_rec_display (); - if (is_midi_track()) { midi_track()->StepEditStatusChange.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::step_edit_changed, this, _1), gui_context()); } - } + } + + /* this will work for busses and tracks, and needs to be called to + set up the name entry/name label display. + */ + + update_rec_display (); if (is_track()) { boost::shared_ptr t = boost::dynamic_pointer_cast(_route); @@ -250,7 +259,7 @@ RouteUI::set_route (boost::shared_ptr rp) mute_button->show(); - if (_route->is_monitor()) { + if (_route->is_monitor() || _route->is_master()) { solo_button->hide (); } else { solo_button->show(); @@ -315,11 +324,31 @@ RouteUI::mute_press (GdkEventButton* ev) if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) { + /* toggle mute on everything (but + * exclude the master and monitor) + * + * because we are going to erase + * elements of the list we need to work + * on a copy. + */ + + boost::shared_ptr copy (new RouteList); + + *copy = *_session->get_routes (); + + for (RouteList::iterator i = copy->begin(); i != copy->end(); ) { + if ((*i)->is_master() || (*i)->is_monitor()) { + i = copy->erase (i); + } else { + ++i; + } + } + if (_mute_release) { - _mute_release->routes = _session->get_routes (); + _mute_release->routes = copy; } - _session->set_mute (_session->get_routes(), !_route->muted()); + _session->set_mute (copy, !_route->muted()); } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { @@ -327,12 +356,23 @@ RouteUI::mute_press (GdkEventButton* ev) NOTE: Primary-button2 is MIDI learn. */ - if (ev->button == 1 && _route->route_group()) { - if (_mute_release) { - _mute_release->routes = _session->get_routes (); + boost::shared_ptr rl; + + if (ev->button == 1) { + + if (_route->route_group()) { + + rl = _route->route_group()->route_list(); + + if (_mute_release) { + _mute_release->routes = rl; + } + } else { + rl.reset (new RouteList); + rl->push_back (_route); } - _session->set_mute (_session->get_routes(), !_route->muted(), Session::rt_cleanup, true); + _session->set_mute (rl, !_route->muted(), Session::rt_cleanup, true); } } else { @@ -341,7 +381,7 @@ RouteUI::mute_press (GdkEventButton* ev) boost::shared_ptr rl (new RouteList); rl->push_back (_route); - + if (_mute_release) { _mute_release->routes = rl; } @@ -464,16 +504,30 @@ RouteUI::solo_press(GdkEventButton* ev) NOTE: Primary-button2 is MIDI learn. */ - if (ev->button == 1 && _route->route_group()) { + /* Primary-button1 applies change to the mix group even if it is not active + NOTE: Primary-button2 is MIDI learn. + */ + + boost::shared_ptr rl; + + if (ev->button == 1) { - if (_solo_release) { - _solo_release->routes = _route->route_group()->route_list(); + if (_route->route_group()) { + + rl = _route->route_group()->route_list(); + + if (_solo_release) { + _solo_release->routes = rl; + } + } else { + rl.reset (new RouteList); + rl->push_back (_route); } if (Config->get_solo_control_is_listen_control()) { - _session->set_listen (_route->route_group()->route_list(), !_route->listening_via_monitor(), Session::rt_cleanup, true); + _session->set_listen (rl, !_route->listening_via_monitor(), Session::rt_cleanup, true); } else { - _session->set_solo (_route->route_group()->route_list(), !_route->self_soloed(), Session::rt_cleanup, true); + _session->set_solo (rl, !_route->self_soloed(), Session::rt_cleanup, true); } } @@ -565,8 +619,21 @@ RouteUI::rec_enable_press(GdkEventButton* ev) /* Primary-button1 applies change to the route group (even if it is not active) NOTE: Primary-button2 is MIDI learn. */ - if (ev->button == 1 && _route->route_group()) { - _session->set_record_enabled (_route->route_group()->route_list(), !rec_enable_button->active_state(), Session::rt_cleanup, true); + + if (ev->button == 1) { + + boost::shared_ptr rl; + + if (_route->route_group()) { + + rl = _route->route_group()->route_list(); + + } else { + rl.reset (new RouteList); + rl->push_back (_route); + } + + _session->set_record_enabled (rl, !rec_enable_button->active_state(), Session::rt_cleanup, true); } } else if (Keyboard::is_context_menu_event (ev)) { @@ -717,7 +784,7 @@ RouteUI::build_record_menu () MenuList& items = record_menu->items(); items.push_back (CheckMenuElem (_("Step Entry"), sigc::mem_fun (*this, &RouteUI::toggle_step_edit))); - step_edit_item = dynamic_cast (&items.back()); + step_edit_item = dynamic_cast (&items.back()); if (_route->record_enabled()) { step_edit_item->set_sensitive (false); @@ -1139,20 +1206,20 @@ RouteUI::build_solo_menu (void) solo_menu = new Menu; solo_menu->set_name ("ArdourContextMenu"); MenuList& items = solo_menu->items(); - CheckMenuItem* check; + Gtk::CheckMenuItem* check; - check = new CheckMenuItem(_("Solo Isolate")); + check = new Gtk::CheckMenuItem(_("Solo Isolate")); check->set_active (_route->solo_isolated()); check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_isolated), check)); items.push_back (CheckMenuElem(*check)); - solo_isolated_check = dynamic_cast(&items.back()); + solo_isolated_check = dynamic_cast(&items.back()); check->show_all(); - check = new CheckMenuItem(_("Solo Safe")); + check = new Gtk::CheckMenuItem(_("Solo Safe")); check->set_active (_route->solo_safe()); check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_safe), check)); items.push_back (CheckMenuElem(*check)); - solo_safe_check = dynamic_cast(&items.back()); + solo_safe_check = dynamic_cast(&items.back()); check->show_all(); //items.push_back (SeparatorElem()); @@ -1170,25 +1237,25 @@ RouteUI::build_mute_menu(void) MenuList& items = mute_menu->items(); - pre_fader_mute_check = manage (new CheckMenuItem(_("Pre Fader"))); + pre_fader_mute_check = manage (new Gtk::CheckMenuItem(_("Pre Fader Sends"))); init_mute_menu(MuteMaster::PreFader, pre_fader_mute_check); pre_fader_mute_check->signal_toggled().connect(sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::PreFader, pre_fader_mute_check)); items.push_back (CheckMenuElem(*pre_fader_mute_check)); pre_fader_mute_check->show_all(); - post_fader_mute_check = manage (new CheckMenuItem(_("Post Fader"))); + post_fader_mute_check = manage (new Gtk::CheckMenuItem(_("Post Fader Sends"))); init_mute_menu(MuteMaster::PostFader, post_fader_mute_check); post_fader_mute_check->signal_toggled().connect(sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::PostFader, post_fader_mute_check)); items.push_back (CheckMenuElem(*post_fader_mute_check)); post_fader_mute_check->show_all(); - listen_mute_check = manage (new CheckMenuItem(_("Control Outs"))); + listen_mute_check = manage (new Gtk::CheckMenuItem(_("Control Outs"))); init_mute_menu(MuteMaster::Listen, listen_mute_check); listen_mute_check->signal_toggled().connect(sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::Listen, listen_mute_check)); items.push_back (CheckMenuElem(*listen_mute_check)); listen_mute_check->show_all(); - main_mute_check = manage (new CheckMenuItem(_("Main Outs"))); + main_mute_check = manage (new Gtk::CheckMenuItem(_("Main Outs"))); init_mute_menu(MuteMaster::Main, main_mute_check); main_mute_check->signal_toggled().connect(sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::Main, main_mute_check)); items.push_back (CheckMenuElem(*main_mute_check)); @@ -1201,7 +1268,7 @@ RouteUI::build_mute_menu(void) } void -RouteUI::init_mute_menu(MuteMaster::MutePoint mp, CheckMenuItem* check) +RouteUI::init_mute_menu(MuteMaster::MutePoint mp, Gtk::CheckMenuItem* check) { check->set_active (_route->mute_points() & mp); } @@ -1335,26 +1402,20 @@ RouteUI::choose_color () void RouteUI::set_color (const Gdk::Color & c) { - RouteGroup* g = _route->route_group (); - /* leave _color alone in the group case so that tracks can retain their * own pre-group colors. */ - if (g && g->is_color()) { - GroupTabs::set_group_color (g, c); - } else { - char buf[64]; - _color = c; - snprintf (buf, sizeof (buf), "%d:%d:%d", c.get_red(), c.get_green(), c.get_blue()); - - /* note: we use the route state ID here so that color is the same for both - the time axis view and the mixer strip - */ - - gui_object_state().set_property (route_state_id(), X_("color"), buf); - _route->gui_changed ("color", (void *) 0); /* EMIT_SIGNAL */ - } + char buf[64]; + _color = c; + snprintf (buf, sizeof (buf), "%d:%d:%d", c.get_red(), c.get_green(), c.get_blue()); + + /* note: we use the route state ID here so that color is the same for both + the time axis view and the mixer strip + */ + + gui_object_state().set_property (route_state_id(), X_("color"), buf); + _route->gui_changed ("color", (void *) 0); /* EMIT_SIGNAL */ } /** @return GUI state ID for things that are common to the route in all its representations */ @@ -1631,7 +1692,7 @@ RouteUI::map_frozen () void RouteUI::adjust_latency () { - LatencyDialog dialog (_route->name() + _(" latency"), *(_route->output()), _session->frame_rate(), _session->engine().frames_per_cycle()); + LatencyDialog dialog (_route->name() + _(" latency"), *(_route->output()), _session->frame_rate(), AudioEngine::instance()->samples_per_cycle()); } void @@ -1754,15 +1815,15 @@ RouteUI::open_remote_control_id_dialog () _route->remote_control_id(), (_route->is_master() ? _("the master bus") : _("the monitor bus")))); } else { - l->set_markup (string_compose (_("The remote control ID of %6 is: %3\n\n\n" - "Remote Control IDs are currently determined by track/bus ordering in %1\n\n" - "%4Use the User Interaction tab of the Preferences window if you want to change this%5"), - (Config->get_remote_model() == MixerOrdered ? _("the mixer") : ("the editor")), + l->set_markup (string_compose (_("The remote control ID of %5 is: %2\n\n\n" + "Remote Control IDs are currently determined by track/bus ordering in %6.\n\n" + "%3Use the User Interaction tab of the Preferences window if you want to change this%4"), (is_track() ? _("track") : _("bus")), _route->remote_control_id(), "", "", - Glib::Markup::escape_text (_route->name()))); + Glib::Markup::escape_text (_route->name()), + PROGRAM_NAME)); } dialog.get_vbox()->pack_start (*l); dialog.add_button (Stock::OK, RESPONSE_CANCEL); @@ -1897,7 +1958,7 @@ RouteUI::invert_press (GdkEventButton* ev) for (uint32_t i = 0; i < N; ++i) { items.push_back (CheckMenuElem (string_compose (X_("Ø%1"), i + 1), sigc::bind (sigc::mem_fun (*this, &RouteUI::invert_menu_toggled), i))); - CheckMenuItem* e = dynamic_cast (&items.back ()); + Gtk::CheckMenuItem* e = dynamic_cast (&items.back ()); ++_i_am_the_modifier; e->set_active (_route->phase_invert (i)); --_i_am_the_modifier;