Changed: #1302 Clean up code for undo commands.

This commit is contained in:
dnk-88 2011-08-17 02:49:32 +03:00
parent e64bc1f4d8
commit 05b5d29a84
2 changed files with 193 additions and 301 deletions

View file

@ -202,17 +202,6 @@ void removeGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *mode
} }
} }
QList<Path> graphicsItemsToPaths(const QList<QGraphicsItem *> &items, PrimitivesTreeModel *model)
{
QList<Path> result;
Q_FOREACH(QGraphicsItem *item, items)
{
Node *node = qvariant_cast<Node *>(item->data(Constants::WORLD_EDITOR_NODE));
result.push_back(model->pathFromNode(node));
}
return result;
}
QList<QPolygonF> polygonsFromItems(const QList<QGraphicsItem *> &items) QList<QPolygonF> polygonsFromItems(const QList<QGraphicsItem *> &items)
{ {
QList<QPolygonF> result; QList<QPolygonF> result;
@ -224,49 +213,6 @@ QList<QPolygonF> polygonsFromItems(const QList<QGraphicsItem *> &items)
return result; return result;
} }
void updateGraphicsData(AbstractWorldItem *item)
{
float cellSize = Utils::ligoConfig()->CellSize;
Node *node = qvariant_cast<Node *>(item->data(Constants::WORLD_EDITOR_NODE));
PrimitiveNode *primitiveNode = static_cast<PrimitiveNode *>(node);
if (primitiveNode != 0)
{
NLLIGO::IPrimitive *primitive = primitiveNode->primitive();
std::vector<NLLIGO::CPrimVector> vPoints;
QPolygonF polygon = item->polygon();
polygon.translate(item->pos());
for (int i = 0; i < polygon.size(); ++i)
{
NLMISC::CVector vec(polygon.at(i).x(), cellSize - polygon.at(i).y(), 0.0);
vPoints.push_back(NLLIGO::CPrimVector(vec));
}
switch (primitiveNode->primitiveClass()->Type)
{
case NLLIGO::CPrimitiveClass::Point:
{
NLLIGO::CPrimPoint *point = static_cast<NLLIGO::CPrimPoint *>(primitive);
point->Point = vPoints.front();
break;
}
case NLLIGO::CPrimitiveClass::Path:
{
NLLIGO::CPrimPath *path = static_cast<NLLIGO::CPrimPath *>(primitive);
path->VPoints = vPoints;
break;
}
case NLLIGO::CPrimitiveClass::Zone:
{
NLLIGO::CPrimZone *zone = static_cast<NLLIGO::CPrimZone *>(primitive);
zone->VPoints = vPoints;
break;
}
}
}
}
CreateWorldCommand::CreateWorldCommand(const QString &fileName, PrimitivesTreeModel *model, QUndoCommand *parent) CreateWorldCommand::CreateWorldCommand(const QString &fileName, PrimitivesTreeModel *model, QUndoCommand *parent)
: QUndoCommand(parent), : QUndoCommand(parent),
m_fileName(fileName), m_fileName(fileName),
@ -484,14 +430,122 @@ void AddPrimitiveByClassCommand::redo()
addNewGraphicsItems(m_model->pathToIndex(m_newPrimIndex), m_model, m_scene); addNewGraphicsItems(m_model->pathToIndex(m_newPrimIndex), m_model, m_scene);
} }
MoveWorldItemsCommand::MoveWorldItemsCommand(const QList<QGraphicsItem *> &items, const QPointF &offset, AbstractWorldItemCommand::AbstractWorldItemCommand(const QList<QGraphicsItem *> &items,
WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent) WorldEditorScene *scene,
PrimitivesTreeModel *model,
QUndoCommand *parent)
: QUndoCommand(parent), : QUndoCommand(parent),
m_listPaths(graphicsItemsToPaths(items, model)), m_listPaths(graphicsItemsToPaths(items, model)),
m_offset(offset),
m_model(model), m_model(model),
m_scene(scene), m_scene(scene),
m_firstRun(true) m_firstRun(true)
{
}
AbstractWorldItemCommand::~AbstractWorldItemCommand()
{
}
void AbstractWorldItemCommand::undo()
{
bool pointsMode = m_scene->isEnabledEditPoints();
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
undoChangeItem(i, item);
updatePrimitiveData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
}
void AbstractWorldItemCommand::redo()
{
if (!m_firstRun)
{
bool pointsMode = m_scene->isEnabledEditPoints();
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
redoChangeItem(i, item);
updatePrimitiveData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
}
else
{
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
updatePrimitiveData(item);
}
}
m_firstRun = false;
}
void AbstractWorldItemCommand::updatePrimitiveData(AbstractWorldItem *item)
{
float cellSize = Utils::ligoConfig()->CellSize;
Node *node = qvariant_cast<Node *>(item->data(Constants::WORLD_EDITOR_NODE));
PrimitiveNode *primitiveNode = static_cast<PrimitiveNode *>(node);
if (primitiveNode != 0)
{
NLLIGO::IPrimitive *primitive = primitiveNode->primitive();
std::vector<NLLIGO::CPrimVector> vPoints;
QPolygonF polygon = item->polygon();
polygon.translate(item->pos());
for (int i = 0; i < polygon.size(); ++i)
{
NLMISC::CVector vec(polygon.at(i).x(), cellSize - polygon.at(i).y(), 0.0);
vPoints.push_back(NLLIGO::CPrimVector(vec));
}
switch (primitiveNode->primitiveClass()->Type)
{
case NLLIGO::CPrimitiveClass::Point:
{
NLLIGO::CPrimPoint *point = static_cast<NLLIGO::CPrimPoint *>(primitive);
point->Point = vPoints.front();
break;
}
case NLLIGO::CPrimitiveClass::Path:
{
NLLIGO::CPrimPath *path = static_cast<NLLIGO::CPrimPath *>(primitive);
path->VPoints = vPoints;
break;
}
case NLLIGO::CPrimitiveClass::Zone:
{
NLLIGO::CPrimZone *zone = static_cast<NLLIGO::CPrimZone *>(primitive);
zone->VPoints = vPoints;
break;
}
}
}
}
QList<Path> AbstractWorldItemCommand::graphicsItemsToPaths(const QList<QGraphicsItem *> &items, PrimitivesTreeModel *model)
{
QList<Path> result;
Q_FOREACH(QGraphicsItem *item, items)
{
Node *node = qvariant_cast<Node *>(item->data(Constants::WORLD_EDITOR_NODE));
result.push_back(model->pathFromNode(node));
}
return result;
}
MoveWorldItemsCommand::MoveWorldItemsCommand(const QList<QGraphicsItem *> &items, const QPointF &offset,
WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent)
: AbstractWorldItemCommand(items, scene, model, parent),
m_offset(offset)
{ {
setText("Move item(s)"); setText("Move item(s)");
} }
@ -500,57 +554,21 @@ MoveWorldItemsCommand::~MoveWorldItemsCommand()
{ {
} }
void MoveWorldItemsCommand::undo() void MoveWorldItemsCommand::undoChangeItem(int i, AbstractWorldItem *item)
{ {
bool pointsMode = m_scene->isEnabledEditPoints(); item->moveBy(-m_offset.x(), -m_offset.y());
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->moveBy(-m_offset.x(), -m_offset.y());
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
} }
void MoveWorldItemsCommand::redo() void MoveWorldItemsCommand::redoChangeItem(int i, AbstractWorldItem *item)
{ {
if (!m_firstRun) item->moveBy(m_offset.x(), m_offset.y());
{
bool pointsMode = m_scene->isEnabledEditPoints();
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->moveBy(m_offset.x(), m_offset.y());
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
}
else
{
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
updateGraphicsData(item);
}
}
m_firstRun = false;
} }
RotateWorldItemsCommand::RotateWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle, RotateWorldItemsCommand::RotateWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle,
const QPointF &pivot, WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent) const QPointF &pivot, WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent)
: QUndoCommand(parent), : AbstractWorldItemCommand(items, scene, model, parent),
m_listPaths(graphicsItemsToPaths(items, model)),
m_angle(angle), m_angle(angle),
m_pivot(pivot), m_pivot(pivot)
m_model(model),
m_scene(scene),
m_firstRun(true)
{ {
setText("Rotate item(s)"); setText("Rotate item(s)");
} }
@ -559,57 +577,21 @@ RotateWorldItemsCommand::~RotateWorldItemsCommand()
{ {
} }
void RotateWorldItemsCommand::undo() void RotateWorldItemsCommand::undoChangeItem(int i, AbstractWorldItem *item)
{ {
bool pointsMode = m_scene->isEnabledEditPoints(); item->rotateOn(m_pivot, -m_angle);
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->rotateOn(m_pivot, -m_angle);
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
} }
void RotateWorldItemsCommand::redo() void RotateWorldItemsCommand::redoChangeItem(int i, AbstractWorldItem *item)
{ {
if (!m_firstRun) item->rotateOn(m_pivot, m_angle);
{
bool pointsMode = m_scene->isEnabledEditPoints();
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->rotateOn(m_pivot, m_angle);
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
}
else
{
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
updateGraphicsData(item);
}
}
m_firstRun = false;
} }
ScaleWorldItemsCommand::ScaleWorldItemsCommand(const QList<QGraphicsItem *> &items, const QPointF &factor, ScaleWorldItemsCommand::ScaleWorldItemsCommand(const QList<QGraphicsItem *> &items, const QPointF &factor,
const QPointF &pivot, WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent) const QPointF &pivot, WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent)
: QUndoCommand(parent), : AbstractWorldItemCommand(items, scene, model, parent),
m_listPaths(graphicsItemsToPaths(items, model)),
m_factor(factor), m_factor(factor),
m_pivot(pivot), m_pivot(pivot)
m_model(model),
m_scene(scene),
m_firstRun(true)
{ {
setText("Scale item(s)"); setText("Scale item(s)");
} }
@ -618,57 +600,21 @@ ScaleWorldItemsCommand::~ScaleWorldItemsCommand()
{ {
} }
void ScaleWorldItemsCommand::undo() void ScaleWorldItemsCommand::undoChangeItem(int i, AbstractWorldItem *item)
{ {
bool pointsMode = m_scene->isEnabledEditPoints();
m_scene->setEnabledEditPoints(false);
QPointF m_invertFactor(1 / m_factor.x(), 1 / m_factor.y()); QPointF m_invertFactor(1 / m_factor.x(), 1 / m_factor.y());
for (int i = 0; i < m_listPaths.count(); ++i) item->scaleOn(m_pivot, m_invertFactor);
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->scaleOn(m_pivot, m_invertFactor);
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
} }
void ScaleWorldItemsCommand::redo() void ScaleWorldItemsCommand::redoChangeItem(int i, AbstractWorldItem *item)
{ {
if (!m_firstRun) item->scaleOn(m_pivot, m_factor);
{
bool pointsMode = m_scene->isEnabledEditPoints();
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->scaleOn(m_pivot, m_factor);
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
}
else
{
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
updateGraphicsData(item);
}
}
m_firstRun = false;
} }
TurnWorldItemsCommand::TurnWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle, TurnWorldItemsCommand::TurnWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle,
WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent) WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent)
: QUndoCommand(parent), : AbstractWorldItemCommand(items, scene, model, parent),
m_listPaths(graphicsItemsToPaths(items, model)), m_angle(angle)
m_angle(angle),
m_model(model),
m_scene(scene),
m_firstRun(true)
{ {
setText("Turn item(s)"); setText("Turn item(s)");
} }
@ -677,58 +623,22 @@ TurnWorldItemsCommand::~TurnWorldItemsCommand()
{ {
} }
void TurnWorldItemsCommand::undo() void TurnWorldItemsCommand::undoChangeItem(int i, AbstractWorldItem *item)
{ {
bool pointsMode = m_scene->isEnabledEditPoints(); item->turnOn(-m_angle);
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->turnOn(-m_angle);
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
} }
void TurnWorldItemsCommand::redo() void TurnWorldItemsCommand::redoChangeItem(int i, AbstractWorldItem *item)
{ {
if (!m_firstRun) item->turnOn(m_angle);
{
bool pointsMode = m_scene->isEnabledEditPoints();
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->turnOn(m_angle);
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
}
else
{
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
updateGraphicsData(item);
}
}
m_firstRun = false;
} }
ShapeWorldItemsCommand::ShapeWorldItemsCommand(const QList<QGraphicsItem *> &items, const QList<QPolygonF> &polygons, ShapeWorldItemsCommand::ShapeWorldItemsCommand(const QList<QGraphicsItem *> &items, const QList<QPolygonF> &polygons,
WorldEditorScene *scene, PrimitivesTreeModel *model, WorldEditorScene *scene, PrimitivesTreeModel *model,
QUndoCommand *parent) QUndoCommand *parent)
: QUndoCommand(parent), : AbstractWorldItemCommand(items, scene, model, parent),
m_listPaths(graphicsItemsToPaths(items, model)),
m_redoPolygons(polygons), m_redoPolygons(polygons),
m_undoPolygons(polygonsFromItems(items)), m_undoPolygons(polygonsFromItems(items))
m_model(model),
m_scene(scene),
m_firstRun(true)
{ {
setText("Change shape"); setText("Change shape");
} }
@ -737,49 +647,14 @@ ShapeWorldItemsCommand::~ShapeWorldItemsCommand()
{ {
} }
void ShapeWorldItemsCommand::undo() void ShapeWorldItemsCommand::undoChangeItem(int i, AbstractWorldItem *item)
{ {
bool pointsMode = m_scene->isEnabledEditPoints(); item->setPolygon(m_redoPolygons.at(i));
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->setPolygon(m_redoPolygons.at(i));
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
} }
void ShapeWorldItemsCommand::redo() void ShapeWorldItemsCommand::redoChangeItem(int i, AbstractWorldItem *item)
{ {
if (!m_firstRun) item->setPolygon(m_undoPolygons.at(i));
{
bool pointsMode = m_scene->isEnabledEditPoints();
m_scene->setEnabledEditPoints(false);
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
item->setPolygon(m_undoPolygons.at(i));
updateGraphicsData(item);
}
m_scene->setEnabledEditPoints(pointsMode);
}
else
{
for (int i = 0; i < m_listPaths.count(); ++i)
{
Node *node = m_model->pathToNode(m_listPaths.at(i));
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
updateGraphicsData(item);
}
}
m_firstRun = false;
} }
} /* namespace WorldEditor */ } /* namespace WorldEditor */

