From fa8b4da0b239481c75e9ce743011be5abd6f86c2 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Fri, 18 Sep 2020 17:36:33 +0200 Subject: [PATCH] something works somehow --- examples/iot-dashboard/Box.cpp | 16 ++++- examples/iot-dashboard/DaytimeSkin.cpp | 3 + .../iot-dashboard/QskShadowedRectangle.cpp | 7 ++ examples/iot-dashboard/QskShadowedRectangle.h | 51 +++++++++++++++ .../QskShadowedRectangleSkinlet.cpp | 64 +++++++++++++++++++ .../QskShadowedRectangleSkinlet.h | 39 +++++++++++ examples/iot-dashboard/iot-dashboard.pro | 56 +++++----------- 7 files changed, 193 insertions(+), 43 deletions(-) create mode 100644 examples/iot-dashboard/QskShadowedRectangle.cpp create mode 100644 examples/iot-dashboard/QskShadowedRectangle.h create mode 100644 examples/iot-dashboard/QskShadowedRectangleSkinlet.cpp create mode 100644 examples/iot-dashboard/QskShadowedRectangleSkinlet.h diff --git a/examples/iot-dashboard/Box.cpp b/examples/iot-dashboard/Box.cpp index 64a70bbc..ba0cfc47 100644 --- a/examples/iot-dashboard/Box.cpp +++ b/examples/iot-dashboard/Box.cpp @@ -1,7 +1,7 @@ #include "Box.h" #include "DaytimeSkin.h" -#include "src/shadowedrectangle.h" +#include "QskShadowedRectangle.h" #include #include @@ -26,8 +26,18 @@ Box::Box( const QString& title, QQuickItem* parent ) setBoxBorderColorsHint( QskBox::Panel, borderColors ); - auto* r = new ShadowedRectangle( this ); - r->setColor( Qt::green ); + auto* r = new QskShadowedRectangle( this ); +// r->setPosition( {50, 50} ); +// r->setColor( Qt::green ); +// r->setOpacity( 0.5 ); +// r->setSize( {100, 50} ); +// r->setVisible( true ); +// r->corners()->setTopLeft( 5 ); +// r->corners()->setTopRight( 5 ); +// r->corners()->setBottomLeft( 5 ); +// r->corners()->setBottomRight( 5 ); +// r->setRadius( 5 ); + auto* t = new QskTextLabel( "bla", r ); m_label->setFontRole( DaytimeSkin::TitleFont ); diff --git a/examples/iot-dashboard/DaytimeSkin.cpp b/examples/iot-dashboard/DaytimeSkin.cpp index c710c18b..1d074d0d 100644 --- a/examples/iot-dashboard/DaytimeSkin.cpp +++ b/examples/iot-dashboard/DaytimeSkin.cpp @@ -1,6 +1,8 @@ #include "DaytimeSkin.h" #include "MenuBar.h" +#include "QskShadowedRectangle.h" +#include "QskShadowedRectangleSkinlet.h" #include "PieChart.h" #include "PieChartSkinlet.h" @@ -29,6 +31,7 @@ namespace DaytimeSkin::DaytimeSkin( QObject* parent ) : QskSkin( parent ) { + declareSkinlet< QskShadowedRectangle, QskShadowedRectangleSkinlet >(); declareSkinlet< PieChart, PieChartSkinlet >(); initHints(); } diff --git a/examples/iot-dashboard/QskShadowedRectangle.cpp b/examples/iot-dashboard/QskShadowedRectangle.cpp new file mode 100644 index 00000000..4ccce0cd --- /dev/null +++ b/examples/iot-dashboard/QskShadowedRectangle.cpp @@ -0,0 +1,7 @@ +#include "QskShadowedRectangle.h" + +QSK_SUBCONTROL( QskShadowedRectangle, Shadow ) + +QskShadowedRectangle::QskShadowedRectangle( QQuickItem* parent ) : QskControl( parent ) +{ +} diff --git a/examples/iot-dashboard/QskShadowedRectangle.h b/examples/iot-dashboard/QskShadowedRectangle.h new file mode 100644 index 00000000..7c63d0f2 --- /dev/null +++ b/examples/iot-dashboard/QskShadowedRectangle.h @@ -0,0 +1,51 @@ +#ifndef QSKSHADOWEDRECTANGLE_H +#define QSKSHADOWEDRECTANGLE_H + +#include "src/shadowedrectangle.h" + +#include + +class QskShadowedRectangle : public QskControl +{ + Q_OBJECT + + public: + QSK_SUBCONTROLS( Shadow ) + + QskShadowedRectangle( QQuickItem* parent = nullptr ); +// ~QskShadowedRectangle() override; + +// BorderGroup* border() const; +// ShadowGroup* shadow() const; +// CornersGroup* corners() const; + +// qreal radius() const; +// void setRadius( qreal newRadius ); +// Q_SIGNAL void radiusChanged(); + +// QColor color() const; +// void setColor( const QColor& newColor ); +// Q_SIGNAL void colorChanged(); + +// void componentComplete() override; + +// bool isSoftwareRendering() const; + +// Q_SIGNALS: +// void softwareRenderingChanged(); + +// protected: +// PaintedRectangleItem* softwareItem() const; +// void itemChange( QQuickItem::ItemChange change, const QQuickItem::ItemChangeData& value ) override; + +// private: +// void checkSoftwareItem(); +// const std::unique_ptr m_border; +// const std::unique_ptr m_shadow; +// const std::unique_ptr m_corners; +// qreal m_radius = 0.0; +// QColor m_color = Qt::white; +// PaintedRectangleItem* m_softwareItem = nullptr; +}; + +#endif // QSKSHADOWEDRECTANGLE_H diff --git a/examples/iot-dashboard/QskShadowedRectangleSkinlet.cpp b/examples/iot-dashboard/QskShadowedRectangleSkinlet.cpp new file mode 100644 index 00000000..a9c2ae92 --- /dev/null +++ b/examples/iot-dashboard/QskShadowedRectangleSkinlet.cpp @@ -0,0 +1,64 @@ +#include "QskShadowedRectangleSkinlet.h" +#include "QskShadowedRectangle.h" + +#include "src/scenegraph/shadowedrectanglenode.h" + +QskShadowedRectangleSkinlet::QskShadowedRectangleSkinlet( QskSkin* skin ) : QskSkinlet( skin ) + , m_border( new BorderGroup ) + , m_shadow( new ShadowGroup ) + , m_corners( new CornersGroup ) +{ + setNodeRoles( { ShadowRole } ); +} + +QRectF QskShadowedRectangleSkinlet::subControlRect( const QskSkinnable*, const QRectF& contentsRect, QskAspect::Subcontrol ) const +{ + return contentsRect; +} + +QSGNode* QskShadowedRectangleSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const +{ + const auto rectangle = static_cast< const QskShadowedRectangle* >( skinnable ); + + switch( nodeRole ) + { + case ShadowRole: + return updateShadowNode( rectangle, node ); + + default: + return nullptr; + } +} + +QSGNode* QskShadowedRectangleSkinlet::updateShadowNode( const QskShadowedRectangle* rectangle, QSGNode* node ) const +{ + auto shadowNode = static_cast( node ); + + if( !shadowNode ) + { + shadowNode = new ShadowedRectangleNode{}; + } + +// shadowNode->setBorderEnabled( m_border->isEnabled() ); +// shadowNode->setRect( rectangle->contentsRect() ); +// shadowNode->setSize( m_shadow->size() ); +// shadowNode->setRadius( m_corners->toVector4D( m_radius ) ); +// shadowNode->setOffset( QVector2D{float( m_shadow->xOffset() ), float( m_shadow->yOffset() )} ); +// shadowNode->setColor( m_color ); +// shadowNode->setShadowColor( m_shadow->color() ); +// shadowNode->setBorderWidth( m_border->width() ); +// shadowNode->setBorderColor( m_border->color() ); +// shadowNode->updateGeometry(); + + shadowNode->setBorderEnabled( true ); + shadowNode->setRect( {0, 0, 100, 50} ); + shadowNode->setSize( 50 ); + shadowNode->setRadius( m_corners->toVector4D( 5 ) ); + shadowNode->setOffset( QVector2D{float( 1 ), float( 1 )} ); + shadowNode->setColor( Qt::green ); + shadowNode->setShadowColor( Qt::magenta ); + shadowNode->setBorderWidth( 2 ); + shadowNode->setBorderColor( Qt::red ); + shadowNode->updateGeometry(); + return shadowNode; +} diff --git a/examples/iot-dashboard/QskShadowedRectangleSkinlet.h b/examples/iot-dashboard/QskShadowedRectangleSkinlet.h new file mode 100644 index 00000000..f67efa00 --- /dev/null +++ b/examples/iot-dashboard/QskShadowedRectangleSkinlet.h @@ -0,0 +1,39 @@ +#ifndef QSKSHADOWEDRECTANGLESKINLET_H +#define QSKSHADOWEDRECTANGLESKINLET_H + +#include "src/shadowedrectangle.h" + +#include + +class QskShadowedRectangle; + +class QskShadowedRectangleSkinlet : public QskSkinlet +{ + Q_GADGET + + public: + enum NodeRole + { + ShadowRole, + }; + + Q_INVOKABLE QskShadowedRectangleSkinlet( QskSkin* skin = nullptr ); + + QRectF subControlRect( const QskSkinnable*, const QRectF&, QskAspect::Subcontrol ) const override; + + protected: + virtual QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* node ) const override; + + private: + QSGNode* updateShadowNode( const QskShadowedRectangle*, QSGNode* ) const; + + // ### move this to the value class: + const std::unique_ptr m_border; + const std::unique_ptr m_shadow; + const std::unique_ptr m_corners; + qreal m_radius = 0.0; + QColor m_color = Qt::white; + PaintedRectangleItem* m_softwareItem = nullptr; +}; + +#endif // QSKSHADOWEDRECTANGLESKINLET_H diff --git a/examples/iot-dashboard/iot-dashboard.pro b/examples/iot-dashboard/iot-dashboard.pro index 4e055d96..2162c550 100644 --- a/examples/iot-dashboard/iot-dashboard.pro +++ b/examples/iot-dashboard/iot-dashboard.pro @@ -14,6 +14,8 @@ SOURCES += \ PieChart.cpp \ PieChartPainted.cpp \ PieChartSkinlet.cpp \ + QskShadowedRectangle.cpp \ + QskShadowedRectangleSkinlet.cpp \ RoundedIcon.cpp \ TopBar.cpp \ Usage.cpp \ @@ -35,53 +37,27 @@ HEADERS += \ PieChart.h \ PieChartPainted.h \ PieChartSkinlet.h \ + QskShadowedRectangle.h \ + QskShadowedRectangleSkinlet.h \ RoundedIcon.h \ TopBar.h \ Usage.h -HEADERS += src/avatar.h \ -src/colorutils.h \ -src/columnview.h \ -src/columnview_p.h \ -src/delegaterecycler.h \ -src/enums.h \ -src/formlayoutattached.h \ -src/icon.h \ -src/imagecolors.h \ -src/kirigamiplugin.h \ -src/mnemonicattached.h \ -src/pagepool.h \ -src/pagerouter.h \ -src/scenepositionattached.h \ -src/settings.h \ +HEADERS += \ src/shadowedrectangle.h \ -src/shadowedtexture.h \ -src/sizegroup.h \ -src/toolbarlayoutdelegate.h \ -src/toolbarlayout.h \ -src/wheelhandler.h +src/scenegraph/paintedrectangleitem.h \ +src/scenegraph/shadowedborderrectanglematerial.h \ +src/scenegraph/shadowedrectanglematerial.h \ +src/scenegraph/shadowedrectanglenode.h -SOURCES += src/avatar.cpp \ -src/colorutils.cpp \ -src/columnview.cpp \ -src/delegaterecycler.cpp \ -src/enums.cpp \ -src/formlayoutattached.cpp \ -src/icon.cpp \ -src/imagecolors.cpp \ -src/kirigamiplugin.cpp \ -src/mnemonicattached.cpp \ -src/pagepool.cpp \ -src/pagerouter.cpp \ -src/scenepositionattached.cpp \ -src/settings.cpp \ +SOURCES += \ src/shadowedrectangle.cpp \ -src/shadowedtexture.cpp \ -src/sizegroup.cpp \ -src/toolbarlayoutdelegate.cpp \ -src/toolbarlayout.cpp \ -src/wheelhandler.cpp +src/scenegraph/paintedrectangleitem.cpp \ +src/scenegraph/shadowedborderrectanglematerial.cpp \ +src/scenegraph/shadowedrectanglematerial.cpp \ +src/scenegraph/shadowedrectanglenode.cpp RESOURCES += \ images.qrc \ - fonts.qrc + fonts.qrc \ + src/scenegraph/shaders/shaders.qrc