#include <msp/strings/format.h>
+#include <msp/strings/regex.h>
#include "block.h"
#include "layout.h"
#include "track.h"
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)
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 logic_error("unconnected");
-
- 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 logic_error("unconnected");
- return pending.empty();
- }
-
- first = false;
- }
-}
-
-bool Zone::has_track(Track &t) const
-{
- return tracks.count(&t);
+ full_name += format(" %d", number);
+ TrackChain::set_name(full_name);
}
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);
}
add("qualifier", &Zone::qualifier);
}
+void Zone::Loader::finish()
+{
+ obj.update_name();
+}
+
void Zone::Loader::block(unsigned b)
{
Block &blk = obj.layout.get_block(b);