qskinny/src/controls/LevelingSensor/QskLevelingSensor.cpp

153 lines
3.9 KiB
C++
Raw Normal View History

2023-07-10 13:54:53 +00:00
#include "QskLevelingSensor.h"
#include <QskScaleTickmarks.h>
2023-07-17 08:24:36 +00:00
#include <QskFunctions.h>
2023-07-10 13:54:53 +00:00
namespace
{
template<typename T>
bool compareExchange(T& dst, const T& src)
{
if (dst != src)
{
dst = src;
return true;
}
return false;
}
template<>
bool compareExchange<float>(float& dst, const float& src)
{
2023-07-17 08:24:36 +00:00
if (!qskFuzzyCompare(dst, src))
2023-07-10 13:54:53 +00:00
{
dst = src;
return true;
}
return false;
}
inline bool isAxis(const Qt::Axis axis) {
return axis == Qt::XAxis || axis == Qt::YAxis || axis == Qt::ZAxis;
}
}
2023-07-17 09:14:43 +00:00
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)
2023-07-10 13:54:53 +00:00
#define RETURN_IF_FALSE(expr) if(!(expr)) return;
2023-07-20 10:01:16 +00:00
using Q = QskLevelingSensor;
2023-07-17 09:14:43 +00:00
QskLevelingSensor::QskLevelingSensor(QQuickItem* const parent)
2023-07-10 13:54:53 +00:00
: Inherited(parent)
{
}
2023-07-17 09:14:43 +00:00
void QskLevelingSensor::setTickmarks(const Qt::Axis axis, QskScaleTickmarks tickmarks)
2023-07-10 13:54:53 +00:00
{
RETURN_IF_FALSE(isAxis(axis));
m_tickmarks[axis] = std::move(tickmarks);
update();
}
2023-07-17 09:14:43 +00:00
void QskLevelingSensor::setTickmarksLabels(const Qt::Axis axis, TickmarksLabels labels)
2023-07-10 13:54:53 +00:00
{
2023-07-20 10:01:16 +00:00
RETURN_IF_FALSE(isAxis(axis));
2023-07-10 13:54:53 +00:00
m_tickmarksLabels[axis] = std::move(labels);
update();
}
2023-07-17 09:14:43 +00:00
void QskLevelingSensor::setAngle(const QVector3D& degree)
2023-07-10 13:54:53 +00:00
{
if (compareExchange(m_angle, degree))
{
update();
Q_EMIT anglesChanged(m_angle);
}
}
2023-07-17 09:14:43 +00:00
void QskLevelingSensor::setAngle(const Qt::Axis axis, const float degree)
2023-07-10 13:54:53 +00:00
{
RETURN_IF_FALSE(isAxis(axis));
if (compareExchange(m_angle[axis], degree))
{
update();
Q_EMIT anglesChanged(m_angle);
}
}
2023-07-17 09:14:43 +00:00
const QskScaleTickmarks& QskLevelingSensor::tickmarks(Qt::Axis axis) const
2023-07-10 13:54:53 +00:00
{
if (isAxis(axis))
{
return m_tickmarks[axis];
}
static const QskScaleTickmarks invalid;
return invalid;
}
2023-07-17 09:14:43 +00:00
const QskLevelingSensor::TickmarksLabels& QskLevelingSensor::tickmarkLabels(Qt::Axis axis) const
2023-07-10 13:54:53 +00:00
{
if (isAxis(axis))
{
return m_tickmarksLabels[axis];
}
2023-07-17 09:14:43 +00:00
static const QskLevelingSensor::TickmarksLabels invalid;
2023-07-10 13:54:53 +00:00
return invalid;
}
2023-07-17 09:14:43 +00:00
const QVector3D& QskLevelingSensor::angle() const noexcept
2023-07-10 13:54:53 +00:00
{
return m_angle;
}
2023-07-20 10:01:16 +00:00
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()) {
return notFound;
}
return found->second;
}
void QskLevelingSensor::setSubControlRotation(const QskAspect::Subcontrol subControl, const QVector3D& degree)
2023-07-10 13:54:53 +00:00
{
2023-07-20 10:01:16 +00:00
auto updateSubControlRotation = [this](const QskAspect::Subcontrol subControl, const QVector3D& degree)
{
if ( compareExchange( m_subControlRotation[ subControl ], degree ) )
{
Q_EMIT subControlRotationChanged(subControl, degree);
update();
}
};
if(subControl == Q::TickmarksX || subControl == Q::TickmarksXLabels)
{
updateSubControlRotation(Q::TickmarksX, degree);
updateSubControlRotation(Q::TickmarksXLabels, degree);
}
else if(subControl == Q::TickmarksY || subControl == Q::TickmarksYLabels)
{
updateSubControlRotation(Q::TickmarksY, degree);
updateSubControlRotation(Q::TickmarksYLabels, degree);
}
else if(subControl == Q::TickmarksZ || subControl == TickmarksZLabels)
{
updateSubControlRotation(TickmarksZ, degree);
updateSubControlRotation(TickmarksZLabels, degree);
}
else
{
updateSubControlRotation(subControl, degree);
}
2023-07-10 13:54:53 +00:00
}
#include "moc_QskLevelingSensor.cpp"