18 #include "ui_qgsstyleexportimportdialogbase.h"
34 #include <QInputDialog>
35 #include <QCloseEvent>
36 #include <QFileDialog>
37 #include <QMessageBox>
38 #include <QNetworkReply>
39 #include <QProgressDialog>
40 #include <QPushButton>
41 #include <QStandardItemModel>
42 #include <QTemporaryFile>
54 QPushButton *pb =
nullptr;
55 pb =
new QPushButton( tr(
"Select All" ) );
56 buttonBox->addButton( pb, QDialogButtonBox::ActionRole );
59 pb =
new QPushButton( tr(
"Clear Selection" ) );
60 buttonBox->addButton( pb, QDialogButtonBox::ActionRole );
63 mTempStyle = qgis::make_unique< QgsStyle >();
64 mTempStyle->createMemoryDatabase();
67 mGroupSelectionDlg =
nullptr;
71 if ( mDialogMode ==
Import )
73 setWindowTitle( tr(
"Import Item(s)" ) );
75 importTypeCombo->addItem( tr(
"File" ), ImportSource::File );
77 importTypeCombo->addItem( tr(
"URL" ), ImportSource::Url );
81 mSymbolTags->setText( QStringLiteral(
"imported" ) );
83 connect( mButtonFetch, &QAbstractButton::clicked,
this, &QgsStyleExportImportDialog::fetch );
86 mImportFileWidget->setDialogTitle( tr(
"Load Styles" ) );
87 mImportFileWidget->setFilter( tr(
"XML files (*.xml *.XML)" ) );
90 mImportFileWidget->setDefaultRoot( settings.
value( QStringLiteral(
"StyleManager/lastImportDir" ), QDir::homePath(),
QgsSettings::Gui ).toString() );
93 label->setText( tr(
"Select items to import" ) );
94 buttonBox->button( QDialogButtonBox::Ok )->setText( tr(
"Import" ) );
96 dialogStyle = mTempStyle.get();
100 setWindowTitle( tr(
"Export Item(s)" ) );
102 mLocationStackedEdit->setHidden(
true );
103 fromLabel->setHidden(
true );
104 importTypeCombo->setHidden(
true );
105 mLocationLabel->setHidden(
true );
107 mFavorite->setHidden(
true );
108 mIgnoreXMLTags->setHidden(
true );
110 pb =
new QPushButton( tr(
"Select by Group…" ) );
111 buttonBox->addButton( pb, QDialogButtonBox::ActionRole );
113 tagLabel->setHidden(
true );
114 mSymbolTags->setHidden(
true );
115 tagHintLabel->setHidden(
true );
117 buttonBox->button( QDialogButtonBox::Ok )->setText( tr(
"Export" ) );
119 dialogStyle = mStyle;
122 #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
127 listItems->setIconSize( QSize(
static_cast< int >(
iconSize ),
static_cast< int >(
iconSize * 0.9 ) ) );
133 listItems->setModel( mModel );
135 connect( listItems->selectionModel(), &QItemSelectionModel::selectionChanged,
136 this, &QgsStyleExportImportDialog::selectionChanged );
139 disconnect( buttonBox, &QDialogButtonBox::accepted,
this, &QDialog::accept );
141 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
false );
143 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsStyleExportImportDialog::showHelp );
148 QModelIndexList selection = listItems->selectionModel()->selectedIndexes();
149 if ( selection.isEmpty() )
151 QMessageBox::warning(
this, tr(
"Export/import Item(s)" ),
152 tr(
"You should select at least one symbol/color ramp." ) );
156 if ( mDialogMode ==
Export )
158 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save Styles" ), QDir::homePath(),
159 tr(
"XML files (*.xml *.XML)" ) );
160 if ( fileName.isEmpty() )
166 if ( !fileName.endsWith( QLatin1String(
".xml" ), Qt::CaseInsensitive ) )
168 fileName += QLatin1String(
".xml" );
171 mFileName = fileName;
173 mCursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
174 moveStyles( &selection, mStyle, mTempStyle.get() );
175 if ( !mTempStyle->exportXml( mFileName ) )
177 mCursorOverride.reset();
178 QMessageBox::warning(
this, tr(
"Export Symbols" ),
179 tr(
"Error when saving selected symbols to file:\n%1" )
180 .arg( mTempStyle->errorString() ) );
185 mCursorOverride.reset();
186 QMessageBox::information(
this, tr(
"Export Symbols" ),
187 tr(
"The selected symbols were successfully exported to file:\n%1" )
193 mCursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
194 moveStyles( &selection, mTempStyle.get(), mStyle );
197 mCursorOverride.reset();
204 bool QgsStyleExportImportDialog::populateStyles()
211 if ( !mTempStyle->importXml( mFileName ) )
214 QMessageBox::warning(
this, tr(
"Import Symbols or Color Ramps" ),
215 tr(
"An error occurred during import:\n%1" ).arg( mTempStyle->errorString() ) );
221 void QgsStyleExportImportDialog::moveStyles( QModelIndexList *selection,
QgsStyle *src,
QgsStyle *dst )
223 QList< QgsStyleManagerDialog::ItemDetails > items;
224 items.reserve( selection->size() );
225 for (
int i = 0; i < selection->size(); ++i )
227 QModelIndex index = selection->at( i );
229 QgsStyleManagerDialog::ItemDetails details;
233 details.name = mModel->data( mModel->index( index.row(),
QgsStyleModel::Name, index.parent() ), Qt::DisplayRole ).toString();
237 QgsStyleManagerDialog::copyItems( items, src, dst,
this, mCursorOverride, mDialogMode ==
Import,
238 mSymbolTags->text().split(
',' ), mFavorite->isChecked(), mIgnoreXMLTags->isChecked() );
244 delete mGroupSelectionDlg;
249 mImportFileWidget->setFilePath( path );
254 listItems->selectAll();
259 listItems->clearSelection();
276 const auto constSymbolNames = symbolNames;
277 for (
const QString &symbolName : constSymbolNames )
279 QModelIndexList indexes = listItems->model()->match( listItems->model()->index( 0,
QgsStyleModel::Name ), Qt::DisplayRole, symbolName, 1, Qt::MatchFixedString | Qt::MatchCaseSensitive );
280 const auto constIndexes = indexes;
281 for (
const QModelIndex &index : constIndexes )
283 listItems->selectionModel()->select( index, QItemSelectionModel::Select );
290 const auto constSymbolNames = symbolNames;
291 for (
const QString &symbolName : constSymbolNames )
293 QModelIndexList indexes = listItems->model()->match( listItems->model()->index( 0,
QgsStyleModel::Name ), Qt::DisplayRole, symbolName, 1, Qt::MatchFixedString | Qt::MatchCaseSensitive );
294 const auto constIndexes = indexes;
295 for (
const QModelIndex &index : constIndexes )
297 QItemSelection deselection( index, index );
298 listItems->selectionModel()->select( deselection, QItemSelectionModel::Deselect );
337 if ( ! mGroupSelectionDlg )
340 mGroupSelectionDlg->setWindowTitle( tr(
"Select Item(s) by Group" ) );
350 mGroupSelectionDlg->show();
351 mGroupSelectionDlg->raise();
352 mGroupSelectionDlg->activateWindow();
357 ImportSource source =
static_cast< ImportSource
>( importTypeCombo->itemData( index ).toInt() );
361 case ImportSource::File:
363 mLocationStackedEdit->setCurrentIndex( 0 );
364 mLocationLabel->setText( tr(
"File" ) );
368 case ImportSource::Official:
370 btnBrowse->setText( QStringLiteral(
"Fetch Items" ) );
371 locationLineEdit->setEnabled(
false );
375 case ImportSource::Url:
377 mLocationStackedEdit->setCurrentIndex( 1 );
378 mLocationLabel->setText( tr(
"URL" ) );
384 void QgsStyleExportImportDialog::fetch()
386 downloadStyleXml( QUrl( mUrlLineEdit->text() ) );
389 void QgsStyleExportImportDialog::importFileChanged(
const QString &path )
391 if ( path.isEmpty() )
395 QFileInfo pathInfo( mFileName );
396 QString tag = pathInfo.fileName().remove( QStringLiteral(
".xml" ) );
397 mSymbolTags->setText( tag );
398 if ( QFileInfo::exists( mFileName ) )
402 mImportFileWidget->setDefaultRoot( pathInfo.absolutePath() );
408 void QgsStyleExportImportDialog::downloadStyleXml(
const QUrl &url )
410 mTempFile =
new QTemporaryFile();
411 if ( mTempFile->open() )
413 mFileName = mTempFile->fileName();
415 QProgressDialog *progressDlg =
new QProgressDialog(
this );
416 progressDlg->setLabelText( tr(
"Downloading style…" ) );
417 progressDlg->setAutoClose(
true );
426 QNetworkReply *reply = fetcher->
reply();
427 if ( !reply || reply->error() != QNetworkReply::NoError )
432 QMessageBox::information( this, tr(
"Import from URL" ),
433 tr(
"HTTP Error! Download failed: %1." ).arg( reply->errorString() ) );
437 mTempFile->write( reply->readAll() );
442 progressDlg->deleteLater();
449 void QgsStyleExportImportDialog::selectionChanged(
const QItemSelection &selected,
const QItemSelection &deselected )
452 Q_UNUSED( deselected )
453 bool nothingSelected = listItems->selectionModel()->selectedIndexes().empty();
454 buttonBox->button( QDialogButtonBox::Ok )->setDisabled( nothingSelected );
457 void QgsStyleExportImportDialog::showHelp()
459 QgsHelp::openHelp( QStringLiteral(
"style_library/style_manager.html#sharing-style-items" ) );
static const double UI_SCALE_FACTOR
UI scaling factor.
static QgsTaskManager * taskManager()
Returns the application's task manager, used for managing application wide background task handling.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Handles HTTP network content fetching in a background task.
void fetched()
Emitted when the network content has been fetched, regardless of whether the fetch was successful or ...
QNetworkReply * reply()
Returns the network reply.
void cancel() override
Notifies the task that it should terminate.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
void clearSelection()
clearSelection deselects all symbols
void selectTag(const QString &tagName)
Select the symbols belonging to the given tag.
@ Export
Export existing symbols mode.
@ Import
Import xml file mode.
void deselectSymbols(const QStringList &symbolNames)
deselectSymbols deselect symbols by name
void importTypeChanged(int)
void selectAll()
selectAll selects all symbols
void selectSymbols(const QStringList &symbolNames)
selectSymbols select symbols by name
void selectSmartgroup(const QString &groupName)
selectSmartgroup selects all symbols from a smart group
void selectByGroup()
selectByGroup open select by group dialog
void deselectFavorites()
Deselects favorite symbols.
void setImportFilePath(const QString &path)
Sets the initial path to use for importing files, when the dialog is in a Import mode.
void deselectSmartgroup(const QString &groupName)
deselectSmartgroup deselects all symbols from a smart group
QgsStyleExportImportDialog(QgsStyle *style, QWidget *parent=nullptr, Mode mode=Export)
Constructor for QgsStyleExportImportDialog, with the specified parent widget.
void selectFavorites()
Selects favorite symbols.
~QgsStyleExportImportDialog() override
void deselectTag(const QString &tagName)
Deselect the symbols belonging to the given tag.
void favoritesDeselected()
Favorites has been deselected.
void allDeselected()
all deselected
void tagSelected(const QString &tagName)
tag with tagName has been selected
void tagDeselected(const QString &tagName)
tag with tagName has been deselected
void smartgroupDeselected(const QString &groupName)
smart group with groupName has been deselected
void favoritesSelected()
Favorites has need selected.
void smartgroupSelected(const QString &groupName)
smartgroup with groupName has been selected
void allSelected()
all selected
@ TypeRole
Style entity type, see QgsStyle::StyleEntity.
@ SymbolTypeRole
Symbol type (for symbol or legend patch shape entities)
A QSortFilterProxyModel subclass for showing filtered symbol and color ramps entries from a QgsStyle ...
void addDesiredIconSize(QSize size)
Adds an additional icon size to generate for Qt::DecorationRole data.
QStringList symbolsWithTag(StyleEntity type, int tagid) const
Returns the symbol names with which have the given tag.
QStringList symbolsOfSmartgroup(StyleEntity type, int id)
Returns the symbols for the smartgroup.
StyleEntity
Enum for Entities involved in a style.
@ TextFormatEntity
Text formats.
@ ColorrampEntity
Color ramps.
int smartgroupId(const QString &smartgroup)
Returns the database id for the given smartgroup name.
int tagId(const QString &tag)
Returns the database id for the given tag name.
QStringList symbolsOfFavorite(StyleEntity type) const
Returns the symbol names which are flagged as favorite.
SymbolType
Type of the symbol.
long addTask(QgsTask *task, int priority=0)
Adds a task to the manager.
void progressChanged(double progress)
Will be emitted by task when its progress changes.
void setDescription(const QString &description)
Sets the task's description.
Temporarily sets a cursor override for the QApplication for the lifetime of the object.
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.