23 #include <QFileDialog> 24 #include <QMessageBox> 25 #include <QTextStream> 34 tableWidget->insertRow( 0 );
36 tableWidget->horizontalHeader()->setSectionsClickable(
true );
37 tableWidget->setSortingEnabled(
true );
39 connect( addNullButton, &QAbstractButton::clicked,
this, &QgsValueMapConfigDlg::addNullButtonPushed );
40 connect( removeSelectedButton, &QAbstractButton::clicked,
this, &QgsValueMapConfigDlg::removeSelectedButtonPushed );
41 connect( loadFromLayerButton, &QAbstractButton::clicked,
this, &QgsValueMapConfigDlg::loadFromLayerButtonPushed );
42 connect( loadFromCSVButton, &QAbstractButton::clicked,
this, &QgsValueMapConfigDlg::loadFromCSVButtonPushed );
43 connect( tableWidget, &QTableWidget::cellChanged,
this, &QgsValueMapConfigDlg::vCellChanged );
44 tableWidget->installEventFilter(
this );
49 QList<QVariant> valueList;
52 for (
int i = 0; i < tableWidget->rowCount() - 1; i++ )
54 QTableWidgetItem *ki = tableWidget->item( i, 0 );
55 QTableWidgetItem *vi = tableWidget->item( i, 1 );
60 QString ks = ki->text();
66 if ( !vi || vi->text().isNull() )
68 value.insert( ks, ks );
72 value.insert( vi->text(), ks );
74 valueList.append( value );
78 cfg.insert( QStringLiteral(
"map" ), valueList );
84 tableWidget->clearContents();
85 for (
int i = tableWidget->rowCount() - 1; i > 0; i-- )
87 tableWidget->removeRow( i );
90 QList<QVariant> valueList = config.value( QStringLiteral(
"map" ) ).toList();
92 if ( valueList.count() > 0 )
94 for (
int i = 0, row = 0; i < valueList.count(); i++, row++ )
96 setRow( row, valueList[i].toMap().constBegin().value().toString(), valueList[i].toMap().constBegin().key() );
102 QVariantMap values = config.value( QStringLiteral(
"map" ) ).toMap();
103 for ( QVariantMap::ConstIterator mit = values.constBegin(); mit != values.constEnd(); mit++, row++ )
105 if ( mit.value().isNull() )
106 setRow( row, mit.key(), QString() );
108 setRow( row, mit.value().toString(), mit.key() );
113 void QgsValueMapConfigDlg::vCellChanged(
int row,
int column )
116 if ( row == tableWidget->rowCount() - 1 )
118 tableWidget->insertRow( row + 1 );
124 void QgsValueMapConfigDlg::removeSelectedButtonPushed()
126 QList<QTableWidgetItem *> list = tableWidget->selectedItems();
127 QSet<int> rowsToRemove;
130 for ( i = 0; i < list.size(); i++ )
132 if ( list[i]->column() == 0 )
134 int row = list[i]->row();
135 if ( !rowsToRemove.contains( row ) )
137 rowsToRemove.insert( row );
141 for ( i = 0; i < rowsToRemove.size(); i++ )
143 tableWidget->removeRow( rowsToRemove.values().at( i ) - removed );
151 QList<QPair<QString, QVariant>> orderedMap;
152 auto end = map.constEnd();
153 for (
auto it = map.constBegin(); it != end; ++it )
155 orderedMap.append( qMakePair( it.key(), it.value() ) );
163 tableWidget->clearContents();
164 for (
int i = tableWidget->rowCount() - 1; i > 0; i-- )
166 tableWidget->removeRow( i );
176 for (
const auto &pair : list )
178 if ( pair.second.isNull() )
179 setRow( row, pair.first, QString() );
181 setRow( row, pair.first, pair.second.toString() );
187 const QList<QVariant> valueList = config.value( QStringLiteral(
"map" ) ).toList();
189 if ( !valueList.empty() )
191 for (
const QVariant &value : valueList )
193 const QVariantMap valueMap = value.toMap();
198 comboBox->addItem( valueMap.constBegin().key(), valueMap.constBegin().value() );
203 const QVariantMap map = config.value( QStringLiteral(
"map" ) ).toMap();
204 for (
auto it = map.constBegin(); it != map.constEnd(); ++it )
209 comboBox->addItem( it.key(), it.value() );
217 if ( event->type() == QEvent::KeyPress )
219 QKeyEvent *keyEvent =
static_cast<QKeyEvent *
>( event );
220 if ( keyEvent->matches( QKeySequence::Copy ) )
222 copySelectionToClipboard();
230 void QgsValueMapConfigDlg::setRow(
int row,
const QString &value,
const QString &description )
233 QTableWidgetItem *valueCell =
nullptr;
234 QTableWidgetItem *descriptionCell =
new QTableWidgetItem( description );
235 tableWidget->insertRow( row );
239 cellFont.setItalic(
true );
241 valueCell->setFont( cellFont );
242 valueCell->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
243 descriptionCell->setFont( cellFont );
247 valueCell =
new QTableWidgetItem( value );
249 tableWidget->setItem( row, 0, valueCell );
250 tableWidget->setItem( row, 1, descriptionCell );
253 void QgsValueMapConfigDlg::copySelectionToClipboard()
255 QAbstractItemModel *model = tableWidget->model();
256 QItemSelectionModel *selection = tableWidget->selectionModel();
257 const QModelIndexList indexes = selection->selectedIndexes();
259 QString clipboardText;
260 QModelIndex previous = indexes.first();
261 std::unique_ptr<QMimeData> mimeData = qgis::make_unique<QMimeData>();
262 for (
const QModelIndex ¤t : indexes )
264 const QString text = model->data( current ).toString();
265 if ( current.row() != previous.row() )
267 clipboardText.append(
'\n' );
269 else if ( current.column() != previous.column() )
271 clipboardText.append(
'\t' );
273 clipboardText.append( text );
276 mimeData->setData( QStringLiteral(
"text/plain" ), clipboardText.toUtf8() );
277 QApplication::clipboard()->setMimeData( mimeData.release() );
280 void QgsValueMapConfigDlg::addNullButtonPushed()
285 void QgsValueMapConfigDlg::loadFromLayerButtonPushed()
288 if ( !layerDialog.exec() )
294 void QgsValueMapConfigDlg::loadFromCSVButtonPushed()
298 QString fileName = QFileDialog::getOpenFileName(
nullptr, tr(
"Select a File" ), QDir::homePath() );
299 if ( fileName.isNull() )
304 if ( !f.open( QIODevice::ReadOnly ) )
306 QMessageBox::information(
nullptr,
307 tr(
"Load Value Map from File" ),
308 tr(
"Could not open file %1\nError was: %2" ).arg( fileName, f.errorString() ),
309 QMessageBox::Cancel );
314 s.setAutoDetectUnicode(
true );
316 QRegExp re0(
"^([^;]*);(.*)$" );
317 re0.setMinimal(
true );
318 QRegExp re1(
"^([^,]*),(.*)$" );
319 re1.setMinimal(
true );
321 QList<QPair<QString, QVariant>> map;
327 QString l = s.readLine().trimmed();
332 if ( re0.indexIn( l ) >= 0 && re0.captureCount() == 2 )
334 key = re0.cap( 1 ).trimmed();
335 val = re0.cap( 2 ).trimmed();
337 else if ( re1.indexIn( l ) >= 0 && re1.captureCount() == 2 )
339 key = re1.cap( 1 ).trimmed();
340 val = re1.cap( 2 ).trimmed();
345 if ( ( key.startsWith(
'\"' ) && key.endsWith(
'\"' ) ) ||
346 ( key.startsWith(
'\'' ) && key.endsWith(
'\'' ) ) )
348 key = key.mid( 1, key.length() - 2 );
351 if ( ( val.startsWith(
'\"' ) && val.endsWith(
'\"' ) ) ||
352 ( val.startsWith(
'\'' ) && val.endsWith(
'\'' ) ) )
354 val = val.mid( 1, val.length() - 2 );
360 map.append( qMakePair( key, val ) );
void updateMap(const QMap< QString, QVariant > &map, bool insertNull)
Updates the displayed table with the values from map.
This class is a composition of two QSettings instances:
QgsValueMapConfigDlg(QgsVectorLayer *vl, int fieldIdx, QWidget *parent)
bool eventFilter(QObject *watched, QEvent *event) override
void setConfig(const QVariantMap &config) override
Update the configuration widget to represent the given configuration.
QMap< QString, QVariant > & valueMap()
Returns the value map which is currently active.
QVariantMap config() override
Create a configuration from the current GUI state.
bool insertNull()
Returns true if the "Add NULL value" checkbox has been checked.
static QString nullRepresentation()
This string is used to represent the value NULL throughout QGIS.
Represents a vector layer which manages a vector based data sets.
static void populateComboBox(QComboBox *comboBox, const QVariantMap &configuration, bool skipNull)
Populates a comboBox with the appropriate entries based on a value map configuration.