void QgsColorButton::prepareMenu() { //we need to tear down and rebuild this menu every time it is shown. Otherwise the space allocated to any //QgsColorSwatchGridAction is not recalculated by Qt and the swatch grid may not be the correct size //for the number of colors shown in the grid. Note that we MUST refresh color swatch grids every time this //menu is opened, otherwise color schemes like the recent color scheme grid are meaningless mMenu->clear(); const bool isProjectColor = linkedProjectColor().isValid(); if ( !isProjectColor ) { if ( mShowNull ) { QAction *nullAction = new QAction( tr( "Clear Color" ), this ); nullAction->setIcon( createMenuIcon( Qt::transparent, false ) ); mMenu->addAction( nullAction ); connect( nullAction, &QAction::triggered, this, &QgsColorButton::setToNull ); } //show default color option if set if ( mDefaultColor.isValid() ) { QAction *defaultColorAction = new QAction( tr( "Default Color" ), this ); defaultColorAction->setIcon( createMenuIcon( mDefaultColor ) ); mMenu->addAction( defaultColorAction ); connect( defaultColorAction, &QAction::triggered, this, &QgsColorButton::setToDefaultColor ); } if ( mShowNoColorOption && mAllowOpacity ) { QAction *noColorAction = new QAction( mNoColorString, this ); noColorAction->setIcon( createMenuIcon( Qt::transparent, false ) ); mMenu->addAction( noColorAction ); connect( noColorAction, &QAction::triggered, this, &QgsColorButton::setToNoColor ); } mMenu->addSeparator(); QgsColorWheel *colorWheel = new QgsColorWheel( mMenu ); colorWheel->setColor( color() ); QgsColorWidgetAction *colorAction = new QgsColorWidgetAction( colorWheel, mMenu, mMenu ); colorAction->setDismissOnColorSelection( false ); connect( colorAction, &QgsColorWidgetAction::colorChanged, this, &QgsColorButton::setColor ); mMenu->addAction( colorAction ); if ( mAllowOpacity ) { QgsColorRampWidget *alphaRamp = new QgsColorRampWidget( mMenu, QgsColorWidget::Alpha, QgsColorRampWidget::Horizontal ); alphaRamp->setColor( color() ); QgsColorWidgetAction *alphaAction = new QgsColorWidgetAction( alphaRamp, mMenu, mMenu ); alphaAction->setDismissOnColorSelection( false ); connect( alphaAction, &QgsColorWidgetAction::colorChanged, this, &QgsColorButton::setColor ); connect( alphaAction, &QgsColorWidgetAction::colorChanged, colorWheel, [colorWheel]( const QColor & color ) { colorWheel->setColor( color, false ); } ); connect( colorAction, &QgsColorWidgetAction::colorChanged, alphaRamp, [alphaRamp]( const QColor & color ) { alphaRamp->setColor( color, false ); } ); mMenu->addAction( alphaAction ); } if ( mColorSchemeRegistry ) { //get schemes with ShowInColorButtonMenu flag set QList< QgsColorScheme * > schemeList = mColorSchemeRegistry->schemes( QgsColorScheme::ShowInColorButtonMenu ); QList< QgsColorScheme * >::iterator it = schemeList.begin(); for ( ; it != schemeList.end(); ++it ) { QgsColorSwatchGridAction *colorAction = new QgsColorSwatchGridAction( *it, mMenu, mContext, this ); colorAction->setBaseColor( mColor ); mMenu->addAction( colorAction ); connect( colorAction, &QgsColorSwatchGridAction::colorChanged, this, &QgsColorButton::setValidColor ); connect( colorAction, &QgsColorSwatchGridAction::colorChanged, this, &QgsColorButton::addRecentColor ); } } mMenu->addSeparator(); } if ( isProjectColor ) { QAction *unlinkAction = new QAction( tr( "Unlink Color" ), mMenu ); mMenu->addAction( unlinkAction ); connect( unlinkAction, &QAction::triggered, this, &QgsColorButton::unlink ); } QAction *copyColorAction = new QAction( tr( "Copy Color" ), this ); mMenu->addAction( copyColorAction ); connect( copyColorAction, &QAction::triggered, this, &QgsColorButton::copyColor ); if ( !isProjectColor ) { QAction *pasteColorAction = new QAction( tr( "Paste Color" ), this ); //enable or disable paste action based on current clipboard contents. We always show the paste //action, even if it's disabled, to give hint to the user that pasting colors is possible QColor clipColor; if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor ) ) { pasteColorAction->setIcon( createMenuIcon( clipColor ) ); } else { pasteColorAction->setEnabled( false ); } mMenu->addAction( pasteColorAction ); connect( pasteColorAction, &QAction::triggered, this, &QgsColorButton::pasteColor ); QAction *pickColorAction = new QAction( tr( "Pick Color" ), this ); mMenu->addAction( pickColorAction ); connect( pickColorAction, &QAction::triggered, this, &QgsColorButton::activatePicker ); QAction *chooseColorAction = new QAction( tr( "Choose Color…" ), this ); mMenu->addAction( chooseColorAction ); connect( chooseColorAction, &QAction::triggered, this, &QgsColorButton::showColorDialog ); } }
void QgsColorRampButton::prepareMenu() { mMenu->clear(); QAction *invertAction = new QAction( tr( "Invert color ramp" ), this ); invertAction->setEnabled( !isNull() && !isRandomColorRamp() ); mMenu->addAction( invertAction ); connect( invertAction, &QAction::triggered, this, &QgsColorRampButton::invertColorRamp ); if ( mShowNull ) { QAction *nullAction = new QAction( tr( "Clear current ramp" ), this ); mMenu->addAction( nullAction ); connect( nullAction, &QAction::triggered, this, &QgsColorRampButton::setToNull ); } mMenu->addSeparator(); //show default color option if set if ( mDefaultColorRamp ) { QAction *defaultColorRampAction = new QAction( tr( "Default color ramp" ), this ); defaultColorRampAction->setIcon( createMenuIcon( mDefaultColorRamp ) ); mMenu->addAction( defaultColorRampAction ); connect( defaultColorRampAction, &QAction::triggered, this, &QgsColorRampButton::setToDefaultColorRamp ); } if ( mShowRandomColorRamp ) { QAction *randomColorRampAction = new QAction( tr( "Random color ramp" ), this ); randomColorRampAction->setCheckable( true ); randomColorRampAction->setChecked( isRandomColorRamp() ); mMenu->addAction( randomColorRampAction ); connect( randomColorRampAction, &QAction::triggered, this, &QgsColorRampButton::setRandomColorRamp ); if ( isRandomColorRamp() || dynamic_cast<QgsLimitedRandomColorRamp *>( mColorRamp ) ) { QAction *shuffleRandomColorRampAction = new QAction( tr( "Shuffle random colors" ), this ); mMenu->addAction( shuffleRandomColorRampAction ); connect( shuffleRandomColorRampAction, &QAction::triggered, this, &QgsColorRampButton::colorRampChanged ); } } mMenu->addSeparator(); QStringList rampNames = mStyle->symbolsOfFavorite( QgsStyle::ColorrampEntity ); rampNames.sort(); for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it ) { std::unique_ptr< QgsColorRamp > ramp( mStyle->colorRamp( *it ) ); if ( !mShowGradientOnly || ( ramp->type() == QLatin1String( "gradient" ) || ramp->type() == QLatin1String( "cpt-city" ) ) ) { QIcon icon = QgsSymbolLayerUtils::colorRampPreviewIcon( ramp.get(), QSize( 16, 16 ) ); QAction *ra = new QAction( *it, this ); ra->setIcon( icon ); connect( ra, &QAction::triggered, this, &QgsColorRampButton::loadColorRamp ); mMenu->addAction( ra ); } } mMenu->addSeparator(); mAllRampsMenu->clear(); mMenu->addMenu( mAllRampsMenu ); rampNames = mStyle->colorRampNames(); rampNames.sort(); for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it ) { std::unique_ptr< QgsColorRamp > ramp( mStyle->colorRamp( *it ) ); if ( !mShowGradientOnly || ( ramp->type() == QLatin1String( "gradient" ) || ramp->type() == QLatin1String( "cpt-city" ) ) ) { QIcon icon = QgsSymbolLayerUtils::colorRampPreviewIcon( ramp.get(), QSize( 16, 16 ) ); QAction *ra = new QAction( *it, this ); ra->setIcon( icon ); connect( ra, &QAction::triggered, this, &QgsColorRampButton::loadColorRamp ); mAllRampsMenu->addAction( ra ); } } mMenu->addSeparator(); QAction *newColorRampAction = new QAction( tr( "Create new color ramp..." ), this ); connect( newColorRampAction, &QAction::triggered, this, &QgsColorRampButton::createColorRamp ); mMenu->addAction( newColorRampAction ); QAction *editColorRampAction = new QAction( tr( "Edit color ramp..." ), this ); editColorRampAction->setEnabled( !isNull() && !isRandomColorRamp() ); connect( editColorRampAction, &QAction::triggered, this, &QgsColorRampButton::showColorRampDialog ); mMenu->addAction( editColorRampAction ); QAction *saveColorRampAction = new QAction( tr( "Save color ramp..." ), this ); saveColorRampAction->setEnabled( !isNull() && !isRandomColorRamp() ); connect( saveColorRampAction, &QAction::triggered, this, &QgsColorRampButton::saveColorRamp ); mMenu->addAction( saveColorRampAction ); }