qskinny/examples/automotive/SpeedometerDisplay.cpp
Peter Hartmann 60a4f2ff1f Speedometer: inherit from QskRangeControl and make skinnable (#62)
* Speedometer: Inherit from QskRangeControl

We don't need start/endAngle() etc. and value() anymore,
but can use the methods from QskRangeControl.

* Speedometer: Make it skinnable

* automotive example: Only use two specially created skins

... because the default skins do not have hints for e.g. the speedometer.

Also, display the speedometer page by default.
2018-05-09 08:31:43 +02:00

117 lines
3.8 KiB
C++

#include "SpeedometerDisplay.h"
#include "Speedometer.h"
#include <QskEvent.h>
#include <QskLinearBox.h>
#include <QskTextLabel.h>
#include <QTime>
#include <QTimer>
#include <QtGlobal>
SpeedometerDisplay::SpeedometerDisplay( QQuickItem *parent ) :
QskControl( parent ),
m_box( new QskLinearBox( Qt::Horizontal, this ) ),
m_revCounter( new Speedometer( m_box ) ),
m_revCounterText( new QskTextLabel( QStringLiteral( "x 1000 min^-1" ), m_revCounter ) ),
m_speedometer( new Speedometer( m_box ) ),
m_speedometerText( new QskTextLabel( QStringLiteral( "km/h" ), m_speedometer ) ),
m_fuelGauge( new Speedometer( m_box ) ),
m_fuelGaugeText( new QskTextLabel( QStringLiteral( "fuel" ), m_fuelGauge ) )
{
qsrand( static_cast< uint >( QTime::currentTime().msec() ) );
setPolishOnResize( true );
m_box->setAutoAddChildren( true );
m_box->setAutoLayoutChildren( true );
m_box->setSpacing( 20 );
m_revCounter->setObjectName( QStringLiteral( "RevCounter" ) );
m_revCounter->setMinimum( 145 );
m_revCounter->setMaximum( 305 );
m_revCounter->setValue( 200 );
QVector< QString > revCounterLabels;
int numberLabels = 8;
revCounterLabels.reserve( numberLabels );
for ( int i = 0; i < numberLabels; ++i )
{
revCounterLabels.append( QString::number( i ) );
}
m_revCounter->setLabels( revCounterLabels );
m_speedometer->setObjectName( QStringLiteral( "Speedometer" ) );
m_speedometer->setMinimum( -215 );
m_speedometer->setMaximum( 35 );
m_speedometer->setValue( -90 );
QVector< QString > speedometerLabels;
numberLabels = 23;
speedometerLabels.reserve( numberLabels );
for ( int i = 0; i < numberLabels; ++i )
{
speedometerLabels.append( QString::number( i * 10 ) );
}
m_speedometer->setLabels( speedometerLabels );
auto timer = new QTimer( this );
connect( timer, &QTimer::timeout, this, [ this ]()
{
auto speedometerValue = m_speedometer->value() + qrand() % 3 - 0.95;
m_speedometer->setValue( speedometerValue );
auto fuelGaugeValue = 0.99997 * m_fuelGauge->value();
m_fuelGauge->setValue( fuelGaugeValue );
});
timer->setInterval( 16 );
timer->start();
m_fuelGauge->setObjectName( QStringLiteral( "Fuel Gauge" ) );
m_fuelGauge->setMinimum( 195 );
m_fuelGauge->setMaximum( 345 );
m_fuelGauge->setValue( 330 );
QVector< QString > fuelGaugeLabels;
fuelGaugeLabels.append( { "0", "", "1/2", "", "1/1" } );
m_fuelGauge->setLabels( fuelGaugeLabels );
m_revCounterText->setMargins( 50 );
m_speedometerText->setMargins( 50 );
m_fuelGaugeText->setMargins( 50 );
}
void SpeedometerDisplay::updateLayout()
{
auto radius = qMin( 0.33 * size().width(), size().height() );
auto x = ( width() - radius * 2.7 - 2 * m_box->spacing() ) / 2;
auto y = ( height() - radius ) / 2;
m_box->setPosition( { x, y } );
m_revCounter->setFixedSize( radius, radius );
QSizeF hint = m_revCounterText->sizeHint();
x = ( radius - hint.width() ) / 2;
y = ( ( radius - hint.height() ) / 2 ) + m_revCounterText->margins().top();
m_revCounterText->setGeometry( x, y, hint.width(), hint.height() );
m_speedometer->setFixedSize( radius, radius );
hint = m_speedometerText->sizeHint();
x = ( radius - hint.width() ) / 2;
y = ( ( radius - hint.height() ) / 2 ) + m_speedometerText->margins().top();
m_speedometerText->setGeometry( x, y, hint.width(), hint.height() );
m_fuelGauge->setFixedSize( 0.7 * radius, 0.7 * radius );
hint = m_fuelGaugeText->sizeHint();
x = ( 0.7 * radius - hint.width() ) / 2;
y = ( ( 0.7 * radius - hint.height() ) / 2 ) + m_fuelGaugeText->margins().top();
m_fuelGaugeText->setGeometry( x, y, hint.width(), hint.height() );
}