summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
authorSérgio Martins <sergio.martins@kdab.com>2014-12-11 20:08:51 +0000
committerSérgio Martins <sergio.martins@kdab.com>2014-12-13 05:39:12 +0100
commit37fa842f41311e71d4c94eaa380ebfa0965fa25d (patch)
tree48b4dc6a53e66d99f739ef2d3fe39a78c75689e5 /src/widgets
parentdc469691a95581553196c77c4b81cb4fb9b29f78 (diff)
QColorDialog: Fix picking screen colors inside QColorPicker
If you click "Pick screen color" and move mouse over QColorPicker (the square with gradients) unexpected things will happen: black will be picked half the times. This is because QColorPicker's black cross is painted under our mouse cursor. Although "pick screen color"'s use case is to pick colors in other windows, there's no reason to not make it work on QColorDialog itself too. Task-number: QTBUG-43288 Change-Id: I03ca02148cc15ad41d545723d4ac4f5a82842b4b Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/dialogs/qcolordialog.cpp26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp
index b92e1a24ad..33b374c1bc 100644
--- a/src/widgets/dialogs/qcolordialog.cpp
+++ b/src/widgets/dialogs/qcolordialog.cpp
@@ -627,6 +627,7 @@ public:
QColorPicker(QWidget* parent);
~QColorPicker();
+ void setCrossVisible(bool visible);
public slots:
void setCol(int h, int s);
@@ -650,6 +651,7 @@ private:
void setCol(const QPoint &pt);
QPixmap pix;
+ bool crossVisible;
};
static int pWidth = 220;
@@ -805,6 +807,7 @@ void QColorPicker::setCol(const QPoint &pt)
QColorPicker::QColorPicker(QWidget* parent)
: QFrame(parent)
+ , crossVisible(true)
{
hue = 0; sat = 0;
setCol(150, 255);
@@ -817,6 +820,14 @@ QColorPicker::~QColorPicker()
{
}
+void QColorPicker::setCrossVisible(bool visible)
+{
+ if (crossVisible != visible) {
+ crossVisible = visible;
+ update();
+ }
+}
+
QSize QColorPicker::sizeHint() const
{
return QSize(pWidth + 2*frameWidth(), pHeight + 2*frameWidth());
@@ -858,12 +869,13 @@ void QColorPicker::paintEvent(QPaintEvent* )
QRect r = contentsRect();
p.drawPixmap(r.topLeft(), pix);
- QPoint pt = colPt() + r.topLeft();
- p.setPen(Qt::black);
-
- p.fillRect(pt.x()-9, pt.y(), 20, 2, Qt::black);
- p.fillRect(pt.x(), pt.y()-9, 2, 20, Qt::black);
+ if (crossVisible) {
+ QPoint pt = colPt() + r.topLeft();
+ p.setPen(Qt::black);
+ p.fillRect(pt.x()-9, pt.y(), 20, 2, Qt::black);
+ p.fillRect(pt.x(), pt.y()-9, 2, 20, Qt::black);
+ }
}
void QColorPicker::resizeEvent(QResizeEvent *ev)
@@ -1578,6 +1590,7 @@ void QColorDialogPrivate::_q_pickScreenColor()
void QColorDialogPrivate::releaseColorPicking()
{
Q_Q(QColorDialog);
+ cp->setCrossVisible(true);
q->removeEventFilter(colorPickingEventFilter);
q->releaseMouse();
q->releaseKeyboard();
@@ -2174,6 +2187,9 @@ void QColorDialog::changeEvent(QEvent *e)
bool QColorDialogPrivate::handleColorPickingMouseMove(QMouseEvent *e)
{
+ // If the cross is visible the grabbed color will be black most of the times
+ cp->setCrossVisible(!cp->geometry().contains(e->pos()));
+
const QPoint globalPos = e->globalPos();
const QColor color = grabScreenColor(globalPos);
// QTBUG-39792, do not change standard, custom color selectors while moving as