qskinny/src/controls/QskSkin.h

173 lines
5.0 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_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;
class QskSkinHintTable;
2017-07-21 18:21:34 +02:00
class QVariant;
class QskMargins;
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 );
2020-12-21 16:06:58 +01:00
void setColor( QskAspect, Qt::GlobalColor );
void setColor( QskAspect, QRgb );
void setColor( QskAspect, const QColor& );
2017-07-21 18:21:34 +02:00
2020-12-21 16:06:58 +01:00
QColor color( QskAspect ) const;
2017-07-21 18:21:34 +02:00
2020-12-21 16:06:58 +01:00
void setMetric( QskAspect, qreal metric );
qreal metric( QskAspect ) const;
2017-07-21 18:21:34 +02:00
2020-12-21 16:06:58 +01:00
void setStrutSize( QskAspect, const QSizeF& );
void setStrutSize( QskAspect, qreal width, qreal height );
QSizeF strutSize( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setMargin( QskAspect, const QskMargins& );
void setMargin( QskAspect,
2020-12-17 16:12:18 +01:00
qreal left, qreal top, qreal right, qreal bottom );
2020-12-21 16:06:58 +01:00
QskMargins margin( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setPadding( QskAspect, const QskMargins& );
void setPadding( QskAspect,
2020-12-17 16:12:18 +01:00
qreal left, qreal top, qreal right, qreal bottom );
2020-12-21 16:06:58 +01:00
QskMargins padding( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setSpacing( QskAspect, qreal );
qreal spacing( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setGradient( QskAspect, const QskGradient& );
QskGradient gradient( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setBoxShape( QskAspect, qreal radius, Qt::SizeMode = Qt::AbsoluteSize );
void setBoxShape( QskAspect, qreal topLeft, qreal topRight,
2017-10-18 20:00:06 +02:00
qreal bottomLeft, qreal bottomRight, Qt::SizeMode = Qt::AbsoluteSize );
2020-12-21 16:06:58 +01:00
void setBoxShape( QskAspect, const QskBoxShapeMetrics& );
QskBoxShapeMetrics boxShape( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setBoxBorderMetrics( QskAspect,
2020-12-17 16:12:18 +01:00
qreal borderWidth, Qt::SizeMode = Qt::AbsoluteSize );
2020-12-21 16:06:58 +01:00
void setBoxBorderMetrics( QskAspect, qreal left, qreal top,
2017-10-18 20:00:06 +02:00
qreal right, qreal bottom, Qt::SizeMode = Qt::AbsoluteSize );
2020-12-21 16:06:58 +01:00
void setBoxBorderMetrics( QskAspect, const QskBoxBorderMetrics& );
QskBoxBorderMetrics boxBorderMetrics( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setBoxBorderColors( QskAspect, const QskBoxBorderColors& );
QskBoxBorderColors boxBorderColors( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setAnimation( QskAspect, QskAnimationHint );
QskAnimationHint animation( QskAspect ) const;
2017-07-21 18:21:34 +02:00
2020-12-21 16:06:58 +01:00
void setAlignment( QskAspect, Qt::Alignment );
Qt::Alignment alignment( QskAspect ) const;
2020-12-21 16:06:58 +01:00
void setSkinHint( QskAspect, const QVariant& hint );
const QVariant& skinHint( QskAspect ) const;
2017-07-21 18:21:34 +02:00
void setGraphicFilter( int graphicRole, const QskColorFilter& );
void resetGraphicFilter( int graphicRole );
QskColorFilter graphicFilter( int graphicRole ) const;
2020-12-21 16:06:58 +01:00
void setFontRole( QskAspect, int fontRole );
void setGraphicRole( QskAspect, 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
void setStateMask( QskAspect::State );
QskAspect::State stateMask() const;
2017-07-21 18:21:34 +02:00
QskSkinlet* skinlet( const QskSkinnable* );
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:
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