1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <Eris/EntityRef.h>
#include <Eris/Entity.h>
#include <Eris/View.h>
#include <Eris/Log.h>
#include <sigc++/slot.h>
namespace Eris
{
EntityRef::EntityRef(View* v, const std::string& eid) :
m_inner(NULL)
{
if (eid.empty()) return;
assert(v);
m_inner = v->getEntity(eid);
if (m_inner)
{
m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
} else {
// retrieve from the server, tell us when that happens
v->notifyWhenEntitySeen(eid, sigc::mem_fun(this, &EntityRef::onEntitySeen));
}
}
EntityRef::EntityRef(Entity* e) :
m_inner(e)
{
if (m_inner)
{
m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
}
}
EntityRef::EntityRef(const EntityRef& ref) :
m_inner(ref.m_inner)
{
if (m_inner)
{
m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
}
}
EntityRef& EntityRef::operator=(const EntityRef& ref)
{
bool changed = (m_inner != ref.m_inner);
m_inner = ref.m_inner;
if (m_inner)
{
m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
}
if (changed) Changed.emit();
return *this;
}
void EntityRef::onEntityDeleted()
{
m_inner = NULL;
Changed();
}
void EntityRef::onEntitySeen(Entity* e)
{
assert(e);
m_inner = e;
m_inner->BeingDeleted.connect(sigc::mem_fun(this, &EntityRef::onEntityDeleted));
Changed();
}
} // of namespace Eris
|