diff --git a/designsystems/fluent2/QskFluent2Skin.cpp b/designsystems/fluent2/QskFluent2Skin.cpp index 932d0b2d..64bd1cc6 100644 --- a/designsystems/fluent2/QskFluent2Skin.cpp +++ b/designsystems/fluent2/QskFluent2Skin.cpp @@ -299,9 +299,6 @@ namespace void setupTabViewMetrics(); void setupTabViewColors( QskAspect::Section, const QskFluent2Theme& ); - void setupTextInputMetrics(); - void setupTextInputColors( QskAspect::Section, const QskFluent2Theme& ); - void setupTextAreaMetrics(); void setupTextAreaColors( QskAspect::Section, const QskFluent2Theme& ); @@ -364,7 +361,6 @@ void Editor::setupMetrics() setupTabButtonMetrics(); setupTabBarMetrics(); setupTabViewMetrics(); - setupTextInputMetrics(); setupTextAreaMetrics(); setupTextFieldMetrics(); setupTextLabelMetrics(); @@ -405,7 +401,6 @@ void Editor::setupColors( QskAspect::Section section, const QskFluent2Theme& the setupTabButtonColors( section, theme ); setupTabBarColors( section, theme ); setupTabViewColors( section, theme ); - setupTextInputColors( section, theme ); setupTextAreaColors( section, theme ); setupTextFieldColors( section, theme ); setupTextLabelColors( section, theme ); @@ -1787,33 +1782,11 @@ void Editor::setupTextLabelColors( setColor( Q::Text | section, pal.fillColor.text.primary ); } -void Editor::setupTextInputMetrics() -{ - using Q = QskAbstractTextInput; - setFontRole( Q::Text, Fluent2::Body ); -} - -void Editor::setupTextInputColors( - QskAspect::Section section, const QskFluent2Theme& theme ) -{ - using Q = QskAbstractTextInput; - - const auto& pal = theme.palette; - - const auto text = Q::Text | section; - -#if 1 - setColor( text, pal.fillColor.text.primary ); - setColor( text | Q::Selected, pal.fillColor.textOnAccent.selectedText ); - setColor( text | Q::Disabled, pal.fillColor.text.disabled ); -#endif -} - void Editor::setupTextAreaMetrics() { using Q = QskTextArea; - // === + setFontRole( Q::Text, Fluent2::Body ); setStrutSize( Q::TextPanel, { -1, 30_px } ); setPadding( Q::TextPanel, { 11_px, 0, 11_px, 0 } ); @@ -1836,6 +1809,14 @@ void Editor::setupTextAreaColors( const auto& pal = theme.palette; + const auto text = Q::Text | section; + +#if 1 + setColor( text, pal.fillColor.text.primary ); + setColor( text | Q::Selected, pal.fillColor.textOnAccent.selectedText ); + setColor( text | Q::Disabled, pal.fillColor.text.disabled ); +#endif + setColor( Q::TextPanel | Q::Selected, pal.fillColor.accent.selectedTextBackground ); setColor( Q::Placeholder, pal.fillColor.text.secondary ); @@ -1879,6 +1860,8 @@ void Editor::setupTextFieldMetrics() { using Q = QskTextField; + setFontRole( Q::Text, Fluent2::Body ); + setStrutSize( Q::TextPanel, { -1, 30_px } ); setPadding( Q::TextPanel, { 11_px, 0, 11_px, 0 } ); @@ -1895,11 +1878,20 @@ void Editor::setupTextFieldMetrics() void Editor::setupTextFieldColors( QskAspect::Section section, const QskFluent2Theme& theme ) { - using A = QskAspect; using Q = QskTextField; + using A = QskAspect; + using W = QskFluent2Skin; const auto& pal = theme.palette; + const auto text = Q::Text | section; + +#if 1 + setColor( text, pal.fillColor.text.primary ); + setColor( text | Q::Selected, pal.fillColor.textOnAccent.selectedText ); + setColor( text | Q::Disabled, pal.fillColor.text.disabled ); +#endif + setColor( Q::TextPanel | Q::Selected, pal.fillColor.accent.selectedTextBackground ); setColor( Q::Placeholder, pal.fillColor.text.secondary ); diff --git a/designsystems/fusion/QskFusionSkin.cpp b/designsystems/fusion/QskFusionSkin.cpp index 2e19ec60..4dd17a66 100644 --- a/designsystems/fusion/QskFusionSkin.cpp +++ b/designsystems/fusion/QskFusionSkin.cpp @@ -143,7 +143,6 @@ namespace Q_INVOKABLE void setupTabBar(); Q_INVOKABLE void setupTabView(); - Q_INVOKABLE void setupTextInput(); Q_INVOKABLE void setupTextArea(); Q_INVOKABLE void setupTextField(); Q_INVOKABLE void setupTextLabel(); @@ -386,9 +385,9 @@ void Editor::setupTextLabel() setBoxBorderColors( Q::Panel, QskRgb::lighter( m_pal.outline, 108 ) ); } -void Editor::setupTextInput() +void Editor::setupTextField() { - using Q = QskAbstractTextInput; + using Q = QskTextField; using A = QskAspect; using P = QPalette; @@ -399,19 +398,10 @@ void Editor::setupTextInput() setColor( Q::Text | state, m_pal.color( colorGroup, P::Text ) ); setColor( Q::Text | Q::Selected | state, m_pal.color( colorGroup, P::HighlightedText ) ); } -} - -void Editor::setupTextField() -{ - using Q = QskTextField; + setAlignment( Q::Text, Qt::AlignLeft | Qt::AlignVCenter ); setAlignment( Q::Placeholder, Qt::AlignLeft | Qt::AlignVCenter ); - // === - - using A = QskAspect; - using P = QPalette; - for ( auto state : { A::NoState, Q::Disabled } ) { const auto colorGroup = ( state == A::NoState ) ? P::Active : P::Disabled; @@ -419,6 +409,8 @@ void Editor::setupTextField() setColor( Q::TextPanel | state, m_pal.color( colorGroup, P::Base ) ); setColor( Q::TextPanel | Q::Selected | state, m_pal.color( colorGroup, P::Highlight ) ); + setColor( Q::Text | state, m_pal.color( colorGroup, P::Text ) ); + setColor( Q::Text | Q::Selected | state, m_pal.color( colorGroup, P::HighlightedText ) ); setColor( Q::Placeholder, m_pal.color( colorGroup, P::PlaceholderText ) ); } @@ -438,14 +430,19 @@ void Editor::setupTextField() void Editor::setupTextArea() { using Q = QskTextArea; - - setAlignment( Q::Placeholder, Qt::AlignLeft | Qt::AlignTop ); - - // ======== - using A = QskAspect; using P = QPalette; + for ( auto state : { A::NoState, Q::Disabled } ) + { + const auto colorGroup = ( state == A::NoState ) ? P::Active : P::Disabled; + + setColor( Q::Text | state, m_pal.color( colorGroup, P::Text ) ); + setColor( Q::Text | Q::Selected | state, m_pal.color( colorGroup, P::HighlightedText ) ); + } + + setAlignment( Q::Placeholder, Qt::AlignLeft | Qt::AlignTop ); + for ( auto state : { A::NoState, Q::Disabled } ) { const auto colorGroup = ( state == A::NoState ) ? P::Active : P::Disabled; diff --git a/designsystems/material3/QskMaterial3Skin.cpp b/designsystems/material3/QskMaterial3Skin.cpp index fbe80e23..c4b78be1 100644 --- a/designsystems/material3/QskMaterial3Skin.cpp +++ b/designsystems/material3/QskMaterial3Skin.cpp @@ -187,7 +187,6 @@ namespace Q_INVOKABLE void setupTabBar(); Q_INVOKABLE void setupTabView(); - Q_INVOKABLE void setupTextInput(); Q_INVOKABLE void setupTextArea(); Q_INVOKABLE void setupTextField(); Q_INVOKABLE void setupTextLabel(); @@ -435,20 +434,13 @@ void Editor::setupTextLabel() setPadding( Q::Panel, 5_px ); } -void Editor::setupTextInput() -{ - using Q = QskAbstractTextInput; - - setColor( Q::Text, m_pal.onSurface ); - setFontRole( Q::Text, BodyLarge ); - setColor( Q::Text | Q::Disabled, m_pal.onSurface38 ); -} - void Editor::setupTextArea() { using Q = QskTextArea; - // ========== + setColor( Q::Text, m_pal.onSurface ); + setFontRole( Q::Text, BodyLarge ); + setColor( Q::Text | Q::Disabled, m_pal.onSurface38 ); setStrutSize( Q::Panel, -1.0, 56_px ); setPadding( Q::Panel, { 12_px, 8_px, 12_px, 8_px } ); @@ -487,6 +479,10 @@ void Editor::setupTextField() { using Q = QskTextField; + setColor( Q::Text, m_pal.onSurface ); + setFontRole( Q::Text, BodyLarge ); + setColor( Q::Text | Q::Disabled, m_pal.onSurface38 ); + setStrutSize( Q::Panel, -1.0, 56_px ); setPadding( Q::Panel, { 12_px, 8_px, 12_px, 8_px } ); setGradient( Q::Panel, m_pal.surfaceVariant ); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 63c5dd30..7fde8b5e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -198,7 +198,6 @@ endif() list(APPEND HEADERS controls/QskAbstractButton.h controls/QskAbstractTextInput.h - controls/QskAbstractTextInputSkinlet.h controls/QskAnimationHint.h controls/QskAnimator.h controls/QskMainView.h @@ -307,7 +306,6 @@ list(APPEND PRIVATE_HEADERS list(APPEND SOURCES controls/QskAbstractButton.cpp controls/QskAbstractTextInput.cpp - controls/QskAbstractTextInputSkinlet.cpp controls/QskAnimator.cpp controls/QskAnimationHint.cpp controls/QskMainView.cpp diff --git a/src/controls/QskAbstractTextInput.cpp b/src/controls/QskAbstractTextInput.cpp index da22e3ea..08396a33 100644 --- a/src/controls/QskAbstractTextInput.cpp +++ b/src/controls/QskAbstractTextInput.cpp @@ -705,7 +705,9 @@ Qt::Alignment QskAbstractTextInput::alignment() const void QskAbstractTextInput::updateLayout() { QMetaObject::invokeMethod( m_data->input, "updateMetrics" ); - qskSetItemGeometry( m_data->input, subControlRect( Text ) ); + + const auto subControl = effectiveSubcontrol( Text ); + qskSetItemGeometry( m_data->input, subControlRect( subControl ) ); } void QskAbstractTextInput::updateNode( QSGNode* node ) diff --git a/src/controls/QskAbstractTextInputSkinlet.cpp b/src/controls/QskAbstractTextInputSkinlet.cpp deleted file mode 100644 index e06bec98..00000000 --- a/src/controls/QskAbstractTextInputSkinlet.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) The authors - * SPDX-License-Identifier: BSD-3-Clause - *****************************************************************************/ - -#include "QskAbstractTextInputSkinlet.h" -#include "QskAbstractTextInput.h" - -using Q = QskAbstractTextInput; - -QskAbstractTextInputSkinlet::QskAbstractTextInputSkinlet( QskSkin* skin ) - : Inherited( skin ) -{ - setNodeRoles( { TextPanelRole } ); -} - -QskAbstractTextInputSkinlet::~QskAbstractTextInputSkinlet() -{ -} - -QRectF QskAbstractTextInputSkinlet::subControlRect( const QskSkinnable* skinnable, - const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const -{ - if ( subControl == Q::TextPanel ) - return contentsRect; - - if ( subControl == Q::Text ) - { - auto rect = skinnable->subControlContentsRect( contentsRect, Q::TextPanel ); - rect = rect.marginsAdded( skinnable->marginHint( Q::Text ) ); - - return rect; - } - - return Inherited::subControlRect( skinnable, contentsRect, subControl ); -} - -QSGNode* QskAbstractTextInputSkinlet::updateSubNode( - const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const -{ - switch ( nodeRole ) - { - case TextPanelRole: - return updateBoxNode( skinnable, node, Q::TextPanel ); - } - - return Inherited::updateSubNode( skinnable, nodeRole, node ); -} - -QSizeF QskAbstractTextInputSkinlet::sizeHint( const QskSkinnable* skinnable, - Qt::SizeHint which, const QSizeF& constraint ) const -{ - if ( which != Qt::PreferredSize ) - return QSizeF(); - - Q_UNUSED( constraint ); // TODO ... - - const auto input = static_cast< const QskAbstractTextInput* >( skinnable ); - - auto hint = input->unwrappedTextSize(); - hint = input->outerBoxSize( Q::TextPanel, hint ); - hint = hint.expandedTo( input->strutSizeHint( Q::TextPanel ) ); - - return hint; -} - -#include "moc_QskAbstractTextInputSkinlet.cpp" diff --git a/src/controls/QskAbstractTextInputSkinlet.h b/src/controls/QskAbstractTextInputSkinlet.h deleted file mode 100644 index 31ad4987..00000000 --- a/src/controls/QskAbstractTextInputSkinlet.h +++ /dev/null @@ -1,38 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) The authors - * SPDX-License-Identifier: BSD-3-Clause - *****************************************************************************/ - -#ifndef QSK_ABSTRACT_TEXT_INPUT_SKINLET_H -#define QSK_ABSTRACT_TEXT_INPUT_SKINLET_H - -#include "QskSkinlet.h" - -class QSK_EXPORT QskAbstractTextInputSkinlet : public QskSkinlet -{ - Q_GADGET - - using Inherited = QskSkinlet; - - public: - enum NodeRole : quint8 - { - TextPanelRole, - RoleCount - }; - - Q_INVOKABLE QskAbstractTextInputSkinlet( QskSkin* = nullptr ); - ~QskAbstractTextInputSkinlet() override; - - 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; -}; - -#endif diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index 92bc9e5a..1b4a73e7 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -25,9 +25,6 @@ #include -#include "QskAbstractTextInput.h" -#include "QskAbstractTextInputSkinlet.h" - #include "QskBox.h" #include "QskBoxSkinlet.h" @@ -194,7 +191,6 @@ QskSkin::QskSkin( QObject* parent ) { declareSkinlet< QskControl, QskSkinlet >(); - declareSkinlet< QskAbstractTextInput, QskAbstractTextInputSkinlet >(); declareSkinlet< QskBox, QskBoxSkinlet >(); declareSkinlet< QskCheckBox, QskCheckBoxSkinlet >(); declareSkinlet< QskComboBox, QskComboBoxSkinlet >(); diff --git a/src/controls/QskTextAreaSkinlet.cpp b/src/controls/QskTextAreaSkinlet.cpp index 5401bee2..1aa31909 100644 --- a/src/controls/QskTextAreaSkinlet.cpp +++ b/src/controls/QskTextAreaSkinlet.cpp @@ -11,7 +11,7 @@ using Q = QskTextArea; QskTextAreaSkinlet::QskTextAreaSkinlet( QskSkin* skin ) : Inherited( skin ) { - setNodeRoles( { PanelRole, TextPanelRole, PlaceholderTextRole } ); + setNodeRoles( { PanelRole, TextPanelRole, PlaceholderRole } ); } QskTextAreaSkinlet::~QskTextAreaSkinlet() @@ -27,6 +27,9 @@ QRectF QskTextAreaSkinlet::subControlRect( const QskSkinnable* skinnable, if ( subControl == Q::TextPanel ) return skinnable->subControlContentsRect( contentsRect, Q::Panel ); + if ( subControl == Q::Text ) + return skinnable->subControlContentsRect( contentsRect, Q::TextPanel ); + if ( subControl == Q::Placeholder ) { const auto textArea = static_cast< const QskTextArea* >( skinnable ); @@ -50,8 +53,11 @@ QSGNode* QskTextAreaSkinlet::updateSubNode( { return updateBoxNode( skinnable, node, Q::Panel ); } - - case PlaceholderTextRole: + case TextPanelRole: + { + return updateBoxNode( skinnable, node, Q::TextPanel ); + } + case PlaceholderRole: { const auto text = effectivePlaceholderText( textArea ); if ( text.isEmpty() ) @@ -78,10 +84,19 @@ QSGNode* QskTextAreaSkinlet::updateSubNode( QSizeF QskTextAreaSkinlet::sizeHint( const QskSkinnable* skinnable, Qt::SizeHint which, const QSizeF& constraint ) const { + Q_UNUSED( constraint ); // TODO ... + if ( which != Qt::PreferredSize ) return QSizeF(); - auto hint = Inherited::sizeHint( skinnable, which, constraint ); + const auto input = static_cast< const QskAbstractTextInput* >( skinnable ); + + auto hint = input->unwrappedTextSize(); + hint = hint.grownBy( skinnable->marginHint( Q::Text ) ); + + hint = input->outerBoxSize( Q::TextPanel, hint ); + hint = hint.expandedTo( input->strutSizeHint( Q::TextPanel ) ); + hint = skinnable->outerBoxSize( Q::Panel, hint ); hint = hint.expandedTo( skinnable->strutSizeHint( Q::Panel ) ); diff --git a/src/controls/QskTextAreaSkinlet.h b/src/controls/QskTextAreaSkinlet.h index ec38f2bd..00008063 100644 --- a/src/controls/QskTextAreaSkinlet.h +++ b/src/controls/QskTextAreaSkinlet.h @@ -6,22 +6,23 @@ #ifndef QSK_TEXT_AREA_SKINLET_H #define QSK_TEXT_AREA_SKINLET_H -#include "QskAbstractTextInputSkinlet.h" +#include "QskSkinlet.h" class QskTextArea; -class QSK_EXPORT QskTextAreaSkinlet : public QskAbstractTextInputSkinlet +class QSK_EXPORT QskTextAreaSkinlet : public QskSkinlet { Q_GADGET - using Inherited = QskAbstractTextInputSkinlet; + using Inherited = QskSkinlet; public: enum NodeRole : quint8 { - PanelRole = Inherited::RoleCount, + PanelRole, + TextPanelRole, + PlaceholderRole, - PlaceholderTextRole, RoleCount }; diff --git a/src/controls/QskTextFieldSkinlet.cpp b/src/controls/QskTextFieldSkinlet.cpp index 9a112ef7..b070e580 100644 --- a/src/controls/QskTextFieldSkinlet.cpp +++ b/src/controls/QskTextFieldSkinlet.cpp @@ -27,6 +27,9 @@ QRectF QskTextFieldSkinlet::subControlRect( const QskSkinnable* skinnable, if ( subControl == Q::TextPanel ) return skinnable->subControlContentsRect( contentsRect, Q::Panel ); + if ( subControl == Q::Text ) + return skinnable->subControlContentsRect( contentsRect, Q::TextPanel ); + if ( subControl == Q::Placeholder ) { const auto textField = static_cast< const QskTextField* >( skinnable ); @@ -50,7 +53,10 @@ QSGNode* QskTextFieldSkinlet::updateSubNode( { return updateBoxNode( skinnable, node, Q::Panel ); } - + case TextPanelRole: + { + return updateBoxNode( skinnable, node, Q::TextPanel ); + } case PlaceholderRole: { const auto text = effectivePlaceholderText( textField ); @@ -78,10 +84,19 @@ QSGNode* QskTextFieldSkinlet::updateSubNode( QSizeF QskTextFieldSkinlet::sizeHint( const QskSkinnable* skinnable, Qt::SizeHint which, const QSizeF& constraint ) const { + Q_UNUSED( constraint ); // TODO ... + if ( which != Qt::PreferredSize ) return QSizeF(); - auto hint = Inherited::sizeHint( skinnable, which, constraint ); + const auto input = static_cast< const QskAbstractTextInput* >( skinnable ); + + auto hint = input->unwrappedTextSize(); + hint = hint.grownBy( skinnable->marginHint( Q::Text ) ); + + hint = input->outerBoxSize( Q::TextPanel, hint ); + hint = hint.expandedTo( input->strutSizeHint( Q::TextPanel ) ); + hint = skinnable->outerBoxSize( Q::Panel, hint ); hint = hint.expandedTo( skinnable->strutSizeHint( Q::Panel ) ); diff --git a/src/controls/QskTextFieldSkinlet.h b/src/controls/QskTextFieldSkinlet.h index 82b6072e..d5cb3b7d 100644 --- a/src/controls/QskTextFieldSkinlet.h +++ b/src/controls/QskTextFieldSkinlet.h @@ -6,21 +6,21 @@ #ifndef QSK_TEXT_FIELD_SKINLET_H #define QSK_TEXT_FIELD_SKINLET_H -#include "QskAbstractTextInputSkinlet.h" +#include "QskSkinlet.h" class QskTextField; -class QSK_EXPORT QskTextFieldSkinlet : public QskAbstractTextInputSkinlet +class QSK_EXPORT QskTextFieldSkinlet : public QskSkinlet { Q_GADGET - using Inherited = QskAbstractTextInputSkinlet; + using Inherited = QskSkinlet; public: enum NodeRole : quint8 { - PanelRole = QskAbstractTextInputSkinlet::RoleCount, - + PanelRole, + TextPanelRole, PlaceholderRole, RoleCount };