Skip to content

Commit

Permalink
Fix color widgets incorrectly change colors when mouse is hovered
Browse files Browse the repository at this point in the history
over widget
  • Loading branch information
nyalldawson committed Jan 31, 2022
1 parent c5b0ac9 commit d955851
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 16 deletions.
4 changes: 4 additions & 0 deletions python/gui/auto_generated/qgscolorwidgets.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,8 @@ Construct a new color box widget.

virtual void mousePressEvent( QMouseEvent *event );

virtual void mouseReleaseEvent( QMouseEvent *event );


};

Expand Down Expand Up @@ -486,6 +488,8 @@ Emitted when the widget's color component value changes

virtual void mousePressEvent( QMouseEvent *event );

virtual void mouseReleaseEvent( QMouseEvent *event );

virtual void keyPressEvent( QKeyEvent *event );


Expand Down
96 changes: 80 additions & 16 deletions src/gui/qgscolorwidgets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -601,33 +601,50 @@ void QgsColorWheel::setColorFromPos( const QPointF pos )

void QgsColorWheel::mouseMoveEvent( QMouseEvent *event )
{
setColorFromPos( event->pos() );
if ( mIsDragging )
setColorFromPos( event->pos() );

QgsColorWidget::mouseMoveEvent( event );
}

void QgsColorWheel::mousePressEvent( QMouseEvent *event )
{
//calculate where the event occurred -- on the wheel or inside the triangle?
if ( event->button() == Qt::LeftButton )
{
mIsDragging = true;
//calculate where the event occurred -- on the wheel or inside the triangle?

//create a line from the widget's center to the event
const QLineF line = QLineF( width() / 2.0, height() / 2.0, event->pos().x(), event->pos().y() );
//create a line from the widget's center to the event
const QLineF line = QLineF( width() / 2.0, height() / 2.0, event->pos().x(), event->pos().y() );

const double innerLength = mWheelImage->width() / 2.0 - mWheelThickness;
if ( line.length() < innerLength )
{
mClickedPart = QgsColorWheel::Triangle;
const double innerLength = mWheelImage->width() / 2.0 - mWheelThickness;
if ( line.length() < innerLength )
{
mClickedPart = QgsColorWheel::Triangle;
}
else
{
mClickedPart = QgsColorWheel::Wheel;
}
setColorFromPos( event->pos() );
}
else
{
mClickedPart = QgsColorWheel::Wheel;
QgsColorWidget::mousePressEvent( event );
}
setColorFromPos( event->pos() );
}

void QgsColorWheel::mouseReleaseEvent( QMouseEvent *event )
{
Q_UNUSED( event )
mClickedPart = QgsColorWheel::None;
if ( event->button() == Qt::LeftButton )
{
mIsDragging = false;
mClickedPart = QgsColorWheel::None;
}
else
{
QgsColorWidget::mouseReleaseEvent( event );
}
}

void QgsColorWheel::createWheel()
Expand Down Expand Up @@ -843,13 +860,36 @@ void QgsColorBox::resizeEvent( QResizeEvent *event )

void QgsColorBox::mouseMoveEvent( QMouseEvent *event )
{
setColorFromPoint( event->pos() );
if ( mIsDragging )
{
setColorFromPoint( event->pos() );
}
QgsColorWidget::mouseMoveEvent( event );
}

void QgsColorBox::mousePressEvent( QMouseEvent *event )
{
setColorFromPoint( event->pos() );
if ( event->button() == Qt::LeftButton )
{
mIsDragging = true;
setColorFromPoint( event->pos() );
}
else
{
QgsColorWidget::mousePressEvent( event );
}
}

void QgsColorBox::mouseReleaseEvent( QMouseEvent *event )
{
if ( event->button() == Qt::LeftButton )
{
mIsDragging = false;
}
else
{
QgsColorWidget::mouseReleaseEvent( event );
}
}

void QgsColorBox::createBox()
Expand Down Expand Up @@ -1161,7 +1201,11 @@ void QgsColorRampWidget::setMarkerSize( const int markerSize )

void QgsColorRampWidget::mouseMoveEvent( QMouseEvent *event )
{
setColorFromPoint( event->pos() );
if ( mIsDragging )
{
setColorFromPoint( event->pos() );
}

QgsColorWidget::mouseMoveEvent( event );
}

Expand Down Expand Up @@ -1190,7 +1234,27 @@ void QgsColorRampWidget::wheelEvent( QWheelEvent *event )

void QgsColorRampWidget::mousePressEvent( QMouseEvent *event )
{
setColorFromPoint( event->pos() );
if ( event->button() == Qt::LeftButton )
{
mIsDragging = true;
setColorFromPoint( event->pos() );
}
else
{
QgsColorWidget::mousePressEvent( event );
}
}

void QgsColorRampWidget::mouseReleaseEvent( QMouseEvent *event )
{
if ( event->button() == Qt::LeftButton )
{
mIsDragging = false;
}
else
{
QgsColorWidget::mousePressEvent( event );
}
}

void QgsColorRampWidget::keyPressEvent( QKeyEvent *event )
Expand Down
8 changes: 8 additions & 0 deletions src/gui/qgscolorwidgets.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ class GUI_EXPORT QgsColorWheel : public QgsColorWidget
Triangle
};

bool mIsDragging = false;

/*Margin between outer ring and edge of widget*/
int mMargin = 4;

Expand Down Expand Up @@ -410,9 +412,12 @@ class GUI_EXPORT QgsColorBox : public QgsColorWidget
void resizeEvent( QResizeEvent *event ) override;
void mouseMoveEvent( QMouseEvent *event ) override;
void mousePressEvent( QMouseEvent *event ) override;
void mouseReleaseEvent( QMouseEvent *event ) override;

private:

bool mIsDragging = false;

/*Margin between outer ring and edge of widget*/
int mMargin = 2;

Expand Down Expand Up @@ -565,10 +570,13 @@ class GUI_EXPORT QgsColorRampWidget : public QgsColorWidget
void mouseMoveEvent( QMouseEvent *event ) override;
void wheelEvent( QWheelEvent *event ) override;
void mousePressEvent( QMouseEvent *event ) override;
void mouseReleaseEvent( QMouseEvent *event ) override;
void keyPressEvent( QKeyEvent *event ) override;

private:

bool mIsDragging = false;

/*Orientation for ramp*/
Orientation mOrientation;

Expand Down

0 comments on commit d955851

Please sign in to comment.