diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri index 77af6b59ee99ee5539de3146fd1393e75179cc16..b86d8deed3f74c9504cb83e0e409101b72ac1b70 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri @@ -20,6 +20,7 @@ HEADERS += $$PWD/qmltransitionnodeinstance.h HEADERS += $$PWD/servernodeinstance.h HEADERS += $$PWD/anchorchangesnodeinstance.h HEADERS += $$PWD/positionernodeinstance.h +HEADERS += $$PWD/quickwindownodeinstance.h SOURCES += $$PWD/qt5nodeinstanceserver.cpp SOURCES += $$PWD/qt5informationnodeinstanceserver.cpp @@ -41,3 +42,4 @@ SOURCES += $$PWD/qmltransitionnodeinstance.cpp SOURCES += $$PWD/servernodeinstance.cpp SOURCES += $$PWD/anchorchangesnodeinstance.cpp SOURCES += $$PWD/positionernodeinstance.cpp +SOURCES += $$PWD/quickwindownodeinstance.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index 477f53911a971ea620cc7e029621f3bd098f825f..67374d375e9cefec76d64336bd1cae1cf54d9a13 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -1122,8 +1122,14 @@ QObject *ObjectNodeInstance::parent() const QObject *parentObject(QObject *object) { QQuickItem *quickItem = qobject_cast<QQuickItem*>(object); - if (quickItem) + if (quickItem && quickItem->parentItem()) { + + //QQuickRootItem is used by Window and we want to return the Window as parent + if (strcmp(quickItem->metaObject()->className(), "QQuickRootItem")) + return object->parent(); + return quickItem->parentItem(); + } return object->parent(); } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f4f86e0b5b6caadc4897835e036d1be52994f4d1 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp @@ -0,0 +1,592 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "quickwindownodeinstance.h" + +#include "qt5nodeinstanceserver.h" + +#include <QQmlExpression> +#include <QQuickView> +#include <QQuickItem> + +#include <private/qquickitem_p.h> + +#include <cmath> + +#include <QHash> + +#include <QDebug> + +namespace QmlDesigner { +namespace Internal { + +bool QuickWindowNodeInstance::s_createEffectItem = false; + +QuickWindowNodeInstance::QuickWindowNodeInstance(QQuickWindow *item) + : ObjectNodeInstance(item), + m_hasHeight(false), + m_hasWidth(false), + m_hasContent(true), + m_x(0.0), + m_y(0.0), + m_width(0.0), + m_height(0.0) +{ +} + +QuickWindowNodeInstance::~QuickWindowNodeInstance() +{ + if (quickItem()) + designerSupport()->derefFromEffectItem(quickItem()); +} + +bool QuickWindowNodeInstance::hasContent() const +{ + if (m_hasContent) + return true; + + return childItemsHaveContent(quickItem()); +} + +QList<ServerNodeInstance> QuickWindowNodeInstance::childItems() const +{ + QList<ServerNodeInstance> instanceList; + + foreach (QQuickItem *childItem, quickItem()->childItems()) + { + if (childItem && nodeInstanceServer()->hasInstanceForObject(childItem)) { + instanceList.append(nodeInstanceServer()->instanceForObject(childItem)); + } else { //there might be an item in between the parent instance + //and the child instance. + //Popular example is flickable which has a viewport item between + //the flickable item and the flickable children + instanceList.append(childItemsForChild(childItem)); //In such a case we go deeper inside the item and + //search for child items with instances. + } + } + + return instanceList; +} + +QList<ServerNodeInstance> QuickWindowNodeInstance::childItemsForChild(QQuickItem *childItem) const +{ + QList<ServerNodeInstance> instanceList; + + if (childItem) { + foreach (QQuickItem *childItem, childItem->childItems()) + { + if (childItem && nodeInstanceServer()->hasInstanceForObject(childItem)) { + instanceList.append(nodeInstanceServer()->instanceForObject(childItem)); + } else { + instanceList.append(childItemsForChild(childItem)); + } + } + } + return instanceList; +} + +void QuickWindowNodeInstance::setHasContent(bool hasContent) +{ + m_hasContent = hasContent; +} + + +bool QuickWindowNodeInstance::anyItemHasContent(QQuickItem *quickItem) +{ + if (quickItem->flags().testFlag(QQuickItem::ItemHasContents)) + return true; + + foreach (QQuickItem *childItem, quickItem->childItems()) { + if (anyItemHasContent(childItem)) + return true; + } + + return false; +} + +bool QuickWindowNodeInstance::childItemsHaveContent(QQuickItem *quickItem) +{ + foreach (QQuickItem *childItem, quickItem->childItems()) { + if (anyItemHasContent(childItem)) + return true; + } + + return false; +} + +QPointF QuickWindowNodeInstance::position() const +{ + return quickItem()->position(); +} + +QTransform QuickWindowNodeInstance::transform() const +{ + return DesignerSupport::parentTransform(quickItem()); +} + +QTransform QuickWindowNodeInstance::customTransform() const +{ + return QTransform(); +} + +QTransform QuickWindowNodeInstance::sceneTransform() const +{ + return DesignerSupport::windowTransform(quickItem()); +} + +double QuickWindowNodeInstance::rotation() const +{ + return quickItem()->rotation(); +} + +double QuickWindowNodeInstance::scale() const +{ + return quickItem()->scale(); +} + +QPointF QuickWindowNodeInstance::transformOriginPoint() const +{ + return quickItem()->transformOriginPoint(); +} + +double QuickWindowNodeInstance::zValue() const +{ + return quickItem()->z(); +} + +double QuickWindowNodeInstance::opacity() const +{ + return quickItem()->opacity(); +} + +QObject *QuickWindowNodeInstance::parent() const +{ + return 0; +} + +bool QuickWindowNodeInstance::equalQuickItem(QQuickItem *item) const +{ + return item == quickItem(); +} + +void QuickWindowNodeInstance::updateDirtyNodeRecursive(QQuickItem *parentItem) const +{ + foreach (QQuickItem *childItem, parentItem->childItems()) { + if (!nodeInstanceServer()->hasInstanceForObject(childItem)) + updateDirtyNodeRecursive(childItem); + } + + DesignerSupport::updateDirtyNode(parentItem); +} + +QImage QuickWindowNodeInstance::renderImage() const +{ + updateDirtyNodeRecursive(quickItem()); + + QRectF boundingRect = boundingRectWithStepChilds(quickItem()); + + QImage renderImage = designerSupport()->renderImageForItem(quickItem(), boundingRect, boundingRect.size().toSize()); + + renderImage = renderImage.convertToFormat(QImage::Format_ARGB32_Premultiplied); + + return renderImage; +} + +QImage QuickWindowNodeInstance::renderPreviewImage(const QSize &previewImageSize) const +{ + QRectF previewItemBoundingRect = boundingRect(); + + if (previewItemBoundingRect.isValid() && quickItem()) + return designerSupport()->renderImageForItem(quickItem(), previewItemBoundingRect, previewImageSize); + + return QImage(); +} + +bool QuickWindowNodeInstance::isMovable() const +{ + return false; +} + +QuickWindowNodeInstance::Pointer QuickWindowNodeInstance::create(QObject *object) +{ + QQuickWindow *quickWindow = qobject_cast<QQuickWindow*>(object); + + Q_ASSERT(quickWindow); + + Pointer instance(new QuickWindowNodeInstance(quickWindow)); + + instance->setHasContent(anyItemHasContent(quickWindow->contentItem())); + quickWindow->contentItem()->setFlag(QQuickItem::ItemHasContents, true); + + static_cast<QQmlParserStatus*>(quickWindow->contentItem())->classBegin(); + + instance->populateResetHashes(); + + QQuickItemPrivate *privateItem = static_cast<QQuickItemPrivate*>(QObjectPrivate::get(quickWindow->contentItem())); + + if (privateItem->window) { + qDebug() << "removing from window"; + if (!privateItem->parentItem) + QQuickWindowPrivate::get(privateItem->window)->parentlessItems.remove(quickWindow->contentItem()); + privateItem->derefWindow(); + privateItem->window = 0; + } + + return instance; +} + +void QuickWindowNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance) +{ + if (instanceId() == 0) { + DesignerSupport::setRootItem(nodeInstanceServer()->quickView(), quickItem()); + } else { + quickItem()->setParentItem(qobject_cast<QQuickItem*>(nodeInstanceServer()->quickView()->rootObject())); + } + + if (s_createEffectItem || instanceId() == 0) + designerSupport()->refFromEffectItem(quickItem()); + + ObjectNodeInstance::initialize(objectNodeInstance); + quickItem()->update(); +} + +bool QuickWindowNodeInstance::isQuickItem() const +{ + return true; +} + +QSizeF QuickWindowNodeInstance::size() const +{ + double width; + + if (DesignerSupport::isValidWidth(quickItem())) { + width = quickItem()->width(); + } else { + width = quickItem()->implicitWidth(); + } + + double height; + + if (DesignerSupport::isValidHeight(quickItem())) { + height = quickItem()->height(); + } else { + height = quickItem()->implicitHeight(); + } + + + return QSizeF(width, height); +} + +static inline bool isRectangleSane(const QRectF &rect) +{ + return rect.isValid() && (rect.width() < 10000) && (rect.height() < 10000); +} + +QRectF QuickWindowNodeInstance::boundingRectWithStepChilds(QQuickItem *parentItem) const +{ + QRectF boundingRect = parentItem->boundingRect(); + + foreach (QQuickItem *childItem, parentItem->childItems()) { + if (!nodeInstanceServer()->hasInstanceForObject(childItem)) { + QRectF transformedRect = childItem->mapRectToItem(parentItem, boundingRectWithStepChilds(childItem)); + if (isRectangleSane(transformedRect)) + boundingRect = boundingRect.united(transformedRect); + } + } + + return boundingRect; +} + +QRectF QuickWindowNodeInstance::boundingRect() const +{ + if (quickItem()) { + if (quickItem()->clip()) { + return quickItem()->boundingRect(); + } else { + return boundingRectWithStepChilds(quickItem()); + } + } + + return QRectF(); +} + +void QuickWindowNodeInstance::setPropertyVariant(const PropertyName &name, const QVariant &value) +{ + if (name == "state") + return; // states are only set by us + + if (name == "height") { + m_height = value.toDouble(); + if (value.isValid()) + m_hasHeight = true; + else + m_hasHeight = false; + } + + if (name == "width") { + m_width = value.toDouble(); + if (value.isValid()) + m_hasWidth = true; + else + m_hasWidth = false; + } + + if (name == "x") + m_x = value.toDouble(); + + if (name == "y") + m_y = value.toDouble(); + + ObjectNodeInstance::setPropertyVariant(name, value); + + quickItem()->update(); +} + +void QuickWindowNodeInstance::setPropertyBinding(const PropertyName &name, const QString &expression) +{ + if (name == "state") + return; // states are only set by us + + ObjectNodeInstance::setPropertyBinding(name, expression); + + quickItem()->update(); +} + +QVariant QuickWindowNodeInstance::property(const PropertyName &name) const +{ + if (name == "visible") + return quickItem()->isVisible(); + return ObjectNodeInstance::property(name); +} + +void QuickWindowNodeInstance::resetHorizontal() + { + setPropertyVariant("x", m_x); + if (m_width > 0.0) { + setPropertyVariant("width", m_width); + } else { + setPropertyVariant("width", quickItem()->implicitWidth()); + } +} + +void QuickWindowNodeInstance::resetVertical() + { + setPropertyVariant("y", m_y); + if (m_height > 0.0) { + setPropertyVariant("height", m_height); + } else { + setPropertyVariant("height", quickItem()->implicitWidth()); + } +} + +static void doComponentCompleteRecursive(QQuickItem *item) +{ + if (item) { + if (DesignerSupport::isComponentComplete(item)) + return; + + foreach (QQuickItem *childItem, item->childItems()) + doComponentCompleteRecursive(childItem); + + static_cast<QQmlParserStatus*>(item)->componentComplete(); + } +} + +void QuickWindowNodeInstance::doComponentComplete() +{ + doComponentCompleteRecursive(quickItem()); + + quickItem()->update(); +} + +bool QuickWindowNodeInstance::isResizable() const +{ + return false; +} + +int QuickWindowNodeInstance::penWidth() const +{ + return DesignerSupport::borderWidth(quickItem()); +} + +void QuickWindowNodeInstance::resetProperty(const PropertyName &name) +{ + if (name == "height") { + m_hasHeight = false; + m_height = 0.0; + } + + if (name == "width") { + m_hasWidth = false; + m_width = 0.0; + } + + if (name == "x") + m_x = 0.0; + + if (name == "y") + m_y = 0.0; + + DesignerSupport::resetAnchor(quickItem(), name); + + if (name == "anchors.fill") { + resetHorizontal(); + resetVertical(); + } else if (name == "anchors.centerIn") { + resetHorizontal(); + resetVertical(); + } else if (name == "anchors.top") { + resetVertical(); + } else if (name == "anchors.left") { + resetHorizontal(); + } else if (name == "anchors.right") { + resetHorizontal(); + } else if (name == "anchors.bottom") { + resetVertical(); + } else if (name == "anchors.horizontalCenter") { + resetHorizontal(); + } else if (name == "anchors.verticalCenter") { + resetVertical(); + } else if (name == "anchors.baseline") { + resetVertical(); + } + + ObjectNodeInstance::resetProperty(name); + + quickItem()->update(); + + if (isInPositioner()) + parentInstance()->refreshPositioner(); +} + +void QuickWindowNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParentInstance, const PropertyName &oldParentProperty, const ObjectNodeInstance::Pointer &newParentInstance, const PropertyName &newParentProperty) +{ + ObjectNodeInstance::reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty); + + DesignerSupport::updateDirtyNode(quickItem()); +} + +static bool isValidAnchorName(const PropertyName &name) +{ + static PropertyNameList anchorNameList(PropertyNameList() << "anchors.top" + << "anchors.left" + << "anchors.right" + << "anchors.bottom" + << "anchors.verticalCenter" + << "anchors.horizontalCenter" + << "anchors.fill" + << "anchors.centerIn" + << "anchors.baseline"); + + return anchorNameList.contains(name); +} + +bool QuickWindowNodeInstance::hasAnchor(const PropertyName &name) const +{ + return DesignerSupport::hasAnchor(quickItem(), name); +} + +QPair<PropertyName, ServerNodeInstance> QuickWindowNodeInstance::anchor(const PropertyName &name) const +{ + if (!isValidAnchorName(name) || !DesignerSupport::hasAnchor(quickItem(), name)) + return ObjectNodeInstance::anchor(name); + + QPair<QString, QObject*> nameObjectPair = DesignerSupport::anchorLineTarget(quickItem(), name, context()); + + QObject *targetObject = nameObjectPair.second; + PropertyName targetName = nameObjectPair.first.toUtf8(); + + if (targetObject && nodeInstanceServer()->hasInstanceForObject(targetObject)) { + return qMakePair(targetName, nodeInstanceServer()->instanceForObject(targetObject)); + } else { + return ObjectNodeInstance::anchor(name); + } +} + +QList<ServerNodeInstance> QuickWindowNodeInstance::stateInstances() const +{ + QList<ServerNodeInstance> instanceList; + QList<QObject*> stateList = DesignerSupport::statesForItem(quickItem()); + foreach (QObject *state, stateList) + { + if (state && nodeInstanceServer()->hasInstanceForObject(state)) + instanceList.append(nodeInstanceServer()->instanceForObject(state)); + } + + return instanceList; +} + +bool QuickWindowNodeInstance::isAnchoredBySibling() const +{ + return false; +} + +bool QuickWindowNodeInstance::isAnchoredByChildren() const +{ + if (DesignerSupport::areChildrenAnchoredTo(quickItem(), quickItem())) // search in children for a anchor to this item + return true; + + return false; +} + +QQuickItem *QuickWindowNodeInstance::quickItem() const +{ + if (object() == 0) + return 0; + + Q_ASSERT(qobject_cast<QQuickWindow*>(object())); + return static_cast<QQuickWindow*>(object())->contentItem(); +} + +DesignerSupport *QuickWindowNodeInstance::designerSupport() const +{ + return qt5NodeInstanceServer()->designerSupport(); +} + +Qt5NodeInstanceServer *QuickWindowNodeInstance::qt5NodeInstanceServer() const +{ + return qobject_cast<Qt5NodeInstanceServer*>(nodeInstanceServer()); +} + +void QuickWindowNodeInstance::createEffectItem(bool createEffectItem) +{ + s_createEffectItem = createEffectItem; +} + +void QuickWindowNodeInstance::updateDirtyNodeRecursive() +{ + foreach (QQuickItem *childItem, quickItem()->childItems()) + updateDirtyNodeRecursive(childItem); + + DesignerSupport::updateDirtyNode(quickItem()); +} + +} // namespace Internal +} // namespace QmlDesigner + diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.h new file mode 100644 index 0000000000000000000000000000000000000000..31d2a1fdfa9e5268a94281aa8bf9d0395b393757 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.h @@ -0,0 +1,140 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef QUICKWINDOWNODEINSTANCE_H +#define QUICKWINDOWNODEINSTANCE_H + +#include <QtGlobal> + +#include "objectnodeinstance.h" + +#include <QQuickWindow> +#include <designersupport.h> + +namespace QmlDesigner { +namespace Internal { + +class QuickWindowNodeInstance : public ObjectNodeInstance +{ +public: + typedef QSharedPointer<QuickWindowNodeInstance> Pointer; + typedef QWeakPointer<QuickWindowNodeInstance> WeakPointer; + + ~QuickWindowNodeInstance(); + + static Pointer create(QObject *objectToBeWrapped); + void initialize(const ObjectNodeInstance::Pointer &objectNodeInstance); + + bool isQuickItem() const Q_DECL_OVERRIDE; + + QRectF boundingRect() const Q_DECL_OVERRIDE; + QPointF position() const Q_DECL_OVERRIDE; + QSizeF size() const Q_DECL_OVERRIDE; + QTransform transform() const Q_DECL_OVERRIDE; + QTransform customTransform() const Q_DECL_OVERRIDE; + QTransform sceneTransform() const Q_DECL_OVERRIDE; + double opacity() const Q_DECL_OVERRIDE; + + QObject *parent() const Q_DECL_OVERRIDE; + + double rotation() const Q_DECL_OVERRIDE; + double scale() const Q_DECL_OVERRIDE; + QPointF transformOriginPoint() const Q_DECL_OVERRIDE; + double zValue() const Q_DECL_OVERRIDE; + + bool equalQuickItem(QQuickItem *item) const; + + bool hasContent() const Q_DECL_OVERRIDE; + + QList<ServerNodeInstance> childItems() const Q_DECL_OVERRIDE; + QList<ServerNodeInstance> childItemsForChild(QQuickItem *childItem) const Q_DECL_OVERRIDE; + + bool isMovable() const Q_DECL_OVERRIDE; + + void setPropertyVariant(const PropertyName &name, const QVariant &value) Q_DECL_OVERRIDE; + void setPropertyBinding(const PropertyName &name, const QString &expression) Q_DECL_OVERRIDE; + + QVariant property(const PropertyName &name) const Q_DECL_OVERRIDE; + void resetProperty(const PropertyName &name) Q_DECL_OVERRIDE; + + void reparent(const ObjectNodeInstance::Pointer &oldParentInstance, + const PropertyName &oldParentProperty, + const ObjectNodeInstance::Pointer &newParentInstance, + const PropertyName &newParentProperty) Q_DECL_OVERRIDE; + + int penWidth() const Q_DECL_OVERRIDE; + + bool hasAnchor(const PropertyName &name) const Q_DECL_OVERRIDE; + QPair<PropertyName, ServerNodeInstance> anchor(const PropertyName &name) const Q_DECL_OVERRIDE; + bool isAnchoredBySibling() const Q_DECL_OVERRIDE; + bool isAnchoredByChildren() const Q_DECL_OVERRIDE; + void doComponentComplete() Q_DECL_OVERRIDE; + + bool isResizable() const Q_DECL_OVERRIDE; + + void setHasContent(bool hasContent); + + QList<ServerNodeInstance> stateInstances() const Q_DECL_OVERRIDE; + + QImage renderImage() const Q_DECL_OVERRIDE; + QImage renderPreviewImage(const QSize &previewImageSize) const Q_DECL_OVERRIDE; + + DesignerSupport *designerSupport() const; + Qt5NodeInstanceServer *qt5NodeInstanceServer() const; + + static void createEffectItem(bool createEffectItem); + + void updateDirtyNodeRecursive() Q_DECL_OVERRIDE; + +protected: + QuickWindowNodeInstance(QQuickWindow*); + QQuickItem *quickItem() const; + void resetHorizontal(); + void resetVertical(); + QRectF boundingRectWithStepChilds(QQuickItem *parentItem) const; + void updateDirtyNodeRecursive(QQuickItem *parentItem) const; + static bool anyItemHasContent(QQuickItem *graphicsItem); + static bool childItemsHaveContent(QQuickItem *graphicsItem); + +private: //variables + bool m_hasHeight; + bool m_hasWidth; + bool m_hasContent; + double m_x; + double m_y; + double m_width; + double m_height; + static bool s_createEffectItem; +}; + +} // namespace Internal +} // namespace QmlDesigner + +#endif // QUICKWINDOWNODEINSTANCE_H + diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index b4bbf5cfc28f3224775ff79727a2e5992ededa5b..4bddcf1a8cb85b16bfd630251bb2b2b660a198df 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -40,6 +40,7 @@ #include "debugoutputcommand.h" #include "quickitemnodeinstance.h" +#include "quickwindownodeinstance.h" #include "nodeinstanceserver.h" #include "instancecontainer.h" @@ -194,6 +195,8 @@ Internal::ObjectNodeInstance::Pointer ServerNodeInstance::createInstance(QObject instance = Internal::QmlTransitionNodeInstance::create(objectToBeWrapped); else if (isSubclassOf(objectToBeWrapped, "QQuickBehavior")) instance = Internal::BehaviorNodeInstance::create(objectToBeWrapped); + else if (isSubclassOf(objectToBeWrapped, "QQuickWindow")) + instance = Internal::QuickWindowNodeInstance::create(objectToBeWrapped); else if (isSubclassOf(objectToBeWrapped, "QObject")) instance = Internal::ObjectNodeInstance::create(objectToBeWrapped); else diff --git a/src/libs/utils/consoleprocess.cpp b/src/libs/utils/consoleprocess.cpp index fdb2356c044891db29fffa65463064544346564c..7acc96ae928f34682c69ef162f7aba49d4551b23 100644 --- a/src/libs/utils/consoleprocess.cpp +++ b/src/libs/utils/consoleprocess.cpp @@ -139,11 +139,11 @@ QString ConsoleProcess::msgCannotExecute(const QString & p, const QString &why) return tr("Cannot execute '%1': %2").arg(p, why); } -QString ConsoleProcess::terminalEmulator(const QSettings *settings) +QString ConsoleProcess::terminalEmulator(const QSettings *settings, bool nonEmpty) { if (settings) { const QString value = settings->value(QLatin1String("General/TerminalEmulator")).toString(); - if (!value.isEmpty()) + if (!nonEmpty || !value.isEmpty()) return value; } return defaultTerminalEmulator(); diff --git a/src/libs/utils/consoleprocess.h b/src/libs/utils/consoleprocess.h index 5224a157cc3ea9329781b66a822d8d57f8e07b6b..3c0a5e7a917d9e72d8fcd241935c6d85c528824e 100644 --- a/src/libs/utils/consoleprocess.h +++ b/src/libs/utils/consoleprocess.h @@ -92,7 +92,7 @@ public: static QString defaultTerminalEmulator(); static QStringList availableTerminalEmulators(); - static QString terminalEmulator(const QSettings *settings); + static QString terminalEmulator(const QSettings *settings, bool nonEmpty = true); static void setTerminalEmulator(QSettings *settings, const QString &term); signals: diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp index 66233f7aa6a041519ae1836db1334c0de84abde0..15bf06041e01aa3cd1f18dcd34d35dccb23d37ee 100644 --- a/src/plugins/coreplugin/generalsettings.cpp +++ b/src/plugins/coreplugin/generalsettings.cpp @@ -116,9 +116,11 @@ QWidget *GeneralSettings::createPage(QWidget *parent) m_page->reloadBehavior->setCurrentIndex(EditorManager::instance()->reloadSetting()); if (HostOsInfo::isAnyUnixHost()) { const QStringList availableTerminals = ConsoleProcess::availableTerminalEmulators(); - const QString currentTerminal = ConsoleProcess::terminalEmulator(settings); + const QString currentTerminal = ConsoleProcess::terminalEmulator(settings, false); + const QString currentTerminalExplicit = ConsoleProcess::terminalEmulator(settings, true); m_page->terminalComboBox->addItems(availableTerminals); m_page->terminalComboBox->lineEdit()->setText(currentTerminal); + m_page->terminalComboBox->lineEdit()->setPlaceholderText(currentTerminalExplicit); } else { m_page->terminalLabel->hide(); m_page->terminalComboBox->hide(); @@ -213,7 +215,7 @@ void GeneralSettings::resetWarnings() void GeneralSettings::resetTerminal() { if (HostOsInfo::isAnyUnixHost()) - m_page->terminalComboBox->lineEdit()->setText(ConsoleProcess::defaultTerminalEmulator()); + m_page->terminalComboBox->lineEdit()->setText(QString()); } void GeneralSettings::resetFileBrowser() diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h index a238692594d81cf17a17a8335fae20294d9e57bd..70f353a80b8a9ebf349b69bb133128528cdf3bc8 100644 --- a/src/plugins/qmldesigner/designercore/include/viewmanager.h +++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h @@ -71,8 +71,8 @@ public: void resetPropertyEditorView(); - void registerFormEditorTool(AbstractCustomTool *tool); // takes ownership - void registerView(AbstractView *view); + void registerFormEditorToolTakingOwnership(AbstractCustomTool *tool); + void registerViewTakingOwnership(AbstractView *view); QList<WidgetInfo> widgetInfos(); diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 0a1b6ba0aa2578dba55a66cf7576d451c0469bba..9c290630baf930bfe2a1d673e94eb172cc1b6099 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -778,10 +778,20 @@ static QString getUnqualifiedName(const QString &name) { const QStringList nameComponents = name.split('.'); if (nameComponents.size() < 2) - return QString(); + return name; return nameComponents.last(); } +static QString getPackage(const QString &name) +{ + QStringList nameComponents = name.split('.'); + if (nameComponents.size() < 2) + return QString(); + nameComponents.removeLast(); + + return nameComponents.join(QLatin1String(".")); +} + bool NodeMetaInfoPrivate::cleverCheckType(const QString &otherType) const { if (otherType == qualfiedTypeName()) @@ -790,13 +800,9 @@ bool NodeMetaInfoPrivate::cleverCheckType(const QString &otherType) const if (isFileComponent()) return false; - QStringList split = otherType.split('.'); - QString package; - QString typeName = otherType; - if (split.count() > 1) { - package = split.first(); - typeName = split.at(1); - } + const QString typeName = getUnqualifiedName(otherType); + const QString package = getPackage(otherType); + if (cppPackageName() == package) return QString(package + '.' + typeName) == cppPackageName() + '.' + getUnqualifiedName(qualfiedTypeName()); diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 75dffde67f3c5db26499ccf91054d0b9baf4a732..697ee77ac85fc2ebc4613db151f6e3e2e4863046 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -42,10 +42,24 @@ namespace QmlDesigner { +namespace { + +bool isItemOrWindow(const ModelNode &modelNode) +{ + if (modelNode.metaInfo().isSubclassOf("QtQuick.Item", -1, -1)) + return true; + + if (modelNode.metaInfo().isSubclassOf("QtQuick.Window.Window", -1, -1) && modelNode.isRootNode()) + return true; + + return false; +} + +} bool QmlItemNode::isValid() const { - return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().isSubclassOf("QtQuick.Item", -1, -1); + return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && isItemOrWindow(modelNode()); } bool QmlItemNode::isRootNode() const diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index b436ecdf851a343bf5aecea801dce0fa8d36c716..dd2dfa217539a52c57142d415844a579477dd8fe 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -903,10 +903,10 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, } if (isComponentType(typeName) || isImplicitComponent) - setupComponentDelayed(modelNode, !differenceHandler.isValidator()); + setupComponentDelayed(modelNode, differenceHandler.isValidator()); if (isCustomParserType(typeName)) - setupCustomParserNodeDelayed(modelNode, !differenceHandler.isValidator()); + setupCustomParserNodeDelayed(modelNode, differenceHandler.isValidator()); context->enterScope(astNode); @@ -1001,7 +1001,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (!defaultPropertyItems.isEmpty()) { if (isComponentType(modelNode.type())) - setupComponentDelayed(modelNode, !differenceHandler.isValidator()); + setupComponentDelayed(modelNode, differenceHandler.isValidator()); if (defaultPropertyName.isEmpty()) { qWarning() << "No default property for node type" << modelNode.type() << ", ignoring child items."; } else { diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index a5dcc37d5805f4d8e70f9f25cfb89ac382ed2fd7..b09e4d9bf41564f3da7ac7cceb42b63fbb83478f 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -89,12 +89,12 @@ void ViewManager::resetPropertyEditorView() m_propertyEditorView.resetView(); } -void ViewManager::registerFormEditorTool(AbstractCustomTool *tool) +void ViewManager::registerFormEditorToolTakingOwnership(AbstractCustomTool *tool) { m_formEditorView.registerTool(tool); } -void ViewManager::registerView(AbstractView *view) +void ViewManager::registerViewTakingOwnership(AbstractView *view) { m_additionalViews.append(view); } diff --git a/tests/auto/treeviewfind/treeviewfind.pro b/tests/auto/treeviewfind/treeviewfind.pro index 00aa98ae5d2fd3c338b4d913b6ecc08c3f4689f4..f2f6250a15e9adf30de1084cddc64d60228b9613 100644 --- a/tests/auto/treeviewfind/treeviewfind.pro +++ b/tests/auto/treeviewfind/treeviewfind.pro @@ -1,8 +1,7 @@ +QTC_PLUGIN_DEPENDS += find include(../qttest.pri) -include($$IDE_SOURCE_TREE/src/plugins/find/find.pri) - -LIBS *= -L$$IDE_LIBRARY_PATH/QtProject +LIBS *= -L$$IDE_PLUGIN_PATH/QtProject SOURCES += \ tst_treeviewfind.cpp