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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#include "TargetKeyCollection.h"
#include "TargetableNode.h"
#include "string/predicate.h"
namespace entity {
TargetKeyCollection::TargetKeyCollection(TargetableNode& owner) :
_owner(owner)
{}
ITargetManager* TargetKeyCollection::getTargetManager()
{
return _owner.getTargetManager();
}
void TargetKeyCollection::onTargetManagerChanged()
{
for (auto& pair : _targetKeys)
{
pair.second.onTargetManagerChanged();
}
}
void TargetKeyCollection::forEachTarget(const std::function<void(const TargetPtr&)>& func) const
{
for (auto pair : _targetKeys)
{
func(pair.second.getTarget());
}
}
std::size_t TargetKeyCollection::getNumTargets() const
{
return _targetKeys.size();
}
bool TargetKeyCollection::empty() const
{
return _targetKeys.empty();
}
bool TargetKeyCollection::isTargetKey(const std::string& key)
{
// A key is a target key if it starts with "target" (any case)
return (string::istarts_with(key, "target"));
}
// Entity::Observer implementation, gets called on key insert
void TargetKeyCollection::onKeyInsert(const std::string& key, EntityKeyValue& value)
{
// ignore non-target keys
if (!isTargetKey(key))
{
return;
}
auto i = _targetKeys.emplace(key, TargetKey(*this)).first;
i->second.attachToKeyValue(value);
// Notify the owning node to create the TargetLineNode
_owner.onTargetKeyCollectionChanged();
}
// Entity::Observer implementation, gets called on key erase
void TargetKeyCollection::onKeyErase(const std::string& key, EntityKeyValue& value)
{
// ignore non-target keys
if (!isTargetKey(key))
{
return;
}
TargetKeyMap::iterator i = _targetKeys.find(key);
// This must be found
assert(i != _targetKeys.end());
i->second.detachFromKeyValue(value);
// Remove the found element
_targetKeys.erase(i);
// Notify the owner to destruct the target line node
_owner.onTargetKeyCollectionChanged();
}
sigc::signal<void>& TargetKeyCollection::signal_TargetPositionChanged()
{
return _sigTargetPositionChanged;
}
void TargetKeyCollection::onTargetPositionChanged()
{
_sigTargetPositionChanged.emit();
}
} // namespace entity
|