diff --git a/GUI/coregui/Models/SessionItemUtils.cpp b/GUI/coregui/Models/SessionItemUtils.cpp index 95baba76496e73c28c5a8a6ea92d6a8f741a75a4..ec20618c0f78a49666b185d190e5cabf6b100e12 100644 --- a/GUI/coregui/Models/SessionItemUtils.cpp +++ b/GUI/coregui/Models/SessionItemUtils.cpp @@ -42,3 +42,21 @@ void SessionItemUtils::SetVectorItem(const SessionItem& item, const QString& nam p_vector_item->setItemValue(VectorItem::P_Y, value.y()); p_vector_item->setItemValue(VectorItem::P_Z, value.z()); } + +int SessionItemUtils::ParentVisibleRow(const SessionItem& item) +{ + int result(-1); + + if (!item.parent() || !item.isVisible()) + return result; + + for(auto child : item.parent()->children()) { + if (child->isVisible()) + ++result; + + if (&item == child) + return result; + } + + return result; +} diff --git a/GUI/coregui/Models/SessionItemUtils.h b/GUI/coregui/Models/SessionItemUtils.h index 81ef1ce36168b683f5bc19073381bbe87dbfb19b..772753890a659a7e5196e7228b6f4f223fe63f89 100644 --- a/GUI/coregui/Models/SessionItemUtils.h +++ b/GUI/coregui/Models/SessionItemUtils.h @@ -28,11 +28,17 @@ namespace SessionItemUtils //! Returns the index of the given item within its parent. Returns -1 when no parent is set. BA_CORE_API_ int ParentRow(const SessionItem& item); -//! Returns a VectorType group property's value as a kvector_t +//! Returns a VectorType group property's value as a kvector_t. BA_CORE_API_ kvector_t GetVectorItem(const SessionItem& item, const QString& name); -//! Returns a VectorType group property's value as a kvector_t +//! Returns a VectorType group property's value as a kvector_t. BA_CORE_API_ void SetVectorItem(const SessionItem& item, const QString& name, kvector_t value); + +//! Returns the row of the given item within its parent not accounting for all hidden items +//! above. Returns -1 when no parent set or item is hidden. + +BA_CORE_API_ int ParentVisibleRow(const SessionItem& item); + } // namespace SessionItemUtils #endif // SESSIONITEMUTILS_H diff --git a/Tests/UnitTests/GUI/TestGUI.cpp b/Tests/UnitTests/GUI/TestGUI.cpp index 96afb70d414aff2c5cf6366cc8a35090ffc7fb58..9d4f27e388a044c94954a7bed2b8fc9de1fcf389 100644 --- a/Tests/UnitTests/GUI/TestGUI.cpp +++ b/Tests/UnitTests/GUI/TestGUI.cpp @@ -34,6 +34,7 @@ #include "TestModelUtils.h" #include "TestComponentProxyModel.h" #include "TestProxyModelStrategy.h" +#include "TestSessionItemUtils.h" #include <memory> class GUITestFactory { @@ -99,6 +100,7 @@ int main(int argc, char** argv) { tests.add<TestModelUtils>(); tests.add<TestComponentProxyModel>(); tests.add<TestProxyModelStrategy>(); + tests.add<TestSessionItemUtils>(); return tests.runAll(argc, argv); } diff --git a/Tests/UnitTests/GUI/TestSessionItemUtils.h b/Tests/UnitTests/GUI/TestSessionItemUtils.h new file mode 100644 index 0000000000000000000000000000000000000000..6bc3496bbf0da7ed8cc5727ee7b49a19912abbc7 --- /dev/null +++ b/Tests/UnitTests/GUI/TestSessionItemUtils.h @@ -0,0 +1,56 @@ +#include <QtTest> +#include "SessionItemUtils.h" +#include "SessionModel.h" +#include "SessionItem.h" +#include "VectorItem.h" +#include "item_constants.h" + +class TestSessionItemUtils : public QObject +{ + Q_OBJECT +public: + +private slots: + void test_ParentVisibleRow(); +}; + +//! Test SessionItemUtils::ParentVisibleRow utility method. + +inline void TestSessionItemUtils::test_ParentVisibleRow() +{ + SessionModel model("TestModel"); + + // 3 property items in root, all visible + auto item1 = model.insertNewItem(Constants::PropertyType); + auto item2 = model.insertNewItem(Constants::PropertyType); + auto item3 = model.insertNewItem(Constants::PropertyType); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item1), 0); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item2), 1); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item3), 2); + + // one item become invisible + item2->setVisible(false); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item1), 0); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item2), -1); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item3), 1); + + // two more items + auto item4 = model.insertNewItem(Constants::PropertyType); + auto item5 = model.insertNewItem(Constants::PropertyType); + item5->setVisible(false); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item1), 0); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item2), -1); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item3), 1); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item4), 2); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*item5), -1); + + // adding vector item + SessionItem* vector = model.insertNewItem(Constants::VectorType); + auto x = vector->getItem(VectorItem::P_X); + auto y = vector->getItem(VectorItem::P_Y); + auto z = vector->getItem(VectorItem::P_Z); + x->setVisible(false); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*x), -1); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*y), 0); + QCOMPARE(SessionItemUtils::ParentVisibleRow(*z), 1); +}