Changed: #1301 Added max\min scale view. Improved drawing of the grid.

--HG--
branch : gsoc2011-worldeditorqt
This commit is contained in:
dnk-88 2011-06-16 09:32:49 +03:00
parent 02e34cd7f8
commit 0a870aeb12
8 changed files with 161 additions and 28 deletions

View file

@ -27,7 +27,42 @@
namespace LandscapeEditor namespace LandscapeEditor
{ {
ActionLigoTile::ActionLigoTile(const LigoData &data, ZoneBuilder *zoneBuilder, QGraphicsScene *scene, QUndoCommand *parent) OpenLandscapeCommand::OpenLandscapeCommand(const QString &fileName, QUndoCommand *parent)
: QUndoCommand(parent),
m_fileName(fileName)
{
}
OpenLandscapeCommand::~OpenLandscapeCommand()
{
}
void OpenLandscapeCommand::undo()
{
}
void OpenLandscapeCommand::redo()
{
}
NewLandscapeCommand::NewLandscapeCommand(QUndoCommand *parent)
: QUndoCommand(parent)
{
}
NewLandscapeCommand::~NewLandscapeCommand()
{
}
void NewLandscapeCommand::undo()
{
}
void NewLandscapeCommand::redo()
{
}
LigoTileCommand::LigoTileCommand(const LigoData &data, ZoneBuilder *zoneBuilder, QGraphicsScene *scene, QUndoCommand *parent)
: QUndoCommand(parent), : QUndoCommand(parent),
m_item(0), m_item(0),
m_zoneBuilder(zoneBuilder), m_zoneBuilder(zoneBuilder),
@ -36,23 +71,24 @@ ActionLigoTile::ActionLigoTile(const LigoData &data, ZoneBuilder *zoneBuilder, Q
m_ligoData = data; m_ligoData = data;
} }
ActionLigoTile::~ActionLigoTile() LigoTileCommand::~LigoTileCommand()
{ {
} }
void ActionLigoTile::undo() void LigoTileCommand::undo()
{ {
m_scene->removeItem(m_item); m_scene->removeItem(m_item);
delete m_item; delete m_item;
m_item = 0; m_item = 0;
} }
void ActionLigoTile::redo() void LigoTileCommand::redo()
{ {
QPixmap *pixmap = m_zoneBuilder->pixmapDatabase()->pixmap(QString(m_ligoData.ZoneName.c_str())); QPixmap *pixmap = m_zoneBuilder->pixmapDatabase()->pixmap(QString(m_ligoData.ZoneName.c_str()));
m_item = new QGraphicsPixmapItem(*pixmap, 0, m_scene); m_item = new QGraphicsPixmapItem(*pixmap, 0, m_scene);
m_item->setPos(m_ligoData.PosX, m_ligoData.PosY); m_item->setPos(m_ligoData.PosX, m_ligoData.PosY);
m_item->setScale(m_ligoData.Scale); m_item->setScale(m_ligoData.Scale);
m_item->setTransformationMode(Qt::SmoothTransformation);
setText(QObject::tr("Add tile(%1, %2)").arg(m_ligoData.PosX).arg(m_ligoData.PosY)); setText(QObject::tr("Add tile(%1, %2)").arg(m_ligoData.PosX).arg(m_ligoData.PosY));
} }

View file

@ -32,11 +32,33 @@ namespace LandscapeEditor
{ {
class ZoneBuilder; class ZoneBuilder;
class ActionLigoTile : public QUndoCommand class OpenLandscapeCommand: public QUndoCommand
{ {
public: public:
ActionLigoTile(const LigoData &data, ZoneBuilder *zoneBuilder, QGraphicsScene *scene, QUndoCommand *parent = 0); OpenLandscapeCommand(const QString &fileName, QUndoCommand *parent = 0);
~ActionLigoTile(); ~OpenLandscapeCommand();
virtual void undo();
virtual void redo();
private:
QString m_fileName;
};
class NewLandscapeCommand: public QUndoCommand
{
public:
NewLandscapeCommand(QUndoCommand *parent = 0);
~NewLandscapeCommand();
virtual void undo();
virtual void redo();
private:
};
class LigoTileCommand: public QUndoCommand
{
public:
LigoTileCommand(const LigoData &data, ZoneBuilder *zoneBuilder, QGraphicsScene *scene, QUndoCommand *parent = 0);
~LigoTileCommand();
virtual void undo(); virtual void undo();
virtual void redo(); virtual void redo();

View file

@ -51,13 +51,14 @@ LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent)
m_landscapeScene = new LandscapeScene(m_undoStack, m_ui.zoneListWidget, m_zoneBuilder, this); m_landscapeScene = new LandscapeScene(m_undoStack, m_ui.zoneListWidget, m_zoneBuilder, this);
m_ui.graphicsView->setScene(m_landscapeScene); m_ui.graphicsView->setScene(m_landscapeScene);
//m_ui.graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::SampleBuffers))); m_ui.graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::SampleBuffers)));
createMenus(); createMenus();
createToolBars(); createToolBars();
readSettings(); readSettings();
connect(m_ui.projectSettingsAction, SIGNAL(triggered()), this, SLOT(openProjectSettings())); connect(m_ui.projectSettingsAction, SIGNAL(triggered()), this, SLOT(openProjectSettings()));
connect(m_ui.enableGridAction, SIGNAL(toggled(bool)), m_ui.graphicsView, SLOT(setVisibleGrid(bool)));
} }
LandscapeEditorWindow::~LandscapeEditorWindow() LandscapeEditorWindow::~LandscapeEditorWindow()

View file

@ -73,6 +73,7 @@
<bool>false</bool> <bool>false</bool>
</attribute> </attribute>
<addaction name="projectSettingsAction"/> <addaction name="projectSettingsAction"/>
<addaction name="enableGridAction"/>
</widget> </widget>
<action name="projectSettingsAction"> <action name="projectSettingsAction">
<property name="icon"> <property name="icon">
@ -83,6 +84,23 @@
<string>Project settings</string> <string>Project settings</string>
</property> </property>
</action> </action>
<action name="enableGridAction">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>EnableGrid</string>
</property>
<property name="toolTip">
<string>Show/Hide Grid</string>
</property>
<property name="shortcut">
<string>Ctrl+G</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>

View file

@ -38,7 +38,6 @@ LandscapeScene::LandscapeScene(QUndoStack *undoStack, ListZonesWidget *listZones
m_zoneBuilder(zoneBuilder) m_zoneBuilder(zoneBuilder)
{ {
m_cellSize = 160; m_cellSize = 160;
createBackgroundPixmap();
} }
LandscapeScene::~LandscapeScene() LandscapeScene::~LandscapeScene()
@ -63,22 +62,10 @@ void LandscapeScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
ligoData.PosY = m_cellSize * int(y / m_cellSize); ligoData.PosY = m_cellSize * int(y / m_cellSize);
ligoData.Scale = m_cellSize / 256.0; ligoData.Scale = m_cellSize / 256.0;
ActionLigoTile *action = new ActionLigoTile(ligoData, m_zoneBuilder, this); LigoTileCommand *action = new LigoTileCommand(ligoData, m_zoneBuilder, this);
m_undoStack->push(action); m_undoStack->push(action);
QGraphicsScene::mousePressEvent(mouseEvent); QGraphicsScene::mousePressEvent(mouseEvent);
} }
void LandscapeScene::createBackgroundPixmap()
{
QPixmap pixmap(QSize(m_cellSize, m_cellSize));
QPainter painter(&pixmap);
//painter.setRenderHint(QPainter::Antialiasing, true);
painter.setBrush(QBrush(Qt::lightGray));
painter.setPen(QPen(Qt::black, 3, Qt::DotLine));
painter.drawRect(0, 0, pixmap.width(), pixmap.height());
setBackgroundBrush(pixmap);
}
} /* namespace LandscapeEditor */ } /* namespace LandscapeEditor */

