21#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 
   22#include <QStyleOptionFrameV3> 
   24#include <QStyleOptionFrame> 
   28#define MARKER_WIDTH 11 
   29#define MARKER_HEIGHT 14 
   31#define MARGIN_BOTTOM ( MARKER_HEIGHT + 2 ) 
   32#define MARGIN_X ( MARKER_WIDTH / 2 ) 
   34#define CLICK_THRESHOLD ( MARKER_WIDTH / 2 + 3 ) 
   41  mStops = mGradient.
stops();
 
   43  if ( sOuterTriangle.isEmpty() )
 
   51  if ( sInnerTriangle.isEmpty() )
 
   60  setFocusPolicy( Qt::StrongFocus );
 
   61  setAcceptDrops( 
true );
 
 
   67  mStops = mGradient.
stops();
 
 
   76  return QSize( 200, 80 );
 
 
   82  QPainter painter( 
this );
 
   84  QRect frameRect( rect().x() + 
MARGIN_X, rect().y(),
 
   89  QStyleOptionFrame option;
 
   90  option.initFrom( 
this );
 
   91  option.state = hasFocus() ? QStyle::State_KeyboardFocusChange : QStyle::State_None;
 
   92  option.rect = frameRect;
 
   93  style()->drawPrimitive( QStyle::PE_Frame, &option, &painter );
 
   98    QStyleOptionFocusRect option;
 
   99    option.initFrom( 
this );
 
  100    option.state = QStyle::State_KeyboardFocusChange;
 
  101    option.rect = frameRect;
 
  102    style()->drawPrimitive( QStyle::PE_FrameFocusRect, &option, &painter );
 
  106  QBrush checkBrush = QBrush( transparentBackground() );
 
  107  painter.setBrush( checkBrush );
 
  108  painter.setPen( Qt::NoPen );
 
  114  painter.drawRect( box );
 
  117  for ( 
int i = 0; i < box.width() + 1; ++i )
 
  119    QPen pen( mGradient.
color( 
static_cast< double >( i ) / box.width() ) );
 
  120    painter.setPen( pen );
 
  121    painter.drawLine( box.left() + i, box.top(), box.left() + i, box.height() + 1 );
 
  125  int markerTop = frameRect.bottom() + 1;
 
  126  drawStopMarker( painter, QPoint( box.left(), markerTop ), mGradient.
color1(), mSelectedStop == 0 );
 
  127  drawStopMarker( painter, QPoint( box.right(), markerTop ), mGradient.
color2(), mSelectedStop == mGradient.
count() - 1 );
 
  129  const auto constMStops = mStops;
 
  132    int x = stop.offset * box.width() + box.left();
 
  133    drawStopMarker( painter, QPoint( x, markerTop ), stop.color, mSelectedStop == i );
 
 
  142  if ( index > 0 && index < mGradient.
count() - 1 )
 
  147    const auto constMStops = mStops;
 
  158  mSelectedStop = index;
 
 
  165  if ( mSelectedStop > 0 && mSelectedStop < mGradient.
count() - 1 )
 
  167    return mStops.at( mSelectedStop - 1 );
 
  169  else if ( mSelectedStop == 0 )
 
 
  184  if ( mSelectedStop > 0 && mSelectedStop < mGradient.
count() - 1 )
 
  186    mStops[ mSelectedStop - 1 ].color = color;
 
  189  else if ( mSelectedStop == 0 )
 
 
  203  if ( mSelectedStop > 0 && mSelectedStop < mGradient.
count() - 1 )
 
  205    mStops[ mSelectedStop - 1 ].offset = offset;
 
 
  214  if ( mSelectedStop > 0 && mSelectedStop < mGradient.
count() - 1 )
 
  216    mStops[ mSelectedStop - 1 ].setColorSpec( spec );
 
  221  else if ( mSelectedStop == mGradient.
count() - 1 )
 
 
  231  if ( mSelectedStop > 0 && mSelectedStop < mGradient.
count() - 1 )
 
  233    mStops[ mSelectedStop - 1 ].setDirection( direction );
 
  238  else if ( mSelectedStop == mGradient.
count() - 1 )
 
 
  248  if ( mSelectedStop > 0 && mSelectedStop < mGradient.
count() - 1 )
 
  250    mStops[ mSelectedStop - 1 ].color = color;
 
  251    mStops[ mSelectedStop - 1 ].offset = offset;
 
  254  else if ( mSelectedStop == 0 )
 
 
  269  if ( selectedStopIsMovable() )
 
  272    double stopOffset = mStops.at( mSelectedStop - 1 ).offset;
 
  273    mStops.removeAt( mSelectedStop - 1 );
 
  276    int closest = findClosestStop( relativePositionToPoint( stopOffset ) );
 
 
  300  if ( e->buttons() & Qt::LeftButton )
 
  302    if ( selectedStopIsMovable() )
 
  304      double offset = pointToRelativePosition( e->pos().x() );
 
  308      mStops[ mSelectedStop - 1 ].offset = offset;
 
 
  318int QgsGradientStopEditor::findClosestStop( 
int x, 
int threshold )
 const 
  320  int closestStop = -1;
 
  321  int closestDiff = std::numeric_limits<int>::max();
 
  322  int currentDiff = std::numeric_limits<int>::max();
 
  328  const auto constStops = mGradient.
stops();
 
  331    currentDiff = std::abs( relativePositionToPoint( stop.offset ) + 1 - x );
 
  332    if ( ( threshold < 0 || currentDiff < threshold ) && currentDiff < closestDiff )
 
  335      closestDiff = currentDiff;
 
  341  currentDiff = std::abs( relativePositionToPoint( 0.0 ) + 1 - x );
 
  342  if ( ( threshold < 0 || currentDiff < threshold ) && currentDiff < closestDiff )
 
  345    closestDiff = currentDiff;
 
  349  currentDiff = std::abs( relativePositionToPoint( 1.0 ) + 1 - x );
 
  350  if ( ( threshold < 0 || currentDiff < threshold ) && currentDiff < closestDiff )
 
  352    closestStop = mGradient.
count() - 1;
 
  364    if ( closestStop >= 0 )
 
 
  375  if ( e->buttons() & Qt::LeftButton )
 
  378    double offset = pointToRelativePosition( e->pos().x() );
 
  380    mSelectedStop = mStops.length();
 
 
  390  if ( ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ) )
 
  396  else if ( e->key() == Qt::Key_Left ||  e->key() == Qt::Key_Right )
 
  398    if ( selectedStopIsMovable() )
 
  403      if ( e->modifiers() & Qt::ShiftModifier )
 
  406      if ( e->key() == Qt::Key_Left )
 
  409      mStops[ mSelectedStop - 1 ].offset = std::clamp( mStops[ mSelectedStop - 1 ].offset + offsetDiff, 0.0, 1.0 );
 
  418  QWidget::keyPressEvent( e );
 
 
  421QPixmap QgsGradientStopEditor::transparentBackground()
 
  423  static QPixmap sTranspBkgrd;
 
  425  if ( sTranspBkgrd.isNull() )
 
  431void QgsGradientStopEditor::drawStopMarker( QPainter &painter, QPoint topMiddle, 
const QColor &color, 
bool selected )
 
  434  painter.setRenderHint( QPainter::Antialiasing );
 
  435  painter.setBrush( selected ?  QColor( 150, 150, 150 ) : Qt::white );
 
  436  painter.setPen( selected ? Qt::black : QColor( 150, 150, 150 ) );
 
  438  painter.translate( std::round( topMiddle.x() - 
MARKER_WIDTH / 2.0 ) + 0.5, topMiddle.y() + 0.5 );
 
  439  painter.drawPolygon( sOuterTriangle );
 
  442  painter.setBrush( QBrush( transparentBackground() ) );
 
  443  painter.setPen( Qt::NoPen );
 
  444  painter.drawPolygon( sInnerTriangle );
 
  447  painter.setBrush( color );
 
  448  painter.drawPolygon( sInnerTriangle );
 
  451double QgsGradientStopEditor::pointToRelativePosition( 
int x )
 const 
  458  else if ( x >= right )
 
  461  return static_cast< double >( x - left ) / ( right - left );
 
  464int QgsGradientStopEditor::relativePositionToPoint( 
double position )
 const 
  471  else if ( position >= 1.0 )
 
  474  return left + ( right - left ) * position;
 
  477bool QgsGradientStopEditor::selectedStopIsMovable()
 const 
  480  return mSelectedStop > 0 && mSelectedStop < mGradient.
