From 99cb893f151cb3d3c2e56d26d809a7d31e3dfb48 Mon Sep 17 00:00:00 2001 From: Clemens Manert Date: Mon, 1 May 2023 17:07:21 +0200 Subject: [PATCH] Adds alignment property --- src/layouts/QskDrawer.cpp | 88 ++++++++++++++++++++++++++++++++------- src/layouts/QskDrawer.h | 4 ++ 2 files changed, 76 insertions(+), 16 deletions(-) diff --git a/src/layouts/QskDrawer.cpp b/src/layouts/QskDrawer.cpp index f904d280..91c3893e 100644 --- a/src/layouts/QskDrawer.cpp +++ b/src/layouts/QskDrawer.cpp @@ -14,6 +14,7 @@ public: QskControl* content; QskBox* contentBox; Qt::Edge edge = Qt::LeftEdge; + Qt::Alignment alignment = Qt::AlignCenter; }; QskDrawer::QskDrawer( QQuickItem* parentItem ) : @@ -26,11 +27,11 @@ QskDrawer::QskDrawer( QQuickItem* parentItem ) : m_data->contentBox = new QskBox(this); m_data->contentBox->setSubcontrolProxy( QskBox::Panel, Panel ); - - setAnimationHint( Panel | QskAspect::Position, QskAnimationHint( 1000 ) ); + + setAnimationHint( Panel | QskAspect::Position, QskAnimationHint( 5000 ) ); setFaderAspect( Panel | QskAspect::Metric ); - + setSkinHint( Overlay | QskAspect::Style, false ); connect(this, &QskDrawer::closed, this, [this](){ @@ -44,62 +45,117 @@ QskDrawer::~QskDrawer() { } -Qt::Edge QskDrawer::edge() const { +Qt::Edge QskDrawer::edge() const { return m_data->edge; } +Qt::Alignment QskDrawer::alignment() const { + return m_data->alignment; +} + void QskDrawer::setEdge( Qt::Edge edge ) { if( m_data->edge == edge ) { return; } + update(); m_data->edge = edge; edgeChanged( edge ); } +void QskDrawer::setAlignment( Qt::Alignment alignment ) { + if( m_data->alignment == alignment ) { + return; + } + + update(); + m_data->alignment = alignment; + alignmentChanged( alignment ); +} + void QskDrawer::setContent( QskControl* content ) { content->setParentItem( m_data->contentBox ); m_data->content = content; } void QskDrawer::updateLayout() { - auto size = m_data->content->preferredSize(); - + const auto& contentSize = m_data->content->preferredSize(); + const auto& parentSize = parentItem()->size(); + switch( m_data->edge ) { case Qt::Edge::LeftEdge: { - qreal off = metric( faderAspect() ) * size.width(); + qreal x = metric( faderAspect() ) * contentSize.width() * -1.0; + qreal y = 0; + + if( alignment().testFlag( Qt::AlignVCenter ) ) { + y = ( parentSize.height() - contentSize.height() ) / 2.0; + } else if ( alignment().testFlag( Qt::AlignBottom ) ) { + y = ( parentSize.height() - contentSize.height() ); + } + qskSetItemGeometry( m_data->contentBox, - -off, 0, size.width(), size.height()); + x, y, + contentSize.width(), parentSize.height() ); break; } case Qt::Edge::RightEdge: { - qreal off = metric( faderAspect() ) * size.width(); + qreal x = ( metric( faderAspect() ) * contentSize.width() ) + + parentSize.width() + - contentSize.width(); + qreal y = 0; + + if( alignment().testFlag( Qt::AlignVCenter ) ) { + y = ( parentSize.height() - contentSize.height() ) / 2.0; + } else if ( alignment().testFlag( Qt::AlignBottom ) ) { + y = ( parentSize.height() - contentSize.height() ); + } + qskSetItemGeometry( m_data->contentBox, - size.width() + off, 0, size.width(), size.height()); + x, y, + contentSize.width(), + parentSize.height() ); break; } case Qt::Edge::TopEdge: { - qreal off = metric( faderAspect() ) * size.height(); + qreal x = 0; + qreal y = metric( faderAspect() ) * contentSize.height(); + + if( alignment().testFlag( Qt::AlignCenter) ) { + x = ( parentSize.width() - contentSize.width() ) / 2; + } else if( alignment().testFlag( Qt::AlignRight) ) { + x = ( parentSize.width() - contentSize.width() ); + } + qskSetItemGeometry( m_data->contentBox, - 0, -off, size.width(), size.height()); + x, -y, + parentSize.width(), contentSize.height()); break; } case Qt::Edge::BottomEdge: { - qreal off = metric( faderAspect() ) * size.height(); + qreal x = 0; + qreal y = metric( faderAspect() ) * contentSize.height() + parentSize.height() - contentSize.height(); + + if( alignment().testFlag( Qt::AlignCenter) ) { + x = ( parentSize.width() - contentSize.width() ) / 2; + } else if( alignment().testFlag( Qt::AlignRight) ) { + x = ( parentSize.width() - contentSize.width() ); + } + qskSetItemGeometry( m_data->contentBox, - 0, size.height() + off, size.width(), size.height()); + x, y, + parentSize.width(), contentSize.height()); break; } break; - } - + } + Inherited::updateLayout(); } diff --git a/src/layouts/QskDrawer.h b/src/layouts/QskDrawer.h index 98a7f6e1..06bb35f0 100644 --- a/src/layouts/QskDrawer.h +++ b/src/layouts/QskDrawer.h @@ -12,6 +12,7 @@ class QSK_EXPORT QskDrawer : public QskPopup using Inherited = QskPopup; Q_PROPERTY( Qt::Edge edge READ edge WRITE setEdge NOTIFY edgeChanged ) + Q_PROPERTY( Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged ) public: QSK_SUBCONTROLS( Panel ) @@ -19,17 +20,20 @@ class QSK_EXPORT QskDrawer : public QskPopup ~QskDrawer() override; Qt::Edge edge() const; + Qt::Alignment alignment() const; void updateLayout() override; void setContent( QskControl* t ); void setEdge( Qt::Edge edge ); + void setAlignment( Qt::Alignment aligmnent ); protected: void aboutToShow() override; Q_SIGNALS: void edgeChanged( Qt::Edge ); + void alignmentChanged( Qt::Alignment ); private: class PrivateData;