From 1bcfd82d10122ddeae005bb602f9064df8157efb Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 14 Jul 2022 18:50:17 +0200 Subject: [PATCH] dashboard example simplified --- playground/dashboard/ButtonBar.cpp | 66 --- playground/dashboard/ButtonBar.h | 20 - .../{SpeedometerDisplay.cpp => Dashboard.cpp} | 35 +- .../{SpeedometerDisplay.h => Dashboard.h} | 4 +- .../dashboard/{Speedometer.cpp => Dial.cpp} | 18 +- .../dashboard/{Speedometer.h => Dial.h} | 4 +- ...SpeedometerSkinlet.cpp => DialSkinlet.cpp} | 75 ++-- .../{SpeedometerSkinlet.h => DialSkinlet.h} | 14 +- playground/dashboard/MainWindow.cpp | 79 ---- playground/dashboard/README.images | 3 - playground/dashboard/SkinFactory.cpp | 136 +----- playground/dashboard/SkinFactory.h | 9 - playground/dashboard/dashboard.pro | 19 +- playground/dashboard/images/bluetooth.svg | 10 - playground/dashboard/images/bookmark.svg | 10 - playground/dashboard/images/bus.svg | 10 - playground/dashboard/images/car.svg | 410 ------------------ playground/dashboard/images/cloud.svg | 10 - playground/dashboard/images/compass.svg | 10 - playground/dashboard/images/down.svg | 10 - playground/dashboard/images/left.svg | 10 - playground/dashboard/images/location.svg | 10 - playground/dashboard/images/man.svg | 10 - playground/dashboard/images/menu.svg | 10 - playground/dashboard/images/phone.svg | 10 - playground/dashboard/images/plane.svg | 10 - playground/dashboard/images/right.svg | 10 - playground/dashboard/images/train.svg | 10 - playground/dashboard/images/up.svg | 10 - playground/dashboard/images/user.svg | 10 - playground/dashboard/main.cpp | 37 +- playground/dashboard/qvg/bluetooth.qvg | Bin 1039 -> 0 bytes playground/dashboard/qvg/bookmark.qvg | Bin 1019 -> 0 bytes playground/dashboard/qvg/bus.qvg | Bin 1879 -> 0 bytes playground/dashboard/qvg/car.qvg | Bin 53319 -> 0 bytes playground/dashboard/qvg/cloud.qvg | Bin 1439 -> 0 bytes playground/dashboard/qvg/down.qvg | Bin 719 -> 0 bytes playground/dashboard/qvg/left.qvg | Bin 719 -> 0 bytes playground/dashboard/qvg/location.qvg | Bin 719 -> 0 bytes playground/dashboard/qvg/man.qvg | Bin 1359 -> 0 bytes playground/dashboard/qvg/menu.qvg | Bin 979 -> 0 bytes playground/dashboard/qvg/phone.qvg | Bin 1639 -> 0 bytes playground/dashboard/qvg/plane.qvg | Bin 1039 -> 0 bytes playground/dashboard/qvg/right.qvg | Bin 719 -> 0 bytes playground/dashboard/qvg/train.qvg | Bin 1699 -> 0 bytes playground/dashboard/qvg/up.qvg | Bin 719 -> 0 bytes playground/dashboard/qvg/user.qvg | Bin 1039 -> 0 bytes playground/dashboard/qvgfiles.qrc | 24 - 48 files changed, 126 insertions(+), 987 deletions(-) delete mode 100644 playground/dashboard/ButtonBar.cpp delete mode 100644 playground/dashboard/ButtonBar.h rename playground/dashboard/{SpeedometerDisplay.cpp => Dashboard.cpp} (77%) rename playground/dashboard/{SpeedometerDisplay.h => Dashboard.h} (76%) rename playground/dashboard/{Speedometer.cpp => Dial.cpp} (53%) rename playground/dashboard/{Speedometer.h => Dial.h} (85%) rename playground/dashboard/{SpeedometerSkinlet.cpp => DialSkinlet.cpp} (72%) rename playground/dashboard/{SpeedometerSkinlet.h => DialSkinlet.h} (65%) delete mode 100644 playground/dashboard/MainWindow.cpp delete mode 100644 playground/dashboard/README.images delete mode 100644 playground/dashboard/images/bluetooth.svg delete mode 100644 playground/dashboard/images/bookmark.svg delete mode 100644 playground/dashboard/images/bus.svg delete mode 100644 playground/dashboard/images/car.svg delete mode 100644 playground/dashboard/images/cloud.svg delete mode 100644 playground/dashboard/images/compass.svg delete mode 100644 playground/dashboard/images/down.svg delete mode 100644 playground/dashboard/images/left.svg delete mode 100644 playground/dashboard/images/location.svg delete mode 100644 playground/dashboard/images/man.svg delete mode 100644 playground/dashboard/images/menu.svg delete mode 100644 playground/dashboard/images/phone.svg delete mode 100644 playground/dashboard/images/plane.svg delete mode 100644 playground/dashboard/images/right.svg delete mode 100644 playground/dashboard/images/train.svg delete mode 100644 playground/dashboard/images/up.svg delete mode 100644 playground/dashboard/images/user.svg delete mode 100644 playground/dashboard/qvg/bluetooth.qvg delete mode 100644 playground/dashboard/qvg/bookmark.qvg delete mode 100644 playground/dashboard/qvg/bus.qvg delete mode 100644 playground/dashboard/qvg/car.qvg delete mode 100644 playground/dashboard/qvg/cloud.qvg delete mode 100644 playground/dashboard/qvg/down.qvg delete mode 100644 playground/dashboard/qvg/left.qvg delete mode 100644 playground/dashboard/qvg/location.qvg delete mode 100644 playground/dashboard/qvg/man.qvg delete mode 100644 playground/dashboard/qvg/menu.qvg delete mode 100644 playground/dashboard/qvg/phone.qvg delete mode 100644 playground/dashboard/qvg/plane.qvg delete mode 100644 playground/dashboard/qvg/right.qvg delete mode 100644 playground/dashboard/qvg/train.qvg delete mode 100644 playground/dashboard/qvg/up.qvg delete mode 100644 playground/dashboard/qvg/user.qvg delete mode 100644 playground/dashboard/qvgfiles.qrc diff --git a/playground/dashboard/ButtonBar.cpp b/playground/dashboard/ButtonBar.cpp deleted file mode 100644 index 69d27844..00000000 --- a/playground/dashboard/ButtonBar.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#include "ButtonBar.h" -#include "SkinFactory.h" - -#include -#include -#include -#include - -QSK_SUBCONTROL( ButtonBar, Indicator ) - -namespace -{ - class IndicatorLabel final : public QskGraphicLabel - { - public: - IndicatorLabel( QQuickItem* parentItem = nullptr ) - : QskGraphicLabel( parentItem ) - { - // so the skins are able to colorize them - setGraphicRole( SkinFactory::Indicator ); - setSubcontrolProxy( QskGraphicLabel::Graphic, ButtonBar::Indicator ); - } - }; -} - -ButtonBar::ButtonBar( QQuickItem* parentItem ) - : QskLinearBox( parentItem ) -{ - QColor c( Qt::black ); - c.setAlphaF( 0.5 ); - setBackgroundColor( c ); - - setMargins( QskMargins( 20, 15 ) ); - setSpacing( 20 ); - - setSizePolicy( QskSizePolicy::MinimumExpanding, QskSizePolicy::MinimumExpanding ); -} - -void ButtonBar::addIndicator( const char* name ) -{ - auto label = new IndicatorLabel( this ); - - /* - The label should adjust vertically and be stretched horizontally - according to its aspect ratio. - */ - - label->setSizePolicy( QskSizePolicy::Constrained, QskSizePolicy::Ignored ); - - const QString fileName = QString( ":/qvg/%1.qvg" ).arg( name ); - label->setGraphic( QskGraphicIO::read( fileName ) ); -} - -QSizeF ButtonBar::layoutSizeHint( - Qt::SizeHint which, const QSizeF& ) const -{ - if ( which == Qt::PreferredSize ) - return QSizeF( -1, 20 ); - - return QSizeF(); -} diff --git a/playground/dashboard/ButtonBar.h b/playground/dashboard/ButtonBar.h deleted file mode 100644 index a30f1e9d..00000000 --- a/playground/dashboard/ButtonBar.h +++ /dev/null @@ -1,20 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#pragma once - -#include - -class ButtonBar : public QskLinearBox -{ - public: - QSK_SUBCONTROLS( Indicator ) - - ButtonBar( QQuickItem* = nullptr ); - void addIndicator( const char* name ); - - protected: - QSizeF layoutSizeHint( Qt::SizeHint, const QSizeF& ) const override; -}; diff --git a/playground/dashboard/SpeedometerDisplay.cpp b/playground/dashboard/Dashboard.cpp similarity index 77% rename from playground/dashboard/SpeedometerDisplay.cpp rename to playground/dashboard/Dashboard.cpp index e51a4fc0..d90b1ba9 100644 --- a/playground/dashboard/SpeedometerDisplay.cpp +++ b/playground/dashboard/Dashboard.cpp @@ -3,23 +3,20 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include "SpeedometerDisplay.h" -#include "Speedometer.h" +#include "Dashboard.h" +#include "Dial.h" #include -#include #include -#include - namespace { - class Dial : public Speedometer + class DashboardDial : public Dial { public: - Dial( const QString& title, QQuickItem* parent = nullptr ) - : Speedometer( parent ) + DashboardDial( const QString& title, QQuickItem* parent = nullptr ) + : Dial( parent ) { setPolishOnResize( true ); m_label = new QskTextLabel( title, this ); @@ -42,11 +39,11 @@ namespace QskTextLabel* m_label; }; - class RevCounter : public Dial + class RevCounter : public DashboardDial { public: RevCounter( QQuickItem* parent = nullptr ) - : Dial( "x 1000 min^-1", parent ) + : DashboardDial( "x 1000 min^-1", parent ) { setMinimum( 145 ); setMaximum( 305 ); @@ -64,11 +61,11 @@ namespace } }; - class Speedo : public Dial + class SpeedoMeter : public DashboardDial { public: - Speedo( QQuickItem* parent = nullptr ) - : Dial( "km/h", parent ) + SpeedoMeter( QQuickItem* parent = nullptr ) + : DashboardDial( "km/h", parent ) { setMinimum( -215 ); setMaximum( 35 ); @@ -91,11 +88,11 @@ namespace } }; - class FuelGauge : public Dial + class FuelGauge : public DashboardDial { public: FuelGauge( QQuickItem* parent = nullptr ) - : Dial( "fuel", parent ) + : DashboardDial( "fuel", parent ) { setMinimum( 195 ); setMaximum( 345 ); @@ -111,13 +108,11 @@ namespace }; } -SpeedometerDisplay::SpeedometerDisplay( QQuickItem* parent ) +Dashboard::Dashboard( QQuickItem* parent ) : QskLinearBox( Qt::Horizontal, parent ) { - std::srand( static_cast< uint >( QTime::currentTime().msec() ) ); - (void ) new RevCounter( this ); - auto speedometer = new Speedo( this ); + auto speedometer = new SpeedoMeter( this ); auto fuelGauge = new FuelGauge( this ); setMargins( 10 ); @@ -125,7 +120,7 @@ SpeedometerDisplay::SpeedometerDisplay( QQuickItem* parent ) auto timer = new QTimer( this ); - connect( timer, &QTimer::timeout, speedometer, &Speedo::updateValue ); + connect( timer, &QTimer::timeout, speedometer, &SpeedoMeter::updateValue ); connect( timer, &QTimer::timeout, fuelGauge, &FuelGauge::updateValue ); timer->setInterval( 16 ); diff --git a/playground/dashboard/SpeedometerDisplay.h b/playground/dashboard/Dashboard.h similarity index 76% rename from playground/dashboard/SpeedometerDisplay.h rename to playground/dashboard/Dashboard.h index 34801b10..afc00340 100644 --- a/playground/dashboard/SpeedometerDisplay.h +++ b/playground/dashboard/Dashboard.h @@ -7,8 +7,8 @@ #include -class SpeedometerDisplay : public QskLinearBox +class Dashboard : public QskLinearBox { public: - SpeedometerDisplay( QQuickItem* parent = nullptr ); + Dashboard( QQuickItem* parent = nullptr ); }; diff --git a/playground/dashboard/Speedometer.cpp b/playground/dashboard/Dial.cpp similarity index 53% rename from playground/dashboard/Speedometer.cpp rename to playground/dashboard/Dial.cpp index 4e8b319c..27c67c2a 100644 --- a/playground/dashboard/Speedometer.cpp +++ b/playground/dashboard/Dial.cpp @@ -3,29 +3,29 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include "Speedometer.h" +#include "Dial.h" #include #include -QSK_SUBCONTROL( Speedometer, Panel ) -QSK_SUBCONTROL( Speedometer, TickLabels ) -QSK_SUBCONTROL( Speedometer, Knob ) -QSK_SUBCONTROL( Speedometer, Needle ) +QSK_SUBCONTROL( Dial, Panel ) +QSK_SUBCONTROL( Dial, TickLabels ) +QSK_SUBCONTROL( Dial, Knob ) +QSK_SUBCONTROL( Dial, Needle ) -Speedometer::Speedometer( QQuickItem* parent ) +Dial::Dial( QQuickItem* parent ) : QskBoundedValueInput( parent ) { } -QVector< QString > Speedometer::tickLabels() const +QVector< QString > Dial::tickLabels() const { return m_tickLabels; } -void Speedometer::setTickLabels( const QVector< QString >& labels ) +void Dial::setTickLabels( const QVector< QString >& labels ) { m_tickLabels = labels; } -#include "moc_Speedometer.cpp" +#include "moc_Dial.cpp" diff --git a/playground/dashboard/Speedometer.h b/playground/dashboard/Dial.h similarity index 85% rename from playground/dashboard/Speedometer.h rename to playground/dashboard/Dial.h index b27b8248..ef14261b 100644 --- a/playground/dashboard/Speedometer.h +++ b/playground/dashboard/Dial.h @@ -7,14 +7,14 @@ #include -class Speedometer : public QskBoundedValueInput +class Dial : public QskBoundedValueInput { Q_OBJECT public: QSK_SUBCONTROLS( Panel, TickLabels, Knob, Needle ) - Speedometer( QQuickItem* parent = nullptr ); + Dial( QQuickItem* parent = nullptr ); QVector< QString > tickLabels() const; void setTickLabels( const QVector< QString >& ); diff --git a/playground/dashboard/SpeedometerSkinlet.cpp b/playground/dashboard/DialSkinlet.cpp similarity index 72% rename from playground/dashboard/SpeedometerSkinlet.cpp rename to playground/dashboard/DialSkinlet.cpp index 3b3aa6d7..ffee9a37 100644 --- a/playground/dashboard/SpeedometerSkinlet.cpp +++ b/playground/dashboard/DialSkinlet.cpp @@ -3,8 +3,8 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include "SpeedometerSkinlet.h" -#include "Speedometer.h" +#include "DialSkinlet.h" +#include "Dial.h" #include #include @@ -78,20 +78,20 @@ namespace }; } -SpeedometerSkinlet::SpeedometerSkinlet( QskSkin* skin ) +DialSkinlet::DialSkinlet( QskSkin* skin ) : QskSkinlet( skin ) { setNodeRoles( { PanelRole, NeedleRole, KnobRole, LabelsRole } ); } -QRectF SpeedometerSkinlet::subControlRect( const QskSkinnable* skinnable, +QRectF DialSkinlet::subControlRect( const QskSkinnable* skinnable, const QRectF& contentsRect, QskAspect::Subcontrol subcontrol ) const { QRectF r; - if ( subcontrol == Speedometer::Knob ) + if ( subcontrol == Dial::Knob ) { - const auto size = skinnable->strutSizeHint( Speedometer::Knob ); + const auto size = skinnable->strutSizeHint( Dial::Knob ); r.setSize( size ); } else @@ -105,18 +105,18 @@ QRectF SpeedometerSkinlet::subControlRect( const QskSkinnable* skinnable, return r; } -QSGNode* SpeedometerSkinlet::updateSubNode( +QSGNode* DialSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const { - const auto speedometer = static_cast< const Speedometer* >( skinnable ); + const auto speedometer = static_cast< const Dial* >( skinnable ); switch ( nodeRole ) { case PanelRole: - return updateBoxNode( speedometer, node, Speedometer::Panel ); + return updateBoxNode( speedometer, node, Dial::Panel ); case KnobRole: - return updateBoxNode( speedometer, node, Speedometer::Knob ); + return updateBoxNode( speedometer, node, Dial::Knob ); case NeedleRole: return updateNeedleNode( speedometer, node ); @@ -130,12 +130,12 @@ QSGNode* SpeedometerSkinlet::updateSubNode( } } -QSGNode* SpeedometerSkinlet::updateLabelsNode( - const Speedometer* speedometer, QSGNode* node ) const +QSGNode* DialSkinlet::updateLabelsNode( + const Dial* dial, QSGNode* node ) const { - using Q = Speedometer; + using Q = Dial; - const auto labels = speedometer->tickLabels(); + const auto labels = dial->tickLabels(); // ### actually, we could draw labels with only one entry if ( labels.count() <= 1 ) @@ -145,11 +145,11 @@ QSGNode* SpeedometerSkinlet::updateLabelsNode( if ( ticksNode == nullptr ) ticksNode = new TicksNode(); - const auto color = speedometer->color( Q::TickLabels ); + const auto color = dial->color( Q::TickLabels ); ticksNode->setColor( color ); - const auto startAngle = speedometer->minimum(); - const auto endAngle = speedometer->maximum(); + const auto startAngle = dial->minimum(); + const auto endAngle = dial->maximum(); const auto step = ( endAngle - startAngle ) / ( labels.count() - 1 ); auto geometry = ticksNode->geometry(); @@ -157,19 +157,19 @@ QSGNode* SpeedometerSkinlet::updateLabelsNode( auto vertexData = geometry->vertexDataAsPoint2D(); - auto scaleRect = this->scaleRect( speedometer ); + auto scaleRect = this->scaleRect( dial ); const auto center = scaleRect.center(); const auto radius = 0.5 * scaleRect.width(); - const auto spacing = speedometer->spacingHint( Q::TickLabels ); + const auto spacing = dial->spacingHint( Q::TickLabels ); - const auto font = speedometer->effectiveFont( Q::TickLabels ); + const auto font = dial->effectiveFont( Q::TickLabels ); const QFontMetricsF fontMetrics( font ); auto angle = startAngle; - const auto tickSize = speedometer->strutSizeHint( Q::TickLabels ); + const auto tickSize = dial->strutSizeHint( Q::TickLabels ); const auto needleRadius = radius - tickSize.height(); // Create a series of tickmarks from minimum to maximum @@ -207,7 +207,7 @@ QSGNode* SpeedometerSkinlet::updateLabelsNode( const QRectF numbersRect( numbersX, numbersY, w, h ); labelNode = QskSkinlet::updateTextNode( - speedometer, labelNode, numbersRect, Qt::AlignCenter | Qt::AlignHCenter, + dial, labelNode, numbersRect, Qt::AlignCenter | Qt::AlignHCenter, text, font, QskTextOptions(), QskTextColors( color ), Qsk::Normal ); if ( labelNode ) @@ -228,48 +228,47 @@ QSGNode* SpeedometerSkinlet::updateLabelsNode( return ticksNode; } -QSGNode* SpeedometerSkinlet::updateNeedleNode( - const Speedometer* speedometer, QSGNode* node ) const +QSGNode* DialSkinlet::updateNeedleNode( + const Dial* dial, QSGNode* node ) const { - using Q = Speedometer; + using Q = Dial; auto needleNode = static_cast< NeedleNode* >( node ); if ( needleNode == nullptr ) needleNode = new NeedleNode(); - const auto line = needlePoints( speedometer ); - const auto width = speedometer->metric( Q::Needle | QskAspect::Size ); + const auto line = needlePoints( dial ); + const auto width = dial->metric( Q::Needle | QskAspect::Size ); needleNode->setData( line, width * 2 ); - needleNode->setColor( speedometer->color( Q::Needle ) ); + needleNode->setColor( dial->color( Q::Needle ) ); return needleNode; } -QRectF SpeedometerSkinlet::scaleRect( const Speedometer* speedometer ) const +QRectF DialSkinlet::scaleRect( const Dial* dial ) const { - using Q = Speedometer; + using Q = Dial; - const auto margins = speedometer->marginHint( Q::Panel ); + const auto margins = dial->marginHint( Q::Panel ); - auto r = speedometer->subControlRect( Q::Panel ); + auto r = dial->subControlRect( Q::Panel ); r = r.marginsRemoved( margins ); return r; } -QLineF SpeedometerSkinlet::needlePoints( const Speedometer* speedometer ) const +QLineF DialSkinlet::needlePoints( const Dial* dial ) const { - const auto r = scaleRect( speedometer ); - const auto margin = speedometer->metric( - Speedometer::Needle | QskAspect::Margin ); + const auto r = scaleRect( dial ); + const auto margin = dial->metric( Dial::Needle | QskAspect::Margin ); QLineF line; line.setP1( r.center() ); line.setLength( 0.5 * r.width() - margin ); - line.setAngle( -speedometer->value() ); + line.setAngle( -dial->value() ); return line; } -#include "moc_SpeedometerSkinlet.cpp" +#include "moc_DialSkinlet.cpp" diff --git a/playground/dashboard/SpeedometerSkinlet.h b/playground/dashboard/DialSkinlet.h similarity index 65% rename from playground/dashboard/SpeedometerSkinlet.h rename to playground/dashboard/DialSkinlet.h index caf563b9..31267995 100644 --- a/playground/dashboard/SpeedometerSkinlet.h +++ b/playground/dashboard/DialSkinlet.h @@ -7,9 +7,9 @@ #include -class Speedometer; +class Dial; -class SpeedometerSkinlet : public QskSkinlet +class DialSkinlet : public QskSkinlet { Q_GADGET @@ -22,7 +22,7 @@ class SpeedometerSkinlet : public QskSkinlet NeedleRole }; - Q_INVOKABLE SpeedometerSkinlet( QskSkin* skin = nullptr ); + Q_INVOKABLE DialSkinlet( QskSkin* skin = nullptr ); QRectF subControlRect( const QskSkinnable*, const QRectF&, QskAspect::Subcontrol ) const override; @@ -32,9 +32,9 @@ class SpeedometerSkinlet : public QskSkinlet quint8 nodeRole, QSGNode* node ) const override; private: - QRectF scaleRect( const Speedometer* ) const; - QLineF needlePoints( const Speedometer* ) const; + QRectF scaleRect( const Dial* ) const; + QLineF needlePoints( const Dial* ) const; - QSGNode* updateLabelsNode( const Speedometer*, QSGNode* ) const; - QSGNode* updateNeedleNode( const Speedometer*, QSGNode* ) const; + QSGNode* updateLabelsNode( const Dial*, QSGNode* ) const; + QSGNode* updateNeedleNode( const Dial*, QSGNode* ) const; }; diff --git a/playground/dashboard/MainWindow.cpp b/playground/dashboard/MainWindow.cpp deleted file mode 100644 index e8d7aa21..00000000 --- a/playground/dashboard/MainWindow.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#include "MainWindow.h" -#include "ButtonBar.h" -#include "SkinFactory.h" -#include "SpeedometerDisplay.h" - -#include -#include -#include -#include -#include - -#include -#include - -namespace -{ - class Header : public ButtonBar - { - public: - Header() - { - addIndicator( "bluetooth" ); - addIndicator( "location" ); - addIndicator( "phone" ); - - ( void ) new QskTextLabel( QDate::currentDate().toString(), this ); - - addIndicator( "user" ); - addIndicator( "bookmark" ); - addIndicator( "menu" ); - } - }; - - class Footer : public ButtonBar - { - public: - Footer() - { - addIndicator( "cloud" ); - addIndicator( "man" ); - addIndicator( "bus" ); - addIndicator( "plane" ); - addIndicator( "train" ); - - addStretch( 10 ); - } - }; -} - -MainWindow::MainWindow() -{ - setAutoLayoutChildren( true ); - - const QImage image( QStringLiteral( ":/images/background.jpg" ) ); - - auto backgroundImage = new QskGraphicLabel( contentItem() ); - backgroundImage->setGraphic( QskGraphic::fromImage( image ) ); - backgroundImage->setFillMode( QskGraphicLabel::Stretch ); - - auto header = new Header(); - auto speedoDisplay = new SpeedometerDisplay(); - auto footer = new Footer(); - - auto layout = new QskLinearBox( Qt::Vertical, contentItem() ); - - layout->addItem( header ); - layout->setStretchFactor( header, 1 ); - - layout->addItem( speedoDisplay ); - layout->setStretchFactor( speedoDisplay, 8 ); - - layout->addItem( footer ); - layout->setStretchFactor( footer, 1 ); -} diff --git a/playground/dashboard/README.images b/playground/dashboard/README.images deleted file mode 100644 index 5e0c06e3..00000000 --- a/playground/dashboard/README.images +++ /dev/null @@ -1,3 +0,0 @@ -* background image: http://7-themes.com/collections/green-wallpapers/4440155/ , license unknown -* car image: https://openclipart.org/detail/234440/white-blank-racing-car-top-view , unlimited commercial use -* icons: https://www.flaticon.com/packs/material-design, made by Material Design from www.flaticon.com diff --git a/playground/dashboard/SkinFactory.cpp b/playground/dashboard/SkinFactory.cpp index a44bcf62..22a3e8d8 100644 --- a/playground/dashboard/SkinFactory.cpp +++ b/playground/dashboard/SkinFactory.cpp @@ -5,24 +5,15 @@ #include "SkinFactory.h" -#include "ButtonBar.h" -#include "Speedometer.h" -#include "SpeedometerSkinlet.h" +#include "Dial.h" +#include "DialSkinlet.h" #include -#include -#include -#include -#include #include -#include -#include -#include #include #include #include - -#include +#include namespace { @@ -38,102 +29,43 @@ namespace public: Skin() { - declareSkinlet< Speedometer, SpeedometerSkinlet >(); + using namespace QskRgb; + + declareSkinlet< Dial, DialSkinlet >(); setFont( QskSkin::DefaultFont, qskFont( 13 ) ); setFont( QskSkin::LargeFont, qskFont( 20 ) ); - setSkinHint( ButtonBar::Indicator | QskAspect::GraphicRole, SkinFactory::Indicator ); - } - }; - - class Skin1 : public Skin - { - public: - Skin1() - { - const QColor color1( "#363636" ); // Jet - const QColor color2( "#242F40" ); // Yankees blue - const QColor color3( "#CCA43B" ); // Satin sheet gold - const QColor color4( "#E5E5E5" ); // Platinum - const QColor color5( "#FFFFFF" ); // white + const auto rgb1 = qRgb( 1, 16, 27 ); // Maastricht blue + const auto rgb2 = qRgb( 255, 0, 22 ); // Ruddy + const auto rgb3 = qRgb( 41, 234, 212 ); // Turquoise + const auto rgb4 = qRgb( 253, 255, 252 ); // baby powder QskSkinHintTableEditor ed( &hintTable() ); - ed.setColor( QskTextLabel::Text, color3 ); + ed.setColor( QskTextLabel::Text, rgb4 ); { - using Q = Speedometer; - - ed.setBoxBorderMetrics( Q::Panel, 5 ); - ed.setBoxShape( Q::Panel, 30, Qt::RelativeSize ); - ed.setGradient( Q::Panel, - QskGradient( QskGradient::Vertical, color2, color4 ) ); - ed.setBoxBorderColors( Q::Panel, color3 ); - - ed.setBoxBorderMetrics( Q::Knob, 5 ); - ed.setStrutSize( Q::Knob, 20, 20 ); - ed.setBoxShape( Q::Knob, 100, Qt::RelativeSize ); - ed.setGradient( Q::Knob, color2 ); - ed.setBoxBorderColors( Q::Knob, color4 ); - - ed.setMetric( Q::Needle | QskAspect::Size, 4 ); - ed.setMetric( Q::Needle | QskAspect::Margin, 15 ); - ed.setColor( Q::Needle, color4 ); - - ed.setSpacing( Q::TickLabels, 3 ); - ed.setStrutSize( Q::TickLabels, 3, 25 ); - ed.setColor( Q::TickLabels, color4 ); - ed.setFontRole( Q::TickLabels, QskSkin::SmallFont ); - } - - { - // all SVGs on the header/footer are plain white - - QskColorFilter filter; - filter.addColorSubstitution( Qt::white, color3.rgb() ); - - setGraphicFilter( SkinFactory::Indicator, filter ); - } - } - }; - - class Skin2 : public Skin - { - public: - Skin2() - { - const QColor color1( "#011627" ); // Maastricht blue - const QColor color2( "#FF0022" ); // ruddy - const QColor color3( "#41EAD4" ); // Turquoise - const QColor color4( "#FDFFFC" ); // baby powder - const QColor color5( "#B91372" ); // red violet - - QskSkinHintTableEditor ed( &hintTable() ); - - ed.setColor( QskTextLabel::Text, color4 ); - - { - using Q = Speedometer; + using Q = Dial; ed.setBoxBorderMetrics( Q::Panel, 2 ); ed.setBoxShape( Q::Panel, 100, Qt::RelativeSize ); - ed.setGradient( Q::Panel, color1 ); - ed.setBoxBorderColors( Q::Panel, color3 ); + ed.setGradient( Q::Panel, rgb1 ); + ed.setBoxBorderColors( Q::Panel, rgb3 ); ed.setBoxBorderMetrics( Q::Knob, 2 ); ed.setStrutSize( Q::Knob, 30, 30 ); ed.setBoxShape( Q::Knob, 100, Qt::RelativeSize ); ed.setGradient( Q::Knob, - QskGradient( QskGradient::Diagonal, color2, color1 ) ); + QskGradient( QskGradient::Diagonal, rgb2, rgb1 ) ); ed.setMetric( Q::Needle | QskAspect::Size, 2 ); ed.setMetric( Q::Needle | QskAspect::Margin, 10 ); - ed.setColor( Q::Needle, color2 ); + ed.setColor( Q::Needle, rgb2 ); ed.setSpacing( Q::TickLabels, 4 ); ed.setStrutSize( Q::TickLabels, 2, 15 ); - ed.setColor( Q::TickLabels, color4 ); + ed.setColor( Q::TickLabels, rgb4 ); ed.setFontRole( Q::TickLabels, QskSkin::SmallFont ); } } @@ -143,43 +75,15 @@ namespace QStringList SkinFactory::skinNames() const { - return { "Skin1", "Skin2" }; + return { "Skin" }; } QskSkin* SkinFactory::createSkin( const QString& skinName ) { - if ( skinName == "Skin1" ) - return new Skin1(); - - if ( skinName == "Skin2" ) - return new Skin2(); + if ( skinName == "Skin" ) + return new Skin(); return nullptr; } -void SkinFactory::rotateSkin() -{ - const auto names = skinNames(); - - int index = names.indexOf( qskSetup->skinName() ); - index = ( index + 1 ) % names.size(); - - auto oldSkin = qskSetup->skin(); - if ( oldSkin->parent() == qskSetup ) - oldSkin->setParent( nullptr ); // otherwise setSkin deletes it - - auto newSkin = qskSetup->setSkin( names[ index ] ); - - QskSkinTransition transition; - - transition.setSourceSkin( oldSkin ); - transition.setTargetSkin( newSkin ); - transition.setAnimation( 600 ); - - transition.process(); - - if ( oldSkin->parent() == nullptr ) - delete oldSkin; -} - #include "moc_SkinFactory.cpp" diff --git a/playground/dashboard/SkinFactory.h b/playground/dashboard/SkinFactory.h index 00d63dce..4ae1da7a 100644 --- a/playground/dashboard/SkinFactory.h +++ b/playground/dashboard/SkinFactory.h @@ -12,15 +12,6 @@ class SkinFactory : public QskSkinFactory Q_OBJECT public: - enum GraphicRoles - { - // to be visible on header/footer - Indicator, - }; - QStringList skinNames() const override; QskSkin* createSkin( const QString& ) override; - - public Q_SLOTS: - void rotateSkin(); }; diff --git a/playground/dashboard/dashboard.pro b/playground/dashboard/dashboard.pro index 3f57407a..c982f184 100644 --- a/playground/dashboard/dashboard.pro +++ b/playground/dashboard/dashboard.pro @@ -1,22 +1,17 @@ CONFIG += qskexample qskqvg HEADERS += \ - ButtonBar.h \ SkinFactory.h \ - MainWindow.h \ - Speedometer.h \ - SpeedometerSkinlet.h \ - SpeedometerDisplay.h + Dial.h \ + DialSkinlet.h \ + Dashboard.h SOURCES += \ - ButtonBar.cpp \ SkinFactory.cpp \ - MainWindow.cpp \ - Speedometer.cpp \ - SpeedometerSkinlet.cpp \ - SpeedometerDisplay.cpp \ + Dial.cpp \ + DialSkinlet.cpp \ + Dashboard.cpp \ main.cpp \ RESOURCES += \ - images.qrc \ - qvgfiles.qrc + images.qrc diff --git a/playground/dashboard/images/bluetooth.svg b/playground/dashboard/images/bluetooth.svg deleted file mode 100644 index 90dd0265..00000000 --- a/playground/dashboard/images/bluetooth.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/bookmark.svg b/playground/dashboard/images/bookmark.svg deleted file mode 100644 index 543bb07f..00000000 --- a/playground/dashboard/images/bookmark.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/bus.svg b/playground/dashboard/images/bus.svg deleted file mode 100644 index 83997da9..00000000 --- a/playground/dashboard/images/bus.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/car.svg b/playground/dashboard/images/car.svg deleted file mode 100644 index 4beb2aab..00000000 --- a/playground/dashboard/images/car.svg +++ /dev/null @@ -1,410 +0,0 @@ - - - - - - Red Car - Top View - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - Openclipart - - - Red Car - Top View - 2010-05-19T15:02:12 - I was thinking of Trophy ( http://trophy.sourceforge.net/index.php?body=screenshots ) when remixing this one :) - https://openclipart.org/detail/61201/red-racing-car-top-view-by-qubodup - - - qubodup - - - - - car - game - game sprite - racing - racing car - red - red car - simple - simple car - sprite - transport - transportation - travel - video game - video game art - video game sprite - - - - - - - - - - - diff --git a/playground/dashboard/images/cloud.svg b/playground/dashboard/images/cloud.svg deleted file mode 100644 index 4423f38a..00000000 --- a/playground/dashboard/images/cloud.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/compass.svg b/playground/dashboard/images/compass.svg deleted file mode 100644 index c94138f2..00000000 --- a/playground/dashboard/images/compass.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/down.svg b/playground/dashboard/images/down.svg deleted file mode 100644 index 0e2fbc13..00000000 --- a/playground/dashboard/images/down.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/left.svg b/playground/dashboard/images/left.svg deleted file mode 100644 index 6e47594e..00000000 --- a/playground/dashboard/images/left.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/location.svg b/playground/dashboard/images/location.svg deleted file mode 100644 index 23d7f7ff..00000000 --- a/playground/dashboard/images/location.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/man.svg b/playground/dashboard/images/man.svg deleted file mode 100644 index 27c3d066..00000000 --- a/playground/dashboard/images/man.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/menu.svg b/playground/dashboard/images/menu.svg deleted file mode 100644 index 8f6b932f..00000000 --- a/playground/dashboard/images/menu.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/phone.svg b/playground/dashboard/images/phone.svg deleted file mode 100644 index a4469c14..00000000 --- a/playground/dashboard/images/phone.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/plane.svg b/playground/dashboard/images/plane.svg deleted file mode 100644 index 14113600..00000000 --- a/playground/dashboard/images/plane.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/right.svg b/playground/dashboard/images/right.svg deleted file mode 100644 index 879abe7f..00000000 --- a/playground/dashboard/images/right.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/train.svg b/playground/dashboard/images/train.svg deleted file mode 100644 index 701f418b..00000000 --- a/playground/dashboard/images/train.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/up.svg b/playground/dashboard/images/up.svg deleted file mode 100644 index d0ac978c..00000000 --- a/playground/dashboard/images/up.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/images/user.svg b/playground/dashboard/images/user.svg deleted file mode 100644 index bd66d1f4..00000000 --- a/playground/dashboard/images/user.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/playground/dashboard/main.cpp b/playground/dashboard/main.cpp index d4fd90f2..760b958b 100644 --- a/playground/dashboard/main.cpp +++ b/playground/dashboard/main.cpp @@ -3,18 +3,41 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include "MainWindow.h" +#include "Dashboard.h" #include "SkinFactory.h" #include -#include +#include #include #include -#include +#include +#include +#include + #include +namespace +{ + class Window : public QskWindow + { + public: + Window() + { + setAutoLayoutChildren( true ); + + const QImage image( QStringLiteral( ":/images/background.jpg" ) ); + + auto backgroundImage = new QskGraphicLabel( contentItem() ); + backgroundImage->setGraphic( QskGraphic::fromImage( image ) ); + backgroundImage->setFillMode( QskGraphicLabel::Stretch ); + + (void ) new Dashboard( contentItem() ); + } + }; +} + int main( int argc, char** argv ) { #ifdef ITEM_STATISTICS @@ -26,15 +49,9 @@ int main( int argc, char** argv ) QGuiApplication app( argc, argv ); - /* - When going over QPainter for the SVGs we prefer the raster paint - engine, simply showing better results. - */ - qskSetup->setItemUpdateFlag( QskQuickItem::PreferRasterForTextures, true ); - SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); - MainWindow window; + Window window; window.show(); return app.exec(); diff --git a/playground/dashboard/qvg/bluetooth.qvg b/playground/dashboard/qvg/bluetooth.qvg deleted file mode 100644 index 7c6522c1ce2b0275616acfe90af92e5dd8d8d462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039 zcmWFx_I77rU|?oua%Ko%u>SyL0|6uB|Njsc16&NoN2g(W(8XbVn7ji_0EuP%4_D3(Vu^zYhbq1^KycO}N!u6%fI^H81wUbIkP;AJbjUlD1_BT+ zs+dEDSyL0|6uB|Njsc16&NoN2g(W(8XbVn7ji_0EuP%4_D3(Vu^tWhx!K~ioqdcz0~}DWha45Mu(Ctk*bI8>m1Uy&)uZU z7X}u~e*mO_>NFd`G>~9)NPB(XIweX5SshFg#k|C1?_?7K?Z*wwp310aOPJMUiT-Smlx}mJtF; zK=VLB$^sTEi46XJ?xq;fUZK3{y#Zjc()VC_p!-1f)`G=gb|C!04H5^X?Lc@srd!%( Rpg|^rWhS7vumTd~nE)rOr`G@g diff --git a/playground/dashboard/qvg/bus.qvg b/playground/dashboard/qvg/bus.qvg deleted file mode 100644 index 7c16b72c2ac3695822c5352a4166898d3d2e7dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1879 zcmchYze`*}5XbiiBKZ$egkTp^TLd9;BUeN)5H%ne0x=<^3TZC6=Xs}CSojwxS}R(L zSfsnoBE-V~z#_#JDegZo^LF2NW^#ETf^m!8eV?6~@9gf}?ZWH17tXmDL(|Q>#*pXS zyuZHAGbaq+qa%DqIli$@0A}>1P;Pf8)EEwWr@M!bjm}@wo7csByqwLH9W^J)!BKlY zjobxcMSrqv%p%QB?Qz?u&R7}~dv(PF`*tqDJc0F2(i(R`*!sawZWqiVE%wr!HfCWL zX({Jmn5VZnj$wgTW^yjp_x*N?LskP!bMXY$eF$Ao-?p-E9aG;Rc2=YPB%P7TFH-R+ z$J6{gt)7jtK%L`%&tUCkwzC>wnu{keJ^Mgi%JJ+Sb${h}MgQ5{`O%O+B7y0hdtu9) z$(}ooSNT2_7OC1VjChRnMeYz-?g${+q1J3XFxB-^f1018cULJC6$69}^yd6i*$mSf zYX3-UNf&ih-7~Wwwf1!ywHqZ~Yl2Nui=wM6(1)sal|}maJvoq#2WEA_Y<`HRdsAIy z@*6e#<(hnue+z0Csr5VOVl}{QE?_oi#It*=?tzpADt7YOD~nR&HXiEU>Vnz)5YO%d xy2_kre3t(gFLznTY+XUOj;Zf+K0IH(8w>JA+}pe1{=)->hbq-XO?Qj+@CO?FCw2e; diff --git a/playground/dashboard/qvg/car.qvg b/playground/dashboard/qvg/car.qvg deleted file mode 100644 index 21f343f3c154040895412c14be577f0e1dafb609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53319 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 TF9sSU3|Inzc^{o7L7oW!5ZY3V diff --git a/playground/dashboard/qvg/left.qvg b/playground/dashboard/qvg/left.qvg deleted file mode 100644 index fd20b405719111651028e71b46caf60e23dc1601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmWFx_I77rU|?oua%Ko%u>SyL0|6uB|Njsc16&NoN2g(W(8XbVn7ji_0EuPOU=~oE(IKnk3=o_JDS`q< z2j5_bx?}}}7*w4@F_IX}yn-h%GZ-Bb9KmKgAnS#xL)Z&87ZhKC@VKE{d@;}SyL0|6uB|Njsc16&NoN2g(W(8XbVn7ji_0EuPrYUy z5mF^qS_BjuO9er&G|tRsvYX^U1a*p=*>C5$du(EUcEaac4EbEEKNeqYRQMTh?cqnQ2US{mL3Fa$URq3s$lY^al?GI1g@U6ia|Tgt^O*hFFZ|>|!Dabd!`41nqaV(;z%j5~ z7N#Lcni@+Jbf!ggz}Ye;)-oS*{nS?lEYpyE;{U6aasTM|!2Xy|!D=trRamc43A#7S zf^q3Z!A9dhh+=7T_Z*wq;oOkoP`VGBuVCh3Ciz^prML$O?@tR|gOBVdcXU{`y$Ew- z!ybw)LKNFS85uac-s5~h%=iUK%OszBN1b;bqj-8R63w^a-`)%F4<06Ypm3~6`N6*b E1=FY_!2kdN diff --git a/playground/dashboard/qvg/menu.qvg b/playground/dashboard/qvg/menu.qvg deleted file mode 100644 index 963c042400af4126cdc6efb8bca6b65910538c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 979 zcmWFx_I77rU|?oua%Ko%u>SyL0|6uB|Njsc16&NoN2g(W(8XbVn7ji_0EuP^F&waoASh=GtGc|bOW$R@jq1Q%REP!O>QKC-_- z&>vtbD<8485%L2p6cMeAXYS1XW_AgPpx$Ec%(>^>d*}ORX7cidGsYP2-6=C+#y@jT zvvzMU&P;{rdeEz85ZATFp+MnnC=~7Q6&nBY;ag+m{B}{NZ~EJK`Un&q48pN6;O0

