5
#include <Eris/UIFactory.h>
7
#include <Atlas/Objects/Entity/UIEntity.h>
8
#include <Atlas/Objects/Entity/Frame.h>
9
#include <Atlas/Objects/Entity/Slot.h>
11
#include <sigc++/object_slot.h>
13
Eris::UI::Factory::Factory(const Atlas::Objects::Entity::UIEntity& entity,
14
const std::string& base_type,
15
const IDList& parents,
16
const Atlas::Message::Element::MapType& attrs,
18
_id(entity.getId()), _id_list(parents), _gen(gen),
19
_persistent(false), _refcount(1), _attrs(attrs)
21
_id_list.push_back(_id);
22
_attrs["display_status"] = entity.getDisplayStatus();
23
Atlas::Objects::Root::const_iterator I, last(entity, base_type);
24
for(I = entity.begin(); I != last; ++I)
25
_attrs[I->first] = I->second;
29
Eris::UI::Factory::create(IDMap& idmap) const
31
Element* elem = _gen->create(attrs());
32
for(IDList::const_iterator I = idlist().begin(); I != idlist().end(); ++I)
38
Eris::UI::Factory::parse(const Atlas::Message::Element::MapType& map,
39
const Bindings&) const
41
Atlas::Objects::Entity::UIEntity entity;
43
// FIXME isn't there a better way to do this?
44
Atlas::Message::Element::MapType::const_iterator I = map.begin();
46
entity.setAttr(I->first, I->second);
48
return new Factory(entity, "u_i_entity", idlist(), attrs(), _gen);
51
Eris::UI::FrameFactory::~FrameFactory()
53
for(ChildList::iterator I = _children.begin(); I != _children.end(); ++I)
55
if(persistent()) // original frame factory, owns BaseGen
60
Eris::UI::FrameFactory::create(IDMap& idmap) const
62
FrameElement* frame = _gen->create(_valign, _halign, _rel_pos, attrs());
64
// we don't want child slots connecting to anything
65
// outside this frame, so we use a local idmap
69
for(IDList::const_iterator I = idlist().begin(); I != idlist().end(); ++I)
72
for(ChildList::const_iterator I = _children.begin(); I != _children.end(); ++I) {
73
Element* child = (*I)->create(local);
74
SlotElement* slot = dynamic_cast<SlotElement*>(child);
76
frame->packSlot(slot);
81
// FIXME if one insertion fails, do they all fail?
82
idmap.insert(local.begin(), local.end());
88
Eris::UI::FrameFactory::parse(const Atlas::Message::Element::MapType& map,
89
const Bindings& factories) const
91
Atlas::Objects::Entity::Frame frame;
93
// FIXME isn't there a better way to do this?
94
Atlas::Message::Element::MapType::const_iterator I = map.begin();
96
frame.setAttr(I->first, I->second);
98
FrameFactory* factory = new FrameFactory(frame, idlist(), factories, attrs(), _gen);
100
// if 'contains' isn't set, then we're dealing with a child
101
// of Frame being used as an opaque type, so we keep the same
103
if(factory->_children.empty()) {
104
factory->_valign = _valign;
105
factory->_halign = _halign;
106
factory->_rel_pos = _rel_pos;
107
factory->_children = _children;
108
for(ChildList::const_iterator I = _children.begin(); I != _children.end(); ++I)
116
Eris::UI::FrameFactory::FrameFactory(const Atlas::Objects::Entity::Frame& frame,
117
const IDList& parents, const Bindings& factories,
118
const Atlas::Message::Element::MapType& attrs,
120
: Factory(frame, "frame", parents, attrs, 0),
121
_valign(frame.getValign()), _halign(frame.getHalign()),
122
_rel_pos(frame.getRelPos()), _gen(gen)
124
const Atlas::Message::Element::ListType& contains = frame.getContains();
126
Atlas::Message::Element::ListType::const_iterator I;
128
for(I = contains.begin(); I != contains.end(); ++I) {
129
Factory* child = factories.findFactory(*I);
131
_children.push_back(child);
137
Eris::UI::SlotFactory::SlotFactory(const Atlas::Objects::Entity::Slot& slot,
138
const IDList& parents,
139
const Atlas::Message::Element::MapType& attrs,
141
: Factory(slot, "slot", parents, attrs, gen), _target(slot.getTarget())
147
Eris::UI::SlotFactory::create(IDMap& idmap) const
149
SlotElement* slot = dynamic_cast<SlotElement*>(gen()->create(attrs()));
151
Atlas::Message::Element::ListType::const_iterator T;
152
for(T = _target.begin(); T != _target.end(); ++T) {
155
IDMap::iterator I = idmap.find(T->asString());
157
I->second->PropertiesChanged.connect(SigC::slot(*slot, &SlotElement::action));
159
for(IDList::const_iterator I = idlist().begin(); I != idlist().end(); ++I)
165
Eris::UI::SlotFactory::parse(const Atlas::Message::Element::MapType& map,
166
const Bindings&) const
168
Atlas::Objects::Entity::Slot slot;
170
// FIXME isn't there a better way to do this?
171
Atlas::Message::Element::MapType::const_iterator I = map.begin();
172
while(I != map.end())
173
slot.setAttr(I->first, I->second);
175
if(slot.getTarget().empty())
178
return new SlotFactory(slot, idlist(), attrs(), gen());
181
Eris::UI::Bindings::Bindings()
183
// FIXME bind slot factories here
186
Eris::UI::Bindings::~Bindings()
188
for(FactoryMap::iterator I = _factory_map.begin(); I != _factory_map.end(); ++I)
193
Eris::UI::Bindings::parse(const Atlas::Message::Element& obj)
198
const Atlas::Message::Element::MapType& map = obj.asMap();
200
Atlas::Message::Element::MapType::const_iterator J = map.find("display_status");
202
if(J != map.end() && J->second.isString() && J->second.asString() == "console") {
203
Atlas::Objects::Entity::UIEntity entity;
205
// FIXME isn't there a better way to do this?
206
Atlas::Message::Element::MapType::const_iterator I = map.begin();
207
while(I != map.end())
208
entity.setAttr(I->first, I->second);
210
createConsoleElement(entity);
214
Atlas::Message::Element::MapType::const_iterator parents = map.find("parents");
216
if(parents == map.end() || !parents->second.isList())
219
J = map.find("objtype");
221
if(J == map.end() || !J->second.isString())
224
const std::string& objtype = J->second.asString();
226
if(objtype != "class" && objtype != "object")
229
Factory* factory = 0;
231
Atlas::Message::Element::ListType::const_iterator I;
232
for(I = parents->second.asList().begin(); I != parents->second.asList().end(); ++I) {
233
Factory* parent = findFactory(*I);
235
factory = parent->parse(obj.asMap(), *this);
243
if(objtype == "class") {
247
else { // objtype == "object"
248
Factory::IDMap idmap;
249
display(factory->create(idmap), factory->id());
255
Eris::UI::Bindings::clear()
259
for(FactoryMap::iterator I = _factory_map.begin(); I != _factory_map.end(); ++I) {
260
if(I->second->persistent())
266
_factory_map = keepers;