diff --git a/GUI/Models/GUIExamplesFactory.cpp b/GUI/Models/GUIExamplesFactory.cpp index 3911cfd032898f039fe45b666330ac7cec1642a5..d7160bde22d76fd1e52790dfb3611e8080069db2 100644 --- a/GUI/Models/GUIExamplesFactory.cpp +++ b/GUI/Models/GUIExamplesFactory.cpp @@ -17,51 +17,34 @@ #include "Sample/Multilayer/MultiLayer.h" #include "Sample/StandardSamples/SampleBuilderFactory.h" #include <memory> +#include <QMap> -//! Defines correspondence between example name and real name of simulation from SimulationFactory -QMap<QString, QString> init_NameToRegistry() -{ - QMap<QString, QString> result; - result["example01"] = "CylindersAndPrismsBuilder"; - result["example02"] = "RadialParaCrystalBuilder"; - result["example03"] = "HexParaCrystalBuilder"; - result["example04"] = "CoreShellParticleBuilder"; - result["example05"] = "MultiLayerWithRoughnessBuilder"; - result["example06"] = "SquareLattice2DBuilder"; - result["example07"] = "RotatedPyramidsBuilder"; - result["example09"] = "ParticleCompositionBuilder"; - result["example10"] = "MesoCrystalBuilder"; +namespace { - // temporary for testing - // result["example09"] = "MultipleLayoutBuilder"; - // result["example09"] = "TwoTypesCylindersDistributionBuilder"; - // result["example09"] = "RectParaCrystalBuilder"; - // result["example09"] = "SizeDistributionLMAModelBuilder"; - // result["example09"] = "CylindersInSSCABuilder"; - // result["example09"] = "TransformBoxBuilder"; - // result["example09"] = "BoxCompositionRotateZandYBuilder"; - // result["example09"] = "CoreShellBoxRotateZandYBuilder"; - // result["example09"] = "BoxStackCompositionBuilder"; - // result["example09"] = "LargeCylindersInDWBABuilder"; - // result["example09"] = "SlicedCompositionBuilder"; - // result["example09"] = "RotatedPyramidsDistributionBuilder"; - // result["example09"] = "SpheresWithLimitsDistributionBuilder"; - // result["example09"] = "ConesWithLimitsDistributionBuilder"; - return result; -} +QMap<QString, QString> name2registry = { + {"example01", "CylindersAndPrismsBuilder"}, + {"example02", "RadialParaCrystalBuilder"}, + {"example03", "HexParaCrystalBuilder"}, + {"example04", "CoreShellParticleBuilder"}, + {"example05", "MultiLayerWithRoughnessBuilder"}, + {"example06", "SquareLattice2DBuilder"}, + {"example07", "RotatedPyramidsBuilder"}, + {"example09", "ParticleCompositionBuilder"}, + {"example10", "MesoCrystalBuilder"}, +}; -QMap<QString, QString> GUIExamplesFactory::m_name_to_registry = init_NameToRegistry(); +} // namespace bool GUIExamplesFactory::isValidExampleName(const QString& name) { - return m_name_to_registry.contains(name); + return name2registry.contains(name); } //! Populate sample model with SessionItem* GUIExamplesFactory::createSampleItems(const QString& name, SampleModel* sampleModel, MaterialModel* materialModel) { - QString exampleName = m_name_to_registry[name]; + QString exampleName = name2registry[name]; SampleBuilderFactory factory; const std::unique_ptr<MultiLayer> sample(factory.createSampleByName(exampleName.toStdString())); diff --git a/GUI/Models/GUIExamplesFactory.h b/GUI/Models/GUIExamplesFactory.h index eb1753e8216b617fa53c5bed9a0a1050908c05e4..46b309cf8213889024dea767bbc17bf469dad887 100644 --- a/GUI/Models/GUIExamplesFactory.h +++ b/GUI/Models/GUIExamplesFactory.h @@ -15,7 +15,7 @@ #ifndef BORNAGAIN_GUI_MODELS_GUIEXAMPLESFACTORY_H #define BORNAGAIN_GUI_MODELS_GUIEXAMPLESFACTORY_H -#include <QMap> +#include <QString> class SessionItem; class SampleModel; @@ -28,10 +28,6 @@ public: static SessionItem* createSampleItems(const QString& name, SampleModel* sampleModel, MaterialModel* materialModel); - -private: - static QMap<QString, QString> m_name_to_registry; - //!< correspondence of GUI example name and name from StandardSamples registry }; #endif // BORNAGAIN_GUI_MODELS_GUIEXAMPLESFACTORY_H diff --git a/GUI/Views/SampleDesigner/DesignerScene.cpp b/GUI/Views/SampleDesigner/DesignerScene.cpp index baaef554bda440ede59200b0580e40326c36ca9d..ddfaf5610622182d68af9111c8a1909b840dd728 100644 --- a/GUI/Views/SampleDesigner/DesignerScene.cpp +++ b/GUI/Views/SampleDesigner/DesignerScene.cpp @@ -85,28 +85,25 @@ DesignerScene::~DesignerScene() void DesignerScene::setSelectionModel(QItemSelectionModel* model, FilterPropertyProxy* proxy) { ASSERT(model); + if (model == m_selectionModel) + return; - if (model != m_selectionModel) { - - if (m_selectionModel) { - disconnect(m_selectionModel, &QItemSelectionModel::selectionChanged, this, - &DesignerScene::onSessionSelectionChanged); - } + if (m_selectionModel) + disconnect(m_selectionModel, &QItemSelectionModel::selectionChanged, this, + &DesignerScene::onSessionSelectionChanged); - m_selectionModel = model; - m_proxy = proxy; + m_selectionModel = model; + m_proxy = proxy; - connect(m_selectionModel, &QItemSelectionModel::selectionChanged, this, - &DesignerScene::onSessionSelectionChanged); - } + connect(m_selectionModel, &QItemSelectionModel::selectionChanged, this, + &DesignerScene::onSessionSelectionChanged); } IView* DesignerScene::getViewForItem(SessionGraphicsItem* item) { auto it = m_ItemToView.find(item); - if (it != m_ItemToView.end()) { + if (it != m_ItemToView.end()) return it.value(); - } return nullptr; } @@ -167,13 +164,8 @@ void DesignerScene::onSessionSelectionChanged(const QItemSelection& /* selected for (QMap<SessionGraphicsItem*, IView*>::iterator it = m_ItemToView.begin(); it != m_ItemToView.end(); ++it) { QModelIndex index = m_proxy->mapFromSource(m_sampleModel->indexOfItem(it.key())); - if (index.isValid()) { - if (m_selectionModel->isSelected(index)) { - it.value()->setSelected(true); - } else { - it.value()->setSelected(false); - } - } + if (index.isValid()) + it.value()->setSelected(m_selectionModel->isSelected(index)); } m_block_selection = false; @@ -221,10 +213,8 @@ void DesignerScene::updateViews(const QModelIndex& parentIndex, IView* parentVie continue; childView = addViewForItem(item); - if (childView) { - if (parentView) - parentView->addView(childView, childCount++); - } + if (childView && parentView) + parentView->addView(childView, childCount++); } updateViews(itemIndex, childView); @@ -236,19 +226,15 @@ IView* DesignerScene::addViewForItem(SessionGraphicsItem* item) { ASSERT(item); - IView* view = getViewForItem(item); + if (IView* view = getViewForItem(item)) + return view; - if (!view) { - view = SampleViewFactory::createSampleView(item->modelType()); - if (view) { - m_ItemToView[item] = view; - view->setParameterizedItem(item); - addItem(view); - return view; - } - } else { - // view for item exists - } + IView* view = SampleViewFactory::createSampleView(item->modelType()); + if (!view) + return nullptr; + m_ItemToView[item] = view; + view->setParameterizedItem(item); + addItem(view); return view; } @@ -263,13 +249,8 @@ void DesignerScene::deleteViews(const QModelIndex& viewIndex) { for (int i_row = 0; i_row < m_sampleModel->rowCount(viewIndex); ++i_row) { QModelIndex itemIndex = m_sampleModel->index(i_row, 0, viewIndex); - - if (SessionItem* item = m_sampleModel->itemForIndex(itemIndex)) { + if (SessionItem* item = m_sampleModel->itemForIndex(itemIndex)) removeItemViewFromScene(item); - - } else { - // not a parameterized graphics item - } deleteViews(itemIndex); } removeItemViewFromScene(m_sampleModel->itemForIndex(viewIndex)); // deleting view itself @@ -378,7 +359,8 @@ void DesignerScene::onEstablishedConnection(NodeEditorConnection* connection_ptr if (parentView->getInputPortIndex(connection->inputPort()) == 0) { parent->setCore(child); return; - } else if (parentView->getInputPortIndex(connection->inputPort()) == 1) { + } + if (parentView->getInputPortIndex(connection->inputPort()) == 1) { parent->setShell(child); return; } @@ -411,9 +393,8 @@ void DesignerScene::removeConnections(IView* view) void DesignerScene::dragMoveEvent(QGraphicsSceneDragDropEvent* event) { const DesignerMimeData* mimeData = checkDragEvent(event); - if (isAcceptedByMultiLayer(mimeData, event)) { + if (isAcceptedByMultiLayer(mimeData, event)) QGraphicsScene::dragMoveEvent(event); - } } //! Hadles drop event @@ -422,52 +403,52 @@ void DesignerScene::dragMoveEvent(QGraphicsSceneDragDropEvent* event) void DesignerScene::dropEvent(QGraphicsSceneDragDropEvent* event) { const DesignerMimeData* mimeData = checkDragEvent(event); - if (mimeData) { + if (!mimeData) + return; - // to have possibility to drop MultiLayer on another MultiLayer - // * edit function DesignerScene::isAcceptedByMultiLayer - // * edit MultiLayerItem for addToValidChildren - // * remove method MultiLayerView::itemChange + // to have possibility to drop MultiLayer on another MultiLayer + // * edit function DesignerScene::isAcceptedByMultiLayer + // * edit MultiLayerItem for addToValidChildren + // * remove method MultiLayerView::itemChange - if (isAcceptedByMultiLayer(mimeData, event)) { - // certain views can be dropped on MultiLayer and so will be processed there - QGraphicsScene::dropEvent(event); + if (isAcceptedByMultiLayer(mimeData, event)) { + // certain views can be dropped on MultiLayer and so will be processed there + QGraphicsScene::dropEvent(event); + return; + } + // other views can be dropped on canvas anywhere + if (SampleViewFactory::isValidType(mimeData->getClassName())) { + SessionGraphicsItem* new_item(nullptr); + if (mimeData->getClassName().startsWith("FormFactor")) { + ParticleItem* new_particle = m_sampleModel->insertItem<ParticleItem>(); + QString ffName = mimeData->getClassName(); + ffName.remove("FormFactor"); + new_particle->setFormFactor(ffName); + new_item = new_particle; } else { - // other views can be dropped on canvas anywhere - if (SampleViewFactory::isValidType(mimeData->getClassName())) { - - SessionGraphicsItem* new_item(nullptr); - if (mimeData->getClassName().startsWith("FormFactor")) { - ParticleItem* new_particle = m_sampleModel->insertItem<ParticleItem>(); - QString ffName = mimeData->getClassName(); - ffName.remove("FormFactor"); - new_particle->setFormFactor(ffName); - new_item = new_particle; - } else { - new_item = dynamic_cast<SessionGraphicsItem*>( - m_sampleModel->insertNewItem(mimeData->getClassName())); - } - - // propagating drop coordinates to SessionItem - QRectF boundingRect = DesignerHelper::getDefaultBoundingRect(new_item->modelType()); - new_item->setXPos(event->scenePos().x() - boundingRect.width() / 2); - new_item->setYPos(event->scenePos().y() - boundingRect.height() / 2); - clearSelection(); - selectItem(new_item); - } else if (GUIExamplesFactory::isValidExampleName(mimeData->getClassName())) { - SessionItem* topItem = GUIExamplesFactory::createSampleItems( - mimeData->getClassName(), m_sampleModel, m_materialModel); - QRectF boundingRect = DesignerHelper::getDefaultBoundingRect(topItem->modelType()); - QPointF reference(event->scenePos().x() - boundingRect.width() / 2, - event->scenePos().y() - boundingRect.height() / 2); - m_aligner->alignSample(topItem, reference, true); - clearSelection(); - selectItem(topItem, true); - } - adjustSceneRect(); + new_item = dynamic_cast<SessionGraphicsItem*>( + m_sampleModel->insertNewItem(mimeData->getClassName())); } + + // propagating drop coordinates to SessionItem + QRectF boundingRect = DesignerHelper::getDefaultBoundingRect(new_item->modelType()); + new_item->setXPos(event->scenePos().x() - boundingRect.width() / 2); + new_item->setYPos(event->scenePos().y() - boundingRect.height() / 2); + clearSelection(); + selectItem(new_item); + + } else if (GUIExamplesFactory::isValidExampleName(mimeData->getClassName())) { + SessionItem* topItem = GUIExamplesFactory::createSampleItems( + mimeData->getClassName(), m_sampleModel, m_materialModel); + QRectF boundingRect = DesignerHelper::getDefaultBoundingRect(topItem->modelType()); + QPointF reference(event->scenePos().x() - boundingRect.width() / 2, + event->scenePos().y() - boundingRect.height() / 2); + m_aligner->alignSample(topItem, reference, true); + clearSelection(); + selectItem(topItem, true); } + adjustSceneRect(); } //! returns proper MimeData if the object can be hadled by graphics scene @@ -484,9 +465,8 @@ const DesignerMimeData* DesignerScene::checkDragEvent(QGraphicsSceneDragDropEven void DesignerScene::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { - if (isLayerDragged()) { + if (isLayerDragged()) invalidate(); // to redraw vertical dashed line which denotes where to drag the layer - } QGraphicsScene::mouseMoveEvent(event); } @@ -524,19 +504,13 @@ bool DesignerScene::isAcceptedByMultiLayer(const DesignerMimeData* mimeData, // } // layer can be inserted in MultiLayer - if (mimeData->getClassName() == "Layer" && isMultiLayerNearby(event)) { - return true; - } - return false; + return mimeData->getClassName() == "Layer" && isMultiLayerNearby(event); } bool DesignerScene::isLayerDragged() const { ILayerView* layer = dynamic_cast<ILayerView*>(mouseGrabberItem()); - if (layer && !m_layer_interface_line.isNull()) { - return true; - } - return false; + return layer && !m_layer_interface_line.isNull(); } void DesignerScene::onSmartAlign() diff --git a/GUI/Views/SampleDesigner/SampleViewFactory.cpp b/GUI/Views/SampleDesigner/SampleViewFactory.cpp index a6a800ed8e30838e26455b3a27115b0b2a088afe..ba6077a9b95a4abf377ce3cc0838475576753ab3 100644 --- a/GUI/Views/SampleDesigner/SampleViewFactory.cpp +++ b/GUI/Views/SampleDesigner/SampleViewFactory.cpp @@ -32,28 +32,31 @@ #include "GUI/Views/SampleDesigner/ParticleView.h" #include "GUI/Views/SampleDesigner/TransformationView.h" -QStringList SampleViewFactory::m_valid_item_types = {MultiLayerItem::M_TYPE, - LayerItem::M_TYPE, - ParticleLayoutItem::M_TYPE, - ParticleItem::M_TYPE, - TransformationItem::M_TYPE, - ParticleCoreShellItem::M_TYPE, - ParticleCompositionItem::M_TYPE, - MesoCrystalItem::M_TYPE, - Interference1DLatticeItem::M_TYPE, - Interference2DLatticeItem::M_TYPE, - Interference2DParaCrystalItem::M_TYPE, - InterferenceFinite2DLatticeItem::M_TYPE, - InterferenceHardDiskItem::M_TYPE, - InterferenceRadialParaCrystalItem::M_TYPE}; +namespace { + +QStringList valid_item_types = {MultiLayerItem::M_TYPE, + LayerItem::M_TYPE, + ParticleLayoutItem::M_TYPE, + ParticleItem::M_TYPE, + TransformationItem::M_TYPE, + ParticleCoreShellItem::M_TYPE, + ParticleCompositionItem::M_TYPE, + MesoCrystalItem::M_TYPE, + Interference1DLatticeItem::M_TYPE, + Interference2DLatticeItem::M_TYPE, + Interference2DParaCrystalItem::M_TYPE, + InterferenceFinite2DLatticeItem::M_TYPE, + InterferenceHardDiskItem::M_TYPE, + InterferenceRadialParaCrystalItem::M_TYPE}; + +} // namespace bool SampleViewFactory::isValidType(const QString& model_type) { if (model_type.startsWith("FormFactor")) { return true; - } else { - return m_valid_item_types.contains(model_type); } + return valid_item_types.contains(model_type); } IView* SampleViewFactory::createSampleView(const QString& model_type) diff --git a/GUI/Views/SampleDesigner/SampleViewFactory.h b/GUI/Views/SampleDesigner/SampleViewFactory.h index ecb769fa2f655c26abbad51622905ed070bf4515..744ef0f3127cee7d8e0df893505d0f370ccfbe54 100644 --- a/GUI/Views/SampleDesigner/SampleViewFactory.h +++ b/GUI/Views/SampleDesigner/SampleViewFactory.h @@ -15,7 +15,6 @@ #ifndef BORNAGAIN_GUI_VIEWS_SAMPLEDESIGNER_SAMPLEVIEWFACTORY_H #define BORNAGAIN_GUI_VIEWS_SAMPLEDESIGNER_SAMPLEVIEWFACTORY_H -#include <QMap> #include <QStringList> class IView; @@ -24,11 +23,6 @@ class SampleViewFactory { public: static bool isValidType(const QString& model_type); static IView* createSampleView(const QString& model_type); - - static bool isValidExampleName(); - -private: - static QStringList m_valid_item_types; }; #endif // BORNAGAIN_GUI_VIEWS_SAMPLEDESIGNER_SAMPLEVIEWFACTORY_H