Changed: #1302 Added the turn undo command.
This commit is contained in:
parent
fa774b51c7
commit
c78e3c80fd
9 changed files with 213 additions and 117 deletions
|
@ -1,44 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>WorldEditorSettingsPage</class>
|
|
||||||
<widget class="QWidget" name="WorldEditorSettingsPage">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>329</width>
|
|
||||||
<height>239</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Form</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QGroupBox" name="groupBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Colors</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_2"/>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources>
|
|
||||||
<include location="world_editor.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
|
@ -52,13 +52,14 @@ void addNewGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *mode
|
||||||
{
|
{
|
||||||
NLLIGO::IPrimitive *primitive = node->primitive();
|
NLLIGO::IPrimitive *primitive = node->primitive();
|
||||||
NLLIGO::CPrimVector *vec = 0;
|
NLLIGO::CPrimVector *vec = 0;
|
||||||
QGraphicsItem *item;
|
AbstractWorldItem *item = 0;
|
||||||
switch (node->primitiveClass()->Type)
|
switch (node->primitiveClass()->Type)
|
||||||
{
|
{
|
||||||
case NLLIGO::CPrimitiveClass::Point:
|
case NLLIGO::CPrimitiveClass::Point:
|
||||||
{
|
{
|
||||||
vec = primitive->getPrimVector();
|
vec = primitive->getPrimVector();
|
||||||
item = scene->addWorldItemPoint(QPointF(vec->x, -vec->y + cellSize), 0);
|
NLLIGO::CPrimPoint *primPoint = static_cast<NLLIGO::CPrimPoint *>(primitive);
|
||||||
|
item = scene->addWorldItemPoint(QPointF(vec->x, -vec->y + cellSize), primPoint->Angle);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NLLIGO::CPrimitiveClass::Path:
|
case NLLIGO::CPrimitiveClass::Path:
|
||||||
|
@ -91,12 +92,44 @@ void addNewGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *mode
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (item != 0)
|
||||||
|
{
|
||||||
|
// Get color from world_editor_classes.xml
|
||||||
|
NLMISC::CRGBA color = Utils::ligoConfig()->getPrimitiveColor(*primitive);
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Configurations (from world_editor_primitive_configuration.xml)
|
||||||
|
const std::vector<NLLIGO::CPrimitiveConfigurations> &configurations = Utils::ligoConfig()->getPrimitiveConfiguration();
|
||||||
|
|
||||||
|
// Look for the configuration
|
||||||
|
sint search = 0;
|
||||||
|
bool colorFound = false;
|
||||||
|
while ((search = theApp.getActiveConfiguration (*primitive, search)) != -1)
|
||||||
|
{
|
||||||
|
// Configuration activated ?
|
||||||
|
if (theApp.Configurations[search].Activated)
|
||||||
|
{
|
||||||
|
colorFound = true;
|
||||||
|
mainColor = configurations[search].Color;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
search++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to get the primitive color ?
|
||||||
|
//if (!colorFound)*/
|
||||||
|
primitive->getPropertyByName ("Color", color);
|
||||||
|
|
||||||
|
item->setColor(QColor(color.R, color.G, color.B));
|
||||||
|
}
|
||||||
|
|
||||||
QVariant variantNode;
|
QVariant variantNode;
|
||||||
variantNode.setValue<Node *>(node);
|
variantNode.setValue<Node *>(node);
|
||||||
item->setData(Constants::WORLD_EDITOR_NODE, variantNode);
|
item->setData(Constants::WORLD_EDITOR_NODE, variantNode);
|
||||||
|
|
||||||
QVariant graphicsData;
|
QVariant graphicsData;
|
||||||
graphicsData.setValue<QGraphicsItem *>(item);
|
graphicsData.setValue<AbstractWorldItem *>(item);
|
||||||
node->setData(Constants::GRAPHICS_DATA_QT4_2D, graphicsData);
|
node->setData(Constants::GRAPHICS_DATA_QT4_2D, graphicsData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +152,7 @@ void removeGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *mode
|
||||||
case NLLIGO::CPrimitiveClass::Path:
|
case NLLIGO::CPrimitiveClass::Path:
|
||||||
case NLLIGO::CPrimitiveClass::Zone:
|
case NLLIGO::CPrimitiveClass::Zone:
|
||||||
{
|
{
|
||||||
QGraphicsItem *item = qvariant_cast<QGraphicsItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
QGraphicsItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
||||||
if (item != 0)
|
if (item != 0)
|
||||||
scene->removeWorldItem(item);
|
scene->removeWorldItem(item);
|
||||||
break;
|
break;
|
||||||
|
@ -363,8 +396,8 @@ void MoveWorldItemsCommand::undo()
|
||||||
for (int i = 0; i < m_listPaths.count(); ++i)
|
for (int i = 0; i < m_listPaths.count(); ++i)
|
||||||
{
|
{
|
||||||
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
||||||
QGraphicsItem *item = qvariant_cast<QGraphicsItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
||||||
qgraphicsitem_cast<AbstractWorldItem *>(item)->moveOn(-m_offset);
|
item->moveOn(-m_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,14 +408,14 @@ void MoveWorldItemsCommand::redo()
|
||||||
for (int i = 0; i < m_listPaths.count(); ++i)
|
for (int i = 0; i < m_listPaths.count(); ++i)
|
||||||
{
|
{
|
||||||
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
||||||
QGraphicsItem *item = qvariant_cast<QGraphicsItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
||||||
qgraphicsitem_cast<AbstractWorldItem *>(item)->moveOn(m_offset);
|
item->moveOn(m_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_firstRun = false;
|
m_firstRun = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
RotateWorldItemsCommand::RotateWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal &angle,
|
RotateWorldItemsCommand::RotateWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle,
|
||||||
const QPointF &pivot, PrimitivesTreeModel *model, QUndoCommand *parent)
|
const QPointF &pivot, PrimitivesTreeModel *model, QUndoCommand *parent)
|
||||||
: QUndoCommand(parent),
|
: QUndoCommand(parent),
|
||||||
m_listPaths(graphicsItemsToPaths(items, model)),
|
m_listPaths(graphicsItemsToPaths(items, model)),
|
||||||
|
@ -391,7 +424,7 @@ RotateWorldItemsCommand::RotateWorldItemsCommand(const QList<QGraphicsItem *> &i
|
||||||
m_model(model),
|
m_model(model),
|
||||||
m_firstRun(true)
|
m_firstRun(true)
|
||||||
{
|
{
|
||||||
setText("Rotate item(s)");
|
setText(QString("Rotate item(s) %1").arg(m_angle));
|
||||||
}
|
}
|
||||||
|
|
||||||
RotateWorldItemsCommand::~RotateWorldItemsCommand()
|
RotateWorldItemsCommand::~RotateWorldItemsCommand()
|
||||||
|
@ -403,8 +436,8 @@ void RotateWorldItemsCommand::undo()
|
||||||
for (int i = 0; i < m_listPaths.count(); ++i)
|
for (int i = 0; i < m_listPaths.count(); ++i)
|
||||||
{
|
{
|
||||||
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
||||||
QGraphicsItem *item = qvariant_cast<QGraphicsItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
||||||
qgraphicsitem_cast<AbstractWorldItem *>(item)->rotateOn(m_pivot, -m_angle);
|
item->rotateOn(m_pivot, -m_angle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -415,8 +448,8 @@ void RotateWorldItemsCommand::redo()
|
||||||
for (int i = 0; i < m_listPaths.count(); ++i)
|
for (int i = 0; i < m_listPaths.count(); ++i)
|
||||||
{
|
{
|
||||||
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
||||||
QGraphicsItem *item = qvariant_cast<QGraphicsItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
||||||
qgraphicsitem_cast<AbstractWorldItem *>(item)->rotateOn(m_pivot, m_angle);
|
item->rotateOn(m_pivot, m_angle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_firstRun = false;
|
m_firstRun = false;
|
||||||
|
@ -444,8 +477,8 @@ void ScaleWorldItemsCommand::undo()
|
||||||
for (int i = 0; i < m_listPaths.count(); ++i)
|
for (int i = 0; i < m_listPaths.count(); ++i)
|
||||||
{
|
{
|
||||||
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
||||||
QGraphicsItem *item = qvariant_cast<QGraphicsItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
||||||
qgraphicsitem_cast<AbstractWorldItem *>(item)->scaleOn(m_pivot, m_invertFactor);
|
item->scaleOn(m_pivot, m_invertFactor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,8 +489,47 @@ void ScaleWorldItemsCommand::redo()
|
||||||
for (int i = 0; i < m_listPaths.count(); ++i)
|
for (int i = 0; i < m_listPaths.count(); ++i)
|
||||||
{
|
{
|
||||||
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
Node *node = m_model->pathToNode(m_listPaths.at(i));
|
||||||
QGraphicsItem *item = qvariant_cast<QGraphicsItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
AbstractWorldItem *item = qvariant_cast<AbstractWorldItem *>(node->data(Constants::GRAPHICS_DATA_QT4_2D));
|
||||||
qgraphicsitem_cast<AbstractWorldItem *>(item)->scaleOn(m_pivot, m_factor);
|
item->scaleOn(m_pivot, m_factor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_firstRun = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TurnWorldItemsCommand::TurnWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle,
|
||||||
|
PrimitivesTreeModel *model, QUndoCommand *parent)
|
||||||
|
: QUndoCommand(parent),
|
||||||
|
m_listPaths(graphicsItemsToPaths(items, model)),
|
||||||
|
m_angle(angle),
|
||||||
|
m_model(model),
|
||||||
|
m_firstRun(true)
|
||||||
|
{
|
||||||
|
setText(QString("Turn item(s) %1").arg(m_angle));
|
||||||
|
}
|
||||||
|
|
||||||
|
TurnWorldItemsCommand::~TurnWorldItemsCommand()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void TurnWorldItemsCommand::undo()
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TurnWorldItemsCommand::redo()
|
||||||
|
{
|
||||||
|
if (!m_firstRun)
|
||||||
|
{
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_firstRun = false;
|
m_firstRun = false;
|
||||||
|
|
|
@ -172,7 +172,7 @@ private:
|
||||||
class RotateWorldItemsCommand: public QUndoCommand
|
class RotateWorldItemsCommand: public QUndoCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RotateWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal &angle,
|
RotateWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle,
|
||||||
const QPointF &pivot, PrimitivesTreeModel *model, QUndoCommand *parent = 0);
|
const QPointF &pivot, PrimitivesTreeModel *model, QUndoCommand *parent = 0);
|
||||||
virtual ~RotateWorldItemsCommand();
|
virtual ~RotateWorldItemsCommand();
|
||||||
|
|
||||||
|
@ -210,6 +210,29 @@ private:
|
||||||
bool m_firstRun;
|
bool m_firstRun;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@class TurnWorldItemsCommand
|
||||||
|
@brief
|
||||||
|
@details
|
||||||
|
*/
|
||||||
|
class TurnWorldItemsCommand: public QUndoCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TurnWorldItemsCommand(const QList<QGraphicsItem *> &items, const qreal angle,
|
||||||
|
PrimitivesTreeModel *model, QUndoCommand *parent = 0);
|
||||||
|
virtual ~TurnWorldItemsCommand();
|
||||||
|
|
||||||
|
virtual void undo();
|
||||||
|
virtual void redo();
|
||||||
|
private:
|
||||||
|
|
||||||
|
const QList<Path> m_listPaths;
|
||||||
|
const qreal m_angle;
|
||||||
|
PrimitivesTreeModel *const m_model;
|
||||||
|
bool m_firstRun;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
} /* namespace WorldEditor */
|
} /* namespace WorldEditor */
|
||||||
|
|
||||||
#endif // WORLD_EDITOR_ACTIONS_H
|
#endif // WORLD_EDITOR_ACTIONS_H
|
||||||
|
|
|
@ -77,8 +77,8 @@ bool WorldEditorPlugin::initialize(ExtensionSystem::IPluginManager *pluginManage
|
||||||
// Reset
|
// Reset
|
||||||
m_ligoConfig.resetPrimitiveConfiguration ();
|
m_ligoConfig.resetPrimitiveConfiguration ();
|
||||||
|
|
||||||
// Load
|
// TODO: get file names! from settings
|
||||||
m_ligoConfig.readPrimitiveClass ("world_editor_primitive_configuration.xml", true);
|
m_ligoConfig.readPrimitiveClass("world_editor_primitive_configuration.xml", true);
|
||||||
|
|
||||||
|
|
||||||
addAutoReleasedObject(new WorldEditorContext(this));
|
addAutoReleasedObject(new WorldEditorContext(this));
|
||||||
|
|
|
@ -59,21 +59,21 @@ WorldEditorScene::~WorldEditorScene()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
QGraphicsItem *WorldEditorScene::addWorldItemPoint(const QPointF &point, const float angle)
|
AbstractWorldItem *WorldEditorScene::addWorldItemPoint(const QPointF &point, const float angle)
|
||||||
{
|
{
|
||||||
WorldItemPoint *item = new WorldItemPoint(point, angle);
|
WorldItemPoint *item = new WorldItemPoint(point, angle);
|
||||||
addItem(item);
|
addItem(item);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
QGraphicsItem *WorldEditorScene::addWorldItemPath(const QPolygonF &polyline)
|
AbstractWorldItem *WorldEditorScene::addWorldItemPath(const QPolygonF &polyline)
|
||||||
{
|
{
|
||||||
WorldItemPath *item = new WorldItemPath(polyline);
|
WorldItemPath *item = new WorldItemPath(polyline);
|
||||||
addItem(item);
|
addItem(item);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
QGraphicsItem *WorldEditorScene::addWorldItemZone(const QPolygonF &polygon)
|
AbstractWorldItem *WorldEditorScene::addWorldItemZone(const QPolygonF &polygon)
|
||||||
{
|
{
|
||||||
WorldItemZone *item = new WorldItemZone(polygon);
|
WorldItemZone *item = new WorldItemZone(polygon);
|
||||||
addItem(item);
|
addItem(item);
|
||||||
|
@ -167,11 +167,16 @@ void WorldEditorScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WorldEditorScene::RotateMode:
|
case WorldEditorScene::RotateMode:
|
||||||
|
m_angle = 0;
|
||||||
|
m_pivot = calcBoundingRect(m_selectedItems).center();
|
||||||
break;
|
break;
|
||||||
case WorldEditorScene::ScaleMode:
|
case WorldEditorScene::ScaleMode:
|
||||||
m_scaleFactor = QPointF(1.0, 1.0);
|
m_scaleFactor = QPointF(1.0, 1.0);
|
||||||
|
m_pivot = calcBoundingRect(m_selectedItems).center();
|
||||||
break;
|
break;
|
||||||
case WorldEditorScene::TurnMode:
|
case WorldEditorScene::TurnMode:
|
||||||
|
m_angle = 0;
|
||||||
|
m_pivot = calcBoundingRect(m_selectedItems).center();
|
||||||
break;
|
break;
|
||||||
case WorldEditorScene::RadiusMode:
|
case WorldEditorScene::RadiusMode:
|
||||||
break;
|
break;
|
||||||
|
@ -204,24 +209,21 @@ void WorldEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
|
||||||
}
|
}
|
||||||
case WorldEditorScene::RotateMode:
|
case WorldEditorScene::RotateMode:
|
||||||
{
|
{
|
||||||
QPointF pivot = calcBoundingRect(m_selectedItems).center();
|
|
||||||
|
|
||||||
// Caluculate angle between two line
|
// Caluculate angle between two line
|
||||||
QLineF firstLine(pivot, mouseEvent->lastScenePos());
|
QLineF firstLine(m_pivot, mouseEvent->lastScenePos());
|
||||||
QLineF secondLine(pivot, mouseEvent->scenePos());
|
QLineF secondLine(m_pivot, mouseEvent->scenePos());
|
||||||
qreal angle = secondLine.angleTo(firstLine);
|
qreal angle = secondLine.angleTo(firstLine);
|
||||||
|
|
||||||
|
m_angle += angle;
|
||||||
|
|
||||||
Q_FOREACH(QGraphicsItem *item, m_selectedItems)
|
Q_FOREACH(QGraphicsItem *item, m_selectedItems)
|
||||||
{
|
{
|
||||||
qgraphicsitem_cast<AbstractWorldItem *>(item)->rotateOn(pivot, angle);
|
qgraphicsitem_cast<AbstractWorldItem *>(item)->rotateOn(m_pivot, angle);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WorldEditorScene::ScaleMode:
|
case WorldEditorScene::ScaleMode:
|
||||||
{
|
{
|
||||||
// TODO: perfomance
|
|
||||||
QPointF pivot = calcBoundingRect(m_selectedItems).center();
|
|
||||||
|
|
||||||
// Calculate scale factor
|
// Calculate scale factor
|
||||||
if (offset.x() > 0)
|
if (offset.x() > 0)
|
||||||
offset.setX(1.0 + (offset.x() / 5000));
|
offset.setX(1.0 + (offset.x() / 5000));
|
||||||
|
@ -238,12 +240,26 @@ void WorldEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
|
||||||
|
|
||||||
Q_FOREACH(QGraphicsItem *item, m_selectedItems)
|
Q_FOREACH(QGraphicsItem *item, m_selectedItems)
|
||||||
{
|
{
|
||||||
qgraphicsitem_cast<AbstractWorldItem *>(item)->scaleOn(pivot, offset);
|
qgraphicsitem_cast<AbstractWorldItem *>(item)->scaleOn(m_pivot, offset);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WorldEditorScene::TurnMode:
|
case WorldEditorScene::TurnMode:
|
||||||
|
{
|
||||||
|
// Caluculate angle between two line
|
||||||
|
QLineF firstLine(m_pivot, mouseEvent->lastScenePos());
|
||||||
|
QLineF secondLine(m_pivot, mouseEvent->scenePos());
|
||||||
|
qreal angle = secondLine.angleTo(firstLine);
|
||||||
|
|
||||||
|
m_angle += angle;
|
||||||
|
|
||||||
|
Q_FOREACH(QGraphicsItem *item, m_selectedItems)
|
||||||
|
{
|
||||||
|
qgraphicsitem_cast<AbstractWorldItem *>(item)->turnOn(angle);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case WorldEditorScene::RadiusMode:
|
case WorldEditorScene::RadiusMode:
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
@ -276,30 +292,17 @@ void WorldEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
|
||||||
case WorldEditorScene::MoveMode:
|
case WorldEditorScene::MoveMode:
|
||||||
{
|
{
|
||||||
QPointF offset = mouseEvent->scenePos() - m_firstPick;
|
QPointF offset = mouseEvent->scenePos() - m_firstPick;
|
||||||
|
|
||||||
m_undoStack->push(new MoveWorldItemsCommand(m_selectedItems, offset, m_model));
|
m_undoStack->push(new MoveWorldItemsCommand(m_selectedItems, offset, m_model));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WorldEditorScene::RotateMode:
|
case WorldEditorScene::RotateMode:
|
||||||
{
|
m_undoStack->push(new RotateWorldItemsCommand(m_selectedItems, m_angle, m_pivot, m_model));
|
||||||
QPointF pivot = calcBoundingRect(m_selectedItems).center();
|
|
||||||
|
|
||||||
// Caluculate angle between two line
|
|
||||||
QLineF firstLine(pivot, m_firstPick);
|
|
||||||
QLineF secondLine(pivot, mouseEvent->scenePos());
|
|
||||||
qreal angle = secondLine.angleTo(firstLine);
|
|
||||||
|
|
||||||
m_undoStack->push(new RotateWorldItemsCommand(m_selectedItems, angle, pivot, m_model));
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case WorldEditorScene::ScaleMode:
|
case WorldEditorScene::ScaleMode:
|
||||||
{
|
m_undoStack->push(new ScaleWorldItemsCommand(m_selectedItems, m_scaleFactor, m_pivot, m_model));
|
||||||
QPointF pivot = calcBoundingRect(m_selectedItems).center();
|
|
||||||
m_undoStack->push(new ScaleWorldItemsCommand(m_selectedItems, m_scaleFactor, pivot, m_model));
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case WorldEditorScene::TurnMode:
|
case WorldEditorScene::TurnMode:
|
||||||
|
m_undoStack->push(new TurnWorldItemsCommand(m_selectedItems, m_angle, m_model));
|
||||||
break;
|
break;
|
||||||
case WorldEditorScene::RadiusMode:
|
case WorldEditorScene::RadiusMode:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
namespace WorldEditor
|
namespace WorldEditor
|
||||||
{
|
{
|
||||||
class PrimitivesTreeModel;
|
class PrimitivesTreeModel;
|
||||||
|
class AbstractWorldItem;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@class WorldEditorScene
|
@class WorldEditorScene
|
||||||
|
@ -55,9 +56,9 @@ public:
|
||||||
QUndoStack *undoStack, QObject *parent = 0);
|
QUndoStack *undoStack, QObject *parent = 0);
|
||||||
virtual ~WorldEditorScene();
|
virtual ~WorldEditorScene();
|
||||||
|
|
||||||
QGraphicsItem *addWorldItemPoint(const QPointF &point, const float angle);
|
AbstractWorldItem *addWorldItemPoint(const QPointF &point, const float angle);
|
||||||
QGraphicsItem *addWorldItemPath(const QPolygonF &polyline);
|
AbstractWorldItem *addWorldItemPath(const QPolygonF &polyline);
|
||||||
QGraphicsItem *addWorldItemZone(const QPolygonF &polygon);
|
AbstractWorldItem *addWorldItemZone(const QPolygonF &polygon);
|
||||||
|
|
||||||
void removeWorldItem(QGraphicsItem *item);
|
void removeWorldItem(QGraphicsItem *item);
|
||||||
|
|
||||||
|
@ -87,9 +88,9 @@ private:
|
||||||
QPen m_pen1, m_pen2;
|
QPen m_pen1, m_pen2;
|
||||||
QBrush m_brush1, m_brush2;
|
QBrush m_brush1, m_brush2;
|
||||||
|
|
||||||
QPointF m_firstPick, m_scaleFactor;
|
QPointF m_firstPick, m_scaleFactor, m_pivot;
|
||||||
QRectF m_selectionArea;
|
QRectF m_selectionArea;
|
||||||
qreal m_firstPickX, m_firstPickY;
|
qreal m_firstPickX, m_firstPickY, m_angle;
|
||||||
QList<QGraphicsItem *> m_selectedItems;
|
QList<QGraphicsItem *> m_selectedItems;
|
||||||
bool m_editedSelectedItems, m_firstSelection;
|
bool m_editedSelectedItems, m_firstSelection;
|
||||||
uint m_lastPickedPrimitive;
|
uint m_lastPickedPrimitive;
|
||||||
|
|
|
@ -322,9 +322,9 @@ int AbstractWorldItem::type() const
|
||||||
return Type;
|
return Type;
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldItemPoint::WorldItemPoint(const QPointF &point, const float angle, QGraphicsItem *parent)
|
WorldItemPoint::WorldItemPoint(const QPointF &point, const qreal angle, QGraphicsItem *parent)
|
||||||
: AbstractWorldItem(parent),
|
: AbstractWorldItem(parent),
|
||||||
m_angle(angle)
|
m_angle((2 * NLMISC::Pi - angle) * 180 / NLMISC::Pi)
|
||||||
{
|
{
|
||||||
setZValue(WORLD_POINT_LAYER);
|
setZValue(WORLD_POINT_LAYER);
|
||||||
|
|
||||||
|
@ -343,7 +343,7 @@ WorldItemPoint::WorldItemPoint(const QPointF &point, const float angle, QGraphic
|
||||||
m_brush.setColor(QColor(255, 100, 10));
|
m_brush.setColor(QColor(255, 100, 10));
|
||||||
m_brush.setStyle(Qt::SolidPattern);
|
m_brush.setStyle(Qt::SolidPattern);
|
||||||
|
|
||||||
m_selectedBrush.setColor(QColor(0, 255, 0));
|
m_selectedBrush.setColor(Qt::NoPen);
|
||||||
m_selectedBrush.setStyle(Qt::SolidPattern);
|
m_selectedBrush.setStyle(Qt::SolidPattern);
|
||||||
|
|
||||||
//setFlag(ItemIsSelectable);
|
//setFlag(ItemIsSelectable);
|
||||||
|
@ -396,14 +396,21 @@ void WorldItemPoint::scaleOn(const QPointF &pivot, const QPointF &factor)
|
||||||
setPos(scaledPolygon.boundingRect().center());
|
setPos(scaledPolygon.boundingRect().center());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldItemPoint::turnOn(const QPointF &offset)
|
void WorldItemPoint::turnOn(const qreal angle)
|
||||||
{
|
{
|
||||||
|
m_angle += angle;
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldItemPoint::radiusOn(const qreal radius)
|
void WorldItemPoint::radiusOn(const qreal radius)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldItemPoint::setColor(const QColor &color)
|
||||||
|
{
|
||||||
|
m_brush.setColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
QPainterPath WorldItemPoint::shape() const
|
QPainterPath WorldItemPoint::shape() const
|
||||||
{
|
{
|
||||||
QPainterPath path;
|
QPainterPath path;
|
||||||
|
@ -435,6 +442,14 @@ void WorldItemPoint::paint(QPainter *painter, const QStyleOptionGraphicsItem *op
|
||||||
}
|
}
|
||||||
|
|
||||||
painter->drawRect(m_rect);
|
painter->drawRect(m_rect);
|
||||||
|
|
||||||
|
painter->setPen(Qt::red);
|
||||||
|
|
||||||
|
painter->rotate(m_angle);
|
||||||
|
|
||||||
|
painter->drawLine(0, 0, SIZE_ARROW, 0);
|
||||||
|
painter->drawLine(SIZE_ARROW - 2, -2, SIZE_ARROW, 0);
|
||||||
|
painter->drawLine(SIZE_ARROW - 2, 2, SIZE_ARROW, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant WorldItemPoint::itemChange(GraphicsItemChange change, const QVariant &value)
|
QVariant WorldItemPoint::itemChange(GraphicsItemChange change, const QVariant &value)
|
||||||
|
@ -453,10 +468,10 @@ WorldItemPath::WorldItemPath(const QPolygonF &polygon, QGraphicsItem *parent)
|
||||||
|
|
||||||
setZValue(WORLD_PATH_LAYER);
|
setZValue(WORLD_PATH_LAYER);
|
||||||
|
|
||||||
m_pen.setColor(QColor(0, 0, 0));
|
m_pen.setColor(Qt::black);
|
||||||
m_pen.setWidth(5);
|
m_pen.setWidth(5);
|
||||||
|
|
||||||
m_selectedPen.setColor(QColor(255, 0, 0));
|
m_selectedPen.setColor(Qt::white);
|
||||||
m_selectedPen.setWidth(5);
|
m_selectedPen.setWidth(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,7 +514,7 @@ void WorldItemPath::scaleOn(const QPointF &pivot, const QPointF &factor)
|
||||||
m_polygon.translate(pivot);
|
m_polygon.translate(pivot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldItemPath::turnOn(const QPointF &offset)
|
void WorldItemPath::turnOn(const qreal angle)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,6 +522,11 @@ void WorldItemPath::radiusOn(const qreal radius)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldItemPath::setColor(const QColor &color)
|
||||||
|
{
|
||||||
|
m_pen.setColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
QPainterPath WorldItemPath::shape() const
|
QPainterPath WorldItemPath::shape() const
|
||||||
{
|
{
|
||||||
QPainterPath path;
|
QPainterPath path;
|
||||||
|
@ -555,13 +575,13 @@ WorldItemZone::WorldItemZone(const QPolygonF &polygon, QGraphicsItem *parent)
|
||||||
m_pen.setColor(QColor(20, 100, 255));
|
m_pen.setColor(QColor(20, 100, 255));
|
||||||
m_pen.setWidth(0);
|
m_pen.setWidth(0);
|
||||||
|
|
||||||
m_selectedPen.setColor(QColor(255, 0, 0));
|
m_selectedPen.setColor(Qt::white);
|
||||||
m_selectedPen.setWidth(0);
|
m_selectedPen.setWidth(0);
|
||||||
|
|
||||||
m_brush.setColor(QColor(20, 100, 255, 28));
|
m_brush.setColor(QColor(20, 100, 255, TRANSPARENCY));
|
||||||
m_brush.setStyle(Qt::SolidPattern);
|
m_brush.setStyle(Qt::SolidPattern);
|
||||||
|
|
||||||
m_selectedBrush.setColor(QColor(255, 0, 0, 128));
|
m_selectedBrush.setColor(QColor(255, 255, 255, 100));
|
||||||
m_selectedBrush.setStyle(Qt::SolidPattern);
|
m_selectedBrush.setStyle(Qt::SolidPattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -604,7 +624,7 @@ void WorldItemZone::scaleOn(const QPointF &pivot, const QPointF &factor)
|
||||||
m_polygon.translate(pivot);
|
m_polygon.translate(pivot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldItemZone::turnOn(const QPointF &offset)
|
void WorldItemZone::turnOn(const qreal angle)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -612,6 +632,16 @@ void WorldItemZone::radiusOn(const qreal radius)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldItemZone::setColor(const QColor &color)
|
||||||
|
{
|
||||||
|
m_pen.setColor(color);
|
||||||
|
|
||||||
|
QColor brushColor(color);
|
||||||
|
brushColor.setAlpha(TRANSPARENCY);
|
||||||
|
|
||||||
|
m_brush.setColor(brushColor);
|
||||||
|
}
|
||||||
|
|
||||||
QRectF WorldItemZone::boundingRect() const
|
QRectF WorldItemZone::boundingRect() const
|
||||||
{
|
{
|
||||||
return m_polygon.boundingRect();
|
return m_polygon.boundingRect();
|
||||||
|
|
|
@ -45,6 +45,7 @@ const int WORLD_PATH_LAYER = 200;
|
||||||
const int MIDDLE_POINT_LAYER = 201;
|
const int MIDDLE_POINT_LAYER = 201;
|
||||||
const int EDGE_POINT_LAYER = 201;
|
const int EDGE_POINT_LAYER = 201;
|
||||||
|
|
||||||
|
const int SIZE_ARROW = 20;
|
||||||
/*
|
/*
|
||||||
// Deprecated
|
// Deprecated
|
||||||
class GraphicsItemNode: public QGraphicsObject
|
class GraphicsItemNode: public QGraphicsObject
|
||||||
|
@ -132,9 +133,11 @@ public:
|
||||||
virtual void rotateOn(const QPointF &pivot, const qreal deltaAngle) = 0;
|
virtual void rotateOn(const QPointF &pivot, const qreal deltaAngle) = 0;
|
||||||
// TODO: add modes: IgnoreAspectRatio, KeepAspectRatio
|
// TODO: add modes: IgnoreAspectRatio, KeepAspectRatio
|
||||||
virtual void scaleOn(const QPointF &pivot, const QPointF &factor) = 0;
|
virtual void scaleOn(const QPointF &pivot, const QPointF &factor) = 0;
|
||||||
virtual void turnOn(const QPointF &offset) = 0;
|
virtual void turnOn(const qreal angle) = 0;
|
||||||
virtual void radiusOn(const qreal radius) = 0;
|
virtual void radiusOn(const qreal radius) = 0;
|
||||||
|
|
||||||
|
virtual void setColor(const QColor &color) = 0;
|
||||||
|
|
||||||
// Enable the use of qgraphicsitem_cast with this item.
|
// Enable the use of qgraphicsitem_cast with this item.
|
||||||
int type() const;
|
int type() const;
|
||||||
};
|
};
|
||||||
|
@ -147,15 +150,17 @@ public:
|
||||||
class WorldItemPoint: public AbstractWorldItem
|
class WorldItemPoint: public AbstractWorldItem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WorldItemPoint(const QPointF &point, const float angle, QGraphicsItem *parent = 0);
|
WorldItemPoint(const QPointF &point, const qreal angle, QGraphicsItem *parent = 0);
|
||||||
virtual ~WorldItemPoint();
|
virtual ~WorldItemPoint();
|
||||||
|
|
||||||
virtual void moveOn(const QPointF &offset);
|
virtual void moveOn(const QPointF &offset);
|
||||||
virtual void rotateOn(const QPointF &pivot, const qreal deltaAngle);
|
virtual void rotateOn(const QPointF &pivot, const qreal deltaAngle);
|
||||||
virtual void scaleOn(const QPointF &pivot, const QPointF &factor);
|
virtual void scaleOn(const QPointF &pivot, const QPointF &factor);
|
||||||
virtual void turnOn(const QPointF &offset);
|
virtual void turnOn(const qreal angle);
|
||||||
virtual void radiusOn(const qreal radius);
|
virtual void radiusOn(const qreal radius);
|
||||||
|
|
||||||
|
virtual void setColor(const QColor &color);
|
||||||
|
|
||||||
virtual QRectF boundingRect() const;
|
virtual QRectF boundingRect() const;
|
||||||
virtual QPainterPath shape() const;
|
virtual QPainterPath shape() const;
|
||||||
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
|
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
|
||||||
|
@ -166,13 +171,13 @@ protected:
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
static const int SIZE_POINT = 7;
|
static const int SIZE_POINT = 4;
|
||||||
|
|
||||||
QPen m_pen, m_selectedPen;
|
QPen m_pen, m_selectedPen;
|
||||||
QBrush m_brush, m_selectedBrush;
|
QBrush m_brush, m_selectedBrush;
|
||||||
|
|
||||||
QRectF m_rect;
|
QRectF m_rect;
|
||||||
float m_angle;
|
qreal m_angle;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -189,9 +194,11 @@ public:
|
||||||
virtual void moveOn(const QPointF &offset);
|
virtual void moveOn(const QPointF &offset);
|
||||||
virtual void rotateOn(const QPointF &pivot, const qreal deltaAngle);
|
virtual void rotateOn(const QPointF &pivot, const qreal deltaAngle);
|
||||||
virtual void scaleOn(const QPointF &pivot, const QPointF &factor);
|
virtual void scaleOn(const QPointF &pivot, const QPointF &factor);
|
||||||
virtual void turnOn(const QPointF &offset);
|
virtual void turnOn(const qreal angle);
|
||||||
virtual void radiusOn(const qreal radius);
|
virtual void radiusOn(const qreal radius);
|
||||||
|
|
||||||
|
virtual void setColor(const QColor &color);
|
||||||
|
|
||||||
virtual QRectF boundingRect() const;
|
virtual QRectF boundingRect() const;
|
||||||
virtual QPainterPath shape() const;
|
virtual QPainterPath shape() const;
|
||||||
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
|
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
|
||||||
|
@ -217,9 +224,11 @@ public:
|
||||||
virtual void moveOn(const QPointF &offset);
|
virtual void moveOn(const QPointF &offset);
|
||||||
virtual void rotateOn(const QPointF &pivot, const qreal deltaAngle);
|
virtual void rotateOn(const QPointF &pivot, const qreal deltaAngle);
|
||||||
virtual void scaleOn(const QPointF &pivot, const QPointF &factor);
|
virtual void scaleOn(const QPointF &pivot, const QPointF &factor);
|
||||||
virtual void turnOn(const QPointF &offset);
|
virtual void turnOn(const qreal angle);
|
||||||
virtual void radiusOn(const qreal radius);
|
virtual void radiusOn(const qreal radius);
|
||||||
|
|
||||||
|
virtual void setColor(const QColor &color);
|
||||||
|
|
||||||
virtual QRectF boundingRect() const;
|
virtual QRectF boundingRect() const;
|
||||||
virtual QPainterPath shape() const;
|
virtual QPainterPath shape() const;
|
||||||
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
|
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
|
||||||
|
@ -227,6 +236,8 @@ public:
|
||||||
protected:
|
protected:
|
||||||
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
|
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
|
||||||
|
|
||||||
|
static const int TRANSPARENCY = 28;
|
||||||
|
|
||||||
QPen m_pen, m_selectedPen;
|
QPen m_pen, m_selectedPen;
|
||||||
QBrush m_brush, m_selectedBrush;
|
QBrush m_brush, m_selectedBrush;
|
||||||
QPolygonF m_polygon;
|
QPolygonF m_polygon;
|
||||||
|
|
|
@ -293,7 +293,7 @@
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset resource="world_editor.qrc">
|
<iconset resource="world_editor.qrc">
|
||||||
|
|
Loading…
Reference in a new issue