Use animator for light dimmer

This commit is contained in:
Peter Hartmann 2020-09-30 17:04:20 +02:00
parent 3ceee7cddb
commit e5b430dde8
2 changed files with 72 additions and 14 deletions

View File

@ -1,14 +1,77 @@
#include "LightIntensity.h"
#include "DaytimeSkin.h"
#include <QskAnimator.h>
#include <QskRgbValue.h>
#include <QskSetup.h>
#include <QskTextLabel.h>
#include <QGuiApplication>
#include <QQuickWindow>
#include <QPainter>
#include <QRadialGradient>
QSK_SUBCONTROL( LightDisplay, Panel )
namespace
{
QColor invertedColor( const QColor& c )
{
QColor ret = { 255 - c.red(), 255 - c.green(), 255 - c.blue()};
return ret;
}
}
// ### There must be an easier way to do this
class DimmerAnimator : public QskAnimator
{
public:
DimmerAnimator( LightDisplay* display, LightDimmer* dimmer )
: m_display( display )
, m_dimmer( dimmer )
{
QQuickWindow* w = static_cast<QQuickWindow*>( qGuiApp->allWindows().at( 0 ) );
setWindow( w );
setDuration( 500 );
setEasingCurve( QEasingCurve::Linear );
setAutoRepeat( false );
}
void setup() override
{
m_backgroundColor = m_display->color( LightDisplay::Panel );
m_ringGradient = m_dimmer->ringGradient();
}
void advance( qreal value ) override
{
const QColor c = m_backgroundColor;
const QColor c2 = invertedColor( c );
const QColor newColor = QskRgb::interpolated( c2, c, value );
m_dimmer->setBackgroundColor( newColor );
QRadialGradient gradient = m_ringGradient;
QRadialGradient newGradient = gradient;
for( const QGradientStop& stop : gradient.stops() )
{
QColor c = stop.second;
QColor c2 = invertedColor( c );
const QColor newColor = QskRgb::interpolated( c, c2, value );
newGradient.setColorAt( stop.first, newColor );
}
m_dimmer->setRingGradient( newGradient );
m_dimmer->update();
}
private:
QColor m_backgroundColor;
QRadialGradient m_ringGradient;
LightDisplay* m_display;
LightDimmer* m_dimmer;
};
LightDimmer::LightDimmer( QQuickItem* parent )
: QQuickPaintedItem( parent )
{
@ -74,6 +137,7 @@ LightDisplay::LightDisplay( QQuickItem* parent )
, m_centreLabel( new QskTextLabel( QString::number( 50 ) + "%", this ) )
, m_rightLabel( new QskTextLabel( QString::number( 100 ), this ) )
, m_dimmer( new LightDimmer( this ) )
, m_animator( new DimmerAnimator( this, m_dimmer ) )
{
m_leftLabel->setSizePolicy( Qt::Horizontal, QskSizePolicy::Maximum );
m_centreLabel->setSizePolicy( Qt::Horizontal, QskSizePolicy::Maximum );
@ -90,20 +154,7 @@ LightDisplay::LightDisplay( QQuickItem* parent )
connect( qskSetup, &QskSetup::skinChanged, [this]()
{
const QColor c = color( Panel );
m_dimmer->setBackgroundColor( c );
QRadialGradient gradient = m_dimmer->ringGradient();
QRadialGradient newGradient = gradient;
for( const QGradientStop& stop : gradient.stops() )
{
QColor s = stop.second;
QColor newColor = { 255 - s.red(), 255 - s.green(), 255 - s.blue()};
newGradient.setColorAt( stop.first, newColor );
}
m_dimmer->setRingGradient( newGradient );
m_animator->start();
} );
}

View File

@ -6,6 +6,7 @@
#include <QQuickPaintedItem>
#include <QRadialGradient>
class DimmerAnimator;
class QskTextLabel;
class LightDimmer: public QQuickPaintedItem
@ -25,6 +26,11 @@ class LightDimmer: public QQuickPaintedItem
m_thickness = thickness;
}
QColor backgroundColor() const
{
return m_backgroundColor;
}
void setBackgroundColor( const QColor& color )
{
m_backgroundColor = color;
@ -68,6 +74,7 @@ class LightDisplay : public QskControl
QskTextLabel* m_centreLabel;
QskTextLabel* m_rightLabel;
LightDimmer* m_dimmer;
DimmerAnimator* m_animator;
};
class LightIntensity : public Box