26 #include <QPushButton> 29 #include <QMessageBox> 30 #include <QSortFilterProxyModel> 45 connect( mTreeView, &QTreeView::clicked,
this, &QgsCptCityColorRampDialog::mTreeView_clicked );
46 connect( mListWidget, &QListWidget::itemClicked,
this, &QgsCptCityColorRampDialog::mListWidget_itemClicked );
47 connect( mListWidget, &QListWidget::itemSelectionChanged,
this, &QgsCptCityColorRampDialog::mListWidget_itemSelectionChanged );
48 connect( tabBar, &QTabBar::currentChanged,
this, &QgsCptCityColorRampDialog::tabBar_currentChanged );
49 connect( pbtnLicenseDetails, &QToolButton::pressed,
this, &QgsCptCityColorRampDialog::pbtnLicenseDetails_pressed );
50 connect( cboVariantName,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsCptCityColorRampDialog::cboVariantName_currentIndexChanged );
51 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsCptCityColorRampDialog::showHelp );
53 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
false );
56 restoreGeometry( settings.
value( QStringLiteral(
"Windows/CptCityColorRampV2Dialog/geometry" ) ).toByteArray() );
57 mSplitter->setSizes( QList<int>() << 250 << 550 );
58 mSplitter->restoreState( settings.
value( QStringLiteral(
"Windows/CptCityColorRampV2Dialog/splitter" ) ).toByteArray() );
60 mModel = mAuthorsModel = mSelectionsModel =
nullptr;
61 mTreeFilter =
nullptr;
67 if ( ! mArchive || mArchive->
isEmpty() )
71 QTextEdit *edit =
new QTextEdit(
nullptr );
72 edit->setReadOnly(
true );
74 QString helpText = tr(
"Error - cpt-city gradient files not found.\n\n" 75 "You have two means of installing them:\n\n" 76 "1) Install the \"Color Ramp Manager\" python plugin " 77 "(you must enable Experimental plugins in the plugin manager) " 78 "and use it to download latest cpt-city package.\n" 79 "You can install the entire cpt-city archive or a selection for QGIS.\n\n" 80 "2) Download the complete archive (in svg format) " 81 "and unzip it to your QGIS settings directory [%1] .\n\n" 82 "This file can be found at [%2]\nand current file is [%3]" 84 QStringLiteral(
"http://soliton.vm.bytemark.co.uk/pub/cpt-city/pkg/" ),
85 QStringLiteral(
"http://soliton.vm.bytemark.co.uk/pub/cpt-city/pkg/cpt-city-svg-2.07.zip" ) );
86 edit->setText( helpText );
87 mStackedWidget->addWidget( edit );
88 mStackedWidget->setCurrentIndex( 1 );
89 tabBar->setVisible(
false );
105 delete mAuthorsModel;
107 if ( mSelectionsModel )
108 delete mSelectionsModel;
110 setTreeModel( mSelectionsModel );
112 mTreeView->setSelectionMode( QAbstractItemView::SingleSelection );
113 mTreeView->setColumnHidden( 1,
true );
117 tabBar->blockSignals(
true );
118 tabBar->addTab( tr(
"Selections by theme" ) );
119 tabBar->addTab( tr(
"All by author" ) );
120 cboVariantName->setIconSize( QSize( 100, 15 ) );
121 lblPreview->installEventFilter(
this );
125 tabBar->blockSignals(
false );
127 connect(
this, &QDialog::finished,
this, &QgsCptCityColorRampDialog::onFinished );
137 void QgsCptCityColorRampDialog::populateVariants()
143 cboVariantName->blockSignals(
true );
144 cboVariantName->clear();
146 if ( variantList.isEmpty() )
148 cboVariantName->setEnabled(
false );
149 cboVariantName->setVisible(
false );
150 cboVariantName_currentIndexChanged( -1 );
155 QString oldVariant = cboVariantName->currentText();
157 QPixmap blankPixmap( cboVariantName->iconSize() );
158 blankPixmap.fill( Qt::white );
159 QIcon blankIcon( blankPixmap );
162 Q_FOREACH (
const QString &variant, variantList )
164 QString variantStr = variant;
165 if ( variantStr.startsWith(
'-' ) || variantStr.startsWith(
'_' ) )
166 variantStr.remove( 0, 1 );
167 cboVariantName->addItem(
' ' + variantStr );
168 index = cboVariantName->count() - 1;
169 cboVariantName->setItemData( index, variant, Qt::UserRole );
173 cboVariantName->setItemIcon( index,
176 cboVariantName->setItemIcon( index, blankIcon );
177 cboVariantName->setItemData( index, Qt::AlignHCenter, Qt::TextAlignmentRole );
180 cboVariantName->blockSignals(
false );
186 if ( newVariant != QString() )
188 if ( newVariant.startsWith(
'-' ) || newVariant.startsWith(
'_' ) )
189 newVariant.remove( 0, 1 );
190 newVariant =
' ' + newVariant;
191 idx = cboVariantName->findText( newVariant );
194 idx = cboVariantName->findText( oldVariant );
199 idx = cboVariantName->count() / 2;
201 cboVariantName->setCurrentIndex( idx );
204 cboVariantName->setEnabled(
true );
205 cboVariantName->setVisible(
true );
210 void QgsCptCityColorRampDialog::mTreeView_clicked(
const QModelIndex &index )
212 const QModelIndex &sourceIndex = mTreeFilter->mapToSource( index );
217 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
false );
218 updateTreeView( item );
221 void QgsCptCityColorRampDialog::updateTreeView(
QgsCptCityDataItem *item,
bool resetRamp )
232 mRamp.
setName( QLatin1String(
"" ), QLatin1String(
"" ) );
234 lblSchemeName->clear();
237 updateListWidget( item );
238 lblSchemePath->setText( item->
path() );
239 lblCollectionInfo->setText( QStringLiteral(
"%1 (%2)" ).arg( item->
info() ).arg( item->
leafCount() ) );
244 lblSchemePath->clear();
246 updateListWidget( item );
247 lblCollectionInfo->setText( QStringLiteral(
"%1 (%2)" ).arg( item->
info() ).arg( item->
leafCount() ) );
251 lblSchemePath->clear();
253 updateListWidget( item );
254 lblCollectionInfo->setText( tr(
"All Ramps (%1)" ).arg( item->
leafCount() ) );
258 QgsDebugMsg( QString(
"item %1 has invalid type %2" ).arg( item->
path() ).arg( (
int )item->
type() ) );
262 void QgsCptCityColorRampDialog::mListWidget_itemClicked( QListWidgetItem *item )
267 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
true );
268 lblSchemeName->setText( QFileInfo( rampItem->
name() ).fileName() );
279 void QgsCptCityColorRampDialog::mListWidget_itemSelectionChanged()
281 if ( mListWidget->selectedItems().isEmpty() )
283 mRamp.
setName( QLatin1String(
"" ), QLatin1String(
"" ) );
287 void QgsCptCityColorRampDialog::tabBar_currentChanged(
int index )
291 setTreeModel( mSelectionsModel );
294 else if ( index == 1 )
296 setTreeModel( mAuthorsModel );
301 QgsDebugMsg( QString(
"invalid index %1" ).arg( index ) );
302 setTreeModel( mAuthorsModel );
306 mListWidget->blockSignals(
true );
308 mListWidget->blockSignals(
false );
312 void QgsCptCityColorRampDialog::pbtnLicenseDetails_pressed()
314 QString path, title, copyFile, descFile;
324 title = tr(
"%1 Directory Details" ).arg( item->
path() );
328 title = tr(
"%1 Gradient Details" ).arg( path );
338 QgsDialog dlg(
this,
nullptr, QDialogButtonBox::Close );
339 QVBoxLayout *layout = dlg.
layout();
340 dlg.setWindowTitle( title );
341 QTextEdit *textEdit =
new QTextEdit( &dlg );
342 textEdit->setReadOnly(
true );
343 layout->addWidget( textEdit );
347 if ( ! copyFile.isNull() )
349 QFile file( copyFile );
350 if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) )
352 copyText = QString( file.readAll() );
357 if ( ! descFile.isNull() )
359 QFile file( descFile );
360 if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) )
362 descText = QString( file.readAll() );
366 textEdit->insertPlainText( title +
"\n\n" );
367 textEdit->insertPlainText( QStringLiteral(
"===================" ) );
368 textEdit->insertPlainText( QStringLiteral(
" copying " ) );
369 textEdit->insertPlainText( QStringLiteral(
"===================\n" ) );
370 textEdit->insertPlainText( copyText );
371 textEdit->insertPlainText( QStringLiteral(
"\n" ) );
372 textEdit->insertPlainText( QStringLiteral(
"==================" ) );
373 textEdit->insertPlainText( QStringLiteral(
" description " ) );
374 textEdit->insertPlainText( QStringLiteral(
"==================\n" ) );
375 textEdit->insertPlainText( descText );
376 textEdit->moveCursor( QTextCursor::Start );
378 dlg.resize( 600, 600 );
382 void QgsCptCityColorRampDialog::updatePreview(
bool clear )
384 QSize size = lblPreview->size();
388 lblSchemeName->clear();
389 lblSchemePath->clear();
390 lblLicensePreview->clear();
391 QPixmap blankPixmap( size );
392 blankPixmap.fill( Qt::transparent );
393 lblPreview->setPixmap( blankPixmap );
405 lblPreview->setPixmap( pixmap );
411 void QgsCptCityColorRampDialog::clearCopyingInfo()
413 updateCopyingInfo( QMap< QString, QString >() );
416 void QgsCptCityColorRampDialog::updateCopyingInfo(
const QMap< QString, QString > ©ingMap )
418 QString authorStr = copyingMap.value( QStringLiteral(
"authors" ) );
419 if ( authorStr.length() > 80 )
420 authorStr.replace( authorStr.indexOf(
' ', 80 ), 1, QStringLiteral(
"\n" ) );
421 lblAuthorName->setText( authorStr );
422 QString licenseStr = copyingMap.value( QStringLiteral(
"license/informal" ) );
423 if ( copyingMap.contains( QStringLiteral(
"license/year" ) ) )
424 licenseStr +=
" (" + copyingMap.value( QStringLiteral(
"license/year" ) ) +
')';
425 if ( licenseStr.length() > 80 )
426 licenseStr.replace( licenseStr.indexOf(
' ', 80 ), 1, QStringLiteral(
"\n" ) );
427 if ( copyingMap.contains( QStringLiteral(
"license/url" ) ) )
428 licenseStr +=
"\n[ " + copyingMap.value( QStringLiteral(
"license/url" ) ) +
" ]";
431 lblLicenseName->setText( licenseStr );
432 licenseStr.replace(
'\n', QLatin1String(
" " ) );
433 lblLicensePreview->setText( licenseStr );
434 lblLicensePreview->setCursorPosition( 0 );
435 if ( copyingMap.contains( QStringLiteral(
"src/link" ) ) )
436 lblSrcLink->setText( copyingMap.value( QStringLiteral(
"src/link" ) ) );
441 void QgsCptCityColorRampDialog::cboVariantName_currentIndexChanged(
int index )
444 if ( cboVariantName->currentIndex() != -1 )
445 mRamp.
setVariantName( cboVariantName->currentData( Qt::UserRole ).toString() );
451 void QgsCptCityColorRampDialog::onFinished()
455 settings.
setValue( QStringLiteral(
"Windows/CptCityColorRampV2Dialog/geometry" ),
saveGeometry() );
456 settings.
setValue( QStringLiteral(
"Windows/CptCityColorRampV2Dialog/splitter" ), mSplitter->saveState() );
459 void QgsCptCityColorRampDialog::showHelp()
462 QString helpText = tr(
"You can download a more complete set of cpt-city gradients " 463 "by installing the \"Color Ramp Manager\" plugin " 464 "(you must enable Experimental plugins in the plugin manager).\n\n" 466 QMessageBox *msg =
new QMessageBox(
this );
467 msg->setWindowTitle( tr(
"Download More Cpt-city Gradients" ) );
468 msg->setText( helpText );
472 void QgsCptCityColorRampDialog::updateUi()
478 bool found = updateRamp();
481 tabBar->setCurrentIndex( 1 );
482 setTreeModel( mAuthorsModel );
483 found = updateRamp();
487 tabBar->setCurrentIndex( 0 );
488 setTreeModel( mSelectionsModel );
492 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
true );
502 QgsDebugMsg( QString(
"result: %1 checked: %2" ).arg( result() ).arg( cboConvertStandard->isChecked() ) );
504 return ( result() == Accepted && cboConvertStandard->isChecked() );
509 mListWidget->blockSignals(
true );
510 mListWidget->clear();
517 QVector<QgsCptCityDataItem *> childrenRamps = colItem->
childrenRamps(
true );
518 for (
int i = 0; i < childrenRamps.count(); i++ )
523 QgsDebugMsg(
"invalid item " + childrenRamps[i]->path() );
526 QListWidgetItem *listItem =
new QListWidgetItem();
527 listItem->setText( rampItem->
shortInfo() );
528 listItem->setIcon( rampItem->
icon( QSize( 75, 50 ) ) );
529 listItem->setToolTip( rampItem->
path() +
'\n' + rampItem->
info() );
530 listItem->setData( Qt::UserRole, QVariant( i ) );
531 mListWidget->addItem( listItem );
532 mListRamps << rampItem;
539 mListWidget->blockSignals(
false );
547 QSize size = lblPreview->size();
549 if ( event->type() == QEvent::MouseButtonPress )
553 if ( ! pixmap.isNull() )
554 lblPreview->setPixmap( pixmap.scaled( size ) );
557 else if ( event->type() == QEvent::MouseButtonRelease )
561 lblPreview->setPixmap( pixmap );
567 return QDialog::eventFilter( obj, event );
571 bool QgsCptCityColorRampDialog::updateRamp()
573 mListWidget->clear();
575 cboVariantName->clear();
577 lblCollectionInfo->clear();
579 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
false );
580 updatePreview(
true );
591 if ( modelIndex == QModelIndex() )
608 lblSchemeName->setText( QFileInfo( mRamp.
schemeName() ).fileName() );
609 QModelIndex parentIndex = modelIndex.parent();
610 QModelIndex selIndex = mTreeFilter->mapFromSource( parentIndex );
613 mTreeView->setCurrentIndex( selIndex );
614 mTreeView->setExpanded( selIndex,
true );
615 mTreeView->scrollTo( selIndex, QAbstractItemView::PositionAtCenter );
616 updateTreeView( mModel->
dataItem( parentIndex ), false );
619 for (
int i = 0; i < mListRamps.count(); i++ )
621 if ( mListRamps.at( i ) == childItem )
623 QgsDebugMsg( QString(
"found matching item %1 target=%2" ).arg( mListRamps.at( i )->path(), childItem->
path() ) );
624 QListWidgetItem *listItem = mListWidget->item( i );
625 mListWidget->setCurrentItem( listItem );
628 mListWidget->scrollToItem( listItem, QAbstractItemView::EnsureVisible );
630 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
true );
639 void QgsCptCityColorRampDialog::showAll()
641 QModelIndex modelIndex = mModel->
findPath( QLatin1String(
"" ) );
642 if ( modelIndex != QModelIndex() )
644 QModelIndex selIndex = mTreeFilter->mapFromSource( modelIndex );
645 mTreeView->setCurrentIndex( selIndex );
646 mTreeView->setExpanded( selIndex,
true );
647 mTreeView->scrollTo( selIndex, QAbstractItemView::PositionAtCenter );
648 updateTreeView( mModel->
dataItem( modelIndex ), false );
658 mTreeFilter =
new TreeFilterProxyModel(
this, mModel );
659 mTreeView->setModel( mTreeFilter );
663 void QgsCptCityColorRampDialog::refresh()
665 QApplication::setOverrideCursor( Qt::WaitCursor );
666 refreshModel( QModelIndex() );
667 QApplication::restoreOverrideCursor();
670 void QgsCptCityColorRampDialog::refreshModel(
const QModelIndex &index )
672 if ( index.isValid() )
687 for (
int i = 0; i < mModel->
rowCount( index ); i++ )
689 QModelIndex idx = mModel->
index( i, 0, index );
690 if ( mTreeView->isExpanded( idx ) || !mModel->
hasChildren( idx ) )
701 : QSortFilterProxyModel( parent )
704 setSourceModel( mModel );
707 bool TreeFilterProxyModel::filterAcceptsRow(
int sourceRow,
const QModelIndex &sourceParent )
const bool eventFilter(QObject *obj, QEvent *event) override
QString descFileName(const QString &dirName) const
QgsCptCityColorRamp ramp() const
Returns a color ramp representing the current settings from the dialog.
QgsCptCityDataItem * dataItem(const QModelIndex &idx) const
Returns a list of mime that can describe model indexes.
static QgsCptCityArchive * defaultArchive()
static QString qgisSettingsDirPath()
Returns the path to the settings directory in user's home dir.
This class is a composition of two QSettings instances:
QgsCptCityColorRampDialog(const QgsCptCityColorRamp &ramp, QWidget *parent=nullptr)
Constructor for QgsCptCityColorRampDialog.
void changed()
Emitted when the dialog settings change.
QString schemeName() const
A generic dialog with layout and button box.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
Item that represents a layer that can be opened with one of the providers.
void setVariantName(const QString &variantName)
QModelIndex findPath(const QString &path)
return index of a path
void saveGeometry(QWidget *widget, const QString &keyName)
Save the wigget geometry into settings.
void copy(const QgsCptCityColorRamp *other)
void setName(const QString &schemeName, const QString &variantName=QString(), const QStringList &variantList=QStringList())
bool restoreGeometry(QWidget *widget, const QString &keyName)
Restore the wigget geometry from settings.
void setValue(const QString &key, const QVariant &value, const QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
const QgsCptCityColorRamp & ramp() const
int rowCount(const QModelIndex &parent=QModelIndex()) const override
bool hasChildren(const QModelIndex &parent=QModelIndex()) const override
static QIcon colorRampPreviewIcon(QgsColorRamp *ramp, QSize size, int padding=0)
Returns an icon preview for a color ramp.
Base class for all items in the model.
static QMap< QString, QString > copyingInfo(const QString &fileName)
A Collection: logical collection of subcollections and color ramps.
QString shortInfo() const
static void initDefaultArchive()
QString archiveName() const
static QPixmap colorRampPreviewPixmap(QgsColorRamp *ramp, QSize size, int padding=0)
Returns a pixmap preview for a color ramp.
QgsStringMap copyingInfo() const
void refresh(const QString &path)
void setVariantList(const QStringList &variantList)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), const Section section=NoSection) const
Returns the value for setting key.
QVBoxLayout * layout()
Returns the central layout. Widgets added to it must have this dialog as parent.
void setRamp(const QgsCptCityColorRamp &ramp)
Sets the color ramp to show in the dialog.
QStringList variantList() const
QVector< QgsCptCityDataItem * > childrenRamps(bool recursive)
virtual int leafCount() const
QString variantName() const
QString copyingFileName(const QString &dirName) const
bool saveAsGradientRamp() const
Returns true if the ramp should be converted to a QgsGradientColorRamp.