120 lines
4.0 KiB
C++
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() );
|
|
}
|