31#include <QInputDialog>
39#include "moc_qgscolorrampbutton.cpp"
41using namespace Qt::StringLiterals;
44 : QToolButton( parent )
45 , mColorRampDialogTitle( dialogTitle.isEmpty() ? tr(
"Select Color Ramp" ) : dialogTitle )
47 setAcceptDrops(
true );
48 setMinimumSize( QSize( 24, 16 ) );
49 connect(
this, &QPushButton::clicked,
this, &QgsColorRampButton::buttonClicked );
52 mMenu =
new QMenu(
this );
53 connect( mMenu, &QMenu::aboutToShow,
this, &QgsColorRampButton::prepareMenu );
56 mAllRampsMenu =
new QMenu( mMenu );
57 mAllRampsMenu->setTitle( tr(
"All Color Ramps" ) );
59 setPopupMode( QToolButton::MenuButtonPopup );
70 return QSize( 120,
static_cast<int>( std::max(
Qgis::UI_SCALE_FACTOR * fontMetrics().height(), 22.0 ) ) );
73 return QSize( 120,
static_cast<int>( std::max(
Qgis::UI_SCALE_FACTOR * fontMetrics().height() * 1.4, 28.0 ) ) );
77void QgsColorRampButton::showColorRampDialog()
80 const bool panelMode = panel && panel->
dockMode();
82 std::unique_ptr<QgsColorRamp> currentRamp(
colorRamp() );
92 dlg.setWindowTitle( mColorRampDialogTitle );
100 QgsLimitedRandomColorRamp *randRamp =
static_cast<QgsLimitedRandomColorRamp *
>( currentRamp.get() );
103 QgsLimitedRandomColorRampWidget *widget =
new QgsLimitedRandomColorRampWidget( *randRamp,
this );
110 QgsLimitedRandomColorRampDialog dlg( *randRamp,
this );
119 QgsPresetSchemeColorRamp *presetRamp =
static_cast<QgsPresetSchemeColorRamp *
>( currentRamp.get() );
122 QgsPresetColorRampWidget *widget =
new QgsPresetColorRampWidget( *presetRamp,
this );
129 QgsPresetColorRampDialog dlg( *presetRamp,
this );
138 QgsColorBrewerColorRamp *brewerRamp =
static_cast<QgsColorBrewerColorRamp *
>( currentRamp.get() );
141 QgsColorBrewerColorRampWidget *widget =
new QgsColorBrewerColorRampWidget( *brewerRamp,
this );
148 QgsColorBrewerColorRampDialog dlg( *brewerRamp,
this );
157 QgsCptCityColorRamp *cptCityRamp =
static_cast<QgsCptCityColorRamp *
>( currentRamp.get() );
158 QgsCptCityColorRampDialog dlg( *cptCityRamp,
this );
161 if ( dlg.saveAsGradientRamp() )
175 if ( !mDefaultColorRamp )
190 if ( e->type() == QEvent::ToolTip )
197 return QToolButton::event( e );
202 if ( e->button() == Qt::RightButton )
204 QToolButton::showMenu();
207 QToolButton::mousePressEvent( e );
210QPixmap QgsColorRampButton::createMenuIcon(
QgsColorRamp *colorramp )
218void QgsColorRampButton::buttonClicked()
222 showColorRampDialog();
226 QToolButton::showMenu();
230void QgsColorRampButton::prepareMenu()
234 QAction *invertAction =
new QAction( tr(
"Invert Color Ramp" ),
this );
236 mMenu->addAction( invertAction );
237 connect( invertAction, &QAction::triggered,
this, &QgsColorRampButton::invertColorRamp );
241 QAction *nullAction =
new QAction( tr(
"Clear Current Ramp" ),
this );
242 nullAction->setEnabled( !
isNull() );
243 mMenu->addAction( nullAction );
247 mMenu->addSeparator();
250 if ( mDefaultColorRamp )
252 QAction *defaultColorRampAction =
new QAction( tr(
"Default Color Ramp" ),
this );
253 defaultColorRampAction->setIcon( createMenuIcon( mDefaultColorRamp.get() ) );
254 mMenu->addAction( defaultColorRampAction );
258 if ( mShowRandomColorRamp )
260 QAction *randomColorRampAction =
new QAction( tr(
"Random Color Ramp" ),
this );
261 randomColorRampAction->setCheckable(
true );
263 mMenu->addAction( randomColorRampAction );
266 if (
isRandomColorRamp() ||
dynamic_cast<QgsLimitedRandomColorRamp *
>( mColorRamp.get() ) )
268 QAction *shuffleRandomColorRampAction =
new QAction( tr(
"Shuffle Random Colors" ),
this );
269 mMenu->addAction( shuffleRandomColorRampAction );
274 mMenu->addSeparator();
279 for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
281 std::unique_ptr<QgsColorRamp> ramp( mStyle->colorRamp( *it ) );
286 QAction *ra =
new QAction( *it,
this );
288 connect( ra, &QAction::triggered,
this, &QgsColorRampButton::loadColorRamp );
289 mMenu->addAction( ra );
293 mMenu->addSeparator();
295 mAllRampsMenu->clear();
296 mMenu->addMenu( mAllRampsMenu );
297 rampNames = mStyle->colorRampNames();
299 for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
301 std::unique_ptr<QgsColorRamp> ramp( mStyle->colorRamp( *it ) );
306 QAction *ra =
new QAction( *it,
this );
308 connect( ra, &QAction::triggered,
this, &QgsColorRampButton::loadColorRamp );
309 mAllRampsMenu->addAction( ra );
313 mMenu->addSeparator();
315 QAction *newColorRampAction =
new QAction( tr(
"Create New Color Ramp…" ),
this );
316 connect( newColorRampAction, &QAction::triggered,
this, &QgsColorRampButton::createColorRamp );
317 mMenu->addAction( newColorRampAction );
319 QAction *editColorRampAction =
new QAction( tr(
"Edit Color Ramp…" ),
this );
321 connect( editColorRampAction, &QAction::triggered,
this, &QgsColorRampButton::showColorRampDialog );
322 mMenu->addAction( editColorRampAction );
324 QAction *saveColorRampAction =
new QAction( tr(
"Save Color Ramp…" ),
this );
326 connect( saveColorRampAction, &QAction::triggered,
this, &QgsColorRampButton::saveColorRamp );
327 mMenu->addAction( saveColorRampAction );
330void QgsColorRampButton::loadColorRamp()
332 QAction *selectedItem = qobject_cast<QAction *>( sender() );
335 const QString name = selectedItem->iconText();
341void QgsColorRampButton::createColorRamp()
346 QStringList rampTypeNames;
347 rampTypeNames.reserve( rampTypes.size() );
348 if ( mShowGradientOnly )
352 rampTypes.begin(), rampTypes.end(), [](
const QPair<QString, QString> &type ) { return type.first != QgsGradientColorRamp::typeString() && type.first != QgsCptCityColorRamp::typeString(); }
358 for (
const QPair<QString, QString> &type : rampTypes )
359 rampTypeNames << type.second;
361 const QString selectedRampTypeName = QInputDialog::getItem(
this, tr(
"Color ramp type" ), tr(
"Please select color ramp type:" ), rampTypeNames, 0,
false, &ok );
363 if ( !ok || selectedRampTypeName.isEmpty() )
366 const QString rampType = rampTypes.value( rampTypeNames.indexOf( selectedRampTypeName ) ).first;
368 QgsColorRamp *ramp =
nullptr;
371 ramp =
new QgsGradientColorRamp();
375 ramp =
new QgsLimitedRandomColorRamp();
379 ramp =
new QgsColorBrewerColorRamp();
383 ramp =
new QgsPresetSchemeColorRamp();
387 ramp =
new QgsCptCityColorRamp( QString(), QString() );
398 showColorRampDialog();
401void QgsColorRampButton::saveColorRamp()
404 if ( !saveDlg.exec() || saveDlg.name().isEmpty() )
409 QgsStyle *destinationStyle = saveDlg.destinationStyle();
412 if ( destinationStyle->
symbolNames().contains( saveDlg.name() ) )
414 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 );
415 if ( res != QMessageBox::Yes )
422 const QStringList colorRampTags = saveDlg.tags().split(
',' );
427 destinationStyle->
saveColorRamp( saveDlg.name(), ramp, saveDlg.isFavorite(), colorRampTags );
432void QgsColorRampButton::invertColorRamp()
434 mColorRamp->invert();
441 if ( e->type() == QEvent::EnabledChange )
445 QToolButton::changeEvent( e );
449void QgsColorRampButton::paintEvent( QPaintEvent *e )
451 QToolButton::paintEvent( e );
453 if ( !mBackgroundSet )
463 QToolButton::showEvent( e );
468 QToolButton::resizeEvent(
event );
476 if ( colorramp == mColorRamp.get() )
479 mColorRamp.reset( colorramp ? colorramp->
clone() :
nullptr );
490 if ( !name.isEmpty() )
492 const std::unique_ptr<QgsColorRamp> ramp( mStyle->colorRamp( name ) );
514 backgroundColorRamp = mColorRamp.get();
517 QSize currentIconSize;
521 if ( !mIconSize.isValid() )
524 QStyleOptionToolButton opt;
525 initStyleOption( &opt );
526 const QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton,
this );
529 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
531 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
534 currentIconSize = mIconSize;
540 currentIconSize = QSize( width() - 10, height() - 6 );
542 currentIconSize = QSize( width() - 10, height() - 12 );
546 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
555 pm = QPixmap( currentIconSize );
556 pm.fill( Qt::transparent );
559 const QPen pen = ( palette().buttonText().color() );
561 painter.begin( &pm );
562 painter.setPen( pen );
563 painter.drawText( QRect( 0, 0, currentIconSize.width(), currentIconSize.height() ), Qt::AlignCenter, u
"Random colors"_s );
569 if ( backgroundColorRamp )
575 setIconSize( currentIconSize );
581 return mColorRamp ? mColorRamp->
clone() :
nullptr;
586 mColorRampDialogTitle = title;
591 return mColorRampDialogTitle;
596 setMenu(
showMenu ? mMenu :
nullptr );
597 setPopupMode(
showMenu ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup );
605 return menu() ? true :
false;
610 mDefaultColorRamp.reset( colorramp ? colorramp->
clone() :
nullptr );
615 return mDefaultColorRamp ? mDefaultColorRamp->
clone() :
nullptr;
638void QgsColorRampButton::rampWidgetUpdated()
641 if ( limitedRampWidget )
647 QgsColorBrewerColorRampWidget *colorBrewerRampWidget = qobject_cast<QgsColorBrewerColorRampWidget *>( sender() );
648 if ( colorBrewerRampWidget )
654 QgsPresetColorRampWidget *presetRampWidget = qobject_cast<QgsPresetColorRampWidget *>( sender() );
655 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)