X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fzone.cpp;h=30b60e99aa65865a0960afc113e3d5f5fedfbd7f;hb=a44355019e5a27da0d5e5287aae74864e4122e1f;hp=4b95da54efb375053facd900ea705831a8e12dfc;hpb=7e27b311e33beda1746eb63e0945633f262427f6;p=r2c2.git diff --git a/source/libr2c2/zone.cpp b/source/libr2c2/zone.cpp index 4b95da5..30b60e9 100644 --- a/source/libr2c2/zone.cpp +++ b/source/libr2c2/zone.cpp @@ -1,11 +1,5 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - -#include +#include +#include #include "block.h" #include "layout.h" #include "track.h" @@ -17,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(m[3].str)); } void Zone::set_name(const string &g, const string &q, unsigned n) @@ -34,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 &st) const @@ -101,17 +70,9 @@ void Zone::save(list &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 &links = t.get_links(); - for(vector::const_iterator i=links.begin(); i!=links.end(); ++i) - if(*i && tracks.count(*i)) - return true; - - return false; + return (DataFile::Statement("zone"), group, number); } @@ -124,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);