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:
Peter Hartmann 2018-04-11 12:07:10 +02:00
parent c46b105879
commit 41d97c8c91
4 changed files with 27 additions and 75 deletions

View File

@ -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;

View File

@ -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;
}; };

View File

@ -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;

View File

@ -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 );