34 #include <QJsonObject>
69 QModelIndex labelIndex = viewModel.
index(0, 0);
70 QModelIndex dataIndex = viewModel.
index(0, 1);
74 ASSERT_TRUE(labelItem !=
nullptr);
75 EXPECT_EQ(labelItem->item(), propertyItem);
78 ASSERT_TRUE(dataItem !=
nullptr);
79 EXPECT_EQ(dataItem->item(), propertyItem);
96 QModelIndex labelIndex = viewModel.
index(0, 0);
97 QModelIndex dataIndex = viewModel.
index(0, 1);
101 ASSERT_TRUE(labelItem !=
nullptr);
102 EXPECT_EQ(labelItem->item(), propertyItem);
107 ASSERT_TRUE(dataItem !=
nullptr);
123 QModelIndex labelIndex = viewModel.
index(0, 0);
124 QModelIndex dataIndex = viewModel.
index(0, 1);
144 QModelIndex labelIndex = viewModel.
index(0, 0);
145 QModelIndex dataIndex = viewModel.
index(0, 1);
147 QModelIndexList expected{labelIndex, dataIndex};
160 auto views = viewModel.
findViews(propertyItem);
175 QModelIndex dataIndex = viewModel.
index(0, 1);
177 QSignalSpy spyDataChanged(&viewModel, &DefaultViewModel::dataChanged);
179 propertyItem->setData(50.0);
180 EXPECT_EQ(spyDataChanged.count(), 1);
183 QList<QVariant> arguments = spyDataChanged.takeFirst();
184 EXPECT_EQ(arguments.size(), 3);
185 EXPECT_EQ(arguments.at(0).value<QModelIndex>(), dataIndex);
186 EXPECT_EQ(arguments.at(1).value<QModelIndex>(), dataIndex);
187 QVector<int> expectedRoles = {Qt::DisplayRole, Qt::EditRole};
188 EXPECT_EQ(arguments.at(2).value<QVector<int>>(), expectedRoles);
198 QSignalSpy spyInsert(&viewModel, &DefaultViewModel::rowsInserted);
209 EXPECT_EQ(spyInsert.count(), 1);
213 QList<QVariant> arguments = spyInsert.takeFirst();
214 EXPECT_EQ(arguments.size(), 3);
215 EXPECT_EQ(arguments.at(0).value<QModelIndex>(), QModelIndex());
216 EXPECT_EQ(arguments.at(1).value<
int>(), 0);
217 EXPECT_EQ(arguments.at(2).value<
int>(), 0);
233 EXPECT_EQ(viewModel.rowCount(), 1);
234 EXPECT_EQ(viewModel.columnCount(), 2);
236 QSignalSpy spyRemove(&viewModel, &DefaultViewModel::rowsRemoved);
240 ASSERT_EQ(spyRemove.count(), 1);
241 EXPECT_EQ(viewModel.rowCount(), 0);
242 EXPECT_EQ(viewModel.columnCount(), 0);
244 QList<QVariant> arguments = spyRemove.takeFirst();
245 ASSERT_EQ(arguments.size(), 3);
246 EXPECT_EQ(arguments.at(0).value<QModelIndex>(), QModelIndex());
247 EXPECT_EQ(arguments.at(1).value<
int>(), 0);
248 EXPECT_EQ(arguments.at(2).value<
int>(), 0);
265 EXPECT_EQ(viewModel.rowCount(), 2);
266 EXPECT_EQ(viewModel.columnCount(), 2);
268 QSignalSpy spyRemove(&viewModel, &DefaultViewModel::rowsRemoved);
269 QSignalSpy spyInsert(&viewModel, &DefaultViewModel::rowsInserted);
275 EXPECT_EQ(spyRemove.count(), 1);
276 EXPECT_EQ(viewModel.rowCount(), 1);
277 EXPECT_EQ(viewModel.columnCount(), 2);
280 EXPECT_EQ(spyInsert.count(), 0);
282 QList<QVariant> arguments = spyRemove.takeFirst();
283 EXPECT_EQ(arguments.size(), 3);
284 EXPECT_EQ(arguments.at(0).value<QModelIndex>(), QModelIndex());
285 EXPECT_EQ(arguments.at(1).value<
int>(), 0);
286 EXPECT_EQ(arguments.at(2).value<
int>(), 0);
302 item2->setEnabled(
false);
307 item3->setEditable(
false);
317 EXPECT_FALSE(viewModel.
flags(viewModel.
index(0, 0)) & Qt::ItemIsEditable);
318 EXPECT_TRUE(viewModel.
flags(viewModel.
index(0, 1)) & Qt::ItemIsEditable);
321 EXPECT_FALSE(viewModel.
flags(viewModel.
index(1, 0)) & Qt::ItemIsEditable);
322 EXPECT_FALSE(viewModel.
flags(viewModel.
index(1, 1)) & Qt::ItemIsEditable);
325 EXPECT_FALSE(viewModel.
flags(viewModel.
index(2, 0)) & Qt::ItemIsEditable);
326 EXPECT_FALSE(viewModel.
flags(viewModel.
index(2, 1)) & Qt::ItemIsEditable);
343 QSignalSpy spyDataChanged(&viewModel, &DefaultViewModel::dataChanged);
346 item->setEnabled(
false);
347 EXPECT_EQ(spyDataChanged.count(), 2);
350 QList<QVariant> arguments = spyDataChanged.takeFirst();
351 EXPECT_EQ(arguments.size(), 3);
352 auto index1 = arguments.at(0).value<QModelIndex>();
353 auto index2 = arguments.at(1).value<QModelIndex>();
354 auto roles = arguments.at(2).value<QVector<int>>();
357 #if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
362 EXPECT_EQ(roles, expected_roles);
365 arguments = spyDataChanged.takeFirst();
366 EXPECT_EQ(arguments.size(), 3);
367 index1 = arguments.at(0).value<QModelIndex>();
368 index2 = arguments.at(1).value<QModelIndex>();
369 roles = arguments.at(2).value<QVector<int>>();
373 #if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
379 EXPECT_EQ(roles, expected_roles);
391 item->setToolTip(
"abc");
401 QSignalSpy spyDataChanged(&viewModel, &DefaultViewModel::dataChanged);
404 item->setToolTip(
"abc2");
405 EXPECT_EQ(spyDataChanged.count(), 2);
408 QList<QVariant> arguments = spyDataChanged.takeFirst();
409 EXPECT_EQ(arguments.size(), 3);
410 auto index1 = arguments.at(0).value<QModelIndex>();
411 auto index2 = arguments.at(1).value<QModelIndex>();
412 auto roles = arguments.at(2).value<QVector<int>>();
416 EXPECT_EQ(roles, expected_roles);
419 arguments = spyDataChanged.takeFirst();
420 EXPECT_EQ(arguments.size(), 3);
421 index1 = arguments.at(0).value<QModelIndex>();
422 index2 = arguments.at(1).value<QModelIndex>();
423 roles = arguments.at(2).value<QVector<int>>();
428 EXPECT_EQ(roles, expected_roles);
438 QSignalSpy spyAboutReset(&viewModel, &DefaultViewModel::modelAboutToBeReset);
439 QSignalSpy spyReset(&viewModel, &DefaultViewModel::modelReset);
448 EXPECT_EQ(spyAboutReset.count(), 1);
449 EXPECT_EQ(spyReset.count(), 1);
468 EXPECT_EQ(viewModel.rowCount(), 1);
469 EXPECT_EQ(viewModel.columnCount(), 2);
471 QSignalSpy spyAboutReset(&viewModel, &DefaultViewModel::modelAboutToBeReset);
472 QSignalSpy spyReset(&viewModel, &DefaultViewModel::modelReset);
473 viewModel.setRootSessionItem(item);
476 EXPECT_EQ(viewModel.rowCount(), 0);
477 EXPECT_EQ(viewModel.columnCount(), 0);
479 EXPECT_EQ(spyAboutReset.count(), 1);
480 EXPECT_EQ(spyReset.count(), 1);
483 EXPECT_THROW(viewModel.setRootSessionItem(
nullptr), std::runtime_error);
487 EXPECT_THROW(viewModel.setRootSessionItem(model2.
rootItem()), std::runtime_error);
508 auto index_of_vector_item = viewModel.
index(1, 0);
509 EXPECT_EQ(viewModel.
rowCount(index_of_vector_item), 3);
510 EXPECT_EQ(viewModel.
columnCount(index_of_vector_item), 2);
521 viewModel.setRootSessionItem(vectorItem);
523 EXPECT_EQ(viewModel.rowCount(), 3);
524 EXPECT_EQ(viewModel.columnCount(), 2);
531 auto model = std::make_unique<SessionModel>();
538 QSignalSpy spyAboutReset(&viewModel, &DefaultViewModel::modelAboutToBeReset);
539 QSignalSpy spyReset(&viewModel, &DefaultViewModel::modelReset);
542 EXPECT_EQ(viewModel.rowCount(), 0);
543 EXPECT_EQ(viewModel.columnCount(), 0);
545 EXPECT_EQ(spyAboutReset.count(), 1);
546 EXPECT_EQ(spyReset.count(), 1);
553 auto model = std::make_unique<SessionModel>();
557 EXPECT_EQ(viewModel.rowCount(), 1);
558 EXPECT_EQ(viewModel.columnCount(), 2);
561 EXPECT_EQ(viewModel.rowCount(), 0);
562 EXPECT_EQ(viewModel.columnCount(), 0);
574 EXPECT_EQ(viewModel.rowCount(), 1);
575 EXPECT_EQ(viewModel.columnCount(), 2);
578 QModelIndex vectorIndex = viewModel.index(0, 0);
581 EXPECT_EQ(viewModel.rowCount(vectorIndex), 3);
582 EXPECT_EQ(viewModel.columnCount(vectorIndex), 2);
586 dynamic_cast<ViewLabelItem*
>(viewModel.itemFromIndex(viewModel.index(0, 0, vectorIndex)));
588 dynamic_cast<ViewDataItem*
>(viewModel.itemFromIndex(viewModel.index(0, 1, vectorIndex)));
594 dynamic_cast<ViewLabelItem*
>(viewModel.itemFromIndex(viewModel.index(1, 0, vectorIndex)));
596 dynamic_cast<ViewDataItem*
>(viewModel.itemFromIndex(viewModel.index(1, 1, vectorIndex)));
602 dynamic_cast<ViewLabelItem*
>(viewModel.itemFromIndex(viewModel.index(2, 0, vectorIndex)));
604 dynamic_cast<ViewDataItem*
>(viewModel.itemFromIndex(viewModel.index(2, 1, vectorIndex)));
617 EXPECT_EQ(viewModel.headerData(0, Qt::Horizontal, Qt::DisplayRole).toString(), QString(
"Name"));
618 EXPECT_EQ(viewModel.headerData(1, Qt::Horizontal, Qt::DisplayRole).toString(),
635 object = converter.to_json(model);
644 QSignalSpy spyInsert(&viewmodel, &DefaultViewModel::rowsInserted);
645 QSignalSpy spyRemove(&viewmodel, &DefaultViewModel::rowsRemoved);
646 QSignalSpy spyAboutReset(&viewmodel, &DefaultViewModel::modelAboutToBeReset);
647 QSignalSpy spyReset(&viewmodel, &DefaultViewModel::modelReset);
651 EXPECT_EQ(spyInsert.count(), 1);
652 EXPECT_EQ(spyRemove.count(), 0);
653 EXPECT_EQ(spyAboutReset.count(), 1);
654 EXPECT_EQ(spyReset.count(), 1);
671 document.
save(fileName);
682 QSignalSpy spyInsert(&viewmodel, &DefaultViewModel::rowsInserted);
683 QSignalSpy spyRemove(&viewmodel, &DefaultViewModel::rowsRemoved);
684 QSignalSpy spyAboutReset(&viewmodel, &DefaultViewModel::modelAboutToBeReset);
685 QSignalSpy spyReset(&viewmodel, &DefaultViewModel::modelReset);
687 document.load(fileName);
689 EXPECT_EQ(spyInsert.count(), 0);
690 EXPECT_EQ(spyRemove.count(), 0);
691 EXPECT_EQ(spyAboutReset.count(), 1);
692 EXPECT_EQ(spyReset.count(), 1);
710 document.save(fileName);
721 QSignalSpy spyInsert(&viewmodel, &DefaultViewModel::rowsInserted);
722 QSignalSpy spyRemove(&viewmodel, &DefaultViewModel::rowsRemoved);
723 QSignalSpy spyAboutReset(&viewmodel, &DefaultViewModel::modelAboutToBeReset);
724 QSignalSpy spyReset(&viewmodel, &DefaultViewModel::modelReset);
726 document.load(fileName);
728 EXPECT_EQ(spyInsert.count(), 1);
729 EXPECT_EQ(spyRemove.count(), 0);
730 EXPECT_EQ(spyAboutReset.count(), 1);
731 EXPECT_EQ(spyReset.count(), 1);
750 EXPECT_EQ(viewmodel.rowCount(), 1);
751 EXPECT_EQ(viewmodel.columnCount(), 2);
754 document.
save(fileName);
759 QSignalSpy spyInsert(&viewmodel, &DefaultViewModel::rowsInserted);
760 QSignalSpy spyRemove(&viewmodel, &DefaultViewModel::rowsRemoved);
761 QSignalSpy spyAboutReset(&viewmodel, &DefaultViewModel::modelAboutToBeReset);
762 QSignalSpy spyReset(&viewmodel, &DefaultViewModel::modelReset);
764 document.load(fileName);
766 EXPECT_EQ(spyInsert.count(), 4);
767 EXPECT_EQ(spyRemove.count(), 0);
768 EXPECT_EQ(spyAboutReset.count(), 1);
769 EXPECT_EQ(spyReset.count(), 1);
771 EXPECT_EQ(viewmodel.rowCount(), 1);
772 EXPECT_EQ(viewmodel.columnCount(), 2);
788 viewmodel.setRootSessionItem(vectorItem);
791 EXPECT_EQ(viewmodel.rowCount(), 3);
792 EXPECT_EQ(viewmodel.columnCount(), 2);
793 EXPECT_EQ(viewmodel.rootSessionItem(), vectorItem);
796 document.
save(fileName);
800 QSignalSpy spyInsert(&viewmodel, &DefaultViewModel::rowsInserted);
801 QSignalSpy spyRemove(&viewmodel, &DefaultViewModel::rowsRemoved);
802 QSignalSpy spyAboutReset(&viewmodel, &DefaultViewModel::modelAboutToBeReset);
803 QSignalSpy spyReset(&viewmodel, &DefaultViewModel::modelReset);
805 document.load(fileName);
807 EXPECT_EQ(spyInsert.count(), 3);
808 EXPECT_EQ(spyRemove.count(), 0);
809 EXPECT_EQ(spyAboutReset.count(), 1);
810 EXPECT_EQ(spyReset.count(), 1);
814 EXPECT_EQ(viewmodel.rowCount(), 3);
815 EXPECT_EQ(viewmodel.columnCount(), 2);
829 data_item->setValues(std::vector<double>({1.0, 2.0, 3.0}));
834 graph_item->setDataItem(data_item);
841 QModelIndex graph_index = viewmodel.
index(2, 0);
843 ASSERT_TRUE(graphLabel !=
nullptr);
844 EXPECT_EQ(graphLabel->item(), graph_item);
Convenience class which creates a directory on disk for test content.
Complex item holding mixed SessionItem types (single properties and other CompountItems).
T * addProperty(const std::string &name)
Adds property item of given type.
Simple container to store any type of children.
Represents one-dimensional data (axis and values).
View model to show content of SessionModel in Qt widgets: two column tree with label/data.
Item to represent fixed bin axis.
One-dimensional graph representation of Data1DItem.
2D viewport specialized for showing multiple GraphItem's.
Saves and restores list of SessionModel's to/from disk using json format.
void save(const std::string &file_name) const override
Saves models on disk.
Converter of SessionModel to/from json object with posibility to select one of convertion modes.
void from_json(const QJsonObject &json, SessionModel &model) const override
Reads json object and build the model.
Item to carry concrete editable entity (e.g.
The main object representing an editable/displayable/serializable entity.
bool setData(const T &value, int role=ItemDataRole::DATA, bool direct=false)
Sets data for a given role.
SessionItem * parent() const
Returns parent item. Will return nullptr if item doesn't have a parent.
std::vector< SessionItem * > children() const
Returns vector of children formed from all chidlren from all tags.
bool insertItem(SessionItem *item, const TagRow &tagrow)
Insert item into given tag under the given row.
TagRow tagRow() const
Returns TagRow of this item under which it is accessible through its parent.
Main class to hold hierarchy of SessionItem objects.
SessionItem * rootItem() const
Returns root item of the model.
T * insertItem(SessionItem *parent=nullptr, const TagRow &tagrow={})
Inserts item into given parent under given tagrow.
void clear(std::function< void(SessionItem *)> callback={})
Removes all items from the model.
void removeItem(SessionItem *parent, const TagRow &tagrow)
Removes given row from parent.
Vector item with three x,y,z property items.
static const std::string P_X
static const std::string P_Z
static const std::string P_Y
Represents data role of SessionItem in any cell of Qt's trees and tables.
Represents display name of SessionItem in any cell of Qt's trees and tables.
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
Returns the item flags for the given index.
QModelIndex indexFromItem(const ViewItem *item) const
Returns the QModelIndex associated with the given item.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
ViewItem * itemFromIndex(const QModelIndex &index) const
Returns a pointer to the RefViewItem associated with the given index.
QModelIndexList indexOfSessionItem(const SessionItem *item) const
Returns list of model indices representing given SessionItem.
void setRootSessionItem(SessionItem *item)
SessionItem * sessionItemFromIndex(const QModelIndex &index) const
std::vector< ViewItem * > findViews(const ModelView::SessionItem *item) const
Returns vector of all ViewItem's representing given SessionItem.
TEST_F(DefaultViewModelTest, initialState)
MVVM_VIEWMODEL_EXPORT QVariant TextColorRole(const SessionItem &item)
Returns text color for given item.
materialitems.h Collection of materials to populate MaterialModel.
@ project
selective copying for saving/loading the project (tags and data created by item, updated from JSON)
QVariant ToolTipRole(const SessionItem &item, int ncol=0)
Returns tooltip for given item.
QVariant ForegroundRole(const SessionItem &item)
Returns text color for given item.
std::string TestFileName(const std::string &test_sub_dir, const std::string &file_name)
Returns full path to the file in test directory.