31 #include <QInputDialog> 
   32 #include <QMessageBox> 
   33 #include <QMouseEvent> 
   36 #include <QPushButton> 
   39   : QToolButton( parent )
 
   40   , mColorRampDialogTitle( dialogTitle.isEmpty() ? tr( 
"Select Color Ramp" ) : dialogTitle )
 
   42   setAcceptDrops( 
true );
 
   43   setMinimumSize( QSize( 24, 16 ) );
 
   44   connect( 
this, &QPushButton::clicked, 
this, &QgsColorRampButton::buttonClicked );
 
   47   mMenu = 
new QMenu( 
this );
 
   48   connect( mMenu, &QMenu::aboutToShow, 
this, &QgsColorRampButton::prepareMenu );
 
   51   mAllRampsMenu = 
new QMenu( mMenu );
 
   52   mAllRampsMenu->setTitle( tr( 
"All Color Ramps" ) );
 
   54   setPopupMode( QToolButton::MenuButtonPopup );
 
   65   return QSize( 120, 
static_cast<int>( std::max( 
Qgis::UI_SCALE_FACTOR * fontMetrics().height( ), 22.0 ) ) );
 
   68   return QSize( 120, 
static_cast<int>( std::max( 
Qgis::UI_SCALE_FACTOR * fontMetrics().height( ) * 1.4, 28.0 ) ) );
 
   72 void QgsColorRampButton::showColorRampDialog()
 
   75   const bool panelMode = panel && panel->
dockMode();
 
   77   std::unique_ptr< QgsColorRamp > currentRamp( 
colorRamp() );
 
   87     dlg.setWindowTitle( mColorRampDialogTitle );
 
  156       if ( dlg.saveAsGradientRamp() )
 
  170   if ( !mDefaultColorRamp )
 
  185   if ( e->type() == QEvent::ToolTip )
 
  192   return QToolButton::event( e );
 
  197   if ( e->button() == Qt::RightButton )
 
  199     QToolButton::showMenu();
 
  202   QToolButton::mousePressEvent( e );
 
  205 QPixmap QgsColorRampButton::createMenuIcon( 
QgsColorRamp *colorramp )
 
  213 void QgsColorRampButton::buttonClicked()
 
  217     showColorRampDialog();
 
  221     QToolButton::showMenu();
 
  225 void QgsColorRampButton::prepareMenu()
 
  229   QAction *invertAction = 
new QAction( tr( 
"Invert Color Ramp" ), 
this );
 
  231   mMenu->addAction( invertAction );
 
  232   connect( invertAction, &QAction::triggered, 
this, &QgsColorRampButton::invertColorRamp );
 
  236     QAction *nullAction = 
new QAction( tr( 
"Clear Current Ramp" ), 
this );
 
  237     mMenu->addAction( nullAction );
 
  241   mMenu->addSeparator();
 
  244   if ( mDefaultColorRamp )
 
  246     QAction *defaultColorRampAction = 
new QAction( tr( 
"Default Color Ramp" ), 
this );
 
  247     defaultColorRampAction->setIcon( createMenuIcon( mDefaultColorRamp.get() ) );
 
  248     mMenu->addAction( defaultColorRampAction );
 
  252   if ( mShowRandomColorRamp )
 
  254     QAction *randomColorRampAction = 
new QAction( tr( 
"Random Color Ramp" ), 
this );
 
  255     randomColorRampAction->setCheckable( 
true );
 
  257     mMenu->addAction( randomColorRampAction );
 
  262       QAction *shuffleRandomColorRampAction = 
new QAction( tr( 
"Shuffle Random Colors" ), 
this );
 
  263       mMenu->addAction( shuffleRandomColorRampAction );
 
  268   mMenu->addSeparator();
 
  273   for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
 
  275     std::unique_ptr< QgsColorRamp > ramp( mStyle->
colorRamp( *it ) );
 
  280       QAction *ra = 
new QAction( *it, 
this );
 
  282       connect( ra, &QAction::triggered, 
this, &QgsColorRampButton::loadColorRamp );
 
  283       mMenu->addAction( ra );
 
  287   mMenu->addSeparator();
 
  289   mAllRampsMenu->clear();
 
  290   mMenu->addMenu( mAllRampsMenu );
 
  293   for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
 
  295     std::unique_ptr< QgsColorRamp > ramp( mStyle->
colorRamp( *it ) );
 
  300       QAction *ra = 
