From 34e19a7e6736fec023e371b621711dd252da2d7b Mon Sep 17 00:00:00 2001 From: Gennady Pospelov <g.pospelov@fz-juelich.de> Date: Mon, 18 Apr 2016 11:09:43 +0200 Subject: [PATCH] SessionModel machinery now allows to add items like VectorItem without FixedGroupProperty --- GUI/coregui/Models/ApplicationModels.cpp | 9 +-- GUI/coregui/Models/SessionXML.cpp | 60 ++++++++++++++----- .../Views/SampleDesigner/DesignerScene.cpp | 22 +++++-- .../Views/SampleDesigner/DesignerScene.h | 2 +- .../SampleDesigner/SampleViewFactory.cpp | 2 +- .../Views/SampleDesigner/SampleViewFactory.h | 2 +- 6 files changed, 70 insertions(+), 27 deletions(-) diff --git a/GUI/coregui/Models/ApplicationModels.cpp b/GUI/coregui/Models/ApplicationModels.cpp index cfbf2ead0c8..0f67d0cb61e 100644 --- a/GUI/coregui/Models/ApplicationModels.cpp +++ b/GUI/coregui/Models/ApplicationModels.cpp @@ -36,11 +36,12 @@ ApplicationModels::ApplicationModels(QObject *parent) , m_fitModel(0) { createModels(); - //testGUIObjectBuilder(); + testGUIObjectBuilder(); - SessionItem *multilayer = m_sampleModel->insertNewItem(Constants::MultiLayerType); - SessionItem *layer = m_sampleModel->insertNewItem(Constants::LayerType, multilayer->index()); -// m_sampleModel->moveParameterizedItem(layer, 0); +// SessionItem *multilayer = m_sampleModel->insertNewItem(Constants::MultiLayerType); +// SessionItem *layer = m_sampleModel->insertNewItem(Constants::LayerType, multilayer->index()); + +// SampleModel * mmm = m_sampleModel->createCopy(); } diff --git a/GUI/coregui/Models/SessionXML.cpp b/GUI/coregui/Models/SessionXML.cpp index 91ed5765139..f7688c46690 100644 --- a/GUI/coregui/Models/SessionXML.cpp +++ b/GUI/coregui/Models/SessionXML.cpp @@ -146,7 +146,7 @@ void SessionWriter::writeVariant(QXmlStreamWriter *writer, QVariant variant, int void SessionReader::readItems(QXmlStreamReader *reader, SessionItem *item, const QString &topTag) { bool isTopItem = true; - qDebug() << "SessionModel::readItems() " << topTag; + qDebug() << "SessionModel::readItems() item:" << item << "topTag:" << topTag; if(item) qDebug() << " item" << item->modelType(); const QString modelType = item->model()->getModelTag(); while (!reader->atEnd()) { @@ -166,34 +166,64 @@ void SessionReader::readItems(QXmlStreamReader *reader, SessionItem *item, const if (!item) { qDebug() << "!!"; } + Q_ASSERT(item); } else if (item->modelType() == Constants::GroupItemType) { item = item->parent()->getGroupItem(item->parent()->tagFromItem(item), model_type); if (!item) { qDebug() << "!!"; } + Q_ASSERT(item); } else { - SessionItem *new_item = ItemFactory::createItem(model_type); + if (tag == "") + tag = item->defaultTag(); + + SessionItem *new_item(0); + SessionTagInfo info = item->getTagInfo(tag); + if (info.min == 1 && info.max == 1 && info.childCount == 1) { + new_item = item->getItem(tag); + } else { + new_item = ItemFactory::createItem(model_type); + if (!item->insertItem(-1, new_item, tag)) { + Q_ASSERT(0); + } + + } + Q_ASSERT(new_item); if (reader->attributes().hasAttribute(SessionXML::DisplayNameAttribute)) { new_item->setDisplayName(reader->attributes().value(SessionXML::DisplayNameAttribute).toString()); } - if (tag == "") - tag = item->defaultTag(); - if (!item->insertItem(-1, new_item, tag)) { - // this must be VectorItem or similar registered via addProperty mechanism - SessionTagInfo info = item->getTagInfo(tag); - if (info.max == info.childCount && info.childCount == 1) { - delete item->takeItem(0, tag); - item->insertItem(-1, new_item, tag); - } else { - throw GUIHelpers::Error("SessionReader::readItems -> Error. " - "Can't insert item 1.2"); - } - } +// qDebug() << "QQQ 1.3"; +// SessionItem *new_item = ItemFactory::createItem(model_type); +// qDebug() << "QQQ 1.3.1" << new_item << new_item->modelType(); +// Q_ASSERT(new_item); +// if (reader->attributes().hasAttribute(SessionXML::DisplayNameAttribute)) { +// new_item->setDisplayName(reader->attributes().value(SessionXML::DisplayNameAttribute).toString()); +// } +// if (tag == "") +// tag = item->defaultTag(); + +// qDebug() << "QQQ 1.3.2"; +// if (!item->insertItem(-1, new_item, tag)) { +// // this must be VectorItem or similar registered via addProperty mechanism +// qDebug() << "QQQ 1.3.3"; + +// SessionTagInfo info = item->getTagInfo(tag); +// if (info.max == info.childCount && info.childCount == 1) { +// qDebug() << "QQQ 1.3.4"; +// delete item->takeItem(0, tag); +// bool result = item->insertItem(-1, new_item, tag); +// qDebug() << "QQQ 1.3.5" << result; +// } else { +// throw GUIHelpers::Error("SessionReader::readItems -> Error. " +// "Can't insert item 1.2"); +// } + +// } item = new_item; } diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp index 30e4d9b042e..7aa5cb9fb1d 100644 --- a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp +++ b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp @@ -119,6 +119,15 @@ void DesignerScene::setSelectionModel(QItemSelectionModel *model, FilterProperty } } +IView *DesignerScene::getViewForItem(SessionItem *item) +{ + auto it = m_ItemToView.find(item); + if(it != m_ItemToView.end()) { + return it.value(); + } + return nullptr; +} + void DesignerScene::resetScene() { qDebug() << "DesignerScene::resetScene()"; @@ -224,10 +233,12 @@ void DesignerScene::updateViews(const QModelIndex &parentIndex, IView *parentVie if (SessionItem *item = m_sampleModel->itemForIndex(itemIndex)) { + if(item && !SampleViewFactory::isValidType(item->modelType())) + continue; - if (item && (item->modelType() == Constants::GroupItemType || item->modelType() == Constants::PropertyType)) { - continue; - } +// if (item && (item->modelType() == Constants::GroupItemType || item->modelType() == Constants::PropertyType)) { +// continue; +// } childView = addViewForItem(item); if (childView) { @@ -253,7 +264,8 @@ IView *DesignerScene::addViewForItem(SessionItem *item) qDebug() << "DesignerScene::addViewForItem() ->" << item->modelType(); Q_ASSERT(item); - IView *view = m_ItemToView[item]; + IView *view = getViewForItem(item); + if (!view) { qDebug() << " DesignerScene::addViewForItem() -> Creating view for item" << item->modelType(); @@ -436,7 +448,7 @@ void DesignerScene::dropEvent(QGraphicsSceneDragDropEvent *event) } else { // other views can be dropped on canvas anywhere qDebug() << "DesignerScene::dropEvent() -> about to drop"; - if (SampleViewFactory::isValidItemName(mimeData->getClassName())) { + if (SampleViewFactory::isValidType(mimeData->getClassName())) { SessionItem *new_item(0); if (mimeData->getClassName().startsWith(Constants::FormFactorType)) { diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.h b/GUI/coregui/Views/SampleDesigner/DesignerScene.h index 8a07583d0db..fbc90ea399a 100644 --- a/GUI/coregui/Views/SampleDesigner/DesignerScene.h +++ b/GUI/coregui/Views/SampleDesigner/DesignerScene.h @@ -51,7 +51,7 @@ public: SampleModel *getSampleModel() { return m_sampleModel; } - IView *getViewForItem(SessionItem *item) { return m_ItemToView[item]; } + IView *getViewForItem(SessionItem *item); NodeEditor *getNodeEditor() { return m_nodeEditor;} diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp index 494fc725440..c9e00a2dd44 100644 --- a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp +++ b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp @@ -44,7 +44,7 @@ QStringList SampleViewFactory::m_valid_item_names = QStringList() << Constants::InterferenceFunction2DLatticeType; -bool SampleViewFactory::isValidItemName(const QString &name) +bool SampleViewFactory::isValidType(const QString &name) { if(name.startsWith(Constants::FormFactorType)) { return true; diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h index ee0ee168b7c..0473e60fe04 100644 --- a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h +++ b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h @@ -26,7 +26,7 @@ class IView; class BA_CORE_API_ SampleViewFactory { public: - static bool isValidItemName(const QString &name); + static bool isValidType(const QString &name); static IView *createSampleView(const QString &name); static bool isValidExampleName(); -- GitLab