Add checkbox-groups

This commit is contained in:
Clemens Manert 2022-04-04 00:57:02 +02:00
parent 79fbe1be2e
commit f529fda278
No known key found for this signature in database
GPG Key ID: 9197EAE8F85E3A18
2 changed files with 98 additions and 2 deletions

View File

@ -11,6 +11,8 @@ QSK_SYSTEM_STATE( QskCheckBox, PartiallyChecked, QskAspect::LastUserState << 2 )
struct QskCheckBox::PrivateData struct QskCheckBox::PrivateData
{ {
QSet< QskAbstractButton* > group;
int groupItemsChecked;
Qt::CheckState checkState; Qt::CheckState checkState;
bool checkStateChanging : 1; bool checkStateChanging : 1;
bool toggleChanging : 1; bool toggleChanging : 1;
@ -18,8 +20,9 @@ struct QskCheckBox::PrivateData
}; };
QskCheckBox::QskCheckBox( QQuickItem* parent ) QskCheckBox::QskCheckBox( QQuickItem* parent )
: Inherited( parent ), m_data( new PrivateData{ Qt::CheckState::Unchecked, : Inherited( parent )
false, false, false } ) { , m_data( new PrivateData { QSet< QskAbstractButton* >(), 0,
Qt::Unchecked, false, false, false } ) {
setAcceptHoverEvents( true ); setAcceptHoverEvents( true );
initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
@ -32,6 +35,7 @@ QskCheckBox::QskCheckBox( QQuickItem* parent )
QskCheckBox::~QskCheckBox() QskCheckBox::~QskCheckBox()
{ {
Q_EMIT removeFromAllGroupsRequested();
} }
bool QskCheckBox::isCheckable() const bool QskCheckBox::isCheckable() const
@ -92,4 +96,90 @@ void QskCheckBox::setTriState( bool triState )
} }
} }
void QskCheckBox::updated()
{
if( m_data->toggleChanging )
{
return;
}
auto& groupItemsChecked = m_data->groupItemsChecked;
if( groupItemsChecked == m_data->group.size() )
{
this->setCheckState( Qt::CheckState::Checked );
}
else if ( groupItemsChecked == 0 )
{
this->setCheckState( Qt::CheckState::Unchecked );
}
else
{
this->setCheckState( Qt::CheckState::PartiallyChecked );
}
}
void QskCheckBox::addToGroup( QskCheckBox* groupItem ) {
if( m_data->group.contains( groupItem ) )
{
return;
}
m_data->group.insert( groupItem );
if( groupItem->checkState() == Qt::CheckState::Checked )
{
m_data->groupItemsChecked += 1;
}
updated();
connect( this, &QskCheckBox::checkStateChanged,
groupItem, [ this, groupItem ] ( Qt::CheckState checkState )
{
if( checkState == Qt::Checked )
{
m_data->toggleChanging = true;
groupItem->setChecked( true );
m_data->groupItemsChecked = m_data->group.size();
m_data->toggleChanging = false;
}
else if ( checkState == Qt::Unchecked )
{
m_data->toggleChanging = true;
groupItem->setChecked( false );
m_data->groupItemsChecked = 0;
m_data->toggleChanging = false;
}
} );
connect( groupItem, &QskAbstractButton::toggled,
this, [ this, groupItem ] ( bool toggled )
{
auto& groupItemsChecked = m_data->groupItemsChecked;
groupItemsChecked += toggled ? 1 : -1;
updated();
} );
connect( groupItem, &QskCheckBox::removeFromAllGroupsRequested,
this, [ this, groupItem ] ( )
{
removeFromGroup( groupItem );
} );
}
void QskCheckBox::removeFromGroup( QskCheckBox* groupItem ) {
if( !m_data->group.remove( groupItem ) )
{
return;
}
if( groupItem->checkState() == Qt::CheckState::Checked )
{
m_data->groupItemsChecked -= 1;
}
updated();
}
#include "moc_QskCheckBox.cpp" #include "moc_QskCheckBox.cpp"

View File

@ -25,6 +25,9 @@ class QSK_EXPORT QskCheckBox : public QskAbstractButton
bool isTriState() const; bool isTriState() const;
bool isCheckable() const override final; bool isCheckable() const override final;
void addToGroup( QskCheckBox* groupItem );
void removeFromGroup( QskCheckBox* groupItem );
public Q_SLOTS: public Q_SLOTS:
void setCheckState( Qt::CheckState ); void setCheckState( Qt::CheckState );
void setTriState( bool triState = true ); void setTriState( bool triState = true );
@ -32,8 +35,11 @@ class QSK_EXPORT QskCheckBox : public QskAbstractButton
Q_SIGNALS: Q_SIGNALS:
void checkStateChanged( Qt::CheckState ); void checkStateChanged( Qt::CheckState );
void isTriStateChanged( bool ); void isTriStateChanged( bool );
void removeFromAllGroupsRequested();
private: private:
void setCheckStateInternal( Qt::CheckState ); void setCheckStateInternal( Qt::CheckState );
void updated();
struct PrivateData; struct PrivateData;
std::unique_ptr< PrivateData > m_data; std::unique_ptr< PrivateData > m_data;