Fixed: #1302 Fixed crash program(LoadRootPrimitiveCommand and AddPrimitiveByClassCommand do not work with selection model, and edit points mode does not work with mouse panning).

This commit is contained in:
dnk-88 2011-08-16 22:30:45 +03:00
parent 8362d0b123
commit b6db3ccfc7
5 changed files with 29 additions and 14 deletions

View file

@ -135,7 +135,7 @@ void PrimitivesView::loadRootPrimitive()
Q_FOREACH(QString fileName, fileNames)
{
m_lastDir = QFileInfo(fileName).absolutePath();
m_undoStack->push(new LoadRootPrimitiveCommand(fileName, m_worldEditorScene, m_primitivesTreeModel));
m_undoStack->push(new LoadRootPrimitiveCommand(fileName, m_worldEditorScene, m_primitivesTreeModel, this));
}
if (fileNames.count() > 1)
@ -258,7 +258,7 @@ void PrimitivesView::addNewPrimitiveByClass(int value)
QString className = node->primitiveClass()->DynamicChildren[value].ClassName.c_str();
m_undoStack->push(new AddPrimitiveByClassCommand(className, m_primitivesTreeModel->pathFromIndex(indexList.first()),
m_worldEditorScene, m_primitivesTreeModel));
m_worldEditorScene, m_primitivesTreeModel, this));
}
void PrimitivesView::generatePrimitives(int value)

View file

@ -189,9 +189,10 @@ void removeGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *mode
{
QGraphicsItem *item = getGraphicsItem(node);
if (item != 0)
{
delete qvariant_cast<QPersistentModelIndex *>(item->data(Constants::NODE_PERISTENT_INDEX));
scene->removeWorldItem(item);
delete qvariant_cast<QPersistentModelIndex *>(item->data(Constants::NODE_PERISTENT_INDEX));
}
}
int count = model->rowCount(primIndex);
@ -350,11 +351,12 @@ void CreateRootPrimitiveCommand::redo()
LoadRootPrimitiveCommand::LoadRootPrimitiveCommand(const QString &fileName, WorldEditorScene *scene,
PrimitivesTreeModel *model, QUndoCommand *parent)
PrimitivesTreeModel *model, QTreeView *view, QUndoCommand *parent)
: QUndoCommand(parent),
m_fileName(fileName),
m_scene(scene),
m_model(model)
m_model(model),
m_view(view)
{
setText("Load primitive file");
}
@ -368,6 +370,8 @@ void LoadRootPrimitiveCommand::undo()
// Disable edit points mode
m_scene->setEnabledEditPoints(false);
m_view->selectionModel()->clearSelection();
QModelIndex index = m_model->pathToIndex(m_rootPrimIndex);
removeGraphicsItems(index, m_model, m_scene);
@ -409,19 +413,20 @@ void LoadRootPrimitiveCommand::redo()
}
AddPrimitiveByClassCommand::AddPrimitiveByClassCommand(const QString &className, const Path &parentIndex,
WorldEditorScene *scene, PrimitivesTreeModel *model, QUndoCommand *parent)
WorldEditorScene *scene, PrimitivesTreeModel *model, QTreeView *view, QUndoCommand *parent)
: QUndoCommand(parent),
m_className(className),
m_parentIndex(parentIndex),
m_scene(scene),
m_model(model)
m_model(model),
m_view(view)
{
setText(QString("Add %1").arg(m_className));
QGraphicsView *view = m_scene->views().first();
QGraphicsView *graphicsView = m_scene->views().first();
// TODO: returns incorrect position when zoom in
QRectF visibleArea = view->mapToScene(view->rect()).boundingRect();
QRectF visibleArea = graphicsView->mapToScene(view->rect()).boundingRect();
m_delta = visibleArea.height() / 10.0;
m_initPos = visibleArea.center();
}
@ -434,6 +439,8 @@ void AddPrimitiveByClassCommand::undo()
{
m_scene->setEnabledEditPoints(false);
m_view->selectionModel()->clearSelection();
QModelIndex index = m_model->pathToIndex(m_newPrimIndex);
PrimitiveNode *node = static_cast<PrimitiveNode *>(index.internalPointer());

View file

@ -25,6 +25,7 @@
// Qt includes
#include <QtGui/QUndoCommand>
#include <QtGui/QGraphicsScene>
#include <QtGui/QTreeView>
#include <QtGui/QGraphicsItem>
#include <QPersistentModelIndex>
@ -121,7 +122,8 @@ class LoadRootPrimitiveCommand: public QUndoCommand
{
public:
LoadRootPrimitiveCommand(const QString &fileName, WorldEditorScene *scene,
PrimitivesTreeModel *model, QUndoCommand *parent = 0);
PrimitivesTreeModel *model, QTreeView *view,
QUndoCommand *parent = 0);
virtual ~LoadRootPrimitiveCommand();
virtual void undo();
@ -132,6 +134,7 @@ private:
const QString m_fileName;
WorldEditorScene *const m_scene;
PrimitivesTreeModel *const m_model;
QTreeView *m_view;
};
/**
@ -144,7 +147,7 @@ class AddPrimitiveByClassCommand: public QUndoCommand
public:
AddPrimitiveByClassCommand(const QString &className, const Path &parentIndex,
WorldEditorScene *scene, PrimitivesTreeModel *model,
QUndoCommand *parent = 0);
QTreeView *view, QUndoCommand *parent = 0);
virtual ~AddPrimitiveByClassCommand();
virtual void undo();
@ -157,6 +160,7 @@ private:
Path m_parentIndex, m_newPrimIndex;
WorldEditorScene *m_scene;
PrimitivesTreeModel *m_model;
QTreeView *m_view;
};
/**

View file

@ -369,6 +369,9 @@ void WorldEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
void WorldEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if (mouseEvent->button() == Qt::MidButton)
return;
if (m_pointsMode)
{
if (mouseEvent->button() == Qt::LeftButton)

View file

@ -193,7 +193,8 @@ void WorldEditorWindow::loadWorldEditFile(const QString &fileName)
m_undoStack->push(new LoadLandscapeCommand(QString(worldEditList[i].second.c_str()), m_primitivesModel, m_zoneBuilderBase));
break;
case Utils::PrimitiveType:
m_undoStack->push(new LoadRootPrimitiveCommand(QString(worldEditList[i].second.c_str()), m_worldEditorScene, m_primitivesModel));
m_undoStack->push(new LoadRootPrimitiveCommand(QString(worldEditList[i].second.c_str()),
m_worldEditorScene, m_primitivesModel, m_ui.treePrimitivesView));
break;
};
}
@ -383,7 +384,7 @@ void WorldEditorWindow::readSettings()
restoreGeometry(settings->value(Constants::WORLD_WINDOW_GEOMETRY).toByteArray());
// Use OpenGL graphics system instead raster graphics system
if (settings->value(Constants::WORLD_EDITOR_USE_OPENGL, true).toBool())
if (settings->value(Constants::WORLD_EDITOR_USE_OPENGL, false).toBool())
{
m_oglWidget = new QGLWidget(QGLFormat(QGL::DoubleBuffer));
m_ui.graphicsView->setViewport(m_oglWidget);