summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-04-20 12:38:37 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-04-20 12:38:37 +0000
commitf119387d767d9e8411556579e48022ed9b5d3974 (patch)
tree5595577ae9970b34bfb9bd6c4ef03e34891e7a7a
parent2cb5595b11df77375d199c4bed3e35361fba52a3 (diff)
indicate "soloed-by-others" state on solo button via a "half-lit" state
git-svn-id: svn://localhost/ardour2/branches/3.0@6939 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/ardour3_ui_dark.rc.in25
-rw-r--r--gtk2_ardour/mixer_strip.cc61
-rw-r--r--gtk2_ardour/route_time_axis.cc34
-rw-r--r--gtk2_ardour/route_ui.cc53
-rw-r--r--gtk2_ardour/route_ui.h2
-rw-r--r--libs/ardour/route.cc11
-rw-r--r--libs/gtkmm2ext/stateful_button.cc4
7 files changed, 120 insertions, 70 deletions
diff --git a/gtk2_ardour/ardour3_ui_dark.rc.in b/gtk2_ardour/ardour3_ui_dark.rc.in
index a945cd8240..f338a736dc 100644
--- a/gtk2_ardour/ardour3_ui_dark.rc.in
+++ b/gtk2_ardour/ardour3_ui_dark.rc.in
@@ -327,6 +327,10 @@ style "solo_button" = "small_button"
style "solo_button_alternate" = "small_button"
{
+ #
+ # this is the "solo-safe" solo theme
+ #
+
bg[NORMAL] = { 0.19, 0.97, 0.69 } # solo-safe
bg[ACTIVE] = { 0.19, 0.97, 0.69 } # solo-safe
bg[SELECTED] = { 0.19, 0.97, 0.69 } # solo-safe
@@ -338,9 +342,29 @@ style "solo_button_alternate" = "small_button"
fg[PRELIGHT] = { 0, 0, 0 }
}
+style "solo_button_alternate2" = "small_button"
+{
+ #
+ # this is the "half-bright" solo theme
+ #
+
+ bg[NORMAL] = { 0.91, 0.97, 0.82 }
+ bg[ACTIVE] = { 0.91, 0.97, 0.82 }
+ bg[SELECTED] = { 0.91, 0.97, 0.82 }
+ bg[PRELIGHT] = { 0.91, 0.97, 0.82 }
+
+ fg[ACTIVE] = { 0, 0, 0 }
+ fg[SELECTED] = { 0, 0, 0 }
+ fg[NORMAL] = { 0, 0, 0 }
+ fg[PRELIGHT] = { 0, 0, 0 }
+}
style "solo_button_active" = "small_button"
{
+ #
+ # this is the "full-bright" solo theme
+ #
+
bg[NORMAL] = { 0.66, 0.97, 0.19 } # solo
bg[ACTIVE] = { 0.66, 0.97, 0.19 } # solo
bg[SELECTED] = { 0.66, 0.97, 0.19 } # solo
@@ -1429,6 +1453,7 @@ widget "*MixerMuteButton-alternate" style:highest "mixer_mute_button_alternate"
widget "*MixerMuteButton-active" style:highest "mixer_mute_button_active"
widget "*SoloButton" style:highest "solo_button"
widget "*SoloButton-alternate" style:highest "solo_button_alternate"
+widget "*SoloButton-alternate2" style:highest "solo_button_alternate2"
widget "*SoloButton-active" style:highest "solo_button_active"
widget "*MixerSoloButton" style:highest "mixer_solo_button"
widget "*MixerSoloButton-alternate" style:highest "mixer_solo_button_alternate"
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 290081c2f1..5e7064ee8d 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -115,7 +115,6 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
, comment_button (_("Comments"))
{
init ();
- set_button_names ();
set_route (rt);
}
@@ -326,6 +325,11 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
RouteUI::set_route (rt);
+ /* map the current state */
+
+ mute_changed (0);
+ solo_changed (0);
+
delete input_selector;
input_selector = 0;
@@ -1731,35 +1735,42 @@ MixerStrip::set_button_names ()
case Wide:
rec_enable_button_label.set_text (_("Rec"));
mute_button_label.set_text (_("Mute"));
- if (!Config->get_solo_control_is_listen_control()) {
- solo_button_label.set_text (_("Solo"));
- } else {
- switch (Config->get_listen_position()) {
- case AfterFaderListen:
- solo_button_label.set_text (_("AFL"));
- break;
- case PreFaderListen:
- solo_button_label.set_text (_("PFL"));
- break;
- }
- }
+ if (_route && _route->solo_safe()) {
+ solo_button_label.set_text (X_("!"));
+ } else {
+ if (!Config->get_solo_control_is_listen_control()) {
+ solo_button_label.set_text (_("Solo"));
+ } else {
+ switch (Config->get_listen_position()) {
+ case AfterFaderListen:
+ solo_button_label.set_text (_("AFL"));
+ break;
+ case PreFaderListen:
+ solo_button_label.set_text (_("PFL"));
+ break;
+ }
+ }
+ }
break;
default:
rec_enable_button_label.set_text (_("R"));
mute_button_label.set_text (_("M"));
- if (!Config->get_solo_control_is_listen_control()) {
- solo_button_label.set_text (_("S"));
- } else {
- switch (Config->get_listen_position()) {
- case AfterFaderListen:
- solo_button_label.set_text (_("A"));
- break;
- case PreFaderListen:
- solo_button_label.set_text (_("P"));
- break;
- }
- }
+ if (_route && _route->solo_safe()) {
+ solo_button_label.set_text (X_("!"));
+ if (!Config->get_solo_control_is_listen_control()) {
+ solo_button_label.set_text (_("S"));
+ } else {
+ switch (Config->get_listen_position()) {
+ case AfterFaderListen:
+ solo_button_label.set_text (_("A"));
+ break;
+ case PreFaderListen:
+ solo_button_label.set_text (_("P"));
+ break;
+ }
+ }
+ }
break;
}
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index b3b3f360e3..bb4737622f 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -116,8 +116,6 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh
, gm (sess, slider, true, 115)
, _ignore_track_mode_change (false)
{
- set_button_names ();
-
gm.set_controls (_route, _route->shared_peak_meter(), _route->amp());
gm.get_level_meter().set_no_show_all();
gm.get_level_meter().setup_meters(50);
@@ -134,6 +132,9 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh
_marked_for_display = true;
}
+ mute_changed (0);
+ solo_changed (0);
+
timestretch_rect = 0;
no_redraw = false;
destructive_track_mode_item = 0;
@@ -2422,18 +2423,21 @@ RouteTimeAxisView::set_button_names ()
{
rec_enable_button_label.set_text (_("r"));
- if (Config->get_solo_control_is_listen_control()) {
- switch (Config->get_listen_position()) {
- case AfterFaderListen:
- solo_button_label.set_text (_("A"));
- break;
- case PreFaderListen:
- solo_button_label.set_text (_("P"));
- break;
- }
- } else {
- solo_button_label.set_text (_("s"));
- }
-
+ if (_route && _route->solo_safe()) {
+ solo_button_label.set_text (X_("!"));
+ } else {
+ if (Config->get_solo_control_is_listen_control()) {
+ switch (Config->get_listen_position()) {
+ case AfterFaderListen:
+ solo_button_label.set_text (_("A"));
+ break;
+ case PreFaderListen:
+ solo_button_label.set_text (_("P"));
+ break;
+ }
+ } else {
+ solo_button_label.set_text (_("s"));
+ }
+ }
mute_button_label.set_text (_("m"));
}
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index 284925d06a..526d99cd94 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -99,6 +99,8 @@ RouteUI::init ()
post_fader_mute_check = 0;
listen_mute_check = 0;
main_mute_check = 0;
+ solo_safe_check = 0;
+ solo_isolated_check = 0;
ignore_toggle = false;
_solo_release = 0;
_mute_release = 0;
@@ -210,6 +212,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
_route->active_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_active_changed, this), gui_context());
_route->mute_changed.connect (route_connections, invalidator (*this), ui_bind (&RouteUI::mute_changed, this, _1), gui_context());
_route->solo_changed.connect (route_connections, invalidator (*this), ui_bind (&RouteUI::solo_changed, this, _1), gui_context());
+ _route->solo_safe_changed.connect (route_connections, invalidator (*this), ui_bind (&RouteUI::solo_changed, this, _1), gui_context());
_route->listen_changed.connect (route_connections, invalidator (*this), ui_bind (&RouteUI::listen_changed, this, _1), gui_context());
_route->solo_isolated_changed.connect (route_connections, invalidator (*this), ui_bind (&RouteUI::solo_changed, this, _1), gui_context());
_route->phase_invert_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::polarity_changed, this), gui_context());
@@ -238,11 +241,6 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
solo_button->show();
}
- /* map the current state */
-
- mute_changed (0);
- solo_changed (0);
-
map_frozen ();
}
@@ -752,7 +750,11 @@ RouteUI::solo_visual_state_with_isolate (boost::shared_ptr<Route> r)
if (r->solo_isolated()) {
return 2;
} else if (r->soloed()) {
- return 1;
+ if (!r->self_soloed()) {
+ return 3;
+ } else {
+ return 1;
+ }
} else {
return 0;
}
@@ -809,6 +811,20 @@ RouteUI::update_solo_display ()
}
+ bool yn = _route->solo_safe ();
+
+ if (solo_safe_check && solo_safe_check->get_active() != yn) {
+ solo_safe_check->set_active (yn);
+ }
+
+ yn = _route->solo_isolated ();
+
+ if (solo_isolated_check && solo_isolated_check->get_active() != yn) {
+ solo_isolated_check->set_active (yn);
+ }
+
+ set_button_names ();
+
solo_button->set_visual_state (solo_visual_state_with_isolate (_route));
}
@@ -949,15 +965,15 @@ RouteUI::build_solo_menu (void)
check = new CheckMenuItem(_("Solo Isolate"));
check->set_active (_route->solo_isolated());
check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_isolated), check));
- _route->solo_isolated_changed.connect (route_connections, invalidator (*this), ui_bind (&RouteUI::solo_isolated_toggle, this, _1, check), gui_context());
items.push_back (CheckMenuElem(*check));
+ solo_isolated_check = dynamic_cast<CheckMenuItem*>(&items.back());
check->show_all();
check = new CheckMenuItem(_("Solo Safe"));
check->set_active (_route->solo_safe());
check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_safe), check));
- _route->solo_safe_changed.connect (route_connections, invalidator (*this), ui_bind (&RouteUI::solo_safe_toggle, this, _1, check), gui_context());
items.push_back (CheckMenuElem(*check));
+ solo_safe_check = dynamic_cast<CheckMenuItem*>(&items.back());
check->show_all();
//items.push_back (SeparatorElem());
@@ -1265,27 +1281,6 @@ RouteUI::denormal_protection_changed ()
}
void
-RouteUI::solo_isolated_toggle(void* /*src*/, Gtk::CheckMenuItem* check)
-{
- bool yn = _route->solo_isolated ();
-
- if (check->get_active() != yn) {
- check->set_active (yn);
- }
-}
-
-
-void
-RouteUI::solo_safe_toggle(void* /*src*/, Gtk::CheckMenuItem* check)
-{
- bool yn = _route->solo_safe ();
-
- if (check->get_active() != yn) {
- check->set_active (yn);
- }
-}
-
-void
RouteUI::disconnect_input ()
{
_route->input()->disconnect (this);
diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h
index 5741687040..a01db6dd8e 100644
--- a/gtk2_ardour/route_ui.h
+++ b/gtk2_ardour/route_ui.h
@@ -153,6 +153,8 @@ class RouteUI : public virtual AxisView
Gtk::CheckMenuItem* post_fader_mute_check;
Gtk::CheckMenuItem* listen_mute_check;
Gtk::CheckMenuItem* main_mute_check;
+ Gtk::CheckMenuItem* solo_safe_check;
+ Gtk::CheckMenuItem* solo_isolated_check;
void toggle_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
void muting_change ();
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 27a5429c47..a29dab5365 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -522,6 +522,10 @@ Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t n
void
Route::set_listen (bool yn, void* src)
{
+ if (_solo_safe) {
+ return;
+ }
+
if (_monitor_send) {
if (yn != _monitor_send->active()) {
if (yn) {
@@ -585,12 +589,16 @@ Route::set_solo (bool yn, void *src)
void
Route::set_self_solo (bool yn)
{
- _self_solo = yn;
+ _self_solo = yn;
}
void
Route::mod_solo_by_others (int32_t delta)
{
+ if (_solo_safe) {
+ return;
+ }
+
if (delta < 0) {
if (_soloed_by_others >= (uint32_t) abs (delta)) {
_soloed_by_others += delta;
@@ -602,6 +610,7 @@ Route::mod_solo_by_others (int32_t delta)
}
set_delivery_solo ();
+ solo_changed (this);
}
void
diff --git a/libs/gtkmm2ext/stateful_button.cc b/libs/gtkmm2ext/stateful_button.cc
index ea6abdac43..d8bb1f212f 100644
--- a/libs/gtkmm2ext/stateful_button.cc
+++ b/libs/gtkmm2ext/stateful_button.cc
@@ -67,6 +67,10 @@ StateButton::set_visual_state (int n)
case 2:
name += "-alternate";
break;
+
+ case 3:
+ name += "-alternate2";
+ break;
}
set_widget_name (name);