View file

@ -49,11 +49,9 @@ void addNewGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *mode
// Recursive scan primitives model for delete Graphics Items // Recursive scan primitives model for delete Graphics Items
void removeGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *model, WorldEditorScene *scene); void removeGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *model, WorldEditorScene *scene);
QList<Path> graphicsItemsToPaths(const QList<QGraphicsItem *> &items, PrimitivesTreeModel *model);
QList<QPolygonF> polygonsFromItems(const QList<QGraphicsItem *> &items); QList<QPolygonF> polygonsFromItems(const QList<QGraphicsItem *> &items);
void updateGraphicsData(AbstractWorldItem *item);
/** /**
@class CreateWorldCommand @class CreateWorldCommand
@ -163,12 +161,41 @@ private:
QTreeView *m_view; QTreeView *m_view;
}; };
/**
@class AbstractWorldItemCommand
@brief
@details
*/
class AbstractWorldItemCommand: public QUndoCommand
{
public:
AbstractWorldItemCommand(const QList<QGraphicsItem *> &items, WorldEditorScene *scene,
PrimitivesTreeModel *model, QUndoCommand *parent = 0);
virtual ~AbstractWorldItemCommand();
virtual void undo();
virtual void redo();
protected:
virtual void undoChangeItem(int i, AbstractWorldItem *item) = 0;
virtual void redoChangeItem(int i, AbstractWorldItem *item) = 0;
void updatePrimitiveData(AbstractWorldItem *item);
private:
QList<Path> graphicsItemsToPaths(const QList<QGraphicsItem *> &items, PrimitivesTreeModel *model);
const QList<Path> m_listPaths;
PrimitivesTreeModel *const m_model;
WorldEditorScene *m_scene;
bool m_firstRun;
};
/** /**
@class MoveWorldItemsCommand @class MoveWorldItemsCommand
@brief @brief
@details @details
*/ */
class MoveWorldItemsCommand: public QUndoCommand class MoveWorldItemsCommand: public AbstractWorldItemCommand
{ {
public: public:
MoveWorldItemsCommand(const QList<QGraphicsItem *> &items, const QPointF &offset, MoveWorldItemsCommand(const QList<QGraphicsItem *> &items, const QPointF &offset,
@ -176,15 +203,13 @@ public:
QUndoCommand *parent = 0); QUndoCommand *parent = 0);
virtual ~MoveWorldItemsCommand(); virtual ~MoveWorldItemsCommand();
virtual void undo(); protected:
virtual void redo(); virtual void undoChangeItem(int i, AbstractWorldItem *item);
virtual void redoChangeItem(int i, AbstractWorldItem *item);
private: private:
const QList<Path> m_listPaths;
const QPointF m_offset; const QPointF m_offset;
PrimitivesTreeModel *const m_model;
WorldEditorScene *m_scene;
bool m_firstRun;
}; };
/** /**
@ -192,7 +217,7 @@ private:
@brief @brief
@details @details
*/ */
class RotateWorldItemsCommand: public QUndoCommand class RotateWorldItemsCommand: public AbstractWorldItemCommand
{ {
public: public:
RotateWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle, RotateWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle,
@ -200,16 +225,14 @@ public:
PrimitivesTreeModel *model, QUndoCommand *parent = 0); PrimitivesTreeModel *model, QUndoCommand *parent = 0);
virtual ~RotateWorldItemsCommand(); virtual ~RotateWorldItemsCommand();
virtual void undo(); protected:
virtual void redo(); virtual void undoChangeItem(int i, AbstractWorldItem *item);
virtual void redoChangeItem(int i, AbstractWorldItem *item);
private: private:
const QList<Path> m_listPaths;
const qreal m_angle; const qreal m_angle;
const QPointF m_pivot; const QPointF m_pivot;
PrimitivesTreeModel *const m_model;
WorldEditorScene *m_scene;
bool m_firstRun;
}; };
/** /**
@ -217,7 +240,7 @@ private:
@brief @brief
@details @details
*/ */
class ScaleWorldItemsCommand: public QUndoCommand class ScaleWorldItemsCommand: public AbstractWorldItemCommand
{ {
public: public:
ScaleWorldItemsCommand(const QList<QGraphicsItem *> &items, const QPointF &factor, ScaleWorldItemsCommand(const QList<QGraphicsItem *> &items, const QPointF &factor,
@ -225,16 +248,14 @@ public:
PrimitivesTreeModel *model, QUndoCommand *parent = 0); PrimitivesTreeModel *model, QUndoCommand *parent = 0);
virtual ~ScaleWorldItemsCommand(); virtual ~ScaleWorldItemsCommand();
virtual void undo(); protected:
virtual void redo(); virtual void undoChangeItem(int i, AbstractWorldItem *item);
virtual void redoChangeItem(int i, AbstractWorldItem *item);
private: private:
const QList<Path> m_listPaths;
const QPointF m_factor; const QPointF m_factor;
const QPointF m_pivot; const QPointF m_pivot;
PrimitivesTreeModel *const m_model;
WorldEditorScene *m_scene;
bool m_firstRun;
}; };
/** /**
@ -242,7 +263,7 @@ private:
@brief @brief
@details @details
*/ */
class TurnWorldItemsCommand: public QUndoCommand class TurnWorldItemsCommand: public AbstractWorldItemCommand
{ {
public: public:
TurnWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle, TurnWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle,
@ -250,15 +271,13 @@ public:
QUndoCommand *parent = 0); QUndoCommand *parent = 0);
virtual ~TurnWorldItemsCommand(); virtual ~TurnWorldItemsCommand();
virtual void undo(); protected:
virtual void redo(); virtual void undoChangeItem(int i, AbstractWorldItem *item);
virtual void redoChangeItem(int i, AbstractWorldItem *item);
private: private:
const QList<Path> m_listPaths;
const qreal m_angle; const qreal m_angle;
PrimitivesTreeModel *const m_model;
WorldEditorScene *m_scene;
bool m_firstRun;
}; };
/** /**
@ -266,7 +285,7 @@ private:
@brief @brief
@details @details
*/ */
class ShapeWorldItemsCommand: public QUndoCommand class ShapeWorldItemsCommand: public AbstractWorldItemCommand
{ {
public: public:
ShapeWorldItemsCommand(const QList<QGraphicsItem *> &items, const QList<QPolygonF> &polygons, ShapeWorldItemsCommand(const QList<QGraphicsItem *> &items, const QList<QPolygonF> &polygons,
@ -274,16 +293,14 @@ public:
QUndoCommand *parent = 0); QUndoCommand *parent = 0);
virtual ~ShapeWorldItemsCommand(); virtual ~ShapeWorldItemsCommand();
virtual void undo(); protected:
virtual void redo(); virtual void undoChangeItem(int i, AbstractWorldItem *item);
virtual void redoChangeItem(int i, AbstractWorldItem *item);
private: private:
const QList<Path> m_listPaths;
const QList<QPolygonF> m_redoPolygons; const QList<QPolygonF> m_redoPolygons;
const QList<QPolygonF> m_undoPolygons; const QList<QPolygonF> m_undoPolygons;
PrimitivesTreeModel *const m_model;
WorldEditorScene *m_scene;
bool m_firstRun;
}; };
} /* namespace WorldEditor */ } /* namespace WorldEditor */