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 )
145 newSymbol = mSymbol->clone();
183 dialog.setWindowTitle( mDialogTitle );
184 dialog.setContext( symbolContext );
199void QgsSymbolButton::updateSymbolFromWidget()
205void QgsSymbolButton::cleanUpSymbolSelector(
QgsPanelWidget *container )
246 mExpressionContextGenerator = generator;
251 mDefaultSymbol.reset(
symbol );
256 return mDefaultSymbol.get();
272 QColor opaque = color;
273 opaque.setAlphaF( 1.0 );
275 if ( opaque == mSymbol->color() )
278 mSymbol->setColor( opaque );
303 bool hasAlpha =
false;
304 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor, hasAlpha ) )
321 if ( e->button() == Qt::RightButton )
323 QToolButton::showMenu();
326 else if ( e->button() == Qt::LeftButton )
328 mDragStartPosition = e->pos();
330 QToolButton::mousePressEvent( e );
344 if ( !( e->buttons() & Qt::LeftButton ) )
347 QToolButton::mouseMoveEvent( e );
351 if ( ( e->pos() - mDragStartPosition ).manhattanLength() < QApplication::startDragDistance() )
354 QToolButton::mouseMoveEvent( e );
359 QDrag *drag =
new QDrag(
this );
362 drag->exec( Qt::CopyAction );
371 stopPicking( e->globalPos() );
376 QToolButton::mouseReleaseEvent( e );
381 if ( !mPickingColor )
384 QToolButton::keyPressEvent( e );
389 stopPicking( QCursor::pos(), e->key() == Qt::Key_Space );
396 bool hasAlpha =
false;
398 if ( colorFromMimeData( e->mimeData(), mimeColor, hasAlpha ) )
403 e->acceptProposedAction();
404 updatePreview( mimeColor );
419 bool hasAlpha =
false;
420 if ( colorFromMimeData( e->mimeData(), mimeColor, hasAlpha ) )
423 e->acceptProposedAction();
424 mimeColor.setAlphaF( 1.0 );
425 mSymbol->setColor( mimeColor );
435 if ( isEnabled() && mSymbol )
437 bool symbolChanged =
false;
438 const double increment = ( (
event->modifiers() & Qt::ControlModifier ) ? 0.1 : 1 ) *
439 (
event->angleDelta().y() > 0 ? 1 : -1 );
440 switch ( mSymbol->type() )
444 QgsMarkerSymbol *marker = qgis::down_cast<QgsMarkerSymbol *>( mSymbol.get() );
447 const double size = std::max( 0.0, marker->
size() + increment );
449 symbolChanged =
true;
456 QgsLineSymbol *line = qgis::down_cast<QgsLineSymbol *>( mSymbol.get() );
459 const double width = std::max( 0.0, line->
width() + increment );
461 symbolChanged =
true;
481 QToolButton::wheelEvent( event );
485void QgsSymbolButton::prepareMenu()
493 QAction *configureAction =
new QAction( tr(
"Configure Symbol…" ),
this );
494 mMenu->addAction( configureAction );
495 connect( configureAction, &QAction::triggered,
this, &QgsSymbolButton::showSettingsDialog );
497 QAction *copySymbolAction =
new QAction( tr(
"Copy Symbol" ),
this );
498 copySymbolAction->setEnabled( !
isNull() );
499 mMenu->addAction( copySymbolAction );
504 QAction *pasteSymbolAction =
new QAction( tr(
"Paste Symbol" ),
this );
508 if ( tempSymbol && tempSymbol->type() == mType )
514 pasteSymbolAction->setEnabled(
false );
516 mMenu->addAction( pasteSymbolAction );
521 QAction *nullAction =
new QAction( tr(
"Clear Current Symbol" ),
this );
522 nullAction->setEnabled( !
isNull() );
523 mMenu->addAction( nullAction );
528 if ( mDefaultSymbol )
530 QAction *defaultSymbolAction =
new QAction( tr(
"Default Symbol" ),
this );
532 mMenu->addAction( defaultSymbolAction );
538 mMenu->addSeparator();
541 colorWheel->
setColor( mSymbol->color() );
545 mMenu->addAction( colorAction );
548 QColor alphaColor = mSymbol->color();
549 alphaColor.setAlphaF( mSymbol->opacity() );
555 const double opacity = color.alphaF();
556 mSymbol->setOpacity( opacity );
562 mMenu->addAction( alphaAction );
566 QList< QgsColorScheme * >::iterator it = schemeList.begin();
567 for ( ; it != schemeList.end(); ++it )
571 mMenu->addAction( colorAction );
576 mMenu->addSeparator();
578 QAction *copyColorAction =
new QAction( tr(
"Copy Color" ),
this );
579 mMenu->addAction( copyColorAction );
582 QAction *pasteColorAction =
new QAction( tr(
"Paste Color" ),
this );
586 bool hasAlpha =
false;
587 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor, hasAlpha ) )
589 pasteColorAction->setIcon( createColorIcon( clipColor ) );
593 pasteColorAction->setEnabled(
false );
595 mMenu->addAction( pasteColorAction );
598 QAction *pickColorAction =
new QAction( tr(
"Pick Color" ),
this );
599 mMenu->addAction( pickColorAction );
600 connect( pickColorAction, &QAction::triggered,
this, &QgsSymbolButton::activatePicker );
602 QAction *chooseColorAction =
new QAction( tr(
"Choose Color…" ),
this );
603 mMenu->addAction( chooseColorAction );
604 connect( chooseColorAction, &QAction::triggered,
this, &QgsSymbolButton::showColorDialog );
608void QgsSymbolButton::addRecentColor(
const QColor &color )
613void QgsSymbolButton::activatePicker()
619 mPickingColor =
true;
620 setMouseTracking(
true );
626 if ( e->type() == QEvent::EnabledChange )
630 QToolButton::changeEvent( e );
636 QToolButton::showEvent( e );
641 QToolButton::resizeEvent( event );
647void QgsSymbolButton::updatePreview(
const QColor &color,
QgsSymbol *tempSymbol )
649 QSize currentIconSize;
653 if ( !mIconSize.isValid() )
656 QStyleOptionToolButton opt;
657 initStyleOption( &opt );
658 const QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton,
662 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
664 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
667 currentIconSize = mIconSize;
673 currentIconSize = QSize( width() - 10, height() - 6 );
675 currentIconSize = QSize( width() - 10, height() - 12 );
679 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
684 std::unique_ptr< QgsSymbol > previewSymbol;
688 previewSymbol.reset( tempSymbol->
clone() );
692 previewSymbol.reset( mSymbol->clone() );
696 setIconSize( currentIconSize );
698 setToolTip( QString( ) );
702 if ( color.isValid() )
703 previewSymbol->setColor( color );
707 setIconSize( currentIconSize );
712 const int width =
static_cast< int >(
Qgis::UI_SCALE_FACTOR * fontMetrics().horizontalAdvance(
'X' ) * 23 );
713 const int height =
static_cast< int >( width / 1.61803398875 );
717 QBuffer buffer( &data );
718 pm.save( &buffer,
"PNG", 100 );
719 setToolTip( QStringLiteral(
"<img src='data:image/png;base64, %3'>" ).arg( QString( data.toBase64() ) ) );
722bool QgsSymbolButton::colorFromMimeData(
const QMimeData *mimeData, QColor &resultColor,
bool &hasAlpha )
727 if ( mimeColor.isValid() )
729 resultColor = mimeColor;
737QPixmap QgsSymbolButton::createColorIcon(
const QColor &color )
const
742 pixmap.fill( Qt::transparent );
748 p.setBrush( QBrush( color ) );
751 p.setPen( QColor( 197, 197, 197 ) );
757void QgsSymbolButton::stopPicking( QPoint eventPos,
bool samplingColor )
762 QgsApplication::restoreOverrideCursor();
763 setMouseTracking(
false );
764 mPickingColor =
false;
766 if ( !samplingColor )
775 addRecentColor( newColor );
778void QgsSymbolButton::showColorDialog()
786 const QColor currentColor = mSymbol->color();
791 if ( currentColor.isValid() )
798 if ( newColor.isValid() )
800 setColor( newColor );
807 QgsColorDialog dialog(
this, Qt::WindowFlags(), mSymbol->color() );
808 dialog.setTitle( tr(
"Symbol Color" ) );
809 dialog.setAllowOpacity(
true );
811 if ( dialog.exec() && dialog.color().isValid() )
822 mDialogTitle = title;
832 return mSymbol.get();
857 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.
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.
static QgsStyle * defaultStyle()
Returns 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)
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)
Returns an icon preview for a color ramp.
static QMimeData * colorToMimeData(const QColor &color)
Creates mime data from a color.
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,...