using private data

This commit is contained in:
Vogel, Rick 2023-07-24 10:56:26 +02:00
parent 5cb4fea788
commit 37183bb637
3 changed files with 111 additions and 98 deletions

View File

@ -16,6 +16,7 @@
#include <QskLinearBox.h>
#include <QskSlider.h>
#include <QskTextLabel.h>
#include <QskScaleTickmarks.h>
#include <QGuiApplication>
#include <QQuickWindow>

View File

@ -1,13 +1,17 @@
#include "QskLevelingSensor.h"
#include <QskScaleTickmarks.h>
#include <QskFunctions.h>
#include <QskScaleTickmarks.h>
#include <unordered_map>
#include <QVector2D>
#include <QVector3D>
namespace
{
template<typename T>
bool compareExchange(T& dst, const T& src)
template< typename T >
bool compareExchange( T& dst, const T& src )
{
if (dst != src)
if ( dst != src )
{
dst = src;
return true;
@ -16,9 +20,9 @@ namespace
}
template<>
bool compareExchange<float>(float& dst, const float& src)
bool compareExchange< float >( float& dst, const float& src )
{
if (!qskFuzzyCompare(dst, src))
if ( !qskFuzzyCompare( dst, src ) )
{
dst = src;
return true;
@ -26,78 +30,93 @@ namespace
return false;
}
inline bool isAxis(const Qt::Axis axis) {
inline bool isAxis( const Qt::Axis axis )
{
return axis == Qt::XAxis || axis == Qt::YAxis || axis == Qt::ZAxis;
}
}
QSK_SUBCONTROL(QskLevelingSensor, OuterDisk)
QSK_SUBCONTROL(QskLevelingSensor, Horizon)
QSK_SUBCONTROL(QskLevelingSensor, TickmarksX)
QSK_SUBCONTROL(QskLevelingSensor, TickmarksXLabels)
QSK_SUBCONTROL(QskLevelingSensor, TickmarksY)
QSK_SUBCONTROL(QskLevelingSensor, TickmarksYLabels)
QSK_SUBCONTROL(QskLevelingSensor, TickmarksZ)
QSK_SUBCONTROL(QskLevelingSensor, TickmarksZLabels)
QSK_SUBCONTROL( QskLevelingSensor, OuterDisk )
QSK_SUBCONTROL( QskLevelingSensor, Horizon )
QSK_SUBCONTROL( QskLevelingSensor, TickmarksX )
QSK_SUBCONTROL( QskLevelingSensor, TickmarksXLabels )
QSK_SUBCONTROL( QskLevelingSensor, TickmarksY )
QSK_SUBCONTROL( QskLevelingSensor, TickmarksYLabels )
QSK_SUBCONTROL( QskLevelingSensor, TickmarksZ )
QSK_SUBCONTROL( QskLevelingSensor, TickmarksZLabels )
#define RETURN_IF_FALSE(expr) if(!(expr)) return;
#define RETURN_IF_FALSE( expr ) \
if ( !( expr ) ) \
return;
using Q = QskLevelingSensor;
QskLevelingSensor::QskLevelingSensor(QQuickItem* const parent)
: Inherited(parent)
class QskLevelingSensor::PrivateData
{
public:
QVector3D m_angle = { 45, 45, 45 };
Tickmarks m_tickmarks[ 3 ];
TickmarksLabels m_tickmarksLabels[ 3 ];
std::unordered_map< QskAspect::Subcontrol, QVector3D > m_subControlRotation;
};
QskLevelingSensor::QskLevelingSensor( QQuickItem* const parent )
: Inherited( parent )
, m_data( std::make_unique< QskLevelingSensor::PrivateData >() )
{
}
void QskLevelingSensor::setTickmarks(const Qt::Axis axis, QskScaleTickmarks tickmarks)
QskLevelingSensor::~QskLevelingSensor() = default;
void QskLevelingSensor::setTickmarks( const Qt::Axis axis, QskScaleTickmarks tickmarks )
{
RETURN_IF_FALSE(isAxis(axis));
m_tickmarks[axis] = std::move(tickmarks);
RETURN_IF_FALSE( isAxis( axis ) );
m_data->m_tickmarks[ axis ] = std::move( tickmarks );
update();
}
void QskLevelingSensor::setTickmarksLabels(const Qt::Axis axis, TickmarksLabels labels)
void QskLevelingSensor::setTickmarksLabels( const Qt::Axis axis, TickmarksLabels labels )
{
RETURN_IF_FALSE(isAxis(axis));
m_tickmarksLabels[axis] = std::move(labels);
RETURN_IF_FALSE( isAxis( axis ) );
m_data->m_tickmarksLabels[ axis ] = std::move( labels );
update();
}
void QskLevelingSensor::setAngle(const QVector3D& degree)
void QskLevelingSensor::setAngle( const QVector3D& degree )
{
if (compareExchange(m_angle, degree))
if ( compareExchange( m_data->m_angle, degree ) )
{
update();
Q_EMIT anglesChanged(m_angle);
Q_EMIT anglesChanged( m_data->m_angle );
}
}
void QskLevelingSensor::setAngle(const Qt::Axis axis, const float degree)
void QskLevelingSensor::setAngle( const Qt::Axis axis, const float degree )
{
RETURN_IF_FALSE(isAxis(axis));
RETURN_IF_FALSE( isAxis( axis ) );
if (compareExchange(m_angle[axis], degree))
if ( compareExchange( m_data->m_angle[ axis ], degree ) )
{
update();
Q_EMIT anglesChanged(m_angle);
Q_EMIT anglesChanged( m_data->m_angle );
}
}
const QskScaleTickmarks& QskLevelingSensor::tickmarks(Qt::Axis axis) const
const QskScaleTickmarks& QskLevelingSensor::tickmarks( Qt::Axis axis ) const
{
if (isAxis(axis))
if ( isAxis( axis ) )
{
return m_tickmarks[axis];
return m_data->m_tickmarks[ axis ];
}
static const QskScaleTickmarks invalid;
return invalid;
}
const QskLevelingSensor::TickmarksLabels& QskLevelingSensor::tickmarkLabels(Qt::Axis axis) const
const QskLevelingSensor::TickmarksLabels& QskLevelingSensor::tickmarkLabels( Qt::Axis axis ) const
{
if (isAxis(axis))
if ( isAxis( axis ) )
{
return m_tickmarksLabels[axis];
return m_data->m_tickmarksLabels[ axis ];
}
static const QskLevelingSensor::TickmarksLabels invalid;
return invalid;
@ -105,48 +124,51 @@ const QskLevelingSensor::TickmarksLabels& QskLevelingSensor::tickmarkLabels(Qt::
const QVector3D& QskLevelingSensor::angle() const noexcept
{
return m_angle;
return m_data->m_angle;
}
const QVector3D& QskLevelingSensor::subControlRotation(const QskAspect::Subcontrol subControl) const noexcept
const QVector3D& QskLevelingSensor::subControlRotation(
const QskAspect::Subcontrol subControl ) const noexcept
{
static const QVector3D notFound;
const auto found = m_subControlRotation.find(subControl);
if(found == m_subControlRotation.end()) {
const auto found = m_data->m_subControlRotation.find( subControl );
if ( found == m_data->m_subControlRotation.end() )
{
return notFound;
}
return found->second;
}
void QskLevelingSensor::setSubControlRotation(const QskAspect::Subcontrol subControl, const QVector3D& degree)
void QskLevelingSensor::setSubControlRotation(
const QskAspect::Subcontrol subControl, const QVector3D& degree )
{
auto updateSubControlRotation = [this](const QskAspect::Subcontrol subControl, const QVector3D& degree)
{
if ( compareExchange( m_subControlRotation[ subControl ], degree ) )
auto updateSubControlRotation = [ this ]( const QskAspect::Subcontrol subControl,
const QVector3D& degree ) {
if ( compareExchange( m_data->m_subControlRotation[ subControl ], degree ) )
{
Q_EMIT subControlRotationChanged(subControl, degree);
Q_EMIT subControlRotationChanged( subControl, degree );
update();
}
};
if(subControl == Q::TickmarksX || subControl == Q::TickmarksXLabels)
if ( subControl == Q::TickmarksX || subControl == Q::TickmarksXLabels )
{
updateSubControlRotation(Q::TickmarksX, degree);
updateSubControlRotation(Q::TickmarksXLabels, degree);
updateSubControlRotation( Q::TickmarksX, degree );
updateSubControlRotation( Q::TickmarksXLabels, degree );
}
else if(subControl == Q::TickmarksY || subControl == Q::TickmarksYLabels)
else if ( subControl == Q::TickmarksY || subControl == Q::TickmarksYLabels )
{
updateSubControlRotation(Q::TickmarksY, degree);
updateSubControlRotation(Q::TickmarksYLabels, degree);
updateSubControlRotation( Q::TickmarksY, degree );
updateSubControlRotation( Q::TickmarksYLabels, degree );
}
else if(subControl == Q::TickmarksZ || subControl == TickmarksZLabels)
else if ( subControl == Q::TickmarksZ || subControl == TickmarksZLabels )
{
updateSubControlRotation(TickmarksZ, degree);
updateSubControlRotation(TickmarksZLabels, degree);
updateSubControlRotation( TickmarksZ, degree );
updateSubControlRotation( TickmarksZLabels, degree );
}
else
else
{
updateSubControlRotation(subControl, degree);
updateSubControlRotation( subControl, degree );
}
}

View File

@ -1,55 +1,45 @@
#pragma once
#include <QskControl.h>
#include <QskScaleTickmarks.h>
#include <QVector3D>
#include <QskAspect.h>
#include <memory>
#include <unordered_map>
class QskScaleTickmarks;
class QSK_EXPORT QskLevelingSensor : public QskControl
{
Q_OBJECT
using Inherited = QskControl;
public:
QSK_SUBCONTROLS(
OuterDisk,
Horizon,
TickmarksX,
TickmarksXLabels,
TickmarksY,
TickmarksYLabels,
TickmarksZ,
TickmarksZLabels)
using Tickmarks = QskScaleTickmarks;
using TickmarksLabels = QVector<QPair<qreal, QString>>;
explicit QskLevelingSensor(QQuickItem* parent = nullptr);
public Q_SLOTS:
void setTickmarks(Qt::Axis axis, Tickmarks tickmarks);
void setTickmarksLabels(Qt::Axis axis, TickmarksLabels labels);
void setAngle(const QVector3D& degree);
void setAngle(Qt::Axis axis, float degree);
using Inherited = QskControl;
void setSubControlRotation(QskAspect::Subcontrol subControl, const QVector3D& degree);
public:
QSK_SUBCONTROLS( OuterDisk, Horizon, TickmarksX, TickmarksXLabels, TickmarksY, TickmarksYLabels,
TickmarksZ, TickmarksZLabels )
Q_SIGNALS:
void anglesChanged(const QVector3D& degree);
void subControlRotationChanged(QskAspect::Subcontrol subControl, const QVector3D& degree);
using Tickmarks = QskScaleTickmarks;
using TickmarksLabels = QVector< QPair< qreal, QString > >;
public:
Q_REQUIRED_RESULT const Tickmarks& tickmarks(Qt::Axis axis) const;
Q_REQUIRED_RESULT const TickmarksLabels& tickmarkLabels(Qt::Axis axis) const;
explicit QskLevelingSensor( QQuickItem* parent = nullptr );
~QskLevelingSensor();
public Q_SLOTS:
void setTickmarks( Qt::Axis axis, Tickmarks tickmarks );
void setTickmarksLabels( Qt::Axis axis, TickmarksLabels labels );
void setAngle( const QVector3D& degree );
void setAngle( Qt::Axis axis, float degree );
void setSubControlRotation( QskAspect::Subcontrol subControl, const QVector3D& degree );
Q_SIGNALS:
void anglesChanged( const QVector3D& degree );
void subControlRotationChanged( QskAspect::Subcontrol subControl, const QVector3D& degree );
public:
Q_REQUIRED_RESULT const Tickmarks& tickmarks( Qt::Axis axis ) const;
Q_REQUIRED_RESULT const TickmarksLabels& tickmarkLabels( Qt::Axis axis ) const;
Q_REQUIRED_RESULT const QVector3D& angle() const noexcept;
Q_REQUIRED_RESULT const QVector3D& subControlRotation(QskAspect::Subcontrol subControl) const noexcept;
Q_REQUIRED_RESULT const QVector3D& subControlRotation(
QskAspect::Subcontrol subControl ) const noexcept;
private:
// TODO use pimpl
QVector3D m_rotation;
QVector3D m_angle = { 45,45,45 };
Tickmarks m_tickmarks[3];
TickmarksLabels m_tickmarksLabels[3];
std::unordered_map<QskAspect::Subcontrol, QVector3D> m_subControlRotation;
private:
class PrivateData;
std::unique_ptr< PrivateData > m_data;
};