add QskArcNode and QskArcRenderer
This commit is contained in:
parent
5791341996
commit
58f8c0c709
|
@ -0,0 +1,97 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* This file may be used under the terms of the QSkinny License, Version 1.0
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "QskArcNode.h"
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
|
QskArcNode::QskArcNode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QskArcNode::~QskArcNode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskArcNode::setArcData( const QskGradient &gradient,
|
||||||
|
QGradient::Type gradientType, double width, double value, double origin,
|
||||||
|
double maximum, bool isIndeterminate, double position )
|
||||||
|
{
|
||||||
|
m_gradient = gradient;
|
||||||
|
m_gradientType = gradientType;
|
||||||
|
m_width = width;
|
||||||
|
m_value = value;
|
||||||
|
m_origin = origin;
|
||||||
|
m_maximum = maximum;
|
||||||
|
m_isIndeterminate = isIndeterminate;
|
||||||
|
m_position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskArcNode::paint( QPainter *painter, const QSizeF &size )
|
||||||
|
{
|
||||||
|
int startAngle;
|
||||||
|
int spanAngle;
|
||||||
|
|
||||||
|
if( m_isIndeterminate )
|
||||||
|
{
|
||||||
|
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 QskArcNode::hash() const
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* This file may be used under the terms of the QSkinny License, Version 1.0
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QSK_ARC_NODE_H
|
||||||
|
#define QSK_ARC_NODE_H
|
||||||
|
|
||||||
|
#include "QskGradient.h"
|
||||||
|
#include "QskPaintedNode.h"
|
||||||
|
|
||||||
|
#include <QGradient>
|
||||||
|
|
||||||
|
class QSK_EXPORT QskArcNode : public QskPaintedNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QskArcNode();
|
||||||
|
~QskArcNode() override;
|
||||||
|
|
||||||
|
void setArcData( const QskGradient&, QGradient::Type, double, double,
|
||||||
|
double, double, bool, double );
|
||||||
|
|
||||||
|
void paint( QPainter* painter, const QSizeF& size ) override;
|
||||||
|
uint hash() const override;
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,28 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
||||||
|
* This file may be used under the terms of the QSkinny License, Version 1.0
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QSK_ARC_RENDERER_H
|
||||||
|
#define QSK_ARC_RENDERER_H
|
||||||
|
|
||||||
|
#include "QskGlobal.h"
|
||||||
|
#include "QskGradient.h"
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QRect>
|
||||||
|
|
||||||
|
class QSK_EXPORT QskArcRenderer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void renderArc( const QRectF& rect, const QskGradient& gradient,
|
||||||
|
QGradient::Type gradientType, int startAngle, int endAngle, QPainter* );
|
||||||
|
};
|
||||||
|
|
||||||
|
inline void QskArcRenderer::renderArc( const QRectF& rect,
|
||||||
|
const QskGradient& gradient, QGradient::Type gradientType,
|
||||||
|
int startAngle, int endAngle, QPainter* painter )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -85,6 +85,8 @@ SOURCES += \
|
||||||
graphic/QskStandardSymbol.cpp
|
graphic/QskStandardSymbol.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
|
nodes/QskArcNode.h \
|
||||||
|
nodes/QskArcRenderer.h \
|
||||||
nodes/QskBoxNode.h \
|
nodes/QskBoxNode.h \
|
||||||
nodes/QskBoxClipNode.h \
|
nodes/QskBoxClipNode.h \
|
||||||
nodes/QskBoxRenderer.h \
|
nodes/QskBoxRenderer.h \
|
||||||
|
@ -103,6 +105,7 @@ HEADERS += \
|
||||||
nodes/QskVertex.h
|
nodes/QskVertex.h
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
|
nodes/QskArcNode.cpp \
|
||||||
nodes/QskBoxNode.cpp \
|
nodes/QskBoxNode.cpp \
|
||||||
nodes/QskBoxClipNode.cpp \
|
nodes/QskBoxClipNode.cpp \
|
||||||
nodes/QskBoxRendererRect.cpp \
|
nodes/QskBoxRendererRect.cpp \
|
||||||
|
|
Loading…
Reference in New Issue