QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* style, QMenu* menu, QWidget* parent, const QgsVectorLayer * layer ) : QWidget( parent ) , mSymbol( symbol ) , mStyle( style ) , mAdvancedMenu( 0 ) , mClipFeaturesAction( 0 ) , mLayer( layer ) { setupUi( this ); mSymbolUnitWidget->setUnits( QgsSymbolV2::OutputUnitList() << QgsSymbolV2::MM << QgsSymbolV2::MapUnit ); btnAdvanced->hide(); // advanced button is hidden by default if ( menu ) // show it if there is a menu pointer { mAdvancedMenu = menu; btnAdvanced->show(); btnAdvanced->setMenu( mAdvancedMenu ); } else { btnAdvanced->setMenu( new QMenu( this ) ); } mClipFeaturesAction = new QAction( tr( "Clip features to canvas extent" ), this ); mClipFeaturesAction->setCheckable( true ); connect( mClipFeaturesAction, SIGNAL( toggled( bool ) ), this, SLOT( clipFeaturesToggled( bool ) ) ); // populate the groups groupsCombo->addItem( "" ); populateGroups(); QStringList groups = style->smartgroupNames(); foreach ( QString group, groups ) { groupsCombo->addItem( group, QVariant( "smart" ) ); }
QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* style, QMenu* menu, QWidget* parent ) : QWidget( parent ) { mSymbol = symbol; mStyle = style; setupUi( this ); btnAdvanced->hide(); // advanced button is hidden by default if ( menu ) // show it if there is a menu pointer { btnAdvanced->setMenu( menu ); btnAdvanced->show(); } // populate the groups groupsCombo->addItem( "" ); populateGroups(); QStringList groups = style->smartgroupNames(); foreach ( QString group, groups ) { groupsCombo->addItem( group, QVariant( "smart" ) ); }
QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbol* symbol, QgsStyle* style, QMenu* menu, QWidget* parent, const QgsVectorLayer * layer ) : QWidget( parent ) , mSymbol( symbol ) , mStyle( style ) , mAdvancedMenu( nullptr ) , mClipFeaturesAction( nullptr ) , mLayer( layer ) , mMapCanvas( nullptr ) , mPresetExpressionContext( nullptr ) { setupUi( this ); mSymbolUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels ); btnAdvanced->hide(); // advanced button is hidden by default if ( menu ) // show it if there is a menu pointer { mAdvancedMenu = menu; btnAdvanced->show(); btnAdvanced->setMenu( mAdvancedMenu ); } else { btnAdvanced->setMenu( new QMenu( this ) ); } mClipFeaturesAction = new QAction( tr( "Clip features to canvas extent" ), this ); mClipFeaturesAction->setCheckable( true ); connect( mClipFeaturesAction, SIGNAL( toggled( bool ) ), this, SLOT( clipFeaturesToggled( bool ) ) ); // populate the groups groupsCombo->addItem( "" ); populateGroups(); QStringList groups = style->smartgroupNames(); Q_FOREACH ( const QString& group, groups ) { groupsCombo->addItem( group, QVariant( "smart" ) ); }
QgsStyleManagerDialog::QgsStyleManagerDialog( QgsStyle* style, QWidget* parent ) : QDialog( parent ) , mStyle( style ) , mModified( false ) { setupUi( this ); #ifdef Q_OS_MAC setWindowModality( Qt::WindowModal ); #endif QSettings settings; restoreGeometry( settings.value( QStringLiteral( "/Windows/StyleV2Manager/geometry" ) ).toByteArray() ); mSplitter->setSizes( QList<int>() << 170 << 540 ); mSplitter->restoreState( settings.value( QStringLiteral( "/Windows/StyleV2Manager/splitter" ) ).toByteArray() ); tabItemType->setDocumentMode( true ); searchBox->setPlaceholderText( tr( "Type here to filter symbols..." ) ); connect( this, SIGNAL( finished( int ) ), this, SLOT( onFinished() ) ); connect( listItems, SIGNAL( doubleClicked( const QModelIndex & ) ), this, SLOT( editItem() ) ); connect( btnAddItem, SIGNAL( clicked() ), this, SLOT( addItem() ) ); connect( actnEditItem, SIGNAL( triggered( bool ) ), this, SLOT( editItem() ) ); connect( actnRemoveItem, SIGNAL( triggered( bool ) ), this, SLOT( removeItem() ) ); btnRemoveItem->setDefaultAction( actnRemoveItem ); btnEditItem->setDefaultAction( actnEditItem ); QMenu *shareMenu = new QMenu( tr( "Share menu" ), this ); shareMenu->addAction( actnExportAsPNG ); shareMenu->addAction( actnExportAsSVG ); QAction *exportAction = new QAction( tr( "Export..." ), this ); shareMenu->addAction( exportAction ); QAction *importAction = new QAction( tr( "Import..." ), this ); shareMenu->addAction( importAction ); exportAction->setIcon( QIcon( QgsApplication::iconPath( "mActionFileSave.svg" ) ) ); importAction->setIcon( QIcon( QgsApplication::iconPath( "mActionFileOpen.svg" ) ) ); connect( actnExportAsPNG, SIGNAL( triggered() ), this, SLOT( exportItemsPNG() ) ); connect( actnExportAsSVG, SIGNAL( triggered() ), this, SLOT( exportItemsSVG() ) ); connect( exportAction, SIGNAL( triggered() ), this, SLOT( exportItems() ) ); connect( importAction, SIGNAL( triggered() ), this, SLOT( importItems() ) ); btnShare->setMenu( shareMenu ); // Set editing mode off by default mGrouppingMode = false; QStandardItemModel* model = new QStandardItemModel( listItems ); listItems->setModel( model ); listItems->setSelectionMode( QAbstractItemView::ExtendedSelection ); connect( model, SIGNAL( itemChanged( QStandardItem* ) ), this, SLOT( itemChanged( QStandardItem* ) ) ); connect( listItems->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( symbolSelected( const QModelIndex& ) ) ); connect( listItems->selectionModel(), SIGNAL( selectionChanged( const QItemSelection, const QItemSelection ) ), this, SLOT( selectedSymbolsChanged( const QItemSelection&, const QItemSelection& ) ) ); populateTypes(); QStandardItemModel* groupModel = new QStandardItemModel( groupTree ); groupTree->setModel( groupModel ); groupTree->setHeaderHidden( true ); populateGroups(); connect( groupTree->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( groupChanged( const QModelIndex& ) ) ); connect( groupModel, SIGNAL( itemChanged( QStandardItem* ) ), this, SLOT( groupRenamed( QStandardItem* ) ) ); QMenu *groupMenu = new QMenu( tr( "Group actions" ), this ); connect( actnGroupSymbols, SIGNAL( triggered() ), this, SLOT( groupSymbolsAction() ) ); groupMenu->addAction( actnGroupSymbols ); connect( actnFinishGrouping, SIGNAL( triggered() ), this, SLOT( groupSymbolsAction() ) ); actnFinishGrouping->setVisible( false ); groupMenu->addAction( actnFinishGrouping ); groupMenu->addAction( actnEditSmartGroup ); btnManageGroups->setMenu( groupMenu ); connect( searchBox, SIGNAL( textChanged( QString ) ), this, SLOT( filterSymbols( QString ) ) ); tagsLineEdit->installEventFilter( this ); // Context menu for groupTree groupTree->setContextMenuPolicy( Qt::CustomContextMenu ); connect( groupTree, SIGNAL( customContextMenuRequested( const QPoint& ) ), this, SLOT( grouptreeContextMenu( const QPoint& ) ) ); // Context menu for listItems listItems->setContextMenuPolicy( Qt::CustomContextMenu ); connect( listItems, SIGNAL( customContextMenuRequested( const QPoint& ) ), this, SLOT( listitemsContextMenu( const QPoint& ) ) ); // Menu for the "Add item" toolbutton when in colorramp mode QStringList rampTypes; rampTypes << tr( "Gradient" ) << tr( "Random" ) << tr( "ColorBrewer" ) << tr( "Preset colors" ); rampTypes << tr( "cpt-city" ); // todo, only for rasters? mMenuBtnAddItemColorRamp = new QMenu( this ); Q_FOREACH ( const QString& rampType, rampTypes ) mMenuBtnAddItemColorRamp->addAction( new QAction( rampType, this ) ); connect( mMenuBtnAddItemColorRamp, SIGNAL( triggered( QAction* ) ), this, SLOT( addColorRamp( QAction* ) ) ); // Context menu for symbols/colorramps. The menu entries for every group are created when displaying the menu. mGroupMenu = new QMenu( this ); mGroupListMenu = new QMenu( mGroupMenu ); mGroupListMenu->setTitle( tr( "Add to group" ) ); mGroupListMenu->setEnabled( false ); mGroupMenu->addMenu( mGroupListMenu ); actnUngroup->setData( 0 ); connect( actnUngroup, SIGNAL( triggered( bool ) ), this, SLOT( groupSelectedSymbols() ) ); mGroupMenu->addAction( actnUngroup ); mGroupMenu->addSeparator()->setParent( this ); mGroupMenu->addAction( actnRemoveItem ); mGroupMenu->addAction( actnEditItem ); mGroupMenu->addSeparator()->setParent( this ); mGroupMenu->addAction( actnExportAsPNG ); mGroupMenu->addAction( actnExportAsSVG ); // Context menu for the group tree mGroupTreeContextMenu = new QMenu( this ); connect( actnEditSmartGroup, SIGNAL( triggered( bool ) ), this, SLOT( editSmartgroupAction() ) ); mGroupTreeContextMenu->addAction( actnEditSmartGroup ); connect( actnAddGroup, SIGNAL( triggered( bool ) ), this, SLOT( addGroup() ) ); mGroupTreeContextMenu->addAction( actnAddGroup ); connect( actnRemoveGroup, SIGNAL( triggered( bool ) ), this, SLOT( removeGroup() ) ); mGroupTreeContextMenu->addAction( actnRemoveGroup ); on_tabItemType_currentChanged( 0 ); }
QgsStyleV2ManagerDialog::QgsStyleV2ManagerDialog( QgsStyleV2* style, QWidget* parent ) : QDialog( parent ), mStyle( style ), mModified( false ) { setupUi( this ); #ifdef Q_OS_MAC setWindowModality( Qt::WindowModal ); #endif QSettings settings; restoreGeometry( settings.value( "/Windows/StyleV2Manager/geometry" ).toByteArray() ); mSplitter->setSizes( QList<int>() << 170 << 540 ); mSplitter->restoreState( settings.value( "/Windows/StyleV2Manager/splitter" ).toByteArray() ); tabItemType->setDocumentMode( true ); searchBox->setPlaceholderText( tr( "Type here to filter symbols..." ) ); connect( this, SIGNAL( finished( int ) ), this, SLOT( onFinished() ) ); connect( listItems, SIGNAL( doubleClicked( const QModelIndex & ) ), this, SLOT( editItem() ) ); connect( btnAddItem, SIGNAL( clicked() ), this, SLOT( addItem() ) ); connect( btnEditItem, SIGNAL( clicked() ), this, SLOT( editItem() ) ); connect( btnRemoveItem, SIGNAL( clicked() ), this, SLOT( removeItem() ) ); QMenu *shareMenu = new QMenu( tr( "Share Menu" ), this ); QAction *exportAsPNGAction = shareMenu->addAction( tr( "Export as PNG" ) ); QAction *exportAsSVGAction = shareMenu->addAction( tr( "Export as SVG" ) ); QAction *exportAction = shareMenu->addAction( tr( "Export" ) ); QAction *importAction = shareMenu->addAction( tr( "Import" ) ); exportAsPNGAction->setIcon( QIcon( QgsApplication::iconPath( "mActionSharingExport.svg" ) ) ); exportAsSVGAction->setIcon( QIcon( QgsApplication::iconPath( "mActionSharingExport.svg" ) ) ); exportAction->setIcon( QIcon( QgsApplication::iconPath( "mActionSharingExport.svg" ) ) ); importAction->setIcon( QIcon( QgsApplication::iconPath( "mActionSharingImport.svg" ) ) ); connect( exportAsPNGAction, SIGNAL( triggered() ), this, SLOT( exportItemsPNG() ) ); connect( exportAsSVGAction, SIGNAL( triggered() ), this, SLOT( exportItemsSVG() ) ); connect( exportAction, SIGNAL( triggered() ), this, SLOT( exportItems() ) ); connect( importAction, SIGNAL( triggered() ), this, SLOT( importItems() ) ); btnShare->setMenu( shareMenu ); // Set editing mode off by default mGrouppingMode = false; QStandardItemModel* model = new QStandardItemModel( listItems ); listItems->setModel( model ); listItems->setSelectionMode( QAbstractItemView::ExtendedSelection ); connect( model, SIGNAL( itemChanged( QStandardItem* ) ), this, SLOT( itemChanged( QStandardItem* ) ) ); connect( listItems->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( symbolSelected( const QModelIndex& ) ) ); populateTypes(); QStandardItemModel* groupModel = new QStandardItemModel( groupTree ); groupTree->setModel( groupModel ); groupTree->setHeaderHidden( true ); populateGroups(); connect( groupTree->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( groupChanged( const QModelIndex& ) ) ); connect( groupModel, SIGNAL( itemChanged( QStandardItem* ) ), this, SLOT( groupRenamed( QStandardItem* ) ) ); QMenu *groupMenu = new QMenu( tr( "Group Actions" ), this ); QAction *groupSymbols = groupMenu->addAction( tr( "Group Symbols" ) ); QAction *editSmartgroup = groupMenu->addAction( tr( "Edit Smart Group" ) ); btnManageGroups->setMenu( groupMenu ); connect( groupSymbols, SIGNAL( triggered() ), this, SLOT( groupSymbolsAction() ) ); connect( editSmartgroup, SIGNAL( triggered() ), this, SLOT( editSmartgroupAction() ) ); connect( btnAddGroup, SIGNAL( clicked() ), this, SLOT( addGroup() ) ); connect( btnRemoveGroup, SIGNAL( clicked() ), this, SLOT( removeGroup() ) ); on_tabItemType_currentChanged( 0 ); connect( searchBox, SIGNAL( textChanged( QString ) ), this, SLOT( filterSymbols( QString ) ) ); tagsLineEdit->installEventFilter( this ); // Context menu for groupTree groupTree->setContextMenuPolicy( Qt::CustomContextMenu ); connect( groupTree, SIGNAL( customContextMenuRequested( const QPoint& ) ), this, SLOT( grouptreeContextMenu( const QPoint& ) ) ); // Context menu for listItems listItems->setContextMenuPolicy( Qt::CustomContextMenu ); connect( listItems, SIGNAL( customContextMenuRequested( const QPoint& ) ), this, SLOT( listitemsContextMenu( const QPoint& ) ) ); }
QgsStyleManagerDialog::QgsStyleManagerDialog( QgsStyle *style, QWidget *parent ) : QDialog( parent ) , mStyle( style ) , mModified( false ) { setupUi( this ); connect( tabItemType, &QTabWidget::currentChanged, this, &QgsStyleManagerDialog::tabItemType_currentChanged ); connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsStyleManagerDialog::showHelp ); connect( buttonBox, &QDialogButtonBox::rejected, this, &QgsStyleManagerDialog::onClose ); #ifdef Q_OS_MAC setWindowModality( Qt::WindowModal ); #endif QgsSettings settings; restoreGeometry( settings.value( QStringLiteral( "Windows/StyleV2Manager/geometry" ) ).toByteArray() ); mSplitter->setSizes( QList<int>() << 170 << 540 ); mSplitter->restoreState( settings.value( QStringLiteral( "Windows/StyleV2Manager/splitter" ) ).toByteArray() ); tabItemType->setDocumentMode( true ); searchBox->setShowSearchIcon( true ); searchBox->setPlaceholderText( tr( "Filter symbols…" ) ); connect( this, &QDialog::finished, this, &QgsStyleManagerDialog::onFinished ); connect( listItems, &QAbstractItemView::doubleClicked, this, &QgsStyleManagerDialog::editItem ); connect( btnAddItem, &QPushButton::clicked, this, [ = ]( bool ) { addItem(); } ); connect( btnEditItem, &QPushButton::clicked, this, [ = ]( bool ) { editItem(); } ); connect( actnEditItem, &QAction::triggered, this, [ = ]( bool ) { editItem(); } ); connect( btnRemoveItem, &QPushButton::clicked, this, [ = ]( bool ) { removeItem(); } ); connect( actnRemoveItem, &QAction::triggered, this, [ = ]( bool ) { removeItem(); } ); QMenu *shareMenu = new QMenu( tr( "Share Menu" ), this ); QAction *exportAction = new QAction( tr( "Export Symbol(s)…" ), this ); exportAction->setIcon( QIcon( QgsApplication::iconPath( "mActionFileSave.svg" ) ) ); shareMenu->addAction( exportAction ); QAction *importAction = new QAction( tr( "Import Symbol(s)…" ), this ); importAction->setIcon( QIcon( QgsApplication::iconPath( "mActionFileOpen.svg" ) ) ); shareMenu->addAction( importAction ); shareMenu->addSeparator(); shareMenu->addAction( actnExportAsPNG ); shareMenu->addAction( actnExportAsSVG ); connect( actnExportAsPNG, &QAction::triggered, this, &QgsStyleManagerDialog::exportItemsPNG ); connect( actnExportAsSVG, &QAction::triggered, this, &QgsStyleManagerDialog::exportItemsSVG ); connect( exportAction, &QAction::triggered, this, &QgsStyleManagerDialog::exportItems ); connect( importAction, &QAction::triggered, this, &QgsStyleManagerDialog::importItems ); btnShare->setMenu( shareMenu ); // Set editing mode off by default mGrouppingMode = false; QStandardItemModel *model = new QStandardItemModel( listItems ); listItems->setModel( model ); listItems->setSelectionMode( QAbstractItemView::ExtendedSelection ); connect( model, &QStandardItemModel::itemChanged, this, &QgsStyleManagerDialog::itemChanged ); connect( listItems->selectionModel(), &QItemSelectionModel::currentChanged, this, &QgsStyleManagerDialog::symbolSelected ); connect( listItems->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsStyleManagerDialog::selectedSymbolsChanged ); populateTypes(); QStandardItemModel *groupModel = new QStandardItemModel( groupTree ); groupTree->setModel( groupModel ); groupTree->setHeaderHidden( true ); populateGroups(); groupTree->setCurrentIndex( groupTree->model()->index( 0, 0 ) ); connect( groupTree->selectionModel(), &QItemSelectionModel::currentChanged, this, &QgsStyleManagerDialog::groupChanged ); connect( groupModel, &QStandardItemModel::itemChanged, this, &QgsStyleManagerDialog::groupRenamed ); QMenu *groupMenu = new QMenu( tr( "Group actions" ), this ); connect( actnTagSymbols, &QAction::triggered, this, &QgsStyleManagerDialog::tagSymbolsAction ); groupMenu->addAction( actnTagSymbols ); connect( actnFinishTagging, &QAction::triggered, this, &QgsStyleManagerDialog::tagSymbolsAction ); actnFinishTagging->setVisible( false ); groupMenu->addAction( actnFinishTagging ); groupMenu->addAction( actnEditSmartGroup ); btnManageGroups->setMenu( groupMenu ); connect( searchBox, &QLineEdit::textChanged, this, &QgsStyleManagerDialog::filterSymbols ); // Context menu for groupTree groupTree->setContextMenuPolicy( Qt::CustomContextMenu ); connect( groupTree, &QWidget::customContextMenuRequested, this, &QgsStyleManagerDialog::grouptreeContextMenu ); // Context menu for listItems listItems->setContextMenuPolicy( Qt::CustomContextMenu ); connect( listItems, &QWidget::customContextMenuRequested, this, &QgsStyleManagerDialog::listitemsContextMenu ); // Menu for the "Add item" toolbutton when in colorramp mode QStringList rampTypes; rampTypes << tr( "Gradient" ) << tr( "Color presets" ) << tr( "Random" ) << tr( "Catalog: cpt-city" ); rampTypes << tr( "Catalog: ColorBrewer" ); mMenuBtnAddItemColorRamp = new QMenu( this ); Q_FOREACH ( const QString &rampType, rampTypes ) mMenuBtnAddItemColorRamp->addAction( new QAction( rampType, this ) ); connect( mMenuBtnAddItemColorRamp, &QMenu::triggered, this, static_cast<bool ( QgsStyleManagerDialog::* )( QAction * )>( &QgsStyleManagerDialog::addColorRamp ) ); // Context menu for symbols/colorramps. The menu entries for every group are created when displaying the menu. mGroupMenu = new QMenu( this ); connect( actnAddFavorite, &QAction::triggered, this, &QgsStyleManagerDialog::addFavoriteSelectedSymbols ); mGroupMenu->addAction( actnAddFavorite ); connect( actnRemoveFavorite, &QAction::triggered, this, &QgsStyleManagerDialog::removeFavoriteSelectedSymbols ); mGroupMenu->addAction( actnRemoveFavorite ); mGroupMenu->addSeparator()->setParent( this ); mGroupListMenu = new QMenu( mGroupMenu ); mGroupListMenu->setTitle( tr( "Add to Tag" ) ); mGroupListMenu->setEnabled( false ); mGroupMenu->addMenu( mGroupListMenu ); actnDetag->setData( 0 ); connect( actnDetag, &QAction::triggered, this, &QgsStyleManagerDialog::detagSelectedSymbols ); mGroupMenu->addAction( actnDetag ); mGroupMenu->addSeparator()->setParent( this ); mGroupMenu->addAction( actnRemoveItem ); mGroupMenu->addAction( actnEditItem ); mGroupMenu->addSeparator()->setParent( this ); mGroupMenu->addAction( actnExportAsPNG ); mGroupMenu->addAction( actnExportAsSVG ); // Context menu for the group tree mGroupTreeContextMenu = new QMenu( this ); connect( actnEditSmartGroup, &QAction::triggered, this, &QgsStyleManagerDialog::editSmartgroupAction ); mGroupTreeContextMenu->addAction( actnEditSmartGroup ); connect( actnAddTag, &QAction::triggered, this, [ = ]( bool ) { addTag(); } ); mGroupTreeContextMenu->addAction( actnAddTag ); connect( actnAddSmartgroup, &QAction::triggered, this, [ = ]( bool ) { addSmartgroup(); } ); mGroupTreeContextMenu->addAction( actnAddSmartgroup ); connect( actnRemoveGroup, &QAction::triggered, this, &QgsStyleManagerDialog::removeGroup ); mGroupTreeContextMenu->addAction( actnRemoveGroup ); tabItemType_currentChanged( 0 ); }
QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbol *symbol, QgsStyle *style, QMenu *menu, QWidget *parent, QgsVectorLayer *layer ) : QWidget( parent ) , mSymbol( symbol ) , mStyle( style ) , mLayer( layer ) { setupUi( this ); connect( mSymbolUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsSymbolsListWidget::mSymbolUnitWidget_changed ); spinAngle->setClearValue( 0 ); mSymbolUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMetersInMapUnits << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches ); mModel = new QgsReadOnlyStyleModel( mStyle, this ); mModel->setEntityFilterEnabled( true ); mModel->setEntityFilter( QgsStyle::SymbolEntity ); if ( mSymbol ) { mModel->setSymbolTypeFilterEnabled( true ); mModel->setSymbolType( mSymbol->type() ); } btnAdvanced->hide(); // advanced button is hidden by default if ( menu ) // show it if there is a menu pointer { mAdvancedMenu = menu; btnAdvanced->show(); btnAdvanced->setMenu( mAdvancedMenu ); } else { btnAdvanced->setMenu( new QMenu( this ) ); } mClipFeaturesAction = new QAction( tr( "Clip Features to Canvas Extent" ), this ); mClipFeaturesAction->setCheckable( true ); connect( mClipFeaturesAction, &QAction::toggled, this, &QgsSymbolsListWidget::clipFeaturesToggled ); mStandardizeRingsAction = new QAction( tr( "Force Right-Hand-Rule Orientation" ), this ); mStandardizeRingsAction->setCheckable( true ); connect( mStandardizeRingsAction, &QAction::toggled, this, &QgsSymbolsListWidget::forceRHRToggled ); double iconSize = Qgis::UI_SCALE_FACTOR * fontMetrics().width( 'X' ) * 10; viewSymbols->setIconSize( QSize( static_cast< int >( iconSize ), static_cast< int >( iconSize * 0.9 ) ) ); // ~100, 90 on low dpi double treeIconSize = Qgis::UI_SCALE_FACTOR * fontMetrics().width( 'X' ) * 2; mSymbolTreeView->setIconSize( QSize( static_cast< int >( treeIconSize ), static_cast< int >( treeIconSize ) ) ); mModel->addDesiredIconSize( viewSymbols->iconSize() ); mModel->addDesiredIconSize( mSymbolTreeView->iconSize() ); viewSymbols->setModel( mModel ); mSymbolTreeView->setModel( mModel ); viewSymbols->setSelectionBehavior( QAbstractItemView::SelectRows ); mSymbolTreeView->setSelectionModel( viewSymbols->selectionModel() ); mSymbolTreeView->setSelectionMode( viewSymbols->selectionMode() ); connect( viewSymbols->selectionModel(), &QItemSelectionModel::currentChanged, this, &QgsSymbolsListWidget::setSymbolFromStyle ); connect( mStyle, &QgsStyle::groupsModified, this, &QgsSymbolsListWidget::populateGroups ); connect( openStyleManagerButton, &QToolButton::clicked, this, &QgsSymbolsListWidget::openStyleManager ); lblSymbolName->clear(); connect( mButtonIconView, &QToolButton::toggled, this, [ = ]( bool active ) { if ( active ) { mSymbolViewStackedWidget->setCurrentIndex( 0 ); // note -- we have to save state here and not in destructor, as new symbol list widgets are created before the previous ones are destroyed QgsSettings().setValue( QStringLiteral( "UI/symbolsList/lastIconView" ), 0, QgsSettings::Gui ); } } ); connect( mButtonListView, &QToolButton::toggled, this, [ = ]( bool active ) { if ( active ) { QgsSettings().setValue( QStringLiteral( "UI/symbolsList/lastIconView" ), 1, QgsSettings::Gui ); mSymbolViewStackedWidget->setCurrentIndex( 1 ); } } ); // restore previous view QgsSettings settings; const int currentView = settings.value( QStringLiteral( "UI/symbolsList/lastIconView" ), 0, QgsSettings::Gui ).toInt(); if ( currentView == 0 ) mButtonIconView->setChecked( true ); else mButtonListView->setChecked( true ); mSymbolTreeView->header()->restoreState( settings.value( QStringLiteral( "UI/symbolsList/treeState" ), QByteArray(), QgsSettings::Gui ).toByteArray() ); connect( mSymbolTreeView->header(), &QHeaderView::sectionResized, this, [this] { // note -- we have to save state here and not in destructor, as new symbol list widgets are created before the previous ones are destroyed QgsSettings().setValue( QStringLiteral( "UI/symbolsList/treeState" ), mSymbolTreeView->header()->saveState(), QgsSettings::Gui ); } ); QgsFilterLineEdit *groupEdit = new QgsFilterLineEdit(); groupEdit->setShowSearchIcon( true ); groupEdit->setShowClearButton( true ); groupEdit->setPlaceholderText( tr( "Filter symbols…" ) ); groupsCombo->setLineEdit( groupEdit ); populateGroups(); connect( groupsCombo, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsSymbolsListWidget::groupsCombo_currentIndexChanged ); connect( groupsCombo, &QComboBox::currentTextChanged, this, &QgsSymbolsListWidget::updateModelFilters ); if ( mSymbol ) { updateSymbolInfo(); } // select correct page in stacked widget // there's a correspondence between symbol type number and page numbering => exploit it! stackedWidget->setCurrentIndex( symbol->type() ); connect( btnColor, &QgsColorButton::colorChanged, this, &QgsSymbolsListWidget::setSymbolColor ); connect( spinAngle, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSymbolsListWidget::setMarkerAngle ); connect( spinSize, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSymbolsListWidget::setMarkerSize ); connect( spinWidth, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSymbolsListWidget::setLineWidth ); registerDataDefinedButton( mRotationDDBtn, QgsSymbolLayer::PropertyAngle ); connect( mRotationDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsSymbolsListWidget::updateDataDefinedMarkerAngle ); registerDataDefinedButton( mSizeDDBtn, QgsSymbolLayer::PropertySize ); connect( mSizeDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsSymbolsListWidget::updateDataDefinedMarkerSize ); registerDataDefinedButton( mWidthDDBtn, QgsSymbolLayer::PropertyStrokeWidth ); connect( mWidthDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsSymbolsListWidget::updateDataDefinedLineWidth ); connect( this, &QgsSymbolsListWidget::changed, this, &QgsSymbolsListWidget::updateAssistantSymbol ); updateAssistantSymbol(); btnColor->setAllowOpacity( true ); btnColor->setColorDialogTitle( tr( "Select Color" ) ); btnColor->setContext( QStringLiteral( "symbology" ) ); connect( btnSaveSymbol, &QPushButton::clicked, this, &QgsSymbolsListWidget::saveSymbol ); connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsSymbolsListWidget::opacityChanged ); }
QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbol* symbol, QgsStyle* style, QMenu* menu, QWidget* parent, const QgsVectorLayer * layer ) : QWidget( parent ) , mSymbol( symbol ) , mStyle( style ) , mAdvancedMenu( nullptr ) , mClipFeaturesAction( nullptr ) , mLayer( layer ) , mMapCanvas( nullptr ) { setupUi( this ); mSymbolUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels ); btnAdvanced->hide(); // advanced button is hidden by default if ( menu ) // show it if there is a menu pointer { mAdvancedMenu = menu; btnAdvanced->show(); btnAdvanced->setMenu( mAdvancedMenu ); } else { btnAdvanced->setMenu( new QMenu( this ) ); } mClipFeaturesAction = new QAction( tr( "Clip features to canvas extent" ), this ); mClipFeaturesAction->setCheckable( true ); connect( mClipFeaturesAction, &QAction::toggled, this, &QgsSymbolsListWidget::clipFeaturesToggled ); QStandardItemModel* model = new QStandardItemModel( viewSymbols ); viewSymbols->setModel( model ); connect( viewSymbols->selectionModel(), SIGNAL( currentChanged( const QModelIndex &, const QModelIndex & ) ), this, SLOT( setSymbolFromStyle( const QModelIndex & ) ) ); connect( mStyle, &QgsStyle::symbolSaved , this, &QgsSymbolsListWidget::symbolAddedToStyle ); connect( mStyle, &QgsStyle::groupsModified , this, &QgsSymbolsListWidget::populateGroups ); connect( openStyleManagerButton, &QPushButton::pressed, this, &QgsSymbolsListWidget::openStyleManager ); lblSymbolName->setText( QLatin1String( "" ) ); populateGroups(); if ( mSymbol ) { updateSymbolInfo(); } // select correct page in stacked widget // there's a correspondence between symbol type number and page numbering => exploit it! stackedWidget->setCurrentIndex( symbol->type() ); connect( btnColor, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setSymbolColor( const QColor& ) ) ); connect( spinAngle, SIGNAL( valueChanged( double ) ), this, SLOT( setMarkerAngle( double ) ) ); connect( spinSize, SIGNAL( valueChanged( double ) ), this, SLOT( setMarkerSize( double ) ) ); connect( spinWidth, SIGNAL( valueChanged( double ) ), this, SLOT( setLineWidth( double ) ) ); connect( mRotationDDBtn, SIGNAL( dataDefinedChanged( const QString& ) ), this, SLOT( updateDataDefinedMarkerAngle() ) ); connect( mRotationDDBtn, SIGNAL( dataDefinedActivated( bool ) ), this, SLOT( updateDataDefinedMarkerAngle() ) ); connect( mSizeDDBtn, SIGNAL( dataDefinedChanged( const QString& ) ), this, SLOT( updateDataDefinedMarkerSize() ) ); connect( mSizeDDBtn, SIGNAL( dataDefinedActivated( bool ) ), this, SLOT( updateDataDefinedMarkerSize() ) ); connect( mWidthDDBtn, SIGNAL( dataDefinedChanged( const QString& ) ), this, SLOT( updateDataDefinedLineWidth() ) ); connect( mWidthDDBtn, SIGNAL( dataDefinedActivated( bool ) ), this, SLOT( updateDataDefinedLineWidth() ) ); if ( mSymbol->type() == QgsSymbol::Marker && mLayer ) mSizeDDBtn->setAssistant( tr( "Size Assistant..." ), new QgsSizeScaleWidget( mLayer, mSymbol ) ); else if ( mSymbol->type() == QgsSymbol::Line && mLayer ) mWidthDDBtn->setAssistant( tr( "Width Assistant..." ), new QgsSizeScaleWidget( mLayer, mSymbol ) ); // Live color updates are not undoable to child symbol layers btnColor->setAcceptLiveUpdates( false ); btnColor->setAllowAlpha( true ); btnColor->setColorDialogTitle( tr( "Select color" ) ); btnColor->setContext( QStringLiteral( "symbology" ) ); connect( btnSaveSymbol, &QPushButton::clicked, this, &QgsSymbolsListWidget::saveSymbol ); }