]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/zone.cpp
Store zone blocks in order and use add_tracks to load them
[r2c2.git] / source / libr2c2 / zone.cpp
index 23b0ac9f093f3962507473f6258c082d3bb3245a..8b6c95f9c9af2fd0911c956e76fe44e15cfb0362 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"
@@ -21,26 +22,36 @@ Zone::~Zone()
        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)
 {
        group = g;
        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;
+               full_name += format(" %d", number);
+       TrackChain::set_name(full_name);
 }
 
 void Zone::save(list<DataFile::Statement> &st) const
@@ -51,12 +62,24 @@ void Zone::save(list<DataFile::Statement> &st) const
        if(number)
                st.push_back((DataFile::Statement("number"), number));
 
-       set<unsigned> block_ids;
-       for(TrackSet::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
-               block_ids.insert((*i)->get_block().get_id());
+       unsigned last_block = 0;
+       TrackIter iter = ends[0].reverse();
+       while(iter && tracks.count(iter.track()))
+       {
+               unsigned block_id = iter->get_block().get_id();
+               if(block_id!=last_block)
+               {
+                       st.push_back((DataFile::Statement("block"), block_id));
+                       last_block = block_id;
+               }
+
+               iter = next_iter(iter);
+       }
+}
 
-       for(set<unsigned>::const_iterator i=block_ids.begin(); i!=block_ids.end(); ++i)
-               st.push_back((DataFile::Statement("block"), *i));
+DataFile::Statement Zone::save_reference() const
+{
+       return (DataFile::Statement("zone"), group, number);
 }
 
 
@@ -69,11 +92,15 @@ 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);
-       const set<Track *> &btracks = blk.get_tracks();
-       obj.tracks.insert(btracks.begin(), btracks.end());
+       obj.add_tracks(blk.get_tracks());
 }
 
 } // namespace R2C2