new QAction( *it, 
this );
 
  302       connect( ra, &QAction::triggered, 
this, &QgsColorRampButton::loadColorRamp );
 
  303       mAllRampsMenu->addAction( ra );
 
  307   mMenu->addSeparator();
 
  309   QAction *newColorRampAction = 
new QAction( tr( 
"Create New Color Ramp…" ), 
this );
 
  310   connect( newColorRampAction, &QAction::triggered, 
this, &QgsColorRampButton::createColorRamp );
 
  311   mMenu->addAction( newColorRampAction );
 
  313   QAction *editColorRampAction = 
new QAction( tr( 
"Edit Color Ramp…" ), 
this );
 
  315   connect( editColorRampAction, &QAction::triggered, 
this, &QgsColorRampButton::showColorRampDialog );
 
  316   mMenu->addAction( editColorRampAction );
 
  318   QAction *saveColorRampAction = 
new QAction( tr( 
"Save Color Ramp…" ), 
this );
 
  320   connect( saveColorRampAction, &QAction::triggered, 
this, &QgsColorRampButton::saveColorRamp );
 
  321   mMenu->addAction( saveColorRampAction );
 
  324 void QgsColorRampButton::loadColorRamp()
 
  326   QAction *selectedItem = qobject_cast<QAction *>( sender() );
 
  329     const QString name = selectedItem->iconText();
 
  335 void QgsColorRampButton::createColorRamp()
 
  341   QStringList rampTypeNames;
 
  342   rampTypeNames.reserve( rampTypes.size() );
 
  343   if ( mShowGradientOnly )
 
  345     rampTypes.erase( std::remove_if( rampTypes.begin(), rampTypes.end(), []( 
const QPair< QString, QString > &type )
 
  347       return type.first != QgsGradientColorRamp::typeString() && type.first != QgsCptCityColorRamp::typeString();
 
  348     } ), rampTypes.end() );
 
  351   for ( 
const QPair< QString, QString > &type : rampTypes )
 
  352     rampTypeNames << type.second;
 
  354   const QString selectedRampTypeName = QInputDialog::getItem( 
this, tr( 
"Color ramp type" ),
 
  355                                        tr( 
"Please select color ramp type:" ), rampTypeNames, 0, 
false, &ok );
 
  357   if ( !ok || selectedRampTypeName.isEmpty() )
 
  360   const QString rampType = rampTypes.value( rampTypeNames.indexOf( selectedRampTypeName ) ).first;
 
  392   showColorRampDialog();
 
  395 void QgsColorRampButton::saveColorRamp()
 
  398   if ( !saveDlg.exec() || saveDlg.name().isEmpty() )
 
  404   if ( mStyle->
symbolNames().contains( saveDlg.name() ) )
 
  406     const int res = QMessageBox::warning( 
this, tr( 
"Save Color Ramp" ),
 
  407                                           tr( 
"Color ramp with name '%1' already exists. Overwrite?" )
 
  408                                           .arg( saveDlg.name() ),
 
  409                                           QMessageBox::Yes | QMessageBox::No );
 
  410     if ( res != QMessageBox::Yes )
 
  417   const QStringList colorRampTags = saveDlg.tags().split( 
',' );
 
  422   mStyle->
