qskinny/src/controls/QskSkinHintTableEditor.cpp

463 lines
13 KiB
C++
Raw Normal View History

2020-12-26 12:57:08 +01:00
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskSkinHintTableEditor.h"
#include "QskSkinHintTable.h"
#include "QskMargins.h"
#include "QskBoxShapeMetrics.h"
#include "QskBoxBorderMetrics.h"
#include "QskBoxBorderColors.h"
#include "QskGradient.h"
namespace
{
inline QskAspect::State lowestState( QskAspect::State mask )
{
using StateInt = typename std::underlying_type< QskAspect::State >::type;
const auto count = qCountTrailingZeroBits( static_cast< StateInt >( mask ) );
return static_cast< QskAspect::State >( 1 << count );
}
inline void setHintStateMask(
QskSkinHintTable* table, QskAspect aspect, const QVariant& hint,
QskAspect::State state, QskAspect::State mask )
{
if ( mask == 0 )
{
if ( state != 0 )
table->setHint( aspect | state, hint );
return;
}
const auto stateBit = lowestState( mask );
mask &= ~stateBit;
setHintStateMask( table, aspect, hint, state, mask );
setHintStateMask( table, aspect, hint, state | stateBit, mask );
}
inline bool removeHintStateMask(
QskSkinHintTable* table, QskAspect aspect,
QskAspect::State state, QskAspect::State mask )
{
if ( mask == 0 )
{
if ( state != 0 )
return table->removeHint( aspect | state );
return false;
}
2021-09-02 13:12:29 +02:00
const auto stateBit = lowestState( mask );
mask &= ~stateBit;
bool ret = removeHintStateMask( table, aspect, state, mask );
ret |= removeHintStateMask( table, aspect, state | stateBit, mask );
return ret;
}
2020-12-26 12:57:08 +01:00
inline QskAspect aspectStrutSize( QskAspect aspect )
{
return aspect | QskAspect::StrutSize;
}
inline QskAspect aspectMargin( QskAspect aspect )
{
return aspect | QskAspect::Margin;
}
inline QskAspect aspectPadding( QskAspect aspect )
{
return aspect | QskAspect::Padding;
}
inline QskAspect aspectSpacing( QskAspect aspect )
{
return aspect | QskAspect::Spacing;
}
inline QskAspect aspectAlignment( QskAspect aspect )
{
return aspect | QskAspect::Alignment;
}
inline QskAspect aspectFontRole( QskAspect aspect )
{
return aspect | QskAspect::FontRole;
}
inline QskAspect aspectGraphicRole( QskAspect aspect )
{
return aspect | QskAspect::GraphicRole;
}
inline QskAspect aspectShape( QskAspect aspect )
{
return aspect | QskAspect::Shape;
}
inline QskAspect aspectBorder( QskAspect aspect )
{
return aspect | QskAspect::Border;
}
}
QskSkinHintTableEditor::QskSkinHintTableEditor( QskSkinHintTable* table )
: m_table( table )
{
}
void QskSkinHintTableEditor::setTable( QskSkinHintTable* table )
{
m_table = table;
}
QskSkinHintTable* QskSkinHintTableEditor::table() const
{
return m_table;
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setHint( QskAspect aspect,
const QVariant& hint, QskAspect::State combinationMask )
{
2021-09-04 16:48:02 +02:00
if ( combinationMask == QskAspect::NoState )
{
m_table->setHint( aspect, hint );
}
else
{
setHintStateMask( m_table, aspect, hint,
QskAspect::NoState, combinationMask );
}
}
2021-09-04 16:48:02 +02:00
bool QskSkinHintTableEditor::removeHint(
QskAspect aspect, QskAspect::State combinationMask )
{
2021-09-04 16:48:02 +02:00
if ( combinationMask == QskAspect::NoState )
{
return m_table->removeHint( aspect );
}
else
{
return removeHintStateMask( m_table, aspect,
QskAspect::NoState, combinationMask );
}
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setFlag(
QskAspect aspect, int flag, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setFlagHint( aspect, flag, combinationMask );
2020-12-26 12:57:08 +01:00
}
int QskSkinHintTableEditor::flag( QskAspect aspect ) const
{
2021-08-04 09:31:16 +02:00
return flagHint< int >( aspect );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setMetric(
QskAspect aspect, qreal metric, QskAspect::State combinationMask )
2021-09-03 06:51:50 +02:00
{
2021-09-04 16:48:02 +02:00
setMetricHint( aspect, metric, combinationMask );
2020-12-26 12:57:08 +01:00
}
qreal QskSkinHintTableEditor::metric( QskAspect aspect ) const
{
2021-08-04 09:31:16 +02:00
return metricHint< qreal >( aspect );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setColor(
QskAspect aspect, Qt::GlobalColor color, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setColorHint( aspect, QColor( color ), combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setColor(
QskAspect aspect, QRgb rgb, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setColorHint( aspect, QColor::fromRgba( rgb ), combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setColor(
QskAspect aspect, const QColor& color, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setColorHint( aspect, color, combinationMask );
2020-12-26 12:57:08 +01:00
}
QColor QskSkinHintTableEditor::color( QskAspect aspect ) const
{
2021-08-04 09:31:16 +02:00
return colorHint< QColor >( aspect );
2020-12-26 12:57:08 +01:00
}
2021-01-07 13:48:56 +01:00
void QskSkinHintTableEditor::setHGradient(
2021-09-04 16:48:02 +02:00
QskAspect aspect, const QColor& color1, const QColor& color2,
QskAspect::State combinationMask )
2021-01-07 13:48:56 +01:00
{
2021-09-04 16:48:02 +02:00
const QskGradient gradient( QskGradient::Horizontal, color1, color2 );
setGradient( aspect, gradient, combinationMask );
2021-01-07 13:48:56 +01:00
}
void QskSkinHintTableEditor::setVGradient(
2021-09-04 16:48:02 +02:00
QskAspect aspect, const QColor& color1, const QColor& color2,
QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
const QskGradient gradient( QskGradient::Vertical, color1, color2 );
setGradient( aspect, gradient, combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setGradient(
QskAspect aspect, const QskGradient& gradient,
QskAspect::State combinationMask )
{
2021-09-04 16:48:02 +02:00
setColorHint( aspect, gradient, combinationMask );
}
2020-12-26 12:57:08 +01:00
QskGradient QskSkinHintTableEditor::gradient( QskAspect aspect ) const
{
2021-08-04 09:31:16 +02:00
return colorHint< QskGradient >( aspect );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setStrutSize(
QskAspect aspect, const QSizeF& size, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setMetricHint( aspectStrutSize( aspect ), size, combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setStrutSize(
QskAspect aspect, qreal width, qreal height, QskAspect::State combinationMask )
2021-09-03 06:51:50 +02:00
{
2021-09-04 16:48:02 +02:00
setMetricHint( aspectStrutSize( aspect ),
QSizeF( width, height ), combinationMask );
2021-09-03 06:51:50 +02:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeStrutSize(
QskAspect aspect, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
removeMetricHint( aspectStrutSize( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
QSizeF QskSkinHintTableEditor::strutSize( QskAspect aspect ) const
{
return metricHint< QSizeF >( aspectStrutSize( aspect ) );
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setMargin(
QskAspect aspect, const QskMargins& margins, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setMetricHint( aspectMargin( aspect ), margins, combinationMask );
2020-12-26 12:57:08 +01:00
}
void QskSkinHintTableEditor::setMargin( QskAspect aspect,
2021-09-04 16:48:02 +02:00
qreal left, qreal top, qreal right, qreal bottom,
QskAspect::State combinationMask )
2021-09-03 06:51:50 +02:00
{
2021-09-04 16:48:02 +02:00
const QskMargins margins( left, top, right, bottom );
setMetricHint( aspectMargin( aspect ), combinationMask );
2021-09-03 06:51:50 +02:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeMargin(
QskAspect aspect, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
removeMetricHint( aspectMargin( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
QskMargins QskSkinHintTableEditor::margin( QskAspect aspect ) const
{
return metricHint< QskMargins >( aspectMargin( aspect ) );
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setPadding(
QskAspect aspect, const QskMargins& padding,
QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setMetricHint( aspectPadding( aspect ), padding, combinationMask );
2020-12-26 12:57:08 +01:00
}
void QskSkinHintTableEditor::setPadding( QskAspect aspect,
2021-09-04 16:48:02 +02:00
qreal left, qreal top, qreal right, qreal bottom,
QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
QskMargins padding( left, top, right, bottom );
setMetricHint( aspectPadding( aspect ), padding, combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removePadding(
QskAspect aspect, QskAspect::State combinationMask )
2021-09-03 06:51:50 +02:00
{
2021-09-04 16:48:02 +02:00
removeMetricHint( aspectPadding( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
QskMargins QskSkinHintTableEditor::padding( QskAspect aspect ) const
{
return metricHint< QskMargins >( aspectPadding( aspect ) );
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setSpacing(
QskAspect aspect, qreal spacing, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setMetricHint( aspectSpacing( aspect ), spacing, combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeSpacing(
QskAspect aspect, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
removeMetricHint( aspectSpacing( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
qreal QskSkinHintTableEditor::spacing( QskAspect aspect ) const
{
return metricHint< qreal >( aspectSpacing( aspect ) );
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setAlignment(
QskAspect aspect, Qt::Alignment alignment, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setFlagHint( aspectAlignment( aspect ),
static_cast< int >( alignment ), combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeAlignment(
QskAspect aspect, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
return removeFlagHint( aspectAlignment( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
Qt::Alignment QskSkinHintTableEditor::alignment( QskAspect aspect ) const
{
return flagHint< Qt::Alignment >( aspectAlignment( aspect ) );
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setFontRole(
QskAspect aspect, int fontRole, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setFlagHint( aspectFontRole( aspect ), fontRole, combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeFontRole(
QskAspect aspect, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
return removeFlagHint( aspectFontRole( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
int QskSkinHintTableEditor::fontRole( QskAspect aspect ) const
{
return flagHint< int >( aspectFontRole( aspect ) );
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setGraphicRole(
QskAspect aspect, int graphicRole, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setFlagHint( aspectGraphicRole( aspect ), graphicRole, combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeGraphicRole(
QskAspect aspect, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
return removeFlagHint( aspectGraphicRole( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
int QskSkinHintTableEditor::graphicRole( QskAspect aspect ) const
{
return flagHint< int >( aspectGraphicRole( aspect ) );
}
void QskSkinHintTableEditor::setBoxShape(
QskAspect aspect, qreal radius, Qt::SizeMode sizeMode )
{
setMetricHint( aspectShape( aspect ),
QskBoxShapeMetrics( radius, sizeMode ) );
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::setBoxShape( QskAspect aspect,
qreal topLeft, qreal topRight, qreal bottomLeft, qreal bottomRight,
Qt::SizeMode sizeMode )
2020-12-26 12:57:08 +01:00
{
setMetricHint( aspectShape( aspect ),
QskBoxShapeMetrics( topLeft, topRight, bottomLeft, bottomRight, sizeMode ) );
}
void QskSkinHintTableEditor::setBoxShape(
2021-09-04 16:48:02 +02:00
QskAspect aspect, const QskBoxShapeMetrics& shape, QskAspect::State combinationMask )
{
2021-09-04 16:48:02 +02:00
setMetricHint( aspectShape( aspect ), shape, combinationMask );
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeBoxShape(
QskAspect aspect, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
return removeMetricHint( aspectShape( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
QskBoxShapeMetrics QskSkinHintTableEditor::boxShape( QskAspect aspect ) const
{
return metricHint< QskBoxShapeMetrics >( aspectShape( aspect ) );
}
void QskSkinHintTableEditor::setBoxBorderMetrics( QskAspect aspect,
qreal borderWidth, Qt::SizeMode sizeMode )
{
setMetricHint( aspectBorder( aspect ),
QskBoxBorderMetrics( borderWidth, sizeMode ) );
}
void QskSkinHintTableEditor::setBoxBorderMetrics( QskAspect aspect,
qreal left, qreal top, qreal right, qreal bottom, Qt::SizeMode sizeMode )
{
setMetricHint( aspectBorder( aspect ),
QskBoxBorderMetrics( left, top, right, bottom, sizeMode ) );
}
void QskSkinHintTableEditor::setBoxBorderMetrics(
2021-09-04 16:48:02 +02:00
QskAspect aspect, const QskBoxBorderMetrics& borderMetrics,
QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
setMetricHint( aspectBorder( aspect ), borderMetrics, combinationMask );
2020-12-26 12:57:08 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeBoxBorderMetric(
QskAspect aspect, QskAspect::State combinationMask )
{
2021-09-04 16:48:02 +02:00
return removeMetricHint( aspectBorder( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
QskBoxBorderMetrics QskSkinHintTableEditor::boxBorderMetrics( QskAspect aspect ) const
{
return metricHint< QskBoxBorderMetrics >( aspectBorder( aspect ) );
}
void QskSkinHintTableEditor::setBoxBorderColors(
2021-09-04 16:48:02 +02:00
QskAspect aspect, const QskBoxBorderColors& borderColors,
QskAspect::State combinationMask )
{
2021-09-04 16:48:02 +02:00
setColorHint( aspectBorder( aspect ), borderColors, combinationMask );
}
2021-02-01 10:23:47 +01:00
void QskSkinHintTableEditor::setBoxBorderColors( QskAspect aspect,
2021-09-04 16:48:02 +02:00
const QColor& left, const QColor& top, const QColor& right, const QColor& bottom,
QskAspect::State combinationMask )
2021-02-01 10:23:47 +01:00
{
setColorHint( aspectBorder( aspect ),
2021-09-04 16:48:02 +02:00
QskBoxBorderColors( left, top, right, bottom ),
combinationMask );
2021-02-01 10:23:47 +01:00
}
2021-09-04 16:48:02 +02:00
void QskSkinHintTableEditor::removeBoxBorderColors(
QskAspect aspect, QskAspect::State combinationMask )
2020-12-26 12:57:08 +01:00
{
2021-09-04 16:48:02 +02:00
return removeColorHint( aspectBorder( aspect ), combinationMask );
2020-12-26 12:57:08 +01:00
}
QskBoxBorderColors QskSkinHintTableEditor::boxBorderColors( QskAspect aspect ) const
{
return colorHint< QskBoxBorderColors >( aspectBorder( aspect ) );
}