mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-12-21 00:18:43 +00:00
Changed: #1302 Clean up code for undo commands.
--HG-- branch : gsoc2011-worldeditorqt
This commit is contained in:
parent
0918a42060
commit
adbcdcd9f0
2 changed files with 193 additions and 301 deletions
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue