/* * GDevelop Core * Copyright 2008-2015 Florian Rival (Florian.Rival@gmail.com). All rights reserved. * This project is released under the MIT License. */ #include #include "GDCore/Project/ClassWithObjects.h" #include "GDCore/Project/Project.h" #include "GDCore/Extensions/Platform.h" #include "GDCore/Project/Object.h" #include "GDCore/Serialization/SerializerElement.h" namespace gd { ClassWithObjects::ClassWithObjects() { } #if defined(GD_IDE_ONLY) void ClassWithObjects::SerializeObjectsTo(SerializerElement & element) const { element.ConsiderAsArrayOf("object"); for ( std::size_t j = 0;j < initialObjects.size();j++ ) { initialObjects[j]->SerializeTo(element.AddChild("object")); } } #endif void ClassWithObjects::UnserializeObjectsFrom(gd::Project & project, const SerializerElement & element) { initialObjects.clear(); element.ConsiderAsArrayOf("object", "Objet"); for (std::size_t i = 0; i < element.GetChildrenCount(); ++i) { const SerializerElement & objectElement = element.GetChild(i); gd::String type = objectElement.GetStringAttribute("type"); std::shared_ptr newObject = project.CreateObject(type, objectElement.GetStringAttribute("name", "", "nom")); if ( newObject != std::shared_ptr() ) { newObject->UnserializeFrom(project, objectElement); initialObjects.push_back( newObject ); } else std::cout << "WARNING: Unknown object type \"" << type << "\"" << std::endl; } } bool ClassWithObjects::HasObjectNamed(const gd::String & name) const { return ( find_if(initialObjects.begin(), initialObjects.end(), bind2nd(gd::ObjectHasName(), name)) != initialObjects.end() ); } gd::Object & ClassWithObjects::GetObject(const gd::String & name) { return *(*find_if(initialObjects.begin(), initialObjects.end(), bind2nd(gd::ObjectHasName(), name))); } const gd::Object & ClassWithObjects::GetObject(const gd::String & name) const { return *(*find_if(initialObjects.begin(), initialObjects.end(), bind2nd(gd::ObjectHasName(), name))); } gd::Object & ClassWithObjects::GetObject(std::size_t index) { return *initialObjects[index]; } const gd::Object & ClassWithObjects::GetObject (std::size_t index) const { return *initialObjects[index]; } std::size_t ClassWithObjects::GetObjectPosition(const gd::String & name) const { for (std::size_t i = 0;iGetName() == name ) return i; } return gd::String::npos; } std::size_t ClassWithObjects::GetObjectsCount() const { return initialObjects.size(); } #if defined(GD_IDE_ONLY) gd::Object & ClassWithObjects::InsertNewObject(gd::Project & project, const gd::String & objectType, const gd::String & name, std::size_t position) { std::shared_ptr newObject = project.GetCurrentPlatform().CreateObject(objectType, name); if (position newObject = std::shared_ptr(object.Clone()); if (position= initialObjects.size() || secondObjectIndex >= initialObjects.size() ) return; std::shared_ptr temp = initialObjects[firstObjectIndex]; initialObjects[firstObjectIndex] = initialObjects[secondObjectIndex]; initialObjects[secondObjectIndex] = temp; } void ClassWithObjects::RemoveObject(const gd::String & name) { std::vector< std::shared_ptr >::iterator object = find_if(initialObjects.begin(), initialObjects.end(), bind2nd(ObjectHasName(), name)); if ( object == initialObjects.end() ) return; initialObjects.erase(object); } }