From b7c54d691676d23f4e243feaa978d9e52f9ba107 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 5 Apr 2018 11:23:48 +0200 Subject: [PATCH] Speedometer: Add some API --- examples/automotive/MainWindow.cpp | 25 ++++++++-------- examples/automotive/MainWindow.h | 4 +++ examples/automotive/Speedometer.cpp | 16 +++++++++-- examples/automotive/Speedometer.h | 6 ++++ examples/automotive/SpeedometerDisplay.cpp | 33 ++++++++++++++++++---- examples/automotive/SpeedometerSkinlet.cpp | 2 +- 6 files changed, 65 insertions(+), 21 deletions(-) diff --git a/examples/automotive/MainWindow.cpp b/examples/automotive/MainWindow.cpp index 3675f75b..5b4970f5 100644 --- a/examples/automotive/MainWindow.cpp +++ b/examples/automotive/MainWindow.cpp @@ -13,7 +13,8 @@ #include #include -MainWindow::MainWindow() +MainWindow::MainWindow() : + m_layout( nullptr ) { const QImage image( QStringLiteral( ":/images/background.jpg" ) ); @@ -21,27 +22,27 @@ MainWindow::MainWindow() backgroundImage->setGraphic( QskGraphic::fromImage( image ) ); backgroundImage->setFillMode( QskGraphicLabel::Stretch ); + m_layout = new QskLinearBox( Qt::Vertical, contentItem() ); + auto header = headerBar(); auto content = mainContent(); auto footer = footerBar(); - auto layout = new QskLinearBox( Qt::Vertical, contentItem() ); + m_layout->addItem( header ); + m_layout->setStretchFactor( header, 1 ); - layout->addItem( header ); - layout->setStretchFactor( header, 1 ); + m_layout->addItem( content ); + m_layout->setStretchFactor( content, 10 ); - layout->addItem( content ); - layout->setStretchFactor( content, 10 ); - - layout->addItem( footer ); - layout->setStretchFactor( footer, 1 ); + m_layout->addItem( footer ); + m_layout->setStretchFactor( footer, 1 ); setAutoLayoutChildren( true ); } QQuickItem* MainWindow::headerBar() const { - auto* header = new ButtonBar(); + auto* header = new ButtonBar( m_layout ); header->addIndicator( "bluetooth" ); header->addIndicator( "location" ); header->addIndicator( "phone" ); @@ -57,13 +58,13 @@ QQuickItem* MainWindow::headerBar() const QQuickItem* MainWindow::mainContent() const { - return new SpeedometerDisplay(); + return new SpeedometerDisplay( m_layout ); //return new SoundControl(); ### } QQuickItem* MainWindow::footerBar() const { - auto* footer = new ButtonBar(); + auto* footer = new ButtonBar( m_layout ); footer->addIndicator( "cloud" ); footer->addIndicator( "man" ); diff --git a/examples/automotive/MainWindow.h b/examples/automotive/MainWindow.h index de1166de..1b3d793b 100644 --- a/examples/automotive/MainWindow.h +++ b/examples/automotive/MainWindow.h @@ -3,6 +3,8 @@ #include +class QskLinearBox; + class QQuickItem; class MainWindow : public QskWindow @@ -14,6 +16,8 @@ private: QQuickItem* headerBar() const; QQuickItem* mainContent() const; QQuickItem* footerBar() const; + + QskLinearBox* m_layout; }; #endif diff --git a/examples/automotive/Speedometer.cpp b/examples/automotive/Speedometer.cpp index e7fac012..fef8968e 100644 --- a/examples/automotive/Speedometer.cpp +++ b/examples/automotive/Speedometer.cpp @@ -9,13 +9,25 @@ QSK_SUBCONTROL( Speedometer, Numbers ) QSK_SUBCONTROL( Speedometer, Needle ) Speedometer::Speedometer( QQuickItem* parent ) : - QskControl( parent ) + QskControl( parent ), + m_value( 0.0 ) { } QSizeF Speedometer::contentsSizeHint() const { - return QSizeF( 300, 300 ); + return { 300, 300 }; +} + +float Speedometer::value() const +{ + return m_value; +} + +void Speedometer::setValue( float value ) +{ + m_value = value; + update(); } #include "moc_Speedometer.cpp" diff --git a/examples/automotive/Speedometer.h b/examples/automotive/Speedometer.h index d8ac9022..edaa957b 100644 --- a/examples/automotive/Speedometer.h +++ b/examples/automotive/Speedometer.h @@ -13,6 +13,12 @@ public: Speedometer( QQuickItem* parent = nullptr ); virtual QSizeF contentsSizeHint() const override; + + float value() const; + void setValue( float value ); // angle; should be within a set range + +private: + float m_value; }; #endif // SPEEDOMETER_H diff --git a/examples/automotive/SpeedometerDisplay.cpp b/examples/automotive/SpeedometerDisplay.cpp index 3fb07fff..2d6799f0 100644 --- a/examples/automotive/SpeedometerDisplay.cpp +++ b/examples/automotive/SpeedometerDisplay.cpp @@ -5,19 +5,40 @@ #include #include +#include +#include +#include + SpeedometerDisplay::SpeedometerDisplay( QQuickItem *parent ) : QskControl( parent ) { - QskLinearBox* box = new QskLinearBox( Qt::Horizontal, this ); + qsrand( QTime::currentTime().msec() ); + + auto box = new QskLinearBox( Qt::Horizontal, this ); box->setAutoAddChildren( true ); box->setAutoLayoutChildren( true ); box->setMargins( QMarginsF( 40, 20, 40, 20 ) ); box->setAlignment( 0, Qt::AlignHCenter ); - QskTextLabel* label = new QskTextLabel( QStringLiteral( "text" ), box ); - label->setFixedSize( QSizeF( 300, 300 ) ); - label->setAlignment( Qt::AlignHCenter | Qt::AlignCenter ); + auto revCounter = new Speedometer( box ); + revCounter->setFixedSize( QSizeF( 300, 300 ) ); +// revCounter->setSizePolicy( QskSizePolicy::Maximum, QskSizePolicy::Maximum ); + revCounter->setValue( 270 ); - Speedometer* speedometer = new Speedometer( box ); - speedometer->setFixedSize( QSizeF( 400, 400 ) ); + auto speedometer = new Speedometer( box ); + speedometer->setFixedSize( QSizeF( 300, 300 ) ); +// speedometer->setSizePolicy( QskSizePolicy::Maximum, QskSizePolicy::Maximum ); + speedometer->setValue( 270 ); + + auto timer = new QTimer( this ); + connect( timer, &QTimer::timeout, this, [ speedometer ]() { + int newValue = speedometer->value() + qrand() % 3 - 0.8; + speedometer->setValue( newValue ); + }); + timer->setInterval( 16 ); + timer->start(); + + auto fuelGauge = new Speedometer( box ); + fuelGauge->setFixedSize( QSizeF( 200, 200 ) ); + fuelGauge->setValue( 270 ); } diff --git a/examples/automotive/SpeedometerSkinlet.cpp b/examples/automotive/SpeedometerSkinlet.cpp index c9436212..b5267969 100644 --- a/examples/automotive/SpeedometerSkinlet.cpp +++ b/examples/automotive/SpeedometerSkinlet.cpp @@ -243,7 +243,7 @@ QSGNode* SpeedometerSkinlet::updateNeedleNode( const Speedometer* speedometer, Q float xStart = center.x() - needleWidth ; float yStart = center.y(); - float angle = 315; // ### API + float angle = speedometer->value(); qreal cosine = qCos( qDegreesToRadians( angle ) ); qreal sine = qSin( qDegreesToRadians( angle ) );