aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@digia.com>2014-01-06 15:20:54 +0100
committerThomas Hartmann <Thomas.Hartmann@digia.com>2014-01-06 15:47:15 +0100
commit1178a048fc48f1679e23344962400556b516261a (patch)
tree8077013a945f9b1df228a806b018edaa2a32b9b2 /src
parent86a91be426f56784914f7596e80da8754972b77a (diff)
QmlDesigner.ItemLibrary: Start drag using QTimer::singleShot()
A drag might change the imports which invalidates the model exposed to qml. Since QObjects are deleted when the model is reseted this did lead to a crash in the qml engine, because the object emitting the signal was deleted. To avoid this we call startDragAndDrop() asynchronously using QTimer::singleShot(). Now the object is always deleted after the signal is emitted not during the emit. Task-number: QTCREATORBUG-11139 Change-Id: I92e7f9dfff33697b9ff0da148dc9da629723ab7e Reviewed-by: Marco Bubke <marco.bubke@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp18
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h4
2 files changed, 16 insertions, 6 deletions
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
index 99e92d88ea..e715e9800e 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
@@ -48,6 +48,7 @@
#include <QWheelEvent>
#include <QMenu>
#include <QApplication>
+#include <QTimer>
#include <QQuickItem>
@@ -64,7 +65,8 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) :
m_resIconSize(24, 24),
m_itemsView(new QQuickView()),
m_resourcesView(new Internal::ItemLibraryTreeView(this)),
- m_filterFlag(QtBasic)
+ m_filterFlag(QtBasic),
+ m_itemLibraryId(-1)
{
Internal::registerQmlTypes();
@@ -91,7 +93,7 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) :
QQuickItem *rootItem = qobject_cast<QQuickItem*>(m_itemsView->rootObject());
connect(rootItem, SIGNAL(itemSelected(int)), this, SLOT(showItemInfo(int)));
- connect(rootItem, SIGNAL(itemDragged(int)), this, SLOT(startDragAndDrop(int)));
+ connect(rootItem, SIGNAL(itemDragged(int)), this, SLOT(startDragAndDropDelayed(int)));
connect(this, SIGNAL(scrollItemsView(QVariant)), rootItem, SLOT(scrollView(QVariant)));
connect(this, SIGNAL(resetItemsView()), rootItem, SLOT(resetView()));
@@ -363,12 +365,18 @@ void ItemLibraryWidget::setResourcePath(const QString &resourcePath)
updateSearch();
}
-void ItemLibraryWidget::startDragAndDrop(int itemLibId)
+void ItemLibraryWidget::startDragAndDropDelayed(int itemLibraryId)
{
- QMimeData *mimeData = m_itemLibraryModel->getMimeData(itemLibId);
+ m_itemLibraryId = itemLibraryId;
+ QTimer::singleShot(0, this, SLOT(startDragAndDrop()));
+}
+
+void ItemLibraryWidget::startDragAndDrop()
+{
+ QMimeData *mimeData = m_itemLibraryModel->getMimeData(m_itemLibraryId);
QDrag *drag = new QDrag(this);
- drag->setPixmap(m_itemLibraryModel->getIcon(itemLibId).pixmap(32, 32));
+ drag->setPixmap(m_itemLibraryModel->getIcon(m_itemLibraryId).pixmap(32, 32));
drag->setMimeData(mimeData);
drag->exec();
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h
index 0369771d12..8b121472aa 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h
@@ -94,7 +94,8 @@ public slots:
void setResourcePath(const QString &resourcePath);
- void startDragAndDrop(int itemLibId);
+ void startDragAndDropDelayed(int itemLibId);
+ void startDragAndDrop();
void showItemInfo(int itemLibId);
void setModel(Model *model);
@@ -137,6 +138,7 @@ private:
QWeakPointer<Model> m_model;
FilterChangeFlag m_filterFlag;
+ int m_itemLibraryId;
};
}