QGIS API Documentation 3.41.0-Master (fda2aa46e9a)
Loading...
Searching...
No Matches
qgscolorbutton.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgscolorbutton.cpp - Button which displays a color
3 --------------------------------------
4 Date : 12-Dec-2006
5 Copyright : (C) 2006 by Tom Elwertowski
6 Email : telwertowski at users dot sourceforge dot net
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#include "qgscolorbutton.h"
17#include "moc_qgscolorbutton.cpp"
18#include "qgscolordialog.h"
19#include "qgsapplication.h"
20#include "qgssymbollayerutils.h"
21#include "qgscolorswatchgrid.h"
23#include "qgscolorwidgets.h"
24#include "qgssettings.h"
25#include "qgsproject.h"
26#include "qgsguiutils.h"
27#include "qgsgui.h"
28#include "qgscolortooltip_p.h"
29
30#include <QPainter>
31#include <QMouseEvent>
32#include <QMenu>
33#include <QClipboard>
34#include <QDrag>
35#include <QStyle>
36#include <QStyleOptionToolButton>
37#include <QWidgetAction>
38#include <QScreen>
39#include <QLabel>
40#include <QGridLayout>
41#include <QPushButton>
42#include <QBuffer>
43
44QgsColorButton::QgsColorButton( QWidget *parent, const QString &cdt, QgsColorSchemeRegistry *registry )
45 : QToolButton( parent )
46 , mColorDialogTitle( cdt.isEmpty() ? tr( "Select Color" ) : cdt )
47 , mNoColorString( tr( "No color" ) )
48{
49 //if a color scheme registry was specified, use it, otherwise use the global instance
50 mColorSchemeRegistry = registry ? registry : QgsApplication::colorSchemeRegistry();
51
52 setAcceptDrops( true );
53 setMinimumSize( QSize( 24, 16 ) );
54 connect( this, &QAbstractButton::clicked, this, &QgsColorButton::buttonClicked );
55
56 //setup drop-down menu
57 mMenu = new QMenu( this );
58 connect( mMenu, &QMenu::aboutToShow, this, &QgsColorButton::prepareMenu );
59 setMenu( mMenu );
60 setPopupMode( QToolButton::MenuButtonPopup );
61
62#ifdef Q_OS_WIN
63 mMinimumSize = QSize( 120, 22 );
64#else
65 mMinimumSize = QSize( 120, 28 );
66#endif
67
68 mMinimumSize.setHeight( std::max( static_cast<int>( Qgis::UI_SCALE_FACTOR * fontMetrics().height() * 1.1 ), mMinimumSize.height() ) );
69
70 // If project colors change, we need to redraw the button, as it may be set to follow a project color
72 {
74 } );
75}
76
78{
79 return mMinimumSize;
80}
81
83{
84 return mMinimumSize;
85}
86
88{
89 static QPixmap sTranspBkgrd;
90
91 if ( sTranspBkgrd.isNull() )
92 sTranspBkgrd = QgsApplication::getThemePixmap( QStringLiteral( "/transp-background_8x8.png" ) );
93
94 return sTranspBkgrd;
95}
96
97void QgsColorButton::showColorDialog()
98{
100 if ( panel && panel->dockMode() )
101 {
102 const QColor currentColor = color();
104 colorWidget->setPanelTitle( mColorDialogTitle );
105 colorWidget->setAllowOpacity( mAllowOpacity );
106
107 if ( currentColor.isValid() )
108 {
109 colorWidget->setPreviousColor( currentColor );
110 }
111
112 connect( colorWidget, &QgsCompoundColorWidget::currentColorChanged, this, &QgsColorButton::setValidTemporaryColor );
113 panel->openPanel( colorWidget );
114 return;
115 }
116
117 QColor newColor;
118 const QgsSettings settings;
119
120 // first check if we need to use the limited native dialogs
121 const bool useNative = settings.value( QStringLiteral( "qgis/native_color_dialogs" ), false ).toBool();
122 if ( useNative )
123 {
124 // why would anyone want this? who knows.... maybe the limited nature of native dialogs helps ease the transition for MapInfo users?
125 newColor = QColorDialog::getColor( color(), this, mColorDialogTitle, mAllowOpacity ? QColorDialog::ShowAlphaChannel : ( QColorDialog::ColorDialogOption )0 );
126 }
127 else
128 {
129 QgsColorDialog dialog( this, Qt::WindowFlags(), color() );
130 dialog.setTitle( mColorDialogTitle );
131 dialog.setAllowOpacity( mAllowOpacity );
132
133 if ( dialog.exec() )
134 {
135 newColor = dialog.color();
136 }
137 }
138
139 if ( newColor.isValid() )
140 {
141 setValidColor( newColor );
142 }
143
144 // reactivate button's window
145 activateWindow();
146}
147
149{
150 if ( !mDefaultColor.isValid() )
151 {
152 return;
153 }
154
155 setColor( mDefaultColor );
156}
157
159{
160 setColor( QColor() );
161 emit cleared();
162}
163
165{
166 linkToProjectColor( QString() );
167 emit unlinked();
168}
169
170bool QgsColorButton::event( QEvent *e )
171{
172 if ( e->type() == QEvent::ToolTip && isEnabled() )
173 {
174 QColor c = linkedProjectColor();
175 const bool isProjectColor = c.isValid();
176 if ( !isProjectColor )
177 c = mColor;
178
179 QString info = ( isProjectColor ? QStringLiteral( "<p>%1: %2</p>" ).arg( tr( "Linked color" ), mLinkedColorName ) : QString() );
180
181 info += QgsColorTooltip::htmlDescription( c, this );
182
183 setToolTip( info );
184 }
185 return QToolButton::event( e );
186}
187
189{
190 QColor noColor = QColor( mColor );
191 noColor.setAlpha( 0 );
192 setColor( noColor );
193}
194
196{
197 if ( mPickingColor )
198 {
199 //don't show dialog if in color picker mode
200 e->accept();
201 return;
202 }
203
204 if ( e->button() == Qt::RightButton )
205 {
206 QToolButton::showMenu();
207 return;
208 }
209 else if ( e->button() == Qt::LeftButton )
210 {
211 mDragStartPosition = e->pos();
212 }
213 QToolButton::mousePressEvent( e );
214}
215
216bool QgsColorButton::colorFromMimeData( const QMimeData *mimeData, QColor &resultColor )
217{
218 bool hasAlpha = false;
219 QColor mimeColor = QgsSymbolLayerUtils::colorFromMimeData( mimeData, hasAlpha );
220
221 if ( mimeColor.isValid() )
222 {
223 if ( !mAllowOpacity )
224 {
225 //remove alpha channel
226 mimeColor.setAlpha( 255 );
227 }
228 else if ( !hasAlpha )
229 {
230 //mime color has no explicit alpha component, so keep existing alpha
231 mimeColor.setAlpha( mColor.alpha() );
232 }
233 resultColor = mimeColor;
234 return true;
235 }
236
237 //could not get color from mime data
238 return false;
239}
240
241void QgsColorButton::mouseMoveEvent( QMouseEvent *e )
242{
243 if ( mPickingColor )
244 {
245 setButtonBackground( QgsGui::sampleColor( e->globalPos() ) );
246 e->accept();
247 return;
248 }
249
250 //handle dragging colors from button
251 QColor c = linkedProjectColor();
252 if ( !c.isValid() )
253 c = mColor;
254
255 if ( !( e->buttons() & Qt::LeftButton ) || !c.isValid() )
256 {
257 //left button not depressed or no color set, so not a drag
258 QToolButton::mouseMoveEvent( e );
259 return;
260 }
261
262 if ( ( e->pos() - mDragStartPosition ).manhattanLength() < QApplication::startDragDistance() )
263 {
264 //mouse not moved, so not a drag
265 QToolButton::mouseMoveEvent( e );
266 return;
267 }
268
269 //user is dragging color
270 QDrag *drag = new QDrag( this );
271 drag->setMimeData( QgsSymbolLayerUtils::colorToMimeData( c ) );
272 drag->setPixmap( QgsColorWidget::createDragIcon( c ) );
273 drag->exec( Qt::CopyAction );
274 setDown( false );
275}
276
278{
279 if ( mPickingColor )
280 {
281 //end color picking operation by sampling the color under cursor
282 stopPicking( e->globalPos() );
283 e->accept();
284 return;
285 }
286
287 QToolButton::mouseReleaseEvent( e );
288}
289
290void QgsColorButton::stopPicking( QPoint eventPos, bool samplingColor )
291{
292 //release mouse and keyboard, and reset cursor
293 releaseMouse();
294 releaseKeyboard();
295 QgsApplication::restoreOverrideCursor();
296 setMouseTracking( false );
297 mPickingColor = false;
298
299 if ( !samplingColor )
300 {
301 //not sampling color, restore old color
303 return;
304 }
305
306 setColor( QgsGui::sampleColor( eventPos ) );
307 addRecentColor( mColor );
308}
309
310QColor QgsColorButton::linkedProjectColor() const
311{
312 QList<QgsProjectColorScheme *> projectSchemes;
313 QgsApplication::colorSchemeRegistry()->schemes( projectSchemes );
314 if ( projectSchemes.length() > 0 )
315 {
316 QgsProjectColorScheme *scheme = projectSchemes.at( 0 );
317 const QgsNamedColorList colors = scheme->fetchColors();
318 for ( const auto &color : colors )
319 {
320 if ( color.second.isEmpty() )
321 continue;
322
323 if ( color.second == mLinkedColorName )
324 {
325 return color.first;
326 }
327 }
328 }
329 return QColor();
330}
331
333{
334 if ( !mPickingColor )
335 {
336 //if not picking a color, use default tool button behavior
337 QToolButton::keyPressEvent( e );
338 return;
339 }
340
341 //cancel picking, sampling the color if space was pressed
342 stopPicking( QCursor::pos(), e->key() == Qt::Key_Space );
343}
344
345void QgsColorButton::dragEnterEvent( QDragEnterEvent *e )
346{
347 const bool isProjectColor = linkedProjectColor().isValid();
348 if ( isProjectColor )
349 return;
350
351 //is dragged data valid color data?
352 QColor mimeColor;
353 if ( colorFromMimeData( e->mimeData(), mimeColor ) )
354 {
355 //if so, we accept the drag, and temporarily change the button's color
356 //to match the dragged color. This gives immediate feedback to the user
357 //that colors can be dropped here
358 e->acceptProposedAction();
359 setButtonBackground( mimeColor );
360 }
361}
362
363void QgsColorButton::dragLeaveEvent( QDragLeaveEvent *e )
364{
365 Q_UNUSED( e )
366 //reset button color
368}
369
370void QgsColorButton::dropEvent( QDropEvent *e )
371{
372 const bool isProjectColor = linkedProjectColor().isValid();
373 if ( isProjectColor )
374 return;
375
376 //is dropped data valid color data?
377 QColor mimeColor;
378 if ( colorFromMimeData( e->mimeData(), mimeColor ) )
379 {
380 //accept drop and set new color
381 e->acceptProposedAction();
382 setColor( mimeColor );
383 addRecentColor( mimeColor );
384 }
385}
386
387void QgsColorButton::wheelEvent( QWheelEvent *event )
388{
389 if ( mAllowOpacity && isEnabled() && !isNull() )
390 {
391 const double increment = ( ( event->modifiers() & Qt::ControlModifier ) ? 0.01 : 0.1 ) *
392 ( event->angleDelta().y() > 0 ? 1 : -1 );
393 const double alpha = std::min( std::max( 0.0, mColor.alphaF() + increment ), 1.0 );
394 mColor.setAlphaF( alpha );
395
397 emit colorChanged( mColor );
398 event->accept();
399 }
400 else
401 {
402 QToolButton::wheelEvent( event );
403 }
404}
405
406void QgsColorButton::setValidColor( const QColor &newColor )
407{
408 if ( newColor.isValid() )
409 {
410 setColor( newColor );
411 addRecentColor( newColor );
412 }
413}
414
415void QgsColorButton::setValidTemporaryColor( const QColor &newColor )
416{
417 if ( newColor.isValid() )
418 {
419 setColor( newColor );
420 }
421}
422
423QPixmap QgsColorButton::createMenuIcon( const QColor &color, const bool showChecks )
424{
425 const int iconSize = QgsGuiUtils::scaleIconSize( 16 );
426
427 //create an icon pixmap
428 QPixmap pixmap( iconSize, iconSize );
429 pixmap.fill( Qt::transparent );
430
431 QPainter p;
432 p.begin( &pixmap );
433
434 //start with checkboard pattern
435 if ( showChecks )
436 {
437 const QBrush checkBrush = QBrush( transparentBackground() );
438 p.setPen( Qt::NoPen );
439 p.setBrush( checkBrush );
440 p.drawRect( 0, 0, iconSize - 1, iconSize - 1 );
441 }
442
443 //draw color over pattern
444 p.setBrush( QBrush( color ) );
445
446 //draw border
447 p.setPen( QColor( 197, 197, 197 ) );
448 p.drawRect( 0, 0, iconSize - 1, iconSize - 1 );
449 p.end();
450 return pixmap;
451}
452
453void QgsColorButton::buttonClicked()
454{
455 if ( linkedProjectColor().isValid() )
456 {
457 QToolButton::showMenu();
458 }
459 else
460 {
461 switch ( mBehavior )
462 {
463 case ShowDialog:
464 showColorDialog();
465 return;
466 case SignalOnly:
467 emit colorClicked( mColor );
468 return;
469 }
470 }
471}
472
473void QgsColorButton::prepareMenu()
474{
475 //we need to tear down and rebuild this menu every time it is shown. Otherwise the space allocated to any
476 //QgsColorSwatchGridAction is not recalculated by Qt and the swatch grid may not be the correct size
477 //for the number of colors shown in the grid. Note that we MUST refresh color swatch grids every time this
478 //menu is opened, otherwise color schemes like the recent color scheme grid are meaningless
479 mMenu->clear();
480
481 const bool isProjectColor = linkedProjectColor().isValid();
482
483 if ( !isProjectColor )
484 {
485 if ( mShowNull )
486 {
487 QAction *nullAction = new QAction( mNullColorString.isEmpty() ? tr( "Clear Color" ) : mNullColorString, this );
488 nullAction->setIcon( createMenuIcon( Qt::transparent, false ) );
489 mMenu->addAction( nullAction );
490 connect( nullAction, &QAction::triggered, this, &QgsColorButton::setToNull );
491 }
492
493 //show default color option if set
494 if ( mDefaultColor.isValid() )
495 {
496 QAction *defaultColorAction = new QAction( tr( "Default Color" ), this );
497 defaultColorAction->setIcon( createMenuIcon( mDefaultColor ) );
498 mMenu->addAction( defaultColorAction );
499 connect( defaultColorAction, &QAction::triggered, this, &QgsColorButton::setToDefaultColor );
500 }
501
502 if ( mShowNoColorOption )
503 {
504 QAction *noColorAction = new QAction( mNoColorString, this );
505 noColorAction->setIcon( createMenuIcon( Qt::transparent, false ) );
506 mMenu->addAction( noColorAction );
507 connect( noColorAction, &QAction::triggered, this, &QgsColorButton::setToNoColor );
508 }
509
510 mMenu->addSeparator();
511 QgsColorWheel *colorWheel = new QgsColorWheel( mMenu );
512 colorWheel->setColor( color() );
513 QgsColorWidgetAction *colorAction = new QgsColorWidgetAction( colorWheel, mMenu, mMenu );
514 colorAction->setDismissOnColorSelection( false );
515 connect( colorAction, &QgsColorWidgetAction::colorChanged, this, &QgsColorButton::setColor );
516 mMenu->addAction( colorAction );
517 if ( mAllowOpacity )
518 {
520 alphaRamp->setColor( color() );
521 QgsColorWidgetAction *alphaAction = new QgsColorWidgetAction( alphaRamp, mMenu, mMenu );
522 alphaAction->setDismissOnColorSelection( false );
523 connect( alphaAction, &QgsColorWidgetAction::colorChanged, this, &QgsColorButton::setColor );
524 connect( alphaAction, &QgsColorWidgetAction::colorChanged, colorWheel, [colorWheel]( const QColor & color ) { colorWheel->setColor( color, false ); }
525 );
526 connect( colorAction, &QgsColorWidgetAction::colorChanged, alphaRamp, [alphaRamp]( const QColor & color ) { alphaRamp->setColor( color, false ); }
527 );
528 mMenu->addAction( alphaAction );
529 }
530
531 if ( mColorSchemeRegistry )
532 {
533 //get schemes with ShowInColorButtonMenu flag set
534 QList< QgsColorScheme * > schemeList = mColorSchemeRegistry->schemes( QgsColorScheme::ShowInColorButtonMenu );
535 QList< QgsColorScheme * >::iterator it = schemeList.begin();
536 for ( ; it != schemeList.end(); ++it )
537 {
538 QgsColorSwatchGridAction *colorAction = new QgsColorSwatchGridAction( *it, mMenu, mContext, this );
539 colorAction->setBaseColor( mColor );
540 mMenu->addAction( colorAction );
541 connect( colorAction, &QgsColorSwatchGridAction::colorChanged, this, &QgsColorButton::setValidColor );
542 connect( colorAction, &QgsColorSwatchGridAction::colorChanged, this, &QgsColorButton::addRecentColor );
543 }
544 }
545
546 mMenu->addSeparator();
547 }
548
549 if ( isProjectColor )
550 {
551 QAction *unlinkAction = new QAction( tr( "Unlink Color" ), mMenu );
552 mMenu->addAction( unlinkAction );
553 connect( unlinkAction, &QAction::triggered, this, &QgsColorButton::unlink );
554 }
555
556 QAction *copyColorAction = new QAction( tr( "Copy Color" ), this );
557 mMenu->addAction( copyColorAction );
558 connect( copyColorAction, &QAction::triggered, this, &QgsColorButton::copyColor );
559
560 if ( !isProjectColor )
561 {
562 QAction *pasteColorAction = new QAction( tr( "Paste Color" ), this );
563 //enable or disable paste action based on current clipboard contents. We always show the paste
564 //action, even if it's disabled, to give hint to the user that pasting colors is possible
565 QColor clipColor;
566 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor ) )
567 {
568 pasteColorAction->setIcon( createMenuIcon( clipColor ) );
569 }
570 else
571 {
572 pasteColorAction->setEnabled( false );
573 }
574 mMenu->addAction( pasteColorAction );
575 connect( pasteColorAction, &QAction::triggered, this, &QgsColorButton::pasteColor );
576
577 QAction *pickColorAction = new QAction( tr( "Pick Color" ), this );
578 mMenu->addAction( pickColorAction );
579 connect( pickColorAction, &QAction::triggered, this, &QgsColorButton::activatePicker );
580
581 QAction *chooseColorAction = new QAction( tr( "Choose Color…" ), this );
582 mMenu->addAction( chooseColorAction );
583 connect( chooseColorAction, &QAction::triggered, this, &QgsColorButton::showColorDialog );
584 }
585}
586
588{
589 if ( e->type() == QEvent::EnabledChange )
590 {
592 }
593 QToolButton::changeEvent( e );
594}
595
596#if 0 // causes too many cyclical updates, but may be needed on some platforms
597void QgsColorButton::paintEvent( QPaintEvent *e )
598{
599 QToolButton::paintEvent( e );
600
601 if ( !mBackgroundSet )
602 {
604 }
605}
606#endif
607
608void QgsColorButton::showEvent( QShowEvent *e )
609{
611 QToolButton::showEvent( e );
612}
613
614void QgsColorButton::resizeEvent( QResizeEvent *event )
615{
616 QToolButton::resizeEvent( event );
617 //recalculate icon size and redraw icon
618 mIconSize = QSize();
620}
621
622void QgsColorButton::setColor( const QColor &color )
623{
624 const QColor oldColor = mColor;
625 mColor = color;
626
627 // handle when initially set color is same as default (Qt::black); consider it a color change
628 if ( oldColor != mColor || ( mColor == QColor( Qt::black ) && !mColorSet ) )
629 {
631 if ( isEnabled() )
632 {
633 // TODO: May be beneficial to have the option to set color without emitting this signal.
634 // Now done by blockSignals( bool ) where button is used
635 emit colorChanged( mColor );
636 }
637 }
638 mColorSet = true;
639}
640
641void QgsColorButton::addRecentColor( const QColor &color )
642{
644}
645
646void QgsColorButton::setButtonBackground( const QColor &color )
647{
648 QColor backgroundColor = color;
649 bool isProjectColor = false;
650 if ( !backgroundColor.isValid() && !mLinkedColorName.isEmpty() )
651 {
652 backgroundColor = linkedProjectColor();
653 isProjectColor = backgroundColor.isValid();
654 if ( !isProjectColor )
655 {
656 mLinkedColorName.clear(); //color has been deleted, renamed, etc...
657 emit unlinked();
658 }
659 }
660 if ( !backgroundColor.isValid() )
661 {
662 backgroundColor = mColor;
663 }
664
665 QSize currentIconSize;
666 //icon size is button size with a small margin
667 if ( menu() )
668 {
669 if ( !mIconSize.isValid() )
670 {
671 //calculate size of push button part of widget (ie, without the menu drop-down button part)
672 QStyleOptionToolButton opt;
673 initStyleOption( &opt );
674 const QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton,
675 this );
676 //make sure height of icon looks good under different platforms
677#ifdef Q_OS_WIN
678 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
679#else
680 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
681#endif
682 }
683 currentIconSize = mIconSize;
684 }
685 else
686 {
687 //no menu
688#ifdef Q_OS_WIN
689 currentIconSize = QSize( width() - 10, height() - 6 );
690#else
691 currentIconSize = QSize( width() - 10, height() - 12 );
692#endif
693 }
694
695 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
696 {
697 return;
698 }
699
700 //create an icon pixmap
701 const double pixelRatio = devicePixelRatioF();
702 QPixmap pixmap( currentIconSize * pixelRatio );
703 pixmap.setDevicePixelRatio( pixelRatio );
704 pixmap.fill( Qt::transparent );
705
706 if ( backgroundColor.isValid() )
707 {
708 const QRectF rect( 0, 0,
709 currentIconSize.width(),
710 currentIconSize.height() );
711 QPainter p;
712 p.begin( &pixmap );
713 p.setRenderHint( QPainter::Antialiasing );
714 p.setPen( Qt::NoPen );
715 if ( mAllowOpacity && backgroundColor.alpha() < 255 )
716 {
717 //start with checkboard pattern
718 const QBrush checkBrush = QBrush( transparentBackground() );
719 p.setBrush( checkBrush );
720 p.drawRoundedRect( rect, 3, 3 );
721 }
722
723 //draw semi-transparent color on top
724 p.setBrush( backgroundColor );
725 p.drawRoundedRect( rect, 3, 3 );
726 p.end();
727 }
728
729 setIconSize( currentIconSize );
730 setIcon( pixmap );
731}
732
734{
735 //copy color
736 QColor c = linkedProjectColor();
737 if ( !c.isValid() )
738 c = mColor;
739 QApplication::clipboard()->setMimeData( QgsSymbolLayerUtils::colorToMimeData( c ) );
740}
741
743{
744 QColor clipColor;
745 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor ) )
746 {
747 //paste color
748 setColor( clipColor );
749 addRecentColor( clipColor );
750 }
751}
752
754{
755 //activate picker color
756 // Store current color
757 mCurrentColor = mColor;
758 QApplication::setOverrideCursor( QgsApplication::getThemeCursor( QgsApplication::Cursor::Sampler ) );
759 grabMouse();
760 grabKeyboard();
761 mPickingColor = true;
762 setMouseTracking( true );
763}
764
766{
767 QColor c = linkedProjectColor();
768 if ( !c.isValid() )
769 c = mColor;
770 return c;
771}
772
773void QgsColorButton::setAllowOpacity( const bool allow )
774{
775 mAllowOpacity = allow;
776}
777
778void QgsColorButton::setColorDialogTitle( const QString &title )
779{
780 mColorDialogTitle = title;
781}
782
784{
785 return mColorDialogTitle;
786}
787
788void QgsColorButton::setShowMenu( const bool showMenu )
789{
790 mShowMenu = showMenu;
791 setMenu( showMenu ? mMenu : nullptr );
792 setPopupMode( showMenu ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup );
793 //force recalculation of icon size
794 mIconSize = QSize();
796}
797
799{
800 mBehavior = behavior;
801}
802
803void QgsColorButton::setDefaultColor( const QColor &color )
804{
805 mDefaultColor = color;
806}
807
808void QgsColorButton::setShowNull( bool showNull, const QString &nullString )
809{
810 mShowNull = showNull;
811 mNullColorString = nullString;
812}
813
815{
816 return mShowNull;
817}
818
820{
821 return !mColor.isValid();
822}
823
824void QgsColorButton::linkToProjectColor( const QString &name )
825{
826 mLinkedColorName = name;
828}
static const double UI_SCALE_FACTOR
UI scaling factor.
Definition qgis.h:5627
static QPixmap getThemePixmap(const QString &name, const QColor &foreColor=QColor(), const QColor &backColor=QColor(), int size=16)
Helper to get a theme icon as a pixmap.
static QCursor getThemeCursor(Cursor cursor)
Helper to get a theme cursor.
static QgsColorSchemeRegistry * colorSchemeRegistry()
Returns the application's color scheme registry, used for managing color schemes.
@ Sampler
Color/Value picker.
void setDefaultColor(const QColor &color)
Sets the default color for the button, which is shown in the button's drop-down menu for the "default...
void mouseReleaseEvent(QMouseEvent *e) override
Reimplemented to allow color picking.
void dragLeaveEvent(QDragLeaveEvent *e) override
Reimplemented to reset button appearance after drag leave.
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
void copyColor()
Copies the current color to the clipboard.
void setButtonBackground(const QColor &color=QColor())
Sets the background pixmap for the button based upon color and transparency.
void mousePressEvent(QMouseEvent *e) override
Reimplemented to detect right mouse button clicks on the color button and allow dragging colors.
bool event(QEvent *e) override
void dropEvent(QDropEvent *e) override
Reimplemented to accept dropped colors.
static const QPixmap & transparentBackground()
Returns a checkboard pattern pixmap for use as a background to transparent colors.
Behavior
Specifies the behavior when the button is clicked.
@ ShowDialog
Show a color picker dialog when clicked.
@ SignalOnly
Emit colorClicked signal only, no dialog.
void setShowMenu(bool showMenu)
Sets whether the drop-down menu should be shown for the button.
QgsColorButton(QWidget *parent=nullptr, const QString &cdt=QString(), QgsColorSchemeRegistry *registry=nullptr)
Construct a new color ramp button.
QSize sizeHint() const override
static QPixmap createMenuIcon(const QColor &color, bool showChecks=true)
Creates an icon for displaying a color in a drop-down menu.
void setBehavior(Behavior behavior)
Sets the behavior for when the button is clicked.
void setColorDialogTitle(const QString &title)
Set the title for the color chooser dialog window.
QSize minimumSizeHint() const override
void setShowNull(bool showNull, const QString &nullString=QString())
Sets whether a set to null (clear) option is shown in the button's drop-down menu.
void linkToProjectColor(const QString &name)
Sets the button to link to an existing project color, by color name.
void unlinked()
Emitted when the color is unlinked, e.g.
void setAllowOpacity(bool allowOpacity)
Sets whether opacity modification (transparency) is permitted for the color.
void setToNoColor()
Sets color to a totally transparent color.
void activatePicker()
Activates the color picker tool, which allows for sampling a color from anywhere on the screen.
void mouseMoveEvent(QMouseEvent *e) override
Reimplemented to allow dragging colors from button.
void showEvent(QShowEvent *e) override
void setToDefaultColor()
Sets color to the button's default color, if set.
void colorClicked(const QColor &color)
Emitted when the button is clicked, if the button's behavior is set to SignalOnly.
void cleared()
Emitted when the color is cleared (set to null).
QString colorDialogTitle
void dragEnterEvent(QDragEnterEvent *e) override
Reimplemented to accept dragged colors.
void unlink()
Unlinks the button from a project color.
void setToNull()
Sets color to null.
void wheelEvent(QWheelEvent *event) override
bool isNull() const
Returns true if the current color is null.
void keyPressEvent(QKeyEvent *e) override
Reimplemented to allow canceling color pick via keypress, and sample via space bar press.
void resizeEvent(QResizeEvent *event) override
bool showNull() const
Returns whether the set to null (clear) option is shown in the button's drop-down menu.
void pasteColor()
Pastes a color from the clipboard to the color button.
void setColor(const QColor &color)
Sets the current color for the button.
void changeEvent(QEvent *e) override
A custom QGIS dialog for selecting a color.
A color ramp widget.
@ Horizontal
Horizontal ramp.
Registry of color schemes.
QList< QgsColorScheme * > schemes() const
Returns all color schemes in the registry.
@ ShowInColorButtonMenu
Show scheme in color button drop-down menu.
A color swatch grid which can be embedded into a menu.
void setBaseColor(const QColor &baseColor)
Sets the base color for the color grid.
void colorChanged(const QColor &color)
Emitted when a color has been selected from the widget.
static QString htmlDescription(QColor color, T *widget)
Returns an HTML desciption given a color with a preview image of the color.
A color wheel widget.
void setColor(const QColor &color, bool emitSignals=false) override
An action containing a color widget, which can be embedded into a menu.
void setDismissOnColorSelection(bool dismiss)
Sets whether the parent menu should be dismissed and closed when a color is selected from the action'...
void colorChanged(const QColor &color)
Emitted when a color has been selected from the widget.
static QPixmap createDragIcon(const QColor &color)
Create an icon for dragging colors.
virtual void setColor(const QColor &color, bool emitSignals=false)
Sets the color for the widget.
@ Alpha
Alpha component (opacity) of color.
A custom QGIS widget for selecting a color, including options for selecting colors via hue wheel,...
@ LayoutVertical
Use a narrower, vertically stacked layout.
void currentColorChanged(const QColor &color)
Emitted when the dialog's color changes.
void setPreviousColor(const QColor &color)
Sets the color to show in an optional "previous color" section.
void setAllowOpacity(bool allowOpacity)
Sets whether opacity modification (transparency) is permitted for the color dialog.
static QColor sampleColor(QPoint point)
Samples the color on screen at the specified global point (pixel).
Definition qgsgui.cpp:276
Base class for any widget that can be shown as a inline panel.
void openPanel(QgsPanelWidget *panel)
Open a panel or dialog depending on dock mode setting If dock mode is true this method will emit the ...
static QgsPanelWidget * findParentPanel(QWidget *widget)
Traces through the parents of a widget to find if it is contained within a QgsPanelWidget widget.
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
bool dockMode()
Returns the dock mode state.
A color scheme which contains project specific colors set through project properties dialog.
QgsNamedColorList fetchColors(const QString &context=QString(), const QColor &baseColor=QColor()) override
Gets a list of colors from the scheme.
static QgsProject * instance()
Returns the QgsProject singleton instance.
void projectColorsChanged()
Emitted whenever the project's color scheme has been changed.
static void addRecentColor(const QColor &color)
Adds a color to the list of recent colors.
This class is a composition of two QSettings instances:
Definition qgssettings.h:64
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
static QColor colorFromMimeData(const QMimeData *data, bool &hasAlpha)
Attempts to parse mime data as a color.
static QMimeData * colorToMimeData(const QColor &color)
Creates mime data from a color.
QList< QPair< QColor, QString > > QgsNamedColorList
List of colors paired with a friendly display name identifying the color.
int scaleIconSize(int standardSize)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c