Changed: #1302 When selecting graphics items in scene will be selected the appropriate primitives in the primitives dialog.

This commit is contained in:
dnk-88 2011-08-16 21:18:10 +03:00
parent a24daa7c0a
commit ab239ee13a
7 changed files with 53 additions and 2 deletions

View file

@ -155,7 +155,7 @@ Path PrimitivesTreeModel::pathFromNode(Node *node)
Path path; Path path;
while(iter != 0) while(iter != 0)
{ {
path.prepend(PathItem(iter->row(), 1)); path.prepend(PathItem(iter->row(), 0));
iter = iter->parent(); iter = iter->parent();
} }
return path; return path;

View file

@ -167,6 +167,11 @@ void addNewGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *mode
QVariant graphicsData; QVariant graphicsData;
graphicsData.setValue<AbstractWorldItem *>(item); graphicsData.setValue<AbstractWorldItem *>(item);
node->setData(Constants::GRAPHICS_DATA_QT4_2D, graphicsData); node->setData(Constants::GRAPHICS_DATA_QT4_2D, graphicsData);
QVariant persistenVariant;
QPersistentModelIndex *persistentIndex = new QPersistentModelIndex(primIndex);
persistenVariant.setValue<QPersistentModelIndex *>(persistentIndex);
item->setData(Constants::NODE_PERISTENT_INDEX, persistenVariant);
} }
int count = model->rowCount(primIndex); int count = model->rowCount(primIndex);
@ -185,6 +190,8 @@ void removeGraphicsItems(const QModelIndex &primIndex, PrimitivesTreeModel *mode
QGraphicsItem *item = getGraphicsItem(node); QGraphicsItem *item = getGraphicsItem(node);
if (item != 0) if (item != 0)
scene->removeWorldItem(item); scene->removeWorldItem(item);
delete qvariant_cast<QPersistentModelIndex *>(item->data(Constants::NODE_PERISTENT_INDEX));
} }
int count = model->rowCount(primIndex); int count = model->rowCount(primIndex);
@ -358,6 +365,7 @@ LoadRootPrimitiveCommand::~LoadRootPrimitiveCommand()
void LoadRootPrimitiveCommand::undo() void LoadRootPrimitiveCommand::undo()
{ {
// Disable edit points mode
m_scene->setEnabledEditPoints(false); m_scene->setEnabledEditPoints(false);
QModelIndex index = m_model->pathToIndex(m_rootPrimIndex); QModelIndex index = m_model->pathToIndex(m_rootPrimIndex);

View file

@ -26,6 +26,7 @@
#include <QtGui/QUndoCommand> #include <QtGui/QUndoCommand>
#include <QtGui/QGraphicsScene> #include <QtGui/QGraphicsScene>
#include <QtGui/QGraphicsItem> #include <QtGui/QGraphicsItem>
#include <QPersistentModelIndex>
namespace LandscapeEditor namespace LandscapeEditor
{ {
@ -283,4 +284,7 @@ private:
} /* namespace WorldEditor */ } /* namespace WorldEditor */
// Enable the use of QVariant with this class.
Q_DECLARE_METATYPE(QPersistentModelIndex *)
#endif // WORLD_EDITOR_ACTIONS_H #endif // WORLD_EDITOR_ACTIONS_H

View file

@ -459,6 +459,9 @@ void WorldEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
m_selectedItems.push_back(item); m_selectedItems.push_back(item);
} }
Q_EMIT updateSelectedItems(m_selectedItems);
updateSelectedWorldItems(true); updateSelectedWorldItems(true);
m_selectionArea = QRectF(); m_selectionArea = QRectF();
update(); update();
@ -556,6 +559,8 @@ void WorldEditorScene::updatePickSelection(const QPointF &point)
m_selectedItems.push_back(worldItemsItems.at(m_lastPickedPrimitive)); m_selectedItems.push_back(worldItemsItems.at(m_lastPickedPrimitive));
updateSelectedWorldItems(true); updateSelectedWorldItems(true);
} }
Q_EMIT updateSelectedItems(m_selectedItems);
} }
void WorldEditorScene::updatePickSelectionPoints(const QPointF &point) void WorldEditorScene::updatePickSelectionPoints(const QPointF &point)

