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 )
350 rampTypes.erase( std::remove_if( rampTypes.begin(), rampTypes.end(), [](
const QPair<QString, QString> &type ) {
351 return type.first != QgsGradientColorRamp::typeString() && type.first != QgsCptCityColorRamp::typeString();
356 for (
const QPair<QString, QString> &type : rampTypes )
357 rampTypeNames << type.second;
359 const QString selectedRampTypeName = QInputDialog::getItem(
this, tr(
"Color ramp type" ), tr(
"Please select color ramp type:" ), rampTypeNames, 0,
false, &ok );
361 if ( !ok || selectedRampTypeName.isEmpty() )
364 const QString rampType = rampTypes.value( rampTypeNames.indexOf( selectedRampTypeName ) ).first;
366 QgsColorRamp *ramp =
nullptr;
369 ramp =
new QgsGradientColorRamp();
373 ramp =
new QgsLimitedRandomColorRamp();
377 ramp =
new QgsColorBrewerColorRamp();
381 ramp =
new QgsPresetSchemeColorRamp();
385 ramp =
new QgsCptCityColorRamp( QString(), QString() );
396 showColorRampDialog();
399void QgsColorRampButton::saveColorRamp()
402 if ( !saveDlg.exec() || saveDlg.name().isEmpty() )
407 QgsStyle *destinationStyle = saveDlg.destinationStyle();
410 if ( destinationStyle->
symbolNames().contains( saveDlg.name() ) )
412 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 );
413 if ( res != QMessageBox::Yes )
420 const QStringList colorRampTags = saveDlg.tags().split(
',' );
425 destinationStyle->
saveColorRamp( saveDlg.name(), ramp, saveDlg.isFavorite(), colorRampTags );
430void QgsColorRampButton::invertColorRamp()
432 mColorRamp->invert();
439 if ( e->type() == QEvent::EnabledChange )
443 QToolButton::changeEvent( e );
447void QgsColorRampButton::paintEvent( QPaintEvent *e )
449 QToolButton::paintEvent( e );
451 if ( !mBackgroundSet )
461 QToolButton::showEvent( e );
466 QToolButton::resizeEvent(
event );
474 if ( colorramp == mColorRamp.get() )
477 mColorRamp.reset( colorramp ? colorramp->
clone() :
nullptr );
488 if ( !name.isEmpty() )
490 const std::unique_ptr<QgsColorRamp> ramp( mStyle->colorRamp( name ) );
512 backgroundColorRamp = mColorRamp.get();
515 QSize currentIconSize;
519 if ( !mIconSize.isValid() )
522 QStyleOptionToolButton opt;
523 initStyleOption( &opt );
524 const QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton,
this );
527 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
529 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
532 currentIconSize = mIconSize;
538 currentIconSize = QSize( width() - 10, height() - 6 );
540 currentIconSize = QSize( width() - 10, height() - 12 );
544 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
553 pm = QPixmap( currentIconSize );
554 pm.fill( Qt::transparent );
557 const QPen pen = ( palette().buttonText().color() );
559 painter.begin( &pm );
560 painter.setPen( pen );
561 painter.drawText( QRect( 0, 0, currentIconSize.width(), currentIconSize.height() ), Qt::AlignCenter, u
"Random colors"_s );
567 if ( backgroundColorRamp )
573 setIconSize( currentIconSize );
579 return mColorRamp ? mColorRamp->
clone() :
nullptr;
584 mColorRampDialogTitle = title;
589 return mColorRampDialogTitle;
594 setMenu(
showMenu ? mMenu :
nullptr );
595 setPopupMode(
showMenu ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup );
603 return menu() ? true :
false;
608 mDefaultColorRamp.reset( colorramp ? colorramp->
clone() :
nullptr );
613 return mDefaultColorRamp ? mDefaultColorRamp->
clone() :
nullptr;
636void QgsColorRampButton::rampWidgetUpdated()
639 if ( limitedRampWidget )
645 QgsColorBrewerColorRampWidget *colorBrewerRampWidget = qobject_cast<QgsColorBrewerColorRampWidget *>( sender() );
646 if ( colorBrewerRampWidget )
652 QgsPresetColorRampWidget *presetRampWidget = qobject_cast<QgsPresetColorRampWidget *>( sender() );
653 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)