qskinny/src/controls/QskSkin.h

114 lines
2.9 KiB
C
Raw Normal View History

2017-07-21 16:21:34 +00:00
/******************************************************************************
2024-01-17 13:31:45 +00:00
* QSkinny - Copyright (C) The authors
2023-04-06 07:23:37 +00:00
* SPDX-License-Identifier: BSD-3-Clause
2017-07-21 16:21:34 +00:00
*****************************************************************************/
#ifndef QSK_SKIN_H
#define QSK_SKIN_H
#include "QskAspect.h"
2018-07-19 12:10:48 +00:00
#include <qcolor.h>
2018-08-03 06:15:28 +00:00
#include <qobject.h>
2017-07-21 16:21:34 +00:00
#include <memory>
#include <type_traits>
class QskSkinnable;
2017-07-21 16:21:34 +00:00
class QskSkinlet;
class QskColorFilter;
class QskGraphic;
class QskGraphicProvider;
2024-02-19 14:51:55 +00:00
class QskFontRole;
2017-07-21 16:21:34 +00:00
class QskSkinHintTable;
2017-07-21 16:21:34 +00:00
class QVariant;
template< typename Key, typename T > class QHash;
2017-07-21 16:21:34 +00:00
class QSK_EXPORT QskSkin : public QObject
{
Q_OBJECT
using Inherited = QObject;
2018-08-03 06:15:28 +00:00
public:
2023-06-27 13:15:27 +00:00
#if 1
// Use Qt::ColorScheme once minimum version is Qt 6.5
enum ColorScheme
{
UnknownScheme,
LightScheme,
DarkScheme
2023-06-27 13:15:27 +00:00
};
Q_ENUM( ColorScheme )
2023-06-27 13:15:27 +00:00
#endif
2017-07-21 16:21:34 +00:00
QskSkin( QObject* parent = nullptr );
2018-07-31 15:32:25 +00:00
~QskSkin() override;
2017-07-21 16:21:34 +00:00
2018-08-03 06:15:28 +00:00
template< typename Control, typename Skinlet >
void declareSkinlet();
2017-07-21 16:21:34 +00:00
2020-12-21 15:06:58 +00:00
void setSkinHint( QskAspect, const QVariant& hint );
const QVariant& skinHint( QskAspect ) const;
2017-07-21 16:21:34 +00:00
void setGraphicFilter( int graphicRole, const QskColorFilter& );
void resetGraphicFilter( int graphicRole );
QskColorFilter graphicFilter( int graphicRole ) const;
2024-02-19 14:51:55 +00:00
void setFont( const QskFontRole&, const QFont& );
void resetFont( const QskFontRole& );
QFont font( const QskFontRole& ) const;
2017-07-21 16:21:34 +00:00
void addGraphicProvider( const QString& providerId, QskGraphicProvider* );
QskGraphicProvider* graphicProvider( const QString& providerId ) const;
bool hasGraphicProvider() const;
2018-08-03 06:15:28 +00:00
virtual const int* dialogButtonLayout( Qt::Orientation ) const;
virtual QString dialogButtonText( int button ) const;
2017-07-21 16:21:34 +00:00
2020-12-23 08:41:29 +00:00
QskSkinlet* skinlet( const QMetaObject* );
const QMetaObject* skinletMetaObject( const QMetaObject* ) const;
2017-07-21 16:21:34 +00:00
const QskSkinHintTable& hintTable() const;
2020-12-26 11:57:08 +00:00
QskSkinHintTable& hintTable();
2024-02-19 14:51:55 +00:00
const QHash< QskFontRole, QFont >& fontTable() const;
const QHash< int, QskColorFilter >& graphicFilters() const;
2017-07-21 16:21:34 +00:00
ColorScheme colorScheme() const;
public Q_SLOTS:
void setColorScheme( ColorScheme );
Q_SIGNALS:
void colorSchemeChanged( ColorScheme );
protected:
void clearHints();
virtual void initHints() = 0;
2024-02-19 14:51:55 +00:00
void setupFontTable( const QString& family, bool italic = false );
void completeFontTable();
2019-01-04 12:42:16 +00:00
private:
void declareSkinlet( const QMetaObject* metaObject,
const QMetaObject* skinletMetaObject );
2017-07-21 16:21:34 +00:00
class PrivateData;
std::unique_ptr< PrivateData > m_data;
};
template< typename Skinnable, typename Skinlet >
2017-07-21 16:21:34 +00:00
inline void QskSkin::declareSkinlet()
{
Q_STATIC_ASSERT( ( std::is_base_of< QskSkinnable, Skinnable >::value ) );
2017-07-21 16:21:34 +00:00
Q_STATIC_ASSERT( ( std::is_base_of< QskSkinlet, Skinlet >::value ) );
declareSkinlet( &Skinnable::staticMetaObject, &Skinlet::staticMetaObject );
2017-07-21 16:21:34 +00:00
}
#endif