39 : QToolButton( parent )
40 , mDialogTitle( dialogTitle.isEmpty() ? tr(
"Symbol Settings" ) : dialogTitle )
44 setAcceptDrops(
true );
45 connect(
this, &QAbstractButton::clicked,
this, &QgsSymbolButton::showSettingsDialog );
48 mMenu =
new QMenu(
this );
49 connect( mMenu, &QMenu::aboutToShow,
this, &QgsSymbolButton::prepareMenu );
51 setPopupMode( QToolButton::MenuButtonPopup );
54 QSize size = QToolButton::minimumSizeHint();
56 mSizeHint = QSize( size.width(), std::max( size.height(), fontHeight ) );
96 void QgsSymbolButton::showSettingsDialog()
99 if ( mExpressionContextGenerator )
125 dialog.setWindowTitle( mDialogTitle );
126 dialog.setContext( symbolContext );
141 void QgsSymbolButton::updateSymbolFromWidget()
147 void QgsSymbolButton::cleanUpSymbolSelector(
QgsPanelWidget *container )
188 mExpressionContextGenerator = generator;
200 QColor opaque = color;
201 opaque.setAlphaF( 1.0 );
203 if ( opaque == mSymbol->color() )
206 mSymbol->setColor( opaque );
231 bool hasAlpha =
false;
232 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor, hasAlpha ) )
249 if ( e->button() == Qt::RightButton )
251 QToolButton::showMenu();
254 else if ( e->button() == Qt::LeftButton )
256 mDragStartPosition = e->pos();
258 QToolButton::mousePressEvent( e );
272 if ( !( e->buttons() & Qt::LeftButton ) )
275 QToolButton::mouseMoveEvent( e );
279 if ( ( e->pos() - mDragStartPosition ).manhattanLength() < QApplication::startDragDistance() )
282 QToolButton::mouseMoveEvent( e );
287 QDrag *drag =
new QDrag(
this );
290 drag->exec( Qt::CopyAction );
299 stopPicking( e->globalPos() );
304 QToolButton::mouseReleaseEvent( e );
309 if ( !mPickingColor )
312 QToolButton::keyPressEvent( e );
317 stopPicking( QCursor::pos(), e->key() == Qt::Key_Space );
324 bool hasAlpha =
false;
326 if ( colorFromMimeData( e->mimeData(), mimeColor, hasAlpha ) )
331 e->acceptProposedAction();
332 updatePreview( mimeColor );
347 bool hasAlpha =
false;
348 if ( colorFromMimeData( e->mimeData(), mimeColor, hasAlpha ) )
351 e->acceptProposedAction();
352 mimeColor.setAlphaF( 1.0 );
353 mSymbol->setColor( mimeColor );
361 void QgsSymbolButton::prepareMenu()
369 QAction *configureAction =
new QAction( tr(
"Configure Symbol…" ),
this );
370 mMenu->addAction( configureAction );
371 connect( configureAction, &QAction::triggered,
this, &QgsSymbolButton::showSettingsDialog );
373 QAction *copySymbolAction =
new QAction( tr(
"Copy Symbol" ),
this );
374 mMenu->addAction( copySymbolAction );
376 QAction *pasteSymbolAction =
new QAction( tr(
"Paste Symbol" ),
this );
380 if ( tempSymbol && tempSymbol->type() == mType )
387 pasteSymbolAction->setEnabled(
false );
389 mMenu->addAction( pasteSymbolAction );
392 mMenu->addSeparator();
395 colorWheel->
setColor( mSymbol->color() );
399 mMenu->addAction( colorAction );
402 QColor alphaColor = mSymbol->color();
403 alphaColor.setAlphaF( mSymbol->opacity() );
409 double opacity = color.alphaF();
410 mSymbol->setOpacity( opacity );
416 mMenu->addAction( alphaAction );
420 QList< QgsColorScheme * >::iterator it = schemeList.begin();
421 for ( ; it != schemeList.end(); ++it )
425 mMenu->addAction( colorAction );
430 mMenu->addSeparator();
432 QAction *copyColorAction =
new QAction( tr(
"Copy Color" ),
this );
433 mMenu->addAction( copyColorAction );
436 QAction *pasteColorAction =
new QAction( tr(
"Paste Color" ),
this );
440 bool hasAlpha =
false;
441 if ( colorFromMimeData( QApplication::clipboard()->mimeData(), clipColor, hasAlpha ) )
443 pasteColorAction->setIcon( createColorIcon( clipColor ) );
447 pasteColorAction->setEnabled(
false );
449 mMenu->addAction( pasteColorAction );
452 QAction *pickColorAction =
new QAction( tr(
"Pick Color" ),
this );
453 mMenu->addAction( pickColorAction );
454 connect( pickColorAction, &QAction::triggered,
this, &QgsSymbolButton::activatePicker );
456 QAction *chooseColorAction =
new QAction( tr(
"Choose Color…" ),
this );
457 mMenu->addAction( chooseColorAction );
458 connect( chooseColorAction, &QAction::triggered,
this, &QgsSymbolButton::showColorDialog );
461 void QgsSymbolButton::addRecentColor(
const QColor &color )
466 void QgsSymbolButton::activatePicker()
472 mPickingColor =
true;
473 setMouseTracking(
true );
479 if ( e->type() == QEvent::EnabledChange )
483 QToolButton::changeEvent( e );
489 QToolButton::showEvent( e );
494 QToolButton::resizeEvent( event );
500 void QgsSymbolButton::updatePreview(
const QColor &color,
QgsSymbol *tempSymbol )
502 std::unique_ptr< QgsSymbol > previewSymbol;
505 previewSymbol.reset( tempSymbol->
clone() );
507 previewSymbol.reset( mSymbol->clone() );
509 if ( color.isValid() )
510 previewSymbol->setColor( color );
512 QSize currentIconSize;
516 if ( !mIconSize.isValid() )
519 QStyleOptionToolButton opt;
520 initStyleOption( &opt );
521 QRect buttonSize = QApplication::style()->subControlRect( QStyle::CC_ToolButton, &opt, QStyle::SC_ToolButton,
525 mIconSize = QSize( buttonSize.width() - 10, height() - 6 );
527 mIconSize = QSize( buttonSize.width() - 10, height() - 12 );
530 currentIconSize = mIconSize;
536 currentIconSize = QSize( width() - 10, height() - 6 );
538 currentIconSize = QSize( width() - 10, height() - 12 );
542 if ( !currentIconSize.isValid() || currentIconSize.width() <= 0 || currentIconSize.height() <= 0 )
549 setIconSize( currentIconSize );
555 #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
558 int width =
static_cast< int >(
Qgis::UI_SCALE_FACTOR * fontMetrics().horizontalAdvance(
'X' ) * 23 );
560 int height =
static_cast< int >( width / 1.61803398875 );
564 QBuffer buffer( &data );
565 pm.save( &buffer,
"PNG", 100 );
566 setToolTip( QStringLiteral(
"<img src='data:image/png;base64, %3'>" ).arg( QString( data.toBase64() ) ) );
569 bool QgsSymbolButton::colorFromMimeData(
const QMimeData *mimeData, QColor &resultColor,
bool &hasAlpha )
574 if ( mimeColor.isValid() )
576 resultColor = mimeColor;
584 QPixmap QgsSymbolButton::createColorIcon(
const QColor &color )
const
589 pixmap.fill( Qt::transparent );
595 p.setBrush( QBrush( color ) );
598 p.setPen( QColor( 197, 197, 197 ) );
604 void QgsSymbolButton::stopPicking( QPoint eventPos,
bool samplingColor )
609 QgsApplication::restoreOverrideCursor();
610 setMouseTracking(
false );
611 mPickingColor =
false;
613 if ( !samplingColor )
622 addRecentColor( newColor );
625 void QgsSymbolButton::showColorDialog()
630 QColor currentColor = mSymbol->color();
635 if ( currentColor.isValid() )
642 if ( newColor.isValid() )
644 setColor( newColor );
651 QgsColorDialog dialog(
this, Qt::WindowFlags(), mSymbol->color() );
652 dialog.setTitle( tr(
"Symbol Color" ) );
653 dialog.setAllowOpacity(
true );
655 if ( dialog.exec() && dialog.color().isValid() )
666 mDialogTitle = title;
676 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).
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.
static QgsMarkerSymbol * createSimple(const QVariantMap &properties)
Create a marker symbol with one symbol layer: SimpleMarker with specified properties.
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.
SymbolType type() const
Returns the symbol's type.
SymbolType
Type of the symbol.
virtual QgsSymbol * clone() const =0
Returns a deep copy of this symbol.
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,...