diff --git a/src/controls/QskGraphicLabelSkinlet.cpp b/src/controls/QskGraphicLabelSkinlet.cpp index 98397b7c..5310a997 100644 --- a/src/controls/QskGraphicLabelSkinlet.cpp +++ b/src/controls/QskGraphicLabelSkinlet.cpp @@ -7,6 +7,7 @@ #include "QskGraphicLabel.h" #include "QskGraphic.h" #include "QskGraphicTextureFactory.h" +#include "QskGraphicNode.h" #include "QskAspect.h" #include "QskSkin.h" #include "QskTextureNode.h" @@ -80,10 +81,19 @@ QSGNode* QskGraphicLabelSkinlet::updateSubNode( QSGNode* QskGraphicLabelSkinlet::updateGraphicNode( const QskGraphicLabel* label, QSGNode* node ) const { - const QRectF rect = subControlRect( label, QskGraphicLabel::Graphic ); + const auto colorFilter = label->graphicFilter(); + const auto rect = subControlRect( label, QskGraphicLabel::Graphic ); - node = QskSkinlet::updateGraphicNode( label, node, - label->graphic(), label->graphicFilter(), rect, Qt::AlignCenter ); + if ( label->fillMode() == QskGraphicLabel::Stretch ) + { + node = QskSkinlet::updateGraphicNode( label, node, + label->graphic(), colorFilter, rect ); + } + else + { + node = QskSkinlet::updateGraphicNode( label, node, + label->graphic(), colorFilter, rect, Qt::AlignCenter ); + } if ( node && label->mirror() ) { diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index 480cbc8b..1a4db349 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -56,15 +56,23 @@ static inline QSGNode* qskFindNodeByFlag( QSGNode* parent, int nodeRole ) return nullptr; } -static inline QskGraphicTextureFactory::RenderMode qskRenderMode( - const QskSkinnable* skinnable ) +static inline QSGNode* qskUpdateGraphicNode( + const QskSkinnable* skinnable, QSGNode* node, + const QskGraphic& graphic, const QskColorFilter& colorFilter, + const QRect& rect ) { - const QskControl* control = skinnable->owningControl(); + auto mode = QskGraphicTextureFactory::OpenGL; - if ( control->testControlFlag( QskControl::PreferRasterForTextures ) ) - return QskGraphicTextureFactory::Raster; - else - return QskGraphicTextureFactory::OpenGL; + const QskControl* control = skinnable->owningControl(); + if ( control && control->testControlFlag( QskControl::PreferRasterForTextures ) ) + mode = QskGraphicTextureFactory::Raster; + + auto graphicNode = static_cast< QskGraphicNode* >( node ); + if ( graphicNode == nullptr ) + graphicNode = new QskGraphicNode(); + + graphicNode->setGraphic( graphic, colorFilter, mode, rect ); + return graphicNode; } class QskSkinlet::PrivateData @@ -411,30 +419,23 @@ QSGNode* QskSkinlet::updateTextNode( QSGNode* QskSkinlet::updateGraphicNode( const QskSkinnable* skinnable, QSGNode* node, - const QskGraphic& graphic, const QRectF& rect, - QskAspect::Subcontrol subcontrol ) const + const QskGraphic& graphic, QskAspect::Subcontrol subcontrol ) const { + const QRectF rect = subControlRect( skinnable, subcontrol ); + const Qt::Alignment alignment = skinnable->flagHint< Qt::Alignment >( subcontrol | QskAspect::Alignment, Qt::AlignCenter ); - + const auto colorFilter = skinnable->effectiveGraphicFilter( subcontrol ); - + return updateGraphicNode( skinnable, node, graphic, colorFilter, rect, alignment ); } QSGNode* QskSkinlet::updateGraphicNode( const QskSkinnable* skinnable, QSGNode* node, - const QskGraphic& graphic, QskAspect::Subcontrol subcontrol ) const -{ - return updateGraphicNode( skinnable, node, graphic, - subControlRect( skinnable, subcontrol ), subcontrol ); -} - -QSGNode* QskSkinlet::updateGraphicNode( - const QskSkinnable* skinnable, QSGNode* node, const QskGraphic& graphic, - const QskColorFilter& colorFilter, const QRectF& rect, - Qt::Alignment alignment ) const + const QskGraphic& graphic, const QskColorFilter& colorFilter, + const QRectF& rect, Qt::Alignment alignment ) const { if ( graphic.isNull() ) return nullptr; @@ -445,12 +446,19 @@ QSGNode* QskSkinlet::updateGraphicNode( const QRect r = qskAlignedRect( qskInnerRect( rect ), int( scaledSize.width() ), int( scaledSize.height() ), alignment ); - auto graphicNode = static_cast< QskGraphicNode* >( node ); - if ( graphicNode == nullptr ) - graphicNode = new QskGraphicNode(); - - graphicNode->setGraphic( graphic, colorFilter, qskRenderMode( skinnable ), r ); - return graphicNode; + return qskUpdateGraphicNode( skinnable, node, graphic, colorFilter, r ); } +QSGNode* QskSkinlet::updateGraphicNode( + const QskSkinnable* skinnable, QSGNode* node, + const QskGraphic& graphic, const QskColorFilter& colorFilter, + const QRectF& rect ) const +{ + if ( graphic.isNull() ) + return nullptr; + + return qskUpdateGraphicNode( skinnable, node, + graphic, colorFilter, rect.toAlignedRect() ); +} + #include "moc_QskSkinlet.cpp" diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index d4bc1c0a..b5503b27 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -75,16 +75,18 @@ protected: QSGNode* updateTextNode( const QskSkinnable*, QSGNode*, const QString&, const QskTextOptions&, QskAspect::Subcontrol ) const; - QSGNode* updateGraphicNode( const QskSkinnable*, QSGNode*, - const QskGraphic&, const QRectF& , QskAspect::Subcontrol ) const; - QSGNode* updateGraphicNode( const QskSkinnable*, QSGNode*, const QskGraphic&, QskAspect::Subcontrol ) const; + // keeping the aspect ratio QSGNode* updateGraphicNode( const QskSkinnable*, QSGNode*, const QskGraphic&, const QskColorFilter&, const QRectF&, Qt::Alignment ) const; + // stretching to fit + QSGNode* updateGraphicNode( const QskSkinnable*, QSGNode*, + const QskGraphic&, const QskColorFilter&, const QRectF& ) const; + void insertRemoveNodes( QSGNode* parentNode, QSGNode* oldNode, QSGNode* newNode, int nodeRole ) const;