using QskControl::alignmentHint instead of QskStackBox:.setAlignmentOf

This commit is contained in:
Uwe Rathmann 2019-09-05 11:45:25 +02:00
parent 6a588dc95a
commit 72aee9970c
6 changed files with 34 additions and 142 deletions

View File

@ -25,6 +25,7 @@ namespace
setObjectName( "StackBox" ); setObjectName( "StackBox" );
setBackgroundColor( Qt::white ); setBackgroundColor( Qt::white );
setDefaultAlignment( Qt::AlignCenter );
setMargins( 30 ); setMargins( 30 );
@ -77,7 +78,7 @@ namespace
{ {
auto rect = new TestRectangle( colorName ); auto rect = new TestRectangle( colorName );
rect->setText( QString::number( itemCount() + 1 ) ); rect->setText( QString::number( itemCount() + 1 ) );
addItem( rect, Qt::AlignCenter ); addItem( rect );
} }
int incrementedIndex( int offset ) const int incrementedIndex( int offset ) const

View File

@ -8,7 +8,6 @@
#include "QskQmlGlobal.h" #include "QskQmlGlobal.h"
#include <QskStackBox.h>
#include <QskLinearBox.h> #include <QskLinearBox.h>
#include <QskGridBox.h> #include <QskGridBox.h>
@ -47,31 +46,6 @@ class QskLayoutBoxQml : public LayoutBox
// QML does not like a const version // QML does not like a const version
LayoutBox::removeItem( item ); LayoutBox::removeItem( item );
} }
Q_INVOKABLE void setAlignment( QQuickItem* item, Qt::Alignment alignment )
{
LayoutBox::setAlignment( item, alignment );
}
Q_INVOKABLE Qt::Alignment alignment( QQuickItem* item ) const
{
return LayoutBox::alignment( item );
}
};
class QskStackBoxQml : public QskLayoutBoxQml< QskStackBox >
{
Q_OBJECT
Q_INVOKABLE void setAlignmentAt( int index, Qt::Alignment alignment )
{
QskStackBox::setAlignmentAt( index, alignment );
}
Q_INVOKABLE Qt::Alignment alignmentAt( int index ) const
{
return QskStackBox::alignmentAt( index );
}
}; };
class QskLinearBoxQml : public QskLayoutBoxQml< QskLinearBox > class QskLinearBoxQml : public QskLayoutBoxQml< QskLinearBox >

View File

@ -243,7 +243,6 @@ void QskQml::registerTypes()
#if 1 #if 1
QSK_REGISTER( QskGridBoxQml, "GridBox" ); QSK_REGISTER( QskGridBoxQml, "GridBox" );
QSK_REGISTER( QskLinearBoxQml, "LinearBox" ); QSK_REGISTER( QskLinearBoxQml, "LinearBox" );
QSK_REGISTER( QskStackBoxQml, "StackBox" );
#else #else
QskGridBoxQml gridBox; QskGridBoxQml gridBox;
#endif #endif

View File

@ -113,7 +113,7 @@ int QskTabView::insertTab( int index, QskTabButton* button, QQuickItem* item )
item->setParent( this ); item->setParent( this );
index = m_data->tabBar->insertTab( index, button ); index = m_data->tabBar->insertTab( index, button );
m_data->stackBox->insertItem( index, item, Qt::Alignment() ); m_data->stackBox->insertItem( index, item );
return index; return index;
} }

View File

