diff options
author | Henning Gruendl <henning.gruendl@qt.io> | 2021-08-13 17:04:58 +0200 |
---|---|---|
committer | Henning Gründl <henning.gruendl@qt.io> | 2021-08-16 07:23:20 +0000 |
commit | 14d1726c95ce01d3dc3699e2f05158de5cfa6635 (patch) | |
tree | a1f018592ec31f5443b6d7ec158e3b19499b43cd | |
parent | 341234f3cfe7bde31b00a7459af852ba19172114 (diff) |
QmlDesigner: Fix crash with ColorEditorSingleton
Fix a crash that was caused by ColorPaletteSingleton being shared among
multiple QQnlEngines. Each engine requires a unique instance of
ColorEditorSingleton.
* Rewrite ColorEditorSingleton to not be a singleton anymore
* Rename ColorEditorSingleton to ColorEditorBackend
* Add meaningful warnings
Task-number: QDS-4728
Change-Id: I1ed3315add33754b41870ad6f43c1365a899102b
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r-- | share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml | 4 | ||||
-rw-r--r-- | share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorPalette.qml | 20 | ||||
-rw-r--r-- | src/plugins/qmldesigner/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.cpp (renamed from src/plugins/qmldesigner/components/propertyeditor/colorpalettesingleton.cpp) | 82 | ||||
-rw-r--r-- | src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.h (renamed from src/plugins/qmldesigner/components/propertyeditor/colorpalettesingleton.h) | 30 | ||||
-rw-r--r-- | src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri | 4 | ||||
-rw-r--r-- | src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp | 4 | ||||
-rw-r--r-- | src/plugins/qmldesigner/qmldesignerplugin.qbs | 4 |
8 files changed, 72 insertions, 78 deletions
diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml index 2a292d4ab4..2ed45ea3e1 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml @@ -478,7 +478,7 @@ SecondColumnLayout { icon: StudioTheme.Constants.eyeDropper pixelSize: StudioTheme.Values.myIconFontSize * 1.4 tooltip: qsTr("Eye Dropper") - onClicked: ColorPaletteSingleton.eyeDropper() + onClicked: ColorPaletteBackend.eyeDropper() } IconIndicator { @@ -700,7 +700,7 @@ SecondColumnLayout { StudioControls.MenuItem { text: qsTr("Add to Favorites") - onTriggered: ColorPaletteSingleton.addFavoriteColor( + onTriggered: ColorPaletteBackend.addFavoriteColor( contextMenuFavorite.currentColor) } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorPalette.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorPalette.qml index 4ff74c7aa7..cc007f1463 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorPalette.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorPalette.qml @@ -41,12 +41,12 @@ Column { spacing: 10 function addColorToPalette(colorStr) { - ColorPaletteSingleton.addRecentColor(colorStr) + ColorPaletteBackend.addRecentColor(colorStr) } function showColorDialog(color) { root.oldColor = color - ColorPaletteSingleton.showDialog(color) + ColorPaletteBackend.showDialog(color) } signal dialogColorChanged @@ -92,14 +92,14 @@ Column { StudioControls.MenuItem { visible: colorMode.currentText === "Favorite" text: qsTr("Remove from Favorites") - onTriggered: ColorPaletteSingleton.removeFavoriteColor(index) + onTriggered: ColorPaletteBackend.removeFavoriteColor(index) height: visible ? implicitHeight : 0 } StudioControls.MenuItem { visible: colorMode.currentText !== "Favorite" text: qsTr("Add to Favorites") - onTriggered: ColorPaletteSingleton.addFavoriteColor(modelData) + onTriggered: ColorPaletteBackend.addFavoriteColor(modelData) height: visible ? implicitHeight : 0 } } @@ -108,7 +108,7 @@ Column { Connections { id: singletonConnection - target: ColorPaletteSingleton + target: ColorPaletteBackend function onCurrentColorChanged(color) { root.selectedColor = color @@ -132,18 +132,18 @@ Column { + 4 * StudioTheme.Values.colorEditorPopupSpinBoxWidth width: implicitWidth actionIndicatorVisible: false - model: ColorPaletteSingleton.palettes - currentIndex: colorMode.find(ColorPaletteSingleton.currentPalette) + model: ColorPaletteBackend.palettes + currentIndex: colorMode.find(ColorPaletteBackend.currentPalette) - onActivated: ColorPaletteSingleton.currentPalette = colorMode.currentText + onActivated: ColorPaletteBackend.currentPalette = colorMode.currentText - Component.onCompleted: colorMode.currentIndex = colorMode.find(ColorPaletteSingleton.currentPalette) + Component.onCompleted: colorMode.currentIndex = colorMode.find(ColorPaletteBackend.currentPalette) } } GridView { id: colorPaletteView - model: ColorPaletteSingleton.currentPaletteColors + model: ColorPaletteBackend.currentPaletteColors delegate: colorItemDelegate cellWidth: StudioTheme.Values.colorEditorPopupSpinBoxWidth + StudioTheme.Values.controlGap diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 109368c0e5..e578445ac4 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -353,7 +353,7 @@ extend_qtc_plugin(QmlDesigner SOURCES_PREFIX components/propertyeditor SOURCES aligndistribute.cpp aligndistribute.h - colorpalettesingleton.cpp colorpalettesingleton.h + colorpalettebackend.cpp colorpalettebackend.h designerpropertymap.cpp designerpropertymap.h fileresourcesmodel.cpp fileresourcesmodel.h itemfiltermodel.cpp itemfiltermodel.h diff --git a/src/plugins/qmldesigner/components/propertyeditor/colorpalettesingleton.cpp b/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.cpp index 65d78aa1d4..c848eed2db 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/colorpalettesingleton.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.cpp @@ -23,7 +23,7 @@ ** ****************************************************************************/ -#include "colorpalettesingleton.h" +#include "colorpalettebackend.h" #include <QDebug> #include <QSettings> @@ -36,9 +36,9 @@ namespace QmlDesigner { -QPointer<ColorPaletteSingleton> ColorPaletteSingleton::m_instance = nullptr; +QPointer<ColorPaletteBackend> ColorPaletteBackend::m_instance = nullptr; -ColorPaletteSingleton::ColorPaletteSingleton() +ColorPaletteBackend::ColorPaletteBackend() : m_currentPalette() , m_data() , m_colorPickingEventFilter(nullptr) @@ -58,24 +58,16 @@ ColorPaletteSingleton::ColorPaletteSingleton() dummyTransparentWindow.resize(1, 1); dummyTransparentWindow.setFlags(Qt::Tool | Qt::FramelessWindowHint); updateTimer = new QTimer(this); - connect(updateTimer, &QTimer::timeout, this, &ColorPaletteSingleton::updateEyeDropper); + connect(updateTimer, &QTimer::timeout, this, &ColorPaletteBackend::updateEyeDropper); #endif } -ColorPaletteSingleton::~ColorPaletteSingleton() +ColorPaletteBackend::~ColorPaletteBackend() { //writePalettes(); // TODO crash on QtDS close } -ColorPaletteSingleton *ColorPaletteSingleton::instance() -{ - if (m_instance == nullptr) - m_instance = new ColorPaletteSingleton(); - - return m_instance; -} - -void ColorPaletteSingleton::readPalettes() +void ColorPaletteBackend::readPalettes() { QHash<QString, Palette>::iterator i = m_data.begin(); while (i != m_data.end()) { @@ -84,7 +76,7 @@ void ColorPaletteSingleton::readPalettes() } } -void ColorPaletteSingleton::writePalettes() +void ColorPaletteBackend::writePalettes() { QHash<QString, Palette>::iterator i = m_data.begin(); while (i != m_data.end()) { @@ -93,10 +85,10 @@ void ColorPaletteSingleton::writePalettes() } } -void ColorPaletteSingleton::addColor(const QString &color, const QString &palette) +void ColorPaletteBackend::addColor(const QString &color, const QString &palette) { if (!m_data.contains(palette)) { - qWarning() << "TODO"; + qWarning() << Q_FUNC_INFO << "Unknown palette: " << palette; return; } @@ -116,15 +108,15 @@ void ColorPaletteSingleton::addColor(const QString &color, const QString &palett m_data[palette].write(); } -void ColorPaletteSingleton::removeColor(int id, const QString &palette) +void ColorPaletteBackend::removeColor(int id, const QString &palette) { if (!m_data.contains(palette)) { - qWarning() << "TODO"; + qWarning() << Q_FUNC_INFO << "Unknown palette: " << palette; return; } if (id >= m_data[palette].m_colors.size()) { - qWarning() << "TODO"; + qWarning() << Q_FUNC_INFO << "Id(" << id << ") is out of bounds for palette " << palette; return; } @@ -143,7 +135,7 @@ void ColorPaletteSingleton::removeColor(int id, const QString &palette) m_data[palette].write(); } -void ColorPaletteSingleton::addRecentColor(const QString &item) +void ColorPaletteBackend::addRecentColor(const QString &item) { if (m_data[g_recent].m_colors.isEmpty()) { addColor(item, g_recent); @@ -155,30 +147,30 @@ void ColorPaletteSingleton::addRecentColor(const QString &item) addColor(item, g_recent); } -void ColorPaletteSingleton::addFavoriteColor(const QString &item) +void ColorPaletteBackend::addFavoriteColor(const QString &item) { addColor(item, g_favorite); } -void ColorPaletteSingleton::removeFavoriteColor(int id) +void ColorPaletteBackend::removeFavoriteColor(int id) { removeColor(id, g_favorite); } -QStringList ColorPaletteSingleton::palettes() const +QStringList ColorPaletteBackend::palettes() const { return m_data.keys(); } -const QString &ColorPaletteSingleton::currentPalette() const +const QString &ColorPaletteBackend::currentPalette() const { return m_currentPalette; } -void ColorPaletteSingleton::setCurrentPalette(const QString &palette) +void ColorPaletteBackend::setCurrentPalette(const QString &palette) { if (!m_data.contains(palette)) { - qWarning() << "TODO"; + qWarning() << Q_FUNC_INFO << "Unknown palette: " << palette; return; } @@ -207,35 +199,35 @@ void ColorPaletteSingleton::setCurrentPalette(const QString &palette) emit currentPaletteColorsChanged(); } -const QStringList &ColorPaletteSingleton::currentPaletteColors() const +const QStringList &ColorPaletteBackend::currentPaletteColors() const { return m_currentPaletteColors; } -void ColorPaletteSingleton::registerDeclarativeType() +void ColorPaletteBackend::registerDeclarativeType() { - static const int typeIndex = qmlRegisterSingletonType<ColorPaletteSingleton>( - "QtQuickDesignerColorPalette", 1, 0, "ColorPaletteSingleton", [](QQmlEngine *, QJSEngine *) { - return ColorPaletteSingleton::instance(); + static const int typeIndex = qmlRegisterSingletonType<ColorPaletteBackend>( + "QtQuickDesignerColorPalette", 1, 0, "ColorPaletteBackend", [](QQmlEngine *, QJSEngine *) { + return new ColorPaletteBackend(); }); Q_UNUSED(typeIndex) } -void ColorPaletteSingleton::showDialog(QColor color) +void ColorPaletteBackend::showDialog(QColor color) { auto colorDialog = new QColorDialog(Core::ICore::dialogParent()); colorDialog->setCurrentColor(color); colorDialog->setAttribute(Qt::WA_DeleteOnClose); connect(colorDialog, &QDialog::rejected, - this, &ColorPaletteSingleton::colorDialogRejected); + this, &ColorPaletteBackend::colorDialogRejected); connect(colorDialog, &QColorDialog::currentColorChanged, - this, &ColorPaletteSingleton::currentColorChanged); + this, &ColorPaletteBackend::currentColorChanged); QTimer::singleShot(0, [colorDialog](){ colorDialog->exec(); }); } -void ColorPaletteSingleton::eyeDropper() +void ColorPaletteBackend::eyeDropper() { QWidget *widget = QApplication::activeWindow(); if (!widget) @@ -274,12 +266,12 @@ const int g_screenGrabHeight = 7; const int g_pixelX = 3; const int g_pixelY = 3; -QColor ColorPaletteSingleton::grabScreenColor(const QPoint &p) +QColor ColorPaletteBackend::grabScreenColor(const QPoint &p) { return grabScreenRect(p).pixel(g_pixelX, g_pixelY); } -QImage ColorPaletteSingleton::grabScreenRect(const QPoint &p) +QImage ColorPaletteBackend::grabScreenRect(const QPoint &p) { QScreen *screen = QGuiApplication::screenAt(p); if (!screen) @@ -289,7 +281,7 @@ QImage ColorPaletteSingleton::grabScreenRect(const QPoint &p) return pixmap.toImage(); } -void ColorPaletteSingleton::updateEyeDropper() +void ColorPaletteBackend::updateEyeDropper() { #ifndef QT_NO_CURSOR static QPoint lastGlobalPos; @@ -306,12 +298,12 @@ void ColorPaletteSingleton::updateEyeDropper() #endif // ! QT_NO_CURSOR } -void ColorPaletteSingleton::updateEyeDropperPosition(const QPoint &globalPos) +void ColorPaletteBackend::updateEyeDropperPosition(const QPoint &globalPos) { updateCursor(grabScreenRect(globalPos)); } -void ColorPaletteSingleton::updateCursor(const QImage &image) +void ColorPaletteBackend::updateCursor(const QImage &image) { QWidget *widget = QApplication::activeWindow(); if (!widget) @@ -351,7 +343,7 @@ void ColorPaletteSingleton::updateCursor(const QImage &image) widget->setCursor(cursor); } -void ColorPaletteSingleton::releaseEyeDropper() +void ColorPaletteBackend::releaseEyeDropper() { QWidget *widget = QApplication::activeWindow(); if (!widget) @@ -369,13 +361,13 @@ void ColorPaletteSingleton::releaseEyeDropper() widget->unsetCursor(); } -bool ColorPaletteSingleton::handleEyeDropperMouseMove(QMouseEvent *e) +bool ColorPaletteBackend::handleEyeDropperMouseMove(QMouseEvent *e) { updateEyeDropperPosition(e->globalPos()); return true; } -bool ColorPaletteSingleton::handleEyeDropperMouseButtonRelease(QMouseEvent *e) +bool ColorPaletteBackend::handleEyeDropperMouseButtonRelease(QMouseEvent *e) { if (e->button() == Qt::LeftButton) emit currentColorChanged(grabScreenColor(e->globalPos())); @@ -386,7 +378,7 @@ bool ColorPaletteSingleton::handleEyeDropperMouseButtonRelease(QMouseEvent *e) return true; } -bool ColorPaletteSingleton::handleEyeDropperKeyPress(QKeyEvent *e) +bool ColorPaletteBackend::handleEyeDropperKeyPress(QKeyEvent *e) { #if QT_CONFIG(shortcut) if (e->matches(QKeySequence::Cancel)) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/colorpalettesingleton.h b/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.h index 153cc52f9e..2042b30802 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/colorpalettesingleton.h +++ b/src/plugins/qmldesigner/components/propertyeditor/colorpalettebackend.h @@ -78,7 +78,7 @@ struct Palette QStringList m_colors; }; -class ColorPaletteSingleton : public QObject +class ColorPaletteBackend : public QObject { Q_OBJECT @@ -94,9 +94,7 @@ class ColorPaletteSingleton : public QObject NOTIFY palettesChanged) public: - static ColorPaletteSingleton *instance(); - - ~ColorPaletteSingleton(); + ~ColorPaletteBackend(); void readPalettes(); void writePalettes(); @@ -140,8 +138,8 @@ public: bool handleEyeDropperKeyPress(QKeyEvent *e); - ColorPaletteSingleton(const ColorPaletteSingleton &) = delete; - void operator=(const ColorPaletteSingleton &) = delete; + ColorPaletteBackend(const ColorPaletteBackend &) = delete; + void operator=(const ColorPaletteBackend &) = delete; signals: void currentPaletteChanged(const QString &palette); @@ -154,10 +152,10 @@ signals: void eyeDropperRejected(); private: - ColorPaletteSingleton(); + ColorPaletteBackend(); private: - static QPointer<ColorPaletteSingleton> m_instance; + static QPointer<ColorPaletteBackend> m_instance; QString m_currentPalette; QStringList m_currentPaletteColors; QHash<QString, Palette> m_data; @@ -171,29 +169,33 @@ private: class QColorPickingEventFilter : public QObject { public: - explicit QColorPickingEventFilter(QObject *parent = 0) - : QObject(parent) + explicit QColorPickingEventFilter(ColorPaletteBackend *colorPalette) + : QObject(colorPalette) + , m_colorPalette(colorPalette) {} bool eventFilter(QObject *, QEvent *event) override { switch (event->type()) { case QEvent::MouseMove: - return ColorPaletteSingleton::instance()->handleEyeDropperMouseMove( + return m_colorPalette->handleEyeDropperMouseMove( static_cast<QMouseEvent *>(event)); case QEvent::MouseButtonRelease: - return ColorPaletteSingleton::instance()->handleEyeDropperMouseButtonRelease( + return m_colorPalette->handleEyeDropperMouseButtonRelease( static_cast<QMouseEvent *>(event)); case QEvent::KeyPress: - return ColorPaletteSingleton::instance()->handleEyeDropperKeyPress( + return m_colorPalette->handleEyeDropperKeyPress( static_cast<QKeyEvent *>(event)); default: break; } return false; } + +private: + ColorPaletteBackend *m_colorPalette; }; } // namespace QmlDesigner -QML_DECLARE_TYPE(QmlDesigner::ColorPaletteSingleton) +QML_DECLARE_TYPE(QmlDesigner::ColorPaletteBackend) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri index 0360652fbf..dc8407e66b 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.pri @@ -16,7 +16,7 @@ SOURCES += propertyeditorview.cpp \ gradientpresetlistmodel.cpp \ gradientpresetdefaultlistmodel.cpp \ gradientpresetcustomlistmodel.cpp \ - colorpalettesingleton.cpp \ + colorpalettebackend.cpp \ itemfiltermodel.cpp \ aligndistribute.cpp \ tooltip.cpp @@ -37,7 +37,7 @@ HEADERS += propertyeditorview.h \ gradientpresetlistmodel.h \ gradientpresetdefaultlistmodel.h \ gradientpresetcustomlistmodel.h \ - colorpalettesingleton.h \ + colorpalettebackend.h \ itemfiltermodel.h \ aligndistribute.h \ tooltip.h diff --git a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp index 6298448bbc..09450cdb7c 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp @@ -29,7 +29,7 @@ #include "annotationeditor/annotationeditor.h" #include "bindingeditor/actioneditor.h" #include "bindingeditor/bindingeditor.h" -#include "colorpalettesingleton.h" +#include "colorpalettebackend.h" #include "fileresourcesmodel.h" #include "gradientmodel.h" #include "gradientpresetcustomlistmodel.h" @@ -63,7 +63,7 @@ void Quick2PropertyEditorView::registerQmlTypes() GradientPresetDefaultListModel::registerDeclarativeType(); GradientPresetCustomListModel::registerDeclarativeType(); ItemFilterModel::registerDeclarativeType(); - ColorPaletteSingleton::registerDeclarativeType(); + ColorPaletteBackend::registerDeclarativeType(); Internal::QmlAnchorBindingProxy::registerDeclarativeType(); BindingEditor::registerDeclarativeType(); ActionEditor::registerDeclarativeType(); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 37d8bf84be..8b95987a7b 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -677,8 +677,8 @@ Project { "navigator/previewtooltip.ui", "propertyeditor/aligndistribute.cpp", "propertyeditor/aligndistribute.h", - "propertyeditor/colorpalettesingleton.cpp", - "propertyeditor/colorpalettesingleton.h", + "propertyeditor/colorpalettebackend.cpp", + "propertyeditor/colorpalettebackend.h", "propertyeditor/designerpropertymap.cpp", "propertyeditor/designerpropertymap.h", "propertyeditor/fileresourcesmodel.cpp", |