]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/zone.cpp
Also use TrackChains as target locations in Timetable
[r2c2.git] / source / libr2c2 / zone.cpp
index 28b178afff15107c470cacf16b2dc9cfb674e63e..30b60e99aa65865a0960afc113e3d5f5fedfbd7f 100644 (file)
@@ -1,4 +1,5 @@
 #include <msp/strings/format.h>
+#include <msp/strings/regex.h>
 #include "block.h"
 #include "layout.h"
 #include "track.h"
@@ -10,15 +11,25 @@ using namespace Msp;
 namespace R2C2 {
 
 Zone::Zone(Layout &l):
-       layout(l),
+       TrackChain(l),
        number(0)
 {
-       layout.add_zone(*this);
+       layout.add(*this);
 }
 
 Zone::~Zone()
 {
-       layout.remove_zone(*this);
+       layout.remove(*this);
+}
+
+void Zone::set_name(const string &n)
+{
+       Regex r_name("(.+) ([^ ]+) ([1-9][0-9]*)");
+       RegMatch m = r_name.match(n);
+       if(!m)
+               throw invalid_argument("Zone::set_name");
+
+       set_name(m[1].str, m[2].str, lexical_cast<unsigned>(m[3].str));
 }
 
 void Zone::set_name(const string &g, const string &q, unsigned n)
@@ -27,55 +38,20 @@ void Zone::set_name(const string &g, const string &q, unsigned n)
        qualifier = q;
        number = n;
 
-       signal_name_changed.emit(group, qualifier, number);
+       update_name();
 }
 
-string Zone::get_name() const
+void Zone::update_name()
 {
-       string result = group;
+       string full_name = group;
        if(!qualifier.empty())
        {
-               result += ' ';
-               result += qualifier;
+               full_name += ' ';
+               full_name += qualifier;
        }
        if(number)
-               result += format(" %d", number);
-       return result;
-}
-
-void Zone::add_track(Track &track)
-{
-       if(!is_valid(track))
-               throw InvalidParameterValue("Can't add track to zone");
-
-       tracks.insert(&track);
-}
-
-bool Zone::add_tracks(const TrackSet &trks)
-{
-       TrackSet pending = trks;
-       bool first = true;
-       while(1)
-       {
-               bool ok = false;
-               for(TrackSet::const_iterator i=pending.begin(); i!=pending.end(); ++i)
-                       if(is_valid(**i))
-                       {
-                               tracks.insert(*i);
-                               pending.erase(i);
-                               ok = true;
-                               break;
-                       }
-
-               if(!ok)
-               {
-                       if(first)
-                               throw InvalidParameterValue("Cound not add any tracks to zone");
-                       return pending.empty();
-               }
-
-               first = false;
-       }
+               full_name += format(" %d", number);
+       TrackChain::set_name(full_name);
 }
 
 void Zone::save(list<DataFile::Statement> &st) const
@@ -94,17 +70,9 @@ void Zone::save(list<DataFile::Statement> &st) const
                st.push_back((DataFile::Statement("block"), *i));
 }
 
-bool Zone::is_valid(Track &t) const
+DataFile::Statement Zone::save_reference() const
 {
-       if(tracks.empty())
-               return true;
-
-       const vector<Track *> &links = t.get_links();
-       for(vector<Track *>::const_iterator i=links.begin(); i!=links.end(); ++i)
-               if(*i && tracks.count(*i))
-                       return true;
-
-       return false;
+       return (DataFile::Statement("zone"), group, number);
 }
 
 
@@ -117,6 +85,11 @@ Zone::Loader::Loader(Zone &z):
        add("qualifier", &Zone::qualifier);
 }
 
+void Zone::Loader::finish()
+{
+       obj.update_name();
+}
+
 void Zone::Loader::block(unsigned b)
 {
        Block &blk = obj.layout.get_block(b);