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

New SessionItemData class to extract data handling from SessionItem

parent e1f526f7
No related branches found
No related tags found
No related merge requests found
// ************************************************************************** //
//
// BornAgain: simulate and fit scattering at grazing incidence
//
//! @file GUI/coregui/Models/SessionItemData.cpp
//! @brief Implements class SessionItemData
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2016
//! @authors Scientific Computing Group at MLZ Garching
//! @authors Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
//! @authors Walter Van Herck, Joachim Wuttke
//
// ************************************************************************** //
#include "SessionItemData.h"
#include "SessionItemUtils.h"
SessionItemData::ItemData::ItemData(int r, const QVariant& v)
: role(r)
, data(v)
{
}
bool SessionItemData::ItemData::operator==(const SessionItemData::ItemData& other) const
{
return role == other.role && SessionItemUtils::IsTheSame(data, other.data);
}
QVector<int> SessionItemData::roles() const
{
QVector<int> result;
for (const auto& value : m_values)
result.push_back(value.role);
return result;
}
QVariant SessionItemData::data(int role) const
{
role = (role == Qt::EditRole) ? Qt::DisplayRole : role;
for (const auto& value : m_values) {
if (value.role == role)
return value.data;
}
return QVariant();
}
//! Sets the data for given role. Returns true if data was changed.
bool SessionItemData::setData(int role, const QVariant& value)
{
role = (role == Qt::EditRole) ? Qt::DisplayRole : role;
for (auto it = m_values.begin(); it != m_values.end(); ++it) {
if (it->role == role) {
if (value.isValid()) {
if (SessionItemUtils::IsTheSame(it->data, value))
return false;
it->data = value;
} else {
m_values.erase(it);
}
return true;
}
}
m_values.push_back(ItemData(role, value));
return true;
}
// ************************************************************************** //
//
// BornAgain: simulate and fit scattering at grazing incidence
//
//! @file GUI/coregui/Models/SessionItemData.h
//! @brief Defines class SessionItemData
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2016
//! @authors Scientific Computing Group at MLZ Garching
//! @authors Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
//! @authors Walter Van Herck, Joachim Wuttke
//
// ************************************************************************** //
#ifndef SESSIONITEMDATA_H
#define SESSIONITEMDATA_H
#include "WinDllMacros.h"
#include <QVector>
#include <QVariant>
//! Handles all data roles for SessionItem.
class BA_CORE_API_ SessionItemData
{
public:
QVector<int> roles() const;
QVariant data(int role) const;
bool setData(int role, const QVariant& value);
private:
class ItemData
{
public:
ItemData(int r = -1, const QVariant& v = QVariant());
int role;
QVariant data;
bool operator==(const ItemData& other) const;
};
QVector<ItemData> m_values;
};
#endif // SESSIONITEMDATA_H
......@@ -41,6 +41,7 @@
#include "TestSessionXML.h"
#include "TestTranslations.h"
#include "TestUpdateTimer.h"
#include "TestSessionItemData.h"
int main(int argc, char** argv) {
QCoreApplication app(argc, argv);
......
#include "google_test.h"
#include "SessionItemData.h"
#include "ExternalProperty.h"
#include "SessionFlags.h"
class TestSessionItemData : public ::testing::Test
{
public:
~TestSessionItemData();
};
TestSessionItemData::~TestSessionItemData() = default;
TEST_F(TestSessionItemData, initialState)
{
SessionItemData itemData;
EXPECT_TRUE(itemData.roles().isEmpty());
EXPECT_FALSE(itemData.data(Qt::DisplayRole).isValid());
}
TEST_F(TestSessionItemData, setData)
{
SessionItemData itemData;
// setting DisplayRole
QVariant v(42.0);
EXPECT_TRUE(itemData.setData(Qt::DisplayRole, v));
QVector<int> expected {Qt::DisplayRole};
EXPECT_EQ(itemData.roles(), expected);
EXPECT_TRUE(itemData.data(Qt::DisplayRole) == v);
// setting same data twice
EXPECT_FALSE(itemData.setData(Qt::DisplayRole, v));
EXPECT_EQ(itemData.roles(), expected);
// changing the data
v.setValue(43.0);
EXPECT_TRUE(itemData.setData(Qt::DisplayRole, v));
EXPECT_EQ(itemData.roles(), expected);
EXPECT_TRUE(itemData.data(Qt::DisplayRole) == QVariant(43.0));
// setting invalid variant for the role
EXPECT_TRUE(itemData.setData(Qt::DisplayRole, QVariant()));
EXPECT_TRUE(itemData.roles().isEmpty());
EXPECT_FALSE(itemData.data(Qt::DisplayRole).isValid());
// Setting custom variant
ExternalProperty ep;
ep.setIdentifier("abc");
EXPECT_TRUE(itemData.setData(Qt::DisplayRole, ep.variant()));
EXPECT_TRUE(itemData.setData(SessionFlags::CustomEditorRole, QVariant::fromValue(QString("abc"))));
expected = {Qt::DisplayRole, SessionFlags::CustomEditorRole};
EXPECT_EQ(itemData.roles(), expected);
EXPECT_EQ(itemData.data(Qt::DisplayRole).value<ExternalProperty>(), ep);
EXPECT_EQ(itemData.data(SessionFlags::CustomEditorRole).toString(), QString("abc"));
}
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