qskinny/examples/automotive/SpeedometerDisplay.cpp
2019-06-20 12:02:28 +02:00

120 lines
4.0 KiB
C++

/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the 3-clause BSD License
*****************************************************************************/
#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() );
}