View file

@ -41,10 +41,9 @@ public:
virtual ~LandscapeScene(); virtual ~LandscapeScene();
protected: protected:
void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);
private: private:
void createBackgroundPixmap();
int m_cellSize; int m_cellSize;
ListZonesWidget *m_listZonesWidget; ListZonesWidget *m_listZonesWidget;

View file

@ -33,21 +33,55 @@ namespace LandscapeEditor
LandscapeView::LandscapeView(QWidget *parent) LandscapeView::LandscapeView(QWidget *parent)
: QGraphicsView(parent), : QGraphicsView(parent),
m_visibleGrid(true),
m_moveMouse(false) m_moveMouse(false)
{ {
setDragMode(ScrollHandDrag); setDragMode(ScrollHandDrag);
setTransformationAnchor(AnchorUnderMouse); setTransformationAnchor(AnchorUnderMouse);
setBackgroundBrush(QBrush(Qt::lightGray));
//setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
//setRenderHints(QPainter::Antialiasing);
m_cellSize = 160;
m_numSteps = 0;
m_maxSteps = 20;
} }
LandscapeView::~LandscapeView() LandscapeView::~LandscapeView()
{ {
} }
bool LandscapeView::isVisibleGrid() const
{
return m_visibleGrid;
}
void LandscapeView::setVisibleGrid(bool visible)
{
m_visibleGrid = visible;
// hack for repaint view
translate(0.0001, 0.0001);
}
void LandscapeView::wheelEvent(QWheelEvent *event) void LandscapeView::wheelEvent(QWheelEvent *event)
{ {
double numDegrees = event->delta() / 8.0; double numDegrees = event->delta() / 8.0;
double numSteps = numDegrees / 15.0; double numSteps = numDegrees / 15.0;
double factor = std::pow(1.125, numSteps); double factor = std::pow(1.125, numSteps);
if (factor > 1.0)
{
// check max scale view
if (m_numSteps > m_maxSteps)
return;
++m_numSteps;
}
else
{
// check min scale view
if (m_numSteps < -m_maxSteps)
return;
--m_numSteps;
}
scale(factor, factor); scale(factor, factor);
} }
@ -74,4 +108,31 @@ void LandscapeView::mouseReleaseEvent(QMouseEvent *event)
QGraphicsView::mouseReleaseEvent(event); QGraphicsView::mouseReleaseEvent(event);
} }
void LandscapeView::drawForeground(QPainter *painter, const QRectF &rect)
{
if (!m_visibleGrid)
return;
qreal scaleFactor = transform().m11();
painter->setPen(QPen(Qt::white, 1 / scaleFactor, Qt::SolidLine));
// draw grid
qreal left = m_cellSize * int(rect.left() / m_cellSize);
qreal top = m_cellSize * int(rect.top() / m_cellSize);
// draw vertical lines
while (left < rect.right())
{
painter->drawLine(int(left), int(rect.bottom()), int(left), int(rect.top()));
left += m_cellSize;
}
// draw horizontal lines
while (top < rect.bottom())
{
painter->drawLine(int(rect.left()), int(top), int(rect.right()), int(top));
top += m_cellSize;
}
}
} /* namespace LandscapeEditor */ } /* namespace LandscapeEditor */

