|
|
#ifndef SCIQLOP_VARIABLE_H
|
|
|
#define SCIQLOP_VARIABLE_H
|
|
|
|
|
|
#include <optional>
|
|
|
|
|
|
#include <QLoggingCategory>
|
|
|
#include <QObject>
|
|
|
#include <QUuid>
|
|
|
#include <QReadWriteLock>
|
|
|
#include <QDataStream>
|
|
|
|
|
|
#include "CoreGlobal.h"
|
|
|
#include <Data/DataSeriesIterator.h>
|
|
|
#include <Data/DataSeriesType.h>
|
|
|
#include <Data/DateTimeRange.h>
|
|
|
|
|
|
|
|
|
#include <Common/deprecate.h>
|
|
|
#include <Common/MetaTypes.h>
|
|
|
#include <Common/spimpl.h>
|
|
|
|
|
|
Q_DECLARE_LOGGING_CATEGORY(LOG_Variable)
|
|
|
|
|
|
class IDataSeries;
|
|
|
class QString;
|
|
|
|
|
|
/**
|
|
|
* @brief The Variable class represents a variable in SciQlop.
|
|
|
*/
|
|
|
class SCIQLOP_CORE_EXPORT Variable : public QObject {
|
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
public:
|
|
|
explicit Variable(const QString &name, const QVariantHash &metadata = {});
|
|
|
|
|
|
/// Copy ctor
|
|
|
explicit Variable(const Variable &other);
|
|
|
|
|
|
std::shared_ptr<Variable> clone() const;
|
|
|
|
|
|
QString name() const noexcept;
|
|
|
void setName(const QString &name) noexcept;
|
|
|
DateTimeRange range() const noexcept;
|
|
|
void setRange(const DateTimeRange &range, bool notify=false) noexcept;
|
|
|
DateTimeRange cacheRange() const noexcept;
|
|
|
void setCacheRange(const DateTimeRange &cacheRange) noexcept;
|
|
|
|
|
|
/// @return the number of points hold by the variable. The number of points is updated each time
|
|
|
/// the data series changes
|
|
|
unsigned int nbPoints() const noexcept;
|
|
|
|
|
|
/// Returns the real range of the variable, i.e. the min and max x-axis values of the data
|
|
|
/// series between the range of the variable. The real range is updated each time the variable
|
|
|
/// range or the data series changed
|
|
|
/// @return the real range, invalid range if the data series is null or empty
|
|
|
/// @sa setDataSeries()
|
|
|
/// @sa setRange()
|
|
|
std::optional<DateTimeRange> realRange() const noexcept;
|
|
|
|
|
|
/// @return the data of the variable, nullptr if there is no data
|
|
|
std::shared_ptr<IDataSeries> dataSeries() const noexcept;
|
|
|
|
|
|
/// @return the type of data that the variable holds
|
|
|
DataSeriesType type() const noexcept;
|
|
|
|
|
|
QVariantHash metadata() const noexcept;
|
|
|
|
|
|
void updateData(const std::vector<IDataSeries*>& dataSeries,
|
|
|
const DateTimeRange& newRange, const DateTimeRange& newCacheRange,
|
|
|
bool notify=true);
|
|
|
|
|
|
void setData(const std::vector<IDataSeries*>& dataSeries,
|
|
|
const DateTimeRange& newRange, const DateTimeRange& newCacheRange,
|
|
|
bool notify=true);
|
|
|
|
|
|
static QByteArray mimeData(const std::vector<std::shared_ptr<Variable> > &variables)
|
|
|
{
|
|
|
auto encodedData = QByteArray{};
|
|
|
QDataStream stream{&encodedData, QIODevice::WriteOnly};
|
|
|
for (auto &var : variables) {
|
|
|
stream << var->ID().toByteArray();
|
|
|
}
|
|
|
return encodedData;
|
|
|
}
|
|
|
|
|
|
static std::vector<QUuid> variablesIDs(QByteArray mimeData)
|
|
|
{
|
|
|
std::vector<QUuid> variables;
|
|
|
QDataStream stream{mimeData};
|
|
|
|
|
|
QVariantList ids;
|
|
|
stream >> ids;
|
|
|
|
|
|
for (const auto& id : ids) {
|
|
|
variables.emplace_back (id.toByteArray());
|
|
|
}
|
|
|
return variables;
|
|
|
}
|
|
|
|
|
|
operator QUuid() {return _uuid;}
|
|
|
QUuid ID(){return _uuid;}
|
|
|
signals:
|
|
|
void updated(QUuid ID);
|
|
|
|
|
|
private:
|
|
|
class VariablePrivate;
|
|
|
spimpl::unique_impl_ptr<VariablePrivate> impl;
|
|
|
QUuid _uuid;
|
|
|
QReadWriteLock m_lock;
|
|
|
};
|
|
|
|
|
|
// Required for using shared_ptr in signals/slots
|
|
|
SCIQLOP_REGISTER_META_TYPE(VARIABLE_PTR_REGISTRY, std::shared_ptr<Variable>)
|
|
|
SCIQLOP_REGISTER_META_TYPE(VARIABLE_PTR_VECTOR_REGISTRY, QVector<std::shared_ptr<Variable> >)
|
|
|
|
|
|
#endif // SCIQLOP_VARIABLE_H
|
|
|
|