2017-07-21 18:21:34 +02:00
|
|
|
/******************************************************************************
|
|
|
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
|
|
* This file may be used under the terms of the QSkinny License, Version 1.0
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef QSK_SKINLET_H
|
2020-10-23 13:41:18 +02:00
|
|
|
#define QSK_SKINLET_H
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
#include "QskAspect.h"
|
2022-05-30 15:16:46 +02:00
|
|
|
#include "QskNamespace.h"
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2018-07-19 14:10:48 +02:00
|
|
|
#include <qnamespace.h>
|
|
|
|
#include <qrect.h>
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
#include <memory>
|
|
|
|
|
2021-10-20 07:50:25 +02:00
|
|
|
class QskArcMetrics;
|
2017-07-21 18:21:34 +02:00
|
|
|
class QskSkin;
|
|
|
|
class QskControl;
|
|
|
|
class QskSkinnable;
|
|
|
|
class QskGradient;
|
|
|
|
class QskColorFilter;
|
|
|
|
class QskGraphic;
|
|
|
|
class QskTextOptions;
|
2022-05-30 15:16:46 +02:00
|
|
|
class QskTextColors;
|
2022-01-04 13:44:53 +01:00
|
|
|
class QskBoxShapeMetrics;
|
|
|
|
class QskBoxBorderMetrics;
|
|
|
|
class QskBoxBorderColors;
|
|
|
|
class QskBoxHints;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
class QSGNode;
|
|
|
|
|
|
|
|
class QSK_EXPORT QskSkinlet
|
|
|
|
{
|
|
|
|
Q_GADGET
|
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
public:
|
2017-07-21 18:21:34 +02:00
|
|
|
Q_INVOKABLE QskSkinlet( QskSkin* = nullptr );
|
|
|
|
virtual ~QskSkinlet();
|
|
|
|
|
|
|
|
QskSkin* skin() const;
|
|
|
|
|
2020-07-29 07:22:04 +02:00
|
|
|
virtual void updateNode( QskSkinnable*, QSGNode* parent ) const;
|
2019-04-25 14:23:39 +02:00
|
|
|
|
2021-12-26 09:15:15 +01:00
|
|
|
virtual QSizeF sizeHint( const QskSkinnable*,
|
|
|
|
Qt::SizeHint, const QSizeF& ) const;
|
|
|
|
|
2020-12-29 09:45:00 +01:00
|
|
|
virtual QRectF subControlRect( const QskSkinnable*,
|
|
|
|
const QRectF&, QskAspect::Subcontrol ) const;
|
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
/*
|
|
|
|
When having more than one instance for the
|
|
|
|
same QskAspect::Subcontrol it is called a sample
|
|
|
|
*/
|
|
|
|
virtual QRectF sampleRect( const QskSkinnable*,
|
2021-12-27 17:33:06 +01:00
|
|
|
const QRectF&, QskAspect::Subcontrol, int index ) const;
|
2021-12-24 16:50:34 +01:00
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
virtual int sampleIndexAt( const QskSkinnable*,
|
2021-12-26 09:15:15 +01:00
|
|
|
const QRectF&, QskAspect::Subcontrol, const QPointF& ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
virtual int sampleCount( const QskSkinnable*, QskAspect::Subcontrol ) const;
|
2021-12-28 10:08:21 +01:00
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
virtual QskAspect::States sampleStates( const QskSkinnable*,
|
2021-12-28 10:08:21 +01:00
|
|
|
QskAspect::Subcontrol, int index ) const;
|
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
virtual QVariant sampleAt( const QskSkinnable*,
|
2021-12-28 15:33:13 +01:00
|
|
|
QskAspect::Subcontrol, int index ) const;
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
const QVector< quint8 >& nodeRoles() const;
|
|
|
|
|
|
|
|
void setOwnedBySkinnable( bool on );
|
|
|
|
bool isOwnedBySkinnable() const;
|
|
|
|
|
2022-09-13 12:40:44 +02:00
|
|
|
void setAnimatorIndex( int );
|
|
|
|
void resetAnimatorIndex();
|
|
|
|
int animatorIndex() const;
|
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
// Helper functions for creating nodes
|
|
|
|
|
2017-10-23 08:36:19 +02:00
|
|
|
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
|
|
|
const QRectF&, QskAspect::Subcontrol );
|
|
|
|
|
2020-07-31 07:40:33 +02:00
|
|
|
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
|
|
|
const QRectF&, const QskGradient&, QskAspect::Subcontrol );
|
|
|
|
|
2022-01-04 13:44:53 +01:00
|
|
|
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
|
|
|
const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
|
|
|
|
const QskBoxBorderColors&, const QskGradient& );
|
|
|
|
|
|
|
|
static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
|
|
|
const QRectF&, const QskBoxHints& );
|
|
|
|
|
|
|
|
static QSGNode* updateInterpolatedBoxNode(
|
|
|
|
const QskSkinnable*, QSGNode*, const QRectF&,
|
|
|
|
QskAspect aspect1, QskAspect aspect2, qreal ratio );
|
|
|
|
|
2021-10-20 07:50:25 +02:00
|
|
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
|
|
|
const QRectF&, QskAspect::Subcontrol );
|
|
|
|
|
|
|
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
|
|
|
const QRectF&, const QskGradient&, QskAspect::Subcontrol );
|
|
|
|
|
|
|
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
2021-12-02 18:40:54 +01:00
|
|
|
const QRectF&, const QskGradient&, const QskArcMetrics& );
|
2021-10-20 07:50:25 +02:00
|
|
|
|
|
|
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
2021-10-20 09:27:05 +02:00
|
|
|
const QRectF&, qreal startAngle, qreal spanAngle, QskAspect::Subcontrol );
|
2021-10-20 07:50:25 +02:00
|
|
|
|
|
|
|
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
2021-10-20 09:27:05 +02:00
|
|
|
const QRectF&, const QskGradient&, qreal startAngle, qreal spanAngle,
|
2021-10-20 07:50:25 +02:00
|
|
|
QskAspect::Subcontrol );
|
|
|
|
|
2017-10-23 08:36:19 +02:00
|
|
|
static QSGNode* updateTextNode( const QskSkinnable*, QSGNode*,
|
2022-08-25 09:39:33 +02:00
|
|
|
const QRectF&, Qt::Alignment, const QString&, QskAspect::Subcontrol );
|
2017-10-23 08:36:19 +02:00
|
|
|
|
2022-05-30 15:16:46 +02:00
|
|
|
static QSGNode* updateTextNode( const QskSkinnable*, QSGNode*,
|
|
|
|
const QRectF&, Qt::Alignment, const QString&, const QFont&,
|
|
|
|
const QskTextOptions&, const QskTextColors&, Qsk::TextStyle );
|
|
|
|
|
2017-10-23 08:36:19 +02:00
|
|
|
// keeping the aspect ratio
|
|
|
|
static QSGNode* updateGraphicNode( const QskSkinnable*, QSGNode*,
|
2020-11-19 11:48:25 +01:00
|
|
|
const QskGraphic&, const QskColorFilter&, const QRectF&,
|
|
|
|
Qt::Alignment, Qt::Orientations mirrored = Qt::Orientations() );
|
2017-10-23 08:36:19 +02:00
|
|
|
|
|
|
|
// stretching to fit
|
|
|
|
static QSGNode* updateGraphicNode( const QskSkinnable*, QSGNode*,
|
2020-11-01 15:44:15 +01:00
|
|
|
const QskGraphic&, const QskColorFilter&, const QRectF&,
|
|
|
|
Qt::Orientations mirrored = Qt::Orientations() );
|
2017-10-23 08:36:19 +02:00
|
|
|
|
2017-10-23 10:19:49 +02:00
|
|
|
static QSGNode* updateBoxClipNode( const QskSkinnable*, QSGNode*,
|
|
|
|
const QRectF&, QskAspect::Subcontrol );
|
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
protected:
|
2017-07-21 18:21:34 +02:00
|
|
|
void setNodeRoles( const QVector< quint8 >& );
|
|
|
|
void appendNodeRoles( const QVector< quint8 >& );
|
|
|
|
|
|
|
|
virtual QSGNode* updateSubNode( const QskSkinnable*,
|
|
|
|
quint8 nodeRole, QSGNode* ) const;
|
|
|
|
|
|
|
|
virtual QSGNode* updateBackgroundNode(
|
|
|
|
const QskControl*, QSGNode* ) const;
|
|
|
|
|
|
|
|
virtual QSGNode* updateDebugNode(
|
|
|
|
const QskControl*, QSGNode* node ) const;
|
|
|
|
|
|
|
|
QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*,
|
|
|
|
QskAspect::Subcontrol ) const;
|
|
|
|
|
2021-10-20 07:50:25 +02:00
|
|
|
QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
|
|
|
QskAspect::Subcontrol ) const;
|
|
|
|
|
|
|
|
QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
|
2021-10-20 09:27:05 +02:00
|
|
|
qreal startAngle, qreal spanAngle,
|
2021-10-20 07:50:25 +02:00
|
|
|
QskAspect::Subcontrol ) const;
|
|
|
|
|
2017-10-17 17:34:00 +02:00
|
|
|
QSGNode* updateBoxClipNode( const QskSkinnable*, QSGNode*,
|
|
|
|
QskAspect::Subcontrol ) const;
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
QSGNode* updateTextNode( const QskSkinnable*, QSGNode*,
|
2022-08-25 09:39:33 +02:00
|
|
|
const QString&, QskAspect::Subcontrol ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2023-03-02 14:56:30 +01:00
|
|
|
QSGNode* updateSymbolNode( const QskSkinnable*, QSGNode*,
|
|
|
|
QskAspect::Subcontrol ) const;
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
QSGNode* updateGraphicNode( const QskSkinnable*, QSGNode*,
|
2020-11-01 15:44:15 +01:00
|
|
|
const QskGraphic&, QskAspect::Subcontrol,
|
|
|
|
Qt::Orientations mirrored = Qt::Orientations() ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2021-12-28 15:33:13 +01:00
|
|
|
QSGNode* updateSeriesNode( const QskSkinnable*,
|
|
|
|
QskAspect::Subcontrol, QSGNode* ) const;
|
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
virtual QSGNode* updateSampleNode( const QskSkinnable*,
|
2021-12-28 15:33:13 +01:00
|
|
|
QskAspect::Subcontrol, int index, QSGNode* ) const;
|
|
|
|
|
2020-11-22 15:27:58 +01:00
|
|
|
void replaceChildNode( quint8 nodeRole, QSGNode* parentNode,
|
|
|
|
QSGNode* oldNode, QSGNode* newNode ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2021-12-23 19:05:59 +01:00
|
|
|
QSizeF hintWithoutConstraint(
|
2021-08-26 15:17:41 +02:00
|
|
|
const QSizeF& hint, const QSizeF& constraint ) const;
|
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
private:
|
2022-03-24 11:12:45 +01:00
|
|
|
Q_DISABLE_COPY( QskSkinlet )
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
class PrivateData;
|
|
|
|
std::unique_ptr< PrivateData > m_data;
|
|
|
|
};
|
|
|
|
|
2017-09-01 11:55:55 +02:00
|
|
|
inline QRectF QskSkinlet::subControlRect(
|
2019-04-25 14:23:39 +02:00
|
|
|
const QskSkinnable*, const QRectF&, QskAspect::Subcontrol ) const
|
2017-09-01 11:55:55 +02:00
|
|
|
{
|
|
|
|
return QRectF();
|
|
|
|
}
|
|
|
|
|
|
|
|
inline QSGNode* QskSkinlet::updateSubNode(
|
|
|
|
const QskSkinnable*, quint8, QSGNode*) const
|
|
|
|
{
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2020-12-29 09:45:00 +01:00
|
|
|
inline QSizeF QskSkinlet::sizeHint(
|
|
|
|
const QskSkinnable*, Qt::SizeHint, const QSizeF& ) const
|
|
|
|
{
|
|
|
|
return QSizeF();
|
|
|
|
}
|
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
inline QRectF QskSkinlet::sampleRect( const QskSkinnable*,
|
2021-12-28 10:08:21 +01:00
|
|
|
const QRectF&, QskAspect::Subcontrol, int index ) const
|
|
|
|
{
|
|
|
|
Q_UNUSED( index )
|
|
|
|
return QRectF();
|
|
|
|
}
|
|
|
|
|
2021-12-28 16:14:30 +01:00
|
|
|
inline int QskSkinlet::sampleCount(
|
2021-12-28 10:08:21 +01:00
|
|
|
const QskSkinnable*, QskAspect::Subcontrol ) const
|
|
|
|
{
|
2021-12-28 16:14:30 +01:00
|
|
|
return 0;
|
2021-12-28 10:08:21 +01:00
|
|
|
}
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
#endif
|