From 03e24d5feae58fc8bf69bdd4aab7ec2cdcee1f12 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Sat, 21 Jan 2023 14:45:59 +0100 Subject: [PATCH] push button: Support more alignments of icon and text --- skins/material3/QskMaterial3Skin.cpp | 4 -- src/controls/QskPushButtonSkinlet.cpp | 3 ++ src/layouts/QskSubcontrolLayoutEngine.cpp | 48 +++++++++++++++++++++++ src/layouts/QskSubcontrolLayoutEngine.h | 2 + 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/skins/material3/QskMaterial3Skin.cpp b/skins/material3/QskMaterial3Skin.cpp index 23e3bef9..9dd14c73 100644 --- a/skins/material3/QskMaterial3Skin.cpp +++ b/skins/material3/QskMaterial3Skin.cpp @@ -561,10 +561,8 @@ void Editor::setupPushButton() setStrutSize( Q::Panel, -1, 40_dp ); setSpacing( Q::Panel, 8_dp ); setPadding( Q::Panel, { 24_dp, 0, 24_dp, 0 } ); - setBoxShape( Q::Panel, 100, Qt::RelativeSize ); - setAlignment( Q::Graphic, Qt::AlignCenter ); setStrutSize( Q::Graphic, 18_dp, 18_dp ); setPadding( Q::Graphic, { 0, 0, 8_dp, 0 } ); setGraphicRole( Q::Graphic, QskMaterial3Skin::GraphicRoleOnPrimary ); @@ -572,8 +570,6 @@ void Editor::setupPushButton() setFontRole( Q::Text, QskMaterial3Skin::M3LabelLarge ); setPadding( Q::Text, 0 ); - setAlignment( Q::Text, Qt::AlignCenter ); - // normal buttons (i.e. Filled): setGradient( Q::Panel, m_pal.primary ); diff --git a/src/controls/QskPushButtonSkinlet.cpp b/src/controls/QskPushButtonSkinlet.cpp index 99ea036f..cac78a33 100644 --- a/src/controls/QskPushButtonSkinlet.cpp +++ b/src/controls/QskPushButtonSkinlet.cpp @@ -37,6 +37,9 @@ namespace setGraphicTextElements( button, QskPushButton::Text, button->text(), QskPushButton::Graphic, button->graphic().defaultSize() ); + + const auto alignment = button->alignmentHint( QskPushButton::Panel, Qt::AlignCenter ); + setFixedContent( QskPushButton::Text, Qt::Horizontal, alignment ); } }; } diff --git a/src/layouts/QskSubcontrolLayoutEngine.cpp b/src/layouts/QskSubcontrolLayoutEngine.cpp index 3d17bef8..3c594f1e 100644 --- a/src/layouts/QskSubcontrolLayoutEngine.cpp +++ b/src/layouts/QskSubcontrolLayoutEngine.cpp @@ -407,6 +407,54 @@ void QskSubcontrolLayoutEngine::setGraphicTextElements( const QskSkinnable* skin } } +void QskSubcontrolLayoutEngine::setFixedContent( QskAspect::Subcontrol subcontrol, Qt::Orientation orientation, Qt::Alignment alignment ) +{ + if( auto* e = element( subcontrol ) ) + { + e->setSizePolicy( QskSizePolicy::Fixed, e->sizePolicy().verticalPolicy() ); + } + + Qt::Edges extraSpacing; + + switch( orientation ) + { + case Qt::Horizontal: + extraSpacing |= ( extraSpacingAt() & ( Qt::TopEdge | Qt::BottomEdge ) ); + + if( alignment & Qt::AlignLeft ) + { + extraSpacing |= Qt::RightEdge; + } + else if( alignment & Qt::AlignRight ) + { + extraSpacing |= Qt::LeftEdge; + } + else if( alignment & Qt::AlignHCenter ) + { + extraSpacing |= Qt::LeftEdge | Qt::RightEdge; + } + break; + case Qt::Vertical: + extraSpacing |= ( extraSpacingAt() & ( Qt::LeftEdge | Qt::RightEdge ) ); + + if( alignment & Qt::AlignTop ) + { + extraSpacing |= Qt::BottomEdge; + } + else if( alignment & Qt::AlignBottom ) + { + extraSpacing |= Qt::TopEdge; + } + else if( alignment & Qt::AlignVCenter ) + { + extraSpacing |= Qt::TopEdge | Qt::BottomEdge; + } + break; + } + + setExtraSpacingAt( extraSpacing ); +} + void QskSubcontrolLayoutEngine::addElement( LayoutElement* element ) { m_data->elements += element; diff --git a/src/layouts/QskSubcontrolLayoutEngine.h b/src/layouts/QskSubcontrolLayoutEngine.h index 8c3340d0..c4fa4cb0 100644 --- a/src/layouts/QskSubcontrolLayoutEngine.h +++ b/src/layouts/QskSubcontrolLayoutEngine.h @@ -127,6 +127,8 @@ class QskSubcontrolLayoutEngine : public QskLayoutEngine2D QskAspect::Subcontrol, const QString& text, QskAspect::Subcontrol, const QSizeF& graphicSize ); + void setFixedContent( QskAspect::Subcontrol, Qt::Orientation, Qt::Alignment ); + QRectF subControlRect( QskAspect::Subcontrol ) const; private: