From bf15d21fb5558aea115d78c175191adcbf8a5f8a Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 14 Jun 2022 11:58:56 +0200 Subject: [PATCH] shadows example improved --- playground/shadows/ShadowedBox.cpp | 91 ++++++++++++++++--- playground/shadows/ShadowedBox.h | 29 ++++-- playground/shadows/main.cpp | 141 +++++++++++++++++++++-------- 3 files changed, 200 insertions(+), 61 deletions(-) diff --git a/playground/shadows/ShadowedBox.cpp b/playground/shadows/ShadowedBox.cpp index f9c29cd6..cc2346d0 100644 --- a/playground/shadows/ShadowedBox.cpp +++ b/playground/shadows/ShadowedBox.cpp @@ -14,40 +14,103 @@ ShadowedBox::ShadowedBox( QQuickItem* parentItem ) : QskBox( true, parentItem ) { + QColor c( Qt::darkRed ); +#if 0 + c.setAlpha( 100 ); +#endif + + setGradientHint( Panel, c ); + setBoxShapeHint( Panel, QskBoxShapeMetrics( 40, 0, 15, 0 ) ); + + setBoxBorderMetricsHint( Panel, 0 ); + +#if 0 + setBoxBorderMetricsHint( Panel, 10 ); + setBoxBorderColorsHint( Panel, Qt::blue ); +#endif + + setShadowColorHint( Panel, Qt::black ); } ShadowedBox::~ShadowedBox() { } -void ShadowedBox::setShadow( const QskShadowMetrics& shadow ) +void ShadowedBox::setOffsetX( qreal dx ) { - setShadowMetricsHint( Panel, shadow ); + auto metrics = shadowMetrics(); + metrics.setOffsetX( dx ); + + setShadowMetrics( metrics ); } -void ShadowedBox::setShadowColor( const QColor& color ) +qreal ShadowedBox::offsetX() const { + return shadowMetrics().offset().x(); +} + +void ShadowedBox::setOffsetY( qreal dy ) +{ + auto metrics = shadowMetrics(); + metrics.setOffsetY( dy ); + + setShadowMetrics( metrics ); +} + +qreal ShadowedBox::offsetY() const +{ + return shadowMetrics().offset().y(); +} + +void ShadowedBox::setSpreadRadius( qreal radius ) +{ + auto metrics = shadowMetrics(); + metrics.setSpreadRadius( radius ); + + setShadowMetrics( metrics ); +} + +qreal ShadowedBox::spreadRadius() const +{ + return shadowMetrics().spreadRadius(); +} + +void ShadowedBox::setBlurRadius( qreal radius ) +{ + auto metrics = shadowMetrics(); + metrics.setBlurRadius( radius ); + + setShadowMetrics( metrics ); +} + +qreal ShadowedBox::blurRadius() const +{ + return shadowMetrics().blurRadius(); +} + +void ShadowedBox::setOpacity( qreal opacity ) +{ + opacity = qBound( 0.0, opacity, 1.0 ); + + auto color = shadowColorHint( Panel ); + color.setAlphaF( opacity ); + setShadowColorHint( Panel, color ); } -void ShadowedBox::setGradient( const QskGradient& gradient ) +qreal ShadowedBox::opacity() const { - setGradientHint( Panel, gradient ); + return shadowColorHint( Panel ).alphaF(); } -void ShadowedBox::setShape( const QskBoxShapeMetrics& shape ) +QskShadowMetrics ShadowedBox::shadowMetrics() const { - setBoxShapeHint( Panel, shape ); + return shadowMetricsHint( Panel ); } -void ShadowedBox::setBorderWidth( qreal width ) +void ShadowedBox::setShadowMetrics( const QskShadowMetrics& metrics ) { - setBoxBorderMetricsHint( Panel, width ); -} - -void ShadowedBox::setBorderColors( const QskBoxBorderColors& colors ) -{ - setBoxBorderColorsHint( Panel, colors ); + setShadowMetricsHint( Panel, metrics ); } #include "moc_ShadowedBox.cpp" diff --git a/playground/shadows/ShadowedBox.h b/playground/shadows/ShadowedBox.h index d3232b7d..63dd0bd2 100644 --- a/playground/shadows/ShadowedBox.h +++ b/playground/shadows/ShadowedBox.h @@ -7,25 +7,34 @@ #include -class QskGradient; class QskShadowMetrics; -class QskBoxShapeMetrics; -class QskBoxBorderColors; class ShadowedBox : public QskBox { Q_OBJECT public: - ShadowedBox(QQuickItem* parent = nullptr); + ShadowedBox( QQuickItem* parent = nullptr ); ~ShadowedBox() override; - void setShape( const QskBoxShapeMetrics& ); - void setGradient( const QskGradient& ); + qreal offsetX() const; + qreal offsetY() const; - void setBorderWidth( qreal width ); - void setBorderColors( const QskBoxBorderColors& ); + qreal spreadRadius() const; + qreal blurRadius() const; - void setShadow( const QskShadowMetrics& ); - void setShadowColor( const QColor& ); + qreal opacity() const; + + public Q_SLOTS: + void setOffsetX( qreal ); + void setOffsetY( qreal ); + + void setSpreadRadius( qreal ); + void setBlurRadius( qreal ); + + void setOpacity( qreal ); + + private: + QskShadowMetrics shadowMetrics() const; + void setShadowMetrics( const QskShadowMetrics& ); }; diff --git a/playground/shadows/main.cpp b/playground/shadows/main.cpp index e1bd51a4..e57c4d83 100644 --- a/playground/shadows/main.cpp +++ b/playground/shadows/main.cpp @@ -7,43 +7,122 @@ #include #include -#include +#include +#include +#include #include -#include -#include -#include -#include - #include #include +#include -class Box : public ShadowedBox +class BoxPanel : public QskBox { public: - Box( QQuickItem* parent = nullptr ) - : ShadowedBox( parent ) + BoxPanel( QQuickItem* parent = nullptr ) + : QskBox( parent ) { - const qreal w = 10; + setAutoLayoutChildren( true ); + setPadding( 60 ); - QskShadowMetrics shadow; - //shadow.setOffset( 20.0, 20.0 ); - shadow.setSpreadRadius( w ); - shadow.setBlurRadius( w ); + setPanel( true ); + setGradientHint( QskBox::Panel, QGradient::SnowAgain ); + } +}; - setShadow( shadow ); - setShadowColor( Qt::black ); +class Slider : public QskSlider +{ + public: + Slider( qreal min, qreal max, qreal step, qreal value, QQuickItem* parent = nullptr ) + : QskSlider( parent ) + { + setBoundaries( min, max ); + setStepSize( step ); + setSnap( true ); + setValue( value ); + } +}; - QColor c( Qt::darkRed ); -#if 0 - c.setAlpha( 100 ); -#endif +class ValueLabel : public QskTextLabel +{ + public: + ValueLabel( QQuickItem* parent = nullptr ) + : QskTextLabel( parent ) + { + setFixedWidth( QFontMetrics( font() ).horizontalAdvance( "-100" ) ); + setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); + } - setGradient( c ); - setShape( QskBoxShapeMetrics( 40, 10, 15, 5 ) ); + void setValue( qreal value ) + { + setText( QString::number( value ) ); + } +}; - setBorderWidth( w ); - setBorderColors( Qt::blue ); +class GridBox : public QskGridBox +{ + public: + GridBox( QQuickItem* parent = nullptr ) + : QskGridBox( parent ) + { + setMargins( 5 ); + setColumnStretchFactor( 1, 1 ); + + auto sliderX = new Slider( -50, 50, 1, 10 ); + auto sliderY = new Slider( -50, 50, 1, 10 ); + auto sliderSpread = new Slider( 0, 50, 1, 0 ); + auto sliderBlur = new Slider( 0, 50, 1, 10 ); + auto sliderOpacity = new Slider( 0, 1, 0.01, 1 ); + + auto panel = new BoxPanel(); + + int row = 0; + + addSlider( row++, "Offset X", sliderX ); + addSlider( row++, "Offset Y", sliderY ); + addSlider( row++, "Spread Radius", sliderSpread ); + addSlider( row++, "Blur Radius", sliderBlur ); + addSlider( row++, "Opacity", sliderOpacity ); + + addItem( panel, row, 0, -1, -1 ); + + auto box = new ShadowedBox( panel ); + + box->setOffsetX( sliderX->value() ); + box->setOffsetY( sliderY->value() ); + box->setSpreadRadius( sliderSpread->value() ); + box->setBlurRadius( sliderBlur->value() ); + box->setOpacity( sliderOpacity->value() ); + + connect( sliderX, &QskSlider::valueChanged, + box, &ShadowedBox::setOffsetX ); + + connect( sliderY, &QskSlider::valueChanged, + box, &ShadowedBox::setOffsetY ); + + connect( sliderSpread, &QskSlider::valueChanged, + box, &ShadowedBox::setSpreadRadius ); + + connect( sliderBlur, &QskSlider::valueChanged, + box, &ShadowedBox::setBlurRadius ); + + connect( sliderOpacity, &QskSlider::valueChanged, + box, &ShadowedBox::setOpacity ); + } + + private: + void addSlider( int row, const QString& text, QskSlider* slider ) + { + addItem( new QskTextLabel( text ), row, 0 ); + addItem( slider, row, 1 ); + + auto label = new ValueLabel(); + label->setValue( slider->value() ); + + addItem( label, row, 2 ); + + connect( slider, &QskSlider::valueChanged, + label, [label]( qreal value ) { label->setText( QString::number( value ) ); } ); } }; @@ -57,20 +136,8 @@ int main( int argc, char* argv[] ) SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); - auto layout = new QskLinearBox(); - layout->setPanel( true ); -#if 1 - layout->setGradientHint( QskBox::Panel, - QskGradient( Qt::Vertical, QskRgb::WhiteSmoke, QskRgb::MistyRose ) ); -#else - layout->setGradientHint( QskBox::Panel, Qt::white ); -#endif - layout->setPadding( 60 ); - (void ) new Box( layout ); - QskWindow window; - window.setColor( QskRgb::PapayaWhip ); - window.addItem( layout ); + window.addItem( new GridBox() ); window.resize( 600, 600 ); window.show();