indicate "soloed-by-others" state on solo button via a "half-lit" state
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 20 Apr 2010 12:38:37 +0000 (12:38 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 20 Apr 2010 12:38:37 +0000 (12:38 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6939 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour3_ui_dark.rc.in
gtk2_ardour/mixer_strip.cc
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_ui.cc
gtk2_ardour/route_ui.h
libs/ardour/route.cc
libs/gtkmm2ext/stateful_button.cc

index a945cd824015de349e2d32d51c7a2c8992cf96fd..f338a736dccb8bafc0116b95d06e504aef1440ae 100644 (file)
@@ -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"
index 290081c2f1ce54aab184d7d2144b4310e3273bc7..5e7064ee8da2511a56544ad49fba3a01301395bc 100644 (file)
@@ -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;
 
        }
index b3b3f360e382e765f3423df19b859a12233a3684..bb4737622facde069dbe20dc2733b0e1387bf243 100644 (file)
@@ -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"));
 }
index 284925d06a224bb1a395f8d128f3c7b555710c63..526d99cd9424608ad76eac085f36c9eb739e5e05 100644 (file)
@@ -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());
@@ -1264,27 +1280,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 ()
 {
index 57416870402d9dbbe20a0c7c561fb06459526c66..a01db6dd8ecd55c20dc3dada4ebb634ce2716483 100644 (file)
@@ -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 ();
index 27a5429c473b39304ae551da6ff54011af268d89..a29dab5365105a498f6c16a9bb101d178ca1cbf6 100644 (file)
@@ -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
index ea6abdac430f0f6bbbe9c1be2e4a254675d21c96..d8bb1f212f6f7f012195762ac444a1215e79d38f 100644 (file)
@@ -67,6 +67,10 @@ StateButton::set_visual_state (int n)
        case 2:
                name += "-alternate";
                break;
+
+        case 3:
+                name += "-alternate2";
+                break;
        }
 
        set_widget_name (name);