X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmonitor_section.cc;h=25e403418291b75dcc7b09ecf5d52bf07cda45fa;hb=ffc50fcf9da9f98ce2f261cffc2a01be20af32ed;hp=ccd63201c2e4018fdc77f3c48c8bcedac2fb30f7;hpb=337be498395e4418ea26a6d3bd064ab4c88373c8;p=ardour.git diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc index ccd63201c2..25e4034182 100644 --- a/gtk2_ardour/monitor_section.cc +++ b/gtk2_ardour/monitor_section.cc @@ -36,18 +36,18 @@ MonitorSection::MonitorSection (Session* s) : AxisView (s) , RouteUI (s) , _tearoff (0) + , channel_table_viewport (*channel_table_scroller.get_hadjustment(), + *channel_table_scroller.get_vadjustment ()) , gain_control (0) , dim_control (0) , solo_boost_control (0) , solo_cut_control (0) - , solo_in_place_button (solo_model_group, _("SiP")) - , afl_button (solo_model_group, _("AFL")) - , pfl_button (solo_model_group, _("PFL")) - , cut_all_button (ArdourButton::led_default_elements) - , dim_all_button (ArdourButton::led_default_elements) - , mono_button (ArdourButton::led_default_elements) + , solo_in_place_button (_("SiP"), ArdourButton::led_default_elements) + , afl_button (_("AFL"), ArdourButton::led_default_elements) + , pfl_button (_("PFL"), ArdourButton::led_default_elements) , exclusive_solo_button (ArdourButton::led_default_elements) , solo_mute_override_button (ArdourButton::led_default_elements) + , _inhibit_solo_model_update (false) { Glib::RefPtr act; @@ -64,23 +64,6 @@ MonitorSection::MonitorSection (Session* s) VBox* spin_packer; Label* spin_label; - /* Dim */ - - dim_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr(), 0.0, 0.01, 0.1, true, 30, 30, true); - - HBox* dim_packer = manage (new HBox); - dim_packer->show (); - - spin_label = manage (new Label (_("Dim"))); - spin_packer = manage (new VBox); - spin_packer->show (); - spin_packer->set_spacing (6); - spin_packer->pack_start (*dim_control, false, false); - spin_packer->pack_start (*spin_label, false, false); - - dim_packer->set_spacing (12); - dim_packer->pack_start (*spin_packer, true, false); - /* Rude Solo */ rude_solo_button.set_text (_("soloing")); @@ -106,10 +89,14 @@ MonitorSection::MonitorSection (Session* s) rude_audition_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::cancel_audition)); UI::instance()->set_tip (rude_audition_button, _("When active, auditioning is active.\nClick to stop the audition")); + solo_in_place_button.set_name ("monitor section solo model"); + afl_button.set_name ("monitor section solo model"); + pfl_button.set_name ("monitor section solo model"); + solo_model_box.set_spacing (6); - solo_model_box.pack_start (solo_in_place_button, false, false); - solo_model_box.pack_start (afl_button, false, false); - solo_model_box.pack_start (pfl_button, false, false); + solo_model_box.pack_start (solo_in_place_button, true, false); + solo_model_box.pack_start (afl_button, true, false); + solo_model_box.pack_start (pfl_button, true, false); solo_in_place_button.show (); afl_button.show (); @@ -117,26 +104,30 @@ MonitorSection::MonitorSection (Session* s) solo_model_box.show (); act = ActionManager::get_action (X_("Solo"), X_("solo-use-in-place")); + ARDOUR_UI::instance()->tooltips().set_tip (solo_in_place_button, _("Solo controls affect solo-in-place")); if (act) { - act->connect_proxy (solo_in_place_button); + solo_in_place_button.set_related_action (act); } act = ActionManager::get_action (X_("Solo"), X_("solo-use-afl")); + ARDOUR_UI::instance()->tooltips().set_tip (afl_button, _("Solo controls toggle after-fader-listen")); if (act) { - act->connect_proxy (afl_button); + afl_button.set_related_action (act); } act = ActionManager::get_action (X_("Solo"), X_("solo-use-pfl")); + ARDOUR_UI::instance()->tooltips().set_tip (pfl_button, _("Solo controls toggle pre-fader-listen")); if (act) { - act->connect_proxy (pfl_button); + pfl_button.set_related_action (act); } /* Solo Boost */ solo_boost_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr(), 0.0, 0.01, 0.1, true, 30, 30, true); + ARDOUR_UI::instance()->tooltips().set_tip (*solo_boost_control, _("Gain increase for soloed signals (0dB is normal)")); HBox* solo_packer = manage (new HBox); - solo_packer->set_spacing (12); + solo_packer->set_spacing (6); solo_packer->show (); spin_label = manage (new Label (_("Solo Boost"))); @@ -146,11 +137,12 @@ MonitorSection::MonitorSection (Session* s) spin_packer->pack_start (*solo_boost_control, false, false); spin_packer->pack_start (*spin_label, false, false); - solo_packer->pack_start (*spin_packer, false, true); + solo_packer->pack_start (*spin_packer, true, false); /* Solo (SiP) cut */ solo_cut_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr(), 0.0, 0.1, 0.5, true, 30, 30, true); + ARDOUR_UI::instance()->tooltips().set_tip (*solo_cut_control, _("Gain reduction non-soloed signals\nA value above -inf dB causes \"solo-in-front\"")); spin_label = manage (new Label (_("SiP Cut"))); spin_packer = manage (new VBox); @@ -159,7 +151,24 @@ MonitorSection::MonitorSection (Session* s) spin_packer->pack_start (*solo_cut_control, false, false); spin_packer->pack_start (*spin_label, false, false); - solo_packer->pack_start (*spin_packer, false, true); + solo_packer->pack_start (*spin_packer, true, false); + + /* Dim */ + + dim_control = new VolumeController (little_knob_pixbuf, boost::shared_ptr(), 0.0, 0.01, 0.1, true, 30, 30, true); + ARDOUR_UI::instance()->tooltips().set_tip (*dim_control, _("Gain reduction to use when dimming monitor outputs")); + + HBox* dim_packer = manage (new HBox); + dim_packer->show (); + + spin_label = manage (new Label (_("Dim"))); + spin_packer = manage (new VBox); + spin_packer->show (); + spin_packer->set_spacing (6); + spin_packer->pack_start (*dim_control, false, false); + spin_packer->pack_start (*spin_label, false, false); + + dim_packer->pack_start (*spin_packer, true, false); exclusive_solo_button.set_text (_("excl. solo")); exclusive_solo_button.set_name (X_("monitor solo exclusive")); @@ -186,7 +195,7 @@ MonitorSection::MonitorSection (Session* s) solo_opt_box->pack_start (solo_mute_override_button); solo_opt_box->show (); - upper_packer.set_spacing (12); + upper_packer.set_spacing (6); Gtk::HBox* rude_box = manage (new HBox); rude_box->pack_start (rude_solo_button, true, true); @@ -194,9 +203,9 @@ MonitorSection::MonitorSection (Session* s) upper_packer.pack_start (*rude_box, false, false); upper_packer.pack_start (rude_audition_button, false, false); - upper_packer.pack_start (solo_model_box, false, false); + upper_packer.pack_start (solo_model_box, false, false, 12); upper_packer.pack_start (*solo_opt_box, false, false); - upper_packer.pack_start (*solo_packer, false, false); + upper_packer.pack_start (*solo_packer, false, false, 12); cut_all_button.set_text (_("mute")); cut_all_button.set_name ("monitor section cut"); @@ -207,7 +216,7 @@ MonitorSection::MonitorSection (Session* s) act = ActionManager::get_action (X_("Monitor"), X_("monitor-cut-all")); if (act) { cut_all_button.set_related_action (act); - } + } dim_all_button.set_text (_("dim")); dim_all_button.set_name ("monitor section dim"); @@ -250,21 +259,27 @@ MonitorSection::MonitorSection (Session* s) channel_table_scroller.set_size_request (-1, 150); channel_table_scroller.set_shadow_type (Gtk::SHADOW_NONE); channel_table_scroller.show (); - + channel_table_scroller.add (channel_table_viewport); + channel_size_group = SizeGroup::create (SIZE_GROUP_HORIZONTAL); channel_size_group->add_widget (channel_table_header); channel_size_group->add_widget (channel_table); channel_table_header.resize (1, 5); Label* l1 = manage (new Label (X_("out"))); + l1->set_name (X_("MonitorSectionLabel")); channel_table_header.attach (*l1, 0, 1, 0, 1, EXPAND|FILL); - l1 = manage (new Label (X_("cut"))); + l1 = manage (new Label (X_("mute"))); + l1->set_name (X_("MonitorSectionLabel")); channel_table_header.attach (*l1, 1, 2, 0, 1, EXPAND|FILL); l1 = manage (new Label (X_("dim"))); + l1->set_name (X_("MonitorSectionLabel")); channel_table_header.attach (*l1, 2, 3, 0, 1, EXPAND|FILL); l1 = manage (new Label (X_("solo"))); + l1->set_name (X_("MonitorSectionLabel")); channel_table_header.attach (*l1, 3, 4, 0, 1, EXPAND|FILL); l1 = manage (new Label (X_("inv"))); + l1->set_name (X_("MonitorSectionLabel")); channel_table_header.attach (*l1, 4, 5, 0, 1, EXPAND|FILL); channel_table_header.show (); @@ -273,7 +288,7 @@ MonitorSection::MonitorSection (Session* s) /* note that we don't pack the table_hpacker till later */ - vpacker.set_border_width (12); + vpacker.set_border_width (6); vpacker.set_spacing (12); vpacker.pack_start (upper_packer, false, false); vpacker.pack_start (*dim_packer, false, false); @@ -345,23 +360,24 @@ MonitorSection::set_session (Session* s) if (channel_table_scroller.get_parent()) { /* scroller is packed, so remove it */ channel_table_packer.remove (channel_table_scroller); - /* remove the table_hpacker from the scroller */ - channel_table_scroller.remove (); } - if (table_hpacker.get_parent ()) { + if (table_hpacker.get_parent () == &channel_table_packer) { /* this occurs when the table hpacker is directly packed, so remove it. */ channel_table_packer.remove (table_hpacker); + } else if (table_hpacker.get_parent()) { + channel_table_viewport.remove (); } if (_monitor->output_streams().n_audio() > 7) { /* put the table into a scrolled window, and then put * that into the channel vpacker, after the table header */ - channel_table_scroller.add (table_hpacker); + channel_table_viewport.add (table_hpacker); channel_table_packer.pack_start (channel_table_scroller, true, true); + channel_table_viewport.show (); channel_table_scroller.show (); } else { @@ -390,10 +406,6 @@ MonitorSection::set_session (Session* s) } MonitorSection::ChannelButtonSet::ChannelButtonSet () - : cut (ArdourButton::just_led_default_elements) - , dim (ArdourButton::just_led_default_elements) - , solo (ArdourButton::just_led_default_elements) - , invert (ArdourButton::just_led_default_elements) { cut.set_diameter (3); dim.set_diameter (3); @@ -485,14 +497,6 @@ MonitorSection::populate_buttons () channel_table.show_all (); } -void -MonitorSection::set_button_names () -{ - rec_enable_button_label.set_text ("rec"); - mute_button_label.set_text ("rec"); - solo_button_label.set_text ("rec"); -} - void MonitorSection::toggle_exclusive_solo () { @@ -549,7 +553,7 @@ MonitorSection::cut_all () if (act) { Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); _monitor->set_cut_all (tact->get_active()); - } + } } void @@ -729,7 +733,16 @@ MonitorSection::solo_use_in_place () if (act) { Glib::RefPtr ract = Glib::RefPtr::cast_dynamic (act); if (ract) { + if (!ract->get_active ()) { + /* We are turning SiP off, which means that AFL or PFL will be turned on + shortly; don't update the solo model in the mean time, as if the currently + configured listen position is not the one that is about to be turned on, + things will go wrong. + */ + _inhibit_solo_model_update = true; + } Config->set_solo_control_is_listen_control (!ract->get_active()); + _inhibit_solo_model_update = false; } } } @@ -747,8 +760,8 @@ MonitorSection::solo_use_afl () Glib::RefPtr ract = Glib::RefPtr::cast_dynamic (act); if (ract) { if (ract->get_active()) { - Config->set_listen_position (AfterFaderListen); Config->set_solo_control_is_listen_control (true); + Config->set_listen_position (AfterFaderListen); } } } @@ -762,13 +775,13 @@ MonitorSection::solo_use_pfl () active. */ - Glib::RefPtr act = ActionManager::get_action (X_("Solo"), X_("solo-use-afl")); + Glib::RefPtr act = ActionManager::get_action (X_("Solo"), X_("solo-use-pfl")); if (act) { Glib::RefPtr ract = Glib::RefPtr::cast_dynamic (act); if (ract) { if (ract->get_active()) { - Config->set_listen_position (PreFaderListen); Config->set_solo_control_is_listen_control (true); + Config->set_listen_position (PreFaderListen); } } } @@ -816,6 +829,10 @@ MonitorSection::setup_knob_images () void MonitorSection::update_solo_model () { + if (_inhibit_solo_model_update) { + return; + } + const char* action_name = 0; Glib::RefPtr act; @@ -834,10 +851,19 @@ MonitorSection::update_solo_model () act = ActionManager::get_action (X_("Solo"), action_name); if (act) { + Glib::RefPtr ract = Glib::RefPtr::cast_dynamic (act); if (ract) { + /* because these are radio buttons, one of them will be + active no matter what. to trigger a change in the + action so that the view picks it up, toggle it. + */ + if (ract->get_active()) { + ract->set_active (false); + } ract->set_active (true); } + } } @@ -937,13 +963,9 @@ MonitorSection::audition_blink (bool onoff) } if (_session->is_auditioning()) { - if (onoff) { - rude_audition_button.set_active_state (Gtkmm2ext::Active); - } else { - rude_audition_button.unset_active_state (); - } + rude_audition_button.set_active (onoff); } else { - rude_audition_button.unset_active_state (); + rude_audition_button.set_active (false); } } @@ -955,22 +977,17 @@ MonitorSection::solo_blink (bool onoff) } if (_session->soloing() || _session->listening()) { - if (onoff) { - rude_solo_button.set_active_state (Gtkmm2ext::Active); - } else { - rude_solo_button.unset_active_state (); - } + rude_solo_button.set_active (onoff); if (_session->soloing()) { if (_session->solo_isolated()) { - rude_iso_button.set_active_state (Gtkmm2ext::Active); + rude_iso_button.set_active (false); } - } + } } else { - // rude_solo_button.set_active (false); - rude_solo_button.unset_active_state (); - rude_iso_button.unset_active_state (); + rude_solo_button.set_active (false); + rude_iso_button.set_active (false); } } @@ -1011,8 +1028,9 @@ MonitorSection::cancel_audition (GdkEventButton*) void MonitorSection::parameter_changed (std::string name) { - if (name == "solo-control-is-listen-control" || - name == "listen-position") { + if (name == "solo-control-is-listen-control") { + update_solo_model (); + } else if (name == "listen-position") { update_solo_model (); } }