View file

@ -68,7 +68,7 @@ public:
bool isEnabledEditPoints() const; bool isEnabledEditPoints() const;
Q_SIGNALS: Q_SIGNALS:
void selectionUpdated(const QList<QGraphicsItem *> &selected, const QList<QGraphicsItem *> &deselected); void updateSelectedItems(const QList<QGraphicsItem *> &selected);
public Q_SLOTS: public Q_SLOTS:
void setEnabledEditPoints(bool enabled); void setEnabledEditPoints(bool enabled);

View file

@ -39,6 +39,7 @@
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtGui/QStatusBar> #include <QtGui/QStatusBar>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <QPersistentModelIndex>
namespace WorldEditor namespace WorldEditor
{ {
@ -108,6 +109,9 @@ WorldEditorWindow::WorldEditorWindow(QWidget *parent)
connect(m_ui.treePrimitivesView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), connect(m_ui.treePrimitivesView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(updateSelection(QItemSelection, QItemSelection))); this, SLOT(updateSelection(QItemSelection, QItemSelection)));
connect(m_worldEditorScene, SIGNAL(updateSelectedItems(QList<QGraphicsItem *>)),
this, SLOT(selectedItemsInScene(QList<QGraphicsItem *>)));
m_statusBarTimer = new QTimer(this); m_statusBarTimer = new QTimer(this);
connect(m_statusBarTimer, SIGNAL(timeout()), this, SLOT(updateStatusBar())); connect(m_statusBarTimer, SIGNAL(timeout()), this, SLOT(updateStatusBar()));
@ -295,6 +299,35 @@ void WorldEditorWindow::updateSelection(const QItemSelection &selected, const QI
m_worldEditorScene->updateSelection(itemSelected, itemDeselected); m_worldEditorScene->updateSelection(itemSelected, itemDeselected);
} }
void WorldEditorWindow::selectedItemsInScene(const QList<QGraphicsItem *> &selected)
{
QItemSelectionModel *selectionModel = m_ui.treePrimitivesView->selectionModel();
disconnect(m_ui.treePrimitivesView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(updateSelection(QItemSelection, QItemSelection)));
selectionModel->clear();
QItemSelection itemSelection;
Q_FOREACH(QGraphicsItem *item, selected)
{
QPersistentModelIndex *index = qvariant_cast<QPersistentModelIndex *>(item->data(Constants::NODE_PERISTENT_INDEX));
if (index->isValid())
{
QModelIndex modelIndex = index->operator const QModelIndex &();
QItemSelection mergeItemSelection(modelIndex, modelIndex);
itemSelection.merge(mergeItemSelection, QItemSelectionModel::Select);
}
QApplication::processEvents();
}
selectionModel->select(itemSelection, QItemSelectionModel::Select);
// TODO: update property editor
// ...
connect(m_ui.treePrimitivesView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(updateSelection(QItemSelection, QItemSelection)));
}
void WorldEditorWindow::showEvent(QShowEvent *showEvent) void WorldEditorWindow::showEvent(QShowEvent *showEvent)
{ {
QMainWindow::showEvent(showEvent); QMainWindow::showEvent(showEvent);

View file

@ -61,6 +61,7 @@ private Q_SLOTS:
void updateStatusBar(); void updateStatusBar();
void updateSelection(const QItemSelection &selected, const QItemSelection &deselected); void updateSelection(const QItemSelection &selected, const QItemSelection &deselected);
void selectedItemsInScene(const QList<QGraphicsItem *> &selected);
protected: protected:
virtual void showEvent(QShowEvent *showEvent); virtual void showEvent(QShowEvent *showEvent);