43 #include <QFileDialog>
44 #include <QInputDialog>
45 #include <QMessageBox>
46 #include <QPushButton>
47 #include <QStandardItemModel>
50 #include <QDesktopServices>
61 QgsCheckableStyleModel::QgsCheckableStyleModel(
QgsStyleModel *sourceModel, QObject *parent,
bool readOnly )
63 , mStyle( sourceModel->style() )
64 , mReadOnly( readOnly )
69 QgsCheckableStyleModel::QgsCheckableStyleModel(
QgsStyle *style, QObject *parent,
bool readOnly )
72 , mReadOnly( readOnly )
76 void QgsCheckableStyleModel::setCheckable(
bool checkable )
78 if ( checkable == mCheckable )
81 mCheckable = checkable;
82 emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ), QVector< int >() << Qt::CheckStateRole );
85 void QgsCheckableStyleModel::setCheckTag(
const QString &tag )
87 if ( tag == mCheckTag )
91 emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ), QVector< int >() << Qt::CheckStateRole );
94 Qt::ItemFlags QgsCheckableStyleModel::flags(
const QModelIndex &index )
const
96 Qt::ItemFlags f = QgsStyleProxyModel::flags( index );
97 if ( !mReadOnly && mCheckable && index.column() == 0 )
98 f |= Qt::ItemIsUserCheckable;
101 f &= ~Qt::ItemIsEditable;
106 QVariant QgsCheckableStyleModel::data(
const QModelIndex &index,
int role )
const
113 QFont f = QgsStyleProxyModel::data( index, role ).value< QFont >();
118 case Qt::CheckStateRole:
120 if ( !mCheckable || index.column() != 0 )
124 return tags.contains( mCheckTag ) ? Qt::Checked : Qt::Unchecked;
131 return QgsStyleProxyModel::data( index, role );
134 bool QgsCheckableStyleModel::setData(
const QModelIndex &i,
const QVariant &value,
int role )
136 if ( i.row() < 0 || i.row() >= rowCount( QModelIndex() ) ||
137 ( role != Qt::EditRole && role != Qt::CheckStateRole ) )
143 if ( role == Qt::CheckStateRole )
145 if ( !mCheckable || mCheckTag.isEmpty() )
148 const QString name = data( index( i.row(),
QgsStyleModel::Name ), Qt::DisplayRole ).toString();
151 if ( value.toInt() == Qt::Checked )
152 return mStyle->tagSymbol( entity, name, QStringList() << mCheckTag );
154 return mStyle->detagSymbol( entity, name, QStringList() << mCheckTag );
156 return QgsStyleProxyModel::setData( i, value, role );
167 : QDialog( parent, flags )
169 , mReadOnly( readOnly )
173 connect( tabItemType, &QTabWidget::currentChanged,
this, &QgsStyleManagerDialog::tabItemType_currentChanged );
177 QPushButton *downloadButton = buttonBox->addButton( tr(
"Browse Online Styles" ), QDialogButtonBox::ResetRole );
178 downloadButton->setToolTip( tr(
"Download new styles from the online QGIS style repository" ) );
180 connect( downloadButton, &QPushButton::clicked,
this, [ = ]
182 QDesktopServices::openUrl( QUrl( QStringLiteral(
"https://plugins.qgis.org/styles" ) ) );
186 mMessageBar->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed );
187 mVerticalLayout->insertWidget( 0, mMessageBar );
190 setWindowModality( Qt::WindowModal );
195 mSplitter->setSizes( QList<int>() << 170 << 540 );
196 mSplitter->restoreState( settings.
value( QStringLiteral(
"Windows/StyleV2Manager/splitter" ) ).toByteArray() );
198 tabItemType->setDocumentMode(
true );
199 searchBox->setShowSearchIcon(
true );
200 searchBox->setPlaceholderText( tr(
"Filter symbols…" ) );
204 connect( btnEditItem, &QPushButton::clicked,
this, [ = ](
bool ) {
editItem(); }
206 connect( actnEditItem, &QAction::triggered,
this, [ = ](
bool ) {
editItem(); }
211 connect( btnAddItem, &QPushButton::clicked,
this, [ = ](
bool ) {
addItem(); }
214 connect( btnRemoveItem, &QPushButton::clicked,
this, [ = ](
bool ) {
removeItem(); }
216 connect( actnRemoveItem, &QAction::triggered,
this, [ = ](
bool ) {
removeItem(); }
221 btnAddTag->setEnabled(
false );
222 btnAddSmartgroup->setEnabled(
false );
225 QMenu *shareMenu =
new QMenu( tr(
"Share Menu" ),
this );
226 QAction *exportAction =
new QAction( tr(
"Export Item(s)…" ),
this );
228 shareMenu->addAction( exportAction );
231 QAction *importAction =
new QAction( tr(
"Import Item(s)…" ),
this );
233 shareMenu->addAction( importAction );
238 mActionCopyToDefault =
new QAction( tr(
"Copy Selection to Default Style…" ),
this );
239 shareMenu->addAction( mActionCopyToDefault );
240 connect( mActionCopyToDefault, &QAction::triggered,
this, &QgsStyleManagerDialog::copyItemsToDefault );
241 connect( mCopyToDefaultButton, &QPushButton::clicked,
this, &QgsStyleManagerDialog::copyItemsToDefault );
245 mCopyToDefaultButton->hide();
248 mActionCopyItem =
new QAction( tr(
"Copy Item" ),
this );
249 connect( mActionCopyItem, &QAction::triggered,
this, &QgsStyleManagerDialog::copyItem );
250 mActionPasteItem =
new QAction( tr(
"Paste Item…" ),
this );
251 connect( mActionPasteItem, &QAction::triggered,
this, &QgsStyleManagerDialog::pasteItem );
253 shareMenu->addSeparator();
254 shareMenu->addAction( actnExportAsPNG );
255 shareMenu->addAction( actnExportAsSVG );
260 btnShare->setMenu( shareMenu );
262 #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
267 listItems->setIconSize( QSize(
static_cast< int >(
iconSize ),
static_cast< int >(
iconSize * 0.9 ) ) );
268 #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
273 mSymbolTreeView->setIconSize( QSize(
static_cast< int >( treeIconSize ),
static_cast< int >( treeIconSize ) ) );
276 :
new QgsCheckableStyleModel( mStyle,
this, mReadOnly );
277 mModel->addDesiredIconSize( listItems->iconSize() );
278 mModel->addDesiredIconSize( mSymbolTreeView->iconSize() );
279 listItems->setModel( mModel );
280 mSymbolTreeView->setModel( mModel );
282 listItems->setSelectionBehavior( QAbstractItemView::SelectRows );
283 listItems->setSelectionMode( QAbstractItemView::ExtendedSelection );
284 mSymbolTreeView->setSelectionModel( listItems->selectionModel() );
285 mSymbolTreeView->setSelectionMode( listItems->selectionMode() );
287 connect( listItems->selectionModel(), &QItemSelectionModel::currentChanged,
289 connect( listItems->selectionModel(), &QItemSelectionModel::selectionChanged,
292 QStandardItemModel *groupModel =
new QStandardItemModel( groupTree );
293 groupTree->setModel( groupModel );
294 groupTree->setHeaderHidden(
true );
296 groupTree->setCurrentIndex( groupTree->model()->index( 0, 0 ) );
298 connect( groupTree->selectionModel(), &QItemSelectionModel::currentChanged,
302 connect( groupModel, &QStandardItemModel::itemChanged,
308 QMenu *groupMenu =
new QMenu( tr(
"Group Actions" ),
this );
310 groupMenu->addAction( actnTagSymbols );
312 actnFinishTagging->setVisible(
false );
313 groupMenu->addAction( actnFinishTagging );
314 groupMenu->addAction( actnEditSmartGroup );
315 btnManageGroups->setMenu( groupMenu );
319 btnManageGroups->setEnabled(
false );
325 groupTree->setContextMenuPolicy( Qt::CustomContextMenu );
326 connect( groupTree, &QWidget::customContextMenuRequested,
330 listItems->setContextMenuPolicy( Qt::CustomContextMenu );
331 connect( listItems, &QWidget::customContextMenuRequested,
333 mSymbolTreeView->setContextMenuPolicy( Qt::CustomContextMenu );
334 connect( mSymbolTreeView, &QWidget::customContextMenuRequested,
339 mMenuBtnAddItemAll =
new QMenu(
this );
340 mMenuBtnAddItemColorRamp =
new QMenu(
this );
341 mMenuBtnAddItemLabelSettings =
new QMenu(
this );
342 mMenuBtnAddItemLegendPatchShape =
new QMenu(
this );
343 mMenuBtnAddItemSymbol3D =
new QMenu(
this );
347 mMenuBtnAddItemAll->addAction( item );
350 mMenuBtnAddItemAll->addAction( item );
353 mMenuBtnAddItemAll->addAction( item );
354 mMenuBtnAddItemAll->addSeparator();
357 for (
const QPair< QString, QString > &rampType : rampTypes )
359 item =
new QAction(
QgsApplication::getThemeIcon( QStringLiteral(
"styleicons/color.svg" ) ), tr(
"%1…" ).arg( rampType.second ),
this );
360 connect( item, &QAction::triggered,
this, [ = ](
bool ) {
addColorRamp( rampType.first ); } );
361 mMenuBtnAddItemAll->addAction( item );
362 mMenuBtnAddItemColorRamp->addAction( item );
364 mMenuBtnAddItemAll->addSeparator();
366 connect( item, &QAction::triggered,
this, [ = ](
bool ) { addTextFormat(); } );
367 mMenuBtnAddItemAll->addAction( item );
368 mMenuBtnAddItemAll->addSeparator();
371 mMenuBtnAddItemAll->addAction( item );
372 mMenuBtnAddItemLabelSettings->addAction( item );
375 mMenuBtnAddItemAll->addAction( item );
376 mMenuBtnAddItemLabelSettings->addAction( item );
379 mMenuBtnAddItemAll->addAction( item );
380 mMenuBtnAddItemLabelSettings->addAction( item );
382 mMenuBtnAddItemAll->addSeparator();
384 connect( item, &QAction::triggered,
this, [ = ](
bool ) { addLegendPatchShape(
QgsSymbol::Marker ); } );
385 mMenuBtnAddItemAll->addAction( item );
386 mMenuBtnAddItemLegendPatchShape->addAction( item );
388 connect( item, &QAction::triggered,
this, [ = ](
bool ) { addLegendPatchShape(
QgsSymbol::Line ); } );
389 mMenuBtnAddItemAll->addAction( item );
390 mMenuBtnAddItemLegendPatchShape->addAction( item );
392 connect( item, &QAction::triggered,
this, [ = ](
bool ) { addLegendPatchShape(
QgsSymbol::Fill ); } );
393 mMenuBtnAddItemAll->addAction( item );
394 mMenuBtnAddItemLegendPatchShape->addAction( item );
396 mMenuBtnAddItemAll->addSeparator();
398 connect( item, &QAction::triggered,
this, [ = ](
bool ) { addSymbol3D( QStringLiteral(
"point" ) ); } );
399 mMenuBtnAddItemAll->addAction( item );
400 mMenuBtnAddItemSymbol3D->addAction( item );
402 connect( item, &QAction::triggered,
this, [ = ](
bool ) { addSymbol3D( QStringLiteral(
"line" ) ); } );
403 mMenuBtnAddItemAll->addAction( item );
404 mMenuBtnAddItemSymbol3D->addAction( item );
406 connect( item, &QAction::triggered,
this, [ = ](
bool ) { addSymbol3D( QStringLiteral(
"polygon" ) ); } );
407 mMenuBtnAddItemAll->addAction( item );
408 mMenuBtnAddItemSymbol3D->addAction( item );
412 mGroupMenu =
new QMenu(
this );
413 mGroupListMenu =
new QMenu( mGroupMenu );
414 mGroupListMenu->setTitle( tr(
"Add to Tag" ) );
415 mGroupListMenu->setEnabled(
false );
419 mGroupMenu->addAction( actnAddFavorite );
421 mGroupMenu->addAction( actnRemoveFavorite );
422 mGroupMenu->addSeparator()->setParent(
this );
423 mGroupMenu->addMenu( mGroupListMenu );
424 actnDetag->setData( 0 );
426 mGroupMenu->addAction( actnDetag );
427 mGroupMenu->addSeparator()->setParent(
this );
428 mGroupMenu->addAction( actnRemoveItem );
429 mGroupMenu->addAction( actnEditItem );
430 mGroupMenu->addAction( mActionCopyItem );
431 mGroupMenu->addAction( mActionPasteItem );
432 mGroupMenu->addSeparator()->setParent(
this );
436 btnAddItem->setVisible(
false );
437 btnRemoveItem->setVisible(
false );
438 btnEditItem->setVisible(
false );
439 btnAddSmartgroup->setVisible(
false );
440 btnAddTag->setVisible(
false );
441 btnManageGroups->setVisible(
false );
443 mGroupMenu->addAction( mActionCopyItem );
445 if ( mActionCopyToDefault )
447 mGroupMenu->addAction( mActionCopyToDefault );
449 mGroupMenu->addAction( actnExportAsPNG );
450 mGroupMenu->addAction( actnExportAsSVG );
453 mGroupTreeContextMenu =
new QMenu(
this );
457 mGroupTreeContextMenu->addAction( actnEditSmartGroup );
458 connect( actnAddTag, &QAction::triggered,
this, [ = ](
bool ) {
addTag(); }
460 mGroupTreeContextMenu->addAction( actnAddTag );
461 connect( actnAddSmartgroup, &QAction::triggered,
this, [ = ](
bool ) {
addSmartgroup(); }
463 mGroupTreeContextMenu->addAction( actnAddSmartgroup );
465 mGroupTreeContextMenu->addAction( actnRemoveGroup );
468 tabItemType_currentChanged( 0 );
473 connect( mButtonIconView, &QToolButton::toggled,
this, [ = ](
bool active )
477 mSymbolViewStackedWidget->setCurrentIndex( 0 );
482 connect( mButtonListView, &QToolButton::toggled,
this, [ = ](
bool active )
487 mSymbolViewStackedWidget->setCurrentIndex( 1 );
491 const int currentView = settings.
value( QStringLiteral(
"Windows/StyleV2Manager/lastIconView" ), 0,
QgsSettings::Gui ).toInt();
492 if ( currentView == 0 )
493 mButtonIconView->setChecked(
true );
495 mButtonListView->setChecked(
true );
497 mSymbolTreeView->header()->restoreState( settings.
value( QStringLiteral(
"Windows/StyleV2Manager/treeState" ), QByteArray(),
QgsSettings::Gui ).toByteArray() );
498 connect( mSymbolTreeView->header(), &QHeaderView::sectionResized,
this, [
this]
501 QgsSettings().setValue( QStringLiteral(
"Windows/StyleV2Manager/treeState" ), mSymbolTreeView->header()->saveState(), QgsSettings::Gui );
510 if ( mModified && !mReadOnly )
516 settings.
setValue( QStringLiteral(
"Windows/StyleV2Manager/splitter" ), mSplitter->saveState() );
523 void QgsStyleManagerDialog::tabItemType_currentChanged(
int )
532 searchBox->setPlaceholderText( isSymbol ? tr(
"Filter symbols…" ) :
533 isColorRamp ? tr(
"Filter color ramps…" ) :
534 isTextFormat ? tr(
"Filter text symbols…" ) :
535 isLabelSettings ? tr(
"Filter label settings…" ) :
536 isLegendPatchShape ? tr(
"Filter legend patch shapes…" ) : tr(
"Filter 3D symbols…" ) );
538 if ( !mReadOnly && isColorRamp )
540 btnAddItem->setMenu( mMenuBtnAddItemColorRamp );
542 else if ( !mReadOnly && isLegendPatchShape )
544 btnAddItem->setMenu( mMenuBtnAddItemLegendPatchShape );
546 else if ( !mReadOnly && isSymbol3D )
548 btnAddItem->setMenu( mMenuBtnAddItemSymbol3D );
550 else if ( !mReadOnly && isLabelSettings )
552 btnAddItem->setMenu( mMenuBtnAddItemLabelSettings );
554 else if ( !mReadOnly && !isSymbol && !isColorRamp )
556 btnAddItem->setMenu(
nullptr );
558 else if ( !mReadOnly && tabItemType->currentIndex() == 0 )
560 btnAddItem->setMenu( mMenuBtnAddItemAll );
564 btnAddItem->setMenu(
nullptr );
567 actnExportAsPNG->setVisible( isSymbol );
568 actnExportAsSVG->setVisible( isSymbol );
571 mModel->setEntityFilterEnabled( !allTypesSelected() );
572 mModel->setSymbolTypeFilterEnabled( isSymbol && !allTypesSelected() );
573 if ( isSymbol && !allTypesSelected() )
579 void QgsStyleManagerDialog::copyItemsToDefault()
581 const QList< ItemDetails > items = selectedItems();
582 if ( !items.empty() )
586 if ( !mBaseName.isEmpty() )
587 options.append( mBaseName );
590 defaultTags.sort( Qt::CaseInsensitive );
591 options.append( defaultTags );
592 const QString tags = QInputDialog::getItem(
this, tr(
"Import Items" ),
593 tr(
"Additional tags to add (comma separated)" ), options, mBaseName.isEmpty() ? -1 : 0,
true, &ok );
597 const QStringList parts = tags.split(
',', QString::SkipEmptyParts );
598 QStringList additionalTags;
599 additionalTags.reserve( parts.count() );
600 for (
const QString &tag : parts )
601 additionalTags << tag.trimmed();
603 auto cursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
604 const int count = copyItems( items, mStyle,
QgsStyle::defaultStyle(),
this, cursorOverride,
true, additionalTags,
false,
false );
605 cursorOverride.reset();
608 mMessageBar->
pushSuccess( tr(
"Import Items" ), count > 1 ? tr(
"Successfully imported %1 items." ).arg( count ) : tr(
"Successfully imported item." ) );
613 void QgsStyleManagerDialog::copyItem()
615 const QList< ItemDetails > items = selectedItems();
619 ItemDetails details = items.at( 0 );
620 switch ( details.entityType )
624 std::unique_ptr< QgsSymbol > symbol( mStyle->
symbol( details.name ) );
634 QApplication::clipboard()->setMimeData( format.toMimeData() );
641 QApplication::clipboard()->setMimeData( format.toMimeData() );
655 void QgsStyleManagerDialog::pasteItem()
657 const QString defaultTag = groupTree->currentIndex().isValid() ? groupTree->currentIndex().data().toString() : QString();
662 saveDlg.setWindowTitle( tr(
"Paste Symbol" ) );
663 saveDlg.setDefaultTags( defaultTag );
664 if ( !saveDlg.exec() || saveDlg.name().isEmpty() )
667 if ( mStyle->
symbolNames().contains( saveDlg.name() ) )
669 int res = QMessageBox::warning(
this, tr(
"Paste Symbol" ),
670 tr(
"A symbol with the name '%1' already exists. Overwrite?" )
671 .arg( saveDlg.name() ),
672 QMessageBox::Yes | QMessageBox::No );
673 if ( res != QMessageBox::Yes )
680 QStringList symbolTags = saveDlg.tags().split(
',' );
682 mStyle->
addSymbol( saveDlg.name(), tempSymbol.release() );
684 mStyle->
saveSymbol( saveDlg.name(), newSymbol, saveDlg.isFavorite(), symbolTags );
693 saveDlg.setDefaultTags( defaultTag );
694 saveDlg.setWindowTitle( tr(
"Paste Text Format" ) );
695 if ( !saveDlg.exec() || saveDlg.name().isEmpty() )
700 int res = QMessageBox::warning(
this, tr(
"Paste Text Format" ),
701 tr(
"A format with the name '%1' already exists. Overwrite?" )
702 .arg( saveDlg.name() ),
703 QMessageBox::Yes | QMessageBox::No );
704 if ( res != QMessageBox::Yes )
711 QStringList symbolTags = saveDlg.tags().split(
',' );
714 mStyle->
saveTextFormat( saveDlg.name(), format, saveDlg.isFavorite(), symbolTags );
719 int QgsStyleManagerDialog::selectedItemType()
721 QModelIndex index = listItems->selectionModel()->currentIndex();
722 if ( !index.isValid() )
740 bool QgsStyleManagerDialog::allTypesSelected()
const
742 return tabItemType->currentIndex() == 0;
745 QList< QgsStyleManagerDialog::ItemDetails > QgsStyleManagerDialog::selectedItems()
747 QList<QgsStyleManagerDialog::ItemDetails > res;
748 QModelIndexList indices = listItems->selectionModel()->selectedRows();
749 for (
const QModelIndex &index : indices )
751 if ( !index.isValid() )
758 details.name = mModel->data( mModel->index( index.row(),
QgsStyleModel::Name, index.parent() ), Qt::DisplayRole ).toString();
765 int QgsStyleManagerDialog::copyItems(
const QList<QgsStyleManagerDialog::ItemDetails> &items,
QgsStyle *src,
QgsStyle *dst, QWidget *parentWidget,
766 std::unique_ptr< QgsTemporaryCursorOverride > &cursorOverride,
bool isImport,
const QStringList &importTags,
bool addToFavorites,
bool ignoreSourceTags )
769 bool overwriteAll =
true;
779 for (
auto &details : items )
781 QStringList symbolTags;
782 if ( !ignoreSourceTags )
784 symbolTags = src->
tagsOfSymbol( details.entityType, details.name );
787 bool addItemToFavorites =
false;
790 symbolTags << importTags;
791 addItemToFavorites = addToFavorites;
794 switch ( details.entityType )
798 std::unique_ptr< QgsSymbol > symbol( src->
symbol( details.name ) );
802 const bool hasDuplicateName = dst->
symbolNames().contains( details.name );
803 bool overwriteThis =
false;
805 addItemToFavorites = favoriteSymbols.contains( details.name );
807 if ( hasDuplicateName && prompt )
809 cursorOverride.reset();
810 int res = QMessageBox::warning( parentWidget, isImport ? tr(
"Import Symbol" ) : tr(
"Export Symbol" ),
811 tr(
"A symbol with the name “%1” already exists.\nOverwrite?" )
812 .arg( details.name ),
813 QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
814 cursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
817 case QMessageBox::Cancel:
820 case QMessageBox::No:
823 case QMessageBox::Yes:
824 overwriteThis =
true;
827 case QMessageBox::YesToAll:
832 case QMessageBox::NoToAll:
834 overwriteAll =
false;
839 if ( !hasDuplicateName || overwriteAll || overwriteThis )
842 dst->
addSymbol( details.name, symbol.release() );
843 dst->
saveSymbol( details.name, newSymbol, addItemToFavorites, symbolTags );
851 std::unique_ptr< QgsColorRamp > ramp( src->
colorRamp( details.name ) );
855 const bool hasDuplicateName = dst->
colorRampNames().contains( details.name );
856 bool overwriteThis =
false;
858 addItemToFavorites = favoriteColorramps.contains( details.name );
860 if ( hasDuplicateName && prompt )
862 cursorOverride.reset();
863 int res = QMessageBox::warning( parentWidget, isImport ? tr(
"Import Color Ramp" ) : tr(
"Export Color Ramp" ),
864 tr(
"A color ramp with the name “%1” already exists.\nOverwrite?" )
865 .arg( details.name ),
866 QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
867 cursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
870 case QMessageBox::Cancel:
873 case QMessageBox::No:
876 case QMessageBox::Yes:
877 overwriteThis =
true;
880 case QMessageBox::YesToAll:
885 case QMessageBox::NoToAll:
887 overwriteAll =
false;
892 if ( !hasDuplicateName || overwriteAll || overwriteThis )
896 dst->
saveColorRamp( details.name, newRamp, addItemToFavorites, symbolTags );
906 const bool hasDuplicateName = dst->
textFormatNames().contains( details.name );
907 bool overwriteThis =
false;
909 addItemToFavorites = favoriteTextFormats.contains( details.name );
911 if ( hasDuplicateName && prompt )
913 cursorOverride.reset();
914 int res = QMessageBox::warning( parentWidget, isImport ? tr(
"Import Text Format" ) : tr(
"Export Text Format" ),
915 tr(
"A text format with the name “%1” already exists.\nOverwrite?" )
916 .arg( details.name ),
917 QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
918 cursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
921 case QMessageBox::Cancel:
924 case QMessageBox::No:
927 case QMessageBox::Yes:
928 overwriteThis =
true;
931 case QMessageBox::YesToAll:
936 case QMessageBox::NoToAll:
938 overwriteAll =
false;
943 if ( !hasDuplicateName || overwriteAll || overwriteThis )
946 dst->
saveTextFormat( details.name, format, addItemToFavorites, symbolTags );
957 bool overwriteThis =
false;
959 addItemToFavorites = favoriteLabelSettings.contains( details.name );
961 if ( hasDuplicateName && prompt )
963 cursorOverride.reset();
964 int res = QMessageBox::warning( parentWidget, isImport ? tr(
"Import Label Settings" ) : tr(
"Export Label Settings" ),
965 tr(
"Label settings with the name “%1” already exist.\nOverwrite?" )
966 .arg( details.name ),
967 QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
968 cursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
971 case QMessageBox::Cancel:
974 case QMessageBox::No:
977 case QMessageBox::Yes:
978 overwriteThis =
true;
981 case QMessageBox::YesToAll:
986 case QMessageBox::NoToAll:
988 overwriteAll =
false;
993 if ( !hasDuplicateName || overwriteAll || overwriteThis )
996 dst->
saveLabelSettings( details.name, settings, addItemToFavorites, symbolTags );
1007 bool overwriteThis =
false;
1009 addItemToFavorites = favoriteLegendPatchShapes.contains( details.name );
1011 if ( hasDuplicateName && prompt )
1013 cursorOverride.reset();
1014 int res = QMessageBox::warning( parentWidget, isImport ? tr(
"Import Legend Patch Shape" ) : tr(
"Export Legend Patch Shape" ),
1015 tr(
"Legend patch shape with the name “%1” already exist.\nOverwrite?" )
1016 .arg( details.name ),
1017 QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
1018 cursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
1021 case QMessageBox::Cancel:
1024 case QMessageBox::No:
1027 case QMessageBox::Yes:
1028 overwriteThis =
true;
1031 case QMessageBox::YesToAll:
1033 overwriteAll =
true;
1036 case QMessageBox::NoToAll:
1038 overwriteAll =
false;
1043 if ( !hasDuplicateName || overwriteAll || overwriteThis )
1054 std::unique_ptr< QgsAbstract3DSymbol > symbol( src->
symbol3D( details.name ) );
1058 const bool hasDuplicateName = dst->
symbol3DNames().contains( details.name );
1059 bool overwriteThis =
false;
1061 addItemToFavorites = favorite3dSymbols.contains( details.name );
1063 if ( hasDuplicateName && prompt )
1065 cursorOverride.reset();
1066 int res = QMessageBox::warning( parentWidget, isImport ? tr(
"Import 3D Symbol" ) : tr(
"Export 3D Symbol" ),
1067 tr(
"A 3D symbol with the name “%1” already exists.\nOverwrite?" )
1068 .arg( details.name ),
1069 QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
1070 cursorOverride = qgis::make_unique< QgsTemporaryCursorOverride >( Qt::WaitCursor );
1073 case QMessageBox::Cancel:
1076 case QMessageBox::No:
1079 case QMessageBox::Yes:
1080 overwriteThis =
true;
1083 case QMessageBox::YesToAll:
1085 overwriteAll =
true;
1088 case QMessageBox::NoToAll:
1090 overwriteAll =
false;
1095 if ( !hasDuplicateName || overwriteAll || overwriteThis )
1098 dst->
addSymbol3D( details.name, symbol.release() );
1099 dst->
saveSymbol3D( details.name, newSymbol, addItemToFavorites, symbolTags );
1114 bool QgsStyleManagerDialog::addTextFormat()
1118 if ( !formatDlg.exec() )
1120 format = formatDlg.format();
1123 if ( !saveDlg.exec() )
1125 QString name = saveDlg.name();
1128 bool nameInvalid =
true;
1129 while ( nameInvalid )
1132 if ( name.isEmpty() )
1134 QMessageBox::warning(
this, tr(
"Save Text Format" ),
1135 tr(
"Cannot save text format without name. Enter a name." ) );
1139 int res = QMessageBox::warning(
this, tr(
"Save Text Format" ),
1140 tr(
"Text format with name '%1' already exists. Overwrite?" )
1142 QMessageBox::Yes | QMessageBox::No );
1143 if ( res == QMessageBox::Yes )
1146 nameInvalid =
false;
1152 nameInvalid =
false;
1157 name = QInputDialog::getText(
this, tr(
"Text Format Name" ),
1158 tr(
"Please enter a name for new text format:" ),
1159 QLineEdit::Normal, name, &ok );
1167 QStringList symbolTags = saveDlg.tags().split(
',' );
1171 mStyle->
saveTextFormat( name, format, saveDlg.isFavorite(), symbolTags );
1179 groupChanged( groupTree->selectionModel()->currentIndex() );
1192 switch ( tabItemType->currentIndex() )
1217 QModelIndex index = listItems->selectionModel()->currentIndex();
1218 if ( !index.isValid() )
1221 return mModel->data( mModel->index( index.row(),
QgsStyleModel::Name, index.parent() ), Qt::DisplayRole ).toString();
1226 bool changed =
false;
1237 changed = addTextFormat();
1256 Q_ASSERT(
false &&
"not implemented" );
1269 QString name = tr(
"new symbol" );
1274 name = tr(
"new marker" );
1278 name = tr(
"new line" );
1282 name = tr(
"new fill symbol" );
1285 Q_ASSERT(
false &&
"unknown symbol type" );
1295 if ( dlg.exec() == 0 )
1302 if ( !saveDlg.exec() )
1308 name = saveDlg.
name();
1311 bool nameInvalid =
true;
1312 while ( nameInvalid )
1315 if ( name.isEmpty() )
1317 QMessageBox::warning(
this, tr(
"Save Symbol" ),
1318 tr(
"Cannot save symbol without name. Enter a name." ) );
1320 else if ( mStyle->
symbolNames().contains( name ) )
1322 int res = QMessageBox::warning(
this, tr(
"Save Symbol" ),
1323 tr(
"Symbol with name '%1' already exists. Overwrite?" )
1325 QMessageBox::Yes | QMessageBox::No );
1326 if ( res == QMessageBox::Yes )
1329 nameInvalid =
false;
1335 nameInvalid =
false;
1340 name = QInputDialog::getText(
this, tr(
"Symbol Name" ),
1341 tr(
"Please enter a name for new symbol:" ),
1342 QLineEdit::Normal, name, &ok );
1351 QStringList symbolTags = saveDlg.
tags().split(
',' );
1364 QString rampType = type;
1366 if ( rampType.isEmpty() )
1371 QStringList rampTypeNames;
1372 rampTypeNames.reserve( rampTypes.size() );
1373 for (
const QPair< QString, QString > &type : rampTypes )
1374 rampTypeNames << type.second;
1375 const QString selectedRampTypeName = QInputDialog::getItem( parent, tr(
"Color Ramp Type" ),
1376 tr(
"Please select color ramp type:" ), rampTypeNames, 0,
false, &ok );
1377 if ( !ok || selectedRampTypeName.isEmpty() )
1380 rampType = rampTypes.value( rampTypeNames.indexOf( selectedRampTypeName ) ).first;
1383 QString name = tr(
"new ramp" );
1385 std::unique_ptr< QgsColorRamp > ramp;
1394 name = tr(
"new gradient ramp" );
1404 name = tr(
"new random ramp" );
1424 name = tr(
"new preset ramp" );
1448 QgsDebugMsg( QStringLiteral(
"invalid ramp type %1" ).arg( rampType ) );
1453 if ( !saveDlg.exec() )
1458 name = saveDlg.
name();
1461 bool nameInvalid =
true;
1462 while ( nameInvalid )
1465 if ( name.isEmpty() )
1467 QMessageBox::warning( parent, tr(
"Save Color Ramp" ),
1468 tr(
"Cannot save color ramp without name. Enter a name." ) );
1472 int res = QMessageBox::warning( parent, tr(
"Save Color Ramp" ),
1473 tr(
"Color ramp with name '%1' already exists. Overwrite?" )
1475 QMessageBox::Yes | QMessageBox::No );
1476 if ( res == QMessageBox::Yes )
1478 nameInvalid =
false;
1484 nameInvalid =
false;
1489 name = QInputDialog::getText( parent, tr(
"Color Ramp Name" ),
1490 tr(
"Please enter a name for new color ramp:" ),
1491 QLineEdit::Normal, name, &ok );
1499 QStringList colorRampTags = saveDlg.
tags().split(
',' );
1511 mFavoritesGroupVisible = show;
1517 mSmartGroupVisible = show;
1529 setWindowState( windowState() & ~Qt::WindowMinimized );
1537 if ( !rampName.isEmpty() )
1549 if ( selectedItemType() < 3 )
1553 else if ( selectedItemType() == 3 )
1557 else if ( selectedItemType() == 4 )
1561 else if ( selectedItemType() == 5 )
1563 editLabelSettings();
1565 else if ( selectedItemType() == 6 )
1567 editLegendPatchShape();
1569 else if ( selectedItemType() == 7 )
1575 Q_ASSERT(
false &&
"not implemented" );
1582 if ( symbolName.isEmpty() )
1585 std::unique_ptr< QgsSymbol > symbol( mStyle->
symbol( symbolName ) );
1590 dlg.
buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1596 mStyle->
addSymbol( symbolName, symbol.release(),
true );
1604 if ( name.isEmpty() )
1607 std::unique_ptr< QgsColorRamp > ramp( mStyle->
colorRamp( name ) );
1614 dlg.
buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1627 dlg.
buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1640 dlg.
buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1653 dlg.
buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1666 dlg.
buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1683 Q_ASSERT(
false &&
"invalid ramp type" );
1691 bool QgsStyleManagerDialog::editTextFormat()
1694 if ( formatName.isEmpty() )
1702 dlg.buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1716 QgsLabelSettingsDialog settingsDlg( settings,
nullptr,
nullptr,
this, type );
1718 settingsDlg.buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1720 if ( !settingsDlg.exec() )
1723 settings = settingsDlg.settings();
1727 if ( !saveDlg.exec() )
1729 QString name = saveDlg.name();
1732 bool nameInvalid =
true;
1733 while ( nameInvalid )
1736 if ( name.isEmpty() )
1738 QMessageBox::warning(
this, tr(
"Save Label Settings" ),
1739 tr(
"Cannot save label settings without a name. Enter a name." ) );
1743 int res = QMessageBox::warning(
this, tr(
"Save Label Settings" ),
1744 tr(
"Label settings with the name '%1' already exist. Overwrite?" )
1746 QMessageBox::Yes | QMessageBox::No );
1747 if ( res == QMessageBox::Yes )
1750 nameInvalid =
false;
1756 nameInvalid =
false;
1761 name = QInputDialog::getText(
this, tr(
"Label Settings Name" ),
1762 tr(
"Please enter a name for the new label settings:" ),
1763 QLineEdit::Normal, name, &ok );
1771 QStringList symbolTags = saveDlg.tags().split(
',' );
1781 bool QgsStyleManagerDialog::editLabelSettings()
1784 if ( formatName.isEmpty() )
1791 QgsLabelSettingsDialog dlg( settings,
nullptr,
nullptr,
this, geomType );
1795 settings = dlg.settings();
1809 dialog.buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1811 if ( !dialog.exec() )
1814 shape = dialog.shape();
1817 if ( !saveDlg.exec() )
1819 QString name = saveDlg.name();
1822 bool nameInvalid =
true;
1823 while ( nameInvalid )
1826 if ( name.isEmpty() )
1828 QMessageBox::warning(
this, tr(
"Save Legend Patch Shape" ),
1829 tr(
"Cannot save legend patch shapes without a name. Enter a name." ) );
1833 int res = QMessageBox::warning(
this, tr(
"Save Legend Patch Shape" ),
1834 tr(
"A legend patch shape with the name '%1' already exists. Overwrite?" )
1836 QMessageBox::Yes | QMessageBox::No );
1837 if ( res == QMessageBox::Yes )
1840 nameInvalid =
false;
1846 nameInvalid =
false;
1851 name = QInputDialog::getText(
this, tr(
"Legend Patch Shape Name" ),
1852 tr(
"Please enter a name for the new legend patch shape:" ),
1853 QLineEdit::Normal, name, &ok );
1861 QStringList symbolTags = saveDlg.tags().split(
',' );
1871 bool QgsStyleManagerDialog::editLegendPatchShape()
1874 if ( shapeName.isEmpty() )
1886 shape = dlg.shape();
1894 bool QgsStyleManagerDialog::addSymbol3D(
const QString &type )
1902 dialog.buttonBox()->button( QDialogButtonBox::Ok )->setEnabled(
false );
1904 if ( !dialog.exec() )
1907 symbol.reset( dialog.symbol() );
1912 if ( !saveDlg.exec() )
1914 QString name = saveDlg.name();
1917 bool nameInvalid =
true;
1918 while ( nameInvalid )
1921 if ( name.isEmpty() )
1923 QMessageBox::warning(
this, tr(
"Save 3D Symbol" ),
1924 tr(
"Cannot save 3D symbols without a name. Enter a name." ) );
1928 int res = QMessageBox::warning(
this, tr(
"Save 3D Symbol" ),
1929 tr(
"A 3D symbol with the name '%1' already exists. Overwrite?" )
1931 QMessageBox::Yes | QMessageBox::No );
1932 if ( res == QMessageBox::Yes )
1935 nameInvalid =
false;
1941 nameInvalid =
false;
1946 name = QInputDialog::getText(
this, tr(
"3D Symbol Name" ),
1947 tr(
"Please enter a name for the new 3D symbol:" ),
1948 QLineEdit::Normal, name, &ok );
1956 QStringList symbolTags = saveDlg.tags().split(
',' );
1961 mStyle->
saveSymbol3D( name, newSymbol, saveDlg.isFavorite(), symbolTags );
1967 bool QgsStyleManagerDialog::editSymbol3D()
1970 if ( symbolName.isEmpty() )
1973 std::unique_ptr< QgsAbstract3DSymbol > symbol( mStyle->
symbol3D( symbolName ) );
1982 symbol.reset( dlg.symbol() );
1987 mStyle->
addSymbol3D( symbolName, symbol.release(),
true );
1994 const QList< ItemDetails > items = selectedItems();
1996 if ( allTypesSelected() )
1998 if ( QMessageBox::Yes != QMessageBox::question(
this, tr(
"Remove Items" ),
1999 QString( tr(
"Do you really want to remove %n item(s)?",
nullptr, items.count() ) ),
2008 if ( QMessageBox::Yes != QMessageBox::question(
this, tr(
"Remove Symbol" ),
2009 QString( tr(
"Do you really want to remove %n symbol(s)?",
nullptr, items.count() ) ),
2016 if ( QMessageBox::Yes != QMessageBox::question(
this, tr(
"Remove Color Ramp" ),
2017 QString( tr(
"Do you really want to remove %n ramp(s)?",
nullptr, items.count() ) ),
2024 if ( QMessageBox::Yes != QMessageBox::question(
this, tr(
"Remove Text Formats" ),
2025 QString( tr(
"Do you really want to remove %n text format(s)?",
nullptr, items.count() ) ),
2032 if ( QMessageBox::Yes != QMessageBox::question(
this, tr(
"Remove Label Settings" ),
2033 QString( tr(
"Do you really want to remove %n label settings?",
nullptr, items.count() ) ),
2040 if ( QMessageBox::Yes != QMessageBox::question(
this, tr(
"Remove Legend Patch Shapes" ),
2041 QString( tr(
"Do you really want to remove %n legend patch shapes?",
nullptr, items.count() ) ),
2048 if ( QMessageBox::Yes != QMessageBox::question(
this, tr(
"Remove 3D Symbols" ),
2049 QString( tr(
"Do you really want to remove %n 3D symbols?",
nullptr, items.count() ) ),
2058 for (
const ItemDetails &details : items )
2060 if ( details.name.isEmpty() )
2085 QString dir = QFileDialog::getExistingDirectory(
this, tr(
"Export Selected Symbols as PNG" ),
2086 QDir::home().absolutePath(),
2087 QFileDialog::ShowDirsOnly
2088 | QFileDialog::DontResolveSymlinks );
2094 QString dir = QFileDialog::getExistingDirectory(
this, tr(
"Export Selected Symbols as SVG" ),
2095 QDir::home().absolutePath(),
2096 QFileDialog::ShowDirsOnly
2097 | QFileDialog::DontResolveSymlinks );
2104 if ( dir.isEmpty() )
2107 const QList< ItemDetails > items = selectedItems();
2108 for (
const ItemDetails &details : items )
2113 QString path = dir +
'/' + details.name +
'.' + format;
2114 std::unique_ptr< QgsSymbol > sym( mStyle->
symbol( details.name ) );
2116 sym->exportImage( path, format, size );
2136 QFont font = item->font();
2137 font.setBold(
true );
2138 item->setFont( font );
2143 if ( mBlockGroupUpdates )
2146 QStandardItemModel *model = qobject_cast<QStandardItemModel *>( groupTree->model() );
2149 if ( mFavoritesGroupVisible )
2151 QStandardItem *favoriteSymbols =
new QStandardItem( tr(
"Favorites" ) );
2152 favoriteSymbols->setData(
"favorite" );
2153 favoriteSymbols->setEditable(
false );
2155 model->appendRow( favoriteSymbols );
2158 QStandardItem *allSymbols =
new QStandardItem( tr(
"All" ) );
2159 allSymbols->setData(
"all" );
2160 allSymbols->setEditable(
false );
2162 model->appendRow( allSymbols );
2164 QStandardItem *taggroup =
new QStandardItem( QString() );
2165 taggroup->setData(
"tags" );
2166 taggroup->setEditable(
false );
2167 QStringList tags = mStyle->
tags();
2169 for (
const QString &tag : qgis::as_const( tags ) )
2171 QStandardItem *item =
new QStandardItem( tag );
2172 item->setData( mStyle->
tagId( tag ) );
2173 item->setEditable( !mReadOnly );
2174 taggroup->appendRow( item );
2176 taggroup->setText( tr(
"Tags" ) );
2178 model->appendRow( taggroup );
2180 if ( mSmartGroupVisible )
2182 QStandardItem *smart =
new QStandardItem( tr(
"Smart Groups" ) );
2183 smart->setData(
"smartgroups" );
2184 smart->setEditable(
false );
2187 QgsSymbolGroupMap::const_iterator i = sgMap.constBegin();
2188 while ( i != sgMap.constEnd() )
2190 QStandardItem *item =
new QStandardItem( i.value() );
2191 item->setData( i.key() );
2192 item->setEditable( !mReadOnly );
2193 smart->appendRow( item );
2196 model->appendRow( smart );
2200 int rows = model->rowCount( model->indexFromItem( model->invisibleRootItem() ) );
2201 for (
int i = 0; i < rows; i++ )
2203 groupTree->setExpanded( model->indexFromItem( model->item( i ) ),
true );
2209 QStringList groupSymbols;
2211 const QString category = index.data( Qt::UserRole + 1 ).toString();
2212 if ( mGroupingMode )
2214 mModel->setTagId( -1 );
2215 mModel->setSmartGroupId( -1 );
2216 mModel->setFavoritesOnly(
false );
2217 mModel->setCheckTag( index.data( Qt::DisplayRole ).toString() );
2219 else if ( category == QLatin1String(
"all" ) || category == QLatin1String(
"tags" ) || category == QLatin1String(
"smartgroups" ) )
2222 if ( category == QLatin1String(
"tags" ) )
2224 actnAddTag->setEnabled( !mReadOnly );
2225 actnAddSmartgroup->setEnabled(
false );
2227 else if ( category == QLatin1String(
"smartgroups" ) )
2229 actnAddTag->setEnabled(
false );
2230 actnAddSmartgroup->setEnabled( !mReadOnly );
2233 mModel->setTagId( -1 );
2234 mModel->setSmartGroupId( -1 );
2235 mModel->setFavoritesOnly(
false );
2237 else if ( category == QLatin1String(
"favorite" ) )
2240 mModel->setTagId( -1 );
2241 mModel->setSmartGroupId( -1 );
2242 mModel->setFavoritesOnly(
true );
2244 else if ( index.parent().data( Qt::UserRole + 1 ) ==
"smartgroups" )
2246 actnRemoveGroup->setEnabled( !mReadOnly );
2247 btnManageGroups->setEnabled( !mReadOnly );
2248 const int groupId = index.data( Qt::UserRole + 1 ).toInt();
2249 mModel->setTagId( -1 );
2250 mModel->setSmartGroupId( groupId );
2251 mModel->setFavoritesOnly(
false );
2256 int tagId = index.data( Qt::UserRole + 1 ).toInt();
2257 mModel->setTagId( tagId );
2258 mModel->setSmartGroupId( -1 );
2259 mModel->setFavoritesOnly(
false );
2262 actnEditSmartGroup->setVisible(
false );
2263 actnAddTag->setVisible(
false );
2264 actnAddSmartgroup->setVisible(
false );
2265 actnRemoveGroup->setVisible(
false );
2266 actnTagSymbols->setVisible(
false );
2267 actnFinishTagging->setVisible(
false );
2269 if ( index.parent().isValid() )
2271 if ( index.parent().data( Qt::UserRole + 1 ).toString() == QLatin1String(
"smartgroups" ) )
2273 actnEditSmartGroup->setVisible( !mGroupingMode && !mReadOnly );
2275 else if ( index.parent().data( Qt::UserRole + 1 ).toString() == QLatin1String(
"tags" ) )
2277 actnAddTag->setVisible( !mGroupingMode && !mReadOnly );
2278 actnTagSymbols->setVisible( !mGroupingMode && !mReadOnly );
2279 actnFinishTagging->setVisible( mGroupingMode && !mReadOnly );
2281 actnRemoveGroup->setVisible( !mReadOnly );
2283 else if ( index.data( Qt::UserRole + 1 ) ==
"smartgroups" )
2285 actnAddSmartgroup->setVisible( !mGroupingMode && !mReadOnly );
2287 else if ( index.data( Qt::UserRole + 1 ) ==
"tags" )
2289 actnAddTag->setVisible( !mGroupingMode && !mReadOnly );
2295 QStandardItemModel *model = qobject_cast<QStandardItemModel *>( groupTree->model() );
2297 for (
int i = 0; i < groupTree->model()->rowCount(); i++ )
2299 index = groupTree->model()->index( i, 0 );
2300 QString data = index.data( Qt::UserRole + 1 ).toString();
2301 if ( data == QLatin1String(
"tags" ) )
2310 itemName = QInputDialog::getText(
this, tr(
"Add Tag" ),
2311 tr(
"Please enter name for the new tag:" ), QLineEdit::Normal, tr(
"New tag" ), &ok ).trimmed();
2312 if ( !ok || itemName.isEmpty() )
2315 int check = mStyle->
tagId( itemName );
2318 mMessageBar->
pushCritical( tr(
"Add Tag" ), tr(
"The tag “%1” already exists." ).arg( itemName ) );
2324 mBlockGroupUpdates++;
2325 id = mStyle->
addTag( itemName );
2326 mBlockGroupUpdates--;
2330 mMessageBar->
pushCritical( tr(
"Add Tag" ), tr(
"New tag could not be created — There was a problem with the symbol database." ) );
2334 QStandardItem *parentItem = model->itemFromIndex( index );
2335 QStandardItem *childItem =
new QStandardItem( itemName );
2336 childItem->setData(
id );
2337 parentItem->appendRow( childItem );
2344 QStandardItemModel *model = qobject_cast<QStandardItemModel *>( groupTree->model() );
2346 for (
int i = 0; i < groupTree->model()->rowCount(); i++ )
2348 index = groupTree->model()->index( i, 0 );
2349 QString data = index.data( Qt::UserRole + 1 ).toString();
2350 if ( data == QLatin1String(
"smartgroups" ) )
2359 if ( dlg.exec() == QDialog::Rejected )
2364 mBlockGroupUpdates++;
2366 mBlockGroupUpdates--;
2372 QStandardItem *parentItem = model->itemFromIndex( index );
2373 QStandardItem *childItem =
new QStandardItem( itemName );
2374 childItem->setData(
id );
2375 parentItem->appendRow( childItem );
2382 QStandardItemModel *model = qobject_cast<QStandardItemModel *>( groupTree->model() );
2383 QModelIndex index = groupTree->currentIndex();
2386 QString data = index.data( Qt::UserRole + 1 ).toString();
2387 if ( data == QLatin1String(
"all" ) || data == QLatin1String(
"favorite" ) || data == QLatin1String(
"tags" ) || index.data() ==
"smartgroups" )
2390 int err = QMessageBox::critical(
this, tr(
"Remove Group" ),
2391 tr(
"Invalid selection. Cannot delete system defined categories.\n"
2392 "Kindly select a group or smart group you might want to delete." ) );
2397 QStandardItem *parentItem = model->itemFromIndex( index.parent() );
2401 mBlockGroupUpdates++;
2403 if ( parentItem->data( Qt::UserRole + 1 ).toString() == QLatin1String(
"smartgroups" ) )
2412 mBlockGroupUpdates--;
2413 parentItem->removeRow( index.row() );
2418 QgsDebugMsg( QStringLiteral(
"Symbol group edited: data=%1 text=%2" ).arg( item->data( Qt::UserRole + 1 ).toString(), item->text() ) );
2419 int id = item->data( Qt::UserRole + 1 ).toInt();
2420 QString name = item->text();
2421 mBlockGroupUpdates++;
2422 if ( item->parent()->data( Qt::UserRole + 1 ) ==
"smartgroups" )
2430 mBlockGroupUpdates--;
2435 QStandardItemModel *treeModel = qobject_cast<QStandardItemModel *>( groupTree->model() );
2437 if ( mGroupingMode )
2439 mGroupingMode =
false;
2440 mModel->setCheckable(
false );
2441 actnTagSymbols->setVisible(
true );
2442 actnFinishTagging->setVisible(
false );
2450 connect( treeModel, &QStandardItemModel::itemChanged,
2454 listItems->setSelectionMode( QAbstractItemView::ExtendedSelection );
2455 mSymbolTreeView->setSelectionMode( QAbstractItemView::ExtendedSelection );
2459 bool validGroup =
false;
2461 QModelIndex present = groupTree->currentIndex();
2462 while ( present.parent().isValid() )
2464 if ( present.parent().data() ==
"Tags" )
2469 present = present.parent();
2474 mGroupingMode =
true;
2476 actnTagSymbols->setVisible(
false );
2477 actnFinishTagging->setVisible(
true );
2479 disconnect( treeModel, &QStandardItemModel::itemChanged,
2485 btnManageGroups->setEnabled(
true );
2487 mModel->setCheckable(
true );
2490 listItems->setSelectionMode( QAbstractItemView::NoSelection );
2491 mSymbolTreeView->setSelectionMode( QAbstractItemView::NoSelection );
2505 mModel->setFilterString( qword );
2510 actnEditItem->setEnabled( index.isValid() && !mGroupingMode && !mReadOnly );
2515 Q_UNUSED( selected )
2516 Q_UNUSED( deselected )
2517 bool nothingSelected = listItems->selectionModel()->selectedIndexes().empty();
2518 actnRemoveItem->setDisabled( nothingSelected || mReadOnly );
2519 actnAddFavorite->setDisabled( nothingSelected || mReadOnly );
2520 actnRemoveFavorite->setDisabled( nothingSelected || mReadOnly );
2521 mGroupListMenu->setDisabled( nothingSelected || mReadOnly );
2522 actnDetag->setDisabled( nothingSelected || mReadOnly );
2523 actnExportAsPNG->setDisabled( nothingSelected );
2524 actnExportAsSVG->setDisabled( nothingSelected );
2525 if ( mActionCopyToDefault )
2526 mActionCopyToDefault->setDisabled( nothingSelected );
2527 mCopyToDefaultButton->setDisabled( nothingSelected );
2528 actnEditItem->setDisabled( nothingSelected || mReadOnly );
2533 groupTree->setEnabled( enable );
2534 btnAddTag->setEnabled( enable && !mReadOnly );
2535 btnAddSmartgroup->setEnabled( enable && !mReadOnly );
2536 actnAddTag->setEnabled( enable && !mReadOnly );
2537 actnAddSmartgroup->setEnabled( enable && !mReadOnly );
2538 actnRemoveGroup->setEnabled( enable && !mReadOnly );
2539 btnManageGroups->setEnabled( !mReadOnly && ( enable || mGroupingMode ) );
2540 searchBox->setEnabled( enable );
2545 actnRemoveGroup->setEnabled( enable && !mReadOnly );
2546 btnManageGroups->setEnabled( !mReadOnly && ( enable || mGroupingMode ) );
2551 QStandardItemModel *treeModel = qobject_cast<QStandardItemModel *>( groupTree->model() );
2552 for (
int i = 0; i < treeModel->rowCount(); i++ )
2554 treeModel->item( i )->setEnabled( enable );
2556 if ( treeModel->item( i )->data() ==
"smartgroups" )
2558 for (
int j = 0; j < treeModel->item( i )->rowCount(); j++ )
2560 treeModel->item( i )->child( j )->setEnabled( enable );
2567 for (
int i = 0; i < symbolBtnsLayout->count(); i++ )
2569 QWidget *w = symbolBtnsLayout->itemAt( i )->widget();
2571 w->setEnabled( enable );
2575 actnRemoveItem->setEnabled( enable );
2576 actnEditItem->setEnabled( enable );
2577 mActionCopyItem->setEnabled( enable );
2578 mActionPasteItem->setEnabled( enable );
2583 QPoint globalPos = groupTree->viewport()->mapToGlobal( point );
2585 QModelIndex index = groupTree->indexAt( point );
2586 if ( index.isValid() && !mGroupingMode )
2587 mGroupTreeContextMenu->popup( globalPos );
2592 QPoint globalPos = mSymbolViewStackedWidget->currentIndex() == 0
2593 ? listItems->viewport()->mapToGlobal( point )
2594 : mSymbolTreeView->viewport()->mapToGlobal( point );
2597 mGroupListMenu->clear();
2599 const QModelIndexList indices = listItems->selectionModel()->selectedRows();
2603 const QStringList currentTags = indices.count() == 1 ? indices.at( 0 ).data(
QgsStyleModel::TagRole ).toStringList() : QStringList();
2604 QAction *a =
nullptr;
2605 QStringList tags = mStyle->
tags();
2607 for (
const QString &tag : qgis::as_const( tags ) )
2609 a =
new QAction( tag, mGroupListMenu );
2611 if ( indices.count() == 1 )
2613 a->setCheckable(
true );
2614 a->setChecked( currentTags.contains( tag ) );
2618 mGroupListMenu->addAction( a );
2621 if ( tags.count() > 0 )
2623 mGroupListMenu->addSeparator();
2625 a =
new QAction( tr(
"Create New Tag…" ), mGroupListMenu );
2628 mGroupListMenu->addAction( a );
2631 const QList< ItemDetails > items = selectedItems();
2634 bool enablePaste =
false;
2642 mActionPasteItem->setEnabled( enablePaste );
2644 mGroupMenu->popup( globalPos );
2649 const QList< ItemDetails > items = selectedItems();
2650 for (
const ItemDetails &details : items )
2652 mStyle->
addFavorite( details.entityType, details.name );
2658 const QList< ItemDetails > items = selectedItems();
2659 for (
const ItemDetails &details : items )
2667 QAction *selectedItem = qobject_cast<QAction *>( sender() );
2670 const QList< ItemDetails > items = selectedItems();
2680 tag = mStyle->
tag(
id );
2684 tag = selectedItem->data().toString();
2687 for (
const ItemDetails &details : items )
2689 mStyle->
tagSymbol( details.entityType, details.name, QStringList( tag ) );
2696 QAction *selectedItem = qobject_cast<QAction *>( sender() );
2700 const QList< ItemDetails > items = selectedItems();
2701 for (
const ItemDetails &details : items )
2703 mStyle->
detagSymbol( details.entityType, details.name );
2710 QStandardItemModel *treeModel = qobject_cast<QStandardItemModel *>( groupTree->model() );
2713 QModelIndex present = groupTree->currentIndex();
2714 if ( present.parent().data( Qt::UserRole + 1 ) !=
"smartgroups" )
2717 QMessageBox::critical(
this, tr(
"Edit Smart Group" ),
2718 tr(
"You have not selected a Smart Group. Kindly select a Smart Group to edit." ) );
2721 QStandardItem *item = treeModel->itemFromIndex( present );
2729 if ( dlg.exec() == QDialog::Rejected )
2732 mBlockGroupUpdates++;
2735 mBlockGroupUpdates--;
2738 mMessageBar->
pushCritical( tr(
"Edit Smart Group" ), tr(
"There was an error while editing the smart group." ) );
2742 item->setData(
id );
static const double UI_SCALE_FACTOR
UI scaling factor.
A dialog for configuring a 3D symbol.
static QgsStyleModel * defaultStyleModel()
Returns a shared QgsStyleModel containing the default style library (see QgsStyle::defaultStyle()).
static Qgs3DSymbolRegistry * symbol3DRegistry()
Returns registry of available 3D symbols.
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
A dialog which allows users to modify the properties of a QgsColorBrewerColorRamp.
QgsColorBrewerColorRamp ramp
QDialogButtonBox * buttonBox() const
Returns a reference to the dialog's button box.
Color ramp utilising "Color Brewer" preset color schemes.
QgsColorBrewerColorRamp * clone() const override
Creates a clone of the color ramp.
static QString typeString()
Returns the string identifier for QgsColorBrewerColorRamp.
QString schemeName() const
Returns the name of the color brewer color scheme.
int colors() const
Returns the number of colors in the ramp.
Abstract base class for color ramps.
static QList< QPair< QString, QString > > rampTypes()
Returns a list of available ramp types, where the first value in each item is the QgsColorRamp::type(...
A dialog which allows users to modify the properties of a QgsCptCityColorRamp.
bool saveAsGradientRamp() const
Returns true if the ramp should be converted to a QgsGradientColorRamp.
QDialogButtonBox * buttonBox() const
Returns a reference to the dialog's button box.
QgsCptCityColorRamp * clone() const override
Creates a clone of the color ramp.
static QString typeString()
Returns the string identifier for QgsCptCityColorRamp.
QgsGradientColorRamp * cloneGradientRamp() const
QString schemeName() const
QString variantName() const
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
A dialog which allows users to modify the properties of a QgsGradientColorRamp.
QDialogButtonBox * buttonBox() const
Returns a reference to the dialog's button box.
QgsGradientColorRamp ramp
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
static QString typeString()
Returns the string identifier for QgsGradientColorRamp.
QgsGradientColorRamp * clone() const override
Creates a clone of the color ramp.
static QgsGui * instance()
Returns a pointer to the singleton instance.
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.
static QIcon iconPolygon()
A dialog for configuring a custom legend patch shape.
Represents a patch shape for use in map legends.
bool isNull() const
Returns true if the patch shape is a null QgsLegendPatchShape, which indicates that the default legen...
A dialog which allows users to modify the properties of a QgsLimitedRandomColorRamp.
QDialogButtonBox * buttonBox() const
Returns a reference to the dialog's button box.
QgsLimitedRandomColorRamp ramp
Constrained random color ramp, which returns random colors based on preset parameters.
static QString typeString()
Returns the string identifier for QgsLimitedRandomColorRamp.
QgsLimitedRandomColorRamp * clone() const override
Creates a clone of the color ramp.
A line symbol type, for rendering LineString and MultiLineString geometries.
A marker symbol type, for rendering Point and MultiPoint geometries.
A bar for displaying non-blocking messages to the user.
void pushSuccess(const QString &title, const QString &message)
Pushes a success message with default timeout to the message bar.
void pushCritical(const QString &title, const QString &message)
Pushes a critical warning message with default timeout to the message bar.
Contains settings for how a map layer will be labeled.
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
QgsWkbTypes::GeometryType layerType
Geometry type of layers associated with these settings.
A dialog which allows users to modify the properties of a QgsPresetSchemeColorRamp.
QDialogButtonBox * buttonBox() const
Returns a reference to the dialog's button box.
QgsPresetSchemeColorRamp ramp
A scheme based color ramp consisting of a list of predefined colors.
static QString typeString()
Returns the string identifier for QgsPresetSchemeColorRamp.
QgsPresetSchemeColorRamp * clone() const override
Creates a clone of the color ramp.
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 setConditionMap(const QgsSmartConditionMap &)
sets up the GUI for the given conditionmap
QgsSmartConditionMap conditionMap()
returns the condition map
QString smartgroupName()
returns the value from mNameLineEdit
void setSmartgroupName(const QString &)
sets the smart group Name
void setOperator(const QString &)
sets the operator AND/OR
QString conditionOperator()
returns the AND/OR condition
@ Export
Export existing symbols mode.
@ Import
Import xml file mode.
Q_DECL_DEPRECATED void regrouped(QStandardItem *) SIP_DEPRECATED
void onClose()
Closes the dialog.
void groupRenamed(QStandardItem *item)
Triggered when a group item is renamed.
void addFavoriteSelectedSymbols()
Add selected symbols to favorites.
void selectedSymbolsChanged(const QItemSelection &selected, const QItemSelection &deselected)
Perform tasks when the selected symbols change.
void removeGroup()
Removes the selected tag or smartgroup.
void exportItems()
Triggers the dialog to export items.
Q_DECL_DEPRECATED void populateColorRamps(const QStringList &colorRamps, bool checkable=false) SIP_DEPRECATED
Populates the list view with color ramps of the current type with the given names.
void setFavoritesGroupVisible(bool show)
Sets whether the favorites group should be shown.
void grouptreeContextMenu(QPoint)
Context menu for the groupTree.
void setBold(QStandardItem *)
sets the text of the item with bold font
void filterSymbols(const QString &filter)
Sets the filter string to filter symbols by.
void addItem()
Triggers the dialog for adding a new item, based on the currently selected item type tab.
void tagSymbolsAction()
Toggles the interactive item tagging mode.
void editSmartgroupAction()
Triggers the dialog for editing the selected smart group.
Q_DECL_DEPRECATED void itemChanged(QStandardItem *item) SIP_DEPRECATED
Q_DECL_DEPRECATED void populateSymbols(const QStringList &symbolNames, bool checkable=false) SIP_DEPRECATED
Populates the list view with symbols of the current type with the given names.
void showHelp()
Opens the associated help.
Q_DECL_DEPRECATED bool removeColorRamp() SIP_DEPRECATED
void detagSelectedSymbols()
Remove all tags from selected symbols.
Q_DECL_DEPRECATED bool removeSymbol() SIP_DEPRECATED
void enableSymbolInputs(bool)
Enables or disbables the symbol specific inputs.
bool addSymbol(int symbolType=-1)
add a new symbol to style
void populateList()
Refreshes the list of items.
void removeItem()
Removes the current selected item.
void groupChanged(const QModelIndex &)
Triggered when the current group (or tag) is changed.
Q_DECL_DEPRECATED void populateTypes() SIP_DEPRECATED
Populate combo box with known style items (symbols, color ramps).
Q_DECL_DEPRECATED void setSymbolsChecked(const QStringList &) SIP_DEPRECATED
void enableGroupInputs(bool)
Enables or disables the groupTree specific inputs.
int addTag()
Triggers the dialog to add a new tag.
void exportItemsSVG()
Triggers the dialog to export selected items as SVG files.
void populateGroups()
populate the groups
void importItems()
Triggers the dialog to import items.
void setBaseStyleName(const QString &name)
Sets the base name for the style, which is used by the dialog to reflect the original style/XML file ...
void exportItemsPNG()
Triggers the dialog to export selected items as PNG files.
void activate()
Raises, unminimizes and activates this window.
bool addColorRamp(const QString &type=QString())
Triggers adding a new color ramp.
void exportSelectedItemsImages(const QString &dir, const QString &format, QSize size)
Triggers the dialog to export selected items as images of the specified format and size.
void enableItemsForGroupingMode(bool)
Enables or disables the groupTree items for grouping mode.
QgsStyleManagerDialog(QgsStyle *style, QWidget *parent SIP_TRANSFERTHIS=nullptr, Qt::WindowFlags flags=Qt::WindowFlags(), bool readOnly=false)
Constructor for QgsStyleManagerDialog, with the specified parent widget and window flags.
void onFinished()
Called when the dialog is going to be closed.
void listitemsContextMenu(QPoint)
Context menu for the listItems ( symbols list )
void setSmartGroupsVisible(bool show)
Sets whether smart groups should be shown.
static QString addColorRampStatic(QWidget *parent, QgsStyle *style, const QString &RampType=QString())
Opens the add color ramp dialog, returning the new color ramp's name if the ramp has been added.
void symbolSelected(const QModelIndex &)
Perform symbol specific tasks when selected.
void editItem()
Triggers the dialog for editing the current item.
void removeFavoriteSelectedSymbols()
Remove selected symbols from favorites.
int addSmartgroup()
Triggers the dialog to add a new smart group.
void tagSelectedSymbols(bool newTag=false)
Tag selected symbols using menu item selection.
QString currentItemName()
A QAbstractItemModel subclass for showing symbol and color ramp entities contained within a QgsStyle ...
@ TypeRole
Style entity type, see QgsStyle::StyleEntity.
@ SymbolTypeRole
Symbol type (for symbol or legend patch shape entities)
@ TagRole
String list of tags.
A QSortFilterProxyModel subclass for showing filtered symbol and color ramps entries from a QgsStyle ...
a dialog for setting properties of a newly saved style.
bool isFavorite() const
Returns true if the favorite is checked for the symbol.
QString name() const
Returns the entered name for the new symbol.
QString tags() const
Returns any tags entered for the new symbol (as a comma separated value list).
bool saveColorRamp(const QString &name, QgsColorRamp *ramp, bool favorite, const QStringList &tags)
Adds the colorramp to the database.
bool detagSymbol(StyleEntity type, const QString &symbol, const QStringList &tags)
Detags the symbol with the given list.
QgsTextFormat textFormat(const QString &name) const
Returns the text format with the specified name.
bool remove(StyleEntity type, int id)
Removes the specified entity from the database.
bool removeSymbol(const QString &name)
Removes symbol from style (and delete it)
bool removeLabelSettings(const QString &name)
Removes label settings from the style.
QStringList tags() const
Returns a list of all tags in the style database.
QString tag(int id) const
Returns the tag name for the given id.
QgsSmartConditionMap smartgroup(int id)
Returns the QgsSmartConditionMap for the given id.
QStringList symbol3DNames() const
Returns a list of names of 3d symbols in the style.
bool tagSymbol(StyleEntity type, const QString &symbol, const QStringList &tags)
Tags the symbol with the tags in the list.
bool saveLabelSettings(const QString &name, const QgsPalLayerSettings &settings, bool favorite, const QStringList &tags)
Adds label settings to the database.
void symbolSaved(const QString &name, QgsSymbol *symbol)
Emitted every time a new symbol has been added to the database.
QStringList textFormatNames() const
Returns a list of names of text formats in the style.
bool addColorRamp(const QString &name, QgsColorRamp *colorRamp, bool update=false)
Adds a color ramp to the style.
bool removeTextFormat(const QString &name)
Removes a text format from the style.
QgsSymbol * symbol(const QString &name)
Returns a NEW copy of symbol.
StyleEntity
Enum for Entities involved in a style.
@ LabelSettingsEntity
Label settings.
@ TextFormatEntity
Text formats.
@ SmartgroupEntity
Smart groups.
@ Symbol3DEntity
3D symbol entity (since QGIS 3.14)
@ ColorrampEntity
Color ramps.
@ LegendPatchShapeEntity
Legend patch shape (since QGIS 3.14)
QStringList tagsOfSymbol(StyleEntity type, const QString &symbol)
Returns the tags associated with the symbol.
void groupsModified()
Emitted every time a tag or smartgroup has been added, removed, or renamed.
int addSmartgroup(const QString &name, const QString &op, const QgsSmartConditionMap &conditions)
Adds a new smartgroup to the database and returns the id.
QStringList colorRampNames() const
Returns a list of names of color ramps.
bool addSymbol3D(const QString &name, QgsAbstract3DSymbol *symbol, bool update=false)
Adds a 3d symbol with the specified name to the style.
QStringList legendPatchShapeNames() const
Returns a list of names of legend patch shapes in the style.
static QgsStyle * defaultStyle()
Returns default application-wide style.
bool removeEntityByName(StyleEntity type, const QString &name)
Removes the entry of the specified type with matching name from the database.
int tagId(const QString &tag)
Returns the database id for the given tag name.
bool addLegendPatchShape(const QString &name, const QgsLegendPatchShape &shape, bool update=false)
Adds a legend patch shape with the specified name to the style.
bool saveSymbol(const QString &name, QgsSymbol *symbol, bool favorite, const QStringList &tags)
Adds the symbol to the database with tags.
QgsColorRamp * colorRamp(const QString &name) const
Returns a new copy of the specified color ramp.
QStringList labelSettingsNames() const
Returns a list of names of label settings in the style.
bool save(QString filename=QString())
Saves style into a file (will use current filename if empty string is passed)
bool rename(StyleEntity type, int id, const QString &newName)
Renames the given entity with the specified id.
QgsLegendPatchShape defaultPatch(QgsSymbol::SymbolType type, QSizeF size) const
Returns the default legend patch shape for the given symbol type.
bool removeFavorite(StyleEntity type, const QString &name)
Removes the specified symbol from favorites.
QgsSymbolGroupMap smartgroupsListMap()
Returns the smart groups map with id as key and name as value.
bool saveLegendPatchShape(const QString &name, const QgsLegendPatchShape &shape, bool favorite, const QStringList &tags)
Adds a legend patch shape to the database.
bool addTextFormat(const QString &name, const QgsTextFormat &format, bool update=false)
Adds a text format with the specified name to the style.
QStringList symbolsOfFavorite(StyleEntity type) const
Returns the symbol names which are flagged as favorite.
bool saveSymbol3D(const QString &name, QgsAbstract3DSymbol *symbol, bool favorite, const QStringList &tags)
Adds a 3d symbol to the database.
QgsPalLayerSettings labelSettings(const QString &name) const
Returns the label settings with the specified name.
QgsAbstract3DSymbol * symbol3D(const QString &name) const
Returns a new copy of the 3D symbol with the specified name.
int addTag(const QString &tagName)
Adds a new tag and returns the tag's id.
bool addSymbol(const QString &name, QgsSymbol *symbol, bool update=false)
Adds a symbol to style and takes symbol's ownership.
QgsLegendPatchShape legendPatchShape(const QString &name) const
Returns the legend patch shape with the specified name.
QStringList symbolNames() const
Returns a list of names of symbols.
bool addFavorite(StyleEntity type, const QString &name)
Adds the specified symbol to favorites.
QString smartgroupOperator(int id)
Returns the operator for the smartgroup.
bool saveTextFormat(const QString &name, const QgsTextFormat &format, bool favorite, const QStringList &tags)
Adds a text format to the database.
bool addLabelSettings(const QString &name, const QgsPalLayerSettings &settings, bool update=false)
Adds label settings with the specified name to the style.
static QgsSymbol * symbolFromMimeData(const QMimeData *data)
Attempts to parse mime data as a symbol.
static QMimeData * symbolToMimeData(const QgsSymbol *symbol)
Creates new mime data from a symbol.
QDialogButtonBox * buttonBox() const
Returns a reference to the dialog's button box.
Abstract base class for all rendered symbols.
SymbolType
Type of the symbol.
Temporarily sets a cursor override for the QApplication for the lifetime of the object.
A simple dialog for customizing text formatting settings.
Container for all settings relating to text rendering.
static QgsTextFormat fromMimeData(const QMimeData *data, bool *ok=nullptr)
Attempts to parse the provided mime data as a QgsTextFormat.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
QMultiMap< QString, QString > QgsSmartConditionMap
A multimap to hold the smart group conditions as constraint and parameter pairs.
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
QMap< int, QString > QgsSymbolGroupMap