From 554f07c5b40b63b66dd15abd66821d9db621ff56 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 5 Apr 2018 11:23:38 +0200 Subject: [PATCH 1/3] automotive example: Add speedometer page --- examples/automotive/DefaultSkin.cpp | 4 + examples/automotive/MainWindow.cpp | 6 +- examples/automotive/OtherSkin.cpp | 4 + examples/automotive/Speedometer.cpp | 21 ++ examples/automotive/Speedometer.h | 18 ++ examples/automotive/SpeedometerDisplay.cpp | 23 ++ examples/automotive/SpeedometerDisplay.h | 12 + examples/automotive/SpeedometerSkinlet.cpp | 279 +++++++++++++++++++++ examples/automotive/SpeedometerSkinlet.h | 38 +++ examples/automotive/automotive.pro | 10 +- examples/automotive/main.cpp | 5 +- examples/sliders/SliderSkinlet.h | 2 +- 12 files changed, 415 insertions(+), 7 deletions(-) create mode 100644 examples/automotive/Speedometer.cpp create mode 100644 examples/automotive/Speedometer.h create mode 100644 examples/automotive/SpeedometerDisplay.cpp create mode 100644 examples/automotive/SpeedometerDisplay.h create mode 100644 examples/automotive/SpeedometerSkinlet.cpp create mode 100644 examples/automotive/SpeedometerSkinlet.h diff --git a/examples/automotive/DefaultSkin.cpp b/examples/automotive/DefaultSkin.cpp index 4dc76035..817a80ec 100644 --- a/examples/automotive/DefaultSkin.cpp +++ b/examples/automotive/DefaultSkin.cpp @@ -4,6 +4,9 @@ #include "SoundControl.h" #include "ButtonBar.h" +#include "Speedometer.h" +#include "SpeedometerSkinlet.h" + #include #include #include @@ -80,6 +83,7 @@ DefaultSkin::DefaultSkin( const QString& name, QObject* parent ): m_scheme( Daylight ) { setObjectName( "DefaultSkin" ); + declareSkinlet< Speedometer, SpeedometerSkinlet >(); initHints(); } diff --git a/examples/automotive/MainWindow.cpp b/examples/automotive/MainWindow.cpp index e076c28b..3675f75b 100644 --- a/examples/automotive/MainWindow.cpp +++ b/examples/automotive/MainWindow.cpp @@ -2,6 +2,7 @@ #include "ButtonBar.h" #include "SoundControl.h" #include "SkinFactory.h" +#include "SpeedometerDisplay.h" #include #include @@ -14,7 +15,7 @@ MainWindow::MainWindow() { - const QImage image( ":/images/background.jpg" ); + const QImage image( QStringLiteral( ":/images/background.jpg" ) ); auto backgroundImage = new QskGraphicLabel( contentItem() ); backgroundImage->setGraphic( QskGraphic::fromImage( image ) ); @@ -56,7 +57,8 @@ QQuickItem* MainWindow::headerBar() const QQuickItem* MainWindow::mainContent() const { - return new SoundControl(); + return new SpeedometerDisplay(); + //return new SoundControl(); ### } QQuickItem* MainWindow::footerBar() const diff --git a/examples/automotive/OtherSkin.cpp b/examples/automotive/OtherSkin.cpp index 05aed233..c0a34fbe 100644 --- a/examples/automotive/OtherSkin.cpp +++ b/examples/automotive/OtherSkin.cpp @@ -4,6 +4,9 @@ #include "SoundControl.h" #include "ButtonBar.h" +#include "Speedometer.h" +#include "SpeedometerSkinlet.h" + #include #include #include @@ -57,6 +60,7 @@ OtherSkin::OtherSkin( const QString& name, QObject* parent ): m_palette( new Palette ) { setObjectName( "OtherSkin" ); + declareSkinlet< Speedometer, SpeedometerSkinlet >(); initHints(); initGraphicFilters(); } diff --git a/examples/automotive/Speedometer.cpp b/examples/automotive/Speedometer.cpp new file mode 100644 index 00000000..e7fac012 --- /dev/null +++ b/examples/automotive/Speedometer.cpp @@ -0,0 +1,21 @@ +#include "Speedometer.h" + +#include +#include + +QSK_SUBCONTROL( Speedometer, Panel ) +QSK_SUBCONTROL( Speedometer, Ticks ) +QSK_SUBCONTROL( Speedometer, Numbers ) +QSK_SUBCONTROL( Speedometer, Needle ) + +Speedometer::Speedometer( QQuickItem* parent ) : + QskControl( parent ) +{ +} + +QSizeF Speedometer::contentsSizeHint() const +{ + return QSizeF( 300, 300 ); +} + +#include "moc_Speedometer.cpp" diff --git a/examples/automotive/Speedometer.h b/examples/automotive/Speedometer.h new file mode 100644 index 00000000..d8ac9022 --- /dev/null +++ b/examples/automotive/Speedometer.h @@ -0,0 +1,18 @@ +#ifndef SPEEDOMETER_H +#define SPEEDOMETER_H + +#include + +class Speedometer : public QskControl +{ + Q_OBJECT + +public: + QSK_SUBCONTROLS( Panel, Ticks, Numbers, Needle ) + + Speedometer( QQuickItem* parent = nullptr ); + + virtual QSizeF contentsSizeHint() const override; +}; + +#endif // SPEEDOMETER_H diff --git a/examples/automotive/SpeedometerDisplay.cpp b/examples/automotive/SpeedometerDisplay.cpp new file mode 100644 index 00000000..3fb07fff --- /dev/null +++ b/examples/automotive/SpeedometerDisplay.cpp @@ -0,0 +1,23 @@ +#include "SpeedometerDisplay.h" + +#include "Speedometer.h" + +#include +#include + +SpeedometerDisplay::SpeedometerDisplay( QQuickItem *parent ) : + QskControl( parent ) +{ + QskLinearBox* 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 ); + + Speedometer* speedometer = new Speedometer( box ); + speedometer->setFixedSize( QSizeF( 400, 400 ) ); +} diff --git a/examples/automotive/SpeedometerDisplay.h b/examples/automotive/SpeedometerDisplay.h new file mode 100644 index 00000000..6c071cb7 --- /dev/null +++ b/examples/automotive/SpeedometerDisplay.h @@ -0,0 +1,12 @@ +#ifndef SPEEDOMETERDISPLAY_H +#define SPEEDOMETERDISPLAY_H + +#include + +class SpeedometerDisplay : public QskControl +{ +public: + SpeedometerDisplay( QQuickItem* parent = nullptr ); +}; + +#endif // SPEEDOMETERDISPLAY_H diff --git a/examples/automotive/SpeedometerSkinlet.cpp b/examples/automotive/SpeedometerSkinlet.cpp new file mode 100644 index 00000000..c9436212 --- /dev/null +++ b/examples/automotive/SpeedometerSkinlet.cpp @@ -0,0 +1,279 @@ +#include "SpeedometerSkinlet.h" +#include "Speedometer.h" + +#include +#include +#include +#include +#include +#include +#include // ### remove + +#include +#include +#include + +namespace +{ + + class TicksNode : public QSGGeometryNode + { + public: + TicksNode( const QColor& color ): + m_geometry( QSGGeometry::defaultAttributes_Point2D(), 0 ) + { + m_geometry.setDrawingMode( GL_LINES ); + m_geometry.setVertexDataPattern( QSGGeometry::StaticPattern ); + + m_material.setColor( color ); + + setGeometry( &m_geometry ); + setMaterial( &m_material ); + } + + private: + QSGFlatColorMaterial m_material; + QSGGeometry m_geometry; + }; +} + +SpeedometerSkinlet::SpeedometerSkinlet( QskSkin* skin ) : + QskSkinlet( skin ) +{ + setNodeRoles( { PanelRole, TicksRole, NumbersRole, NeedleRole } ); +} + +SpeedometerSkinlet::~SpeedometerSkinlet() +{ +} + +QRectF SpeedometerSkinlet::subControlRect( const QskSkinnable* skinnable, + QskAspect::Subcontrol ) const +{ + const auto speedometer = static_cast< const Speedometer* >( skinnable ); + + // ### differentiate for subcontrols + return speedometer->contentsRect(); +} + +QSGNode* SpeedometerSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, + QSGNode* node ) const +{ + const Speedometer* speedometer = static_cast< const Speedometer* >( skinnable ); + + switch( nodeRole ) + { + case PanelRole: + return updatePanelNode( speedometer, node ); + + case TicksRole: + return updateTicksNode( speedometer, node ); + + case NumbersRole: + return updateNumbersNode( speedometer, node ); + + case NeedleRole: + return updateNeedleNode( speedometer, node ); + + default: + return nullptr; + } +} + +QSGNode* SpeedometerSkinlet::updatePanelNode( const Speedometer* speedometer, QSGNode* node ) const +{ + auto boxNode = static_cast< QskBoxNode* >( node ); + + if( boxNode == nullptr ) + { + QRectF panelRect = subControlRect( speedometer, Speedometer::Panel ); + boxNode = new QskBoxNode; + qreal radius = panelRect.width() / 2; + QskBoxShapeMetrics shapeMetrics( radius, radius, radius, radius ); + QskBoxBorderMetrics borderMetrics( 2 ); + QskBoxBorderColors borderColors( Qt::white ); + QskGradient gradient( Qt::black ); + boxNode->setBoxData( panelRect, shapeMetrics, borderMetrics, borderColors, gradient ); + } + + return boxNode; +} + +QSGNode* SpeedometerSkinlet::updateTicksNode( const Speedometer* speedometer, QSGNode* node ) const +{ + auto ticksNode = static_cast< TicksNode* >( node ); + + if( ticksNode == nullptr ) + { + ticksNode = new TicksNode( Qt::white ); + } + + // ### add API for this: + // ### make qfloat etc.? + float startAngle = -215; + float endAngle = 35; // ### angle is still wrong somehow + const int tickCount = 18; + int highlightedMarksStep = 3; + + auto geometry = ticksNode->geometry(); + geometry->allocate( tickCount * 2 ); + + auto vertexData = geometry->vertexDataAsPoint2D(); + memset( vertexData, 0, static_cast< size_t >( geometry->vertexCount() ) ); + + auto stepStride = ( endAngle - startAngle ) / ( tickCount - 1 ); + + QMarginsF panelMargins = speedometer->marginsHint( Speedometer::Panel | QskAspect::Margin ); + const QRectF panelRect = subControlRect( speedometer, + Speedometer::Panel ).marginsRemoved( panelMargins ); + + QPointF center = QPointF( panelRect.x() + panelRect.width() / 2, + panelRect.y() + panelRect.height() / 2 ); + auto radius = static_cast< float >( panelRect.width() / 2 ); + + const QMarginsF numbersMargins = speedometer->marginsHint( Speedometer::Numbers | QskAspect::Margin ); + QFontMetrics fontMetrics( speedometer->effectiveFont( Speedometer::Numbers ) ); + + float angle = startAngle; + + // Create a series of tickmarks from minimum to maximum + for( int i = 0; i < tickCount; ++i, angle += stepStride ) + { + qreal cosine = qCos( qDegreesToRadians( angle ) ); + qreal sine = qSin( qDegreesToRadians( angle ) ); + + float xStart = center.x() + radius * cosine; + float yStart = center.y() + radius * sine; + + // ### skin hint for each of highlighted / normal marks + qreal length = ( i % highlightedMarksStep == 0 ) ? 15 : 15; + float xEnd = center.x() + ( radius - length ) * cosine; + float yEnd = center.y() + ( radius - length ) * sine; + + vertexData[0].set( xStart, yStart ); + vertexData[1].set( xEnd, yEnd ); + + vertexData += 2; + + QString text = QString::number( i * 10 ); + + float w = fontMetrics.width( text ); + float h = fontMetrics.height(); + float adjustX = ( -0.5 * cosine - 0.5 ) * w; + float adjustY = ( -0.5 * sine - 0.5 ) * h; + + float numbersX = xEnd + ( -1 * numbersMargins.left() * cosine ) + adjustX; + float numbersY = yEnd + ( -1 * numbersMargins.top() * sine ) + adjustY; + + QRectF numbersRect( numbersX, numbersY, w, h ); + + QskTextNode* numbersNode; + + if ( ticksNode->childCount() > i ) + { + numbersNode = static_cast< QskTextNode* >( ticksNode->childAtIndex( i ) ); + } + else + { + numbersNode = new QskTextNode(); + } + + numbersNode->setTextData( speedometer, text, numbersRect, QFont(), + QskTextOptions(), QskTextColors( Qt::white ), + Qt::AlignCenter | Qt::AlignHCenter, Qsk::Normal ); + + if ( ticksNode->childCount() <= i ) + { + ticksNode->appendChildNode( numbersNode ); + } + // ### remove nodes in case they are superfluous + } + + geometry->setLineWidth( 2 ); + geometry->markVertexDataDirty(); + + ticksNode->markDirty( QSGNode::DirtyGeometry ); + + return ticksNode; +} + +QSGNode* SpeedometerSkinlet::updateNumbersNode( const Speedometer* speedometer, QSGNode* node ) const +{ + return nullptr; +} + +QSGNode* SpeedometerSkinlet::updateNeedleNode( const Speedometer* speedometer, QSGNode* node ) const +{ + QMarginsF margins = speedometer->marginsHint( Speedometer::Panel | QskAspect::Margin ); + const QRectF panelRect = subControlRect( speedometer, Speedometer::Panel ).marginsRemoved( margins ); + auto radius = 15; // ### skin hint + QPointF center = QPointF( panelRect.x() + panelRect.width() / 2, + panelRect.y() + panelRect.height() / 2 ); + + auto boxNode = static_cast< QskBoxNode* >( node ); + + if( boxNode == nullptr ) + { + boxNode = new QskBoxNode; + QRectF centerNodeRect( center.x() - radius, center.y() - radius, + 2 * radius, 2 * radius ); + QskBoxShapeMetrics shapeMetrics( radius, radius, radius, radius ); + QskBoxBorderMetrics borderMetrics( 2 ); + QskBoxBorderColors borderColors( Qt::red ); + QskGradient gradient( Qt::red ); + boxNode->setBoxData( centerNodeRect, shapeMetrics, borderMetrics, borderColors, gradient ); + } + + TicksNode* needleNode; + + if ( boxNode->childCount() == 0 ) + { + needleNode = new TicksNode( Qt::red ); + } + else + { + needleNode = static_cast< TicksNode* >( boxNode->childAtIndex( 0 ) ); + } + + auto panelRadius = static_cast< float >( panelRect.width() / 2 ); + + auto needleWidth = 2; // ### do differently somehow + QRectF needleRect( center.x() - needleWidth , center.y() - needleWidth , + panelRadius - ( needleWidth + 10 ), 2 * needleWidth ); + float xStart = center.x() - needleWidth ; + float yStart = center.y(); + + float angle = 315; // ### API + qreal cosine = qCos( qDegreesToRadians( angle ) ); + qreal sine = qSin( qDegreesToRadians( angle ) ); + + float needleRadius = panelRadius - 10; // 10 == margins ### skinhint + float xEnd = center.x() + needleRadius * cosine; + float yEnd = center.y() + needleRadius * sine; + + auto geometry = needleNode->geometry(); + geometry->allocate( 2 ); + + auto vertexData = geometry->vertexDataAsPoint2D(); + memset( vertexData, 0, static_cast< size_t >( geometry->vertexCount() ) ); + + vertexData[0].set( xStart, yStart ); + vertexData[1].set( xEnd, yEnd ); + + geometry->setLineWidth( 2 * needleWidth ); + geometry->markVertexDataDirty(); + + needleNode->markDirty( QSGNode::DirtyGeometry ); + + + + + if ( boxNode->childCount() == 0 ) + { + boxNode->appendChildNode( needleNode ); + } + + return boxNode; +} + +#include "moc_SpeedometerSkinlet.cpp" diff --git a/examples/automotive/SpeedometerSkinlet.h b/examples/automotive/SpeedometerSkinlet.h new file mode 100644 index 00000000..06bb013f --- /dev/null +++ b/examples/automotive/SpeedometerSkinlet.h @@ -0,0 +1,38 @@ +#ifndef SPEEDOMETERSKINLET_H +#define SPEEDOMETERSKINLET_H + +#include + +class Speedometer; + +class SpeedometerSkinlet : public QskSkinlet +{ + Q_GADGET + +public: + + enum NodeRole + { + PanelRole, + TicksRole, + NumbersRole, + NeedleRole + }; + + Q_INVOKABLE SpeedometerSkinlet( QskSkin* skin = nullptr ); + virtual ~SpeedometerSkinlet() override; + + virtual QRectF subControlRect( const QskSkinnable* skinnable, + QskAspect::Subcontrol ) const override; + +protected: + virtual QSGNode* updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const override; + +private: + QSGNode* updatePanelNode( const Speedometer*, QSGNode* ) const; + QSGNode* updateTicksNode( const Speedometer*, QSGNode* ) const; + QSGNode* updateNumbersNode( const Speedometer*, QSGNode* ) const; + QSGNode* updateNeedleNode( const Speedometer*, QSGNode* ) const; +}; + +#endif // SPEEDOMETERSKINLET_H diff --git a/examples/automotive/automotive.pro b/examples/automotive/automotive.pro index cab1fdc9..bad63ff9 100644 --- a/examples/automotive/automotive.pro +++ b/examples/automotive/automotive.pro @@ -18,7 +18,10 @@ HEADERS += \ SkinFactory.h \ DefaultSkin.h \ OtherSkin.h \ - MainWindow.h + MainWindow.h \ + Speedometer.h \ + SpeedometerSkinlet.h \ + SpeedometerDisplay.h SOURCES += \ ButtonBar.cpp \ @@ -27,7 +30,10 @@ SOURCES += \ DefaultSkin.cpp \ OtherSkin.cpp \ MainWindow.cpp \ - main.cpp + main.cpp \ + Speedometer.cpp \ + SpeedometerSkinlet.cpp \ + SpeedometerDisplay.cpp QRCFILES += \ images.qrc diff --git a/examples/automotive/main.cpp b/examples/automotive/main.cpp index 7e95fafb..566cff41 100644 --- a/examples/automotive/main.cpp +++ b/examples/automotive/main.cpp @@ -16,7 +16,8 @@ int main( int argc, char** argv ) auto skinFactory = new SkinFactory(); qskSkinManager->setPluginPaths( QStringList() ); // no plugins - qskSkinManager->registerFactory( "SampleSkinFactory", skinFactory ); + qskSkinManager->registerFactory( QStringLiteral( "SampleSkinFactory" ), + skinFactory ); QGuiApplication app( argc, argv ); @@ -33,7 +34,7 @@ int main( int argc, char** argv ) // CTRL-S allow to rotate through the registered skins and CTRL-T // changes the colors, when the DefaultSkin is active. - qskSetup->setSkin( "DefaultSkin" ); + qskSetup->setSkin( QStringLiteral( "DefaultSkin" ) ); cout << "CTRL-S to change the skin." << endl; cout << "CTRL-T to change the color scheme, when the \"Default\" skin is active." << endl; diff --git a/examples/sliders/SliderSkinlet.h b/examples/sliders/SliderSkinlet.h index 39e1ab52..521f632d 100644 --- a/examples/sliders/SliderSkinlet.h +++ b/examples/sliders/SliderSkinlet.h @@ -23,7 +23,7 @@ public: }; SliderSkinlet(); - virtual ~SliderSkinlet(); + virtual ~SliderSkinlet() override; virtual QRectF subControlRect( const QskSkinnable*, QskAspect::Subcontrol ) const override; From b7c54d691676d23f4e243feaa978d9e52f9ba107 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 5 Apr 2018 11:23:48 +0200 Subject: [PATCH 2/3] 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 ) ); From 8ddd0398707d634d5aa7090e79d80270e163e3a2 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 5 Apr 2018 11:23:52 +0200 Subject: [PATCH 3/3] speedometers: Fix layout and add more public API --- examples/automotive/ButtonBar.cpp | 2 +- examples/automotive/MainWindow.cpp | 2 +- examples/automotive/Speedometer.cpp | 44 ++++-- examples/automotive/Speedometer.h | 17 ++- examples/automotive/SpeedometerDisplay.cpp | 116 +++++++++++++--- examples/automotive/SpeedometerDisplay.h | 16 +++ examples/automotive/SpeedometerSkinlet.cpp | 150 ++++++++++----------- examples/automotive/SpeedometerSkinlet.h | 6 +- 8 files changed, 238 insertions(+), 115 deletions(-) diff --git a/examples/automotive/ButtonBar.cpp b/examples/automotive/ButtonBar.cpp index abc2a823..73a899ed 100644 --- a/examples/automotive/ButtonBar.cpp +++ b/examples/automotive/ButtonBar.cpp @@ -58,5 +58,5 @@ void ButtonBar::addIndicator( const char* name ) QSizeF ButtonBar::contentsSizeHint() const { - return QSizeF( -1, 20 ); + return { -1, 20 }; } diff --git a/examples/automotive/MainWindow.cpp b/examples/automotive/MainWindow.cpp index 5b4970f5..0c108812 100644 --- a/examples/automotive/MainWindow.cpp +++ b/examples/automotive/MainWindow.cpp @@ -1,7 +1,7 @@ #include "MainWindow.h" #include "ButtonBar.h" -#include "SoundControl.h" #include "SkinFactory.h" +#include "SoundControl.h" #include "SpeedometerDisplay.h" #include diff --git a/examples/automotive/Speedometer.cpp b/examples/automotive/Speedometer.cpp index fef8968e..b3f439f6 100644 --- a/examples/automotive/Speedometer.cpp +++ b/examples/automotive/Speedometer.cpp @@ -1,24 +1,20 @@ #include "Speedometer.h" -#include #include +#include QSK_SUBCONTROL( Speedometer, Panel ) -QSK_SUBCONTROL( Speedometer, Ticks ) -QSK_SUBCONTROL( Speedometer, Numbers ) +QSK_SUBCONTROL( Speedometer, Labels ) QSK_SUBCONTROL( Speedometer, Needle ) Speedometer::Speedometer( QQuickItem* parent ) : QskControl( parent ), - m_value( 0.0 ) + m_value( 0.0 ), + m_startAngle( -215 ), + m_endAngle( 35 ) { } -QSizeF Speedometer::contentsSizeHint() const -{ - return { 300, 300 }; -} - float Speedometer::value() const { return m_value; @@ -30,4 +26,34 @@ void Speedometer::setValue( float 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 +{ + return m_labels; +} + +void Speedometer::setLabels( const QVector< QString >& labels ) +{ + m_labels = labels; +} + #include "moc_Speedometer.cpp" diff --git a/examples/automotive/Speedometer.h b/examples/automotive/Speedometer.h index edaa957b..70b083df 100644 --- a/examples/automotive/Speedometer.h +++ b/examples/automotive/Speedometer.h @@ -8,17 +8,28 @@ class Speedometer : public QskControl Q_OBJECT public: - QSK_SUBCONTROLS( Panel, Ticks, Numbers, Needle ) + QSK_SUBCONTROLS( Panel, Labels, Needle ) Speedometer( QQuickItem* parent = nullptr ); - virtual QSizeF contentsSizeHint() const override; - 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; + void setLabels( const QVector< QString >& labels ); + private: float m_value; + float m_startAngle; + float m_endAngle; + float m_labelsStep; + QVector< QString > m_labels; }; #endif // SPEEDOMETER_H diff --git a/examples/automotive/SpeedometerDisplay.cpp b/examples/automotive/SpeedometerDisplay.cpp index 2d6799f0..86cfd28b 100644 --- a/examples/automotive/SpeedometerDisplay.cpp +++ b/examples/automotive/SpeedometerDisplay.cpp @@ -2,6 +2,7 @@ #include "Speedometer.h" +#include #include #include @@ -10,35 +11,108 @@ #include SpeedometerDisplay::SpeedometerDisplay( QQuickItem *parent ) : - QskControl( 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( QTime::currentTime().msec() ); + qsrand( static_cast< uint >( 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 ); + setPolishOnResize( true ); - auto revCounter = new Speedometer( box ); - revCounter->setFixedSize( QSizeF( 300, 300 ) ); -// revCounter->setSizePolicy( QskSizePolicy::Maximum, QskSizePolicy::Maximum ); - revCounter->setValue( 270 ); + m_box->setAutoAddChildren( true ); + m_box->setAutoLayoutChildren( true ); + m_box->setSpacing( 20 ); - auto speedometer = new Speedometer( box ); - speedometer->setFixedSize( QSizeF( 300, 300 ) ); -// speedometer->setSizePolicy( QskSizePolicy::Maximum, QskSizePolicy::Maximum ); - speedometer->setValue( 270 ); + m_revCounter->setObjectName( QStringLiteral( "RevCounter" ) ); + int startAngle = 145, endAngle = 305, value = 200, numberLabels = 8; + m_revCounter->setStartAngle( startAngle ); + m_revCounter->setEndAngle( endAngle ); + m_revCounter->setValue( value ); + QVector< QString > revCounterLabels; + + for ( int i = 0; i < numberLabels; ++i ) + { + revCounterLabels.append( QString::number( i ) ); + } + + m_revCounter->setLabels( revCounterLabels ); + + m_speedometer->setObjectName( QStringLiteral( "Speedometer" ) ); + value = 280; + numberLabels = 23; + startAngle = -215; + endAngle = 35; + m_speedometer->setStartAngle( startAngle ); + m_speedometer->setEndAngle( endAngle ); + m_speedometer->setValue( value ); + QVector< QString > speedometerLabels; + 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, [ speedometer ]() { - int newValue = speedometer->value() + qrand() % 3 - 0.8; - speedometer->setValue( newValue ); + + 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(); - auto fuelGauge = new Speedometer( box ); - fuelGauge->setFixedSize( QSizeF( 200, 200 ) ); - fuelGauge->setValue( 270 ); + + m_fuelGauge->setObjectName( QStringLiteral( "Fuel Gauge" ) ); + m_fuelGauge->setStartAngle( 195 ); + m_fuelGauge->setEndAngle( 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() ); } diff --git a/examples/automotive/SpeedometerDisplay.h b/examples/automotive/SpeedometerDisplay.h index 6c071cb7..de7abae9 100644 --- a/examples/automotive/SpeedometerDisplay.h +++ b/examples/automotive/SpeedometerDisplay.h @@ -3,10 +3,26 @@ #include +class QskLinearBox; +class QskTextLabel; +class Speedometer; + class SpeedometerDisplay : public QskControl { public: SpeedometerDisplay( QQuickItem* parent = nullptr ); + +protected: + void updateLayout() override; + +private: + QskLinearBox* m_box; + Speedometer* m_revCounter; + QskTextLabel* m_revCounterText; + Speedometer* m_speedometer; + QskTextLabel* m_speedometerText; + Speedometer* m_fuelGauge; + QskTextLabel* m_fuelGaugeText; }; #endif // SPEEDOMETERDISPLAY_H diff --git a/examples/automotive/SpeedometerSkinlet.cpp b/examples/automotive/SpeedometerSkinlet.cpp index b5267969..8d4fee4b 100644 --- a/examples/automotive/SpeedometerSkinlet.cpp +++ b/examples/automotive/SpeedometerSkinlet.cpp @@ -35,20 +35,18 @@ namespace QSGFlatColorMaterial m_material; QSGGeometry m_geometry; }; -} +} // namespace SpeedometerSkinlet::SpeedometerSkinlet( QskSkin* skin ) : QskSkinlet( skin ) { - setNodeRoles( { PanelRole, TicksRole, NumbersRole, NeedleRole } ); + setNodeRoles( { PanelRole, LabelsRole, NeedleRole } ); } -SpeedometerSkinlet::~SpeedometerSkinlet() -{ -} +SpeedometerSkinlet::~SpeedometerSkinlet() = default; QRectF SpeedometerSkinlet::subControlRect( const QskSkinnable* skinnable, - QskAspect::Subcontrol ) const + QskAspect::Subcontrol /*unused*/ ) const { const auto speedometer = static_cast< const Speedometer* >( skinnable ); @@ -59,18 +57,15 @@ QRectF SpeedometerSkinlet::subControlRect( const QskSkinnable* skinnable, QSGNode* SpeedometerSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const { - const Speedometer* speedometer = static_cast< const Speedometer* >( skinnable ); + const auto speedometer = static_cast< const Speedometer* >( skinnable ); switch( nodeRole ) { case PanelRole: return updatePanelNode( speedometer, node ); - case TicksRole: - return updateTicksNode( speedometer, node ); - - case NumbersRole: - return updateNumbersNode( speedometer, node ); + case LabelsRole: + return updateLabelsNode( speedometer, node ); case NeedleRole: return updateNeedleNode( speedometer, node ); @@ -86,43 +81,47 @@ QSGNode* SpeedometerSkinlet::updatePanelNode( const Speedometer* speedometer, QS if( boxNode == nullptr ) { - QRectF panelRect = subControlRect( speedometer, Speedometer::Panel ); boxNode = new QskBoxNode; - qreal radius = panelRect.width() / 2; - QskBoxShapeMetrics shapeMetrics( radius, radius, radius, radius ); - QskBoxBorderMetrics borderMetrics( 2 ); - QskBoxBorderColors borderColors( Qt::white ); - QskGradient gradient( Qt::black ); - boxNode->setBoxData( panelRect, shapeMetrics, borderMetrics, borderColors, gradient ); } + QRectF panelRect = subControlRect( speedometer, Speedometer::Panel ); + qreal radius = panelRect.width() / 2; + QskBoxShapeMetrics shapeMetrics( radius, radius, radius, radius ); + QskBoxBorderMetrics borderMetrics( 2 ); + QskBoxBorderColors borderColors( Qt::white ); + QskGradient gradient( Qt::black ); + boxNode->setBoxData( panelRect, shapeMetrics, borderMetrics, borderColors, gradient ); + return boxNode; } -QSGNode* SpeedometerSkinlet::updateTicksNode( const Speedometer* speedometer, QSGNode* node ) const +QSGNode* SpeedometerSkinlet::updateLabelsNode( const Speedometer* speedometer, QSGNode* node ) const { + const int labelsCount = speedometer->labels().count(); + + // ### actually, we could draw labels with only one entry + if ( labelsCount <= 1 ) + { + return nullptr; + } + auto ticksNode = static_cast< TicksNode* >( node ); - if( ticksNode == nullptr ) + if ( ticksNode == nullptr ) { ticksNode = new TicksNode( Qt::white ); } - // ### add API for this: - // ### make qfloat etc.? - float startAngle = -215; - float endAngle = 35; // ### angle is still wrong somehow - const int tickCount = 18; - int highlightedMarksStep = 3; + const float startAngle = speedometer->startAngle(); + const float endAngle = speedometer->endAngle(); + const auto step = ( endAngle - startAngle ) / ( labelsCount - 1 ); auto geometry = ticksNode->geometry(); - geometry->allocate( tickCount * 2 ); + geometry->allocate( labelsCount * 2 ); auto vertexData = geometry->vertexDataAsPoint2D(); memset( vertexData, 0, static_cast< size_t >( geometry->vertexCount() ) ); - auto stepStride = ( endAngle - startAngle ) / ( tickCount - 1 ); - QMarginsF panelMargins = speedometer->marginsHint( Speedometer::Panel | QskAspect::Margin ); const QRectF panelRect = subControlRect( speedometer, Speedometer::Panel ).marginsRemoved( panelMargins ); @@ -131,13 +130,13 @@ QSGNode* SpeedometerSkinlet::updateTicksNode( const Speedometer* speedometer, QS panelRect.y() + panelRect.height() / 2 ); auto radius = static_cast< float >( panelRect.width() / 2 ); - const QMarginsF numbersMargins = speedometer->marginsHint( Speedometer::Numbers | QskAspect::Margin ); - QFontMetrics fontMetrics( speedometer->effectiveFont( Speedometer::Numbers ) ); + const QMarginsF numbersMargins = speedometer->marginsHint( Speedometer::Labels | QskAspect::Margin ); + QFontMetrics fontMetrics( speedometer->effectiveFont( Speedometer::Labels ) ); float angle = startAngle; // Create a series of tickmarks from minimum to maximum - for( int i = 0; i < tickCount; ++i, angle += stepStride ) + for( int i = 0; i < labelsCount; ++i, angle += step ) { qreal cosine = qCos( qDegreesToRadians( angle ) ); qreal sine = qSin( qDegreesToRadians( angle ) ); @@ -146,7 +145,7 @@ QSGNode* SpeedometerSkinlet::updateTicksNode( const Speedometer* speedometer, QS float yStart = center.y() + radius * sine; // ### skin hint for each of highlighted / normal marks - qreal length = ( i % highlightedMarksStep == 0 ) ? 15 : 15; + qreal length = 15; float xEnd = center.x() + ( radius - length ) * cosine; float yEnd = center.y() + ( radius - length ) * sine; @@ -155,38 +154,44 @@ QSGNode* SpeedometerSkinlet::updateTicksNode( const Speedometer* speedometer, QS vertexData += 2; - QString text = QString::number( i * 10 ); + QVector< QString > labels = speedometer->labels(); - float w = fontMetrics.width( text ); - float h = fontMetrics.height(); - float adjustX = ( -0.5 * cosine - 0.5 ) * w; - float adjustY = ( -0.5 * sine - 0.5 ) * h; - - float numbersX = xEnd + ( -1 * numbersMargins.left() * cosine ) + adjustX; - float numbersY = yEnd + ( -1 * numbersMargins.top() * sine ) + adjustY; - - QRectF numbersRect( numbersX, numbersY, w, h ); - - QskTextNode* numbersNode; - - if ( ticksNode->childCount() > i ) + // only create a text node if there is a label for it: + if ( labels.count() > i ) { - numbersNode = static_cast< QskTextNode* >( ticksNode->childAtIndex( i ) ); - } - else - { - numbersNode = new QskTextNode(); - } + const QString& text = labels.at( i ); - numbersNode->setTextData( speedometer, text, numbersRect, QFont(), - QskTextOptions(), QskTextColors( Qt::white ), - Qt::AlignCenter | Qt::AlignHCenter, Qsk::Normal ); + float w = fontMetrics.width( text ); + float h = fontMetrics.height(); + float adjustX = ( -0.5 * cosine - 0.5 ) * w; + float adjustY = ( -0.5 * sine - 0.5 ) * h; - if ( ticksNode->childCount() <= i ) - { - ticksNode->appendChildNode( numbersNode ); + float numbersX = xEnd + ( -1 * numbersMargins.left() * cosine ) + adjustX; + float numbersY = yEnd + ( -1 * numbersMargins.top() * sine ) + adjustY; + + QRectF numbersRect( numbersX, numbersY, w, h ); + + QskTextNode* numbersNode; + + if ( ticksNode->childCount() > i ) + { + numbersNode = static_cast< QskTextNode* >( ticksNode->childAtIndex( i ) ); + } + else + { + numbersNode = new QskTextNode(); + } + + numbersNode->setTextData( speedometer, text, numbersRect, QFont(), + QskTextOptions(), QskTextColors( Qt::white ), + Qt::AlignCenter | Qt::AlignHCenter, Qsk::Normal ); + + if ( ticksNode->childCount() <= i ) + { + ticksNode->appendChildNode( numbersNode ); + } + // ### remove nodes in case they are superfluous } - // ### remove nodes in case they are superfluous } geometry->setLineWidth( 2 ); @@ -197,11 +202,6 @@ QSGNode* SpeedometerSkinlet::updateTicksNode( const Speedometer* speedometer, QS return ticksNode; } -QSGNode* SpeedometerSkinlet::updateNumbersNode( const Speedometer* speedometer, QSGNode* node ) const -{ - return nullptr; -} - QSGNode* SpeedometerSkinlet::updateNeedleNode( const Speedometer* speedometer, QSGNode* node ) const { QMarginsF margins = speedometer->marginsHint( Speedometer::Panel | QskAspect::Margin ); @@ -215,15 +215,16 @@ QSGNode* SpeedometerSkinlet::updateNeedleNode( const Speedometer* speedometer, Q if( boxNode == nullptr ) { boxNode = new QskBoxNode; - QRectF centerNodeRect( center.x() - radius, center.y() - radius, - 2 * radius, 2 * radius ); - QskBoxShapeMetrics shapeMetrics( radius, radius, radius, radius ); - QskBoxBorderMetrics borderMetrics( 2 ); - QskBoxBorderColors borderColors( Qt::red ); - QskGradient gradient( Qt::red ); - boxNode->setBoxData( centerNodeRect, shapeMetrics, borderMetrics, borderColors, gradient ); } + QRectF centerNodeRect( center.x() - radius, center.y() - radius, + 2 * radius, 2 * radius ); + QskBoxShapeMetrics shapeMetrics( radius, radius, radius, radius ); + QskBoxBorderMetrics borderMetrics( 2 ); + QskBoxBorderColors borderColors( Qt::red ); + QskGradient gradient( Qt::red ); + boxNode->setBoxData( centerNodeRect, shapeMetrics, borderMetrics, borderColors, gradient ); + TicksNode* needleNode; if ( boxNode->childCount() == 0 ) @@ -265,9 +266,6 @@ QSGNode* SpeedometerSkinlet::updateNeedleNode( const Speedometer* speedometer, Q needleNode->markDirty( QSGNode::DirtyGeometry ); - - - if ( boxNode->childCount() == 0 ) { boxNode->appendChildNode( needleNode ); diff --git a/examples/automotive/SpeedometerSkinlet.h b/examples/automotive/SpeedometerSkinlet.h index 06bb013f..87e8655a 100644 --- a/examples/automotive/SpeedometerSkinlet.h +++ b/examples/automotive/SpeedometerSkinlet.h @@ -14,8 +14,7 @@ public: enum NodeRole { PanelRole, - TicksRole, - NumbersRole, + LabelsRole, NeedleRole }; @@ -30,8 +29,7 @@ protected: private: QSGNode* updatePanelNode( const Speedometer*, QSGNode* ) const; - QSGNode* updateTicksNode( const Speedometer*, QSGNode* ) const; - QSGNode* updateNumbersNode( const Speedometer*, QSGNode* ) const; + QSGNode* updateLabelsNode( const Speedometer*, QSGNode* ) const; QSGNode* updateNeedleNode( const Speedometer*, QSGNode* ) const; };