summaryrefslogtreecommitdiff
path: root/gtk2_ardour/mixer_strip.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2020-01-28 22:22:57 +0100
committerRobin Gareus <robin@gareus.org>2020-01-28 22:22:57 +0100
commit87af9fb820b314041f8cdb3eda1717a57cbf00aa (patch)
tree06e407cfd5fe4edab075af7de17d7f865187e1b7 /gtk2_ardour/mixer_strip.cc
parentcb01a910d7e4663ddc832d4d33349fd9a9903a9c (diff)
Consolidate Mixer-strip sensitivity
* Use a single method to set mixer-strip widget sensitivity * Update context-menu to only allow show actions that can currently be performed, depending on active/inactive state. * Mark all control elements of in-active strips as insenstive except those required to re-enable the route. * Also update processor-box and solo-button when showing Aux Special case Mixbus. Mixbus already shows a "Insensitive" label, and Mixbus-channelstrip element sensitivity remains to be implemented before using this mechanism.
Diffstat (limited to 'gtk2_ardour/mixer_strip.cc')
-rw-r--r--gtk2_ardour/mixer_strip.cc189
1 files changed, 97 insertions, 92 deletions
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index a4ad8e3246..d91496fdb1 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -579,8 +579,6 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
solo_button->hide ();
mute_button->show ();
rec_mon_table.hide ();
- solo_iso_table.set_sensitive(false);
- control_slave_ui.set_sensitive(false);
if (monitor_section_button == 0) {
Glib::RefPtr<Action> act = ActionManager::get_action ("Mixer", "ToggleMonitorSection");
_session->MonitorChanged.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::monitor_changed, this), gui_context());
@@ -602,8 +600,6 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
mute_button->show ();
solo_button->show ();
rec_mon_table.show ();
- solo_iso_table.set_sensitive(true);
- control_slave_ui.set_sensitive(true);
}
hide_master_spacer (false);
@@ -747,6 +743,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
map_frozen();
show ();
+ update_sensitivity ();
}
void
@@ -1678,45 +1675,51 @@ MixerStrip::build_route_ops_menu ()
route_ops_menu = new Menu;
route_ops_menu->set_name ("ArdourContextMenu");
+ bool active = _route->active () || ARDOUR::Profile->get_mixbus();
+
MenuList& items = route_ops_menu->items();
- items.push_back (MenuElem (_("Color..."), sigc::mem_fun (*this, &RouteUI::choose_color)));
+ if (active) {
- items.push_back (MenuElem (_("Comments..."), sigc::mem_fun (*this, &RouteUI::open_comment_editor)));
+ items.push_back (MenuElem (_("Color..."), sigc::mem_fun (*this, &RouteUI::choose_color)));
- items.push_back (MenuElem (_("Inputs..."), sigc::mem_fun (*this, &RouteUI::edit_input_configuration)));
+ items.push_back (MenuElem (_("Comments..."), sigc::mem_fun (*this, &RouteUI::open_comment_editor)));
- items.push_back (MenuElem (_("Outputs..."), sigc::mem_fun (*this, &RouteUI::edit_output_configuration)));
+ items.push_back (MenuElem (_("Inputs..."), sigc::mem_fun (*this, &RouteUI::edit_input_configuration)));
- if (!Profile->get_mixbus()) {
- items.push_back (SeparatorElem());
- }
+ items.push_back (MenuElem (_("Outputs..."), sigc::mem_fun (*this, &RouteUI::edit_output_configuration)));
- if (!_route->is_master()
+ if (!Profile->get_mixbus()) {
+ items.push_back (SeparatorElem());
+ }
+
+ if (!_route->is_master()
#ifdef MIXBUS
- && !_route->mixbus()
+ && !_route->mixbus()
#endif
- ) {
- if (Profile->get_mixbus()) {
- items.push_back (SeparatorElem());
+ ) {
+ if (Profile->get_mixbus()) {
+ items.push_back (SeparatorElem());
+ }
+ items.push_back (MenuElem (_("Save As Template..."), sigc::mem_fun(*this, &RouteUI::save_as_template)));
}
- items.push_back (MenuElem (_("Save As Template..."), sigc::mem_fun(*this, &RouteUI::save_as_template)));
- }
- if (!Profile->get_mixbus()) {
- items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteUI::route_rename)));
- /* do not allow rename if the track is record-enabled */
- items.back().set_sensitive (!is_track() || !track()->rec_enable_control()->get_value());
+ if (!Profile->get_mixbus()) {
+ items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteUI::route_rename)));
+ /* do not allow rename if the track is record-enabled */
+ items.back().set_sensitive (!is_track() || !track()->rec_enable_control()->get_value());
+ }
+
+ items.push_back (SeparatorElem());
}
- items.push_back (SeparatorElem());
items.push_back (CheckMenuElem (_("Active")));
Gtk::CheckMenuItem* i = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
- i->set_active (_route->active());
+ i->set_active (active);
i->set_sensitive(! _session->transport_rolling());
i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::set_route_active), !_route->active(), false));
- if (!Profile->get_mixbus ()) {
+ if (active && !Profile->get_mixbus ()) {
items.push_back (SeparatorElem());
items.push_back (CheckMenuElem (_("Strict I/O")));
i = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
@@ -1724,7 +1727,7 @@ MixerStrip::build_route_ops_menu ()
i->signal_activate().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*_route, &Route::set_strict_io), !_route->strict_io())));
}
- if (is_track()) {
+ if (active && is_track()) {
items.push_back (SeparatorElem());
Gtk::Menu* dio_menu = new Menu;
@@ -1738,17 +1741,17 @@ MixerStrip::build_route_ops_menu ()
_plugin_insert_cnt = 0;
_route->foreach_processor (sigc::mem_fun (*this, &MixerStrip::help_count_plugins));
- if (_plugin_insert_cnt > 0) {
+ if (active && _plugin_insert_cnt > 0) {
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Pin Connections..."), sigc::mem_fun (*this, &RouteUI::manage_pins)));
}
- if (boost::dynamic_pointer_cast<MidiTrack>(_route) || _route->the_instrument ()) {
+ if (active && (boost::dynamic_pointer_cast<MidiTrack>(_route) || _route->the_instrument ())) {
items.push_back (MenuElem (_("Patch Selector..."),
sigc::mem_fun(*this, &RouteUI::select_midi_patch)));
}
- if (_route->the_instrument () && _route->the_instrument ()->output_streams().n_audio() > 2) {
+ if (active && _route->the_instrument () && _route->the_instrument ()->output_streams().n_audio() > 2) {
// TODO ..->n_audio() > 1 && separate_output_groups) hard to check here every time.
items.push_back (MenuElem (_("Fan out to Busses"), sigc::bind (sigc::mem_fun (*this, &RouteUI::fan_out), true, true)));
items.push_back (MenuElem (_("Fan out to Tracks"), sigc::bind (sigc::mem_fun (*this, &RouteUI::fan_out), false, true)));
@@ -1759,28 +1762,27 @@ MixerStrip::build_route_ops_menu ()
denormal_menu_item = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
denormal_menu_item->set_active (_route->denormal_protection());
- if (_route) {
- /* note that this relies on selection being shared across editor and
- mixer (or global to the backend, in the future), which is the only
- sane thing for users anyway.
- */
-
- StripableTimeAxisView* stav = PublicEditor::instance().get_stripable_time_axis_by_id (_route->id());
- if (stav) {
- Selection& selection (PublicEditor::instance().get_selection());
- if (!selection.selected (stav)) {
- selection.set (stav);
- }
-
- if (!_route->is_master()) {
- items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Duplicate..."), sigc::mem_fun (*this, &RouteUI::duplicate_selected_routes)));
- }
+ /* note that this relies on selection being shared across editor and
+ * mixer (or global to the backend, in the future), which is the only
+ * sane thing for users anyway.
+ */
+ StripableTimeAxisView* stav = PublicEditor::instance().get_stripable_time_axis_by_id (_route->id());
+ if (active && stav) {
+ Selection& selection (PublicEditor::instance().get_selection());
+ if (!selection.selected (stav)) {
+ selection.set (stav);
+ }
+ if (!_route->is_master()) {
items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Remove"), sigc::mem_fun(PublicEditor::instance(), &PublicEditor::remove_tracks)));
+ items.push_back (MenuElem (_("Duplicate..."), sigc::mem_fun (*this, &RouteUI::duplicate_selected_routes)));
}
}
+
+ if (active) {
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Remove"), sigc::mem_fun(PublicEditor::instance(), &PublicEditor::remove_tracks)));
+ }
}
gboolean
@@ -1960,6 +1962,9 @@ MixerStrip::map_frozen ()
boost::shared_ptr<AudioTrack> at = audio_track();
+ bool en = _route->active () || ARDOUR::Profile->get_mixbus();
+ bool send = _current_delivery && boost::dynamic_pointer_cast<Send>(_current_delivery) != 0;
+
if (at) {
switch (at->freeze_state()) {
case AudioTrack::Frozen:
@@ -1967,12 +1972,11 @@ MixerStrip::map_frozen ()
hide_redirect_editors ();
break;
default:
- processor_box.set_sensitive (true);
- // XXX need some way, maybe, to retoggle redirect editors
+ processor_box.set_sensitive (en && !send);
break;
}
} else {
- processor_box.set_sensitive (true);
+ processor_box.set_sensitive (en && !send);
}
RouteUI::map_frozen ();
}
@@ -2166,25 +2170,7 @@ MixerStrip::drop_send ()
}
send_gone_connection.disconnect ();
- input_button.set_sensitive (true);
- output_button.set_sensitive (true);
- group_button.set_sensitive (true);
- set_invert_sensitive (true);
- gpm.meter_point_button.set_sensitive (true);
- mute_button->set_sensitive (true);
- solo_button->set_sensitive (true);
- solo_isolated_led->set_sensitive (true);
- solo_safe_led->set_sensitive (true);
- monitor_input_button->set_sensitive (true);
- monitor_disk_button->set_sensitive (true);
- _comment_button.set_sensitive (true);
- trim_control.set_sensitive (true);
- if (midi_input_enable_button) {
- midi_input_enable_button->set_sensitive (true);
- }
- control_slave_ui.set_sensitive (true);
RouteUI::check_rec_enable_sensitivity ();
- set_button_names (); // update solo button visual state
}
void
@@ -2192,6 +2178,7 @@ MixerStrip::set_current_delivery (boost::shared_ptr<Delivery> d)
{
_current_delivery = d;
DeliveryChanged (_current_delivery);
+ update_sensitivity ();
}
void
@@ -2219,28 +2206,6 @@ MixerStrip::show_send (boost::shared_ptr<Send> send)
panner_ui().set_send_drawing_mode (true);
panner_ui().show_all ();
- input_button.set_sensitive (false);
- group_button.set_sensitive (false);
- set_invert_sensitive (false);
- gpm.meter_point_button.set_sensitive (false);
- mute_button->set_sensitive (false);
- solo_button->set_sensitive (false);
- rec_enable_button->set_sensitive (false);
- solo_isolated_led->set_sensitive (false);
- solo_safe_led->set_sensitive (false);
- monitor_input_button->set_sensitive (false);
- monitor_disk_button->set_sensitive (false);
- _comment_button.set_sensitive (false);
- trim_control.set_sensitive (false);
- if (midi_input_enable_button) {
- midi_input_enable_button->set_sensitive (false);
- }
- control_slave_ui.set_sensitive (false);
-
- if (boost::dynamic_pointer_cast<InternalSend>(send)) {
- output_button.set_sensitive (false);
- }
-
reset_strip_style ();
}
@@ -2280,7 +2245,7 @@ MixerStrip::set_button_names ()
monitor_section_button->set_text (_("Mon"));
}
- if (_route && _route->solo_safe_control()->solo_safe()) {
+ if ((_route && _route->solo_safe_control()->solo_safe()) || !solo_button->get_sensitive()) {
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));
@@ -2309,7 +2274,7 @@ MixerStrip::set_button_names ()
monitor_section_button->set_text (S_("Mon|O"));
}
- if (_route && _route->solo_safe_control()->solo_safe()) {
+ if ((_route && _route->solo_safe_control()->solo_safe()) || !solo_button->get_sensitive()) {
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));
@@ -2439,6 +2404,46 @@ MixerStrip::route_active_changed ()
{
RouteUI::route_active_changed ();
reset_strip_style ();
+ update_sensitivity ();
+}
+
+void
+MixerStrip::update_sensitivity ()
+{
+ bool en = _route->active () || ARDOUR::Profile->get_mixbus();
+ bool send = _current_delivery && boost::dynamic_pointer_cast<Send>(_current_delivery) != 0;
+ bool aux = _current_delivery && boost::dynamic_pointer_cast<InternalSend>(_current_delivery) != 0;
+
+ if (route()->is_master()) {
+ solo_iso_table.set_sensitive (false);
+ control_slave_ui.set_sensitive (false);
+ } else {
+ solo_iso_table.set_sensitive (en && !send);
+ control_slave_ui.set_sensitive (en && !send);
+ }
+
+ input_button.set_sensitive (en && !send);
+ group_button.set_sensitive (en && !send);
+ set_invert_sensitive (en && !send);
+ gpm.meter_point_button.set_sensitive (en && !send);
+ mute_button->set_sensitive (en && !send);
+ solo_button->set_sensitive (en && !send);
+ solo_isolated_led->set_sensitive (en && !send);
+ solo_safe_led->set_sensitive (en && !send);
+ monitor_input_button->set_sensitive (en && !send);
+ monitor_disk_button->set_sensitive (en && !send);
+ _comment_button.set_sensitive (en && !send);
+ trim_control.set_sensitive (en && !send);
+ control_slave_ui.set_sensitive (en && !send);
+
+ if (midi_input_enable_button) {
+ midi_input_enable_button->set_sensitive (en && !send);
+ }
+
+ output_button.set_sensitive (en && !aux);
+
+ map_frozen ();
+ set_button_names (); // update solo button visual state
}
void