فهرست منبع

#mapeditor Implements undo and redo operation for drawing terrain

Opuszek 1 ماه پیش
والد
کامیت
5cfabca99f
2فایلهای تغییر یافته به همراه25 افزوده شده و 7 حذف شده
  1. 22 6
      lib/mapping/CMapOperation.cpp
  2. 3 1
      lib/mapping/CMapOperation.h

+ 22 - 6
lib/mapping/CMapOperation.cpp

@@ -103,22 +103,38 @@ void CDrawTerrainOperation::execute()
 	for(const auto & pos : terrainSel.getSelectedItems())
 	for(const auto & pos : terrainSel.getSelectedItems())
 	{
 	{
 		auto & tile = map->getTile(pos);
 		auto & tile = map->getTile(pos);
-		tile.terrainType = terType;
+		if (formerState.find(tile.terrainType) == formerState.end())
+			formerState.insert({tile.terrainType, CTerrainSelection(terrainSel.getMap())});
+		formerState.at(tile.terrainType).select(pos);
+	}
+	drawTerrain(terType, terrainSel);
+}
+
+void CDrawTerrainOperation::drawTerrain(TerrainId terrainType, CTerrainSelection selection)
+{
+	for(const auto & pos : selection.getSelectedItems())
+	{
+		auto & tile = map->getTile(pos);
+		tile.terrainType = terrainType;
 		invalidateTerrainViews(pos);
 		invalidateTerrainViews(pos);
 	}
 	}
 
 
-	updateTerrainTypes();
+	updateTerrainTypes(selection);
 	updateTerrainViews();
 	updateTerrainViews();
+	invalidatedTerViews.clear();
 }
 }
 
 
 void CDrawTerrainOperation::undo()
 void CDrawTerrainOperation::undo()
 {
 {
-	//TODO
+	for (auto const& typeToSelection : formerState)
+	{
+		drawTerrain(typeToSelection.first, typeToSelection.second);
+	}
 }
 }
 
 
 void CDrawTerrainOperation::redo()
 void CDrawTerrainOperation::redo()
 {
 {
-	//TODO
+	drawTerrain(terType, terrainSel);
 }
 }
 
 
 std::string CDrawTerrainOperation::getLabel() const
 std::string CDrawTerrainOperation::getLabel() const
@@ -126,9 +142,9 @@ std::string CDrawTerrainOperation::getLabel() const
 	return "Draw Terrain";
 	return "Draw Terrain";
 }
 }
 
 
-void CDrawTerrainOperation::updateTerrainTypes()
+void CDrawTerrainOperation::updateTerrainTypes(CTerrainSelection selection)
 {
 {
-	auto positions = terrainSel.getSelectedItems();
+	auto positions = selection.getSelectedItems();
 	while(!positions.empty())
 	while(!positions.empty())
 	{
 	{
 		const auto & centerPos = *(positions.begin());
 		const auto & centerPos = *(positions.begin());

+ 3 - 1
lib/mapping/CMapOperation.h

@@ -94,7 +94,8 @@ private:
 		InvalidTiles() : centerPosValid(false) { }
 		InvalidTiles() : centerPosValid(false) { }
 	};
 	};
 
 
-	void updateTerrainTypes();
+	void drawTerrain(TerrainId terrain, CTerrainSelection selection);
+	void updateTerrainTypes(CTerrainSelection selection);
 	void invalidateTerrainViews(const int3 & centerPos);
 	void invalidateTerrainViews(const int3 & centerPos);
 	InvalidTiles getInvalidTiles(const int3 & centerPos) const;
 	InvalidTiles getInvalidTiles(const int3 & centerPos) const;
 
 
@@ -106,6 +107,7 @@ private:
 
 
 	CTerrainSelection terrainSel;
 	CTerrainSelection terrainSel;
 	TerrainId terType;
 	TerrainId terType;
+	std::map<TerrainId, CTerrainSelection> formerState;
 	int decorationsPercentage;
 	int decorationsPercentage;
 	vstd::RNG* gen;
 	vstd::RNG* gen;
 	std::set<int3> invalidatedTerViews;
 	std::set<int3> invalidatedTerViews;