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_SKINNABLE_H
|
|
|
|
#define QSK_SKINNABLE_H
|
|
|
|
|
|
|
|
#include "QskAspect.h"
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
typedef unsigned int QRgb;
|
|
|
|
class QSizeF;
|
|
|
|
class QRectF;
|
|
|
|
class QColor;
|
|
|
|
class QFont;
|
|
|
|
class QMarginsF;
|
2017-10-30 08:08:58 +01:00
|
|
|
struct QMetaObject;
|
2018-07-19 15:21:28 +02:00
|
|
|
class QVariant;
|
2017-07-21 18:21:34 +02:00
|
|
|
class QDebug;
|
|
|
|
|
|
|
|
class QSGNode;
|
|
|
|
|
|
|
|
class QskControl;
|
|
|
|
class QskAnimationHint;
|
|
|
|
class QskColorFilter;
|
2017-10-17 17:34:00 +02:00
|
|
|
class QskBoxShapeMetrics;
|
|
|
|
class QskBoxBorderMetrics;
|
|
|
|
class QskBoxBorderColors;
|
|
|
|
class QskGradient;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
class QskSkin;
|
|
|
|
class QskSkinlet;
|
2017-08-22 20:50:55 +02:00
|
|
|
class QskSkinHintTable;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
class QSK_EXPORT QskSkinHintStatus
|
|
|
|
{
|
2018-08-03 08:15:28 +02:00
|
|
|
public:
|
2017-07-21 18:21:34 +02:00
|
|
|
enum Source
|
|
|
|
{
|
|
|
|
NoSource = 0,
|
|
|
|
|
|
|
|
Skinnable,
|
|
|
|
Skin,
|
|
|
|
Animator
|
|
|
|
};
|
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
QskSkinHintStatus()
|
|
|
|
: source( NoSource )
|
2017-07-21 18:21:34 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool isValid() const
|
|
|
|
{
|
|
|
|
return source > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
Source source;
|
|
|
|
QskAspect::Aspect aspect;
|
|
|
|
};
|
|
|
|
|
|
|
|
class QSK_EXPORT QskSkinnable
|
|
|
|
{
|
2018-08-03 08:15:28 +02:00
|
|
|
public:
|
2017-07-21 18:21:34 +02:00
|
|
|
QskSkinnable();
|
|
|
|
virtual ~QskSkinnable();
|
|
|
|
|
|
|
|
void setSkinlet( const QskSkinlet* skinlet );
|
|
|
|
const QskSkinlet* skinlet() const;
|
|
|
|
|
|
|
|
void setColor( QskAspect::Aspect, Qt::GlobalColor );
|
|
|
|
void setColor( QskAspect::Aspect, QRgb );
|
|
|
|
void setColor( QskAspect::Aspect, const QColor& );
|
|
|
|
|
|
|
|
QColor color( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
|
|
|
|
|
|
|
void setMetric( QskAspect::Aspect, qreal metric );
|
|
|
|
qreal metric( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
|
|
|
|
2017-10-18 20:00:06 +02:00
|
|
|
void setMarginsHint( QskAspect::Aspect, qreal );
|
2017-08-23 14:53:29 +02:00
|
|
|
void setMarginsHint( QskAspect::Aspect, const QMarginsF& );
|
|
|
|
QMarginsF marginsHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
|
|
|
|
2017-10-17 17:34:00 +02:00
|
|
|
void setGradientHint( QskAspect::Aspect, const QskGradient& );
|
|
|
|
QskGradient gradientHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
|
|
|
|
|
|
|
void setBoxShapeHint( QskAspect::Aspect, const QskBoxShapeMetrics& );
|
|
|
|
QskBoxShapeMetrics boxShapeHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
|
|
|
|
2017-10-18 20:00:06 +02:00
|
|
|
void setBoxBorderMetricsHint( QskAspect::Aspect, const QskBoxBorderMetrics& );
|
2018-08-03 08:15:28 +02:00
|
|
|
QskBoxBorderMetrics boxBorderMetricsHint(
|
|
|
|
QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
2017-10-17 17:34:00 +02:00
|
|
|
|
2017-10-18 20:00:06 +02:00
|
|
|
void setBoxBorderColorsHint( QskAspect::Aspect, const QskBoxBorderColors& );
|
|
|
|
QskBoxBorderColors boxBorderColorsHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
2017-10-17 17:34:00 +02:00
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
void setFlagHint( QskAspect::Aspect, int flag );
|
|
|
|
int flagHint( QskAspect::Aspect ) const;
|
|
|
|
|
|
|
|
template< typename T > T flagHint( QskAspect::Aspect, T = T() ) const;
|
|
|
|
|
|
|
|
void setFontRole( QskAspect::Aspect, int role );
|
2020-03-18 12:49:57 +01:00
|
|
|
int fontRole( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
QFont effectiveFont( QskAspect::Aspect ) const;
|
|
|
|
|
|
|
|
void setGraphicRole( QskAspect::Aspect, int role );
|
2020-03-18 12:49:57 +01:00
|
|
|
int graphicRole( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
QskColorFilter effectiveGraphicFilter( QskAspect::Aspect ) const;
|
|
|
|
|
|
|
|
void setAnimation( QskAspect::Aspect, QskAnimationHint );
|
|
|
|
QskAnimationHint animation( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
|
|
|
|
2019-12-14 13:34:30 +01:00
|
|
|
bool resetHint( QskAspect::Aspect );
|
2019-03-19 17:36:12 +01:00
|
|
|
|
2017-10-17 17:34:00 +02:00
|
|
|
QskAnimationHint effectiveAnimation( QskAspect::Type, QskAspect::Subcontrol,
|
2018-02-06 14:58:24 +01:00
|
|
|
QskAspect::State, QskSkinHintStatus* status = nullptr ) const;
|
2017-10-17 17:34:00 +02:00
|
|
|
|
2017-08-22 19:47:06 +02:00
|
|
|
QVariant effectiveHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
2017-10-17 17:34:00 +02:00
|
|
|
virtual QskAspect::Placement effectivePlacement() const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
QskSkinHintStatus hintStatus( QskAspect::Aspect ) const;
|
|
|
|
|
|
|
|
QskAspect::State skinState() const;
|
|
|
|
const char* skinStateAsPrintable() const;
|
|
|
|
const char* skinStateAsPrintable( QskAspect::State ) const;
|
|
|
|
|
|
|
|
QSizeF outerBoxSize( QskAspect::Aspect, const QSizeF& innerBoxSize ) const;
|
|
|
|
QSizeF innerBoxSize( QskAspect::Aspect, const QSizeF& outerBoxSize ) const;
|
|
|
|
|
|
|
|
QRectF innerBox( QskAspect::Aspect, const QRectF& outerBox ) const;
|
|
|
|
QRectF outerBox( QskAspect::Aspect, const QRectF& innerBox ) const;
|
|
|
|
|
2018-04-18 19:41:46 +02:00
|
|
|
QMarginsF innerPadding( QskAspect::Aspect, const QSizeF& ) const;
|
|
|
|
|
2020-03-19 14:10:50 +01:00
|
|
|
const QskSkinlet* effectiveSkinlet() const;
|
2017-07-21 18:21:34 +02:00
|
|
|
QskSkin* effectiveSkin() const;
|
|
|
|
|
|
|
|
void startTransition( QskAspect::Aspect,
|
|
|
|
QskAnimationHint, QVariant from, QVariant to );
|
|
|
|
|
|
|
|
virtual QskAspect::Subcontrol effectiveSubcontrol( QskAspect::Subcontrol ) const;
|
|
|
|
|
|
|
|
QskControl* controlCast();
|
|
|
|
const QskControl* controlCast() const;
|
|
|
|
|
|
|
|
virtual QskControl* owningControl() const = 0;
|
|
|
|
virtual const QMetaObject* metaObject() const = 0;
|
|
|
|
|
|
|
|
void debug( QskAspect::Aspect ) const;
|
|
|
|
void debug( QskAspect::State ) const;
|
|
|
|
void debug( QDebug, QskAspect::Aspect ) const;
|
|
|
|
void debug( QDebug, QskAspect::State ) const;
|
|
|
|
|
2020-07-27 07:26:38 +02:00
|
|
|
void setSkinState( QskAspect::State, bool animated = true );
|
|
|
|
void setSkinStateFlag( QskAspect::State, bool on = true );
|
2018-12-22 16:11:24 +01:00
|
|
|
|
2020-07-27 07:26:38 +02:00
|
|
|
protected:
|
2017-07-21 18:21:34 +02:00
|
|
|
virtual void updateNode( QSGNode* );
|
2018-10-10 08:55:03 +02:00
|
|
|
virtual bool isTransitionAccepted( QskAspect::Aspect ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2018-04-18 19:41:46 +02:00
|
|
|
QskSkinHintTable& hintTable();
|
|
|
|
const QskSkinHintTable& hintTable() const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
private:
|
2017-07-21 18:21:34 +02:00
|
|
|
QVariant animatedValue( QskAspect::Aspect, QskSkinHintStatus* ) const;
|
2017-08-22 19:47:06 +02:00
|
|
|
const QVariant& storedHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
class PrivateData;
|
|
|
|
std::unique_ptr< PrivateData > m_data;
|
|
|
|
};
|
|
|
|
|
|
|
|
template< typename T >
|
|
|
|
inline T QskSkinnable::flagHint( QskAspect::Aspect aspect, T defaultValue ) const
|
|
|
|
{
|
|
|
|
const auto& hint = effectiveHint( aspect );
|
|
|
|
if ( hint.isValid() && hint.canConvert< int >() )
|
|
|
|
return static_cast< T >( hint.value< int >() );
|
|
|
|
|
|
|
|
return defaultValue;
|
|
|
|
}
|
|
|
|
|
2017-10-17 17:34:00 +02:00
|
|
|
inline QskAspect::Placement QskSkinnable::effectivePlacement() const
|
|
|
|
{
|
2019-04-17 16:33:17 +02:00
|
|
|
return QskAspect::NoPlacement;
|
2017-10-17 17:34:00 +02:00
|
|
|
}
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
#endif
|