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

View File

@ -8,7 +8,6 @@
#include "QskQmlGlobal.h"
#include <QskStackBox.h>
#include <QskLinearBox.h>
#include <QskGridBox.h>
@ -47,31 +46,6 @@ class QskLayoutBoxQml : public LayoutBox
// QML does not like a const version
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 >

View File

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

View File

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

View File

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

View File

@ -34,11 +34,9 @@ class QSK_EXPORT QskStackBox : public QskIndexedLayoutBox
QQuickItem* itemAtIndex( int index ) const;
int indexOf( const QQuickItem* ) const;
void addItem(
QQuickItem*, Qt::Alignment alignment = Qt::Alignment() );
void addItem( QQuickItem* );
void insertItem(
int index, QQuickItem*, Qt::Alignment alignment = Qt::Alignment() );
void insertItem( int index, QQuickItem* );
void removeItem( const QQuickItem* );
void removeAt( int index );
@ -49,12 +47,6 @@ class QSK_EXPORT QskStackBox : public QskIndexedLayoutBox
void setDefaultAlignment( Qt::Alignment );
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* );
const QskStackBoxAnimator* animator() const;
QskStackBoxAnimator* animator();