1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-16 10:19:47 +02:00
vcmi/lib/mapping/CMapEditManager.h

108 lines
3.0 KiB
C++
Raw Normal View History

/*
* CMapEditManager.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
#include "../GameConstants.h"
#include "MapEditUtils.h"
VCMI_LIB_NAMESPACE_BEGIN
class CMapOperation;
namespace vstd
{
class RNG;
}
/// The CMapUndoManager provides the functionality to save operations and undo/redo them.
class DLL_LINKAGE CMapUndoManager : boost::noncopyable
{
public:
CMapUndoManager();
2023-05-24 01:12:25 +02:00
~CMapUndoManager();
void undo();
void redo();
void clearAll();
/// The undo redo limit is a number which says how many undo/redo items can be saved. The default
/// value is 10. If the value is 0, no undo/redo history will be maintained.
2022-09-17 13:04:01 +02:00
/// FIXME: unlimited undo please
int getUndoRedoLimit() const;
void setUndoRedoLimit(int value);
const CMapOperation * peekRedo() const;
const CMapOperation * peekUndo() const;
void addOperation(std::unique_ptr<CMapOperation> && operation); /// Client code does not need to call this method.
2022-09-17 13:04:01 +02:00
//poor man's signal
void setUndoCallback(std::function<void(bool, bool)> functor);
private:
2023-04-17 23:11:16 +02:00
using TStack = std::list<std::unique_ptr<CMapOperation>>;
void doOperation(TStack & fromStack, TStack & toStack, bool doUndo);
const CMapOperation * peek(const TStack & stack) const;
TStack undoStack;
TStack redoStack;
int undoRedoLimit;
2022-09-17 13:04:01 +02:00
void onUndoRedo();
std::function<void(bool allowUndo, bool allowRedo)> undoCallback;
};
/// The map edit manager provides functionality for drawing terrain and placing
/// objects on the map.
class DLL_LINKAGE CMapEditManager : boost::noncopyable
{
public:
CMapEditManager(CMap * map);
~CMapEditManager();
CMap * getMap();
/// Clears the terrain. The free level is filled with water and the underground level with rock.
2024-07-19 14:17:06 +02:00
void clearTerrain(vstd::RNG * gen);
/// Draws terrain at the current terrain selection. The selection will be cleared automatically.
2024-07-19 14:17:06 +02:00
void drawTerrain(TerrainId terType, int decorationsPercentage, vstd::RNG * gen);
/// Draws roads at the current terrain selection. The selection will be cleared automatically.
2024-07-19 14:17:06 +02:00
void drawRoad(RoadId roadType, vstd::RNG * gen);
/// Draws rivers at the current terrain selection. The selection will be cleared automatically.
2024-07-19 14:17:06 +02:00
void drawRiver(RiverId riverType, vstd::RNG * gen);
void insertObject(CGObjectInstance * obj);
2022-09-17 13:04:01 +02:00
void insertObjects(std::set<CGObjectInstance *> & objects);
void moveObject(CGObjectInstance * obj, const int3 & pos);
void removeObject(CGObjectInstance * obj);
void removeObjects(std::set<CGObjectInstance *> & objects);
CTerrainSelection & getTerrainSelection();
CObjectSelection & getObjectSelection();
CMapUndoManager & getUndoManager();
private:
void execute(std::unique_ptr<CMapOperation> && operation);
CMap * map;
CMapUndoManager undoManager;
std::unique_ptr<vstd::RNG> gen;
CTerrainSelection terrainSel;
CObjectSelection objectSel;
};
VCMI_LIB_NAMESPACE_END