diff --git a/declarativeimports/core/dialog.cpp b/declarativeimports/core/dialog.cpp index e02577bb9..95125dfe4 100644 --- a/declarativeimports/core/dialog.cpp +++ b/declarativeimports/core/dialog.cpp @@ -19,6 +19,7 @@ #include "dialog.h" +#include #include #include #include @@ -26,6 +27,42 @@ #include #include +class DeclarativeItemContainer : public QGraphicsWidget +{ +public: + DeclarativeItemContainer(QGraphicsItem *parent = 0) + : QGraphicsWidget(parent) + {} + + ~DeclarativeItemContainer() + {} + + void setDeclarativeItem(QDeclarativeItem *item) + { + m_declarativeItem = item; + static_cast(item)->setParentItem(this); + setMinimumWidth(item->implicitWidth()); + setMinimumHeight(item->implicitHeight()); + } + + QDeclarativeItem *declarativeItem() const + { + return m_declarativeItem.data(); + } + +protected: + void resizeEvent(QGraphicsSceneResizeEvent *event) + { + if (m_declarativeItem) { + m_declarativeItem.data()->setProperty("width", event->newSize().width()); + m_declarativeItem.data()->setProperty("height", event->newSize().height()); + } + } + +private: + QWeakPointer m_declarativeItem; +}; + DialogProxy::DialogProxy(QObject *parent) : QObject(parent) { @@ -35,6 +72,7 @@ DialogProxy::DialogProxy(QObject *parent) DialogProxy::~DialogProxy() { delete m_dialog; + delete m_declarativeItemContainer; } QGraphicsObject *DialogProxy::mainItem() const @@ -60,20 +98,38 @@ void DialogProxy::syncMainItem() } //not have a scene? go up in the hyerarchy until we find something with a scene - if (!m_mainItem.data()->scene()) { + QGraphicsScene *scene = m_mainItem.data()->scene(); + if (!scene) { QObject *parent = m_mainItem.data(); - while (parent = parent->parent()) { + while ((parent = parent->parent())) { QGraphicsObject *qo = qobject_cast(parent); if (qo) { - QGraphicsScene *scene = qo->scene(); + scene = qo->scene(); scene->addItem(m_mainItem.data()); break; } } } - //FIXME: make Dialog accept qgraphicsobjects - m_dialog->setGraphicsWidget(qobject_cast(m_mainItem.data())); + //the parent of the qobject never changed, only the parentitem, so put it back what it was + m_mainItem.data()->setParentItem(qobject_cast(m_mainItem.data()->parent())); + + QGraphicsWidget *widget = qobject_cast(m_mainItem.data()); + if (widget) { + m_declarativeItemContainer->deleteLater(); + m_declarativeItemContainer = 0; + } else { + QDeclarativeItem *di = qobject_cast(m_mainItem.data()); + if (di) { + if (!m_declarativeItemContainer) { + m_declarativeItemContainer = new DeclarativeItemContainer(); + scene->addItem(m_declarativeItemContainer); + } + m_declarativeItemContainer->setDeclarativeItem(di); + widget = m_declarativeItemContainer; + } + } + m_dialog->setGraphicsWidget(widget); } bool DialogProxy::isVisible() const diff --git a/declarativeimports/core/dialog.h b/declarativeimports/core/dialog.h index 452d5979b..906107199 100644 --- a/declarativeimports/core/dialog.h +++ b/declarativeimports/core/dialog.h @@ -29,6 +29,8 @@ namespace Plasma class Dialog; } +class DeclarativeItemContainer; + class DialogProxy : public QObject { Q_OBJECT @@ -57,6 +59,7 @@ protected Q_SLOTS: private: Plasma::Dialog *m_dialog; + DeclarativeItemContainer *m_declarativeItemContainer; QWeakPointer m_mainItem; };