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;
262 QColor opaque = color;
263 opaque.setAlphaF( 1.0 );
265 if ( opaque == mSymbol->color() )
268 mSymbol->setColor( opaque );
293 bool hasAlpha =
false;
294 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor, hasAlpha ) )
311 if ( e->button() == Qt::RightButton )
313 QToolButton::showMenu();
316 else if ( e->button() == Qt::LeftButton )
318 mDragStartPosition = e->pos();
320 QToolButton::mousePressEvent( e );
334 if ( !( e->buttons() & Qt::LeftButton ) )
337 QToolButton::mouseMoveEvent( e );
341 if ( ( e->pos() - mDragStartPosition ).manhattanLength() < QApplication::startDragDistance() )
344 QToolButton::mouseMoveEvent( e );
349 QDrag *drag =
new QDrag(
this );
352 drag->exec( Qt::CopyAction );
361 stopPicking( e->globalPos() );
366 QToolButton::mouseReleaseEvent( e );
371 if ( !mPickingColor )
374 QToolButton::keyPressEvent( e );
379 stopPicking( QCursor::pos(), e->key() == Qt::Key_Space );
386 bool hasAlpha =
false;
388 if ( colorFromMimeData( e->mimeData(), mimeColor, hasAlpha ) )
393 e->acceptProposedAction();
394 updatePreview( mimeColor );
409 bool hasAlpha =
false;
410 if ( colorFromMimeData( e->mimeData(), mimeColor, hasAlpha ) )
413 e->acceptProposedAction();
414 mimeColor.setAlphaF( 1.0 );
415 mSymbol->setColor( mimeColor );
425 if ( isEnabled() && mSymbol )
427 bool symbolChanged =
false;
428 const double increment = ( (
event->modifiers() & Qt::ControlModifier ) ? 0.1 : 1 ) *
429 (
event->angleDelta().y() > 0 ? 1 : -1 );
430 switch ( mSymbol->type() )
434 QgsMarkerSymbol *marker = qgis::down_cast<QgsMarkerSymbol *>( mSymbol.get() );
437 const double size = std::max( 0.0, marker->
size() + increment );
439 symbolChanged =
true;
446 QgsLineSymbol *line = qgis::down_cast<QgsLineSymbol *>( mSymbol.get() );
449 const double width = std::max( 0.0, line->
width() + increment );
451 symbolChanged =
true;
471 QToolButton::wheelEvent( event );
475void QgsSymbolButton::prepareMenu()
483 QAction *configureAction =
new QAction( tr(
"Configure Symbol…" ),
this );
484 mMenu->addAction( configureAction );
485 connect( configureAction, &QAction::triggered,
this, &QgsSymbolButton::showSettingsDialog );
487 QAction *copySymbolAction =
new QAction( tr(
"Copy Symbol" ),
this );
488 copySymbolAction->setEnabled( !
isNull() );
489 mMenu->addAction( copySymbolAction );
492 QAction *pasteSymbolAction =
new QAction( tr(
"Paste Symbol" ),
this );
496 if ( tempSymbol && tempSymbol->type() == mType )
503 pasteSymbolAction->setEnabled(
false );
505 mMenu->addAction( pasteSymbolAction );
510 QAction *nullAction =
new QAction( tr(
"Clear Current Symbol" ),
this );
511 nullAction->setEnabled( !
isNull() );
512 mMenu->addAction( nullAction );
518 mMenu->addSeparator();
521 colorWheel->
setColor( mSymbol->color() );
525 mMenu->addAction( colorAction );
528 QColor alphaColor = mSymbol->color();
529 alphaColor.setAlphaF( mSymbol->opacity() );
535 const double opacity = color.alphaF();
536 mSymbol->setOpacity( opacity );
542 mMenu->addAction( alphaAction );
546 QList< QgsColorScheme * >::iterator it = schemeList.begin();
547 for ( ; it != schemeList.end(); ++it )
551 mMenu->addAction( colorAction );
556 mMenu->addSeparator();
558 QAction *copyColorAction =
new QAction( tr(
"Copy Color" ),
this );
559 mMenu->addAction( copyColorAction );
562 QAction *pasteColorAction =
new QAction( tr(
"Paste Color" ),
this );
566 bool hasAlpha =
false;
567 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor, hasAlpha ) )
569 pasteColorAction->setIcon( createColorIcon( clipColor ) );
573 pasteColorAction->setEnabled(
false );
575 mMenu->addAction( pasteColorAction );
578 QAction *pickColorAction =
new QAction( tr(
"Pick Color" ),
this );
579 mMenu->addAction( pickColorAction );
580 connect( pickColorAction, &QAction::triggered,
this, &QgsSymbolButton::activatePicker );
582 QAction *chooseColorAction =
new QAction( tr(
"Choose Color…" ),
this );
583 mMenu->addAction( chooseColorAction );
584 connect( chooseColorAction, &QAction::triggered,
this, &QgsSymbolButton::showColorDialog );
588void QgsSymbolButton::addRecentColor(
const QColor &color )
593void QgsSymbolButton::activatePicker()
599 mPickingColor =
true;
600 setMouseTracking(
true );
606 if ( e->type() == QEvent::EnabledChange )
610 QToolButton::changeEvent( e );
616 QToolButton::showEvent( e );
621 QToolButton::resizeEvent( event );
627void QgsSymbolButton::updatePreview(
const QColor &color,
QgsSymbol *tempSymbol )
629 QSize currentIconSize;
633 if ( !mIconSize.isValid() )
636 QStyleOptionToolButton opt;
637 initStyleOption( &opt );
638 const QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton,
642 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
644 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
647 currentIconSize = mIconSize;
653 currentIconSize = QSize( width() - 10, height() - 6 );
655 currentIconSize = QSize( width() - 10, height() - 12 );
659 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
664 std::unique_ptr< QgsSymbol > previewSymbol;
668 previewSymbol.reset( tempSymbol->
clone() );
672 previewSymbol.reset( mSymbol->clone() );
676 setIconSize( currentIconSize );
678 setToolTip( QString( ) );
682 if ( color.isValid() )
683 previewSymbol->setColor( color );
687 setIconSize( currentIconSize );
692 const int width =
static_cast< int >(
Qgis::UI_SCALE_FACTOR * fontMetrics().horizontalAdvance(
'X' ) * 23 );
693 const int height =
static_cast< int >( width / 1.61803398875 );
697 QBuffer buffer( &data );
698 pm.save( &buffer,
"PNG", 100 );
699 setToolTip( QStringLiteral(
"<img src='data:image/png;base64, %3'>" ).arg( QString( data.toBase64() ) ) );
702bool QgsSymbolButton::colorFromMimeData(
const QMimeData *mimeData, QColor &resultColor,
bool &hasAlpha )
707 if ( mimeColor.isValid() )
709 resultColor = mimeColor;
717QPixmap QgsSymbolButton::createColorIcon(
const QColor &color )
const
722 pixmap.fill( Qt::transparent );
728 p.setBrush( QBrush( color ) );
731 p.setPen( QColor( 197, 197, 197 ) );
737void QgsSymbolButton::stopPicking( QPoint eventPos,
bool samplingColor )
742 QgsApplication::restoreOverrideCursor();
743 setMouseTracking(
false );
744 mPickingColor =
false;
746 if ( !samplingColor )
755 addRecentColor( newColor );
758void QgsSymbolButton::showColorDialog()
766 const QColor currentColor = mSymbol->color();
771 if ( currentColor.isValid() )
778 if ( newColor.isValid() )
780 setColor( newColor );
787 QgsColorDialog dialog(
this, Qt::WindowFlags(), mSymbol->color() );
788 dialog.setTitle( tr(
"Symbol Color" ) );
789 dialog.setAllowOpacity(
true );
791 if ( dialog.exec() && dialog.color().isValid() )
802 mDialogTitle = title;
812 return mSymbol.get();
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.
static QgsSymbol * defaultSymbol(QgsWkbTypes::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
virtual QgsSymbol * clone() const =0
Returns a deep copy of this symbol.
Qgis::SymbolType type() const
Returns the symbol's 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,...