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_SKIN_H
|
|
|
|
#define QSK_SKIN_H
|
|
|
|
|
|
|
|
#include "QskAspect.h"
|
|
|
|
|
2018-07-19 14:10:48 +02:00
|
|
|
#include <qcolor.h>
|
2018-08-03 08:15:28 +02:00
|
|
|
#include <qobject.h>
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
#include <type_traits>
|
2018-08-03 08:15:28 +02:00
|
|
|
#include <unordered_map>
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
class QskControl;
|
|
|
|
class QskSkinnable;
|
|
|
|
class QskSkinlet;
|
|
|
|
|
|
|
|
class QskColorFilter;
|
|
|
|
class QskGraphic;
|
|
|
|
class QskGraphicProvider;
|
|
|
|
|
|
|
|
class QskAnimationHint;
|
2017-08-22 20:50:55 +02:00
|
|
|
class QskSkinHintTable;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
class QVariant;
|
2017-08-23 14:53:29 +02:00
|
|
|
class QskMargins;
|
2017-10-17 17:34:00 +02:00
|
|
|
class QskGradient;
|
|
|
|
class QskBoxShapeMetrics;
|
|
|
|
class QskBoxBorderMetrics;
|
|
|
|
class QskBoxBorderColors;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
class QSK_EXPORT QskSkin : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
using Inherited = QObject;
|
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
public:
|
2017-07-21 18:21:34 +02:00
|
|
|
enum SkinFontRole
|
|
|
|
{
|
|
|
|
DefaultFont = 0,
|
|
|
|
|
|
|
|
TinyFont,
|
|
|
|
SmallFont,
|
|
|
|
MediumFont,
|
|
|
|
LargeFont,
|
|
|
|
HugeFont
|
|
|
|
};
|
|
|
|
|
|
|
|
Q_ENUM( SkinFontRole )
|
|
|
|
|
|
|
|
QskSkin( QObject* parent = nullptr );
|
2018-07-31 17:32:25 +02:00
|
|
|
~QskSkin() override;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
template< typename Control, typename Skinlet >
|
|
|
|
void declareSkinlet();
|
2017-07-21 18:21:34 +02:00
|
|
|
|
|
|
|
virtual void resetColors( const QColor& accent );
|
|
|
|
|
|
|
|
void setColor( QskAspect::Aspect, Qt::GlobalColor );
|
|
|
|
void setColor( QskAspect::Aspect, QRgb );
|
|
|
|
void setColor( QskAspect::Aspect, const QColor& );
|
|
|
|
|
|
|
|
QColor color( QskAspect::Aspect ) const;
|
|
|
|
|
|
|
|
void setMetric( QskAspect::Aspect, qreal metric );
|
|
|
|
qreal metric( QskAspect::Aspect ) const;
|
|
|
|
|
2020-12-16 12:49:24 +01:00
|
|
|
void setStrutSize( QskAspect::Aspect, const QSizeF& );
|
|
|
|
void setStrutSize( QskAspect::Aspect, qreal width, qreal height );
|
|
|
|
QSizeF strutSize( QskAspect::Aspect ) const;
|
|
|
|
|
2020-12-15 07:21:12 +01:00
|
|
|
void setMargin( QskAspect::Aspect, const QskMargins& );
|
2020-12-17 16:12:18 +01:00
|
|
|
void setMargin( QskAspect::Aspect,
|
|
|
|
qreal left, qreal top, qreal right, qreal bottom );
|
2020-12-15 07:21:12 +01:00
|
|
|
QskMargins margin( QskAspect::Aspect ) const;
|
|
|
|
|
|
|
|
void setPadding( QskAspect::Aspect, const QskMargins& );
|
2020-12-17 16:12:18 +01:00
|
|
|
void setPadding( QskAspect::Aspect,
|
|
|
|
qreal left, qreal top, qreal right, qreal bottom );
|
2020-12-15 07:21:12 +01:00
|
|
|
QskMargins padding( QskAspect::Aspect ) const;
|
|
|
|
|
|
|
|
void setSpacing( QskAspect::Aspect, qreal );
|
|
|
|
qreal spacing( QskAspect::Aspect ) const;
|
2017-08-23 14:53:29 +02:00
|
|
|
|
2017-10-17 17:34:00 +02:00
|
|
|
void setGradient( QskAspect::Aspect, const QskGradient& );
|
|
|
|
QskGradient gradient( QskAspect::Aspect ) const;
|
|
|
|
|
2017-10-18 20:00:06 +02:00
|
|
|
void setBoxShape( QskAspect::Aspect, qreal radius, Qt::SizeMode = Qt::AbsoluteSize );
|
|
|
|
void setBoxShape( QskAspect::Aspect, qreal topLeft, qreal topRight,
|
|
|
|
qreal bottomLeft, qreal bottomRight, Qt::SizeMode = Qt::AbsoluteSize );
|
2017-10-17 17:34:00 +02:00
|
|
|
|
|
|
|
void setBoxShape( QskAspect::Aspect, const QskBoxShapeMetrics& );
|
|
|
|
QskBoxShapeMetrics boxShape( QskAspect::Aspect ) const;
|
|
|
|
|
2020-12-17 16:12:18 +01:00
|
|
|
void setBoxBorderMetrics( QskAspect::Aspect,
|
|
|
|
qreal borderWidth, Qt::SizeMode = Qt::AbsoluteSize );
|
|
|
|
|
2017-10-18 20:00:06 +02:00
|
|
|
void setBoxBorderMetrics( QskAspect::Aspect, qreal left, qreal top,
|
|
|
|
qreal right, qreal bottom, Qt::SizeMode = Qt::AbsoluteSize );
|
|
|
|
|
|
|
|
void setBoxBorderMetrics( QskAspect::Aspect, const QskBoxBorderMetrics& );
|
|
|
|
QskBoxBorderMetrics boxBorderMetrics( QskAspect::Aspect ) const;
|
2017-10-17 17:34:00 +02:00
|
|
|
|
|
|
|
void setBoxBorderColors( QskAspect::Aspect, const QskBoxBorderColors& );
|
|
|
|
QskBoxBorderColors boxBorderColors( QskAspect::Aspect ) const;
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
void setAnimation( QskAspect::Aspect, QskAnimationHint );
|
|
|
|
QskAnimationHint animation( QskAspect::Aspect ) const;
|
|
|
|
|
2020-12-15 07:21:12 +01:00
|
|
|
void setAlignment( QskAspect::Aspect, Qt::Alignment );
|
|
|
|
Qt::Alignment alignment( QskAspect::Aspect ) const;
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
void setSkinHint( QskAspect::Aspect, const QVariant& hint );
|
|
|
|
const QVariant& skinHint( QskAspect::Aspect ) const;
|
|
|
|
|
|
|
|
void setGraphicFilter( int graphicRole, const QskColorFilter& );
|
|
|
|
void resetGraphicFilter( int graphicRole );
|
|
|
|
QskColorFilter graphicFilter( int graphicRole ) const;
|
|
|
|
|
2017-08-28 13:20:01 +02:00
|
|
|
void setFontRole( QskAspect::Aspect, int fontRole );
|
|
|
|
void setGraphicRole( QskAspect::Aspect, int graphicRole );
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
void setFont( int fontRole, const QFont& );
|
|
|
|
void resetFont( int fontRole );
|
|
|
|
QFont font( int fontRole ) const;
|
|
|
|
|
|
|
|
void setupFonts( const QString& family,
|
|
|
|
int weight = -1, bool italic = false );
|
|
|
|
|
|
|
|
virtual QskGraphic symbol( int symbolType ) const;
|
|
|
|
|
|
|
|
void addGraphicProvider( const QString& providerId, QskGraphicProvider* );
|
|
|
|
QskGraphicProvider* graphicProvider( const QString& providerId ) const;
|
|
|
|
bool hasGraphicProvider() const;
|
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
virtual const int* dialogButtonLayout( Qt::Orientation ) const;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2020-03-19 14:10:50 +01:00
|
|
|
void setStateMask( QskAspect::State );
|
|
|
|
QskAspect::State stateMask() const;
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
QskSkinlet* skinlet( const QskSkinnable* );
|
|
|
|
|
2017-08-22 20:50:55 +02:00
|
|
|
const QskSkinHintTable& hintTable() const;
|
|
|
|
|
2017-07-21 18:21:34 +02:00
|
|
|
const std::unordered_map< int, QFont >& fonts() const;
|
|
|
|
const std::unordered_map< int, QskColorFilter >& graphicFilters() const;
|
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
protected:
|
2017-08-22 20:50:55 +02:00
|
|
|
QskSkinHintTable& skinHintTable();
|
|
|
|
|
2019-01-04 13:42:16 +01:00
|
|
|
private:
|
2017-07-21 18:21:34 +02:00
|
|
|
void declareSkinlet( const QMetaObject* controlMetaObject,
|
|
|
|
const QMetaObject* skinMetaObject );
|
|
|
|
|
|
|
|
class PrivateData;
|
|
|
|
std::unique_ptr< PrivateData > m_data;
|
|
|
|
};
|
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
template< typename Control, typename Skinlet >
|
2017-07-21 18:21:34 +02:00
|
|
|
inline void QskSkin::declareSkinlet()
|
|
|
|
{
|
|
|
|
Q_STATIC_ASSERT( ( std::is_base_of< QskControl, Control >::value ) );
|
|
|
|
Q_STATIC_ASSERT( ( std::is_base_of< QskSkinlet, Skinlet >::value ) );
|
|
|
|
declareSkinlet( &Control::staticMetaObject, &Skinlet::staticMetaObject );
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|