diff --git a/GUI/coregui/Models/ItemFactory.cpp b/GUI/coregui/Models/ItemFactory.cpp index 7ac30d1e84a57b846c119c5ef786dc11acd09b41..1d889a534202b20d7b36ee891ea0842e95112389 100644 --- a/GUI/coregui/Models/ItemFactory.cpp +++ b/GUI/coregui/Models/ItemFactory.cpp @@ -48,3 +48,9 @@ ParameterizedItem *ItemFactory::createEmptyItem() { return new ParameterizedItem(); } + + +bool ItemFactory::isValidName(const QString &name) +{ + return m_all_item_names.contains(name); +} diff --git a/GUI/coregui/Models/ItemFactory.h b/GUI/coregui/Models/ItemFactory.h index c51d0ca45ff38efa2449b91ac65d78bd8471a270..5aad2387c7e7335507db5bc21558d9581aefc23b 100644 --- a/GUI/coregui/Models/ItemFactory.h +++ b/GUI/coregui/Models/ItemFactory.h @@ -33,6 +33,9 @@ public: return m_all_item_names; } + //! returns true if item with given name can be created + static bool isValidName(const QString &name); + private: static QList<QString> m_all_item_names; ItemFactory() {} diff --git a/GUI/coregui/Models/MultiLayerItem.cpp b/GUI/coregui/Models/MultiLayerItem.cpp index a4dad561d2fcc6034a64422c7ca7f9774d46262c..8ffe76200ac66452df9fb4dfb7166d05659634fb 100644 --- a/GUI/coregui/Models/MultiLayerItem.cpp +++ b/GUI/coregui/Models/MultiLayerItem.cpp @@ -21,6 +21,7 @@ MultiLayerItem::MultiLayerItem(ParameterizedItem *parent) { setProperty("Cross Correlation Length", 0.0); m_valid_children.append(QString("Layer")); + m_valid_children.append(QString("MultiLayer")); } MultiLayerItem::~MultiLayerItem() diff --git a/GUI/coregui/Models/SessionModel.cpp b/GUI/coregui/Models/SessionModel.cpp index 8d1d99fec939a493430600b731e1f60f759edb4b..8efdde8da724aea1823bf4e61fdeaff4513447eb 100644 --- a/GUI/coregui/Models/SessionModel.cpp +++ b/GUI/coregui/Models/SessionModel.cpp @@ -355,6 +355,7 @@ ParameterizedItem *SessionModel::insertNewItem(QString model_type, return 0; } ParameterizedItem *new_item = ItemFactory::createItem(model_type); + Q_ASSERT(new_item); parent->insertChildItem(row, new_item); return new_item; } @@ -467,3 +468,36 @@ void SessionModel::writeProperty(QXmlStreamWriter *writer, writer->writeEndElement(); // end ParameterTag } } + + + +void SessionModel::moveParameterizedItem(ParameterizedItem *item, ParameterizedItem *new_parent, int row) +{ + qDebug() << ""; + qDebug() << ""; + qDebug() << "SessionModel::moveParameterizedItem() " << item << new_parent << row; + + if(!new_parent) new_parent = m_root_item; + + if(item->parent() == new_parent && indexOfItem(item).row() == row) { + qDebug() << "SessionModel::moveParameterizedItem() -> no need to move, same parent, same raw. "; + return; + } + + QByteArray xml_data; + QXmlStreamWriter writer(&xml_data); + writeItemAndChildItems(&writer, item); + + QXmlStreamReader reader(xml_data); + if (row == -1) row = new_parent->childItemCount(); + + qDebug() << " >>> Beginning to insert indexOfItem(new_parent)" << indexOfItem(new_parent); + beginInsertRows(indexOfItem(new_parent), row, row); + readItems(&reader, new_parent, row); + endInsertRows(); + + qDebug() << " >>> Now deleting indexOfItem(item).row()" << indexOfItem(item).row(); + + removeRows(indexOfItem(item).row(), 1, indexOfItem(item->parent())); + +} diff --git a/GUI/coregui/Models/SessionModel.h b/GUI/coregui/Models/SessionModel.h index cc9def184269d052b280d1babfc4fb7a94b4fb0f..a0e511c1721a68bb01f35a4ae3916ce0110ebfd3 100644 --- a/GUI/coregui/Models/SessionModel.h +++ b/GUI/coregui/Models/SessionModel.h @@ -96,6 +96,8 @@ public: void writeTo(QXmlStreamWriter *writer); + void moveParameterizedItem(ParameterizedItem *item, ParameterizedItem *new_parent = 0, int row = -1); + private: ParameterizedItem *insertNewItem(QString model_type, ParameterizedItem *parent, diff --git a/GUI/coregui/Views/Components/SampleDesigner/ConnectableView.cpp b/GUI/coregui/Views/Components/SampleDesigner/ConnectableView.cpp index caa521cb2732a0d0249c92a39201de771bfbed1f..3b0d6fe13e7060b87e7182980e5e070175ed49b1 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/ConnectableView.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/ConnectableView.cpp @@ -136,9 +136,16 @@ QList<QGraphicsItem *> ConnectableView::connectInputPort(ConnectableView *other) foreach(QGraphicsItem *item, childItems()) { NodeEditorPort *port = dynamic_cast<NodeEditorPort *>(item); if (port && port->isInput() && !port->isConnected()) { +// if (port && port->isInput()) { + + foreach(QGraphicsItem *other_item, other->childItems()) { NodeEditorPort *other_port= dynamic_cast<NodeEditorPort *>(other_item); if(other_port && port->getPortType() == other_port->getPortType()) { + +// // deleting old connection +// if(port->isConnected()) port->deleteAllConnections(); + NodeEditorConnection *conn = new NodeEditorConnection(0, scene()); conn->setPort2(port); conn->setPort1(other_port); diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.cpp b/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.cpp index 7f82721ffd55388ede4d10c56766f959b2aaa7f1..ede0a40a0636607f4de2b692a0bc9c061599c858 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.cpp @@ -142,3 +142,21 @@ int DesignerHelper::nanometerToScreen(double nanometer) return result; } + +QRectF DesignerHelper::getDefaultBoundingRect(const QString &name) +{ + if (name==QString("MultiLayer")) { + return QRect(0, 0, getDefaultMultiLayerWidth(), getDefaultMultiLayerHeight()); + + } else if (name==QString("Layer")) { + return QRect(0, 0, getDefaultLayerWidth(), getDefaultLayerHeight()); + + } else if (name==QString("ParticleLayout")) { + return QRect(0, 0, getDefaultDecorationWidth(), getDefaultDecorationHeight()); + + } else { + return QRect(); + } + +} + diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.h b/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.h index d156419524b9e93ce96478a1cba596dca85c32b5..28d178d9ac1592b3e3ed48fd092d9a1001e362d4 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.h +++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerHelper.h @@ -72,7 +72,10 @@ public: //! to have reasonable graphics representation of layer in the form of QRect static int nanometerToScreen(double nanometer); - private: + //! returns default bounding rectangle for given SampleView name + static QRectF getDefaultBoundingRect(const QString &name); + +private: static int m_default_layer_height; static int m_default_layer_width; }; diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.cpp b/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.cpp index 4ea2ff4a30cd0e35710ba8c868ac812347b09b26..a58a2b5d74edcada600785ac29588320072868e1 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.cpp @@ -4,11 +4,17 @@ #include "SampleViewFactory.h" #include "SampleViewAligner.h" #include "IView.h" +#include "LayerView.h" #include "ConnectableView.h" +#include "ItemFactory.h" #include "ParameterizedGraphicsItem.h" #include "NodeEditor.h" +#include "NodeEditorConnection.h" +#include "DesignerMimeData.h" #include <QItemSelection> #include <QDebug> +#include <QGraphicsSceneMouseEvent> +#include <QPainter> DesignerScene2::DesignerScene2(QObject *parent) @@ -22,6 +28,7 @@ DesignerScene2::DesignerScene2(QObject *parent) NodeEditor *nodeEditor = new NodeEditor(parent); nodeEditor->install(this); + connect(nodeEditor, SIGNAL(connectionIsEstablished(NodeEditorConnection*)), this, SLOT(onEstablishedConnection(NodeEditorConnection*))); connect(this, SIGNAL(selectionChanged()), this, SLOT(onSceneSelectionChanged())); @@ -36,19 +43,20 @@ void DesignerScene2::setSessionModel(SessionModel *model) if(model != m_sessionModel) { if(m_sessionModel) { - disconnect(m_sessionModel, SIGNAL(modelAboutToBeReset()), this, SLOT(resetScene())); - disconnect(m_sessionModel, SIGNAL(rowsInserted(QModelIndex, int,int)), this, SLOT(updateScene(QModelIndex, int,int))); - disconnect(m_sessionModel, SIGNAL(rowsRemoved(QModelIndex, int,int)), this, SLOT(updateScene(QModelIndex, int,int))); - disconnect(m_sessionModel, SIGNAL(modelReset()), this, SLOT(updateScene())); + // TODO disconnect all } m_sessionModel = model; connect(m_sessionModel, SIGNAL(modelAboutToBeReset()), this, SLOT(resetScene())); - connect(m_sessionModel, SIGNAL(rowsInserted(QModelIndex, int,int)), this, SLOT(updateScene(QModelIndex, int,int))); - connect(m_sessionModel, SIGNAL(rowsRemoved(QModelIndex, int,int)), this, SLOT(updateScene(QModelIndex, int,int))); - connect(m_sessionModel, SIGNAL(modelReset()), this, SLOT(updateScene())); + + connect(m_sessionModel, SIGNAL(rowsInserted(QModelIndex, int,int)), this, SLOT(onRowsInserted(QModelIndex, int,int))); connect(m_sessionModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int,int)), this, SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int))); + connect(m_sessionModel, SIGNAL(rowsRemoved(QModelIndex, int,int)), this, SLOT(onRowsRemoved(QModelIndex, int,int))); + + + connect(m_sessionModel, SIGNAL(modelReset()), this, SLOT(updateScene())); + resetScene(); updateScene(); @@ -88,24 +96,33 @@ void DesignerScene2::resetScene() } -void DesignerScene2::updateScene(const QModelIndex &parent, int first, int last) +void DesignerScene2::updateScene() +{ + qDebug() << "DesignerScene2::updateScene()"; + m_orderedViews.clear(); + updateViews(); + alignViews(); + +} + + +void DesignerScene2::onRowsInserted(const QModelIndex &parent, int first, int last) { Q_UNUSED(parent); Q_UNUSED(first); Q_UNUSED(last); - - qDebug() << "DesignerScene2::updateScene(const QModelIndex &parent, int first, int lastB)"; + qDebug() << "DesignerScene2::onRowsInserted()" << parent; updateScene(); } -void DesignerScene2::updateScene() +void DesignerScene2::onRowsRemoved(const QModelIndex &parent, int first, int last) { - qDebug() << "DesignerScene2::updateScene()"; - m_orderedViews.clear(); - updateViews(); - alignViews(); - + Q_UNUSED(parent); + Q_UNUSED(first); + Q_UNUSED(last); + qDebug() << "DesignerScene2::onRowsRemoved()" << parent; + updateScene(); } @@ -115,10 +132,8 @@ void DesignerScene2::onRowsAboutToBeRemoved(const QModelIndex &parent, int first qDebug() << "DesignerScene2::onRowsAboutToBeRemoved()" << parent << first << last; for(int irow = first; irow<=last; ++irow ) { QModelIndex itemIndex = m_sessionModel->index(irow, 0, parent); - deleteViews(itemIndex); - removeItemFromScene(m_sessionModel->itemForIndex(itemIndex)); -// ParameterizedItem *item = m_sessionModel->itemForIndex(itemIndex); -// removeItemFromScene(item); + deleteViews(itemIndex); // deleting all child items + removeItemFromScene(m_sessionModel->itemForIndex(itemIndex)); // deleting parent item } m_block_selection = false; } @@ -126,12 +141,11 @@ void DesignerScene2::onRowsAboutToBeRemoved(const QModelIndex &parent, int first void DesignerScene2::onSessionSelectionChanged(const QItemSelection &selected, const QItemSelection & /* deselected */) { - qDebug() << "DesignerScene2::onSessionSelectionChanged()"; + //qDebug() << "DesignerScene2::onSessionSelectionChanged()"; QModelIndexList indices = selected.indexes(); if(indices.size()) { - ParameterizedGraphicsItem *item = static_cast<ParameterizedGraphicsItem *>( - indices.back().internalPointer()); + ParameterizedItem *item = m_sessionModel->itemForIndex(indices.back()); Q_ASSERT(item); IView *view = m_ItemToView[item]; //Q_ASSERT(view); @@ -147,11 +161,11 @@ void DesignerScene2::onSessionSelectionChanged(const QItemSelection &selected, c } + void DesignerScene2::onSceneSelectionChanged() { - qDebug() << "DesignerScene2::onSceneSelectionChanged() 1.1"; + //qDebug() << "DesignerScene2::onSceneSelectionChanged() 1.1"; if(m_block_selection) return; - qDebug() << "DesignerScene2::onSceneSelectionChanged() 1.2"; m_selectionModel->clearSelection(); @@ -159,7 +173,7 @@ void DesignerScene2::onSceneSelectionChanged() for(int i=0; i<selected.size(); ++i) { IView *view = dynamic_cast<IView *>(selected[i]); if(view) { - ParameterizedItem *sessionItem = view->getSessionItem(); + ParameterizedItem *sessionItem = view->getParameterizedItem(); QModelIndex itemIndex = m_sessionModel->indexOfItem(sessionItem); Q_ASSERT(itemIndex.isValid()); m_selectionModel->select(itemIndex, QItemSelectionModel::Select); @@ -169,13 +183,11 @@ void DesignerScene2::onSceneSelectionChanged() } - - void DesignerScene2::updateViews(const QModelIndex & parentIndex, IView *parentView) { Q_ASSERT(m_sessionModel); - qDebug() << "DesignerScene2::update()"; + qDebug() << "DesignerScene2::updateVIews()"; if(!parentIndex.isValid()) { qDebug() << "Dumping model"; @@ -189,7 +201,7 @@ void DesignerScene2::updateViews(const QModelIndex & parentIndex, IView *parentV childView = addViewForItem(item); m_orderedViews.push_back(childView); - if(parentView) parentView->addView(childView); + if(parentView) parentView->addView(childView, i_row); } else { qDebug() << "not a parameterized graphics item"; @@ -197,7 +209,6 @@ void DesignerScene2::updateViews(const QModelIndex & parentIndex, IView *parentV updateViews( itemIndex, childView); } - } @@ -212,7 +223,7 @@ IView *DesignerScene2::addViewForItem(ParameterizedItem *item) view = SampleViewFactory::createSampleView(item->modelType()); if(view) { m_ItemToView[item] = view; - view->setSessionItem(item); + view->setParameterizedItem(item); addItem(view); return view; } @@ -261,7 +272,8 @@ void DesignerScene2::removeItemFromScene(ParameterizedItem *item) IView *view = it.value(); view->setSelected(false); m_ItemToView.erase(it); - delete view; + emit view->aboutToBeDeleted(); + view->deleteLater(); update(); break; } @@ -269,4 +281,160 @@ void DesignerScene2::removeItemFromScene(ParameterizedItem *item) } +void DesignerScene2::deleteSelectedItems() +{ + qDebug() << "DesignerScene::deleteSelectedItems()" << selectedItems().size(); + // FIXME handle multiple selection + foreach(QGraphicsItem *graphicsItem, selectedItems()) { + IView *view = dynamic_cast<IView *>(graphicsItem); + if(view) { + qDebug() << "xxx"; + ParameterizedItem *item = view->getParameterizedItem(); + Q_ASSERT(item); + m_sessionModel->removeRows(m_sessionModel->indexOfItem(item).row(), 1, m_sessionModel->indexOfItem(item->parent())); + } + + + NodeEditorConnection *connection = dynamic_cast<NodeEditorConnection *>(graphicsItem); + if(connection) removeConnection(connection); + } + + +} + + + +void DesignerScene2::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + +// if(event->button()==Qt::LeftButton) { +// qDebug() << "DesignerScene2::mouseMoveEvent()"; + +// } + +// LayerView2 *layer = qgraphicsitem_cast<LayerView2 *>(mouseGrabberItem()); +// if(layer) { +// qDebug() << "DesignerScene2::mouseMoveEvent()"; +// foreach(QGraphicsItem *item, items()) { +// if(item->type() == DesignerHelper::MultiLayerType) { +// MultiLayerView2 *multilayer = qgraphicsitem_cast<MultiLayerView2 *>(item); +// if(multilayer->mapRectToScene(multilayer->boundingRect()).intersects(layerRect)) { + + + +// } + + + QGraphicsScene::mouseMoveEvent(event); +} + + +void DesignerScene2::drawForeground(QPainter* painter, const QRectF& rect) +{ + Q_UNUSED(rect); + // QRectF SceneRect = this->sceneRect(); + + LayerView *layer = qgraphicsitem_cast<LayerView *>(mouseGrabberItem()); + if(!m_layer_drop_area.isNull() && layer) { + //qDebug() << "DesignerScene2::drawForeground" << m_layer_drop_area; + painter->setPen(QPen(Qt::darkBlue, 2, Qt::DashLine)); + painter->drawLine(m_layer_drop_area.left()-10, m_layer_drop_area.center().y(), m_layer_drop_area.right()+10, m_layer_drop_area.center().y()); + //painter->drawRect(m_layer_drop_area); + invalidate(); + } + + +} + + + +void DesignerScene2::onEstablishedConnection(NodeEditorConnection *connection) +{ + qDebug() << "DesignerScene2::onEstablishedConnection()"; + IView *parentView = dynamic_cast<IView *>(connection->getInputPort()->parentItem()); + IView *childView = dynamic_cast<IView *>(connection->getOutputPort()->parentItem()); + Q_ASSERT(parentView); + Q_ASSERT(childView); + delete connection; // deleting just created connection because it will be recreated from the model + m_sessionModel->moveParameterizedItem(childView->getParameterizedItem(), parentView->getParameterizedItem()); +} + + +void DesignerScene2::removeConnection(NodeEditorConnection *connection) +{ + IView *childView = dynamic_cast<IView *>(connection->getOutputPort()->parentItem()); + m_sessionModel->moveParameterizedItem(childView->getParameterizedItem(), 0); +} + + + +void DesignerScene2::dragEnterEvent(QGraphicsSceneDragDropEvent *event) +{ + qDebug() << "DesignerScene2::dragEnterEvent()"; + return QGraphicsScene::dragEnterEvent(event); +} + +void DesignerScene2::dragMoveEvent(QGraphicsSceneDragDropEvent *event) +{ + qDebug() << "DesignerScene2::dragMoveEvent()"; + const DesignerMimeData *mimeData = checkDragEvent(event); + if(mimeData) { + // Layer can be droped only on MultiLayer + if(mimeData->getClassName() == QString("Layer")) { + QGraphicsScene::dragMoveEvent(event); + } + } +} + +//void DesignerScene2::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) +//{ +// qDebug() << "DesignerScene2::dragLeaveEvent()"; +// return QGraphicsScene::dragLeaveEvent(event); +//} + +void DesignerScene2::dropEvent(QGraphicsSceneDragDropEvent *event) +{ + const DesignerMimeData *mimeData = checkDragEvent(event); + qDebug() << "DesignerScene2::dropEvent()" << mimeData; + if (mimeData) { + // layer can be dropped on MultiLayer only + if(mimeData->getClassName() == "Layer") { + qDebug() << "DesignerScene2::dropEvent() dont want to drop" << mimeData; + QGraphicsScene::dropEvent(event); + } else { + qDebug() << "DesignerScene2::dropEvent() -> about to drop"; + if(SampleViewFactory::isValidName(mimeData->getClassName())) { + ParameterizedItem *new_item = m_sessionModel->insertNewItem(mimeData->getClassName()); + + // propagating drop coordinates to ParameterizedItem + QRectF boundingRect = DesignerHelper::getDefaultBoundingRect(mimeData->getClassName()); + new_item->setProperty("xpos", event->scenePos().x()-boundingRect.width()/2); + new_item->setProperty("ypos", event->scenePos().y()-boundingRect.height()/2); + } + } + + } + +// return QGraphicsScene::dropEvent(event); +} + + + +const DesignerMimeData *DesignerScene2::checkDragEvent(QGraphicsSceneDragDropEvent * event) +{ + //qDebug() << "DesignerScene2::checkDragEvent -> "; + const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData()); + if (!mimeData) { + event->ignore(); + return 0; + } + + if(mimeData->hasFormat("bornagain/widget") ) { + //qDebug() << "DesignerScene::checkDragEvent -> yes"; + event->setAccepted(true); + } else { + event->setAccepted(false); + } + return mimeData; +} diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.h b/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.h index 271c7c17b9440a1200a6b47da3e8eb0214dd2435..43061215f0c95a69d7a5dc30050d27290aa4aa7d 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.h +++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerScene2.h @@ -12,6 +12,8 @@ class ParameterizedGraphicsItem; class QItemSelectionModel; class IView; class QItemSelection; +class NodeEditorConnection; +class DesignerMimeData; class DesignerScene2 : public DesignerSceneInterface @@ -25,13 +27,35 @@ public: void setSessionModel(SessionModel *model); void setSelectionModel(QItemSelectionModel *model); + SessionModel *getSessionModel() { return m_sessionModel; } + public slots: void onSceneSelectionChanged(); void onSessionSelectionChanged(const QItemSelection &, const QItemSelection &); void resetScene(); void updateScene(); - void updateScene(const QModelIndex &parent, int first, int last); + + void onRowsInserted(const QModelIndex &parent, int first, int last); void onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last); + void onRowsRemoved(const QModelIndex &parent, int first, int last); + + void setLayerDropArea(const QRectF &rect) { m_layer_drop_area = rect; } + + void deleteSelectedItems(); + + void onEstablishedConnection(NodeEditorConnection *); // to process signals from NodeEditor + void removeConnection(NodeEditorConnection *); + + void dragEnterEvent(QGraphicsSceneDragDropEvent *event); + void dragMoveEvent(QGraphicsSceneDragDropEvent *event); + //void dragLeaveEvent(QGraphicsSceneDragDropEvent *event); + void dropEvent(QGraphicsSceneDragDropEvent *event); + +protected: + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + void drawForeground(QPainter* painter, const QRectF& rect); + const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event); + private: IView *addViewForItem(ParameterizedItem *item); @@ -46,6 +70,8 @@ private: QMap<ParameterizedItem *, IView *> m_ItemToView; QList<IView *> m_orderedViews; + + QRectF m_layer_drop_area; }; diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerView.cpp b/GUI/coregui/Views/Components/SampleDesigner/DesignerView.cpp index feb850c509e0eac08ce9990f9531d75d76a78bb5..6a920713bfcd463eb48080d742bea0cae7cd25b7 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/DesignerView.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerView.cpp @@ -1,5 +1,6 @@ #include "DesignerView.h" #include "DesignerMimeData.h" +#include "DesignerScene2.h" #include <QGraphicsScene> #include <QGraphicsView> #include <QVBoxLayout> @@ -84,14 +85,11 @@ void DesignerView::clearAll() } -void DesignerView::deleteItem() +void DesignerView::deleteSelectedItems() { - QList<QGraphicsItem*> selected = m_graphicsView->scene()->selectedItems(); - for(int i=0; i<selected.size(); ++i) { - m_graphicsView->scene()->removeItem(selected[i]); - delete selected[i]; - } - m_graphicsView->scene()->update(); + DesignerScene2 *designerScene = dynamic_cast<DesignerScene2 *>(m_graphicsView->scene()); + Q_ASSERT(designerScene); + designerScene->deleteSelectedItems(); } @@ -103,10 +101,10 @@ void DesignerView::keyPressEvent(QKeyEvent *event) case Qt::Key_Space: break; case Qt::Key_Delete: - deleteItem(); + deleteSelectedItems(); break; case Qt::Key_Backspace: - deleteItem(); + deleteSelectedItems(); break; default: QWidget::keyPressEvent(event); diff --git a/GUI/coregui/Views/Components/SampleDesigner/DesignerView.h b/GUI/coregui/Views/Components/SampleDesigner/DesignerView.h index c6ff997a23688ae1b5e22e703027758dc4888f67..2f4d5d5ae8addd45fb838cce02c24738469ee3ef 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/DesignerView.h +++ b/GUI/coregui/Views/Components/SampleDesigner/DesignerView.h @@ -26,9 +26,10 @@ public slots: void zoomIn(); void zoomOut(); void zoomFit(); - void deleteItem(); + void deleteSelectedItems(); void clearAll(); + protected: // void wheelEvent(QWheelEvent *event); void scaleView(qreal scaleFactor); diff --git a/GUI/coregui/Views/Components/SampleDesigner/ISampleToIView.cpp b/GUI/coregui/Views/Components/SampleDesigner/ISampleToIView.cpp index 2686e9a417a87a5095e3f1be880ad0342b00c2cc..c210f077072b14fc46ebc2aee90658ae66f7b64d 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/ISampleToIView.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/ISampleToIView.cpp @@ -85,22 +85,22 @@ void ISampleToIView::visit(const ParticleLayout *sample) } -void ISampleToIView::visit(const Layer *sample) +void ISampleToIView::visit(const Layer *) { - LayerView *layerView = new LayerView(); - layerView->setThickness(sample->getThickness()); - layerView->setName(sample->getName().c_str()); - m_multiLayer->addBottomLayer(layerView); - m_sample_to_view[sample] = layerView; +// LayerView *layerView = new LayerView(); +// layerView->setThickness(sample->getThickness()); +// layerView->setName(sample->getName().c_str()); +// m_multiLayer->addBottomLayer(layerView); +// m_sample_to_view[sample] = layerView; - const ILayout *decoration = sample->getLayout(); - if(decoration) { - decoration->accept(this); +// const ILayout *decoration = sample->getLayout(); +// if(decoration) { +// decoration->accept(this); - Q_ASSERT(m_sample_to_view[sample]); - Q_ASSERT(m_sample_to_view[decoration]); - m_connections += m_sample_to_view[sample]->connectInputPort(m_sample_to_view[decoration]); - } +// Q_ASSERT(m_sample_to_view[sample]); +// Q_ASSERT(m_sample_to_view[decoration]); +// m_connections += m_sample_to_view[sample]->connectInputPort(m_sample_to_view[decoration]); +// } } @@ -111,24 +111,24 @@ void ISampleToIView::visit(const LayerInterface *) } -void ISampleToIView::visit(const MultiLayer *sample) +void ISampleToIView::visit(const MultiLayer *) { - Q_ASSERT(sample); +// Q_ASSERT(sample); - m_multiLayer = MultiLayerView::createTopMultiLayer(); +// m_multiLayer = MultiLayerView::createTopMultiLayer(); - // goForward(); - for(size_t i_layer=0; i_layer < sample->getNumberOfLayers(); ++i_layer) { - const Layer *layer = sample->getLayer(i_layer); - layer->accept(this); - if(i_layer < sample->getNumberOfInterfaces()) { - const LayerInterface *interface = sample->getLayerInterface(i_layer); - interface->accept(this); - } - } - // goBack(); +// // goForward(); +// for(size_t i_layer=0; i_layer < sample->getNumberOfLayers(); ++i_layer) { +// const Layer *layer = sample->getLayer(i_layer); +// layer->accept(this); +// if(i_layer < sample->getNumberOfInterfaces()) { +// const LayerInterface *interface = sample->getLayerInterface(i_layer); +// interface->accept(this); +// } +// } +// // goBack(); - m_sample_to_view[sample] = m_multiLayer; +// m_sample_to_view[sample] = m_multiLayer; } diff --git a/GUI/coregui/Views/Components/SampleDesigner/IView.cpp b/GUI/coregui/Views/Components/SampleDesigner/IView.cpp index ef854bb758b3cf47339dc69cfb47913aa34d6bca..0457e2868fdf77fd2db9e6d26f97ff0cfc6bf1e1 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/IView.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/IView.cpp @@ -4,8 +4,6 @@ #include <QDebug> - - IView::IView(QGraphicsItem *parent) : QGraphicsObject(parent), m_item(0) { @@ -14,7 +12,7 @@ IView::IView(QGraphicsItem *parent) } -void IView::setSessionItem(ParameterizedItem *item) +void IView::setParameterizedItem(ParameterizedItem *item) { if(item) { m_item = item; @@ -27,9 +25,9 @@ void IView::setSessionItem(ParameterizedItem *item) } -void IView::addView(IView *childView) +void IView::addView(IView *childView, int row) { - qDebug() << "IView::addView() " << m_item->itemName() << childView->getSessionItem()->itemName(); + qDebug() << "IView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName() << " row:" << row; } diff --git a/GUI/coregui/Views/Components/SampleDesigner/IView.h b/GUI/coregui/Views/Components/SampleDesigner/IView.h index e7b8c95581ec6cb6f0ea53850639bf8e15d03d3f..aae2b5710c659415de855c6898fff74ad766f3fd 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/IView.h +++ b/GUI/coregui/Views/Components/SampleDesigner/IView.h @@ -22,11 +22,14 @@ public: int type() const { return Type; } - virtual void setSessionItem(ParameterizedItem *item); + virtual void setParameterizedItem(ParameterizedItem *item); - virtual ParameterizedItem *getSessionItem() { return m_item; } + virtual ParameterizedItem *getParameterizedItem() { return m_item; } - virtual void addView(IView *childView); + virtual void addView(IView *childView, int row = 0); + +signals: + void aboutToBeDeleted(); public slots: virtual void onChangedX(); @@ -35,7 +38,6 @@ public slots: protected: ParameterizedItem *m_item; - }; diff --git a/GUI/coregui/Views/Components/SampleDesigner/IViewToISample.cpp b/GUI/coregui/Views/Components/SampleDesigner/IViewToISample.cpp index 6e9b0a8dec1f1daa99fa8081fe0e5139782c7e73..ddf1beed327ee84c4e8fa67198f00e8a77b878f2 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/IViewToISample.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/IViewToISample.cpp @@ -65,21 +65,21 @@ void IViewToISample::visit(MultiLayerView *view) } -void IViewToISample::visit(LayerView *view) +void IViewToISample::visit(LayerView *) { - Q_ASSERT(view); - std::cout << get_indent() << "ViewVisitor(LayerView ) " << m_level << " " << view->type() << " " << view->getName().toStdString() << std::endl; - //m_views.insertMulti(m_level, view); +// Q_ASSERT(view); +// std::cout << get_indent() << "ViewVisitor(LayerView ) " << m_level << " " << view->type() << " " << view->getName().toStdString() << std::endl; +// //m_views.insertMulti(m_level, view); - QList<ConnectableView *> connections = view->getConnectedInputItems(); +// QList<ConnectableView *> connections = view->getConnectedInputItems(); - // in the absence of connections it is simple Layer - if(connections.empty()) { - m_view_to_sample[view] = view->getLayer()->clone(); +// // in the absence of connections it is simple Layer +// if(connections.empty()) { +// m_view_to_sample[view] = view->getLayer()->clone(); - // with connections it is LayerDecorator - } else { +// // with connections it is LayerDecorator +// } else { // goForward(); // foreach(ConnectableView *item, connections) { // item->accept(this); @@ -92,7 +92,7 @@ void IViewToISample::visit(LayerView *view) // } // goBack(); - } +// } } diff --git a/GUI/coregui/Views/Components/SampleDesigner/LayerView.cpp b/GUI/coregui/Views/Components/SampleDesigner/LayerView.cpp index 658163a21c014ae021f733050880e15c9c2f3783..0caf2125f191b8444f87d391bd1d0ed23407eebc 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/LayerView.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/LayerView.cpp @@ -2,27 +2,23 @@ #include "Units.h" #include "ParticleLayoutView.h" #include "ParameterizedItem.h" - +#include "MultiLayerView.h" +#include "DesignerScene2.h" +#include "SessionModel.h" +#include "GUIHelpers.h" +#include "DesignerHelper.h" #include <QPainter> -#include <QGraphicsSceneMouseEvent> -#include <QDrag> -#include <QCursor> -#include <QApplication> -#include <QMimeData> -#include <QBitmap> -#include <QWidget> -#include <QGradient> #include <QStyleOptionGraphicsItem> #include <QDebug> - -#include "DesignerHelper.h" -#include <iostream> - +#include <QGraphicsSceneMouseEvent> -LayerView2::LayerView2(QGraphicsItem *parent) +LayerView::LayerView(QGraphicsItem *parent) : ConnectableView(parent) + , m_requested_parent(0) + , m_requested_row(-1) + { setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256) ); setRectangle(QRect(0, 0, DesignerHelper::getDefaultLayerWidth(), DesignerHelper::getDefaultLayerHeight())); @@ -37,7 +33,7 @@ LayerView2::LayerView2(QGraphicsItem *parent) } -void LayerView2::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +void LayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(widget); painter->setPen(Qt::black); @@ -49,16 +45,17 @@ void LayerView2::paint(QPainter *painter, const QStyleOptionGraphicsItem *option } -void LayerView2::addView(IView *childView) +void LayerView::addView(IView *childView, int row) { - qDebug() << "LayerView2::addView() " << m_item->itemName() << childView->getSessionItem()->itemName(); + Q_UNUSED(row); + qDebug() << "LayerView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName(); ParticleLayoutView *layout = dynamic_cast<ParticleLayoutView *>(childView); Q_ASSERT(layout); connectInputPort(layout); } -void LayerView2::onPropertyChange(QString propertyName) +void LayerView::onPropertyChange(QString propertyName) { Q_ASSERT(m_item); if(propertyName == "Thickness") { @@ -71,71 +68,99 @@ void LayerView2::onPropertyChange(QString propertyName) } -// ---------------------------------------------------------------------------- +QVariant LayerView::itemChange(GraphicsItemChange change, const QVariant &value) +{ + if (change == ItemPositionChange && scene()) { + + m_requested_parent = 0; + m_requested_row = -1; + QRectF layerRect = mapRectToScene(boundingRect()); + foreach(QGraphicsItem *item, scene()->items()) { + if(item->type() == DesignerHelper::MultiLayerType) { + MultiLayerView *multilayer = qgraphicsitem_cast<MultiLayerView *>(item); + if(multilayer->mapRectToScene(multilayer->boundingRect()).intersects(layerRect)) { + //qDebug() << " XXX " << multilayer->getDropArea(multilayer->mapFromScene(layerRect.center())); + m_requested_parent = multilayer; + m_requested_row = multilayer->getDropArea(multilayer->mapFromScene(layerRect.center())); + break; + } + } + } + + if(m_requested_parent) { + DesignerScene2 *designerScene = dynamic_cast<DesignerScene2 *>(scene()); + QRectF rect = m_requested_parent->getDropAreaRectangle(m_requested_row); + designerScene->setLayerDropArea(m_requested_parent->mapRectToScene(rect)); + } + } + return QGraphicsItem::itemChange(change, value); + } -LayerView::LayerView(QGraphicsItem *parent) - : ConnectableView(parent) - , m_fixed_xpos(0) - , m_fixed(false) - , m_layer(new Layer()) -// , m_thickness(10*Units::nanometer) +void LayerView::mousePressEvent(QGraphicsSceneMouseEvent *event) { - //setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256) ); - setRectangle(QRect(0, 0, DesignerHelper::getDefaultLayerWidth(), DesignerHelper::getDefaultLayerHeight())); - setName(QString("Layer")); - setToolTip(QString("%1\n%2").arg("LayerView").arg("Homogeneous layer")); - setFlag(QGraphicsItem::ItemIsMovable, true); - setFlag(QGraphicsItem::ItemIsSelectable, true); - setFlag(QGraphicsItem::ItemSendsGeometryChanges); - setAcceptDrops(false); - - addPort(" ", NodeEditorPort::Input, NodeEditorPort::ParticleFactory); - setMaterialProperty(MaterialBrowser::getDefaultMaterialProperty()); + if(event->button() == Qt::LeftButton) { + m_drag_start_position = pos(); + } + QGraphicsItem::mousePressEvent(event); } -void LayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +void LayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { - Q_UNUSED(widget); - painter->setPen(Qt::black); - if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) { - painter->setPen(Qt::DashLine); + //qDebug() << "LayerView::mouseReleaseEvent()" << parentItem() << m_requested_parent << m_requested_row; + + DesignerScene2 *designerScene = dynamic_cast<DesignerScene2 *>(scene()); + designerScene->setLayerDropArea(QRectF()); + + // Simple move of lonely layer across the scene: let it be. + if(m_requested_parent == 0 && parentItem() == 0) { + QGraphicsItem::mouseReleaseEvent(event); + return; } - painter->setBrush(DesignerHelper::getLayerGradient(m_color, getRectangle() ) ); - painter->drawRect(getRectangle()); -} + Q_ASSERT(designerScene); + SessionModel *model = designerScene->getSessionModel(); -void LayerView::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - // remove selection from child items - QList<QGraphicsItem *> list = childItems(); - foreach(QGraphicsItem *item, list) { - item->setSelected(false); + // Layer was moved on top of MultiLayer but not in the right drop area: + // returning layer back to starting position. + if(m_requested_parent && m_requested_row == -1) { + //qDebug() << "1.1 Layer->MultiLayer, wrong drop area."; + setPos(m_drag_start_position); + QGraphicsItem::mouseReleaseEvent(event); + return; } - QGraphicsObject::mousePressEvent(event); -} + // Layer was moved to the wrong row of his own MultiLayer: returning back. + if(m_requested_parent == parentItem() && m_requested_row == model->indexOfItem(getParameterizedItem()).row()) { + //Debug() << "1.2 Layer->MultiLayer (same), same drop area"; + setPos(m_drag_start_position); + QGraphicsItem::mouseReleaseEvent(event); + return; + } -void LayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - std::cout << "LayerView::mouseReleaseEvent -> " << x() << " " << y() << std::endl; - emit LayerMoved(); - QGraphicsObject::mouseReleaseEvent(event); -// setCursor(Qt::ArrowCursor); -} + // Layer was moved from MultiLayer he belong's to, to the empty place of + // the scene: changing ownership. + if(parentItem() && !m_requested_parent) { + //qDebug() << "1.3 Layer->Scene"; + setPos( mapToScene(event->pos()) - event->pos()); + model->moveParameterizedItem(this->getParameterizedItem(), 0); + QGraphicsItem::mouseReleaseEvent(event); + return; + } + // Layer was moved either from one MultiLayer to another, or is moved inside + // one multilayer: changing ownership. + if(m_requested_parent) { + //qDebug() << "1.4 MultiLayer->MultiLayer"; + model->moveParameterizedItem(this->getParameterizedItem(), m_requested_parent->getParameterizedItem(), m_requested_row); + QGraphicsItem::mouseReleaseEvent(event); + return; + } + + // should not be here + throw GUIHelpers::Error(tr("LayerView::mouseReleaseEvent() -> Loggic error.")); +} -// layers are not allowed to move horizontally -QVariant LayerView::itemChange(GraphicsItemChange change, const QVariant &value) -{ - if (change == ItemPositionChange && scene() && m_fixed) { - QPointF newPos = value.toPointF(); - newPos.setX(m_fixed_xpos); - return newPos; - } - return QGraphicsItem::itemChange(change, value); - } diff --git a/GUI/coregui/Views/Components/SampleDesigner/LayerView.h b/GUI/coregui/Views/Components/SampleDesigner/LayerView.h index b3d7aaf3c34432f95472ebed4df640199f057d3b..580f1c06e8eb5a98df9fa8ad61b0cad500d7ca8b 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/LayerView.h +++ b/GUI/coregui/Views/Components/SampleDesigner/LayerView.h @@ -2,104 +2,41 @@ #define LAYERVIEW_H #include "ConnectableView.h" -#include "MaterialBrowser.h" -#include "Layer.h" +class MultiLayerView; - -class LayerView2 : public ConnectableView -{ - Q_OBJECT -public: - enum { Type = DesignerHelper::LayerType }; - - LayerView2(QGraphicsItem *parent = 0); - ~LayerView2() { } - - int type() const { return Type; } - - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); - - void addView(IView *childView); - -public slots: - void onPropertyChange(QString propertyName); - -}; - - - - - -//! graphics representation of Layer class LayerView : public ConnectableView { Q_OBJECT - - Q_PROPERTY(QString name READ getName WRITE setName ) - Q_PROPERTY(double thickness READ getThickness WRITE setThickness ) - Q_PROPERTY(MaterialProperty material READ getMaterialProperty WRITE setMaterialProperty ) - public: enum { Type = DesignerHelper::LayerType }; LayerView(QGraphicsItem *parent = 0); - ~LayerView() { delete m_layer; } - - //! сalls the ISampleViewVisitor's visit method - virtual void accept(IViewVisitor *visitor) { visitor->visit(this); } + ~LayerView() { } int type() const { return Type; } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); - void setFixedX() { m_fixed_xpos = x(); m_fixed=true; } - qreal getFixedX() { return m_fixed_xpos; } - double getThickness() const { return m_layer->getThickness(); } - MaterialProperty getMaterialProperty() const { return m_materialProperty; } - - void setLayer(Layer *layer) { delete m_layer; m_layer = layer; } - const Layer *getLayer() { return m_layer; } - -public slots: - void setThickness(double thickness); - void setMaterialProperty(const MaterialProperty &materialProperty); - -signals: - void LayerMoved(); + void addView(IView *childView, int row = 0); // to add ParticleLayout protected: - virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); QVariant itemChange(GraphicsItemChange change, const QVariant &value); + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); -private: - qreal m_fixed_xpos; - bool m_fixed; +public slots: + void onPropertyChange(QString propertyName); - MaterialProperty m_materialProperty; - Layer *m_layer; +private: + MultiLayerView * m_requested_parent; + //! Possible parent (MultiLayer) encountered during the movement of the Layer across the scene. + int m_requested_row; + //! possible row to drop the layer in encountered MultiLayer + QPointF m_drag_start_position; }; -inline void LayerView::setThickness(double thickness) -{ - if(thickness != m_layer->getThickness()) { - m_layer->setThickness(thickness); - m_rect.setHeight(DesignerHelper::nanometerToScreen(getThickness())); - setPortCoordinates(); - emit heightChanged(); - } -} - - -inline void LayerView::setMaterialProperty(const MaterialProperty &materialProperty) -{ - m_materialProperty = materialProperty; - setColor(materialProperty.getColor()); - update(); -} - #endif // LAYERVIEW_H diff --git a/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.cpp b/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.cpp index 88d84f24bce19eb7b405310abc9e982caa5b9bd3..04fa19c33dd535b2811e227b2eb74b58ed4a4aa9 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.cpp @@ -1,5 +1,7 @@ #include "MultiLayerView.h" #include "ParameterizedItem.h" +#include "DesignerScene2.h" +#include "SessionModel.h" #include <QPainter> #include <QGraphicsSceneMouseEvent> @@ -21,11 +23,7 @@ - - - - -MultiLayerView2::MultiLayerView2(QGraphicsItem *parent) +MultiLayerView::MultiLayerView(QGraphicsItem *parent) : ConnectableView(parent) { setColor(QColor(Qt::blue)); @@ -34,13 +32,15 @@ MultiLayerView2::MultiLayerView2(QGraphicsItem *parent) setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges); + setAcceptHoverEvents(false); setAcceptDrops(true); connect(this, SIGNAL(childrenChanged()), this, SLOT(updateHeight())); updateHeight(); } -void MultiLayerView2::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) + +void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(widget); painter->setPen(m_color); @@ -52,176 +52,83 @@ void MultiLayerView2::paint(QPainter *painter, const QStyleOptionGraphicsItem *o } -void MultiLayerView2::addView(IView *childView) +void MultiLayerView::addView(IView *childView, int row) { - qDebug() << "MultiLayerView2::addView() " << m_item->itemName() << childView->getSessionItem()->itemName(); - LayerView2 *layer = dynamic_cast<LayerView2 *>(childView); + qDebug() << "MultiLayerView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName() << "row" << row; + LayerView *layer = dynamic_cast<LayerView *>(childView); Q_ASSERT(layer); if(!childItems().contains(layer)) { - addLayer(layer, getRectangle().bottomLeft()); - qDebug() << "adding layer"; + addNewLayer(layer, row); } else { - qDebug() << "layer exists"; - + int previous_row = m_layers.indexOf(layer); + m_layers.swap(previous_row, row); + qDebug() << "layer exists, swapping" << previous_row << row; } + updateHeight(); } -void MultiLayerView2::addLayer(LayerView2 *layer, QPointF pos) +void MultiLayerView::addNewLayer(LayerView *layer, int row) { - m_rect.setHeight(m_rect.height()+layer->boundingRect().height()); - + qDebug() << "MultiLayerView::addNewLayer(), row" << row; + m_layers.insert(row, layer); int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.; - layer->setPos(xpos, pos.y()); - //connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) ); + layer->setX(xpos); connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) ); + connect(layer, SIGNAL(aboutToBeDeleted()), this, SLOT(onLayerAboutToBeDeleted()) ); layer->setParentItem(this); } -void MultiLayerView2::updateHeight() -{ - qDebug() << "MultiLayerView2::updateHeight()"; - QList<QGraphicsItem *> list = childItems(); - qSort(list.begin(), list.end(), DesignerHelper::sort_layers); - - int total_height = 0; - if( childItems().size() > 0) { - foreach(QGraphicsItem *item, list) { - item->setY(total_height); - total_height += item->boundingRect().height(); - } - } else { - total_height = DesignerHelper::getDefaultMultiLayerHeight(); - } - - m_rect.setHeight(total_height); - update(); - emit heightChanged(); -} - - - -// ----------------------------------------------------------------------------- -// ----------------------------------------------------------------------------- -// ----------------------------------------------------------------------------- - - -MultiLayerView::MultiLayerView(QGraphicsItem *parent) - : ConnectableView(parent) - , m_fixed_xpos(0) - , m_fixed(false) -{ - setColor(QColor(Qt::blue)); - setRectangle(QRect(0, 0, DesignerHelper::getDefaultMultiLayerWidth(), DesignerHelper::getDefaultMultiLayerHeight())); - setToolTip(QString("MultiLayer")); - setFlag(QGraphicsItem::ItemIsMovable, true); - setFlag(QGraphicsItem::ItemIsSelectable, true); - setFlag(QGraphicsItem::ItemSendsGeometryChanges); - setAcceptDrops(true); - - m_expected_types << QString("Layer") << QString("MultiLayer"); - allowDropType(QString("Layer")); - - connect(this, SIGNAL(childrenChanged()), this, SLOT(updateHeight())); - updateHeight(); -} - - -// create top MultiLayer, which will be the dock for all Layer's and MultiLayer's -MultiLayerView *MultiLayerView::createTopMultiLayer() -{ - MultiLayerView *result = new MultiLayerView(); - result->setColor(Qt::lightGray); - result->allowDropType(QString("MultiLayer")); - result->setToolTip(QString("LayerDock\nDrag and drop here layer or multi layer")); - result->setFlag(QGraphicsItem::ItemIsSelectable, false); - result->setPos(-result->getRectangle().width()/2, 100.0); - return result; -} - - - -// allows droping of object of given type -void MultiLayerView::allowDropType(const QString &name) { - if(m_current_types.contains(name)) { - std::cout << "MultiLayerView::allowDropType -> Info. Name '" << name.toStdString() << "' is already in the list" << std::endl; - return; - } - if(m_expected_types.contains(name)) { - m_current_types.append(name); - } else { - std::cout << "MultiLayerView::allowDropType -> Warning. Can't handle the object with name' '" << name.toStdString() << "', expected names " << std::endl; - foreach(QString s, m_expected_types) { - std::cout << s.toStdString() << std::endl; - } - } -} - - - -void MultiLayerView::addLayer(LayerView *layer, QPointF pos) +void MultiLayerView::addLayer(LayerView *layer, QPointF /* pos */) { - //std::cout << "MultiLayerView::addLayer" << std::endl; - // adjusting main rectangle othervise item->setPos will not work due to 'LayerView::itemChange' m_rect.setHeight(m_rect.height()+layer->boundingRect().height()); - int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.; - layer->setPos(xpos, pos.y()); - layer->setFixedX(); - connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) ); - connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) ); - //connect(layer, SIGNAL(update()), this, SLOT(updateHeight()) ); layer->setParentItem(this); - //emit heightChanged(); + //connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) ); + connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) ); } -void MultiLayerView::addBottomLayer(LayerView *layer) + +void MultiLayerView::onLayerAboutToBeDeleted() { - QPointF pos(0, m_rect.height()); - addLayer(layer, pos); + qDebug() << "MultiLayerView::onLayerAboutToBeDeleted()"; + LayerView *layer = qobject_cast<LayerView *>(sender()); + Q_ASSERT(layer); + removeLayer(layer); } - -void MultiLayerView::addMultiLayer(MultiLayerView *layer, QPointF pos) +void MultiLayerView::removeLayer(LayerView *layer) { - std::cout << "MultiLayerView::addMultiLayer" << std::endl; - // adjusting main rectangle othervise item->setPos will not work due to 'LayerView::itemChange' - m_rect.setHeight(m_rect.height()+layer->boundingRect().height()); - - int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.; - layer->setPos(xpos, pos.y()); - layer->setFixedX(); - connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) ); - connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) ); - //connect(layer, SIGNAL(update()), this, SLOT(updateHeight()) ); - layer->setParentItem(this); - //emit heightChanged(); + qDebug() << "MultiLayerView::removeLayer()"; + Q_ASSERT(m_layers.contains(layer)); + disconnect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) ); + m_layers.removeOne(layer); + updateHeight(); } -// adjusts positions of Layers inside MultiLayer, updates total MultiLayer height -// calculates drop areas for new layers -// called when one of Layer is changed + void MultiLayerView::updateHeight() { - //std::cout << "MultiLayerView::updateHeight() " << std::endl; + qDebug() << "MultiLayerView::updateHeight()"; + // drop areas are rectangles covering the area of layer interfaces m_drop_areas.clear(); - QList<QGraphicsItem *> list = childItems(); - qSort(list.begin(), list.end(), DesignerHelper::sort_layers); int total_height = 0; - if( childItems().size() > 0) { - foreach(QGraphicsItem *item, list) { - item->setY(total_height); - total_height += item->boundingRect().height(); - m_drop_areas.append(QRectF(0, item->y() - item->boundingRect().height()/4., boundingRect().width(), item->boundingRect().height()/2.)); + if(m_layers.size()) { + foreach(LayerView *layer, m_layers) { + int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.; + layer->setPos(xpos, total_height); + layer->update(); + total_height += layer->boundingRect().height(); + m_drop_areas.append(QRectF(0, layer->y() - layer->boundingRect().height()/4., boundingRect().width(), layer->boundingRect().height()/2.)); } - m_drop_areas.append(QRectF(0, list.back()->y() +list.back()->boundingRect().height() - list.back()->boundingRect().height()/4., boundingRect().width(), list.back()->boundingRect().height()/2.)); + m_drop_areas.append(QRectF(0, m_layers.back()->y() +m_layers.back()->boundingRect().height() - m_layers.back()->boundingRect().height()/4., boundingRect().width(), m_layers.back()->boundingRect().height()/2.)); } else { total_height = DesignerHelper::getDefaultMultiLayerHeight(); m_drop_areas.append(boundingRect()); @@ -233,6 +140,23 @@ void MultiLayerView::updateHeight() } + +//! returns index of drop area for given coordinate +int MultiLayerView::getDropArea(QPointF pos) +{ +// qDebug() << "MultiLayerView::getDropArea(QPointF pos)" << pos; + + int area(-1); + for(int i=0; i<m_drop_areas.size(); ++i) { + if( m_drop_areas.at(i).contains(pos) ) { + area = i; + break; + } + } + return area; +} + + bool MultiLayerView::isInDropArea(QPointF pos) { foreach(QRectF rect, m_drop_areas) { @@ -242,41 +166,26 @@ bool MultiLayerView::isInDropArea(QPointF pos) return false; } -bool MultiLayerView::isExpectedObject(const QString &name) -{ - if(m_current_types.contains(name)) return true; - return false; -} - - -void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +QRectF MultiLayerView::getDropAreaRectangle(int row) { - Q_UNUSED(widget); - painter->setPen(m_color); - if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) { - painter->setPen(Qt::DashLine); + if(row>=0 && row < m_drop_areas.size()) { + return m_drop_areas[row]; + } else { + return QRectF(); } - painter->setBrush(DesignerHelper::getLayerGradient(m_color, getRectangle() ) ); - painter->drawRect(getRectangle()); } -void MultiLayerView::dragEnterEvent(QGraphicsSceneDragDropEvent *event) +void MultiLayerView::dragMoveEvent(QGraphicsSceneDragDropEvent *event) { const DesignerMimeData *mimeData = checkDragEvent(event); - if (mimeData) { - std::cout << "MultiLayerView::dragEnterEvent() -> INSIDE " << std::endl; + if (!mimeData) { + QGraphicsItem::dragMoveEvent(event); } } -void MultiLayerView::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) -{ - Q_UNUSED(event); - std::cout << "MultiLayerView::dragLeaveEvent() -> " << std::endl; -} - void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event) { @@ -284,110 +193,331 @@ void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event) const DesignerMimeData *mimeData = checkDragEvent(event); if (mimeData) { -// ISampleView *layer(0); -// if(mimeData->getClassName() == QString("Layer") ) layer = new LayerView(); -// if(mimeData->getClassName() == QString("MultiLayer") ) layer = new MultiLayerView(); - - if(mimeData->getClassName() == QString("Layer") ) { - addLayer(new LayerView(), event->pos()); - update(); - } else if(mimeData->getClassName() == QString("MultiLayer") ) { - addMultiLayer(new MultiLayerView(), event->pos()); - update(); - -// if(layer){ -// std::cout << "MultiLayerView::dropEvent() -> adding layer or multilayer" << std::endl; -// addLayer(layer, event->pos()); -// update(); - } else { - std::cout << "MultiLayerView::dropEvent() -> Error. Can't create object " << mimeData->getClassName().toStdString() << std::endl; + + DesignerScene2 *designerScene = dynamic_cast<DesignerScene2 *>(scene()); + if(designerScene) { + SessionModel *sessionModel = designerScene->getSessionModel(); + + qDebug() << "\n XXX" << getDropArea(event->scenePos()) << event->scenePos(); + sessionModel->insertNewItem( + mimeData->getClassName(), + sessionModel->indexOfItem(this->getParameterizedItem()), + getDropArea(event->pos()) + ); } } } -void MultiLayerView::dragMoveEvent(QGraphicsSceneDragDropEvent *event) + +const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEvent * event) { - const DesignerMimeData *mimeData = checkDragEvent(event); - if (mimeData) { - std::cout << "MultiLayerView::dragMoveEvent() -> pos:" << event->pos().x() << " " << event->pos().y() << std::endl; - update(); + std::cout << "MultiLayerView::checkDragEvent -> " << std::endl; + const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData()); + if (!mimeData) { + event->ignore(); + return 0; + } + if(mimeData->hasFormat("bornagain/widget") + && getParameterizedItem()->acceptsAsChild(mimeData->getClassName()) + && isInDropArea(event->pos()) ) { + std::cout << "MultiLayerView::checkDragEvent -> yes" << std::endl; + event->setAccepted(true); + } else { + event->setAccepted(false); } + return mimeData; } -void MultiLayerView::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - std::cout << "MultiLayerView::mousePressEvent -> " << x() << " " << y() << std::endl; - // remove selection from child items - QList<QGraphicsItem *> list = childItems(); - foreach(QGraphicsItem *item, list) { - item->setSelected(false); - } - QGraphicsObject::mousePressEvent(event); -} +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- -void MultiLayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - std::cout << "MultiLayerView::mouseReleaseEvent -> " << x() << " " << y() << std::endl; - emit LayerMoved(); - QGraphicsObject::mouseReleaseEvent(event); -} + +//MultiLayerView::MultiLayerView(QGraphicsItem *parent) +// : ConnectableView(parent) +// , m_fixed_xpos(0) +// , m_fixed(false) +//{ +// setColor(QColor(Qt::blue)); +// setRectangle(QRect(0, 0, DesignerHelper::getDefaultMultiLayerWidth(), DesignerHelper::getDefaultMultiLayerHeight())); +// setToolTip(QString("MultiLayer")); +// setFlag(QGraphicsItem::ItemIsMovable, true); +// setFlag(QGraphicsItem::ItemIsSelectable, true); +// setFlag(QGraphicsItem::ItemSendsGeometryChanges); +// setAcceptDrops(true); + +// m_expected_types << QString("Layer") << QString("MultiLayer"); +// allowDropType(QString("Layer")); + +// connect(this, SIGNAL(childrenChanged()), this, SLOT(updateHeight())); +// updateHeight(); +//} + + +//// create top MultiLayer, which will be the dock for all Layer's and MultiLayer's +//MultiLayerView *MultiLayerView::createTopMultiLayer() +//{ +// MultiLayerView *result = new MultiLayerView(); +// result->setColor(Qt::lightGray); +// result->allowDropType(QString("MultiLayer")); +// result->setToolTip(QString("LayerDock\nDrag and drop here layer or multi layer")); +// result->setFlag(QGraphicsItem::ItemIsSelectable, false); +// result->setPos(-result->getRectangle().width()/2, 100.0); +// return result; +//} + + + +//// allows droping of object of given type +//void MultiLayerView::allowDropType(const QString &name) { +// if(m_current_types.contains(name)) { +// std::cout << "MultiLayerView::allowDropType -> Info. Name '" << name.toStdString() << "' is already in the list" << std::endl; +// return; +// } +// if(m_expected_types.contains(name)) { +// m_current_types.append(name); +// } else { +// std::cout << "MultiLayerView::allowDropType -> Warning. Can't handle the object with name' '" << name.toStdString() << "', expected names " << std::endl; +// foreach(QString s, m_expected_types) { +// std::cout << s.toStdString() << std::endl; +// } +// } +//} + + + +//void MultiLayerView::addLayer(LayerView *layer, QPointF pos) +//{ +// //std::cout << "MultiLayerView::addLayer" << std::endl; +// // adjusting main rectangle othervise item->setPos will not work due to 'LayerView::itemChange' +// m_rect.setHeight(m_rect.height()+layer->boundingRect().height()); + +// int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.; +// layer->setPos(xpos, pos.y()); +// layer->setFixedX(); +// connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) ); +// connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) ); +// //connect(layer, SIGNAL(update()), this, SLOT(updateHeight()) ); +// layer->setParentItem(this); +// //emit heightChanged(); +//} + +//void MultiLayerView::addBottomLayer(LayerView *layer) +//{ +// QPointF pos(0, m_rect.height()); +// addLayer(layer, pos); +//} + + + +//void MultiLayerView::addMultiLayer(MultiLayerView *layer, QPointF pos) +//{ +// std::cout << "MultiLayerView::addMultiLayer" << std::endl; +// // adjusting main rectangle othervise item->setPos will not work due to 'LayerView::itemChange' +// m_rect.setHeight(m_rect.height()+layer->boundingRect().height()); + +// int xpos = (DesignerHelper::getDefaultMultiLayerWidth() - layer->boundingRect().width())/2.; +// layer->setPos(xpos, pos.y()); +// layer->setFixedX(); +// connect(layer, SIGNAL(LayerMoved()), this, SLOT(updateHeight()) ); +// connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) ); +// //connect(layer, SIGNAL(update()), this, SLOT(updateHeight()) ); +// layer->setParentItem(this); +// //emit heightChanged(); +//} + + +//// adjusts positions of Layers inside MultiLayer, updates total MultiLayer height +//// calculates drop areas for new layers +//// called when one of Layer is changed +//void MultiLayerView::updateHeight() +//{ +// //std::cout << "MultiLayerView::updateHeight() " << std::endl; +// // drop areas are rectangles covering the area of layer interfaces +// m_drop_areas.clear(); + +// QList<QGraphicsItem *> list = childItems(); +// qSort(list.begin(), list.end(), DesignerHelper::sort_layers); + +// int total_height = 0; +// if( childItems().size() > 0) { +// foreach(QGraphicsItem *item, list) { +// item->setY(total_height); +// total_height += item->boundingRect().height(); +// m_drop_areas.append(QRectF(0, item->y() - item->boundingRect().height()/4., boundingRect().width(), item->boundingRect().height()/2.)); +// } +// m_drop_areas.append(QRectF(0, list.back()->y() +list.back()->boundingRect().height() - list.back()->boundingRect().height()/4., boundingRect().width(), list.back()->boundingRect().height()/2.)); +// } else { +// total_height = DesignerHelper::getDefaultMultiLayerHeight(); +// m_drop_areas.append(boundingRect()); +// } + +// m_rect.setHeight(total_height); +// update(); +// emit heightChanged(); +//} + + +//bool MultiLayerView::isInDropArea(QPointF pos) +//{ +// foreach(QRectF rect, m_drop_areas) { +// //std::cout << " drop areas " << rect.x() << " " << rect.y() << " " << rect.width() << " " << rect.height() << " point" << pos.x() << " " << pos.y() << std::endl; +// if (rect.contains(pos)) return true; +// } +// return false; +//} + +//bool MultiLayerView::isExpectedObject(const QString &name) +//{ +// if(m_current_types.contains(name)) return true; +// return false; +//} + + + +//void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +//{ +// Q_UNUSED(widget); +// painter->setPen(m_color); +// if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) { +// painter->setPen(Qt::DashLine); +// } +// painter->setBrush(DesignerHelper::getLayerGradient(m_color, getRectangle() ) ); +// painter->drawRect(getRectangle()); +//} + + +//void MultiLayerView::dragEnterEvent(QGraphicsSceneDragDropEvent *event) +//{ +// const DesignerMimeData *mimeData = checkDragEvent(event); +// if (mimeData) { +// std::cout << "MultiLayerView::dragEnterEvent() -> INSIDE " << std::endl; +// } +//} + + +//void MultiLayerView::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) +//{ +// Q_UNUSED(event); +// std::cout << "MultiLayerView::dragLeaveEvent() -> " << std::endl; +//} + + +//void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event) +//{ +// std::cout << "MultiLayerView::dropEvent() -> " << std::endl; + +// const DesignerMimeData *mimeData = checkDragEvent(event); +// if (mimeData) { +//// ISampleView *layer(0); +//// if(mimeData->getClassName() == QString("Layer") ) layer = new LayerView(); +//// if(mimeData->getClassName() == QString("MultiLayer") ) layer = new MultiLayerView(); + +// if(mimeData->getClassName() == QString("Layer") ) { +// addLayer(new LayerView(), event->pos()); +// update(); +// } else if(mimeData->getClassName() == QString("MultiLayer") ) { +// addMultiLayer(new MultiLayerView(), event->pos()); +// update(); + +//// if(layer){ +//// std::cout << "MultiLayerView::dropEvent() -> adding layer or multilayer" << std::endl; +//// addLayer(layer, event->pos()); +//// update(); +// } else { +// std::cout << "MultiLayerView::dropEvent() -> Error. Can't create object " << mimeData->getClassName().toStdString() << std::endl; +// } +// } +//} -//void MultiLayerView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +//void MultiLayerView::dragMoveEvent(QGraphicsSceneDragDropEvent *event) //{ -// std::cout << "MultiLayerView::mouseMoveEvent -> " << x() << " " << y() << std::endl; -// QGraphicsObject::mouseMoveEvent(event); +// const DesignerMimeData *mimeData = checkDragEvent(event); +// if (mimeData) { +// std::cout << "MultiLayerView::dragMoveEvent() -> pos:" << event->pos().x() << " " << event->pos().y() << std::endl; +// update(); + +// } //} //void MultiLayerView::mousePressEvent(QGraphicsSceneMouseEvent *event) //{ // std::cout << "MultiLayerView::mousePressEvent -> " << x() << " " << y() << std::endl; +// // remove selection from child items +// QList<QGraphicsItem *> list = childItems(); +// foreach(QGraphicsItem *item, list) { +// item->setSelected(false); +// } + // QGraphicsObject::mousePressEvent(event); //} + //void MultiLayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) //{ // std::cout << "MultiLayerView::mouseReleaseEvent -> " << x() << " " << y() << std::endl; +// emit LayerMoved(); // QGraphicsObject::mouseReleaseEvent(event); //} -const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEvent * event) -{ - std::cout << "MultiLayerView::checkDragEvent -> " << std::endl; - const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData()); - if (!mimeData) { - event->ignore(); - return 0; - } +////void MultiLayerView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +////{ +//// std::cout << "MultiLayerView::mouseMoveEvent -> " << x() << " " << y() << std::endl; +//// QGraphicsObject::mouseMoveEvent(event); +////} - if(mimeData->hasFormat("bornagain/widget") - && isExpectedObject(mimeData->getClassName()) - && isInDropArea(event->pos()) ) { - std::cout << "LayerDockView::checkDragEvent -> yes" << std::endl; - event->setAccepted(true); - } else { - event->setAccepted(false); - } - return mimeData; -} +////void MultiLayerView::mousePressEvent(QGraphicsSceneMouseEvent *event) +////{ +//// std::cout << "MultiLayerView::mousePressEvent -> " << x() << " " << y() << std::endl; +//// QGraphicsObject::mousePressEvent(event); +////} -// multi-layers are not allowed to move horizontally -QVariant MultiLayerView::itemChange(GraphicsItemChange change, const QVariant &value) -{ - if (change == ItemPositionChange && scene() && m_fixed) { - // value is the new position. - QPointF newPos = value.toPointF(); - newPos.setX(m_fixed_xpos); - return newPos; - } - return QGraphicsItem::itemChange(change, value); - } +////void MultiLayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +////{ +//// std::cout << "MultiLayerView::mouseReleaseEvent -> " << x() << " " << y() << std::endl; +//// QGraphicsObject::mouseReleaseEvent(event); +////} + + +//const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEvent * event) +//{ +// std::cout << "MultiLayerView::checkDragEvent -> " << std::endl; +// const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData()); +// if (!mimeData) { +// event->ignore(); +// return 0; +// } + +// if(mimeData->hasFormat("bornagain/widget") +// && isExpectedObject(mimeData->getClassName()) +// && isInDropArea(event->pos()) ) { +// std::cout << "LayerDockView::checkDragEvent -> yes" << std::endl; +// event->setAccepted(true); +// } else { +// event->setAccepted(false); +// } +// return mimeData; +//} + + +//// multi-layers are not allowed to move horizontally +//QVariant MultiLayerView::itemChange(GraphicsItemChange change, const QVariant &value) +//{ +// if (change == ItemPositionChange && scene() && m_fixed) { +// // value is the new position. +// QPointF newPos = value.toPointF(); +// newPos.setX(m_fixed_xpos); +// return newPos; +// } +// return QGraphicsItem::itemChange(change, value); +// } diff --git a/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.h b/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.h index eb2ec2398427b50312ea4de8b41881dd0ce6dd86..22998049b0d69557b467724307a5611bd0df8179 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.h +++ b/GUI/coregui/Views/Components/SampleDesigner/MultiLayerView.h @@ -12,102 +12,113 @@ class LayerView; -class LayerView2; class DesignerMimeData; -class MultiLayerView2 : public ConnectableView +class MultiLayerView : public ConnectableView { Q_OBJECT public: enum { Type = DesignerHelper::MultiLayerType }; - MultiLayerView2(QGraphicsItem *parent = 0); + MultiLayerView(QGraphicsItem *parent = 0); int type() const { return Type; } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); - void addView(IView *childView); + void addView(IView *childView, int row = 0); + + virtual void addLayer(LayerView *layer, QPointF pos=QPointF()); + virtual void addNewLayer(LayerView *layer, int row); + virtual void removeLayer(LayerView *layer); + + bool isInDropArea(QPointF pos); + int getDropArea(QPointF pos); - virtual void addLayer(LayerView2 *layer, QPointF pos=QPointF()); + QRectF getDropAreaRectangle(int row); public slots: void updateHeight(); + void onLayerAboutToBeDeleted(); -}; +protected: + void dropEvent(QGraphicsSceneDragDropEvent *event); + const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event); + void dragMoveEvent(QGraphicsSceneDragDropEvent *event); +private: + QList<LayerView *> m_layers; + QList<QRectF> m_drop_areas; -// ----------------------------------------------------------------------------- -// ----------------------------------------------------------------------------- -// ----------------------------------------------------------------------------- +}; -#include "LayerView.h" -class MultiLayerView : public ConnectableView -{ - Q_OBJECT -public: - enum { Type = DesignerHelper::MultiLayerType }; +//class MultiLayerView : public ConnectableView +//{ +// Q_OBJECT - MultiLayerView(QGraphicsItem *parent = 0); +//public: +// enum { Type = DesignerHelper::MultiLayerType }; - int type() const { return Type; } +// MultiLayerView(QGraphicsItem *parent = 0); - //! create top MultiLayer, which will be the dock for all Layer's and MultiLayer's - static MultiLayerView *createTopMultiLayer(); +// int type() const { return Type; } - //! сalls the ISampleViewVisitor's visit method - virtual void accept(IViewVisitor *visitor) { visitor->visit(this); } +// //! create top MultiLayer, which will be the dock for all Layer's and MultiLayer's +// static MultiLayerView *createTopMultiLayer(); - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); +// //! сalls the ISampleViewVisitor's visit method +// virtual void accept(IViewVisitor *visitor) { visitor->visit(this); } - void addLayer(LayerView *layer, QPointF pos=QPointF()); - void addBottomLayer(LayerView *layer); - void addMultiLayer(MultiLayerView *layer, QPointF pos=QPointF()); +// void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); - //! allows droping of object of given type - void allowDropType(const QString &name); +// void addLayer(LayerView *layer, QPointF pos=QPointF()); +// void addBottomLayer(LayerView *layer); +// void addMultiLayer(MultiLayerView *layer, QPointF pos=QPointF()); - void setFixedX() { m_fixed_xpos = x(); m_fixed=true; } - qreal getFixedX() { return m_fixed_xpos; } +// //! allows droping of object of given type +// void allowDropType(const QString &name); -public slots: - void updateHeight(); +// void setFixedX() { m_fixed_xpos = x(); m_fixed=true; } +// qreal getFixedX() { return m_fixed_xpos; } -signals: - void LayerMoved(); +//public slots: +// void updateHeight(); -protected: - void dragEnterEvent(QGraphicsSceneDragDropEvent *event); - void dragLeaveEvent(QGraphicsSceneDragDropEvent *event); - void dropEvent(QGraphicsSceneDragDropEvent *event); - void dragMoveEvent(QGraphicsSceneDragDropEvent *event); +//signals: +// void LayerMoved(); -// void mouseMoveEvent(QGraphicsSceneMouseEvent *event); - void mousePressEvent(QGraphicsSceneMouseEvent *event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - QVariant itemChange(GraphicsItemChange change, const QVariant &value); +//protected: +// void dragEnterEvent(QGraphicsSceneDragDropEvent *event); +// void dragLeaveEvent(QGraphicsSceneDragDropEvent *event); +// void dropEvent(QGraphicsSceneDragDropEvent *event); +// void dragMoveEvent(QGraphicsSceneDragDropEvent *event); - const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event); +//// void mouseMoveEvent(QGraphicsSceneMouseEvent *event); +// void mousePressEvent(QGraphicsSceneMouseEvent *event); +// void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); +// QVariant itemChange(GraphicsItemChange change, const QVariant &value); - //! returns true if given point is in alowed areas of multilayer - bool isInDropArea(QPointF pos); +// const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event); - //! returns true if name of the object match whose the multi layer can handle - bool isExpectedObject(const QString &name); +// //! returns true if given point is in alowed areas of multilayer +// bool isInDropArea(QPointF pos); -private: - QList<QRectF> m_drop_areas; - QStringList m_expected_types; - QStringList m_current_types; - qreal m_fixed_xpos; - bool m_fixed; -}; +// //! returns true if name of the object match whose the multi layer can handle +// bool isExpectedObject(const QString &name); + +//private: +// QList<QRectF> m_drop_areas; +// QStringList m_expected_types; +// QStringList m_current_types; +// qreal m_fixed_xpos; +// bool m_fixed; +//}; diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.cpp b/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.cpp index 7071078211aa4d6da0a39b5baa4dce63a8aa9bfa..aa0a2173d7e891a731a7344a78d3711de92489b9 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.cpp @@ -88,6 +88,7 @@ bool NodeEditor::eventFilter(QObject *o, QEvent *e) conn->setPos2(port2->scenePos()); conn->setPort2(port2); conn->updatePath(); + emit connectionIsEstablished(conn); conn = 0; return true; } diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.h b/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.h index 59e6188117e0ee50b3c2e7aafde1efb25cf8e67b..6996134e0b3549b32d50f4d2d7a41e48901e0637 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.h +++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditor.h @@ -28,6 +28,9 @@ public: bool eventFilter(QObject *, QEvent *); +signals: + void connectionIsEstablished(NodeEditorConnection *); + private: QGraphicsItem *itemAt(const QPointF&); diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.cpp b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.cpp index 215db8bf1009ee51a61e1def87d6928833d88c32..9a80e0d002bac91bba072c35252da7cc1ecb95fe 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.cpp @@ -85,6 +85,20 @@ NodeEditorPort* NodeEditorConnection::port2() const } +NodeEditorPort *NodeEditorConnection::getInputPort() +{ + Q_ASSERT(m_port1 && m_port2); + return (m_port1->isInput() ? m_port1 : m_port2); +} + + +NodeEditorPort *NodeEditorConnection::getOutputPort() +{ + Q_ASSERT(m_port1 && m_port2); + return (m_port1->isOutput() ? m_port1 : m_port2); +} + + void NodeEditorConnection::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option) diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.h b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.h index 6139c703d0cdb98cfe6f0d0e1a7557b5d944f2d6..d15015b928d172f411269761e56de75133b2df31 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.h +++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorConnection.h @@ -29,6 +29,9 @@ public: NodeEditorPort* port1() const; NodeEditorPort* port2() const; + NodeEditorPort *getInputPort(); + NodeEditorPort *getOutputPort(); + int type() const { return Type; } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.cpp b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.cpp index ba3fc1e6b2717efd53dd784b737369d61e68dfc7..559cbef7318d98cd53e4054e86100f3b74be913f 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.cpp @@ -58,6 +58,14 @@ NodeEditorPort::~NodeEditorPort() } +void NodeEditorPort::deleteAllConnections() +{ + foreach(NodeEditorConnection *conn, m_connections) + delete conn; + m_connections.clear(); +} + + bool NodeEditorPort::isOutput() { return (m_direction == Output ? true : false); diff --git a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.h b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.h index a7f84bbc8d38e672170117fcf804bc53d5e1fe76..d894cb4a15f8bad666873c931aa28bf69548f381 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.h +++ b/GUI/coregui/Views/Components/SampleDesigner/NodeEditorPort.h @@ -64,6 +64,8 @@ public: static QColor getPortTypeColor(NodeEditorPort::PortType port_type); + void deleteAllConnections(); + protected: QVariant itemChange(GraphicsItemChange change, const QVariant &value); diff --git a/GUI/coregui/Views/Components/SampleDesigner/SampleViewAligner.cpp b/GUI/coregui/Views/Components/SampleDesigner/SampleViewAligner.cpp index d23471faffd31f53a2472ef28b640ab7fdb4e6d1..8a2cc00b6c565470aedec565ac1c2cbfbb4c27f1 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/SampleViewAligner.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/SampleViewAligner.cpp @@ -28,19 +28,19 @@ QMap<QString, int> SampleViewAligner::m_typeToArea = initTypeToAreaMap(); //! aligns Views according to predefined areas void SampleViewAligner::align(QList<IView *> views, QPointF reference) { - qDebug() << "---------------------------------------"; - qDebug() << "SampleViewAligner::align()" << reference; + //qDebug() << "---------------------------------------"; + //qDebug() << "SampleViewAligner::align()" << reference; QMap<int, IView *> areaToView; foreach(IView *view, views) { - int area = m_typeToArea[view->getSessionItem()->modelType()]; - qDebug() << "area" << area << view->getSessionItem()->modelType(); + int area = m_typeToArea[view->getParameterizedItem()->modelType()]; + //qDebug() << "area" << area << view->getSessionItem()->modelType(); if(!view->parentObject()) areaToView.insertMulti(area, view); } for(int i_level = 0; i_level <= getMaximumAreaNumber(); ++i_level) { QList<IView *> items = areaToView.values(i_level); - qDebug() << "SampleViewAligner::align() i_level" << i_level << "size" << items.size(); + //qDebug() << "SampleViewAligner::align() i_level" << i_level << "size" << items.size(); reference = placeItems(items, reference); } } @@ -53,14 +53,15 @@ QPointF SampleViewAligner::placeItems(const QList<IView *> &items, QPointF refer qreal dy = getTotalVerticalSpace(items) + (items.size()-1)*vertical_gap; qreal dx = size_factor*getMaximumHorizontalSpace(items); reference.setX(reference.x() - dx ); - qDebug() << "SampleViewAligner::placeItems() dy:" << dy << " dx:" << dx << " reference:" << reference; + //qDebug() << "SampleViewAligner::placeItems() dy:" << dy << " dx:" << dx << " reference:" << reference; for(int i=0; i<items.size(); ++i) { IView *view = items[i]; - qDebug() << "SampleViewAligner::placeItems()" << view->getSessionItem()->modelType() << view->parentObject(); + //qDebug() << "SampleViewAligner::placeItems()" << view->getSessionItem()->modelType() << view->parentObject(); QPointF pos = reference; - qDebug() << "xxx " << view->x() << view->y() << (pos.y() - i*dy/items.size()); + //qDebug() << "xxx " << view->x() << view->y() << (pos.y() - i*dy/items.size()); pos.setY(pos.y() - i*dy/items.size()); - view->setPos(pos); + if(view->pos().isNull()) + view->setPos(pos); } return reference; } diff --git a/GUI/coregui/Views/Components/SampleDesigner/SampleViewFactory.cpp b/GUI/coregui/Views/Components/SampleDesigner/SampleViewFactory.cpp index f59e02f0716273213831d733ec9e83c8ce233563..722939b85a1535d4cbb0d1d7ee9e4e404b05aab1 100644 --- a/GUI/coregui/Views/Components/SampleDesigner/SampleViewFactory.cpp +++ b/GUI/coregui/Views/Components/SampleDesigner/SampleViewFactory.cpp @@ -20,11 +20,11 @@ bool SampleViewFactory::isValidName(const QString &name) IView *SampleViewFactory::createSampleView(const QString &name) { if (name==QString("MultiLayer")) { - return new MultiLayerView2(); + return new MultiLayerView(); } if (name==QString("Layer")) { - return new LayerView2(); + return new LayerView(); } if (name==QString("ParticleLayout")) { diff --git a/GUI/coregui/Views/Components/widgetbox/widgetbox.xml b/GUI/coregui/Views/Components/widgetbox/widgetbox.xml index 14f8e89b32bc46ea9a2124166eb5b5fe0d5dedc2..51e90f6839011047cf4cd44aa42565e18677ae56 100644 --- a/GUI/coregui/Views/Components/widgetbox/widgetbox.xml +++ b/GUI/coregui/Views/Components/widgetbox/widgetbox.xml @@ -20,22 +20,13 @@ </widget> </categoryentry> - <categoryentry name="Layer repeater" icon="images/sample_vspacer.png"> - <widget class="LayerRepeater"> - <property name="objectName"> - <string notr="true">somestring</string> - </property> - </widget> - </categoryentry> - - </category> - <category name="Particle factories"> + <category name="Particle layouts"> - <categoryentry name="Particle Decoration" icon="images/sample_spacer.png"> - <widget class="ParticleDecoration"> + <categoryentry name="Basic particle layout" icon="images/sample_spacer.png"> + <widget class="ParticleLayout"> <property name="objectName"> <string notr="true">somestring</string> </property> diff --git a/GUI/coregui/mainwindow/mainwindow.cpp b/GUI/coregui/mainwindow/mainwindow.cpp index ba5ba48499ea6b8cdceab485f5592bbf1047af64..ae3cca53c3c25c78e797d34f19dba71f9af16283 100644 --- a/GUI/coregui/mainwindow/mainwindow.cpp +++ b/GUI/coregui/mainwindow/mainwindow.cpp @@ -249,6 +249,15 @@ void MainWindow::initSessionModel() m_sessionModel->insertNewItem("ParticleLayout", m_sessionModel->indexOfItem(layer)); m_sessionModel->insertNewItem("Layer"); + m_sessionModel->insertNewItem("Layer"); + + m_sessionModel->insertNewItem("MultiLayer"); + + m_sessionModel->insertNewItem("ParticleLayout"); + + //ParameterizedItem *layer2 = m_sessionModel->insertNewItem("Layer"); + //m_sessionModel->moveParameterizedItem(layer2, multilayer); + //m_sessionModel->moveParameterizedItem(layer, 0); //m_sessionModel->save("session.xml"); }