From 9b2c60fe16bc6979a6545f77d12795d3eabeb26a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Mon, 24 Aug 2015 01:23:05 +0200 Subject: [PATCH] DefinitionNode.copy now copies children automatically --- src/definition/AtmosphereDefinition.cpp | 2 -- src/definition/DefinitionNode.cpp | 13 ++++++++++++- src/definition/Scenery.cpp | 26 ++++++------------------- src/definition/Scenery.h | 1 - src/definition/TerrainDefinition.cpp | 2 -- src/tests/DefinitionNode_Test.cpp | 14 ++++++++++++- 6 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/definition/AtmosphereDefinition.cpp b/src/definition/AtmosphereDefinition.cpp index 12ab765..07c730d 100644 --- a/src/definition/AtmosphereDefinition.cpp +++ b/src/definition/AtmosphereDefinition.cpp @@ -71,8 +71,6 @@ void AtmosphereDefinition::copy(DefinitionNode* _destination) const AtmosphereDefinition* destination = (AtmosphereDefinition*)_destination; - daytime->copy(destination->daytime); - destination->model = model; destination->sun_color = sun_color; destination->sun_radius = sun_radius; diff --git a/src/definition/DefinitionNode.cpp b/src/definition/DefinitionNode.cpp index a6c44db..de95336 100644 --- a/src/definition/DefinitionNode.cpp +++ b/src/definition/DefinitionNode.cpp @@ -241,7 +241,18 @@ void DefinitionNode::copy(DefinitionNode* destination) const if (destination->getTypeName() == getTypeName()) { destination->setName(name); - // TODO Copy children ? + for (auto &child: children) + { + DefinitionNode *dest_child = destination->findChildByName(child->name); + if (dest_child) + { + child->copy(dest_child); + } + else + { + Logs::warning() << "Can't copy to child " << child->name << " of " << destination->getTypeName() << std::endl; + } + } } else { diff --git a/src/definition/Scenery.cpp b/src/definition/Scenery.cpp index 86d1b07..001acd6 100644 --- a/src/definition/Scenery.cpp +++ b/src/definition/Scenery.cpp @@ -18,26 +18,12 @@ static const int DATA_VERSION = 1; Scenery::Scenery(): DefinitionNode(NULL, "scenery", "scenery") { - addChild(atmosphere = new AtmosphereDefinition(this)); - addChild(camera = new CameraDefinition); - addChild(clouds = new CloudsDefinition(this)); - addChild(terrain = new TerrainDefinition(this)); - addChild(textures = new TexturesDefinition(this)); - addChild(water = new WaterDefinition(this)); -} - -void Scenery::copy(DefinitionNode *destination_) const -{ - Scenery* destination = (Scenery*)destination_; - - atmosphere->copy(destination->atmosphere); - camera->copy(destination->camera); - clouds->copy(destination->clouds); - terrain->copy(destination->terrain); - textures->copy(destination->textures); - water->copy(destination->water); - - destination->validate(); + atmosphere = new AtmosphereDefinition(this); + camera = new CameraDefinition(this); + clouds = new CloudsDefinition(this); + terrain = new TerrainDefinition(this); + textures = new TexturesDefinition(this); + water = new WaterDefinition(this); } void Scenery::validate() diff --git a/src/definition/Scenery.h b/src/definition/Scenery.h index a3b03d3..acd8858 100644 --- a/src/definition/Scenery.h +++ b/src/definition/Scenery.h @@ -29,7 +29,6 @@ public: Scenery(); virtual void validate() override; - virtual void copy(DefinitionNode *destination) const override; FileOperationResult saveGlobal(const std::string &filepath) const; FileOperationResult loadGlobal(const std::string &filepath); diff --git a/src/definition/TerrainDefinition.cpp b/src/definition/TerrainDefinition.cpp index 52f87c7..a1a8c3b 100644 --- a/src/definition/TerrainDefinition.cpp +++ b/src/definition/TerrainDefinition.cpp @@ -52,8 +52,6 @@ void TerrainDefinition::copy(DefinitionNode* _destination) const height_map->copy(destination->height_map); - water_height->copy(destination->water_height); - _height_noise->copy(destination->_height_noise); destination->validate(); diff --git a/src/tests/DefinitionNode_Test.cpp b/src/tests/DefinitionNode_Test.cpp index 2b4b785..a4e08fe 100644 --- a/src/tests/DefinitionNode_Test.cpp +++ b/src/tests/DefinitionNode_Test.cpp @@ -65,7 +65,7 @@ TEST(DefinitionNode, attachDetach) delete root; } -TEST(DefinitionNode, saveLoad) +TEST(DefinitionNode, saveLoadCopy) { PackStream *stream; int check_in = 42, check_out = 0; @@ -105,6 +105,18 @@ TEST(DefinitionNode, saveLoad) EXPECT_DOUBLE_EQ(0.0, after4->getValue()); EXPECT_EQ(42, check_out); + // Test copy, that should work like "save then load" + after12->setValue(1.1); + after13->setValue(1.1); + after3->setValue(1.1); + after4->setValue(1.1); + before->copy(after); + + EXPECT_DOUBLE_EQ(-4.3, after12->getValue()); + EXPECT_DOUBLE_EQ(1.1, after13->getValue()); + EXPECT_DOUBLE_EQ(6.7, after3->getValue()); + EXPECT_DOUBLE_EQ(1.1, after4->getValue()); + delete before; delete after; }