aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Gruendl <henning.gruendl@qt.io>2023-11-30 18:36:23 +0100
committerHenning Gründl <henning.gruendl@qt.io>2023-12-01 14:34:36 +0000
commitc83f5b9e8e336557e6defe4654eb34ed5251e73d (patch)
tree0e0290e598dce6bc2e66a9fa817ad9f9935b358b
parent0331ea3fb1bd7c3a9be046c97341944c5ab81663 (diff)
QmlDesigner: Fix ColorPicker EyeDropper
Task-number: QDS-11451 Change-Id: I8889e0475647bec480757652b84a5751642a6a07 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> (cherry picked from commit 839152177a7ba4eaa4fdf5e23e327130a8a92803)
-rw-r--r--share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml2
-rw-r--r--share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditorPopup.qml2
-rw-r--r--share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/PopupDialog.qml5
-rw-r--r--src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.cpp70
-rw-r--r--src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.h6
5 files changed, 62 insertions, 23 deletions
diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml
index 48748345e6..3262b03065 100644
--- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml
+++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml
@@ -183,6 +183,8 @@ SecondColumnLayout {
property QtObject loaderItem: loader.item
property string gradientPropertyName
+ keepOpen: loader.item?.eyeDropperActive ?? false
+
width: 260
function commitToGradient() {
diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditorPopup.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditorPopup.qml
index 29c506e8c5..fcf2d341b8 100644
--- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditorPopup.qml
+++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditorPopup.qml
@@ -13,6 +13,8 @@ import QtQuickDesignerColorPalette
Column {
id: root
+ property bool eyeDropperActive: ColorPaletteBackend.eyeDropperActive
+
property bool supportGradient: false
property bool shapeGradients: false
property alias gradientLine: gradientLine
diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/PopupDialog.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/PopupDialog.qml
index 4bfc0614b4..594e115639 100644
--- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/PopupDialog.qml
+++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/PopupDialog.qml
@@ -32,6 +32,8 @@ QtObject {
property rect __itemGlobal: Qt.rect(0, 0, 100, 100)
+ property bool keepOpen: false
+
signal closing(close: var)
function showGlobal() {
@@ -287,6 +289,9 @@ QtObject {
if (!focusWindow)
return
+ if (root.keepOpen)
+ return
+
if (focusWindow !== window && focusWindow.transientParent !== window)
root.close()
}
diff --git a/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.cpp
index 5f15f35111..fc5b9c6ebb 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.cpp
@@ -3,13 +3,14 @@
#include "colorpalettebackend.h"
-#include <QDebug>
-#include <QColorDialog>
-#include <QTimer>
+#include <coreplugin/icore.h>
#include <QApplication>
-#include <QScreen>
+#include <QColorDialog>
+#include <QDebug>
#include <QPainter>
+#include <QScreen>
+#include <QTimer>
namespace QmlDesigner {
@@ -205,17 +206,22 @@ void ColorPaletteBackend::showDialog(QColor color)
void ColorPaletteBackend::eyeDropper()
{
- QWindow *window = QGuiApplication::focusWindow();
- if (!window)
+ QWidget *widget = Core::ICore::mainWindow();
+ if (!widget)
return;
+ m_eyeDropperActive = true;
+ emit eyeDropperActiveChanged();
+
if (!m_colorPickingEventFilter)
m_colorPickingEventFilter = new QColorPickingEventFilter(this);
- window->installEventFilter(m_colorPickingEventFilter);
- window->setMouseGrabEnabled(true);
- window->setKeyboardGrabEnabled(true);
-
+ widget->installEventFilter(m_colorPickingEventFilter);
+#ifndef QT_NO_CURSOR
+ widget->grabMouse(/*Qt::CrossCursor*/);
+#else
+ widget->grabMouse();
+#endif
#ifdef Q_OS_WIN32 // excludes WinRT
// On Windows mouse tracking doesn't work over other processes's windows
updateTimer->start(30);
@@ -224,6 +230,14 @@ void ColorPaletteBackend::eyeDropper()
// and loose focus.
dummyTransparentWindow.show();
#endif
+ widget->grabKeyboard();
+ /* With setMouseTracking(true) the desired color can be more precisely picked up,
+ * and continuously pushing the mouse button is not necessary.
+ */
+ widget->setMouseTracking(true);
+
+ QGuiApplication::setOverrideCursor(QCursor());
+
updateEyeDropperPosition(QCursor::pos());
}
@@ -245,7 +259,12 @@ QImage ColorPaletteBackend::grabScreenRect(const QPoint &p)
if (!screen)
screen = QGuiApplication::primaryScreen();
- const QPixmap pixmap = screen->grabWindow(0, p.x(), p.y(), g_screenGrabWidth, g_screenGrabHeight);
+ const QRect screenRect = screen->geometry();
+ const QPixmap pixmap = screen->grabWindow(0,
+ p.x() - screenRect.x(),
+ p.y() - screenRect.y(),
+ g_screenGrabWidth,
+ g_screenGrabHeight);
return pixmap.toImage();
}
@@ -273,8 +292,8 @@ void ColorPaletteBackend::updateEyeDropperPosition(const QPoint &globalPos)
void ColorPaletteBackend::updateCursor(const QImage &image)
{
- QWindow *window = QGuiApplication::focusWindow();
- if (!window)
+ QWidget *widget = Core::ICore::mainWindow();
+ if (!widget)
return;
QPixmap pixmap(QSize(g_cursorWidth, g_cursorHeight));
@@ -307,24 +326,28 @@ void ColorPaletteBackend::updateCursor(const QImage &image)
painter.drawRect(centerRect);
painter.end();
- QCursor cursor(pixmap);
- window->setCursor(cursor);
+ QGuiApplication::changeOverrideCursor(QCursor(pixmap));
}
void ColorPaletteBackend::releaseEyeDropper()
{
- QWindow *window = QGuiApplication::focusWindow();
- if (!window)
+ QWidget *widget = Core::ICore::mainWindow();
+ if (!widget)
return;
- window->removeEventFilter(m_colorPickingEventFilter);
- window->setMouseGrabEnabled(false);
+ m_eyeDropperActive = false;
+ emit eyeDropperActiveChanged();
+
+ widget->removeEventFilter(m_colorPickingEventFilter);
+ widget->releaseMouse();
#ifdef Q_OS_WIN32
updateTimer->stop();
dummyTransparentWindow.setVisible(false);
#endif
- window->setKeyboardGrabEnabled(false);
- window->unsetCursor();
+ widget->releaseKeyboard();
+ widget->setMouseTracking(false);
+
+ QGuiApplication::restoreOverrideCursor();
}
bool ColorPaletteBackend::handleEyeDropperMouseMove(QMouseEvent *e)
@@ -360,4 +383,9 @@ bool ColorPaletteBackend::handleEyeDropperKeyPress(QKeyEvent *e)
return true;
}
+bool ColorPaletteBackend::eyeDropperActive() const
+{
+ return m_eyeDropperActive;
+}
+
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.h b/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.h
index 152a8a6d1e..9ab60d7c9e 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.h
+++ b/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.h
@@ -71,6 +71,7 @@ class ColorPaletteBackend : public QObject
Q_PROPERTY(QStringList palettes
READ palettes
NOTIFY palettesChanged)
+ Q_PROPERTY(bool eyeDropperActive READ eyeDropperActive NOTIFY eyeDropperActiveChanged)
public:
~ColorPaletteBackend();
@@ -82,7 +83,6 @@ public:
void removeColor(int id, const QString &palette);
Q_INVOKABLE void addRecentColor(const QString &color);
-
Q_INVOKABLE void addFavoriteColor(const QString &color);
Q_INVOKABLE void removeFavoriteColor(int id);
@@ -100,7 +100,6 @@ public:
Q_INVOKABLE void showDialog(QColor color);
-
Q_INVOKABLE void eyeDropper();
QColor grabScreenColor(const QPoint &p);
@@ -116,6 +115,7 @@ public:
bool handleEyeDropperMouseButtonRelease(QMouseEvent *e);
bool handleEyeDropperKeyPress(QKeyEvent *e);
+ bool eyeDropperActive() const;
ColorPaletteBackend(const ColorPaletteBackend &) = delete;
void operator=(const ColorPaletteBackend &) = delete;
@@ -129,6 +129,7 @@ signals:
void currentColorChanged(const QColor &color);
void eyeDropperRejected();
+ void eyeDropperActiveChanged();
private:
ColorPaletteBackend();
@@ -140,6 +141,7 @@ private:
QHash<QString, Palette> m_data;
QColorPickingEventFilter *m_colorPickingEventFilter;
+ bool m_eyeDropperActive = false;
#ifdef Q_OS_WIN32
QTimer *updateTimer;
QWindow dummyTransparentWindow;