ComponentCollection::ComponentCollection( const ComponentPtr& component ) { HELIUM_ASSERT( component->GetSlot() != Reflect::ReservedTypes::Invalid ); m_Components.insert( M_Component::value_type( component->GetSlot(), component ) ); component->AddChangedListener( ElementChangeSignature::Delegate::Create<ComponentCollection, void (ComponentCollection::*)( const Reflect::ElementChangeArgs& )> ( this, &ComponentCollection::ComponentChanged ) ); m_Modified = true; }
bool ComponentCollection::SetComponent(const ComponentPtr& component, bool validate, tstring* error ) { HELIUM_ASSERT( component->GetSlot() != Reflect::ReservedTypes::Invalid ); M_Component::const_iterator found = m_Components.find( component->GetSlot() ); if (found != m_Components.end() && found->second == component) { return true; // nothing to do, this is already in the collection } tstring errorMessage; if ( validate && !ValidateComponent( component, errorMessage ) ) { if ( error ) { *error = tstring( TXT( "Component '" ) ) + component->GetClass()->m_ShortName + TXT( "' is not valid for collection '" ) + GetClass()->m_ShortName + TXT( "': " ) + errorMessage; } return false; } // Event args ComponentCollectionChanged args ( this, component ); // Set the component and connect the collection m_Components[ component->GetSlot() ] = component; component->SetCollection( this ); // Start caring about change to the component component->AddChangedListener( ElementChangeSignature::Delegate::Create<ComponentCollection, void (ComponentCollection::*)( const Reflect::ElementChangeArgs& )> ( this, &ComponentCollection::ComponentChanged ) ); // Raise event m_Modified = true; m_ComponentAdded.Raise( args ); return true; }