@ -35,31 +35,10 @@ static qreal qskConstrainedValue( QskLayoutConstraint::Type type,
return constrainedValue; return constrainedValue;
} }
namespace
{
class ItemInfo
{
public:
inline ItemInfo()
: item( nullptr )
{
}
inline ItemInfo( Qt::Alignment alignment, QQuickItem* item )
: alignment( alignment )
, item( item )
{
}
Qt::Alignment alignment;
QQuickItem* item;
};
}
class QskStackBox::PrivateData class QskStackBox::PrivateData
{ {
public: public:
QVector< ItemInfo > itemInfos; QVector< QQuickItem* > items;
QPointer< QskStackBoxAnimator > animator; QPointer< QskStackBoxAnimator > animator;
int currentIndex = -1; int currentIndex = -1;
@ -140,24 +119,21 @@ QskStackBoxAnimator* QskStackBox::effectiveAnimator()
int QskStackBox::itemCount() const int QskStackBox::itemCount() const
{ {
return m_data->itemInfos.count(); return m_data->items.count();
} }
QQuickItem* QskStackBox::itemAtIndex( int index ) const QQuickItem* QskStackBox::itemAtIndex( int index ) const
{ {
if ( index >= 0 && index < m_data->itemInfos.count() ) return m_data->items.value( index );
return m_data->itemInfos[ index ].item;
return nullptr;
} }
int QskStackBox::indexOf( const QQuickItem* item ) const int QskStackBox::indexOf( const QQuickItem* item ) const
{ {
if ( item && ( item->parentItem() != this ) ) if ( item && ( item->parentItem() != this ) )
{ {
for ( int i = 0; i < m_data->itemInfos.count(); i++ ) for ( int i = 0; i < m_data->items.count(); i++ )
{ {
if ( item == m_data->itemInfos[i].item ) if ( item == m_data->items[i] )
return i; return i;
} }
} }
@ -220,13 +196,12 @@ void QskStackBox::setCurrentItem( const QQuickItem* item )
setCurrentIndex( indexOf( item ) ); setCurrentIndex( indexOf( item ) );
} }
void QskStackBox::addItem( QQuickItem* item, Qt::Alignment alignment ) void QskStackBox::addItem( QQuickItem* item )
{ {
insertItem( -1, item, alignment ); insertItem( -1, item );
} }
void QskStackBox::insertItem( void QskStackBox::insertItem( int index, QQuickItem* item )
int index, QQuickItem* item, Qt::Alignment alignment )
{ {
if ( item == nullptr ) if ( item == nullptr )
return; return;
@ -251,30 +226,21 @@ void QskStackBox::insertItem(
if ( ( index == oldIndex ) || ( doAppend && ( oldIndex == itemCount() - 1 ) ) ) if ( ( index == oldIndex ) || ( doAppend && ( oldIndex == itemCount() - 1 ) ) )
{ {
// already in place // already in place
auto& itemInfo = m_data->itemInfos[oldIndex];
if ( alignment != itemInfo.alignment )
{
itemInfo.alignment = alignment;
polish();
}
return; return;
} }
m_data->itemInfos.removeAt( oldIndex ); m_data->items.removeAt( oldIndex );
} }
} }
if ( doAppend ) if ( doAppend )
index = itemCount(); index = itemCount();
m_data->itemInfos.insert( index, { alignment, item } ); m_data->items.insert( index, item );
const int oldCurrentIndex = m_data->currentIndex; const int oldCurrentIndex = m_data->currentIndex;
if ( m_data->itemInfos.count() == 1 ) if ( m_data->items.count() == 1 )
{ {
m_data->currentIndex = 0; m_data->currentIndex = 0;
item->setVisible( true ); item->setVisible( true );
@ -301,19 +267,19 @@ void QskStackBox::removeAt( int index )
void QskStackBox::removeItemInternal( int index, bool unparent ) void QskStackBox::removeItemInternal( int index, bool unparent )
{ {
if ( index < 0 || index >= m_data->itemInfos.count() ) if ( index < 0 || index >= m_data->items.count() )
return; return;
if ( !unparent ) if ( !unparent )
{ {
if ( auto item = m_data->itemInfos[ index ].item ) if ( auto item = m_data->items[ index ] )
{ {
if ( item->parentItem() == this ) if ( item->parentItem() == this )
item->setParentItem( nullptr ); item->setParentItem( nullptr );
} }
} }
m_data->itemInfos.removeAt( index ); m_data->items.removeAt( index );
if ( index <= m_data->currentIndex ) if ( index <= m_data->currentIndex )
Q_EMIT currentIndexChanged( --m_data->currentIndex ); Q_EMIT currentIndexChanged( --m_data->currentIndex );
@ -339,21 +305,15 @@ void QskStackBox::autoRemoveItem( QQuickItem* item )
void QskStackBox::clear( bool autoDelete ) void QskStackBox::clear( bool autoDelete )
{ {
for ( const auto& itemInfo : qskAsConst( m_data->itemInfos ) ) for ( const auto item : qskAsConst( m_data->items ) )
{ {
auto item = itemInfo.item;
if( autoDelete && ( item->parent() == this ) ) if( autoDelete && ( item->parent() == this ) )
{
delete item; delete item;
}
else else
{
item->setParentItem( nullptr ); item->setParentItem( nullptr );
}
} }
m_data->itemInfos.clear(); m_data->items.clear();
if ( m_data->currentIndex >= 0 ) if ( m_data->currentIndex >= 0 )
{ {
@ -362,45 +322,17 @@ void QskStackBox::clear( bool autoDelete )
} }
} }
void QskStackBox::setAlignment( const QQuickItem* item, Qt::Alignment alignment )
{
setAlignmentAt( indexOf( item ), alignment );
}
Qt::Alignment QskStackBox::alignment( const QQuickItem* item ) const
{
return alignmentAt( indexOf( item ) );
}
void QskStackBox::setAlignmentAt( int index, Qt::Alignment alignment )
{
if ( index < 0 || index >= m_data->itemInfos.count() )
return;
m_data->itemInfos[ index ].alignment = alignment;
if ( index == m_data->currentIndex )
polish();
}
Qt::Alignment QskStackBox::alignmentAt( int index ) const
{
if ( index >= 0 && index < m_data->itemInfos.count() )
return m_data->itemInfos[ index ].alignment;
return Qt::Alignment();
}
QRectF QskStackBox::geometryForItemAt( int index ) const QRectF QskStackBox::geometryForItemAt( int index ) const
{ {
const auto r = layoutRect(); const auto r = layoutRect();
if ( index >= 0 && index < m_data->itemInfos.count() ) if ( const auto item = m_data->items.value( index ) )
{ {
const auto& info = m_data->itemInfos[ index ]; auto alignment = QskLayoutConstraint::layoutAlignmentHint( item );
if ( alignment == 0 )
alignment = m_data->defaultAlignment;
const auto align = info.alignment ? info.alignment : m_data->defaultAlignment; return QskLayoutConstraint::boundedRect( item, r, alignment );
return QskLayoutConstraint::boundedRect( info.item, r, align );
} }
return QRectF( r.x(), r.y(), 0.0, 0.0 ); return QRectF( r.x(), r.y(), 0.0, 0.0 );
@ -411,12 +343,12 @@ void QskStackBox::updateLayout()
if ( maybeUnresized() ) if ( maybeUnresized() )
return; return;
const auto idx = m_data->currentIndex; const auto index = m_data->currentIndex;
if ( idx >= 0 ) if ( index >= 0 )
{ {
const auto rect = geometryForItemAt( idx ); const auto rect = geometryForItemAt( index );
qskSetItemGeometry( m_data->itemInfos[ idx ].item, rect ); qskSetItemGeometry( m_data->items[ index ], rect );
} }
} }
@ -434,10 +366,8 @@ QSizeF QskStackBox::contentsSizeHint() const
int constraintTypes = Unconstrained; int constraintTypes = Unconstrained;
for ( const auto& itemInfo : qskAsConst( m_data->itemInfos ) ) for ( const auto item : qskAsConst( m_data->items ) )
{ {
const auto item = itemInfo.item;
const auto type = constraintType( item ); const auto type = constraintType( item );
if ( type != Unconstrained ) if ( type != Unconstrained )
{ {
@ -463,13 +393,11 @@ QSizeF QskStackBox::contentsSizeHint() const
{ {
const QSizeF constraint( -1, height ); const QSizeF constraint( -1, height );
for ( const auto& itemInfo : qskAsConst( m_data->itemInfos ) ) for ( const auto& item : qskAsConst( m_data->items ) )
{ {
const auto item = itemInfo.item;
if ( constraintType( item ) == WidthForHeight ) if ( constraintType( item ) == WidthForHeight )
{ {
const QSizeF hint = QskLayoutConstraint::sizeHint( const auto hint = QskLayoutConstraint::sizeHint(
item, Qt::PreferredSize, constraint ); item, Qt::PreferredSize, constraint );
width = qMax( width, hint.width() ); width = qMax( width, hint.width() );
@ -481,10 +409,8 @@ QSizeF QskStackBox::contentsSizeHint() const
{ {
const QSizeF constraint( width, -1 ); const QSizeF constraint( width, -1 );
for ( const auto& itemInfo : qskAsConst( m_data->itemInfos ) ) for ( const auto& item : qskAsConst( m_data->items ) )
{ {
const auto item = itemInfo.item;
if ( constraintType( item ) == HeightForWidth ) if ( constraintType( item ) == HeightForWidth )
{ {
const QSizeF hint = QskLayoutConstraint::sizeHint( const QSizeF hint = QskLayoutConstraint::sizeHint(

View File

@ -34,11 +34,9 @@ class QSK_EXPORT QskStackBox : public QskIndexedLayoutBox
QQuickItem* itemAtIndex( int index ) const; QQuickItem* itemAtIndex( int index ) const;
int indexOf( const QQuickItem* ) const; int indexOf( const QQuickItem* ) const;
void addItem( void addItem( QQuickItem* );
QQuickItem*, Qt::Alignment alignment = Qt::Alignment() );
void insertItem( void insertItem( int index, QQuickItem* );
int index, QQuickItem*, Qt::Alignment alignment = Qt::Alignment() );
void removeItem( const QQuickItem* ); void removeItem( const QQuickItem* );
void removeAt( int index ); void removeAt( int index );
@ -49,12 +47,6 @@ class QSK_EXPORT QskStackBox : public QskIndexedLayoutBox
void setDefaultAlignment( Qt::Alignment ); void setDefaultAlignment( Qt::Alignment );
Qt::Alignment defaultAlignment() const; Qt::Alignment defaultAlignment() const;
void setAlignmentAt( int index, Qt::Alignment );
Qt::Alignment alignmentAt( int index ) const;
void setAlignment( const QQuickItem*, Qt::Alignment );
Qt::Alignment alignment( const QQuickItem* ) const;
void setAnimator( QskStackBoxAnimator* ); void setAnimator( QskStackBoxAnimator* );
const QskStackBoxAnimator* animator() const; const QskStackBoxAnimator* animator() const;
QskStackBoxAnimator* animator(); QskStackBoxAnimator* animator();