Skip to content
Snippets Groups Projects
Commit 25a34b9a authored by Pospelov, Gennady's avatar Pospelov, Gennady
Browse files

Merge branch 'GUIFixes' into RefactoringSessionModel

parents ea47290f ed77b3e0
No related branches found
No related tags found
No related merge requests found
......@@ -48,7 +48,7 @@ QMap<QString, QString > init_NameToRegistry()
//result["example09"] = "BoxCompositionRotateZandYBuilder";
//result["example09"] = "CoreShellBoxRotateZandYBuilder";
//result["example09"] = "BoxStackCompositionBuilder";
result["example09"] = "CoreShellBoxRotateZandYBuilder";
result["example09"] = "CylindersWithSizeDistributionBuilder";
return result;
......
......@@ -55,6 +55,11 @@ void ModelMapper::setOnChildrenChange(std::function<void ()> f)
m_onChildrenChange.push_back(f);
}
void ModelMapper::setOnSiblingsChange(std::function<void ()> f)
{
m_onSiblingsChange.push_back(f);
}
void ModelMapper::setModel(SessionModel *model)
{
if (m_model) {
......@@ -86,6 +91,33 @@ int ModelMapper::nestlingDepth(SessionItem *item, int level)
}
void ModelMapper::callOnParentChange(SessionItem *new_parent)
{
if (m_active && m_onParentChange.size() > 0) {
for (auto f : m_onParentChange) {
f(new_parent);
}
}
}
void ModelMapper::callOnChildrenChange()
{
if (m_active && m_onChildrenChange.size() > 0) {
for (auto f : m_onChildrenChange) {
f();
}
}
}
void ModelMapper::callOnSiblingsChange()
{
if (m_active && m_onSiblingsChange.size() > 0) {
for (auto f : m_onSiblingsChange) {
f();
}
}
}
void ModelMapper::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
const QVector<int> &roles)
{
......@@ -128,61 +160,54 @@ void ModelMapper::onDataChanged(const QModelIndex &topLeft, const QModelIndex &b
void ModelMapper::onRowsInserted(const QModelIndex &parent, int first, int last)
{
if (parent.isValid()) {
if (SessionItem *newChild = m_model->itemForIndex(parent.child(first, 0))) {
if (m_item == newChild) {
if (m_active && m_onParentChange.size() > 0) {
for (auto f : m_onParentChange) {
f(m_model->itemForIndex(parent));
}
}
if(!parent.isValid()) return;
// if (m_active && m_onChildrenChange.size() > 0) {
// for (auto f : m_onChildrenChange) {
// f();
// }
// }
}
if (SessionItem *newChild = m_model->itemForIndex(parent.child(first, 0))) {
if (m_item == newChild) {
callOnParentChange(m_model->itemForIndex(parent));
}
else if(m_item == newChild->parent()) {
if (m_active && m_onChildrenChange.size() > 0) {
for (auto f : m_onChildrenChange) {
f();
}
}
}
else if(m_item == newChild->parent()) {
callOnChildrenChange();
}
// inform siblings about the change
// FIXME SessionItems with invalid parent index (i.e. IView's located on top of graphics scene like ParticleView) should be also notified to update the label
if(SessionItem *parent = newChild->parent()) {
// QVector<SessionItem *> items = parent->getItems(parent->tagFromItem(newChild));
QVector<SessionItem *> items = parent->getChildrenOfType(newChild->modelType());
foreach(SessionItem *sibling, items) {
if(m_item == sibling) callOnSiblingsChange();
}
}
}
}
void ModelMapper::onBeginRemoveRows(const QModelIndex &parent, int first, int last)
{
if (parent.isValid()) {
if (SessionItem *newChild = m_model->itemForIndex(parent.child(first, 0))) {
if (m_item == newChild) {
if (m_active && m_onParentChange.size() > 0) {
for (auto f : m_onParentChange) {
f(nullptr);
}
}
// if (m_active && m_onChildrenChange.size() > 0) {
// for (auto f : m_onChildrenChange) {
// f();
// }
// }
}
if(!parent.isValid()) return;
else if(m_item == newChild->parent()) {
if (m_active && m_onChildrenChange.size() > 0) {
for (auto f : m_onChildrenChange) {
f();
}
}
}
if (SessionItem *newChild = m_model->itemForIndex(parent.child(first, 0))) {
if (m_item == newChild) {
callOnParentChange(nullptr);
}
else if(m_item == newChild->parent()) {
callOnChildrenChange();
}
// inform siblings about the change
if(SessionItem *parent = newChild->parent()) {
// QVector<SessionItem *> items = parent->getItems(parent->tagFromItem(newChild));
QVector<SessionItem *> items = parent->getChildrenOfType(newChild->modelType());
foreach(SessionItem *sibling, items) {
if(m_item == sibling) callOnSiblingsChange();
}
}
}
}
......@@ -43,6 +43,8 @@ public:
void setOnChildrenChange(std::function<void(void)> f);
void setOnSiblingsChange(std::function<void(void)> f);
void setActive(bool state) {m_active = state;}
public slots:
......@@ -57,6 +59,10 @@ private:
void setModel(SessionModel *model);
int nestlingDepth(SessionItem* item, int level = 0);
void callOnParentChange(SessionItem *new_parent);
void callOnChildrenChange();
void callOnSiblingsChange();
bool m_active;
SessionModel *m_model;
SessionItem *m_item;
......@@ -64,6 +70,7 @@ private:
std::vector<std::function<void(SessionItem*,QString)>> m_onChildPropertyChange;
std::vector<std::function<void(SessionItem*)>> m_onParentChange;
std::vector<std::function<void(void)>> m_onChildrenChange;
std::vector<std::function<void(void)>> m_onSiblingsChange;
};
#endif
......@@ -112,15 +112,6 @@ int ConnectableView::getInputPortIndex(NodeEditorPort *port)
return m_input_ports.indexOf(port);
}
void ConnectableView::onSiblingsChanged()
{
if (m_item) {
Q_ASSERT(0);
setLabel( hyphenate(m_item->itemName()) );
update();
}
}
// calculation of y-pos for ports
void ConnectableView::setPortCoordinates()
{
......
......@@ -59,10 +59,6 @@ public:
virtual void setName(const QString &name) { m_name = name; }
virtual void setColor(const QColor &color) { m_color = color; }
public slots:
virtual void onSiblingsChanged();
protected:
virtual void setPortCoordinates();
virtual int getNumberOfPorts();
......
......@@ -46,6 +46,14 @@ void IView::setParameterizedItem(SessionItem *item)
{
onPropertyChange(name);
});
mapper()->setOnSiblingsChange(
[this]()
{
onSiblingsChange();
});
update_appearance();
}
}
......@@ -90,3 +98,8 @@ void IView::onPropertyChange(const QString &propertyName)
setY(m_item->getItemValue(SessionGraphicsItem::P_YPOS).toReal());
}
}
void IView::onSiblingsChange()
{
update_appearance();
}
......@@ -52,6 +52,7 @@ protected:
ModelMapper *mapper();
virtual void update_appearance();
virtual void onPropertyChange(const QString &propertyName);
virtual void onSiblingsChange();
SessionItem *m_item;
std::unique_ptr<ModelMapper> m_mapper;
......
......@@ -2,7 +2,7 @@
#include <QString>
#include <QDebug>
#include <QCoreApplication>
#include "TestMapper.h"
#include "TestMapperCases.h"
#include "TestPropertyAttributes.h"
#include "TestFormFactorItems.h"
#include "TestFTDistributionItems.h"
......@@ -13,13 +13,13 @@
#include "TestSessionModel.h"
#include "TestSessionItem.h"
#include "TestGUICoreObjectCorrespondence.h"
#include "TestMapperForItem.h"
int main(int argc, char** argv) {
QCoreApplication app(argc, argv);
Q_UNUSED(app);
// TestPropertyAttributes testPropertyAttributes;
TestMapper testMapper;
TestFormFactorItems testFormFactorItems;
TestFTDistributionItems testFTDistributionItems;
TestParameterizedItem testParameterizedItem;
......@@ -29,21 +29,25 @@ int main(int argc, char** argv) {
TestSessionModel testSessionModel;
TestGUICoreObjectCorrespondence testGUICoreObjectCorrespondence;
TestSessionItem testSessionItem;
TestMapperCases testMapperCases;
TestMapperForItem testMapperForItem;
bool status(false);
// status |= QTest::qExec(&testFormFactorItems, argc, argv);
// status |= QTest::qExec(&testFTDistributionItems, argc, argv);
// status |= QTest::qExec(&testParameterizedItem, argc, argv);
// status |= QTest::qExec(&testParticleItems, argc, argv);
// status |= QTest::qExec(&testLayerRoughnessItems, argc, argv);
// status |= QTest::qExec(&testParaCrystalItems, argc, argv);
// status |= QTest::qExec(&testSessionModel, argc, argv);
// status |= QTest::qExec(&testGUICoreObjectCorrespondence, argc, argv);
// status |= QTest::qExec(&testSessionItem);
// //status |= QTest::qExec(&testPropertyAttributes, argc, argv);
// status |= QTest::qExec(&testMapperCases, argc, argv);
// //status |= QTest::qExec(&testSessionModel, argc, argv);
status |= QTest::qExec(&testMapperForItem, argc, argv);
return QTest::qExec(&testFormFactorItems, argc, argv) |
QTest::qExec(&testFTDistributionItems, argc, argv) |
QTest::qExec(&testParameterizedItem, argc, argv) |
QTest::qExec(&testParticleItems, argc, argv) |
QTest::qExec(&testLayerRoughnessItems, argc, argv) |
QTest::qExec(&testParaCrystalItems, argc, argv) |
QTest::qExec(&testSessionModel, argc, argv) |
QTest::qExec(&testGUICoreObjectCorrespondence, argc, argv) |
QTest::qExec(&testSessionItem) |
//QTest::qExec(&testPropertyAttributes, argc, argv) |
QTest::qExec(&testMapper, argc, argv);
// return QTest::qExec(&testSessionModel, argc, argv);
return status;
}
#ifndef TESTMAPPER_H
#define TESTMAPPER_H
#ifndef TESTMAPPERCASES_H
#define TESTMAPPERCASES_H
#include "SessionItem.h"
#include "SampleModel.h"
......@@ -15,7 +15,7 @@
#include <memory>
#include <QtTest>
class TestMapper : public QObject {
class TestMapperCases : public QObject {
Q_OBJECT
private slots:
......@@ -25,7 +25,7 @@ private slots:
void test_removeMaskOnDetectorChange();
};
inline void TestMapper::test_ParticeleCompositionUpdate()
inline void TestMapperCases::test_ParticeleCompositionUpdate()
{
SampleModel model;
SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
......@@ -47,7 +47,7 @@ inline void TestMapper::test_ParticeleCompositionUpdate()
}
inline void TestMapper::test_Inference2DRotationAngleToggle()
inline void TestMapperCases::test_Inference2DRotationAngleToggle()
{
SampleModel model;
SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
......@@ -67,7 +67,7 @@ inline void TestMapper::test_Inference2DRotationAngleToggle()
}
inline void TestMapper::test_instrumentAlignmentPropertyVisibility()
inline void TestMapperCases::test_instrumentAlignmentPropertyVisibility()
{
InstrumentModel model;
SessionItem *instrument = model.insertNewItem(Constants::InstrumentType);
......@@ -90,7 +90,7 @@ inline void TestMapper::test_instrumentAlignmentPropertyVisibility()
}
inline void TestMapper::test_removeMaskOnDetectorChange()
inline void TestMapperCases::test_removeMaskOnDetectorChange()
{
InstrumentModel model;
SessionItem *instrument = model.insertNewItem(Constants::InstrumentType);
......@@ -101,7 +101,6 @@ inline void TestMapper::test_removeMaskOnDetectorChange()
// after change the mask container should be removed
detector->setGroupProperty(DetectorItem::P_DETECTOR, Constants::SphericalDetectorType);
QVERIFY(detector->getItems(DetectorItem::T_MASKS).size() == 0);
}
#endif
#ifndef TESTMAPPERFORITEM_H
#define TESTMAPPERFORITEM_H
#include "SessionItem.h"
#include "SampleModel.h"
#include "LayerItem.h"
#include "MultiLayerItem.h"
#include "item_constants.h"
#include <memory>
#include <QtTest>
//! Test if ModelMapper reports correctly (number of callbacks,
//! names of properties and reporting items)
class TestMapperForItem : public QObject {
Q_OBJECT
public:
TestMapperForItem(QObject *parent = 0)
: QObject(parent)
, m_onPropertyChangeCount(0)
, m_onChildPropertyChangeCount(0)
, m_onParentChangeCount(0)
, m_onChildrenChangeCount(0)
, m_onSiblingsChangeCount(0)
, m_mapped_item(0)
{ }
void clear()
{
m_onPropertyChangeCount = 0;
m_onChildPropertyChangeCount = 0;
m_onParentChangeCount = 0;
m_onChildrenChangeCount = 0;
m_onSiblingsChangeCount = 0;
m_mapped_item = 0;
m_reported_items.clear();
m_reported_names.clear();
}
void setItem(SessionItem *item)
{
clear();
m_mapped_item = item;
m_mapper.reset(new ModelMapper);
m_mapper->setItem(item);
m_mapper->setOnPropertyChange(
[this] (QString name)
{
onPropertyChange(name);
});
m_mapper->setOnChildPropertyChange(
[this](SessionItem* item, QString name)
{
onChildPropertyChange(item, name);
});
m_mapper->setOnParentChange(
[this](SessionItem *parent) {
onParentChange(parent);
});
m_mapper->setOnChildrenChange(
[this]()
{
onChildrenChange();
});
m_mapper->setOnSiblingsChange(
[this]()
{
onSiblingsChange();
});
}
private:
void onPropertyChange(const QString &name)
{
m_reported_names.append(name);
m_onPropertyChangeCount++;
}
void onChildPropertyChange(SessionItem *item, const QString &name)
{
m_reported_items.append(item);
m_reported_names.append(name);
m_onChildPropertyChangeCount++;
}
void onParentChange(SessionItem *item)
{
m_reported_items.append(item);
m_onParentChangeCount++;
}
void onChildrenChange()
{
m_onChildrenChangeCount++;
}
void onSiblingsChange()
{
m_onSiblingsChangeCount++;
}
int m_onPropertyChangeCount;
int m_onChildPropertyChangeCount;
int m_onParentChangeCount;
int m_onChildrenChangeCount;
int m_onSiblingsChangeCount;
SessionItem *m_mapped_item;
QList<SessionItem *> m_reported_items;
QStringList m_reported_names;
std::unique_ptr<ModelMapper> m_mapper;
private slots:
void test_onPropertyChange();
void test_onParentChange();
void test_onChildrenChange();
void test_onSiblingsChange();
};
inline void TestMapperForItem::test_onPropertyChange()
{
SampleModel model;
SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
// check initial state of our test class
QVERIFY(m_onPropertyChangeCount == 0);
QVERIFY(m_onChildPropertyChangeCount == 0);
QVERIFY(m_onParentChangeCount == 0);
QVERIFY(m_onChildrenChangeCount == 0);
QVERIFY(m_onSiblingsChangeCount == 0);
QVERIFY(m_mapped_item == nullptr);
QVERIFY(m_reported_items.isEmpty());
QVERIFY(m_reported_names.isEmpty());
// Mapper is looking on child; set property of child
setItem(layer);
layer->setItemValue(LayerItem::P_THICKNESS, 1.0);
QVERIFY(m_onPropertyChangeCount == 1);
QVERIFY(m_onChildPropertyChangeCount == 0);
QVERIFY(m_onParentChangeCount == 0);
QVERIFY(m_onChildrenChangeCount == 0);
QVERIFY(m_onSiblingsChangeCount == 0);
QVERIFY(m_mapped_item == layer);
QVERIFY(m_reported_items.isEmpty());
QVERIFY((m_reported_names.size() == 1) && (m_reported_names[0] == LayerItem::P_THICKNESS));
// Mapper is looking on child; set property of parent;
setItem(layer);
multilayer->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, 1.0);
QVERIFY(m_onPropertyChangeCount == 0);
QVERIFY(m_onChildPropertyChangeCount == 0);
QVERIFY(m_onParentChangeCount == 0);
QVERIFY(m_onChildrenChangeCount == 0);
QVERIFY(m_onSiblingsChangeCount == 0);
QVERIFY(m_mapped_item == layer);
QVERIFY(m_reported_items.isEmpty());
QVERIFY(m_reported_names.isEmpty());
// Mapper is looking on parent; set property of child;
setItem(multilayer);
layer->setItemValue(LayerItem::P_THICKNESS, 2.0);
QVERIFY(m_onPropertyChangeCount == 0);
QVERIFY(m_onChildPropertyChangeCount == 1);
QVERIFY(m_onParentChangeCount == 0);
QVERIFY(m_onChildrenChangeCount == 0);
QVERIFY(m_onSiblingsChangeCount == 0);
QVERIFY(m_mapped_item == multilayer);
QVERIFY( (m_reported_items.size() == 1) && (m_reported_items[0] == layer));
QVERIFY((m_reported_names.size() == 1) && (m_reported_names[0] == LayerItem::P_THICKNESS));
// Mapper is looking on parent; set property of parent;
setItem(multilayer);
multilayer->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, 2.0);
QVERIFY(m_onPropertyChangeCount == 1);
QVERIFY(m_onChildPropertyChangeCount == 0);
QVERIFY(m_onParentChangeCount == 0);
QVERIFY(m_onChildrenChangeCount == 0);
QVERIFY(m_onSiblingsChangeCount == 0);
QVERIFY(m_mapped_item == multilayer);
QVERIFY(m_reported_items.isEmpty());
QVERIFY((m_reported_names.size() == 1) && (m_reported_names[0] == MultiLayerItem::P_CROSS_CORR_LENGTH));
}
inline void TestMapperForItem::test_onParentChange()
{
clear();
SampleModel model;
SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
// SessionItem *layer = model.insertNewItem(Constants::LayerType);
// Mapper is looking on child; changing child's parent
setItem(layer);
multilayer->takeRow(layer->parentRow());
// model.moveParameterizedItem(layer, multilayer);
// FIXME check onParentChange while moving an item
QVERIFY(m_onPropertyChangeCount == 0);
QVERIFY(m_onChildPropertyChangeCount == 0);
QVERIFY(m_onParentChangeCount == 1);
QVERIFY(m_onChildrenChangeCount == 0);
QVERIFY(m_mapped_item == layer);
QVERIFY((m_reported_items.size() == 1) && (m_reported_items[0] == nullptr));
QVERIFY(m_reported_names.isEmpty());
}
inline void TestMapperForItem::test_onChildrenChange()
{
clear();
SampleModel model;
SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
// Mapper is looking on child; adding new child to parent
setItem(multilayer);
SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
QVERIFY(m_onPropertyChangeCount == 0);
QVERIFY(m_onChildPropertyChangeCount == 2);
QVERIFY(m_onParentChangeCount == 0);
QVERIFY(m_onChildrenChangeCount == 1);
QVERIFY(m_onSiblingsChangeCount == 0);
QVERIFY(m_mapped_item == multilayer);
QVERIFY(m_reported_items.size() == 2);
QVERIFY(m_reported_names.size() == 2);
}
inline void TestMapperForItem::test_onSiblingsChange()
{
clear();
SampleModel model;
SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
// Mapper is looking on child; adding another child to parent
setItem(layer);
SessionItem *layer2 = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
QVERIFY(m_onPropertyChangeCount == 0);
QVERIFY(m_onChildPropertyChangeCount == 0);
QVERIFY(m_onParentChangeCount == 0);
QVERIFY(m_onChildrenChangeCount == 0);
QVERIFY(m_onSiblingsChangeCount == 1);
QVERIFY(m_mapped_item == layer);
QVERIFY(m_reported_items.isEmpty());
QVERIFY(m_reported_names.isEmpty());
multilayer->takeRow(layer2->parentRow());
QVERIFY(m_onSiblingsChangeCount == 2);
}
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment