QGIS API Documentation 3.41.0-Master (af5edcb665c)
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
73 } );
74}
75
77{
78 return mMinimumSize;
79}
80
82{
83 return mMinimumSize;
84}
85
87{
88 static QPixmap sTranspBkgrd;
89
90 if ( sTranspBkgrd.isNull() )
91 sTranspBkgrd = QgsApplication::getThemePixmap( QStringLiteral( "/transp-background_8x8.png" ) );
92
93 return sTranspBkgrd;
94}
95
96void QgsColorButton::showColorDialog()
97{
99 if ( panel && panel->dockMode() )
100 {
101 const QColor currentColor = color();
103 colorWidget->setPanelTitle( mColorDialogTitle );
104 colorWidget->setAllowOpacity( mAllowOpacity );
105
106 if ( currentColor.isValid() )
107 {
108 colorWidget->setPreviousColor( currentColor );
109 }
110
111 connect( colorWidget, &QgsCompoundColorWidget::currentColorChanged, this, &QgsColorButton::setValidTemporaryColor );
112 panel->openPanel( colorWidget );
113 return;
114 }
115
116 QColor newColor;
117 const QgsSettings settings;
118
119 // first check if we need to use the limited native dialogs
120 const bool useNative = settings.value( QStringLiteral( "qgis/native_color_dialogs" ), false ).toBool();
121 if ( useNative )
122 {
123 // why would anyone want this? who knows.... maybe the limited nature of native dialogs helps ease the transition for MapInfo users?
124 newColor = QColorDialog::getColor( color(), this, mColorDialogTitle, mAllowOpacity ? QColorDialog::ShowAlphaChannel : ( QColorDialog::ColorDialogOption ) 0 );
125 }
126 else
127 {
128 QgsColorDialog dialog( this, Qt::WindowFlags(), color() );
129 dialog.setTitle( mColorDialogTitle );
130 dialog.setAllowOpacity( mAllowOpacity );
131
132 if ( dialog.exec() )
133 {
134 newColor = dialog.color();
135 }
136 }
137
138 if ( newColor.isValid() )
139 {
140 setValidColor( newColor );
141 }
142
143 // reactivate button's window
144 activateWindow();
145}
146
148{
149 if ( !mDefaultColor.isValid() )
150 {
151 return;
152 }
153
154 setColor( mDefaultColor );
155}
156
158{
159 setColor( QColor() );
160 emit cleared();
161}
162
164{
165 linkToProjectColor( QString() );
166 emit unlinked();
167}
168
169bool QgsColorButton::event( QEvent *e )
170{
171 if ( e->type() == QEvent::ToolTip && isEnabled() )
172 {
173 QColor c = linkedProjectColor();
174 const bool isProjectColor = c.isValid();
175 if ( !isProjectColor )
176 c = mColor;
177
178 QString info = ( isProjectColor ? QStringLiteral( "<p>%1: %2</p>" ).arg( tr( "Linked color" ), mLinkedColorName ) : QString() );
179
180 info += QgsColorTooltip::htmlDescription( c, this );
181
182 setToolTip( info );
183 }
184 return QToolButton::event( e );
185}
186
188{
189 QColor noColor = QColor( mColor );
190 noColor.setAlpha( 0 );
191 setColor( noColor );
192}
193
195{
196 if ( mPickingColor )
197 {
198 //don't show dialog if in color picker mode
199 e->accept();
200 return;
201 }
202
203 if ( e->button() == Qt::RightButton )
204 {
205 QToolButton::showMenu();
206 return;
207 }
208 else if ( e->button() == Qt::LeftButton )
209 {
210 mDragStartPosition = e->pos();
211 }
212 QToolButton::mousePressEvent( e );
213}
214
215bool QgsColorButton::colorFromMimeData( const QMimeData *mimeData, QColor &resultColor )
216{
217 bool hasAlpha = false;
218 QColor mimeColor = QgsSymbolLayerUtils::colorFromMimeData( mimeData, hasAlpha );
219
220 if ( mimeColor.isValid() )
221 {
222 if ( !mAllowOpacity )
223 {
224 //remove alpha channel
225 mimeColor.setAlpha( 255 );
226 }
227 else if ( !hasAlpha )
228 {
229 //mime color has no explicit alpha component, so keep existing alpha
230 mimeColor.setAlpha( mColor.alpha() );
231 }
232 resultColor = mimeColor;
233 return true;
234 }
235
236 //could not get color from mime data
237 return false;
238}
239
240void QgsColorButton::mouseMoveEvent( QMouseEvent *e )
241{
242 if ( mPickingColor )
243 {
244 setButtonBackground( QgsGui::sampleColor( e->globalPos() ) );
245 e->accept();
246 return;
247 }
248
249 //handle dragging colors from button
250 QColor c = linkedProjectColor();
251 if ( !c.isValid() )
252 c = mColor;
253
254 if ( !( e->buttons() & Qt::LeftButton ) || !c.isValid() )
255 {
256 //left button not depressed or no color set, so not a drag
257 QToolButton::mouseMoveEvent( e );
258 return;
259 }
260
261 if ( ( e->pos() - mDragStartPosition ).manhattanLength() < QApplication::startDragDistance() )
262 {
263 //mouse not moved, so not a drag
264 QToolButton::mouseMoveEvent( e );
265 return;
266 }
267
268 //user is dragging color
269 QDrag *drag = new QDrag( this );
270 drag->setMimeData( QgsSymbolLayerUtils::colorToMimeData( c ) );
271 drag->setPixmap( QgsColorWidget::createDragIcon( c ) );
272 drag->exec( Qt::CopyAction );
273 setDown( false );
274}
275
277{
278 if ( mPickingColor )
279 {
280 //end color picking operation by sampling the color under cursor
281 stopPicking( e->globalPos() );
282 e->accept();
283 return;
284 }
285
286 QToolButton::mouseReleaseEvent( e );
287}
288
289void QgsColorButton::stopPicking( QPoint eventPos, bool samplingColor )
290{
291 //release mouse and keyboard, and reset cursor
292 releaseMouse();
293 releaseKeyboard();
294 QgsApplication::restoreOverrideCursor();
295 setMouseTracking( false );
296 mPickingColor = false;
297
298 if ( !samplingColor )
299 {
300 //not sampling color, restore old color
302 return;
303 }
304
305 setColor( QgsGui::sampleColor( eventPos ) );
306 addRecentColor( mColor );
307}
308
309QColor QgsColorButton::linkedProjectColor() const
310{
311 QList<QgsProjectColorScheme *> projectSchemes;
312 QgsApplication::colorSchemeRegistry()->schemes( projectSchemes );
313 if ( projectSchemes.length() > 0 )
314 {
315 QgsProjectColorScheme *scheme = projectSchemes.at( 0 );
316 const QgsNamedColorList colors = scheme->fetchColors();
317 for ( const auto &color : colors )
318 {
319 if ( color.second.isEmpty() )
320 continue;
321
322 if ( color.second == mLinkedColorName )
323 {
324 return color.first;
325 }
326 }
327 }
328 return QColor();
329}
330
332{
333 if ( !mPickingColor )
334 {
335 //if not picking a color, use default tool button behavior
336 QToolButton::keyPressEvent( e );
337 return;
338 }
339
340 //cancel picking, sampling the color if space was pressed
341 stopPicking( QCursor::pos(), e->key() == Qt::Key_Space );
342}
343
344void QgsColorButton::dragEnterEvent( QDragEnterEvent *e )
345{
346 const bool isProjectColor = linkedProjectColor().isValid();
347 if ( isProjectColor )
348 return;
349
350 //is dragged data valid color data?
351 QColor mimeColor;
352 if ( colorFromMimeData( e->mimeData(), mimeColor ) )
353 {
354 //if so, we accept the drag, and temporarily change the button's color
355 //to match the dragged color. This gives immediate feedback to the user
356 //that colors can be dropped here
357 e->acceptProposedAction();
358 setButtonBackground( mimeColor );
359 }
360}
361
362void QgsColorButton::dragLeaveEvent( QDragLeaveEvent *e )
363{
364 Q_UNUSED( e )
365 //reset button color
367}
368
369void QgsColorButton::dropEvent( QDropEvent *e )
370{
371 const bool isProjectColor = linkedProjectColor().isValid();
372 if ( isProjectColor )
373 return;
374
375 //is dropped data valid color data?
376 QColor mimeColor;
377 if ( colorFromMimeData( e->mimeData(), mimeColor ) )
378 {
379 //accept drop and set new color
380 e->acceptProposedAction();
381 setColor( mimeColor );
382 addRecentColor( mimeColor );
383 }
384}
385
386void QgsColorButton::wheelEvent( QWheelEvent *event )
387{
388 if ( mAllowOpacity && isEnabled() && !isNull() )
389 {
390 const double increment = ( ( event->modifiers() & Qt::ControlModifier ) ? 0.01 : 0.1 ) * ( event->angleDelta().y() > 0 ? 1 : -1 );
391 const double alpha = std::min( std::max( 0.0, mColor.alphaF() + increment ), 1.0 );
392 mColor.setAlphaF( alpha );
393
395 emit colorChanged( mColor );
396 event->accept();
397 }
398 else
399 {
400 QToolButton::wheelEvent( event );
401 }
402}
403
404void QgsColorButton::setValidColor( const QColor &newColor )
405{
406 if ( newColor.isValid() )
407 {
408 setColor( newColor );
409 addRecentColor( newColor );
410 }
411}
412
413void QgsColorButton::setValidTemporaryColor( const QColor &newColor )
414{
415 if ( newColor.isValid() )
416 {
417 setColor( newColor );
418 }
419}
420
421QPixmap QgsColorButton::createMenuIcon( const QColor &color, const bool showChecks )
422{
423 const int iconSize = QgsGuiUtils::scaleIconSize( 16 );
424
425 //create an icon pixmap
426 QPixmap pixmap( iconSize, iconSize );
427 pixmap.fill( Qt::transparent );
428
429 QPainter p;
430 p.begin( &pixmap );
431
432 //start with checkboard pattern
433 if ( showChecks )
434 {
435 const QBrush checkBrush = QBrush( transparentBackground() );
436 p.setPen( Qt::NoPen );
437 p.setBrush( checkBrush );
438 p.drawRect( 0, 0, iconSize - 1, iconSize - 1 );
439 }
440
441 //draw color over pattern
442 p.setBrush( QBrush( color ) );
443
444 //draw border
445 p.setPen( QColor( 197, 197, 197 ) );
446 p.drawRect( 0, 0, iconSize - 1, iconSize - 1 );
447 p.end();
448 return pixmap;
449}
450
451void QgsColorButton::buttonClicked()
452{
453 if ( linkedProjectColor().isValid() )
454 {
455 QToolButton::showMenu();
456 }
457 else
458 {
459 switch ( mBehavior )
460 {
461 case ShowDialog:
462 showColorDialog();
463 return;
464 case SignalOnly:
465 emit colorClicked( mColor );
466 return;
467 }
468 }
469}
470
471void QgsColorButton::prepareMenu()
472{
473 //we need to tear down and rebuild this menu every time it is shown. Otherwise the space allocated to any
474 //QgsColorSwatchGridAction is not recalculated by Qt and the swatch grid may not be the correct size
475 //for the number of colors shown in the grid. Note that we MUST refresh color swatch grids every time this
476 //menu is opened, otherwise color schemes like the recent color scheme grid are meaningless
477 mMenu->clear();
478
479 const bool isProjectColor = linkedProjectColor().isValid();
480
481 if ( !isProjectColor )
482 {
483 if ( mShowNull )
484 {
485 QAction *nullAction = new QAction( mNullColorString.isEmpty() ? tr( "Clear Color" ) : mNullColorString, this );
486 nullAction->setIcon( createMenuIcon( Qt::transparent, false ) );
487 mMenu->addAction( nullAction );
488 connect( nullAction, &QAction::triggered, this, &QgsColorButton::setToNull );
489 }
490
491 //show default color option if set
492 if ( mDefaultColor.isValid() )
493 {
494 QAction *defaultColorAction = new QAction( tr( "Default Color" ), this );
495 defaultColorAction->setIcon( createMenuIcon( mDefaultColor ) );
496 mMenu->addAction( defaultColorAction );
497 connect( defaultColorAction, &QAction::triggered, this, &QgsColorButton::setToDefaultColor );
498 }
499
500 if ( mShowNoColorOption )
501 {
502 QAction *noColorAction = new QAction( mNoColorString, this );
503 noColorAction->setIcon( createMenuIcon( Qt::transparent, false ) );
504 mMenu->addAction( noColorAction );
505 connect( noColorAction, &QAction::triggered, this, &QgsColorButton::setToNoColor );
506 }
507
508 mMenu->addSeparator();
509 QgsColorWheel *colorWheel = new QgsColorWheel( mMenu );
510 colorWheel->setColor( color() );
511 QgsColorWidgetAction *colorAction = new QgsColorWidgetAction( colorWheel, mMenu, mMenu );
512 colorAction->setDismissOnColorSelection( false );
513 connect( colorAction, &QgsColorWidgetAction::colorChanged, this, &QgsColorButton::setColor );
514 mMenu->addAction( colorAction );
515 if ( mAllowOpacity )
516 {
518 alphaRamp->setColor( color() );
519 QgsColorWidgetAction *alphaAction = new QgsColorWidgetAction( alphaRamp, mMenu, mMenu );
520 alphaAction->setDismissOnColorSelection( false );
521 connect( alphaAction, &QgsColorWidgetAction::colorChanged, this, &QgsColorButton::setColor );
522 connect( alphaAction, &QgsColorWidgetAction::colorChanged, colorWheel, [colorWheel]( const QColor &color ) { colorWheel->setColor( color, false ); } );
523 connect( colorAction, &QgsColorWidgetAction::colorChanged, alphaRamp, [alphaRamp]( const QColor &color ) { alphaRamp->setColor( color, false ); } );
524 mMenu->addAction( alphaAction );
525 }
526
527 if ( mColorSchemeRegistry )
528 {
529 //get schemes with ShowInColorButtonMenu flag set
530 QList<QgsColorScheme *> schemeList = mColorSchemeRegistry->schemes( QgsColorScheme::ShowInColorButtonMenu );
531 QList<QgsColorScheme *>::iterator it = schemeList.begin();
532 for ( ; it != schemeList.end(); ++it )
533 {
534 QgsColorSwatchGridAction *colorAction = new QgsColorSwatchGridAction( *it, mMenu, mContext, this );
535 colorAction->setBaseColor( mColor );
536 mMenu->addAction( colorAction );
537 connect( colorAction, &QgsColorSwatchGridAction::colorChanged, this, &QgsColorButton::setValidColor );
538 connect( colorAction, &QgsColorSwatchGridAction::colorChanged, this, &QgsColorButton::addRecentColor );
539 }
540 }
541
542 mMenu->addSeparator();
543 }
544
545 if ( isProjectColor )
546 {
547 QAction *unlinkAction = new QAction( tr( "Unlink Color" ), mMenu );
548 mMenu->addAction( unlinkAction );
549 connect( unlinkAction, &QAction::triggered, this, &QgsColorButton::unlink );
550 }
551
552 QAction *copyColorAction = new QAction( tr( "Copy Color" ), this );
553 mMenu->addAction( copyColorAction );
554 connect( copyColorAction, &QAction::triggered, this, &QgsColorButton::copyColor );
555
556 if ( !isProjectColor )
557 {
558 QAction *pasteColorAction = new QAction( tr( "Paste Color" ), this );
559 //enable or disable paste action based on current clipboard contents. We always show the paste
560 //action, even if it's disabled, to give hint to the user that pasting colors is possible
561 QColor clipColor;
562 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor ) )
563 {
564 pasteColorAction->setIcon( createMenuIcon( clipColor ) );
565 }
566 else
567 {
568 pasteColorAction->setEnabled( false );
569 }
570 mMenu->addAction( pasteColorAction );
571 connect( pasteColorAction, &QAction::triggered, this, &QgsColorButton::pasteColor );
572
573 QAction *pickColorAction = new QAction( tr( "Pick Color" ), this );
574 mMenu->addAction( pickColorAction );
575 connect( pickColorAction, &QAction::triggered, this, &QgsColorButton::activatePicker );
576
577 QAction *chooseColorAction = new QAction( tr( "Choose Color…" ), this );
578 mMenu->addAction( chooseColorAction );
579 connect( chooseColorAction, &QAction::triggered, this, &QgsColorButton::showColorDialog );
580 }
581}
582
584{
585 if ( e->type() == QEvent::EnabledChange )
586 {
588 }
589 QToolButton::changeEvent( e );
590}
591
592#if 0 // causes too many cyclical updates, but may be needed on some platforms
593void QgsColorButton::paintEvent( QPaintEvent *e )
594{
595 QToolButton::paintEvent( e );
596
597 if ( !mBackgroundSet )
598 {
600 }
601}
602#endif
603
604void QgsColorButton::showEvent( QShowEvent *e )
605{
607 QToolButton::showEvent( e );
608}
609
610void QgsColorButton::resizeEvent( QResizeEvent *event )
611{
612 QToolButton::resizeEvent( event );
613 //recalculate icon size and redraw icon
614 mIconSize = QSize();
616}
617
618void QgsColorButton::setColor( const QColor &color )
619{
620 const QColor oldColor = mColor;
621 mColor = color;
622
623 // handle when initially set color is same as default (Qt::black); consider it a color change
624 if ( oldColor != mColor || ( mColor == QColor( Qt::black ) && !mColorSet ) )
625 {
627 if ( isEnabled() )
628 {
629 // TODO: May be beneficial to have the option to set color without emitting this signal.
630 // Now done by blockSignals( bool ) where button is used
631 emit colorChanged( mColor );
632 }
633 }
634 mColorSet = true;
635}
636
637void QgsColorButton::addRecentColor( const QColor &color )
638{
640}
641
642void QgsColorButton::setButtonBackground( const QColor &color )
643{
644 QColor backgroundColor = color;
645 bool isProjectColor = false;
646 if ( !backgroundColor.isValid() && !mLinkedColorName.isEmpty() )
647 {
648 backgroundColor = linkedProjectColor();
649 isProjectColor = backgroundColor.isValid();
650 if ( !isProjectColor )
651 {
652 mLinkedColorName.clear(); //color has been deleted, renamed, etc...
653 emit unlinked();
654 }
655 }
656 if ( !backgroundColor.isValid() )
657 {
658 backgroundColor = mColor;
659 }
660
661 QSize currentIconSize;
662 //icon size is button size with a small margin
663 if ( menu() )
664 {
665 if ( !mIconSize.isValid() )
666 {
667 //calculate size of push button part of widget (ie, without the menu drop-down button part)
668 QStyleOptionToolButton opt;
669 initStyleOption( &opt );
670 const QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton, this );
671 //make sure height of icon looks good under different platforms
672#ifdef Q_OS_WIN
673 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
674#else
675 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
676#endif
677 }
678 currentIconSize = mIconSize;
679 }
680 else
681 {
682 //no menu
683#ifdef Q_OS_WIN
684 currentIconSize = QSize( width() - 10, height() - 6 );
685#else
686 currentIconSize = QSize( width() - 10, height() - 12 );
687#endif
688 }
689
690 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
691 {
692 return;
693 }
694
695 //create an icon pixmap
696 const double pixelRatio = devicePixelRatioF();
697 QPixmap pixmap( currentIconSize * pixelRatio );
698 pixmap.setDevicePixelRatio( pixelRatio );
699 pixmap.fill( Qt::transparent );
700
701 if ( backgroundColor.isValid() )
702 {
703 const QRectF rect( 0, 0, currentIconSize.width(), currentIconSize.height() );
704 QPainter p;
705 p.begin( &pixmap );
706 p.setRenderHint( QPainter::Antialiasing );
707 p.setPen( Qt::NoPen );
708 if ( mAllowOpacity && backgroundColor.alpha() < 255 )
709 {
710 //start with checkboard pattern
711 const QBrush checkBrush = QBrush( transparentBackground() );
712 p.setBrush( checkBrush );
713 p.drawRoundedRect( rect, 3, 3 );
714
715 //draw semi-transparent color on top
716 p.setBrush( backgroundColor );
717 p.drawRoundedRect( rect, 3, 3 );
718
719 //draw fully opaque color on the left side
720 const QRectF clipRect( 0, 0, static_cast<qreal>( currentIconSize.width() ) / 2.0, currentIconSize.height() );
721 p.setClipRect( clipRect );
722 backgroundColor.setAlpha( 255 );
723 p.setBrush( backgroundColor );
724 p.drawRoundedRect( rect, 3, 3 );
725 }
726 else
727 {
728 p.setBrush( backgroundColor );
729 p.drawRoundedRect( rect, 3, 3 );
730 }
731 p.end();
732 }
733
734 setIconSize( currentIconSize );
735 setIcon( pixmap );
736}
737
739{
740 //copy color
741 QColor c = linkedProjectColor();
742 if ( !c.isValid() )
743 c = mColor;
744 QApplication::clipboard()->setMimeData( QgsSymbolLayerUtils::colorToMimeData( c ) );
745}
746
748{
749 QColor clipColor;
750 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor ) )
751 {
752 //paste color
753 setColor( clipColor );
754 addRecentColor( clipColor );
755 }
756}
757
759{
760 //activate picker color
761 // Store current color
762 mCurrentColor = mColor;
763 QApplication::setOverrideCursor( QgsApplication::getThemeCursor( QgsApplication::Cursor::Sampler ) );
764 grabMouse();
765 grabKeyboard();
766 mPickingColor = true;
767 setMouseTracking( true );
768}
769
771{
772 QColor c = linkedProjectColor();
773 if ( !c.isValid() )
774 c = mColor;
775 return c;
776}
777
778void QgsColorButton::setAllowOpacity( const bool allow )
779{
780 mAllowOpacity = allow;
781}
782
783void QgsColorButton::setColorDialogTitle( const QString &title )
784{
785 mColorDialogTitle = title;
786}
787
789{
790 return mColorDialogTitle;
791}
792
793void QgsColorButton::setShowMenu( const bool showMenu )
794{
795 mShowMenu = showMenu;
796 setMenu( showMenu ? mMenu : nullptr );
797 setPopupMode( showMenu ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup );
798 //force recalculation of icon size
799 mIconSize = QSize();
801}
802
804{
805 mBehavior = behavior;
806}
807
808void QgsColorButton::setDefaultColor( const QColor &color )
809{
810 mDefaultColor = color;
811}
812
813void QgsColorButton::setShowNull( bool showNull, const QString &nullString )
814{
815 mShowNull = showNull;
816 mNullColorString = nullString;
817}
818
820{
821 return mShowNull;
822}
823
825{
826 return !mColor.isValid();
827}
828
829void QgsColorButton::linkToProjectColor( const QString &name )
830{
831 mLinkedColorName = name;
833}
static const double UI_SCALE_FACTOR
UI scaling factor.
Definition qgis.h:5775
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:277
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