View file

@ -19,6 +19,7 @@
#define LANDSCAPE_VIEW_H #define LANDSCAPE_VIEW_H
// Project includes // Project includes
#include "landscape_editor_global.h"
// Qt includes // Qt includes
#include <QtGui/QGraphicsView> #include <QtGui/QGraphicsView>
@ -27,24 +28,32 @@
namespace LandscapeEditor namespace LandscapeEditor
{ {
class LandscapeView: public QGraphicsView class LANDSCAPE_EDITOR_EXPORT LandscapeView: public QGraphicsView
{ {
Q_OBJECT Q_OBJECT
public: public:
LandscapeView(QWidget *parent = 0); LandscapeView(QWidget *parent = 0);
~LandscapeView(); virtual ~LandscapeView();
bool isVisibleGrid() const;
public Q_SLOTS:
void setVisibleGrid(bool visible);
private Q_SLOTS:
protected: protected:
virtual void wheelEvent(QWheelEvent *event); virtual void wheelEvent(QWheelEvent *event);
virtual void mousePressEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void drawForeground(QPainter *painter, const QRectF &rect);
private Q_SLOTS:
private: private:
bool m_visibleGrid;
int m_numSteps, m_maxSteps;
int m_cellSize;
bool m_moveMouse; bool m_moveMouse;
}; /* class LandscapeView */ }; /* class LandscapeView */