|
17 | 17 |
|
18 | 18 | #include "qgscheckablecombobox.h" |
19 | 19 |
|
| 20 | +#include <QEvent> |
| 21 | +#include <QMouseEvent> |
20 | 22 | #include <QLineEdit> |
| 23 | +#include <QPoint> |
21 | 24 | #include <QAbstractItemView> |
22 | 25 |
|
23 | 26 |
|
@@ -81,6 +84,16 @@ QgsCheckableComboBox::QgsCheckableComboBox( QWidget *parent ) |
81 | 84 | lineEdit->setReadOnly( true ); |
82 | 85 | setLineEdit( lineEdit ); |
83 | 86 |
|
| 87 | + mContextMenu = new QMenu( this ); |
| 88 | + mSelectAllAction = mContextMenu->addAction( tr( "Select all" ) ); |
| 89 | + mDeselectAllAction = mContextMenu->addAction( tr( "Deselect all" ) ); |
| 90 | + connect( mSelectAllAction, &QAction::triggered, this, &QgsCheckableComboBox::selectAllOptions ); |
| 91 | + connect( mDeselectAllAction, &QAction::triggered, this, &QgsCheckableComboBox::deselectAllOptions ); |
| 92 | + |
| 93 | + view()->viewport()->installEventFilter( this ); |
| 94 | + view()->setContextMenuPolicy( Qt::CustomContextMenu ); |
| 95 | + connect( view(), &QAbstractItemView::customContextMenuRequested, this, &QgsCheckableComboBox::showContextMenu ); |
| 96 | + |
84 | 97 | QgsCheckableItemModel *myModel = qobject_cast<QgsCheckableItemModel *>( model() ); |
85 | 98 | connect( myModel, &QgsCheckableItemModel::itemCheckStateChanged, this, &QgsCheckableComboBox::updateCheckedItems ); |
86 | 99 | connect( model(), &QStandardItemModel::rowsInserted, this, [ = ]( const QModelIndex &, int, int ) { updateCheckedItems(); } ); |
@@ -162,6 +175,49 @@ void QgsCheckableComboBox::hidePopup() |
162 | 175 | } |
163 | 176 | } |
164 | 177 |
|
| 178 | +void QgsCheckableComboBox::showContextMenu( const QPoint &pos ) |
| 179 | +{ |
| 180 | + Q_UNUSED( pos ); |
| 181 | + |
| 182 | + mContextMenu->exec( QCursor::pos() ); |
| 183 | +} |
| 184 | + |
| 185 | +void QgsCheckableComboBox::selectAllOptions() |
| 186 | +{ |
| 187 | + blockSignals( true ); |
| 188 | + for ( int i; i < count(); i++ ) |
| 189 | + { |
| 190 | + setItemData( i, Qt::Checked, Qt::CheckStateRole ); |
| 191 | + } |
| 192 | + blockSignals( false ); |
| 193 | + updateCheckedItems(); |
| 194 | +} |
| 195 | + |
| 196 | +void QgsCheckableComboBox::deselectAllOptions() |
| 197 | +{ |
| 198 | + blockSignals( true ); |
| 199 | + for ( int i; i < count(); i++ ) |
| 200 | + { |
| 201 | + setItemData( i, Qt::Unchecked, Qt::CheckStateRole ); |
| 202 | + } |
| 203 | + blockSignals( false ); |
| 204 | + updateCheckedItems(); |
| 205 | +} |
| 206 | + |
| 207 | +bool QgsCheckableComboBox::eventFilter( QObject *object, QEvent *event ) |
| 208 | +{ |
| 209 | + Q_UNUSED( object ); |
| 210 | + |
| 211 | + if ( event->type() == QEvent::MouseButtonRelease ) |
| 212 | + { |
| 213 | + if ( static_cast<QMouseEvent *>( event )->button() == Qt::RightButton ) |
| 214 | + { |
| 215 | + return true; |
| 216 | + } |
| 217 | + } |
| 218 | + return false; |
| 219 | +} |
| 220 | + |
165 | 221 | void QgsCheckableComboBox::setCheckedItems( const QStringList &items ) |
166 | 222 | { |
167 | 223 | Q_FOREACH ( const QString &text, items ) |
@@ -202,3 +258,4 @@ void QgsCheckableComboBox::updateDisplayText() |
202 | 258 | text = fontMetrics.elidedText( text, Qt::ElideRight, rect.width() ); |
203 | 259 | setEditText( text ); |
204 | 260 | } |
| 261 | + |
0 commit comments