count() - 1;
 
  490  if ( mimeColor.isValid() )
 
  493    e->acceptProposedAction();
 
 
  500  bool hasAlpha = 
false;
 
  503  if ( mimeColor.isValid() )
 
  506    e->acceptProposedAction();
 
  509    double offset = pointToRelativePosition( e->pos().x() );
 
  511    mSelectedStop = mStops.length();
 
 
AngularDirection
Angular directions.
 
static QPixmap getThemePixmap(const QString &name, const QColor &foreColor=QColor(), const QColor &backColor=QColor(), int size=16)
Helper to get a theme icon as a pixmap.
 
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
 
void setColor1(const QColor &color)
Sets the gradient start color.
 
void setColor2(const QColor &color)
Sets the gradient end color.
 
void setColorSpec(QColor::Spec spec)
Sets the color specification in which the color component interpolation will occur.
 
int count() const override
Returns number of defined colors, or -1 if undefined.
 
QColor::Spec colorSpec() const
Returns the color specification in which the color component interpolation will occur.
 
QColor color(double value) const override
Returns the color corresponding to a specified value.
 
void setStops(const QgsGradientStopsList &stops)
Sets the list of intermediate gradient stops for the ramp.
 
QColor color1() const
Returns the gradient start color.
 
void setDirection(Qgis::AngularDirection direction)
Sets the direction to traverse the color wheel using when interpolating hue-based color specification...
 