saveColorRamp( saveDlg.name(), ramp, saveDlg.isFavorite(), colorRampTags );
 
  427 void QgsColorRampButton::invertColorRamp()
 
  429   mColorRamp->invert();
 
  436   if ( e->type() == QEvent::EnabledChange )
 
  440   QToolButton::changeEvent( e );
 
  444 void QgsColorRampButton::paintEvent( QPaintEvent *e )
 
  446   QToolButton::paintEvent( e );
 
  448   if ( !mBackgroundSet )
 
  458   QToolButton::showEvent( e );
 
  463   QToolButton::resizeEvent( 
event );
 
  471   if ( colorramp == mColorRamp.get() )
 
  474   mColorRamp.reset( colorramp ? colorramp->
clone() : 
nullptr );
 
  485   if ( !name.isEmpty() )
 
  487     const std::unique_ptr< QgsColorRamp > ramp( mStyle->
colorRamp( name ) );
 
  509     backgroundColorRamp = mColorRamp.get();
 
  512   QSize currentIconSize;
 
  516     if ( !mIconSize.isValid() )
 
  519       QStyleOptionToolButton opt;
 
  520       initStyleOption( &opt );
 
  521       const QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton,
 
  525       mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
 
  527       mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
 
  530     currentIconSize = mIconSize;
 
  536     currentIconSize = QSize( width() - 10, height() - 6 );
 
  538     currentIconSize = QSize( width() - 10, height() - 12 );
 
  542   if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
 
  551     pm = QPixmap( currentIconSize );
 
  552     pm.fill( Qt::transparent );
 
  555     const QPen pen  = ( palette().buttonText().color() );
 
  557     painter.begin( &pm );
 
  558     painter.setPen( pen );
 
  559     painter.drawText( QRect( 0, 0, currentIconSize.width(), currentIconSize.height() ), Qt::AlignCenter, QStringLiteral( 
"Random colors" ) );
 
  565     if ( backgroundColorRamp )
 
  571   setIconSize( currentIconSize );
 
  577   return mColorRamp ? mColorRamp->clone() : 
nullptr;
 
  582   mColorRampDialogTitle = title;
 
  587   return mColorRampDialogTitle;
 
  592   setMenu( 
showMenu ? mMenu : 
nullptr );
 
  593   setPopupMode( 
showMenu ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup );
 
  601   return menu() ? true : 
false;
 
  606   mDefaultColorRamp.reset( colorramp ? colorramp->
clone() : 
nullptr );
 
  611   return mDefaultColorRamp ? mDefaultColorRamp->clone() : 
nullptr;
 
  634 void QgsColorRampButton::rampWidgetUpdated()
 
  637   if ( limitedRampWidget )
 
  644   if ( colorBrewerRampWidget )
 
  651   if ( presetRampWidget )
 
static const double UI_SCALE_FACTOR
UI scaling factor.
A dialog which allows users to modify the properties of a QgsColorBrewerColorRamp.
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.
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(...
virtual QgsColorRamp * clone() const =0
Creates a clone of the color ramp.
A dialog which allows users to modify the properties of a QgsCptCityColorRamp.
static QString typeString()
Returns the string identifier for QgsCptCityColorRamp.
A dialog which allows users to modify the properties of a QgsGradientColorRamp.
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
static QString typeString()
Returns the string identifier for QgsGradientColorRamp.
A dialog which allows users to modify the properties of a QgsLimitedRandomColorRamp.
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 dialog which allows users to modify the properties of a QgsPresetSchemeColorRamp.
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.
Totally random color ramp.
a dialog for setting properties of a newly saved style.
bool saveColorRamp(const QString &name, QgsColorRamp *ramp, bool favorite, const QStringList &tags)
Adds the colorramp to the database.
bool addColorRamp(const QString &name, QgsColorRamp *colorRamp, bool update=false)
Adds a color ramp to the style.
@ ColorrampEntity
Color ramps.
QStringList colorRampNames() const
Returns a list of names of color ramps.
static QgsStyle * defaultStyle()
Returns default application-wide style.
QgsColorRamp * colorRamp(const QString &name) const
Returns a new copy of the specified color ramp.
QStringList symbolsOfFavorite(StyleEntity type) const
Returns the symbol names which are flagged as favorite.
bool removeColorRamp(const QString &name)
Removes color ramp from style (and delete it)
QStringList symbolNames() const
Returns a list of names of symbols.
static QIcon colorRampPreviewIcon(QgsColorRamp *ramp, QSize size, int padding=0)
Returns an icon preview for a color ramp.
static QPixmap colorRampPreviewPixmap(QgsColorRamp *ramp, QSize size, int padding=0, Qt::Orientation direction=Qt::Horizontal, bool flipDirection=false, bool drawTransparentBackground=true)
Returns a pixmap preview for a color ramp.
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
int scaleIconSize(int standardSize)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...