code simplified
This commit is contained in:
parent
f33f38bbbb
commit
80004ed8e8
|
|
@ -1,221 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
||||||
* This file may be used under the terms of the 3-clause BSD License
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#include "DefaultSkin.h"
|
|
||||||
|
|
||||||
#include "ButtonBar.h"
|
|
||||||
#include "SkinFactory.h"
|
|
||||||
#include "SoundControl.h"
|
|
||||||
|
|
||||||
#include "Speedometer.h"
|
|
||||||
#include "SpeedometerSkinlet.h"
|
|
||||||
|
|
||||||
#include <QskBox.h>
|
|
||||||
#include <QskBoxBorderColors.h>
|
|
||||||
#include <QskBoxBorderMetrics.h>
|
|
||||||
#include <QskColorFilter.h>
|
|
||||||
#include <QskFunctions.h>
|
|
||||||
#include <QskMargins.h>
|
|
||||||
#include <QskPushButton.h>
|
|
||||||
#include <QskSeparator.h>
|
|
||||||
#include <QskSkinTransition.h>
|
|
||||||
#include <QskSlider.h>
|
|
||||||
#include <QskTextLabel.h>
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
class Transition final : public QskSkinTransition
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
void updateSkin( QskSkin*, QskSkin* newSkin ) override
|
|
||||||
{
|
|
||||||
DefaultSkin* skin = static_cast< DefaultSkin* >( newSkin );
|
|
||||||
skin->resetHints();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class Palette
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Palette( DefaultSkin::Scheme scheme = DefaultSkin::Daylight )
|
|
||||||
{
|
|
||||||
if ( scheme == DefaultSkin::Daylight )
|
|
||||||
{
|
|
||||||
// colorful:
|
|
||||||
color1.setNamedColor( "#011627" ); // Maastricht blue
|
|
||||||
color2.setNamedColor( "#FF0022" ); // ruddy
|
|
||||||
color3.setNamedColor( "#41EAD4" ); // Turquoise
|
|
||||||
color4.setNamedColor( "#FDFFFC" ); // baby powder
|
|
||||||
color5.setNamedColor( "#B91372" ); // red violet
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// greenish:
|
|
||||||
color4.setNamedColor( "#FAF3DD" ); // Beige
|
|
||||||
color2.setNamedColor( "#C8D5B9" ); // Pale Silver
|
|
||||||
color3.setNamedColor( "#8FC0A9" ); // Eton Blue
|
|
||||||
color1.setNamedColor( "#68B0AB" ); // Green Sheen
|
|
||||||
color5.setNamedColor( "#4A7C59" ); // Amazon
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QColor color1;
|
|
||||||
QColor color2;
|
|
||||||
QColor color3;
|
|
||||||
QColor color4;
|
|
||||||
QColor color5;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
static inline QFont qskFont( qreal pointSize )
|
|
||||||
{
|
|
||||||
QFont font( "Roboto" );
|
|
||||||
font.setPointSizeF( pointSize / qskDpiScaled( 1.0 ) );
|
|
||||||
return font;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
DefaultSkin::DefaultSkin( const QString& name, QObject* parent )
|
|
||||||
: QskSkin( parent )
|
|
||||||
, m_name( name )
|
|
||||||
, m_palette( new Palette )
|
|
||||||
, m_scheme( Daylight )
|
|
||||||
{
|
|
||||||
setObjectName( "DefaultSkin" );
|
|
||||||
declareSkinlet< Speedometer, SpeedometerSkinlet >();
|
|
||||||
initHints();
|
|
||||||
}
|
|
||||||
|
|
||||||
DefaultSkin::~DefaultSkin()
|
|
||||||
{
|
|
||||||
delete m_palette;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DefaultSkin::initHints()
|
|
||||||
{
|
|
||||||
using namespace QskAspect;
|
|
||||||
|
|
||||||
const int duration = 200; // for animators
|
|
||||||
|
|
||||||
setFont( QskSkin::DefaultFont, qskFont( 13 ) );
|
|
||||||
setFont( QskSkin::LargeFont, qskFont( 20 ) );
|
|
||||||
|
|
||||||
setColor( QskTextLabel::Text, m_palette->color4 );
|
|
||||||
|
|
||||||
// -- sound control
|
|
||||||
|
|
||||||
setGradient( SoundControl::Overlay, 0 );
|
|
||||||
setGradient( SoundControl::CrossHair, m_palette->color3 );
|
|
||||||
setGradient( SoundControl::Marker, m_palette->color5 );
|
|
||||||
|
|
||||||
setBoxBorderMetrics( SoundControl::Marker, 2 );
|
|
||||||
setBoxShape( SoundControl::Marker, 100, Qt::RelativeSize );
|
|
||||||
|
|
||||||
setGradient( QskSeparator::Panel, m_palette->color3 );
|
|
||||||
setMetric( QskSeparator::Panel | Size, 2 );
|
|
||||||
|
|
||||||
// -- push buttons
|
|
||||||
|
|
||||||
setMargins( QskPushButton::Panel | Padding, 10 );
|
|
||||||
setGradient( QskPushButton::Panel, m_palette->color1 );
|
|
||||||
setColor( QskPushButton::Text, m_palette->color3 );
|
|
||||||
setGradient( QskPushButton::Panel | QskPushButton::Pressed, m_palette->color2 );
|
|
||||||
setAnimation( QskPushButton::Panel | Color, duration );
|
|
||||||
|
|
||||||
setGradient( SoundControl::SliderControl, m_palette->color1 );
|
|
||||||
setGradient( SoundControl::SliderControl | QskPushButton::Pressed, m_palette->color2 );
|
|
||||||
setAnimation( SoundControl::SliderControl | Color, duration );
|
|
||||||
|
|
||||||
setMetric( QskPushButton::Text | Size, 20 );
|
|
||||||
setSkinHint( QskPushButton::Text | FontRole, int( QskSkin::LargeFont ) );
|
|
||||||
setSkinHint( QskPushButton::Text | Alignment, Qt::AlignCenter );
|
|
||||||
|
|
||||||
// -- a more advanced setup of the hints for the slider
|
|
||||||
|
|
||||||
const qreal dim = 30;
|
|
||||||
|
|
||||||
setMetric( QskSlider::Panel | Size, dim );
|
|
||||||
setGradient( QskSlider::Panel, QskGradient() );
|
|
||||||
|
|
||||||
setMetric( QskSlider::Groove | Size, 2 );
|
|
||||||
setGradient( QskSlider::Groove, m_palette->color4 );
|
|
||||||
|
|
||||||
setMetric( QskSlider::Fill | Size, 2 );
|
|
||||||
setGradient( QskSlider::Fill, m_palette->color4.darker( 200 ) );
|
|
||||||
|
|
||||||
setMetric( QskSlider::Handle | Size, 24 );
|
|
||||||
setBoxBorderMetrics( QskSlider::Handle, 0 );
|
|
||||||
setBoxShape( QskSlider::Handle, 100.0, Qt::RelativeSize );
|
|
||||||
setGradient( QskSlider::Handle, m_palette->color5 );
|
|
||||||
|
|
||||||
// -- speedometers
|
|
||||||
|
|
||||||
setBoxBorderMetrics( Speedometer::Panel, 2 );
|
|
||||||
setGradient( Speedometer::Panel, m_palette->color1 );
|
|
||||||
setBoxBorderColors( Speedometer::Panel, m_palette->color3 );
|
|
||||||
|
|
||||||
setBoxBorderMetrics( Speedometer::NeedleHead, 2 );
|
|
||||||
setMetric( Speedometer::NeedleHead | Size, 15 );
|
|
||||||
setGradient( Speedometer::NeedleHead,
|
|
||||||
QskGradient( QskGradient::Diagonal, m_palette->color2, m_palette->color1 ) );
|
|
||||||
// setBoxBorderColors( Speedometer::NeedleHead, m_palette->color4 );
|
|
||||||
|
|
||||||
setMetric( Speedometer::Needle | MinimumWidth, 2 );
|
|
||||||
setMetric( Speedometer::Needle | Margin, 10 );
|
|
||||||
setColor( Speedometer::Needle, m_palette->color2 );
|
|
||||||
|
|
||||||
// margins between numbers and ticks:
|
|
||||||
setMargins( Speedometer::Labels, QskMargins( 4, 4, 4, 4 ) );
|
|
||||||
setMetric( Speedometer::Labels | MinimumWidth, 2 );
|
|
||||||
setMetric( Speedometer::Labels | Size, 15 ); // ticks size
|
|
||||||
setColor( Speedometer::Labels, m_palette->color4 );
|
|
||||||
setFontRole( Speedometer::Labels, QskSkin::SmallFont );
|
|
||||||
|
|
||||||
// handle expanding, when being pressed
|
|
||||||
for ( auto state : { QskAspect::NoState, QskSlider::Pressed } )
|
|
||||||
{
|
|
||||||
const auto aspect = QskSlider::Handle | state;
|
|
||||||
|
|
||||||
// fullsize, only when being pressed
|
|
||||||
const qreal sz = ( state == NoState ) ? 0.7 * dim : dim;
|
|
||||||
|
|
||||||
setMetric( aspect | Size, sz );
|
|
||||||
|
|
||||||
// move the handle smoothly, when using keys
|
|
||||||
setAnimation( aspect | Metric | Position,
|
|
||||||
( state == NoState ) ? 2 * duration : 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
setAnimation( QskSlider::Handle | Metric, duration );
|
|
||||||
|
|
||||||
// animator for color scheme transitions
|
|
||||||
setAnimation( Color, QskAnimationHint( 1000, QEasingCurve::InQuad ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void DefaultSkin::toggleScheme()
|
|
||||||
{
|
|
||||||
if ( m_scheme == Daylight )
|
|
||||||
m_scheme = Nighttime;
|
|
||||||
else
|
|
||||||
m_scheme = Daylight;
|
|
||||||
|
|
||||||
Transition transition;
|
|
||||||
|
|
||||||
transition.setSourceSkin( this );
|
|
||||||
transition.setTargetSkin( this );
|
|
||||||
transition.setMask( QskSkinTransition::Color );
|
|
||||||
transition.setAnimation( animation( QskAspect::Color ) );
|
|
||||||
|
|
||||||
transition.process();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DefaultSkin::resetHints()
|
|
||||||
{
|
|
||||||
delete m_palette;
|
|
||||||
m_palette = new Palette( m_scheme );
|
|
||||||
initHints();
|
|
||||||
}
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
||||||
* This file may be used under the terms of the 3-clause BSD License
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef DEFAULTSKIN_H
|
|
||||||
#define DEFAULTSKIN_H
|
|
||||||
|
|
||||||
#include <QskSkin.h>
|
|
||||||
|
|
||||||
class Palette;
|
|
||||||
|
|
||||||
class DefaultSkin : public QskSkin
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DefaultSkin( const QString& name, QObject* parent = nullptr );
|
|
||||||
~DefaultSkin() override;
|
|
||||||
|
|
||||||
void toggleScheme();
|
|
||||||
void resetHints();
|
|
||||||
|
|
||||||
enum Scheme
|
|
||||||
{
|
|
||||||
Daylight,
|
|
||||||
Nighttime
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
void initHints();
|
|
||||||
|
|
||||||
QString m_name;
|
|
||||||
Palette* m_palette;
|
|
||||||
Scheme m_scheme;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // DEFAULTSKIN_H
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
#include "ButtonBar.h"
|
#include "ButtonBar.h"
|
||||||
#include "SkinFactory.h"
|
#include "SkinFactory.h"
|
||||||
#include "SoundControl.h"
|
|
||||||
#include "SpeedometerDisplay.h"
|
#include "SpeedometerDisplay.h"
|
||||||
|
|
||||||
#include <QskGraphic.h>
|
#include <QskGraphic.h>
|
||||||
|
|
@ -18,70 +17,63 @@
|
||||||
#include <QDate>
|
#include <QDate>
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
|
|
||||||
#define SPEEDO 1
|
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()
|
MainWindow::MainWindow()
|
||||||
{
|
{
|
||||||
|
setAutoLayoutChildren( true );
|
||||||
|
|
||||||
const QImage image( QStringLiteral( ":/images/background.jpg" ) );
|
const QImage image( QStringLiteral( ":/images/background.jpg" ) );
|
||||||
|
|
||||||
auto backgroundImage = new QskGraphicLabel( contentItem() );
|
auto backgroundImage = new QskGraphicLabel( contentItem() );
|
||||||
backgroundImage->setGraphic( QskGraphic::fromImage( image ) );
|
backgroundImage->setGraphic( QskGraphic::fromImage( image ) );
|
||||||
backgroundImage->setFillMode( QskGraphicLabel::Stretch );
|
backgroundImage->setFillMode( QskGraphicLabel::Stretch );
|
||||||
|
|
||||||
auto header = headerBar();
|
auto header = new Header();
|
||||||
auto content = mainContent();
|
auto speedoDisplay = new SpeedometerDisplay();
|
||||||
auto footer = footerBar();
|
auto footer = new Footer();
|
||||||
|
|
||||||
auto layout = new QskLinearBox( Qt::Vertical, contentItem() );
|
auto layout = new QskLinearBox( Qt::Vertical, contentItem() );
|
||||||
|
|
||||||
layout->addItem( header );
|
layout->addItem( header );
|
||||||
layout->setStretchFactor( header, 1 );
|
layout->setStretchFactor( header, 1 );
|
||||||
|
|
||||||
layout->addItem( content );
|
layout->addItem( speedoDisplay );
|
||||||
layout->setStretchFactor( content, 8 );
|
layout->setStretchFactor( speedoDisplay, 8 );
|
||||||
|
|
||||||
layout->addItem( footer );
|
layout->addItem( footer );
|
||||||
layout->setStretchFactor( footer, 1 );
|
layout->setStretchFactor( footer, 1 );
|
||||||
|
|
||||||
setAutoLayoutChildren( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
QQuickItem* MainWindow::headerBar() const
|
|
||||||
{
|
|
||||||
auto* header = new ButtonBar();
|
|
||||||
header->addIndicator( "bluetooth" );
|
|
||||||
header->addIndicator( "location" );
|
|
||||||
header->addIndicator( "phone" );
|
|
||||||
|
|
||||||
( void ) new QskTextLabel( QDate::currentDate().toString(), header );
|
|
||||||
|
|
||||||
header->addIndicator( "user" );
|
|
||||||
header->addIndicator( "bookmark" );
|
|
||||||
header->addIndicator( "menu" );
|
|
||||||
|
|
||||||
return header;
|
|
||||||
}
|
|
||||||
|
|
||||||
QQuickItem* MainWindow::mainContent() const
|
|
||||||
{
|
|
||||||
#if SPEEDO
|
|
||||||
return new SpeedometerDisplay();
|
|
||||||
#else
|
|
||||||
return new SoundControl();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
QQuickItem* MainWindow::footerBar() const
|
|
||||||
{
|
|
||||||
auto* footer = new ButtonBar();
|
|
||||||
|
|
||||||
footer->addIndicator( "cloud" );
|
|
||||||
footer->addIndicator( "man" );
|
|
||||||
footer->addIndicator( "bus" );
|
|
||||||
footer->addIndicator( "plane" );
|
|
||||||
footer->addIndicator( "train" );
|
|
||||||
|
|
||||||
footer->addStretch( 10 );
|
|
||||||
|
|
||||||
return footer;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,6 @@ class MainWindow : public QskWindow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MainWindow();
|
MainWindow();
|
||||||
|
|
||||||
private:
|
|
||||||
QQuickItem* headerBar() const;
|
|
||||||
QQuickItem* mainContent() const;
|
|
||||||
QQuickItem* footerBar() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,190 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
||||||
* This file may be used under the terms of the 3-clause BSD License
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#include "OtherSkin.h"
|
|
||||||
#include "SkinFactory.h"
|
|
||||||
|
|
||||||
#include "ButtonBar.h"
|
|
||||||
#include "SoundControl.h"
|
|
||||||
|
|
||||||
#include "Speedometer.h"
|
|
||||||
#include "SpeedometerSkinlet.h"
|
|
||||||
|
|
||||||
#include <QskBox.h>
|
|
||||||
#include <QskBoxBorderColors.h>
|
|
||||||
#include <QskBoxBorderMetrics.h>
|
|
||||||
#include <QskColorFilter.h>
|
|
||||||
#include <QskFunctions.h>
|
|
||||||
#include <QskMargins.h>
|
|
||||||
#include <QskPushButton.h>
|
|
||||||
#include <QskSeparator.h>
|
|
||||||
#include <QskSkinTransition.h>
|
|
||||||
#include <QskSlider.h>
|
|
||||||
#include <QskTextLabel.h>
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
class Palette
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Palette()
|
|
||||||
{
|
|
||||||
// grey-blue-yellow:
|
|
||||||
color1.setNamedColor( "#363636" ); // Jet
|
|
||||||
color2.setNamedColor( "#242F40" ); // Yankees blue
|
|
||||||
color3.setNamedColor( "#CCA43B" ); // Satin sheet gold
|
|
||||||
color4.setNamedColor( "#E5E5E5" ); // Platinum
|
|
||||||
color5.setNamedColor( "#FFFFFF" ); // white
|
|
||||||
}
|
|
||||||
|
|
||||||
QColor color1;
|
|
||||||
QColor color2;
|
|
||||||
QColor color3;
|
|
||||||
QColor color4;
|
|
||||||
QColor color5;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
static inline QFont qskFont( qreal pointSize )
|
|
||||||
{
|
|
||||||
QFont font( "Roboto" );
|
|
||||||
font.setPointSizeF( pointSize / qskDpiScaled( 1.0 ) );
|
|
||||||
return font;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OtherSkin::OtherSkin( const QString& name, QObject* parent )
|
|
||||||
: QskSkin( parent )
|
|
||||||
, m_name( name )
|
|
||||||
, m_palette( new Palette )
|
|
||||||
{
|
|
||||||
setObjectName( "OtherSkin" );
|
|
||||||
declareSkinlet< Speedometer, SpeedometerSkinlet >();
|
|
||||||
initHints();
|
|
||||||
initGraphicFilters();
|
|
||||||
}
|
|
||||||
|
|
||||||
OtherSkin::~OtherSkin()
|
|
||||||
{
|
|
||||||
delete m_palette;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OtherSkin::initHints()
|
|
||||||
{
|
|
||||||
using namespace QskAspect;
|
|
||||||
|
|
||||||
const int duration = 200; // for animators
|
|
||||||
|
|
||||||
setFont( QskSkin::DefaultFont, qskFont( 13 ) );
|
|
||||||
setFont( QskSkin::LargeFont, qskFont( 20 ) );
|
|
||||||
|
|
||||||
setColor( QskTextLabel::Text, m_palette->color3 );
|
|
||||||
|
|
||||||
// -- sound control
|
|
||||||
setGradient( SoundControl::CrossHair, QColor( "OliveDrab" ).lighter( 120 ) );
|
|
||||||
setGradient( SoundControl::Marker, QColor( "OliveDrab" ) );
|
|
||||||
|
|
||||||
setBoxBorderMetrics( SoundControl::Marker, 2 );
|
|
||||||
setBoxShape( SoundControl::Marker, 100, Qt::RelativeSize );
|
|
||||||
|
|
||||||
setSkinHint( ButtonBar::Indicator | GraphicRole, SkinFactory::Indicator );
|
|
||||||
setSkinHint( SoundControl::Vehicle | GraphicRole, SkinFactory::Vehicle );
|
|
||||||
setSkinHint( SoundControl::MarkerControl | GraphicRole, SkinFactory::Vehicle );
|
|
||||||
|
|
||||||
setBoxBorderMetrics( QskSeparator::Panel, 0 );
|
|
||||||
setGradient( QskSeparator::Panel, m_palette->color3 );
|
|
||||||
setMetric( QskSeparator::Panel | Size, 1 );
|
|
||||||
|
|
||||||
// -- push buttons
|
|
||||||
|
|
||||||
setMargins( QskPushButton::Panel | Padding, 8 );
|
|
||||||
setBoxBorderMetrics( QskPushButton::Panel, 0 );
|
|
||||||
setBoxShape( QskPushButton::Panel, 4 );
|
|
||||||
|
|
||||||
setGradient( QskPushButton::Panel, m_palette->color1 );
|
|
||||||
setGradient( QskPushButton::Panel | QskPushButton::Pressed, m_palette->color2 );
|
|
||||||
|
|
||||||
setColor( QskPushButton::Text, m_palette->color3 );
|
|
||||||
setAnimation( QskPushButton::Panel | Color, duration );
|
|
||||||
|
|
||||||
// -- overlay
|
|
||||||
|
|
||||||
QColor overlayColor( "#011627" );
|
|
||||||
overlayColor.setAlpha( 200 );
|
|
||||||
setGradient( SoundControl::Overlay, overlayColor );
|
|
||||||
|
|
||||||
// -- slider control buttons
|
|
||||||
setBoxBorderMetrics( SoundControl::SliderControl, 0 );
|
|
||||||
setBoxShape( SoundControl::SliderControl, 4 );
|
|
||||||
|
|
||||||
setGradient( SoundControl::SliderControl, m_palette->color1 );
|
|
||||||
setGradient( SoundControl::SliderControl | QskPushButton::Pressed, m_palette->color2 );
|
|
||||||
|
|
||||||
setAnimation( SoundControl::SliderControl | Color, duration );
|
|
||||||
|
|
||||||
setMetric( QskPushButton::Text | Size, 20 );
|
|
||||||
setSkinHint( QskPushButton::Text | FontRole, int( QskSkin::LargeFont ) );
|
|
||||||
setSkinHint( QskPushButton::Text | Alignment, Qt::AlignCenter );
|
|
||||||
|
|
||||||
// -- a more advanced setup of the hints for the slider
|
|
||||||
|
|
||||||
setMetric( QskSlider::Panel | Size, 30 );
|
|
||||||
setGradient( QskSlider::Panel, QskGradient() );
|
|
||||||
|
|
||||||
setMetric( QskSlider::Groove | Size, 5 );
|
|
||||||
setGradient( QskSlider::Groove, m_palette->color4.darker( 200 ) );
|
|
||||||
|
|
||||||
setMetric( QskSlider::Fill | Size, 5 );
|
|
||||||
setGradient( QskSlider::Fill, m_palette->color3.lighter( 150 ) );
|
|
||||||
|
|
||||||
setMetric( QskSlider::Handle | Size, 22 );
|
|
||||||
setBoxBorderMetrics( QskSlider::Handle, 0 );
|
|
||||||
setBoxShape( QskSlider::Handle, 6 );
|
|
||||||
setGradient( QskSlider::Handle, m_palette->color3 );
|
|
||||||
|
|
||||||
// -- speedometers
|
|
||||||
|
|
||||||
setBoxBorderMetrics( Speedometer::Panel, 5 );
|
|
||||||
setGradient( Speedometer::Panel,
|
|
||||||
QskGradient( QskGradient::Vertical, m_palette->color2, m_palette->color4 ) );
|
|
||||||
setBoxBorderColors( Speedometer::Panel, m_palette->color3 );
|
|
||||||
|
|
||||||
setBoxBorderMetrics( Speedometer::NeedleHead, 5 );
|
|
||||||
setMetric( Speedometer::NeedleHead | Size, 10 );
|
|
||||||
setGradient( Speedometer::NeedleHead, m_palette->color2 );
|
|
||||||
setBoxBorderColors( Speedometer::NeedleHead, m_palette->color4 );
|
|
||||||
|
|
||||||
setMetric( Speedometer::Needle | MinimumWidth, 4 );
|
|
||||||
setMetric( Speedometer::Needle | Margin, 15 );
|
|
||||||
setColor( Speedometer::Needle, m_palette->color4 );
|
|
||||||
|
|
||||||
// margins between numbers and ticks:
|
|
||||||
setMargins( Speedometer::Labels, QskMargins( 3, 3, 3, 3 ) );
|
|
||||||
setMetric( Speedometer::Labels | MinimumWidth, 3 );
|
|
||||||
setMetric( Speedometer::Labels | Size, 25 ); // ticks size
|
|
||||||
setColor( Speedometer::Labels, m_palette->color4 );
|
|
||||||
setFontRole( Speedometer::Labels, QskSkin::SmallFont );
|
|
||||||
}
|
|
||||||
|
|
||||||
void OtherSkin::initGraphicFilters()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
// all SVGs on the header/footer are plain white
|
|
||||||
|
|
||||||
QskColorFilter filter;
|
|
||||||
filter.addColorSubstitution( Qt::white, m_palette->color3.rgb() );
|
|
||||||
|
|
||||||
setGraphicFilter( SkinFactory::Indicator, filter );
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
// we need to modify the SVG to have more colors for substutions !!
|
|
||||||
QskColorFilter filter;
|
|
||||||
filter.addColorSubstitution( Qt::white, m_palette->color3.rgb() );
|
|
||||||
|
|
||||||
setGraphicFilter( SkinFactory::Vehicle, filter );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
||||||
* This file may be used under the terms of the 3-clause BSD License
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef OTHERSKIN_H
|
|
||||||
#define OTHERSKIN_H
|
|
||||||
|
|
||||||
#include <QskSkin.h>
|
|
||||||
|
|
||||||
class Palette;
|
|
||||||
|
|
||||||
class OtherSkin : public QskSkin
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
OtherSkin( const QString& name, QObject* parent = nullptr );
|
|
||||||
~OtherSkin() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void initHints();
|
|
||||||
void initGraphicFilters();
|
|
||||||
|
|
||||||
QString m_name;
|
|
||||||
Palette* m_palette;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -4,37 +4,163 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "SkinFactory.h"
|
#include "SkinFactory.h"
|
||||||
#include "DefaultSkin.h"
|
|
||||||
#include "OtherSkin.h"
|
|
||||||
|
|
||||||
|
#include "ButtonBar.h"
|
||||||
|
#include "Speedometer.h"
|
||||||
|
#include "SpeedometerSkinlet.h"
|
||||||
|
|
||||||
|
#include <QskBoxBorderColors.h>
|
||||||
|
#include <QskBoxBorderMetrics.h>
|
||||||
|
#include <QskColorFilter.h>
|
||||||
|
#include <QskFunctions.h>
|
||||||
|
#include <QskMargins.h>
|
||||||
|
#include <QskTextLabel.h>
|
||||||
|
#include <QskAnimationHint.h>
|
||||||
#include <QskSetup.h>
|
#include <QskSetup.h>
|
||||||
#include <QskSkinTransition.h>
|
#include <QskSkinTransition.h>
|
||||||
|
#include <QskSkin.h>
|
||||||
|
|
||||||
|
#include <QEasingCurve>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
inline QFont qskFont( qreal pointSize )
|
||||||
|
{
|
||||||
|
QFont font( "Roboto" );
|
||||||
|
font.setPointSizeF( pointSize / qskDpiScaled( 1.0 ) );
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Skin : public QskSkin
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Skin()
|
||||||
|
{
|
||||||
|
using namespace QskAspect;
|
||||||
|
|
||||||
|
declareSkinlet< Speedometer, SpeedometerSkinlet >();
|
||||||
|
|
||||||
|
setFont( QskSkin::DefaultFont, qskFont( 13 ) );
|
||||||
|
setFont( QskSkin::LargeFont, qskFont( 20 ) );
|
||||||
|
|
||||||
|
setSkinHint( ButtonBar::Indicator | GraphicRole, SkinFactory::Indicator );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Skin1 : public Skin
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Skin1()
|
||||||
|
{
|
||||||
|
using namespace QskAspect;
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
setColor( QskTextLabel::Text, color3 );
|
||||||
|
|
||||||
|
{
|
||||||
|
using Q = Speedometer;
|
||||||
|
|
||||||
|
setBoxBorderMetrics( Q::Panel, 5 );
|
||||||
|
setGradient( Q::Panel,
|
||||||
|
QskGradient( QskGradient::Vertical, color2, color4 ) );
|
||||||
|
setBoxBorderColors( Q::Panel, color3 );
|
||||||
|
|
||||||
|
setBoxBorderMetrics( Q::NeedleHead, 5 );
|
||||||
|
setMetric( Q::NeedleHead | Size, 10 );
|
||||||
|
setGradient( Q::NeedleHead, color2 );
|
||||||
|
setBoxBorderColors( Q::NeedleHead, color4 );
|
||||||
|
|
||||||
|
setMetric( Q::Needle | MinimumWidth, 4 );
|
||||||
|
setMetric( Q::Needle | Margin, 15 );
|
||||||
|
setColor( Q::Needle, color4 );
|
||||||
|
|
||||||
|
// margins between numbers and ticks:
|
||||||
|
setMargins( Q::Labels, QskMargins( 3, 3, 3, 3 ) );
|
||||||
|
setMetric( Q::Labels | MinimumWidth, 3 );
|
||||||
|
setMetric( Q::Labels | Size, 25 ); // ticks size
|
||||||
|
setColor( Q::Labels, color4 );
|
||||||
|
setFontRole( Q::Labels, 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()
|
||||||
|
{
|
||||||
|
using namespace QskAspect;
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
setColor( QskTextLabel::Text, color4 );
|
||||||
|
|
||||||
|
{
|
||||||
|
using Q = Speedometer;
|
||||||
|
|
||||||
|
setBoxBorderMetrics( Q::Panel, 2 );
|
||||||
|
setGradient( Q::Panel, color1 );
|
||||||
|
setBoxBorderColors( Q::Panel, color3 );
|
||||||
|
|
||||||
|
setBoxBorderMetrics( Q::NeedleHead, 2 );
|
||||||
|
setMetric( Q::NeedleHead | Size, 15 );
|
||||||
|
setGradient( Q::NeedleHead,
|
||||||
|
QskGradient( QskGradient::Diagonal, color2, color1 ) );
|
||||||
|
// setBoxBorderColors( Q::NeedleHead, color4 );
|
||||||
|
|
||||||
|
setMetric( Q::Needle | MinimumWidth, 2 );
|
||||||
|
setMetric( Q::Needle | Margin, 10 );
|
||||||
|
setColor( Q::Needle, color2 );
|
||||||
|
|
||||||
|
// margins between numbers and ticks:
|
||||||
|
setMargins( Q::Labels, QskMargins( 4, 4, 4, 4 ) );
|
||||||
|
setMetric( Q::Labels | MinimumWidth, 2 );
|
||||||
|
setMetric( Q::Labels | Size, 15 ); // ticks size
|
||||||
|
setColor( Q::Labels, color4 );
|
||||||
|
setFontRole( Q::Labels, QskSkin::SmallFont );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
QStringList SkinFactory::skinNames() const
|
QStringList SkinFactory::skinNames() const
|
||||||
{
|
{
|
||||||
return { "DefaultSkin", "OtherSkin" };
|
return { "Skin1", "Skin2" };
|
||||||
}
|
}
|
||||||
|
|
||||||
QskSkin* SkinFactory::createSkin( const QString& skinName )
|
QskSkin* SkinFactory::createSkin( const QString& skinName )
|
||||||
{
|
{
|
||||||
if ( skinName == "DefaultSkin" )
|
if ( skinName == "Skin1" )
|
||||||
return new DefaultSkin( skinName );
|
return new Skin1();
|
||||||
|
|
||||||
if ( skinName == "OtherSkin" )
|
if ( skinName == "Skin2" )
|
||||||
return new OtherSkin( skinName );
|
return new Skin2();
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkinFactory::toggleScheme()
|
|
||||||
{
|
|
||||||
if ( qskSetup->skinName() == "DefaultSkin" )
|
|
||||||
static_cast< DefaultSkin* >( qskSetup->skin() )->toggleScheme();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SkinFactory::rotateSkin()
|
void SkinFactory::rotateSkin()
|
||||||
{
|
{
|
||||||
const QStringList names = skinNames();
|
const auto names = skinNames();
|
||||||
|
|
||||||
int index = names.indexOf( qskSetup->skinName() );
|
int index = names.indexOf( qskSetup->skinName() );
|
||||||
index = ( index + 1 ) % names.size();
|
index = ( index + 1 ) % names.size();
|
||||||
|
|
|
||||||
|
|
@ -15,22 +15,15 @@ class SkinFactory : public QskSkinFactory
|
||||||
public:
|
public:
|
||||||
enum GraphicRoles
|
enum GraphicRoles
|
||||||
{
|
{
|
||||||
// to be visible on a button
|
|
||||||
Button,
|
|
||||||
|
|
||||||
// to be visible on header/footer
|
// to be visible on header/footer
|
||||||
Indicator,
|
Indicator,
|
||||||
|
|
||||||
// in contrast to the background pixmap
|
|
||||||
Vehicle
|
|
||||||
};
|
};
|
||||||
|
|
||||||
QStringList skinNames() const override;
|
QStringList skinNames() const override;
|
||||||
QskSkin* createSkin( const QString& skinName ) override;
|
QskSkin* createSkin( const QString& ) override;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void rotateSkin();
|
void rotateSkin();
|
||||||
void toggleScheme();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,424 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
||||||
* This file may be used under the terms of the 3-clause BSD License
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#include "SoundControl.h"
|
|
||||||
#include "SkinFactory.h"
|
|
||||||
|
|
||||||
#include <QskBox.h>
|
|
||||||
#include <QskGraphic.h>
|
|
||||||
#include <QskGraphicIO.h>
|
|
||||||
#include <QskGraphicLabel.h>
|
|
||||||
#include <QskGridBox.h>
|
|
||||||
#include <QskLinearBox.h>
|
|
||||||
#include <QskNamespace.h>
|
|
||||||
#include <QskPushButton.h>
|
|
||||||
#include <QskSeparator.h>
|
|
||||||
#include <QskSlider.h>
|
|
||||||
#include <QskTextLabel.h>
|
|
||||||
|
|
||||||
QSK_SUBCONTROL( SoundControl, Overlay )
|
|
||||||
QSK_SUBCONTROL( SoundControl, CrossHair )
|
|
||||||
QSK_SUBCONTROL( SoundControl, Marker )
|
|
||||||
QSK_SUBCONTROL( SoundControl, MarkerControl )
|
|
||||||
QSK_SUBCONTROL( SoundControl, Vehicle )
|
|
||||||
QSK_SUBCONTROL( SoundControl, SliderControl )
|
|
||||||
|
|
||||||
class VehicleLabel final : public QskGraphicLabel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
VehicleLabel( QQuickItem* parentItem = nullptr )
|
|
||||||
: QskGraphicLabel( parentItem )
|
|
||||||
{
|
|
||||||
setGraphic( QskGraphicIO::read( QString( ":/qvg/car.qvg" ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskAspect::Subcontrol effectiveSubcontrol(
|
|
||||||
QskAspect::Subcontrol subControl ) const override
|
|
||||||
{
|
|
||||||
// so that we can set specific colors in the skin
|
|
||||||
|
|
||||||
if ( subControl == QskGraphicLabel::Graphic )
|
|
||||||
return SoundControl::Vehicle;
|
|
||||||
|
|
||||||
return subControl;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class CrossHairLine final : public QskBox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CrossHairLine( QQuickItem* parent )
|
|
||||||
: QskBox( parent )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QskAspect::Subcontrol effectiveSubcontrol(
|
|
||||||
QskAspect::Subcontrol subControl ) const override
|
|
||||||
{
|
|
||||||
if ( subControl == QskBox::Panel )
|
|
||||||
return SoundControl::CrossHair;
|
|
||||||
|
|
||||||
return subControl;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class BalanceFadeMarker final : public QskBox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BalanceFadeMarker( QQuickItem* parent )
|
|
||||||
: QskBox( parent )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QskAspect::Subcontrol effectiveSubcontrol(
|
|
||||||
QskAspect::Subcontrol subControl ) const override
|
|
||||||
{
|
|
||||||
if ( subControl == QskBox::Panel )
|
|
||||||
return SoundControl::Marker;
|
|
||||||
|
|
||||||
return subControl;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class MarkerControlButton final : public QskPushButton
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MarkerControlButton( Qsk::Direction direction, QQuickItem* parentItem = nullptr )
|
|
||||||
: QskPushButton( parentItem )
|
|
||||||
, m_direction( direction )
|
|
||||||
{
|
|
||||||
const char* svgList[] = { "right", "left", "down", "up" };
|
|
||||||
|
|
||||||
const QString fileName = QString( ":/qvg/%1.qvg" ).arg( svgList[ direction ] );
|
|
||||||
setGraphic( QskGraphicIO::read( fileName ) );
|
|
||||||
|
|
||||||
setAutoRepeat( true );
|
|
||||||
setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
|
|
||||||
}
|
|
||||||
|
|
||||||
QPointF offset() const
|
|
||||||
{
|
|
||||||
const qreal off = 5.0;
|
|
||||||
|
|
||||||
switch ( m_direction )
|
|
||||||
{
|
|
||||||
case Qsk::LeftToRight:
|
|
||||||
return QPointF( off, 0.0 );
|
|
||||||
|
|
||||||
case Qsk::RightToLeft:
|
|
||||||
return QPointF( -off, 0.0 );
|
|
||||||
|
|
||||||
case Qsk::TopToBottom:
|
|
||||||
return QPointF( 0.0, off );
|
|
||||||
|
|
||||||
case Qsk::BottomToTop:
|
|
||||||
return QPointF( 0.0, -off );
|
|
||||||
}
|
|
||||||
|
|
||||||
return QPointF();
|
|
||||||
}
|
|
||||||
|
|
||||||
QskAspect::Subcontrol effectiveSubcontrol(
|
|
||||||
QskAspect::Subcontrol subControl ) const override
|
|
||||||
{
|
|
||||||
// so that we can set specific colors in the skin
|
|
||||||
|
|
||||||
if ( subControl == QskPushButton::Graphic )
|
|
||||||
return SoundControl::MarkerControl;
|
|
||||||
|
|
||||||
return subControl;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QSizeF contentsSizeHint( Qt::SizeHint which, const QSizeF& ) const override
|
|
||||||
{
|
|
||||||
if ( which != Qt::PreferredSize )
|
|
||||||
return QSizeF();
|
|
||||||
|
|
||||||
const qreal dim = 100;
|
|
||||||
|
|
||||||
if ( m_direction == Qsk::LeftToRight || m_direction == Qsk::RightToLeft )
|
|
||||||
return QSizeF( 0.5 * dim, dim );
|
|
||||||
else
|
|
||||||
return QSizeF( dim, 0.5 * dim );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const Qsk::Direction m_direction;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ControlButton final : public QskPushButton
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ControlButton( const char symbol, QQuickItem* parentItem = nullptr )
|
|
||||||
: QskPushButton( parentItem )
|
|
||||||
{
|
|
||||||
setText( QChar( symbol ) );
|
|
||||||
setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
|
|
||||||
|
|
||||||
setAutoRepeat( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskAspect::Subcontrol effectiveSubcontrol(
|
|
||||||
QskAspect::Subcontrol subControl ) const override
|
|
||||||
{
|
|
||||||
if ( subControl == QskPushButton::Panel )
|
|
||||||
return SoundControl::SliderControl;
|
|
||||||
|
|
||||||
return QskPushButton::effectiveSubcontrol( subControl );
|
|
||||||
}
|
|
||||||
|
|
||||||
QSizeF contentsSizeHint( Qt::SizeHint which, const QSizeF& ) const override
|
|
||||||
{
|
|
||||||
if ( which == Qt::PreferredSize )
|
|
||||||
{
|
|
||||||
qreal h = QskPushButton::contentsSizeHint( which, QSizeF() ).height();
|
|
||||||
return QSizeF( h, h );
|
|
||||||
}
|
|
||||||
|
|
||||||
return QSizeF();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class StackedControl final : public QskControl
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
StackedControl( QQuickItem* parent = nullptr )
|
|
||||||
: QskControl( parent )
|
|
||||||
, m_offset( 0.0, 0.0 )
|
|
||||||
{
|
|
||||||
setPolishOnResize( true ); // we have t re-layout the crosshair
|
|
||||||
setSizePolicy( QskSizePolicy::Expanding, QskSizePolicy::Expanding );
|
|
||||||
|
|
||||||
auto horizontalCarRectangle = new CrossHairLine( this );
|
|
||||||
horizontalCarRectangle->setObjectName( "horizontalBar" );
|
|
||||||
|
|
||||||
auto verticalCarRectangle = new CrossHairLine( this );
|
|
||||||
verticalCarRectangle->setObjectName( "verticalBar" );
|
|
||||||
|
|
||||||
( void ) new VehicleLabel( this );
|
|
||||||
|
|
||||||
auto marker = new BalanceFadeMarker( this );
|
|
||||||
marker->setObjectName( "marker" );
|
|
||||||
}
|
|
||||||
|
|
||||||
QPointF offset() const
|
|
||||||
{
|
|
||||||
return m_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setOffset( const QPointF& offset )
|
|
||||||
{
|
|
||||||
m_offset = offset;
|
|
||||||
polish();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void updateLayout() override
|
|
||||||
{
|
|
||||||
const QRectF cr = contentsRect();
|
|
||||||
const qreal crossHairSize = 3;
|
|
||||||
|
|
||||||
for ( int a = 0; a < children().count(); a++ )
|
|
||||||
{
|
|
||||||
auto control = static_cast< QskControl* >( children().at( a ) );
|
|
||||||
|
|
||||||
if ( control->objectName() == "verticalBar" )
|
|
||||||
{
|
|
||||||
control->setGeometry( cr.center().x(), cr.top(), crossHairSize, cr.height() );
|
|
||||||
control->setZ( 1 );
|
|
||||||
}
|
|
||||||
else if ( control->objectName() == "horizontalBar" )
|
|
||||||
{
|
|
||||||
control->setGeometry( cr.left(), cr.center().y(), cr.width(), crossHairSize );
|
|
||||||
control->setZ( 1 );
|
|
||||||
}
|
|
||||||
else if ( control->objectName() == "marker" )
|
|
||||||
{
|
|
||||||
qreal size = 31;
|
|
||||||
|
|
||||||
control->setPosition(
|
|
||||||
cr.center() - 0.5 * QPointF( size, size ) + m_offset + QPointF( 1, 1 ) );
|
|
||||||
control->setSize( QSizeF( size, size ) );
|
|
||||||
control->setZ( 1 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
control->setGeometry( cr );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QPointF m_offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SectionTitleBar final : public QskLinearBox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SectionTitleBar( const char* title, QQuickItem* parentItem = nullptr )
|
|
||||||
: QskLinearBox( Qt::Horizontal, parentItem )
|
|
||||||
{
|
|
||||||
setSpacing( 10 );
|
|
||||||
|
|
||||||
auto label = new QskTextLabel( title );
|
|
||||||
label->setSizePolicy( Qt::Horizontal, QskSizePolicy::Fixed );
|
|
||||||
|
|
||||||
addItem( new QskSeparator() );
|
|
||||||
addItem( label );
|
|
||||||
addItem( new QskSeparator() );
|
|
||||||
|
|
||||||
setStretchFactor( 0, 1 );
|
|
||||||
setStretchFactor( 2, 5 );
|
|
||||||
|
|
||||||
setSizePolicy( Qt::Vertical, QskSizePolicy::Fixed );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class SliderBox final : public QskLinearBox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SliderBox( const char* title, qreal min, qreal max, QQuickItem* parentItem = nullptr )
|
|
||||||
: QskLinearBox( Qt::Vertical, parentItem )
|
|
||||||
{
|
|
||||||
auto label = new QskTextLabel( title );
|
|
||||||
m_numberLabel = new QskTextLabel();
|
|
||||||
|
|
||||||
// don't stretch the labels, so that the layout centers them
|
|
||||||
label->setSizePolicy( Qt::Horizontal, QskSizePolicy::Fixed );
|
|
||||||
m_numberLabel->setSizePolicy( Qt::Horizontal, QskSizePolicy::Fixed );
|
|
||||||
|
|
||||||
auto plusButton = new ControlButton( '+' );
|
|
||||||
auto minusButton = new ControlButton( '-' );
|
|
||||||
|
|
||||||
m_slider = new QskSlider( Qt::Vertical );
|
|
||||||
m_slider->setMinimum( min );
|
|
||||||
m_slider->setMaximum( max );
|
|
||||||
m_slider->setStepSize( 10 );
|
|
||||||
|
|
||||||
// layout
|
|
||||||
|
|
||||||
addItem( label );
|
|
||||||
addItem( m_numberLabel );
|
|
||||||
addItem( plusButton );
|
|
||||||
addSpacer( 10 );
|
|
||||||
addItem( m_slider );
|
|
||||||
addSpacer( 10 );
|
|
||||||
addItem( minusButton );
|
|
||||||
|
|
||||||
setDefaultAlignment( Qt::AlignCenter );
|
|
||||||
|
|
||||||
// finally connect buttons/slider/labels
|
|
||||||
|
|
||||||
connect( plusButton, &QskPushButton::pressed,
|
|
||||||
this, [ this ]() { increment( 1 ); } );
|
|
||||||
|
|
||||||
connect( minusButton, &QskPushButton::pressed,
|
|
||||||
this, [ this ]() { increment( -1 ); } );
|
|
||||||
|
|
||||||
connect( m_slider, &QskSlider::valueChanged,
|
|
||||||
this, &SliderBox::setValue );
|
|
||||||
}
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
void setValue( qreal value )
|
|
||||||
{
|
|
||||||
m_slider->setValue( value );
|
|
||||||
|
|
||||||
QString txt;
|
|
||||||
txt.setNum( m_slider->value(), 'f', 1 );
|
|
||||||
|
|
||||||
m_numberLabel->setText( txt );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void increment( qreal offset )
|
|
||||||
{
|
|
||||||
setValue( m_slider->value() + offset );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskTextLabel* m_numberLabel;
|
|
||||||
QskSlider* m_slider;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ToneControlBox final : public QskLinearBox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ToneControlBox( QQuickItem* parentItem = nullptr )
|
|
||||||
: QskLinearBox( Qt::Horizontal, parentItem )
|
|
||||||
{
|
|
||||||
auto bassControl = new SliderBox( "Bass", 0.0, 40.0, this );
|
|
||||||
auto treebleControl = new SliderBox( "Treeble", 0.0, 40.0, this );
|
|
||||||
auto subControl = new SliderBox( "Sub", 0.0, 40.0, this );
|
|
||||||
|
|
||||||
bassControl->setValue( 30 );
|
|
||||||
treebleControl->setValue( 11 );
|
|
||||||
subControl->setValue( 18 );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class BalanceFadeControlBox final : public QskGridBox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BalanceFadeControlBox( QQuickItem* parentItem = nullptr )
|
|
||||||
: QskGridBox( parentItem )
|
|
||||||
{
|
|
||||||
MarkerControlButton* buttons[ 4 ];
|
|
||||||
for ( int i = 0; i < 4; i++ )
|
|
||||||
{
|
|
||||||
auto button = new MarkerControlButton( static_cast< Qsk::Direction >( i ) );
|
|
||||||
button->setLayoutAlignmentHint( Qt::AlignCenter );
|
|
||||||
|
|
||||||
connect( button, &QskPushButton::pressed,
|
|
||||||
this, [ this, button ]() { shift( button->offset() ); } );
|
|
||||||
|
|
||||||
buttons[ i ] = button;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_carControl = new StackedControl();
|
|
||||||
|
|
||||||
addItem( buttons[ Qsk::RightToLeft ], 1, 0 );
|
|
||||||
addItem( buttons[ Qsk::BottomToTop ], 0, 1 );
|
|
||||||
addItem( buttons[ Qsk::LeftToRight ], 1, 2 );
|
|
||||||
addItem( buttons[ Qsk::TopToBottom ], 2, 1 );
|
|
||||||
|
|
||||||
addItem( m_carControl, 1, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void shift( const QPointF& offset )
|
|
||||||
{
|
|
||||||
m_carControl->setOffset( m_carControl->offset() + offset );
|
|
||||||
}
|
|
||||||
|
|
||||||
StackedControl* m_carControl;
|
|
||||||
};
|
|
||||||
|
|
||||||
SoundControl::SoundControl( QQuickItem* parent )
|
|
||||||
: QskBox( parent )
|
|
||||||
{
|
|
||||||
setAutoLayoutChildren( true );
|
|
||||||
|
|
||||||
auto layout = new QskGridBox( this );
|
|
||||||
layout->setMargins( QMarginsF( 40, 20, 40, 20 ) );
|
|
||||||
layout->setSpacing( Qt::Vertical, 10 );
|
|
||||||
layout->setSpacing( Qt::Horizontal, 60 );
|
|
||||||
layout->setColumnStretchFactor( 0, 1 );
|
|
||||||
layout->setColumnStretchFactor( 1, 3 );
|
|
||||||
|
|
||||||
layout->addItem( new SectionTitleBar( "Tone" ), 0, 0 );
|
|
||||||
layout->addItem( new ToneControlBox(), 1, 0 );
|
|
||||||
|
|
||||||
layout->addItem( new SectionTitleBar( "Balance / Fade" ), 0, 1 );
|
|
||||||
layout->addItem( new BalanceFadeControlBox(), 1, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
QskAspect::Subcontrol SoundControl::effectiveSubcontrol(
|
|
||||||
QskAspect::Subcontrol subControl ) const
|
|
||||||
{
|
|
||||||
if ( subControl == QskBox::Panel )
|
|
||||||
return SoundControl::Overlay;
|
|
||||||
|
|
||||||
return subControl;
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/******************************************************************************
|
|
||||||
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
||||||
* This file may be used under the terms of the 3-clause BSD License
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef SOUNDCONTROL_H
|
|
||||||
#define SOUNDCONTROL_H
|
|
||||||
|
|
||||||
#include <QskBox.h>
|
|
||||||
|
|
||||||
class SoundControl : public QskBox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QSK_SUBCONTROLS( Overlay, CrossHair, Marker, Vehicle, SliderControl, MarkerControl )
|
|
||||||
|
|
||||||
SoundControl( QQuickItem* parent = nullptr );
|
|
||||||
|
|
||||||
QskAspect::Subcontrol effectiveSubcontrol(
|
|
||||||
QskAspect::Subcontrol subControl ) const override final;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -18,7 +18,7 @@ class Speedometer : public QskBoundedValueInput
|
||||||
Speedometer( QQuickItem* parent = nullptr );
|
Speedometer( QQuickItem* parent = nullptr );
|
||||||
|
|
||||||
QVector< QString > labels() const;
|
QVector< QString > labels() const;
|
||||||
void setLabels( const QVector< QString >& labels );
|
void setLabels( const QVector< QString >& );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QVector< QString > m_labels;
|
QVector< QString > m_labels;
|
||||||
|
|
|
||||||
|
|
@ -4,118 +4,130 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "SpeedometerDisplay.h"
|
#include "SpeedometerDisplay.h"
|
||||||
|
|
||||||
#include "Speedometer.h"
|
#include "Speedometer.h"
|
||||||
|
|
||||||
#include <QskEvent.h>
|
|
||||||
#include <QskLinearBox.h>
|
|
||||||
#include <QskTextLabel.h>
|
#include <QskTextLabel.h>
|
||||||
|
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QtGlobal>
|
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
class Dial : public Speedometer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Dial( const QString& title, QQuickItem* parent = nullptr )
|
||||||
|
: Speedometer( parent )
|
||||||
|
{
|
||||||
|
setPolishOnResize( true );
|
||||||
|
m_label = new QskTextLabel( title, this );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void updateLayout() override
|
||||||
|
{
|
||||||
|
const auto r = layoutRect();
|
||||||
|
|
||||||
|
const auto hint = m_label->sizeConstraint();
|
||||||
|
|
||||||
|
const qreal y = r.y() + 0.6 * r.height() - 0.5 * hint.height();
|
||||||
|
const qreal x = r.center().x() - 0.5 * hint.width();
|
||||||
|
|
||||||
|
m_label->setGeometry( x, y, hint.width(), hint.height() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QskTextLabel* m_label;
|
||||||
|
};
|
||||||
|
|
||||||
|
class RevCounter : public Dial
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RevCounter( QQuickItem* parent = nullptr )
|
||||||
|
: Dial( "x 1000 min^-1", parent )
|
||||||
|
{
|
||||||
|
setMinimum( 145 );
|
||||||
|
setMaximum( 305 );
|
||||||
|
setValue( 200 );
|
||||||
|
|
||||||
|
constexpr int labelsCount = 8;
|
||||||
|
|
||||||
|
QVector< QString > labels;
|
||||||
|
labels.reserve( labelsCount );
|
||||||
|
|
||||||
|
for ( int i = 0; i < labelsCount; i++ )
|
||||||
|
labels += QString::number( i );
|
||||||
|
|
||||||
|
setLabels( labels );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Speedo : public Dial
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Speedo( QQuickItem* parent = nullptr )
|
||||||
|
: Dial( "km/h", parent )
|
||||||
|
{
|
||||||
|
setMinimum( -215 );
|
||||||
|
setMaximum( 35 );
|
||||||
|
setValue( -90 );
|
||||||
|
|
||||||
|
constexpr int labelsCount = 23;
|
||||||
|
|
||||||
|
QVector< QString > labels;
|
||||||
|
labels.reserve( labelsCount );
|
||||||
|
|
||||||
|
for ( int i = 0; i < labelsCount; i++ )
|
||||||
|
labels.append( QString::number( i * 10 ) );
|
||||||
|
|
||||||
|
setLabels( labels );
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateValue()
|
||||||
|
{
|
||||||
|
setValue( value() + std::rand() % 3 - 0.95 );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class FuelGauge : public Dial
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FuelGauge( QQuickItem* parent = nullptr )
|
||||||
|
: Dial( "fuel", parent )
|
||||||
|
{
|
||||||
|
setMinimum( 195 );
|
||||||
|
setMaximum( 345 );
|
||||||
|
setValue( 330 );
|
||||||
|
|
||||||
|
setLabels( { "0", "", "1/2", "", "1/1" } );
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateValue()
|
||||||
|
{
|
||||||
|
setValue( 0.99997 * value() );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
SpeedometerDisplay::SpeedometerDisplay( QQuickItem* parent )
|
SpeedometerDisplay::SpeedometerDisplay( QQuickItem* parent )
|
||||||
: QskControl( parent )
|
: QskLinearBox( Qt::Horizontal, 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 ) )
|
|
||||||
{
|
{
|
||||||
std::srand( static_cast< uint >( QTime::currentTime().msec() ) );
|
std::srand( static_cast< uint >( QTime::currentTime().msec() ) );
|
||||||
|
|
||||||
setPolishOnResize( true );
|
(void ) new RevCounter( this );
|
||||||
|
auto speedometer = new Speedo( this );
|
||||||
m_box->setAutoAddChildren( true );
|
auto fuelGauge = new FuelGauge( this );
|
||||||
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 );
|
|
||||||
|
|
||||||
|
setMargins( 10 );
|
||||||
|
setSpacing( 10 );
|
||||||
|
|
||||||
auto timer = new QTimer( this );
|
auto timer = new QTimer( this );
|
||||||
|
|
||||||
connect( timer, &QTimer::timeout, this, [ this ]()
|
connect( timer, &QTimer::timeout, speedometer, &Speedo::updateValue );
|
||||||
{
|
connect( timer, &QTimer::timeout, fuelGauge, &FuelGauge::updateValue );
|
||||||
auto speedometerValue = m_speedometer->value() + std::rand() % 3 - 0.95;
|
|
||||||
m_speedometer->setValue( speedometerValue );
|
|
||||||
|
|
||||||
auto fuelGaugeValue = 0.99997 * m_fuelGauge->value();
|
|
||||||
m_fuelGauge->setValue( fuelGaugeValue );
|
|
||||||
});
|
|
||||||
|
|
||||||
timer->setInterval( 16 );
|
timer->setInterval( 16 );
|
||||||
timer->start();
|
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() );
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,28 +6,12 @@
|
||||||
#ifndef SPEEDOMETERDISPLAY_H
|
#ifndef SPEEDOMETERDISPLAY_H
|
||||||
#define SPEEDOMETERDISPLAY_H
|
#define SPEEDOMETERDISPLAY_H
|
||||||
|
|
||||||
#include <QskControl.h>
|
#include <QskLinearBox.h>
|
||||||
|
|
||||||
class QskLinearBox;
|
class SpeedometerDisplay : public QskLinearBox
|
||||||
class QskTextLabel;
|
|
||||||
class Speedometer;
|
|
||||||
|
|
||||||
class SpeedometerDisplay : public QskControl
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SpeedometerDisplay( QQuickItem* parent = nullptr );
|
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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,12 @@ SpeedometerSkinlet::~SpeedometerSkinlet() = default;
|
||||||
QRectF SpeedometerSkinlet::subControlRect( const QskSkinnable*,
|
QRectF SpeedometerSkinlet::subControlRect( const QskSkinnable*,
|
||||||
const QRectF& contentsRect, QskAspect::Subcontrol ) const
|
const QRectF& contentsRect, QskAspect::Subcontrol ) const
|
||||||
{
|
{
|
||||||
return contentsRect;
|
const auto extent = qMin( contentsRect.width(), contentsRect.height() );
|
||||||
|
|
||||||
|
QRectF r( 0.0, 0.0, extent, extent );
|
||||||
|
r.moveCenter( contentsRect.center() );
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSGNode* SpeedometerSkinlet::updateSubNode(
|
QSGNode* SpeedometerSkinlet::updateSubNode(
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,7 @@ CONFIG += qskexample qskqvg
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
ButtonBar.h \
|
ButtonBar.h \
|
||||||
SoundControl.h \
|
|
||||||
SkinFactory.h \
|
SkinFactory.h \
|
||||||
DefaultSkin.h \
|
|
||||||
OtherSkin.h \
|
|
||||||
MainWindow.h \
|
MainWindow.h \
|
||||||
Speedometer.h \
|
Speedometer.h \
|
||||||
SpeedometerSkinlet.h \
|
SpeedometerSkinlet.h \
|
||||||
|
|
@ -13,15 +10,12 @@ HEADERS += \
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
ButtonBar.cpp \
|
ButtonBar.cpp \
|
||||||
SoundControl.cpp \
|
|
||||||
SkinFactory.cpp \
|
SkinFactory.cpp \
|
||||||
DefaultSkin.cpp \
|
|
||||||
OtherSkin.cpp \
|
|
||||||
MainWindow.cpp \
|
MainWindow.cpp \
|
||||||
main.cpp \
|
|
||||||
Speedometer.cpp \
|
Speedometer.cpp \
|
||||||
SpeedometerSkinlet.cpp \
|
SpeedometerSkinlet.cpp \
|
||||||
SpeedometerDisplay.cpp
|
SpeedometerDisplay.cpp \
|
||||||
|
main.cpp \
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
images.qrc \
|
images.qrc \
|
||||||
|
|
|
||||||
|
|
@ -6,56 +6,33 @@
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
#include "SkinFactory.h"
|
#include "SkinFactory.h"
|
||||||
|
|
||||||
|
#include <SkinnyShortcut.h>
|
||||||
|
#include <SkinnyFont.h>
|
||||||
|
|
||||||
#include <QskSetup.h>
|
#include <QskSetup.h>
|
||||||
#include <QskShortcutMap.h>
|
|
||||||
#include <QskSkinManager.h>
|
#include <QskSkinManager.h>
|
||||||
#include <SkinnyShortcut.h>
|
#include <SkinnyShortcut.h>
|
||||||
|
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
auto skinFactory = new SkinFactory();
|
qskSkinManager->setPluginPaths( QStringList() ); // no skin plugins
|
||||||
|
qskSkinManager->registerFactory( QStringLiteral( "sample" ), new SkinFactory() );
|
||||||
qskSkinManager->setPluginPaths( QStringList() ); // no plugins
|
|
||||||
qskSkinManager->registerFactory(
|
|
||||||
QStringLiteral( "SampleSkinFactory" ), skinFactory );
|
|
||||||
|
|
||||||
QGuiApplication app( argc, argv );
|
QGuiApplication app( argc, argv );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
When going over QPainter for the SVGs we prefer the raster paint
|
When going over QPainter for the SVGs we prefer the raster paint
|
||||||
engine, simply showing better results. Interestingly the OpenGL paint
|
engine, simply showing better results.
|
||||||
engine was even slower for the use case of non-complex SVGs.
|
|
||||||
Looks like its tesselation is not much faster than "pixeling"
|
|
||||||
those images directly.
|
|
||||||
*/
|
*/
|
||||||
qskSetup->setControlFlag( QskSetup::PreferRasterForTextures, true );
|
qskSetup->setControlFlag( QskSetup::PreferRasterForTextures, true );
|
||||||
|
|
||||||
// Starting with a simple skin made for this example
|
SkinnyFont::init( &app );
|
||||||
// CTRL-S allow to rotate through the registered skins and CTRL-T
|
SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts );
|
||||||
// changes the colors, when the DefaultSkin is active.
|
|
||||||
|
|
||||||
qskSetup->setSkin( QStringLiteral( "DefaultSkin" ) );
|
MainWindow window;
|
||||||
|
window.show();
|
||||||
cout << "CTRL-S to change the skin." << endl;
|
|
||||||
cout << "CTRL-T to change the color scheme, when the \"Default\" skin is active." << endl;
|
|
||||||
|
|
||||||
QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_T ),
|
|
||||||
false, skinFactory, &SkinFactory::toggleScheme );
|
|
||||||
|
|
||||||
QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_S ),
|
|
||||||
false, skinFactory, &SkinFactory::rotateSkin );
|
|
||||||
|
|
||||||
// With CTRL-B you can rotate a couple of visual debug modes
|
|
||||||
SkinnyShortcut::enable( SkinnyShortcut::DebugBackground |
|
|
||||||
SkinnyShortcut::DebugStatistics | SkinnyShortcut::Quit );
|
|
||||||
|
|
||||||
MainWindow mainWindow;
|
|
||||||
mainWindow.show();
|
|
||||||
|
|
||||||
return app.exec();
|
return app.exec();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue