From 30827fe4016cbbc62d4eb0291d4af7c5dc54d007 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 24 Aug 2021 12:36:58 +0200 Subject: [PATCH] QmlDesigner: Implement visibility for unified render path If the item is set to invisible we set visible to false in the render and preview puppets. This will have no effect on the value in the property editor. Changing the actual value of visible can have side-effects on the rendering in some rare cases. Task-number: QDS-4932 Change-Id: I5ce0925ebff8f5e4e64bc71fd5d33d6154b85f91 Reviewed-by: Miikka Heikkinen --- .../instances/nodeinstanceserver.cpp | 5 +++++ .../qml2puppet/instances/nodeinstanceserver.h | 2 ++ .../qt5informationnodeinstanceserver.cpp | 5 +++++ .../qt5informationnodeinstanceserver.h | 2 ++ .../instances/quickitemnodeinstance.cpp | 21 +++++++++++++++++++ .../instances/quickitemnodeinstance.h | 3 +++ 6 files changed, 38 insertions(+) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index e31c4932cf7..67fa5096bd4 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1529,4 +1529,9 @@ void NodeInstanceServer::registerFonts(const QUrl &resourceUrl) const QFontDatabase::addApplicationFont(it.next()); } +bool NodeInstanceServer::isInformationServer() const +{ + return false; +} + } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h index 92fc069690a..018b4da242d 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -220,6 +220,8 @@ public: virtual QImage grabWindow() = 0; virtual QImage grabItem(QQuickItem *item) = 0; + virtual bool isInformationServer() const; + public slots: void refreshLocalFileProperty(const QString &path); void refreshDummyData(const QString &path); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index ad9de63f57e..19e864e6381 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -2085,6 +2085,11 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst #endif } +bool Qt5InformationNodeInstanceServer::isInformationServer() const +{ + return true; +} + // update 3D view size when it changes in creator side void Qt5InformationNodeInstanceServer::update3DViewState(const Update3dViewStateCommand &command) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index ed4f97d81be..d827075c452 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -75,6 +75,8 @@ public: void handleInstanceLocked(const ServerNodeInstance &instance, bool enable, bool checkAncestors) override; void handleInstanceHidden(const ServerNodeInstance &instance, bool enable, bool checkAncestors) override; + bool isInformationServer() const override; + private slots: void handleSelectionChanged(const QVariant &objs); void handleObjectPropertyCommit(const QVariant &objects, const QVariant &propNames); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp index 51b1dcd1c06..ab38b33aafe 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp @@ -295,6 +295,27 @@ bool QuickItemNodeInstance::unifiedRenderPathOrQt6() #endif } +void QuickItemNodeInstance::setHiddenInEditor(bool hide) +{ + ObjectNodeInstance::setHiddenInEditor(hide); + if (s_unifiedRenderPath && !nodeInstanceServer()->isInformationServer()) { + QQmlProperty property(object(), "visible", context()); + + if (!property.isValid()) + return; + + bool visible = property.read().toBool(); + + if (hide && visible) { + setPropertyVariant("visible", false); + m_hidden = true; + } else if (!hide && !visible && m_hidden) { + setPropertyVariant("visible", true); + m_hidden = false; + } + } +} + QRectF QuickItemNodeInstance::contentItemBoundingBox() const { if (contentItem()) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h index 7e9bd53341f..5f2f2089135 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h @@ -106,6 +106,8 @@ public: static bool unifiedRenderPath(); static bool unifiedRenderPathOrQt6(); + void setHiddenInEditor(bool b) override; + protected: explicit QuickItemNodeInstance(QQuickItem*); QQuickItem *quickItem() const; @@ -139,6 +141,7 @@ private: //variables double m_y; double m_width; double m_height; + bool m_hidden = false; static bool s_createEffectItem; static bool s_unifiedRenderPath; };