F0;>r_9v$f3rB)x6jz>wyl;tl%-^FU z@8Y3=z3#*6w}SQuF<0@1WouKyOZ(WaaTU#D_Jzy}%%a{M#2jLtr6`lp>%53%Eaf1_ zRlMe=?1yWQ<$BnA51m+FFg+U?bLhxEclvlKt})RnmU0lYs=?YFF2$HH*6aJfS|guH zzt1@}*yu_UT&sG{H8PfKOh-ON9_tgLEe2oYQP?Vmb6v%p_F7=R>LvYCk~5Zj;XSKK z9?i>z)m{qBRaiQkk}usUl>11z3oQ4X&M>tOD~IF%%^2@sjUk@hM!egcW-Rx7l(-G= Z=w$U~{SyL0|6uB|Njsc16&NoN2g(W(8XbVn7ji_0EuP%4_D3(Vu^zYhk6kZ#o$mD0H%QiBV4Rl0U=ft0%kj;A*q9jIm6X4 zIl#mWZ_WgQSwKz94uxiEAOJHAESCQOi3?^jIphW#g8-5QvqQE7nCpOS9!v~jFC$zX zvimd}AbOGg0TV;^FU&ls+ku)8=2b)N2aBcbfS6ZX1Ex{L>K`D)pnh|x^FWA|wt(3V w$m(EX$mYSq57}Or7_$2?;|*j!BPhKG!qYb0(mMkUG8Qa@!NL%oCPAJF0LKSyL0|6uB|Njsc16&NoN2g(W(8XbVn7ji_0EuPBQQ`MlzB@!6qS~XrqYOC?dpMBvCBv>=o_pMJz1r1dE{W zU}2HMB5x4S?)uM6;sFuVDYARMot?|So2^ur7K}08yOJrJVn3T_X6;~*W`-HQM@Q@# z<@m-r0jSZ2M9F?HQL*3a++JKysysu}@7LLVEX-!Z5A7|6L7StE`OD0%6!cUo#7~+& z0T#B(%(7qo6n>6b>ue@iw&1Dy80XZUfS;%J*Em<}s})^5!ww8~*DyyulTIZ~yHLHh=KgSyL0|6uB|Njsc16&NoN2g(W(8XbVn7ji_0EuPf&H diff --git a/playground/dashboard/qvg/user.qvg b/playground/dashboard/qvg/user.qvg deleted file mode 100644 index 53bbe2331e478f3af199aa4b30211f252942158f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039 zcmcgryKVw85cH!+MTbP2e<1xWLJ9@Vov6}9K|-S9B}Iyq;(mktPTKGf6np?u(qDGZ zH}-N3LIS3^9nX4qY@c0B#v@~l_iku%lO35etgWiROw=%LN7S@+jFBe@Dq1lLxSmn= z*R7#^PUzWua|m4YAcZ~o(7cooBU4Aq!Itrb9BZC7j~sa3^t&%$nzWZvQUVv}J^#wI zC)Par$%F=8^@ir??emARgTT>K)0;xS;0sOrLeuMO`YEsItF*XxTI^x%==D&qMQI*M zTDzG*))%$+9Mpo)M+s`d5jl~xRO^t}9<=I&|B=?0_K~!X^pyKv#JhdB`)+RVu<*ce KhV6Jk-u(l#uXQH? diff --git a/playground/dashboard/qvgfiles.qrc b/playground/dashboard/qvgfiles.qrc deleted file mode 100644 index bedafe89..00000000 --- a/playground/dashboard/qvgfiles.qrc +++ /dev/null @@ -1,24 +0,0 @@ - - - - - qvg/car.qvg - qvg/bluetooth.qvg - qvg/bookmark.qvg - qvg/bus.qvg - qvg/cloud.qvg - qvg/location.qvg - qvg/man.qvg - qvg/menu.qvg - qvg/phone.qvg - qvg/plane.qvg - qvg/train.qvg - qvg/user.qvg - qvg/down.qvg - qvg/left.qvg - qvg/right.qvg - qvg/up.qvg - - - -