IOT example: Use QskArcNode instead of own arc node

This commit is contained in:
Peter Hartmann 2021-10-11 14:44:40 +02:00
parent 58f8c0c709
commit d1f79e2f72
1 changed files with 6 additions and 144 deletions

View File

@ -6,137 +6,12 @@
#include "CircularProgressBarSkinlet.h"
#include "CircularProgressBar.h"
#include <QskArcNode.h>
#include <QskPaintedNode.h>
#include <QEasingCurve>
#include <QPainter>
namespace
{
class ArcNode : public QskPaintedNode
{
public:
void setGradient( const QskGradient& gradient )
{
m_gradient = gradient;
}
void setGradientType( QGradient::Type type )
{
m_gradientType = type;
}
void setWidth( double width )
{
m_width = width;
}
void setValue( double value )
{
m_value = value;
}
void setOrigin( double origin )
{
m_origin = origin;
}
void setMaximum( double maximum )
{
m_maximum = maximum;
}
void setIndeterminate( bool isIndeterminate )
{
m_isIndeterminate = isIndeterminate;
}
void setPosition( double position )
{
m_position = position;
}
void paint( QPainter* painter, const QSizeF& size ) override
{
int startAngle;
int spanAngle;
if( m_isIndeterminate )
{
static const QEasingCurve curve( QEasingCurve::Linear );
startAngle = -1 * m_position * 360;
// the other option is to just set a fixed value for the
// span angle (or do some advanced stuff with easing curves)
spanAngle = qAbs( 0.5 - m_position ) * 360;
}
else
{
startAngle = 90 + -1 * ( m_origin / m_maximum ) * 360;
spanAngle = -1 * ( m_value / m_maximum ) * 360;
}
painter->setRenderHint( QPainter::Antialiasing, true );
const QRectF r( 0.5 * m_width, 0.5 * m_width,
size.width() - m_width, size.height() - m_width );
QGradientStops stops;
for( const QskGradientStop& stop : m_gradient.stops() )
{
QGradientStop s( stop.position(), stop.color() );
stops.append( s );
}
if( m_gradientType == QGradient::RadialGradient )
{
QRadialGradient radialGradient( r.center(), qMin( r.width(), r.height() ) );
radialGradient.setStops( stops );
painter->setPen( QPen( radialGradient, m_width, Qt::SolidLine, Qt::FlatCap ) );
painter->drawArc( r, startAngle * 16, spanAngle * 16 );
}
else
{
QConicalGradient conicalGradient( r.center(), startAngle );
conicalGradient.setStops( stops );
painter->setPen( QPen( conicalGradient, m_width, Qt::SolidLine, Qt::FlatCap ) );
painter->drawArc( r, startAngle * 16, spanAngle * 16 );
}
}
uint hash() const override
{
uint h = qHash( m_gradientType );
h = qHash( m_width, h );
h = qHash( m_value, h );
h = qHash( m_origin, h );
h = qHash( m_maximum, h );
h = qHash( m_isIndeterminate, h );
h = qHash( m_position, h );
for( const QskGradientStop& stop : m_gradient.stops() )
{
h = stop.hash( h );
}
return h;
}
private:
QskGradient m_gradient;
QGradient::Type m_gradientType;
double m_width;
double m_value;
double m_origin;
double m_maximum;
bool m_isIndeterminate;
double m_position;
};
}
CircularProgressBarSkinlet::CircularProgressBarSkinlet( QskSkin* skin )
: QskSkinlet( skin )
{
@ -173,11 +48,11 @@ QSGNode* CircularProgressBarSkinlet::updateSubNode(
QSGNode* CircularProgressBarSkinlet::updateBarNode(
const CircularProgressBar* bar, quint8 nodeRole, QSGNode* node ) const
{
auto arcNode = static_cast< ArcNode* >( node );
auto arcNode = static_cast< QskArcNode* >( node );
if( arcNode == nullptr )
{
arcNode = new ArcNode();
arcNode = new QskArcNode();
}
const auto subControl = ( nodeRole == GrooveRole ) ? CircularProgressBar::Groove
@ -190,23 +65,10 @@ QSGNode* CircularProgressBarSkinlet::updateBarNode(
const double width = bar->metric( subControl | QskAspect::Size );
const double value = ( nodeRole == GrooveRole ) ? bar->maximum() : bar->value();
const double position = bar->metric( CircularProgressBar::Bar | QskAspect::Position );
arcNode->setGradient( gradient );
arcNode->setGradientType( type );
arcNode->setWidth( width );
arcNode->setOrigin( bar->origin() );
arcNode->setMaximum( bar->maximum() );
arcNode->setIndeterminate( bar->isIndeterminate() );
if( bar->isIndeterminate() )
{
const double position = bar->metric( CircularProgressBar::Bar | QskAspect::Position );
arcNode->setPosition( position );
}
else
{
arcNode->setValue( value );
}
arcNode->setArcData( gradient, type, width, value, bar->origin(), bar->maximum(),
bar->isIndeterminate(), position );
QQuickWindow* window = bar->window();
const QRect rect = bar->contentsRect().toRect();