diff --git a/examples/mycontrols/MyToggleButtonSkinlet.cpp b/examples/mycontrols/MyToggleButtonSkinlet.cpp index 1185380a..d57ec2bf 100644 --- a/examples/mycontrols/MyToggleButtonSkinlet.cpp +++ b/examples/mycontrols/MyToggleButtonSkinlet.cpp @@ -46,21 +46,21 @@ QRectF MyToggleButtonSkinlet::subControlRect( const QskSkinnable* skinnable, } else if( subControl == Q::UncheckedPanel ) { - const auto r = innerRect( skinnable, contentsRect, Q::Panel ); + const auto r = button->subControlContentsRect( contentsRect, Q::Panel ); return sectionRect( r, button->isInverted() ? 0 : 1 ); } else if( subControl == Q::CheckedPanel ) { - const auto r = innerRect( skinnable, contentsRect, Q::Panel ); + const auto r = button->subControlContentsRect( contentsRect, Q::Panel ); return sectionRect( r, button->isInverted() ? 1 : 0 ); } else if( subControl == Q::CheckedLabel || subControl == Q::CheckedIcon ) { - return innerRect( skinnable, contentsRect, Q::CheckedPanel ); + return button->subControlContentsRect( contentsRect, Q::CheckedPanel ); } else if( subControl == Q::UncheckedLabel || subControl == Q::UncheckedIcon ) { - return innerRect( skinnable, contentsRect, Q::UncheckedPanel ); + return button->subControlContentsRect( contentsRect, Q::UncheckedPanel ); } else if( subControl == Q::Cursor ) { @@ -68,7 +68,7 @@ QRectF MyToggleButtonSkinlet::subControlRect( const QskSkinnable* skinnable, if ( button->isInverted() ) position = 1.0 - position; - auto rect = innerRect( skinnable, contentsRect, Q::Panel ); + auto rect = button->subControlContentsRect( contentsRect, Q::Panel ); rect.setWidth( 0.5 * rect.width() ); rect.moveLeft( rect.left() + position * rect.width() ); @@ -79,13 +79,6 @@ QRectF MyToggleButtonSkinlet::subControlRect( const QskSkinnable* skinnable, return Inherited::subControlRect( skinnable, contentsRect, subControl ); } -QRectF MyToggleButtonSkinlet::innerRect( const QskSkinnable* skinnable, - const QRectF& rect, QskAspect::Subcontrol subControl ) const -{ - const auto r = subControlRect( skinnable, rect, subControl ); - return skinnable->innerBox( subControl, r ); -} - QSGNode* MyToggleButtonSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const { diff --git a/examples/mycontrols/MyToggleButtonSkinlet.h b/examples/mycontrols/MyToggleButtonSkinlet.h index 576a3a08..80bae2c5 100644 --- a/examples/mycontrols/MyToggleButtonSkinlet.h +++ b/examples/mycontrols/MyToggleButtonSkinlet.h @@ -43,10 +43,6 @@ class MyToggleButtonSkinlet : public QskSkinlet protected: QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* ) const override; - - private: - QRectF innerRect( const QskSkinnable*, - const QRectF&, QskAspect::Subcontrol ) const; }; #endif diff --git a/src/controls/QskBox.cpp b/src/controls/QskBox.cpp index 820ac9e0..efec3895 100644 --- a/src/controls/QskBox.cpp +++ b/src/controls/QskBox.cpp @@ -66,10 +66,10 @@ QMarginsF QskBox::padding() const QRectF QskBox::layoutRectForSize( const QSizeF& size ) const { - if ( !m_hasPanel ) - return Inherited::layoutRectForSize( size ); + if ( m_hasPanel ) + return subControlContentsRect( size, Panel ); - return innerBox( Panel, subControlRect( size, Panel ) ); + return Inherited::layoutRectForSize( size ); } #include "moc_QskBox.cpp" diff --git a/src/controls/QskControl.cpp b/src/controls/QskControl.cpp index 806f1e1b..c2d2c000 100644 --- a/src/controls/QskControl.cpp +++ b/src/controls/QskControl.cpp @@ -196,13 +196,7 @@ QRectF QskControl::contentsRect() const QRectF QskControl::subControlRect( QskAspect::Subcontrol subControl ) const { - return effectiveSkinlet()->subControlRect( this, contentsRect(), subControl ); -} - -QRectF QskControl::subControlRect( - const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const -{ - return effectiveSkinlet()->subControlRect( this, contentsRect, subControl ); + return subControlRect( contentsRect(), subControl ); } QRectF QskControl::subControlRect( @@ -211,7 +205,21 @@ QRectF QskControl::subControlRect( QRectF rect( 0.0, 0.0, size.width(), size.height() ); rect = qskValidOrEmptyInnerRect( rect, margins() ); - return effectiveSkinlet()->subControlRect( this, rect, subControl ); + return subControlRect( rect, subControl ); +} + +QRectF QskControl::subControlContentsRect( QskAspect::Subcontrol subControl ) const +{ + return subControlContentsRect( contentsRect(), subControl ); +} + +QRectF QskControl::subControlContentsRect( + const QSizeF& size, QskAspect::Subcontrol subControl ) const +{ + QRectF rect( 0.0, 0.0, size.width(), size.height() ); + rect = qskValidOrEmptyInnerRect( rect, margins() ); + + return subControlContentsRect( rect, subControl ); } QLocale QskControl::locale() const diff --git a/src/controls/QskControl.h b/src/controls/QskControl.h index 41c64e18..fbc21fb4 100644 --- a/src/controls/QskControl.h +++ b/src/controls/QskControl.h @@ -93,10 +93,14 @@ class QSK_EXPORT QskControl : public QskQuickItem, public QskSkinnable virtual QRectF focusIndicatorRect() const; virtual QRectF focusIndicatorClipRect() const; + using QskSkinnable::subControlRect; QRectF subControlRect( QskAspect::Subcontrol ) const; - QRectF subControlRect( const QRectF&, QskAspect::Subcontrol ) const; QRectF subControlRect( const QSizeF&, QskAspect::Subcontrol ) const; + using QskSkinnable::subControlContentsRect; + QRectF subControlContentsRect( QskAspect::Subcontrol ) const; + QRectF subControlContentsRect( const QSizeF&, QskAspect::Subcontrol ) const; + void setAutoFillBackground( bool ); bool autoFillBackground() const; diff --git a/src/controls/QskPageIndicatorSkinlet.cpp b/src/controls/QskPageIndicatorSkinlet.cpp index 2d00e945..c4003675 100644 --- a/src/controls/QskPageIndicatorSkinlet.cpp +++ b/src/controls/QskPageIndicatorSkinlet.cpp @@ -140,8 +140,7 @@ QSGNode* QskPageIndicatorSkinlet::updateBulletsNode( if ( node == nullptr ) node = new QSGNode(); - QRectF rect = indicator->subControlRect( QskPageIndicator::Panel ); - rect = indicator->innerBox( QskPageIndicator::Panel, rect ); + const auto rect = indicator->subControlContentsRect( QskPageIndicator::Panel ); // index of the highlighted bullet int currentBullet = qRound( indicator->currentIndex() ); diff --git a/src/controls/QskPushButton.cpp b/src/controls/QskPushButton.cpp index 9aa975d9..090daf5a 100644 --- a/src/controls/QskPushButton.cpp +++ b/src/controls/QskPushButton.cpp @@ -242,7 +242,7 @@ void QskPushButton::updateResources() QRectF QskPushButton::layoutRectForSize( const QSizeF& size ) const { - return innerBox( Panel, subControlRect( size, Panel ) ); + return subControlContentsRect( size, Panel ); } void QskPushButton::changeEvent( QEvent* event ) diff --git a/src/controls/QskPushButtonSkinlet.cpp b/src/controls/QskPushButtonSkinlet.cpp index 198e2474..2fa76569 100644 --- a/src/controls/QskPushButtonSkinlet.cpp +++ b/src/controls/QskPushButtonSkinlet.cpp @@ -73,8 +73,7 @@ QRectF QskPushButtonSkinlet::textRect( { // buttonShift -> TODO - QRectF r = button->innerBox( QskPushButton::Panel, - subControlRect( button, contentsRect, QskPushButton::Panel ) ); + auto r = button->subControlContentsRect( contentsRect, QskPushButton::Panel ); if ( button->hasGraphic() ) { @@ -93,8 +92,7 @@ QRectF QskPushButtonSkinlet::graphicRect( { // buttonShift -> TODO - auto r = button->innerBox( QskPushButton::Panel, - subControlRect( button, contentsRect, QskPushButton::Panel ) ); + auto r = button->subControlContentsRect( contentsRect, QskPushButton::Panel ); if ( !button->text().isEmpty() ) { diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 256976a5..a57c7c57 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -893,14 +893,7 @@ static inline QskMargins qskEffectivePadding( const QskSkinnable* skinnable, // sin 45° ceiled : 0.70710678; padding *= 1.0 - 0.70710678; - const auto paddingHint = skinnable->paddingHint( aspect ); - - return QskMargins( - qMax( padding.left(), paddingHint.left() ), - qMax( padding.top(), paddingHint.top() ), - qMax( padding.right(), paddingHint.right() ), - qMax( padding.bottom(), paddingHint.bottom() ) - ); + return padding.expandedTo( skinnable->paddingHint( aspect ) ); } QMarginsF QskSkinnable::innerPadding( @@ -942,6 +935,18 @@ QRectF QskSkinnable::outerBox( return innerBox.marginsAdded( m ); } +QRectF QskSkinnable::subControlRect( + const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const +{ + return effectiveSkinlet()->subControlRect( this, contentsRect, subControl ); +} + +QRectF QskSkinnable::subControlContentsRect( + const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const +{ + return innerBox( subControl, subControlRect( contentsRect, subControl ) ); +} + bool QskSkinnable::isTransitionAccepted( QskAspect aspect ) const { Q_UNUSED( aspect ) diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index e7cd9f30..7a6d6a14 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -97,6 +97,9 @@ class QSK_EXPORT QskSkinnable const char* skinStateAsPrintable() const; const char* skinStateAsPrintable( QskAspect::State ) const; + QRectF subControlRect( const QRectF&, QskAspect::Subcontrol ) const; + QRectF subControlContentsRect( const QRectF&, QskAspect::Subcontrol ) const; + QSizeF outerBoxSize( QskAspect, const QSizeF& innerBoxSize ) const; QSizeF innerBoxSize( QskAspect, const QSizeF& outerBoxSize ) const; diff --git a/src/controls/QskSliderSkinlet.cpp b/src/controls/QskSliderSkinlet.cpp index c7b46186..5f89c861 100644 --- a/src/controls/QskSliderSkinlet.cpp +++ b/src/controls/QskSliderSkinlet.cpp @@ -15,12 +15,15 @@ static inline QRectF qskInnerPanelRect( { using Q = QskSlider; - // QskSkinnable::innerBox ??? +#if 1 auto padding = slider->paddingHint( Q::Panel ); padding += slider->boxBorderMetricsHint( Q::Panel ).widths(); auto r = slider->subControlRect( contentsRect, Q::Panel ); r = r.marginsRemoved( padding ); +#else + r = slider->subControlContentsRect( contentsRect, Q::Panel ); +#endif return r; } diff --git a/src/controls/QskSubWindowSkinlet.cpp b/src/controls/QskSubWindowSkinlet.cpp index b8cdda45..c51e5c7d 100644 --- a/src/controls/QskSubWindowSkinlet.cpp +++ b/src/controls/QskSubWindowSkinlet.cpp @@ -121,8 +121,7 @@ QRectF QskSubWindowSkinlet::symbolRect( { using Q = QskSubWindow; - auto rect = subControlRect( subWindow, contentsRect, Q::TitleBar ); - rect = subWindow->innerBox( Q::TitleBar, rect ); + auto rect = subWindow->subControlContentsRect( contentsRect, Q::TitleBar ); int w = 0; @@ -143,8 +142,7 @@ QRectF QskSubWindowSkinlet::titleRect( { using Q = QskSubWindow; - auto rect = subControlRect( subWindow, contentsRect, Q::TitleBar ); - rect = subWindow->innerBox( Q::TitleBar, rect ); + auto rect = subWindow->subControlContentsRect( contentsRect, Q::TitleBar ); if ( !rect.isEmpty() ) { diff --git a/src/controls/QskTabButton.cpp b/src/controls/QskTabButton.cpp index adbf0800..27d5c83d 100644 --- a/src/controls/QskTabButton.cpp +++ b/src/controls/QskTabButton.cpp @@ -89,7 +89,7 @@ QskTextOptions QskTabButton::textOptions() const QRectF QskTabButton::layoutRectForSize( const QSizeF& size ) const { - return innerBox( Panel, subControlRect( size, Panel ) ); + return subControlContentsRect( size, Panel ); } QskAspect::Placement QskTabButton::effectivePlacement() const diff --git a/src/controls/QskTabButtonSkinlet.cpp b/src/controls/QskTabButtonSkinlet.cpp index 2df6e976..1a6c97d0 100644 --- a/src/controls/QskTabButtonSkinlet.cpp +++ b/src/controls/QskTabButtonSkinlet.cpp @@ -20,14 +20,9 @@ QskTabButtonSkinlet::~QskTabButtonSkinlet() = default; QRectF QskTabButtonSkinlet::subControlRect( const QskSkinnable* skinnable, const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const { - auto tabButton = static_cast< const QskTabButton* >( skinnable ); - if ( subControl == QskTabButton::Text ) { - auto r = subControlRect( tabButton, contentsRect, QskTabButton::Panel ); - r = tabButton->innerBox( QskTabButton::Panel, r ); - - return r; + return skinnable->subControlContentsRect( contentsRect, QskTabButton::Panel ); } else if ( subControl == QskTabButton::Panel ) { diff --git a/src/controls/QskTabView.cpp b/src/controls/QskTabView.cpp index 8da2a14f..52cc5329 100644 --- a/src/controls/QskTabView.cpp +++ b/src/controls/QskTabView.cpp @@ -320,13 +320,10 @@ void QskTabView::updateLayout() if ( maybeUnresized() ) return; - m_data->tabBar->setGeometry( subControlRect( TabBar ) ); + const auto cr = contentsRect(); -#if 1 - m_data->stackBox->setGeometry( subControlRect( Page ) ); -#else - m_data->stackBox->setGeometry( innerBox( Page, subControlRect( Page ) ) ); -#endif + m_data->tabBar->setGeometry( subControlRect( cr, TabBar ) ); + m_data->stackBox->setGeometry( subControlContentsRect( cr, Page ) ); } #include "moc_QskTabView.cpp" diff --git a/src/controls/QskTextInputSkinlet.cpp b/src/controls/QskTextInputSkinlet.cpp index 35f9b274..15427718 100644 --- a/src/controls/QskTextInputSkinlet.cpp +++ b/src/controls/QskTextInputSkinlet.cpp @@ -25,8 +25,7 @@ QRectF QskTextInputSkinlet::subControlRect( const QskSkinnable* skinnable, } else if ( subControl == QskTextInput::Text ) { - const auto r = subControlRect( skinnable, contentsRect, QskTextInput::Panel ); - return skinnable->innerBox( QskTextInput::Panel, r ); + return skinnable->subControlContentsRect( contentsRect, QskTextInput::Panel ); } return Inherited::subControlRect( skinnable, contentsRect, subControl ); diff --git a/src/controls/QskTextLabelSkinlet.cpp b/src/controls/QskTextLabelSkinlet.cpp index 229afc49..618ff788 100644 --- a/src/controls/QskTextLabelSkinlet.cpp +++ b/src/controls/QskTextLabelSkinlet.cpp @@ -23,19 +23,16 @@ QskTextLabelSkinlet::~QskTextLabelSkinlet() = default; QRectF QskTextLabelSkinlet::subControlRect( const QskSkinnable* skinnable, const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const { - const auto label = static_cast< const QskTextLabel* >( skinnable ); - if ( subControl == QskTextLabel::Panel ) { return contentsRect; } else if ( subControl == QskTextLabel::Text ) { + const auto label = static_cast< const QskTextLabel* >( skinnable ); + if ( label->hasPanel() ) - { - auto r = subControlRect( label, contentsRect, QskTextLabel::Panel ); - return label->innerBox( QskTextLabel::Panel, r ); - } + return label->subControlContentsRect( contentsRect, QskTextLabel::Panel ); return contentsRect; }