qskinny/src/controls/QskSkinnable.h

244 lines
7.7 KiB
C
Raw Normal View History

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;
class QskBoxShapeMetrics;
class QskBoxBorderMetrics;
class QskBoxBorderColors;
class QskGradient;
2020-08-09 10:45:48 +02:00
class QskIntervalF;
2017-07-21 18:21:34 +02:00
class QskSkin;
class QskSkinlet;
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;
};
2020-09-28 09:04:25 +02:00
#ifndef QT_NO_DEBUG_STREAM
class QDebug;
QSK_EXPORT QDebug operator<<( QDebug, const QskSkinHintStatus& );
#endif
2017-07-21 18:21:34 +02:00
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& );
2020-12-15 11:01:00 +01:00
bool resetColor( QskAspect::Aspect );
2017-07-21 18:21:34 +02:00
QColor color( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
void setMetric( QskAspect::Aspect, qreal metric );
2020-12-15 11:01:00 +01:00
bool resetMetric( QskAspect::Aspect );
2017-07-21 18:21:34 +02:00
qreal metric( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
2020-12-15 11:01:00 +01:00
void setFlagHint( QskAspect::Aspect, int flag );
bool resetFlagHint( QskAspect::Aspect );
int flagHint( QskAspect::Aspect ) const;
template< typename T > T flagHint( QskAspect::Aspect, T = T() ) const;
QSizeF strutSizeHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
void setStrutSizeHint( QskAspect::Aspect, const QSizeF& );
void setStrutSizeHint( QskAspect::Aspect, qreal width, qreal height );
void setMarginHint( QskAspect::Aspect, qreal );
void setMarginHint( QskAspect::Aspect, const QMarginsF& );
2020-12-15 11:01:00 +01:00
bool resetMarginHint( QskAspect::Aspect );
QMarginsF marginHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
void setPaddingHint( QskAspect::Aspect, qreal );
void setPaddingHint( QskAspect::Aspect, const QMarginsF& );
2020-12-15 11:01:00 +01:00
bool resetPaddingHint( QskAspect::Aspect );
QMarginsF paddingHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
void setGradientHint( QskAspect::Aspect, const QskGradient& );
QskGradient gradientHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
void setBoxShapeHint( QskAspect::Aspect, const QskBoxShapeMetrics& );
2020-12-15 11:01:00 +01:00
bool resetBoxShapeHint( QskAspect::Aspect );
QskBoxShapeMetrics boxShapeHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
2017-10-18 20:00:06 +02:00
void setBoxBorderMetricsHint( QskAspect::Aspect, const QskBoxBorderMetrics& );
2020-12-15 11:01:00 +01:00
bool resetBoxBorderMetricsHint( QskAspect::Aspect );
2018-08-03 08:15:28 +02:00
QskBoxBorderMetrics boxBorderMetricsHint(
QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
2017-10-18 20:00:06 +02:00
void setBoxBorderColorsHint( QskAspect::Aspect, const QskBoxBorderColors& );
2020-12-15 11:01:00 +01:00
bool resetBoxBorderColorsHint( QskAspect::Aspect );
2017-10-18 20:00:06 +02:00
QskBoxBorderColors boxBorderColorsHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
2020-08-09 11:50:34 +02:00
void setIntervalHint( QskAspect::Aspect, const QskIntervalF& );
2020-08-09 10:45:48 +02:00
QskIntervalF intervalHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
void setSpacingHint( QskAspect::Aspect, qreal );
2020-12-15 11:01:00 +01:00
bool resetSpacingHint( QskAspect::Aspect );
qreal spacingHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
void setAlignmentHint( QskAspect::Aspect, Qt::Alignment );
2020-12-15 11:01:00 +01:00
bool resetAlignmentHint( QskAspect::Aspect );
Qt::Alignment alignmentHint( QskAspect::Aspect, Qt::Alignment = Qt::Alignment() ) const;
2017-07-21 18:21:34 +02:00
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
QskAnimationHint effectiveAnimation( QskAspect::Type, QskAspect::Subcontrol,
2018-02-06 14:58:24 +01:00
QskAspect::State, QskSkinHintStatus* status = nullptr ) const;
2017-08-22 19:47:06 +02:00
QVariant effectiveHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
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;
QMarginsF innerPadding( QskAspect::Aspect, const QSizeF& ) const;
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 );
2020-07-27 07:26:38 +02:00
protected:
2017-07-21 18:21:34 +02:00
virtual void updateNode( QSGNode* );
virtual bool isTransitionAccepted( QskAspect::Aspect ) const;
2017-07-21 18:21:34 +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;
}
inline Qt::Alignment QskSkinnable::alignmentHint(
QskAspect::Aspect aspect, Qt::Alignment defaultAlignment ) const
{
return flagHint< Qt::Alignment >( aspect | QskAspect::Alignment, defaultAlignment );
}
inline QskAspect::Placement QskSkinnable::effectivePlacement() const
{
return QskAspect::NoPlacement;
}
2020-12-15 11:01:00 +01:00
inline bool QskSkinnable::resetColor( QskAspect::Aspect aspect )
{
return resetHint( aspect | QskAspect::Color );
}
inline bool QskSkinnable::resetMetric( QskAspect::Aspect aspect )
{
return resetHint( aspect | QskAspect::Metric );
}
inline bool QskSkinnable::resetFlagHint( QskAspect::Aspect aspect )
{
return resetHint( aspect | QskAspect::Flag );
}
2017-07-21 18:21:34 +02:00
#endif