add shadow from outside

... because the class is not a QskControl
This commit is contained in:
Peter Hartmann 2020-09-20 12:56:18 +02:00
parent a6f7c16e24
commit c6cd1016df
6 changed files with 109 additions and 27 deletions

View File

@ -8,18 +8,18 @@
#include <QskBoxShapeMetrics.h> #include <QskBoxShapeMetrics.h>
#include <QskTextLabel.h> #include <QskTextLabel.h>
ShadowBox::ShadowBox( QskControl* control, QQuickItem* parent ) ShadowBox::ShadowBox( QQuickItem* parent )
: QskControl( parent ) : QskControl( parent )
, m_control( control ) // , m_control( control )
, m_rectangle( new ShadowedRectangle( this ) ) , m_rectangle( new ShadowedRectangle( this ) )
{ {
setAutoLayoutChildren( true ); // setAutoLayoutChildren( true );
m_rectangle->shadow()->setColor( Qt::black ); m_rectangle->shadow()->setColor( Qt::black );
m_rectangle->shadow()->setSize( 15 ); m_rectangle->shadow()->setSize( 15 );
m_rectangle->setColor( Qt::white ); // ### opacity should only be for the shadow, not the background m_rectangle->setColor( Qt::white ); // ### opacity should only be for the shadow, not the background
m_rectangle->setOpacity( 0.1 ); // m_rectangle->setOpacity( 0.1 );
m_rectangle->setSize( m_control->preferredSize() ); // m_rectangle->setSize( m_control->preferredSize() );
m_rectangle->corners()->setTopLeft( 6 ); m_rectangle->corners()->setTopLeft( 6 );
m_rectangle->corners()->setTopRight( 6 ); m_rectangle->corners()->setTopRight( 6 );
m_rectangle->corners()->setBottomLeft( 6 ); m_rectangle->corners()->setBottomLeft( 6 );
@ -28,10 +28,10 @@ ShadowBox::ShadowBox( QskControl* control, QQuickItem* parent )
void ShadowBox::updateLayout() void ShadowBox::updateLayout()
{ {
const auto s = m_rectangle->shadow()->size(); // const auto s = m_rectangle->shadow()->size();
qDebug() << m_control->geometry() << geometry(); // qDebug() << m_control->geometry() << geometry();
m_control->setPosition( {15, 0} ); // ### why? // m_control->setPosition( {15, 0} ); // ### why?
m_control->setZ( 1 ); // m_control->setZ( 1 );
} }
Box::Box( const QString& title, QQuickItem* parent ) Box::Box( const QString& title, QQuickItem* parent )
@ -46,24 +46,24 @@ Box::Box( const QString& title, QQuickItem* parent )
setMarginsHint( Panel | QskAspect::Padding, 15 ); setMarginsHint( Panel | QskAspect::Padding, 15 );
setPanel( true ); setPanel( true );
setBoxShapeHint( QskBox::Panel, 6 ); setBoxShapeHint( QskBox::Panel, 6 );
setBoxBorderMetricsHint( QskBox::Panel, 2 ); // setBoxBorderMetricsHint( QskBox::Panel, 2 );
QskBoxBorderColors borderColors( "#dddddd" ); QskBoxBorderColors borderColors( "#dddddd" );
borderColors.setAlpha( 100 ); borderColors.setAlpha( 100 );
setBoxBorderColorsHint( QskBox::Panel, borderColors ); setBoxBorderColorsHint( QskBox::Panel, borderColors );
auto* r = new ShadowedRectangle( this ); // auto* r = new ShadowedRectangle( this );
r->shadow()->setColor( Qt::black ); // r->shadow()->setColor( Qt::black );
r->shadow()->setSize( 15 ); // r->shadow()->setSize( 15 );
r->setPosition( {0, 0} ); // r->setPosition( {0, 0} );
r->setOpacity( 0.1 ); // r->setOpacity( 0.1 );
r->setSize( {100, 50} ); // r->setSize( {100, 50} );
r->corners()->setTopLeft( 6 ); // r->corners()->setTopLeft( 6 );
r->corners()->setTopRight( 6 ); // r->corners()->setTopRight( 6 );
r->corners()->setBottomLeft( 6 ); // r->corners()->setBottomLeft( 6 );
r->corners()->setBottomRight( 6 ); // r->corners()->setBottomRight( 6 );
// r->setRadius( 5 ); //// r->setRadius( 5 );
auto* t = new QskTextLabel( "bla", r ); // auto* t = new QskTextLabel( "bla", r );
m_label->setFontRole( DaytimeSkin::TitleFont ); m_label->setFontRole( DaytimeSkin::TitleFont );

View File

@ -11,13 +11,13 @@ class ShadowBox : public QskControl
{ {
Q_OBJECT Q_OBJECT
public: public:
ShadowBox( QskControl* control, QQuickItem* parent ); ShadowBox( QQuickItem* parent = nullptr );
protected: protected:
void updateLayout() override; void updateLayout() override;
private: private:
QskControl* m_control; // QskControl* m_control;
ShadowedRectangle* m_rectangle; ShadowedRectangle* m_rectangle;
}; };

View File

@ -13,6 +13,7 @@
IndoorTemperature::IndoorTemperature( QQuickItem* parent ) IndoorTemperature::IndoorTemperature( QQuickItem* parent )
: Box( "", parent ) : Box( "", parent )
{ {
// setBackgroundColor( Qt::transparent );
setMarginsHint( Panel | QskAspect::Padding, 10 ); setMarginsHint( Panel | QskAspect::Padding, 10 );
auto* layout = new QskLinearBox( Qt::Horizontal, this ); auto* layout = new QskLinearBox( Qt::Horizontal, this );

View File

@ -16,24 +16,73 @@
#include <QskGridBox.h> #include <QskGridBox.h>
#include <QskTextLabel.h> #include <QskTextLabel.h>
#include "src/shadowedrectangle.h"
#include <QTimer>
ShadowPositioner::ShadowPositioner( QQuickItem* parent ) : QskControl( parent )
{
setAutoLayoutChildren( true );
}
void ShadowPositioner::setGridBox( QskGridBox* gridBox )
{
m_gridBox = gridBox;
m_rectangles.reserve( m_gridBox->count() );
for( int i = 0; i < m_gridBox->count(); ++i )
{
auto* r = new ShadowedRectangle( this );
r->setZ( 5 );
r->shadow()->setColor( Qt::black );
r->shadow()->setSize( 15 );
r->setColor( Qt::white ); // ### opacity should only be for the shadow, not the background
r->setOpacity( 0.1 );
r->corners()->setTopLeft( 6 );
r->corners()->setTopRight( 6 );
r->corners()->setBottomLeft( 6 );
r->corners()->setBottomRight( 6 );
m_rectangles.append( r );
}
}
void ShadowPositioner::updateLayout()
{
auto* mainContent = static_cast<QskLinearBox*>( parentItem() );
QTimer::singleShot( 0, this, [this, mainContent]()
{
for( int i = 0; i < m_rectangles.count(); ++i )
{
auto* item = m_gridBox->itemAtIndex( i );
m_rectangles[i]->setSize( item->size() );
m_rectangles[i]->setPosition( mainContent->itemAtIndex( 1 )->position() + item->position() );
}
} );
}
MainContent::MainContent( QQuickItem* parent ) : QskLinearBox( Qt::Vertical, parent ) MainContent::MainContent( QQuickItem* parent ) : QskLinearBox( Qt::Vertical, parent )
{ {
setAutoAddChildren( false );
setSizePolicy( QskSizePolicy::Expanding, QskSizePolicy::Expanding ); setSizePolicy( QskSizePolicy::Expanding, QskSizePolicy::Expanding );
setDefaultAlignment( Qt::AlignTop ); setDefaultAlignment( Qt::AlignTop );
setSpacing( 30 ); setSpacing( 30 );
setBackgroundColor( "#FBFBFB" ); setBackgroundColor( "#FBFBFB" );
new TopBar( this ); auto* topBar = new TopBar( this );
addItem( topBar );
auto* gridBox = new QskGridBox( this ); auto* gridBox = new QskGridBox( this );
gridBox->setSpacing( 15 );
gridBox->setMargins( {15, 0, 15, 20} ); gridBox->setMargins( {15, 0, 15, 20} );
gridBox->setPanel( true ); gridBox->setPanel( true );
gridBox->setBoxShapeHint( QskBox::Panel, 6 ); gridBox->setBoxShapeHint( QskBox::Panel, 6 );
gridBox->setBoxBorderMetricsHint( QskBox::Panel, 2 ); gridBox->setBoxBorderMetricsHint( QskBox::Panel, 2 );
addItem( gridBox );
auto* usage = new Usage( gridBox ); auto* usage = new Usage( gridBox );
auto* usageShadowBox = new ShadowBox( usage, this );
gridBox->addItem( usageShadowBox, 0, 0, 2, 1 ); gridBox->addItem( usage, 0, 0, 2, 1 );
auto* indoorTemperature = new IndoorTemperature( gridBox ); auto* indoorTemperature = new IndoorTemperature( gridBox );
gridBox->addItem( indoorTemperature, 0, 1 ); gridBox->addItem( indoorTemperature, 0, 1 );
@ -49,4 +98,13 @@ MainContent::MainContent( QQuickItem* parent ) : QskLinearBox( Qt::Vertical, par
auto* lightIntensity = new LightIntensity( gridBox ); auto* lightIntensity = new LightIntensity( gridBox );
gridBox->addItem( lightIntensity, 2, 2 ); gridBox->addItem( lightIntensity, 2, 2 );
m_shadowPositioner = new ShadowPositioner( this );
m_shadowPositioner->setGridBox( gridBox );
}
void MainContent::geometryChanged( const QRectF& newGeometry, const QRectF& oldGeometry )
{
QskLinearBox::geometryChanged( newGeometry, oldGeometry );
m_shadowPositioner->polish();
} }

View File

@ -3,6 +3,24 @@
#include <QskLinearBox.h> #include <QskLinearBox.h>
class QskGridBox;
class ShadowBox;
class ShadowedRectangle;
class ShadowPositioner : public QskControl
{
Q_OBJECT
public:
ShadowPositioner( QQuickItem* parent );
void updateLayout() override;
void setGridBox( QskGridBox* gridBox );
private:
QskGridBox* m_gridBox;
QVector<ShadowedRectangle*> m_rectangles;
};
class MainContent : public QskLinearBox class MainContent : public QskLinearBox
{ {
Q_OBJECT Q_OBJECT
@ -10,8 +28,12 @@ class MainContent : public QskLinearBox
public: public:
MainContent( QQuickItem* parent ); MainContent( QQuickItem* parent );
protected:
void geometryChanged( const QRectF&, const QRectF& ) override;
private: private:
QList< QskLinearBox* > m_columns; QList< QskLinearBox* > m_columns;
ShadowPositioner* m_shadowPositioner;
}; };
#endif // MAINCONTENT_H #endif // MAINCONTENT_H

View File

@ -6,6 +6,7 @@
Usage::Usage( QQuickItem* parent ) Usage::Usage( QQuickItem* parent )
: Box( "Usage", parent ) : Box( "Usage", parent )
{ {
setBackgroundColor( Qt::transparent );
auto* content = new QskLinearBox( Qt::Vertical, this ); auto* content = new QskLinearBox( Qt::Vertical, this );
auto* today = new QskLinearBox( Qt::Horizontal, content ); auto* today = new QskLinearBox( Qt::Horizontal, content );