show/hide VCA assign buttons depending on VCA existence
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 29 Apr 2016 14:33:05 +0000 (10:33 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 31 May 2016 19:30:42 +0000 (15:30 -0400)
gtk2_ardour/mixer_ui.cc
gtk2_ardour/visibility_group.cc
gtk2_ardour/visibility_group.h

index 97485d162e19e3472ddb42e53b52e9bd28562201..4d0c2c3e7f972fe52d37e4533edae260644292a3 100644 (file)
@@ -1233,6 +1233,7 @@ Mixer_UI::redisplay_track_list ()
 {
        TreeModel::Children rows = track_model->children();
        TreeModel::Children::iterator i;
+       uint32_t n_masters = 0;
 
        if (no_track_list_redisplay) {
                return;
@@ -1247,6 +1248,7 @@ Mixer_UI::redisplay_track_list ()
                if (vms) {
                        vca_packer.pack_start (*vms, false, false);
                        vms->show ();
+                       n_masters++;
                        continue;
                }
 
@@ -1296,6 +1298,14 @@ Mixer_UI::redisplay_track_list ()
                }
        }
 
+       /* update visibility of VCA assign buttons */
+
+       if (n_masters == 0) {
+               UIConfiguration::instance().set_mixer_strip_visibility (VisibilityGroup::remove_element (UIConfiguration::instance().get_mixer_strip_visibility(), X_("VCA")));
+       } else {
+               UIConfiguration::instance().set_mixer_strip_visibility (VisibilityGroup::add_element (UIConfiguration::instance().get_mixer_strip_visibility(), X_("VCA")));
+       }
+
        _group_tabs->set_dirty ();
 }
 
index 46a941d0fc2b97f078f0e00b5e14c18e75f69634..9a59e613eba10edcc076c83d7e090a7599f8ecda 100644 (file)
 #include <gtkmm/menu.h>
 #include <gtkmm/menushell.h>
 #include <gtkmm/treeview.h>
+
+#include "pbd/strsplit.h"
 #include "pbd/xml++.h"
+
 #include "visibility_group.h"
 
 #include "i18n.h"
@@ -167,6 +170,52 @@ VisibilityGroup::set_state (string v)
        update ();
 }
 
+string
+VisibilityGroup::remove_element (std::string const& from, std::string const& element)
+{
+       std::vector<string> s;
+       std::string ret;
+
+       split (from, s, ',');
+       for (std::vector<string>::const_iterator i = s.begin(); i != s.end(); ++i) {
+               if ((*i) == element) {
+                       continue;
+               }
+               if (!ret.empty()) {
+                       ret += ',';
+               }
+               ret += *i;
+       }
+
+       return ret;
+}
+
+string
+VisibilityGroup::add_element (std::string const& from, std::string const& element)
+{
+       std::vector<string> s;
+       std::string ret;
+       
+       split (from, s, ',');
+
+       for (std::vector<string>::const_iterator i = s.begin(); i != s.end(); ++i) {
+               if ((*i) == element) {
+                       /* already present, just return the original */
+                       return from;
+               }
+       }
+
+       ret = from;
+
+       if (!ret.empty()) {
+               ret += ',';
+       }
+
+       ret += element;
+
+       return ret;
+}
+
 string
 VisibilityGroup::get_state_name () const
 {
index 8ac2c1db5f7aa4bf22e08b544dffc284f3e54a08..ce1adecdd46d804b7b46613d14eb49e2167bcbc1 100644 (file)
@@ -56,6 +56,9 @@ public:
 
        PBD::Signal0<void> VisibilityChanged;
 
+       static std::string remove_element (std::string const& from, std::string const& element);
+       static std::string add_element (std::string const& from, std::string const& element);
+
 private:
 
        struct Member {