QGIS API Documentation 3.99.0-Master (18a1e75d814)
Loading...
Searching...
No Matches
qgsprocessingenummodelerwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprocessingenummodelerwidget.cpp
3 ------------------------------------
4 Date : March 2020
5 Copyright : (C) 2020 Alexander Bruy
6 Email : alexander dot bruy at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgsgui.h"
19
20#include <QMessageBox>
21#include <QToolButton>
22
23#include "moc_qgsprocessingenummodelerwidget.cpp"
24
26
27QgsProcessingEnumModelerWidget::QgsProcessingEnumModelerWidget( QWidget *parent )
28 : QWidget( parent )
29{
30 setupUi( this );
31
32 mModel = new QStandardItemModel( this );
33 mItemList->setModel( mModel );
34 connect( mModel, &QStandardItemModel::itemChanged, this, &QgsProcessingEnumModelerWidget::onItemChanged );
35
36 connect( mButtonAdd, &QToolButton::clicked, this, &QgsProcessingEnumModelerWidget::addItem );
37 connect( mButtonRemove, &QToolButton::clicked, this, [this] { removeItems( false ); } );
38 connect( mButtonClear, &QToolButton::clicked, this, [this] { removeItems( true ); } );
39}
40
41void QgsProcessingEnumModelerWidget::addItem()
42{
43 QStandardItem *item = new QStandardItem( tr( "new item" ) );
44 item->setCheckable( true );
45 item->setDropEnabled( false );
46 item->setData( Qt::Unchecked );
47 mModel->appendRow( item );
48 emit changed();
49}
50
51void QgsProcessingEnumModelerWidget::removeItems( const bool removeAll )
52{
53 if ( removeAll )
54 {
55 if ( QMessageBox::question( nullptr, tr( "Delete items" ), tr( "Are you sure you want to delete all items" ), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) == QMessageBox::Yes )
56 mModel->clear();
57 }
58 else
59 {
60 QModelIndexList selected = mItemList->selectionModel()->selectedIndexes();
61 QSet<int> rows;
62 rows.reserve( selected.count() );
63 for ( const QModelIndex &i : selected )
64 rows << i.row();
65
66 QList<int> rowsToDelete = qgis::setToList( rows );
67 std::sort( rowsToDelete.begin(), rowsToDelete.end(), std::greater<int>() );
68
69 mItemList->setUpdatesEnabled( false );
70 for ( int i : std::as_const( rowsToDelete ) )
71 mModel->removeRows( i, 1 );
72 mItemList->setUpdatesEnabled( true );
73 }
74 emit changed();
75}
76
77void QgsProcessingEnumModelerWidget::onItemChanged( QStandardItem *item )
78{
79 int checkedItemIndex = -1;
80 for ( int i = 0; i < mModel->rowCount(); i++ )
81 {
82 QStandardItem *itm = mModel->item( i );
83 if ( itm->checkState() == Qt::Checked && itm->data() == Qt::Checked )
84 {
85 checkedItemIndex = i;
86 break;
87 }
88 }
89
90 mModel->blockSignals( true );
91 if ( checkedItemIndex < 0 )
92 {
93 item->setData( item->checkState() );
94 }
95 else
96 {
97 if ( mAllowMultiple->isChecked() )
98 {
99 item->setData( item->checkState() );
100 }
101 else
102 {
103 mModel->item( checkedItemIndex )->setCheckState( Qt::Unchecked );
104 mModel->item( checkedItemIndex )->setData( Qt::Unchecked );
105 item->setData( item->checkState() );
106 }
107 }
108 mModel->blockSignals( false );
109 emit changed();
110}
111
112QStringList QgsProcessingEnumModelerWidget::options() const
113{
114 QStringList options;
115 options.reserve( mModel->rowCount() );
116 for ( int i = 0; i < mModel->rowCount(); ++i )
117 {
118 options << mModel->item( i )->text();
119 }
120 return options;
121}
122
123void QgsProcessingEnumModelerWidget::setOptions( const QStringList &options )
124{
125 for ( const QString &option : options )
126 {
127 QStandardItem *item = new QStandardItem( option );
128 item->setCheckable( true );
129 item->setDropEnabled( false );
130 item->setData( Qt::Unchecked );
131 mModel->appendRow( item );
132 }
133 emit changed();
134}
135
136QVariant QgsProcessingEnumModelerWidget::defaultOptions() const
137{
138 QVariantList defaults;
139 for ( int i = 0; i < mModel->rowCount(); ++i )
140 {
141 if ( mModel->item( i )->checkState() == Qt::Checked )
142 defaults << i;
143 }
144 QVariant val( defaults );
145 return val;
146}
147
148void QgsProcessingEnumModelerWidget::setDefaultOptions( const QVariant &defaultValue )
149{
150 if ( !defaultValue.isValid() )
151 return;
152
153 QVariant val = defaultValue;
154 QList<int> values;
155 if ( val.userType() == QMetaType::Type::QVariantList || val.userType() == QMetaType::Type::QStringList )
156 {
157 for ( const QVariant &var : val.toList() )
158 values << var.toInt();
159 }
160 else if ( val.userType() == QMetaType::Type::QString )
161 {
162 QStringList split = val.toString().split( ',' );
163 for ( const QString &var : split )
164 values << var.toInt();
165 }
166 else if ( val.userType() == QMetaType::Type::Int )
167 {
168 values << val.toInt();
169 }
170
171 QStandardItem *item;
172 for ( const int &i : values )
173 {
174 item = mModel->item( i );
175 if ( item )
176 {
177 item->setCheckState( Qt::Checked );
178 item->setData( Qt::Checked );
179 }
180 }
181 emit changed();
182}
183
184bool QgsProcessingEnumModelerWidget::allowMultiple() const
185{
186 return mAllowMultiple->isChecked();
187}
188
189void QgsProcessingEnumModelerWidget::setAllowMultiple( bool allowMultiple )
190{
191 mAllowMultiple->setChecked( allowMultiple );
192 emit changed();
193}
194