From 6f623c37d87f0768bf9c7ca6cb901c3dbc7ec907 Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Mon, 30 Apr 2018 13:45:16 -0700 Subject: [PATCH 1/7] Keep models of a category in the order of registration --- include/nodes/internal/DataModelRegistry.hpp | 7 +++++++ src/DataModelRegistry.cpp | 6 ++++++ src/FlowView.cpp | 9 +++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/nodes/internal/DataModelRegistry.hpp b/include/nodes/internal/DataModelRegistry.hpp index 35fdbddc2..03549712c 100644 --- a/include/nodes/internal/DataModelRegistry.hpp +++ b/include/nodes/internal/DataModelRegistry.hpp @@ -36,6 +36,7 @@ class NODE_EDITOR_PUBLIC DataModelRegistry using RegistryItemCreator = std::function; using RegisteredModelCreatorsMap = std::unordered_map; using RegisteredModelsCategoryMap = std::unordered_map; + using RegisteredModelsOrder = std::vector; using CategoriesSet = std::set; using RegisteredTypeConvertersMap = std::map; @@ -82,6 +83,8 @@ class NODE_EDITOR_PUBLIC DataModelRegistry RegisteredModelCreatorsMap const ®isteredModelCreators() const; + RegisteredModelsOrder const& registeredModelsOrder() const; + RegisteredModelsCategoryMap const ®isteredModelsCategoryAssociation() const; CategoriesSet const &categories() const; @@ -97,6 +100,8 @@ class NODE_EDITOR_PUBLIC DataModelRegistry RegisteredModelCreatorsMap _registeredItemCreators; + RegisteredModelsOrder _registeredModelsOrder; + RegisteredTypeConvertersMap _registeredTypeConverters; private: @@ -129,6 +134,7 @@ class NODE_EDITOR_PUBLIC DataModelRegistry { _registeredItemCreators[name] = std::move(creator); _categories.insert(category); + _registeredModelsOrder.push_back(name); _registeredModelsCategory[name] = category; } } @@ -142,6 +148,7 @@ class NODE_EDITOR_PUBLIC DataModelRegistry { _registeredItemCreators[name] = std::move(creator); _categories.insert(category); + _registeredModelsOrder.push_back(name); _registeredModelsCategory[name] = category; } } diff --git a/src/DataModelRegistry.cpp b/src/DataModelRegistry.cpp index 4a8b202d8..294f6270e 100644 --- a/src/DataModelRegistry.cpp +++ b/src/DataModelRegistry.cpp @@ -30,6 +30,12 @@ registeredModelCreators() const return _registeredItemCreators; } +DataModelRegistry::RegisteredModelsOrder const & +DataModelRegistry:: +registeredModelsOrder() const +{ + return _registeredModelsOrder; +} DataModelRegistry::RegisteredModelsCategoryMap const & DataModelRegistry:: diff --git a/src/FlowView.cpp b/src/FlowView.cpp index 4e5e1e9b4..406fe7846 100644 --- a/src/FlowView.cpp +++ b/src/FlowView.cpp @@ -141,12 +141,13 @@ contextMenuEvent(QContextMenuEvent *event) topLevelItems[cat] = item; } - for (auto const &assoc : _scene->registry().registeredModelsCategoryAssociation()) + auto const &assocCategory = _scene->registry().registeredModelsCategoryAssociation(); + for (auto const &name : _scene->registry().registeredModelsOrder()) { - auto parent = topLevelItems[assoc.second]; + auto parent = topLevelItems[assocCategory.at(name)]; auto item = new QTreeWidgetItem(parent); - item->setText(0, assoc.first); - item->setData(0, Qt::UserRole, assoc.first); + item->setText(0, name); + item->setData(0, Qt::UserRole, name); } treeView->expandAll(); From a6e4ba419f52c0053602d991509cc186d75ef5ce Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Mon, 30 Apr 2018 13:53:25 -0700 Subject: [PATCH 2/7] Keep categories in registration order, but have a way to sort them --- include/nodes/internal/DataModelRegistry.hpp | 23 ++++++++++++++++---- src/DataModelRegistry.cpp | 17 +++++++++++++++ src/FlowView.cpp | 2 +- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/nodes/internal/DataModelRegistry.hpp b/include/nodes/internal/DataModelRegistry.hpp index 03549712c..b786fa992 100644 --- a/include/nodes/internal/DataModelRegistry.hpp +++ b/include/nodes/internal/DataModelRegistry.hpp @@ -38,6 +38,7 @@ class NODE_EDITOR_PUBLIC DataModelRegistry using RegisteredModelsCategoryMap = std::unordered_map; using RegisteredModelsOrder = std::vector; using CategoriesSet = std::set; + using CategoriesOrder = std::vector; using RegisteredTypeConvertersMap = std::map; @@ -89,6 +90,10 @@ class NODE_EDITOR_PUBLIC DataModelRegistry CategoriesSet const &categories() const; + CategoriesOrder const &categoriesOrder() const; + + void sortCategories(); + TypeConverter getTypeConverter(NodeDataType const & d1, NodeDataType const & d2) const; @@ -100,6 +105,8 @@ class NODE_EDITOR_PUBLIC DataModelRegistry RegisteredModelCreatorsMap _registeredItemCreators; + CategoriesOrder _categoriesOrder; + RegisteredModelsOrder _registeredModelsOrder; RegisteredTypeConvertersMap _registeredTypeConverters; @@ -130,12 +137,16 @@ class NODE_EDITOR_PUBLIC DataModelRegistry registerModelImpl(RegistryItemCreator creator, QString const &category ) { const QString name = ModelType::Name(); - if (_registeredItemCreators.count(name) == 0) + if (!_registeredItemCreators.count(name)) { _registeredItemCreators[name] = std::move(creator); - _categories.insert(category); _registeredModelsOrder.push_back(name); _registeredModelsCategory[name] = category; + + if (!_categories.count(category)) { + _categories.insert(category); + _categoriesOrder.push_back(category); + } } } @@ -144,12 +155,16 @@ class NODE_EDITOR_PUBLIC DataModelRegistry registerModelImpl(RegistryItemCreator creator, QString const &category ) { const QString name = creator()->name(); - if (_registeredItemCreators.count(name) == 0) + if (!_registeredItemCreators.count(name)) { _registeredItemCreators[name] = std::move(creator); - _categories.insert(category); _registeredModelsOrder.push_back(name); _registeredModelsCategory[name] = category; + + if (!_categories.count(category)) { + _categories.insert(category); + _categoriesOrder.push_back(category); + } } } diff --git a/src/DataModelRegistry.cpp b/src/DataModelRegistry.cpp index 294f6270e..c7c271fb2 100644 --- a/src/DataModelRegistry.cpp +++ b/src/DataModelRegistry.cpp @@ -1,5 +1,7 @@ #include "DataModelRegistry.hpp" +#include + #include #include @@ -53,6 +55,21 @@ categories() const } +DataModelRegistry::CategoriesOrder const & +DataModelRegistry:: +categoriesOrder() const +{ + return _categoriesOrder; +} + +void +DataModelRegistry:: +sortCategories() +{ + std::sort(_categoriesOrder.begin(), _categoriesOrder.end()); +} + + TypeConverter DataModelRegistry:: getTypeConverter(NodeDataType const & d1, diff --git a/src/FlowView.cpp b/src/FlowView.cpp index 406fe7846..c38a989cf 100644 --- a/src/FlowView.cpp +++ b/src/FlowView.cpp @@ -133,7 +133,7 @@ contextMenuEvent(QContextMenuEvent *event) modelMenu.addAction(treeViewAction); QMap topLevelItems; - for (auto const &cat : _scene->registry().categories()) + for (auto const &cat : _scene->registry().categoriesOrder()) { auto item = new QTreeWidgetItem(treeView); item->setText(0, cat); From f0c9e05b622a87f853a17e23272df4675ebadf85 Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Wed, 30 May 2018 14:25:50 -0700 Subject: [PATCH 3/7] Extract context menu node creation into a separate widget --- CMakeLists.txt | 1 + include/nodes/internal/FlowView.hpp | 3 + src/FlowView.cpp | 85 ++++--------------------- src/ModelSelectionWidget.cpp | 97 +++++++++++++++++++++++++++++ src/ModelSelectionWidget.hpp | 24 +++++++ 5 files changed, 138 insertions(+), 72 deletions(-) create mode 100644 src/ModelSelectionWidget.cpp create mode 100644 src/ModelSelectionWidget.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 91d2d86cc..f62a081fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ set(CPP_SOURCE_FILES src/FlowScene.cpp src/FlowView.cpp src/FlowViewStyle.cpp + src/ModelSelectionWidget.cpp src/Node.cpp src/NodeConnectionInteraction.cpp src/NodeDataModel.cpp diff --git a/include/nodes/internal/FlowView.hpp b/include/nodes/internal/FlowView.hpp index 378ff2e6d..44959eaef 100644 --- a/include/nodes/internal/FlowView.hpp +++ b/include/nodes/internal/FlowView.hpp @@ -1,6 +1,9 @@ #pragma once +#include + #include +#include #include "Export.hpp" diff --git a/src/FlowView.cpp b/src/FlowView.cpp index 93c94f7ba..1274f25ee 100644 --- a/src/FlowView.cpp +++ b/src/FlowView.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -22,9 +23,15 @@ #include "NodeGraphicsObject.hpp" #include "ConnectionGraphicsObject.hpp" #include "StyleCollection.hpp" +#include "ModelSelectionWidget.hpp" using QtNodes::FlowView; using QtNodes::FlowScene; +using QtNodes::ModelSelectionWidget; + + +static auto const SkipText = QStringLiteral("skip me"); + FlowView:: FlowView(QWidget *parent) @@ -100,7 +107,7 @@ FlowView::setScene(FlowScene *scene) void FlowView:: -contextMenuEvent(QContextMenuEvent *event) +contextMenuEvent(QContextMenuEvent* event) { if (itemAt(event->pos())) { @@ -110,57 +117,15 @@ contextMenuEvent(QContextMenuEvent *event) QMenu modelMenu; - auto skipText = QStringLiteral("skip me"); - - //Add filterbox to the context menu - auto *txtBox = new QLineEdit(&modelMenu); - - txtBox->setPlaceholderText(QStringLiteral("Filter")); - txtBox->setClearButtonEnabled(true); - - auto *txtBoxAction = new QWidgetAction(&modelMenu); - txtBoxAction->setDefaultWidget(txtBox); - - modelMenu.addAction(txtBoxAction); + auto* modelSelectionWidget = new ModelSelectionWidget(_scene->registry(), &modelMenu); - //Add result treeview to the context menu - auto *treeView = new QTreeWidget(&modelMenu); - treeView->header()->close(); - - auto *treeViewAction = new QWidgetAction(&modelMenu); - treeViewAction->setDefaultWidget(treeView); - - modelMenu.addAction(treeViewAction); - - QMap topLevelItems; - for (auto const &cat : _scene->registry().categoriesOrder()) + // Avoid accidental detach by using qAsConst + for (QAction* action : qAsConst(modelSelectionWidget)->actions()) { - auto item = new QTreeWidgetItem(treeView); - item->setText(0, cat); - item->setData(0, Qt::UserRole, skipText); - topLevelItems[cat] = item; + modelMenu.addAction(action); } - auto const &assocCategory = _scene->registry().registeredModelsCategoryAssociation(); - for (auto const &name : _scene->registry().registeredModelsOrder()) - { - auto parent = topLevelItems[assocCategory.at(name)]; - auto item = new QTreeWidgetItem(parent); - item->setText(0, name); - item->setData(0, Qt::UserRole, name); - } - - treeView->expandAll(); - - connect(treeView, &QTreeWidget::itemClicked, [&](QTreeWidgetItem *item, int) - { - QString modelName = item->data(0, Qt::UserRole).toString(); - - if (modelName == skipText) - { - return; - } - + connect(modelSelectionWidget, &ModelSelectionWidget::modelSelected, [&](QString modelName) { auto type = _scene->registry().create(modelName); if (type) @@ -181,30 +146,6 @@ contextMenuEvent(QContextMenuEvent *event) modelMenu.close(); }); - //Setup filtering - connect(txtBox, &QLineEdit::textChanged, [&](const QString &text) - { - for (auto& topLvlItem : topLevelItems) - { - for (int i = 0; i < topLvlItem->childCount(); ++i) - { - auto child = topLvlItem->child(i); - auto modelName = child->data(0, Qt::UserRole).toString(); - if (modelName.contains(text, Qt::CaseInsensitive)) - { - child->setHidden(false); - } - else - { - child->setHidden(true); - } - } - } - }); - - // make sure the text box gets focus so the user doesn't have to click on it - txtBox->setFocus(); - modelMenu.exec(event->globalPos()); } diff --git a/src/ModelSelectionWidget.cpp b/src/ModelSelectionWidget.cpp new file mode 100644 index 000000000..a5a644405 --- /dev/null +++ b/src/ModelSelectionWidget.cpp @@ -0,0 +1,97 @@ +#include "ModelSelectionWidget.hpp" + +#include + +#include +#include +#include +#include + +#include + +using QtNodes::DataModelRegistry; +using QtNodes::ModelSelectionWidget; + + +static auto const SkipText = QStringLiteral("skip me"); + + +ModelSelectionWidget:: +ModelSelectionWidget(DataModelRegistry& registry, QWidget* parent) + : QWidget(parent) +{ + + // Add filterbox to the context menu + auto* filter = new QLineEdit(this); + + filter->setPlaceholderText(QStringLiteral("Filter")); + filter->setClearButtonEnabled(true); + + auto* filterAction = new QWidgetAction(this); + filterAction->setDefaultWidget(filter); + + addAction(filterAction); + + // Add result treeview to the context menu + auto* treeView = new QTreeWidget(this); + treeView->header()->close(); + + auto* treeViewAction = new QWidgetAction(this); + treeViewAction->setDefaultWidget(treeView); + + addAction(treeViewAction); + + QMap topLevelItems; + for (auto const& cat : registry.categoriesOrder()) + { + auto item = new QTreeWidgetItem(treeView); + item->setText(0, cat); + item->setData(0, Qt::UserRole, SkipText); + topLevelItems[cat] = item; + } + + auto const& assocCategory = registry.registeredModelsCategoryAssociation(); + for (auto const& name : registry.registeredModelsOrder()) + { + auto topLevelParent = topLevelItems[assocCategory.at(name)]; + auto item = new QTreeWidgetItem(topLevelParent); + item->setText(0, name); + item->setData(0, Qt::UserRole, name); + } + + treeView->expandAll(); + + connect(treeView, &QTreeWidget::itemClicked, this, [this](QTreeWidgetItem* item) { + QString modelName = item->data(0, Qt::UserRole).toString(); + + if (modelName == SkipText) + { + return; + } + + emit modelSelected(modelName); + }); + + // Setup filtering + connect(filter, &QLineEdit::textChanged, [topLevelItems = std::move(topLevelItems)](const QString& text) { + for (auto& topLvlItem : topLevelItems) + { + for (int i = 0; i < topLvlItem->childCount(); ++i) + { + auto child = topLvlItem->child(i); + auto modelName = child->data(0, Qt::UserRole).toString(); + if (modelName.contains(text, Qt::CaseInsensitive)) + { + child->setHidden(false); + } + else + { + child->setHidden(true); + } + } + } + }); + + // make sure the text box gets focus so the user doesn't have to click on it + filter->setFocus(); +} diff --git a/src/ModelSelectionWidget.hpp b/src/ModelSelectionWidget.hpp new file mode 100644 index 000000000..befb31572 --- /dev/null +++ b/src/ModelSelectionWidget.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +namespace QtNodes +{ + +class DataModelRegistry; + +class ModelSelectionWidget : public QWidget +{ + Q_OBJECT + +public: + explicit ModelSelectionWidget(DataModelRegistry& registry, QWidget* parent = Q_NULLPTR); + +signals: + void + modelSelected(QString modelName); +}; + +} From 7e098e4dd53ab1cfd3a6642471d627d3bb21d3e1 Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Wed, 30 May 2018 15:24:18 -0700 Subject: [PATCH 4/7] add test that models within a category are in the order of insertion --- src/ModelSelectionWidget.cpp | 5 ++ test/CMakeLists.txt | 1 + test/include/Stringify.hpp | 11 +++++ test/src/TestModelSelectionWidget.cpp | 70 +++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 test/src/TestModelSelectionWidget.cpp diff --git a/src/ModelSelectionWidget.cpp b/src/ModelSelectionWidget.cpp index a5a644405..d7bf30ad8 100644 --- a/src/ModelSelectionWidget.cpp +++ b/src/ModelSelectionWidget.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -20,6 +21,8 @@ ModelSelectionWidget:: ModelSelectionWidget(DataModelRegistry& registry, QWidget* parent) : QWidget(parent) { + auto* layout = new QVBoxLayout(this); + setLayout(layout); // Add filterbox to the context menu auto* filter = new QLineEdit(this); @@ -31,6 +34,7 @@ ModelSelectionWidget(DataModelRegistry& registry, QWidget* parent) filterAction->setDefaultWidget(filter); addAction(filterAction); + layout->addWidget(filter); // Add result treeview to the context menu auto* treeView = new QTreeWidget(this); @@ -40,6 +44,7 @@ ModelSelectionWidget(DataModelRegistry& registry, QWidget* parent) treeViewAction->setDefaultWidget(treeView); addAction(treeViewAction); + layout->addWidget(treeView); QMap topLevelItems; for (auto const& cat : registry.categoriesOrder()) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d93b391f2..cfd4ceee6 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(test_nodes test_main.cpp src/test_dragging.cpp src/TestDataModelRegistry.cpp + src/TestModelSelectionWidget.cpp src/TestNodeGraphicsObject.cpp ) diff --git a/test/include/Stringify.hpp b/test/include/Stringify.hpp index f6f349524..dee051e30 100644 --- a/test/include/Stringify.hpp +++ b/test/include/Stringify.hpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -28,4 +29,14 @@ struct StringMaker return std::string(QTest::toString(p)); } }; + +template <> +struct StringMaker +{ + static std::string + convert(QString const& str) + { + return str.toStdString(); + } +}; } diff --git a/test/src/TestModelSelectionWidget.cpp b/test/src/TestModelSelectionWidget.cpp new file mode 100644 index 000000000..237ec27b2 --- /dev/null +++ b/test/src/TestModelSelectionWidget.cpp @@ -0,0 +1,70 @@ +#include "ModelSelectionWidget.hpp" + +#include + +#include +#include +#include + +#include + +#include "ApplicationSetup.hpp" +#include "Stringify.hpp" +#include "StubNodeDataModel.hpp" + +using QtNodes::DataModelRegistry; +using QtNodes::ModelSelectionWidget; + +#include +#include + +TEST_CASE("ModelSelectionWidget models order (within a category)", "[gui]") +{ + class StubModel : public StubNodeDataModel + { + public: + StubModel(QString modelName) + : modelName(modelName) + { + } + + QString + name() const override + { + return modelName; + } + + QString modelName; + }; + + auto setup = applicationSetup(); + + DataModelRegistry registry; + registry.registerModel([] { + return std::make_unique("a"); + }); + registry.registerModel([] { + return std::make_unique("c"); + }); + registry.registerModel([] { + return std::make_unique("b"); + }); + + auto widget = std::make_unique(registry); + + auto tree = widget->findChild(); + + { + INFO("Test out of date. ModelSelectionWidget doesn't use QTreeWidget"); + REQUIRE(tree != nullptr); + } + + REQUIRE(tree->topLevelItemCount() == 1); + + QTreeWidgetItem* mainCategory = tree->topLevelItem(0); + + REQUIRE(mainCategory->childCount() == 3); + CHECK(mainCategory->child(0)->data(0, Qt::UserRole).toString().toStdString() == "a"); + CHECK(mainCategory->child(1)->data(0, Qt::UserRole).toString().toStdString() == "c"); + CHECK(mainCategory->child(2)->data(0, Qt::UserRole).toString().toStdString() == "b"); +} From 89389237250447109ee75cbbd1904c245f3b2bd9 Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Wed, 30 May 2018 15:38:21 -0700 Subject: [PATCH 5/7] add test that categories are kept in the order of insertion --- test/src/TestModelSelectionWidget.cpp | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/test/src/TestModelSelectionWidget.cpp b/test/src/TestModelSelectionWidget.cpp index 237ec27b2..7f0bb7fe9 100644 --- a/test/src/TestModelSelectionWidget.cpp +++ b/test/src/TestModelSelectionWidget.cpp @@ -68,3 +68,74 @@ TEST_CASE("ModelSelectionWidget models order (within a category)", "[gui]") CHECK(mainCategory->child(1)->data(0, Qt::UserRole).toString().toStdString() == "c"); CHECK(mainCategory->child(2)->data(0, Qt::UserRole).toString().toStdString() == "b"); } + +#include +#include + +TEST_CASE("ModelSelectionWidget category order", "[gui]") +{ + auto setup = applicationSetup(); + + DataModelRegistry registry; + + registry.registerModel("Category A", [] { + auto result = std::make_unique(); + + result->name("A"); + + return result; + }); + + registry.registerModel("Category C", [] { + auto result = std::make_unique(); + + result->name("C"); + + return result; + }); + + registry.registerModel("Category B", [] { + auto result = std::make_unique(); + + result->name("B"); + + return result; + }); + + SECTION("unsorted categories") + { + auto widget = std::make_unique(registry); + + auto tree = widget->findChild(); + + { + INFO("Test out of date. ModelSelectionWidget doesn't use QTreeWidget"); + REQUIRE(tree != nullptr); + } + + REQUIRE(tree->topLevelItemCount() == 3); + + CHECK(tree->topLevelItem(0)->text(0).toStdString() == "Category A"); + CHECK(tree->topLevelItem(1)->text(0).toStdString() == "Category C"); + CHECK(tree->topLevelItem(2)->text(0).toStdString() == "Category B"); + } + SECTION("sorted categories") + { + registry.sortCategories(); + + auto widget = std::make_unique(registry); + + auto tree = widget->findChild(); + + { + INFO("Test out of date. ModelSelectionWidget doesn't use QTreeWidget"); + REQUIRE(tree != nullptr); + } + + REQUIRE(tree->topLevelItemCount() == 3); + + CHECK(tree->topLevelItem(0)->text(0).toStdString() == "Category A"); + CHECK(tree->topLevelItem(1)->text(0).toStdString() == "Category B"); + CHECK(tree->topLevelItem(2)->text(0).toStdString() == "Category C"); + } +} From aad81533d9f1c4aec1884ae4de78f571c901e0d4 Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Wed, 30 May 2018 15:53:25 -0700 Subject: [PATCH 6/7] Make conforming to earlier versions of Qt (the qAsConst was completely useless in this case --- src/FlowView.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/FlowView.cpp b/src/FlowView.cpp index 1274f25ee..5f34d6a05 100644 --- a/src/FlowView.cpp +++ b/src/FlowView.cpp @@ -119,8 +119,7 @@ contextMenuEvent(QContextMenuEvent* event) auto* modelSelectionWidget = new ModelSelectionWidget(_scene->registry(), &modelMenu); - // Avoid accidental detach by using qAsConst - for (QAction* action : qAsConst(modelSelectionWidget)->actions()) + for (QAction* action : modelSelectionWidget->actions()) { modelMenu.addAction(action); } From ad58b9f40cf6ba78e88a2f90bbe66bcd660abcab Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Thu, 31 May 2018 10:18:17 -0700 Subject: [PATCH 7/7] Export ModelSelectionWidget so that it can be used in the tests on Windows --- src/ModelSelectionWidget.hpp | 4 +++- test/CMakeLists.txt | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ModelSelectionWidget.hpp b/src/ModelSelectionWidget.hpp index befb31572..cc37600be 100644 --- a/src/ModelSelectionWidget.hpp +++ b/src/ModelSelectionWidget.hpp @@ -4,12 +4,14 @@ #include #include +#include "Export.hpp" + namespace QtNodes { class DataModelRegistry; -class ModelSelectionWidget : public QWidget +class NODE_EDITOR_PUBLIC ModelSelectionWidget : public QWidget { Q_OBJECT diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cfd4ceee6..368a1fd58 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,9 +11,8 @@ add_executable(test_nodes target_include_directories(test_nodes PRIVATE - ../src - ../include/internal include + $ ) target_link_libraries(test_nodes