Skip to content

Commit

Permalink
Merge pull request #35735 from alexbruy/fix-combobox
Browse files Browse the repository at this point in the history
fix handling of checked items in checkable combobox (fix #28658)
  • Loading branch information
alexbruy committed Apr 13, 2020
2 parents 3100c2f + 4d901cc commit 410ec85
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 15 deletions.
37 changes: 24 additions & 13 deletions src/gui/qgscheckablecombobox.cpp
Expand Up @@ -16,6 +16,7 @@
***************************************************************************/

#include "qgscheckablecombobox.h"
#include "qgsapplication.h"

#include <QEvent>
#include <QMouseEvent>
Expand Down Expand Up @@ -52,10 +53,10 @@ bool QgsCheckableItemModel::setData( const QModelIndex &index, const QVariant &v

if ( ok && role == Qt::CheckStateRole )
{
emit dataChanged( index, index );
emit itemCheckStateChanged();
emit itemCheckStateChanged( index );
}

emit dataChanged( index, index );
return ok;
}

Expand All @@ -82,6 +83,9 @@ QgsCheckableComboBox::QgsCheckableComboBox( QWidget *parent )

QLineEdit *lineEdit = new QLineEdit( this );
lineEdit->setReadOnly( true );
QPalette pal = qApp->palette();
pal.setBrush( QPalette::Base, pal.button() );
lineEdit->setPalette( pal );
setLineEdit( lineEdit );

mContextMenu = new QMenu( this );
Expand All @@ -94,12 +98,9 @@ QgsCheckableComboBox::QgsCheckableComboBox( QWidget *parent )
view()->setContextMenuPolicy( Qt::CustomContextMenu );
connect( view(), &QAbstractItemView::customContextMenuRequested, this, &QgsCheckableComboBox::showContextMenu );

QgsCheckableItemModel *myModel = qobject_cast<QgsCheckableItemModel *>( model() );
connect( myModel, &QgsCheckableItemModel::itemCheckStateChanged, this, &QgsCheckableComboBox::updateCheckedItems );
connect( model(), &QStandardItemModel::rowsInserted, this, [ = ]( const QModelIndex &, int, int ) { updateCheckedItems(); } );
connect( model(), &QStandardItemModel::rowsRemoved, this, [ = ]( const QModelIndex &, int, int ) { updateCheckedItems(); } );

connect( this, static_cast< void ( QComboBox::* )( int ) >( &QComboBox::activated ), this, &QgsCheckableComboBox::toggleItemCheckState );
connect( model(), &QStandardItemModel::rowsInserted, this, [ = ]( const QModelIndex &, int, int ) { updateDisplayText(); } );
connect( model(), &QStandardItemModel::rowsRemoved, this, [ = ]( const QModelIndex &, int, int ) { updateDisplayText(); } );
connect( model(), &QStandardItemModel::dataChanged, this, [ = ]( const QModelIndex &, const QModelIndex &, const QVector< int > & ) { updateDisplayText(); } );
}

QString QgsCheckableComboBox::separator() const
Expand Down Expand Up @@ -230,15 +231,25 @@ bool QgsCheckableComboBox::eventFilter( QObject *object, QEvent *event )
&& object == view()->viewport() )
{
mSkipHide = true;
}

if ( event->type() == QEvent::MouseButtonRelease )
{
if ( static_cast<QMouseEvent *>( event )->button() == Qt::RightButton )
if ( event->type() == QEvent::MouseButtonRelease && static_cast<QMouseEvent *>( event )->button() == Qt::RightButton )
{
return true;
}

if ( event->type() == QEvent::MouseButtonRelease )
{
QModelIndex index = view()->indexAt( static_cast<QMouseEvent *>( event )->pos() );
if ( index.isValid() )
{
QgsCheckableItemModel *myModel = qobject_cast<QgsCheckableItemModel *>( model() );
QStandardItem *item = myModel->itemFromIndex( index );
item->checkState() == Qt::Checked ? item->setCheckState( Qt::Unchecked ) : item->setCheckState( Qt::Checked );
}
return true;
}
}

return QComboBox::eventFilter( object, event );
}

Expand All @@ -250,6 +261,7 @@ void QgsCheckableComboBox::setCheckedItems( const QStringList &items )
const int index = findText( text );
setItemCheckState( index, index != -1 ? Qt::Checked : Qt::Unchecked );
}
updateCheckedItems();
}

void QgsCheckableComboBox::resizeEvent( QResizeEvent *event )
Expand Down Expand Up @@ -283,4 +295,3 @@ void QgsCheckableComboBox::updateDisplayText()
text = fontMetrics.elidedText( text, Qt::ElideRight, rect.width() );
setEditText( text );
}

4 changes: 2 additions & 2 deletions src/gui/qgscheckablecombobox.h
Expand Up @@ -77,9 +77,9 @@ class QgsCheckableItemModel : public QStandardItemModel
signals:

/**
* Emitted whenever the items checkstate has changed.
* Emitted whenever the item's checkstate has changed.
*/
void itemCheckStateChanged();
void itemCheckStateChanged( const QModelIndex &index );
};


Expand Down

0 comments on commit 410ec85

Please sign in to comment.