diff --git a/src/controls/QskTextField.cpp b/src/controls/QskTextField.cpp index 029ca222..031b5c72 100644 --- a/src/controls/QskTextField.cpp +++ b/src/controls/QskTextField.cpp @@ -233,10 +233,10 @@ namespace void TextInput::updateMetrics() { - auto input = static_cast< const QskTextField* >( parentItem() ); + auto textField = static_cast< const QskTextField* >( parentItem() ); - setAlignment( input->alignment() ); - setFont( input->font() ); + setAlignment( textField->alignment() ); + setFont( textField->font() ); } void TextInput::updateColors() @@ -490,32 +490,10 @@ void QskTextField::focusOutEvent( QFocusEvent* event ) Inherited::focusOutEvent( event ); } -QSizeF QskTextField::layoutSizeHint( Qt::SizeHint which, const QSizeF& ) const -{ - if ( which != Qt::PreferredSize ) - return QSizeF(); - - auto input = m_data->textInput; - - input->updateMetrics(); - - QSizeF hint( input->implicitWidth(), input->implicitHeight() ); - - if ( m_data->hasPanel ) - { - hint = outerBoxSize( Panel, hint ); - hint = hint.expandedTo( strutSizeHint( Panel ) ); - } - - return hint; -} - void QskTextField::updateLayout() { - auto input = m_data->textInput; - - input->updateMetrics(); - qskSetItemGeometry( input, subControlRect( Text ) ); + m_data->textInput->updateMetrics(); + qskSetItemGeometry( m_data->textInput, subControlRect( Text ) ); } void QskTextField::updateNode( QSGNode* node ) diff --git a/src/controls/QskTextField.h b/src/controls/QskTextField.h index 16e08bfe..47ac596b 100644 --- a/src/controls/QskTextField.h +++ b/src/controls/QskTextField.h @@ -209,8 +209,6 @@ class QSK_EXPORT QskTextField : public QskControl void keyPressEvent( QKeyEvent* ) override; void keyReleaseEvent( QKeyEvent* ) override; - QSizeF layoutSizeHint( Qt::SizeHint, const QSizeF& ) const override; - void updateLayout() override; void updateNode( QSGNode* ) override; diff --git a/src/controls/QskTextFieldSkinlet.cpp b/src/controls/QskTextFieldSkinlet.cpp index ae84c7be..c0809a3c 100644 --- a/src/controls/QskTextFieldSkinlet.cpp +++ b/src/controls/QskTextFieldSkinlet.cpp @@ -6,6 +6,8 @@ #include "QskTextFieldSkinlet.h" #include "QskTextField.h" +#include + using Q = QskTextField; QSK_SYSTEM_STATE( QskTextFieldSkinlet, Selected, QskAspect::FirstUserState >> 1 ) @@ -67,4 +69,25 @@ QSGNode* QskTextFieldSkinlet::updateSubNode( return Inherited::updateSubNode( skinnable, nodeRole, node ); } +QSizeF QskTextFieldSkinlet::sizeHint( const QskSkinnable* skinnable, + Qt::SizeHint which, const QSizeF& ) const +{ + if ( which != Qt::PreferredSize ) + return QSizeF(); + + const auto textField = static_cast< const QskTextField* >( skinnable ); + + const QFontMetricsF fm( textField->effectiveFont( Q::Text ) ); + + auto hint = fm.size( Qt::TextSingleLine | Qt::TextExpandTabs, textField->text() ); + + if ( textField->hasPanel() ) + { + hint = textField->outerBoxSize( Q::Panel, hint ); + hint = hint.expandedTo( textField->strutSizeHint( Q::Panel ) ); + } + + return hint; +} + #include "moc_QskTextFieldSkinlet.cpp" diff --git a/src/controls/QskTextFieldSkinlet.h b/src/controls/QskTextFieldSkinlet.h index cbfbc5c8..72a41864 100644 --- a/src/controls/QskTextFieldSkinlet.h +++ b/src/controls/QskTextFieldSkinlet.h @@ -30,6 +30,9 @@ class QSK_EXPORT QskTextFieldSkinlet : public QskSkinlet QRectF subControlRect( const QskSkinnable*, const QRectF& rect, QskAspect::Subcontrol ) const override; + QSizeF sizeHint( const QskSkinnable*, + Qt::SizeHint, const QSizeF& ) const override; + protected: QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* ) const override;