Qgis::AngularDirection direction() const
Returns the direction to traverse the color wheel using when interpolating hue-based color specificat...
 
QgsGradientStopsList stops() const
Returns the list of intermediate gradient stops for the ramp.
 
QColor color2() const
Returns the gradient end color.
 
void setSelectedStopOffset(double offset)
Sets the offset for the current selected stop.
 
void setColor2(const QColor &color)
Sets the color for the last stop.
 
void setSelectedStopColor(const QColor &color)
Sets the color for the current selected stop.
 
void changed()
Emitted when the gradient ramp is changed by a user.
 
void mousePressEvent(QMouseEvent *event) override
 
void mouseDoubleClickEvent(QMouseEvent *event) override
 
void setSelectedStopColorSpec(QColor::Spec spec)
Sets the color spec for the current selected stop.
 
QgsGradientStop selectedStop() const
Returns details about the currently selected stop.
 
void keyPressEvent(QKeyEvent *event) override
 
void setSelectedStopDetails(const QColor &color, double offset)
Sets the color and offset for the current selected stop.
 
void deleteSelectedStop()
Deletes the current selected stop.
 
void paintEvent(QPaintEvent *event) override
 
void selectStop(int index)
Sets the currently selected stop.
 
QSize sizeHint() const override
 
void setColor1(const QColor &color)
Sets the color for the first stop.
 
void setSelectedStopDirection(Qgis::AngularDirection direction)
Sets the hue angular direction for the current selected stop.
 
void selectedStopChanged(const QgsGradientStop &stop)
Emitted when the current selected stop changes.
 
QgsGradientStopEditor(QWidget *parent=nullptr, QgsGradientColorRamp *ramp=nullptr)
Constructor for QgsGradientStopEditor.
 
void dropEvent(QDropEvent *e) override
 
void mouseMoveEvent(QMouseEvent *event) override
 
void setGradientRamp(const QgsGradientColorRamp &ramp)
Sets the current ramp shown in the editor.
 
void dragEnterEvent(QDragEnterEvent *e) override
 
Represents a color stop within a QgsGradientColorRamp color ramp.
 
void setColorSpec(QColor::Spec spec)
Sets the color specification in which the color component interpolation will occur.
 
void setDirection(Qgis::AngularDirection direction)
Sets the direction to traverse the color wheel using when interpolating hue-based color specification...
 
Scoped object for saving and restoring a QPainter object's state.
 
static QColor colorFromMimeData(const QMimeData *data, bool &hasAlpha)
Attempts to parse mime data as a color.