Disallow empty names for Groups, automatically enumerate them
authorRobin Gareus <robin@gareus.org>
Mon, 30 Jun 2014 16:25:11 +0000 (18:25 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 30 Jun 2014 16:33:05 +0000 (18:33 +0200)
gtk2_ardour/route_group_dialog.cc
gtk2_ardour/route_group_dialog.h
libs/ardour/utils.cc

index f659a683d435b453d29b6d02e267e087e577f7fb..b4da3c19f35e3e21741455c64e207c4fa38ce71f 100644 (file)
@@ -88,6 +88,15 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, bool creating_new)
        
        main_vbox->pack_start (*top_vbox, false, false);
 
+       if (_group->name ().empty()) {
+               _initial_name = "1";
+               while (!unique_name (_initial_name)) {
+                       _initial_name = bump_name_number (_initial_name);
+               }
+               _name.set_text (_initial_name);
+               update();
+       }
+
        _name.set_text (_group->name ());
        _active.set_active (_group->is_active ());
 
@@ -181,14 +190,14 @@ RouteGroupDialog::do_run ()
                        return Gtk::RESPONSE_CANCEL;
                }
 
-               if (unique_name ()) {
+               if (unique_name (_name.get_text())) {
                        /* not cancelled and the name is ok, so all is well */
                        return false;
                }
 
                _group->set_name (_initial_name);
                MessageDialog msg (
-                       _("A route group of this name already exists.  Please use a different name."),
+                       _("The group name is not unique. Please use a different name."),
                        false,
                        Gtk::MESSAGE_ERROR,
                        Gtk::BUTTONS_OK,
@@ -232,11 +241,12 @@ RouteGroupDialog::gain_toggled ()
 
 /** @return true if the current group's name is unique accross the session */
 bool
-RouteGroupDialog::unique_name () const
+RouteGroupDialog::unique_name (std::string const name) const
 {
+       if (name.empty()) return false; // do not allow empty name, empty means unset.
        list<RouteGroup*> route_groups = _group->session().route_groups ();
        list<RouteGroup*>::iterator i = route_groups.begin ();
-       while (i != route_groups.end() && ((*i)->name() != _name.get_text() || *i == _group)) {
+       while (i != route_groups.end() && ((*i)->name() != name || *i == _group)) {
                ++i;
        }
 
index 6440a7c6a233ad3ffd3d18c377d68d63159d9609..1200175e9992ac559473c484b2682335a1bfc2b9 100644 (file)
@@ -55,7 +55,7 @@ private:
 
        void gain_toggled ();
        void update ();
-       bool unique_name () const;
+       bool unique_name (std::string const name) const;
 };
 
 
index 6fdab19497d4313c33f708922fffe0e2d5661a57..54943562cb906278ad9cb0475c62ff599597c16d 100644 (file)
@@ -200,18 +200,19 @@ string
 ARDOUR::bump_name_number (const std::string& name)
 {
        size_t pos = name.length();
+       size_t num = 0;
        bool have_number = false;
        while (pos > 0 && isdigit(name.at(--pos))) {
                have_number = true;
+               num = pos;
        }
 
        string newname;
        if (have_number) {
-               ++pos;
-               int32_t num = strtol (name.c_str() + pos, (char **)NULL, 10);
+               int32_t seq = strtol (name.c_str() + num, (char **)NULL, 10);
                char buf[32];
-               snprintf (buf, sizeof(buf), "%d", num + 1);
-               newname = name.substr (0, pos);
+               snprintf (buf, sizeof(buf), "%d", seq + 1);
+               newname = name.substr (0, num);
                newname += buf;
        } else {
                newname = name;