diff --git a/examples/automotive/DefaultSkin.cpp b/examples/automotive/DefaultSkin.cpp index 9fcea4e6..fa9ef9ec 100644 --- a/examples/automotive/DefaultSkin.cpp +++ b/examples/automotive/DefaultSkin.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -109,7 +110,7 @@ void DefaultSkin::initHints() // -- push buttons - setMetric( QskPushButton::Panel | QskAspect::Padding, 10 ); + setMargins( QskPushButton::Panel | QskAspect::Padding, 10 ); setColor( QskPushButton::Panel, m_palette->color1 ); setColor( QskPushButton::Text, m_palette->color3 ); setColor( QskPushButton::Panel | QskPushButton::Pressed, m_palette->color2 ); diff --git a/examples/automotive/OtherSkin.cpp b/examples/automotive/OtherSkin.cpp index 875bbd98..e1f705da 100644 --- a/examples/automotive/OtherSkin.cpp +++ b/examples/automotive/OtherSkin.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -88,7 +89,7 @@ void OtherSkin::initHints() // -- push buttons setMetric( QskPushButton::Panel | QskAspect::Radius, 4 ); - setMetric( QskPushButton::Panel | QskAspect::Padding, 8 ); + setMargins( QskPushButton::Panel | QskAspect::Padding, 8 ); setColor( QskPushButton::Panel, m_palette->color1 ); setColor( QskPushButton::Text, m_palette->color3 ); setColor( QskPushButton::Panel | QskPushButton::Pressed, m_palette->color2 ); diff --git a/examples/listbox/main.cpp b/examples/listbox/main.cpp index df1ae917..a7d6f32c 100644 --- a/examples/listbox/main.cpp +++ b/examples/listbox/main.cpp @@ -24,8 +24,8 @@ public: setMargins( QMarginsF( 15, 10, 10, 10 ) ); setAlternatingRowColors( true ); - // increasing the height of each row: usually the job of the skin ! - setMetric( Cell | Padding | HorizontalEdges, 20 ); + // increasing the padding of each row: usually the job of the skin ! + setMarginsHint( Cell | Padding, QMargins( 10, 20, 10, 20 ) ); populate(); diff --git a/examples/sliders/main.cpp b/examples/sliders/main.cpp index d3745205..8ab0ade8 100644 --- a/examples/sliders/main.cpp +++ b/examples/sliders/main.cpp @@ -34,11 +34,12 @@ public: const qreal h = 30; const qreal w = 2.0 * h; + const qreal paddingW = 0.5 * w + 1; // Panel setMetric( Panel | Size, h ); setMetric( Panel | Border, 1 ); - setMetric( Panel | Padding | VerticalEdges, 0.5 * w + 1 ); + setMarginsHint( Panel | Padding, QMarginsF( paddingW, 0, paddingW, 0 ) ); setColor( Panel | Border, QskRgbValue::Grey900 ); setColor( Panel, QskRgbValue::Grey400 ); @@ -56,7 +57,7 @@ public: setMetric( Handle | Border, 1 ); const qreal m = qCeil( 0.5 * ( w - h ) ) + 2; - setMetric( Handle | Margin | VerticalEdges, -m ); + setMarginsHint( Handle | Margin, QMarginsF( -m, 0, -m, 0 ) ); for ( auto state : { NoState, Pressed } ) { diff --git a/playground/inputpanel/LineEdit.cpp b/playground/inputpanel/LineEdit.cpp index 62029d06..599c520c 100644 --- a/playground/inputpanel/LineEdit.cpp +++ b/playground/inputpanel/LineEdit.cpp @@ -67,7 +67,7 @@ void LineEdit::updateLayout() { Inherited::updateLayout(); - const auto padding = edgeMetrics( Panel, QskAspect::Padding ); + const QMarginsF padding = marginsHint( Panel | QskAspect::Padding ); Q_P( QQuickTextInput ); p->QQuickTextInput::setLeftPadding( padding.left() ); diff --git a/playground/inputpanel/main.cpp b/playground/inputpanel/main.cpp index 920934e3..03a043f7 100644 --- a/playground/inputpanel/main.cpp +++ b/playground/inputpanel/main.cpp @@ -123,13 +123,13 @@ public: { using namespace QskAspect; - QFontMetricsF fm( effectiveFont( Text ) ); + const QFontMetricsF fm( effectiveFont( Text ) ); for ( auto entry : m_values ) m_maxWidth = qMax( m_maxWidth, fm.width( entry.first ) ); - m_maxWidth += metric( Cell | Padding | LeftEdge ) - + metric( Cell | Padding | RightEdge ); + const QMarginsF padding = marginsHint( Cell | Padding ); + m_maxWidth += padding.left() + padding.right(); } return m_maxWidth; @@ -139,9 +139,10 @@ public: { using namespace QskAspect; - return QFontMetrics( effectiveFont( Text ) ).height() - + metric( Cell | Padding | TopEdge ) - + metric( Cell | Padding | BottomEdge ); + const QFontMetricsF fm( effectiveFont( Text ) ); + const QMarginsF padding = marginsHint( Cell | Padding ); + + return fm.height() + padding.top() + padding.bottom(); } virtual QVariant valueAt( int row, int ) const override final diff --git a/src/common/QskAspect.cpp b/src/common/QskAspect.cpp index 995de1fa..0796c42f 100644 --- a/src/common/QskAspect.cpp +++ b/src/common/QskAspect.cpp @@ -322,10 +322,7 @@ void qskDebugAspect( QDebug debug, const QMetaObject* metaObject, QskAspect::Asp switch( aspect.boxPrimitive() ) { - case Margin: - case Padding: case Border: - case Shadow: { if ( aspect.edge() ) debug << ", " << qskEnumString( "Edge", aspect.edge() ); diff --git a/src/common/QskAspect.h b/src/common/QskAspect.h index 11a9334a..27576ffc 100644 --- a/src/common/QskAspect.h +++ b/src/common/QskAspect.h @@ -73,12 +73,9 @@ QSK_NAMESPACE( QskAspect ) { Background = 0, - Margin = 1, - Padding = 2, RadiusX = 3, RadiusY = 4, Border = 5, - Shadow = 6, Radius = 7, // RadiusX | RadiusY }; @@ -107,6 +104,11 @@ QSK_NAMESPACE( QskAspect ) MinimumHeight, MaximumWidth, MaximumHeight, + + Margin, + Padding, + Shadow, + Spacing }; QSK_ENUM( MetricPrimitive ) diff --git a/src/common/QskMargins.cpp b/src/common/QskMargins.cpp new file mode 100644 index 00000000..e3f11877 --- /dev/null +++ b/src/common/QskMargins.cpp @@ -0,0 +1,66 @@ +#include "QskMargins.h" +#include + +static inline qreal qskInterpolated( qreal from, qreal to, qreal ratio ) +{ + return from + ( to - from ) * ratio; +} + +static inline QskMargins qskInterpolateMargins( + const QskMargins& m1, const QskMargins& m2, qreal progress ) +{ + const qreal left = qskInterpolated( m1.left(), m2.left(), progress ); + const qreal top = qskInterpolated( m1.top(), m2.top(), progress ); + const qreal right = qskInterpolated( m1.right(), m2.right(), progress ); + const qreal bottom = qskInterpolated( m1.bottom(), m2.bottom(), progress ); + + return QskMargins( left, top, right, bottom ); +} + +QskMargins QskMargins::interpolated( + const QskMargins& to, qreal progress ) const noexcept +{ + return qskInterpolateMargins( *this, to, progress ); +} + +QVariant QskMargins::interpolate( + const QskMargins& m1, const QskMargins& m2, qreal progress ) noexcept +{ + return QVariant::fromValue( qskInterpolateMargins( m1, m2, progress ) ); +} + +void QskMargins::setMarginsAt( Qt::Edges edges, qreal value ) noexcept +{ + if ( edges & Qt::LeftEdge ) + setLeft( value ); + + if ( edges & Qt::TopEdge ) + setTop( value ); + + if ( edges & Qt::RightEdge ) + setRight( value ); + + if ( edges & Qt::BottomEdge ) + setBottom( value ); +} + +qreal QskMargins::marginAt( Qt::Edge edge ) const noexcept +{ + switch( edge ) + { + case Qt::LeftEdge: + return left(); + + case Qt::TopEdge: + return top(); + + case Qt::RightEdge: + return right(); + + case Qt::BottomEdge: + return bottom(); + } + + return 0.0; +} + diff --git a/src/common/QskMargins.h b/src/common/QskMargins.h new file mode 100644 index 00000000..c41d0796 --- /dev/null +++ b/src/common/QskMargins.h @@ -0,0 +1,132 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + +#ifndef QSK_MARGINS_H +#define QSK_MARGINS_H + +#include "QskGlobal.h" + +#include +#include +#include + +class QVariant; + +/* + Having a wrapper like this feels a bit stupid, but unfortunately QMarginsF + is not registered as Qt metatype and doing this in an external library + is an obvious source for conflicts with application code. + */ +class QSK_EXPORT QskMargins : public QMarginsF +{ +public: + constexpr QskMargins() noexcept = default; + constexpr QskMargins( const QMarginsF& ) noexcept; + constexpr QskMargins( const QMargins& ) noexcept; + + constexpr QskMargins( qreal left, qreal top, qreal right, qreal bottom ) noexcept; + constexpr QskMargins( qreal margin ) noexcept; + constexpr QskMargins( qreal horizontal, qreal vertical ) noexcept; + + QskMargins mirrored( Qt::Orientations ) const noexcept; + constexpr QskMargins rotated() const noexcept; + + constexpr QskMargins translated( qreal dx, qreal dy ) const noexcept; + constexpr QskMargins expanded( qreal dx, qreal dy ) const noexcept; + + void setMargins( qreal margin ) noexcept; + void setMargins( qreal horizontal, qreal vertical ) noexcept; + + void setMarginsAt( Qt::Edges, qreal ) noexcept; + qreal marginAt( Qt::Edge ) const noexcept; + + constexpr qreal length( Qt::Orientation ) const noexcept; + + QskMargins interpolated( const QskMargins&, qreal progress ) const noexcept; + + static QVariant interpolate( const QskMargins&, + const QskMargins&, qreal progress ) noexcept; +}; + +constexpr inline QskMargins::QskMargins( qreal margin ) noexcept: + QskMargins( margin, margin, margin, margin ) +{ +} + +constexpr inline QskMargins::QskMargins( qreal horizontal, qreal vertical ) noexcept: + QskMargins( horizontal, vertical, horizontal, vertical ) +{ +} + +constexpr QskMargins::QskMargins( + qreal left, qreal top, qreal right, qreal bottom ) noexcept: + QMarginsF( left, top, right, bottom ) +{ +} + +constexpr inline QskMargins::QskMargins( const QMarginsF& margins ) noexcept: + QMarginsF( margins ) +{ +} + +constexpr inline QskMargins::QskMargins( const QMargins& margins ) noexcept: + QMarginsF( margins ) +{ +} + +inline void QskMargins::setMargins( qreal margin ) noexcept +{ + *this = QskMargins( margin ); +} + +inline void QskMargins::setMargins( qreal horizontal, qreal vertical ) noexcept +{ + *this = QskMargins( horizontal, vertical ); +} + +inline QskMargins QskMargins::mirrored( + Qt::Orientations orientations ) const noexcept +{ + switch( int( orientations ) ) + { + case Qt::Vertical: + return QskMargins( left(), bottom(), right(), top() ); + + case Qt::Horizontal: + return QskMargins( right(), top(), left(), bottom() ); + + case Qt::Vertical | Qt::Horizontal: + return QskMargins( right(), bottom(), left(), top() ); + + default: + return *this; + } +} + +constexpr inline QskMargins QskMargins::rotated() const noexcept +{ + return QskMargins( top(), left(), bottom(), right() ); +} + +constexpr inline QskMargins QskMargins::translated( qreal dx, qreal dy ) const noexcept +{ + return QskMargins( left() + dx, top() + dy, right() - dx, bottom() - dy ); +} + +constexpr QskMargins QskMargins::expanded( qreal dx, qreal dy ) const noexcept +{ + return QskMargins( left() + dx, top() + dy, right() + dx, bottom() + dy ); +} + +constexpr qreal QskMargins::length( Qt::Orientation orientation ) const noexcept +{ + return ( orientation == Qt::Horizontal ) + ? ( left() + right() ) : ( top() + bottom() ); +} + +Q_DECLARE_TYPEINFO( QskMargins, Q_MOVABLE_TYPE ); +Q_DECLARE_METATYPE( QskMargins ) + +#endif diff --git a/src/controls/QskControl.cpp b/src/controls/QskControl.cpp index 75ab97a5..7344e7a4 100644 --- a/src/controls/QskControl.cpp +++ b/src/controls/QskControl.cpp @@ -570,13 +570,7 @@ void QskControl::setMargins( const QMarginsF& margins ) if ( m != this->margins() ) { - Aspect aspect = subControl | Margin; - - setMetric( aspect | LeftEdge, m.left() ); - setMetric( aspect | TopEdge, m.top() ); - setMetric( aspect | RightEdge, m.right() ); - setMetric( aspect | BottomEdge, m.bottom() ); - + setMarginsHint( subControl | Margin, m ); resetImplicitSize(); if ( m_polishOnResize || m_autoLayoutChildren ) @@ -593,7 +587,7 @@ void QskControl::resetMargins() QMarginsF QskControl::margins() const { - return edgeMetrics( QskAspect::Control, QskAspect::Margin ); + return marginsHint( QskAspect::Control | QskAspect::Margin ); } QRectF QskControl::contentsRect() const diff --git a/src/controls/QskFocusIndicator.cpp b/src/controls/QskFocusIndicator.cpp index da3f8651..622ca804 100644 --- a/src/controls/QskFocusIndicator.cpp +++ b/src/controls/QskFocusIndicator.cpp @@ -79,7 +79,7 @@ void QskFocusIndicator::updateFocusFrame() if ( !r.isEmpty() ) { - r = r.marginsAdded( edgeMetrics( Panel, QskAspect::Padding ) ); + r = r.marginsAdded( marginsHint( Panel | QskAspect::Padding ) ); setGeometry( r ); } diff --git a/src/controls/QskHintAnimator.cpp b/src/controls/QskHintAnimator.cpp index 0fd37b58..de9ff931 100644 --- a/src/controls/QskHintAnimator.cpp +++ b/src/controls/QskHintAnimator.cpp @@ -7,6 +7,7 @@ #include "QskAnimationHint.h" #include "QskControl.h" #include "QskEvent.h" +#include "QskMargins.h" #include #include @@ -15,6 +16,12 @@ #include #include +static inline qreal qskAligned05( qreal value ) +{ + // aligned to 0.5 + return qRound( 2.0 * value ) / 2.0; +} + static inline bool qskCheckReceiverThread( const QObject *receiver ) { /* @@ -34,7 +41,6 @@ static inline bool qskCheckReceiverThread( const QObject *receiver ) static inline QVariant qskAdjustedValue( QskAspect::Aspect aspect, const QVariant& value ) { -#if 1 if( value.type() == QVariant::Double ) { if ( aspect.metricPrimitive() != QskAspect::Position ) @@ -42,10 +48,17 @@ static inline QVariant qskAdjustedValue( // all beside QskAspect::Position are real metrics, // that will be aligned to the resolution of the paint device // so we can avoid pointless operations by rounding - return qRound( 2.0 * value.toReal() ) / 2.0; + return qskAligned05( value.toReal() ); } } -#endif + else if ( value.canConvert< QskMargins >() ) + { + const QskMargins m = value.value< QskMargins >(); + + return QVariant::fromValue( + QskMargins( qskAligned05( m.left() ), qskAligned05( m.top() ), + qskAligned05( m.right() ), qskAligned05( m.bottom() ) ) ); + } return value; } diff --git a/src/controls/QskListViewSkinlet.cpp b/src/controls/QskListViewSkinlet.cpp index fc306d8b..3b500895 100644 --- a/src/controls/QskListViewSkinlet.cpp +++ b/src/controls/QskListViewSkinlet.cpp @@ -190,7 +190,7 @@ void QskListViewSkinlet::updateForegroundNodes( return; } - const QMarginsF margins = listView->edgeMetrics( QskListView::Cell, QskAspect::Padding ); + const QMarginsF margins = listView->marginsHint( QskListView::Cell | QskAspect::Padding ); const QRectF cr = listView->viewContentsRect(); const QPointF scrolledPos = listView->scrollPos(); diff --git a/src/controls/QskScrollViewSkinlet.cpp b/src/controls/QskScrollViewSkinlet.cpp index 258e9818..01e189dc 100644 --- a/src/controls/QskScrollViewSkinlet.cpp +++ b/src/controls/QskScrollViewSkinlet.cpp @@ -236,7 +236,7 @@ QRectF QskScrollViewSkinlet::scrollHandleRect( const auto subControlBar = QskScrollView::VerticalScrollBar; const QRectF sbRect = subControlRect( scrollView, subControlBar ); - const auto padding = scrollView->edgeMetrics( subControlBar, QskAspect::Padding ); + const QMarginsF padding = scrollView->marginsHint( subControlBar | QskAspect::Padding ); const qreal h = scrollView->scrollableSize().height(); @@ -259,7 +259,7 @@ QRectF QskScrollViewSkinlet::scrollHandleRect( const auto subControlBar = QskScrollView::HorizontalScrollBar; const QRectF sbRect = subControlRect( scrollView, subControlBar ); - const auto padding = scrollView->edgeMetrics( subControlBar, QskAspect::Padding ); + const auto padding = scrollView->marginsHint( subControlBar | QskAspect::Padding ); const qreal w = scrollView->scrollableSize().width(); diff --git a/src/controls/QskSimpleListBox.cpp b/src/controls/QskSimpleListBox.cpp index f8ee0ac0..564914dd 100644 --- a/src/controls/QskSimpleListBox.cpp +++ b/src/controls/QskSimpleListBox.cpp @@ -279,23 +279,19 @@ int QskSimpleListBox::columnCount() const qreal QskSimpleListBox::columnWidth( int col ) const { - using namespace QskAspect; - if ( col >= columnCount() ) return 0.0; - return m_data->maxTextWidth - + metric( Cell | Padding | LeftEdge ) - + metric( Cell | Padding | RightEdge ); + const QMarginsF padding = marginsHint( Cell | QskAspect::Padding ); + return m_data->maxTextWidth + padding.left() + padding.right(); } qreal QskSimpleListBox::rowHeight() const { - using namespace QskAspect; + const QMarginsF padding = marginsHint( Cell | QskAspect::Padding ); + const QFontMetricsF fm( effectiveFont( Text ) ); - return QFontMetrics( effectiveFont( Text ) ).height() - + metric( Cell | Padding | TopEdge ) - + metric( Cell | Padding | BottomEdge ); + return fm.height() + padding.top() + padding.bottom(); } #include "moc_QskSimpleListBox.cpp" diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index e82bbc72..d005d6e0 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -184,6 +184,16 @@ qreal QskSkin::metric( QskAspect::Aspect aspect ) const return m_data->hintTable.metric( aspect ); } +void QskSkin::setMargins( QskAspect::Aspect aspect, const QskMargins& margins ) +{ + m_data->hintTable.setMargins( aspect, margins ); +} + +QskMargins QskSkin::margins( QskAspect::Aspect aspect ) const +{ + return m_data->hintTable.margins( aspect ); +} + void QskSkin::setAnimation( QskAspect::Aspect aspect, QskAnimationHint animation ) { diff --git a/src/controls/QskSkin.h b/src/controls/QskSkin.h index 95b94a94..31b8b5cb 100644 --- a/src/controls/QskSkin.h +++ b/src/controls/QskSkin.h @@ -28,6 +28,7 @@ class QskAnimationHint; class QskSkinHintTable; class QVariant; +class QskMargins; class QSK_EXPORT QskSkin : public QObject { @@ -65,6 +66,9 @@ public: void setMetric( QskAspect::Aspect, qreal metric ); qreal metric( QskAspect::Aspect ) const; + void setMargins( QskAspect::Aspect, const QskMargins& ); + QskMargins margins( QskAspect::Aspect ) const; + void setAnimation( QskAspect::Aspect, QskAnimationHint ); QskAnimationHint animation( QskAspect::Aspect ) const; diff --git a/src/controls/QskSkinHintTable.h b/src/controls/QskSkinHintTable.h index 3b98261b..011cada0 100644 --- a/src/controls/QskSkinHintTable.h +++ b/src/controls/QskSkinHintTable.h @@ -8,6 +8,7 @@ #include "QskGlobal.h" #include "QskAspect.h" +#include "QskMargins.h" #include "QskAnimationHint.h" #include @@ -31,6 +32,9 @@ public: void setMetric( QskAspect::Aspect, qreal metric ); qreal metric( QskAspect::Aspect ) const; + void setMargins( QskAspect::Aspect, const QskMargins& ); + QskMargins margins( QskAspect::Aspect ) const; + void setAnimation( QskAspect::Aspect, QskAnimationHint animation ); QskAnimationHint animation( QskAspect::Aspect ) const; @@ -100,6 +104,16 @@ inline qreal QskSkinHintTable::metric( QskAspect::Aspect aspect ) const return skinHint( aspect | QskAspect::Metric ).toReal(); } +inline void QskSkinHintTable::setMargins( QskAspect::Aspect aspect, const QskMargins& margins ) +{ + setSkinHint( aspect | QskAspect::Metric, QVariant::fromValue( margins ) ); +} + +inline QskMargins QskSkinHintTable::margins( QskAspect::Aspect aspect ) const +{ + return skinHint( aspect | QskAspect::Metric ).value< QskMargins >(); +} + inline void QskSkinHintTable::setAnimation( QskAspect::Aspect aspect, QskAnimationHint animation ) { diff --git a/src/controls/QskSkinRenderer.cpp b/src/controls/QskSkinRenderer.cpp index 8cb61e20..9ae3b238 100644 --- a/src/controls/QskSkinRenderer.cpp +++ b/src/controls/QskSkinRenderer.cpp @@ -208,7 +208,7 @@ static inline QskAspect::Edge qskRotateEdge( QskAspect::Edge edge, int count ) QMarginsF QskSkinRenderer::margins( const QskSkinnable* skinnable, QskAspect::Subcontrol subControl, int rotation ) { - const QMarginsF m = skinnable->edgeMetrics( subControl, QskAspect::Margin ); + const QMarginsF m = skinnable->marginsHint( subControl | QskAspect::Margin ); return qskRotatedMargins( m, rotation ); } @@ -250,10 +250,10 @@ QskBoxOptions QskSkinRenderer::boxOptions( const QskSkinnable* skinnable, QskBoxOptions options; options.borders = qskRotatedMargins( - skinnable->edgeMetrics( subControl, Border ), rotation ); + skinnable->borderMetrics( subControl ), rotation ); options.shadows = qskRotatedMargins( - skinnable->edgeMetrics( subControl, Shadow ), rotation ); + skinnable->marginsHint( subControl | Shadow ), rotation ); const auto leftEdge = qskRotateEdge( LeftEdge, rotation ); const auto topEdge = qskRotateEdge( TopEdge, rotation ); diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index e4416c51..745ba1af 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -11,6 +11,7 @@ #include "QskSkinHintTable.h" #include "QskSkinlet.h" #include "QskAnimationHint.h" +#include "QskMargins.h" #include "QskHintAnimator.h" #include "QskControl.h" #include "QskColorFilter.h" @@ -256,12 +257,22 @@ qreal QskSkinnable::metric( QskAspect::Aspect aspect, QskSkinHintStatus* status return effectiveHint( aspect | QskAspect::Metric, status ).toReal(); } -QMarginsF QskSkinnable::edgeMetrics( QskAspect::Subcontrol subControl, - QskAspect::BoxPrimitive primitive ) const +void QskSkinnable::setMarginsHint( QskAspect::Aspect aspect, const QMarginsF& margins ) +{ + m_data->hintTable.setMargins( aspect, margins ); +} + +QMarginsF QskSkinnable::marginsHint( + QskAspect::Aspect aspect, QskSkinHintStatus* status ) const +{ + return effectiveHint( aspect | QskAspect::Metric, status ).value< QskMargins >(); +} + +QMarginsF QskSkinnable::borderMetrics( QskAspect::Subcontrol subControl ) const { using namespace QskAspect; - const Aspect aspect = subControl | primitive; + const Aspect aspect = subControl | Border; return QMarginsF( metric( aspect | LeftEdge ), @@ -523,28 +534,30 @@ static inline QMarginsF qskMarginsInner( const QskSkinnable* skinnable, qreal top = skinnable->metric( aspect | Border | TopEdge ); qreal bottom = skinnable->metric( aspect | Border | BottomEdge ); + const QMarginsF padding = skinnable->marginsHint( aspect | Padding ); + const qreal w = size.width() - 0.5 * ( left + right ); const qreal h = size.height() - 0.5 * ( top + bottom ); left += qskMax( qskPaddingInner( skinnable, aspect | RadiusX | TopLeftCorner, w ), qskPaddingInner( skinnable, aspect | RadiusX | BottomLeftCorner, w ), - (qreal) skinnable->metric( aspect | Padding | LeftEdge ) ); + padding.left() ); right += qskMax( qskPaddingInner( skinnable, aspect | RadiusX | TopRightCorner, w ), qskPaddingInner( skinnable, aspect | RadiusX | BottomRightCorner, w ), - (qreal)skinnable->metric( aspect | Padding | RightEdge ) ); + padding.right() ); top += qskMax( qskPaddingInner( skinnable, aspect | RadiusY | TopLeftCorner, h ), qskPaddingInner( skinnable, aspect | RadiusY | TopRightCorner, h ), - (qreal)skinnable->metric( aspect | Padding | TopEdge ) ); + padding.top() ); bottom += qskMax( qskPaddingInner( skinnable, aspect | RadiusY | BottomLeftCorner, h ), qskPaddingInner( skinnable, aspect | RadiusY | BottomRightCorner, h ), - (qreal)skinnable->metric( aspect | Padding | BottomEdge ) ); + padding.bottom() ); return QMarginsF( left, top, right, bottom ); } @@ -561,28 +574,30 @@ static inline QMarginsF qskMarginsOuter( const QskSkinnable* skinnable, qreal top = skinnable->metric( aspect | Border | TopEdge ); qreal bottom = skinnable->metric( aspect | Border | BottomEdge ); + const QMarginsF padding = skinnable->marginsHint( aspect | Padding ); + const qreal w = size.width() + 0.5 * ( left + right ); const qreal h = size.height() + 0.5 * ( top + bottom ); left += qskMax( qskPaddingOuter( skinnable, aspect | RadiusX | TopLeftCorner, w ), qskPaddingOuter( skinnable, aspect | RadiusX | BottomLeftCorner, w ), - (qreal)skinnable->metric( aspect | Padding | LeftEdge ) ); + padding.left() ); right += qskMax( qskPaddingOuter( skinnable, aspect | RadiusX | TopRightCorner, w ), qskPaddingOuter( skinnable, aspect | RadiusX | BottomRightCorner, w ), - (qreal)skinnable->metric( aspect | Padding | RightEdge ) ); + padding.right() ); top += qskMax( qskPaddingOuter( skinnable, aspect | RadiusY | TopLeftCorner, h ), qskPaddingOuter( skinnable, aspect | RadiusY | TopRightCorner, h ), - (qreal)skinnable->metric( aspect | Padding | TopEdge ) ); + padding.top() ); bottom += qskMax( qskPaddingOuter( skinnable, aspect | RadiusY | BottomLeftCorner, h ), qskPaddingOuter( skinnable, aspect | RadiusY | BottomRightCorner, h ), - (qreal)skinnable->metric( aspect | Padding | BottomEdge ) ); + padding.bottom() ); return QMargins( left, top, right, bottom ); } diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index 5b6b43fa..f5a55014 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -76,12 +76,15 @@ public: void setMetric( QskAspect::Aspect, qreal metric ); qreal metric( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const; + void setMarginsHint( QskAspect::Aspect, const QMarginsF& ); + QMarginsF marginsHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const; + void setFlagHint( QskAspect::Aspect, int flag ); int flagHint( QskAspect::Aspect ) const; template< typename T > T flagHint( QskAspect::Aspect, T = T() ) const; - QMarginsF edgeMetrics( QskAspect::Subcontrol, QskAspect::BoxPrimitive ) const; + QMarginsF borderMetrics( QskAspect::Subcontrol ) const; void setFontRole( QskAspect::Aspect, int role ); int fontRole( QskAspect::Aspect ) const; diff --git a/src/controls/QskSliderSkinlet.cpp b/src/controls/QskSliderSkinlet.cpp index 1e02bc60..cf1f96d4 100644 --- a/src/controls/QskSliderSkinlet.cpp +++ b/src/controls/QskSliderSkinlet.cpp @@ -15,7 +15,7 @@ static QMarginsF qskMargins( const QskSlider* slider, QskAspect::Subcontrol subControl ) { - QMarginsF m = slider->edgeMetrics( subControl, QskAspect::Margin ); + QMarginsF m = slider->marginsHint( subControl | QskAspect::Margin ); if ( slider->orientation() == Qt::Vertical ) m = QMarginsF( m.top(), m.right(), m.bottom(), m.left() ); @@ -26,8 +26,8 @@ static QMarginsF qskMargins( static QMarginsF qskPadding( const QskSlider* slider, QskAspect::Subcontrol subControl ) { - QMarginsF m = slider->edgeMetrics( subControl, QskAspect::Padding ) - + slider->edgeMetrics( subControl, QskAspect::Border ); + QMarginsF m = slider->marginsHint( subControl | QskAspect::Padding ) + + slider->borderMetrics( subControl ); if ( slider->orientation() == Qt::Vertical ) m = QMarginsF( m.top(), m.right(), m.bottom(), m.left() ); diff --git a/src/controls/QskSubWindowSkinlet.cpp b/src/controls/QskSubWindowSkinlet.cpp index f42ed7ee..e93b49dd 100644 --- a/src/controls/QskSubWindowSkinlet.cpp +++ b/src/controls/QskSubWindowSkinlet.cpp @@ -134,12 +134,11 @@ qreal QskSubWindowSkinlet::titleBarHeight( const QskSubWindow* subWindow ) const return 0; const QFontMetricsF fm( subWindow->effectiveFont( QskSubWindow::TitleBar ) ); + const QMarginsF margins = subWindow->marginsHint( QskSubWindow::TitleBar | Padding ); - qreal height = fm.height() - + subWindow->metric( QskSubWindow::TitleBar | Padding | TopEdge ) - + subWindow->metric( QskSubWindow::TitleBar | Padding | BottomEdge ); + const qreal height = fm.height() + margins.top() + margins.bottom(); + const qreal minHeight = subWindow->metric( QskSubWindow::TitleBar | MinimumHeight ); - qreal minHeight = subWindow->metric( QskSubWindow::TitleBar | MinimumHeight ); return qMax( height, minHeight); } diff --git a/src/controls/QskVariantAnimator.cpp b/src/controls/QskVariantAnimator.cpp index b770c234..33f10be9 100644 --- a/src/controls/QskVariantAnimator.cpp +++ b/src/controls/QskVariantAnimator.cpp @@ -5,6 +5,7 @@ #include "QskVariantAnimator.h" #include "QskColorFilter.h" +#include "QskMargins.h" // Even if we don't use the standard Qt animation system we // use its registry of interpolators: why adding our own ... @@ -16,6 +17,7 @@ static void qskRegisterInterpolator() { qRegisterAnimationInterpolator( QskColorFilter::interpolate ); + qRegisterAnimationInterpolator( QskMargins::interpolate ); } Q_CONSTRUCTOR_FUNCTION( qskRegisterInterpolator ) diff --git a/src/skins/material/QskMaterialSkin.cpp b/src/skins/material/QskMaterialSkin.cpp index 890fdc94..083b7289 100644 --- a/src/skins/material/QskMaterialSkin.cpp +++ b/src/skins/material/QskMaterialSkin.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #if 1 @@ -149,7 +150,7 @@ void QskMaterialSkin::initCommonHints() const ColorPalette& pal = m_data->palette; - setMetric( Control | Padding, 4 ); + setMargins( Control | Padding, 4 ); setColor( Control | Background, pal.baseColor ); setColor( Control | Border, pal.darker200 ); @@ -189,7 +190,7 @@ void QskMaterialSkin::initFocusIndicatorHints() const ColorPalette& pal = m_data->palette; setMetric( Q::Panel | Border, 2 ); - setMetric( Q::Panel | Padding, 5 ); + setMargins( Q::Panel | Padding, 5 ); setColor( Q::Panel | Border, pal.accentColor ); } @@ -229,8 +230,8 @@ void QskMaterialSkin::initPageIndicatorHints() setMetric( Q::Highlighted | Radius, 6 ); #endif - setMetric( Q::Panel | Margin, 0 ); - setMetric( Q::Panel | Padding, 0 ); + setMargins( Q::Panel | Margin, 0 ); + setMargins( Q::Panel | Padding, 0 ); setMetric( Q::Panel | Border, 0 ); setColor( Q::Panel | Background, 0 ); @@ -250,16 +251,17 @@ void QskMaterialSkin::initPushButtonHints() setSkinHint( Q::Text | QskAspect::FontRole, ButtonFontRole ); setSkinHint( Q::Text | QskAspect::Alignment, Qt::AlignCenter ); + const QskMargins margin( 4, 3 ); + const QskMargins padding( 10, 6 ); + { const auto aspect = Q::Panel; - setMetric( aspect | Radius, 2.0f ); + setMetric( aspect | Radius, 2 ); - setMetric( aspect | Padding | HorizontalEdges, 6.0f ); - setMetric( aspect | Padding | VerticalEdges, 10.0f ); - - setMetric( aspect | Margin | HorizontalEdges, 3.0f ); - setMetric( aspect | Margin | VerticalEdges, 4.5f ); + setMargins( aspect | Margin, margin ); + setMargins( aspect | Padding, padding ); + setMargins( aspect | Shadow, 0 ); setMetric( aspect | Spacing, 4 ); } @@ -269,30 +271,20 @@ void QskMaterialSkin::initPushButtonHints() { const auto aspect = Q::Panel | state; - setMetric( aspect | Padding | TopEdge, 4.0f ); - setMetric( aspect | Padding | BottomEdge, 8.0f ); - - setMetric( aspect | Margin | TopEdge, 0.0f ); - setMetric( aspect | Margin | BottomEdge, 6.0f ); - - setMetric( aspect | Shadow | VerticalEdges, 4.5f ); - setMetric( aspect | Shadow | TopEdge, -1.0f ); - setMetric( aspect | Shadow | BottomEdge, 5.0f ); + setMargins( aspect | Margin, margin.translated( 0, -margin.top() ) ); + setMargins( aspect | Padding, padding.translated( 0, -2 ) ); + setMargins( aspect | Shadow, QskMargins( 4, -1.0, 4, 5.0 ) ); } - // Hover (or normal for touch) for ( const auto state : { Q::Hovered, Q::Checked | Q::Checkable | Q::Hovered, Q::Checkable | Q::Hovered } ) { - const auto aspect = Q::Panel | Shadow | state; - - setMetric( aspect | VerticalEdges, 2.5f ); - setMetric( aspect | TopEdge, 1.5f ); - setMetric( aspect | BottomEdge, 3.0f ); + const auto aspect = Q::Panel | state; + setMargins( aspect | Shadow, QskMargins( 2, 2, 2, 4 ) ); } - setMetric( Q::Panel | Q::Flat | Shadow, 0 ); + setMargins( Q::Panel | Q::Flat | Shadow, 0 ); setAnimation( Q::Panel | Color, qskDuration ); setAnimation( Q::Panel | Margin | Metric, qskDuration ); @@ -355,27 +347,15 @@ void QskMaterialSkin::initDialogButtonHints() setMetric( Q::Panel | Radius, 2.0f ); - setMetric( Q::Panel | Padding | HorizontalEdges, 6.0f ); - setMetric( Q::Panel | Padding | VerticalEdges, 10.0f ); - - setMetric( Q::Panel | Margin | HorizontalEdges, 3.0f ); - setMetric( Q::Panel | Margin | VerticalEdges, 4.5f ); + setMargins( Q::Panel | Margin, QskMargins( 3, 4.5 ) ); + setMargins( Q::Panel | Padding, QskMargins( 10, 6 ) ); setMetric( Q::Panel | Spacing, 4 ); - setMetric( Q::Panel | Q::Pressed | Padding | TopEdge, 4.0f ); - setMetric( Q::Panel | Q::Pressed | Padding | BottomEdge, 8.0f ); - - setMetric( Q::Panel | Q::Pressed | Margin | TopEdge, 0.0f ); - setMetric( Q::Panel | Q::Pressed | Margin | BottomEdge, 6.0f ); - - setMetric( Q::Panel | Q::Pressed | Shadow | VerticalEdges, 4.5f ); - setMetric( Q::Panel | Q::Pressed | Shadow | TopEdge, -1.0f ); - setMetric( Q::Panel | Q::Pressed | Shadow | BottomEdge, 5.0f ); - - setMetric( Q::Panel | Q::Hovered | Shadow | VerticalEdges, 2.5f ); - setMetric( Q::Panel | Q::Hovered | Shadow | TopEdge, 1.5f ); - setMetric( Q::Panel | Q::Hovered | Shadow | BottomEdge, 3.0f ); + setMargins( Q::Panel | Q::Pressed | Margin, QskMargins( 3, 0, 3, 6 ) ); + setMargins( Q::Panel | Q::Pressed | Padding, QskMargins( 10, 4, 10, 8 ) ); + setMargins( Q::Panel | Q::Pressed | Shadow, QskMargins( 4.5, -1, 4.5, 5 ) ); + setMargins( Q::Panel | Q::Hovered | Shadow, QskMargins( 2.5, 1.5, 2.5, 3 ) ); setAnimation( Q::Panel | Color, qskDuration ); setAnimation( Q::Panel | Margin | Metric, qskDuration ); @@ -414,12 +394,12 @@ void QskMaterialSkin::initSliderHints() setMetric( Q::Panel | Size, dim ); setMetric( Q::Panel | Border, 0 ); - setMetric( Q::Panel | Padding | VerticalEdges, 0.5 * dim ); + setMargins( Q::Panel | Padding, QskMargins( 0.5 * dim, 0 ) ); for ( auto subControl : { Q::Groove, Q::Fill } ) { setMetric( subControl | Border, 0 ); - setMetric( subControl | Padding, 0 ); + setMargins( subControl | Padding, 0 ); setMetric( subControl | Size, 5 ); setMetric( subControl | Radius, 0 ); } @@ -516,7 +496,7 @@ void QskMaterialSkin::initInputPanelHints() // frame setMetric( Q::KeyFrame | Border, 2 ); setMetric( Q::KeyFrame | Radius, 4 ); - setMetric( Q::KeyFrame | Margin, 2 ); + setMargins( Q::KeyFrame | Margin, 2 ); setColor( Q::KeyFrame, pal.baseColor ); setColor( Q::KeyFrame | Q::Pressed, pal.accentColor ); @@ -556,7 +536,7 @@ void QskMaterialSkin::initScrollViewHints() for ( auto subControl : { Q::HorizontalScrollBar, Q::VerticalScrollBar } ) { setMetric( subControl | Size, 12 ); - setMetric( subControl | Padding, 0 ); + setMargins( subControl | Padding, 0 ); } setMetric( Q::HorizontalScrollHandle | MinimumWidth, qskDpiScaled( 40.0 ) ); @@ -564,7 +544,7 @@ void QskMaterialSkin::initScrollViewHints() for ( auto subControl : { Q::HorizontalScrollHandle, Q::VerticalScrollHandle } ) { - setMetric( subControl | Margin, 0 ); + setMargins( subControl | Margin, 0 ); setMetric( subControl | Radius, 3 ); setMetric( subControl | Border, 1 ); @@ -591,8 +571,7 @@ void QskMaterialSkin::initListViewHints() const ColorPalette& pal = m_data->palette; // padding for each cell - setMetric( Q::Cell | Padding | HorizontalEdges, 8 ); - setMetric( Q::Cell | Padding | VerticalEdges, 4 ); + setMargins( Q::Cell | Padding, QskMargins( 4, 8 ) ); setAnimation( Q::CellSelected | Color, qskDuration ); setAnimation( Q::TextSelected | Color, qskDuration ); @@ -616,7 +595,7 @@ void QskMaterialSkin::initSubWindowHints() // panel setMetric( Q::Panel | Border, 2 ); - setMetric( Q::Panel | Padding, 10 ); + setMargins( Q::Panel | Padding, 10 ); setColor( Q::Panel | Border | LeftEdge | TopEdge, pal.lighter125 ); setColor( Q::Panel | Border | RightEdge | BottomEdge, pal.darker200 ); diff --git a/src/skins/squiek/QskSquiekSkin.cpp b/src/skins/squiek/QskSquiekSkin.cpp index e58f5a79..36c3e44f 100644 --- a/src/skins/squiek/QskSquiekSkin.cpp +++ b/src/skins/squiek/QskSquiekSkin.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include static const int qskDuration = 200; @@ -173,7 +174,7 @@ void QskSquiekSkin::initCommonHints() const ColorPalette& pal = m_data->palette; - setMetric( Control | Padding, 4 ); + setMargins( Control | Padding, 4 ); setColor( Control | Background, pal.lighter135 ); setColor( Control | Border, pal.darker200 ); @@ -210,7 +211,7 @@ void QskSquiekSkin::initFocusIndicatorHints() setMetric( Q::Panel | Border, 2 ); setMetric( Q::Panel | Radius, 4 ); - setMetric( Q::Panel | Padding, 5 ); + setMargins( Q::Panel | Padding, 5 ); setColor( Q::Panel | Border, pal.highlighted ); } @@ -242,8 +243,8 @@ void QskSquiekSkin::initPageIndicatorHints() setMetric( Q::Highlighted | Size, 8 ); setMetric( Q::Highlighted | Radius, 4 ); - setMetric( Q::Panel | Margin, 0 ); - setMetric( Q::Panel | Padding, 0 ); + setMargins( Q::Panel | Margin, 0 ); + setMargins( Q::Panel | Padding, 0 ); setMetric( Q::Panel | Border, 0 ); setColor( Q::Panel | Background, 0 ); @@ -264,7 +265,7 @@ void QskSquiekSkin::initPushButtonHints() setMetric( Q::Panel | Border | HorizontalEdges, 2 ); setMetric( Q::Panel | Border | VerticalEdges, 1 ); - setMetric( Q::Panel | Padding, 10 ); + setMargins( Q::Panel | Padding, 10 ); setMetric( Q::Panel | Spacing, 4 ); setSkinHint( Q::Text | Q::Disabled | Style, Qsk::Sunken ); @@ -307,7 +308,7 @@ void QskSquiekSkin::initDialogButtonHints() setMetric( Q::Panel | Border | HorizontalEdges, 2 ); setMetric( Q::Panel | Border | VerticalEdges, 1 ); - setMetric( Q::Panel | Padding, 10 ); + setMargins( Q::Panel | Padding, 10 ); setMetric( Q::Panel | Spacing, 4 ); setMetric( Q::Panel | MinimumWidth, qskDpiScaled( 75.0 ) ); @@ -339,23 +340,15 @@ void QskSquiekSkin::initTabButtonHints() setMetric( Q::Panel | Radius | TopCorners, 3 ); setMetric( Q::Panel | Border | LeftEdge | TopEdge | RightEdge, 1 ); - setMetric( Q::Panel | Padding | VerticalEdges, 10 ); - setMetric( Q::Panel | Padding | HorizontalEdges, 4 ); + setMargins( Q::Panel | Padding, QskMargins( 10, 4 ) ); setMetric( Q::Panel | MinimumWidth, 30 ); setMetric( Q::Panel | MinimumHeight, 16 ); for ( const auto state : { NoState } ) - { - setMetric( Q::Panel | Margin | TopEdge | state, 2 ); - setMetric( Q::Panel | Margin | BottomEdge | state, 0 ); - setMetric( Q::Panel | Margin | VerticalEdges | state, -1 ); - } + setMargins( Q::Panel | Margin | state, QskMargins( -1, 2, -1, 0 ) ); for ( const auto state : { Q::Checked, Q::Checked | Q::Pressed } ) - { - setMetric( Q::Panel | Margin | TopEdge | state, 0 ); - setMetric( Q::Panel | Margin | BottomEdge | state, -1 ); - } + setMargins( Q::Panel | Margin | state, QskMargins( -1, 0, -1, -1 ) ); setSkinHint( Q::Text | QskAspect::Alignment, Qt::AlignCenter ); #if 0 @@ -393,13 +386,12 @@ void QskSquiekSkin::initSliderHints() setMetric( Q::Panel | Size, dim ); setMetric( Q::Panel | Border, 0 ); - setMetric( Q::Panel | Padding | HorizontalEdges, 0 ); - setMetric( Q::Panel | Padding | VerticalEdges, 0.5 * dim ); + setMargins( Q::Panel | Padding, QskMargins( 0.5 * dim, 0 ) ); for ( auto subControl : { Q::Groove, Q::Fill } ) { setMetric( subControl | Border, 0 ); - setMetric( subControl | Padding, 0 ); + setMargins( subControl | Padding, 0 ); setMetric( subControl | Size, 0.3 * dim ); setMetric( subControl | Radius, 0.1 * dim ); } @@ -427,8 +419,11 @@ void QskSquiekSkin::initTabBarHints() using namespace QskAspect; using Q = QskTabBar; - for ( auto aspect : { Radius, Border, Padding, Margin } ) - setMetric( Q::Panel | aspect, 0 ); + setMetric( Q::Panel | Radius, 0 ); + setMetric( Q::Panel | Border, 0 ); + + setMargins( Q::Panel | Margin, 0 ); + setMargins( Q::Panel | Padding, 0 ); setColor( Q::Panel | Background, 0 ); } @@ -461,7 +456,7 @@ void QskSquiekSkin::initInputPanelHints() // frame setMetric( Q::KeyFrame | Border, 2 ); setMetric( Q::KeyFrame | Radius, 4 ); - setMetric( Q::KeyFrame | Margin, 2 ); + setMargins( Q::KeyFrame | Margin, 2 ); setAnimation( Q::KeyFrame | Color, qskDuration ); setAnimation( Q::KeyFrame | Color | Border, qskDuration ); @@ -494,13 +489,13 @@ void QskSquiekSkin::initScrollViewHints() for ( auto subControl : { Q::HorizontalScrollBar, Q::VerticalScrollBar } ) { setMetric( subControl | Size, 8 ); - setMetric( subControl | Padding, 0 ); - setMetric( subControl | Margin, 0 ); + setMargins( subControl | Padding, 0 ); + setMargins( subControl | Margin, 0 ); } for ( auto subControl : { Q::HorizontalScrollHandle, Q::VerticalScrollHandle } ) { - setMetric( subControl | Margin, 0 ); + setMargins( subControl | Margin, 0 ); setMetric( subControl | Radius, 3 ); setMetric( subControl | Border, 1 ); @@ -523,8 +518,7 @@ void QskSquiekSkin::initListViewHints() const ColorPalette& pal = m_data->palette; // padding for each cell - setMetric( Q::Cell | Padding | HorizontalEdges, 8 ); - setMetric( Q::Cell | Padding | VerticalEdges, 4 ); + setMargins( Q::Cell | Padding, QskMargins( 4, 8 ) ); setAnimation( Q::CellSelected | Color, qskDuration ); setAnimation( Q::TextSelected | Color, qskDuration ); @@ -544,7 +538,7 @@ void QskSquiekSkin::initSubWindowHints() const ColorPalette& pal = m_data->palette; setMetric( Q::Panel | Border, 2 ); - setMetric( Q::Panel | Padding, 10 ); + setMargins( Q::Panel | Padding, 10 ); setMetric( Q::TitleBar | Border, 2 ); setSkinHint( Q::TitleBar | FontRole, int( QskSkin::TinyFont ) ); diff --git a/src/src.pro b/src/src.pro index 0bf07493..406006c1 100644 --- a/src/src.pro +++ b/src/src.pro @@ -37,6 +37,7 @@ HEADERS += \ common/QskFunctions.h \ common/QskGlobal.h \ common/QskGradient.h \ + common/QskMargins.h \ common/QskModule.h \ common/QskNamespace.h \ common/QskObjectCounter.h \ @@ -49,6 +50,7 @@ SOURCES += \ common/QskCorner.cpp \ common/QskFunctions.cpp \ common/QskGradient.cpp \ + common/QskMargins.cpp \ common/QskModule.cpp \ common/QskObjectCounter.cpp \ common/QskSizePolicy.cpp \