+void Layout::add_zone(Zone &z)
+{
+ if(zones.insert(&z).second)
+ signal_zone_added.emit(z);
+}
+
+Layout::ZoneArray Layout::get_zones(const string &group) const
+{
+ ZoneArray result;
+ for(ZoneSet::const_iterator i=zones.begin(); i!=zones.end(); ++i)
+ if((*i)->get_group()==group)
+ result.push_back(*i);
+
+ sort(result.begin(), result.end(), zone_order);
+
+ return result;
+}
+
+Zone &Layout::get_zone(const string &group, unsigned num) const
+{
+ for(ZoneSet::const_iterator i=zones.begin(); i!=zones.end(); ++i)
+ if((*i)->get_group()==group && (*i)->get_number()==num)
+ return **i;
+
+ throw key_error(format("%s %d", group, num));
+}
+
+void Layout::remove_zone(Zone &z)