QskAbstractTextInputSkinlet removed as it does not work well in

combination with subcontrol substitution
This commit is contained in:
Uwe Rathmann 2025-02-04 14:28:25 +01:00
parent 8dffb14aeb
commit 4462815617
12 changed files with 93 additions and 186 deletions

View File

@ -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 );

View File

@ -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;

View File

@ -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 );

View File

@ -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

View File

@ -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 )

View File

@ -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"

View File

@ -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

View File

@ -25,9 +25,6 @@
#include <cmath>
#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 >();

View File

@ -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 ) );

View File

@ -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
};

View File

@ -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 ) );

View File

@ -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
};