Speedometer: Inherit from QskRangeControl
We don't need start/endAngle() etc. and value() anymore, but can use the methods from QskRangeControl.
This commit is contained in:
parent
c46b105879
commit
41d97c8c91
|
@ -8,44 +8,10 @@ QSK_SUBCONTROL( Speedometer, Labels )
|
||||||
QSK_SUBCONTROL( Speedometer, Needle )
|
QSK_SUBCONTROL( Speedometer, Needle )
|
||||||
|
|
||||||
Speedometer::Speedometer( QQuickItem* parent ) :
|
Speedometer::Speedometer( QQuickItem* parent ) :
|
||||||
QskControl( parent ),
|
QskRangeControl( parent )
|
||||||
m_value( 0.0 ),
|
|
||||||
m_startAngle( -215 ),
|
|
||||||
m_endAngle( 35 )
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
float Speedometer::value() const
|
|
||||||
{
|
|
||||||
return m_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Speedometer::setValue( float value )
|
|
||||||
{
|
|
||||||
m_value = value;
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
float Speedometer::startAngle() const
|
|
||||||
{
|
|
||||||
return m_startAngle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Speedometer::setStartAngle( float startAngle )
|
|
||||||
{
|
|
||||||
m_startAngle = startAngle;
|
|
||||||
}
|
|
||||||
|
|
||||||
float Speedometer::endAngle() const
|
|
||||||
{
|
|
||||||
return m_endAngle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Speedometer::setEndAngle( float endAngle )
|
|
||||||
{
|
|
||||||
m_endAngle = endAngle;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVector< QString > Speedometer::labels() const
|
QVector< QString > Speedometer::labels() const
|
||||||
{
|
{
|
||||||
return m_labels;
|
return m_labels;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef SPEEDOMETER_H
|
#ifndef SPEEDOMETER_H
|
||||||
#define SPEEDOMETER_H
|
#define SPEEDOMETER_H
|
||||||
|
|
||||||
#include <QskControl.h>
|
#include <QskRangeControl.h>
|
||||||
|
|
||||||
class Speedometer : public QskControl
|
class Speedometer : public QskRangeControl
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
@ -12,22 +12,10 @@ public:
|
||||||
|
|
||||||
Speedometer( QQuickItem* parent = nullptr );
|
Speedometer( QQuickItem* parent = nullptr );
|
||||||
|
|
||||||
float value() const;
|
|
||||||
void setValue( float value ); // angle; should be within a set range
|
|
||||||
|
|
||||||
float startAngle() const;
|
|
||||||
void setStartAngle( float startAngle );
|
|
||||||
|
|
||||||
float endAngle() const;
|
|
||||||
void setEndAngle( float endAngle );
|
|
||||||
|
|
||||||
QVector< QString > labels() const;
|
QVector< QString > labels() const;
|
||||||
void setLabels( const QVector< QString >& labels );
|
void setLabels( const QVector< QString >& labels );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float m_value;
|
|
||||||
float m_startAngle;
|
|
||||||
float m_endAngle;
|
|
||||||
float m_labelsStep;
|
float m_labelsStep;
|
||||||
QVector< QString > m_labels;
|
QVector< QString > m_labels;
|
||||||
};
|
};
|
||||||
|
|
|
@ -29,11 +29,12 @@ SpeedometerDisplay::SpeedometerDisplay( QQuickItem *parent ) :
|
||||||
m_box->setSpacing( 20 );
|
m_box->setSpacing( 20 );
|
||||||
|
|
||||||
m_revCounter->setObjectName( QStringLiteral( "RevCounter" ) );
|
m_revCounter->setObjectName( QStringLiteral( "RevCounter" ) );
|
||||||
int startAngle = 145, endAngle = 305, value = 200, numberLabels = 8;
|
m_revCounter->setMinimum( 145 );
|
||||||
m_revCounter->setStartAngle( startAngle );
|
m_revCounter->setMaximum( 305 );
|
||||||
m_revCounter->setEndAngle( endAngle );
|
m_revCounter->setValue( 200 );
|
||||||
m_revCounter->setValue( value );
|
|
||||||
QVector< QString > revCounterLabels;
|
QVector< QString > revCounterLabels;
|
||||||
|
int numberLabels = 8;
|
||||||
|
revCounterLabels.reserve( numberLabels );
|
||||||
|
|
||||||
for ( int i = 0; i < numberLabels; ++i )
|
for ( int i = 0; i < numberLabels; ++i )
|
||||||
{
|
{
|
||||||
|
@ -43,14 +44,11 @@ SpeedometerDisplay::SpeedometerDisplay( QQuickItem *parent ) :
|
||||||
m_revCounter->setLabels( revCounterLabels );
|
m_revCounter->setLabels( revCounterLabels );
|
||||||
|
|
||||||
m_speedometer->setObjectName( QStringLiteral( "Speedometer" ) );
|
m_speedometer->setObjectName( QStringLiteral( "Speedometer" ) );
|
||||||
value = 280;
|
m_speedometer->setMinimum( -215 );
|
||||||
numberLabels = 23;
|
m_speedometer->setMaximum( 35 );
|
||||||
startAngle = -215;
|
m_speedometer->setValue( -90 );
|
||||||
endAngle = 35;
|
|
||||||
m_speedometer->setStartAngle( startAngle );
|
|
||||||
m_speedometer->setEndAngle( endAngle );
|
|
||||||
m_speedometer->setValue( value );
|
|
||||||
QVector< QString > speedometerLabels;
|
QVector< QString > speedometerLabels;
|
||||||
|
numberLabels = 23;
|
||||||
speedometerLabels.reserve( numberLabels );
|
speedometerLabels.reserve( numberLabels );
|
||||||
|
|
||||||
for ( int i = 0; i < numberLabels; ++i )
|
for ( int i = 0; i < numberLabels; ++i )
|
||||||
|
@ -76,8 +74,8 @@ SpeedometerDisplay::SpeedometerDisplay( QQuickItem *parent ) :
|
||||||
|
|
||||||
|
|
||||||
m_fuelGauge->setObjectName( QStringLiteral( "Fuel Gauge" ) );
|
m_fuelGauge->setObjectName( QStringLiteral( "Fuel Gauge" ) );
|
||||||
m_fuelGauge->setStartAngle( 195 );
|
m_fuelGauge->setMinimum( 195 );
|
||||||
m_fuelGauge->setEndAngle( 345 );
|
m_fuelGauge->setMaximum( 345 );
|
||||||
m_fuelGauge->setValue( 330 );
|
m_fuelGauge->setValue( 330 );
|
||||||
|
|
||||||
QVector< QString > fuelGaugeLabels;
|
QVector< QString > fuelGaugeLabels;
|
||||||
|
|
|
@ -112,8 +112,8 @@ QSGNode* SpeedometerSkinlet::updateLabelsNode( const Speedometer* speedometer, Q
|
||||||
ticksNode = new TicksNode( Qt::white );
|
ticksNode = new TicksNode( Qt::white );
|
||||||
}
|
}
|
||||||
|
|
||||||
const float startAngle = speedometer->startAngle();
|
const auto startAngle = speedometer->minimum();
|
||||||
const float endAngle = speedometer->endAngle();
|
const auto endAngle = speedometer->maximum();
|
||||||
const auto step = ( endAngle - startAngle ) / ( labelsCount - 1 );
|
const auto step = ( endAngle - startAngle ) / ( labelsCount - 1 );
|
||||||
|
|
||||||
auto geometry = ticksNode->geometry();
|
auto geometry = ticksNode->geometry();
|
||||||
|
@ -133,7 +133,7 @@ QSGNode* SpeedometerSkinlet::updateLabelsNode( const Speedometer* speedometer, Q
|
||||||
const QMarginsF numbersMargins = speedometer->marginsHint( Speedometer::Labels | QskAspect::Margin );
|
const QMarginsF numbersMargins = speedometer->marginsHint( Speedometer::Labels | QskAspect::Margin );
|
||||||
QFontMetrics fontMetrics( speedometer->effectiveFont( Speedometer::Labels ) );
|
QFontMetrics fontMetrics( speedometer->effectiveFont( Speedometer::Labels ) );
|
||||||
|
|
||||||
float angle = startAngle;
|
auto angle = startAngle;
|
||||||
|
|
||||||
// Create a series of tickmarks from minimum to maximum
|
// Create a series of tickmarks from minimum to maximum
|
||||||
for( int i = 0; i < labelsCount; ++i, angle += step )
|
for( int i = 0; i < labelsCount; ++i, angle += step )
|
||||||
|
@ -141,13 +141,13 @@ QSGNode* SpeedometerSkinlet::updateLabelsNode( const Speedometer* speedometer, Q
|
||||||
qreal cosine = qCos( qDegreesToRadians( angle ) );
|
qreal cosine = qCos( qDegreesToRadians( angle ) );
|
||||||
qreal sine = qSin( qDegreesToRadians( angle ) );
|
qreal sine = qSin( qDegreesToRadians( angle ) );
|
||||||
|
|
||||||
float xStart = center.x() + radius * cosine;
|
auto xStart = center.x() + radius * cosine;
|
||||||
float yStart = center.y() + radius * sine;
|
auto yStart = center.y() + radius * sine;
|
||||||
|
|
||||||
// ### skin hint for each of highlighted / normal marks
|
// ### skin hint for each of highlighted / normal marks
|
||||||
qreal length = 15;
|
qreal length = 15;
|
||||||
float xEnd = center.x() + ( radius - length ) * cosine;
|
auto xEnd = center.x() + ( radius - length ) * cosine;
|
||||||
float yEnd = center.y() + ( radius - length ) * sine;
|
auto yEnd = center.y() + ( radius - length ) * sine;
|
||||||
|
|
||||||
vertexData[0].set( xStart, yStart );
|
vertexData[0].set( xStart, yStart );
|
||||||
vertexData[1].set( xEnd, yEnd );
|
vertexData[1].set( xEnd, yEnd );
|
||||||
|
@ -161,13 +161,13 @@ QSGNode* SpeedometerSkinlet::updateLabelsNode( const Speedometer* speedometer, Q
|
||||||
{
|
{
|
||||||
const QString& text = labels.at( i );
|
const QString& text = labels.at( i );
|
||||||
|
|
||||||
float w = fontMetrics.width( text );
|
auto w = fontMetrics.width( text );
|
||||||
float h = fontMetrics.height();
|
auto h = fontMetrics.height();
|
||||||
float adjustX = ( -0.5 * cosine - 0.5 ) * w;
|
auto adjustX = ( -0.5 * cosine - 0.5 ) * w;
|
||||||
float adjustY = ( -0.5 * sine - 0.5 ) * h;
|
auto adjustY = ( -0.5 * sine - 0.5 ) * h;
|
||||||
|
|
||||||
float numbersX = xEnd + ( -1 * numbersMargins.left() * cosine ) + adjustX;
|
auto numbersX = xEnd + ( -1 * numbersMargins.left() * cosine ) + adjustX;
|
||||||
float numbersY = yEnd + ( -1 * numbersMargins.top() * sine ) + adjustY;
|
auto numbersY = yEnd + ( -1 * numbersMargins.top() * sine ) + adjustY;
|
||||||
|
|
||||||
QRectF numbersRect( numbersX, numbersY, w, h );
|
QRectF numbersRect( numbersX, numbersY, w, h );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue