qskinny/examples/rectangles/Rectangle.cpp
2017-07-21 18:21:34 +02:00

161 lines
3.2 KiB
C++

/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "Rectangle.h"
#include "Border.h"
#include <QskSkinlet.h>
#include <QskCorner.h>
#include <QskRectNode.h>
class Rectangle::PrivateData
{
public:
PrivateData():
border( 0.0, QColor() )
{
}
QskCorner corner;
Border border;
QColor fillColor;
QskGradient gradient;
};
Rectangle::Rectangle( QQuickItem* parent ):
Inherited( parent ),
m_data( new PrivateData() )
{
}
Rectangle::~Rectangle()
{
}
void Rectangle::setCorner( const QskCorner& corner )
{
if ( corner != m_data->corner )
{
m_data->corner = corner;
update();
Q_EMIT cornerChanged();
}
}
const QskCorner& Rectangle::corner() const
{
return m_data->corner;
}
void Rectangle::setBorder( const Border& border )
{
if ( border != m_data->border )
{
m_data->border = border;
Q_EMIT borderChanged();
update();
}
}
const Border& Rectangle::border() const
{
return m_data->border;
}
void Rectangle::setBorderWidth( int width )
{
setBorder( Border( width, m_data->border.color() ) );
}
int Rectangle::borderWidth() const
{
return m_data->border.width();
}
void Rectangle::setBorderColor( const QColor& color )
{
setBorder( Border( m_data->border.width(), color ) );
}
QColor Rectangle::borderColor() const
{
return m_data->border.color();
}
void Rectangle::setGradient( const QskGradient& gradient )
{
// are we called, when the gradient gets changed from QML
// after instantiation TODO ...??
if ( gradient != m_data->gradient )
{
m_data->gradient = gradient;
m_data->fillColor = QColor();
update();
Q_EMIT colorChanged();
}
}
QskGradient Rectangle::gradient() const
{
return m_data->gradient;
}
void Rectangle::resetGradient()
{
m_data->gradient = QskGradient();
}
void Rectangle::setColor( const QColor& color )
{
if ( color != m_data->fillColor )
{
m_data->fillColor = color;
m_data->gradient = QskGradient();
update();
Q_EMIT colorChanged();
}
}
QColor Rectangle::color() const
{
return m_data->fillColor;
}
void Rectangle::updateNode( QSGNode* parentNode )
{
// boilerplate code, that is not needed, when using a skinlet.
const quint8 nodeRole = 0;
auto node = static_cast< QskRectNode* >(
QskSkinlet::findNodeByRole( parentNode, nodeRole ) );
if ( node == nullptr )
{
node = new QskRectNode;
QskSkinlet::setNodeRole( node, nodeRole );
}
const QRectF cr = contentsRect();
node->setRect( cr );
node->setRadius( m_data->corner.effectiveRadius( cr.width(), cr.height() ) );
node->setBorderWidth( m_data->border.width() );
node->setBorderColor( m_data->border.color() );
node->setFillColor( m_data->fillColor );
node->setFillGradient( m_data->gradient );
node->update();
if ( node->parent() != parentNode )
parentNode->appendChildNode( node );
}
#include "moc_Rectangle.cpp"