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' width=\"%4\">" ).arg( QString( data.toBase64() ) ).arg( width ) );
 
  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 )
 
SymbolType
Attribute editing capabilities which may be supported by vector data providers.
 
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.
 
Stores properties relating to a screen.
 
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, 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.
 
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,...