From 896145ac1170b92bd4807474353b70c71d463328 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 25 Aug 2022 09:39:33 +0200 Subject: [PATCH] QskTextOptions as skin hints --- examples/iotdashboard/LightDisplaySkinlet.cpp | 6 +- examples/mycontrols/MyToggleButtonSkinlet.cpp | 6 +- skins/material3/QskMaterial3Skin.cpp | 7 ++ skins/squiek/QskSquiekSkin.cpp | 10 +++ src/common/QskAspect.h | 2 + src/common/QskTextOptions.cpp | 7 ++ src/controls/QskCheckBoxSkinlet.cpp | 5 +- src/controls/QskListView.cpp | 7 +- src/controls/QskListViewSkinlet.cpp | 2 +- src/controls/QskMenu.cpp | 9 +-- src/controls/QskMenuSkinlet.cpp | 4 +- src/controls/QskPushButton.cpp | 21 +++-- src/controls/QskPushButton.h | 3 +- src/controls/QskPushButtonSkinlet.cpp | 4 +- src/controls/QskSegmentedBar.cpp | 11 +-- src/controls/QskSegmentedBarSkinlet.cpp | 2 +- src/controls/QskSkinHintTableEditor.cpp | 33 ++++++++ src/controls/QskSkinHintTableEditor.h | 13 ++++ src/controls/QskSkinlet.cpp | 9 +-- src/controls/QskSkinlet.h | 5 +- src/controls/QskSkinnable.cpp | 20 +++++ src/controls/QskSkinnable.h | 5 ++ src/controls/QskSubWindow.cpp | 11 +-- src/controls/QskSubWindowSkinlet.cpp | 4 +- src/controls/QskTabButton.cpp | 16 ++-- src/controls/QskTabButton.h | 3 +- src/controls/QskTabButtonSkinlet.cpp | 4 +- src/controls/QskTextLabel.cpp | 76 +++++++++---------- src/controls/QskTextLabel.h | 3 +- src/controls/QskTextLabelSkinlet.cpp | 2 +- 30 files changed, 188 insertions(+), 122 deletions(-) diff --git a/examples/iotdashboard/LightDisplaySkinlet.cpp b/examples/iotdashboard/LightDisplaySkinlet.cpp index 44d98e6b..2a4a7f3e 100644 --- a/examples/iotdashboard/LightDisplaySkinlet.cpp +++ b/examples/iotdashboard/LightDisplaySkinlet.cpp @@ -177,17 +177,17 @@ QSGNode* LightDisplaySkinlet::updateSubNode( { const QString valueText = QString::number( display->value(), 'f', 0 ) + QStringLiteral( " %" ); - return updateTextNode( skinnable, node, valueText, {}, + return updateTextNode( skinnable, node, valueText, LightDisplay::ValueText ); } case LeftLabelRole: { - return updateTextNode( skinnable, node, QStringLiteral( "0 " ), {}, + return updateTextNode( skinnable, node, QStringLiteral( "0 " ), LightDisplay::LeftLabel ); } case RightLabelRole: { - return updateTextNode( skinnable, node, QStringLiteral( " 100" ), {}, + return updateTextNode( skinnable, node, QStringLiteral( " 100" ), LightDisplay::RightLabel ); } case KnobRole: diff --git a/examples/mycontrols/MyToggleButtonSkinlet.cpp b/examples/mycontrols/MyToggleButtonSkinlet.cpp index 3add4c40..ed7dab84 100644 --- a/examples/mycontrols/MyToggleButtonSkinlet.cpp +++ b/examples/mycontrols/MyToggleButtonSkinlet.cpp @@ -97,15 +97,13 @@ QSGNode* MyToggleButtonSkinlet::updateSubNode( case CheckedLabelRole: { return updateTextNode( - button, node, button->text( true ), - button->textOptions(), Q::CheckedText ); + button, node, button->text( true ), Q::CheckedText ); } case UncheckedLabelRole: { return updateTextNode( - button, node, button->text( false ), - button->textOptions(), Q::UncheckedText ); + button, node, button->text( false ), Q::UncheckedText ); } case CheckedGraphicRole: diff --git a/skins/material3/QskMaterial3Skin.cpp b/skins/material3/QskMaterial3Skin.cpp index fb7d3da7..d2f9267b 100644 --- a/skins/material3/QskMaterial3Skin.cpp +++ b/skins/material3/QskMaterial3Skin.cpp @@ -216,6 +216,7 @@ void Editor::setupCheckBox() setColor( Q::Indicator | Q::Checked | Q::Disabled, m_pal.onSurface38 ); setColor( Q::Text, m_pal.onBackground ); + setTextOptions( Q::Text, Qt::ElideMiddle, QskTextOptions::NoWrap ); } void Editor::setupBox() @@ -422,11 +423,13 @@ void Editor::setupSegmentedBar() // Text setFontRole( Q::Text, QskMaterial3Skin::M3LabelLarge ); + setTextOptions( Q::Text, Qt::ElideMiddle, QskTextOptions::NoWrap ); setColor( Q::Text, m_pal.onSurface ); setColor( Q::Text | Q::Selected, m_pal.onSecondaryContainer ); setColor( Q::Text | Q::Disabled, m_pal.onSurface38 ); + } { @@ -519,6 +522,8 @@ void Editor::setupPushButton() setColor( Q::Text, m_pal.onPrimary ); setColor( Q::Text | Q::Disabled, m_pal.onSurface38 ); + setTextOptions( Q::Text, Qt::ElideMiddle, QskTextOptions::NoWrap ); + setAnimation( Q::Panel | A::Color, qskDuration ); setAnimation( Q::Panel | A::Metric, qskDuration ); setAnimation( Q::Ripple | A::Color, qskDuration ); @@ -875,6 +880,8 @@ void Editor::setupSubWindow() setColor( Q::TitleBarText, m_pal.onSurface ); setAlignment( Q::TitleBarText, Qt::AlignCenter ); + setTextOptions( Q::TitleBarText, Qt::ElideRight, QskTextOptions::NoWrap ); + for ( auto subControl : { Q::Panel, Q::TitleBarPanel, Q::TitleBarText } ) setAnimation( subControl | A::Color, qskDuration ); diff --git a/skins/squiek/QskSquiekSkin.cpp b/skins/squiek/QskSquiekSkin.cpp index f8a3fef8..21d79194 100644 --- a/skins/squiek/QskSquiekSkin.cpp +++ b/skins/squiek/QskSquiekSkin.cpp @@ -323,6 +323,8 @@ void Editor::setupCheckBox() setColor( Q::Indicator, m_pal.darker200 ); setColor( Q::Indicator | Q::Checked, m_pal.lighter135 ); + setTextOptions( Q::Text, Qt::ElideMiddle, QskTextOptions::NoWrap ); + setFlagHint( Q::Text | Q::Disabled | A::Style, Qsk::Sunken ); setColor( Q::Text, m_pal.themeForeground ); setColor( Q::Text | Q::Disabled, m_pal.darker200 ); @@ -531,6 +533,8 @@ void Editor::setupSegmentedBar() { // Text + setTextOptions( Q::Text, Qt::ElideMiddle, QskTextOptions::NoWrap ); + setColor( Q::Text, m_pal.themeForeground ); setColor( Q::Text | Q::Selected, m_pal.highlightedText ); @@ -599,6 +603,9 @@ void Editor::setupPushButton() setAnimation( Q::Panel | A::Metric, qskDuration ); // Text + + setTextOptions( Q::Text, Qt::ElideMiddle, QskTextOptions::NoWrap ); + setFlagHint( Q::Text | Q::Disabled | A::Style, Qsk::Sunken ); setAlignment( Q::Text, Qt::AlignCenter ); @@ -989,6 +996,9 @@ void Editor::setupSubWindow() setBoxShape( Q::TitleBarPanel, radius, radius, 0, 0, Qt::AbsoluteSize ); // TitleBarText + + setTextOptions( Q::TitleBarText, Qt::ElideRight, QskTextOptions::NoWrap ); + setFontRole( Q::TitleBarText, QskSkin::SmallFont ); setColor( Q::TitleBarText | Q::Focused, m_pal.highlightedText ); setColor( Q::TitleBarText, m_pal.themeForeground ); diff --git a/src/common/QskAspect.h b/src/common/QskAspect.h index 620aeb16..f066d8eb 100644 --- a/src/common/QskAspect.h +++ b/src/common/QskAspect.h @@ -46,6 +46,8 @@ class QSK_EXPORT QskAspect Alignment, Direction, Style, + Option, + GraphicRole, FontRole, diff --git a/src/common/QskTextOptions.cpp b/src/common/QskTextOptions.cpp index c3a3c3c1..98e992e4 100644 --- a/src/common/QskTextOptions.cpp +++ b/src/common/QskTextOptions.cpp @@ -6,6 +6,13 @@ #include "QskTextOptions.h" #include +static void qskRegisterTextOptions() +{ + qRegisterMetaType< QskTextOptions >(); +} + +Q_CONSTRUCTOR_FUNCTION( qskRegisterTextOptions ) + int QskTextOptions::textFlags() const noexcept { int flags = 0; diff --git a/src/controls/QskCheckBoxSkinlet.cpp b/src/controls/QskCheckBoxSkinlet.cpp index 0b13aba8..44ad66a5 100644 --- a/src/controls/QskCheckBoxSkinlet.cpp +++ b/src/controls/QskCheckBoxSkinlet.cpp @@ -146,11 +146,8 @@ QSGNode* QskCheckBoxSkinlet::updateTextNode( const auto rect = checkBox->subControlRect( Q::Text ); const auto alignH = checkBox->layoutMirroring() ? Qt::AlignRight : Qt::AlignLeft; - QskTextOptions textOptions; - textOptions.setElideMode( Qt::ElideMiddle ); - return QskSkinlet::updateTextNode( checkBox, node, rect, alignH | Qt::AlignVCenter, - checkBox->text(), textOptions, QskCheckBox::Text ); + checkBox->text(), QskCheckBox::Text ); } QSizeF QskCheckBoxSkinlet::sizeHint( const QskSkinnable* skinnable, diff --git a/src/controls/QskListView.cpp b/src/controls/QskListView.cpp index 8495cdd3..8e41d1e1 100644 --- a/src/controls/QskListView.cpp +++ b/src/controls/QskListView.cpp @@ -29,7 +29,6 @@ class QskListView::PrivateData { } - QskTextOptions textOptions; bool preferredWidthFromColumns : 1; bool alternatingRowColors : 1; SelectionMode selectionMode : 4; @@ -81,18 +80,16 @@ bool QskListView::alternatingRowColors() const void QskListView::setTextOptions( const QskTextOptions& textOptions ) { - if ( textOptions != m_data->textOptions ) + if ( setTextOptionsHint( Text, textOptions ) ) { - m_data->textOptions = textOptions; updateScrollableSize(); - Q_EMIT textOptionsChanged(); } } QskTextOptions QskListView::textOptions() const { - return m_data->textOptions; + return textOptionsHint( Text ); } void QskListView::setSelectedRow( int row ) diff --git a/src/controls/QskListViewSkinlet.cpp b/src/controls/QskListViewSkinlet.cpp index 8ac0575f..002d8c29 100644 --- a/src/controls/QskListViewSkinlet.cpp +++ b/src/controls/QskListViewSkinlet.cpp @@ -476,7 +476,7 @@ QSGNode* QskListViewSkinlet::updateCellNode( const QskListView* listView, newNode = contentNode; newNode = updateTextNode( listView, newNode, rect, alignment, - value.toString(), listView->textOptions(), QskListView::Text ); + value.toString(), QskListView::Text ); if ( newNode ) setNodeRole( newNode, TextRole ); diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index f7d17f99..39139210 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -60,7 +60,6 @@ class QskMenu::PrivateData QVector< Option > options; QVector< int > separators; - QskTextOptions textOptions; QPointF origin; // current/selected are not well defined yet, TODO ... @@ -188,16 +187,12 @@ QVariantList QskMenu::optionAt( int index ) const void QskMenu::setTextOptions( const QskTextOptions& textOptions ) { - if( textOptions != m_data->textOptions ) - { - m_data->textOptions = textOptions; - update(); - } + setTextOptionsHint( Text, textOptions ); } QskTextOptions QskMenu::textOptions() const { - return m_data->textOptions; + return textOptionsHint( Text ); } void QskMenu::setCurrentIndex( int index ) diff --git a/src/controls/QskMenuSkinlet.cpp b/src/controls/QskMenuSkinlet.cpp index d4e941b8..fe25626a 100644 --- a/src/controls/QskMenuSkinlet.cpp +++ b/src/controls/QskMenuSkinlet.cpp @@ -525,8 +525,8 @@ QSGNode* QskMenuSkinlet::updateSampleNode( const QskSkinnable* skinnable, const auto alignment = menu->alignmentHint( subControl, Qt::AlignVCenter | Qt::AlignLeft ); - return QskSkinlet::updateTextNode( menu, node, rect, alignment, - text, menu->textOptions(), Q::Text ); + return QskSkinlet::updateTextNode( menu, node, rect, + alignment, text, Q::Text ); } if ( subControl == Q::Separator ) diff --git a/src/controls/QskPushButton.cpp b/src/controls/QskPushButton.cpp index 16ee2a0e..e49e4ba9 100644 --- a/src/controls/QskPushButton.cpp +++ b/src/controls/QskPushButton.cpp @@ -29,7 +29,6 @@ class QskPushButton::PrivateData , isCheckable( false ) , isGraphicSourceDirty( false ) { - textOptions.setElideMode( Qt::ElideMiddle ); } void ensureGraphic( const QskPushButton* button ) @@ -44,7 +43,6 @@ class QskPushButton::PrivateData } QString text; - QskTextOptions textOptions; QUrl graphicSource; QskGraphic graphic; @@ -118,22 +116,21 @@ QString QskPushButton::text() const return m_data->text; } -void QskPushButton::setTextOptions( const QskTextOptions& options ) +void QskPushButton::setTextOptions( const QskTextOptions& textOptions ) { - if ( options != m_data->textOptions ) - { - m_data->textOptions = options; - - resetImplicitSize(); - update(); - + if ( setTextOptionsHint( Text, textOptions ) ) Q_EMIT textOptionsChanged(); - } } QskTextOptions QskPushButton::textOptions() const { - return m_data->textOptions; + return textOptionsHint( Text ); +} + +void QskPushButton::resetTextOptions() +{ + if ( resetTextOptionsHint( Text ) ) + Q_EMIT textOptionsChanged(); } QFont QskPushButton::font() const diff --git a/src/controls/QskPushButton.h b/src/controls/QskPushButton.h index 511e0b99..31b83c0d 100644 --- a/src/controls/QskPushButton.h +++ b/src/controls/QskPushButton.h @@ -21,7 +21,7 @@ class QSK_EXPORT QskPushButton : public QskAbstractButton Q_PROPERTY( QFont font READ font ) Q_PROPERTY( QskTextOptions textOptions READ textOptions - WRITE setTextOptions NOTIFY textOptionsChanged ) + WRITE setTextOptions RESET resetTextOptions NOTIFY textOptionsChanged ) Q_PROPERTY( QUrl graphicSource READ graphicSource WRITE setGraphicSource NOTIFY graphicSourceChanged FINAL ) @@ -60,6 +60,7 @@ class QSK_EXPORT QskPushButton : public QskAbstractButton void setTextOptions( const QskTextOptions& ); QskTextOptions textOptions() const; + void resetTextOptions(); void setGraphicStrutSize( const QSizeF& ); QSizeF graphicStrutSize() const; diff --git a/src/controls/QskPushButtonSkinlet.cpp b/src/controls/QskPushButtonSkinlet.cpp index 00127bc6..3b3612cc 100644 --- a/src/controls/QskPushButtonSkinlet.cpp +++ b/src/controls/QskPushButtonSkinlet.cpp @@ -243,8 +243,8 @@ QSGNode* QskPushButtonSkinlet::updateTextNode( const auto alignment = button->alignmentHint( Q::Text, Qt::AlignCenter ); - return QskSkinlet::updateTextNode( button, node, rect, alignment, - button->text(), button->textOptions(), Q::Text ); + return QskSkinlet::updateTextNode( button, node, rect, + alignment, button->text(), Q::Text ); } QSGNode* QskPushButtonSkinlet::updateRippleNode( diff --git a/src/controls/QskSegmentedBar.cpp b/src/controls/QskSegmentedBar.cpp index 2129a48a..d2a95ca0 100644 --- a/src/controls/QskSegmentedBar.cpp +++ b/src/controls/QskSegmentedBar.cpp @@ -60,7 +60,6 @@ class QskSegmentedBar::PrivateData PrivateData( Qt::Orientation orientation ) : orientation( orientation ) { - textOptions.setElideMode( Qt::ElideMiddle ); } void addOption( QskSegmentedBar* bar, const Option& option ) @@ -78,8 +77,6 @@ class QskSegmentedBar::PrivateData QVector< Option > options; - QskTextOptions textOptions; - int selectedIndex = -1; int currentIndex = -1; @@ -132,16 +129,12 @@ Qt::Orientation QskSegmentedBar::orientation() const void QskSegmentedBar::setTextOptions( const QskTextOptions& textOptions ) { - if( textOptions != m_data->textOptions ) - { - m_data->textOptions = textOptions; - update(); - } + setTextOptionsHint( Text, textOptions ); } QskTextOptions QskSegmentedBar::textOptions() const { - return m_data->textOptions; + return textOptionsHint( Text ); } int QskSegmentedBar::addText( const QString& text ) diff --git a/src/controls/QskSegmentedBarSkinlet.cpp b/src/controls/QskSegmentedBarSkinlet.cpp index 93fd7484..33590124 100644 --- a/src/controls/QskSegmentedBarSkinlet.cpp +++ b/src/controls/QskSegmentedBarSkinlet.cpp @@ -331,7 +331,7 @@ QSGNode* QskSegmentedBarSkinlet::updateSampleNode( const QskSkinnable* skinnable const auto text = value.value< QString >(); return QskSkinlet::updateTextNode( bar, node, - rect, alignment, text, bar->textOptions(), Q::Text ); + rect, alignment, text, Q::Text ); } return nullptr; diff --git a/src/controls/QskSkinHintTableEditor.cpp b/src/controls/QskSkinHintTableEditor.cpp index 9c7644c8..b238a0e0 100644 --- a/src/controls/QskSkinHintTableEditor.cpp +++ b/src/controls/QskSkinHintTableEditor.cpp @@ -120,6 +120,11 @@ namespace { return aspect | QskAspect::Shadow; } + + inline QskAspect aspectOption( QskAspect aspect ) + { + return aspect | QskAspect::Option; + } } QskSkinHintTableEditor::QskSkinHintTableEditor( QskSkinHintTable* table ) @@ -572,3 +577,31 @@ QskArcMetrics QskSkinHintTableEditor::arcMetrics( QskAspect aspect ) const { return metricHint< QskArcMetrics >( aspectShape( aspect ) ); } + +void QskSkinHintTableEditor::setTextOptions( QskAspect aspect, + Qt::TextElideMode elideMode, QskTextOptions::WrapMode wrapMode, + QskStateCombination combination ) +{ + QskTextOptions options; + options.setElideMode( elideMode ); + options.setWrapMode( wrapMode ); + + setTextOptions( aspect, options, combination ); +} + +void QskSkinHintTableEditor::setTextOptions( QskAspect aspect, + const QskTextOptions& textOptions, QskStateCombination combination ) +{ + setFlagHint( aspectOption( aspect ), textOptions, combination ); +} + +bool QskSkinHintTableEditor::removeTextOptions( + QskAspect aspect, QskStateCombination combination ) +{ + return removeFlagHint( aspectOption( aspect ), combination ); +} + +QskTextOptions QskSkinHintTableEditor::textOptions( QskAspect aspect ) const +{ + return flagHint< QskTextOptions >( aspectOption( aspect ) ); +} diff --git a/src/controls/QskSkinHintTableEditor.h b/src/controls/QskSkinHintTableEditor.h index 0ed9ac7a..91dac5b4 100644 --- a/src/controls/QskSkinHintTableEditor.h +++ b/src/controls/QskSkinHintTableEditor.h @@ -10,6 +10,7 @@ #include "QskSkinHintTable.h" #include "QskAnimationHint.h" #include "QskStateCombination.h" +#include "QskTextOptions.h" #include #include @@ -272,6 +273,18 @@ class QSK_EXPORT QskSkinHintTableEditor QskArcMetrics arcMetrics( QskAspect ) const; + // text options flag + + void setTextOptions( QskAspect, + Qt::TextElideMode, QskTextOptions::WrapMode, + QskStateCombination = QskStateCombination() ); + + void setTextOptions( QskAspect, + const QskTextOptions&, QskStateCombination = QskStateCombination() ); + + bool removeTextOptions( QskAspect, QskStateCombination = QskStateCombination() ); + QskTextOptions textOptions( QskAspect ) const; + private: QskSkinHintTable* m_table = nullptr; }; diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index c515fab3..a7cf17b7 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -587,13 +587,13 @@ QSGNode* QskSkinlet::updateTextNode( const QskSkinnable* skinnable, QSGNode* QskSkinlet::updateTextNode( const QskSkinnable* skinnable, QSGNode* node, const QRectF& rect, Qt::Alignment alignment, - const QString& text, const QskTextOptions& textOptions, - QskAspect::Subcontrol subControl ) + const QString& text, QskAspect::Subcontrol subControl ) { if ( text.isEmpty() || rect.isEmpty() ) return nullptr; const auto textColors = qskTextColors( skinnable, subControl ); + const auto textOptions = skinnable->textOptionsHint( subControl ); auto textStyle = Qsk::Normal; if ( textColors.styleColor.alpha() == 0 ) @@ -610,14 +610,13 @@ QSGNode* QskSkinlet::updateTextNode( QSGNode* QskSkinlet::updateTextNode( const QskSkinnable* skinnable, QSGNode* node, - const QString& text, const QskTextOptions& textOptions, - QskAspect::Subcontrol subControl ) const + const QString& text, QskAspect::Subcontrol subControl ) const { const auto rect = qskSubControlRect( this, skinnable, subControl ); const auto alignment = skinnable->alignmentHint( subControl, Qt::AlignLeft ); return updateTextNode( skinnable, node, - rect, alignment, text, textOptions, subControl ); + rect, alignment, text, subControl ); } QSGNode* QskSkinlet::updateGraphicNode( diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index b4e4fc34..127af44e 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -107,8 +107,7 @@ class QSK_EXPORT QskSkinlet QskAspect::Subcontrol ); static QSGNode* updateTextNode( const QskSkinnable*, QSGNode*, - const QRectF&, Qt::Alignment, const QString&, const QskTextOptions&, - QskAspect::Subcontrol ); + const QRectF&, Qt::Alignment, const QString&, QskAspect::Subcontrol ); static QSGNode* updateTextNode( const QskSkinnable*, QSGNode*, const QRectF&, Qt::Alignment, const QString&, const QFont&, @@ -154,7 +153,7 @@ class QSK_EXPORT QskSkinlet QskAspect::Subcontrol ) const; QSGNode* updateTextNode( const QskSkinnable*, QSGNode*, - const QString&, const QskTextOptions&, QskAspect::Subcontrol ) const; + const QString&, QskAspect::Subcontrol ) const; QSGNode* updateGraphicNode( const QskSkinnable*, QSGNode*, const QskGraphic&, QskAspect::Subcontrol, diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index fc8871f0..958f0c53 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -25,6 +25,7 @@ #include "QskShadowMetrics.h" #include "QskBoxHints.h" #include "QskGradient.h" +#include "QskTextOptions.h" #include #include @@ -651,6 +652,25 @@ qreal QskSkinnable::spacingHint( return qskMetric< qreal >( this, aspect | QskAspect::Spacing, status ); } +bool QskSkinnable::setTextOptionsHint( + const QskAspect aspect, const QskTextOptions& options ) +{ + return setSkinHint( aspect | QskAspect::Flag | QskAspect::Option, + QVariant::fromValue( options ) ); +} + +bool QskSkinnable::resetTextOptionsHint( const QskAspect aspect ) +{ + return resetFlagHint( aspect | QskAspect::Option ); +} + +QskTextOptions QskSkinnable::textOptionsHint( + const QskAspect aspect, QskSkinHintStatus* status ) const +{ + return effectiveSkinHint( + aspect | QskAspect::Flag | QskAspect::Option, status ).value< QskTextOptions >(); +} + bool QskSkinnable::setFontRoleHint( const QskAspect aspect, int role ) { return qskSetFlag( this, aspect | QskAspect::FontRole, role ); diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index 7a3345f6..397e43de 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -29,6 +29,7 @@ class QskBoxShapeMetrics; class QskBoxBorderMetrics; class QskBoxBorderColors; class QskShadowMetrics; +class QskTextOptions; class QskBoxHints; class QskGradient; @@ -233,6 +234,10 @@ class QSK_EXPORT QskSkinnable bool resetAlignmentHint( QskAspect ); Qt::Alignment alignmentHint( QskAspect, Qt::Alignment = Qt::Alignment() ) const; + bool setTextOptionsHint( QskAspect, const QskTextOptions& ); + bool resetTextOptionsHint( QskAspect ); + QskTextOptions textOptionsHint( QskAspect, QskSkinHintStatus* = nullptr ) const; + bool setFontRoleHint( QskAspect, int role ); bool resetFontRoleHint( QskAspect ); int fontRoleHint( QskAspect, QskSkinHintStatus* = nullptr ) const; diff --git a/src/controls/QskSubWindow.cpp b/src/controls/QskSubWindow.cpp index 4a4c72a2..35e8eb5d 100644 --- a/src/controls/QskSubWindow.cpp +++ b/src/controls/QskSubWindow.cpp @@ -32,11 +32,9 @@ class QskSubWindow::PrivateData PrivateData() : isWindowIconSourceDirty( false ) { - windowTitleTextOptions.setElideMode( Qt::ElideRight ); } QString windowTitle; - QskTextOptions windowTitleTextOptions; QUrl windowIconSource; QskGraphic windowIcon; @@ -110,18 +108,13 @@ QString QskSubWindow::windowTitle() const void QskSubWindow::setWindowTitleTextOptions( const QskTextOptions& options ) { - if ( options != m_data->windowTitleTextOptions ) - { - m_data->windowTitleTextOptions = options; - - update(); + if ( setTextOptionsHint( TitleBarText, options ) ) Q_EMIT windowTitleTextOptionsChanged(); - } } QskTextOptions QskSubWindow::windowTitleTextOptions() const { - return m_data->windowTitleTextOptions; + return textOptionsHint( TitleBarText ); } void QskSubWindow::setWindowIconSource( const QString& url ) diff --git a/src/controls/QskSubWindowSkinlet.cpp b/src/controls/QskSubWindowSkinlet.cpp index 7a94eaf3..df464f23 100644 --- a/src/controls/QskSubWindowSkinlet.cpp +++ b/src/controls/QskSubWindowSkinlet.cpp @@ -88,8 +88,8 @@ QSGNode* QskSubWindowSkinlet::updateSubNode( if ( ( decorations & Q::TitleBar ) && ( decorations & Q::Title ) ) { - return updateTextNode( subWindow, node, subWindow->windowTitle(), - subWindow->windowTitleTextOptions(), Q::TitleBarText ); + return updateTextNode( subWindow, node, + subWindow->windowTitle(), Q::TitleBarText ); } return nullptr; diff --git a/src/controls/QskTabButton.cpp b/src/controls/QskTabButton.cpp index bbfe2166..0ffb7b8f 100644 --- a/src/controls/QskTabButton.cpp +++ b/src/controls/QskTabButton.cpp @@ -29,7 +29,6 @@ class QskTabButton::PrivateData } QString text; - QskTextOptions textOptions; QPointer< QskTabBar > tabBar; }; @@ -77,18 +76,21 @@ QString QskTabButton::text() const return m_data->text; } -void QskTabButton::setTextOptions( const QskTextOptions& options ) +void QskTabButton::setTextOptions( const QskTextOptions& textOptions ) { - if ( options != m_data->textOptions ) - { - m_data->textOptions = options; + if ( setTextOptionsHint( Text, textOptions ) ) Q_EMIT textOptionsChanged(); - } } QskTextOptions QskTabButton::textOptions() const { - return m_data->textOptions; + return textOptionsHint( Text ); +} + +void QskTabButton::resetTextOptions() +{ + if ( resetTextOptionsHint( Text ) ) + Q_EMIT textOptionsChanged(); } QRectF QskTabButton::layoutRectForSize( const QSizeF& size ) const diff --git a/src/controls/QskTabButton.h b/src/controls/QskTabButton.h index 49c89cd2..f59384ec 100644 --- a/src/controls/QskTabButton.h +++ b/src/controls/QskTabButton.h @@ -18,7 +18,7 @@ class QSK_EXPORT QskTabButton : public QskAbstractButton Q_PROPERTY( QString text READ text WRITE setText NOTIFY textChanged FINAL ) Q_PROPERTY( QskTextOptions textOptions READ textOptions - WRITE setTextOptions NOTIFY textOptionsChanged ) + WRITE setTextOptions RESET resetTextOptions NOTIFY textOptionsChanged ) using Inherited = QskAbstractButton; @@ -37,6 +37,7 @@ class QSK_EXPORT QskTabButton : public QskAbstractButton void setTextOptions( const QskTextOptions& ); QskTextOptions textOptions() const; + void resetTextOptions(); QRectF layoutRectForSize( const QSizeF& ) const override; diff --git a/src/controls/QskTabButtonSkinlet.cpp b/src/controls/QskTabButtonSkinlet.cpp index 1a6c97d0..545cd409 100644 --- a/src/controls/QskTabButtonSkinlet.cpp +++ b/src/controls/QskTabButtonSkinlet.cpp @@ -46,8 +46,8 @@ QSGNode* QskTabButtonSkinlet::updateSubNode( case TextRole: { - return updateTextNode( tabButton, node, tabButton->text(), - tabButton->textOptions(), QskTabButton::Text ); + return updateTextNode( tabButton, node, + tabButton->text(), QskTabButton::Text ); } } diff --git a/src/controls/QskTextLabel.cpp b/src/controls/QskTextLabel.cpp index bedebc79..b7d24237 100644 --- a/src/controls/QskTextLabel.cpp +++ b/src/controls/QskTextLabel.cpp @@ -13,27 +13,15 @@ QSK_SUBCONTROL( QskTextLabel, Text ) class QskTextLabel::PrivateData { public: - PrivateData( const QString& txt ) + PrivateData( const QString& txt, QskTextOptions::TextFormat textFormat ) : text( txt ) + , effectiveTextFormat( textFormat ) , hasPanel( false ) { - effectiveTextFormat = textOptions.format(); - } - - inline QskTextOptions::TextFormat effectiveFormat() const - { - if ( textOptions.format() != QskTextOptions::AutoText ) - return textOptions.format(); - - if ( effectiveTextFormat == QskTextOptions::AutoText ) - effectiveTextFormat = textOptions.effectiveFormat( text ); - - return effectiveTextFormat; } QString text; - QskTextOptions textOptions; mutable QskTextOptions::TextFormat effectiveTextFormat; bool hasPanel : 1; @@ -46,7 +34,7 @@ QskTextLabel::QskTextLabel( QQuickItem* parent ) QskTextLabel::QskTextLabel( const QString& text, QQuickItem* parent ) : Inherited( parent ) - , m_data( new PrivateData( text ) ) + , m_data( new PrivateData( text, textOptions().format() ) ) { initSizePolicy( QskSizePolicy::Minimum, QskSizePolicy::Fixed ); } @@ -79,7 +67,7 @@ void QskTextLabel::setText( const QString& text ) return; m_data->text = text; - m_data->effectiveTextFormat = m_data->textOptions.format(); + m_data->effectiveTextFormat = textOptions().format(); resetImplicitSize(); update(); @@ -92,37 +80,38 @@ QString QskTextLabel::text() const return m_data->text; } -void QskTextLabel::setTextOptions( const QskTextOptions& options ) +void QskTextLabel::setTextOptions( const QskTextOptions& textOptions ) { - if ( options == m_data->textOptions ) - return; - + if ( setTextOptionsHint( Text, textOptions ) ) + { #if 0 - // we are killing user settings of the policy this way ?? + // we are killing user settings of the policy this way ?? - const QskSizePolicy::Policy policy = ( options.wrapMode() == QTextOption::NoWrap ) - ? QskSizePolicy::Minimum : QskSizePolicy::Preferred; + const QskSizePolicy::Policy policy = ( options.wrapMode() == QTextOption::NoWrap ) + ? QskSizePolicy::Minimum : QskSizePolicy::Preferred; - setSizePolicy( policy, sizePolicy().verticalPolicy() ); + setSizePolicy( policy, sizePolicy().verticalPolicy() ); #endif - m_data->effectiveTextFormat = options.format(); - m_data->textOptions = options; - - resetImplicitSize(); - update(); - - Q_EMIT textOptionsChanged( options ); + m_data->effectiveTextFormat = textOptions.format(); + Q_EMIT textOptionsChanged( textOptions ); + } } QskTextOptions QskTextLabel::textOptions() const { - return m_data->textOptions; + return textOptionsHint( Text ); +} + +void QskTextLabel::resetTextOptions() +{ + if ( resetTextOptionsHint( Text ) ) + Q_EMIT textOptionsChanged( textOptions() ); } void QskTextLabel::setTextFormat( QskTextOptions::TextFormat format ) { - auto options = m_data->textOptions; + auto options = textOptions(); options.setFormat( format ); setTextOptions( options ); @@ -130,31 +119,38 @@ void QskTextLabel::setTextFormat( QskTextOptions::TextFormat format ) QskTextOptions::TextFormat QskTextLabel::textFormat() const { - return m_data->textOptions.format(); + return textOptions().format(); } QskTextOptions::TextFormat QskTextLabel::effectiveTextFormat() const { - return m_data->effectiveFormat(); + const auto options = textOptions(); + + if ( options.format() != QskTextOptions::AutoText ) + return options.format(); + + if ( m_data->effectiveTextFormat == QskTextOptions::AutoText ) + m_data->effectiveTextFormat = options.effectiveFormat( m_data->text ); + + return m_data->effectiveTextFormat; } void QskTextLabel::setWrapMode( QskTextOptions::WrapMode wrapMode ) { - auto options = m_data->textOptions; + auto options = textOptions(); options.setWrapMode( wrapMode ); setTextOptions( options ); - } QskTextOptions::WrapMode QskTextLabel::wrapMode() const { - return m_data->textOptions.wrapMode(); + return textOptions().wrapMode(); } void QskTextLabel::setElideMode( Qt::TextElideMode elideMode ) { - auto options = m_data->textOptions; + auto options = textOptions(); options.setElideMode( elideMode ); setTextOptions( options ); @@ -162,7 +158,7 @@ void QskTextLabel::setElideMode( Qt::TextElideMode elideMode ) Qt::TextElideMode QskTextLabel::elideMode() const { - return m_data->textOptions.elideMode(); + return textOptions().elideMode(); } void QskTextLabel::setFontRole( int role ) diff --git a/src/controls/QskTextLabel.h b/src/controls/QskTextLabel.h index 9392014e..f313ab31 100644 --- a/src/controls/QskTextLabel.h +++ b/src/controls/QskTextLabel.h @@ -24,7 +24,7 @@ class QSK_EXPORT QskTextLabel : public QskControl WRITE setTextColor RESET resetTextColor NOTIFY textColorChanged ) Q_PROPERTY( QskTextOptions textOptions READ textOptions - WRITE setTextOptions NOTIFY textOptionsChanged ) + WRITE setTextOptions RESET resetTextOptions NOTIFY textOptionsChanged ) Q_PROPERTY( Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged ) @@ -54,6 +54,7 @@ class QSK_EXPORT QskTextLabel : public QskControl void setTextOptions( const QskTextOptions& ); QskTextOptions textOptions() const; + void resetTextOptions(); void setTextFormat( QskTextOptions::TextFormat ); QskTextOptions::TextFormat textFormat() const; diff --git a/src/controls/QskTextLabelSkinlet.cpp b/src/controls/QskTextLabelSkinlet.cpp index 182f9009..3e9755f7 100644 --- a/src/controls/QskTextLabelSkinlet.cpp +++ b/src/controls/QskTextLabelSkinlet.cpp @@ -60,7 +60,7 @@ QSGNode* QskTextLabelSkinlet::updateSubNode( case TextRole: { return updateTextNode( label, node, - label->text(), label->textOptions(), QskTextLabel::Text ); + label->text(), QskTextLabel::Text ); } }