42 : QToolButton( parent )
43 , mDialogTitle( dialogTitle.isEmpty() ? tr(
"Symbol Settings" ) : dialogTitle )
47 setAcceptDrops(
true );
48 connect(
this, &QAbstractButton::clicked,
this, &QgsSymbolButton::showSettingsDialog );
51 mMenu =
new QMenu(
this );
52 connect( mMenu, &QMenu::aboutToShow,
this, &QgsSymbolButton::prepareMenu );
54 setPopupMode( QToolButton::MenuButtonPopup );
59void QgsSymbolButton::updateSizeHint()
62 const QSize size = QToolButton::minimumSizeHint();
69 mSizeHint = QSize( size.width(), std::max( size.height(), fontHeight * 3 ) );
70 setMaximumWidth( mSizeHint.height() * 1.5 );
71 setMinimumWidth( maximumWidth() );
75 mSizeHint = QSize( size.width(), fontHeight );
76 setMaximumWidth( 999999 );
77 mSizeHint.setWidth( QToolButton::sizeHint().width() );
84 mSizeHint = QSize( size.width(), std::max( size.height(), fontHeight ) );
88 setMinimumHeight( mSizeHint.height( ) );
132void QgsSymbolButton::showSettingsDialog()
135 if ( mExpressionContextGenerator )
142 std::unique_ptr< QgsSymbol > newSymbol;
145 newSymbol.reset( mSymbol->clone() );
182 dialog.setWindowTitle( mDialogTitle );
183 dialog.setContext( symbolContext );
231 mExpressionContextGenerator = generator;
236 mDefaultSymbol.reset(
symbol );
241 return mDefaultSymbol.get();
257 QColor opaque = color;
258 opaque.setAlphaF( 1.0 );
260 if ( opaque == mSymbol->color() )
263 mSymbol->setColor( opaque );
288 bool hasAlpha =
false;
289 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor, hasAlpha ) )
306 if ( e->button() == Qt::RightButton )
308 QToolButton::showMenu();
311 else if ( e->button() == Qt::LeftButton )
313 mDragStartPosition = e->pos();
315 QToolButton::mousePressEvent( e );
329 if ( !( e->buttons() & Qt::LeftButton ) )
332 QToolButton::mouseMoveEvent( e );
336 if ( ( e->pos() - mDragStartPosition ).manhattanLength() < QApplication::startDragDistance() )
339 QToolButton::mouseMoveEvent( e );
344 QDrag *drag =
new QDrag(
this );
347 drag->exec( Qt::CopyAction );
356 stopPicking( e->globalPos() );
361 QToolButton::mouseReleaseEvent( e );
366 if ( !mPickingColor )
369 QToolButton::keyPressEvent( e );
374 stopPicking( QCursor::pos(), e->key() == Qt::Key_Space );
381 bool hasAlpha =
false;
383 if ( colorFromMimeData( e->mimeData(), mimeColor, hasAlpha ) )
388 e->acceptProposedAction();
389 updatePreview( mimeColor );
404 bool hasAlpha =
false;
405 if ( colorFromMimeData( e->mimeData(), mimeColor, hasAlpha ) )
408 e->acceptProposedAction();
409 mimeColor.setAlphaF( 1.0 );
410 mSymbol->setColor( mimeColor );
420 if ( isEnabled() && mSymbol )
422 bool symbolChanged =
false;
423 const double increment = ( (
event->modifiers() & Qt::ControlModifier ) ? 0.1 : 1 ) *
424 ( event->angleDelta().y() > 0 ? 1 : -1 );
425 switch ( mSymbol->type() )
429 QgsMarkerSymbol *marker = qgis::down_cast<QgsMarkerSymbol *>( mSymbol.get() );
432 const double size = std::max( 0.0, marker->
size() + increment );
434 symbolChanged =
true;
441 QgsLineSymbol *line = qgis::down_cast<QgsLineSymbol *>( mSymbol.get() );
444 const double width = std::max( 0.0, line->
width() + increment );
446 symbolChanged =
true;
466 QToolButton::wheelEvent( event );
470void QgsSymbolButton::prepareMenu()
478 QAction *configureAction =
new QAction( tr(
"Configure Symbol…" ),
this );
479 mMenu->addAction( configureAction );
480 connect( configureAction, &QAction::triggered,
this, &QgsSymbolButton::showSettingsDialog );
482 QAction *copySymbolAction =
new QAction( tr(
"Copy Symbol" ),
this );
483 copySymbolAction->setEnabled( !
isNull() );
484 mMenu->addAction( copySymbolAction );
489 QAction *pasteSymbolAction =
new QAction( tr(
"Paste Symbol" ),
this );
493 if ( tempSymbol && tempSymbol->type() == mType )
499 pasteSymbolAction->setEnabled(
false );
501 mMenu->addAction( pasteSymbolAction );
506 QAction *nullAction =
new QAction( tr(
"Clear Current Symbol" ),
this );
507 nullAction->setEnabled( !
isNull() );
508 mMenu->addAction( nullAction );
513 if ( mDefaultSymbol )
515 QAction *defaultSymbolAction =
new QAction( tr(
"Default Symbol" ),
this );
517 mMenu->addAction( defaultSymbolAction );
523 mMenu->addSeparator();
526 colorWheel->
setColor( mSymbol->color() );
530 mMenu->addAction( colorAction );
533 QColor alphaColor = mSymbol->color();
534 alphaColor.setAlphaF( mSymbol->opacity() );
540 const double opacity = color.alphaF();
541 mSymbol->setOpacity( opacity );
547 mMenu->addAction( alphaAction );
551 QList< QgsColorScheme * >::iterator it = schemeList.begin();
552 for ( ; it != schemeList.end(); ++it )
556 mMenu->addAction( colorAction );
561 mMenu->addSeparator();
563 QAction *copyColorAction =
new QAction( tr(
"Copy Color" ),
this );
564 mMenu->addAction( copyColorAction );
567 QAction *pasteColorAction =
new QAction( tr(
"Paste Color" ),
this );
571 bool hasAlpha =
false;
572 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor, hasAlpha ) )
574 pasteColorAction->setIcon( createColorIcon( clipColor ) );
578 pasteColorAction->setEnabled(
false );
580 mMenu->addAction( pasteColorAction );
583 QAction *pickColorAction =
new QAction( tr(
"Pick Color" ),
this );
584 mMenu->addAction( pickColorAction );
585 connect( pickColorAction, &QAction::triggered,
this, &QgsSymbolButton::activatePicker );
587 QAction *chooseColorAction =
new QAction( tr(
"Choose Color…" ),
this );
588 mMenu->addAction( chooseColorAction );
589 connect( chooseColorAction, &QAction::triggered,
this, &QgsSymbolButton::showColorDialog );
593void QgsSymbolButton::addRecentColor(
const QColor &color )
598void QgsSymbolButton::activatePicker()
604 mPickingColor =
true;
605 setMouseTracking(
true );
611 if ( e->type() == QEvent::EnabledChange )
615 QToolButton::changeEvent( e );
621 QToolButton::showEvent( e );
626 QToolButton::resizeEvent( event );
632void QgsSymbolButton::updatePreview(
const QColor &color,
QgsSymbol *tempSymbol )
634 QSize currentIconSize;
638 if ( !mIconSize.isValid() )
641 QStyleOptionToolButton opt;
642 initStyleOption( &opt );
643 const QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton,
647 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
649 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
652 currentIconSize = mIconSize;
658 currentIconSize = QSize( width() - 10, height() - 6 );
660 currentIconSize = QSize( width() - 10, height() - 12 );
664 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
669 std::unique_ptr< QgsSymbol > previewSymbol;
673 previewSymbol.reset( tempSymbol->
clone() );
677 previewSymbol.reset( mSymbol->clone() );
681 setIconSize( currentIconSize );
683 setToolTip( QString( ) );
687 if ( color.isValid() )
688 previewSymbol->setColor( color );
692 setIconSize( currentIconSize );
697 const int width =
static_cast< int >(
Qgis::UI_SCALE_FACTOR * fontMetrics().horizontalAdvance(
'X' ) * 23 );
698 const int height =
static_cast< int >( width / 1.61803398875 );
702 QBuffer buffer( &data );
703 pm.save( &buffer,
"PNG", 100 );
704 setToolTip( QStringLiteral(
"<img src='data:image/png;base64, %3' width=\"%4\">" ).arg( QString( data.toBase64() ) ).arg( width ) );
707bool QgsSymbolButton::colorFromMimeData(
const QMimeData *mimeData, QColor &resultColor,
bool &hasAlpha )
712 if ( mimeColor.isValid() )
714 resultColor = mimeColor;
722QPixmap QgsSymbolButton::createColorIcon(
const QColor &color )
const
726 QPixmap pixmap( iconSize, iconSize );
727 pixmap.fill( Qt::transparent );
733 p.setBrush( QBrush( color ) );
736 p.setPen( QColor( 197, 197, 197 ) );
737 p.drawRect( 0, 0, iconSize - 1, iconSize - 1 );
742void QgsSymbolButton::stopPicking( QPoint eventPos,
bool samplingColor )
747 QgsApplication::restoreOverrideCursor();
748 setMouseTracking(
false );
749 mPickingColor =
false;
751 if ( !samplingColor )
760 addRecentColor( newColor );
763void QgsSymbolButton::showColorDialog()
771 const QColor currentColor = mSymbol->color();
776 if ( currentColor.isValid() )
783 if ( newColor.isValid() )
785 setColor( newColor );
792 QgsColorDialog dialog(
this, Qt::WindowFlags(), mSymbol->color() );
793 dialog.setTitle( tr(
"Symbol Color" ) );
794 dialog.setAllowOpacity(
true );
796 if ( dialog.exec() && dialog.color().isValid() )
807 mDialogTitle = title;
817 return mSymbol.get();
842 if ( !mDefaultSymbol )
static const double UI_SCALE_FACTOR
UI scaling factor.
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.
A custom QGIS dialog for selecting a color.
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.
void setColor(const QColor &color, bool emitSignals=false) override
Abstract interface for generating an expression context.
virtual QgsExpressionContext createExpressionContext() const =0
This method needs to be reimplemented in all classes which implement this interface and return an exp...
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScopes(const QList< QgsExpressionContextScope * > &scopes)
Appends a list of scopes to the end of the context.
static QgsFillSymbol * createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
static QColor sampleColor(QPoint point)
Samples the color on screen at the specified global point (pixel).
A line symbol type, for rendering LineString and MultiLineString geometries.
void setWidth(double width) const
Sets the width for the whole line symbol.
double width() const
Returns the estimated width for the whole symbol, which is the maximum width of all marker symbol lay...
static QgsLineSymbol * createSimple(const QVariantMap &properties)
Create a line symbol with one symbol layer: SimpleLine with specified properties.
Map canvas is a class for displaying all GIS data types on a canvas.
A marker symbol type, for rendering Point and MultiPoint geometries.
void setSize(double size) const
Sets the size for the whole symbol.
static QgsMarkerSymbol * createSimple(const QVariantMap &properties)
Create a marker symbol with one symbol layer: SimpleMarker with specified properties.
double size() const
Returns the estimated size for the whole symbol, which is the maximum size of all marker symbol layer...
A bar for displaying non-blocking messages to the user.
static void addRecentColor(const QColor &color)
Adds a color to the list of recent colors.
Stores properties relating to a screen.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
static QgsSymbol * symbolFromMimeData(const QMimeData *data)
Attempts to parse mime data as a symbol.
static QPixmap symbolPreviewPixmap(const QgsSymbol *symbol, QSize size, int padding=0, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *shape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for a color ramp.
static QMimeData * symbolToMimeData(const QgsSymbol *symbol)
Creates new mime data from a symbol.
static QColor colorFromMimeData(const QMimeData *data, bool &hasAlpha)
Attempts to parse mime data as a color.
static QIcon symbolPreviewIcon(const QgsSymbol *symbol, QSize size, int padding=0, QgsLegendPatchShape *shape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Returns an icon preview for a color ramp.
static QMimeData * colorToMimeData(const QColor &color)
Creates mime data from a color.
A dialog that can be used to select and build a symbol.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the widget.
void setMessageBar(QgsMessageBar *bar)
Sets the message bar associated with the widget.
void setExpressionContext(QgsExpressionContext *context)
Sets the optional expression context used for the widget.
Abstract base class for all rendered symbols.
virtual QgsSymbol * clone() const =0
Returns a deep copy of this symbol.
Qgis::SymbolType type() const
Returns the symbol's type.
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
Represents a vector layer which manages a vector based data sets.
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,...