31#include <QInputDialog>
38#include "moc_qgscolorrampbutton.cpp"
41 : QToolButton( parent )
42 , mColorRampDialogTitle( dialogTitle.isEmpty() ? tr(
"Select Color Ramp" ) : dialogTitle )
44 setAcceptDrops(
true );
45 setMinimumSize( QSize( 24, 16 ) );
46 connect(
this, &QPushButton::clicked,
this, &QgsColorRampButton::buttonClicked );
49 mMenu =
new QMenu(
this );
50 connect( mMenu, &QMenu::aboutToShow,
this, &QgsColorRampButton::prepareMenu );
53 mAllRampsMenu =
new QMenu( mMenu );
54 mAllRampsMenu->setTitle( tr(
"All Color Ramps" ) );
56 setPopupMode( QToolButton::MenuButtonPopup );
67 return QSize( 120,
static_cast<int>( std::max(
Qgis::UI_SCALE_FACTOR * fontMetrics().height(), 22.0 ) ) );
70 return QSize( 120,
static_cast<int>( std::max(
Qgis::UI_SCALE_FACTOR * fontMetrics().height() * 1.4, 28.0 ) ) );
74void QgsColorRampButton::showColorRampDialog()
77 const bool panelMode = panel && panel->
dockMode();
79 std::unique_ptr<QgsColorRamp> currentRamp(
colorRamp() );
89 dlg.setWindowTitle( mColorRampDialogTitle );
97 QgsLimitedRandomColorRamp *randRamp =
static_cast<QgsLimitedRandomColorRamp *
>( currentRamp.get() );
100 QgsLimitedRandomColorRampWidget *widget =
new QgsLimitedRandomColorRampWidget( *randRamp,
this );
107 QgsLimitedRandomColorRampDialog dlg( *randRamp,
this );
116 QgsPresetSchemeColorRamp *presetRamp =
static_cast<QgsPresetSchemeColorRamp *
>( currentRamp.get() );
119 QgsPresetColorRampWidget *widget =
new QgsPresetColorRampWidget( *presetRamp,
this );
126 QgsPresetColorRampDialog dlg( *presetRamp,
this );
135 QgsColorBrewerColorRamp *brewerRamp =
static_cast<QgsColorBrewerColorRamp *
>( currentRamp.get() );
138 QgsColorBrewerColorRampWidget *widget =
new QgsColorBrewerColorRampWidget( *brewerRamp,
this );
145 QgsColorBrewerColorRampDialog dlg( *brewerRamp,
this );
154 QgsCptCityColorRamp *cptCityRamp =
static_cast<QgsCptCityColorRamp *
>( currentRamp.get() );
155 QgsCptCityColorRampDialog dlg( *cptCityRamp,
this );
158 if ( dlg.saveAsGradientRamp() )
172 if ( !mDefaultColorRamp )
187 if ( e->type() == QEvent::ToolTip )
194 return QToolButton::event( e );
199 if ( e->button() == Qt::RightButton )
201 QToolButton::showMenu();
204 QToolButton::mousePressEvent( e );
207QPixmap QgsColorRampButton::createMenuIcon(
QgsColorRamp *colorramp )
215void QgsColorRampButton::buttonClicked()
219 showColorRampDialog();
223 QToolButton::showMenu();
227void QgsColorRampButton::prepareMenu()
231 QAction *invertAction =
new QAction( tr(
"Invert Color Ramp" ),
this );
233 mMenu->addAction( invertAction );
234 connect( invertAction, &QAction::triggered,
this, &QgsColorRampButton::invertColorRamp );
238 QAction *nullAction =
new QAction( tr(
"Clear Current Ramp" ),
this );
239 nullAction->setEnabled( !
isNull() );
240 mMenu->addAction( nullAction );
244 mMenu->addSeparator();
247 if ( mDefaultColorRamp )
249 QAction *defaultColorRampAction =
new QAction( tr(
"Default Color Ramp" ),
this );
250 defaultColorRampAction->setIcon( createMenuIcon( mDefaultColorRamp.get() ) );
251 mMenu->addAction( defaultColorRampAction );
255 if ( mShowRandomColorRamp )
257 QAction *randomColorRampAction =
new QAction( tr(
"Random Color Ramp" ),
this );
258 randomColorRampAction->setCheckable(
true );
260 mMenu->addAction( randomColorRampAction );
263 if (
isRandomColorRamp() ||
dynamic_cast<QgsLimitedRandomColorRamp *
>( mColorRamp.get() ) )
265 QAction *shuffleRandomColorRampAction =
new QAction( tr(
"Shuffle Random Colors" ),
this );
266 mMenu->addAction( shuffleRandomColorRampAction );
271 mMenu->addSeparator();
276 for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
278 std::unique_ptr<QgsColorRamp> ramp( mStyle->colorRamp( *it ) );
283 QAction *ra =
new QAction( *it,
this );
285 connect( ra, &QAction::triggered,
this, &QgsColorRampButton::loadColorRamp );
286 mMenu->addAction( ra );
290 mMenu->addSeparator();
292 mAllRampsMenu->clear();
293 mMenu->addMenu( mAllRampsMenu );
294 rampNames = mStyle->colorRampNames();
296 for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
298 std::unique_ptr<QgsColorRamp> ramp( mStyle->colorRamp( *it ) );
303 QAction *ra =
new QAction( *it,
this );
305 connect( ra, &QAction::triggered,
this, &QgsColorRampButton::loadColorRamp );
306 mAllRampsMenu->addAction( ra );
310 mMenu->addSeparator();
312 QAction *newColorRampAction =
new QAction( tr(
"Create New Color Ramp…" ),
this );
313 connect( newColorRampAction, &QAction::triggered,
this, &QgsColorRampButton::createColorRamp );
314 mMenu->addAction( newColorRampAction );
316 QAction *editColorRampAction =
new QAction( tr(
"Edit Color Ramp…" ),
this );
318 connect( editColorRampAction, &QAction::triggered,
this, &QgsColorRampButton::showColorRampDialog );
319 mMenu->addAction( editColorRampAction );
321 QAction *saveColorRampAction =
new QAction( tr(
"Save Color Ramp…" ),
this );
323 connect( saveColorRampAction, &QAction::triggered,
this, &QgsColorRampButton::saveColorRamp );
324 mMenu->addAction( saveColorRampAction );
327void QgsColorRampButton::loadColorRamp()
329 QAction *selectedItem = qobject_cast<QAction *>( sender() );
332 const QString name = selectedItem->iconText();
338void QgsColorRampButton::createColorRamp()
343 QStringList rampTypeNames;
344 rampTypeNames.reserve( rampTypes.size() );
345 if ( mShowGradientOnly )
347 rampTypes.erase( std::remove_if( rampTypes.begin(), rampTypes.end(), [](
const QPair<QString, QString> &type ) {
348 return type.first != QgsGradientColorRamp::typeString() && type.first != QgsCptCityColorRamp::typeString();
353 for (
const QPair<QString, QString> &type : rampTypes )
354 rampTypeNames << type.second;
356 const QString selectedRampTypeName = QInputDialog::getItem(
this, tr(
"Color ramp type" ), tr(
"Please select color ramp type:" ), rampTypeNames, 0,
false, &ok );
358 if ( !ok || selectedRampTypeName.isEmpty() )
361 const QString rampType = rampTypes.value( rampTypeNames.indexOf( selectedRampTypeName ) ).first;
363 QgsColorRamp *ramp =
nullptr;
366 ramp =
new QgsGradientColorRamp();
370 ramp =
new QgsLimitedRandomColorRamp();
374 ramp =
new QgsColorBrewerColorRamp();
378 ramp =
new QgsPresetSchemeColorRamp();
382 ramp =
new QgsCptCityColorRamp( QString(), QString() );
393 showColorRampDialog();
396void QgsColorRampButton::saveColorRamp()
399 if ( !saveDlg.exec() || saveDlg.name().isEmpty() )
404 QgsStyle *destinationStyle = saveDlg.destinationStyle();
407 if ( destinationStyle->
symbolNames().contains( saveDlg.name() ) )
409 const int res = QMessageBox::warning(
this, tr(
"Save Color Ramp" ), tr(
"Color ramp with name '%1' already exists. Overwrite?" ).arg( saveDlg.name() ), QMessageBox::Yes | QMessageBox::No );
410 if ( res != QMessageBox::Yes )
417 const QStringList colorRampTags = saveDlg.tags().split(
',' );
422 destinationStyle->
saveColorRamp( saveDlg.name(), ramp, saveDlg.isFavorite(), colorRampTags );
427void QgsColorRampButton::invertColorRamp()
429 mColorRamp->invert();
436 if ( e->type() == QEvent::EnabledChange )
440 QToolButton::changeEvent( e );
444void 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,
this );
524 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
526 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
529 currentIconSize = mIconSize;
535 currentIconSize = QSize( width() - 10, height() - 6 );
537 currentIconSize = QSize( width() - 10, height() - 12 );
541 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
550 pm = QPixmap( currentIconSize );
551 pm.fill( Qt::transparent );
554 const QPen pen = ( palette().buttonText().color() );
556 painter.begin( &pm );
557 painter.setPen( pen );
558 painter.drawText( QRect( 0, 0, currentIconSize.width(), currentIconSize.height() ), Qt::AlignCenter, QStringLiteral(
"Random colors" ) );
564 if ( backgroundColorRamp )
570 setIconSize( currentIconSize );
576 return mColorRamp ? mColorRamp->
clone() :
nullptr;
581 mColorRampDialogTitle = title;
586 return mColorRampDialogTitle;
591 setMenu(
showMenu ? mMenu :
nullptr );
592 setPopupMode(
showMenu ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup );
600 return menu() ? true :
false;
605 mDefaultColorRamp.reset( colorramp ? colorramp->
clone() :
nullptr );
610 return mDefaultColorRamp ? mDefaultColorRamp->
clone() :
nullptr;
633void QgsColorRampButton::rampWidgetUpdated()
636 if ( limitedRampWidget )
642 QgsColorBrewerColorRampWidget *colorBrewerRampWidget = qobject_cast<QgsColorBrewerColorRampWidget *>( sender() );
643 if ( colorBrewerRampWidget )
649 QgsPresetColorRampWidget *presetRampWidget = qobject_cast<QgsPresetColorRampWidget *>( sender() );
650 if ( presetRampWidget )
static const double UI_SCALE_FACTOR
UI scaling factor.
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.
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.
static QString typeString()
Returns the string identifier for QgsLimitedRandomColorRamp.
QgsLimitedRandomColorRamp * clone() const override
Creates a clone of the color ramp.
static QString typeString()
Returns the string identifier for QgsPresetSchemeColorRamp.
QgsPresetSchemeColorRamp * clone() const override
Creates a clone of the color ramp.
A color ramp consisting of random colors, constrained within component ranges.
bool addColorRamp(const QString &name, QgsColorRamp *colorRamp, bool update=false)
Adds a color ramp to the style.
@ ColorrampEntity
Color ramps.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
bool saveColorRamp(const QString &name, const QgsColorRamp *ramp, bool favorite, const QStringList &tags)
Adds the colorramp to the database.
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,...
#define QgsDebugError(str)