From 817253a4f5ef4c0fab040b1b30e5a14f4d8ca9cd Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 4 May 2023 19:01:58 +0200 Subject: [PATCH 001/149] QmlDesigner: Cleanup ModelNode and Co Change-Id: Ibd630b258015a5e85ae8126193792a55bd8033c5 Reviewed-by: Reviewed-by: Thomas Hartmann --- .../designercore/include/abstractproperty.h | 24 ++++++++++--- .../designercore/include/modelnode.h | 21 +++++++---- .../designercore/include/qmlmodelnodefacade.h | 35 +++++++++++++++++++ .../designercore/model/abstractproperty.cpp | 20 ----------- .../designercore/model/modelnode.cpp | 23 ------------ 5 files changed, 69 insertions(+), 54 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/abstractproperty.h b/src/plugins/qmldesigner/designercore/include/abstractproperty.h index c22402202d8..7944f99395d 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/abstractproperty.h @@ -45,9 +45,6 @@ class QMLDESIGNERCORE_EXPORT AbstractProperty friend ModelNode; friend Internal::ModelPrivate; - friend QMLDESIGNERCORE_EXPORT bool operator ==(const AbstractProperty &property1, const AbstractProperty &property2); - friend QMLDESIGNERCORE_EXPORT bool operator !=(const AbstractProperty &property1, const AbstractProperty &property2); - public: AbstractProperty() = default; AbstractProperty(const AbstractProperty &) = default; @@ -107,6 +104,23 @@ public: return ::qHash(property.m_internalNode.get()) ^ ::qHash(property.m_propertyName); } + friend bool operator==(const AbstractProperty &first, const AbstractProperty &second) + { + return first.m_internalNode == second.m_internalNode + && first.m_propertyName == second.m_propertyName; + } + + friend bool operator!=(const AbstractProperty &first, const AbstractProperty &second) + { + return !(first == second); + } + + friend bool operator<(const AbstractProperty &first, const AbstractProperty &second) + { + return std::tie(first.m_internalNode, first.m_propertyName) + < std::tie(second.m_internalNode, second.m_propertyName); + } + protected: AbstractProperty(const PropertyName &propertyName, const Internal::InternalNodePointer &internalNode, Model* model, AbstractView *view); AbstractProperty(const Internal::InternalPropertyPointer &property, Model* model, AbstractView *view); @@ -120,8 +134,8 @@ private: QPointer m_view; }; -QMLDESIGNERCORE_EXPORT bool operator ==(const AbstractProperty &property1, const AbstractProperty &property2); -QMLDESIGNERCORE_EXPORT bool operator !=(const AbstractProperty &property1, const AbstractProperty &property2); +using AbstractProperties = QList; + QMLDESIGNERCORE_EXPORT QTextStream& operator<<(QTextStream &stream, const AbstractProperty &property); QMLDESIGNERCORE_EXPORT QDebug operator<<(QDebug debug, const AbstractProperty &AbstractProperty); } diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index e9891da620c..cd29fc5cab3 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -58,10 +58,7 @@ inline constexpr AuxiliaryDataKeyView transitionExpandedPropery{AuxiliaryDataTyp class QMLDESIGNERCORE_EXPORT ModelNode { - friend QMLDESIGNERCORE_EXPORT bool operator ==(const ModelNode &firstNode, const ModelNode &secondNode); - friend QMLDESIGNERCORE_EXPORT bool operator !=(const ModelNode &firstNode, const ModelNode &secondNode); friend QMLDESIGNERCORE_EXPORT QDebug operator<<(QDebug debug, const ModelNode &modelNode); - friend QMLDESIGNERCORE_EXPORT bool operator <(const ModelNode &firstNode, const ModelNode &secondNode); friend QMLDESIGNERCORE_EXPORT QList toInternalNodeList(const QList &nodeList); friend Model; friend AbstractView; @@ -254,6 +251,21 @@ public: friend auto qHash(const ModelNode &node) { return ::qHash(node.m_internalNode.get()); } + friend bool operator==(const ModelNode &firstNode, const ModelNode &secondNode) + { + return firstNode.m_internalNode == secondNode.m_internalNode; + } + + friend bool operator!=(const ModelNode &firstNode, const ModelNode &secondNode) + { + return !(firstNode == secondNode); + } + + friend bool operator<(const ModelNode &firstNode, const ModelNode &secondNode) + { + return firstNode.m_internalNode < secondNode.m_internalNode; + } + private: // functions Internal::InternalNodePointer internalNode() const; @@ -265,9 +277,6 @@ private: // variables QPointer m_view; }; -QMLDESIGNERCORE_EXPORT bool operator ==(const ModelNode &firstNode, const ModelNode &secondNode); -QMLDESIGNERCORE_EXPORT bool operator !=(const ModelNode &firstNode, const ModelNode &secondNode); -QMLDESIGNERCORE_EXPORT bool operator <(const ModelNode &firstNode, const ModelNode &secondNode); QMLDESIGNERCORE_EXPORT QDebug operator<<(QDebug debug, const ModelNode &modelNode); QMLDESIGNERCORE_EXPORT QTextStream& operator<<(QTextStream &stream, const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h b/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h index 27c4c86cc0b..b731f91640e 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h +++ b/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h @@ -35,6 +35,41 @@ public: static void enableUglyWorkaroundForIsValidQmlModelNodeFacadeInTests(); + friend bool operator==(const QmlModelNodeFacade &firstNode, const QmlModelNodeFacade &secondNode) + { + return firstNode.m_modelNode == secondNode.m_modelNode; + } + + friend bool operator==(const QmlModelNodeFacade &firstNode, const ModelNode &secondNode) + { + return firstNode.m_modelNode == secondNode; + } + + friend bool operator==(const ModelNode &firstNode, const QmlModelNodeFacade &secondNode) + { + return firstNode == secondNode.m_modelNode; + } + + friend bool operator!=(const QmlModelNodeFacade &firstNode, const QmlModelNodeFacade &secondNode) + { + return !(firstNode == secondNode); + } + + friend bool operator!=(const QmlModelNodeFacade &firstNode, const ModelNode &secondNode) + { + return firstNode.m_modelNode != secondNode; + } + + friend bool operator!=(const ModelNode &firstNode, const QmlModelNodeFacade &secondNode) + { + return firstNode != secondNode.m_modelNode; + } + + friend bool operator<(const QmlModelNodeFacade &firstNode, const QmlModelNodeFacade &secondNode) + { + return firstNode.m_modelNode < secondNode.m_modelNode; + } + protected: QmlModelNodeFacade(const ModelNode &modelNode) : m_modelNode(modelNode) diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index 00541e12e2f..32be06c3e6c 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -325,26 +325,6 @@ TypeName AbstractProperty::dynamicTypeName() const return TypeName(); } -/*! - Returns whether \a property1 and \a property2 reference the same property in - the same node. -*/ -bool operator ==(const AbstractProperty &property1, const AbstractProperty &property2) -{ - return (property1.m_model == property2.m_model) - && (property1.m_internalNode == property2.m_internalNode) - && (property1.m_propertyName == property2.m_propertyName); -} - -/*! - Returns whether \a property1 and \a property2 do not reference the same - property in the same node. - */ -bool operator !=(const AbstractProperty &property1, const AbstractProperty &property2) -{ - return !(property1 == property2); -} - QDebug operator<<(QDebug debug, const AbstractProperty &property) { return debug.nospace() << "AbstractProperty(" << (property.isValid() ? property.name() : PropertyName("invalid")) << ')'; diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 7e64f4c4bf4..1a5237babf4 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -700,29 +700,6 @@ void ModelNode::destroy() * This functions interact with properties. */ - -/*! - \brief Returns if the two nodes reference the same entity in the same model - */ -bool operator ==(const ModelNode &firstNode, const ModelNode &secondNode) -{ - return firstNode.internalId() == secondNode.internalId(); -} - -/*! - \brief Returns if the two nodes do not reference the same entity in the same model - */ -bool operator !=(const ModelNode &firstNode, const ModelNode &secondNode) -{ - return firstNode.internalId() != secondNode.internalId(); -} - -bool operator <(const ModelNode &firstNode, const ModelNode &secondNode) -{ - return firstNode.internalId() < secondNode.internalId(); -} - - Internal::InternalNodePointer ModelNode::internalNode() const { return m_internalNode; From bd53675ac9615635e6f255193d8453be25b08537 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 24 May 2023 10:44:01 +0200 Subject: [PATCH 002/149] QmlDesigner: QmlModelNodeFacade should not have virtual functions Change-Id: I61eca08e5d794b9cfb98e4194398201c7cc45633 Reviewed-by: Marco Bubke --- .../qmldesigner/designercore/include/qml3dnode.h | 3 ++- .../qmldesigner/designercore/include/qmlchangeset.h | 4 ++-- .../qmldesigner/designercore/include/qmlconnections.h | 3 ++- .../qmldesigner/designercore/include/qmlitemnode.h | 10 +++++----- .../designercore/include/qmlmodelnodefacade.h | 4 ++-- .../qmldesigner/designercore/include/qmlobjectnode.h | 2 +- .../qmldesigner/designercore/include/qmlstate.h | 2 +- .../qmldesigner/designercore/include/qmltimeline.h | 2 +- .../designercore/include/qmltimelinekeyframegroup.h | 2 +- .../qmldesigner/designercore/include/qmlvisualnode.h | 2 +- 10 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/qml3dnode.h b/src/plugins/qmldesigner/designercore/include/qml3dnode.h index ffcc2ea7ffe..921a691a9be 100644 --- a/src/plugins/qmldesigner/designercore/include/qml3dnode.h +++ b/src/plugins/qmldesigner/designercore/include/qml3dnode.h @@ -25,7 +25,8 @@ class QMLDESIGNERCORE_EXPORT Qml3DNode : public QmlVisualNode public: Qml3DNode() : QmlVisualNode() {} Qml3DNode(const ModelNode &modelNode) : QmlVisualNode(modelNode) {} - bool isValid() const override; + bool isValid() const; + explicit operator bool() const { return isValid(); } static bool isValidQml3DNode(const ModelNode &modelNode); static bool isValidVisualRoot(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/designercore/include/qmlchangeset.h b/src/plugins/qmldesigner/designercore/include/qmlchangeset.h index f7c6b8e56a2..67d7a910840 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlchangeset.h +++ b/src/plugins/qmldesigner/designercore/include/qmlchangeset.h @@ -21,7 +21,7 @@ public: bool restoreEntryValues() const; void setRestoreEntryValues(bool value); QList targetProperties() const; - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlModelStateOperation(const ModelNode &modelNode); }; @@ -31,7 +31,7 @@ class QMLDESIGNERCORE_EXPORT QmlPropertyChanges : public QmlModelStateOperation public: QmlPropertyChanges() : QmlModelStateOperation() {} QmlPropertyChanges(const ModelNode &modelNode) : QmlModelStateOperation(modelNode) {} - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlPropertyChanges(const ModelNode &modelNode); void removeProperty(const PropertyName &name); diff --git a/src/plugins/qmldesigner/designercore/include/qmlconnections.h b/src/plugins/qmldesigner/designercore/include/qmlconnections.h index f8db7642b0f..5dfc33ce619 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlconnections.h +++ b/src/plugins/qmldesigner/designercore/include/qmlconnections.h @@ -20,7 +20,8 @@ public: QmlConnections(); QmlConnections(const ModelNode &modelNode); - bool isValid() const override; + explicit operator bool() const { return isValid(); } + bool isValid() const; static bool isValidQmlConnections(const ModelNode &modelNode); void destroy(); diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index f95a97258bf..e5c552c42ca 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -27,7 +27,7 @@ class QMLDESIGNERCORE_EXPORT QmlItemNode : public QmlVisualNode public: QmlItemNode() = default; QmlItemNode(const ModelNode &modelNode) : QmlVisualNode(modelNode) {} - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlItemNode(const ModelNode &modelNode); @@ -149,7 +149,7 @@ class QMLDESIGNERCORE_EXPORT QmlFlowTargetNode final : public QmlItemNode { public: QmlFlowTargetNode(const ModelNode &modelNode) : QmlItemNode(modelNode) {} - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } void assignTargetItem(const QmlFlowTargetNode &node); @@ -165,7 +165,7 @@ class QMLDESIGNERCORE_EXPORT QmlFlowActionAreaNode final : public QmlItemNode { public: QmlFlowActionAreaNode(const ModelNode &modelNode) : QmlItemNode(modelNode) {} - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlFlowActionAreaNode(const ModelNode &modelNode); ModelNode targetTransition() const; @@ -178,7 +178,7 @@ class QMLDESIGNERCORE_EXPORT QmlFlowItemNode final : public QmlItemNode { public: QmlFlowItemNode(const ModelNode &modelNode) : QmlItemNode(modelNode) {} - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlFlowItemNode(const ModelNode &modelNode); QList flowActionAreas() const; @@ -191,7 +191,7 @@ class QMLDESIGNERCORE_EXPORT QmlFlowViewNode final : public QmlItemNode { public: QmlFlowViewNode(const ModelNode &modelNode) : QmlItemNode(modelNode) {} - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlFlowViewNode(const ModelNode &modelNode); QList flowItems() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h b/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h index b731f91640e..fa17393321e 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h +++ b/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h @@ -18,12 +18,12 @@ public: QmlModelNodeFacade &operator=(const QmlModelNodeFacade &) = default; QmlModelNodeFacade(QmlModelNodeFacade &&) noexcept = default; QmlModelNodeFacade &operator=(QmlModelNodeFacade &&) noexcept = default; - virtual ~QmlModelNodeFacade() = default; + ~QmlModelNodeFacade() = default; operator ModelNode() const { return m_modelNode; } ModelNode modelNode() const { return m_modelNode; } bool hasModelNode() const; static bool isValidQmlModelNodeFacade(const ModelNode &modelNode); - virtual bool isValid() const; + bool isValid() const; explicit operator bool() const { return isValid(); } QmlModelNodeFacade() = default; diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index c4e0c55a9e3..f487be9cd2d 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -31,7 +31,7 @@ public: {} static bool isValidQmlObjectNode(const ModelNode &modelNode); - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } bool hasError() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlstate.h b/src/plugins/qmldesigner/designercore/include/qmlstate.h index c5ba5c89657..2e9ea7f895b 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlstate.h +++ b/src/plugins/qmldesigner/designercore/include/qmlstate.h @@ -45,7 +45,7 @@ public: QList allAffectedNodes() const; QString name() const; void setName(const QString &name); - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlModelState(const ModelNode &modelNode); void destroy(); diff --git a/src/plugins/qmldesigner/designercore/include/qmltimeline.h b/src/plugins/qmldesigner/designercore/include/qmltimeline.h index 26dc4721174..7a2809f5287 100644 --- a/src/plugins/qmldesigner/designercore/include/qmltimeline.h +++ b/src/plugins/qmldesigner/designercore/include/qmltimeline.h @@ -20,7 +20,7 @@ public: QmlTimeline(); QmlTimeline(const ModelNode &modelNode); - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlTimeline(const ModelNode &modelNode); void destroy(); diff --git a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h index 76897b6235c..a319c5ac319 100644 --- a/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h +++ b/src/plugins/qmldesigner/designercore/include/qmltimelinekeyframegroup.h @@ -19,7 +19,7 @@ public: QmlTimelineKeyframeGroup(); QmlTimelineKeyframeGroup(const ModelNode &modelNode); - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlTimelineKeyframeGroup(const ModelNode &modelNode); void destroy(); diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index 6827243083d..fb7165d82a2 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -48,7 +48,7 @@ public: QmlVisualNode() = default; QmlVisualNode(const ModelNode &modelNode) : QmlObjectNode(modelNode) {} - bool isValid() const override; + bool isValid() const; explicit operator bool() const { return isValid(); } static bool isValidQmlVisualNode(const ModelNode &modelNode); bool isRootNode() const; From 34a55df4edcc159ea58b55d106d513614d39ad14 Mon Sep 17 00:00:00 2001 From: Brook Cronin Date: Wed, 10 May 2023 11:45:12 +0200 Subject: [PATCH 003/149] QmlDesigner: Add new mouse area icons Change-Id: I3380f05a2c067d963af2ae5367c89c80de9dd3db Reviewed-by: Thomas Hartmann Reviewed-by: --- .../qtquickplugin/images/mouse-area-icon.png | Bin 317 -> 358 bytes .../qtquickplugin/images/mouse-area-icon16.png | Bin 158 -> 263 bytes .../qtquickplugin/images/mouse-area-icon@2x.png | Bin 392 -> 755 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/plugins/qmldesigner/qtquickplugin/images/mouse-area-icon.png b/src/plugins/qmldesigner/qtquickplugin/images/mouse-area-icon.png index 791e5f952030ed68f7cee970cbed516ee18eca96..fe316caf8d823cabf8265da52d95d802d97bbf85 100644 GIT binary patch delta 342 zcmdnX^o(hOWIY=L1H*%I+aC-JjJlpKjv*eMTd(f-I^rO3{Nwvo5uHo*A8_A@i2l#D zmc>zLi)Ag#eTQ`d()`_rNWA|yP?+-|C(0*CIDADW3XR)kb*BWyl96U44nZf>5gVLn>iIEOQmsmWUW-(p# z;1FnSVLIr+BhYe$sdu8t0*7~Jb2jQSB(U#T>HLh5;SF=Gad9pqgZqKX*$f93&X4et z_{Jk+5cTAhh4~Ei4Xl4Wf3ewhr(FJgpx@5mOOf`0du!NdGsJqzKG?XZYz|k6>fFBd z)uLa0jc<1_zH8WgsX%2fga3Nby>l}gR$G0UJNt${!;G7p1y7fw{ zOMfeVV7c<|L(@Hm184Lka#v(O2)g9H^WFL1>^}R`*4-D|{*r-#fx*+&&t;ucLK6Vy C)0*`F literal 317 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4rT@hhU+WOo?>8NNDlA`ab;j&SV3cu?|uIb z0|SFXNswPK12Zc-kASqUfo(ukLQX+l!-VNG7A#%1`M|*=*B(52@?rn92@4q*7&1Lw z978nDPrVq<)!@Lx5^y`}+P&*`-|d$kYU1!?dH%h1!Xu0Oj=Bd!e#kJW9t`7Z2&|UL zFy}7TWB7IB>4$e^hbM3~xN$NVMC{V$$ui5k6m-LPf@G0swD-3Q7oUH;&g|*2wCTg+ d{~u0pmhlKg^>Ce=z`(%3;OXk;vd$@?2>{9Klgj`A diff --git a/src/plugins/qmldesigner/qtquickplugin/images/mouse-area-icon16.png b/src/plugins/qmldesigner/qtquickplugin/images/mouse-area-icon16.png index f426957af38231778b9924d3f4f7ebd84083168f..bc8725fb5ff92bb7ff015b8cbfb71bb968118e7c 100644 GIT binary patch delta 247 zcmbQo*v>RTqMn0|fq_B(^Z!H!28MHl<^4S zMJ>C=v`9duS7*YrrinHW^p|jOxSeWHIKo~rQ9!|Vd-zq)P=*Bsd~-rdLqr)en2u{5 zV9U6DwV1oNsg1pWeOH-1bC}Ynw)f$BvmbE!G;W>zn)&da*_#fqN_3x)>}XgW9Q}mx znCx+h&%q&AbvJCeEq+08;*IYt=4IPHGVr*loRj;(F!4jc!?^y%TNxM_7(8A5T-G@y GGywoWUTkIn delta 142 zcmZo?n#VXnqMn7Bfq~)e-A6$T3=I4MJ|V6Q3=Aufz%ebMC9-t&_a6%NQ6K7(Cfs{an^LB{Ts5mv$^p diff --git a/src/plugins/qmldesigner/qtquickplugin/images/mouse-area-icon@2x.png b/src/plugins/qmldesigner/qtquickplugin/images/mouse-area-icon@2x.png index 14607fb896fff21f450565158c7ebfa690cb34ec..04a25e13db34f237ca4f1500cc91cd59ac80499f 100644 GIT binary patch literal 755 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_MFM<6Tp1V`{{R2KeH0*t zz}u(SofsGxqDzAOf*BYXnV4DFxcG&HrDf$66qQuf)OGa@Ow2899G#q9+&%n)LZaj1 z(=sx13QH=g>zZ3SI=gzNPM`{db+*Kgmw|M2n4x9>lG z{`&LxpWzFJdkhSW#-1*YAs*gSFFg-CefO_=#}>(jdQbLS$xShvRQeY^YzS5nr*D%N+#LII2)OjKAZ?-i+UtDCkrusLWt+ZxeWM zL!imw1EZg>qQgBAruYtqb3BR}dtx{?=(Elf5n1#=dDbqe4Y}0@vt>{6&JGOdZ2I08 zw*RYqgQ%v)rUP47yY?~4ymo2+obn)I%Fmz$_olLZ3VZx1X!{KhhJXIcGH-+9aVw)uv6!+wRg4nMc7W?*1o@O1TaS?83{1OTTslD+@{ literal 392 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_Dgt~$Tp1V`RtyBVa4>Wl z0|SG4NswPKgMgf}u7RVQw{Jj5R6;>RQ+xM>1sitk+kfET$x|1u+_-uF!J}s%KAOGw z`jLTwVTPxRV~EG`w^vRIF**vkUd)=J7P!o0N~H9=|Nj?G<*=SBI4N$&@6FXS6>Cft z%=lwguQFkDxN}hPc_SyoN!d3c?P?5X?jBTIx{s5AyL^M_%UKK?%GsAoSgSGIxpQ!@ z2A42H22aHC^!;-8LsC+igqp0HBE8-UoSHJNAaL%L|Mwox`n-)XG Date: Wed, 24 May 2023 13:33:15 +0200 Subject: [PATCH 004/149] QmlProject: Fix comments in converter Change-Id: Iedf7997e50031659847d05bccd7cf48e116c9809 Reviewed-by: Thomas Hartmann Reviewed-by: Burak Hancerli --- .../qmlprojectmanager/buildsystem/projectitem/converters.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp index 0097611a4dd..bbe0a52c33b 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp @@ -43,7 +43,7 @@ QString jsonToQmlProject(const QJsonObject &rootObject) auto appendBreak = [&ts]() { ts << Qt::endl; }; auto appendComment = [&ts, &indentationLevel](const QString &comment) { - ts << QString(" ").repeated(indentationLevel * 4) << "\\\\ " << comment << Qt::endl; + ts << QString(" ").repeated(indentationLevel * 4) << "// " << comment << Qt::endl; }; auto appendItem = From 0aac3bb5695af6aefd43d1b30e8b390813e04ae8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 24 May 2023 13:05:13 +0200 Subject: [PATCH 005/149] QmlDesigner: Do not rely on implicit conversion Change-Id: I48d325bccebfc809d70ceb118a962a8fae6eaac9 Reviewed-by: Marco Bubke --- src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 0a7039ff130..358375b6abc 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -525,7 +525,7 @@ QList QmlObjectNode::allAffectingStatesOperations() cons return returnList; } -static QList allQmlVisualNodesRecursive(const QmlItemNode &qmlItemNode) +static QList allQmlVisualNodesRecursive(const QmlVisualNode &qmlItemNode) { QList qmlVisualNodeList; From d47fd13058f5576e21fceff1d30ac3b2413a3831 Mon Sep 17 00:00:00 2001 From: Burak Hancerli Date: Tue, 23 May 2023 13:06:59 +0200 Subject: [PATCH 006/149] QmlProject: Remove old test residuals Change-Id: I800c3e9fe70725935aac5baf58763b7dabc6262a Reviewed-by: Marco Bubke --- tests/auto/qml/CMakeLists.txt | 1 - .../auto/qml/qmlprojectmanager/CMakeLists.txt | 1 - .../fileformat/CMakeLists.txt | 20 -- .../fileformat/data/file1.qml | 0 .../fileformat/data/file1.qrc | 0 .../fileformat/data/file2.qml | 0 .../fileformat/data/image.gif | 0 .../fileformat/data/script.js | 0 .../fileformat/data/subdir/file3.qml | 0 .../data/testFileFilter1.qmlproject | 6 - .../data/testFileFilter2.qmlproject | 7 - .../data/testFileFilter3.qmlproject | 7 - .../data/testFileFilter4.qmlproject | 11 - .../data/testFileFilter5.qmlproject | 8 - .../data/testFileFilter6.qmlproject | 7 - .../data/testFileFilter7.qmlproject | 7 - .../data/testFileFilter8.qmlproject | 7 - .../data/testLibraryPaths.qmlproject | 5 - .../fileformat/data/testMainFile.qmlproject | 5 - .../data/testMatchesFile.qmlproject | 10 - .../fileformat/fileformat.qbs | 26 -- .../fileformat/tst_fileformat.cpp | 227 ------------------ .../qmlprojectmanager/qmlprojectmanager.qbs | 6 - .../tools/qmlprojectmanager/CMakeLists.txt | 4 + .../unittest/qmlprojectmanager/CMakeLists.txt | 2 + .../qmlprojectmanager/projectitem-test.cpp | 26 +- 26 files changed, 31 insertions(+), 362 deletions(-) delete mode 100644 tests/auto/qml/qmlprojectmanager/CMakeLists.txt delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/CMakeLists.txt delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/file1.qml delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/file1.qrc delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/file2.qml delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/image.gif delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/script.js delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/subdir/file3.qml delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter1.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter2.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter3.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter4.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter5.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter6.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter7.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter8.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testLibraryPaths.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testMainFile.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/data/testMatchesFile.qmlproject delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/fileformat.qbs delete mode 100644 tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp delete mode 100644 tests/auto/qml/qmlprojectmanager/qmlprojectmanager.qbs diff --git a/tests/auto/qml/CMakeLists.txt b/tests/auto/qml/CMakeLists.txt index a1fbe474570..4aa7c363f9b 100644 --- a/tests/auto/qml/CMakeLists.txt +++ b/tests/auto/qml/CMakeLists.txt @@ -8,6 +8,5 @@ add_subdirectory(qmldesigner) add_subdirectory(qmleditor) add_subdirectory(qmljssimplereader) add_subdirectory(qmljsutils) -add_subdirectory(qmlprojectmanager) add_subdirectory(qrcparser) add_subdirectory(reformatter) diff --git a/tests/auto/qml/qmlprojectmanager/CMakeLists.txt b/tests/auto/qml/qmlprojectmanager/CMakeLists.txt deleted file mode 100644 index f7c00d44bd5..00000000000 --- a/tests/auto/qml/qmlprojectmanager/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(fileformat) diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/CMakeLists.txt b/tests/auto/qml/qmlprojectmanager/fileformat/CMakeLists.txt deleted file mode 100644 index 315db12ac18..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -if (NOT TARGET QmlProjectManager) - return() -endif() - -get_target_property(QmlProjectManagerSources QmlProjectManager SOURCES) -foreach(source IN LISTS QmlProjectManagerSources) - if (source MATCHES "fileformat") - list(APPEND fileformat_sources "${PROJECT_SOURCE_DIR}/src/plugins/qmlprojectmanager/${source}") - endif() -endforeach() - -#add_qtc_test(tst_qml_fileformat -# DEPENDS QmlJS Utils -# INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins/qmlprojectmanager/fileformat" -# DEFINES -# QT_CREATOR -# SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" -# SOURCES tst_fileformat.cpp ${fileformat_sources} -#) - diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/file1.qml b/tests/auto/qml/qmlprojectmanager/fileformat/data/file1.qml deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/file1.qrc b/tests/auto/qml/qmlprojectmanager/fileformat/data/file1.qrc deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/file2.qml b/tests/auto/qml/qmlprojectmanager/fileformat/data/file2.qml deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/image.gif b/tests/auto/qml/qmlprojectmanager/fileformat/data/image.gif deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/script.js b/tests/auto/qml/qmlprojectmanager/fileformat/data/script.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/subdir/file3.qml b/tests/auto/qml/qmlprojectmanager/fileformat/data/subdir/file3.qml deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter1.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter1.qmlproject deleted file mode 100644 index 8e10572a9c4..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter1.qmlproject +++ /dev/null @@ -1,6 +0,0 @@ -import QmlProject 1.0 - -Project { - QmlFiles { - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter2.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter2.qmlproject deleted file mode 100644 index 11548bb7682..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter2.qmlproject +++ /dev/null @@ -1,7 +0,0 @@ -import QmlProject 1.0 - -Project { - QmlFiles { - recursive: false - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter3.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter3.qmlproject deleted file mode 100644 index 814c829234c..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter3.qmlproject +++ /dev/null @@ -1,7 +0,0 @@ -import QmlProject 1.0 - -Project { - QmlFiles { - directory: "subdir" - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter4.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter4.qmlproject deleted file mode 100644 index 19f1953e817..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter4.qmlproject +++ /dev/null @@ -1,11 +0,0 @@ -import QmlProject 1.0 - -Project { - QmlFiles { - directory: "." - recursive: false - } - QmlFiles { - directory: "subdir" - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter5.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter5.qmlproject deleted file mode 100644 index d464bb1c4b9..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter5.qmlproject +++ /dev/null @@ -1,8 +0,0 @@ -import QmlProject 1.0 - -Project { - QmlFiles { - paths: [ "file1.qml", - "file2.qml" ] - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter6.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter6.qmlproject deleted file mode 100644 index 526a8050ef3..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter6.qmlproject +++ /dev/null @@ -1,7 +0,0 @@ -import QmlProject 1.0 - -Project { - ImageFiles { - directory: "." - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter7.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter7.qmlproject deleted file mode 100644 index 4eacf55c840..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter7.qmlproject +++ /dev/null @@ -1,7 +0,0 @@ -import QmlProject 1.0 - -Project { - ImageFiles { - filter: "?mage.[gf]if" - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter8.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter8.qmlproject deleted file mode 100644 index 1dd518c6807..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testFileFilter8.qmlproject +++ /dev/null @@ -1,7 +0,0 @@ -import QmlProject 1.1 - -Project { - Files { - filter: "image.gif" - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testLibraryPaths.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testLibraryPaths.qmlproject deleted file mode 100644 index a9cdc3cb2f0..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testLibraryPaths.qmlproject +++ /dev/null @@ -1,5 +0,0 @@ -import QmlProject 1.0 - -Project { - importPaths: [ "../otherLibrary", "library" ] -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testMainFile.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testMainFile.qmlproject deleted file mode 100644 index 18e1ba8a5d7..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testMainFile.qmlproject +++ /dev/null @@ -1,5 +0,0 @@ -import QmlProject 1.1 - -Project { - mainFile: "file1.qml" -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/data/testMatchesFile.qmlproject b/tests/auto/qml/qmlprojectmanager/fileformat/data/testMatchesFile.qmlproject deleted file mode 100644 index 81398d69d46..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/data/testMatchesFile.qmlproject +++ /dev/null @@ -1,10 +0,0 @@ -import QmlProject 1.0 - -Project { - QmlFiles { - recursive: true - } - JavaScriptFiles { - paths: ["script.js"] - } -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/fileformat.qbs b/tests/auto/qml/qmlprojectmanager/fileformat/fileformat.qbs deleted file mode 100644 index 07ed3a924e6..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/fileformat.qbs +++ /dev/null @@ -1,26 +0,0 @@ -import qbs - -QtcAutotest { - name: "QmlProjectManager file format autotest" - Depends { name: "QmlJS" } - Depends { name: "Utils" } - property path fileFormatDir: project.ide_source_tree + "/src/plugins/qmlprojectmanager/fileformat" - files: "tst_fileformat.cpp" - Group { - name: "Files from QmlProjectManager" - prefix: product.fileFormatDir + '/' - files: [ - "filefilteritems.cpp", - "filefilteritems.h", - "qmlprojectfileformat.cpp", - "qmlprojectfileformat.h", - "qmlprojectitem.cpp", - "qmlprojectitem.h", - ] - } - cpp.includePaths: base.concat([fileFormatDir]) - cpp.defines: base.concat([ - 'QT_CREATOR', - 'SRCDIR="' + path + '"' - ]) -} diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp b/tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp deleted file mode 100644 index bd7695b53db..00000000000 --- a/tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "qmlprojectitem.h" -#include "filefilteritems.h" -#include "qmlprojectfileformat.h" - -#include - -#include - -//TESTED_COMPONENT=src/plugins/qmlprojectmanager/fileformat - -using namespace QmlProjectManager; -using namespace Utils; - -#define COMPARE_AS_SETS(actual, expected) \ - do {\ - if (!QTest::qCompare(Utils::toSet(actual), Utils::toSet(expected), #actual, #expected, __FILE__, __LINE__)) {\ - qDebug() << actual << "\nvs." << expected; \ - return;\ - }\ - } while (false) - - -class tst_FileFormat : public QObject -{ - Q_OBJECT -public: - tst_FileFormat(); - -private slots: - void testFileFilter(); - void testMatchesFile(); - void testLibraryPaths(); - void testMainFile(); -}; - -tst_FileFormat::tst_FileFormat() -{ -} - -const QString testDataDir = QLatin1String(SRCDIR "/data"); -const FilePath testDataDirPath = FilePath::fromString(testDataDir); - -static std::unique_ptr loadQmlProject(QString name, QString *error) -{ - return QmlProjectFileFormat::parseProjectFile( - Utils::FilePath::fromString(testDataDir).pathAppended(name + ".qmlproject"), error); -} - -void tst_FileFormat::testFileFilter() -{ - QString error; - - // - // Search for qml files in directory + subdirectories - // - { - auto project = loadQmlProject(QLatin1String("testFileFilter1"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml" - << testDataDir + "/file2.qml" - << testDataDir + "/subdir/file3.qml"); - COMPARE_AS_SETS(project->files(), expectedFiles); - } - - // - // search for all qml files in directory - // - { - auto project = loadQmlProject(QLatin1String("testFileFilter2"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml" - << testDataDir + "/file2.qml"); - COMPARE_AS_SETS(project->files(), expectedFiles); - } - - // - // search for all qml files in subdirectory - // - { - auto project = loadQmlProject(QLatin1String("testFileFilter3"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QStringList expectedFiles(QStringList() << testDataDir + "/subdir/file3.qml"); - COMPARE_AS_SETS(project->files(), expectedFiles); - } - - // - // multiple entries - // - { - auto project = loadQmlProject(QLatin1String("testFileFilter4"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml" - << testDataDir + "/file2.qml" - << testDataDir + "/subdir/file3.qml"); - QCOMPARE(project->files().size(), 3); - COMPARE_AS_SETS(project->files(), expectedFiles); - } - - // - // include specific list - // - { - auto project = loadQmlProject(QLatin1String("testFileFilter5"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QStringList expectedFiles(QStringList() << testDataDir + "/file1.qml" - << testDataDir + "/file2.qml"); - COMPARE_AS_SETS(project->files(), expectedFiles); - } - - // - // include specific list - // - { - auto project = loadQmlProject(QLatin1String("testFileFilter6"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QStringList expectedFiles(QStringList() << testDataDir + "/image.gif"); - COMPARE_AS_SETS(project->files(), expectedFiles); - } - - // - // use wildcards - // - { - auto project = loadQmlProject(QLatin1String("testFileFilter7"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QStringList expectedFiles(QStringList() << testDataDir + "/image.gif"); - COMPARE_AS_SETS(project->files(), expectedFiles); - } - - // - // use Files element (1.1) - // - { - auto project = loadQmlProject(QLatin1String("testFileFilter8"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QStringList expectedFiles(QStringList() << testDataDir + "/image.gif"); - COMPARE_AS_SETS(project->files(), expectedFiles); - } -} - -void tst_FileFormat::testMatchesFile() -{ - QString error; - // - // search for qml files in local directory - // - auto project = loadQmlProject(QLatin1String("testMatchesFile"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - QVERIFY(project->matchesFile(testDataDir + "/file1.qml")); - QVERIFY(project->matchesFile(testDataDir + "/notyetexistingfile.qml")); - QVERIFY(project->matchesFile(testDataDir + "/subdir/notyetexistingfile.qml")); - QVERIFY(project->matchesFile(testDataDir + "/script.js")); - QVERIFY(!project->matchesFile(testDataDir + "/script.css")); -} - -void tst_FileFormat::testLibraryPaths() -{ - QString error; - // - // search for qml files in local directory - // - auto project = loadQmlProject(QLatin1String("testLibraryPaths"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - project->setSourceDirectory(testDataDirPath); - - const QDir base(testDataDir); - const QStringList expectedPaths({base.relativeFilePath(SRCDIR "/otherLibrary"), - base.relativeFilePath(SRCDIR "/data/library")}); - COMPARE_AS_SETS(project->importPaths(), expectedPaths); -} - -void tst_FileFormat::testMainFile() -{ - QString error; - // - // search for qml files in local directory - // - auto project = loadQmlProject(QLatin1String("testMainFile"), &error); - QVERIFY(project); - QVERIFY(error.isEmpty()); - - QCOMPARE(project->mainFile(), QString("file1.qml")); -} - -QTEST_GUILESS_MAIN(tst_FileFormat); -#include "tst_fileformat.moc" diff --git a/tests/auto/qml/qmlprojectmanager/qmlprojectmanager.qbs b/tests/auto/qml/qmlprojectmanager/qmlprojectmanager.qbs deleted file mode 100644 index 1d1f1ea988c..00000000000 --- a/tests/auto/qml/qmlprojectmanager/qmlprojectmanager.qbs +++ /dev/null @@ -1,6 +0,0 @@ -import qbs - -Project { - name: "QmlProjectManager autotests" - references: "fileformat/fileformat.qbs" -} diff --git a/tests/unit/tools/qmlprojectmanager/CMakeLists.txt b/tests/unit/tools/qmlprojectmanager/CMakeLists.txt index 0f5a41c6331..a1c04cb90fd 100644 --- a/tests/unit/tools/qmlprojectmanager/CMakeLists.txt +++ b/tests/unit/tools/qmlprojectmanager/CMakeLists.txt @@ -1,3 +1,7 @@ +if(NOT TARGET QmlProjectManagerLib) + return() +endif() + project(QmlProjectManagerConverterDataCreator) add_compile_definitions(QT_CREATOR) diff --git a/tests/unit/unittest/qmlprojectmanager/CMakeLists.txt b/tests/unit/unittest/qmlprojectmanager/CMakeLists.txt index 9b5037fc527..52a70c0736a 100644 --- a/tests/unit/unittest/qmlprojectmanager/CMakeLists.txt +++ b/tests/unit/unittest/qmlprojectmanager/CMakeLists.txt @@ -1,4 +1,6 @@ extend_qtc_test(unittest + CONDITION + TARGET QmlProjectManagerLib DEPENDS QmlProjectManagerLib SOURCES diff --git a/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp b/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp index 3bf214fd81f..e76e905f33c 100644 --- a/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp +++ b/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp @@ -519,7 +519,7 @@ TEST_F(QmlProjectItem, SetDesignStudioVersion) ASSERT_EQ(projectItemSetters->versionDesignStudio(), "6"); } -// TODO: We should move this one into the integration tests +// TODO: We should move these 2 tests into the integration tests TEST_F(QmlProjectItem, TestFileFilters) { // GIVEN @@ -536,4 +536,28 @@ TEST_F(QmlProjectItem, TestFileFilters) ASSERT_THAT(filePaths, UnorderedElementsAreArray(expectedAbsoluteFilePaths)); } +TEST_F(QmlProjectItem, MatchesFile) +{ + // GIVEN + auto fileSearched = localTestDataDir + "/file-filters/content/MaterialNames.qml"; + + // WHEN + auto fileFound = projectItemFileFilters->matchesFile(fileSearched); + + // THEN + ASSERT_TRUE(fileFound); +} + +TEST_F(QmlProjectItem, NotMatchesFile) +{ + // GIVEN + auto fileSearched = localTestDataDir + "/file-filters/content/non-existing-file.qwerty"; + + // WHEN + auto fileFound = projectItemFileFilters->matchesFile(fileSearched); + + // THEN + ASSERT_FALSE(fileFound); +} + } // namespace From 4734dfa1cc4281611859b1f64194f8c8907ca8a3 Mon Sep 17 00:00:00 2001 From: Burak Hancerli Date: Wed, 24 May 2023 15:00:47 +0200 Subject: [PATCH 007/149] QmlDesigner: Fix compile issues on macOS Change-Id: Icaa6a85590c7471ed7129986353337c8cee7350e Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/include/qmlmodelnodefacade.h | 2 +- src/plugins/qmldesigner/designercore/include/qmlobjectnode.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h b/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h index fa17393321e..b226c2e7111 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h +++ b/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h @@ -18,7 +18,7 @@ public: QmlModelNodeFacade &operator=(const QmlModelNodeFacade &) = default; QmlModelNodeFacade(QmlModelNodeFacade &&) noexcept = default; QmlModelNodeFacade &operator=(QmlModelNodeFacade &&) noexcept = default; - ~QmlModelNodeFacade() = default; + operator ModelNode() const { return m_modelNode; } ModelNode modelNode() const { return m_modelNode; } bool hasModelNode() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index f487be9cd2d..ced57f67661 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -30,6 +30,8 @@ public: : QmlModelNodeFacade(modelNode) {} + virtual ~QmlObjectNode() = default; + static bool isValidQmlObjectNode(const ModelNode &modelNode); bool isValid() const; explicit operator bool() const { return isValid(); } From b225db45ecff2e53584e90cdceec47a842fdc6c9 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 25 May 2023 11:33:11 +0200 Subject: [PATCH 008/149] QmlDesigner: Do not create Qt 6 boilerplate code for Qt 5 projects Task-number: QDS-7674 Change-Id: I339694be3ee74965f73209f3d4a1b2f32e466525 Reviewed-by: Alessandro Portale --- .../projects/application/wizard.json | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/application/wizard.json index ea5f9ef671b..e1a25e23fb5 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application/wizard.json @@ -296,23 +296,28 @@ }, { "source": "../common/CMakeLists.main.txt.tpl", - "target": "%{ProjectDirectory}/CMakeLists.txt" + "target": "%{ProjectDirectory}/CMakeLists.txt", + "condition": "%{IsQt6Project}" }, { "source": "../common/qmlmodules.tpl", - "target": "%{ProjectDirectory}/qmlmodules" + "target": "%{ProjectDirectory}/qmlmodules", + "condition": "%{IsQt6Project}" }, { "source": "../common/qmlcomponents.tpl", - "target": "%{ProjectDirectory}/qmlcomponents" + "target": "%{ProjectDirectory}/qmlcomponents", + "condition": "%{IsQt6Project}" }, { "source": "../common/insight.tpl", - "target": "%{ProjectDirectory}/insight" + "target": "%{ProjectDirectory}/insight", + "condition": "%{IsQt6Project}" }, { "source": "../common/main.qml", - "target": "%{ProjectDirectory}/main.qml" + "target": "%{ProjectDirectory}/main.qml", + "condition": "%{IsQt6Project}" }, { "source": "../common/qtquickcontrols2.conf.tpl", @@ -320,23 +325,28 @@ }, { "source": "../common/main.cpp.tpl", - "target": "%{ProjectDirectory}/src/main.cpp" + "target": "%{ProjectDirectory}/src/main.cpp", + "condition": "%{IsQt6Project}" }, { "source": "../common/app_environment.h.tpl", - "target": "%{ProjectDirectory}/src/app_environment.h" + "target": "%{ProjectDirectory}/src/app_environment.h", + "condition": "%{IsQt6Project}" }, { "source": "../common/import_qml_plugins.h.tpl", - "target": "%{ProjectDirectory}/src/import_qml_plugins.h" + "target": "%{ProjectDirectory}/src/import_qml_plugins.h", + "condition": "%{IsQt6Project}" }, { "source": "../common/import_qml_components_plugins.h.tpl", - "target": "%{ProjectDirectory}/src/import_qml_components_plugins.h" + "target": "%{ProjectDirectory}/src/import_qml_components_plugins.h", + "condition": "%{IsQt6Project}" }, { "source": "../common/CMakeLists.content.txt.tpl", - "target": "%{ProjectDirectory}/content/CMakeLists.txt" + "target": "%{ProjectDirectory}/content/CMakeLists.txt", + "condition": "%{IsQt6Project}" }, { "source": "../common/App.qml.tpl", @@ -356,11 +366,13 @@ }, { "source": "../common/CMakeLists.imports.txt.tpl", - "target": "%{ProjectDirectory}/imports/CMakeLists.txt" + "target": "%{ProjectDirectory}/imports/CMakeLists.txt", + "condition": "%{IsQt6Project}" }, { "source": "../shared-plugin/name/CMakeLists.importmodule.txt.tpl", - "target": "%{ProjectDirectory}/imports/%{ImportModuleName}/CMakeLists.txt" + "target": "%{ProjectDirectory}/imports/%{ImportModuleName}/CMakeLists.txt", + "condition": "%{IsQt6Project}" }, { "source": "../shared-plugin/name/importmodule.qmldir.tpl", From dee8926bb5b54da222c6d4223aff502e6f963c46 Mon Sep 17 00:00:00 2001 From: Burak Hancerli Date: Thu, 25 May 2023 13:18:06 +0200 Subject: [PATCH 009/149] QmlProject: Fix test data and rename the tests Change-Id: I4b8ddf442fed0f1a38ca5cf642bd3f31a00e973b Reviewed-by: Marco Bubke Reviewed-by: --- tests/unit/unittest/qmlprojectmanager/converters-test.cpp | 2 +- .../data/converter/test-set-1/testfile.jsontoqml | 4 ++-- .../data/converter/test-set-2/testfile.jsontoqml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/unittest/qmlprojectmanager/converters-test.cpp b/tests/unit/unittest/qmlprojectmanager/converters-test.cpp index efa2b647aeb..4e4e225a890 100644 --- a/tests/unit/unittest/qmlprojectmanager/converters-test.cpp +++ b/tests/unit/unittest/qmlprojectmanager/converters-test.cpp @@ -57,7 +57,7 @@ private: Utils::FilePath m_qmlProjectToJsonFile; }; -INSTANTIATE_TEST_SUITE_P(ConverterTests, +INSTANTIATE_TEST_SUITE_P(QmlProjectItem, DataSet, ::testing::Values(QString("test-set-1"), QString("test-set-2"))); diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml index 5207599f994..fe2c378c705 100644 --- a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml +++ b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml @@ -1,5 +1,5 @@ -\\ prop: json-converted -\\ prop: auto-generated +// prop: json-converted +// prop: auto-generated import QmlProject diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml index aaf8d0fdc0a..c4cce639a23 100644 --- a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml +++ b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml @@ -1,5 +1,5 @@ -\\ prop: json-converted -\\ prop: auto-generated +// prop: json-converted +// prop: auto-generated import QmlProject From 1753b95860c19fbc321324ecf68273f9b79521a1 Mon Sep 17 00:00:00 2001 From: Mats Honkamaa Date: Wed, 24 May 2023 08:30:31 +0300 Subject: [PATCH 010/149] Doc: Update bake lights documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QDS-9840 Change-Id: I5d09b47207733d55bb70c381f9c87a8d03e43b91 Reviewed-by: Esa Törmänen Reviewed-by: Miikka Heikkinen --- .../images/bake-lights-dialog.png | Bin 0 -> 29633 bytes .../qtdesignstudio-3d-lights.qdoc | 35 ++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 doc/qtdesignstudio/images/bake-lights-dialog.png diff --git a/doc/qtdesignstudio/images/bake-lights-dialog.png b/doc/qtdesignstudio/images/bake-lights-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..d35599dce6afc8d2deb6ba395c4343cd3b03b7be GIT binary patch literal 29633 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ξ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 Ao&W#< literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc index 8c798a31a4f..ec1de943f2b 100644 --- a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc +++ b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-lights.qdoc @@ -209,11 +209,38 @@ \uicontrol {Shadow map far} property value. Using smaller values may improve the precision and effects of the map. - \section1 Baking Lightmaps + \section1 Baked Lightmaps \note Lightmaps baking is released as technical preview in \QDS 4.1. - \section2 Baking Lightmaps for a 3D Model + Baked lightmaps allow pre-generating the direct lighting from lights such as DirectionalLight, + PointLight, and SpotLight, including the shadows cast by the lights. At run time, instead of + performing the appropriate calculations in the fragment shader, and, in case of shadows, + generating the potentially costly shadow maps in real time, the pre-generated light map is + sampled instead. + + \section2 Baking Lightmaps + + To bake lightmaps for models in your 3D scene: + + \list 1 + \li Right-click anywhere in the \uicontrol 3D view and select \uicontrol {Bake Lights}. + \li In the \uicontrol {Lights Baking Setup} dialog: + \list + \li For every light you want to use to bake lightmaps, set \uicontrol {Bake Mode} to BakeModeAll. + \li For every 3D model you want to bake lightmaps, select \uicontrol {In Use} and + \uicontrol {Enabled}, and set the desired \uicontrol {Resolution}. + \endlist + \li Optional. If you have components with unexposed models or lights (for example, imported + 3D models created in other software), select \uicontrol {Expose models and lights} to add the + models and light of that component to the \uicontrol Models and \uicontrol Lights sections of + the dialog. + \li Select \uicontrol Bake. + \endlist + + \image bake-lights-dialog.png + + \section2 Manually Baking Lightmaps for a 3D Model Baked lightmap components are not visible in the \uicontrol Navigator view by default. To make them visible, select \inlineimage icons/visibilityon.png in the \uicontrol Navigator view. @@ -239,9 +266,10 @@ \li In the \uicontrol Navigator view, select the light component that you want to bake lightmaps for, and in the \uicontrol Properties view, set \uicontrol {Bake Mode} to BakeModeAll. \li Right-click anywhere in the \uicontrol 3D view and select \uicontrol {Bake Lights}. + \li Select \uicontrol {Setup baking manually}, and then select \uicontrol Bake. \endlist - \section2 Baking Lightmaps for a 3D Model Inside a Sub Component + \section2 Manually Baking Lightmaps for a 3D Model Inside a Sub Component To bake lightmaps for a 3D model inside a sub component, first add a local custom property to expose the model: @@ -299,6 +327,7 @@ a unique name. \endlist \li Right-click anywhere in the \uicontrol 3D view and select \uicontrol {Bake Lights}. + \li Select \uicontrol {Setup baking manually}, and then select \uicontrol Bake. \endlist */ From 26bc29e5b008b8a18658029c07e59848ef9f8578 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Sat, 20 May 2023 02:16:36 +0200 Subject: [PATCH 011/149] QmlDesigner: Use std::shared_ptr for internal property We use it already for internal node. This removes the workaround for the self pointer. Change-Id: I81af888bd6f50fab0a2d03ca7e2556545a0c656e Reviewed-by: Aleksei German Reviewed-by: --- .../designercore/include/abstractproperty.h | 2 +- .../designercore/include/modelnode.h | 2 +- .../include/nodeabstractproperty.h | 2 +- .../designercore/include/nodelistproperty.h | 2 +- .../model/internalbindingproperty.cpp | 11 ---- .../model/internalbindingproperty.h | 7 +-- .../designercore/model/internalnode.cpp | 46 ++++++++-------- .../designercore/model/internalnode_p.h | 2 +- .../model/internalnodeabstractproperty.h | 4 +- .../model/internalnodelistproperty.cpp | 10 ---- .../model/internalnodelistproperty.h | 5 +- .../model/internalnodeproperty.cpp | 10 ---- .../designercore/model/internalnodeproperty.h | 6 +- .../designercore/model/internalproperty.cpp | 55 +++++++------------ .../designercore/model/internalproperty.h | 21 +++---- .../model/internalsignalhandlerproperty.cpp | 27 +-------- .../model/internalsignalhandlerproperty.h | 14 ++--- .../model/internalvariantproperty.cpp | 10 ---- .../model/internalvariantproperty.h | 6 +- .../qmldesigner/designercore/model/model.cpp | 8 +-- .../qmldesigner/designercore/model/model_p.h | 14 ++--- .../designercore/model/modelnode.cpp | 4 +- .../model/nodeabstractproperty.cpp | 11 ++-- .../designercore/model/nodelistproperty.cpp | 6 +- 24 files changed, 95 insertions(+), 190 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/abstractproperty.h b/src/plugins/qmldesigner/designercore/include/abstractproperty.h index 7944f99395d..d3f8c59ffe4 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/abstractproperty.h @@ -19,7 +19,7 @@ namespace QmlDesigner { class InternalProperty; using InternalNodePointer = std::shared_ptr; - using InternalPropertyPointer = QSharedPointer; + using InternalPropertyPointer = std::shared_ptr; } class Model; diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index cd29fc5cab3..bfc1570cb62 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -28,7 +28,7 @@ namespace Internal { class InternalProperty; using InternalNodePointer = std::shared_ptr; - using InternalPropertyPointer = QSharedPointer; + using InternalPropertyPointer = std::shared_ptr; } class NodeMetaInfo; class BindingProperty; diff --git a/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h b/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h index d96840e51fa..f4db7339872 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h @@ -9,7 +9,7 @@ namespace QmlDesigner { namespace Internal { class InternalNodeAbstractProperty; - using InternalNodeAbstractPropertyPointer = QSharedPointer; + using InternalNodeAbstractPropertyPointer = std::shared_ptr; } class QMLDESIGNERCORE_EXPORT NodeAbstractProperty : public AbstractProperty diff --git a/src/plugins/qmldesigner/designercore/include/nodelistproperty.h b/src/plugins/qmldesigner/designercore/include/nodelistproperty.h index e0c25eb6c41..334a2a2758c 100644 --- a/src/plugins/qmldesigner/designercore/include/nodelistproperty.h +++ b/src/plugins/qmldesigner/designercore/include/nodelistproperty.h @@ -16,7 +16,7 @@ namespace QmlDesigner { namespace Internal { class ModelPrivate; class InternalNodeListProperty; -using InternalNodeListPropertyPointer = QSharedPointer; +using InternalNodeListPropertyPointer = std::shared_ptr; class NodeListPropertyIterator { diff --git a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp index 28cd56a7904..3ac5b112bf9 100644 --- a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp @@ -11,17 +11,6 @@ InternalBindingProperty::InternalBindingProperty(const PropertyName &name, const { } - -InternalBindingProperty::Pointer InternalBindingProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) -{ - auto newPointer(new InternalBindingProperty(name, propertyOwner)); - InternalBindingProperty::Pointer smartPointer(newPointer); - - newPointer->setInternalWeakPointer(smartPointer); - - return smartPointer; -} - bool InternalBindingProperty::isValid() const { return InternalProperty::isValid() && isBindingProperty(); diff --git a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h index 202434bec80..3645839eb94 100644 --- a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h @@ -11,9 +11,8 @@ namespace Internal { class InternalBindingProperty : public InternalProperty { public: - using Pointer = QSharedPointer; - - static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); + using Pointer = std::shared_ptr; + InternalBindingProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); bool isValid() const override; @@ -22,11 +21,9 @@ public: void setDynamicExpression(const TypeName &type, const QString &expression); - bool isBindingProperty() const override; protected: - InternalBindingProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); private: QString m_expression; diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 003ab8d31cc..8630bb75912 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -17,11 +17,11 @@ namespace Internal { InternalNodeAbstractProperty::Pointer InternalNode::parentProperty() const { - return m_parentProperty; + return m_parentProperty.lock(); } void InternalNode::setParentProperty(const InternalNodeAbstractProperty::Pointer &parent) { - InternalNodeAbstractProperty::Pointer parentProperty = m_parentProperty.toStrongRef(); + InternalNodeAbstractProperty::Pointer parentProperty = m_parentProperty.lock(); if (parentProperty) parentProperty->remove(shared_from_this()); @@ -33,11 +33,11 @@ void InternalNode::setParentProperty(const InternalNodeAbstractProperty::Pointer void InternalNode::resetParentProperty() { - InternalNodeAbstractProperty::Pointer parentProperty = m_parentProperty.toStrongRef(); + InternalNodeAbstractProperty::Pointer parentProperty = m_parentProperty.lock(); if (parentProperty) parentProperty->remove(shared_from_this()); - m_parentProperty.clear(); + m_parentProperty.reset(); } namespace { @@ -120,7 +120,7 @@ InternalBindingProperty::Pointer InternalNode::bindingProperty(const PropertyNam { InternalProperty::Pointer property = m_namePropertyHash.value(name); if (property->isBindingProperty()) - return property.staticCast(); + return std::static_pointer_cast(property); return InternalBindingProperty::Pointer(); } @@ -129,7 +129,7 @@ InternalSignalHandlerProperty::Pointer InternalNode::signalHandlerProperty(const { InternalProperty::Pointer property = m_namePropertyHash.value(name); if (property->isSignalHandlerProperty()) - return property.staticCast(); + return std::static_pointer_cast(property); return InternalSignalHandlerProperty::Pointer(); } @@ -138,7 +138,7 @@ InternalSignalDeclarationProperty::Pointer InternalNode::signalDeclarationProper { InternalProperty::Pointer property = m_namePropertyHash.value(name); if (property->isSignalDeclarationProperty()) - return property.staticCast(); + return std::static_pointer_cast(property); return InternalSignalDeclarationProperty::Pointer(); } @@ -147,81 +147,79 @@ InternalVariantProperty::Pointer InternalNode::variantProperty(const PropertyNam { InternalProperty::Pointer property = m_namePropertyHash.value(name); if (property->isVariantProperty()) - return property.staticCast(); + return std::static_pointer_cast(property); return InternalVariantProperty::Pointer(); } void InternalNode::addBindingProperty(const PropertyName &name) { - InternalProperty::Pointer newProperty(InternalBindingProperty::create(name, shared_from_this())); + auto newProperty = std::make_shared(name, shared_from_this()); m_namePropertyHash.insert(name, newProperty); } void InternalNode::addSignalHandlerProperty(const PropertyName &name) { - InternalProperty::Pointer newProperty( - InternalSignalHandlerProperty::create(name, shared_from_this())); + auto newProperty = std::make_shared(name, shared_from_this()); m_namePropertyHash.insert(name, newProperty); } void InternalNode::addSignalDeclarationProperty(const PropertyName &name) { - InternalProperty::Pointer newProperty( - InternalSignalDeclarationProperty::create(name, shared_from_this())); + auto newProperty = std::make_shared(name, shared_from_this()); m_namePropertyHash.insert(name, newProperty); } InternalNodeListProperty::Pointer InternalNode::nodeListProperty(const PropertyName &name) const { - InternalProperty::Pointer property = m_namePropertyHash.value(name); + auto property = m_namePropertyHash.value(name); if (property && property->isNodeListProperty()) - return property.staticCast(); + return std::static_pointer_cast(property); - return InternalNodeListProperty::Pointer(); + return {}; } InternalNodeAbstractProperty::Pointer InternalNode::nodeAbstractProperty(const PropertyName &name) const { InternalProperty::Pointer property = m_namePropertyHash.value(name); if (property && property->isNodeAbstractProperty()) - return property.staticCast(); + return std::static_pointer_cast(property); - return InternalNodeProperty::Pointer(); + return {}; } InternalNodeProperty::Pointer InternalNode::nodeProperty(const PropertyName &name) const { InternalProperty::Pointer property = m_namePropertyHash.value(name); if (property->isNodeProperty()) - return property.staticCast(); + return std::static_pointer_cast(property); - return InternalNodeProperty::Pointer(); + return {}; } void InternalNode::addVariantProperty(const PropertyName &name) { - InternalProperty::Pointer newProperty(InternalVariantProperty::create(name, shared_from_this())); + auto newProperty = std::make_shared(name, shared_from_this()); m_namePropertyHash.insert(name, newProperty); } void InternalNode::addNodeProperty(const PropertyName &name, const TypeName &dynamicTypeName) { - InternalNodeProperty::Pointer newProperty(InternalNodeProperty::create(name, shared_from_this())); + auto newProperty = std::make_shared(name, shared_from_this()); newProperty->setDynamicTypeName(dynamicTypeName); m_namePropertyHash.insert(name, newProperty); } void InternalNode::addNodeListProperty(const PropertyName &name) { - InternalProperty::Pointer newProperty(InternalNodeListProperty::create(name, shared_from_this())); + auto newProperty = std::make_shared(name, shared_from_this()); m_namePropertyHash.insert(name, newProperty); } void InternalNode::removeProperty(const PropertyName &name) { InternalProperty::Pointer property = m_namePropertyHash.take(name); - Q_ASSERT(!property.isNull()); + Q_ASSERT(property); } PropertyNameList InternalNode::propertyNameList() const diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index ddcb3c9cbb6..7af01f5ae99 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -34,7 +34,7 @@ class InternalProperty; class InternalNode; using InternalNodePointer = std::shared_ptr; -using InternalPropertyPointer = QSharedPointer; +using InternalPropertyPointer = std::shared_ptr; class InternalNode : public std::enable_shared_from_this { diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h index 7867025da9b..d3320c5487d 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h @@ -14,8 +14,8 @@ class InternalNodeAbstractProperty : public InternalProperty friend InternalNode; public: - using Pointer = QSharedPointer; - using WeakPointer = QWeakPointer; + using Pointer = std::shared_ptr; + using WeakPointer = std::weak_ptr; bool isNodeAbstractProperty() const override; diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp index e47b8588ccd..1889145751f 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp @@ -13,16 +13,6 @@ InternalNodeListProperty::InternalNodeListProperty(const PropertyName &name, con { } -InternalNodeListProperty::Pointer InternalNodeListProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) -{ - auto newPointer(new InternalNodeListProperty(name, propertyOwner)); - InternalProperty::Pointer smartPointer(newPointer); - - newPointer->setInternalWeakPointer(smartPointer.toWeakRef()); - - return smartPointer.staticCast(); -} - bool InternalNodeListProperty::isValid() const { return InternalProperty::isValid() && isNodeListProperty(); diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h index 7f4dced451b..8998f9c7ce7 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h @@ -14,9 +14,9 @@ namespace Internal { class InternalNodeListProperty final : public InternalNodeAbstractProperty { public: - using Pointer = QSharedPointer; + using Pointer = std::shared_ptr; - static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); + InternalNodeListProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); bool isValid() const override; @@ -54,7 +54,6 @@ public: QList::iterator end() { return m_nodeList.end(); } protected: - InternalNodeListProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); void add(const InternalNodePointer &node) override; void remove(const InternalNodePointer &node) override; diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp index 508a3d75db7..b5811325db5 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp @@ -12,16 +12,6 @@ InternalNodeProperty::InternalNodeProperty(const PropertyName &name, const Inter { } -InternalNodeProperty::Pointer InternalNodeProperty::create(const PropertyName &name, const InternalNode::Pointer &propertyOwner) -{ - auto newPointer = new InternalNodeProperty(name, propertyOwner); - InternalNodeProperty::Pointer smartPointer(newPointer); - - newPointer->setInternalWeakPointer(smartPointer); - - return smartPointer; -} - bool InternalNodeProperty::isEmpty() const { return !m_node; diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h index 905a3eccfe0..deb9ee08120 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h @@ -11,9 +11,9 @@ namespace Internal { class InternalNodeProperty : public InternalNodeAbstractProperty { public: - using Pointer = QSharedPointer; + using Pointer = std::shared_ptr; - static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); + InternalNodeProperty(const PropertyName &name, const InternalNodePointer &node); bool isValid() const override; bool isEmpty() const override; @@ -26,9 +26,7 @@ public: InternalNodePointer node() const; - protected: - InternalNodeProperty(const PropertyName &name, const InternalNodePointer &node); void add(const InternalNodePointer &node) override; void remove(const InternalNodePointer &node) override; diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp index 8b15b1f7777..b382f096c73 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp @@ -25,19 +25,6 @@ InternalProperty::InternalProperty(const PropertyName &name, const InternalNode: Q_ASSERT_X(!name.isEmpty(), Q_FUNC_INFO, "Name of property cannot be empty"); } -InternalProperty::Pointer InternalProperty::internalPointer() const -{ - Q_ASSERT(!m_internalPointer.isNull()); - return m_internalPointer.toStrongRef(); -} - -void InternalProperty::setInternalWeakPointer(const Pointer &pointer) -{ - Q_ASSERT(!pointer.isNull()); - m_internalPointer = pointer; -} - - bool InternalProperty::isValid() const { return !m_propertyOwner.expired() && !m_name.isEmpty(); @@ -58,10 +45,10 @@ bool InternalProperty::isVariantProperty() const return false; } -QSharedPointer InternalProperty::toBindingProperty() const +std::shared_ptr InternalProperty::toBindingProperty() { - Q_ASSERT(internalPointer().dynamicCast()); - return internalPointer().staticCast(); + Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); + return std::static_pointer_cast(shared_from_this()); } @@ -90,11 +77,11 @@ bool InternalProperty::isSignalDeclarationProperty() const return false; } -QSharedPointer InternalProperty::toVariantProperty() const +std::shared_ptr InternalProperty::toVariantProperty() { - Q_ASSERT(internalPointer().dynamicCast()); - return internalPointer().staticCast(); + Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); + return std::static_pointer_cast(shared_from_this()); } InternalNode::Pointer InternalProperty::propertyOwner() const @@ -102,34 +89,34 @@ InternalNode::Pointer InternalProperty::propertyOwner() const return m_propertyOwner.lock(); } -QSharedPointer InternalProperty::toNodeListProperty() const +std::shared_ptr InternalProperty::toNodeListProperty() { - Q_ASSERT(internalPointer().dynamicCast()); - return internalPointer().staticCast(); + Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); + return std::static_pointer_cast(shared_from_this()); } -QSharedPointer InternalProperty::toNodeProperty() const +std::shared_ptr InternalProperty::toNodeProperty() { - Q_ASSERT(internalPointer().dynamicCast()); - return internalPointer().staticCast(); + Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); + return std::static_pointer_cast(shared_from_this()); } -QSharedPointer InternalProperty::toNodeAbstractProperty() const +std::shared_ptr InternalProperty::toNodeAbstractProperty() { - Q_ASSERT(internalPointer().dynamicCast()); - return internalPointer().staticCast(); + Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); + return std::static_pointer_cast(shared_from_this()); } -QSharedPointer InternalProperty::toSignalHandlerProperty() const +std::shared_ptr InternalProperty::toSignalHandlerProperty() { - Q_ASSERT(internalPointer().dynamicCast()); - return internalPointer().staticCast(); + Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); + return std::static_pointer_cast(shared_from_this()); } -QSharedPointer InternalProperty::toSignalDeclarationProperty() const +std::shared_ptr InternalProperty::toSignalDeclarationProperty() { - Q_ASSERT(internalPointer().dynamicCast()); - return internalPointer().staticCast(); + Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); + return std::static_pointer_cast(shared_from_this()); } void InternalProperty::remove() diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.h b/src/plugins/qmldesigner/designercore/model/internalproperty.h index 2038fb40e53..cd9bad8847f 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.h @@ -25,10 +25,10 @@ class InternalNode; using InternalNodePointer = std::shared_ptr; -class QMLDESIGNERCORE_EXPORT InternalProperty +class QMLDESIGNERCORE_EXPORT InternalProperty : public std::enable_shared_from_this { public: - using Pointer = QSharedPointer; + using Pointer = std::shared_ptr; InternalProperty(); virtual ~InternalProperty(); @@ -45,13 +45,13 @@ public: virtual bool isSignalHandlerProperty() const; virtual bool isSignalDeclarationProperty() const; - QSharedPointer toBindingProperty() const; - QSharedPointer toVariantProperty() const; - QSharedPointer toNodeListProperty() const; - QSharedPointer toNodeProperty() const; - QSharedPointer toNodeAbstractProperty() const; - QSharedPointer toSignalHandlerProperty() const; - QSharedPointer toSignalDeclarationProperty() const; + std::shared_ptr toBindingProperty(); + std::shared_ptr toVariantProperty(); + std::shared_ptr toNodeListProperty(); + std::shared_ptr toNodeProperty(); + std::shared_ptr toNodeAbstractProperty(); + std::shared_ptr toSignalHandlerProperty(); + std::shared_ptr toSignalDeclarationProperty(); InternalNodePointer propertyOwner() const; @@ -63,11 +63,8 @@ public: protected: // functions InternalProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); - Pointer internalPointer() const; - void setInternalWeakPointer(const Pointer &pointer); void setDynamicTypeName(const TypeName &name); private: - QWeakPointer m_internalPointer; PropertyName m_name; TypeName m_dynamicType; std::weak_ptr m_propertyOwner; diff --git a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp index ef246229289..96bdda06e47 100644 --- a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp @@ -8,19 +8,7 @@ namespace Internal { InternalSignalHandlerProperty::InternalSignalHandlerProperty(const PropertyName &name, const InternalNodePointer &propertyOwner) : InternalProperty(name, propertyOwner) -{ -} - - -InternalSignalHandlerProperty::Pointer InternalSignalHandlerProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) -{ - auto newPointer(new InternalSignalHandlerProperty(name, propertyOwner)); - InternalSignalHandlerProperty::Pointer smartPointer(newPointer); - - newPointer->setInternalWeakPointer(smartPointer); - - return smartPointer; -} +{} bool InternalSignalHandlerProperty::isValid() const { @@ -41,18 +29,6 @@ bool InternalSignalHandlerProperty::isSignalHandlerProperty() const return true; } -InternalSignalDeclarationProperty::Pointer InternalSignalDeclarationProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) -{ - auto newPointer(new InternalSignalDeclarationProperty(name, propertyOwner)); - InternalSignalDeclarationProperty::Pointer smartPointer(newPointer); - - newPointer->setInternalWeakPointer(smartPointer); - - newPointer->setDynamicTypeName("signal"); - - return smartPointer; -} - bool InternalSignalDeclarationProperty::isValid() const { return InternalProperty::isValid() && isSignalDeclarationProperty(); @@ -76,6 +52,7 @@ bool InternalSignalDeclarationProperty::isSignalDeclarationProperty() const InternalSignalDeclarationProperty::InternalSignalDeclarationProperty(const PropertyName &name, const InternalNodePointer &propertyOwner) : InternalProperty(name, propertyOwner) { + setDynamicTypeName("signal"); } } // namespace Internal diff --git a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h index 5fbf665fc6f..f13df86e0d1 100644 --- a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h @@ -11,9 +11,9 @@ namespace Internal { class InternalSignalHandlerProperty : public InternalProperty { public: - using Pointer = QSharedPointer; + using Pointer = std::shared_ptr; - static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); + InternalSignalHandlerProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); bool isValid() const override; @@ -22,8 +22,6 @@ public: bool isSignalHandlerProperty() const override; -protected: - InternalSignalHandlerProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); private: QString m_source; @@ -32,9 +30,10 @@ private: class InternalSignalDeclarationProperty : public InternalProperty { public: - using Pointer = QSharedPointer; + using Pointer = std::shared_ptr; - static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); + InternalSignalDeclarationProperty(const PropertyName &name, + const InternalNodePointer &propertyOwner); bool isValid() const override; @@ -43,9 +42,6 @@ public: bool isSignalDeclarationProperty() const override; -protected: - InternalSignalDeclarationProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); - private: QString m_signature; }; diff --git a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp index 612a41e8b62..661da75630b 100644 --- a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp @@ -11,16 +11,6 @@ InternalVariantProperty::InternalVariantProperty(const PropertyName &name, const { } -InternalVariantProperty::Pointer InternalVariantProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) -{ - auto newPointer(new InternalVariantProperty(name, propertyOwner)); - InternalVariantProperty::Pointer smartPointer(newPointer); - - newPointer->setInternalWeakPointer(smartPointer); - - return smartPointer; -} - QVariant InternalVariantProperty::value() const { return m_value; diff --git a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h index 521009b834e..362c4bc87ca 100644 --- a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h @@ -11,9 +11,9 @@ namespace Internal { class InternalVariantProperty : public InternalProperty { public: - using Pointer = QSharedPointer; + using Pointer = std::shared_ptr; - static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); + InternalVariantProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); bool isValid() const override; @@ -24,8 +24,6 @@ public: bool isVariantProperty() const override; -protected: - InternalVariantProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); private: QVariant m_value; diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 844454ae55e..7f745bdd0b6 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -935,7 +935,7 @@ void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &node, if (!oldPropertyName.isEmpty() && oldParent->isValid) oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, m_model, view); - if (!newPropertyParent.isNull()) + if (newPropertyParent) newProperty = NodeAbstractProperty(newPropertyParent, m_model, view); ModelNode modelNode(node, m_model, view); @@ -956,7 +956,7 @@ void ModelPrivate::notifyNodeReparent(const InternalNodePointer &node, if (!oldPropertyName.isEmpty() && oldParent->isValid) oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, m_model, view); - if (!newPropertyParent.isNull()) + if (newPropertyParent) newProperty = NodeAbstractProperty(newPropertyParent, m_model, view); ModelNode modelNode(node, m_model, view); @@ -1250,7 +1250,7 @@ void ModelPrivate::reparentNode(const InternalNodePointer &parentNode, } InternalNodeAbstractPropertyPointer newParentProperty(parentNode->nodeAbstractProperty(name)); - Q_ASSERT(!newParentProperty.isNull()); + Q_ASSERT(newParentProperty); notifyNodeAboutToBeReparent(childNode, newParentProperty, oldParentNode, oldParentPropertyName, propertyChange); @@ -1305,7 +1305,7 @@ void ModelPrivate::setNodeSource(const InternalNodePointer &node, const QString void ModelPrivate::changeNodeOrder(const InternalNodePointer &parentNode, const PropertyName &listPropertyName, int from, int to) { InternalNodeListPropertyPointer nodeList(parentNode->nodeListProperty(listPropertyName)); - Q_ASSERT(!nodeList.isNull()); + Q_ASSERT(nodeList); nodeList->slide(from, to); const InternalNodePointer internalNode = nodeList->nodeList().at(to); diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index b802d703f25..3f2aa84d8df 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -42,13 +42,13 @@ class InternalNodeAbstractProperty; class InternalNodeListProperty; using InternalNodePointer = std::shared_ptr; -using InternalPropertyPointer = QSharedPointer; -using InternalBindingPropertyPointer = QSharedPointer; -using InternalSignalHandlerPropertyPointer = QSharedPointer; -using InternalSignalDeclarationPropertyPointer = QSharedPointer; -using InternalVariantPropertyPointer = QSharedPointer; -using InternalNodeAbstractPropertyPointer = QSharedPointer; -using InternalNodeListPropertyPointer = QSharedPointer; +using InternalPropertyPointer = std::shared_ptr; +using InternalBindingPropertyPointer = std::shared_ptr; +using InternalSignalHandlerPropertyPointer = std::shared_ptr; +using InternalSignalDeclarationPropertyPointer = std::shared_ptr; +using InternalVariantPropertyPointer = std::shared_ptr; +using InternalNodeAbstractPropertyPointer = std::shared_ptr; +using InternalNodeListPropertyPointer = std::shared_ptr; using PropertyPair = QPair; class ModelPrivate; diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 1a5237babf4..60411163e64 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -323,7 +323,7 @@ NodeAbstractProperty ModelNode::parentProperty() const if (!isValid()) return {}; - if (m_internalNode->parentProperty().isNull()) + if (!m_internalNode->parentProperty()) return {}; return NodeAbstractProperty(m_internalNode->parentProperty()->name(), m_internalNode->parentProperty()->propertyOwner(), m_model.data(), view()); @@ -387,7 +387,7 @@ bool ModelNode::hasParentProperty() const if (!isValid()) return false; - if (m_internalNode->parentProperty().isNull()) + if (!m_internalNode->parentProperty()) return false; return true; diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index 60b4e77dc6d..8ddc56cb086 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -78,8 +78,7 @@ void NodeAbstractProperty::reparentHere(const ModelNode &modelNode, bool isNode privateModel()->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); - Q_ASSERT(!oldParentProperty.isNull()); - + Q_ASSERT(oldParentProperty); } else { privateModel()->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); @@ -91,7 +90,7 @@ bool NodeAbstractProperty::isEmpty() const if (isValid()) { Internal::InternalNodeAbstractProperty::Pointer property = internalNode()->nodeAbstractProperty( name()); - if (property.isNull()) + if (!property) return true; else return property->isEmpty(); @@ -105,7 +104,7 @@ int NodeAbstractProperty::indexOf(const ModelNode &node) const if (isValid()) { Internal::InternalNodeAbstractProperty::Pointer property = internalNode()->nodeAbstractProperty( name()); - if (property.isNull()) + if (!property) return 0; return property->indexOf(node.internalNode()); @@ -119,7 +118,7 @@ NodeAbstractProperty NodeAbstractProperty::parentProperty() const if (!isValid()) return {}; - if (internalNode()->parentProperty().isNull()) + if (!internalNode()->parentProperty()) return {}; return NodeAbstractProperty(internalNode()->parentProperty()->name(), internalNode()->parentProperty()->propertyOwner(), model(), view()); @@ -128,7 +127,7 @@ NodeAbstractProperty NodeAbstractProperty::parentProperty() const int NodeAbstractProperty::count() const { Internal::InternalNodeAbstractProperty::Pointer property = internalNode()->nodeAbstractProperty(name()); - if (property.isNull()) + if (!property) return 0; else return property->count(); diff --git a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp index 5f36efc6185..af7405d340d 100644 --- a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp @@ -162,7 +162,7 @@ NodeListProperty::iterator NodeListProperty::rotate(NodeListProperty::iterator f privateModel()->notifyNodeOrderChanged(m_internalNodeListProperty); - return {iter - begin, internalNodeListProperty().data(), model(), view()}; + return {iter - begin, internalNodeListProperty().get(), model(), view()}; } void NodeListProperty::reverse(NodeListProperty::iterator first, NodeListProperty::iterator last) @@ -212,7 +212,7 @@ Internal::NodeListPropertyIterator NodeListProperty::end() Internal::NodeListPropertyIterator NodeListProperty::begin() const { - return {0, internalNodeListProperty().data(), model(), view()}; + return {0, internalNodeListProperty().get(), model(), view()}; } Internal::NodeListPropertyIterator NodeListProperty::end() const @@ -220,7 +220,7 @@ Internal::NodeListPropertyIterator NodeListProperty::end() const auto nodeListProperty = internalNodeListProperty(); auto size = nodeListProperty ? nodeListProperty->size() : 0; - return {size, nodeListProperty.data(), model(), view()}; + return {size, nodeListProperty.get(), model(), view()}; } } // namespace QmlDesigner From 093a8426508f045e7c011daae9767f10ccd0803e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 26 May 2023 16:13:46 +0200 Subject: [PATCH 012/149] QmlDesigner: Use internalId for comparison in ModeNode This fixes a crash because code (crumblebar) relies on the fact that two default constructed ModelNodes are the same. Change-Id: Ie2df707642366454ffbc5d0b4d9363a93c8ba60c Reviewed-by: Marco Bubke --- src/plugins/qmldesigner/designercore/include/modelnode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index bfc1570cb62..c693809cb62 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -253,7 +253,7 @@ public: friend bool operator==(const ModelNode &firstNode, const ModelNode &secondNode) { - return firstNode.m_internalNode == secondNode.m_internalNode; + return firstNode.internalId() == secondNode.internalId(); } friend bool operator!=(const ModelNode &firstNode, const ModelNode &secondNode) From ab1817c71ad693190ede3b0fc8c2304244ce7dd2 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 26 May 2023 16:24:11 +0200 Subject: [PATCH 013/149] QmlDesigner: Cleanup crumblebar Change-Id: Ib511f1ffb4827eda60ce4ac1a97103d74d4ce382 Reviewed-by: Tim Jenssen --- .../components/componentcore/crumblebar.cpp | 30 ++++++++++--------- .../components/componentcore/crumblebar.h | 1 + 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp index f4b6697c86b..005e353be25 100644 --- a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp +++ b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp @@ -73,10 +73,8 @@ void CrumbleBar::pushFile(const Utils::FilePath &fileName) } if (match != -1) { - for (int i = crumblePath()->length() - 1 - match; i > 0; --i) { - crumblePath()->popElement(); - m_pathes.removeLast(); - } + for (int i = crumblePath()->length() - 1 - match; i > 0; --i) + popElement(); } } @@ -163,6 +161,14 @@ bool CrumbleBar::showSaveDialog() return !canceled; } +void CrumbleBar::popElement() +{ + crumblePath()->popElement(); + + if (!m_pathes.isEmpty()) + m_pathes.removeLast(); +} + void CrumbleBar::onCrumblePathElementClicked(const QVariant &data) { CrumbleBarInfo clickedCrumbleBarInfo = data.value(); @@ -176,15 +182,12 @@ void CrumbleBar::onCrumblePathElementClicked(const QVariant &data) if (!inlineComp && !showSaveDialog()) return; - while (clickedCrumbleBarInfo != crumblePath()->dataForLastIndex().value()) { - crumblePath()->popElement(); - m_pathes.removeLast(); - } + while (clickedCrumbleBarInfo != crumblePath()->dataForLastIndex().value() + && crumblePath()->length() > 0) + popElement(); - if (crumblePath()->dataForLastIndex().value().modelNode.isValid()) { - crumblePath()->popElement(); - m_pathes.removeLast(); - } + if (crumblePath()->dataForLastIndex().value().modelNode.isValid()) + popElement(); m_isInternalCalled = true; if (inlineComp) { @@ -192,8 +195,7 @@ void CrumbleBar::onCrumblePathElementClicked(const QVariant &data) currentDesignDocument()->changeToDocumentModel(); QmlDesignerPlugin::instance()->viewManager().setComponentViewToMaster(); } else { - crumblePath()->popElement(); - m_pathes.removeLast(); + popElement(); nextFileIsCalledInternally(); Core::EditorManager::openEditor(clickedCrumbleBarInfo.fileName, Utils::Id(), diff --git a/src/plugins/qmldesigner/components/componentcore/crumblebar.h b/src/plugins/qmldesigner/components/componentcore/crumblebar.h index b9da4488f69..48e71efba6d 100644 --- a/src/plugins/qmldesigner/components/componentcore/crumblebar.h +++ b/src/plugins/qmldesigner/components/componentcore/crumblebar.h @@ -54,6 +54,7 @@ signals: private: void updateVisibility(); bool showSaveDialog(); + void popElement(); private: bool m_isInternalCalled = false; From 551be63c81631bdcd964fcaf312320dec98520a3 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 17 May 2023 09:19:11 +0200 Subject: [PATCH 014/149] QmlDesigner: Add environment variable to show QML errors By default we silently fail, if there are QML errors in the property editor. For testing this patch adds QMLDESIGNER_SHOW_QML_ERRORS, which will trigger a message box for QML errors. Task-number: QDS-9557 Change-Id: I81ffe142bd4b8695005f99a39c845ff0b96ab7d7 Reviewed-by: Aleksei German Reviewed-by: --- .../propertyeditorcontextobject.cpp | 9 +++++++- .../propertyeditorqmlbackend.cpp | 23 +++++++++++++++---- .../qmldesigner/qmldesignerconstants.h | 2 ++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index a8aebbfb073..108b1d5f563 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -408,7 +409,13 @@ QQmlComponent *PropertyEditorContextObject::specificQmlComponent() m_qmlComponent = new QQmlComponent(m_qmlContext->engine(), this); - m_qmlComponent->setData(m_specificQmlData.toUtf8(), QUrl::fromLocalFile(QStringLiteral("specfics.qml"))); + m_qmlComponent->setData(m_specificQmlData.toUtf8(), QUrl::fromLocalFile("specifics.qml")); + + const bool showError = qEnvironmentVariableIsSet(Constants::ENVIRONMENT_SHOW_QML_ERRORS); + if (showError && !m_specificQmlData.isEmpty() && !m_qmlComponent->errors().isEmpty()) { + const QString errMsg = m_qmlComponent->errors().constFirst().toString(); + Core::AsynchronousMessageBox::warning(tr("Invalid QML source"), errMsg); + } return m_qmlComponent; } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index 909530dbc3c..18ac064737c 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -372,23 +373,35 @@ void PropertyEditorQmlBackend::setExpression(const PropertyName &propName, const propertyValue->setExpression(exp); } -QQmlContext *PropertyEditorQmlBackend::context() { +QQmlContext *PropertyEditorQmlBackend::context() +{ return m_view->rootContext(); } -PropertyEditorContextObject* PropertyEditorQmlBackend::contextObject() { +PropertyEditorContextObject *PropertyEditorQmlBackend::contextObject() +{ return m_contextObject.data(); } -QQuickWidget *PropertyEditorQmlBackend::widget() { +QQuickWidget *PropertyEditorQmlBackend::widget() +{ return m_view; } -void PropertyEditorQmlBackend::setSource(const QUrl& url) { +void PropertyEditorQmlBackend::setSource(const QUrl &url) +{ m_view->setSource(url); + + const bool showError = qEnvironmentVariableIsSet(Constants::ENVIRONMENT_SHOW_QML_ERRORS); + + if (showError && !m_view->errors().isEmpty()) { + const QString errMsg = m_view->errors().constFirst().toString(); + Core::AsynchronousMessageBox::warning(PropertyEditorView::tr("Invalid QML source"), errMsg); + } } -Internal::QmlAnchorBindingProxy &PropertyEditorQmlBackend::backendAnchorBinding() { +Internal::QmlAnchorBindingProxy &PropertyEditorQmlBackend::backendAnchorBinding() +{ return m_backendAnchorBinding; } diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index d38dad74c7e..ac37559d5cc 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -162,6 +162,8 @@ const char OBJECT_NAME_NEW_DIALOG[] = "QQuickWidgetQDSNewDialog"; const char OBJECT_NAME_SPLASH_SCREEN[] = "QQuickWidgetSplashScreen"; const char OBJECT_NAME_WELCOME_PAGE[] = "QQuickWidgetQDSWelcomePage"; +const char ENVIRONMENT_SHOW_QML_ERRORS[] = "QMLDESIGNER_SHOW_QML_ERRORS"; + namespace Internal { enum { debug = 0 }; } From 15062522a38a75e0227b167606ab534e8dd22333 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 26 May 2023 12:28:32 +0200 Subject: [PATCH 015/149] QmlDesigner: Reduce the allocations by 50% Change-Id: I4ff7046a57626eb19bf4e0bfef4cc0522015123a Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designercore/model/modelnode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 60411163e64..5fcf918f11f 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -74,8 +74,8 @@ ModelNode::ModelNode(const ModelNode &modelNode, AbstractView *view) \return invalid node \see invalid */ -ModelNode::ModelNode(): - m_internalNode(new InternalNode) +ModelNode::ModelNode() + : m_internalNode(std::make_shared()) { } From 2981feefd718123dcbecbb3183e77fb1d3f29129 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 26 May 2023 22:39:02 +0200 Subject: [PATCH 016/149] Sqlite: Improve readCallback There are many callback which do not control the flow and want to be called for all steps. For that case we assume that a callback without a return value will continue always. Change-Id: I706123f2c425ac8c937d4d60ab977dae5ea9b030 Reviewed-by: Vikas Pachdha --- src/libs/sqlite/sqlitebasestatement.h | 18 ++++++++++++++++-- .../projectstorage/projectstorage.h | 19 ------------------- tests/unit/unittest/sqlitestatement-test.cpp | 12 ++++++++++++ 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index 1178b97f3a1..35db04e3ed1 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -496,16 +496,30 @@ private: return createValue(std::make_integer_sequence{}); } + template + CallbackControl invokeCallable(Callable &&callable, Arguments &&...arguments) + { + if constexpr (std::is_void_v>) { + std::invoke(std::forward(callable), std::forward(arguments)...); + return CallbackControl::Continue; + } else { + return std::invoke(std::forward(callable), + std::forward(arguments)...); + } + } + template CallbackControl callCallable(Callable &&callable, std::integer_sequence) { - return std::invoke(callable, ValueGetter(*this, ColumnIndices)...); + return invokeCallable(std::forward(callable), + ValueGetter(*this, ColumnIndices)...); } template CallbackControl callCallable(Callable &&callable) { - return callCallable(callable, std::make_integer_sequence{}); + return callCallable(std::forward(callable), + std::make_integer_sequence{}); } void setMaximumResultCount(std::size_t count) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index 974ebdf6aab..ae11e98f363 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -936,8 +936,6 @@ private: std::move(aliasPropertyNameTail)); updateAliasPropertyDeclarationToNullStatement.write(propertyDeclarationId); - - return Sqlite::CallbackControl::Continue; }; selectAliasPropertiesDeclarationForPropertiesWithTypeIdStatement.readCallback(callback, @@ -955,8 +953,6 @@ private: { auto callback = [&](TypeId typeId, ImportedTypeNameId prototypeNameId) { relinkablePrototypes.emplace_back(typeId, prototypeNameId); - - return Sqlite::CallbackControl::Continue; }; updatePrototypeIdToNullStatement.readCallback(callback, prototypeId); @@ -966,8 +962,6 @@ private: { auto callback = [&](TypeId typeId, ImportedTypeNameId extensionNameId) { relinkableExtensions.emplace_back(typeId, extensionNameId); - - return Sqlite::CallbackControl::Continue; }; updateExtensionIdToNullStatement.readCallback(callback, extensionId); @@ -1080,7 +1074,6 @@ private: relinkablePropertyDeclarations, relinkablePrototypes, relinkableExtensions); - return Sqlite::CallbackControl::Continue; }; selectNotUpdatedTypesInSourcesStatement.readCallback(callback, @@ -1566,8 +1559,6 @@ private: exportedImportKind, import.moduleId, moduleExportedImportId); - - return Sqlite::CallbackControl::Continue; }; selectModuleExportedImportsForModuleIdStatement.readCallback(callback, @@ -1964,8 +1955,6 @@ private: auto callback = [=](TypeId currentTypeId) { if (typeId == currentTypeId) throw PrototypeChainCycle{}; - - return Sqlite::CallbackControl::Continue; }; selectTypeIdsForPrototypeChainIdStatement.readCallback(callback, typeId); @@ -1976,8 +1965,6 @@ private: auto callback = [=](PropertyDeclarationId currentPropertyDeclarationId) { if (propertyDeclarationId == currentPropertyDeclarationId) throw AliasChainCycle{}; - - return Sqlite::CallbackControl::Continue; }; selectPropertyDeclarationIdsForAliasChainStatement.readCallback(callback, @@ -2209,8 +2196,6 @@ private: auto &functionDeclaration = functionDeclarations.emplace_back(name, returnType); functionDeclaration.parameters = selectFunctionParameterDeclarationsStatement.template values< Storage::Synchronization::ParameterDeclaration>(8, functionDeclarationId); - - return Sqlite::CallbackControl::Continue; }; selectFunctionDeclarationsForTypeIdWithoutSignatureStatement.readCallback(callback, typeId); @@ -2226,8 +2211,6 @@ private: auto &signalDeclaration = signalDeclarations.emplace_back(name); signalDeclaration.parameters = selectSignalParameterDeclarationsStatement.template values< Storage::Synchronization::ParameterDeclaration>(8, signalDeclarationId); - - return Sqlite::CallbackControl::Continue; }; selectSignalDeclarationsForTypeIdWithoutSignatureStatement.readCallback(callback, typeId); @@ -2245,8 +2228,6 @@ private: name, selectEnumeratorDeclarationStatement.template values< Storage::Synchronization::EnumeratorDeclaration>(8, enumerationDeclarationId)); - - return Sqlite::CallbackControl::Continue; }; selectEnumerationDeclarationsForTypeIdWithoutEnumeratorDeclarationsStatement diff --git a/tests/unit/unittest/sqlitestatement-test.cpp b/tests/unit/unittest/sqlitestatement-test.cpp index 84c2df61984..e50d28dd2b3 100644 --- a/tests/unit/unittest/sqlitestatement-test.cpp +++ b/tests/unit/unittest/sqlitestatement-test.cpp @@ -1443,6 +1443,18 @@ TEST_F(SqliteStatement, ReadCallback) statement.readCallback(callbackMock.AsStdFunction()); } +TEST_F(SqliteStatement, ReadCallbackWithoutControl) +{ + MockFunction callbackMock; + ReadStatement<2> statement("SELECT name, value FROM test", database); + + EXPECT_CALL(callbackMock, Call(Eq("bar"), Eq(1))); + EXPECT_CALL(callbackMock, Call(Eq("foo"), Eq(2))); + EXPECT_CALL(callbackMock, Call(Eq("poo"), Eq(3))); + + statement.readCallback(callbackMock.AsStdFunction()); +} + TEST_F(SqliteStatement, ReadCallbackCalledWithArguments) { MockFunction callbackMock; From 9773e523ced8410f20ffc17427983904fae5a028 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Sat, 27 May 2023 03:34:01 +0200 Subject: [PATCH 017/149] QmlDesigner: Fix flacky StorageCache tests A id with value zero is now invalid. So we offset the id value by minus one. We had to check if the id is valid before adding it too. Change-Id: I433772da0358ec48970313d89ea0b56e21f635e4 Reviewed-by: Reviewed-by: Tim Jenssen --- .../projectstorage/storagecache.h | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/storagecache.h b/src/plugins/qmldesigner/designercore/projectstorage/storagecache.h index 945a6e38e56..691a8a698a1 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/storagecache.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/storagecache.h @@ -47,12 +47,12 @@ class StorageCache template constexpr explicit StorageCacheIndex(IntegerType id) noexcept - : id{static_cast(id)} + : id{static_cast(id)} {} constexpr StorageCacheIndex operator=(std::ptrdiff_t newId) noexcept { - id = static_cast(newId); + id = static_cast(newId); return *this; } @@ -77,12 +77,15 @@ class StorageCache return first.id >= second.id; } - constexpr bool isValid() const noexcept { return id >= 0; } + constexpr bool isValid() const noexcept + { + return id != std::numeric_limits::max(); + } explicit operator std::size_t() const noexcept { return static_cast(id); } public: - int id = -1; + std::size_t id = std::numeric_limits::max(); }; public: @@ -149,7 +152,7 @@ public: }); if (found != m_entries.end()) - max_id = static_cast(found->id) + 1; + max_id = static_cast(found->id); m_indices.resize(max_id); @@ -184,7 +187,7 @@ public: return first.id < second.id; }); - auto max_id = static_cast(found->id) + 1; + auto max_id = static_cast(found->id); if (max_id > m_indices.size()) m_indices.resize(max_id); @@ -247,10 +250,11 @@ public: { std::shared_lock sharedLock(m_mutex); - if (IndexType::create(static_cast(m_indices.size())) > id) { - if (auto indirectionIndex = m_indices.at(static_cast(id)); - indirectionIndex.isValid()) + if (IndexType::create(static_cast(m_indices.size()) + 1) > id) { + if (StorageCacheIndex indirectionIndex = m_indices.at(static_cast(id) - 1); + indirectionIndex.isValid()) { return m_entries.at(static_cast(indirectionIndex)).value; + } } sharedLock.unlock(); @@ -271,7 +275,9 @@ public: for (IndexType id : ids) { values.emplace_back( - m_entries.at(static_cast(m_indices.at(static_cast(id)))).value); + m_entries + .at(static_cast(m_indices.at(static_cast(id) - 1))) + .value); } return values; } @@ -284,8 +290,10 @@ private: void updateIndices() { auto begin = m_entries.cbegin(); - for (auto current = begin; current != m_entries.cend(); ++current) - m_indices[static_cast(current->id)] = std::distance(begin, current); + for (auto current = begin; current != m_entries.cend(); ++current) { + if (current->id) + m_indices[static_cast(current->id) - 1] = std::distance(begin, current); + } } auto find(ViewType view) @@ -322,7 +330,7 @@ private: incrementLargerOrEqualIndicesByOne(newIndirectionIndex); - auto indirectionIndex = static_cast(id); + auto indirectionIndex = static_cast(id) - 1; ensureSize(indirectionIndex); m_indices.at(indirectionIndex) = newIndirectionIndex; From 8330d4463ac8fd174373e06ea2cd68c55ad4a3d8 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Sun, 21 May 2023 14:00:57 +0200 Subject: [PATCH 018/149] Sqlite: Fix that prepare is not checking that the database is locked The database has to be locked because otherwise it is not thread save. Because Sqlite connections are already called in different threads this has to be enforced. The easiest way to lock a database is to put it in a transaction. It should be ok without locking so long the connection is only called from one thread but I prefer to enforce it because I have already seen code was preparing a statement not on initialization stage where it is highly unlikely that there is more than one thread pre connection but in the middle of the code. Because preparing is much more expensive than a lock I prefer to enfore a lock here. Change-Id: Id0b47f8d615a6697bb807392cafbe976bdd37233 Reviewed-by: Vikas Pachdha Reviewed-by: --- src/libs/sqlite/sqlitebasestatement.cpp | 3 +++ .../designercore/imagecache/imagecachestorage.h | 9 ++------- .../designercore/projectstorage/projectstorage.h | 12 ++++++------ tests/unit/unittest/sqlitedatabase-test.cpp | 3 ++- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/libs/sqlite/sqlitebasestatement.cpp b/src/libs/sqlite/sqlitebasestatement.cpp index 91b417bea12..d9d677c3959 100644 --- a/src/libs/sqlite/sqlitebasestatement.cpp +++ b/src/libs/sqlite/sqlitebasestatement.cpp @@ -274,6 +274,9 @@ void BaseStatement::bind(int index, ValueView value) void BaseStatement::prepare(Utils::SmallStringView sqlStatement) { + if (!m_database.isLocked()) + throw DatabaseIsNotLocked{}; + int resultCode; do { diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h b/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h index 37131012d69..c5c7b61160b 100644 --- a/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h +++ b/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h @@ -30,6 +30,7 @@ public: : database(database) { transaction.commit(); + database.walCheckpointFull(); } ImageEntry fetchImage(Utils::SmallStringView name, Sqlite::TimeStamp minimumTimeStamp) const override @@ -157,16 +158,10 @@ private: Initializer(DatabaseType &database) { if (!database.isInitialized()) { - Sqlite::ExclusiveTransaction transaction{database}; - createImagesTable(database); database.setVersion(1); - transaction.commit(); - database.setIsInitialized(true); - - database.walCheckpointFull(); } else if (database.version() < 1) { updateTableToVersion1(database); } @@ -277,8 +272,8 @@ private: public: DatabaseType &database; + Sqlite::ExclusiveNonThrowingDestructorTransaction transaction{database}; Initializer initializer{database}; - Sqlite::ImmediateNonThrowingDestructorTransaction transaction{database}; mutable ReadStatement<1, 2> selectImageStatement{ "SELECT image FROM images WHERE name=?1 AND mtime >= ?2", database}; mutable ReadStatement<1, 2> selectMidSizeImageStatement{ diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index ae11e98f363..4288cd5cbb1 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -38,8 +38,13 @@ public: ProjectStorage(Database &database, bool isInitialized) : database{database} + , exclusiveTransaction{database} , initializer{database, isInitialized} { + exclusiveTransaction.commit(); + + database.walCheckpointFull(); + moduleCache.populate(); } @@ -2242,8 +2247,6 @@ private: Initializer(Database &database, bool isInitialized) { if (!isInitialized) { - Sqlite::ExclusiveTransaction transaction{database}; - auto moduleIdColumn = createModulesTable(database); createSourceContextsTable(database); createSourcesTable(database); @@ -2257,10 +2260,6 @@ private: createDocumentImportsTable(database, moduleIdColumn); createFileStatusesTable(database); createProjectDatasTable(database); - - transaction.commit(); - - database.walCheckpointFull(); } database.setIsInitialized(true); } @@ -2598,6 +2597,7 @@ private: public: Database &database; + Sqlite::ExclusiveNonThrowingDestructorTransaction exclusiveTransaction; Initializer initializer; mutable ModuleCache moduleCache{ModuleStorageAdapter{*this}}; Storage::Info::CommonTypeCache commonTypeCache_{*this}; diff --git a/tests/unit/unittest/sqlitedatabase-test.cpp b/tests/unit/unittest/sqlitedatabase-test.cpp index a7a8585db53..f5fe435b813 100644 --- a/tests/unit/unittest/sqlitedatabase-test.cpp +++ b/tests/unit/unittest/sqlitedatabase-test.cpp @@ -95,7 +95,8 @@ TEST_F(SqliteDatabase, CreateDatabaseWithLockingModeNormal) Sqlite::Database database{path, JournalMode::Wal, Sqlite::LockingMode::Normal}; - ASSERT_THAT(database.lockingMode(), Sqlite::LockingMode::Normal); + ASSERT_THAT(Sqlite::withImmediateTransaction(database, [&] { return database.lockingMode(); }), + Sqlite::LockingMode::Normal); } TEST_F(SqliteDatabase, ExclusivelyLockedDatabaseIsLockedForSecondConnection) From 84a0e154b8ed87e1019dc155f5d6f423e163d358 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 30 May 2023 14:25:58 +0200 Subject: [PATCH 019/149] QmlDesigner: Devirtualize QmlObjectNode The Qml*Node were never designed as a virtual interface but as handles. Change-Id: I238476d7e8f40e9fdd672917aee7f06d832ddfd3 Reviewed-by: Burak Hancerli Reviewed-by: Miikka Heikkinen --- .../materialeditorcontextobject.cpp | 13 +---- .../propertyeditorcontextobject.cpp | 5 +- .../propertyeditor/propertyeditorvalue.cpp | 9 ++-- .../propertyeditor/propertyeditorview.cpp | 49 ++++++++----------- .../textureeditorcontextobject.cpp | 11 +---- .../timelineeditor/timelinepropertyitem.cpp | 5 +- .../designercore/include/qml3dnode.h | 6 +-- .../designercore/include/qmlitemnode.h | 2 +- .../designercore/include/qmlmodelnodefacade.h | 8 ++- .../designercore/include/qmlobjectnode.h | 12 ++--- .../instances/nodeinstanceview.cpp | 8 +-- .../designercore/model/qml3dnode.cpp | 17 ++----- .../designercore/model/qmlitemnode.cpp | 2 +- .../designercore/model/qmlobjectnode.cpp | 26 ++++------ 14 files changed, 57 insertions(+), 116 deletions(-) diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp index a99d4133afc..4a4057d8ab3 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp @@ -510,18 +510,9 @@ QStringList MaterialEditorContextObject::allStatesForId(const QString &id) return {}; } -bool MaterialEditorContextObject::isBlocked(const QString &propName) const +bool MaterialEditorContextObject::isBlocked(const QString &) const { - if (!m_selectedMaterial.isValid()) - return false; - - if (!m_model || !m_model->rewriterView()) - return false; - - if (QmlObjectNode(m_selectedMaterial).isBlocked(propName.toUtf8())) - return true; - - return false; + return false; } void MaterialEditorContextObject::goIntoComponent() diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index 108b1d5f563..8c9b19d62ee 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -597,10 +598,8 @@ bool PropertyEditorContextObject::isBlocked(const QString &propName) const { if (m_model && m_model->rewriterView()) { const QList nodes = m_model->rewriterView()->selectedModelNodes(); - QScopedPointer objNode; for (const auto &node : nodes) { - objNode.reset(QmlObjectNode::getQmlObjectNodeOfCorrectType(node)); - if (objNode->isBlocked(propName.toUtf8())) + if (Qml3DNode qml3DNode{node}; qml3DNode.isBlocked(propName.toUtf8())) return true; } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index 6a9ce6164a1..89f8a77b0dc 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -623,16 +623,13 @@ void PropertyEditorNodeWrapper::changeValue(const QString &propertyName) if (name.isNull()) return; - if (m_modelNode.isValid()) { - QScopedPointer qmlObjectNode{ - QmlObjectNode::getQmlObjectNodeOfCorrectType(m_modelNode)}; - + if (auto qmlObjectNode = QmlObjectNode{m_modelNode}) { auto valueObject = qvariant_cast(m_valuesPropertyMap.value(QString::fromLatin1(name))); if (valueObject->value().isValid()) - qmlObjectNode->setVariantProperty(name, valueObject->value()); + qmlObjectNode.setVariantProperty(name, valueObject->value()); else - qmlObjectNode->removeProperty(name); + qmlObjectNode.removeProperty(name); } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index 5dff76453ac..1067247a5f2 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -248,7 +248,7 @@ void PropertyEditorView::changeExpression(const QString &propertyName) PropertyName underscoreName(name); underscoreName.replace('.', '_'); - QScopedPointer qmlObjectNode {QmlObjectNode::getQmlObjectNodeOfCorrectType(m_selectedNode)}; + QmlObjectNode qmlObjectNode{m_selectedNode}; PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(QString::fromLatin1(underscoreName)); if (!value) { @@ -256,46 +256,46 @@ void PropertyEditorView::changeExpression(const QString &propertyName) return; } - if (auto property = qmlObjectNode->modelNode().metaInfo().property(name)) { + if (auto property = qmlObjectNode.modelNode().metaInfo().property(name)) { const auto &propertType = property.propertyType(); if (propertType.isColor()) { if (QColor(value->expression().remove('"')).isValid()) { - qmlObjectNode->setVariantProperty(name, QColor(value->expression().remove('"'))); + qmlObjectNode.setVariantProperty(name, QColor(value->expression().remove('"'))); return; } } else if (propertType.isBool()) { if (isTrueFalseLiteral(value->expression())) { if (value->expression().compare("true", Qt::CaseInsensitive) == 0) - qmlObjectNode->setVariantProperty(name, true); + qmlObjectNode.setVariantProperty(name, true); else - qmlObjectNode->setVariantProperty(name, false); + qmlObjectNode.setVariantProperty(name, false); return; } } else if (propertType.isInteger()) { bool ok; int intValue = value->expression().toInt(&ok); if (ok) { - qmlObjectNode->setVariantProperty(name, intValue); + qmlObjectNode.setVariantProperty(name, intValue); return; } } else if (propertType.isFloat()) { bool ok; qreal realValue = value->expression().toDouble(&ok); if (ok) { - qmlObjectNode->setVariantProperty(name, realValue); + qmlObjectNode.setVariantProperty(name, realValue); return; } } else if (propertType.isVariant()) { bool ok; qreal realValue = value->expression().toDouble(&ok); if (ok) { - qmlObjectNode->setVariantProperty(name, realValue); + qmlObjectNode.setVariantProperty(name, realValue); return; } else if (isTrueFalseLiteral(value->expression())) { if (value->expression().compare("true", Qt::CaseInsensitive) == 0) - qmlObjectNode->setVariantProperty(name, true); + qmlObjectNode.setVariantProperty(name, true); else - qmlObjectNode->setVariantProperty(name, false); + qmlObjectNode.setVariantProperty(name, false); return; } } @@ -306,9 +306,9 @@ void PropertyEditorView::changeExpression(const QString &propertyName) return; } - if (qmlObjectNode->expression(name) != value->expression() - || !qmlObjectNode->propertyAffectedByCurrentState(name)) - qmlObjectNode->setBindingProperty(name, value->expression()); + if (qmlObjectNode.expression(name) != value->expression() + || !qmlObjectNode.propertyAffectedByCurrentState(name)) + qmlObjectNode.setBindingProperty(name, value->expression()); }); /* end of transaction */ } @@ -476,13 +476,10 @@ void PropertyEditorView::setupQmlBackend() m_stackedWidget->addWidget(currentQmlBackend->widget()); m_qmlBackendHash.insert(qmlFile.toString(), currentQmlBackend); - QScopedPointer qmlObjectNode; if (m_selectedNode.isValid()) { - qmlObjectNode.reset(QmlObjectNode::getQmlObjectNodeOfCorrectType(m_selectedNode)); - Q_ASSERT(qmlObjectNode->isValid()); - currentQmlBackend->setup(*qmlObjectNode, currentStateName, qmlSpecificsFile, this); - } else { - qmlObjectNode.reset(new QmlObjectNode); + QmlObjectNode qmlObjectNode{m_selectedNode}; + Q_ASSERT(qmlObjectNode.isValid()); + currentQmlBackend->setup(qmlObjectNode, currentStateName, qmlSpecificsFile, this); } if (specificQmlData.isEmpty()) @@ -491,15 +488,11 @@ void PropertyEditorView::setupQmlBackend() currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData); currentQmlBackend->setSource(qmlFile); } else { - QScopedPointer qmlObjectNode; - if (m_selectedNode.isValid()) - qmlObjectNode.reset(QmlObjectNode::getQmlObjectNodeOfCorrectType(m_selectedNode)); - else - qmlObjectNode.reset(new QmlObjectNode); + QmlObjectNode qmlObjectNode{m_selectedNode}; if (specificQmlData.isEmpty()) currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData); - currentQmlBackend->setup(*qmlObjectNode, currentStateName, qmlSpecificsFile, this); + currentQmlBackend->setup(qmlObjectNode, currentStateName, qmlSpecificsFile, this); currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData); } @@ -526,10 +519,8 @@ void PropertyEditorView::commitVariantValueToModel(const PropertyName &propertyN RewriterTransaction transaction = beginRewriterTransaction("PropertyEditorView::commitVariantValueToMode"); for (const ModelNode &node : m_selectedNode.view()->selectedModelNodes()) { - if (QmlObjectNode::isValidQmlObjectNode(node)) { - QScopedPointer{QmlObjectNode::getQmlObjectNodeOfCorrectType(node)} - ->setVariantProperty(propertyName, value); - } + if (auto qmlObjectNode = QmlObjectNode(node)) + qmlObjectNode.setVariantProperty(propertyName, value); } transaction.commit(); } diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorcontextobject.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorcontextobject.cpp index 1148e31e2ba..8d1b03bddd6 100644 --- a/src/plugins/qmldesigner/components/textureeditor/textureeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorcontextobject.cpp @@ -315,17 +315,8 @@ QStringList TextureEditorContextObject::allStatesForId(const QString &id) return {}; } -bool TextureEditorContextObject::isBlocked(const QString &propName) const +bool TextureEditorContextObject::isBlocked(const QString &) const { - if (!m_selectedTexture.isValid()) - return false; - - if (!m_model || !m_model->rewriterView()) - return false; - - if (QmlObjectNode(m_selectedTexture).isBlocked(propName.toUtf8())) - return true; - return false; } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp index 8c0a9c9d734..90e4a66acf4 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp @@ -335,9 +335,8 @@ void TimelinePropertyItem::changePropertyValue(const QVariant &value) QTimer::singleShot(0, deferredFunc); } else { - QScopedPointer objectNode { - QmlObjectNode::getQmlObjectNodeOfCorrectType(m_frames.target())}; - objectNode->setVariantProperty(m_frames.propertyName(), value); + if (auto qmlObjectNode = QmlObjectNode(m_frames.target())) + qmlObjectNode.setVariantProperty(m_frames.propertyName(), value); } } diff --git a/src/plugins/qmldesigner/designercore/include/qml3dnode.h b/src/plugins/qmldesigner/designercore/include/qml3dnode.h index 921a691a9be..280691c7a9f 100644 --- a/src/plugins/qmldesigner/designercore/include/qml3dnode.h +++ b/src/plugins/qmldesigner/designercore/include/qml3dnode.h @@ -30,10 +30,8 @@ public: static bool isValidQml3DNode(const ModelNode &modelNode); static bool isValidVisualRoot(const ModelNode &modelNode); - // From QmlObjectNode - void setVariantProperty(const PropertyName &name, const QVariant &value) override; - void setBindingProperty(const PropertyName &name, const QString &expression) override; - bool isBlocked(const PropertyName &propName) const override; + bool handleEulerRotation(const PropertyName &name); + bool isBlocked(const PropertyName &propName) const; friend auto qHash(const Qml3DNode &node) { return qHash(node.modelNode()); } diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index e5c552c42ca..5816d60ce1b 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -84,7 +84,7 @@ public: bool instanceHasAnchors() const; bool instanceHasShowContent() const; - bool instanceCanReparent() const override; + bool instanceCanReparent() const; bool instanceIsAnchoredBySibling() const; bool instanceIsAnchoredByChildren() const; bool instanceIsMovable() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h b/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h index b226c2e7111..0a81e00c904 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h +++ b/src/plugins/qmldesigner/designercore/include/qmlmodelnodefacade.h @@ -4,7 +4,9 @@ #pragma once #include + #include +#include namespace QmlDesigner { @@ -14,11 +16,6 @@ class NodeInstanceView; class QMLDESIGNERCORE_EXPORT QmlModelNodeFacade { public: - QmlModelNodeFacade(const QmlModelNodeFacade &) = default; - QmlModelNodeFacade &operator=(const QmlModelNodeFacade &) = default; - QmlModelNodeFacade(QmlModelNodeFacade &&) noexcept = default; - QmlModelNodeFacade &operator=(QmlModelNodeFacade &&) noexcept = default; - operator ModelNode() const { return m_modelNode; } ModelNode modelNode() const { return m_modelNode; } bool hasModelNode() const; @@ -29,6 +26,7 @@ public: AbstractView *view() const; Model *model() const; + NodeMetaInfo metaInfo() const { return m_modelNode.metaInfo(); } static const NodeInstanceView *nodeInstanceView(const ModelNode &modelNode); const NodeInstanceView *nodeInstanceView() const; bool isRootNode() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index ced57f67661..a4fa1ab8ed8 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -30,8 +30,6 @@ public: : QmlModelNodeFacade(modelNode) {} - virtual ~QmlObjectNode() = default; - static bool isValidQmlObjectNode(const ModelNode &modelNode); bool isValid() const; explicit operator bool() const { return isValid(); } @@ -53,8 +51,8 @@ public: QmlModelState currentState() const; QmlTimeline currentTimeline() const; - virtual void setVariantProperty(const PropertyName &name, const QVariant &value); - virtual void setBindingProperty(const PropertyName &name, const QString &expression); + void setVariantProperty(const PropertyName &name, const QVariant &value); + void setBindingProperty(const PropertyName &name, const QString &expression); NodeAbstractProperty nodeAbstractProperty(const PropertyName &name) const; NodeAbstractProperty defaultNodeAbstractProperty() const; NodeProperty nodeProperty(const PropertyName &name) const; @@ -77,7 +75,7 @@ public: bool timelineIsActive() const; QmlPropertyChanges propertyChangeForCurrentState() const; - virtual bool instanceCanReparent() const; + bool instanceCanReparent() const; bool isRootModelNode() const; @@ -115,10 +113,6 @@ public: QStringList allStateNames() const; - static QmlObjectNode *getQmlObjectNodeOfCorrectType(const ModelNode &modelNode); - - virtual bool isBlocked(const PropertyName &propName) const; - friend auto qHash(const QmlObjectNode &node) { return qHash(node.modelNode()); } QList allDefinedStates() const; QList allInvalidStateOperations() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index bd28ce2069e..32c5c2a807f 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -1463,10 +1463,10 @@ void NodeInstanceView::valuesModified(const ValuesModifiedCommand &command) if (hasInstanceForId(container.instanceId())) { NodeInstance instance = instanceForId(container.instanceId()); if (instance.isValid()) { - QScopedPointer node { - QmlObjectNode::getQmlObjectNodeOfCorrectType(instance.modelNode())}; - if (node->modelValue(container.name()) != container.value()) - node->setVariantProperty(container.name(), container.value()); + if (auto qmlObjectNode = QmlObjectNode(instance.modelNode())) { + if (qmlObjectNode.modelValue(container.name()) != container.value()) + qmlObjectNode.setVariantProperty(container.name(), container.value()); + } } } } diff --git a/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp b/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp index e8d3aa15569..4db2567e36d 100644 --- a/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp @@ -41,26 +41,15 @@ bool Qml3DNode::isValidVisualRoot(const ModelNode &modelNode) && (modelNode.metaInfo().isQtQuick3DNode() || modelNode.metaInfo().isQtQuick3DMaterial()); } -void Qml3DNode::setVariantProperty(const PropertyName &name, const QVariant &value) +bool Qml3DNode::handleEulerRotation(const PropertyName &name) { if (isBlocked(name)) - return; + return false; if (name.startsWith("eulerRotation")) handleEulerRotationSet(); - QmlObjectNode::setVariantProperty(name, value); -} - -void Qml3DNode::setBindingProperty(const PropertyName &name, const QString &expression) -{ - if (isBlocked(name)) - return; - - if (name.startsWith("eulerRotation")) - handleEulerRotationSet(); - - QmlObjectNode::setBindingProperty(name, expression); + return true; } bool Qml3DNode::isBlocked(const PropertyName &propName) const diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 6d79375b6d7..35e4ecea31a 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -309,7 +309,7 @@ bool QmlItemNode::instanceHasShowContent() const bool QmlItemNode::instanceCanReparent() const { - return QmlObjectNode::instanceCanReparent() && !anchors().instanceHasAnchors() && !instanceIsAnchoredBySibling(); + return isInBaseState() && !anchors().instanceHasAnchors() && !instanceIsAnchoredBySibling(); } bool QmlItemNode::instanceIsAnchoredBySibling() const diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 358375b6abc..39680be59ab 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -34,6 +34,9 @@ void QmlObjectNode::setVariantProperty(const PropertyName &name, const QVariant if (!isValid()) return; + if (metaInfo().isQtQuick3DNode() && !Qml3DNode(modelNode()).handleEulerRotation(name)) + return; + if (timelineIsActive() && currentTimeline().isRecording()) { modelNode().validId(); @@ -78,6 +81,9 @@ void QmlObjectNode::setBindingProperty(const PropertyName &name, const QString & if (!isValid()) return; + if (metaInfo().isQtQuick3DNode() && !Qml3DNode(modelNode()).handleEulerRotation(name)) + return; + if (isInBaseState()) { modelNode().bindingProperty(name).setExpression(expression); //basestate } else { @@ -295,7 +301,10 @@ bool QmlObjectNode::timelineIsActive() const bool QmlObjectNode::instanceCanReparent() const { - return isInBaseState(); + if (auto qmlItemNode = QmlItemNode{modelNode()}) + return qmlItemNode.instanceCanReparent(); + else + return isInBaseState(); } QmlPropertyChanges QmlObjectNode::propertyChangeForCurrentState() const @@ -837,19 +846,4 @@ QStringList QmlObjectNode::allStateNames() const return nodeInstance().allStateNames(); } -QmlObjectNode *QmlObjectNode::getQmlObjectNodeOfCorrectType(const ModelNode &modelNode) -{ - // Create QmlObjectNode of correct type for the modelNode - // Note: Currently we are only interested in differentiating 3D nodes, so no check for - // visual nodes is done for efficiency reasons - if (modelNode.isValid() && modelNode.metaInfo().isQtQuick3DNode()) - return new Qml3DNode(modelNode); - return new QmlObjectNode(modelNode); -} - -bool QmlObjectNode::isBlocked([[maybe_unused]] const PropertyName &propName) const -{ - return false; -} - } //QmlDesigner From b466af176f2cf53af2cc20d50c2e1145e8ade033 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 30 May 2023 15:55:17 +0200 Subject: [PATCH 020/149] Sqlite: Make statement moveable It is save to move a sqlite statement. Change-Id: I094e4221ed1d14f01bf202cff6840518efb52cb0 Reviewed-by: Aleksei German --- src/libs/sqlite/sqlitebasestatement.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index 35db04e3ed1..54d08260b7c 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -49,6 +49,7 @@ public: BaseStatement(const BaseStatement &) = delete; BaseStatement &operator=(const BaseStatement &) = delete; + BaseStatement(BaseStatement &&) = default; bool next() const; void step() const; @@ -146,6 +147,7 @@ class StatementImplementation : public BaseStatement public: using BaseStatement::BaseStatement; + StatementImplementation(StatementImplementation &&) = default; void execute() { From bf7f07605b7c1d6c292527f9f6382c5558a76577 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 26 May 2023 17:41:32 +0200 Subject: [PATCH 021/149] QmlDesigner: Fix regression when resetting '.' properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For '.' properties we have to replace '.' with '_'. In any case we have to set the instance value after the property was removed back to the default value. Task-number: QDS-9934 Change-Id: I0e52e40ccfdf976d53be90030c010cf131e9eca8 Reviewed-by: Reviewed-by: Henning Gründl Reviewed-by: Mahmoud Badri --- .../propertyeditor/propertyeditorview.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index 1067247a5f2..17471733ae5 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -636,9 +636,20 @@ void PropertyEditorView::propertiesRemoved(const QList &proper if (node == m_selectedNode || QmlObjectNode(m_selectedNode).propertyChangeForCurrentState() == node) { m_locked = true; - PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(QString::fromUtf8(property.name())); - if (value) + + PropertyName propertyName = property.name(); + propertyName.replace('.', '_'); + + PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName( + QString::fromUtf8(propertyName)); + + if (value) { value->resetValue(); + m_qmlBackEndForCurrentType + ->setValue(m_selectedNode, + property.name(), + QmlObjectNode(m_selectedNode).instanceValue(property.name())); + } m_locked = false; if (propertyIsAttachedLayoutProperty(property.name())) { From 504d24db30f31db9a18ad57d83f38fa186775d38 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 11 May 2023 20:07:48 +0200 Subject: [PATCH 022/149] QmlDesigner: Model resource management The model is now deleting and changing the dependencies by itself. That has the advantage of consistency. So if a node is now removed all the dependecies will be deleted changing in the same way. Task-number: QDS-9766 Change-Id: I1edf9ce172e51b9f52b62612ed2bb7386bf5b221 Reviewed-by: Thomas Hartmann Reviewed-by: --- src/libs/utils/set_algorithm.h | 59 +- src/plugins/qmldesigner/CMakeLists.txt | 2 + .../components/integration/designdocument.cpp | 10 +- .../designercore/include/abstractview.h | 7 +- .../designercore/include/bindingproperty.h | 8 +- .../qmldesigner/designercore/include/model.h | 9 +- .../designercore/include/modelfwd.h | 10 + .../designercore/model/abstractproperty.cpp | 7 +- .../designercore/model/abstractview.cpp | 15 +- .../designercore/model/bindingproperty.cpp | 25 +- .../qmldesigner/designercore/model/model.cpp | 80 +- .../qmldesigner/designercore/model/model_p.h | 5 +- .../designercore/model/modelnode.cpp | 4 +- .../model/modelresourcemanagement.cpp | 706 ++++++++++++++++++ .../model/modelresourcemanagement.h | 20 + .../model/modelresourcemanagementfwd.h | 27 + .../model/modelresourcemanagementinterface.h | 15 +- .../model/nodeabstractproperty.cpp | 4 +- .../designercore/model/qmlobjectnode.cpp | 136 ---- tests/unit/unittest/CMakeLists.txt | 2 + .../unit/unittest/google-using-declarations.h | 2 + .../unit/unittest/gtest-creator-printing.cpp | 13 + tests/unit/unittest/gtest-creator-printing.h | 4 + .../unittest/modelresourcemanagement-test.cpp | 441 +++++++++++ tests/unit/unittest/projectstoragemock.cpp | 69 +- tests/unit/unittest/projectstoragemock.h | 10 +- 26 files changed, 1484 insertions(+), 206 deletions(-) create mode 100644 src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp create mode 100644 src/plugins/qmldesigner/designercore/model/modelresourcemanagement.h create mode 100644 src/plugins/qmldesigner/designercore/model/modelresourcemanagementfwd.h create mode 100644 tests/unit/unittest/modelresourcemanagement-test.cpp diff --git a/src/libs/utils/set_algorithm.h b/src/libs/utils/set_algorithm.h index a3e442f736d..f6d3f73fedf 100644 --- a/src/libs/utils/set_algorithm.h +++ b/src/libs/utils/set_algorithm.h @@ -60,8 +60,17 @@ bool set_intersection_compare( ++first1; } else { if (!comp(*first2, *first1)) { - if (call(*first1++, *first2)) - return true; + if constexpr (std::is_void_v>) { + call(*first1, *first2); + ++first1; + } else { + auto success = call(*first1, *first2); + ++first1; + if (success) + return true; + } } ++first2; } @@ -70,6 +79,52 @@ bool set_intersection_compare( return false; } +template +bool set_greedy_intersection_compare( + InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, Callable call, Compare comp) +{ + while (first1 != last1 && first2 != last2) { + if (comp(*first1, *first2)) { + ++first1; + } else { + if (!comp(*first2, *first1)) { + if constexpr (std::is_void_v>) { + call(*first1, *first2); + ++first1; + } else { + auto success = call(*first1, *first2); + ++first1; + if (success) + return true; + } + } else { + ++first2; + } + } + } + + return false; +} + +template +constexpr OutputIt set_greedy_intersection( + InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt result) +{ + while (first1 != last1 && first2 != last2) + if (*first1 < *first2) + ++first1; + else if (*first2 < *first1) + ++first2; + else { + *result = *first1; + ++first1; + ++result; + } + return result; +} + template void set_greedy_difference( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, Callable call, Compare comp) diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 340cbd77a1a..94140aa0217 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -342,6 +342,8 @@ extend_qtc_library(QmlDesignerCore modelnodepositionrecalculator.h modelnodepositionstorage.cpp modelresourcemanagementinterface.h + modelresourcemanagementfwd.h + modelresourcemanagement.cpp modelresourcemanagement.h modeltotextmerger.cpp modeltotextmerger.h modelutils.cpp diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 9f58d654ed7..aec12e7ceec 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -62,7 +63,8 @@ namespace QmlDesigner { */ DesignDocument::DesignDocument(ProjectStorage &projectStorage, ExternalDependenciesInterface &externalDependencies) - : m_documentModel(Model::create("QtQuick.Item", 1, 0)) + : m_documentModel( + Model::create("QtQuick.Item", 1, 0, nullptr, std::make_unique())) , m_subComponentManager(new SubComponentManager(m_documentModel.get(), externalDependencies)) , m_rewriterView(new RewriterView(externalDependencies, RewriterView::Amend)) , m_documentLoaded(false) @@ -149,7 +151,11 @@ const AbstractView *DesignDocument::view() const ModelPointer DesignDocument::createInFileComponentModel() { - auto model = Model::create("QtQuick.Item", 1, 0); + auto model = Model::create("QtQuick.Item", + 1, + 0, + nullptr, + std::make_unique()); model->setFileUrl(m_documentModel->fileUrl()); model->setMetaInfo(m_documentModel->metaInfo()); diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 0c3df94030c..9035aba0fde 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -119,6 +119,7 @@ public: bool hasModelNodeForInternalId(qint32 internalId) const; QList allModelNodes() const; + QList allModelNodesUnordered() const; QList allModelNodesOfType(const NodeMetaInfo &typeName) const; void emitDocumentMessage(const QList &errors, const QList &warnings = {}); @@ -161,7 +162,8 @@ public: virtual void variantPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange); virtual void bindingPropertiesAboutToBeChanged(const QList &propertyList); - virtual void bindingPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange); + virtual void bindingPropertiesChanged(const QList &propertyList, + PropertyChangeFlags propertyChange); virtual void signalHandlerPropertiesChanged(const QVector &propertyList, PropertyChangeFlags propertyChange); virtual void signalDeclarationPropertiesChanged(const QVector &propertyList, @@ -304,5 +306,6 @@ private: }; QMLDESIGNERCORE_EXPORT QList toInternalNodeList(const QList &nodeList); -QMLDESIGNERCORE_EXPORT QList toModelNodeList(const QList &nodeList, AbstractView *view); +QMLDESIGNERCORE_EXPORT QList toModelNodeList( + const QList &nodeList, Model *model, AbstractView *view); } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/bindingproperty.h b/src/plugins/qmldesigner/designercore/include/bindingproperty.h index 904866f0410..3d6d32f9f8c 100644 --- a/src/plugins/qmldesigner/designercore/include/bindingproperty.h +++ b/src/plugins/qmldesigner/designercore/include/bindingproperty.h @@ -40,7 +40,13 @@ public: static QVariant convertToLiteral(const TypeName &typeName, const QString &expression); protected: - BindingProperty(const PropertyName &propertyName, const Internal::InternalNodePointer &internalNode, Model* model, AbstractView *view); + BindingProperty(const PropertyName &propertyName, + const Internal::InternalNodePointer &internalNode, + Model *model, + AbstractView *view); + +private: + ModelNode resolveBinding(const QString &binding, ModelNode currentNode) const; }; bool compareBindingProperties(const QmlDesigner::BindingProperty &bindingProperty01, const QmlDesigner::BindingProperty &bindingProperty02); diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index c2cd807a8a2..44deb4d6de5 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -101,6 +101,7 @@ public: bool hasNodeMetaInfo(const TypeName &typeName, int majorVersion = -1, int minorVersion = -1) const; void setMetaInfo(const MetaInfo &metaInfo); + NodeMetaInfo flowViewFlowActionAreaMetaInfo() const; NodeMetaInfo flowViewFlowDecisionMetaInfo() const; NodeMetaInfo flowViewFlowTransitionMetaInfo() const; NodeMetaInfo flowViewFlowWildcardMetaInfo() const; @@ -117,6 +118,7 @@ public: NodeMetaInfo qtQuickImageMetaInfo() const; NodeMetaInfo qtQuickItemMetaInfo() const; NodeMetaInfo qtQuickPropertyAnimationMetaInfo() const; + NodeMetaInfo qtQuickPropertyChangesMetaInfo() const; NodeMetaInfo qtQuickRectangleMetaInfo() const; NodeMetaInfo qtQuickStateGroupMetaInfo() const; NodeMetaInfo qtQuickTextEditMetaInfo() const; @@ -130,7 +132,12 @@ public: void attachView(AbstractView *view); void detachView(AbstractView *view, ViewNotification emitDetachNotify = NotifyView); - QList allModelNodes() const; + QList allModelNodesUnordered(); + ModelNode rootModelNode(); + + ModelNode modelNodeForId(const QString &id); + + ModelNode createModelNode(const TypeName &typeName); // Editing sub-components: diff --git a/src/plugins/qmldesigner/designercore/include/modelfwd.h b/src/plugins/qmldesigner/designercore/include/modelfwd.h index 66712499958..44154ce10b1 100644 --- a/src/plugins/qmldesigner/designercore/include/modelfwd.h +++ b/src/plugins/qmldesigner/designercore/include/modelfwd.h @@ -39,4 +39,14 @@ using ProjectStorageType = ProjectStorageInterface; using ProjectStorageType = ProjectStorage; #endif +enum class PropertyType { + None, + Variant, + Node, + NodeList, + Binding, + SignalHandler, + SignalDeclaration +}; + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index 32be06c3e6c..108dea7b038 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -29,7 +29,6 @@ AbstractProperty::AbstractProperty(const PropertyName &propertyName, const Inter m_model(model), m_view(view) { - Q_ASSERT(!m_model || m_view); Q_ASSERT_X(!m_propertyName.contains(' '), Q_FUNC_INFO, "a property name cannot contain a space"); } @@ -327,10 +326,11 @@ TypeName AbstractProperty::dynamicTypeName() const QDebug operator<<(QDebug debug, const AbstractProperty &property) { - return debug.nospace() << "AbstractProperty(" << (property.isValid() ? property.name() : PropertyName("invalid")) << ')'; + return debug.nospace() << "AbstractProperty(" + << (property.isValid() ? property.name() : PropertyName("invalid")) << ')'; } -QTextStream& operator<<(QTextStream &stream, const AbstractProperty &property) +QTextStream &operator<<(QTextStream &stream, const AbstractProperty &property) { stream << "AbstractProperty(" << property.name() << ')'; @@ -338,4 +338,3 @@ QTextStream& operator<<(QTextStream &stream, const AbstractProperty &property) } } // namespace QmlDesigner - diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 9967d49ee7b..881f43b658c 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -380,14 +380,16 @@ void AbstractView::dragEnded() {} QList AbstractView::toModelNodeList(const QList &nodeList) const { - return QmlDesigner::toModelNodeList(nodeList, const_cast(this)); + return QmlDesigner::toModelNodeList(nodeList, m_model, const_cast(this)); } -QList toModelNodeList(const QList &nodeList, AbstractView *view) +QList toModelNodeList(const QList &nodeList, + Model *model, + AbstractView *view) { QList newNodeList; for (const Internal::InternalNode::Pointer &node : nodeList) - newNodeList.append(ModelNode(node, view->model(), view)); + newNodeList.append(ModelNode(node, model, view)); return newNodeList; } @@ -623,7 +625,12 @@ void AbstractView::setEnabled(bool b) QList AbstractView::allModelNodes() const { QTC_ASSERT(model(), return {}); - return toModelNodeList(model()->d->allNodes()); + return toModelNodeList(model()->d->allNodesOrdered()); +} + +QList AbstractView::allModelNodesUnordered() const +{ + return toModelNodeList(model()->d->allNodesUnordered()); } QList AbstractView::allModelNodesOfType(const NodeMetaInfo &type) const diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index 45d4e4cf20e..fca657e57e1 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -7,6 +7,7 @@ #include "internalnode_p.h" #include "model.h" #include "model_p.h" + namespace QmlDesigner { bool compareBindingProperties(const QmlDesigner::BindingProperty &bindingProperty01, const QmlDesigner::BindingProperty &bindingProperty02) @@ -70,7 +71,7 @@ QString BindingProperty::expression() const return QString(); } -static ModelNode resolveBinding(const QString &binding, ModelNode currentNode, AbstractView* view) +ModelNode BindingProperty::resolveBinding(const QString &binding, ModelNode currentNode) const { int index = 0; QString element = binding.split(QLatin1Char('.')).at(0); @@ -85,13 +86,11 @@ static ModelNode resolveBinding(const QString &binding, ModelNode currentNode, A } else if (currentNode.hasProperty(element.toUtf8())) { if (currentNode.property(element.toUtf8()).isNodeProperty()) currentNode = currentNode.nodeProperty(element.toUtf8()).modelNode(); - else if (view->hasId(element)) - currentNode = view->modelNodeForId(element); //id else - return ModelNode(); //binding not valid + return ModelNode(privateModel()->nodeForId(element), model(), view()); } else { - currentNode = view->modelNodeForId(element); //id + currentNode = ModelNode(privateModel()->nodeForId(element), model(), view()); } index++; if (index < binding.split(QLatin1Char('.')).count()) @@ -111,7 +110,7 @@ ModelNode BindingProperty::resolveToModelNode() const if (!isValid()) return {}; - return resolveBinding(expression(), parentModelNode(), view()); + return resolveBinding(expression(), parentModelNode()); } static inline QStringList commaSeparatedSimplifiedStringList(const QString &string) @@ -136,7 +135,7 @@ AbstractProperty BindingProperty::resolveToProperty() const element = binding.split(QLatin1Char('.')).constLast(); QString nodeBinding = binding; nodeBinding.chop(element.length()); - node = resolveBinding(nodeBinding, parentModelNode(), view()); + node = resolveBinding(nodeBinding, parentModelNode()); } else { element = binding; } @@ -167,8 +166,8 @@ QList BindingProperty::resolveToModelNodeList() const string.remove(0, 1); const QStringList simplifiedList = commaSeparatedSimplifiedStringList(string); for (const QString &nodeId : simplifiedList) { - if (view()->hasId(nodeId)) - returnList.append(view()->modelNodeForId(nodeId)); + if (auto internalNode = privateModel()->nodeForId(nodeId)) + returnList.append(ModelNode{internalNode, model(), view()}); } } return returnList; @@ -262,11 +261,9 @@ bool BindingProperty::isAliasExport() const { if (!isValid()) return false; - return parentModelNode() == parentModelNode().view()->rootModelNode() - && isDynamic() - && dynamicTypeName() == "alias" - && name() == expression().toUtf8() - && parentModelNode().view()->modelNodeForId(expression()).isValid(); + return parentModelNode() == parentModelNode().model()->rootModelNode() && isDynamic() + && dynamicTypeName() == "alias" && name() == expression().toUtf8() + && parentModelNode().model()->modelNodeForId(expression()).isValid(); } static bool isTrueFalseLiteral(const QString &expression) diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 7f745bdd0b6..2166dbbff48 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -277,7 +277,7 @@ InternalNodePointer ModelPrivate::createNode(const TypeName &typeName, for (const auto &auxiliaryData : auxiliaryDatas) newNode->setAuxiliaryData(AuxiliaryDataKeyView{auxiliaryData.first}, auxiliaryData.second); - m_nodeSet.insert(newNode); + m_nodes.push_back(newNode); m_internalIdNodeHash.insert(newNode->internalId, newNode); if (!nodeSource.isNull()) @@ -303,7 +303,7 @@ void ModelPrivate::removeNodeFromModel(const InternalNodePointer &node) if (!node->id.isEmpty()) m_idNodeHash.remove(node->id); node->isValid = false; - m_nodeSet.remove(node); + m_nodes.removeOne(node); m_internalIdNodeHash.remove(node->internalId); } @@ -1376,8 +1376,7 @@ bool ModelPrivate::hasNodeForInternalId(qint32 internalId) const { return m_internalIdNodeHash.contains(internalId); } - -QList ModelPrivate::allNodes() const +QList ModelPrivate::allNodesOrdered() const { if (!m_rootInternalNode || !m_rootInternalNode->isValid) return {}; @@ -1388,10 +1387,14 @@ QList ModelPrivate::allNodes() const nodeList.append(m_rootInternalNode); nodeList.append(m_rootInternalNode->allSubNodes()); // FIXME: This is horribly expensive compared to a loop. - nodeList.append(Utils::toList(m_nodeSet - Utils::toSet(nodeList))); + nodeList.append(Utils::toList(Utils::toSet(m_nodes) - Utils::toSet(nodeList))); return nodeList; } +QList ModelPrivate::allNodesUnordered() const +{ + return m_nodes; +} bool ModelPrivate::isWriteLocked() const { @@ -1921,6 +1924,26 @@ NodeMetaInfo Model::qtQuickPropertyAnimationMetaInfo() const } } +NodeMetaInfo Model::qtQuickPropertyChangesMetaInfo() const +{ + if constexpr (useProjectStorage()) { + using namespace Storage::Info; + return createNodeMetaInfo(); + } else { + return metaInfo("QtQuick.PropertyChanges"); + } +} + +NodeMetaInfo Model::flowViewFlowActionAreaMetaInfo() const +{ + if constexpr (useProjectStorage()) { + using namespace Storage::Info; + return createNodeMetaInfo(); + } else { + return metaInfo("FlowView.FlowActionArea"); + } +} + NodeMetaInfo Model::flowViewFlowDecisionMetaInfo() const { if constexpr (useProjectStorage()) { @@ -2204,9 +2227,52 @@ void Model::detachView(AbstractView *view, ViewNotification emitDetachNotify) d->detachView(view, emitNotify); } -QList Model::allModelNodes() const +namespace { +QList toModelNodeList(const QList &nodeList, Model *model) { - return QmlDesigner::toModelNodeList(d->allNodes(), nullptr); + QList newNodeList; + for (const Internal::InternalNode::Pointer &node : nodeList) + newNodeList.append(ModelNode(node, model, nullptr)); + + return newNodeList; +} +} // namespace + +QList Model::allModelNodesUnordered() +{ + return toModelNodeList(d->allNodesUnordered(), this); +} + +ModelNode Model::rootModelNode() +{ + return ModelNode{d->rootNode(), this, nullptr}; +} + +ModelNode Model::modelNodeForId(const QString &id) +{ + return ModelNode(d->nodeForId(id), this, nullptr); +} +namespace { +ModelNode createNode(Model *model, + Internal::ModelPrivate *d, + const TypeName &typeName, + int majorVersion, + int minorVersion) +{ + return ModelNode(d->createNode(typeName, majorVersion, minorVersion, {}, {}, {}, {}, {}), + model, + nullptr); +} +} // namespace + +ModelNode Model::createModelNode(const TypeName &typeName) +{ + if constexpr (useProjectStorage()) { + return createNode(this, d.get(), typeName, -1, -1); + } else { + const NodeMetaInfo m = metaInfo(typeName); + return createNode(this, d.get(), typeName, m.majorVersion(), m.minorVersion()); + } } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 3f2aa84d8df..0a6cd273e2e 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -266,7 +266,8 @@ public: InternalNodePointer nodeForInternalId(qint32 internalId) const; bool hasNodeForInternalId(qint32 internalId) const; - QList allNodes() const; + QList allNodesUnordered() const; + QList allNodesOrdered() const; bool isWriteLocked() const; @@ -305,7 +306,7 @@ private: QList m_selectedInternalNodeList; QHash m_idNodeHash; QHash m_internalIdNodeHash; - QSet m_nodeSet; + QList m_nodes; InternalNodePointer m_currentStateNode; InternalNodePointer m_rootInternalNode; InternalNodePointer m_currentTimelineNode; diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 5fcf918f11f..824b362f45c 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -736,7 +736,7 @@ QList ModelNode::directSubModelNodes() const if (!isValid()) return {}; - return toModelNodeList(m_internalNode->allDirectSubNodes(), view()); + return toModelNodeList(m_internalNode->allDirectSubNodes(), model(), view()); } QList ModelNode::directSubModelNodesOfType(const NodeMetaInfo &type) const @@ -765,7 +765,7 @@ QList ModelNode::allSubModelNodes() const if (!isValid()) return {}; - return toModelNodeList(internalNode()->allSubNodes(), view()); + return toModelNodeList(internalNode()->allSubNodes(), model(), view()); } QList ModelNode::allSubModelNodesAndThisNode() const diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp new file mode 100644 index 00000000000..ca124f76536 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp @@ -0,0 +1,706 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "modelresourcemanagement.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include + +namespace QmlDesigner { + +namespace { + +enum class CheckRecursive { No, Yes }; + +class NodeActions; + +template +void forEachAction(NodeActions &nodeActions, ActionCall actionCall); + +struct Base +{ + Base(ModelResourceSet &resourceSet, NodeActions &nodeActions) + : resourceSet{resourceSet} + , nodeActions{nodeActions} + {} + + void removeNodes(QList newModelNodes, CheckRecursive checkRecursive) + { + if (newModelNodes.empty()) + return; + + auto oldModelNodes = removeNodes(newModelNodes); + + if (checkRecursive == CheckRecursive::Yes) + checkNewModelNodes(newModelNodes, oldModelNodes); + } + + void checkModelNodes(QList newModelNodes) + { + if (newModelNodes.empty()) + return; + + std::sort(newModelNodes.begin(), newModelNodes.end()); + + checkNewModelNodes(newModelNodes, resourceSet.removeModelNodes); + } + + void removeProperties(AbstractProperties newProperties, CheckRecursive checkRecursive) + { + if (newProperties.empty()) + return; + + auto oldProperties = removeProperties(newProperties); + + if (checkRecursive == CheckRecursive::Yes) + checkNewProperties(newProperties, oldProperties); + } + + void addSetExpressions(ModelResourceSet::SetExpressions newSetExpressions) + { + auto &setExpressions = resourceSet.setExpressions; + setExpressions.append(std::move(newSetExpressions)); + } + + void handleNodes(const ModelNodes &) {} + + void handleProperties(const AbstractProperties &) {} + + void finally() {} + +private: + ModelNodes removeNodes(ModelNodes &newModelNodes) + { + std::sort(newModelNodes.begin(), newModelNodes.end()); + + auto oldModelNodes = std::move(resourceSet.removeModelNodes); + resourceSet.removeModelNodes = {}; + resourceSet.removeModelNodes.reserve(oldModelNodes.size() + newModelNodes.size()); + + std::set_union(newModelNodes.begin(), + newModelNodes.end(), + oldModelNodes.begin(), + oldModelNodes.end(), + std::back_inserter(resourceSet.removeModelNodes)); + + return oldModelNodes; + } + + AbstractProperties removeProperties(AbstractProperties &newProperties) + { + std::sort(newProperties.begin(), newProperties.end()); + + auto oldProperties = std::move(resourceSet.removeProperties); + resourceSet.removeProperties = {}; + resourceSet.removeProperties.reserve(oldProperties.size() + newProperties.size()); + + std::set_union(newProperties.begin(), + newProperties.end(), + oldProperties.begin(), + oldProperties.end(), + std::back_inserter(resourceSet.removeProperties)); + + return oldProperties; + } + + void checkNewModelNodes(const QList &newModelNodes, + const QList &oldModelNodes) + { + ModelNodes addedModelNodes; + addedModelNodes.reserve(newModelNodes.size()); + + std::set_difference(newModelNodes.begin(), + newModelNodes.end(), + oldModelNodes.begin(), + oldModelNodes.end(), + std::back_inserter(addedModelNodes)); + + if (addedModelNodes.size()) + forEachAction(nodeActions, [&](auto &action) { action.handleNodes(addedModelNodes); }); + } + + void checkNewProperties(const AbstractProperties &newProperties, + const AbstractProperties &oldProperties) + { + AbstractProperties addedProperties; + addedProperties.reserve(newProperties.size()); + + std::set_difference(newProperties.begin(), + newProperties.end(), + oldProperties.begin(), + oldProperties.end(), + std::back_inserter(addedProperties)); + + if (addedProperties.size()) + forEachAction(nodeActions, + [&](auto &action) { action.handleProperties(addedProperties); }); + } + +private: + ModelResourceSet &resourceSet; + NodeActions &nodeActions; +}; + +struct CheckChildNodes : public Base +{ + using Base::Base; + + void handleNodes(const ModelNodes &nodes) + { + ModelNodes childNodes; + for (const ModelNode &node : nodes) + childNodes.append(node.directSubModelNodes()); + + checkModelNodes(childNodes); + } +}; + +struct CheckNodesInNodeAbstractProperties : public Base +{ + using Base::Base; + + ModelNodes collectNodes(const AbstractProperties &properties) + { + ModelNodes modelNodes; + + for (const AbstractProperty &property : properties) { + if (property.isNodeAbstractProperty()) + modelNodes.append(property.toNodeAbstractProperty().directSubNodes()); + } + + return modelNodes; + } + + void handleProperties(const AbstractProperties &properties) + { + checkModelNodes(collectNodes(properties)); + } +}; + +struct RemoveLayerEnabled : public Base +{ + using Base::Base; + + AbstractProperties collectProperties(const ModelNodes &nodes) + { + AbstractProperties properties; + + for (const ModelNode &node : nodes) { + if (node.parentProperty().name() == "layer.effect") { + auto layerEnabledProperty = node.parentProperty().parentModelNode().property( + "layer.enabled"); + if (layerEnabledProperty.exists()) + properties.push_back(layerEnabledProperty); + } + } + + return properties; + } + + void handleNodes(const ModelNodes &nodes) + { + removeProperties(collectProperties(nodes), CheckRecursive::No); + } +}; + +struct RemoveAliasExports : public Base +{ + RemoveAliasExports(ModelResourceSet &resourceSet, NodeActions &nodeActions, ModelNode rootNode) + : Base{resourceSet, nodeActions} + , rootNode{std::move(rootNode)} + {} + + AbstractProperties collectProperties(const ModelNodes &nodes) + { + AbstractProperties properties; + + for (const ModelNode &node : nodes) { + PropertyName propertyName = node.id().toUtf8(); + + if (rootNode.bindingProperty(propertyName).isAliasExport()) + properties.push_back(rootNode.property(propertyName)); + } + + return properties; + } + + void handleNodes(const ModelNodes &nodes) + { + removeProperties(collectProperties(nodes), CheckRecursive::Yes); + } + + ModelNode rootNode; +}; + +struct NodeDependency +{ + ModelNode target; + ModelNode source; + + friend bool operator<(const NodeDependency &first, const NodeDependency &second) + { + return std::tie(first.target, first.source) < std::tie(second.target, second.source); + } + + friend bool operator<(const NodeDependency &first, const ModelNode &second) + { + return first.target < second; + } + + friend bool operator<(const ModelNode &first, const NodeDependency &second) + { + return first < second.target; + } +}; + +using NodeDependencies = std::vector; + +struct NameNode +{ + QString name; + ModelNode node; + + friend bool operator<(const NameNode &first, const NameNode &second) + { + return first.name < second.name; + } +}; + +using NameNodes = std::vector; + +struct NodesProperty +{ + ModelNode source; + PropertyName name; + ModelNodes targets; + bool isChanged = false; + + friend bool operator<(const NodesProperty &first, const NodesProperty &second) + { + return first.source < second.source; + } +}; + +using NodesProperties = std::vector; + +struct RemoveDependencies : public Base +{ + RemoveDependencies(ModelResourceSet &resourceSet, + NodeActions &nodeActions, + NodeDependencies dependencies) + : Base{resourceSet, nodeActions} + , dependencies{std::move(dependencies)} + {} + + ModelNodes collectNodes(const ModelNodes &nodes) const + { + ModelNodes targetNodes; + ::Utils::set_greedy_intersection(dependencies.begin(), + dependencies.end(), + nodes.begin(), + nodes.end(), + ::Utils::make_iterator([&](const NodeDependency &dependency) { + targetNodes.push_back(dependency.source); + })); + + return targetNodes; + } + + void handleNodes(const ModelNodes &nodes) + { + removeNodes(collectNodes(nodes), CheckRecursive::No); + } + + NodeDependencies dependencies; +}; + +struct RemoveTargetsSources : public Base +{ + RemoveTargetsSources(ModelResourceSet &resourceSet, + NodeActions &nodeActions, + NodeDependencies dependencies, + NodesProperties nodesProperties) + : Base{resourceSet, nodeActions} + , dependencies{std::move(dependencies)} + , nodesProperties{std::move(nodesProperties)} + {} + + static void removeDependency(NodesProperties &removedTargetNodesInProperties, + const NodeDependency &dependency) + { + auto found = std::find_if(removedTargetNodesInProperties.begin(), + removedTargetNodesInProperties.end(), + [&](const auto &nodeProperty) { + return nodeProperty.source == dependency.source; + }); + + if (found == removedTargetNodesInProperties.end()) + removedTargetNodesInProperties.push_back({dependency.source, "", {dependency.target}}); + else + found->targets.push_back(dependency.target); + } + + NodesProperties collectRemovedDependencies(const ModelNodes &nodes) + { + NodesProperties removedTargetNodesInProperties; + + ModelNodes targetNodes; + ::Utils::set_greedy_intersection(dependencies.begin(), + dependencies.end(), + nodes.begin(), + nodes.end(), + ::Utils::make_iterator([&](const NodeDependency &dependency) { + removeDependency(removedTargetNodesInProperties, + dependency); + })); + + std::sort(removedTargetNodesInProperties.begin(), removedTargetNodesInProperties.end()); + + return removedTargetNodesInProperties; + } + + ModelNodes collectNodesToBeRemoved(const ModelNodes &nodes) + { + ModelNodes nodesToBeRemoved; + + auto removeTargets = [&](auto &first, auto &second) { + auto newEnd = std::remove_if(first.targets.begin(), + first.targets.end(), + [&](const ModelNode &node) { + return std::find(second.targets.begin(), + second.targets.end(), + node) + != second.targets.end(); + }); + if (newEnd != first.targets.end()) { + first.isChanged = true; + first.targets.erase(newEnd, first.targets.end()); + + if (first.targets.empty()) + nodesToBeRemoved.push_back(first.source); + } + }; + + NodesProperties removedTargetNodesInProperties = collectRemovedDependencies(nodes); + ::Utils::set_intersection_compare(nodesProperties.begin(), + nodesProperties.end(), + removedTargetNodesInProperties.begin(), + removedTargetNodesInProperties.end(), + removeTargets, + std::less{}); + + return nodesToBeRemoved; + } + + void handleNodes(const ModelNodes &nodes) + { + removeNodes(collectNodesToBeRemoved(nodes), CheckRecursive::No); + } + + QString createExpression(const NodesProperty &nodesProperty) + { + QString expression = "["; + const ModelNode &last = nodesProperty.targets.back(); + for (const ModelNode &node : nodesProperty.targets) { + expression += node.id(); + if (node != last) + expression += ", "; + } + expression += "]"; + + return expression; + } + + void finally() + { + ModelResourceSet::SetExpressions setExpressions; + + for (const NodesProperty &nodesProperty : nodesProperties) { + if (nodesProperty.isChanged && nodesProperty.targets.size()) { + setExpressions.push_back({nodesProperty.source.bindingProperty(nodesProperty.name), + createExpression(nodesProperty)}); + } + } + + addSetExpressions(std::move(setExpressions)); + } + + NodeDependencies dependencies; + NodesProperties nodesProperties; +}; + +struct DependenciesSet +{ + NodeDependencies nodeDependencies; + NodeDependencies targetsDependencies; + NodesProperties targetsNodesProperties; +}; + +template +struct TargetFilter +{ + TargetFilter(Predicate predicate, NodeDependencies &dependencies) + : predicate{std::move(predicate)} + , dependencies{dependencies} + {} + + static std::optional resolveTarget(const ModelNode &node) + { + auto targetProperty = node.bindingProperty("target"); + if (targetProperty.exists()) { + if (ModelNode targetNode = targetProperty.resolveToModelNode()) + return targetNode; + } + + return {}; + } + + void operator()(const NodeMetaInfo &metaInfo, const ModelNode &node) + { + if (predicate(metaInfo)) { + if (auto targetNode = resolveTarget(node)) + dependencies.push_back({std::move(*targetNode), node}); + } + } + + void finally() { std::sort(dependencies.begin(), dependencies.end()); } + + Predicate predicate; + NodeDependencies &dependencies; +}; + +template +struct TargetsFilter +{ + TargetsFilter(Predicate predicate, + NodeDependencies &dependencies, + NodesProperties &targetsNodesProperties) + : predicate{std::move(predicate)} + , dependencies{dependencies} + , targetsNodesProperties{targetsNodesProperties} + {} + + static ModelNodes resolveTargets(const ModelNode &node) + { + auto targetProperty = node.bindingProperty("targets"); + if (targetProperty.exists()) + return targetProperty.resolveToModelNodeList(); + + return {}; + } + + void operator()(const NodeMetaInfo &metaInfo, const ModelNode &node) + { + if (predicate(metaInfo)) { + const auto targetNodes = resolveTargets(node); + if (targetNodes.size()) { + targetsNodesProperties.push_back({node, "targets", targetNodes}); + for (auto &&targetNode : targetNodes) + dependencies.push_back({targetNode, node}); + } + } + } + + void finally() + { + std::sort(dependencies.begin(), dependencies.end()); + std::sort(targetsNodesProperties.begin(), targetsNodesProperties.end()); + } + + Predicate predicate; + NodeDependencies &dependencies; + NodesProperties &targetsNodesProperties; +}; + +void addDependency(NameNodes &dependencies, const ModelNode &node, const PropertyName &propertyName) +{ + if (auto property = node.variantProperty(propertyName); property.exists()) { + QString stateName = property.value().toString(); + if (stateName.size() && stateName != "*") + dependencies.push_back({stateName, node}); + } +} + +struct StateFilter +{ + StateFilter(NameNodes &dependencies) + : dependencies{dependencies} + {} + + void operator()(const NodeMetaInfo &metaInfo, const ModelNode &node) + { + if (metaInfo.isQtQuickState()) + addDependency(dependencies, node, "name"); + } + + void finally() { std::sort(dependencies.begin(), dependencies.end()); } + + NameNodes &dependencies; +}; + +struct TransitionFilter +{ + TransitionFilter(NodeDependencies &dependencies, NameNodes &stateNodes) + : stateNodes{stateNodes} + , dependencies{dependencies} + {} + + void operator()(const NodeMetaInfo &metaInfo, const ModelNode &node) + { + if (metaInfo.isQtQuickTransition()) { + addDependency(transitionNodes, node, "to"); + addDependency(transitionNodes, node, "from"); + } + } + + void finally() + { + std::sort(transitionNodes.begin(), transitionNodes.end()); + + auto removeTransition = [&](const auto &first, const auto &second) { + dependencies.push_back({second.node, first.node}); + }; + + ::Utils::set_greedy_intersection_compare(transitionNodes.begin(), + transitionNodes.end(), + stateNodes.begin(), + stateNodes.end(), + removeTransition, + std::less{}); + std::sort(dependencies.begin(), dependencies.end()); + } + + NameNodes transitionNodes; + NameNodes &stateNodes; + NodeDependencies &dependencies; +}; + +DependenciesSet createDependenciesSet(Model *model) +{ + const ModelNodes nodes = model->allModelNodesUnordered(); + + DependenciesSet set; + NameNodes stateNames; + + auto flowViewFlowActionAreaMetaInfo = model->flowViewFlowActionAreaMetaInfo(); + auto flowViewFlowDecisionMetaInfo = model->flowViewFlowDecisionMetaInfo(); + auto flowViewFlowWildcardMetaInfo = model->flowViewFlowWildcardMetaInfo(); + auto qtQuickPropertyChangesMetaInfo = model->qtQuickPropertyChangesMetaInfo(); + auto qtQuickTimelineKeyframeGroupMetaInfo = model->qtQuickTimelineKeyframeGroupMetaInfo(); + auto qtQuickPropertyAnimationMetaInfo = model->qtQuickPropertyAnimationMetaInfo(); + + auto filters = std::make_tuple( + TargetFilter{[&](auto &&metaInfo) { + return metaInfo.isBasedOn(qtQuickPropertyChangesMetaInfo, + qtQuickTimelineKeyframeGroupMetaInfo, + flowViewFlowActionAreaMetaInfo, + qtQuickPropertyAnimationMetaInfo); + }, + set.nodeDependencies}, + TargetsFilter{[&](auto &&metaInfo) { + return metaInfo.isBasedOn(flowViewFlowDecisionMetaInfo, + flowViewFlowWildcardMetaInfo, + qtQuickPropertyAnimationMetaInfo); + }, + set.targetsDependencies, + set.targetsNodesProperties}, + StateFilter{stateNames}, + TransitionFilter{set.nodeDependencies, stateNames}); + + for (const ModelNode &node : nodes) { + auto metaInfo = node.metaInfo(); + std::apply([&](auto &&...filter) { (filter(metaInfo, node), ...); }, filters); + } + + std::apply([&](auto &&...filter) { (filter.finally(), ...); }, filters); + + return set; +} + +using NodeActionsTuple = std::tuple; + +class NodeActions : public NodeActionsTuple +{ + NodeActions(const NodeActions &) = delete; + NodeActions &opertor(const NodeActions &) = delete; + NodeActions(NodeActions &&) = delete; + NodeActions &opertor(NodeActions &&) = delete; + + using NodeActionsTuple::NodeActionsTuple; +}; + +template +void forEachAction(NodeActions &nodeActions, ActionCall actionCall) +{ + std::apply([&](auto &...action) { (actionCall(action), ...); }, + static_cast(nodeActions)); +} + +} // namespace + +ModelResourceSet ModelResourceManagement::removeNode(const ModelNode &node) const +{ + ModelResourceSet resourceSet; + Model *model = node.model(); + + DependenciesSet set = createDependenciesSet(model); + + NodeActions nodeActions = {CheckChildNodes{resourceSet, nodeActions}, + CheckNodesInNodeAbstractProperties{resourceSet, nodeActions}, + RemoveLayerEnabled{resourceSet, nodeActions}, + RemoveAliasExports{resourceSet, nodeActions, model->rootModelNode()}, + RemoveDependencies{resourceSet, + nodeActions, + std::move(set.nodeDependencies)}, + RemoveTargetsSources{resourceSet, + nodeActions, + std::move(set.targetsDependencies), + std::move(set.targetsNodesProperties)}}; + + Base{resourceSet, nodeActions}.removeNodes({node}, CheckRecursive::Yes); + + forEachAction(nodeActions, [&](auto &action) { action.finally(); }); + + return resourceSet; +} + +ModelResourceSet ModelResourceManagement::removeProperty(const AbstractProperty &property) const +{ + ModelResourceSet resourceSet; + Model *model = property.model(); + + DependenciesSet set = createDependenciesSet(model); + + NodeActions nodeActions = {CheckChildNodes{resourceSet, nodeActions}, + CheckNodesInNodeAbstractProperties{resourceSet, nodeActions}, + RemoveLayerEnabled{resourceSet, nodeActions}, + RemoveAliasExports{resourceSet, nodeActions, model->rootModelNode()}, + RemoveDependencies{resourceSet, + nodeActions, + std::move(set.nodeDependencies)}, + RemoveTargetsSources{resourceSet, + nodeActions, + std::move(set.targetsDependencies), + std::move(set.targetsNodesProperties)}}; + + Base{resourceSet, nodeActions}.removeProperties({property}, CheckRecursive::Yes); + + forEachAction(nodeActions, [&](auto &action) { action.finally(); }); + + return resourceSet; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.h b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.h new file mode 100644 index 00000000000..0729409d534 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.h @@ -0,0 +1,20 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "modelresourcemanagementinterface.h" + +#include +#include + +namespace QmlDesigner { + +class ModelResourceManagement final : public ModelResourceManagementInterface +{ +public: + ModelResourceSet removeNode(const ModelNode &node) const; + ModelResourceSet removeProperty(const AbstractProperty &property) const; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagementfwd.h b/src/plugins/qmldesigner/designercore/model/modelresourcemanagementfwd.h new file mode 100644 index 00000000000..4031fdd9189 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagementfwd.h @@ -0,0 +1,27 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "../include/qmldesignercorelib_exports.h" + +#include + +namespace QmlDesigner { + +struct ModelResourceSet +{ + struct SetExpression + { + BindingProperty property; + QString expression; + }; + + using SetExpressions = QList; + + QList removeModelNodes; + QList removeProperties; + QList setExpressions; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagementinterface.h b/src/plugins/qmldesigner/designercore/model/modelresourcemanagementinterface.h index b2188132d6a..0f0d79c78b5 100644 --- a/src/plugins/qmldesigner/designercore/model/modelresourcemanagementinterface.h +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagementinterface.h @@ -5,23 +5,12 @@ #include +#include "modelresourcemanagementfwd.h" + #include namespace QmlDesigner { -struct ModelResourceSet -{ - struct SetExpression - { - BindingProperty property; - QString expression; - }; - - QList removeModelNodes; - QList removeProperties; - QList setExpressions; -}; - class QMLDESIGNERCORE_EXPORT ModelResourceManagementInterface { public: diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index 8ddc56cb086..f2d3bd16d10 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -140,7 +140,7 @@ QList NodeAbstractProperty::allSubNodes() return {}; Internal::InternalNodeAbstractProperty::Pointer property = internalNode()->nodeAbstractProperty(name()); - return QmlDesigner::toModelNodeList(property->allSubNodes(), view()); + return QmlDesigner::toModelNodeList(property->allSubNodes(), model(), view()); } QList NodeAbstractProperty::directSubNodes() const @@ -150,7 +150,7 @@ QList NodeAbstractProperty::directSubNodes() const return {}; Internal::InternalNodeAbstractProperty::Pointer property = internalNode()->nodeAbstractProperty(name()); - return QmlDesigner::toModelNodeList(property->directSubNodes(), view()); + return QmlDesigner::toModelNodeList(property->directSubNodes(), model(), view()); } /*! diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 39680be59ab..118d1c1acc6 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -321,102 +321,6 @@ QmlPropertyChanges QmlObjectNode::propertyChangeForCurrentState() const return currentState().propertyChanges(modelNode()); } -static void removeStateOperationsForChildren(const QmlObjectNode &node) -{ - if (node.isValid()) { - for (QmlModelStateOperation stateOperation : node.allAffectingStatesOperations()) { - stateOperation.modelNode().destroy(); //remove of belonging StatesOperations - } - - for (const QmlObjectNode childNode : node.modelNode().directSubModelNodes()) { - removeStateOperationsForChildren(childNode); - } - } -} - -static void removeAnimationsFromAnimation(const ModelNode &animation) -{ - QTC_ASSERT(animation.isValid(), return ); - - auto model = animation.model(); - const QList propertyAnimations = animation.subModelNodesOfType( - model->qtQuickPropertyAnimationMetaInfo()); - - for (const ModelNode &child : propertyAnimations) { - if (!child.hasBindingProperty("target")) { - ModelNode nonConst = animation; - nonConst.destroy(); - return; - } - } -} - -static void removeAnimationsFromTransition(const ModelNode &transition, const QmlObjectNode &node) -{ - QTC_ASSERT(node.isValid(), return); - QTC_ASSERT(transition.isValid(), return); - - const auto children = transition.directSubModelNodes(); - for (const ModelNode ¶llel : children) - removeAnimationsFromAnimation(parallel); -} - -static void removeDanglingAnimationsFromTransitions(const QmlObjectNode &node) -{ - QTC_ASSERT(node.isValid(), return); - - auto root = node.view()->rootModelNode(); - - if (root.isValid() && root.hasProperty("transitions")) { - NodeAbstractProperty transitions = root.nodeAbstractProperty("transitions"); - if (transitions.isValid()) { - const auto transitionNodes = transitions.directSubNodes(); - for (const auto &transition : transitionNodes) - removeAnimationsFromTransition(transition, node); - } - } -} - -static void removeAliasExports(const QmlObjectNode &node) -{ - - PropertyName propertyName = node.id().toUtf8(); - - ModelNode rootNode = node.view()->rootModelNode(); - bool hasAliasExport = !propertyName.isEmpty() - && rootNode.isValid() - && rootNode.hasBindingProperty(propertyName) - && rootNode.bindingProperty(propertyName).isAliasExport(); - - if (hasAliasExport) - rootNode.removeProperty(propertyName); - - - const QList nodes = node.modelNode().directSubModelNodes(); - for (const ModelNode &childNode : nodes) { - removeAliasExports(childNode); - } - -} - -static void removeLayerEnabled(const ModelNode &node) -{ - QTC_ASSERT(node.isValid(), return ); - if (node.parentProperty().isValid() && node.parentProperty().name() == "layer.effect") { - ModelNode parent = node.parentProperty().parentModelNode(); - if (parent.isValid() && parent.hasProperty("layer.enabled")) - parent.removeProperty("layer.enabled"); - } -} - -static void deleteAllReferencesToNodeAndChildren(const ModelNode &node) -{ - BindingProperty::deleteAllReferencesTo(node); - const auto subNodes = node.allSubModelNodes(); - for (const ModelNode &child : subNodes) - BindingProperty::deleteAllReferencesTo(child); -} - /*! Deletes this object's node and its dependencies from the model. Everything that belongs to this Object, the ModelNode, and ChangeOperations @@ -424,47 +328,7 @@ static void deleteAllReferencesToNodeAndChildren(const ModelNode &node) */ void QmlObjectNode::destroy() { - if (!isValid()) - return; - - removeLayerEnabled(modelNode()); - removeAliasExports(modelNode()); - - for (QmlModelStateOperation stateOperation : allAffectingStatesOperations()) { - stateOperation.modelNode().destroy(); //remove of belonging StatesOperations - } - - QVector timelineNodes; - const auto allNodes = view()->allModelNodes(); - for (const auto &timelineNode : allNodes) { - if (QmlTimeline::isValidQmlTimeline(timelineNode)) - timelineNodes.append(timelineNode); - } - - const auto subNodes = modelNode().allSubModelNodesAndThisNode(); - for (auto &timelineNode : std::as_const(timelineNodes)) { - QmlTimeline timeline(timelineNode); - for (const auto &subNode : subNodes) - timeline.destroyKeyframesForTarget(subNode); - } - - bool wasFlowEditorTarget = false; - if (QmlFlowTargetNode::isFlowEditorTarget(modelNode())) { - QmlFlowTargetNode(modelNode()).destroyTargets(); - wasFlowEditorTarget = true; - } - - removeStateOperationsForChildren(modelNode()); - deleteAllReferencesToNodeAndChildren(modelNode()); - - removeDanglingAnimationsFromTransitions(modelNode()); - - QmlFlowViewNode root(view()->rootModelNode()); - modelNode().destroy(); - - if (wasFlowEditorTarget && root.isValid()) - root.removeDanglingTransitions(); } void QmlObjectNode::ensureAliasExport() diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index 834c43ae3fd..2f0634b61cb 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -57,6 +57,7 @@ add_qtc_test(unittest GTEST lastchangedrowid-test.cpp import-test.cpp model-test.cpp + modelresourcemanagement-test.cpp modelresourcemanagementmock.h matchingtext-test.cpp mockfutureinterface.h @@ -262,6 +263,7 @@ extend_qtc_test(unittest model/model_p.h model/modelnode.cpp model/modelresourcemanagementinterface.h + model/modelresourcemanagement.cpp model/modelresourcemanagement.h model/propertycontainer.cpp model/propertyparser.cpp model/nodeabstractproperty.cpp diff --git a/tests/unit/unittest/google-using-declarations.h b/tests/unit/unittest/google-using-declarations.h index 198bbce7842..105b65714c7 100644 --- a/tests/unit/unittest/google-using-declarations.h +++ b/tests/unit/unittest/google-using-declarations.h @@ -31,6 +31,8 @@ using testing::HasSubstr; using testing::InSequence; using testing::Invoke; using testing::IsNull; +using testing::IsSubsetOf; +using testing::IsSupersetOf; using testing::Le; using testing::Lt; using testing::Matcher; diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/unittest/gtest-creator-printing.cpp index cd69504461b..667cef530db 100644 --- a/tests/unit/unittest/gtest-creator-printing.cpp +++ b/tests/unit/unittest/gtest-creator-printing.cpp @@ -512,6 +512,19 @@ std::ostream &operator<<(std::ostream &out, const VariantProperty &property) << property.value() << ")"; } +std::ostream &operator<<(std::ostream &out, const AbstractProperty &property) +{ + if (!property.isValid()) + return out << "(invalid)"; + + return out << "(" << property.parentModelNode() << ", " << property.name() << ")"; +} + +std::ostream &operator<<(std::ostream &out, const ModelResourceSet::SetExpression &setExpression) +{ + return out << "(" << setExpression.property << ", " << setExpression.expression << ")"; +} + namespace Cache { std::ostream &operator<<(std::ostream &out, const SourceContext &sourceContext) diff --git a/tests/unit/unittest/gtest-creator-printing.h b/tests/unit/unittest/gtest-creator-printing.h index f63cec1f287..13382972ae8 100644 --- a/tests/unit/unittest/gtest-creator-printing.h +++ b/tests/unit/unittest/gtest-creator-printing.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -116,6 +117,7 @@ std::ostream &operator<<(std::ostream &out, const Diagnostic &diag); namespace QmlDesigner { class ModelNode; class VariantProperty; +class AbstractProperty; class WatcherEntry; class IdPaths; class ProjectChunkId; @@ -125,12 +127,14 @@ class Import; std::ostream &operator<<(std::ostream &out, const ModelNode &node); std::ostream &operator<<(std::ostream &out, const VariantProperty &property); +std::ostream &operator<<(std::ostream &out, const AbstractProperty &property); std::ostream &operator<<(std::ostream &out, const WatcherEntry &entry); std::ostream &operator<<(std::ostream &out, const IdPaths &idPaths); std::ostream &operator<<(std::ostream &out, const ProjectChunkId &id); std::ostream &operator<<(std::ostream &out, SourceType sourceType); std::ostream &operator<<(std::ostream &out, const FileStatus &fileStatus); std::ostream &operator<<(std::ostream &out, const Import &import); +std::ostream &operator<<(std::ostream &out, const ModelResourceSet::SetExpression &setExpression); namespace Cache { class SourceContext; diff --git a/tests/unit/unittest/modelresourcemanagement-test.cpp b/tests/unit/unittest/modelresourcemanagement-test.cpp new file mode 100644 index 00000000000..2fba569c2b0 --- /dev/null +++ b/tests/unit/unittest/modelresourcemanagement-test.cpp @@ -0,0 +1,441 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "googletest.h" + +#include "mocklistmodeleditorview.h" +#include "modelresourcemanagementmock.h" +#include "projectstoragemock.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { +using QmlDesigner::AbstractProperty; +using QmlDesigner::ModelNode; +using QmlDesigner::ModelNodes; +using QmlDesigner::ModelResourceSet; + +template +auto SetExpressionProperty(const Matcher &matcher) +{ + return Field("property", &QmlDesigner::ModelResourceSet::SetExpression::property, matcher); +} + +template +auto SetExpressionExpression(const Matcher &matcher) +{ + return Field("expression", &QmlDesigner::ModelResourceSet::SetExpression::expression, matcher); +} + +template +auto SetExpression(const PropertyMatcher &propertyMatcher, const ExpressionMatcher &expressionMatcher) +{ + return AllOf(SetExpressionProperty(propertyMatcher), SetExpressionExpression(expressionMatcher)); +} + +class ModelResourceManagement : public testing::Test +{ +protected: + ModelResourceManagement() + { + model.attachView(&viewMock); + rootNode = model.rootModelNode(); + } + auto createNodeWithParent(const QmlDesigner::TypeName &typeName, + QmlDesigner::NodeAbstractProperty parentProperty, + const QString &id = {}) + { + auto node = model.createModelNode(typeName); + parentProperty.reparentHere(node); + if (id.size()) + node.setIdWithoutRefactoring(id); + + return node; + } + +protected: + NiceMock viewMock; + NiceMock projectStorageMock; + QmlDesigner::ModelResourceManagement management; + QmlDesigner::Model model{projectStorageMock, "QtQuick.Item"}; + ModelNode rootNode; +}; + +TEST_F(ModelResourceManagement, RemoveNode) +{ + auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); + layerEnabledProperty.setValue(true); + + auto resources = management.removeProperty(layerEnabledProperty); + + ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); +} + +TEST_F(ModelResourceManagement, RemoveProperty) +{ + auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); + + auto resources = management.removeNode(node); + + ASSERT_THAT(resources.removeModelNodes, Contains(node)); +} + +TEST_F(ModelResourceManagement, DontRemoveChildNodes) +{ + auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); + auto childNode = createNodeWithParent("QtQuick.Item", node.defaultNodeListProperty()); + + auto resources = management.removeNode(node); + + ASSERT_THAT(resources.removeModelNodes, Not(Contains(childNode))); +} + +TEST_F(ModelResourceManagement, RemovePropertyLayerEnabled) +{ + auto node = createNodeWithParent("QtQuick.Item", rootNode.nodeProperty("layer.effect")); + auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); + layerEnabledProperty.setValue(true); + + auto resources = management.removeNode(node); + + ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); +} + +TEST_F(ModelResourceManagement, RemovePropertyLayerEnabledIfLayerEffectPropertyIsRemoved) +{ + auto layerEffectProperty = rootNode.nodeProperty("layer.effect"); + auto node = createNodeWithParent("QtQuick.Item", layerEffectProperty); + auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); + layerEnabledProperty.setValue(true); + + auto resources = management.removeProperty(layerEffectProperty); + + ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); +} + +TEST_F(ModelResourceManagement, DontRemovePropertyLayerEnabledIfNotExists) +{ + auto node = createNodeWithParent("QtQuick.Item", rootNode.nodeProperty("layer.effect")); + auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); + + auto resources = management.removeNode(node); + + ASSERT_THAT(resources.removeProperties, Not(Contains(layerEnabledProperty))); +} + +TEST_F(ModelResourceManagement, RemoveAliasExportProperty) +{ + auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); + auto aliasExportProperty = rootNode.bindingProperty("foo"); + aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); +} + +TEST_F(ModelResourceManagement, RemoveAliasForChildExportProperty) +{ + auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); + auto fooNode = createNodeWithParent("QtQuick.Item", node.defaultNodeListProperty(), "foo"); + auto aliasExportProperty = rootNode.bindingProperty("foo"); + aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); + + auto resources = management.removeNode(node); + + ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); +} + +TEST_F(ModelResourceManagement, RemoveAliasForGrandChildExportProperty) +{ + auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); + auto childNode = createNodeWithParent("QtQuick.Item", node.defaultNodeListProperty()); + auto fooNode = createNodeWithParent("QtQuick.Item", childNode.defaultNodeListProperty(), "foo"); + auto aliasExportProperty = rootNode.bindingProperty("foo"); + aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); + + auto resources = management.removeNode(node); + + ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); +} + +TEST_F(ModelResourceManagement, DontRemoveNonAliasExportProperty) +{ + auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); + auto aliasExportProperty = rootNode.bindingProperty("foo"); + aliasExportProperty.setDynamicTypeNameAndExpression("int", "foo"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeProperties, Not(Contains(aliasExportProperty))); +} + +struct TargetData +{ + QmlDesigner::TypeName targetType; + QmlDesigner::TypeName type; + + // printer function for TargetData - don't remove + friend std::ostream &operator<<(std::ostream &os, const TargetData &data) + { + return os << "(" << data.targetType << ", " << data.type << ")"; + } +}; + +class ForTarget : public ModelResourceManagement, public testing::WithParamInterface +{ +protected: + TargetData parameters = GetParam(); + ModelNode fooNode = createNodeWithParent(parameters.targetType, + rootNode.defaultNodeListProperty(), + "foo"); + ModelNode barNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "bar"); + ModelNode source = createNodeWithParent(parameters.type, + rootNode.defaultNodeListProperty(), + "source1"); + ModelNode source2 = createNodeWithParent(parameters.type, + rootNode.defaultNodeListProperty(), + "source2"); + QmlDesigner::BindingProperty sourceTargetProperty = source.bindingProperty("target"); + QmlDesigner::BindingProperty source2TargetProperty = source2.bindingProperty("target"); +}; + +INSTANTIATE_TEST_SUITE_P(ModelResourceManagement, + ForTarget, + testing::Values(TargetData{"QtQuick.Item", "QtQuick.PropertyChanges"}, + TargetData{"QtQuick.Item", "QtQuick.Timeline.KeyframeGroup"}, + TargetData{"FlowView.FlowTransition", + "FlowView.FlowActionArea"}, + TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation"})); + +TEST_P(ForTarget, Remove) +{ + sourceTargetProperty.setExpression("foo"); + source2TargetProperty.setExpression("foo"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); +} + +TEST_P(ForTarget, DontRemoveForDifferentTarget) +{ + sourceTargetProperty.setExpression("bar"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); +} + +TEST_P(ForTarget, DontRemoveKeyIfTargetIsNotSet) +{ + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); +} + +TEST_P(ForTarget, DontRemoveIfTargetCannotBeResolved) +{ + sourceTargetProperty.setExpression("not_exists"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); +} + +class ForTargets : public ModelResourceManagement, public testing::WithParamInterface +{ +protected: + TargetData parameters = GetParam(); + ModelNode fooNode = createNodeWithParent(parameters.targetType, + rootNode.defaultNodeListProperty(), + "foo"); + ModelNode barNode = createNodeWithParent(parameters.targetType, + rootNode.defaultNodeListProperty(), + "bar"); + ModelNode yiNode = createNodeWithParent(parameters.targetType, + rootNode.defaultNodeListProperty(), + "yi"); + ModelNode erNode = createNodeWithParent(parameters.targetType, + rootNode.defaultNodeListProperty(), + "er"); + ModelNode sanNode = createNodeWithParent(parameters.targetType, + rootNode.defaultNodeListProperty(), + "san"); + ModelNode source = createNodeWithParent(parameters.type, + rootNode.defaultNodeListProperty(), + "source1"); + ModelNode source2 = createNodeWithParent(parameters.type, + rootNode.defaultNodeListProperty(), + "source2"); + QmlDesigner::BindingProperty sourceTargetsProperty = source.bindingProperty("targets"); + QmlDesigner::BindingProperty source2TargetsProperty = source2.bindingProperty("targets"); +}; + +INSTANTIATE_TEST_SUITE_P(ModelResourceManagement, + ForTargets, + testing::Values(TargetData{"FlowView.FlowTransition", "FlowView.FlowDecision"}, + TargetData{"FlowView.FlowTransition", "FlowView.FlowWildcard"}, + TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation"})); + +TEST_P(ForTargets, Remove) +{ + sourceTargetsProperty.setExpression("[foo]"); + source2TargetsProperty.setExpression("[foo]"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); +} + +TEST_P(ForTargets, HandleInvalidBinding) +{ + sourceTargetsProperty.setExpression("[foo, broken]"); + source2TargetsProperty.setExpression("[foo, fail]"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); +} + +TEST_P(ForTargets, RemoveIndirectly) +{ + auto parenNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "hoo"); + parenNode.defaultNodeListProperty().reparentHere(fooNode); + parenNode.defaultNodeListProperty().reparentHere(barNode); + sourceTargetsProperty.setExpression("[foo, bar]"); + source2TargetsProperty.setExpression("[bar, foo]"); + + auto resources = management.removeNode(parenNode); + + ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); +} + +TEST_P(ForTargets, DontRemoveTargetIfThereAreStillAnOtherTargets) +{ + sourceTargetsProperty.setExpression("[foo, bar]"); + source2TargetsProperty.setExpression("[foo, bar]"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, AllOf(Not(Contains(source)), Not(Contains(source2)))); +} + +TEST_P(ForTargets, ChangeExpressionIfThereAreStillAnOtherTargets) +{ + sourceTargetsProperty.setExpression("[foo, bar]"); + source2TargetsProperty.setExpression("[foo, bar]"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.setExpressions, + UnorderedElementsAre(SetExpression(sourceTargetsProperty, "[bar]"), + SetExpression(source2TargetsProperty, "[bar]"))); +} + +TEST_P(ForTargets, DontChangeOrderInExpression) +{ + sourceTargetsProperty.setExpression("[yi, foo, er, san]"); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.setExpressions, + UnorderedElementsAre(SetExpression(sourceTargetsProperty, "[yi, er, san]"))); +} + +struct StateData +{ + QmlDesigner::TypeName type; + QmlDesigner::PropertyName propertyName; + + // printer function for TargetData - don't remove + friend std::ostream &operator<<(std::ostream &os, const StateData &data) + { + return os << "(" << data.type << ", " << data.propertyName << ")"; + } +}; + +class ForState : public ModelResourceManagement, public testing::WithParamInterface +{ +protected: + ModelNode createStateWithParent(QmlDesigner::NodeAbstractProperty parentProperty, + const QString &name) + { + ModelNode stateNode = createNodeWithParent("QtQuick.State", parentProperty, name); + stateNode.variantProperty("name").setValue(name); + + return stateNode; + } + +protected: + StateData parameters = GetParam(); + ModelNode fooNode = createStateWithParent(rootNode.defaultNodeListProperty(), "foo"); + ModelNode barNode = createStateWithParent(rootNode.defaultNodeListProperty(), "bar"); + ModelNode yiNode = createStateWithParent(rootNode.defaultNodeListProperty(), "yi"); + ModelNode erNode = createStateWithParent(rootNode.defaultNodeListProperty(), "er"); + ModelNode sanNode = createStateWithParent(rootNode.defaultNodeListProperty(), "san"); + ModelNode source = createNodeWithParent(parameters.type, + rootNode.defaultNodeListProperty(), + "source1"); + ModelNode source2 = createNodeWithParent(parameters.type, + rootNode.defaultNodeListProperty(), + "source2"); + QmlDesigner::VariantProperty sourceStateProperty = source.variantProperty(parameters.propertyName); + QmlDesigner::VariantProperty source2StateProperty = source2.variantProperty( + parameters.propertyName); +}; + +INSTANTIATE_TEST_SUITE_P(ModelResourceManagement, + ForState, + testing::Values(StateData{"QtQuick.Transition", "from"}, + StateData{"QtQuick.Transition", "to"})); + +TEST_P(ForState, Remove) +{ + sourceStateProperty.setValue(QString{"foo"}); + source2StateProperty.setValue(QString{"foo"}); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); +} + +TEST_P(ForState, DontRemoveForStarState) +{ + fooNode.variantProperty("name").setValue("*"); + sourceStateProperty.setValue(QString{"*"}); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); +} + +TEST_P(ForState, DontRemoveForEmptyState) +{ + fooNode.variantProperty("name").setValue(""); + sourceStateProperty.setValue(QString{""}); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); +} + +TEST_P(ForState, DontRemoveForDifferentState) +{ + sourceStateProperty.setValue(QString{"foo"}); + source2StateProperty.setValue(QString{"bar"}); + + auto resources = management.removeNode(fooNode); + + ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source})); +} + +} // namespace diff --git a/tests/unit/unittest/projectstoragemock.cpp b/tests/unit/unittest/projectstoragemock.cpp index 8e4928377f4..e939c8984e8 100644 --- a/tests/unit/unittest/projectstoragemock.cpp +++ b/tests/unit/unittest/projectstoragemock.cpp @@ -22,25 +22,37 @@ ModuleId createModule(ProjectStorageMock &mock, Utils::SmallStringView moduleNam return moduleId; } +PropertyDeclarationId createProperty(ProjectStorageMock &mock, TypeId typeId, Utils::SmallString name) +{ + static PropertyDeclarationId propertyId; + incrementBasicId(propertyId); + + ON_CALL(mock, propertyDeclarationId(Eq(typeId), Eq(name))).WillByDefault(Return(propertyId)); + ON_CALL(mock, propertyName(Eq(propertyId))).WillByDefault(Return(name)); + + return propertyId; +} + TypeId createType(ProjectStorageMock &mock, ModuleId moduleId, Utils::SmallStringView typeName, Utils::SmallString defaultPropertyName, Storage::TypeTraits typeTraits, - TypeId baseTypeId = TypeId{}) + TypeIds baseTypeIds = {}) { static TypeId typeId; incrementBasicId(typeId); - static PropertyDeclarationId defaultPropertyId; - incrementBasicId(defaultPropertyId); - ON_CALL(mock, typeId(Eq(moduleId), Eq(typeName), _)).WillByDefault(Return(typeId)); + PropertyDeclarationId defaultPropertyDeclarationId; + if (defaultPropertyName.size()) + defaultPropertyDeclarationId = createProperty(mock, typeId, defaultPropertyName); ON_CALL(mock, type(Eq(typeId))) - .WillByDefault(Return(Storage::Info::Type{defaultPropertyId, typeTraits})); - ON_CALL(mock, propertyName(Eq(defaultPropertyId))).WillByDefault(Return(defaultPropertyName)); + .WillByDefault(Return(Storage::Info::Type{defaultPropertyDeclarationId, typeTraits})); - if (baseTypeId) + ON_CALL(mock, isBasedOn(Eq(typeId), Eq(typeId))).WillByDefault(Return(true)); + + for (TypeId baseTypeId : baseTypeIds) ON_CALL(mock, isBasedOn(Eq(typeId), Eq(baseTypeId))).WillByDefault(Return(true)); return typeId; @@ -50,11 +62,12 @@ TypeId createObject(ProjectStorageMock &mock, ModuleId moduleId, Utils::SmallStringView typeName, Utils::SmallString defaultPropertyName, - TypeId baseTypeId = TypeId{}) + TypeIds baseTypeIds = {}) { return createType( - mock, moduleId, typeName, defaultPropertyName, Storage::TypeTraits::Reference, baseTypeId); + mock, moduleId, typeName, defaultPropertyName, Storage::TypeTraits::Reference, baseTypeIds); } + void setupIsBasedOn(ProjectStorageMock &mock) { auto call = [&](TypeId typeId, auto... ids) -> bool { @@ -78,12 +91,42 @@ void ProjectStorageMock::setupQtQtuick() auto qmlModuleId = QmlDesigner::createModule(*this, "QML"); auto qtQmlModelsModuleId = QmlDesigner::createModule(*this, "QtQml.Models"); auto qtQuickModuleId = QmlDesigner::createModule(*this, "QtQuick"); + auto qtQuickNativeModuleId = QmlDesigner::createModule(*this, "QtQuick-cppnative"); auto qtObjectId = QmlDesigner::createObject(*this, qmlModuleId, "QtObject", "children"); - QmlDesigner::createObject(*this, qtQmlModelsModuleId, "ListModel", "children", qtObjectId); - QmlDesigner::createObject(*this, qtQmlModelsModuleId, "ListElement", "children", qtObjectId); + QmlDesigner::createObject(*this, qtQmlModelsModuleId, "ListModel", "children", {qtObjectId}); + QmlDesigner::createObject(*this, qtQmlModelsModuleId, "ListElement", "children", {qtObjectId}); - auto itemId = QmlDesigner::createObject(*this, qtQuickModuleId, "Item", "data", qtObjectId); - QmlDesigner::createObject(*this, qtQuickModuleId, "ListView", "data", itemId); + auto itemId = QmlDesigner::createObject(*this, qtQuickModuleId, "Item", "data", {qtObjectId}); + QmlDesigner::createObject(*this, qtQuickModuleId, "ListView", "data", {qtObjectId, itemId}); + QmlDesigner::createObject(*this, qtQuickModuleId, "StateGroup", "states", {qtObjectId}); + QmlDesigner::createObject(*this, qtQuickModuleId, "State", "changes", {qtObjectId}); + QmlDesigner::createObject(*this, qtQuickModuleId, "Transition", "animations", {qtObjectId}); + QmlDesigner::createObject(*this, qtQuickModuleId, "PropertyAnimation", "", {qtObjectId}); + auto stateOperationsId = QmlDesigner::createObject(*this, + qtQuickNativeModuleId, + " QQuickStateOperation", + "", + {qtObjectId}); + QmlDesigner::createObject(*this, + qtQuickModuleId, + "PropertyChanges", + "", + {qtObjectId, stateOperationsId}); + + auto qtQuickTimelineModuleId = QmlDesigner::createModule(*this, "QtQuick.Timeline"); + QmlDesigner::createObject(*this, qtQuickTimelineModuleId, "KeyframeGroup", "keyframes", {qtObjectId}); + QmlDesigner::createObject(*this, qtQuickTimelineModuleId, "Keyframe", "", {qtObjectId}); + + auto flowViewModuleId = QmlDesigner::createModule(*this, "FlowView"); + QmlDesigner::createObject(*this, flowViewModuleId, "FlowActionArea", "data", {qtObjectId, itemId}); + QmlDesigner::createObject(*this, flowViewModuleId, "FlowWildcard", "data", {qtObjectId}); + QmlDesigner::createObject(*this, flowViewModuleId, "FlowDecision", "", {qtObjectId}); + QmlDesigner::createObject(*this, flowViewModuleId, "FlowTransition", "", {qtObjectId}); +} + +void ProjectStorageMock::setupCommonTypeCache() +{ + ON_CALL(*this, commonTypeCache()).WillByDefault(ReturnRef(typeCache)); } diff --git a/tests/unit/unittest/projectstoragemock.h b/tests/unit/unittest/projectstoragemock.h index cb30521c959..67debddbd81 100644 --- a/tests/unit/unittest/projectstoragemock.h +++ b/tests/unit/unittest/projectstoragemock.h @@ -7,6 +7,7 @@ #include "sqlitedatabasemock.h" +#include #include #include #include @@ -15,6 +16,7 @@ class ProjectStorageMock : public QmlDesigner::ProjectStorageInterface { public: void setupQtQtuick(); + void setupCommonTypeCache(); MOCK_METHOD(void, synchronize, @@ -157,10 +159,16 @@ public: (QmlDesigner::SourceId sourceId)); MOCK_METHOD(std::vector, fetchAllSourceContexts, (), ()); MOCK_METHOD(std::vector, fetchAllSources, (), ()); + + QmlDesigner::Storage::Info::CommonTypeCache typeCache{*this}; }; class ProjectStorageMockWithQtQtuick : public ProjectStorageMock { public: - ProjectStorageMockWithQtQtuick() { setupQtQtuick(); } + ProjectStorageMockWithQtQtuick() + { + setupQtQtuick(); + setupCommonTypeCache(); + } }; From fbc4848f9656d7e1dda66d1fd5164da1074f2bd5 Mon Sep 17 00:00:00 2001 From: Burak Hancerli Date: Tue, 30 May 2023 17:05:26 +0200 Subject: [PATCH 023/149] QmlProject: Support QDS. prefix when reading This patch also includes a small update to skip creating 'shaderTool' object in the json container if it doesn't exist in the qmlproject file. Task-number: QDS-9969 Change-Id: I1b8639c5e0a57aa77cbd417b51d57c1f4910613a Reviewed-by: Reviewed-by: Thomas Hartmann --- .../buildsystem/projectitem/converters.cpp | 45 +-- .../buildsystem/projectitem/qmlprojectitem.h | 7 +- .../converter/test-set-2/testfile.jsontoqml | 5 - .../converter/test-set-2/testfile.qmltojson | 2 - .../getter-setter/with_qds_prefix.qmlproject | 96 +++++++ ...lproject => without_qds_prefix.qmlproject} | 6 +- .../qmlprojectmanager/projectitem-test.cpp | 260 ++++++++++++++---- 7 files changed, 338 insertions(+), 83 deletions(-) create mode 100644 tests/unit/unittest/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject rename tests/unit/unittest/qmlprojectmanager/data/getter-setter/{notEmpty.qmlproject => without_qds_prefix.qmlproject} (99%) diff --git a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp index bbe0a52c33b..98dd4cea983 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp @@ -10,7 +10,8 @@ namespace QmlProjectManager::Converters { using PropsPair = QPair; struct FileProps { - const PropsPair image{"image", QStringList{"*.jpeg", "*.jpg", "*.png", "*.svg", "*.hdr", ".ktx"}}; + const PropsPair image{"image", + QStringList{"*.jpeg", "*.jpg", "*.png", "*.svg", "*.hdr", ".ktx"}}; const PropsPair qml{"qml", QStringList{"*.qml"}}; const PropsPair qmlDir{"qmldir", QStringList{"qmldir"}}; const PropsPair javaScr{"javaScript", QStringList{"*.js", "*.ts"}}; @@ -153,10 +154,12 @@ QString jsonToQmlProject(const QJsonObject &rootObject) } { // append ShaderTool object - startObject("ShaderTool"); - appendString("args", shaderConfig["args"].toVariant().toStringList().join(" ")); - appendArray("files", shaderConfig["files"].toVariant().toStringList()); - endObject(); + if (!shaderConfig["args"].toVariant().toStringList().isEmpty()) { + startObject("ShaderTool"); + appendString("args", shaderConfig["args"].toVariant().toStringList().join(" ")); + appendArray("files", shaderConfig["files"].toVariant().toStringList()); + endObject(); + } } { // append files objects @@ -216,18 +219,22 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile) // convert the the non-object props for (const QString &propName : rootNode->propertyNames()) { QJsonObject *currentObj = &rootObject; - QString objKey = propName; + QString objKey = QString(propName).remove("QDS.", Qt::CaseInsensitive); QJsonValue value = rootNode->property(propName).value.toJsonValue(); - if (propName.contains("language", Qt::CaseInsensitive)) { + if (propName.startsWith("mcu.", Qt::CaseInsensitive)) { + currentObj = &mcuObject; + objKey = QString(propName).remove("MCU."); + } else if (propName.contains("language", Qt::CaseInsensitive)) { currentObj = &languageObject; - if (propName.toLower() == "multilanguagesupport") // fixing the camelcase + if (propName.contains("multilanguagesupport", Qt::CaseInsensitive)) + // fixing the camelcase objKey = "multiLanguageSupport"; } else if (propName.contains("version", Qt::CaseInsensitive)) { currentObj = &versionObject; - if (propName.toLower() == "qdsversion") + if (propName.contains("qdsversion", Qt::CaseInsensitive)) objKey = "designStudio"; - else if (propName.toLower() == "quickversion") + else if (propName.contains("quickversion", Qt::CaseInsensitive)) objKey = "qtQuick"; } else if (propName.contains("widgetapp", Qt::CaseInsensitive) || propName.contains("fileselector", Qt::CaseInsensitive) @@ -265,7 +272,8 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile) FileProps fileProps; const QString childNodeName = childNode->name().toLower(); const QmlJS::SimpleReaderNode::Property childNodeFilter = childNode->property("filter"); - const QmlJS::SimpleReaderNode::Property childNodeDirectory = childNode->property("directory"); + const QmlJS::SimpleReaderNode::Property childNodeDirectory = childNode->property( + "directory"); const QmlJS::SimpleReaderNode::Property childNodeFiles = childNode->property("files"); const QString childNodeFilterValue = childNodeFilter.value.toString(); @@ -304,12 +312,12 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile) // populate & update filters if (filters.isEmpty()) { - filters = QJsonArray::fromStringList(propsPair.second); // populate the filters with the predefined ones + filters = QJsonArray::fromStringList( + propsPair.second); // populate the filters with the predefined ones } if (childNodeFilter.isValid()) { // append filters from qmlproject (merge) - const QStringList filtersFromProjectFile = childNodeFilterValue.split( - ";"); + const QStringList filtersFromProjectFile = childNodeFilterValue.split(";"); for (const QString &filter : filtersFromProjectFile) { if (!filters.contains(QJsonValue(filter))) { filters.append(QJsonValue(filter)); @@ -337,7 +345,8 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile) targetObject.insert("files", files); fileGroupsObject.insert(propsPair.first, targetObject); } else if (childNode->name().contains("shadertool", Qt::CaseInsensitive)) { - QStringList quotedArgs = childNode->property("args").value.toString().split('\"', Qt::SkipEmptyParts); + QStringList quotedArgs + = childNode->property("args").value.toString().split('\"', Qt::SkipEmptyParts); QStringList args; for (int i = 0; i < quotedArgs.size(); ++i) { // Each odd arg in this list is a single quoted argument, which we should @@ -351,7 +360,8 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile) shaderToolObject.insert("args", QJsonArray::fromStringList(args)); shaderToolObject.insert("files", childNode->property("files").value.toJsonValue()); } else { - rootObject.insert(toCamelCase(childNode->name()), nodeToJsonObject(childNode)); + rootObject.insert(toCamelCase(childNode->name().remove("qds.", Qt::CaseInsensitive)), + nodeToJsonObject(childNode)); } } @@ -361,7 +371,8 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile) rootObject.insert("runConfig", runConfigObject); rootObject.insert("deployment", deploymentObject); rootObject.insert("mcuConfig", mcuObject); - rootObject.insert("shaderTool", shaderToolObject); + if (!shaderToolObject.isEmpty()) + rootObject.insert("shaderTool", shaderToolObject); rootObject.insert("fileVersion", 1); return rootObject; } diff --git a/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.h b/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.h index 83ef5ca0000..214614f5365 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.h +++ b/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.h @@ -7,11 +7,11 @@ #include +#include #include #include -#include #include -#include +#include #include #include @@ -30,7 +30,6 @@ public: bool isQt4McuProject() const; - QString versionQt() const; void setVersionQt(const QString &version); @@ -102,7 +101,7 @@ private: // runtime variables Utils::FilePath m_projectFile; // design studio project file - QJsonObject m_project; // root project object + QJsonObject m_project; // root project object const bool m_skipRewrite; // initializing functions diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml index c4cce639a23..a05b24e9e61 100644 --- a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml +++ b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml @@ -24,11 +24,6 @@ Project { QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" } - ShaderTool { - args: "" - files: [ ] - } - QmlFiles { directory: "." } diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson index 5635cf1f638..33a478e2ca4 100644 --- a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson +++ b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson @@ -83,8 +83,6 @@ ], "mainFile": "fileSelectors.qml" }, - "shaderTool": { - }, "versions": { "qt": "5" } diff --git a/tests/unit/unittest/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject b/tests/unit/unittest/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject new file mode 100644 index 00000000000..a8b5b459d65 --- /dev/null +++ b/tests/unit/unittest/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject @@ -0,0 +1,96 @@ +import QmlProject + +Project { + QDS.mainFile: "content/App.qml" + QDS.mainUiFile: "Screen01.ui.qml" + + QDS.qt6Project: true + QDS.widgetApp: true + QDS.qtForMCUs: true + QDS.forceFreeType: true + + QDS.importPaths: [ "imports", "asset_imports" ] + QDS.targetDirectory: "/opt/targetDirectory" + QDS.fileSelectors: [ "WXGA", "darkTheme", "ShowIndicator"] + + QDS.qdsVersion: "3.9" + QDS.quickVersion: "6.2" + + QDS.multilanguageSupport: true + QDS.supportedLanguages: ["en" , "fr"] + QDS.primaryLanguage: "en" + + QDS.QmlFiles { + directory: "content" + } + + QDS.QmlFiles { + directory: "imports" + } + + QDS.JavaScriptFiles { + directory: "content" + } + + QDS.JavaScriptFiles { + directory: "imports" + } + + QDS.ImageFiles { + directory: "content" + } + + QDS.Files { + filter: "*.conf" + files: ["qtquickcontrols2.conf"] + } + + QDS.Files { + filter: "qmldir" + directory: "." + } + + QDS.Files { + filter: "*.ttf;*.otf" + } + + QDS.Files { + filter: "*.wav;*.mp3" + } + + QDS.Files { + filter: "*.mp4" + } + + QDS.Files { + filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag" + } + + QDS.Files { + filter: "*.mesh" + directory: "asset_imports" + } + + QDS.Files { + filter: "*.mesh" + directory: "content" + } + + QDS.Files { + filter: "*.qml" + directory: "asset_imports" + } + + QDS.ImageFiles { + directory: "asset_imports" + } + + QDS.Environment { + QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" + } + + QDS.ShaderTool { + args: "-s --glsl \"100 es,120,150\" --hlsl 50 --msl 12" + files: [ "content/shaders/*" ] + } +} diff --git a/tests/unit/unittest/qmlprojectmanager/data/getter-setter/notEmpty.qmlproject b/tests/unit/unittest/qmlprojectmanager/data/getter-setter/without_qds_prefix.qmlproject similarity index 99% rename from tests/unit/unittest/qmlprojectmanager/data/getter-setter/notEmpty.qmlproject rename to tests/unit/unittest/qmlprojectmanager/data/getter-setter/without_qds_prefix.qmlproject index ae866ca3974..6bee5999555 100644 --- a/tests/unit/unittest/qmlprojectmanager/data/getter-setter/notEmpty.qmlproject +++ b/tests/unit/unittest/qmlprojectmanager/data/getter-setter/without_qds_prefix.qmlproject @@ -3,12 +3,12 @@ import QmlProject Project { mainFile: "content/App.qml" mainUiFile: "Screen01.ui.qml" - + qt6Project: true widgetApp: true qtForMCUs: true forceFreeType: true - + importPaths: [ "imports", "asset_imports" ] targetDirectory: "/opt/targetDirectory" fileSelectors: [ "WXGA", "darkTheme", "ShowIndicator"] @@ -19,7 +19,7 @@ Project { multilanguageSupport: true supportedLanguages: ["en" , "fr"] primaryLanguage: "en" - + QmlFiles { directory: "content" } diff --git a/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp b/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp index e76e905f33c..ea8dcdae707 100644 --- a/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp +++ b/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp @@ -1,8 +1,8 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" // IWYU pragma: keep #include "google-using-declarations.h" +#include "googletest.h" // IWYU pragma: keep #include @@ -19,28 +19,39 @@ protected: projectItemEmpty = std::make_unique( Utils::FilePath::fromString(localTestDataDir + "/getter-setter/empty.qmlproject"), true); - projectItemNotEmpty = std::make_unique( - Utils::FilePath::fromString(localTestDataDir + "/getter-setter/notEmpty.qmlproject"), + projectItemWithQdsPrefix = std::make_unique( + Utils::FilePath::fromString(localTestDataDir + + "/getter-setter/with_qds_prefix.qmlproject"), + true); + + projectItemWithoutQdsPrefix = std::make_unique( + Utils::FilePath::fromString(localTestDataDir + + "/getter-setter/without_qds_prefix.qmlproject"), true); projectItemFileFilters = std::make_unique( - Utils::FilePath::fromString(localTestDataDir + "/file-filters/MaterialBundle.qmlproject"), + Utils::FilePath::fromString(localTestDataDir + + "/file-filters/MaterialBundle.qmlproject"), true); } static void TearDownTestSuite() { projectItemEmpty.reset(); - projectItemNotEmpty.reset(); + projectItemWithQdsPrefix.reset(); + projectItemWithoutQdsPrefix.reset(); projectItemFileFilters.reset(); } protected: static inline std::unique_ptr projectItemEmpty; - static inline std::unique_ptr projectItemNotEmpty; - std::unique_ptr - projectItemSetters = std::make_unique( - Utils::FilePath::fromString(localTestDataDir + "/getter-setter/empty.qmlproject"), true); + static inline std::unique_ptr projectItemWithQdsPrefix; + static inline std::unique_ptr + projectItemWithoutQdsPrefix; + std::unique_ptr projectItemSetters = std::make_unique< + QmlProjectManager::QmlProjectItem>(Utils::FilePath::fromString( + localTestDataDir + "/getter-setter/empty.qmlproject"), + true); static inline std::unique_ptr projectItemFileFilters; }; @@ -51,111 +62,111 @@ auto createAbsoluteFilePaths(const QStringList &fileList) }); } -TEST_F(QmlProjectItem, GetNotEmptyMainFileProject) +TEST_F(QmlProjectItem, GetWithQdsPrefixMainFileProject) { - auto mainFile = projectItemNotEmpty->mainFile(); + auto mainFile = projectItemWithQdsPrefix->mainFile(); ASSERT_THAT(mainFile, Eq("content/App.qml")); } -TEST_F(QmlProjectItem, GetNotEmptyMainUIFileProject) +TEST_F(QmlProjectItem, GetWithQdsPrefixMainUIFileProject) { - auto mainUiFile = projectItemNotEmpty->mainUiFile(); + auto mainUiFile = projectItemWithQdsPrefix->mainUiFile(); ASSERT_THAT(mainUiFile, Eq("Screen01.ui.qml")); } -TEST_F(QmlProjectItem, GetNotEmptyMcuProject) +TEST_F(QmlProjectItem, GetWithQdsPrefixMcuProject) { - auto isMcuProject = projectItemNotEmpty->isQt4McuProject(); + auto isMcuProject = projectItemWithQdsPrefix->isQt4McuProject(); ASSERT_TRUE(isMcuProject); } -TEST_F(QmlProjectItem, GetNotEmptyQtVersion) +TEST_F(QmlProjectItem, GetWithQdsPrefixQtVersion) { - auto qtVersion = projectItemNotEmpty->versionQt(); + auto qtVersion = projectItemWithQdsPrefix->versionQt(); ASSERT_THAT(qtVersion, Eq("6")); } -TEST_F(QmlProjectItem, GetNotEmptyQtQuickVersion) +TEST_F(QmlProjectItem, GetWithQdsPrefixQtQuickVersion) { - auto qtQuickVersion = projectItemNotEmpty->versionQtQuick(); + auto qtQuickVersion = projectItemWithQdsPrefix->versionQtQuick(); ASSERT_THAT(qtQuickVersion, Eq("6.2")); } -TEST_F(QmlProjectItem, GetNotEmptyDesignStudioVersion) +TEST_F(QmlProjectItem, GetWithQdsPrefixDesignStudioVersion) { - auto designStudioVersion = projectItemNotEmpty->versionDesignStudio(); + auto designStudioVersion = projectItemWithQdsPrefix->versionDesignStudio(); ASSERT_THAT(designStudioVersion, Eq("3.9")); } -TEST_F(QmlProjectItem, GetNotEmptySourceDirectory) +TEST_F(QmlProjectItem, GetWithQdsPrefixSourceDirectory) { - auto sourceDirectory = projectItemNotEmpty->sourceDirectory().path(); + auto sourceDirectory = projectItemWithQdsPrefix->sourceDirectory().path(); auto expectedSourceDir = localTestDataDir + "/getter-setter"; ASSERT_THAT(sourceDirectory, Eq(expectedSourceDir)); } -TEST_F(QmlProjectItem, GetNotEmptyTarGetNotEmptyDirectory) +TEST_F(QmlProjectItem, GetWithQdsPrefixTarGetWithQdsPrefixDirectory) { - auto targetDirectory = projectItemNotEmpty->targetDirectory(); + auto targetDirectory = projectItemWithQdsPrefix->targetDirectory(); ASSERT_THAT(targetDirectory, Eq("/opt/targetDirectory")); } -TEST_F(QmlProjectItem, GetNotEmptyImportPaths) +TEST_F(QmlProjectItem, GetWithQdsPrefixImportPaths) { - auto importPaths = projectItemNotEmpty->importPaths(); + auto importPaths = projectItemWithQdsPrefix->importPaths(); ASSERT_THAT(importPaths, UnorderedElementsAre("imports", "asset_imports")); } -TEST_F(QmlProjectItem, GetNotEmptyFileSelectors) +TEST_F(QmlProjectItem, GetWithQdsPrefixFileSelectors) { - auto fileSelectors = projectItemNotEmpty->fileSelectors(); + auto fileSelectors = projectItemWithQdsPrefix->fileSelectors(); ASSERT_THAT(fileSelectors, UnorderedElementsAre("WXGA", "darkTheme", "ShowIndicator")); } -TEST_F(QmlProjectItem, GetNotEmptyMultiLanguageSupport) +TEST_F(QmlProjectItem, GetWithQdsPrefixMultiLanguageSupport) { - auto multilanguageSupport = projectItemNotEmpty->multilanguageSupport(); + auto multilanguageSupport = projectItemWithQdsPrefix->multilanguageSupport(); ASSERT_TRUE(multilanguageSupport); } -TEST_F(QmlProjectItem, GetNotEmptySupportedLanguages) +TEST_F(QmlProjectItem, GetWithQdsPrefixSupportedLanguages) { - auto supportedLanguages = projectItemNotEmpty->supportedLanguages(); + auto supportedLanguages = projectItemWithQdsPrefix->supportedLanguages(); ASSERT_THAT(supportedLanguages, UnorderedElementsAre("en", "fr")); } -TEST_F(QmlProjectItem, GetNotEmptyPrimaryLanguage) +TEST_F(QmlProjectItem, GetWithQdsPrefixPrimaryLanguage) { - auto primaryLanguage = projectItemNotEmpty->primaryLanguage(); + auto primaryLanguage = projectItemWithQdsPrefix->primaryLanguage(); ; ASSERT_THAT(primaryLanguage, Eq("en")); } -TEST_F(QmlProjectItem, GetNotEmptyWidgetApp) +TEST_F(QmlProjectItem, GetWithQdsPrefixWidgetApp) { - auto widgetApp = projectItemNotEmpty->widgetApp(); + auto widgetApp = projectItemWithQdsPrefix->widgetApp(); ASSERT_TRUE(widgetApp); } -TEST_F(QmlProjectItem, GetNotEmptyFileList) +TEST_F(QmlProjectItem, GetWithQdsPrefixFileList) { QStringList fileList; - for (const auto &file : projectItemNotEmpty->files()) { + for (const auto &file : projectItemWithQdsPrefix->files()) { fileList.append(file.path()); } @@ -164,33 +175,179 @@ TEST_F(QmlProjectItem, GetNotEmptyFileList) ASSERT_THAT(fileList, UnorderedElementsAre(expectedFileList)); } -TEST_F(QmlProjectItem, GetNotEmptyShaderToolArgs) +TEST_F(QmlProjectItem, GetWithQdsPrefixShaderToolArgs) { - auto shaderToolArgs = projectItemNotEmpty->shaderToolArgs(); + auto shaderToolArgs = projectItemWithQdsPrefix->shaderToolArgs(); - ASSERT_THAT(shaderToolArgs, - UnorderedElementsAre("-s", "--glsl", "\"100 es,120,150\"", "--hlsl", "50", "--msl", "12")); + ASSERT_THAT( + shaderToolArgs, + UnorderedElementsAre("-s", "--glsl", "\"100 es,120,150\"", "--hlsl", "50", "--msl", "12")); } -TEST_F(QmlProjectItem, GetNotEmptyShaderToolFiles) +TEST_F(QmlProjectItem, GetWithQdsPrefixShaderToolFiles) { - auto shaderToolFiles = projectItemNotEmpty->shaderToolFiles(); + auto shaderToolFiles = projectItemWithQdsPrefix->shaderToolFiles(); ASSERT_THAT(shaderToolFiles, UnorderedElementsAre("content/shaders/*")); } -TEST_F(QmlProjectItem, GetNotEmptyEnvironment) +TEST_F(QmlProjectItem, GetWithQdsPrefixEnvironment) { - auto env = projectItemNotEmpty->environment(); + auto env = projectItemWithQdsPrefix->environment(); ASSERT_THAT(env, UnorderedElementsAre( Utils::EnvironmentItem("QT_QUICK_CONTROLS_CONF", "qtquickcontrols2.conf"))); } -TEST_F(QmlProjectItem, GetNotEmptyForceFreeType) +TEST_F(QmlProjectItem, GetWithQdsPrefixForceFreeType) { - auto forceFreeType = projectItemNotEmpty->forceFreeType(); + auto forceFreeType = projectItemWithQdsPrefix->forceFreeType(); + + ASSERT_TRUE(forceFreeType); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixMainFileProject) +{ + auto mainFile = projectItemWithoutQdsPrefix->mainFile(); + + ASSERT_THAT(mainFile, Eq("content/App.qml")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixMainUIFileProject) +{ + auto mainUiFile = projectItemWithoutQdsPrefix->mainUiFile(); + + ASSERT_THAT(mainUiFile, Eq("Screen01.ui.qml")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixMcuProject) +{ + auto isMcuProject = projectItemWithoutQdsPrefix->isQt4McuProject(); + + ASSERT_TRUE(isMcuProject); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixQtVersion) +{ + auto qtVersion = projectItemWithoutQdsPrefix->versionQt(); + + ASSERT_THAT(qtVersion, Eq("6")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixQtQuickVersion) +{ + auto qtQuickVersion = projectItemWithoutQdsPrefix->versionQtQuick(); + + ASSERT_THAT(qtQuickVersion, Eq("6.2")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixDesignStudioVersion) +{ + auto designStudioVersion = projectItemWithoutQdsPrefix->versionDesignStudio(); + + ASSERT_THAT(designStudioVersion, Eq("3.9")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixSourceDirectory) +{ + auto sourceDirectory = projectItemWithoutQdsPrefix->sourceDirectory().path(); + + auto expectedSourceDir = localTestDataDir + "/getter-setter"; + + ASSERT_THAT(sourceDirectory, Eq(expectedSourceDir)); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixTarGetWithoutQdsPrefixDirectory) +{ + auto targetDirectory = projectItemWithoutQdsPrefix->targetDirectory(); + + ASSERT_THAT(targetDirectory, Eq("/opt/targetDirectory")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixImportPaths) +{ + auto importPaths = projectItemWithoutQdsPrefix->importPaths(); + + ASSERT_THAT(importPaths, UnorderedElementsAre("imports", "asset_imports")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixFileSelectors) +{ + auto fileSelectors = projectItemWithoutQdsPrefix->fileSelectors(); + + ASSERT_THAT(fileSelectors, UnorderedElementsAre("WXGA", "darkTheme", "ShowIndicator")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixMultiLanguageSupport) +{ + auto multilanguageSupport = projectItemWithoutQdsPrefix->multilanguageSupport(); + + ASSERT_TRUE(multilanguageSupport); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixSupportedLanguages) +{ + auto supportedLanguages = projectItemWithoutQdsPrefix->supportedLanguages(); + + ASSERT_THAT(supportedLanguages, UnorderedElementsAre("en", "fr")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixPrimaryLanguage) +{ + auto primaryLanguage = projectItemWithoutQdsPrefix->primaryLanguage(); + ; + + ASSERT_THAT(primaryLanguage, Eq("en")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixWidgetApp) +{ + auto widgetApp = projectItemWithoutQdsPrefix->widgetApp(); + + ASSERT_TRUE(widgetApp); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixFileList) +{ + QStringList fileList; + for (const auto &file : projectItemWithoutQdsPrefix->files()) { + fileList.append(file.path()); + } + + auto expectedFileList = localTestDataDir + "/getter-setter/qtquickcontrols2.conf"; + + ASSERT_THAT(fileList, UnorderedElementsAre(expectedFileList)); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixShaderToolArgs) +{ + auto shaderToolArgs = projectItemWithoutQdsPrefix->shaderToolArgs(); + + ASSERT_THAT( + shaderToolArgs, + UnorderedElementsAre("-s", "--glsl", "\"100 es,120,150\"", "--hlsl", "50", "--msl", "12")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixShaderToolFiles) +{ + auto shaderToolFiles = projectItemWithoutQdsPrefix->shaderToolFiles(); + + ASSERT_THAT(shaderToolFiles, UnorderedElementsAre("content/shaders/*")); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixEnvironment) +{ + auto env = projectItemWithoutQdsPrefix->environment(); + + ASSERT_THAT(env, + UnorderedElementsAre( + Utils::EnvironmentItem("QT_QUICK_CONTROLS_CONF", "qtquickcontrols2.conf"))); +} + +TEST_F(QmlProjectItem, GetWithoutQdsPrefixForceFreeType) +{ + auto forceFreeType = projectItemWithoutQdsPrefix->forceFreeType(); ASSERT_TRUE(forceFreeType); } @@ -524,9 +681,8 @@ TEST_F(QmlProjectItem, TestFileFilters) { // GIVEN auto fileListPath = Utils::FilePath::fromString(localTestDataDir + "/file-filters/filelist.txt"); - QStringList fileNameList = QString::fromUtf8(fileListPath.fileContents().value()) - .replace("\r\n", "\n") - .split("\n"); + QStringList fileNameList + = QString::fromUtf8(fileListPath.fileContents().value()).replace("\r\n", "\n").split("\n"); auto expectedAbsoluteFilePaths = createAbsoluteFilePaths(fileNameList); // WHEN From 1dafc64a54d672bfde3f3d012df4172168e903e3 Mon Sep 17 00:00:00 2001 From: Ali Kianian Date: Thu, 25 May 2023 09:23:45 +0300 Subject: [PATCH 024/149] QmlDesigner: Flush the output stream after sending commands The output stream should be flushed in order to forward containing data and clear the stream buffer. Task-number: QDS-9871 Change-Id: Iec9903a8afb98f3b9d03a9b9c4de67b6bfe3d35b Reviewed-by: Samuel Ghinet Reviewed-by: Marco Bubke Reviewed-by: Thomas Hartmann Reviewed-by: Miikka Heikkinen --- src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp | 4 ++++ src/tools/qml2puppet/instances/nodeinstanceclientproxy.h | 1 + .../instances/qt5bakelightsnodeinstanceserver.cpp | 7 ++++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp b/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp index ffafb7bb00e..7b7628e3191 100644 --- a/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp +++ b/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp @@ -79,6 +79,7 @@ NodeInstanceClientProxy::NodeInstanceClientProxy(QObject *parent) : QObject(parent) , m_inputIoDevice(nullptr) , m_outputIoDevice(nullptr) + , m_localSocket(nullptr) , m_writeCommandCounter(0) , m_synchronizeId(-1) { @@ -101,6 +102,7 @@ void NodeInstanceClientProxy::initializeSocket() m_inputIoDevice = localSocket; m_outputIoDevice = localSocket; + m_localSocket = localSocket; } void NodeInstanceClientProxy::initializeCapturedStream(const QString &fileName) @@ -288,6 +290,8 @@ void NodeInstanceClientProxy::sceneCreated(const SceneCreatedCommand &command) void NodeInstanceClientProxy::flush() { + if (m_localSocket) + m_localSocket->flush(); } void NodeInstanceClientProxy::synchronizeWithClientProcess() diff --git a/src/tools/qml2puppet/instances/nodeinstanceclientproxy.h b/src/tools/qml2puppet/instances/nodeinstanceclientproxy.h index 8015dd01920..46d7eebfe67 100644 --- a/src/tools/qml2puppet/instances/nodeinstanceclientproxy.h +++ b/src/tools/qml2puppet/instances/nodeinstanceclientproxy.h @@ -117,6 +117,7 @@ private: QTimer m_puppetAliveTimer; QIODevice *m_inputIoDevice; QIODevice *m_outputIoDevice; + QLocalSocket *m_localSocket; std::unique_ptr m_nodeInstanceServer; quint32 m_writeCommandCounter; int m_synchronizeId; diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5bakelightsnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5bakelightsnodeinstanceserver.cpp index 4287808c8a8..2a1aff912ac 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5bakelightsnodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5bakelightsnodeinstanceserver.cpp @@ -97,10 +97,11 @@ void Qt5BakeLightsNodeInstanceServer::bakeLights() switch (status) { case QQuick3DLightmapBaker::BakingStatus::Progress: case QQuick3DLightmapBaker::BakingStatus::Warning: - case QQuick3DLightmapBaker::BakingStatus::Error: + case QQuick3DLightmapBaker::BakingStatus::Error: { nodeInstanceClient()->handlePuppetToCreatorCommand( - {PuppetToCreatorCommand::BakeLightsProgress, msg.value_or("")}); - break; + {PuppetToCreatorCommand::BakeLightsProgress, msg.value_or("")}); + nodeInstanceClient()->flush(); + } break; case QQuick3DLightmapBaker::BakingStatus::Cancelled: abort(tr("Baking cancelled.")); break; From 2b000d079bba26d0cd48a6752f95c7e99e46dd2d Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 30 May 2023 16:26:14 +0200 Subject: [PATCH 025/149] QmlDesigner: Ensure that for an empty expression an invalid value is returned Change-Id: If0d526b645972ed283d4d0117dfb7b1f466c3842 Reviewed-by: Thomas Hartmann --- .../designercore/model/bindingproperty.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index fca657e57e1..5381ecf4b8e 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -110,7 +110,12 @@ ModelNode BindingProperty::resolveToModelNode() const if (!isValid()) return {}; - return resolveBinding(expression(), parentModelNode()); + QString binding = expression(); + + if (binding.isEmpty()) + return {}; + + return resolveBinding(binding, parentModelNode()); } static inline QStringList commaSeparatedSimplifiedStringList(const QString &string) @@ -129,6 +134,10 @@ AbstractProperty BindingProperty::resolveToProperty() const return {}; QString binding = expression(); + + if (binding.isEmpty()) + return {}; + ModelNode node = parentModelNode(); QString element; if (binding.contains(QLatin1Char('.'))) { @@ -159,12 +168,16 @@ QList BindingProperty::resolveToModelNodeList() const if (!isValid()) return {}; + QString binding = expression(); + + if (binding.isEmpty()) + return {}; + QList returnList; if (isList()) { - QString string = expression(); - string.chop(1); - string.remove(0, 1); - const QStringList simplifiedList = commaSeparatedSimplifiedStringList(string); + binding.chop(1); + binding.remove(0, 1); + const QStringList simplifiedList = commaSeparatedSimplifiedStringList(binding); for (const QString &nodeId : simplifiedList) { if (auto internalNode = privateModel()->nodeForId(nodeId)) returnList.append(ModelNode{internalNode, model(), view()}); From 397a95689fdad18826d4c8468cac2455423578bc Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 31 May 2023 11:37:50 +0200 Subject: [PATCH 026/149] QmlDesigner: Add removing of multiple nodes and properties Sometimes multiple nodes or properties has to be removed. In that case there is also the possibilty that we want to bypass the model resource management. Task-number: QDS-9766 Change-Id: I6c3cb0f682a7579f23d72431f641e2f812e2c63c Reviewed-by: Reviewed-by: Thomas Hartmann --- .../designercore/include/bindingproperty.h | 2 + .../qmldesigner/designercore/include/model.h | 7 + .../designercore/model/internalnode.cpp | 2 +- .../qmldesigner/designercore/model/model.cpp | 116 ++++++- .../qmldesigner/designercore/model/model_p.h | 12 +- .../model/modelresourcemanagement.cpp | 18 +- .../model/modelresourcemanagement.h | 4 +- .../model/modelresourcemanagementinterface.h | 5 +- .../unit/unittest/gtest-creator-printing.cpp | 6 + tests/unit/unittest/gtest-creator-printing.h | 1 + tests/unit/unittest/model-test.cpp | 326 ++++++++++++++---- .../unittest/modelresourcemanagement-test.cpp | 74 ++-- .../unittest/modelresourcemanagementmock.h | 18 +- 13 files changed, 451 insertions(+), 140 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/bindingproperty.h b/src/plugins/qmldesigner/designercore/include/bindingproperty.h index 3d6d32f9f8c..3ddf554c2cf 100644 --- a/src/plugins/qmldesigner/designercore/include/bindingproperty.h +++ b/src/plugins/qmldesigner/designercore/include/bindingproperty.h @@ -49,6 +49,8 @@ private: ModelNode resolveBinding(const QString &binding, ModelNode currentNode) const; }; +using BindingProperties = QList; + bool compareBindingProperties(const QmlDesigner::BindingProperty &bindingProperty01, const QmlDesigner::BindingProperty &bindingProperty02); QMLDESIGNERCORE_EXPORT QTextStream& operator<<(QTextStream &stream, const BindingProperty &property); diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 44deb4d6de5..e9a8ec3caa1 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -43,6 +43,8 @@ class TextModifier; using PropertyListType = QList>; +enum class BypassModelResourceManagement { No, Yes }; + class QMLDESIGNERCORE_EXPORT Model : public QObject { friend ModelNode; @@ -139,6 +141,11 @@ public: ModelNode createModelNode(const TypeName &typeName); + void removeModelNodes(ModelNodes nodes, + BypassModelResourceManagement = BypassModelResourceManagement::No); + void removeProperties(AbstractProperties properties, + BypassModelResourceManagement = BypassModelResourceManagement::No); + // Editing sub-components: // Imports: diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 8630bb75912..705b405a55d 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -119,7 +119,7 @@ InternalProperty::Pointer InternalNode::property(const PropertyName &name) const InternalBindingProperty::Pointer InternalNode::bindingProperty(const PropertyName &name) const { InternalProperty::Pointer property = m_namePropertyHash.value(name); - if (property->isBindingProperty()) + if (property && property->isBindingProperty()) return std::static_pointer_cast(property); return InternalBindingProperty::Pointer(); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 2166dbbff48..ab224a8ea34 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -319,15 +319,9 @@ void ModelPrivate::handleResourceSet(const ModelResourceSet &resourceSet) removeNode(node.m_internalNode); } - for (const AbstractProperty &property : resourceSet.removeProperties) { - if (property) - removeProperty(property.m_internalNode->property(property.m_propertyName)); - } + removeProperties(toInternalProperties(resourceSet.removeProperties)); - for (const auto &[property, expression] : resourceSet.setExpressions) { - if (property) - setBindingProperty(property.m_internalNode, property.m_propertyName, expression); - } + setBindingProperties(resourceSet.setExpressions); } void ModelPrivate::removeAllSubNodes(const InternalNodePointer &node) @@ -338,10 +332,12 @@ void ModelPrivate::removeAllSubNodes(const InternalNodePointer &node) void ModelPrivate::removeNodeAndRelatedResources(const InternalNodePointer &node) { - if (m_resourceManagement) - handleResourceSet(m_resourceManagement->removeNode(ModelNode{node, m_model, nullptr})); - else + if (m_resourceManagement) { + handleResourceSet( + m_resourceManagement->removeNodes({ModelNode{node, m_model, nullptr}}, m_model)); + } else { removeNode(node); + } } void ModelPrivate::removeNode(const InternalNodePointer &node) @@ -1055,6 +1051,39 @@ QVector ModelPrivate::toInternalNodeVector(const QVector ModelPrivate::toInternalProperties(const AbstractProperties &properties) +{ + QList internalProperties; + internalProperties.reserve(properties.size()); + + for (const auto &property : properties) { + if (property.m_internalNode) { + if (auto internalProperty = property.m_internalNode->property(property.m_propertyName)) + internalProperties.push_back(internalProperty); + } + } + + return internalProperties; +} + +QList> ModelPrivate::toInternalBindingProperties( + const ModelResourceSet::SetExpressions &setExpressions) +{ + QList> internalProperties; + internalProperties.reserve(setExpressions.size()); + + for (const auto &setExpression : setExpressions) { + const auto &property = setExpression.property; + if (property.m_internalNode) { + if (auto internalProperty = property.m_internalNode->bindingProperty( + property.m_propertyName)) + internalProperties.emplace_back(internalProperty, setExpression.expression); + } + } + + return internalProperties; +} + void ModelPrivate::changeSelectedNodes(const QList &newSelectedNodeList, const QList &oldSelectedNodeList) { @@ -1123,25 +1152,35 @@ static QList toPropertyPairList(const QListremoveProperty(AbstractProperty{property, m_model, nullptr})); - else + m_resourceManagement->removeProperties({AbstractProperty{property, m_model, nullptr}}, + m_model)); + } else { removeProperty(property); + } } void ModelPrivate::removeProperty(const InternalPropertyPointer &property) { - notifyPropertiesAboutToBeRemoved({property}); + removeProperties({property}); +} - const QList propertyPairList = toPropertyPairList({property}); +void ModelPrivate::removeProperties(const QList &properties) +{ + notifyPropertiesAboutToBeRemoved(properties); - removePropertyWithoutNotification(property); + const QList propertyPairList = toPropertyPairList(properties); + + for (const auto &property : properties) + removePropertyWithoutNotification(property); notifyPropertiesRemoved(propertyPairList); } -void ModelPrivate::setBindingProperty(const InternalNodePointer &node, const PropertyName &name, const QString &expression) +void ModelPrivate::setBindingProperty(const InternalNodePointer &node, + const PropertyName &name, + const QString &expression) { AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; if (!node->hasProperty(name)) { @@ -1155,6 +1194,19 @@ void ModelPrivate::setBindingProperty(const InternalNodePointer &node, const Pro notifyBindingPropertiesChanged({bindingProperty}, propertyChange); } +void ModelPrivate::setBindingProperties(const ModelResourceSet::SetExpressions &setExpressions) +{ + AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; + + auto bindingPropertiesWithExpressions = toInternalBindingProperties(setExpressions); + auto bindingProperties = Utils::transform(bindingPropertiesWithExpressions, + [](const auto &entry) { return std::get<0>(entry); }); + notifyBindingPropertiesAboutToBeChanged(bindingProperties); + for (const auto &[bindingProperty, expression] : bindingPropertiesWithExpressions) + bindingProperty->setExpression(expression); + notifyBindingPropertiesChanged(bindingProperties, propertyChange); +} + void ModelPrivate::setSignalHandlerProperty(const InternalNodePointer &node, const PropertyName &name, const QString &source) { AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; @@ -2275,4 +2327,32 @@ ModelNode Model::createModelNode(const TypeName &typeName) } } +void Model::removeModelNodes(ModelNodes nodes, BypassModelResourceManagement bypass) +{ + std::sort(nodes.begin(), nodes.end()); + + ModelResourceSet set; + + if (d->m_resourceManagement || bypass == BypassModelResourceManagement::Yes) + set = d->m_resourceManagement->removeNodes(std::move(nodes), this); + else + set = {std::move(nodes), {}, {}}; + + d->handleResourceSet(set); +} + +void Model::removeProperties(AbstractProperties properties, BypassModelResourceManagement bypass) +{ + std::sort(properties.begin(), properties.end()); + + ModelResourceSet set; + + if (d->m_resourceManagement || bypass == BypassModelResourceManagement::Yes) + set = d->m_resourceManagement->removeProperties(std::move(properties), this); + else + set = {{}, std::move(properties), {}}; + + d->handleResourceSet(set); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 0a6cd273e2e..9ecd0a8c2de 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -244,8 +244,12 @@ public: void setPropertyValue(const InternalNodePointer &node,const PropertyName &name, const QVariant &value); void removePropertyAndRelatedResources(const InternalPropertyPointer &property); void removeProperty(const InternalPropertyPointer &property); + void removeProperties(const QList &properties); - void setBindingProperty(const InternalNodePointer &node, const PropertyName &name, const QString &expression); + void setBindingProperty(const InternalNodePointer &node, + const PropertyName &name, + const QString &expression); + void setBindingProperties(const ModelResourceSet::SetExpressions &setExpressions); void setSignalHandlerProperty(const InternalNodePointer &node, const PropertyName &name, const QString &source); void setSignalDeclarationProperty(const InternalNodePointer &node, const PropertyName &name, const QString &signature); void setVariantProperty(const InternalNodePointer &node, const PropertyName &name, const QVariant &value); @@ -282,6 +286,8 @@ public: InternalNodePointer currentStateNode() const; InternalNodePointer currentTimelineNode() const; + void handleResourceSet(const ModelResourceSet &resourceSet); + private: void removePropertyWithoutNotification(const InternalPropertyPointer &property); void removeAllSubNodes(const InternalNodePointer &node); @@ -290,8 +296,10 @@ private: QList toModelNodeList(const QList &nodeList, AbstractView *view) const; QVector toModelNodeVector(const QVector &nodeVector, AbstractView *view) const; QVector toInternalNodeVector(const QVector &modelNodeVector) const; + static QList toInternalProperties(const AbstractProperties &properties); + static QList> toInternalBindingProperties( + const ModelResourceSet::SetExpressions &setExpressions); EnabledViewRange enabledViews() const; - void handleResourceSet(const ModelResourceSet &resourceSet); public: NotNullPointer projectStorage = nullptr; diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp index ca124f76536..a40e47e9d6e 100644 --- a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp @@ -32,7 +32,7 @@ struct Base , nodeActions{nodeActions} {} - void removeNodes(QList newModelNodes, CheckRecursive checkRecursive) + void removeNodes(ModelNodes newModelNodes, CheckRecursive checkRecursive) { if (newModelNodes.empty()) return; @@ -43,7 +43,7 @@ struct Base checkNewModelNodes(newModelNodes, oldModelNodes); } - void checkModelNodes(QList newModelNodes) + void checkModelNodes(ModelNodes newModelNodes) { if (newModelNodes.empty()) return; @@ -111,8 +111,7 @@ private: return oldProperties; } - void checkNewModelNodes(const QList &newModelNodes, - const QList &oldModelNodes) + void checkNewModelNodes(const ModelNodes &newModelNodes, const ModelNodes &oldModelNodes) { ModelNodes addedModelNodes; addedModelNodes.reserve(newModelNodes.size()); @@ -651,10 +650,9 @@ void forEachAction(NodeActions &nodeActions, ActionCall actionCall) } // namespace -ModelResourceSet ModelResourceManagement::removeNode(const ModelNode &node) const +ModelResourceSet ModelResourceManagement::removeNodes(ModelNodes nodes, Model *model) const { ModelResourceSet resourceSet; - Model *model = node.model(); DependenciesSet set = createDependenciesSet(model); @@ -670,17 +668,17 @@ ModelResourceSet ModelResourceManagement::removeNode(const ModelNode &node) cons std::move(set.targetsDependencies), std::move(set.targetsNodesProperties)}}; - Base{resourceSet, nodeActions}.removeNodes({node}, CheckRecursive::Yes); + Base{resourceSet, nodeActions}.removeNodes(nodes, CheckRecursive::Yes); forEachAction(nodeActions, [&](auto &action) { action.finally(); }); return resourceSet; } -ModelResourceSet ModelResourceManagement::removeProperty(const AbstractProperty &property) const +ModelResourceSet ModelResourceManagement::removeProperties(AbstractProperties properties, + Model *model) const { ModelResourceSet resourceSet; - Model *model = property.model(); DependenciesSet set = createDependenciesSet(model); @@ -696,7 +694,7 @@ ModelResourceSet ModelResourceManagement::removeProperty(const AbstractProperty std::move(set.targetsDependencies), std::move(set.targetsNodesProperties)}}; - Base{resourceSet, nodeActions}.removeProperties({property}, CheckRecursive::Yes); + Base{resourceSet, nodeActions}.removeProperties(properties, CheckRecursive::Yes); forEachAction(nodeActions, [&](auto &action) { action.finally(); }); diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.h b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.h index 0729409d534..4d505047263 100644 --- a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.h +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.h @@ -13,8 +13,8 @@ namespace QmlDesigner { class ModelResourceManagement final : public ModelResourceManagementInterface { public: - ModelResourceSet removeNode(const ModelNode &node) const; - ModelResourceSet removeProperty(const AbstractProperty &property) const; + ModelResourceSet removeNodes(ModelNodes nodes, Model *model) const override; + ModelResourceSet removeProperties(AbstractProperties properties, Model *model) const override; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagementinterface.h b/src/plugins/qmldesigner/designercore/model/modelresourcemanagementinterface.h index 0f0d79c78b5..94047d95b0d 100644 --- a/src/plugins/qmldesigner/designercore/model/modelresourcemanagementinterface.h +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagementinterface.h @@ -8,6 +8,7 @@ #include "modelresourcemanagementfwd.h" #include +#include namespace QmlDesigner { @@ -22,7 +23,7 @@ public: ModelResourceManagementInterface(ModelResourceManagementInterface &&) = default; ModelResourceManagementInterface &operator=(ModelResourceManagementInterface &&) = default; - virtual ModelResourceSet removeNode(const ModelNode &node) const = 0; - virtual ModelResourceSet removeProperty(const AbstractProperty &property) const = 0; + virtual ModelResourceSet removeNodes(ModelNodes nodes, Model *model) const = 0; + virtual ModelResourceSet removeProperties(AbstractProperties properties, Model *model) const = 0; }; } // namespace QmlDesigner diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/unittest/gtest-creator-printing.cpp index 667cef530db..d9af745406b 100644 --- a/tests/unit/unittest/gtest-creator-printing.cpp +++ b/tests/unit/unittest/gtest-creator-printing.cpp @@ -525,6 +525,12 @@ std::ostream &operator<<(std::ostream &out, const ModelResourceSet::SetExpressio return out << "(" << setExpression.property << ", " << setExpression.expression << ")"; } +std::ostream &operator<<(std::ostream &out, const ModelResourceSet &set) +{ + return out << "(" << set.removeModelNodes << ", " << set.removeProperties << ", " + << set.setExpressions << ")"; +} + namespace Cache { std::ostream &operator<<(std::ostream &out, const SourceContext &sourceContext) diff --git a/tests/unit/unittest/gtest-creator-printing.h b/tests/unit/unittest/gtest-creator-printing.h index 13382972ae8..170084f67a1 100644 --- a/tests/unit/unittest/gtest-creator-printing.h +++ b/tests/unit/unittest/gtest-creator-printing.h @@ -135,6 +135,7 @@ std::ostream &operator<<(std::ostream &out, SourceType sourceType); std::ostream &operator<<(std::ostream &out, const FileStatus &fileStatus); std::ostream &operator<<(std::ostream &out, const Import &import); std::ostream &operator<<(std::ostream &out, const ModelResourceSet::SetExpression &setExpression); +std::ostream &operator<<(std::ostream &out, const ModelResourceSet &modelResourceSet); namespace Cache { class SourceContext; diff --git a/tests/unit/unittest/model-test.cpp b/tests/unit/unittest/model-test.cpp index 7de2618aa93..30d75d54018 100644 --- a/tests/unit/unittest/model-test.cpp +++ b/tests/unit/unittest/model-test.cpp @@ -28,6 +28,13 @@ auto HasPropertyName(const Matcher &matcher) return Property(&AbstractProperty::name, matcher); } +MATCHER(IsSorted, std::string(negation ? "isn't sorted" : "is sorted")) +{ + using std::begin; + using std::end; + return std::is_sorted(begin(arg), end(arg)); +} + class Model : public ::testing::Test { protected: @@ -35,19 +42,20 @@ protected: { model.attachView(&viewMock); rootNode = viewMock.rootModelNode(); - ON_CALL(resourceManagementMock, removeNode(_)).WillByDefault([](const auto &node) { - return ModelResourceSet{{node}, {}, {}}; + ON_CALL(resourceManagementMock, removeNodes(_, _)).WillByDefault([](auto nodes, auto) { + return ModelResourceSet{std::move(nodes), {}, {}}; }); - ON_CALL(resourceManagementMock, removeProperty(_)).WillByDefault([](const auto &property) { - return ModelResourceSet{{}, {property}, {}}; + ON_CALL(resourceManagementMock, removeProperties(_, _)).WillByDefault([](auto properties, auto) { + return ModelResourceSet{{}, std::move(properties), {}}; }); } ~Model() { model.detachView(&viewMock); } - auto createNodeWithParent(const ModelNode &parentNode) + auto createNodeWithParent(const ModelNode &parentNode, const QString &id = {}) { auto node = viewMock.createModelNode("QtQuick.Item"); + node.setIdWithoutRefactoring(id); parentNode.defaultNodeAbstractProperty().reparentHere(node); return node; @@ -60,6 +68,15 @@ protected: return property; } + auto createBindingProperty(const ModelNode &parentNode, + QmlDesigner::PropertyName name, + const QString &expression = "foo") + { + auto property = parentNode.bindingProperty(name); + property.setExpression(expression); + return property; + } + protected: NiceMock viewMock; NiceMock projectStorageMock; @@ -76,11 +93,11 @@ protected: TEST_F(Model, ModelNodeDestroyIsCallingModelResourceManagementRemoveNode) { - auto node = createNodeWithParent(rootNode); + auto node = createNodeWithParent(rootNode); - EXPECT_CALL(resourceManagementMock, removeNode(node)); + EXPECT_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)); - node.destroy(); + node.destroy(); } TEST_F(Model, ModelNodeRemoveProperyIsCallingModelResourceManagementRemoveProperty) @@ -88,7 +105,7 @@ TEST_F(Model, ModelNodeRemoveProperyIsCallingModelResourceManagementRemoveProper auto property = rootNode.variantProperty("foo"); property.setValue(4); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.removeProperty("foo"); } @@ -99,7 +116,7 @@ TEST_F(Model, NodeAbstractPropertyReparentHereIsCallingModelResourceManagementRe auto property = rootNode.variantProperty("foo"); property.setValue(4); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.nodeListProperty("foo").reparentHere(node); } @@ -110,7 +127,7 @@ TEST_F(Model, NodePropertySetModelNodeIsCallingModelResourceManagementRemoveProp auto property = rootNode.variantProperty("foo"); property.setValue(4); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.nodeProperty("foo").setModelNode(node); } @@ -120,7 +137,7 @@ TEST_F(Model, VariantPropertySetValueIsCallingModelResourceManagementRemovePrope auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.variantProperty("foo").setValue(7); } @@ -131,7 +148,7 @@ TEST_F(Model, auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.variantProperty("foo").setDynamicTypeNameAndEnumeration("int", "Ha"); } @@ -141,7 +158,7 @@ TEST_F(Model, VariantPropertySetDynamicTypeNameAndValueIsCallingModelResourceMan auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.variantProperty("foo").setDynamicTypeNameAndValue("int", 7); } @@ -151,7 +168,7 @@ TEST_F(Model, BindingPropertySetExpressionIsCallingModelResourceManagementRemove auto property = rootNode.variantProperty("foo"); property.setValue(4); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.bindingProperty("foo").setExpression("blah"); } @@ -162,7 +179,7 @@ TEST_F(Model, auto property = rootNode.variantProperty("foo"); property.setValue(4); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.bindingProperty("foo").setDynamicTypeNameAndExpression("int", "blah"); } @@ -172,7 +189,7 @@ TEST_F(Model, SignalHandlerPropertySetSourceIsCallingModelResourceManagementRemo auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.signalHandlerProperty("foo").setSource("blah"); } @@ -182,7 +199,7 @@ TEST_F(Model, SignalDeclarationPropertySetSignatureIsCallingModelResourceManagem auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); - EXPECT_CALL(resourceManagementMock, removeProperty(Eq(property))); + EXPECT_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)); rootNode.signalDeclarationProperty("foo").setSignature("blah"); } @@ -191,7 +208,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeAboutToBeRemoved) { auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); - ON_CALL(resourceManagementMock, removeNode(node)) + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return(ModelResourceSet{{node, node2}, {}, {}})); EXPECT_CALL(viewMock, nodeAboutToBeRemoved(Eq(node))); @@ -204,7 +221,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeRemoved) { auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); - ON_CALL(resourceManagementMock, removeNode(node)) + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return(ModelResourceSet{{node, node2}, {}, {}})); EXPECT_CALL(viewMock, nodeRemoved(Eq(node), _, _)); @@ -217,7 +234,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeRemovedWithValidNodes) { auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); - ON_CALL(resourceManagementMock, removeNode(node)) + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return(ModelResourceSet{{node, node2, ModelNode{}}, {}, {}})); EXPECT_CALL(viewMock, nodeRemoved(Eq(node), _, _)); @@ -231,11 +248,10 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesAboutToBeRemoved) auto node = createNodeWithParent(rootNode); auto property = createProperty(rootNode, "foo"); auto property2 = createProperty(rootNode, "bar"); - ON_CALL(resourceManagementMock, removeNode(node)) + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return(ModelResourceSet{{node}, {property, property2}, {}})); - EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(ElementsAre(Eq(property)))); - EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(ElementsAre(Eq(property2)))); + EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(UnorderedElementsAre(property, property2))); node.destroy(); } @@ -245,11 +261,10 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesRemoved) auto node = createNodeWithParent(rootNode); auto property = createProperty(rootNode, "foo"); auto property2 = createProperty(rootNode, "bar"); - ON_CALL(resourceManagementMock, removeNode(node)) + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return(ModelResourceSet{{node}, {property, property2}, {}})); - EXPECT_CALL(viewMock, propertiesRemoved(ElementsAre(Eq(property)))); - EXPECT_CALL(viewMock, propertiesRemoved(ElementsAre(Eq(property2)))); + EXPECT_CALL(viewMock, propertiesRemoved(UnorderedElementsAre(property, property2))); node.destroy(); } @@ -259,11 +274,10 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesRemovedOnlyWithVali auto node = createNodeWithParent(rootNode); auto property = createProperty(rootNode, "foo"); auto property2 = createProperty(rootNode, "bar"); - ON_CALL(resourceManagementMock, removeNode(node)) + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return(ModelResourceSet{{node}, {property, property2, {}}, {}})); - EXPECT_CALL(viewMock, propertiesRemoved(ElementsAre(Eq(property)))); - EXPECT_CALL(viewMock, propertiesRemoved(ElementsAre(Eq(property2)))); + EXPECT_CALL(viewMock, propertiesRemoved(UnorderedElementsAre(property, property2))); node.destroy(); } @@ -271,13 +285,13 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesRemovedOnlyWithVali TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesAboutToBeChanged) { auto node = createNodeWithParent(rootNode); - auto property = rootNode.bindingProperty("foo"); - auto property2 = rootNode.bindingProperty("bar"); - ON_CALL(resourceManagementMock, removeNode(node)) + auto property = createBindingProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return(ModelResourceSet{{node}, {}, {{property, "yi"}, {property2, "er"}}})); - EXPECT_CALL(viewMock, bindingPropertiesAboutToBeChanged(ElementsAre(Eq(property)))); - EXPECT_CALL(viewMock, bindingPropertiesAboutToBeChanged(ElementsAre(Eq(property2)))); + EXPECT_CALL(viewMock, + bindingPropertiesAboutToBeChanged(UnorderedElementsAre(property, property2))); node.destroy(); } @@ -285,28 +299,52 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesAboutToBeCha TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesChanged) { auto node = createNodeWithParent(rootNode); - auto property = rootNode.bindingProperty("foo"); - auto property2 = rootNode.bindingProperty("bar"); - ON_CALL(resourceManagementMock, removeNode(node)) + auto property = createBindingProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return(ModelResourceSet{{node}, {}, {{property, "yi"}, {property2, "er"}}})); - EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(Eq(property)), _)); - EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(Eq(property2)), _)); + EXPECT_CALL(viewMock, bindingPropertiesChanged(UnorderedElementsAre(property, property2), _)); node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesChangedOnlyWithValidProperties) +TEST_F(Model, ModelNodeDestroyIsChangingBindingPropertyExpression) +{ + auto node = createNodeWithParent(rootNode); + auto property = createBindingProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) + .WillByDefault(Return(ModelResourceSet{{node}, {}, {{property, "yi"}, {property2, "er"}}})); + + node.destroy(); + + ASSERT_THAT(property.expression(), "yi"); + ASSERT_THAT(property2.expression(), "er"); +} + +TEST_F(Model, ModelNodeDestroyIsOnlyChangingExistingBindingProperty) { auto node = createNodeWithParent(rootNode); auto property = rootNode.bindingProperty("foo"); + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) + .WillByDefault(Return(ModelResourceSet{{}, {}, {{property, "yi"}}})); + + node.destroy(); + + ASSERT_FALSE(rootNode.hasBindingProperty("foo")); +} + +TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesChangedOnlyWithExistingProperties) +{ + auto node = createNodeWithParent(rootNode); + auto property = createBindingProperty(rootNode, "foo"); auto property2 = rootNode.bindingProperty("bar"); - ON_CALL(resourceManagementMock, removeNode(node)) + ON_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)) .WillByDefault(Return( ModelResourceSet{{node}, {}, {{property, "yi"}, {property2, "er"}, {{}, "san"}}})); - EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(Eq(property)), _)); - EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(Eq(property2)), _)); + EXPECT_CALL(viewMock, bindingPropertiesChanged(UnorderedElementsAre(property), _)); node.destroy(); } @@ -316,7 +354,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeAboutToBeRemoved) auto property = createProperty(rootNode, "foo"); auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); - ON_CALL(resourceManagementMock, removeProperty(property)) + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault(Return(ModelResourceSet{{node, node2}, {property}, {}})); EXPECT_CALL(viewMock, nodeAboutToBeRemoved(Eq(node))); @@ -330,7 +368,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeRemoved) auto property = createProperty(rootNode, "foo"); auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); - ON_CALL(resourceManagementMock, removeProperty(property)) + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault(Return(ModelResourceSet{{node, node2}, {property}, {}})); EXPECT_CALL(viewMock, nodeRemoved(Eq(node), _, _)); @@ -344,7 +382,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeRemovedWithValidNo auto property = createProperty(rootNode, "foo"); auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); - ON_CALL(resourceManagementMock, removeProperty(property)) + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault(Return(ModelResourceSet{{node, node2, ModelNode{}}, {property}, {}})); EXPECT_CALL(viewMock, nodeRemoved(Eq(node), _, _)); @@ -357,11 +395,10 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesAboutToBeRem { auto property = createProperty(rootNode, "yi"); auto property2 = createProperty(rootNode, "er"); - ON_CALL(resourceManagementMock, removeProperty(property)) + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault(Return(ModelResourceSet{{}, {property, property2}, {}})); - EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(ElementsAre(Eq(property)))); - EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(ElementsAre(Eq(property2)))); + EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(UnorderedElementsAre(property, property2))); rootNode.removeProperty("yi"); } @@ -370,11 +407,10 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesRemoved) { auto property = createProperty(rootNode, "yi"); auto property2 = createProperty(rootNode, "er"); - ON_CALL(resourceManagementMock, removeProperty(property)) + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault(Return(ModelResourceSet{{}, {property, property2}, {}})); - EXPECT_CALL(viewMock, propertiesRemoved(ElementsAre(Eq(property)))); - EXPECT_CALL(viewMock, propertiesRemoved(ElementsAre(Eq(property2)))); + EXPECT_CALL(viewMock, propertiesRemoved(UnorderedElementsAre(property, property2))); rootNode.removeProperty("yi"); } @@ -383,11 +419,10 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesRemovedOnlyW { auto property = createProperty(rootNode, "yi"); auto property2 = createProperty(rootNode, "er"); - ON_CALL(resourceManagementMock, removeProperty(property)) + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault(Return(ModelResourceSet{{}, {property, property2, {}}, {}})); - EXPECT_CALL(viewMock, propertiesRemoved(ElementsAre(Eq(property)))); - EXPECT_CALL(viewMock, propertiesRemoved(ElementsAre(Eq(property2)))); + EXPECT_CALL(viewMock, propertiesRemoved(UnorderedElementsAre(property, property2))); rootNode.removeProperty("yi"); } @@ -395,14 +430,13 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesRemovedOnlyW TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesAboutToBeChanged) { auto property = createProperty(rootNode, "yi"); - auto property1 = rootNode.bindingProperty("foo"); - auto property2 = rootNode.bindingProperty("bar"); - ON_CALL(resourceManagementMock, removeProperty(property)) + auto property1 = createBindingProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault( Return(ModelResourceSet{{}, {property}, {{property1, "yi"}, {property2, "er"}}})); - EXPECT_CALL(viewMock, bindingPropertiesAboutToBeChanged(ElementsAre(Eq(property1)))); - EXPECT_CALL(viewMock, bindingPropertiesAboutToBeChanged(ElementsAre(Eq(property2)))); + EXPECT_CALL(viewMock, bindingPropertiesAboutToBeChanged(ElementsAre(property1, property2))); rootNode.removeProperty("yi"); } @@ -410,14 +444,13 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesAbout TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesChanged) { auto property = createProperty(rootNode, "yi"); - auto property1 = rootNode.bindingProperty("foo"); - auto property2 = rootNode.bindingProperty("bar"); - ON_CALL(resourceManagementMock, removeProperty(property)) + auto property1 = createBindingProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault( Return(ModelResourceSet{{}, {property}, {{property1, "yi"}, {property2, "er"}}})); - EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(Eq(property1)), _)); - EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(Eq(property2)), _)); + EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(property1, property2), _)); rootNode.removeProperty("yi"); } @@ -426,14 +459,13 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesChangedOnlyWithValidProperties) { auto property = createProperty(rootNode, "yi"); - auto property1 = rootNode.bindingProperty("foo"); - auto property2 = rootNode.bindingProperty("bar"); - ON_CALL(resourceManagementMock, removeProperty(property)) + auto property1 = createBindingProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + ON_CALL(resourceManagementMock, removeProperties(ElementsAre(property), &model)) .WillByDefault( Return(ModelResourceSet{{}, {property}, {{property1, "yi"}, {property2, "er"}, {}}})); - EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(Eq(property1)), _)); - EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(Eq(property2)), _)); + EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(property1, property2), _)); rootNode.removeProperty("yi"); } @@ -488,4 +520,156 @@ TEST_F(Model, ByDefaultRemovePropertiesInFactoryMethodCallsRemoveProperty) rootNode.removeProperty("yi"); } +TEST_F(Model, RemoveModelNodes) +{ + auto node = createNodeWithParent(rootNode, "yi"); + auto node2 = createNodeWithParent(rootNode, "er"); + + EXPECT_CALL(resourceManagementMock, + removeNodes(AllOf(UnorderedElementsAre(node, node2), IsSorted()), &model)); + + model.removeModelNodes({node, node2}); +} + +TEST_F(Model, RemoveModelNodesReverse) +{ + auto node = createNodeWithParent(rootNode, "yi"); + auto node2 = createNodeWithParent(rootNode, "er"); + + EXPECT_CALL(resourceManagementMock, + removeNodes(AllOf(UnorderedElementsAre(node, node2), IsSorted()), &model)); + + model.removeModelNodes({node2, node}); +} + +TEST_F(Model, RemoveModelNodesCallsNotifier) +{ + auto node = createNodeWithParent(rootNode, "yi"); + auto node2 = createNodeWithParent(rootNode, "er"); + auto property = createProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + auto property3 = createProperty(rootNode, "oh"); + + ON_CALL(resourceManagementMock, + removeNodes(AllOf(UnorderedElementsAre(node, node2), IsSorted()), &model)) + .WillByDefault( + Return(ModelResourceSet{{node, node2}, {property, property3}, {{property2, "bar"}}})); + + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node)); + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node2)); + EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(UnorderedElementsAre(property, property3))); + EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(property2), _)); + + model.removeModelNodes({node, node2}); +} + +TEST_F(Model, RemoveModelNodesBypassesModelResourceManagement) +{ + auto node = createNodeWithParent(rootNode, "yi"); + auto node2 = createNodeWithParent(rootNode, "er"); + auto property = createProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + auto property3 = createProperty(rootNode, "oh"); + + ON_CALL(resourceManagementMock, + removeNodes(AllOf(UnorderedElementsAre(node, node2), IsSorted()), &model)) + .WillByDefault( + Return(ModelResourceSet{{node, node2}, {property, property3}, {{property2, "bar"}}})); + + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node)); + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node2)); + + model.removeModelNodes({node, node2}, QmlDesigner::BypassModelResourceManagement::Yes); +} + +TEST_F(Model, ByDefaultRemoveModelNodesInFactoryMethodCallsRemovesNode) +{ + model.detachView(&viewMock); + QmlDesigner::Model newModel{projectStorageMock, "QtQuick.Item"}; + newModel.attachView(&viewMock); + rootNode = viewMock.rootModelNode(); + auto node = createNodeWithParent(rootNode, "yi"); + auto node2 = createNodeWithParent(rootNode, "er"); + + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node)); + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node2)); + + newModel.removeModelNodes({node, node2}); +} + +TEST_F(Model, RemoveProperties) +{ + auto property = createProperty(rootNode, "yi"); + auto property2 = createProperty(rootNode, "er"); + + EXPECT_CALL(resourceManagementMock, + removeProperties(AllOf(UnorderedElementsAre(property, property2), IsSorted()), &model)); + + model.removeProperties({property, property2}); +} + +TEST_F(Model, RemovePropertiesReverse) +{ + auto property = createProperty(rootNode, "yi"); + auto property2 = createProperty(rootNode, "er"); + + EXPECT_CALL(resourceManagementMock, + removeProperties(AllOf(UnorderedElementsAre(property, property2), IsSorted()), &model)); + + model.removeProperties({property2, property}); +} + +TEST_F(Model, RemovePropertiesCallsNotifier) +{ + auto node = createNodeWithParent(rootNode, "yi"); + auto node2 = createNodeWithParent(rootNode, "er"); + auto property = createProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + auto property3 = createProperty(rootNode, "oh"); + + ON_CALL(resourceManagementMock, + removeProperties(AllOf(UnorderedElementsAre(property, property3), IsSorted()), &model)) + .WillByDefault( + Return(ModelResourceSet{{node, node2}, {property, property3}, {{property2, "bar"}}})); + + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node)); + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node2)); + EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(UnorderedElementsAre(property, property3))); + EXPECT_CALL(viewMock, bindingPropertiesChanged(ElementsAre(property2), _)); + + model.removeProperties({property, property3}); +} + +TEST_F(Model, RemovePropertiesBypassesModelResourceManagement) +{ + auto node = createNodeWithParent(rootNode, "yi"); + auto node2 = createNodeWithParent(rootNode, "er"); + auto property = createProperty(rootNode, "foo"); + auto property2 = createBindingProperty(rootNode, "bar"); + auto property3 = createProperty(rootNode, "oh"); + + ON_CALL(resourceManagementMock, + removeProperties(AllOf(UnorderedElementsAre(property, property3), IsSorted()), &model)) + .WillByDefault( + Return(ModelResourceSet{{node, node2}, {property, property3}, {{property2, "bar"}}})); + + EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(UnorderedElementsAre(property, property3))); + + model.removeProperties({property, property3}, QmlDesigner::BypassModelResourceManagement::Yes); +} + +TEST_F(Model, ByDefaultRemovePropertiesInFactoryMethodCallsRemovesProperties) +{ + model.detachView(&viewMock); + QmlDesigner::Model newModel{projectStorageMock, "QtQuick.Item"}; + newModel.attachView(&viewMock); + rootNode = viewMock.rootModelNode(); + auto property = createProperty(rootNode, "yi"); + auto property2 = createProperty(rootNode, "er"); + + EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(UnorderedElementsAre(property, property2))); + + newModel.removeProperties({property, property2}); +} + } // namespace diff --git a/tests/unit/unittest/modelresourcemanagement-test.cpp b/tests/unit/unittest/modelresourcemanagement-test.cpp index 2fba569c2b0..38cc5d8c797 100644 --- a/tests/unit/unittest/modelresourcemanagement-test.cpp +++ b/tests/unit/unittest/modelresourcemanagement-test.cpp @@ -69,31 +69,53 @@ protected: ModelNode rootNode; }; -TEST_F(ModelResourceManagement, RemoveNode) +TEST_F(ModelResourceManagement, RemoveProperty) { auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); layerEnabledProperty.setValue(true); - auto resources = management.removeProperty(layerEnabledProperty); + auto resources = management.removeProperties({layerEnabledProperty}, &model); ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); } -TEST_F(ModelResourceManagement, RemoveProperty) +TEST_F(ModelResourceManagement, RemoveMultipleProperties) +{ + auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); + layerEnabledProperty.setValue(true); + auto layerHiddenProperty = rootNode.variantProperty("layer.hidden"); + layerHiddenProperty.setValue(true); + + auto resources = management.removeProperties({layerEnabledProperty, layerHiddenProperty}, &model); + + ASSERT_THAT(resources.removeProperties, IsSupersetOf({layerEnabledProperty, layerHiddenProperty})); +} + +TEST_F(ModelResourceManagement, RemoveNode) { auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); - auto resources = management.removeNode(node); + auto resources = management.removeNodes({node}, &model); ASSERT_THAT(resources.removeModelNodes, Contains(node)); } +TEST_F(ModelResourceManagement, RemoveMultipleNodes) +{ + auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); + auto node2 = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); + + auto resources = management.removeNodes({node, node2}, &model); + + ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({node, node2})); +} + TEST_F(ModelResourceManagement, DontRemoveChildNodes) { auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); auto childNode = createNodeWithParent("QtQuick.Item", node.defaultNodeListProperty()); - auto resources = management.removeNode(node); + auto resources = management.removeNodes({node}, &model); ASSERT_THAT(resources.removeModelNodes, Not(Contains(childNode))); } @@ -104,7 +126,7 @@ TEST_F(ModelResourceManagement, RemovePropertyLayerEnabled) auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); layerEnabledProperty.setValue(true); - auto resources = management.removeNode(node); + auto resources = management.removeNodes({node}, &model); ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); } @@ -116,7 +138,7 @@ TEST_F(ModelResourceManagement, RemovePropertyLayerEnabledIfLayerEffectPropertyI auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); layerEnabledProperty.setValue(true); - auto resources = management.removeProperty(layerEffectProperty); + auto resources = management.removeProperties({layerEffectProperty}, &model); ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); } @@ -126,7 +148,7 @@ TEST_F(ModelResourceManagement, DontRemovePropertyLayerEnabledIfNotExists) auto node = createNodeWithParent("QtQuick.Item", rootNode.nodeProperty("layer.effect")); auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); - auto resources = management.removeNode(node); + auto resources = management.removeNodes({node}, &model); ASSERT_THAT(resources.removeProperties, Not(Contains(layerEnabledProperty))); } @@ -137,7 +159,7 @@ TEST_F(ModelResourceManagement, RemoveAliasExportProperty) auto aliasExportProperty = rootNode.bindingProperty("foo"); aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); } @@ -149,7 +171,7 @@ TEST_F(ModelResourceManagement, RemoveAliasForChildExportProperty) auto aliasExportProperty = rootNode.bindingProperty("foo"); aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); - auto resources = management.removeNode(node); + auto resources = management.removeNodes({node}, &model); ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); } @@ -162,7 +184,7 @@ TEST_F(ModelResourceManagement, RemoveAliasForGrandChildExportProperty) auto aliasExportProperty = rootNode.bindingProperty("foo"); aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); - auto resources = management.removeNode(node); + auto resources = management.removeNodes({node}, &model); ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); } @@ -173,7 +195,7 @@ TEST_F(ModelResourceManagement, DontRemoveNonAliasExportProperty) auto aliasExportProperty = rootNode.bindingProperty("foo"); aliasExportProperty.setDynamicTypeNameAndExpression("int", "foo"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeProperties, Not(Contains(aliasExportProperty))); } @@ -221,7 +243,7 @@ TEST_P(ForTarget, Remove) sourceTargetProperty.setExpression("foo"); source2TargetProperty.setExpression("foo"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } @@ -230,14 +252,14 @@ TEST_P(ForTarget, DontRemoveForDifferentTarget) { sourceTargetProperty.setExpression("bar"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } TEST_P(ForTarget, DontRemoveKeyIfTargetIsNotSet) { - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } @@ -246,7 +268,7 @@ TEST_P(ForTarget, DontRemoveIfTargetCannotBeResolved) { sourceTargetProperty.setExpression("not_exists"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } @@ -291,7 +313,7 @@ TEST_P(ForTargets, Remove) sourceTargetsProperty.setExpression("[foo]"); source2TargetsProperty.setExpression("[foo]"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } @@ -301,7 +323,7 @@ TEST_P(ForTargets, HandleInvalidBinding) sourceTargetsProperty.setExpression("[foo, broken]"); source2TargetsProperty.setExpression("[foo, fail]"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } @@ -314,7 +336,7 @@ TEST_P(ForTargets, RemoveIndirectly) sourceTargetsProperty.setExpression("[foo, bar]"); source2TargetsProperty.setExpression("[bar, foo]"); - auto resources = management.removeNode(parenNode); + auto resources = management.removeNodes({parenNode}, &model); ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } @@ -324,7 +346,7 @@ TEST_P(ForTargets, DontRemoveTargetIfThereAreStillAnOtherTargets) sourceTargetsProperty.setExpression("[foo, bar]"); source2TargetsProperty.setExpression("[foo, bar]"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, AllOf(Not(Contains(source)), Not(Contains(source2)))); } @@ -334,7 +356,7 @@ TEST_P(ForTargets, ChangeExpressionIfThereAreStillAnOtherTargets) sourceTargetsProperty.setExpression("[foo, bar]"); source2TargetsProperty.setExpression("[foo, bar]"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.setExpressions, UnorderedElementsAre(SetExpression(sourceTargetsProperty, "[bar]"), @@ -345,7 +367,7 @@ TEST_P(ForTargets, DontChangeOrderInExpression) { sourceTargetsProperty.setExpression("[yi, foo, er, san]"); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.setExpressions, UnorderedElementsAre(SetExpression(sourceTargetsProperty, "[yi, er, san]"))); @@ -403,7 +425,7 @@ TEST_P(ForState, Remove) sourceStateProperty.setValue(QString{"foo"}); source2StateProperty.setValue(QString{"foo"}); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } @@ -413,7 +435,7 @@ TEST_P(ForState, DontRemoveForStarState) fooNode.variantProperty("name").setValue("*"); sourceStateProperty.setValue(QString{"*"}); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } @@ -423,7 +445,7 @@ TEST_P(ForState, DontRemoveForEmptyState) fooNode.variantProperty("name").setValue(""); sourceStateProperty.setValue(QString{""}); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } @@ -433,7 +455,7 @@ TEST_P(ForState, DontRemoveForDifferentState) sourceStateProperty.setValue(QString{"foo"}); source2StateProperty.setValue(QString{"bar"}); - auto resources = management.removeNode(fooNode); + auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source})); } diff --git a/tests/unit/unittest/modelresourcemanagementmock.h b/tests/unit/unittest/modelresourcemanagementmock.h index 0b98adfcff0..c15e04dbf98 100644 --- a/tests/unit/unittest/modelresourcemanagementmock.h +++ b/tests/unit/unittest/modelresourcemanagementmock.h @@ -12,12 +12,12 @@ class ModelResourceManagementMock : public QmlDesigner::ModelResourceManagementI { public: MOCK_METHOD(QmlDesigner::ModelResourceSet, - removeNode, - (const QmlDesigner::ModelNode &), + removeNodes, + (QmlDesigner::ModelNodes, QmlDesigner::Model *), (const, override)); MOCK_METHOD(QmlDesigner::ModelResourceSet, - removeProperty, - (const QmlDesigner::AbstractProperty &), + removeProperties, + (QmlDesigner::AbstractProperties, QmlDesigner::Model *), (const, override)); }; @@ -28,14 +28,16 @@ public: : mock{mock} {} - QmlDesigner::ModelResourceSet removeNode(const QmlDesigner::ModelNode &node) const override + QmlDesigner::ModelResourceSet removeNodes(QmlDesigner::ModelNodes nodes, + QmlDesigner::Model *model) const override { - return mock.removeNode(node); + return mock.removeNodes(std::move(nodes), model); } - QmlDesigner::ModelResourceSet removeProperty(const QmlDesigner::AbstractProperty &property) const override + QmlDesigner::ModelResourceSet removeProperties(QmlDesigner::AbstractProperties properties, + QmlDesigner::Model *model) const override { - return mock.removeProperty(property); + return mock.removeProperties(std::move(properties), model); } ModelResourceManagementMock &mock; From 8a69afc1bd81ceb8435ab6311fca8027bce2aced Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 31 May 2023 15:05:18 +0200 Subject: [PATCH 027/149] QmlDesigner: Fix model resource management bypass Fixes: QDS-9766 Change-Id: I7a242b8e922140f7e100e90af1cd5029e82fcb5c Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designercore/model/model.cpp | 10 ++++++++-- tests/unit/unittest/model-test.cpp | 12 +++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index ab224a8ea34..0d00857ed81 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -1168,6 +1168,9 @@ void ModelPrivate::removeProperty(const InternalPropertyPointer &property) void ModelPrivate::removeProperties(const QList &properties) { + if (properties.isEmpty()) + return; + notifyPropertiesAboutToBeRemoved(properties); const QList propertyPairList = toPropertyPairList(properties); @@ -1196,6 +1199,9 @@ void ModelPrivate::setBindingProperty(const InternalNodePointer &node, void ModelPrivate::setBindingProperties(const ModelResourceSet::SetExpressions &setExpressions) { + if (setExpressions.isEmpty()) + return; + AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; auto bindingPropertiesWithExpressions = toInternalBindingProperties(setExpressions); @@ -2333,7 +2339,7 @@ void Model::removeModelNodes(ModelNodes nodes, BypassModelResourceManagement byp ModelResourceSet set; - if (d->m_resourceManagement || bypass == BypassModelResourceManagement::Yes) + if (d->m_resourceManagement && bypass == BypassModelResourceManagement::No) set = d->m_resourceManagement->removeNodes(std::move(nodes), this); else set = {std::move(nodes), {}, {}}; @@ -2347,7 +2353,7 @@ void Model::removeProperties(AbstractProperties properties, BypassModelResourceM ModelResourceSet set; - if (d->m_resourceManagement || bypass == BypassModelResourceManagement::Yes) + if (d->m_resourceManagement && bypass == BypassModelResourceManagement::No) set = d->m_resourceManagement->removeProperties(std::move(properties), this); else set = {{}, std::move(properties), {}}; diff --git a/tests/unit/unittest/model-test.cpp b/tests/unit/unittest/model-test.cpp index 30d75d54018..f0bade227a6 100644 --- a/tests/unit/unittest/model-test.cpp +++ b/tests/unit/unittest/model-test.cpp @@ -93,11 +93,11 @@ protected: TEST_F(Model, ModelNodeDestroyIsCallingModelResourceManagementRemoveNode) { - auto node = createNodeWithParent(rootNode); + auto node = createNodeWithParent(rootNode); - EXPECT_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)); + EXPECT_CALL(resourceManagementMock, removeNodes(ElementsAre(node), &model)); - node.destroy(); + node.destroy(); } TEST_F(Model, ModelNodeRemoveProperyIsCallingModelResourceManagementRemoveProperty) @@ -570,7 +570,6 @@ TEST_F(Model, RemoveModelNodesBypassesModelResourceManagement) auto property = createProperty(rootNode, "foo"); auto property2 = createBindingProperty(rootNode, "bar"); auto property3 = createProperty(rootNode, "oh"); - ON_CALL(resourceManagementMock, removeNodes(AllOf(UnorderedElementsAre(node, node2), IsSorted()), &model)) .WillByDefault( @@ -578,6 +577,8 @@ TEST_F(Model, RemoveModelNodesBypassesModelResourceManagement) EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node)); EXPECT_CALL(viewMock, nodeAboutToBeRemoved(node2)); + EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(_)).Times(0); + EXPECT_CALL(viewMock, bindingPropertiesChanged(_, _)).Times(0); model.removeModelNodes({node, node2}, QmlDesigner::BypassModelResourceManagement::Yes); } @@ -647,13 +648,14 @@ TEST_F(Model, RemovePropertiesBypassesModelResourceManagement) auto property = createProperty(rootNode, "foo"); auto property2 = createBindingProperty(rootNode, "bar"); auto property3 = createProperty(rootNode, "oh"); - ON_CALL(resourceManagementMock, removeProperties(AllOf(UnorderedElementsAre(property, property3), IsSorted()), &model)) .WillByDefault( Return(ModelResourceSet{{node, node2}, {property, property3}, {{property2, "bar"}}})); + EXPECT_CALL(viewMock, nodeAboutToBeRemoved(_)).Times(0); EXPECT_CALL(viewMock, propertiesAboutToBeRemoved(UnorderedElementsAre(property, property3))); + EXPECT_CALL(viewMock, bindingPropertiesChanged(_, _)).Times(0); model.removeProperties({property, property3}, QmlDesigner::BypassModelResourceManagement::Yes); } From e9ae73a4cde51037a73818da0d9164de23808a7a Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 31 May 2023 14:24:35 +0200 Subject: [PATCH 028/149] QmlDesigner: Prefix QDS specific properties in templates For now we only do this in the MCU template. Task-number: QDS-9970 Change-Id: I3829d86bdde05ba5fc25e64d2bbeea3f3531ba53 Reviewed-by: Burak Hancerli Reviewed-by: Aleksei German --- .../studio_templates/projects/app_mcu.qmlproject | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject b/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject index 55204175faa..84bd0791ce9 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject +++ b/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject @@ -47,18 +47,18 @@ Project { /* Following entries are for Qt Design Studio compatibility: */ - Environment { + QDS.Environment { QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" } - qtForMCUs: true - qt6Project: true + QDS.qtForMCUs: true + QDS.qt6Project: true - qdsVersion: "4.1" - quickVersion: "6.5" + QDS.qdsVersion: "4.1" + QDS.quickVersion: "6.5" /* List of plugin directories passed to QML runtime */ importPaths: [ "imports" ] - targetDirectory: "/opt/%{ProjectName}" + QDS.targetDirectory: "/opt/%{ProjectName}" } From 4fa73127a5e4eb1aebebe2363db658aaf57f4312 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 31 May 2023 19:15:53 +0200 Subject: [PATCH 029/149] QmlDesigner: Simplify and speedup property parsing By using PropertyMetaInfo we increase performance and simplify the property parsing. Change-Id: Ibe979543e8c59c13bd2c1320f7ebd31b3417da3f Reviewed-by: Marco Bubke Reviewed-by: Qt CI Bot --- .../designercore/model/texttomodelmerger.cpp | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index ac89c54acd6..e79d0f513a8 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -594,6 +594,59 @@ public: return false; } + QVariant convertToVariant(const ModelNode &node, + const QString &astValue, + const QString &propertyPrefix, + AST::UiQualifiedId *propertyId) + { + const QString propertyName = propertyPrefix.isEmpty() ? propertyId->name.toString() + : propertyPrefix; + + const PropertyMetaInfo propertyMetaInfo = node.metaInfo().property(propertyName.toUtf8()); + const bool hasQuotes = astValue.trimmed().left(1) == QStringLiteral("\"") + && astValue.trimmed().right(1) == QStringLiteral("\""); + const QString cleanedValue = fixEscapedUnicodeChar(deEscape(stripQuotes(astValue.trimmed()))); + if (!propertyMetaInfo.isValid()) { + qCInfo(texttomodelMergerDebug) + << Q_FUNC_INFO << "Unknown property" + << propertyPrefix + QLatin1Char('.') + toString(propertyId) << "on line" + << propertyId->identifierToken.startLine << "column" + << propertyId->identifierToken.startColumn; + return hasQuotes ? QVariant(cleanedValue) : cleverConvert(cleanedValue); + } + + const NodeMetaInfo &propertyTypeMetaInfo = propertyMetaInfo.propertyType(); + + if (propertyTypeMetaInfo.isColor()) + return PropertyParser::read(QVariant::Color, cleanedValue); + else if (propertyTypeMetaInfo.isUrl()) + return PropertyParser::read(QVariant::Url, cleanedValue); + else if (propertyTypeMetaInfo.isVector2D()) + return PropertyParser::read(QVariant::Vector2D, cleanedValue); + else if (propertyTypeMetaInfo.isVector3D()) + return PropertyParser::read(QVariant::Vector3D, cleanedValue); + else if (propertyTypeMetaInfo.isVector4D()) + return PropertyParser::read(QVariant::Vector4D, cleanedValue); + + QVariant value(cleanedValue); + if (propertyTypeMetaInfo.isBool()) { + value.convert(QVariant::Bool); + return value; + } else if (propertyTypeMetaInfo.isInteger()) { + value.convert(QVariant::Int); + return value; + } else if (propertyTypeMetaInfo.isFloat()) { + value.convert(QVariant::Double); + return value; + } else if (propertyTypeMetaInfo.isString()) { + // nothing to do + } else { //property alias et al + if (!hasQuotes) + return cleverConvert(cleanedValue); + } + return value; + } + QVariant convertToVariant(const QString &astValue, const QString &propertyPrefix, AST::UiQualifiedId *propertyId) { const bool hasQuotes = astValue.trimmed().left(1) == QStringLiteral("\"") && astValue.trimmed().right(1) == QStringLiteral("\""); @@ -1447,7 +1500,10 @@ QmlDesigner::PropertyName TextToModelMerger::syncScriptBinding(ModelNode &modelN syncVariantProperty(modelProperty, variantValue, TypeName(), differenceHandler); return astPropertyName.toUtf8(); } else { - const QVariant variantValue = context->convertToVariant(astValue, prefix, script->qualifiedId); + const QVariant variantValue = context->convertToVariant(modelNode, + astValue, + prefix, + script->qualifiedId); if (variantValue.isValid()) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); syncVariantProperty(modelProperty, variantValue, TypeName(), differenceHandler); From 18d2a221f274a6588f32f64ff3a924f31277c2ca Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 31 May 2023 19:21:45 +0200 Subject: [PATCH 030/149] QmlDesigner: Bypass resource management in rewriter The user does not expect the resource management to be triggered by the rewriter, therefore we skip it. Change-Id: I26932d268b9c27829dd2f1d2c80def8e7578899d Reviewed-by: Marco Bubke --- .../designercore/model/texttomodelmerger.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index e79d0f513a8..caeded485cb 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -387,6 +387,11 @@ bool smartVeryFuzzyCompare(const QVariant &value1, const QVariant &value2) return false; } + void removeModelNode(const QmlDesigner::ModelNode &modelNode) + { + modelNode.model()->removeModelNodes({modelNode}, + QmlDesigner::BypassModelResourceManagement::Yes); + } bool smartColorCompare(const QVariant &value1, const QVariant &value2) { if ((value1.type() == QVariant::Color) || (value2.type() == QVariant::Color)) @@ -394,6 +399,11 @@ bool smartColorCompare(const QVariant &value1, const QVariant &value2) return false; } + void removeProperty(const QmlDesigner::AbstractProperty &modelProperty) + { + modelProperty.model()->removeProperties({modelProperty}, + QmlDesigner::BypassModelResourceManagement::Yes); + } bool equals(const QVariant &a, const QVariant &b) { if (a.canConvert() && b.canConvert()) @@ -2074,7 +2084,7 @@ void ModelAmender::shouldBeNodeProperty(AbstractProperty &modelProperty, void ModelAmender::modelNodeAbsentFromQml(ModelNode &modelNode) { - modelNode.destroy(); + removeModelNode(modelNode); } ModelNode ModelAmender::listPropertyMissingModelNode(NodeListProperty &modelProperty, @@ -2151,7 +2161,7 @@ void ModelAmender::typeDiffers(bool isRootNode, Q_ASSERT(nodeIndex >= 0); } - modelNode.destroy(); + removeModelNode(modelNode); const ModelNode &newNode = m_merger->createModelNode(typeName, majorVersion, @@ -2171,7 +2181,7 @@ void ModelAmender::typeDiffers(bool isRootNode, void ModelAmender::propertyAbsentFromQml(AbstractProperty &modelProperty) { - modelProperty.parentModelNode().removeProperty(modelProperty.name()); + removeProperty(modelProperty); } void ModelAmender::idsDiffer(ModelNode &modelNode, const QString &qmlId) From 40954b8767352466a51a610a6c83592db3a8661b Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 31 May 2023 20:15:30 +0200 Subject: [PATCH 031/149] QmlDesigner: Handle invalid nodes and properties better rMdel::removeModelNodes and Model::removeProperties should filter invalid nodes. Change-Id: I270f6712cbcc0cd672c9551cccd1de5e740eb549 Reviewed-by: Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/model/model.cpp | 14 ++++++++ tests/unit/unittest/model-test.cpp | 32 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 0d00857ed81..8b139363b15 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -2335,6 +2335,12 @@ ModelNode Model::createModelNode(const TypeName &typeName) void Model::removeModelNodes(ModelNodes nodes, BypassModelResourceManagement bypass) { + nodes.erase(std::remove_if(nodes.begin(), nodes.end(), [](auto &&node) { return !node; }), + nodes.end()); + + if (nodes.empty()) + return; + std::sort(nodes.begin(), nodes.end()); ModelResourceSet set; @@ -2349,6 +2355,14 @@ void Model::removeModelNodes(ModelNodes nodes, BypassModelResourceManagement byp void Model::removeProperties(AbstractProperties properties, BypassModelResourceManagement bypass) { + properties.erase(std::remove_if(properties.begin(), + properties.end(), + [](auto &&property) { return !property; }), + properties.end()); + + if (properties.empty()) + return; + std::sort(properties.begin(), properties.end()); ModelResourceSet set; diff --git a/tests/unit/unittest/model-test.cpp b/tests/unit/unittest/model-test.cpp index f0bade227a6..82a2d253b40 100644 --- a/tests/unit/unittest/model-test.cpp +++ b/tests/unit/unittest/model-test.cpp @@ -531,6 +531,22 @@ TEST_F(Model, RemoveModelNodes) model.removeModelNodes({node, node2}); } +TEST_F(Model, RemoveModelNodesFiltersInvalidModelNodes) +{ + auto node = createNodeWithParent(rootNode, "yi"); + + EXPECT_CALL(resourceManagementMock, removeNodes(UnorderedElementsAre(node), &model)); + + model.removeModelNodes({{}, node}); +} + +TEST_F(Model, RemoveModelNodesForOnlyInvalidModelNodesDoesNothing) +{ + EXPECT_CALL(resourceManagementMock, removeNodes(_, _)).Times(0); + + model.removeModelNodes({{}}); +} + TEST_F(Model, RemoveModelNodesReverse) { auto node = createNodeWithParent(rootNode, "yi"); @@ -609,6 +625,22 @@ TEST_F(Model, RemoveProperties) model.removeProperties({property, property2}); } +TEST_F(Model, RemovePropertiesFiltersInvalidProperties) +{ + auto property = createProperty(rootNode, "yi"); + + EXPECT_CALL(resourceManagementMock, removeProperties(UnorderedElementsAre(property), &model)); + + model.removeProperties({{}, property}); +} + +TEST_F(Model, RemovePropertiesForOnlyInvalidPropertiesDoesNothing) +{ + EXPECT_CALL(resourceManagementMock, removeProperties(_, _)).Times(0); + + model.removeProperties({{}}); +} + TEST_F(Model, RemovePropertiesReverse) { auto property = createProperty(rootNode, "yi"); From 4e91fd627a4d726220e56d9a9991e74b3b5f86e5 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 31 May 2023 20:13:01 +0200 Subject: [PATCH 032/149] Don't add braces around single line scopes There is a new option which adds braces: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#insertbraces Change-Id: I1b0da930fa9faadb215fff4ed653bc95da0a6a17 Reviewed-by: Eike Ziller Reviewed-by: Qt CI Patch Build Bot --- .clang-format | 1 + src/plugins/qmldesigner/.clang-format | 1 + tests/unit/.clang-format | 1 + 3 files changed, 3 insertions(+) diff --git a/.clang-format b/.clang-format index 1b9871712f1..ef523006d7f 100644 --- a/.clang-format +++ b/.clang-format @@ -79,6 +79,7 @@ IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: false IndentWidth: 4 IndentWrappedFunctionNames: false +InsertBraces: false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false diff --git a/src/plugins/qmldesigner/.clang-format b/src/plugins/qmldesigner/.clang-format index e1dad0fa0c0..1b576b89626 100644 --- a/src/plugins/qmldesigner/.clang-format +++ b/src/plugins/qmldesigner/.clang-format @@ -63,6 +63,7 @@ IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: false IndentWidth: 4 IndentWrappedFunctionNames: false +InsertBraces : false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false diff --git a/tests/unit/.clang-format b/tests/unit/.clang-format index e1dad0fa0c0..1b576b89626 100644 --- a/tests/unit/.clang-format +++ b/tests/unit/.clang-format @@ -63,6 +63,7 @@ IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: false IndentWidth: 4 IndentWrappedFunctionNames: false +InsertBraces : false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false From f8bb89c121b05d8bee35e7597a3bde578cc390ad Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 1 Jun 2023 13:47:09 +0300 Subject: [PATCH 033/149] QmlDesigner: Add delay to bake lights setup dialog tooltips Fixes: QDS-9898 Change-Id: Ica886bc878932e9f94109fc1ae5d06e880e80801 Reviewed-by: Mahmoud Badri --- .../qmldesigner/edit3dQmlSource/BakeLightsSetupDialog.qml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/share/qtcreator/qmldesigner/edit3dQmlSource/BakeLightsSetupDialog.qml b/share/qtcreator/qmldesigner/edit3dQmlSource/BakeLightsSetupDialog.qml index 5924756bedf..5c202a4a60b 100644 --- a/share/qtcreator/qmldesigner/edit3dQmlSource/BakeLightsSetupDialog.qml +++ b/share/qtcreator/qmldesigner/edit3dQmlSource/BakeLightsSetupDialog.qml @@ -12,6 +12,8 @@ import StudioTheme as StudioTheme Rectangle { id: root + property int toolTipDelay: 1000 + color: StudioTheme.Values.themePanelBackground Column { @@ -99,6 +101,7 @@ Rectangle { hoverEnabled: true ToolTip.visible: hovered ToolTip.text: qsTr("The baking mode applied to this light.") + ToolTip.delay: root.toolTipDelay onActivated: bakeMode = currentValue } @@ -112,6 +115,7 @@ Rectangle { hoverEnabled: true ToolTip.visible: hovered ToolTip.text: qsTr("If checked, this model contributes to baked lighting,\nfor example in form of casting shadows or indirect light.") + ToolTip.delay: root.toolTipDelay onToggled: inUse = checked } @@ -125,6 +129,7 @@ Rectangle { hoverEnabled: true ToolTip.visible: hovered ToolTip.text: qsTr("If checked, baked lightmap texture is generated and rendered for this model.") + ToolTip.delay: root.toolTipDelay onToggled: isEnabled = checked } @@ -155,6 +160,7 @@ Rectangle { hoverEnabled: true ToolTip.visible: hovered ToolTip.text: qsTr("Generated lightmap resolution for this model.") + ToolTip.delay: root.toolTipDelay onRealValueChanged: resolution = realValue } @@ -176,6 +182,7 @@ Rectangle { hoverEnabled: true ToolTip.visible: hovered ToolTip.text: qsTr("If checked, baking settings above are not applied on close or bake.\nInstead, user is expected to set baking properties manually.") + ToolTip.delay: root.toolTipDelay onToggled: rootView.manualMode = checked } From 23c26686570e7e94352621d5ee0a2c33e6d29eb8 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 1 Jun 2023 02:06:31 +0200 Subject: [PATCH 034/149] QmlDesigner: Update clang-format Change-Id: I1793898e27a92aaf3f4f88390537c405d1f27427 Reviewed-by: Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/.clang-format | 42 ++++++++++++++++++++++++--- tests/unit/.clang-format | 42 ++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmldesigner/.clang-format b/src/plugins/qmldesigner/.clang-format index 1b576b89626..968dfdec7d1 100644 --- a/src/plugins/qmldesigner/.clang-format +++ b/src/plugins/qmldesigner/.clang-format @@ -6,10 +6,12 @@ AlignConsecutiveDeclarations: false AlignEscapedNewlines: DontAlign AlignOperands: true AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: Inline +AllowShortLambdasOnASingleLine: All AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AlwaysBreakAfterReturnType: None @@ -32,13 +34,16 @@ BraceWrapping: SplitEmptyFunction: false SplitEmptyRecord: false SplitEmptyNamespace: false +BreakAfterAttributes: Never BreakBeforeBinaryOperators: All BreakBeforeBraces: Custom +BreakBeforeConceptDeclarations: Always BreakBeforeInheritanceComma: false BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeComma BreakAfterJavaFieldAnnotations: false +BreakInheritanceList: AfterComma BreakStringLiterals: true ColumnLimit: 100 CommentPragmas: '^ IWYU pragma:' @@ -49,6 +54,8 @@ ContinuationIndentWidth: 4 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: @@ -56,11 +63,15 @@ ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH +#IncludeBlocks: Regroup IncludeCategories: - Regex: '^ Date: Thu, 1 Jun 2023 14:46:40 +0200 Subject: [PATCH 035/149] QmlDesigner: Bump QDS version in project template Change-Id: Ic58c2ae17a5d209f148ea8083947457516dd97d7 Reviewed-by: Thomas Hartmann --- .../studio_templates/projects/common/app.qmlproject.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/common/app.qmlproject.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/common/app.qmlproject.tpl index 9cfbab9228b..0b96ccf3ba3 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/common/app.qmlproject.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/common/app.qmlproject.tpl @@ -105,7 +105,7 @@ Project { /* Required for deployment */ targetDirectory: "/opt/%{ProjectName}" - qdsVersion: "4.1" + qdsVersion: "4.2" quickVersion: "%{QtQuickVersion}" From 1655f1f6225759d3538c1a08e4b074a7cb366a45 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 1 Jun 2023 13:01:19 +0200 Subject: [PATCH 036/149] QmlDesigner: Remove FlowTransition if to or from targets are removed Task-number: QDS-9766 Change-Id: I41c5d6769400772aa4b0d8b395b6a7ed79270cbd Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/include/model.h | 2 + .../qmldesigner/designercore/model/model.cpp | 20 +++++++ .../model/modelresourcemanagement.cpp | 54 +++++++++++++------ .../unittest/modelresourcemanagement-test.cpp | 22 ++++---- tests/unit/unittest/projectstoragemock.cpp | 1 + 5 files changed, 73 insertions(+), 26 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index e9a8ec3caa1..63126b4de06 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -105,6 +105,7 @@ public: NodeMetaInfo flowViewFlowActionAreaMetaInfo() const; NodeMetaInfo flowViewFlowDecisionMetaInfo() const; + NodeMetaInfo flowViewFlowItemMetaInfo() const; NodeMetaInfo flowViewFlowTransitionMetaInfo() const; NodeMetaInfo flowViewFlowWildcardMetaInfo() const; NodeMetaInfo fontMetaInfo() const; @@ -127,6 +128,7 @@ public: NodeMetaInfo qtQuickTextMetaInfo() const; NodeMetaInfo qtQuickTimelineKeyframeGroupMetaInfo() const; NodeMetaInfo qtQuickTimelineTimelineMetaInfo() const; + NodeMetaInfo qtQuickTransistionMetaInfo() const; NodeMetaInfo vector2dMetaInfo() const; NodeMetaInfo vector3dMetaInfo() const; NodeMetaInfo vector4dMetaInfo() const; diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 8b139363b15..8e3029f4c9c 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -2012,6 +2012,16 @@ NodeMetaInfo Model::flowViewFlowDecisionMetaInfo() const } } +NodeMetaInfo Model::flowViewFlowItemMetaInfo() const +{ + if constexpr (useProjectStorage()) { + using namespace Storage::Info; + return createNodeMetaInfo(); + } else { + return metaInfo("FlowView.FlowItem"); + } +} + NodeMetaInfo Model::flowViewFlowWildcardMetaInfo() const { if constexpr (useProjectStorage()) { @@ -2122,6 +2132,16 @@ NodeMetaInfo Model::qtQuickTimelineTimelineMetaInfo() const } } +NodeMetaInfo Model::qtQuickTransistionMetaInfo() const +{ + if constexpr (useProjectStorage()) { + using namespace Storage::Info; + return createNodeMetaInfo(); + } else { + return metaInfo("QtQuick.Transition"); + } +} + NodeMetaInfo Model::qtQuickConnectionsMetaInfo() const { if constexpr (useProjectStorage()) { diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp index a40e47e9d6e..cf2152baff5 100644 --- a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp @@ -443,36 +443,62 @@ struct DependenciesSet NodesProperties targetsNodesProperties; }; -template struct TargetFilter { - TargetFilter(Predicate predicate, NodeDependencies &dependencies) - : predicate{std::move(predicate)} + TargetFilter(NodeDependencies &dependencies, Model *model) + : flowViewFlowActionAreaMetaInfo{model->flowViewFlowActionAreaMetaInfo()} + , flowViewFlowTransitionMetaInfo{model->flowViewFlowTransitionMetaInfo()} + , qtQuickPropertyChangesMetaInfo{model->qtQuickPropertyChangesMetaInfo()} + , qtQuickTimelineKeyframeGroupMetaInfo{model->qtQuickTimelineKeyframeGroupMetaInfo()} + , qtQuickPropertyAnimationMetaInfo{model->qtQuickPropertyAnimationMetaInfo()} , dependencies{dependencies} {} - static std::optional resolveTarget(const ModelNode &node) + static std::optional resolveBinding(const ModelNode &node, + const PropertyName &propertyName) { - auto targetProperty = node.bindingProperty("target"); - if (targetProperty.exists()) { - if (ModelNode targetNode = targetProperty.resolveToModelNode()) + auto property = node.bindingProperty(propertyName); + if (property.exists()) { + if (ModelNode targetNode = property.resolveToModelNode()) return targetNode; } return {}; } + bool hasTargetProperty(const NodeMetaInfo &metaInfo) const + { + return metaInfo.isBasedOn(qtQuickPropertyChangesMetaInfo, + qtQuickTimelineKeyframeGroupMetaInfo, + flowViewFlowActionAreaMetaInfo, + qtQuickPropertyAnimationMetaInfo); + } + + bool hasToOrFromProperty(const NodeMetaInfo &metaInfo) + { + return metaInfo.isBasedOn(flowViewFlowTransitionMetaInfo); + } + void operator()(const NodeMetaInfo &metaInfo, const ModelNode &node) { - if (predicate(metaInfo)) { - if (auto targetNode = resolveTarget(node)) + if (hasTargetProperty(metaInfo)) { + if (auto targetNode = resolveBinding(node, "target")) dependencies.push_back({std::move(*targetNode), node}); + } else if (hasToOrFromProperty(metaInfo)) { + if (auto toNode = resolveBinding(node, "to")) + dependencies.push_back({std::move(*toNode), node}); + if (auto fromNode = resolveBinding(node, "from")) + dependencies.push_back({std::move(*fromNode), node}); } } void finally() { std::sort(dependencies.begin(), dependencies.end()); } - Predicate predicate; + NodeMetaInfo flowViewFlowActionAreaMetaInfo; + NodeMetaInfo flowViewFlowTransitionMetaInfo; + NodeMetaInfo qtQuickPropertyChangesMetaInfo; + NodeMetaInfo qtQuickTimelineKeyframeGroupMetaInfo; + NodeMetaInfo qtQuickPropertyAnimationMetaInfo; NodeDependencies &dependencies; }; @@ -597,13 +623,7 @@ DependenciesSet createDependenciesSet(Model *model) auto qtQuickPropertyAnimationMetaInfo = model->qtQuickPropertyAnimationMetaInfo(); auto filters = std::make_tuple( - TargetFilter{[&](auto &&metaInfo) { - return metaInfo.isBasedOn(qtQuickPropertyChangesMetaInfo, - qtQuickTimelineKeyframeGroupMetaInfo, - flowViewFlowActionAreaMetaInfo, - qtQuickPropertyAnimationMetaInfo); - }, - set.nodeDependencies}, + TargetFilter{set.nodeDependencies, model}, TargetsFilter{[&](auto &&metaInfo) { return metaInfo.isBasedOn(flowViewFlowDecisionMetaInfo, flowViewFlowWildcardMetaInfo, diff --git a/tests/unit/unittest/modelresourcemanagement-test.cpp b/tests/unit/unittest/modelresourcemanagement-test.cpp index 38cc5d8c797..620ae9a4a1d 100644 --- a/tests/unit/unittest/modelresourcemanagement-test.cpp +++ b/tests/unit/unittest/modelresourcemanagement-test.cpp @@ -204,6 +204,7 @@ struct TargetData { QmlDesigner::TypeName targetType; QmlDesigner::TypeName type; + QmlDesigner::PropertyName propertyName; // printer function for TargetData - don't remove friend std::ostream &operator<<(std::ostream &os, const TargetData &data) @@ -226,17 +227,20 @@ protected: ModelNode source2 = createNodeWithParent(parameters.type, rootNode.defaultNodeListProperty(), "source2"); - QmlDesigner::BindingProperty sourceTargetProperty = source.bindingProperty("target"); - QmlDesigner::BindingProperty source2TargetProperty = source2.bindingProperty("target"); + QmlDesigner::BindingProperty sourceTargetProperty = source.bindingProperty(parameters.propertyName); + QmlDesigner::BindingProperty source2TargetProperty = source2.bindingProperty( + parameters.propertyName); }; -INSTANTIATE_TEST_SUITE_P(ModelResourceManagement, - ForTarget, - testing::Values(TargetData{"QtQuick.Item", "QtQuick.PropertyChanges"}, - TargetData{"QtQuick.Item", "QtQuick.Timeline.KeyframeGroup"}, - TargetData{"FlowView.FlowTransition", - "FlowView.FlowActionArea"}, - TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation"})); +INSTANTIATE_TEST_SUITE_P( + ModelResourceManagement, + ForTarget, + testing::Values(TargetData{"QtQuick.Item", "QtQuick.PropertyChanges", "target"}, + TargetData{"QtQuick.Item", "QtQuick.Timeline.KeyframeGroup", "target"}, + TargetData{"FlowView.FlowTransition", "FlowView.FlowActionArea", "target"}, + TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation", "target"}, + TargetData{"FlowView.FlowItem", "FlowView.FlowTransition", "to"}, + TargetData{"FlowView.FlowItem", "FlowView.FlowTransition", "from"})); TEST_P(ForTarget, Remove) { diff --git a/tests/unit/unittest/projectstoragemock.cpp b/tests/unit/unittest/projectstoragemock.cpp index e939c8984e8..71d789d0d95 100644 --- a/tests/unit/unittest/projectstoragemock.cpp +++ b/tests/unit/unittest/projectstoragemock.cpp @@ -124,6 +124,7 @@ void ProjectStorageMock::setupQtQtuick() QmlDesigner::createObject(*this, flowViewModuleId, "FlowWildcard", "data", {qtObjectId}); QmlDesigner::createObject(*this, flowViewModuleId, "FlowDecision", "", {qtObjectId}); QmlDesigner::createObject(*this, flowViewModuleId, "FlowTransition", "", {qtObjectId}); + QmlDesigner::createObject(*this, flowViewModuleId, "FlowItem", "data", {qtObjectId, itemId}); } void ProjectStorageMock::setupCommonTypeCache() From 94b5b095867c279eed4b105aeb70a9da96cac8a7 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Thu, 1 Jun 2023 16:15:35 +0200 Subject: [PATCH 037/149] QmlDesigner: Fix unused warning Change-Id: Ie849bd37ba1d1c502a20885f11cf5ddd35a268e4 Reviewed-by: Marco Bubke --- src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp index 53359fb2440..abecca1788a 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp @@ -128,7 +128,7 @@ void MetaInfoPrivate::parseItemLibraryDescriptions(const ExternalDependenciesInt Internal::MetaInfoReader reader(*m_q); try { reader.readMetaInfoFile(path.toString()); - } catch (const InvalidMetaInfoException &e) { + } catch ([[maybe_unused]] const InvalidMetaInfoException &e) { #ifndef UNIT_TESTS qWarning() << e.description(); const QString errorMessage = path.toString() + QLatin1Char('\n') + QLatin1Char('\n') From a687af8324bb92531bb1531297ea638ae75a14c6 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 1 Jun 2023 13:14:47 +0200 Subject: [PATCH 038/149] QmlDesigner: Unify and fix property comparison So far string and QString were not considered equal. Unifying the type comparison. Task-number: QDS-9938 Change-Id: Ia64fee9b56b8cf916669aca1d3f09a3f05ecf29f Reviewed-by: Aleksei German --- .../bindingeditor/bindingeditor.cpp | 58 +++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp index 6cd3e814929..8c8d0911793 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp @@ -174,27 +174,38 @@ void BindingEditor::prepareBindings() QList bindings; - const QList variantTypes = {"alias", "unknown", "variant", "var"}; - const QList numericTypes = {"double", "real", "int"}; - const QList colorTypes = {"QColor", "color"}; - auto isVariant = [&variantTypes](const TypeName &compareType) { return variantTypes.contains(compareType); }; - auto isNumeric = [&numericTypes](const TypeName &compareType) { return numericTypes.contains(compareType); }; - auto isColor = [&colorTypes](const TypeName &compareType) { return colorTypes.contains(compareType); }; + const QVarLengthArray variantTypes = {"alias", "unknown", "variant", "var"}; + const QVarLengthArray numericTypes = {"double", "real", "int"}; + const QVarLengthArray colorTypes = {"QColor", "color"}; + const QVarLengthArray stringTypes = {"QString", "string"}; - const bool skipTypeFiltering = isVariant(m_backendValueTypeName); - const bool targetTypeIsNumeric = isNumeric(m_backendValueTypeName); + auto isVariant = [&variantTypes](const TypeName &compareType) { + return variantTypes.contains(compareType); + }; + auto isNumeric = [&numericTypes](const TypeName &compareType) { + return numericTypes.contains(compareType); + }; + auto isColor = [&colorTypes](const TypeName &compareType) { + return colorTypes.contains(compareType); + }; + auto isString = [&stringTypes](const TypeName &compareType) { + return stringTypes.contains(compareType); + }; + + auto compareTypes = [&](const TypeName &targetType, const TypeName &sourceType) { + return isVariant(targetType) || isVariant(sourceType) || (targetType == sourceType) + || (isNumeric(targetType) && isNumeric(sourceType)) + || (isColor(targetType) && isColor(sourceType)) + || (isString(targetType) && isString(sourceType)); + }; for (const auto &objnode : allNodes) { BindingEditorDialog::BindingOption binding; for (const auto &property : objnode.metaInfo().properties()) { const TypeName &propertyTypeName = property.propertyType().simplifiedTypeName(); - if (skipTypeFiltering - || (m_backendValueTypeName == propertyTypeName) - || isVariant(propertyTypeName) - || (targetTypeIsNumeric && isNumeric(propertyTypeName))) { + if (compareTypes(m_backendValueTypeName, propertyTypeName)) binding.properties.append(QString::fromUtf8(property.name())); - } } //dynamic properties: @@ -202,12 +213,8 @@ void BindingEditor::prepareBindings() if (bindingProperty.isValid()) { if (bindingProperty.isDynamic()) { const TypeName dynamicTypeName = bindingProperty.dynamicTypeName(); - if (skipTypeFiltering - || (dynamicTypeName == m_backendValueTypeName) - || isVariant(dynamicTypeName) - || (targetTypeIsNumeric && isNumeric(dynamicTypeName))) { + if (compareTypes(m_backendValueTypeName, dynamicTypeName)) binding.properties.append(QString::fromUtf8(bindingProperty.name())); - } } } } @@ -215,12 +222,8 @@ void BindingEditor::prepareBindings() if (variantProperty.isValid()) { if (variantProperty.isDynamic()) { const TypeName dynamicTypeName = variantProperty.dynamicTypeName(); - if (skipTypeFiltering - || (dynamicTypeName == m_backendValueTypeName) - || isVariant(dynamicTypeName) - || (targetTypeIsNumeric && isNumeric(dynamicTypeName))) { + if (compareTypes(m_backendValueTypeName, dynamicTypeName)) binding.properties.append(QString::fromUtf8(variantProperty.name())); - } } } } @@ -241,15 +244,10 @@ void BindingEditor::prepareBindings() BindingEditorDialog::BindingOption binding; for (const auto &property : metaInfo.properties()) { - TypeName propertyTypeName = property.propertyType().typeName(); + const TypeName propertyTypeName = property.propertyType().typeName(); - if (skipTypeFiltering - || (m_backendValueTypeName == propertyTypeName) - || (isVariant(propertyTypeName)) - || (targetTypeIsNumeric && isNumeric(propertyTypeName)) - || (isColor(m_backendValueTypeName) && isColor(propertyTypeName))) { + if (compareTypes(m_backendValueTypeName, propertyTypeName)) binding.properties.append(QString::fromUtf8(property.name())); - } } if (!binding.properties.isEmpty()) { From 547f71963131fe5b3f68f9f913fd21e0a7f3da27 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 1 Jun 2023 14:42:43 +0200 Subject: [PATCH 039/149] QmlProject: Add trace point to qmlproject We use the qmldesignerplugin, if the qmldesigner plugin is disabled then nothing is traced. Task-number: QDS-10010 Change-Id: Ifa7f7719efca6a757e69b75937368d7a69a5e460 Reviewed-by: Thomas Hartmann --- .../cmakegen/generatecmakelists.cpp | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp b/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp index 7f40fbf5d27..40d634361e0 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp +++ b/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp @@ -19,6 +19,10 @@ #include #include +#include +#include +#include + #include #include @@ -36,6 +40,27 @@ namespace QmlProjectManager { namespace GenerateCmake { +static bool isQmlDesigner(const ExtensionSystem::PluginSpec *spec) +{ + if (!spec) + return false; + + return spec->name().contains("QmlDesigner"); +} + +static void trackUsage(const QString &id) +{ + const auto plugins = ExtensionSystem::PluginManager::plugins(); + const auto it = std::find_if(plugins.begin(), plugins.end(), &isQmlDesigner); + if (it != plugins.end()) { + QObject *qmlDesignerPlugin = (*it)->plugin(); + QMetaObject::invokeMethod(qmlDesignerPlugin, + "usageStatisticsNotifier", + Qt::DirectConnection, + Q_ARG(QString, id)); + } +} + bool operator==(const GeneratableFile &left, const GeneratableFile &right) { return (left.filePath == right.filePath && left.content == right.content); @@ -99,6 +124,8 @@ void generateMenuEntry(QObject *parent) void onGenerateCmakeLists() { + trackUsage("generateCMakeProjectDialogOpened"); + FilePath rootDir = ProjectExplorer::SessionManager::startupProject()->projectDirectory(); int projectDirErrors = isProjectCorrectlyFormed(rootDir); @@ -121,6 +148,8 @@ void onGenerateCmakeLists() cmakeGen.filterFileQueue(confirmedFiles); cmakeGen.execute(); } + + trackUsage("generateCMakeProjectExecuted"); } bool isErrorFatal(int error) From 621df696d49ea92e760e38895c62f5462b6f915b Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 1 Jun 2023 18:10:02 +0200 Subject: [PATCH 040/149] QmlDesigner: Add support to trace two following events By calling registerCombinedTracedPoints we collect the duration between EVENT_STATE_ADDED and EVENT_STATE_CLONED. If EVENT_STATE_CLONED. follows after EVENT_STATE_ADDED in less than 10 seconds we emit EVENT_STATE_ADDED_AND_CLONED togehter with the actual duration between the events. Task-number: QDS-9961 Change-Id: If23b7dfa4e34bd533492b78f066dcb7518c2563e Reviewed-by: Marco Bubke Reviewed-by: Qt CI Bot --- .../qmldesigner/qmldesignerconstants.h | 1 + src/plugins/qmldesigner/qmldesignerplugin.cpp | 69 +++++++++++++++++++ src/plugins/qmldesigner/qmldesignerplugin.h | 10 ++- 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index ac37559d5cc..8e570b5f722 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -99,6 +99,7 @@ const int MODELNODE_PREVIEW_IMAGE_DIMENSIONS = 150; const char EVENT_TIMELINE_ADDED[] = "timelineAdded"; const char EVENT_TRANSITION_ADDED[] = "transitionAdded"; const char EVENT_STATE_ADDED[] = "stateAdded"; +const char EVENT_STATE_ADDED_AND_CLONED[] = "stateAddedAndCloned"; const char EVENT_STATE_CLONED[] = "stateCloned"; const char EVENT_STATE_EXTENDED[] = "stateExtended"; const char EVENT_CONNECTION_ADDED[] = "connectionAdded"; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 4a1744692d4..7fcce8cf531 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -132,6 +132,20 @@ QtQuickDesignerFactory::QtQuickDesignerFactory() } // namespace Internal +struct TraceIdentifierData +{ + TraceIdentifierData(const QString &_identifier, const QString &_newIdentifer, int _duration) + : identifier(_identifier), newIdentifer(_newIdentifer), maxDuration(_duration) + {} + + TraceIdentifierData() = default; + + QString identifier; + QString newIdentifer; + int maxDuration; + int time = 0; +}; + class QmlDesignerPluginPrivate { public: @@ -146,6 +160,9 @@ public: bool blockEditorChange = false; Utils::UniqueObjectPtr toolBar; Utils::UniqueObjectPtr statusBar; + QHash m_traceIdentifierDataHash; + QHash m_activeTraceIdentifierDataHash; + QElapsedTimer timer; }; QmlDesignerPlugin *QmlDesignerPlugin::m_instance = nullptr; @@ -250,6 +267,7 @@ bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *e if (!Utils::HostOsInfo::canCreateOpenGLContext(errorMessage)) return false; d = new QmlDesignerPluginPrivate; + d->timer.start(); if (QmlProjectManager::QmlProject::isQtDesignStudio()) GenerateResource::generateMenuEntry(this); @@ -353,6 +371,10 @@ void QmlDesignerPlugin::extensionsInitialized() actionManager.createDefaultAddResourceHandler(); actionManager.createDefaultModelNodePreviewImageHandlers(); actionManager.polishActions(); + + registerCombinedTracedPoints(Constants::EVENT_STATE_ADDED, + Constants::EVENT_STATE_CLONED, + Constants::EVENT_STATE_ADDED_AND_CLONED); } ExtensionSystem::IPlugin::ShutdownFlag QmlDesignerPlugin::aboutToShutdown() @@ -613,6 +635,12 @@ Model *QmlDesignerPlugin::currentModel() const return currentDesignDocument()->currentModel(); } +QmlDesignerPluginPrivate *QmlDesignerPlugin::privateInstance() +{ + QTC_ASSERT(instance(), return nullptr); + return instance()->d; +} + DesignDocument *QmlDesignerPlugin::currentDesignDocument() const { if (d) @@ -674,6 +702,35 @@ void QmlDesignerPlugin::emitUsageStatistics(const QString &identifier) { QTC_ASSERT(instance(), return); emit instance()->usageStatisticsNotifier(normalizeIdentifier(identifier)); + + TraceIdentifierData activeData = privateInstance()->m_activeTraceIdentifierDataHash.value( + identifier); + + if (activeData.time) { + const int currentTime = privateInstance()->timer.elapsed(); + const int currentDuration = (currentTime - activeData.time); + if (currentDuration < activeData.maxDuration) + emit instance()->usageStatisticsUsageDuration(activeData.newIdentifer, currentDuration); + + privateInstance()->m_activeTraceIdentifierDataHash.remove(identifier); + } else { + TraceIdentifierData data = privateInstance()->m_traceIdentifierDataHash.value(identifier); + + if (!data.identifier.isEmpty()) { + data.time = privateInstance()->timer.elapsed(); + privateInstance()->m_activeTraceIdentifierDataHash.insert(data.identifier, data); + } + } + + const auto values = privateInstance()->m_activeTraceIdentifierDataHash.values(); + for (const auto &activeData : values) { + const int currentTime = privateInstance()->timer.elapsed(); + const int currentDuration = (currentTime - activeData.time); + + if (currentDuration > activeData.maxDuration) { + privateInstance()->m_activeTraceIdentifierDataHash.remove(activeData.identifier); + } + } } void QmlDesignerPlugin::emitUsageStatisticsContextAction(const QString &identifier) @@ -728,6 +785,18 @@ void QmlDesignerPlugin::trackWidgetFocusTime(QWidget *widget, const QString &ide }); } +void QmlDesignerPlugin::registerCombinedTracedPoints(const QString &identifierFirst, + const QString &identifierSecond, + const QString &newIdentifier, + int maxDuration) +{ + QTC_ASSERT(privateInstance(), return ); + privateInstance()->m_traceIdentifierDataHash.insert(identifierFirst, + TraceIdentifierData(identifierSecond, + newIdentifier, + maxDuration)); +} + void QmlDesignerPlugin::lauchFeedbackPopup(const QString &identifier) { if (Core::ModeManager::currentModeId() == Core::Constants::MODE_DESIGN) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.h b/src/plugins/qmldesigner/qmldesignerplugin.h index ee078b273ab..8c3317ccb9f 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.h +++ b/src/plugins/qmldesigner/qmldesignerplugin.h @@ -82,11 +82,18 @@ public: static void registerPreviewImageProvider(QQmlEngine *engine); static void trackWidgetFocusTime(QWidget *widget, const QString &identifier); + static void registerCombinedTracedPoints(const QString &identifierFirst, + const QString &identifierSecond, + const QString &newIdentifier, + int maxDuration = 10000); signals: void usageStatisticsNotifier(const QString &identifier); void usageStatisticsUsageTimer(const QString &identifier, int elapsed); - void usageStatisticsInsertFeedback(const QString &identifier, const QString &feedback, int rating); + void usageStatisticsUsageDuration(const QString &identifier, int elapsed); + void usageStatisticsInsertFeedback(const QString &identifier, + const QString &feedback, + int rating); void assetChanged(const QString &assetPath); private slots: @@ -110,6 +117,7 @@ private: // functions RewriterView *rewriterView() const; Model *currentModel() const; QQuickWidget *m_feedbackWidget = nullptr; + static QmlDesignerPluginPrivate *privateInstance(); private: // variables QmlDesignerPluginPrivate *d = nullptr; From 65600c88050c66109383dcd73421a4fce9ad6e58 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 15 May 2023 10:42:38 +0200 Subject: [PATCH 041/149] QmlDesigner: Fix EditableListView - Fix ComboBox value not cleared after last material removed - Add ListValidator - Use ListValidator for the EditableListView in order to properly check for acceptable input in regards to textRole and valueRole Task-number: QDS-9645 Task-number: QDS-9891 Task-number: QDS-9896 Change-Id: Ia3ebad1f8080a4a4ef6bd0da6a72e335d1e76643 Reviewed-by: Ali Kianian Reviewed-by: Thomas Hartmann Reviewed-by: --- .../HelperWidgets/EditableListView.qml | 100 ++++++++++++------ .../HelperWidgets/ListViewComboBox.qml | 17 +++ .../imports/StudioControls/ComboBox.qml | 10 +- src/plugins/qmldesigner/CMakeLists.txt | 1 + .../propertyeditor/itemfiltermodel.cpp | 68 ++++++++++-- .../propertyeditor/itemfiltermodel.h | 16 ++- .../propertyeditor/listvalidator.cpp | 58 ++++++++++ .../components/propertyeditor/listvalidator.h | 33 ++++++ .../quick2propertyeditorview.cpp | 6 +- 9 files changed, 261 insertions(+), 48 deletions(-) create mode 100644 src/plugins/qmldesigner/components/propertyeditor/listvalidator.cpp create mode 100644 src/plugins/qmldesigner/components/propertyeditor/listvalidator.h diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/EditableListView.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/EditableListView.qml index b8792c71ea6..1d007e0222a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/EditableListView.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/EditableListView.qml @@ -24,7 +24,9 @@ Item { property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth property real __actionIndicatorHeight: StudioTheme.Values.height property string typeFilter: "QtQuick3D.Material" - property string textRole: "idAndName" + // This binding is a workaround to overcome the rather long adaption to new Qt versions. This + // should actually be fixed in the ModelSection.qml by setting the textRole: "idAndName". + property string textRole: (root.typeFilter === "QtQuick3D.Material") ? "idAndName" : "id" property string valueRole: "id" property int activatedReason: ComboBox.ActivatedReason.Other @@ -42,60 +44,78 @@ Item { Layout.preferredWidth: StudioTheme.Values.height * 10 Layout.preferredHeight: myColumn.height + HelperWidgets.ListValidator { + id: listValidator + filterList: itemFilterModel.validationItems + } + HelperWidgets.ItemFilterModel { id: itemFilterModel typeFilter: root.typeFilter modelNodeBackendProperty: modelNodeBackend selectedItems: root.allowDuplicates ? [] : root.model + validationRoles: [root.textRole, root.valueRole] } Component { id: myDelegate Row { - property alias comboBox: itemFilterComboBox + property alias comboBox: delegateComboBox ListViewComboBox { - id: itemFilterComboBox + id: delegateComboBox property int myIndex: index - property bool empty: itemFilterComboBox.initialModelData === "" - - validator: RegExpValidator { regExp: /(^[a-z_]\w*|^[A-Z]\w*\.{1}([a-z_]\w*\.?)+)/ } + property bool empty: delegateComboBox.initialModelData === "" + validator: listValidator actionIndicatorVisible: false model: itemFilterModel initialModelData: modelData textRole: root.textRole valueRole: root.valueRole implicitWidth: StudioTheme.Values.singleControlColumnWidth - width: implicitWidth + width: delegateComboBox.implicitWidth textElidable: true onFocusChanged: { - if (itemFilterComboBox.focus) + if (delegateComboBox.focus) { myColumn.currentIndex = index + } else { + if (!delegateComboBox.dirty) + return - var curValue = itemFilterComboBox.availableValue() - if (itemFilterComboBox.empty && curValue !== "") { - myRepeater.dirty = false - root.add(curValue) + // If focus is lost check if text was changed and try to search for it in + // the text as well as in the value role. + let idx = delegateComboBox.indexOfString(delegateComboBox.editText) + if (idx === -1) { + delegateComboBox.editText = delegateComboBox.preFocusText + } else { + delegateComboBox.currentIndex = idx + if (delegateComboBox.empty && delegateComboBox.currentValue !== "") { + myRepeater.dirty = false + root.add(delegateComboBox.currentValue) + } else { + root.replace(delegateComboBox.myIndex, delegateComboBox.currentValue) + } + } } } onCompressedActivated: function(index, reason) { root.activatedReason = reason - var curValue = itemFilterComboBox.availableValue() - if (itemFilterComboBox.empty && curValue) { + var curValue = delegateComboBox.availableValue() + if (delegateComboBox.empty && curValue) { myRepeater.dirty = false root.add(curValue) } else { - root.replace(itemFilterComboBox.myIndex, curValue) + root.replace(delegateComboBox.myIndex, curValue) } } - onHoverChanged: root.delegateHover = itemFilterComboBox.hover + onHoverChanged: root.delegateHover = delegateComboBox.hover } Spacer { implicitWidth: extraButton.visible ? 5 : StudioTheme.Values.twoControlColumnGap } @@ -114,15 +134,17 @@ Item { icon: StudioTheme.Constants.closeCross onClicked: { var lastItem = index === myRepeater.localModel.length - 1 - if (myColumn.currentItem.initialModelData === "") { + var tmp = myRepeater.itemAt(index) + + myColumn.currentIndex = index - 1 + + if (tmp.comboBox.initialModelData === "") { myRepeater.localModel.pop() myRepeater.dirty = false myRepeater.model = myRepeater.localModel // trigger on change handler } else { root.remove(index) } - if (!lastItem) - myColumn.currentIndex = index - 1 } onHoveredChanged: root.delegateHover = closeIndicator.hovered } @@ -152,6 +174,11 @@ Item { myColumn.currentItem = tmp.comboBox } + onCurrentItemChanged: { + if (myColumn.currentItem !== null) + myColumn.currentItem.forceActiveFocus() + } + Repeater { id: myRepeater @@ -162,7 +189,7 @@ Item { onItemAdded: function(index, item) { if (index === myColumn.currentIndex) - myColumn.currentItem = item + myColumn.currentItem = item.comboBox } function updateModel() { @@ -180,9 +207,7 @@ Item { myRepeater.model = myRepeater.localModel // trigger on change handler - if (lastIndex < 0 && myRepeater.localModel.length > 0) - myColumn.currentIndex = 0 - else if (myRepeater.localModel.length > lastIndex) + if (myRepeater.localModel.length > lastIndex) myColumn.currentIndex = lastIndex else myColumn.currentIndex = myRepeater.localModel.length - 1 @@ -196,28 +221,41 @@ Item { ListViewComboBox { id: dummyComboBox visible: myRepeater.count === 0 - validator: RegExpValidator { regExp: /(^[a-z_]\w*|^[A-Z]\w*\.{1}([a-z_]\w*\.?)+)/ } + validator: listValidator actionIndicatorVisible: false model: itemFilterModel textRole: root.textRole valueRole: root.valueRole implicitWidth: StudioTheme.Values.singleControlColumnWidth - width: implicitWidth + width: dummyComboBox.implicitWidth + + onVisibleChanged: dummyComboBox.currentIndex = -1 onFocusChanged: { - var curValue = dummyComboBox.availableValue() - if (curValue !== "") - root.add(curValue) + if (dummyComboBox.focus) + return + + if (!dummyComboBox.dirty) + return + + // If focus is lost check if text was changed and try to search for it in + // the text as well as in the value role. + let idx = dummyComboBox.indexOfString(dummyComboBox.editText) + if (idx === -1) { + dummyComboBox.editText = dummyComboBox.preFocusText + } else { + dummyComboBox.currentIndex = idx + if (dummyComboBox.currentValue !== "") + root.add(dummyComboBox.currentValue) + } } - onCompressedActivated: { + onCompressedActivated: function(index, reason) { root.activatedReason = reason var curValue = dummyComboBox.availableValue() if (curValue !== "") root.add(curValue) - else - root.replace(dummyComboBox.myIndex, curValue) } onHoverChanged: root.delegateHover = dummyComboBox.hover diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ListViewComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ListViewComboBox.qml index 1f8dbbb3d41..3e15540d140 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ListViewComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ListViewComboBox.qml @@ -51,4 +51,21 @@ StudioControls.ComboBox { return root.editText } + + // Checks if the given parameter can be found as a value or text (valueRole vs. textRole). If + // both searches result an index !== -1 the text is preferred, otherwise index will be returned + // or -1 if not found. + // Text is preferred due to the fact that usually the users use the autocomplete functionality + // of an editable ComboBox hence there will be more hits on text search then on value. + function indexOfString(text) { + let textIndex = root.find(text) + if (textIndex !== -1) + return textIndex + + let valueIndex = root.indexOfValue(text) + if (valueIndex !== -1) + return valueIndex + + return -1 + } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml index 39b1ac8a1cf..abbb32744b5 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml @@ -34,6 +34,8 @@ T.ComboBox { property int maximumPopupHeight: control.style.maxComboBoxPopupHeight + property string preFocusText: "" + signal compressedActivated(int index, int reason) enum ActivatedReason { EditingFinished, Other } @@ -53,7 +55,7 @@ T.ComboBox { onActiveFocusChanged: { if (control.activeFocus) - comboBoxInput.preFocusText = control.editText + control.preFocusText = control.editText } ActionIndicator { @@ -69,8 +71,6 @@ T.ComboBox { contentItem: ComboBoxInput { id: comboBoxInput - property string preFocusText: "" - style: control.style __parentControl: control text: control.editText @@ -332,8 +332,8 @@ T.ComboBox { Keys.onPressed: function(event) { if (event.key === Qt.Key_Escape) { - control.editText = comboBoxInput.preFocusText - control.dirty = true + control.editText = control.preFocusText + control.dirty = false control.focus = false } } diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 94140aa0217..4913ac79eed 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -743,6 +743,7 @@ extend_qtc_plugin(QmlDesigner designerpropertymap.cpp designerpropertymap.h fileresourcesmodel.cpp fileresourcesmodel.h itemfiltermodel.cpp itemfiltermodel.h + listvalidator.cpp listvalidator.h gradientmodel.cpp gradientmodel.h dynamicpropertiesproxymodel.cpp dynamicpropertiesproxymodel.h gradientpresetcustomlistmodel.cpp gradientpresetcustomlistmodel.h diff --git a/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.cpp index c5d9a23d7ea..aa1d41888b6 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.cpp @@ -61,6 +61,19 @@ void ItemFilterModel::setSelectedItems(const QStringList &selectedItems) emit selectedItemsChanged(); } +void ItemFilterModel::setValidationRoles(const QStringList &validationRoles) +{ + auto tmp = validationRoles; + tmp.removeDuplicates(); + + if (m_validationRoles == tmp) + return; + + m_validationRoles = tmp; + setupValidationItems(); + emit validationRolesChanged(); +} + QString ItemFilterModel::typeFilter() const { return m_typeFilter; @@ -76,6 +89,29 @@ QStringList ItemFilterModel::selectedItems() const return m_selectedItems; } +QStringList ItemFilterModel::itemModel() const +{ + AbstractView *view = m_modelNode.view(); + if (!view || !view->model()) + return {}; + + QStringList retval; + for (const auto &internalId : std::as_const(m_modelInternalIds)) + retval << view->modelNodeForInternalId(internalId).id(); + + return retval; +} + +QStringList ItemFilterModel::validationRoles() const +{ + return m_validationRoles; +} + +QStringList ItemFilterModel::validationItems() const +{ + return m_validationItems; +} + void ItemFilterModel::registerDeclarativeType() { qmlRegisterType("HelperWidgets", 2, 0, "ItemFilterModel"); @@ -154,17 +190,33 @@ void ItemFilterModel::setupModel() endResetModel(); emit itemModelChanged(); + + setupValidationItems(); } -QStringList ItemFilterModel::itemModel() const +void ItemFilterModel::setupValidationItems() { - AbstractView *view = m_modelNode.view(); - if (!view || !view->model()) - return {}; + QStringList validationItems; - QStringList retval; - for (const auto &internalId : std::as_const(m_modelInternalIds)) - retval << view->modelNodeForInternalId(internalId).id(); + for (const QString &role : m_validationRoles) { + int r = roleNames().key(role.toUtf8(), -1); - return retval; + if (r == -1) + continue; + + for (int i = 0; i < rowCount(); ++i) { + QVariant item = data(index(i), r); + if (item.canConvert()) + validationItems.append(item.toString()); + } + } + + validationItems.removeDuplicates(); + + if (m_validationItems == validationItems) + return; + + m_validationItems = validationItems; + + emit validationItemsChanged(); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.h b/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.h index cb7ae131778..eaf23820d4f 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.h +++ b/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.h @@ -25,6 +25,10 @@ class ItemFilterModel : public QAbstractListModel Q_PROPERTY(QStringList selectedItems READ selectedItems WRITE setSelectedItems NOTIFY selectedItemsChanged) + Q_PROPERTY(QStringList validationRoles READ validationRoles WRITE setValidationRoles NOTIFY + validationRolesChanged) + Q_PROPERTY(QStringList validationItems READ validationItems NOTIFY validationItemsChanged) + public: enum { IdRole = Qt::DisplayRole, NameRole = Qt::UserRole, IdAndNameRole, EnabledRole }; @@ -34,17 +38,18 @@ public: void setTypeFilter(const QString &typeFilter); void setSelectionOnly(bool value); void setSelectedItems(const QStringList &selectedItems); + void setValidationRoles(const QStringList &validationRoles); QString typeFilter() const; bool selectionOnly() const; QStringList selectedItems() const; - void setupModel(); QStringList itemModel() const; + QStringList validationRoles() const; + QStringList validationItems() const; static void registerDeclarativeType(); virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - virtual QHash roleNames() const override; signals: @@ -53,8 +58,12 @@ signals: void itemModelChanged(); void selectionOnlyChanged(); void selectedItemsChanged(); + void validationRolesChanged(); + void validationItemsChanged(); private: + void setupModel(); + void setupValidationItems(); QVariant modelNodeBackend() const; QmlDesigner::ModelNode modelNodeForRow(const int &row) const; @@ -64,6 +73,9 @@ private: QmlDesigner::ModelNode m_modelNode; bool m_selectionOnly; QStringList m_selectedItems; + + QStringList m_validationRoles; + QStringList m_validationItems; }; QML_DECLARE_TYPE(ItemFilterModel) diff --git a/src/plugins/qmldesigner/components/propertyeditor/listvalidator.cpp b/src/plugins/qmldesigner/components/propertyeditor/listvalidator.cpp new file mode 100644 index 00000000000..c1eaa48c3fe --- /dev/null +++ b/src/plugins/qmldesigner/components/propertyeditor/listvalidator.cpp @@ -0,0 +1,58 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "listvalidator.h" + +ListValidator::ListValidator(QObject *parent) + : QValidator{parent} +{} + +QValidator::State ListValidator::validate(QString &input, int &) const +{ + if (input.isEmpty()) + return QValidator::Intermediate; + + State state = QValidator::Invalid; + + for (const QString &item : m_filterList) { + if (item.compare(input, Qt::CaseSensitive) == 0) + return QValidator::Acceptable; + + if (item.compare(input, Qt::CaseInsensitive) == 0) + return QValidator::Intermediate; + + if (item.contains(input, Qt::CaseInsensitive)) + state = QValidator::Intermediate; + } + + return state; +} + +void ListValidator::fixup(QString &input) const +{ + for (const QString &item : m_filterList) { + if (item.compare(input, Qt::CaseInsensitive) == 0) { + input = item; + return; + } + } +} + +void ListValidator::setFilterList(const QStringList &filterList) +{ + if (m_filterList == filterList) + return; + + m_filterList = filterList; + emit filterListChanged(); +} + +QStringList ListValidator::filterList() const +{ + return m_filterList; +} + +void ListValidator::registerDeclarativeType() +{ + qmlRegisterType("HelperWidgets", 2, 0, "ListValidator"); +} diff --git a/src/plugins/qmldesigner/components/propertyeditor/listvalidator.h b/src/plugins/qmldesigner/components/propertyeditor/listvalidator.h new file mode 100644 index 00000000000..46e8e4649f2 --- /dev/null +++ b/src/plugins/qmldesigner/components/propertyeditor/listvalidator.h @@ -0,0 +1,33 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include +#include + +class ListValidator : public QValidator +{ + Q_OBJECT + + Q_PROPERTY(QStringList filterList READ filterList WRITE setFilterList NOTIFY filterListChanged) + +public: + explicit ListValidator(QObject *parent = nullptr); + + QValidator::State validate(QString &data, int &pos) const override; + void fixup(QString &input) const override; + + void setFilterList(const QStringList &filterList); + QStringList filterList() const; + + static void registerDeclarativeType(); + +signals: + void filterListChanged(); + +private: + QStringList m_filterList; +}; + +QML_DECLARE_TYPE(ListValidator) diff --git a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp index 610c0e27319..2c65be3e4b2 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp @@ -6,17 +6,17 @@ #include #include "aligndistribute.h" -#include "assetimageprovider.h" #include "annotationeditor/annotationeditor.h" +#include "assetimageprovider.h" #include "bindingeditor/actioneditor.h" #include "bindingeditor/bindingeditor.h" #include "colorpalettebackend.h" -#include "selectiondynamicpropertiesproxymodel.h" #include "fileresourcesmodel.h" #include "gradientmodel.h" #include "gradientpresetcustomlistmodel.h" #include "gradientpresetdefaultlistmodel.h" #include "itemfiltermodel.h" +#include "listvalidator.h" #include "propertychangesmodel.h" #include "propertyeditorcontextobject.h" #include "propertyeditorqmlbackend.h" @@ -24,6 +24,7 @@ #include "propertymodel.h" #include "qmlanchorbindingproxy.h" #include "richtexteditor/richtexteditorproxy.h" +#include "selectiondynamicpropertiesproxymodel.h" #include "theme.h" #include "tooltip.h" @@ -50,6 +51,7 @@ void Quick2PropertyEditorView::registerQmlTypes() GradientPresetDefaultListModel::registerDeclarativeType(); GradientPresetCustomListModel::registerDeclarativeType(); ItemFilterModel::registerDeclarativeType(); + ListValidator::registerDeclarativeType(); ColorPaletteBackend::registerDeclarativeType(); Internal::QmlAnchorBindingProxy::registerDeclarativeType(); BindingEditor::registerDeclarativeType(); From 8654afc4d62b31766d18bce9145319e8d3851286 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 1 Jun 2023 17:20:06 +0300 Subject: [PATCH 042/149] QmlDesigner: Force manual lights baking mode if unexpected properties If unexpected property values are encountered during lights baking setup dialog population, e.g. binding property is used for a property when variant property is expected, we automatically set the manual baking mode. Fixes: QDS-10009 Change-Id: Iee25ed5ae9699f4efb70d2b8b57dea451cab5dce Reviewed-by: Reviewed-by: Mahmoud Badri --- .../components/edit3d/bakelights.cpp | 12 +-- .../components/edit3d/bakelightsdatamodel.cpp | 76 +++++++++++++++---- .../components/edit3d/bakelightsdatamodel.h | 2 +- 3 files changed, 69 insertions(+), 21 deletions(-) diff --git a/src/plugins/qmldesigner/components/edit3d/bakelights.cpp b/src/plugins/qmldesigner/components/edit3d/bakelights.cpp index 53c7e53df9d..c0ff5de2af3 100644 --- a/src/plugins/qmldesigner/components/edit3d/bakelights.cpp +++ b/src/plugins/qmldesigner/components/edit3d/bakelights.cpp @@ -321,11 +321,13 @@ void BakeLights::showSetupDialog() if (!m_dataModel) m_dataModel = new BakeLightsDataModel(m_view); - m_dataModel->reset(); - - auto data = m_dataModel->view3dNode().auxiliaryData(bakeLightsManualProperty); - if (data) - m_manualMode = data->toBool(); + if (!m_dataModel->reset()) { + m_manualMode = true; + } else { + auto data = m_dataModel->view3dNode().auxiliaryData(bakeLightsManualProperty); + if (data) + m_manualMode = data->toBool(); + } if (!m_setupDialog) { // Show non-modal progress dialog with cancel button diff --git a/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.cpp b/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.cpp index 36d192a9244..8bc0f9e7a6f 100644 --- a/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.cpp +++ b/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.cpp @@ -130,10 +130,12 @@ bool BakeLightsDataModel::setData(const QModelIndex &index, const QVariant &valu return changed; } -void BakeLightsDataModel::reset() +// Return value of false indicates unexpected property assignments were detected, which means manual +// mode for baking setup should be enforced. +bool BakeLightsDataModel::reset() { if (!m_view || !m_view->model()) - return; + return true; beginResetModel(); m_dataList.clear(); @@ -152,6 +154,8 @@ void BakeLightsDataModel::reset() QList compLightList; QList unexposedList; + bool forceManualMode = false; + // Note: We are always loading base state values for baking. If users want to bake // differently for different states, they need to setup things manually for now. // Same goes if they want to use any unusual bindings in baking properties. @@ -169,23 +173,42 @@ void BakeLightsDataModel::reset() if (node.hasBindingProperty("bakedLightmap")) { ModelNode blm = node.bindingProperty("bakedLightmap").resolveToModelNode(); if (blm.isValid()) { - if (blm.hasVariantProperty("enabled")) + if (blm.hasVariantProperty("enabled")) { data.enabled = blm.variantProperty("enabled").value().toBool(); - else + } else { data.enabled = true; + if (blm.hasProperty("enabled")) + forceManualMode = true; + } } + } else if (node.hasProperty("bakedLightmap")) { + forceManualMode = true; } if (node.hasVariantProperty("lightmapBaseResolution")) data.resolution = node.variantProperty("lightmapBaseResolution").value().toInt(); + else if (node.hasProperty("lightmapBaseResolution")) + forceManualMode = true; + if (node.hasVariantProperty("usedInBakedLighting")) data.inUse = node.variantProperty("usedInBakedLighting").value().toBool(); + else if (node.hasProperty("usedInBakedLighting")) + forceManualMode = true; + modelList.append(data); } else if (node.metaInfo().isQtQuick3DLight()) { if (node.hasVariantProperty("bakeMode")) { - data.bakeMode = node.variantProperty("bakeMode").value() - .value().toString(); + // Enum properties that have binding can still resolve as variant property, + // so check if the value is actually valid enum + QString bakeModeStr = node.variantProperty("bakeMode").value() + .value().toString(); + if (bakeModeStr.startsWith("Light.BakeMode")) + data.bakeMode = bakeModeStr; + else + forceManualMode = true; } else { data.bakeMode = "Light.BakeModeDisabled"; + if (node.hasProperty("bakeMode")) + forceManualMode = true; } lightList.append(data); } @@ -211,16 +234,29 @@ void BakeLightsDataModel::reset() if (subName == "bakedLightmap") { ModelNode blm = prop.toBindingProperty().resolveToModelNode(); if (blm.isValid()) { - if (blm.hasVariantProperty("enabled")) + if (blm.hasVariantProperty("enabled")) { propData.enabled = blm.variantProperty("enabled").value().toBool(); - else + } else { propData.enabled = true; + if (blm.hasProperty("enabled")) + forceManualMode = true; + } + } else { + forceManualMode = true; } } - if (subName == "lightmapBaseResolution") - propData.resolution = prop.toVariantProperty().value().toInt(); - if (subName == "usedInBakedLighting") - propData.inUse = prop.toVariantProperty().value().toBool(); + if (subName == "lightmapBaseResolution") { + if (prop.isVariantProperty()) + propData.resolution = prop.toVariantProperty().value().toInt(); + else + forceManualMode = true; + } + if (subName == "usedInBakedLighting") { + if (prop.isVariantProperty()) + propData.inUse = prop.toVariantProperty().value().toBool(); + else + forceManualMode = true; + } } } compModelList.append(propData); @@ -231,9 +267,17 @@ void BakeLightsDataModel::reset() if (prop.name().startsWith(dotName)) { PropertyName subName = prop.name().mid(dotName.size()); if (subName == "bakeMode") { - propData.bakeMode = prop.toVariantProperty().value() - .value() - .toString(); + if (prop.isVariantProperty()) { + QString bakeModeStr = prop.toVariantProperty().value() + .value() + .toString(); + if (bakeModeStr.startsWith("Light.BakeMode")) + propData.bakeMode = bakeModeStr; + else + forceManualMode = true; + } else { + forceManualMode = true; + } } } } @@ -292,6 +336,8 @@ void BakeLightsDataModel::reset() } endResetModel(); + + return !forceManualMode; } void BakeLightsDataModel::apply() diff --git a/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.h b/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.h index 313c09cf459..3ed7bfeed3c 100644 --- a/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.h +++ b/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.h @@ -38,7 +38,7 @@ public: QHash roleNames() const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; - void reset(); + bool reset(); void apply(); ModelNode view3dNode() const { return m_view3dNode; } From 85739119afca372a5314d73f66df3c09645def94 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 2 Jun 2023 13:41:38 +0300 Subject: [PATCH 043/149] QmlDesigner: Don't allow add QtQuick3D import for MCU project Don't show the normal onboarding label on 3D view if current project is a MCU project that doesn't support QtQuick3D. Fixes: QDS-10012 Change-Id: Iaa309efac3a5b2c0f2fce2e5e96c9012eaf6750d Reviewed-by: Mahmoud Badri --- .../components/edit3d/edit3dwidget.cpp | 25 ++++++++++++++++++- .../components/edit3d/edit3dwidget.h | 1 + 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index a217e396d9c..16d5a60fde7 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -167,6 +168,11 @@ Edit3DWidget::Edit3DWidget(Edit3DView *view) createContextMenu(); + m_mcuLabel = new QLabel(this); + m_mcuLabel->setText(tr("MCU project does not support Qt Quick 3D.")); + m_mcuLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + fillLayout->addWidget(m_mcuLabel.data()); + // Onboarding label contains instructions for new users how to get 3D content into the project m_onboardingLabel = new QLabel(this); QString labelText = @@ -413,7 +419,24 @@ void Edit3DWidget::showCanvas(bool show) m_canvas->updateRenderImage(emptyImage); } m_canvas->setVisible(show); - m_onboardingLabel->setVisible(!show); + + if (show) { + m_onboardingLabel->setVisible(false); + m_mcuLabel->setVisible(false); + } else { + bool quick3dAllowed = true; + const DesignerMcuManager &mcuManager = DesignerMcuManager::instance(); + if (mcuManager.isMCUProject()) { + const QStringList mcuAllowedList = mcuManager.allowedImports(); + if (!mcuAllowedList.contains("QtQuick3d")) + quick3dAllowed = false; + } + + m_onboardingLabel->setVisible(quick3dAllowed); + m_mcuLabel->setVisible(!quick3dAllowed); + } + + } QMenu *Edit3DWidget::visibilityTogglesMenu() const diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h index eecd52345fa..f764f068bf4 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h @@ -70,6 +70,7 @@ private: QPointer m_view; QPointer m_canvas; QPointer m_onboardingLabel; + QPointer m_mcuLabel; QPointer m_toolBox; Core::IContext *m_context = nullptr; QPointer m_visibilityTogglesMenu; From a13de9a5fd8b216753daff4533dbbfb34e0529fe Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Thu, 1 Jun 2023 16:46:02 +0200 Subject: [PATCH 044/149] QmlDesigner: Fix a typo in deescape function Change-Id: I2f474fdaaee8b556a5a91b61bf3025d9f6d480fb Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index caeded485cb..515d4043643 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -132,7 +132,7 @@ QString deEscape(const QString &value) result.replace(QStringLiteral("\\\\"), QStringLiteral("\\")); result.replace(QStringLiteral("\\\""), QStringLiteral("\"")); result.replace(QStringLiteral("\\t"), QStringLiteral("\t")); - result.replace(QStringLiteral("\\r"), QStringLiteral("\\\r")); + result.replace(QStringLiteral("\\r"), QStringLiteral("\r")); result.replace(QStringLiteral("\\n"), QStringLiteral("\n")); return result; From cffd45890b784408c3492f982b5a4512f5369058 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 1 Jun 2023 21:12:55 +0200 Subject: [PATCH 045/149] UnitTests: Fix warning in ModelResourceManagement Change-Id: I13e9bae5e3431ac131ce9a9de492a011f5e5a979 Reviewed-by: Reviewed-by: Thomas Hartmann --- .../unittest/modelresourcemanagement-test.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/unit/unittest/modelresourcemanagement-test.cpp b/tests/unit/unittest/modelresourcemanagement-test.cpp index 620ae9a4a1d..5b28d1a6393 100644 --- a/tests/unit/unittest/modelresourcemanagement-test.cpp +++ b/tests/unit/unittest/modelresourcemanagement-test.cpp @@ -302,15 +302,18 @@ protected: ModelNode source2 = createNodeWithParent(parameters.type, rootNode.defaultNodeListProperty(), "source2"); - QmlDesigner::BindingProperty sourceTargetsProperty = source.bindingProperty("targets"); - QmlDesigner::BindingProperty source2TargetsProperty = source2.bindingProperty("targets"); + QmlDesigner::BindingProperty sourceTargetsProperty = source.bindingProperty( + parameters.propertyName); + QmlDesigner::BindingProperty source2TargetsProperty = source2.bindingProperty( + parameters.propertyName); }; -INSTANTIATE_TEST_SUITE_P(ModelResourceManagement, - ForTargets, - testing::Values(TargetData{"FlowView.FlowTransition", "FlowView.FlowDecision"}, - TargetData{"FlowView.FlowTransition", "FlowView.FlowWildcard"}, - TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation"})); +INSTANTIATE_TEST_SUITE_P( + ModelResourceManagement, + ForTargets, + testing::Values(TargetData{"FlowView.FlowTransition", "FlowView.FlowDecision", "targets"}, + TargetData{"FlowView.FlowTransition", "FlowView.FlowWildcard", "targets"}, + TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation", "targets"})); TEST_P(ForTargets, Remove) { From d9cc2dc8c5fd51450bd2a8e2247af76adf5c78c3 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 2 Jun 2023 15:10:43 +0300 Subject: [PATCH 046/149] ProjectExplorer: Fix check for "Kits" page hiding Fixes: QDS-9231 Change-Id: I53fc333fca2ec81edcb2b254a98613309e8335a9 Reviewed-by: Mahmoud Badri --- src/plugins/projectexplorer/projectwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 4a25b993445..8fae44b2973 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -588,7 +588,7 @@ public: PanelsWidget::PanelVMargin, 0); QStringList list = Core::ICore::settings()->value("HideOptionCategories").toStringList(); - if (!list.contains("Kit")) { + if (!list.contains("Kits")) { innerLayout->addWidget(m_manageKits); innerLayout->addSpacerItem(new QSpacerItem(10, 30, QSizePolicy::Maximum, QSizePolicy::Maximum)); } From 3c36e7785853fd11373a2018e514534b72a4826a Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Thu, 11 May 2023 12:00:19 +0200 Subject: [PATCH 047/149] QmlDesigner: Fix some escape characters Task-number: QDS-9415 Change-Id: I6459451d0f7699c727b2e0baad726f5c6af2ca74 Reviewed-by: Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/LineEdit.qml | 2 +- src/plugins/qmldesigner/CMakeLists.txt | 1 + .../designercore/include/stringutils.h | 42 +++++++++++++++++++ .../designercore/model/qmlobjectnode.cpp | 15 ++++--- .../designercore/model/qmltextgenerator.cpp | 34 ++++----------- .../designercore/model/qmltextgenerator.h | 2 - 6 files changed, 60 insertions(+), 36 deletions(-) create mode 100644 src/plugins/qmldesigner/designercore/include/stringutils.h diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/LineEdit.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/LineEdit.qml index b73bde29310..dffe3d779ea 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/LineEdit.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/LineEdit.qml @@ -40,7 +40,7 @@ StudioControls.TextField { function escapeString(string) { var str = string str = str.replace(/\\/g, "\\\\") - str.replace(/\"/g, "\\\"") + str = str.replace(/\"/g, "\\\"") str = str.replace(/\t/g, "\\t") str = str.replace(/\r/g, "\\r") str = str.replace(/\n/g, '\\n') diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 4913ac79eed..16668bf3281 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -252,6 +252,7 @@ extend_qtc_library(QmlDesignerCore rewriterview.h rewritingexception.h signalhandlerproperty.h + stringutils.h stylesheetmerger.h subcomponentmanager.h synchronousimagecache.h diff --git a/src/plugins/qmldesigner/designercore/include/stringutils.h b/src/plugins/qmldesigner/designercore/include/stringutils.h new file mode 100644 index 00000000000..38c3c260a97 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/include/stringutils.h @@ -0,0 +1,42 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include + +namespace QmlDesigner { + +inline QString escape(const QString &value) +{ + QString result = value; + + if (value.length() == 6 && value.startsWith("\\u")) //Do not double escape unicode chars + return value; + + result.replace(QStringLiteral("\\"), QStringLiteral("\\\\")); + result.replace(QStringLiteral("\""), QStringLiteral("\\\"")); + result.replace(QStringLiteral("\t"), QStringLiteral("\\t")); + result.replace(QStringLiteral("\r"), QStringLiteral("\\r")); + result.replace(QStringLiteral("\n"), QStringLiteral("\\n")); + + return result; +} + +inline QString deescape(const QString &value) +{ + QString result = value; + + if (value.length() == 6 && value.startsWith("\\u")) //Ignore unicode chars + return value; + + result.replace(QStringLiteral("\\\\"), QStringLiteral("\\")); + result.replace(QStringLiteral("\\\""), QStringLiteral("\"")); + result.replace(QStringLiteral("\\t"), QStringLiteral("\t")); + result.replace(QStringLiteral("\\r"), QStringLiteral("\r")); + result.replace(QStringLiteral("\\n"), QStringLiteral("\n")); + + return result; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 118d1c1acc6..b2694b9951d 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -14,6 +14,7 @@ #include "qmlstate.h" #include "qmltimelinekeyframegroup.h" #include "qmlvisualnode.h" +#include "stringutils.h" #include "variantproperty.h" #include @@ -256,7 +257,7 @@ QString QmlObjectNode::stripedTranslatableText(const PropertyName &name) const const QRegularExpressionMatch match = regularExpressionPattern.match( modelNode().bindingProperty(name).expression()); if (match.hasMatch()) - return match.captured(2); + return deescape(match.captured(2)); return instanceValue(name).toString(); } return instanceValue(name).toString(); @@ -536,15 +537,17 @@ QVariant QmlObjectNode::instanceValue(const ModelNode &modelNode, const Property QString QmlObjectNode::generateTranslatableText([[maybe_unused]] const QString &text, const DesignerSettings &settings) { + const QString escapedText = escape(text); + if (settings.value(DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt()) switch (settings.value(DesignerSettingsKey::TYPE_OF_QSTR_FUNCTION).toInt()) { - case 0: return QString(QStringLiteral("qsTr(\"%1\")")).arg(text); - case 1: return QString(QStringLiteral("qsTrId(\"%1\")")).arg(text); - case 2: return QString(QStringLiteral("qsTranslate(\"%1\", \"context\")")).arg(text); + case 0: return QString(QStringLiteral("qsTr(\"%1\")")).arg(escapedText); + case 1: return QString(QStringLiteral("qsTrId(\"%1\")")).arg(escapedText); + case 2: return QString(QStringLiteral("qsTranslate(\"%1\", \"context\")")).arg(escapedText); default: break; } - return QString(QStringLiteral("qsTr(\"%1\")")).arg(text); + return QString(QStringLiteral("qsTr(\"%1\")")).arg(escapedText); } QString QmlObjectNode::stripedTranslatableTextFunction(const QString &text) @@ -553,7 +556,7 @@ QString QmlObjectNode::stripedTranslatableTextFunction(const QString &text) QLatin1String("^qsTr(|Id|anslate)\\(\"(.*)\"\\)$")); const QRegularExpressionMatch match = regularExpressionPattern.match(text); if (match.hasMatch()) - return match.captured(2); + return deescape(match.captured(2)); return text; } diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index c283bf5b269..bcf22aa3f04 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -3,19 +3,20 @@ #include "qmltextgenerator.h" -#include #include -#include -#include +#include #include +#include +#include #include "bindingproperty.h" -#include "signalhandlerproperty.h" -#include "nodeproperty.h" +#include "model.h" #include "nodelistproperty.h" +#include "nodeproperty.h" +#include "signalhandlerproperty.h" +#include "stringutils.h" #include "variantproperty.h" #include -#include "model.h" using namespace QmlDesigner; using namespace QmlDesigner::Internal; @@ -114,13 +115,9 @@ QString QmlTextGenerator::toQml(const AbstractProperty &property, int indentDept if (property.name() == "id") return stringValue; - - if (false) { - } if (variantProperty.holdsEnumeration()) { return variantProperty.enumeration().toString(); } else { - switch (value.userType()) { case QMetaType::Bool: if (value.toBool()) @@ -284,20 +281,3 @@ QString QmlTextGenerator::propertyToQml(const AbstractProperty &property, int in return result; } - -QString QmlTextGenerator::escape(const QString &value) -{ - QString result = value; - - if (value.count() == 6 && value.startsWith("\\u")) //Do not dobule escape unicode chars - return result; - - result.replace(QStringLiteral("\\"), QStringLiteral("\\\\")); - - result.replace(QStringLiteral("\""), QStringLiteral("\\\"")); - result.replace(QStringLiteral("\t"), QStringLiteral("\\t")); - result.replace(QStringLiteral("\r"), QStringLiteral("\\r")); - result.replace(QStringLiteral("\n"), QStringLiteral("\\n")); - - return result; -} diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.h b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.h index 6b114ebe1bf..971d6a2d1d0 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.h +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.h @@ -32,8 +32,6 @@ private: QString propertiesToQml(const ModelNode &node, int indentDepth) const; QString propertyToQml(const AbstractProperty &property, int indentDepth) const; - static QString escape(const QString &value); - private: PropertyNameList m_propertyOrder; TextEditor::TabSettings m_tabSettings; From 602e08dbeecd5fcfd85a202e1784fcd485a28040 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 2 Jun 2023 14:38:27 +0200 Subject: [PATCH 048/149] QmlDesigner: Fix issue with duration tracking An event can start and end duration tracking at the same time. Task-number: QDS-9961 Change-Id: I97265f753887e87ef5bdb9b4bc93ca97922a51d4 Reviewed-by: Vikas Pachdha Reviewed-by: --- src/plugins/qmldesigner/qmldesignerplugin.cpp | 20 ++++++++++++------- src/plugins/qmldesigner/qmldesignerplugin.h | 1 + 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 7fcce8cf531..0cff0ffad8f 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -710,16 +710,16 @@ void QmlDesignerPlugin::emitUsageStatistics(const QString &identifier) const int currentTime = privateInstance()->timer.elapsed(); const int currentDuration = (currentTime - activeData.time); if (currentDuration < activeData.maxDuration) - emit instance()->usageStatisticsUsageDuration(activeData.newIdentifer, currentDuration); + instance()->emitUsageStatisticsUsageDuration(activeData.newIdentifer, currentDuration); privateInstance()->m_activeTraceIdentifierDataHash.remove(identifier); - } else { - TraceIdentifierData data = privateInstance()->m_traceIdentifierDataHash.value(identifier); + } - if (!data.identifier.isEmpty()) { - data.time = privateInstance()->timer.elapsed(); - privateInstance()->m_activeTraceIdentifierDataHash.insert(data.identifier, data); - } + TraceIdentifierData data = privateInstance()->m_traceIdentifierDataHash.value(identifier); + + if (!data.identifier.isEmpty()) { + data.time = privateInstance()->timer.elapsed(); + privateInstance()->m_activeTraceIdentifierDataHash.insert(data.identifier, data); } const auto values = privateInstance()->m_activeTraceIdentifierDataHash.values(); @@ -862,6 +862,12 @@ void QmlDesignerPlugin::emitUsageStatisticsTime(const QString &identifier, int e emit instance()->usageStatisticsUsageTimer(normalizeIdentifier(identifier), elapsed); } +void QmlDesignerPlugin::emitUsageStatisticsUsageDuration(const QString &identifier, int elapsed) +{ + QTC_ASSERT(instance(), return ); + emit instance()->usageStatisticsUsageDuration(identifier, elapsed); +} + QmlDesignerPlugin *QmlDesignerPlugin::instance() { return m_instance; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.h b/src/plugins/qmldesigner/qmldesignerplugin.h index 8c3317ccb9f..4080678e892 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.h +++ b/src/plugins/qmldesigner/qmldesignerplugin.h @@ -76,6 +76,7 @@ public: static void emitUsageStatisticsContextAction(const QString &identifier); static void emitUsageStatisticsHelpRequested(const QString &identifier); static void emitUsageStatisticsTime(const QString &identifier, int elapsed); + static void emitUsageStatisticsUsageDuration(const QString &identifier, int elapsed); static AsynchronousImageCache &imageCache(); From c716056cbcf9deaf6e01e8b2667f01b8bff8cd4a Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 2 Jun 2023 17:07:38 +0200 Subject: [PATCH 049/149] QmlDesigner: Allow transitions also for bindings Task-number: QDS-10019 Change-Id: Ib7003047241fde3838b248d1fc90161725cb94f9 Reviewed-by: Tim Jenssen --- .../components/transitioneditor/transitioneditorview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp index 03ebf4738e5..c24ebc1ce32 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp @@ -201,7 +201,7 @@ ModelNode TransitionEditorView::addNewTransition() const ModelNode target = change.target(); if (auto targetMetaInfo = target.metaInfo()) { const QString targetId = target.id(); - for (const VariantProperty &property : change.modelNode().variantProperties()) { + for (const AbstractProperty &property : change.modelNode().properties()) { auto type = targetMetaInfo.property(property.name()).propertyType(); if (type.isInteger() || type.isColor() || type.isFloat()) From bc6487068892be8c99404998c93dc6125551cf18 Mon Sep 17 00:00:00 2001 From: Brook Cronin Date: Fri, 26 May 2023 13:24:28 +0200 Subject: [PATCH 050/149] QmlDesigner: Add new icons for content updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Id5f1694eb301157cad3e67bd576df184527dd6a1 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../imports/StudioTheme/InternalConstants.qml | 38 +++++++++--------- .../imports/StudioTheme/icons.ttf | Bin 57196 -> 57492 bytes .../components/componentcore/theme.h | 2 + 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml index 1a07944b241..864f4b8092d 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml @@ -318,24 +318,26 @@ QtObject { readonly property string unpin: "\u0151" readonly property string upDownIcon: "\u0152" readonly property string upDownSquare2: "\u0153" - readonly property string visibilityOff: "\u0154" - readonly property string visibilityOn: "\u0155" - readonly property string visible_medium: "\u0156" - readonly property string visible_small: "\u0157" - readonly property string wildcard: "\u0158" - readonly property string wizardsAutomotive: "\u0159" - readonly property string wizardsDesktop: "\u015A" - readonly property string wizardsGeneric: "\u015B" - readonly property string wizardsMcuEmpty: "\u015C" - readonly property string wizardsMcuGraph: "\u015D" - readonly property string wizardsMobile: "\u015E" - readonly property string wizardsUnknown: "\u015F" - readonly property string zoomAll: "\u0160" - readonly property string zoomIn: "\u0161" - readonly property string zoomIn_medium: "\u0162" - readonly property string zoomOut: "\u0163" - readonly property string zoomOut_medium: "\u0164" - readonly property string zoomSelection: "\u0165" + readonly property string updateAvailable_medium: "\u0154" + readonly property string updateContent_medium: "\u0155" + readonly property string visibilityOff: "\u0156" + readonly property string visibilityOn: "\u0157" + readonly property string visible_medium: "\u0158" + readonly property string visible_small: "\u0159" + readonly property string wildcard: "\u015A" + readonly property string wizardsAutomotive: "\u015B" + readonly property string wizardsDesktop: "\u015C" + readonly property string wizardsGeneric: "\u015D" + readonly property string wizardsMcuEmpty: "\u015E" + readonly property string wizardsMcuGraph: "\u015F" + readonly property string wizardsMobile: "\u0160" + readonly property string wizardsUnknown: "\u0161" + readonly property string zoomAll: "\u0162" + readonly property string zoomIn: "\u0163" + readonly property string zoomIn_medium: "\u0164" + readonly property string zoomOut: "\u0165" + readonly property string zoomOut_medium: "\u0166" + readonly property string zoomSelection: "\u0167" readonly property font iconFont: Qt.font({ "family": controlIcons.name, diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf index 1b1821ae9999dee768ff10bca25c5349a1ee96ee..884b4b7c48439df60df8db0984fbdc6e115400fe 100644 GIT binary patch delta 641 zcmaE}k9o>L=6VK31_lORh6V;^h5$FW5a0Pm>lQFDJg8t`V36?-);Efrk-C(DfiZ%C zfgvF|H?ctDzxGE429^K@2Bxs&vJwRbMW#vy2DTLp3=AykiNyu~|1&T%Fgz$=U|`@# zqC_?W|lfq~P3fngU%MrvY;`nKam3=9l+7#JALGBQ%@6S;o=Z)IR$6k%XsP|3(G zsZea;yT-u4xPyU#X+}^;|Y{wYOn7(-qV-FL{|9=b&lQmd^8Phk{uuNxB7YGXqyAtjc-VnYg zf-mAtWLo5mD1oTDs7KLW(MzJA#aP4?#cYXX*=)wSe>FGb|G)n~Grwg@WssX}=b|Xb zTx)F0#+>2)x85z2l}S#4o1-Vu$wYutDb*@v0`ue^7s+}CCI*K8Wy~*_9x;e8XfiOU zinFWpF)AzRF`62S$T1olnVGYzGqS6ji`y|88_6+>Dx2srDl4(En={vEdYW6FDK9-y z5)`*6K7NT_7yrLUf3iHyt_VMW6)(Voh*LDlEX~bRM*JB$ar$V;eg32jx1#K*z9$*hlz#BmC0@M zwd3Yu22!O3DTyVij%A6NIf+R*sqwj~DVe3Ydc|ew5)dip{JfIXyb`FyX3l#NjNI^m Hcaj7EQisJ` delta 394 zcmbPokonC%=6VK31_lORh6V;^h5$FW5Z`%IEd3c6?gub1Fv$1^>l;PRNL|dpz!<^6 zz>tufn^>UnU;8}+1B(v>15;RXS&0IJB2y&;1KSb?1_qY&#NvYg{~4GW818#8FfeeW z=TxTcvKRl(z`$w2z_3#xBQ-HaT_Q-4fq~%;0|SFuMn-CVBG=FVtqcr|A`A=+DjB&Y z6^d Date: Tue, 4 Apr 2023 13:58:44 +0300 Subject: [PATCH 051/149] QmlDesigner: Make textures updatable Fetch the new textures from the remote server Also, disabled tst_qml_wizard, for now. Task-number: QDS-9607 Change-Id: I35081b90afadddff8d8c4b32da8bed82996304cd Reviewed-by: Thomas Hartmann Reviewed-by: Qt CI Bot --- .../new_flag_triangle.png | Bin 0 -> 149 bytes .../ContentLibraryMaterial.qml | 4 +- .../ContentLibraryTexture.qml | 192 +++++++--- src/plugins/qmldesigner/CMakeLists.txt | 1 + .../contentlibraryiconprovider.cpp | 42 +++ .../contentlibraryiconprovider.h | 17 + .../contentlibrary/contentlibrarytexture.cpp | 30 +- .../contentlibrary/contentlibrarytexture.h | 24 +- .../contentlibrarytexturescategory.cpp | 23 +- .../contentlibrarytexturescategory.h | 7 +- .../contentlibrarytexturesmodel.cpp | 61 +++- .../contentlibrarytexturesmodel.h | 10 +- .../contentlibrary/contentlibrarywidget.cpp | 332 +++++++++++++++++- .../contentlibrary/contentlibrarywidget.h | 8 + .../qmldesigner/utils/filedownloader.cpp | 20 ++ .../qmldesigner/utils/filedownloader.h | 6 + .../qmldesigner/utils/fileextractor.cpp | 8 + .../utils/designersettings.cpp | 1 + .../qmldesignerbase/utils/designersettings.h | 1 + tests/auto/qml/qmldesigner/CMakeLists.txt | 2 +- 20 files changed, 717 insertions(+), 72 deletions(-) create mode 100644 share/qtcreator/qmldesigner/contentLibraryImages/new_flag_triangle.png create mode 100644 src/plugins/qmldesigner/components/contentlibrary/contentlibraryiconprovider.cpp create mode 100644 src/plugins/qmldesigner/components/contentlibrary/contentlibraryiconprovider.h diff --git a/share/qtcreator/qmldesigner/contentLibraryImages/new_flag_triangle.png b/share/qtcreator/qmldesigner/contentLibraryImages/new_flag_triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..af282807491c8b6b17e888b464b3048ad13eb215 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;IMrH;E2G1=owlgp=um$*pxc+BgNJvOfw7z_Y zfq{XsB*-tA!Qt7BGzJC+TTd6q5RPcsBO7@c6gU_RIGUB!E4Y?d?pjusF{e7eXIqr_ z(vUxWZqaL(25Hr~FJ5~sNK { + if (mouse.button === Qt.LeftButton) { + if (root.downloadState === "downloaded") + ContentLibraryBackend.rootView.startDragTexture(modelData, mapToGlobal(mouse.x, mouse.y)) + } else if (mouse.button === Qt.RightButton && root.downloadState === "downloaded") { + root.showContextMenu() + } + } + } + Rectangle { id: downloadPane anchors.fill: parent @@ -60,7 +111,7 @@ Item { visible: false onCancelRequested: { - downloader.cancel() + textureDownloader.cancel() } Text { @@ -114,7 +165,7 @@ Item { iconColor: root.downloadState === "unavailable" || root.downloadState === "failed" ? StudioTheme.Values.themeRedLight - : StudioTheme.Values.themeTextColor + : "white" iconSize: 22 iconScale: downloadIcon.containsMouse ? 1.2 : 1 @@ -144,20 +195,66 @@ Item { } onClicked: { - if (root.downloadState !== "" && root.downloadState !== "failed") - return - - progressBar.visible = true - tooltip.visible = false - root.progressText = qsTr("Downloading...") - root.allowCancel = true - root.progressValue = Qt.binding(function() { return downloader.progress }) - - root.downloadState = "" - downloader.start() + root.startDownload(qsTr("Downloading...")) } } // IconButton + Rectangle { + width: 22 + height: 22 + color: "#323232" + + visible: root.downloadState === "downloaded" && modelData.textureHasUpdate + + anchors.left: parent.left + anchors.bottom: parent.bottom + + IconButton { + id: updateButton + icon: StudioTheme.Constants.rotationFill + iconColor: "white" + tooltip: qsTr("Update texture") + buttonSize: 22 + + property color c: "white" + normalColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .2) + hoverColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .3) + pressColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .4) + + onClicked: root.updateTexture() + } // Update IconButton + } + + Rectangle { + id: isNewFlag + + width: 32 + height: 32 + + visible: downloadIcon.visible && modelData.textureIsNew + color: "transparent" + + anchors.top: parent.top + anchors.right: parent.right + + Image { + source: "image://contentlibrary/new_flag_triangle.png" + width: 32 + height: 32 + } + + Text { + color: "white" + font.family: StudioTheme.Constants.iconFont.family + text: StudioTheme.Constants.favorite + font.pixelSize: StudioTheme.Values.baseIconFontSize + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: 2 + anchors.rightMargin: 4 + } // New texture flag + } + ToolTip { id: tooltip // contentWidth is not calculated correctly by the toolTip (resulting in a wider tooltip than @@ -177,29 +274,8 @@ Item { } } // Image - MouseArea { - id: mouseArea - - anchors.fill: parent - hoverEnabled: !downloadIcon.visible - propagateComposedEvents: downloadIcon.visible - acceptedButtons: Qt.LeftButton | Qt.RightButton - - onEntered: tooltip.visible = image.visible - onExited: tooltip.visible = false - - onPressed: (mouse) => { - if (mouse.button === Qt.LeftButton) { - if (root.downloadState === "downloaded") - ContentLibraryBackend.rootView.startDragTexture(modelData, mapToGlobal(mouse.x, mouse.y)) - } else if (mouse.button === Qt.RightButton && root.downloadState === "downloaded") { - root.showContextMenu() - } - } - } - FileDownloader { - id: downloader + id: textureDownloader url: image.webUrl probeUrl: false downloadEnabled: true @@ -210,9 +286,9 @@ Item { onFinishedChanged: { root.progressText = qsTr("Extracting...") root.allowCancel = false - root.progressValue = Qt.binding(function() { return extractor.progress }) + root.progressValue = Qt.binding(function() { return textureExtractor.progress }) - extractor.extract() + textureExtractor.extract() } onDownloadCanceled: { @@ -238,14 +314,50 @@ Item { } FileExtractor { - id: extractor - archiveName: downloader.completeBaseName - sourceFile: downloader.outputFile + id: textureExtractor + archiveName: textureDownloader.completeBaseName + sourceFile: textureDownloader.outputFile targetPath: modelData.textureParentPath alwaysCreateDir: false clearTargetPathContents: false onFinishedChanged: { + if (root._isUpdating) + root._startDownload(iconDownloader, qsTr("Updating...")) + else + delayedFinish.restart() + } + } + + FileDownloader { + id: iconDownloader + url: modelData.textureWebIconUrl + probeUrl: false + downloadEnabled: true + targetFilePath: modelData.textureIconPath + overwriteTarget: true + + onDownloadStarting: { + root.downloadState = "downloading" + } + + onFinishedChanged: { + image.source = "" + image.source = modelData.textureIcon + + ContentLibraryBackend.rootView.markTextureUpdated(modelData.textureKey) + delayedFinish.restart() } + + onDownloadCanceled: { + root.progressText = "" + root.progressValue = 0 + + root.downloadState = "" + } + + onDownloadFailed: { + root.downloadState = "failed" + } } } diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 7987e50808c..9e3d571f504 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -756,6 +756,7 @@ extend_qtc_plugin(QmlDesigner contentlibrarymaterialsmodel.cpp contentlibrarymaterialsmodel.h contentlibrarymaterialscategory.cpp contentlibrarymaterialscategory.h contentlibrarymaterial.cpp contentlibrarymaterial.h + contentlibraryiconprovider.cpp contentlibraryiconprovider.h ) extend_qtc_plugin(QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryiconprovider.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryiconprovider.cpp new file mode 100644 index 00000000000..96102bf8379 --- /dev/null +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryiconprovider.cpp @@ -0,0 +1,42 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "contentlibraryiconprovider.h" + +#include + +namespace QmlDesigner { + +namespace Internal { + +ContentLibraryIconProvider::ContentLibraryIconProvider() + : QQuickImageProvider(Pixmap) +{ + +} + +QPixmap ContentLibraryIconProvider::requestPixmap(const QString &id, + QSize *size, + [[maybe_unused]] const QSize &requestedSize) +{ + QString realPath = Core::ICore::resourcePath("qmldesigner/contentLibraryImages/" + id).toString(); + + QPixmap pixmap{realPath}; + + if (size) { + size->setWidth(pixmap.width()); + size->setHeight(pixmap.height()); + } + + if (pixmap.isNull()) + return pixmap; + + if (requestedSize.isValid()) + return pixmap.scaled(requestedSize); + + return pixmap; +} + +} // namespace Internal + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryiconprovider.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryiconprovider.h new file mode 100644 index 00000000000..56633959d6a --- /dev/null +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryiconprovider.h @@ -0,0 +1,17 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include + +namespace QmlDesigner::Internal { + +class ContentLibraryIconProvider : public QQuickImageProvider +{ +public: + ContentLibraryIconProvider(); + QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override; +}; + +} // namespace QmlDesigner::Internal diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.cpp index fbc5199f989..8da65cd2fb4 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.cpp @@ -13,17 +13,23 @@ namespace QmlDesigner { ContentLibraryTexture::ContentLibraryTexture(QObject *parent, const QFileInfo &iconFileInfo, const QString &downloadPath, const QUrl &icon, - const QString &webUrl, const QString &fileExt, - const QSize &dimensions, const qint64 sizeInBytes) + const QString &key, const QString &webTextureUrl, + const QString &webIconUrl, const QString &fileExt, + const QSize &dimensions, const qint64 sizeInBytes, + bool hasUpdate, bool isNew) : QObject(parent) , m_iconPath(iconFileInfo.filePath()) , m_downloadPath(downloadPath) - , m_webUrl(webUrl) + , m_webTextureUrl(webTextureUrl) + , m_webIconUrl(webIconUrl) , m_baseName{iconFileInfo.baseName()} , m_fileExt(fileExt) + , m_textureKey(key) , m_icon(icon) , m_dimensions(dimensions) , m_sizeInBytes(sizeInBytes) + , m_hasUpdate(hasUpdate) + , m_isNew(isNew) { doSetDownloaded(); } @@ -122,4 +128,22 @@ QString ContentLibraryTexture::parentDirPath() const return m_downloadPath; } +QString ContentLibraryTexture::textureKey() const +{ + return m_textureKey; +} + +void ContentLibraryTexture::setHasUpdate(bool value) +{ + if (m_hasUpdate != value) { + m_hasUpdate = value; + emit hasUpdateChanged(); + } +} + +bool ContentLibraryTexture::hasUpdate() const +{ + return m_hasUpdate; +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.h index 074d4abb770..9f5b46630f6 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.h @@ -19,12 +19,17 @@ class ContentLibraryTexture : public QObject Q_PROPERTY(QString textureToolTip MEMBER m_toolTip NOTIFY textureToolTipChanged) Q_PROPERTY(QUrl textureIcon MEMBER m_icon CONSTANT) Q_PROPERTY(bool textureVisible MEMBER m_visible NOTIFY textureVisibleChanged) - Q_PROPERTY(QString textureWebUrl MEMBER m_webUrl CONSTANT) + Q_PROPERTY(QString textureWebUrl MEMBER m_webTextureUrl CONSTANT) + Q_PROPERTY(QString textureWebIconUrl MEMBER m_webIconUrl CONSTANT) + Q_PROPERTY(bool textureHasUpdate WRITE setHasUpdate READ hasUpdate NOTIFY hasUpdateChanged) + Q_PROPERTY(bool textureIsNew MEMBER m_isNew CONSTANT) + Q_PROPERTY(QString textureKey MEMBER m_textureKey CONSTANT) public: - ContentLibraryTexture(QObject *parent, const QFileInfo &iconFileInfo, - const QString &downloadPath, const QUrl &icon, const QString &webUrl, - const QString &fileExt, const QSize &dimensions, const qint64 sizeInBytes); + ContentLibraryTexture(QObject *parent, const QFileInfo &iconFileInfo, const QString &downloadPath, + const QUrl &icon, const QString &key, const QString &webTextureUrl, + const QString &webIconUrl, const QString &fileExt, const QSize &dimensions, + const qint64 sizeInBytes, bool hasUpdate, bool isNew); Q_INVOKABLE bool isDownloaded() const; Q_INVOKABLE void setDownloaded(); @@ -35,10 +40,15 @@ public: QString iconPath() const; QString downloadedTexturePath() const; QString parentDirPath() const; + QString textureKey() const; + + void setHasUpdate(bool value); + bool hasUpdate() const; signals: void textureVisibleChanged(); void textureToolTipChanged(); + void hasUpdateChanged(); private: QString resolveFileExt(); @@ -47,16 +57,20 @@ private: QString m_iconPath; QString m_downloadPath; - QString m_webUrl; + QString m_webTextureUrl; + QString m_webIconUrl; QString m_toolTip; QString m_baseName; QString m_fileExt; + QString m_textureKey; QUrl m_icon; QSize m_dimensions; qint64 m_sizeInBytes = -1; bool m_isDownloaded = false; bool m_visible = true; + bool m_hasUpdate = false; + bool m_isNew = false; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturescategory.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturescategory.cpp index eecab425523..77519ad88f6 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturescategory.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturescategory.cpp @@ -5,6 +5,8 @@ #include "contentlibrarytexture.h" +#include + #include namespace QmlDesigner { @@ -13,13 +15,16 @@ ContentLibraryTexturesCategory::ContentLibraryTexturesCategory(QObject *parent, : QObject(parent), m_name(name) {} void ContentLibraryTexturesCategory::addTexture(const QFileInfo &tex, const QString &downloadPath, - const QString &webUrl, const QString &fileExt, - const QSize &dimensions, const qint64 sizeInBytes) + const QString &key, const QString &webTextureUrl, + const QString &webIconUrl, const QString &fileExt, + const QSize &dimensions, const qint64 sizeInBytes, + bool hasUpdate, bool isNew) { QUrl icon = QUrl::fromLocalFile(tex.absoluteFilePath()); - m_categoryTextures.append(new ContentLibraryTexture(this, tex, downloadPath, icon, webUrl, - fileExt, dimensions, sizeInBytes)); + m_categoryTextures.append(new ContentLibraryTexture( + this, tex, downloadPath, icon, key, webTextureUrl, webIconUrl, + fileExt, dimensions, sizeInBytes, hasUpdate, isNew)); } bool ContentLibraryTexturesCategory::filter(const QString &searchText) @@ -57,4 +62,14 @@ QList ContentLibraryTexturesCategory::categoryTextures( return m_categoryTextures; } +void ContentLibraryTexturesCategory::markTextureHasNoUpdate(const QString &textureKey) +{ + auto *texture = Utils::findOrDefault(m_categoryTextures, [&textureKey](ContentLibraryTexture *t) { + return t->textureKey() == textureKey; + }); + + if (texture) + texture->setHasUpdate(false); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturescategory.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturescategory.h index 91ecaaac969..166528f05a8 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturescategory.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturescategory.h @@ -27,8 +27,9 @@ class ContentLibraryTexturesCategory : public QObject public: ContentLibraryTexturesCategory(QObject *parent, const QString &name); - void addTexture(const QFileInfo &tex, const QString &subPath, const QString &webUrl, - const QString &fileExt, const QSize &dimensions, const qint64 sizeInBytes); + void addTexture(const QFileInfo &tex, const QString &subPath, const QString &key, + const QString &webTextureUrl, const QString &webIconUrl, const QString &fileExt, + const QSize &dimensions, const qint64 sizeInBytes, bool hasUpdate, bool isNew); bool filter(const QString &searchText); QString name() const; @@ -36,6 +37,8 @@ public: bool expanded() const; QList categoryTextures() const; + void markTextureHasNoUpdate(const QString &textureKey); + signals: void categoryVisibleChanged(); void categoryExpandChanged(); diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp index 5cf88ab6fcd..900376a4d3e 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp @@ -98,7 +98,8 @@ QHash ContentLibraryTexturesModel::roleNames() const * @param bundlePath local path to the bundle folder and icons * @param metaData bundle textures metadata */ -void ContentLibraryTexturesModel::loadTextureBundle(const QString &remoteUrl, const QString &bundleIconPath, +void ContentLibraryTexturesModel::loadTextureBundle(const QString &remoteUrl, const QString &iconsUrl, + const QString &bundleIconPath, const QVariantMap &metaData) { if (!m_bundleCategories.isEmpty()) @@ -117,8 +118,9 @@ void ContentLibraryTexturesModel::loadTextureBundle(const QString &remoteUrl, co auto category = new ContentLibraryTexturesCategory(this, dir.fileName()); const QFileInfoList texFiles = QDir(dir.filePath()).entryInfoList(QDir::Files); for (const QFileInfo &tex : texFiles) { - QString fullRemoteUrl = QString("%1/%2/%3.zip").arg(remoteUrl, dir.fileName(), - tex.baseName()); + QString textureUrl = QString("%1/%2/%3.zip").arg(remoteUrl, dir.fileName(), tex.baseName()); + QString iconUrl = QString("%1/%2/%3.png").arg(iconsUrl, dir.fileName(), tex.baseName()); + QString localDownloadPath = QString("%1/%2/%3") .arg(Paths::bundlesPathSetting(), m_category, @@ -127,15 +129,20 @@ void ContentLibraryTexturesModel::loadTextureBundle(const QString &remoteUrl, co QString fileExt; QSize dimensions; qint64 sizeInBytes = -1; + bool hasUpdate = false; + bool isNew = false; if (imageItems.contains(key)) { QVariantMap dataMap = imageItems[key].toMap(); fileExt = '.' + dataMap.value("format").toString(); dimensions = QSize(dataMap.value("width").toInt(), dataMap.value("height").toInt()); sizeInBytes = dataMap.value("file_size").toLongLong(); + hasUpdate = m_modifiedFiles.contains(key); + isNew = m_newFiles.contains(key); } - category->addTexture(tex, localDownloadPath, fullRemoteUrl, fileExt, dimensions, sizeInBytes); + category->addTexture(tex, localDownloadPath, key, textureUrl, iconUrl, fileExt, + dimensions, sizeInBytes, hasUpdate, isNew); } m_bundleCategories.append(category); } @@ -144,6 +151,52 @@ void ContentLibraryTexturesModel::loadTextureBundle(const QString &remoteUrl, co updateIsEmpty(); } +void ContentLibraryTexturesModel::setModifiedFileEntries(const QVariantMap &files) +{ + m_modifiedFiles.clear(); + + const QString prefix = m_category + "/"; + const QStringList keys = files.keys(); + + for (const QString &key : keys) { + if (key.startsWith(prefix)) + m_modifiedFiles[key] = files[key]; + } +} + +void ContentLibraryTexturesModel::setNewFileEntries(const QStringList &newFiles) +{ + const QString prefix = m_category + "/"; + + m_newFiles = Utils::filteredCast>(newFiles, [&prefix](const QString &key) { + return key.startsWith(prefix); + }); +} + +QString ContentLibraryTexturesModel::removeModifiedFileEntry(const QString &key) +{ + if (m_modifiedFiles.contains(key)) { + QVariantMap item = m_modifiedFiles[key].toMap(); + m_modifiedFiles.remove(key); + return item["checksum"].toString(); + } else { + return {}; + } +} + +void ContentLibraryTexturesModel::markTextureHasNoUpdates(const QString &subcategory, + const QString &textureKey) +{ + auto *categ = Utils::findOrDefault(m_bundleCategories, + [&subcategory](ContentLibraryTexturesCategory *c) { + return c->name() == subcategory; + }); + if (!categ) + return; + + categ->markTextureHasNoUpdate(textureKey); +} + bool ContentLibraryTexturesModel::texBundleExists() const { return !m_bundleCategories.isEmpty(); diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.h index 3f7e4d48688..92db4151a84 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.h @@ -26,6 +26,10 @@ public: QHash roleNames() const override; void setSearchText(const QString &searchText); + void setModifiedFileEntries(const QVariantMap &files); + void setNewFileEntries(const QStringList &newFiles); + QString removeModifiedFileEntry(const QString &key); + void markTextureHasNoUpdates(const QString &subcategory, const QString &textureKey); bool texBundleExists() const; @@ -33,8 +37,8 @@ public: void setHasSceneEnv(bool b); void resetModel(); - void loadTextureBundle(const QString &remoteUrl, const QString &bundlePath, - const QVariantMap &metaData); + void loadTextureBundle(const QString &remoteUrl, const QString &iconsUrl, + const QString &bundlePath, const QVariantMap &metaData); signals: void isEmptyChanged(); @@ -48,6 +52,8 @@ private: QString m_searchText; QString m_category; QList m_bundleCategories; + QVariantMap m_modifiedFiles; + QSet m_newFiles; bool m_isEmpty = true; bool m_hasSceneEnv = false; diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp index 9cc9576bc6c..8e9ef0be2b1 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp @@ -7,9 +7,11 @@ #include "contentlibrarymaterialsmodel.h" #include "contentlibrarytexture.h" #include "contentlibrarytexturesmodel.h" +#include "contentlibraryiconprovider.h" #include "utils/filedownloader.h" #include "utils/fileextractor.h" +#include "utils/multifiledownloader.h" #include #include @@ -24,13 +26,16 @@ #include #include +#include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -113,6 +118,8 @@ ContentLibraryWidget::ContentLibraryWidget() m_quickWidget->quickWidget()->setObjectName(Constants::OBJECT_NAME_CONTENT_LIBRARY); m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); + m_quickWidget->engine()->addImageProvider(QStringLiteral("contentlibrary"), + new Internal::ContentLibraryIconProvider); m_quickWidget->engine()->addImportPath(propertyEditorResourcesPath() + "/imports"); m_quickWidget->setClearColor(Theme::getColor(Theme::Color::DSpanelBackground)); @@ -121,6 +128,8 @@ ContentLibraryWidget::ContentLibraryWidget() + "/textures"; m_texturesUrl = m_baseUrl + "/Textures"; + m_textureIconsUrl = m_baseUrl + "/icons/Textures"; + m_environmentIconsUrl = m_baseUrl + "/icons/Environments"; m_environmentsUrl = m_baseUrl + "/Environments"; m_downloadPath = Paths::bundlesPathSetting(); @@ -178,8 +187,231 @@ void ContentLibraryWidget::loadTextureBundle() if (fetchTextureBundleMetadata(bundleDir) && fetchTextureBundleIcons(bundleDir)) { QString bundleIconPath = m_downloadPath + "/TextureBundleIcons"; QVariantMap metaData = readBundleMetadata(); - m_texturesModel->loadTextureBundle(m_texturesUrl, bundleIconPath, metaData); - m_environmentsModel->loadTextureBundle(m_environmentsUrl, bundleIconPath, metaData); + m_texturesModel->loadTextureBundle(m_texturesUrl, m_textureIconsUrl, bundleIconPath, metaData); + m_environmentsModel->loadTextureBundle(m_environmentsUrl, m_environmentIconsUrl, + bundleIconPath, metaData); + } +} + +std::tuple ContentLibraryWidget::compareTextureMetaFiles( + const QString &existingMetaFilePath, const QString downloadedMetaFilePath) +{ + QVariantMap existingMeta; + QFile existingFile(existingMetaFilePath); + if (existingFile.open(QIODeviceBase::ReadOnly | QIODeviceBase::Text)) + existingMeta = QJsonDocument::fromJson(existingFile.readAll()).toVariant().toMap(); + + QVariantMap downloadedMeta; + QFile downloadedFile(downloadedMetaFilePath); + if (downloadedFile.open(QIODeviceBase::ReadOnly | QIODeviceBase::Text)) + downloadedMeta = QJsonDocument::fromJson(downloadedFile.readAll()).toVariant().toMap(); + + int existingVersion = existingMeta["version"].toInt(); + int downloadedVersion = downloadedMeta["version"].toInt(); + + if (existingVersion != downloadedVersion) { + qWarning() << "We're not comparing local vs downloaded textures metadata because they are " + "of different versions"; + return {}; + } + + QVariantMap existingItems = existingMeta["image_items"].toMap(); + QVariantMap downloadedItems = downloadedMeta["image_items"].toMap(); + + QStringList existingKeys = existingItems.keys(); + QStringList downloadedKeys = downloadedItems.keys(); + + QSet existing(existingKeys.cbegin(), existingKeys.cend()); + QSet downloaded(downloadedKeys.cbegin(), downloadedKeys.cend()); + + const QSet newFiles = downloaded - existing; + const QSet commonFiles = downloaded & existing; + + QVariantMap modifiedFileEntries; + + for (const QString &file: commonFiles) { + QString existingCsum = existingItems[file].toMap()["checksum"].toString(); + QString downloadedCsum = downloadedItems[file].toMap()["checksum"].toString(); + + if (existingCsum != downloadedCsum) + modifiedFileEntries[file] = downloadedItems[file]; + } + + QVariantMap newFileEntries; + for (const QString &path: newFiles) + newFileEntries[path] = downloadedItems[path]; + + return std::make_tuple(existingItems, newFileEntries, modifiedFileEntries); +} + +void ContentLibraryWidget::fetchNewTextureIcons(const QVariantMap &existingFiles, + const QVariantMap &newFiles, + const QString &existingMetaFilePath, + const QDir &bundleDir) +{ + QStringList fileList = Utils::transform(newFiles.keys(), [](const QString &file) -> QString { + return file + ".png"; + }); + + auto multidownloader = new MultiFileDownloader(this); + multidownloader->setBaseUrl(QString(m_baseUrl + "/icons")); + multidownloader->setFiles(fileList); + multidownloader->setTargetDirPath(m_downloadPath + "/TextureBundleIcons"); + + auto downloader = new FileDownloader(this); + downloader->setDownloadEnabled(true); + downloader->setProbeUrl(false); + + downloader->setUrl(multidownloader->nextUrl()); + downloader->setTargetFilePath(multidownloader->nextTargetPath()); + + QObject::connect(multidownloader, &MultiFileDownloader::nextUrlChanged, downloader, [=]() { + downloader->setUrl(multidownloader->nextUrl()); + }); + + QObject::connect(multidownloader, &MultiFileDownloader::nextTargetPathChanged, downloader, [=]() { + downloader->setTargetFilePath(multidownloader->nextTargetPath()); + }); + + multidownloader->setDownloader(downloader); + + QVariantMap files = existingFiles; + files.insert(newFiles); + + QObject::connect(multidownloader, &MultiFileDownloader::finishedChanged, this, + [multidownloader, files, existingMetaFilePath, this, bundleDir]() { + multidownloader->deleteLater(); + + QVariantMap newMap; + newMap["version"] = TextureBundleMetadataVersion; + newMap["image_items"] = files; + + QJsonObject jobj = QJsonObject::fromVariantMap(newMap); + QJsonDocument doc(jobj); + QByteArray data = doc.toJson(); + + QFile existingFile(existingMetaFilePath); + if (existingFile.open(QIODeviceBase::WriteOnly | QIODeviceBase::Text)) { + existingFile.write(data); + existingFile.flush(); + } + + if (fetchTextureBundleIcons(bundleDir)) { + QString bundleIconPath = m_downloadPath + "/TextureBundleIcons"; + QVariantMap metaData = readBundleMetadata(); + m_texturesModel->loadTextureBundle(m_texturesUrl, m_textureIconsUrl, bundleIconPath, + metaData); + m_environmentsModel->loadTextureBundle(m_environmentsUrl, m_environmentIconsUrl, + bundleIconPath, metaData); + } + + }); + + multidownloader->start(); +} + +QStringList ContentLibraryWidget::saveNewTextures(const QDir &bundleDir, const QStringList &newFiles) +{ + int newFileExpirationDays = QmlDesignerPlugin::settings() + .value(DesignerSettingsKey::CONTENT_LIBRARY_NEW_FLAG_EXPIRATION_DAYS) + .toInt(); + + int newFileExpirationSecs = newFileExpirationDays * 24 * 3600; + + QString newFilesPath = bundleDir.filePath(".new_textures_on_server.json"); + + QFile jsonFile(newFilesPath); + if (jsonFile.exists()) { + jsonFile.open(QFile::ReadOnly | QFile::Text); + + qint64 now = QDateTime::currentSecsSinceEpoch(); + QByteArray existingData = jsonFile.readAll(); + QJsonDocument doc = QJsonDocument::fromJson(existingData); + jsonFile.close(); + + QJsonObject mainObj = doc.object(); + if (mainObj.value("version").toInt() > TextureBundleMetadataVersion) { + qDebug() << "Existing version of cached 'New Items' does not have a known version."; + + // TODO: do simple save new file + return newFiles; + } + + QJsonValue jsonValue = mainObj.value("image_items"); + QJsonArray imageItems = jsonValue.toArray(); + + // remove those files that are older than N days (configurable via QSettings) + imageItems = Utils::filtered(imageItems, [newFileExpirationSecs, now](const QJsonValue &v) { + qint64 time = v["time"].toInt(); + if (now - time >= newFileExpirationSecs) + return false; + + return true; + }); + + QStringList pruned = Utils::transform(imageItems, [](const QJsonValue &value) -> QString { + return value.toObject()["file"].toString(); + }); + + // filter out files from newFiles that already exist in the document + + QStringList newFilesNow = Utils::filtered(newFiles, [&imageItems](const QString &file) { + bool contains = Utils::anyOf(imageItems, [file](const QJsonValue &v) { + if (!v.isObject()) + return false; + + QJsonObject o = v.toObject(); + if (!o.contains("file")) + return false; + + bool hasFile = (o["file"] == file); + return hasFile; + + return false; + }); + return !contains; + }); + + // add the filtered out files to the doc. + for (const QString &file: newFilesNow) { + QJsonObject obj({{"file", file}, {"time", now}}); + imageItems.push_back(obj); + } + + mainObj["image_items"] = imageItems; + + // save the json file. + doc.setObject(mainObj); + QByteArray data = doc.toJson(); + + jsonFile.open(QFile::WriteOnly | QFile::Text); + jsonFile.write(data); + jsonFile.close(); + + return newFilesNow + pruned; + } else { + qint64 now = QDateTime::currentSecsSinceEpoch(); + + QJsonArray texturesFoundNow = Utils::transform(newFiles, [now](const QString &file) { + QJsonObject obj({{"file", file}, {"time", now}}); + return QJsonValue(obj); + }); + + QVariantMap varMap; + varMap["version"] = TextureBundleMetadataVersion; + varMap["image_items"] = texturesFoundNow; + + QJsonObject mainObj({{"version", TextureBundleMetadataVersion}, + {"image_items", texturesFoundNow}}); + + QJsonDocument doc(mainObj); + QByteArray data = doc.toJson(); + + jsonFile.open(QFile::WriteOnly | QFile::Text); + jsonFile.write(data); + jsonFile.close(); + + return newFiles; } } @@ -188,8 +420,7 @@ bool ContentLibraryWidget::fetchTextureBundleMetadata(const QDir &bundleDir) QString filePath = bundleDir.filePath("texture_bundle.json"); QFileInfo fi(filePath); - if (fi.exists() && fi.size() > 0) - return true; + bool metaFileExists = fi.exists() && fi.size() > 0; QString metaFileUrl = m_baseUrl + "/texture_bundle.zip"; FileDownloader *downloader = new FileDownloader(this); @@ -197,11 +428,26 @@ bool ContentLibraryWidget::fetchTextureBundleMetadata(const QDir &bundleDir) downloader->setProbeUrl(false); downloader->setDownloadEnabled(true); + QObject::connect(downloader, &FileDownloader::downloadFailed, this, [=]() { + if (metaFileExists) { + if (fetchTextureBundleIcons(bundleDir)) { + QString bundleIconPath = m_downloadPath + "/TextureBundleIcons"; + QVariantMap metaData = readBundleMetadata(); + m_texturesModel->loadTextureBundle(m_texturesUrl, m_textureIconsUrl, bundleIconPath, + metaData); + m_environmentsModel->loadTextureBundle(m_environmentsUrl, m_environmentIconsUrl, + bundleIconPath, metaData); + } + } + }); + QObject::connect(downloader, &FileDownloader::finishedChanged, this, [=]() { FileExtractor *extractor = new FileExtractor(this); extractor->setArchiveName(downloader->completeBaseName()); extractor->setSourceFile(downloader->outputFile()); - extractor->setTargetPath(bundleDir.absolutePath()); + if (!metaFileExists) + extractor->setTargetPath(bundleDir.absolutePath()); + extractor->setAlwaysCreateDir(false); extractor->setClearTargetPathContents(false); @@ -209,11 +455,35 @@ bool ContentLibraryWidget::fetchTextureBundleMetadata(const QDir &bundleDir) downloader->deleteLater(); extractor->deleteLater(); + if (metaFileExists) { + QVariantMap newFiles, existing; + QVariantMap modifiedFilesEntries; + + std::tie(existing, newFiles, modifiedFilesEntries) = + compareTextureMetaFiles(filePath, extractor->targetPath() + "/texture_bundle.json"); + + const QStringList newFilesKeys = newFiles.keys(); + const QStringList actualNewFiles = saveNewTextures(bundleDir, newFilesKeys); + + m_texturesModel->setModifiedFileEntries(modifiedFilesEntries); + m_texturesModel->setNewFileEntries(actualNewFiles); + + m_environmentsModel->setModifiedFileEntries(modifiedFilesEntries); + m_environmentsModel->setNewFileEntries(actualNewFiles); + + if (newFiles.count() > 0) { + fetchNewTextureIcons(existing, newFiles, filePath, bundleDir); + return; + } + } + if (fetchTextureBundleIcons(bundleDir)) { QString bundleIconPath = m_downloadPath + "/TextureBundleIcons"; QVariantMap metaData = readBundleMetadata(); - m_texturesModel->loadTextureBundle(m_texturesUrl, bundleIconPath, metaData); - m_environmentsModel->loadTextureBundle(m_environmentsUrl, bundleIconPath, metaData); + m_texturesModel->loadTextureBundle(m_texturesUrl, m_textureIconsUrl, bundleIconPath, + metaData); + m_environmentsModel->loadTextureBundle(m_environmentsUrl, m_environmentIconsUrl, + bundleIconPath, metaData); } }); @@ -253,8 +523,10 @@ bool ContentLibraryWidget::fetchTextureBundleIcons(const QDir &bundleDir) QString bundleIconPath = m_downloadPath + "/TextureBundleIcons"; QVariantMap metaData = readBundleMetadata(); - m_texturesModel->loadTextureBundle(m_texturesUrl, bundleIconPath, metaData); - m_environmentsModel->loadTextureBundle(m_environmentsUrl, bundleIconPath, metaData); + m_texturesModel->loadTextureBundle(m_texturesUrl, m_textureIconsUrl, bundleIconPath, + metaData); + m_environmentsModel->loadTextureBundle(m_environmentsUrl, m_environmentIconsUrl, + bundleIconPath, metaData); }); extractor->extract(); @@ -264,6 +536,48 @@ bool ContentLibraryWidget::fetchTextureBundleIcons(const QDir &bundleDir) return false; } +void ContentLibraryWidget::markTextureUpdated(const QString &textureKey) +{ + static QRegularExpression re("([^/]+)/([^/]+)/.*"); + QString category = re.match(textureKey).captured(1); + QString subcategory = re.match(textureKey).captured(2); + + QString checksumOnServer; + if (category == "Textures") + checksumOnServer = m_texturesModel->removeModifiedFileEntry(textureKey); + else if (category == "Environments") + checksumOnServer = m_environmentsModel->removeModifiedFileEntry(textureKey); + + QJsonObject metaDataObj; + QFile jsonFile(m_downloadPath + "/texture_bundle.json"); + if (jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + metaDataObj = QJsonDocument::fromJson(jsonFile.readAll()).object(); + jsonFile.close(); + } + + QJsonObject imageItems = metaDataObj["image_items"].toObject(); + + QJsonObject oldImageItem = imageItems[textureKey].toObject(); + oldImageItem["checksum"] = checksumOnServer; + imageItems[textureKey] = oldImageItem; + + metaDataObj["image_items"] = imageItems; + + QJsonDocument outDoc(metaDataObj); + QByteArray data = outDoc.toJson(); + + QFile outFile(m_downloadPath + "/texture_bundle.json"); + if (outFile.open(QIODeviceBase::WriteOnly | QIODeviceBase::Text)) { + outFile.write(data); + outFile.flush(); + } + + if (category == "Textures") + m_texturesModel->markTextureHasNoUpdates(subcategory, textureKey); + else if (category == "Environments") + m_environmentsModel->markTextureHasNoUpdates(subcategory, textureKey); +} + QList ContentLibraryWidget::createToolBarWidgets() { return {}; diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h index 6d4ba51a300..894448f2dce 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h @@ -61,6 +61,7 @@ public: Q_INVOKABLE void addTexture(QmlDesigner::ContentLibraryTexture *tex); Q_INVOKABLE void addLightProbe(QmlDesigner::ContentLibraryTexture *tex); Q_INVOKABLE void updateSceneEnvState(); + Q_INVOKABLE void markTextureUpdated(const QString &textureKey); signals: void bundleMaterialDragStarted(QmlDesigner::ContentLibraryMaterial *bundleMat); @@ -83,6 +84,11 @@ private: QVariantMap readBundleMetadata(); bool fetchTextureBundleMetadata(const QDir &bundleDir); bool fetchTextureBundleIcons(const QDir &bundleDir); + void fetchNewTextureIcons(const QVariantMap &existingFiles, const QVariantMap &newFiles, + const QString &existingMetaFilePath, const QDir &bundleDir); + std::tuple compareTextureMetaFiles( + const QString &existingMetaFile, const QString downloadedMetaFile); + QStringList saveNewTextures(const QDir &bundleDir, const QStringList &newFiles); QScopedPointer m_quickWidget; QPointer m_materialsModel; @@ -102,6 +108,8 @@ private: bool m_isDragging = false; QString m_baseUrl; QString m_texturesUrl; + QString m_textureIconsUrl; + QString m_environmentIconsUrl; QString m_environmentsUrl; QString m_downloadPath; }; diff --git a/src/plugins/qmldesigner/utils/filedownloader.cpp b/src/plugins/qmldesigner/utils/filedownloader.cpp index 7825be5081b..dc8cf85c204 100644 --- a/src/plugins/qmldesigner/utils/filedownloader.cpp +++ b/src/plugins/qmldesigner/utils/filedownloader.cpp @@ -114,6 +114,13 @@ void FileDownloader::start() return; } + if (m_overwriteTarget && QFileInfo().exists(m_targetFilePath)) { + if (!QFile::remove(m_targetFilePath)) { + emit downloadFailed(); + return; + } + } + if (!QFileInfo().exists(m_targetFilePath) && !m_outputFile.rename(m_targetFilePath)) { emit downloadFailed(); return; @@ -183,6 +190,19 @@ bool FileDownloader::downloadEnabled() const return m_downloadEnabled; } +bool FileDownloader::overwriteTarget() const +{ + return m_overwriteTarget; +} + +void FileDownloader::setOverwriteTarget(bool value) +{ + if (value != m_overwriteTarget) { + m_overwriteTarget = value; + emit overwriteTargetChanged(); + } +} + bool FileDownloader::finished() const { return m_finished; diff --git a/src/plugins/qmldesigner/utils/filedownloader.h b/src/plugins/qmldesigner/utils/filedownloader.h index 4ecb6b49671..9bdd70943fa 100644 --- a/src/plugins/qmldesigner/utils/filedownloader.h +++ b/src/plugins/qmldesigner/utils/filedownloader.h @@ -26,6 +26,7 @@ class FileDownloader : public QObject Q_PROPERTY(QString outputFile READ outputFile NOTIFY outputFileChanged) Q_PROPERTY(QDateTime lastModified READ lastModified NOTIFY lastModifiedChanged) Q_PROPERTY(bool available READ available NOTIFY availableChanged) + Q_PROPERTY(bool overwriteTarget READ overwriteTarget WRITE setOverwriteTarget NOTIFY overwriteTargetChanged) public: explicit FileDownloader(QObject *parent = nullptr); @@ -47,6 +48,9 @@ public: void setDownloadEnabled(bool value); bool downloadEnabled() const; + bool overwriteTarget() const; + void setOverwriteTarget(bool value); + void setProbeUrl(bool value); bool probeUrl() const; @@ -69,6 +73,7 @@ signals: void downloadCanceled(); void probeUrlChanged(); void targetFilePathChanged(); + void overwriteTargetChanged(); private: void doProbeUrl(); @@ -85,6 +90,7 @@ private: QNetworkReply *m_reply = nullptr; bool m_downloadEnabled = false; + bool m_overwriteTarget = false; QString m_targetFilePath; }; diff --git a/src/plugins/qmldesigner/utils/fileextractor.cpp b/src/plugins/qmldesigner/utils/fileextractor.cpp index 7c32381b69c..e2ba28e8876 100644 --- a/src/plugins/qmldesigner/utils/fileextractor.cpp +++ b/src/plugins/qmldesigner/utils/fileextractor.cpp @@ -3,6 +3,7 @@ #include "fileextractor.h" #include +#include #include #include @@ -198,6 +199,13 @@ QString FileExtractor::sourceFile() const void FileExtractor::extract() { + if (m_targetPath.isEmpty()) { + auto uniqueText = QByteArray::number(QRandomGenerator::global()->generate(), 16); + QString tempFileName = QDir::tempPath() + "/.qds_" + uniqueText + "_extract_" + m_archiveName + "_dir"; + + m_targetPath = Utils::FilePath::fromString(tempFileName); + } + m_targetFolder = m_targetPath.toString() + "/" + m_archiveName; // If the target directory already exists, remove it and its content diff --git a/src/plugins/qmldesignerbase/utils/designersettings.cpp b/src/plugins/qmldesignerbase/utils/designersettings.cpp index fe1ee169c7a..6e0ad8bdded 100644 --- a/src/plugins/qmldesignerbase/utils/designersettings.cpp +++ b/src/plugins/qmldesignerbase/utils/designersettings.cpp @@ -90,6 +90,7 @@ void DesignerSettings::fromSettings(QSettings *settings) restoreValue(settings, DesignerSettingsKey::ACTIONS_MERGE_TEMPLATE_ENABLED, false); restoreValue(settings, DesignerSettingsKey::DOWNLOADABLE_BUNDLES_URL, "https://cdn.qt.io/designstudio/bundles"); + restoreValue(settings, DesignerSettingsKey::CONTENT_LIBRARY_NEW_FLAG_EXPIRATION_DAYS, 3); settings->endGroup(); settings->endGroup(); diff --git a/src/plugins/qmldesignerbase/utils/designersettings.h b/src/plugins/qmldesignerbase/utils/designersettings.h index 78b43705268..ff80f3358a0 100644 --- a/src/plugins/qmldesignerbase/utils/designersettings.h +++ b/src/plugins/qmldesignerbase/utils/designersettings.h @@ -61,6 +61,7 @@ inline constexpr char OLD_STATES_EDITOR[] = "ForceOldStatesEditor"; inline constexpr char EDITOR_ZOOM_FACTOR[] = "EditorZoomFactor"; inline constexpr char ACTIONS_MERGE_TEMPLATE_ENABLED[] = "ActionsMergeTemplateEnabled"; inline constexpr char DOWNLOADABLE_BUNDLES_URL[] = "DownloadableBundlesLocation"; +inline constexpr char CONTENT_LIBRARY_NEW_FLAG_EXPIRATION_DAYS[] = "ContentLibraryNewFlagExpirationInDays"; } class QMLDESIGNERBASE_EXPORT DesignerSettings diff --git a/tests/auto/qml/qmldesigner/CMakeLists.txt b/tests/auto/qml/qmldesigner/CMakeLists.txt index cf8d848b073..c03e09799e8 100644 --- a/tests/auto/qml/qmldesigner/CMakeLists.txt +++ b/tests/auto/qml/qmldesigner/CMakeLists.txt @@ -1,2 +1,2 @@ add_subdirectory(coretests) -add_subdirectory(wizard) +# add_subdirectory(wizard) From cc67fe289774f4f0bc5fbf389140b4aeb705e76c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 5 Jun 2023 14:30:16 +0200 Subject: [PATCH 052/149] QmlDesigner: Take '.' properties into account in convertToVariant What we call dot properties have two styles. something.x something { x: ... } In the second case the prefix is set, because in the model we always normalize the syntax to the first case. toString() properly walks the array to collect the full identifier, instead of just taking the base property name. Before we were using e.g. 'eulerRotation' as the property type and tried to convert a single float to a vector3D. The new code uses thefull property name 'eulerRoation.x' and the conversion succeeds. Task-number: QDS-10027 Change-Id: I7210558db6a0f91f5f1a25b719df06beb70c5b83 Reviewed-by: Miikka Heikkinen --- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 515d4043643..7328ae01aa6 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -609,8 +609,10 @@ public: const QString &propertyPrefix, AST::UiQualifiedId *propertyId) { - const QString propertyName = propertyPrefix.isEmpty() ? propertyId->name.toString() - : propertyPrefix; + const QString propertyName = propertyPrefix.isEmpty() + ? toString(propertyId) + : propertyPrefix + "." + toString(propertyId); + const PropertyMetaInfo propertyMetaInfo = node.metaInfo().property(propertyName.toUtf8()); const bool hasQuotes = astValue.trimmed().left(1) == QStringLiteral("\"") From 115b8c8572ee129219de55068184720bc9b38a9e Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Mon, 5 Jun 2023 18:15:13 +0300 Subject: [PATCH 053/149] QmlDesigner: Fix 3D editor's toolbar extension button alignment Fixes: QDS-9725 Change-Id: Id9ef221a4d8760d3e102913c42b2109475147360 Reviewed-by: Reviewed-by: Miikka Heikkinen --- src/plugins/qmldesigner/components/formeditor/toolbox.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmldesigner/components/formeditor/toolbox.cpp b/src/plugins/qmldesigner/components/formeditor/toolbox.cpp index 47a9503b2d3..53da8773eb6 100644 --- a/src/plugins/qmldesigner/components/formeditor/toolbox.cpp +++ b/src/plugins/qmldesigner/components/formeditor/toolbox.cpp @@ -34,11 +34,13 @@ ToolBox::ToolBox(QWidget *parentWidget) Utils::StyleHelper::setPanelWidget(m_leftToolBar, false); Utils::StyleHelper::setPanelWidgetSingleRow(m_leftToolBar, false); m_leftToolBar->setFixedHeight(Theme::toolbarSize()); + m_leftToolBar->setStyleSheet("QToolBarExtension {margin-top: 5px;}"); Utils::StyleHelper::setPanelWidget(m_rightToolBar, false); Utils::StyleHelper::setPanelWidgetSingleRow(m_rightToolBar, false); m_rightToolBar->setFixedHeight(Theme::toolbarSize()); m_rightToolBar->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding); + m_rightToolBar->setStyleSheet("QToolBarExtension {margin-top: 5px;}"); auto stretchToolbar = new QToolBar(this); Utils::StyleHelper::setPanelWidget(stretchToolbar, false); From 5dadc57bc38c3be45970b7ff3bf8088ecb0a92ab Mon Sep 17 00:00:00 2001 From: Burak Hancerli Date: Mon, 5 Jun 2023 14:11:03 +0200 Subject: [PATCH 054/149] QmlProject: Fix escaping while rewriting the qmlproject file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QDS-10032 Change-Id: I856d9935a1c77085f79008db19920f12af9e1a21 Reviewed-by: Henning Gründl Reviewed-by: --- .../buildsystem/projectitem/converters.cpp | 6 ++++-- tests/unit/unittest/qmlprojectmanager/converters-test.cpp | 6 ++++++ .../data/converter/test-set-1/testfile.jsontoqml | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp index 98dd4cea983..7f01e33f435 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp @@ -156,7 +156,9 @@ QString jsonToQmlProject(const QJsonObject &rootObject) { // append ShaderTool object if (!shaderConfig["args"].toVariant().toStringList().isEmpty()) { startObject("ShaderTool"); - appendString("args", shaderConfig["args"].toVariant().toStringList().join(" ")); + appendString("args", + shaderConfig["args"].toVariant().toStringList().join(" ").replace( + "\"", "\\\"")); appendArray("files", shaderConfig["files"].toVariant().toStringList()); endObject(); } @@ -193,7 +195,7 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile) } if (rootNode->name() != QLatin1String("Project")) { - qCritical() << "Cannot find root 'Proejct' item in the project file: " << projectFile; + qCritical() << "Cannot find root 'Project' item in the project file: " << projectFile; return {}; } diff --git a/tests/unit/unittest/qmlprojectmanager/converters-test.cpp b/tests/unit/unittest/qmlprojectmanager/converters-test.cpp index 4e4e225a890..b985fff53d3 100644 --- a/tests/unit/unittest/qmlprojectmanager/converters-test.cpp +++ b/tests/unit/unittest/qmlprojectmanager/converters-test.cpp @@ -31,12 +31,14 @@ public: ? QString::fromLatin1(m_qmlProjectFile.fileContents().value()) : QString{}); } + QString jsonToQmlProjectContent() const { return m_jsonToQmlProjectFile.fileContents() ? QString::fromLatin1(m_jsonToQmlProjectFile.fileContents().value()) : QString{}; } + QString qmlProjectToJsonContent() const { return m_qmlProjectToJsonFile.fileContents() @@ -45,9 +47,13 @@ public: } QString dataSetPath() const { return m_dataSetDirectory.absolutePath(); } + QString dataSetName() const { return m_dataSetDirectory.dirName(); } + Utils::FilePath qmlProjectFile() const { return m_qmlProjectFile; } + Utils::FilePath jsonToQmlProjectFile() const { return m_jsonToQmlProjectFile; } + Utils::FilePath qmlProjectToJsonFile() const { return m_qmlProjectToJsonFile; } private: diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml index fe2c378c705..dbd6e4a91ac 100644 --- a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml +++ b/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml @@ -28,7 +28,7 @@ Project { } ShaderTool { - args: "-s --glsl "100 es,120,150" --hlsl 50 --msl 12" + args: "-s --glsl \"100 es,120,150\" --hlsl 50 --msl 12" files: [ "content/shaders/*" ] } From 90b36d88e20b9620802c6e52e1c63c8f739889d3 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 6 Jun 2023 11:00:37 +0200 Subject: [PATCH 055/149] QmlJS: Add support for annotations in qmljsreformatter This fixes that the annotations are removed. The indentation still has issues. Change-Id: I6752767e00e0fafe8eb567066db3b9952f0d0a4f Reviewed-by: Ulf Hermann Reviewed-by: --- src/libs/qmljs/qmljsreformatter.cpp | 27 +++++++++++++++++++++- tests/auto/qml/reformatter/annotations.qml | 22 ++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/auto/qml/reformatter/annotations.qml diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index 232c0361a1a..d2891451e95 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -590,14 +590,35 @@ protected: return true; } - bool visit(UiObjectDefinition *ast) override + bool visit(UiAnnotation *ast) override { + out("@"); accept(ast->qualifiedTypeNameId); out(" "); accept(ast->initializer); return false; } + bool visit(UiAnnotationList *ast) override + { + for (UiAnnotationList *it = ast; it; it = it->next) { + accept(it->annotation); + newLine(); + } + return false; + } + + bool visit(UiObjectDefinition *ast) override + { + accept(ast->annotations); + + accept(ast->qualifiedTypeNameId); + out(" "); + accept(ast->initializer); + + return false; + } + bool visit(UiObjectInitializer *ast) override { out(ast->lbraceToken); @@ -687,9 +708,12 @@ protected: bool visit(UiScriptBinding *ast) override { + accept(ast->annotations); + accept(ast->qualifiedId); out(": ", ast->colonToken); accept(ast->statement); + return false; } @@ -1290,6 +1314,7 @@ protected: { for (UiObjectMemberList *it = ast; it; it = it->next) { accept(it->member); + if (it->next) newLine(); } diff --git a/tests/auto/qml/reformatter/annotations.qml b/tests/auto/qml/reformatter/annotations.qml new file mode 100644 index 00000000000..ee3d1fb45ca --- /dev/null +++ b/tests/auto/qml/reformatter/annotations.qml @@ -0,0 +1,22 @@ +import QtQuick + +@Annotation {} +Item { + // properties + property int foo + property alias bar: x + @Annotation2 { + someproperty: 10 + } + id: someId + + @Annotation3 { + someproperty: 10 + } + Rectangle { + // properties + property int foo + property alias bar: x + id: someId2 + } +} From 4648f055a11b371b8c70212851dcf3018dfb6f2e Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Fri, 2 Jun 2023 17:13:11 +0200 Subject: [PATCH 056/149] QmlDesigner: Fix int conversion warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Icbc5547bca8ada55a6c02a7ca9e4f5d169a70553 Reviewed-by: Henning Gründl Reviewed-by: Reviewed-by: Qt CI Patch Build Bot --- src/plugins/insight/insightmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/insight/insightmodel.cpp b/src/plugins/insight/insightmodel.cpp index b80249d2124..2d2550aac55 100644 --- a/src/plugins/insight/insightmodel.cpp +++ b/src/plugins/insight/insightmodel.cpp @@ -227,7 +227,7 @@ InsightModel::InsightModel(InsightView *view, ExternalDependenciesInterface &ext int InsightModel::rowCount(const QModelIndex &) const { - return m_qtdsConfig.empty() ? 0 : m_qtdsConfig.size(); + return m_qtdsConfig.empty() ? 0 : static_cast(m_qtdsConfig.size()); } QVariant InsightModel::data(const QModelIndex &index, int role) const From 15e495f9f75fdc4cf18ccb7f5955fa72b769bb04 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 6 Jun 2023 12:42:10 +0200 Subject: [PATCH 057/149] QmlDesigner: Make sure the plugin is always properly initialized MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If QDS is started with a startup project it is possible that ::showDesigner is called before ::delayedInitialize(). Change-Id: If8afdefdd662102cbee41ded2e21735767292956 Reviewed-by: Qt CI Bot Reviewed-by: Henning Gründl Reviewed-by: --- src/plugins/qmldesigner/qmldesignerplugin.cpp | 113 ++++++++++-------- src/plugins/qmldesigner/qmldesignerplugin.h | 2 + 2 files changed, 63 insertions(+), 52 deletions(-) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 836b7d2e706..e5c02f64875 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -303,58 +303,7 @@ bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *e bool QmlDesignerPlugin::delayedInitialize() { - // adding default path to item library plugins - const QString postfix = Utils::HostOsInfo::isMacHost() ? QString("/QmlDesigner") - : QString("/qmldesigner"); - const QStringList pluginPaths = - Utils::transform(ExtensionSystem::PluginManager::pluginPaths(), [postfix](const QString &p) { - return QString(p + postfix); - }); - - MetaInfo::initializeGlobal(pluginPaths, d->externalDependencies); - - d->viewManager.registerView(std::make_unique(d->externalDependencies)); - - auto timelineView = d->viewManager.registerView( - std::make_unique(d->externalDependencies)); - timelineView->registerActions(); - - d->viewManager.registerView( - std::make_unique(d->externalDependencies)); - - auto eventlistView = d->viewManager.registerView( - std::make_unique(d->externalDependencies)); - eventlistView->registerActions(); - - auto transitionEditorView = d->viewManager.registerView( - std::make_unique(d->externalDependencies)); - transitionEditorView->registerActions(); - - d->viewManager.registerFormEditorTool(std::make_unique()); - d->viewManager.registerFormEditorTool(std::make_unique()); - d->viewManager.registerFormEditorTool(std::make_unique()); - d->viewManager.registerFormEditorTool( - std::make_unique(d->externalDependencies)); - d->viewManager.registerFormEditorTool(std::make_unique()); - - if (QmlProjectManager::QmlProject::isQtDesignStudio()) { - d->mainWidget.initialize(); - - emitUsageStatistics("StandaloneMode"); - if (QmlProjectManager::QmlProject::isQtDesignStudioStartedFromQtC()) - emitUsageStatistics("QDSlaunchedFromQtC"); - emitUsageStatistics("qdsStartupCount"); - - FoundLicense license = checkLicense(); - if (license == FoundLicense::enterprise) - Core::ICore::appendAboutInformation(tr("License: Enterprise")); - else if (license == FoundLicense::professional) - Core::ICore::appendAboutInformation(tr("License: Professional")); - - if (!licensee().isEmpty()) - Core::ICore::appendAboutInformation(tr("Licensee: %1").arg(licensee())); - } - + enforceDelayedInitialize(); return true; } @@ -475,6 +424,8 @@ void QmlDesignerPlugin::showDesigner() { QTC_ASSERT(!d->documentManager.hasCurrentDesignDocument(), return); + enforceDelayedInitialize(); + d->mainWidget.initialize(); const Utils::FilePath fileName = Core::EditorManager::currentEditor()->document()->filePath(); @@ -641,6 +592,64 @@ QmlDesignerPluginPrivate *QmlDesignerPlugin::privateInstance() return instance()->d; } +void QmlDesignerPlugin::enforceDelayedInitialize() +{ + if (m_delayedInitialized) + return; + + // adding default path to item library plugins + const QString postfix = Utils::HostOsInfo::isMacHost() ? QString("/QmlDesigner") + : QString("/qmldesigner"); + const QStringList pluginPaths = Utils::transform(ExtensionSystem::PluginManager::pluginPaths(), + [postfix](const QString &p) { + return QString(p + postfix); + }); + + MetaInfo::initializeGlobal(pluginPaths, d->externalDependencies); + + d->viewManager.registerView(std::make_unique(d->externalDependencies)); + + auto timelineView = d->viewManager.registerView( + std::make_unique(d->externalDependencies)); + timelineView->registerActions(); + + d->viewManager.registerView(std::make_unique(d->externalDependencies)); + + auto eventlistView = d->viewManager.registerView( + std::make_unique(d->externalDependencies)); + eventlistView->registerActions(); + + auto transitionEditorView = d->viewManager.registerView( + std::make_unique(d->externalDependencies)); + transitionEditorView->registerActions(); + + d->viewManager.registerFormEditorTool(std::make_unique()); + d->viewManager.registerFormEditorTool(std::make_unique()); + d->viewManager.registerFormEditorTool(std::make_unique()); + d->viewManager.registerFormEditorTool(std::make_unique(d->externalDependencies)); + d->viewManager.registerFormEditorTool(std::make_unique()); + + if (QmlProjectManager::QmlProject::isQtDesignStudio()) { + d->mainWidget.initialize(); + + emitUsageStatistics("StandaloneMode"); + if (QmlProjectManager::QmlProject::isQtDesignStudioStartedFromQtC()) + emitUsageStatistics("QDSlaunchedFromQtC"); + emitUsageStatistics("qdsStartupCount"); + + FoundLicense license = checkLicense(); + if (license == FoundLicense::enterprise) + Core::ICore::appendAboutInformation(tr("License: Enterprise")); + else if (license == FoundLicense::professional) + Core::ICore::appendAboutInformation(tr("License: Professional")); + + if (!licensee().isEmpty()) + Core::ICore::appendAboutInformation(tr("Licensee: %1").arg(licensee())); + } + + m_delayedInitialized = true; +} + DesignDocument *QmlDesignerPlugin::currentDesignDocument() const { if (d) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.h b/src/plugins/qmldesigner/qmldesignerplugin.h index 4080678e892..455810fa206 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.h +++ b/src/plugins/qmldesigner/qmldesignerplugin.h @@ -119,11 +119,13 @@ private: // functions Model *currentModel() const; QQuickWidget *m_feedbackWidget = nullptr; static QmlDesignerPluginPrivate *privateInstance(); + void enforceDelayedInitialize(); private: // variables QmlDesignerPluginPrivate *d = nullptr; static QmlDesignerPlugin *m_instance; QElapsedTimer m_usageTimer; + bool m_delayedInitialized = false; }; } // namespace QmlDesigner From 47788874ac20ca9338bb648818bf410b9d25443b Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 6 Jun 2023 15:43:55 +0200 Subject: [PATCH 058/149] QmlDesigner: Fix Qt for MCUs tag for qt6 projects Task-number: QDS-10051 Change-Id: I16b1c2a43860bec047db3254a9386b137be70e69 Reviewed-by: Thomas Hartmann --- src/plugins/studiowelcome/studiowelcomeplugin.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index b7a4725f814..5729b952e9e 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -414,15 +414,17 @@ static QString tags(const FilePath &projectFilePath) const QByteArray data = reader.data(); - bool mcu = data.contains("qtForMCUs: true"); + const bool isQt6 = data.contains("qt6Project: true"); + const bool isMcu = data.contains("qtForMCUs: true"); - if (data.contains("qt6Project: true")) + if (isQt6) ret.append("Qt 6"); - else if (mcu) - ret.append("Qt For MCU"); else ret.append("Qt 5"); + if (isMcu) + ret.append("Qt For MCU"); + return ret.join(","); } From 3badd8557f32aa950b6942d0d6ff6acbc184c018 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Tue, 6 Jun 2023 17:00:09 +0200 Subject: [PATCH 059/149] QmlDesigner: Remove old states editor Task-number: QDS-10037 Change-Id: I1aec5052ef5a90a19d2adbb73c1def23f337e42c Reviewed-by: Tim Jenssen Reviewed-by: Qt CI Bot --- src/plugins/qmldesigner/CMakeLists.txt | 9 - .../components/componentcore/viewmanager.cpp | 51 +- .../quick2propertyeditorview.cpp | 4 +- .../propertychangesmodel.cpp | 28 +- .../propertychangesmodel.h | 28 +- .../propertymodel.cpp | 28 +- .../propertymodel.h | 28 +- .../stateseditorimageprovider.cpp | 16 +- .../stateseditor/stateseditorimageprovider.h | 6 +- .../stateseditor/stateseditormodel.cpp | 262 ++++- .../stateseditor/stateseditormodel.h | 53 +- .../stateseditor/stateseditorview.cpp | 569 ++++++++--- .../stateseditor/stateseditorview.h | 58 +- .../stateseditor/stateseditorwidget.cpp | 54 +- .../stateseditor/stateseditorwidget.h | 18 +- .../stateseditorimageprovider.cpp | 82 -- .../stateseditorimageprovider.h | 54 - .../stateseditornew/stateseditormodel.cpp | 462 --------- .../stateseditornew/stateseditormodel.h | 127 --- .../stateseditornew/stateseditorview.cpp | 962 ------------------ .../stateseditornew/stateseditorview.h | 157 --- .../stateseditornew/stateseditorwidget.cpp | 200 ---- .../stateseditornew/stateseditorwidget.h | 80 -- .../designercore/include/qmlstate.h | 1 - .../designercore/include/qmlvisualnode.h | 1 - .../utils/designersettings.cpp | 1 - .../qmldesignerbase/utils/designersettings.h | 1 - 27 files changed, 839 insertions(+), 2501 deletions(-) rename src/plugins/qmldesigner/components/{stateseditornew => stateseditor}/propertychangesmodel.cpp (74%) rename src/plugins/qmldesigner/components/{stateseditornew => stateseditor}/propertychangesmodel.h (55%) rename src/plugins/qmldesigner/components/{stateseditornew => stateseditor}/propertymodel.cpp (75%) rename src/plugins/qmldesigner/components/{stateseditornew => stateseditor}/propertymodel.h (51%) delete mode 100644 src/plugins/qmldesigner/components/stateseditornew/stateseditorimageprovider.cpp delete mode 100644 src/plugins/qmldesigner/components/stateseditornew/stateseditorimageprovider.h delete mode 100644 src/plugins/qmldesigner/components/stateseditornew/stateseditormodel.cpp delete mode 100644 src/plugins/qmldesigner/components/stateseditornew/stateseditormodel.h delete mode 100644 src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp delete mode 100644 src/plugins/qmldesigner/components/stateseditornew/stateseditorview.h delete mode 100644 src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.cpp delete mode 100644 src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.h diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 9e3d571f504..d77dfc75897 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -798,15 +798,6 @@ extend_qtc_plugin(QmlDesigner extend_qtc_plugin(QmlDesigner SOURCES_PREFIX components/stateseditor - SOURCES - stateseditorimageprovider.cpp stateseditorimageprovider.h - stateseditormodel.cpp stateseditormodel.h - stateseditorview.cpp stateseditorview.h - stateseditorwidget.cpp stateseditorwidget.h -) - -extend_qtc_plugin(QmlDesigner - SOURCES_PREFIX components/stateseditornew SOURCES propertychangesmodel.cpp propertychangesmodel.h propertymodel.cpp propertymodel.h diff --git a/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp b/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp index ee7ae3f6788..9e254244b42 100644 --- a/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp @@ -8,9 +8,8 @@ #include #include #include -#include -#include #include +#include #include #include #include @@ -23,12 +22,11 @@ #include #include #include +#include #include -#include #include #include #include -#include #include @@ -38,14 +36,6 @@ namespace QmlDesigner { -static bool useOldStatesEditor() -{ - return QmlDesignerPlugin::instance() - ->settings() - .value(DesignerSettingsKey::OLD_STATES_EDITOR) - .toBool(); -} - static Q_LOGGING_CATEGORY(viewBenchmark, "qtc.viewmanager.attach", QtWarningMsg) class ViewManagerData @@ -72,7 +62,6 @@ public: , materialBrowserView{imageCache, externalDependencies} , textureEditorView{imageCache, externalDependencies} , statesEditorView{externalDependencies} - , newStatesEditorView{externalDependencies} {} InteractiveConnectionManager connectionManager; @@ -94,7 +83,6 @@ public: MaterialBrowserView materialBrowserView; TextureEditorView textureEditorView; StatesEditorView statesEditorView; - Experimental::StatesEditorView newStatesEditorView; std::vector> additionalViews; bool disableStandardViews = false; @@ -176,30 +164,16 @@ void ViewManager::detachRewriterView() void ViewManager::switchStateEditorViewToBaseState() { - if (useOldStatesEditor()) { - if (d->statesEditorView.isAttached()) { - d->savedState = d->statesEditorView.currentState(); - d->statesEditorView.setCurrentState(d->statesEditorView.baseState()); - } - } else { - // TODO remove old statesview - if (d->newStatesEditorView.isAttached()) { - d->savedState = d->newStatesEditorView.currentState(); - d->newStatesEditorView.setCurrentState(d->newStatesEditorView.baseState()); - } + if (d->statesEditorView.isAttached()) { + d->savedState = d->statesEditorView.currentState(); + d->statesEditorView.setCurrentState(d->statesEditorView.baseState()); } } void ViewManager::switchStateEditorViewToSavedState() { - if (useOldStatesEditor()) { - if (d->savedState.isValid() && d->statesEditorView.isAttached()) - d->statesEditorView.setCurrentState(d->savedState); - } else { - // TODO remove old statesview - if (d->savedState.isValid() && d->newStatesEditorView.isAttached()) - d->newStatesEditorView.setCurrentState(d->savedState); - } + if (d->savedState.isValid() && d->statesEditorView.isAttached()) + d->statesEditorView.setCurrentState(d->savedState); } QList ViewManager::views() const @@ -223,14 +197,8 @@ QList ViewManager::standardViews() const &d->materialBrowserView, &d->textureEditorView, &d->statesEditorView, - &d->newStatesEditorView, // TODO &d->designerActionManagerView}; - if (useOldStatesEditor()) - list.removeAll(&d->newStatesEditorView); - else - list.removeAll(&d->statesEditorView); - if (QmlDesignerPlugin::instance() ->settings() .value(DesignerSettingsKey::ENABLE_DEBUGVIEW) @@ -410,10 +378,7 @@ QList ViewManager::widgetInfos() const widgetInfoList.append(d->materialEditorView.widgetInfo()); widgetInfoList.append(d->materialBrowserView.widgetInfo()); widgetInfoList.append(d->textureEditorView.widgetInfo()); - if (useOldStatesEditor()) - widgetInfoList.append(d->statesEditorView.widgetInfo()); - else - widgetInfoList.append(d->newStatesEditorView.widgetInfo()); + widgetInfoList.append(d->statesEditorView.widgetInfo()); #ifdef CHECK_LICENSE if (checkLicense() == FoundLicense::enterprise) diff --git a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp index 2c65be3e4b2..1c0071ee91b 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp @@ -63,8 +63,8 @@ void Quick2PropertyEditorView::registerQmlTypes() RichTextEditorProxy::registerDeclarativeType(); SelectionDynamicPropertiesProxyModel::registerDeclarativeType(); DynamicPropertyRow::registerDeclarativeType(); - Experimental::PropertyChangesModel::registerDeclarativeType(); - Experimental::PropertyModel::registerDeclarativeType(); + PropertyChangesModel::registerDeclarativeType(); + PropertyModel::registerDeclarativeType(); const QString resourcePath = PropertyEditorQmlBackend::propertyEditorResourcesPath(); diff --git a/src/plugins/qmldesigner/components/stateseditornew/propertychangesmodel.cpp b/src/plugins/qmldesigner/components/stateseditor/propertychangesmodel.cpp similarity index 74% rename from src/plugins/qmldesigner/components/stateseditornew/propertychangesmodel.cpp rename to src/plugins/qmldesigner/components/stateseditor/propertychangesmodel.cpp index d559aea1ca1..f0f177ed9e5 100644 --- a/src/plugins/qmldesigner/components/stateseditornew/propertychangesmodel.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/propertychangesmodel.cpp @@ -1,27 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "propertychangesmodel.h" @@ -39,7 +17,6 @@ enum { }; namespace QmlDesigner { -namespace Experimental { PropertyChangesModel::PropertyChangesModel(QObject *parent) : QAbstractListModel(parent) @@ -164,5 +141,4 @@ QVariant PropertyChangesModel::modelNodeBackend() const return QVariant(); } -} // namespace Experimental } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/propertychangesmodel.h b/src/plugins/qmldesigner/components/stateseditor/propertychangesmodel.h similarity index 55% rename from src/plugins/qmldesigner/components/stateseditornew/propertychangesmodel.h rename to src/plugins/qmldesigner/components/stateseditor/propertychangesmodel.h index b73d4dad693..6686131aff6 100644 --- a/src/plugins/qmldesigner/components/stateseditornew/propertychangesmodel.h +++ b/src/plugins/qmldesigner/components/stateseditor/propertychangesmodel.h @@ -1,27 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once @@ -31,7 +9,6 @@ #include namespace QmlDesigner { -namespace Experimental { class StatesEditorView; @@ -82,5 +59,4 @@ private: QPointer m_view; }; -} // namespace Experimental } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/propertymodel.cpp b/src/plugins/qmldesigner/components/stateseditor/propertymodel.cpp similarity index 75% rename from src/plugins/qmldesigner/components/stateseditornew/propertymodel.cpp rename to src/plugins/qmldesigner/components/stateseditor/propertymodel.cpp index 35dea7cb23a..0a72d60ef7a 100644 --- a/src/plugins/qmldesigner/components/stateseditornew/propertymodel.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/propertymodel.cpp @@ -1,27 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "propertymodel.h" @@ -44,7 +22,6 @@ enum { }; namespace QmlDesigner { -namespace Experimental { PropertyModel::PropertyModel(QObject *parent) : QAbstractListModel(parent) @@ -188,5 +165,4 @@ void PropertyModel::setupModel() m_properties = propertyChanges.targetProperties(); } -} // namespace Experimental } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/propertymodel.h b/src/plugins/qmldesigner/components/stateseditor/propertymodel.h similarity index 51% rename from src/plugins/qmldesigner/components/stateseditornew/propertymodel.h rename to src/plugins/qmldesigner/components/stateseditor/propertymodel.h index 492b1362c0e..c9d8e93c3f8 100644 --- a/src/plugins/qmldesigner/components/stateseditornew/propertymodel.h +++ b/src/plugins/qmldesigner/components/stateseditor/propertymodel.h @@ -1,27 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once @@ -31,7 +9,6 @@ #include namespace QmlDesigner { -namespace Experimental { class PropertyModel : public QAbstractListModel { @@ -74,5 +51,4 @@ private: QList m_properties; }; -} // namespace Experimental } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp index 55fcf61932a..f0a7d0bf86f 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp @@ -1,16 +1,18 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "stateseditorimageprovider.h" #include "nodeinstanceview.h" #include -namespace QmlDesigner::Internal { +namespace QmlDesigner { +namespace Internal { StatesEditorImageProvider::StatesEditorImageProvider() : QQuickImageProvider(QQuickImageProvider::Image) -{} +{ +} QImage StatesEditorImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) { @@ -25,8 +27,7 @@ QImage StatesEditorImageProvider::requestImage(const QString &id, QSize *size, c bool canBeConverted; int instanceId = imageId.toInt(&canBeConverted); if (canBeConverted && m_nodeInstanceView->hasModelNodeForInternalId(instanceId)) { - image = m_nodeInstanceView->statePreviewImage( - m_nodeInstanceView->modelNodeForInternalId(instanceId)); + image = m_nodeInstanceView->statePreviewImage(m_nodeInstanceView->modelNodeForInternalId(instanceId)); } } } @@ -52,4 +53,5 @@ void StatesEditorImageProvider::setNodeInstanceView(const NodeInstanceView *node m_nodeInstanceView = nodeInstanceView; } -} // QmlDesigner::Internal +} // namespace Internal +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.h index 0bfb0bf3302..1bd4432a956 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.h @@ -1,12 +1,12 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once #include "abstractview.h" -#include #include +#include namespace QmlDesigner { namespace Internal { diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp index 96ec3fa8e63..52036175cf2 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp @@ -1,31 +1,39 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "stateseditormodel.h" #include "stateseditorview.h" -#include - #include #include #include +#include #include #include #include #include +#include +#include + +#include #include -enum { debug = false }; +enum { + debug = false +}; namespace QmlDesigner { StatesEditorModel::StatesEditorModel(StatesEditorView *view) : QAbstractListModel(view) , m_statesEditorView(view) - , m_updateCounter(0) -{} + , m_hasExtend(false) + , m_extendedStates() +{ + QObject::connect(this, &StatesEditorModel::dataChanged, [this]() { emit baseStateChanged(); }); +} int StatesEditorModel::count() const { @@ -38,8 +46,8 @@ QModelIndex StatesEditorModel::index(int row, int column, const QModelIndex &par return {}; int internalNodeId = 0; - if (row > 0 && row < rowCount() - 1) // first and last rows are base state, add state - internalNodeId = m_statesEditorView->acitveStatesGroupNode() + if (row > 0) + internalNodeId = m_statesEditorView->activeStatesGroupNode() .nodeListProperty("states") .at(row - 1) .internalId(); @@ -52,17 +60,19 @@ int StatesEditorModel::rowCount(const QModelIndex &parent) const if (parent.isValid() || m_statesEditorView.isNull() || !m_statesEditorView->model()) return 0; - if (!m_statesEditorView->acitveStatesGroupNode().hasNodeListProperty("states")) - return 2; // base state + add new state + if (!m_statesEditorView->activeStatesGroupNode().hasNodeListProperty("states")) + return 1; // base state - return m_statesEditorView->acitveStatesGroupNode().nodeListProperty("states").count() - + 2; // 2 = base state + add new state + return m_statesEditorView->activeStatesGroupNode().nodeListProperty("states").count() + 1; } void StatesEditorModel::reset() { QAbstractListModel::beginResetModel(); QAbstractListModel::endResetModel(); + + evaluateExtend(); + emit baseStateChanged(); } QVariant StatesEditorModel::data(const QModelIndex &index, int role) const @@ -101,20 +111,34 @@ QVariant StatesEditorModel::data(const QModelIndex &index, int role) const return index.internalId(); case HasWhenCondition: - return stateNode.hasProperty("when"); + return stateNode.isValid() && stateNode.hasProperty("when"); - case WhenConditionString: - return stateNode.bindingProperty("when").expression(); + case WhenConditionString: { + if (stateNode.isValid() && stateNode.hasBindingProperty("when")) + return stateNode.bindingProperty("when").expression(); + else + return QString(); + } case IsDefault: { - return QmlModelState(stateNode).isDefault(); + QmlModelState modelState(stateNode); + if (modelState.isValid()) + return modelState.isDefault(); + return false; } case ModelHasDefaultState: return hasDefaultState(); - case StateType: - return index.row() == rowCount() - 1 ? "add" : "state"; + case HasExtend: + return stateNode.isValid() && stateNode.hasProperty("extend"); + + case ExtendString: { + if (stateNode.isValid() && stateNode.hasVariantProperty("extend")) + return stateNode.variantProperty("extend").value(); + else + return QString(); + } } return QVariant(); @@ -129,7 +153,8 @@ QHash StatesEditorModel::roleNames() const {WhenConditionString, "whenConditionString"}, {IsDefault, "isDefault"}, {ModelHasDefaultState, "modelHasDefaultState"}, - {StateType, "type"}}; + {HasExtend, "hasExtend"}, + {ExtendString, "extendString"}}; return roleNames; } @@ -155,9 +180,6 @@ void StatesEditorModel::removeState(int stateIndex) if (stateIndex >= 0) { beginRemoveRows(QModelIndex(), 0, stateIndex); endRemoveRows(); - - beginResetModel(); - endResetModel(); } } @@ -166,12 +188,13 @@ void StatesEditorModel::renameState(int internalNodeId, const QString &newName) if (newName == m_statesEditorView->currentStateName()) return; - if (newName.isEmpty() || !m_statesEditorView->validStateName(newName)) { - QTimer::singleShot(0, [newName] { + if (newName.isEmpty() ||! m_statesEditorView->validStateName(newName)) { + QTimer::singleShot(0, this, [newName] { Core::AsynchronousMessageBox::warning( - tr("Invalid State Name"), - newName.isEmpty() ? tr("The empty string as a name is reserved for the base state.") - : tr("Name already used in another state.")); + tr("Invalid state name"), + newName.isEmpty() ? + tr("The empty string as a name is reserved for the base state.") : + tr("Name already used in another state")); }); reset(); } else { @@ -198,9 +221,14 @@ QStringList StatesEditorModel::autoComplete(const QString &text, int pos, bool e return QStringList(); } -QVariant StatesEditorModel::stateModelNode() +QVariant StatesEditorModel::stateModelNode(int internalNodeId) { - return QVariant::fromValue(m_statesEditorView->currentStateNode()); + if (!m_statesEditorView->model()) + return QVariant(); + + ModelNode node = m_statesEditorView->modelNodeForInternalId(internalNodeId); + + return QVariant::fromValue(m_statesEditorView->modelNodeForInternalId(internalNodeId)); } void StatesEditorModel::setStateAsDefault(int internalNodeId) @@ -233,4 +261,178 @@ bool StatesEditorModel::hasAnnotation(int internalNodeId) const return m_statesEditorView->hasAnnotation(internalNodeId); } +QStringList StatesEditorModel::stateGroups() const +{ + if (!m_statesEditorView->isAttached()) + return {}; + + const auto groupMetaInfo = m_statesEditorView->model()->qtQuickStateGroupMetaInfo(); + + auto stateGroups = Utils::transform(m_statesEditorView->allModelNodesOfType(groupMetaInfo), + [](const ModelNode &node) { return node.displayName(); }); + stateGroups.prepend(tr("Default")); + return stateGroups; +} + +QString StatesEditorModel::activeStateGroup() const +{ + if (auto stateGroup = m_statesEditorView->activeStatesGroupNode()) + return stateGroup.displayName(); + + return {}; +} + +void StatesEditorModel::setActiveStateGroup(const QString &name) +{ + if (!m_statesEditorView->isAttached()) + return; + + const auto groupMetaInfo = m_statesEditorView->model()->qtQuickStateGroupMetaInfo(); + + auto modelNode = Utils::findOrDefault(m_statesEditorView->allModelNodesOfType(groupMetaInfo), + [&name](const ModelNode &node) { + return node.displayName() == name; + }); + + QTC_ASSERT(!modelNode.isValid(), return ); + + if (modelNode.isValid()) + m_statesEditorView->setActiveStatesGroupNode(modelNode); +} + +int StatesEditorModel::activeStateGroupIndex() const +{ + return m_statesEditorView->activeStatesGroupIndex(); +} + +void StatesEditorModel::setActiveStateGroupIndex(int index) +{ + m_statesEditorView->setActiveStatesGroupIndex(index); +} + +bool StatesEditorModel::renameActiveStateGroup(const QString &name) +{ + auto stateGroup = m_statesEditorView->activeStatesGroupNode(); + + if (!stateGroup.isValid() || stateGroup.isRootNode()) + return false; + + if (!QmlDesigner::ModelNode::isValidId(name) || m_statesEditorView->hasId(name)) { + QString errMsg = QmlDesigner::ModelNode::getIdValidityErrorMessage(name); + if (!errMsg.isEmpty()) + Core::AsynchronousMessageBox::warning(tr("Invalid ID"), errMsg); + else + Core::AsynchronousMessageBox::warning(tr("Invalid ID"), + tr("%1 already exists.").arg(name)); + return false; + } + + stateGroup.setIdWithRefactoring(name); + emit stateGroupsChanged(); + return true; +} + +void StatesEditorModel::addStateGroup(const QString &name) +{ + m_statesEditorView->executeInTransaction("createStateGroup", [this, name]() { + const TypeName typeName = "QtQuick.StateGroup"; + auto metaInfo = m_statesEditorView->model()->metaInfo(typeName); + int minorVersion = metaInfo.minorVersion(); + int majorVersion = metaInfo.majorVersion(); + auto stateGroupNode = m_statesEditorView->createModelNode(typeName, + majorVersion, + minorVersion); + stateGroupNode.setIdWithoutRefactoring(m_statesEditorView->model()->generateNewId(name)); + + m_statesEditorView->rootModelNode().defaultNodeAbstractProperty().reparentHere( + stateGroupNode); + m_statesEditorView->setActiveStatesGroupNode(stateGroupNode); + }); +} + +void StatesEditorModel::removeStateGroup() +{ + if (m_statesEditorView->activeStatesGroupNode().isRootNode()) + return; + + m_statesEditorView->executeInTransaction("removeStateGroup", [this]() { + m_statesEditorView->activeStatesGroupNode().destroy(); + }); +} + +QVariantMap StatesEditorModel::get(int idx) const +{ + const QHash &names = roleNames(); + QHash::const_iterator i = names.constBegin(); + + QVariantMap res; + QModelIndex modelIndex = index(idx); + + while (i != names.constEnd()) { + QVariant data = modelIndex.data(i.key()); + + res[QString::fromUtf8(i.value())] = data; + ++i; + } + return res; +} + +QVariantMap StatesEditorModel::baseState() const +{ + return get(0); +} + +bool StatesEditorModel::hasExtend() const +{ + return m_hasExtend; +} + +QStringList StatesEditorModel::extendedStates() const +{ + return m_extendedStates; +} + +void StatesEditorModel::move(int from, int to) +{ + // This does not alter the code (rewriter) which means the reordering is not presistent + + if (from == to) + return; + + int specialIndex = (from < to ? to + 1 : to); + beginMoveRows(QModelIndex(), from, from, QModelIndex(), specialIndex); + endMoveRows(); +} + +void StatesEditorModel::drop(int from, int to) +{ + m_statesEditorView->moveStates(from, to); +} + +void StatesEditorModel::evaluateExtend() +{ + bool hasExtend = m_statesEditorView->hasExtend(); + + if (m_hasExtend != hasExtend) { + m_hasExtend = hasExtend; + emit hasExtendChanged(); + } + + auto extendedStates = m_statesEditorView->extendedStates(); + + if (extendedStates.size() != m_extendedStates.size()) { + m_extendedStates = extendedStates; + emit extendedStatesChanged(); + return; + } + + for (int i = 0; i != m_extendedStates.size(); ++i) { + if (extendedStates[i] != m_extendedStates[i]) { + m_extendedStates = extendedStates; + emit extendedStatesChanged(); + return; + } + } +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h index 832f0cdbffd..0790ef697c2 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h @@ -1,5 +1,5 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once @@ -22,13 +22,14 @@ class StatesEditorModel : public QAbstractListModel WhenConditionString, IsDefault, ModelHasDefaultState, - StateType + HasExtend, + ExtendString }; public: StatesEditorModel(StatesEditorView *view); - int count() const; + Q_INVOKABLE int count() const; QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; @@ -41,7 +42,8 @@ public: Q_INVOKABLE void setWhenCondition(int internalNodeId, const QString &condition); Q_INVOKABLE void resetWhenCondition(int internalNodeId); Q_INVOKABLE QStringList autoComplete(const QString &text, int pos, bool explicitComplete); - Q_INVOKABLE QVariant stateModelNode(); + Q_INVOKABLE QVariant stateModelNode(int internalNodeId); + Q_INVOKABLE void setStateAsDefault(int internalNodeId); Q_INVOKABLE void resetDefaultState(); Q_INVOKABLE bool hasDefaultState() const; @@ -49,14 +51,53 @@ public: Q_INVOKABLE void removeAnnotation(int internalNodeId); Q_INVOKABLE bool hasAnnotation(int internalNodeId) const; + QStringList stateGroups() const; + QString activeStateGroup() const; + void setActiveStateGroup(const QString &name); + int activeStateGroupIndex() const; + void setActiveStateGroupIndex(int index); + + Q_INVOKABLE bool renameActiveStateGroup(const QString &name); + + Q_INVOKABLE void addStateGroup(const QString &name); + Q_INVOKABLE void removeStateGroup(); + + Q_INVOKABLE QVariantMap get(int idx) const; + + QVariantMap baseState() const; + bool hasExtend() const; + QStringList extendedStates() const; + + Q_PROPERTY(QVariantMap baseState READ baseState NOTIFY baseStateChanged) + Q_PROPERTY(QStringList extendedStates READ extendedStates NOTIFY extendedStatesChanged) + + Q_PROPERTY(bool hasExtend READ hasExtend NOTIFY hasExtendChanged) + + Q_PROPERTY(QString activeStateGroup READ activeStateGroup WRITE setActiveStateGroup NOTIFY + activeStateGroupChanged) + Q_PROPERTY(int activeStateGroupIndex READ activeStateGroupIndex WRITE setActiveStateGroupIndex + NOTIFY activeStateGroupIndexChanged) + Q_PROPERTY(QStringList stateGroups READ stateGroups NOTIFY stateGroupsChanged) + + Q_INVOKABLE void move(int from, int to); + Q_INVOKABLE void drop(int from, int to); + void reset(); + void evaluateExtend(); signals: void changedToState(int n); + void baseStateChanged(); + void hasExtendChanged(); + void extendedStatesChanged(); + void activeStateGroupChanged(); + void activeStateGroupIndexChanged(); + void stateGroupsChanged(); private: QPointer m_statesEditorView; - int m_updateCounter; + bool m_hasExtend; + QStringList m_extendedStates; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 2b64138387f..62a62506e4c 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -1,40 +1,42 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "stateseditorview.h" - +#include "propertychangesmodel.h" #include "stateseditormodel.h" #include "stateseditorwidget.h" -#include -#include -#include +#include +#include +#include +#include +#include + #include + +#include +#include +#include +#include #include + #include #include #include #include - #include #include #include -#include -#include -#include - -#include -#include - namespace QmlDesigner { /** We always have 'one' current state, where we get updates from (see sceneChanged()). In case the current state is the base state, we render the base state + all other states. */ + StatesEditorView::StatesEditorView(ExternalDependenciesInterface &externalDependencies) - : AbstractView{externalDependencies} + : AbstractView(externalDependencies) , m_statesEditorModel(new StatesEditorModel(this)) , m_lastIndex(-1) , m_editor(nullptr) @@ -56,32 +58,215 @@ WidgetInfo StatesEditorView::widgetInfo() m_statesEditorWidget = new StatesEditorWidget(this, m_statesEditorModel.data()); return createWidgetInfo(m_statesEditorWidget.data(), - QLatin1String("StatesEditor"), + "StatesEditor", WidgetInfo::BottomPane, 0, - tr("States"), - tr("States view")); + tr("States")); } -void StatesEditorView::rootNodeTypeChanged(const QString & /*type*/, - int /*majorVersion*/, - int /*minorVersion*/) +void StatesEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) { checkForStatesAvailability(); } -ModelNode StatesEditorView::acitveStatesGroupNode() const +ModelNode StatesEditorView::activeStatesGroupNode() const { return m_activeStatesGroupNode; } -void StatesEditorView::setAcitveStatesGroupNode(const ModelNode &modelNode) +void StatesEditorView::setActiveStatesGroupNode(const ModelNode &modelNode) { if (m_activeStatesGroupNode == modelNode) return; m_activeStatesGroupNode = modelNode; resetModel(); + + checkForStatesAvailability(); + + emit m_statesEditorModel->activeStateGroupChanged(); + emit m_statesEditorModel->activeStateGroupIndexChanged(); +} + +int StatesEditorView::activeStatesGroupIndex() const +{ + if (!model()) + return -1; + + return Utils::indexOf(allModelNodesOfType(model()->qtQuickStateGroupMetaInfo()), + [this](const ModelNode &node) { return node == m_activeStatesGroupNode; }) + + 1; +} + +void StatesEditorView::setActiveStatesGroupIndex(int index) +{ + if (!model()) + return; + + if (index > 0) { + const ModelNode statesGroup = allModelNodesOfType(model()->qtQuickStateGroupMetaInfo()) + .at(index - 1); + if (statesGroup.isValid()) + setActiveStatesGroupNode(statesGroup); + } else { + setActiveStatesGroupNode(rootModelNode()); + } +} + +void StatesEditorView::registerPropertyChangesModel(PropertyChangesModel *model) +{ + m_propertyChangedModels.insert(model); +} + +void StatesEditorView::deregisterPropertyChangesModel(PropertyChangesModel *model) +{ + m_propertyChangedModels.remove(model); +} + +void StatesEditorView::synchonizeCurrentStateFromWidget() +{ + if (!model()) + return; + + if (m_block) + return; + + int internalId = m_statesEditorWidget->currentStateInternalId(); + + if (internalId > 0 && hasModelNodeForInternalId(internalId)) { + ModelNode node = modelNodeForInternalId(internalId); + QmlModelState modelState(node); + if (modelState.isValid() && modelState != currentState()) + setCurrentState(modelState); + } else { + setCurrentState(baseState()); + } +} + +void StatesEditorView::createNewState() +{ + // can happen when root node is e.g. a ListModel + if (!QmlVisualNode::isValidQmlVisualNode(activeStatesGroupNode()) + && m_activeStatesGroupNode.type() != "QtQuick.StateGroup") + return; + + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATE_ADDED); + + QStringList modelStateNames = activeStateGroup().names(); + + QString newStateName; + int index = 1; + while (true) { + newStateName = QString(QStringLiteral("State%1")).arg(index++); + if (!modelStateNames.contains(newStateName)) + break; + } + + executeInTransaction("createNewState", [this, newStateName]() { + activeStatesGroupNode().validId(); + + ModelNode newState = activeStateGroup().addState(newStateName); + setCurrentState(newState); + }); +} + +void StatesEditorView::cloneState(int nodeId) +{ + if (!(nodeId > 0 && hasModelNodeForInternalId(nodeId))) + return; + + ModelNode stateNode(modelNodeForInternalId(nodeId)); + QTC_ASSERT(stateNode.simplifiedTypeName() == "State", return ); + + QmlModelState modelState(stateNode); + if (!modelState.isValid() || modelState.isBaseState()) + return; + + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATE_CLONED); + + QString newName = modelState.name(); + + // Strip out numbers at the end of the string + QRegularExpression regEx(QLatin1String("[0-9]+$")); + const QRegularExpressionMatch match = regEx.match(newName); + if (match.hasMatch() && (match.capturedStart() + match.capturedLength() == newName.length())) + newName = newName.left(match.capturedStart()); + + int i = 1; + QStringList stateNames = activeStateGroup().names(); + while (stateNames.contains(newName + QString::number(i))) + i++; + const QString newStateName = newName + QString::number(i); + + QmlModelState newState; + + executeInTransaction("cloneState", [newStateName, modelState, &newState]() { + newState = modelState.duplicate(newStateName); + }); + + ModelNode newNode = newState.modelNode(); + int from = newNode.parentProperty().indexOf(newNode); + int to = stateNode.parentProperty().indexOf(stateNode) + 1; + + // When duplicating an extended state the new state needs to be added after the extend group. + if (!modelState.hasExtend()) { + auto modelNodeList = activeStatesGroupNode().nodeListProperty("states").toModelNodeList(); + for (; to != modelNodeList.count(); ++to) { + QmlModelState currentState(modelNodeList.at(to)); + if (!currentState.isValid() || currentState.isBaseState() || !currentState.hasExtend()) + break; + } + } + + executeInTransaction("moveState", [this, &newState, from, to]() { + activeStatesGroupNode().nodeListProperty("states").slide(from, to); + setCurrentState(newState); + }); +} + +void StatesEditorView::extendState(int nodeId) +{ + if (!(nodeId > 0 && hasModelNodeForInternalId(nodeId))) + return; + + ModelNode stateNode(modelNodeForInternalId(nodeId)); + QTC_ASSERT(stateNode.simplifiedTypeName() == "State", return ); + + QmlModelState modelState(stateNode); + if (!modelState.isValid() || modelState.isBaseState()) + return; + + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATE_EXTENDED); + + QString newName = modelState.name(); + + // Strip out numbers at the end of the string + QRegularExpression regEx(QLatin1String("[0-9]+$")); + const QRegularExpressionMatch match = regEx.match(newName); + if (match.hasMatch() && (match.capturedStart() + match.capturedLength() == newName.length())) + newName = newName.left(match.capturedStart()); + + int i = 1; + QStringList stateNames = activeStateGroup().names(); + while (stateNames.contains(newName + QString::number(i))) + i++; + const QString newStateName = newName + QString::number(i); + + QmlModelState newState; + + executeInTransaction("extendState", [this, newStateName, modelState, &newState]() { + newState = activeStateGroup().addState(newStateName); + newState.setExtend(modelState.name()); + }); + + ModelNode newNode = newState.modelNode(); + int from = newNode.parentProperty().indexOf(newNode); + int to = stateNode.parentProperty().indexOf(stateNode) + 1; + + executeInTransaction("moveState", [this, &newState, from, to]() { + activeStatesGroupNode().nodeListProperty("states").slide(from, to); + setCurrentState(newState); + }); } void StatesEditorView::removeState(int nodeId) @@ -89,7 +274,7 @@ void StatesEditorView::removeState(int nodeId) try { if (nodeId > 0 && hasModelNodeForInternalId(nodeId)) { ModelNode stateNode(modelNodeForInternalId(nodeId)); - Q_ASSERT(stateNode.metaInfo().isQtQuickState()); + QTC_ASSERT(stateNode.simplifiedTypeName() == "State", return ); QmlModelState modelState(stateNode); if (modelState.isValid()) { @@ -163,63 +348,13 @@ void StatesEditorView::removeState(int nodeId) } } -void StatesEditorView::synchonizeCurrentStateFromWidget() -{ - if (!model()) - return; - - if (m_block) - return; - - int internalId = m_statesEditorWidget->currentStateInternalId(); - - if (internalId > 0 && hasModelNodeForInternalId(internalId)) { - ModelNode node = modelNodeForInternalId(internalId); - QmlModelState modelState(node); - if (modelState.isValid() && modelState != currentState()) - setCurrentState(modelState); - } else { - setCurrentState(baseState()); - } -} - -void StatesEditorView::createNewState() -{ - if (currentState().isBaseState()) - addState(); - else - duplicateCurrentState(); -} - -void StatesEditorView::addState() -{ - // can happen when root node is e.g. a ListModel - if (!QmlVisualNode::isValidQmlVisualNode(acitveStatesGroupNode()) - && m_activeStatesGroupNode.type() != "QtQuick.StateGroup") - return; - - QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATE_ADDED); - - QStringList modelStateNames = activeStateGroup().names(); - - QString newStateName; - int index = 1; - while (true) { - newStateName = QString(QStringLiteral("State%1")).arg(index++); - if (!modelStateNames.contains(newStateName)) - break; - } - - executeInTransaction("addState", [this, newStateName]() { - acitveStatesGroupNode().validId(); - - ModelNode newState = activeStateGroup().addState(newStateName); - setCurrentState(newState); - }); -} - void StatesEditorView::resetModel() { + if (m_bulkChange) { + m_modelDirty = true; + return; + } + if (m_statesEditorModel) m_statesEditorModel->reset(); @@ -229,42 +364,83 @@ void StatesEditorView::resetModel() else m_statesEditorWidget->setCurrentStateInternalId(currentState().modelNode().internalId()); } + + m_modelDirty = false; } -void StatesEditorView::duplicateCurrentState() +void StatesEditorView::resetPropertyChangesModels() { - QmlModelState state = currentState(); + if (m_bulkChange) { + m_propertyChangesDirty = true; + return; + } - Q_ASSERT(!state.isBaseState()); + std::for_each(m_propertyChangedModels.begin(), + m_propertyChangedModels.end(), + [](PropertyChangesModel *model) { model->reset(); }); - QString newName = state.name(); + m_propertyChangesDirty = false; +} - // Strip out numbers at the end of the string - QRegularExpression regEx(QLatin1String("[0-9]+$")); - const QRegularExpressionMatch match = regEx.match(newName); - if (match.hasMatch() && (match.capturedStart() + match.capturedLength() == newName.length())) - newName = newName.left(match.capturedStart()); +void StatesEditorView::resetExtend() +{ + if (m_bulkChange) { + m_extendDirty = true; + return; + } - int i = 1; - QStringList stateNames = activeStateGroup().names(); - while (stateNames.contains(newName + QString::number(i))) - i++; - const QString newStateName = newName + QString::number(i); + m_statesEditorModel->evaluateExtend(); - executeInTransaction("addState", [this, newStateName, state]() { - QmlModelState newState = state.duplicate(newStateName); - setCurrentState(newState); - }); + m_extendDirty = false; +} + +void StatesEditorView::resetStateGroups() +{ + if (m_bulkChange) { + m_stateGroupsDirty = true; + return; + } + + emit m_statesEditorModel->stateGroupsChanged(); + + m_stateGroupsDirty = false; } void StatesEditorView::checkForStatesAvailability() { if (m_statesEditorWidget) { - const bool isVisual = QmlVisualNode::isValidQmlVisualNode(acitveStatesGroupNode()); - m_statesEditorWidget->showAddNewStatesButton(isVisual); + const bool isVisual = activeStatesGroupNode().metaInfo().isBasedOn( + model()->qtQuickItemMetaInfo(), model()->qtQuick3DNodeMetaInfo()); + const bool isRoot = activeStatesGroupNode().isRootNode(); + m_statesEditorWidget->showAddNewStatesButton(isVisual || !isRoot); } } +void StatesEditorView::beginBulkChange() +{ + m_bulkChange = true; +} + +void StatesEditorView::endBulkChange() +{ + if (!m_bulkChange) + return; + + m_bulkChange = false; + + if (m_modelDirty) + resetModel(); + + if (m_propertyChangesDirty) + resetPropertyChangesModels(); + + if (m_extendDirty) + resetExtend(); + + if (m_stateGroupsDirty) + resetStateGroups(); +} + void StatesEditorView::setCurrentState(const QmlModelState &state) { if (!model() && !state.isValid()) @@ -281,7 +457,7 @@ QmlModelState StatesEditorView::baseState() const QmlModelStateGroup StatesEditorView::activeStateGroup() const { - return QmlModelStateGroup(acitveStatesGroupNode()); + return QmlModelStateGroup(activeStatesGroupNode()); } bool StatesEditorView::validStateName(const QString &name) const @@ -296,6 +472,35 @@ bool StatesEditorView::validStateName(const QString &name) const return true; } +bool StatesEditorView::hasExtend() const +{ + if (!model()) + return false; + + const QList modelStates = activeStateGroup().allStates(); + for (const QmlModelState &state : modelStates) { + if (state.hasExtend()) + return true; + } + return false; +} + +QStringList StatesEditorView::extendedStates() const +{ + if (!model()) + return QStringList(); + + QStringList states; + + const QList modelStates = activeStateGroup().allStates(); + for (const QmlModelState &state : modelStates) { + if (state.hasExtend()) + states.append(state.extend()); + } + states.removeDuplicates(); + return states; +} + QString StatesEditorView::currentStateName() const { return currentState().isValid() ? currentState().name() : QString(); @@ -304,20 +509,33 @@ QString StatesEditorView::currentStateName() const void StatesEditorView::renameState(int internalNodeId, const QString &newName) { if (hasModelNodeForInternalId(internalNodeId)) { - QmlModelState state(modelNodeForInternalId(internalNodeId)); + QmlModelState renamedState(modelNodeForInternalId(internalNodeId)); try { - if (state.isValid() && state.name() != newName) { - // Jump to base state for the change - QmlModelState oldState = currentState(); - setCurrentState(baseState()); - const bool updateDefault = state.isDefault(); + if (renamedState.isValid() && renamedState.name() != newName) { + executeInTransaction("renameState", [this, &renamedState, &newName]() { + // Jump to base state for the change + QmlModelState oldState = currentState(); + setCurrentState(baseState()); + const bool updateDefault = renamedState.isDefault(); - state.setName(newName.trimmed()); + // If state is extended rename all references + QList states; + const QList modelStates = activeStateGroup().allStates(); + for (const QmlModelState &state : modelStates) { + if (state.hasExtend() && state.extend() == renamedState.name()) + states.append(state); + } - if (updateDefault) - state.setAsDefault(); + renamedState.setName(newName.trimmed()); - setCurrentState(oldState); + for (QmlModelState &state : states) + state.setExtend(newName.trimmed()); + + if (updateDefault) + renamedState.setAsDefault(); + + setCurrentState(oldState); + }); } } catch (const RewritingException &e) { e.showException(); @@ -356,7 +574,9 @@ void StatesEditorView::resetWhenCondition(int internalNodeId) if (hasModelNodeForInternalId(internalNodeId)) { QmlModelState state(modelNodeForInternalId(internalNodeId)); try { - state.modelNode().removeProperty("when"); + if (state.isValid() && state.modelNode().hasProperty("when")) + state.modelNode().removeProperty("when"); + } catch (const RewritingException &e) { e.showException(); } @@ -392,8 +612,8 @@ void StatesEditorView::resetDefaultState() auto guard = qScopeGuard([&]() { m_block = false; }); try { - if (acitveStatesGroupNode().hasProperty("state")) - acitveStatesGroupNode().removeProperty("state"); + if (activeStatesGroupNode().hasProperty("state")) + activeStatesGroupNode().removeProperty("state"); } catch (const RewritingException &e) { e.showException(); @@ -402,7 +622,7 @@ void StatesEditorView::resetDefaultState() bool StatesEditorView::hasDefaultState() const { - return acitveStatesGroupNode().hasProperty("state"); + return activeStatesGroupNode().hasProperty("state"); } void StatesEditorView::setAnnotation(int internalNodeId) @@ -417,7 +637,9 @@ void StatesEditorView::setAnnotation(int internalNodeId) QmlModelState state(modelNodeForInternalId(internalNodeId)); try { if (state.isValid()) { - if (ModelNode modelNode = state.modelNode()) { + ModelNode modelNode = state.modelNode(); + + if (modelNode.isValid()) { if (!m_editor) m_editor = new AnnotationEditor(this); @@ -443,9 +665,8 @@ void StatesEditorView::removeAnnotation(int internalNodeId) if (hasModelNodeForInternalId(internalNodeId)) { QmlModelState state(modelNodeForInternalId(internalNodeId)); try { - if (state.isValid()) { + if (state.isValid()) state.removeAnnotation(); - } } catch (const RewritingException &e) { e.showException(); @@ -455,11 +676,13 @@ void StatesEditorView::removeAnnotation(int internalNodeId) bool StatesEditorView::hasAnnotation(int internalNodeId) const { + if (!model()) + return false; + if (hasModelNodeForInternalId(internalNodeId)) { QmlModelState state(modelNodeForInternalId(internalNodeId)); - if (state.isValid()) { + if (state.isValid()) return state.hasAnnotation(); - } } return false; @@ -470,7 +693,7 @@ void StatesEditorView::modelAttached(Model *model) if (model == AbstractView::model()) return; - Q_ASSERT(model); + QTC_ASSERT(model, return ); AbstractView::modelAttached(model); m_activeStatesGroupNode = rootModelNode(); @@ -481,6 +704,10 @@ void StatesEditorView::modelAttached(Model *model) checkForStatesAvailability(); resetModel(); + resetStateGroups(); + + emit m_statesEditorModel->activeStateGroupChanged(); + emit m_statesEditorModel->activeStateGroupIndexChanged(); } void StatesEditorView::modelAboutToBeDetached(Model *model) @@ -492,12 +719,17 @@ void StatesEditorView::modelAboutToBeDetached(Model *model) void StatesEditorView::propertiesRemoved(const QList &propertyList) { for (const AbstractProperty &property : propertyList) { - if (property.name() == "states" - && property.parentModelNode() == activeStateGroup().modelNode()) + if (property.name() == "states" && property.parentModelNode() == activeStateGroup().modelNode()) resetModel(); - if (property.name() == "when" + if ((property.name() == "when" || property.name() == "name") && QmlModelState::isValidQmlModelState(property.parentModelNode())) resetModel(); + if (property.name() == "extend") + resetExtend(); + if (property.parentModelNode().simplifiedTypeName() == "PropertyChanges" + || (property.name() == "changes" + && property.parentModelNode().simplifiedTypeName() == "State")) + resetPropertyChangesModels(); } } @@ -511,16 +743,38 @@ void StatesEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) } if (currentState().isValid() && removedNode == currentState()) setCurrentState(baseState()); + + if (removedNode.simplifiedTypeName() == "PropertyChanges") + m_propertyChangesRemoved = true; + + if (removedNode.simplifiedTypeName() == "StateGroup") { + if (removedNode == activeStatesGroupNode()) + setActiveStatesGroupNode(rootModelNode()); + + m_stateGroupRemoved = true; + } } void StatesEditorView::nodeRemoved(const ModelNode & /*removedNode*/, const NodeAbstractProperty &parentProperty, PropertyChangeFlags /*propertyChange*/) { - if (parentProperty.isValid() && parentProperty.parentModelNode() == activeStateGroup().modelNode() + if (parentProperty.isValid() + && parentProperty.parentModelNode() == activeStateGroup().modelNode() && parentProperty.name() == "states") { m_statesEditorModel->removeState(m_lastIndex); m_lastIndex = -1; + resetModel(); + } + + if (m_propertyChangesRemoved) { + m_propertyChangesRemoved = false; + resetPropertyChangesModels(); + } + + if (m_stateGroupRemoved) { + m_stateGroupRemoved = false; + resetStateGroups(); } } @@ -533,6 +787,9 @@ void StatesEditorView::nodeAboutToBeReparented(const ModelNode &node, && oldPropertyParent.parentModelNode() == activeStateGroup().modelNode() && oldPropertyParent.name() == "states") m_lastIndex = oldPropertyParent.indexOf(node); + + if (node.simplifiedTypeName() == "StateGroup") + resetStateGroups(); } void StatesEditorView::nodeReparented(const ModelNode &node, @@ -542,10 +799,11 @@ void StatesEditorView::nodeReparented(const ModelNode &node, { if (oldPropertyParent.isValid() && oldPropertyParent.parentModelNode() == activeStateGroup().modelNode() - && oldPropertyParent.name() == "states") + && oldPropertyParent.name() == "states") { m_statesEditorModel->removeState(m_lastIndex); - - m_lastIndex = -1; + resetModel(); + m_lastIndex = -1; + } if (newPropertyParent.isValid() && newPropertyParent.parentModelNode() == activeStateGroup().modelNode() @@ -553,23 +811,31 @@ void StatesEditorView::nodeReparented(const ModelNode &node, int index = newPropertyParent.indexOf(node); m_statesEditorModel->insertState(index); } + + if (node.simplifiedTypeName() == "PropertyChanges") + resetPropertyChangesModels(); } void StatesEditorView::nodeOrderChanged(const NodeListProperty &listProperty) { + if (m_block) + return; + if (listProperty.isValid() && listProperty.parentModelNode() == activeStateGroup().modelNode() && listProperty.name() == "states") resetModel(); } -void StatesEditorView::bindingPropertiesChanged( - const QList &propertyList, - [[maybe_unused]] AbstractView::PropertyChangeFlags propertyChange) +void StatesEditorView::bindingPropertiesChanged(const QList &propertyList, AbstractView::PropertyChangeFlags propertyChange) { + Q_UNUSED(propertyChange) + for (const BindingProperty &property : propertyList) { if (property.name() == "when" && QmlModelState::isValidQmlModelState(property.parentModelNode())) resetModel(); + if (property.parentModelNode().simplifiedTypeName() == "PropertyChanges") + resetPropertyChangesModels(); } } @@ -589,9 +855,36 @@ void StatesEditorView::variantPropertiesChanged(const QList &pr else if (property.name() == "state" && property.parentModelNode() == activeStateGroup().modelNode()) resetModel(); + else if (property.name() == "extend") + resetExtend(); + + if (property.parentModelNode().simplifiedTypeName() == "PropertyChanges") + resetPropertyChangesModels(); } } +void StatesEditorView::customNotification(const AbstractView * /*view*/, + const QString &identifier, + const QList & /*nodeList*/, + const QList & /*data*/) +{ + if (identifier == StartRewriterAmend) + beginBulkChange(); + + if (identifier == EndRewriterAmend) + endBulkChange(); +} + +void StatesEditorView::rewriterBeginTransaction() +{ + beginBulkChange(); +} + +void StatesEditorView::rewriterEndTransaction() +{ + endBulkChange(); +} + void StatesEditorView::currentStateChanged(const ModelNode &node) { QmlModelState newQmlModelState(node); @@ -626,4 +919,20 @@ void StatesEditorView::instancesPreviewImageChanged(const QVector &no m_statesEditorModel->updateState(minimumIndex, maximumIndex); } +void StatesEditorView::moveStates(int from, int to) +{ + if (m_block) + return; + + m_block = true; + auto guard = qScopeGuard([&]() { m_block = false; }); + + if (!activeStatesGroupNode().hasNodeListProperty("states")) + return; + + executeInTransaction("moveState", [this, from, to]() { + activeStatesGroupNode().nodeListProperty("states").slide(from - 1, to - 1); + }); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h index 52329b940d8..502e5d2ac6f 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h @@ -1,5 +1,5 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once @@ -7,14 +7,17 @@ #include +#include + namespace QmlDesigner { +class AnnotationEditor; + class StatesEditorModel; class StatesEditorWidget; -class AnnotationEditor; +class PropertyChangesModel; -class StatesEditorView : public AbstractView -{ +class StatesEditorView : public AbstractView { Q_OBJECT public: @@ -31,11 +34,15 @@ public: void removeAnnotation(int internalNodeId); bool hasAnnotation(int internalNodeId) const; bool validStateName(const QString &name) const; + bool hasExtend() const; + QStringList extendedStates() const; QString currentStateName() const; void setCurrentState(const QmlModelState &state); QmlModelState baseState() const; QmlModelStateGroup activeStateGroup() const; + void moveStates(int from, int to); + // AbstractView void modelAttached(Model *model) override; void modelAboutToBeDetached(Model *model) override; @@ -58,6 +65,13 @@ public: void variantPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) override; + void customNotification(const AbstractView *view, + const QString &identifier, + const QList &nodeList, + const QList &data) override; + void rewriterBeginTransaction() override; + void rewriterEndTransaction() override; + // AbstractView void currentStateChanged(const ModelNode &node) override; @@ -67,21 +81,33 @@ public: void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override; - ModelNode acitveStatesGroupNode() const; - void setAcitveStatesGroupNode(const ModelNode &modelNode); + ModelNode activeStatesGroupNode() const; + void setActiveStatesGroupNode(const ModelNode &modelNode); + + int activeStatesGroupIndex() const; + void setActiveStatesGroupIndex(int index); + + void registerPropertyChangesModel(PropertyChangesModel *model); + void deregisterPropertyChangesModel(PropertyChangesModel *model); public slots: void synchonizeCurrentStateFromWidget(); void createNewState(); + void cloneState(int nodeId); + void extendState(int nodeId); void removeState(int nodeId); private: - StatesEditorWidget *statesEditorWidget() const; void resetModel(); - void addState(); - void duplicateCurrentState(); + void resetPropertyChangesModels(); + void resetExtend(); + void resetStateGroups(); + void checkForStatesAvailability(); + void beginBulkChange(); + void endBulkChange(); + private: QPointer m_statesEditorModel; QPointer m_statesEditorWidget; @@ -89,6 +115,18 @@ private: bool m_block = false; QPointer m_editor; ModelNode m_activeStatesGroupNode; + + bool m_propertyChangesRemoved = false; + bool m_stateGroupRemoved = false; + + bool m_bulkChange = false; + + bool m_modelDirty = false; + bool m_extendDirty = false; + bool m_propertyChangesDirty = false; + bool m_stateGroupsDirty = false; + + QSet m_propertyChangedModels; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp index 0501747d983..d5685233f5c 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp @@ -1,10 +1,10 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "stateseditorwidget.h" -#include "stateseditorimageprovider.h" #include "stateseditormodel.h" #include "stateseditorview.h" +#include "stateseditorimageprovider.h" #include #include @@ -13,10 +13,9 @@ #include -#include #include +#include -#include #include #include @@ -31,14 +30,16 @@ #include #include -enum { debug = false }; +enum { + debug = false +}; namespace QmlDesigner { static QString propertyEditorResourcesPath() { #ifdef SHARE_QML_PATH - if (Utils::qtcEnvironmentVariableIsSet("LOAD_QML_FROM_SOURCE")) + if (qEnvironmentVariableIsSet("LOAD_QML_FROM_SOURCE")) return QLatin1String(SHARE_QML_PATH) + "/propertyEditorQmlSources"; #endif return Core::ICore::resourcePath("qmldesigner/propertyEditorQmlSources").toString(); @@ -80,10 +81,12 @@ StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, engine()->addImageProvider(QStringLiteral("qmldesigner_stateseditor"), m_imageProvider); engine()->addImportPath(qmlSourcesPath()); engine()->addImportPath(propertyEditorResourcesPath() + "/imports"); + engine()->addImportPath(qmlSourcesPath() + "/imports"); - m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F4), this); + m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F10), this); connect(m_qmlSourceUpdateShortcut, &QShortcut::activated, this, &StatesEditorWidget::reloadQmlSource); + setObjectName(Constants::OBJECT_NAME_STATES_EDITOR); setResizeMode(QQuickWidget::SizeRootObjectToView); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -95,6 +98,8 @@ StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, Theme::setupTheme(engine()); setWindowTitle(tr("States", "Title of Editor widget")); + setMinimumWidth(195); + setMinimumHeight(195); // init the first load of the QML UI elements reloadQmlSource(); @@ -105,36 +110,36 @@ StatesEditorWidget::~StatesEditorWidget() = default; QString StatesEditorWidget::qmlSourcesPath() { #ifdef SHARE_QML_PATH - if (Utils::qtcEnvironmentVariableIsSet("LOAD_QML_FROM_SOURCE")) - return QLatin1String(SHARE_QML_PATH) + "/statesEditorQmlSources"; + if (qEnvironmentVariableIsSet("LOAD_QML_FROM_SOURCE")) + return QLatin1String(SHARE_QML_PATH) + "/stateseditor"; #endif - return Core::ICore::resourcePath("qmldesigner/statesEditorQmlSources").toString(); + return Core::ICore::resourcePath("qmldesigner/stateseditor").toString(); } void StatesEditorWidget::showEvent(QShowEvent *event) { - StudioQuickWidget::showEvent(event); + QQuickWidget::showEvent(event); update(); + QMetaObject::invokeMethod(rootObject(), "showEvent"); } void StatesEditorWidget::focusOutEvent(QFocusEvent *focusEvent) { QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_STATESEDITOR_TIME, m_usageTimer.elapsed()); - StudioQuickWidget::focusOutEvent(focusEvent); + QQuickWidget::focusOutEvent(focusEvent); } void StatesEditorWidget::focusInEvent(QFocusEvent *focusEvent) { m_usageTimer.restart(); - StudioQuickWidget::focusInEvent(focusEvent); + QQuickWidget::focusInEvent(focusEvent); } void StatesEditorWidget::reloadQmlSource() { - QString statesListQmlFilePath = qmlSourcesPath() + QStringLiteral("/StatesList.qml"); - QTC_ASSERT(QFileInfo::exists(statesListQmlFilePath), return); - engine()->clearComponentCache(); + QString statesListQmlFilePath = qmlSourcesPath() + QStringLiteral("/Main.qml"); + QTC_ASSERT(QFileInfo::exists(statesListQmlFilePath), return ); setSource(QUrl::fromLocalFile(statesListQmlFilePath)); if (!rootObject()) { @@ -152,8 +157,19 @@ void StatesEditorWidget::reloadQmlSource() SIGNAL(currentStateInternalIdChanged()), m_statesEditorView.data(), SLOT(synchonizeCurrentStateFromWidget())); - connect(rootObject(), SIGNAL(createNewState()), m_statesEditorView.data(), SLOT(createNewState())); - connect(rootObject(), SIGNAL(deleteState(int)), m_statesEditorView.data(), SLOT(removeState(int))); + connect(rootObject(), + SIGNAL(createNewState()), + m_statesEditorView.data(), + SLOT(createNewState())); + connect(rootObject(), SIGNAL(cloneState(int)), m_statesEditorView.data(), SLOT(cloneState(int))); + connect(rootObject(), + SIGNAL(extendState(int)), + m_statesEditorView.data(), + SLOT(extendState(int))); + connect(rootObject(), + SIGNAL(deleteState(int)), + m_statesEditorView.data(), + SLOT(removeState(int))); m_statesEditorView.data()->synchonizeCurrentStateFromWidget(); } diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h index fb83872a131..061ddb8970c 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h @@ -1,13 +1,12 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once -#include - #include #include #include +#include QT_BEGIN_NAMESPACE class QShortcut; @@ -15,15 +14,14 @@ QT_END_NAMESPACE namespace QmlDesigner { -class StatesEditorModel; -class StatesEditorView; class NodeInstanceView; -namespace Internal { -class StatesEditorImageProvider; -} +class StatesEditorModel; +class StatesEditorView; -class StatesEditorWidget : public StudioQuickWidget +namespace Internal { class StatesEditorImageProvider; } + +class StatesEditorWidget : public QQuickWidget { Q_OBJECT diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditorimageprovider.cpp b/src/plugins/qmldesigner/components/stateseditornew/stateseditorimageprovider.cpp deleted file mode 100644 index d2d9ebdf4ce..00000000000 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditorimageprovider.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "stateseditorimageprovider.h" -#include "nodeinstanceview.h" - -#include - -namespace QmlDesigner { -namespace Experimental { -namespace Internal { - -StatesEditorImageProvider::StatesEditorImageProvider() - : QQuickImageProvider(QQuickImageProvider::Image) -{ -} - -QImage StatesEditorImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) -{ - QImage image; - - bool nodeInstanceViewIsDetached = m_nodeInstanceView.isNull() || !m_nodeInstanceView->model(); - if (!nodeInstanceViewIsDetached) { - QString imageId = id.split(QLatin1Char('-')).constFirst(); - if (imageId == QLatin1String("baseState")) { - image = m_nodeInstanceView->statePreviewImage(m_nodeInstanceView->rootModelNode()); - } else { - bool canBeConverted; - int instanceId = imageId.toInt(&canBeConverted); - if (canBeConverted && m_nodeInstanceView->hasModelNodeForInternalId(instanceId)) { - image = m_nodeInstanceView->statePreviewImage(m_nodeInstanceView->modelNodeForInternalId(instanceId)); - } - } - } - - if (image.isNull()) { - //creating white QImage - QSize newSize = requestedSize; - if (newSize.isEmpty()) - newSize = QSize (100, 100); - - QImage image(newSize, QImage::Format_ARGB32); - image.fill(0xFFFFFFFF); - return image; - } - - *size = image.size(); - - return image; -} - -void StatesEditorImageProvider::setNodeInstanceView(const NodeInstanceView *nodeInstanceView) -{ - m_nodeInstanceView = nodeInstanceView; -} - -} // namespace Internal -} // namespace Experimental -} // namespace QmlDesigner - diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditorimageprovider.h b/src/plugins/qmldesigner/components/stateseditornew/stateseditorimageprovider.h deleted file mode 100644 index c89e9ea723e..00000000000 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditorimageprovider.h +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include"abstractview.h" - -#include -#include - -namespace QmlDesigner { -namespace Experimental { -namespace Internal { - -class StatesEditorView; - -class StatesEditorImageProvider : public QQuickImageProvider -{ -public: - StatesEditorImageProvider(); - - QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override; - - void setNodeInstanceView(const NodeInstanceView *nodeInstanceView); - -private: - QPointer m_nodeInstanceView; -}; - -} // namespace Internal -} // namespace Experimental -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditormodel.cpp b/src/plugins/qmldesigner/components/stateseditornew/stateseditormodel.cpp deleted file mode 100644 index 398bdfb6f60..00000000000 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditormodel.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "stateseditormodel.h" -#include "stateseditorview.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include - -enum { - debug = false -}; - -namespace QmlDesigner { -namespace Experimental { - -StatesEditorModel::StatesEditorModel(StatesEditorView *view) - : QAbstractListModel(view) - , m_statesEditorView(view) - , m_hasExtend(false) - , m_extendedStates() -{ - QObject::connect(this, &StatesEditorModel::dataChanged, [this]() { emit baseStateChanged(); }); -} - -int StatesEditorModel::count() const -{ - return rowCount(); -} - -QModelIndex StatesEditorModel::index(int row, int column, const QModelIndex &parent) const -{ - if (m_statesEditorView.isNull()) - return {}; - - int internalNodeId = 0; - if (row > 0) - internalNodeId = m_statesEditorView->activeStatesGroupNode() - .nodeListProperty("states") - .at(row - 1) - .internalId(); - - return hasIndex(row, column, parent) ? createIndex(row, column, internalNodeId) : QModelIndex(); -} - -int StatesEditorModel::rowCount(const QModelIndex &parent) const -{ - if (parent.isValid() || m_statesEditorView.isNull() || !m_statesEditorView->model()) - return 0; - - if (!m_statesEditorView->activeStatesGroupNode().hasNodeListProperty("states")) - return 1; // base state - - return m_statesEditorView->activeStatesGroupNode().nodeListProperty("states").count() + 1; -} - -void StatesEditorModel::reset() -{ - QAbstractListModel::beginResetModel(); - QAbstractListModel::endResetModel(); - - evaluateExtend(); - emit baseStateChanged(); -} - -QVariant StatesEditorModel::data(const QModelIndex &index, int role) const -{ - if (index.parent().isValid() || index.column() != 0 || m_statesEditorView.isNull() - || !m_statesEditorView->hasModelNodeForInternalId(index.internalId())) - return QVariant(); - - ModelNode stateNode; - - if (index.internalId() > 0) - stateNode = m_statesEditorView->modelNodeForInternalId(index.internalId()); - - switch (role) { - case StateNameRole: { - if (index.row() == 0) { - return tr("base state", "Implicit default state"); - } else { - if (stateNode.hasVariantProperty("name")) - return stateNode.variantProperty("name").value(); - else - return QVariant(); - } - } - - case StateImageSourceRole: { - static int randomNumber = 0; - randomNumber++; - if (index.row() == 0) - return QString("image://qmldesigner_stateseditor/baseState-%1").arg(randomNumber); - else - return QString("image://qmldesigner_stateseditor/%1-%2").arg(index.internalId()).arg(randomNumber); - } - - case InternalNodeId: - return index.internalId(); - - case HasWhenCondition: - return stateNode.isValid() && stateNode.hasProperty("when"); - - case WhenConditionString: { - if (stateNode.isValid() && stateNode.hasBindingProperty("when")) - return stateNode.bindingProperty("when").expression(); - else - return QString(); - } - - case IsDefault: { - QmlModelState modelState(stateNode); - if (modelState.isValid()) - return modelState.isDefault(); - return false; - } - - case ModelHasDefaultState: - return hasDefaultState(); - - case HasExtend: - return stateNode.isValid() && stateNode.hasProperty("extend"); - - case ExtendString: { - if (stateNode.isValid() && stateNode.hasVariantProperty("extend")) - return stateNode.variantProperty("extend").value(); - else - return QString(); - } - } - - return QVariant(); -} - -QHash StatesEditorModel::roleNames() const -{ - static QHash roleNames{{StateNameRole, "stateName"}, - {StateImageSourceRole, "stateImageSource"}, - {InternalNodeId, "internalNodeId"}, - {HasWhenCondition, "hasWhenCondition"}, - {WhenConditionString, "whenConditionString"}, - {IsDefault, "isDefault"}, - {ModelHasDefaultState, "modelHasDefaultState"}, - {HasExtend, "hasExtend"}, - {ExtendString, "extendString"}}; - return roleNames; -} - -void StatesEditorModel::insertState(int stateIndex) -{ - if (stateIndex >= 0) { - const int updateIndex = stateIndex + 1; - beginInsertRows(QModelIndex(), updateIndex, updateIndex); - endInsertRows(); - - emit dataChanged(index(updateIndex, 0), index(updateIndex, 0)); - } -} - -void StatesEditorModel::updateState(int beginIndex, int endIndex) -{ - if (beginIndex >= 0 && endIndex >= 0) - emit dataChanged(index(beginIndex, 0), index(endIndex, 0)); -} - -void StatesEditorModel::removeState(int stateIndex) -{ - if (stateIndex >= 0) { - beginRemoveRows(QModelIndex(), 0, stateIndex); - endRemoveRows(); - } -} - -void StatesEditorModel::renameState(int internalNodeId, const QString &newName) -{ - if (newName == m_statesEditorView->currentStateName()) - return; - - if (newName.isEmpty() ||! m_statesEditorView->validStateName(newName)) { - QTimer::singleShot(0, this, [newName] { - Core::AsynchronousMessageBox::warning( - tr("Invalid state name"), - newName.isEmpty() ? - tr("The empty string as a name is reserved for the base state.") : - tr("Name already used in another state")); - }); - reset(); - } else { - m_statesEditorView->renameState(internalNodeId, newName); - } -} - -void StatesEditorModel::setWhenCondition(int internalNodeId, const QString &condition) -{ - m_statesEditorView->setWhenCondition(internalNodeId, condition); -} - -void StatesEditorModel::resetWhenCondition(int internalNodeId) -{ - m_statesEditorView->resetWhenCondition(internalNodeId); -} - -QStringList StatesEditorModel::autoComplete(const QString &text, int pos, bool explicitComplete) -{ - Model *model = m_statesEditorView->model(); - if (model && model->rewriterView()) - return model->rewriterView()->autoComplete(text, pos, explicitComplete); - - return QStringList(); -} - -QVariant StatesEditorModel::stateModelNode(int internalNodeId) -{ - if (!m_statesEditorView->model()) - return QVariant(); - - ModelNode node = m_statesEditorView->modelNodeForInternalId(internalNodeId); - - return QVariant::fromValue(m_statesEditorView->modelNodeForInternalId(internalNodeId)); -} - -void StatesEditorModel::setStateAsDefault(int internalNodeId) -{ - m_statesEditorView->setStateAsDefault(internalNodeId); -} - -void StatesEditorModel::resetDefaultState() -{ - m_statesEditorView->resetDefaultState(); -} - -bool StatesEditorModel::hasDefaultState() const -{ - return m_statesEditorView->hasDefaultState(); -} - -void StatesEditorModel::setAnnotation(int internalNodeId) -{ - m_statesEditorView->setAnnotation(internalNodeId); -} - -void StatesEditorModel::removeAnnotation(int internalNodeId) -{ - m_statesEditorView->removeAnnotation(internalNodeId); -} - -bool StatesEditorModel::hasAnnotation(int internalNodeId) const -{ - return m_statesEditorView->hasAnnotation(internalNodeId); -} - -QStringList StatesEditorModel::stateGroups() const -{ - if (!m_statesEditorView->isAttached()) - return {}; - - const auto groupMetaInfo = m_statesEditorView->model()->qtQuickStateGroupMetaInfo(); - - auto stateGroups = Utils::transform(m_statesEditorView->allModelNodesOfType(groupMetaInfo), - [](const ModelNode &node) { return node.displayName(); }); - stateGroups.prepend(tr("Default")); - return stateGroups; -} - -QString StatesEditorModel::activeStateGroup() const -{ - if (auto stateGroup = m_statesEditorView->activeStatesGroupNode()) - return stateGroup.displayName(); - - return {}; -} - -void StatesEditorModel::setActiveStateGroup(const QString &name) -{ - if (!m_statesEditorView->isAttached()) - return; - - const auto groupMetaInfo = m_statesEditorView->model()->qtQuickStateGroupMetaInfo(); - - auto modelNode = Utils::findOrDefault(m_statesEditorView->allModelNodesOfType(groupMetaInfo), - [&name](const ModelNode &node) { - return node.displayName() == name; - }); - - QTC_ASSERT(!modelNode.isValid(), return ); - - if (modelNode.isValid()) - m_statesEditorView->setActiveStatesGroupNode(modelNode); -} - -int StatesEditorModel::activeStateGroupIndex() const -{ - return m_statesEditorView->activeStatesGroupIndex(); -} - -void StatesEditorModel::setActiveStateGroupIndex(int index) -{ - m_statesEditorView->setActiveStatesGroupIndex(index); -} - -bool StatesEditorModel::renameActiveStateGroup(const QString &name) -{ - auto stateGroup = m_statesEditorView->activeStatesGroupNode(); - - if (!stateGroup.isValid() || stateGroup.isRootNode()) - return false; - - if (!QmlDesigner::ModelNode::isValidId(name) || m_statesEditorView->hasId(name)) { - QString errMsg = QmlDesigner::ModelNode::getIdValidityErrorMessage(name); - if (!errMsg.isEmpty()) - Core::AsynchronousMessageBox::warning(tr("Invalid ID"), errMsg); - else - Core::AsynchronousMessageBox::warning(tr("Invalid ID"), - tr("%1 already exists.").arg(name)); - return false; - } - - stateGroup.setIdWithRefactoring(name); - emit stateGroupsChanged(); - return true; -} - -void StatesEditorModel::addStateGroup(const QString &name) -{ - m_statesEditorView->executeInTransaction("createStateGroup", [this, name]() { - const TypeName typeName = "QtQuick.StateGroup"; - auto metaInfo = m_statesEditorView->model()->metaInfo(typeName); - int minorVersion = metaInfo.minorVersion(); - int majorVersion = metaInfo.majorVersion(); - auto stateGroupNode = m_statesEditorView->createModelNode(typeName, - majorVersion, - minorVersion); - stateGroupNode.setIdWithoutRefactoring(m_statesEditorView->model()->generateNewId(name)); - - m_statesEditorView->rootModelNode().defaultNodeAbstractProperty().reparentHere( - stateGroupNode); - m_statesEditorView->setActiveStatesGroupNode(stateGroupNode); - }); -} - -void StatesEditorModel::removeStateGroup() -{ - if (m_statesEditorView->activeStatesGroupNode().isRootNode()) - return; - - m_statesEditorView->executeInTransaction("removeStateGroup", [this]() { - m_statesEditorView->activeStatesGroupNode().destroy(); - }); -} - -QVariantMap StatesEditorModel::get(int idx) const -{ - const QHash &names = roleNames(); - QHash::const_iterator i = names.constBegin(); - - QVariantMap res; - QModelIndex modelIndex = index(idx); - - while (i != names.constEnd()) { - QVariant data = modelIndex.data(i.key()); - - res[QString::fromUtf8(i.value())] = data; - ++i; - } - return res; -} - -QVariantMap StatesEditorModel::baseState() const -{ - return get(0); -} - -bool StatesEditorModel::hasExtend() const -{ - return m_hasExtend; -} - -QStringList StatesEditorModel::extendedStates() const -{ - return m_extendedStates; -} - -void StatesEditorModel::move(int from, int to) -{ - // This does not alter the code (rewriter) which means the reordering is not presistent - - if (from == to) - return; - - int specialIndex = (from < to ? to + 1 : to); - beginMoveRows(QModelIndex(), from, from, QModelIndex(), specialIndex); - endMoveRows(); -} - -void StatesEditorModel::drop(int from, int to) -{ - m_statesEditorView->moveStates(from, to); -} - -void StatesEditorModel::evaluateExtend() -{ - bool hasExtend = m_statesEditorView->hasExtend(); - - if (m_hasExtend != hasExtend) { - m_hasExtend = hasExtend; - emit hasExtendChanged(); - } - - auto extendedStates = m_statesEditorView->extendedStates(); - - if (extendedStates.size() != m_extendedStates.size()) { - m_extendedStates = extendedStates; - emit extendedStatesChanged(); - return; - } - - for (int i = 0; i != m_extendedStates.size(); ++i) { - if (extendedStates[i] != m_extendedStates[i]) { - m_extendedStates = extendedStates; - emit extendedStatesChanged(); - return; - } - } -} - -} // namespace Experimental -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditormodel.h b/src/plugins/qmldesigner/components/stateseditornew/stateseditormodel.h deleted file mode 100644 index c1f12878387..00000000000 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditormodel.h +++ /dev/null @@ -1,127 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include -#include - -namespace QmlDesigner { -namespace Experimental { - -class StatesEditorView; - -class StatesEditorModel : public QAbstractListModel -{ - Q_OBJECT - - enum { - StateNameRole = Qt::DisplayRole, - StateImageSourceRole = Qt::UserRole, - InternalNodeId, - HasWhenCondition, - WhenConditionString, - IsDefault, - ModelHasDefaultState, - HasExtend, - ExtendString - }; - -public: - StatesEditorModel(StatesEditorView *view); - - Q_INVOKABLE int count() const; - QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - QHash roleNames() const override; - - void insertState(int stateIndex); - void removeState(int stateIndex); - void updateState(int beginIndex, int endIndex); - Q_INVOKABLE void renameState(int internalNodeId, const QString &newName); - Q_INVOKABLE void setWhenCondition(int internalNodeId, const QString &condition); - Q_INVOKABLE void resetWhenCondition(int internalNodeId); - Q_INVOKABLE QStringList autoComplete(const QString &text, int pos, bool explicitComplete); - Q_INVOKABLE QVariant stateModelNode(int internalNodeId); - - Q_INVOKABLE void setStateAsDefault(int internalNodeId); - Q_INVOKABLE void resetDefaultState(); - Q_INVOKABLE bool hasDefaultState() const; - Q_INVOKABLE void setAnnotation(int internalNodeId); - Q_INVOKABLE void removeAnnotation(int internalNodeId); - Q_INVOKABLE bool hasAnnotation(int internalNodeId) const; - - QStringList stateGroups() const; - QString activeStateGroup() const; - void setActiveStateGroup(const QString &name); - int activeStateGroupIndex() const; - void setActiveStateGroupIndex(int index); - - Q_INVOKABLE bool renameActiveStateGroup(const QString &name); - - Q_INVOKABLE void addStateGroup(const QString &name); - Q_INVOKABLE void removeStateGroup(); - - Q_INVOKABLE QVariantMap get(int idx) const; - - QVariantMap baseState() const; - bool hasExtend() const; - QStringList extendedStates() const; - - Q_PROPERTY(QVariantMap baseState READ baseState NOTIFY baseStateChanged) - Q_PROPERTY(QStringList extendedStates READ extendedStates NOTIFY extendedStatesChanged) - - Q_PROPERTY(bool hasExtend READ hasExtend NOTIFY hasExtendChanged) - - Q_PROPERTY(QString activeStateGroup READ activeStateGroup WRITE setActiveStateGroup NOTIFY - activeStateGroupChanged) - Q_PROPERTY(int activeStateGroupIndex READ activeStateGroupIndex WRITE setActiveStateGroupIndex - NOTIFY activeStateGroupIndexChanged) - Q_PROPERTY(QStringList stateGroups READ stateGroups NOTIFY stateGroupsChanged) - - Q_INVOKABLE void move(int from, int to); - Q_INVOKABLE void drop(int from, int to); - - void reset(); - void evaluateExtend(); - -signals: - void changedToState(int n); - void baseStateChanged(); - void hasExtendChanged(); - void extendedStatesChanged(); - void activeStateGroupChanged(); - void activeStateGroupIndexChanged(); - void stateGroupsChanged(); - -private: - QPointer m_statesEditorView; - bool m_hasExtend; - QStringList m_extendedStates; -}; - -} // namespace Experimental -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp deleted file mode 100644 index c263a510966..00000000000 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp +++ /dev/null @@ -1,962 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "stateseditorview.h" -#include "propertychangesmodel.h" -#include "stateseditormodel.h" -#include "stateseditorwidget.h" - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace QmlDesigner { -namespace Experimental { - -/** - We always have 'one' current state, where we get updates from (see sceneChanged()). In case - the current state is the base state, we render the base state + all other states. - */ - -StatesEditorView::StatesEditorView(ExternalDependenciesInterface &externalDependencies) - : AbstractView(externalDependencies) - , m_statesEditorModel(new StatesEditorModel(this)) - , m_lastIndex(-1) - , m_editor(nullptr) -{ - Q_ASSERT(m_statesEditorModel); - // base state -} - -StatesEditorView::~StatesEditorView() -{ - if (m_editor) - delete m_editor; - delete m_statesEditorWidget.data(); -} - -WidgetInfo StatesEditorView::widgetInfo() -{ - if (!m_statesEditorWidget) - m_statesEditorWidget = new StatesEditorWidget(this, m_statesEditorModel.data()); - - return createWidgetInfo(m_statesEditorWidget.data(), - "StatesEditor", - WidgetInfo::BottomPane, - 0, - tr("States")); -} - -void StatesEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) -{ - checkForStatesAvailability(); -} - -ModelNode StatesEditorView::activeStatesGroupNode() const -{ - return m_activeStatesGroupNode; -} - -void StatesEditorView::setActiveStatesGroupNode(const ModelNode &modelNode) -{ - if (m_activeStatesGroupNode == modelNode) - return; - - m_activeStatesGroupNode = modelNode; - resetModel(); - - checkForStatesAvailability(); - - emit m_statesEditorModel->activeStateGroupChanged(); - emit m_statesEditorModel->activeStateGroupIndexChanged(); -} - -int StatesEditorView::activeStatesGroupIndex() const -{ - if (!model()) - return -1; - - return Utils::indexOf(allModelNodesOfType(model()->qtQuickStateGroupMetaInfo()), - [this](const ModelNode &node) { return node == m_activeStatesGroupNode; }) - + 1; -} - -void StatesEditorView::setActiveStatesGroupIndex(int index) -{ - if (!model()) - return; - - if (index > 0) { - const ModelNode statesGroup = allModelNodesOfType(model()->qtQuickStateGroupMetaInfo()) - .at(index - 1); - if (statesGroup.isValid()) - setActiveStatesGroupNode(statesGroup); - } else { - setActiveStatesGroupNode(rootModelNode()); - } -} - -void StatesEditorView::registerPropertyChangesModel(PropertyChangesModel *model) -{ - m_propertyChangedModels.insert(model); -} - -void StatesEditorView::deregisterPropertyChangesModel(PropertyChangesModel *model) -{ - m_propertyChangedModels.remove(model); -} - -void StatesEditorView::synchonizeCurrentStateFromWidget() -{ - if (!model()) - return; - - if (m_block) - return; - - int internalId = m_statesEditorWidget->currentStateInternalId(); - - if (internalId > 0 && hasModelNodeForInternalId(internalId)) { - ModelNode node = modelNodeForInternalId(internalId); - QmlModelState modelState(node); - if (modelState.isValid() && modelState != currentState()) - setCurrentState(modelState); - } else { - setCurrentState(baseState()); - } -} - -void StatesEditorView::createNewState() -{ - // can happen when root node is e.g. a ListModel - if (!QmlVisualNode::isValidQmlVisualNode(activeStatesGroupNode()) - && m_activeStatesGroupNode.type() != "QtQuick.StateGroup") - return; - - QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATE_ADDED); - - QStringList modelStateNames = activeStateGroup().names(); - - QString newStateName; - int index = 1; - while (true) { - newStateName = QString(QStringLiteral("State%1")).arg(index++); - if (!modelStateNames.contains(newStateName)) - break; - } - - executeInTransaction("createNewState", [this, newStateName]() { - activeStatesGroupNode().validId(); - - ModelNode newState = activeStateGroup().addState(newStateName); - setCurrentState(newState); - }); -} - -void StatesEditorView::cloneState(int nodeId) -{ - if (!(nodeId > 0 && hasModelNodeForInternalId(nodeId))) - return; - - ModelNode stateNode(modelNodeForInternalId(nodeId)); - QTC_ASSERT(stateNode.simplifiedTypeName() == "State", return ); - - QmlModelState modelState(stateNode); - if (!modelState.isValid() || modelState.isBaseState()) - return; - - QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATE_CLONED); - - QString newName = modelState.name(); - - // Strip out numbers at the end of the string - QRegularExpression regEx(QLatin1String("[0-9]+$")); - const QRegularExpressionMatch match = regEx.match(newName); - if (match.hasMatch() && (match.capturedStart() + match.capturedLength() == newName.length())) - newName = newName.left(match.capturedStart()); - - int i = 1; - QStringList stateNames = activeStateGroup().names(); - while (stateNames.contains(newName + QString::number(i))) - i++; - const QString newStateName = newName + QString::number(i); - - QmlModelState newState; - - executeInTransaction("cloneState", [newStateName, modelState, &newState]() { - newState = modelState.duplicate(newStateName); - }); - - ModelNode newNode = newState.modelNode(); - int from = newNode.parentProperty().indexOf(newNode); - int to = stateNode.parentProperty().indexOf(stateNode) + 1; - - // When duplicating an extended state the new state needs to be added after the extend group. - if (!modelState.hasExtend()) { - auto modelNodeList = activeStatesGroupNode().nodeListProperty("states").toModelNodeList(); - for (; to != modelNodeList.count(); ++to) { - QmlModelState currentState(modelNodeList.at(to)); - if (!currentState.isValid() || currentState.isBaseState() || !currentState.hasExtend()) - break; - } - } - - executeInTransaction("moveState", [this, &newState, from, to]() { - activeStatesGroupNode().nodeListProperty("states").slide(from, to); - setCurrentState(newState); - }); -} - -void StatesEditorView::extendState(int nodeId) -{ - if (!(nodeId > 0 && hasModelNodeForInternalId(nodeId))) - return; - - ModelNode stateNode(modelNodeForInternalId(nodeId)); - QTC_ASSERT(stateNode.simplifiedTypeName() == "State", return ); - - QmlModelState modelState(stateNode); - if (!modelState.isValid() || modelState.isBaseState()) - return; - - QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATE_EXTENDED); - - QString newName = modelState.name(); - - // Strip out numbers at the end of the string - QRegularExpression regEx(QLatin1String("[0-9]+$")); - const QRegularExpressionMatch match = regEx.match(newName); - if (match.hasMatch() && (match.capturedStart() + match.capturedLength() == newName.length())) - newName = newName.left(match.capturedStart()); - - int i = 1; - QStringList stateNames = activeStateGroup().names(); - while (stateNames.contains(newName + QString::number(i))) - i++; - const QString newStateName = newName + QString::number(i); - - QmlModelState newState; - - executeInTransaction("extendState", [this, newStateName, modelState, &newState]() { - newState = activeStateGroup().addState(newStateName); - newState.setExtend(modelState.name()); - }); - - ModelNode newNode = newState.modelNode(); - int from = newNode.parentProperty().indexOf(newNode); - int to = stateNode.parentProperty().indexOf(stateNode) + 1; - - executeInTransaction("moveState", [this, &newState, from, to]() { - activeStatesGroupNode().nodeListProperty("states").slide(from, to); - setCurrentState(newState); - }); -} - -void StatesEditorView::removeState(int nodeId) -{ - try { - if (nodeId > 0 && hasModelNodeForInternalId(nodeId)) { - ModelNode stateNode(modelNodeForInternalId(nodeId)); - QTC_ASSERT(stateNode.simplifiedTypeName() == "State", return ); - - QmlModelState modelState(stateNode); - if (modelState.isValid()) { - QStringList lockedTargets; - const auto propertyChanges = modelState.propertyChanges(); - - // confirm removing not empty states - if (!propertyChanges.isEmpty()) { - QMessageBox msgBox; - msgBox.setTextFormat(Qt::RichText); - msgBox.setIcon(QMessageBox::Question); - msgBox.setWindowTitle(tr("Remove State")); - msgBox.setText( - tr("This state is not empty. Are you sure you want to remove it?")); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Yes); - - if (msgBox.exec() == QMessageBox::Cancel) - return; - } - - // confirm removing states with locked targets - for (const QmlPropertyChanges &change : propertyChanges) { - const ModelNode target = change.target(); - QTC_ASSERT(target.isValid(), continue); - if (target.locked()) - lockedTargets.push_back(target.id()); - } - - if (!lockedTargets.empty()) { - Utils::sort(lockedTargets); - QString detailedText = QString("" + tr("Locked components:") + "
"); - - for (const auto &id : std::as_const(lockedTargets)) - detailedText.append("- " + id + "
"); - - detailedText.chop(QString("
").size()); - - QMessageBox msgBox; - msgBox.setTextFormat(Qt::RichText); - msgBox.setIcon(QMessageBox::Question); - msgBox.setWindowTitle(tr("Remove State")); - msgBox.setText(QString(tr("Removing this state will modify locked components.") - + "

%1") - .arg(detailedText)); - msgBox.setInformativeText(tr("Continue by removing the state?")); - msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Ok); - - if (msgBox.exec() == QMessageBox::Cancel) - return; - } - } - - NodeListProperty parentProperty = stateNode.parentProperty().toNodeListProperty(); - - if (parentProperty.count() <= 1) { - setCurrentState(baseState()); - } else if (parentProperty.isValid()) { - int index = parentProperty.indexOf(stateNode); - if (index == 0) - setCurrentState(parentProperty.at(1)); - else - setCurrentState(parentProperty.at(index - 1)); - } - - stateNode.destroy(); - } - } catch (const RewritingException &e) { - e.showException(); - } -} - -void StatesEditorView::resetModel() -{ - if (m_bulkChange) { - m_modelDirty = true; - return; - } - - if (m_statesEditorModel) - m_statesEditorModel->reset(); - - if (m_statesEditorWidget) { - if (currentState().isBaseState()) - m_statesEditorWidget->setCurrentStateInternalId(0); - else - m_statesEditorWidget->setCurrentStateInternalId(currentState().modelNode().internalId()); - } - - m_modelDirty = false; -} - -void StatesEditorView::resetPropertyChangesModels() -{ - if (m_bulkChange) { - m_propertyChangesDirty = true; - return; - } - - std::for_each(m_propertyChangedModels.begin(), - m_propertyChangedModels.end(), - [](PropertyChangesModel *model) { model->reset(); }); - - m_propertyChangesDirty = false; -} - -void StatesEditorView::resetExtend() -{ - if (m_bulkChange) { - m_extendDirty = true; - return; - } - - m_statesEditorModel->evaluateExtend(); - - m_extendDirty = false; -} - -void StatesEditorView::resetStateGroups() -{ - if (m_bulkChange) { - m_stateGroupsDirty = true; - return; - } - - emit m_statesEditorModel->stateGroupsChanged(); - - m_stateGroupsDirty = false; -} - -void StatesEditorView::checkForStatesAvailability() -{ - if (m_statesEditorWidget) { - const bool isVisual = activeStatesGroupNode().metaInfo().isBasedOn( - model()->qtQuickItemMetaInfo(), model()->qtQuick3DNodeMetaInfo()); - const bool isRoot = activeStatesGroupNode().isRootNode(); - m_statesEditorWidget->showAddNewStatesButton(isVisual || !isRoot); - } -} - -void StatesEditorView::beginBulkChange() -{ - m_bulkChange = true; -} - -void StatesEditorView::endBulkChange() -{ - if (!m_bulkChange) - return; - - m_bulkChange = false; - - if (m_modelDirty) - resetModel(); - - if (m_propertyChangesDirty) - resetPropertyChangesModels(); - - if (m_extendDirty) - resetExtend(); - - if (m_stateGroupsDirty) - resetStateGroups(); -} - -void StatesEditorView::setCurrentState(const QmlModelState &state) -{ - if (!model() && !state.isValid()) - return; - - if (currentStateNode() != state.modelNode()) - setCurrentStateNode(state.modelNode()); -} - -QmlModelState StatesEditorView::baseState() const -{ - return QmlModelState::createBaseState(this); -} - -QmlModelStateGroup StatesEditorView::activeStateGroup() const -{ - return QmlModelStateGroup(activeStatesGroupNode()); -} - -bool StatesEditorView::validStateName(const QString &name) const -{ - if (name == tr("base state")) - return false; - const QList modelStates = activeStateGroup().allStates(); - for (const QmlModelState &state : modelStates) { - if (state.name() == name) - return false; - } - return true; -} - -bool StatesEditorView::hasExtend() const -{ - if (!model()) - return false; - - const QList modelStates = activeStateGroup().allStates(); - for (const QmlModelState &state : modelStates) { - if (state.hasExtend()) - return true; - } - return false; -} - -QStringList StatesEditorView::extendedStates() const -{ - if (!model()) - return QStringList(); - - QStringList states; - - const QList modelStates = activeStateGroup().allStates(); - for (const QmlModelState &state : modelStates) { - if (state.hasExtend()) - states.append(state.extend()); - } - states.removeDuplicates(); - return states; -} - -QString StatesEditorView::currentStateName() const -{ - return currentState().isValid() ? currentState().name() : QString(); -} - -void StatesEditorView::renameState(int internalNodeId, const QString &newName) -{ - if (hasModelNodeForInternalId(internalNodeId)) { - QmlModelState renamedState(modelNodeForInternalId(internalNodeId)); - try { - if (renamedState.isValid() && renamedState.name() != newName) { - executeInTransaction("renameState", [this, &renamedState, &newName]() { - // Jump to base state for the change - QmlModelState oldState = currentState(); - setCurrentState(baseState()); - const bool updateDefault = renamedState.isDefault(); - - // If state is extended rename all references - QList states; - const QList modelStates = activeStateGroup().allStates(); - for (const QmlModelState &state : modelStates) { - if (state.hasExtend() && state.extend() == renamedState.name()) - states.append(state); - } - - renamedState.setName(newName.trimmed()); - - for (QmlModelState &state : states) - state.setExtend(newName.trimmed()); - - if (updateDefault) - renamedState.setAsDefault(); - - setCurrentState(oldState); - }); - } - } catch (const RewritingException &e) { - e.showException(); - } - } -} - -void StatesEditorView::setWhenCondition(int internalNodeId, const QString &condition) -{ - if (m_block) - return; - - m_block = true; - auto guard = qScopeGuard([&]() { m_block = false; }); - - if (hasModelNodeForInternalId(internalNodeId)) { - QmlModelState state(modelNodeForInternalId(internalNodeId)); - try { - if (state.isValid()) - state.modelNode().bindingProperty("when").setExpression(condition); - - } catch (const Exception &e) { - e.showException(); - } - } -} - -void StatesEditorView::resetWhenCondition(int internalNodeId) -{ - if (m_block) - return; - - m_block = true; - auto guard = qScopeGuard([&]() { m_block = false; }); - - if (hasModelNodeForInternalId(internalNodeId)) { - QmlModelState state(modelNodeForInternalId(internalNodeId)); - try { - if (state.isValid() && state.modelNode().hasProperty("when")) - state.modelNode().removeProperty("when"); - - } catch (const RewritingException &e) { - e.showException(); - } - } -} - -void StatesEditorView::setStateAsDefault(int internalNodeId) -{ - if (m_block) - return; - - m_block = true; - auto guard = qScopeGuard([&]() { m_block = false; }); - - if (hasModelNodeForInternalId(internalNodeId)) { - QmlModelState state(modelNodeForInternalId(internalNodeId)); - try { - if (state.isValid()) - state.setAsDefault(); - - } catch (const RewritingException &e) { - e.showException(); - } - } -} - -void StatesEditorView::resetDefaultState() -{ - if (m_block) - return; - - m_block = true; - auto guard = qScopeGuard([&]() { m_block = false; }); - - try { - if (activeStatesGroupNode().hasProperty("state")) - activeStatesGroupNode().removeProperty("state"); - - } catch (const RewritingException &e) { - e.showException(); - } -} - -bool StatesEditorView::hasDefaultState() const -{ - return activeStatesGroupNode().hasProperty("state"); -} - -void StatesEditorView::setAnnotation(int internalNodeId) -{ - if (m_block) - return; - - m_block = true; - auto guard = qScopeGuard([&]() { m_block = false; }); - - if (hasModelNodeForInternalId(internalNodeId)) { - QmlModelState state(modelNodeForInternalId(internalNodeId)); - try { - if (state.isValid()) { - ModelNode modelNode = state.modelNode(); - - if (modelNode.isValid()) { - if (!m_editor) - m_editor = new AnnotationEditor(this); - - m_editor->setModelNode(modelNode); - m_editor->showWidget(); - } - } - - } catch (const RewritingException &e) { - e.showException(); - } - } -} - -void StatesEditorView::removeAnnotation(int internalNodeId) -{ - if (m_block) - return; - - m_block = true; - auto guard = qScopeGuard([&]() { m_block = false; }); - - if (hasModelNodeForInternalId(internalNodeId)) { - QmlModelState state(modelNodeForInternalId(internalNodeId)); - try { - if (state.isValid()) - state.removeAnnotation(); - - } catch (const RewritingException &e) { - e.showException(); - } - } -} - -bool StatesEditorView::hasAnnotation(int internalNodeId) const -{ - if (!model()) - return false; - - if (hasModelNodeForInternalId(internalNodeId)) { - QmlModelState state(modelNodeForInternalId(internalNodeId)); - if (state.isValid()) - return state.hasAnnotation(); - } - - return false; -} - -void StatesEditorView::modelAttached(Model *model) -{ - if (model == AbstractView::model()) - return; - - QTC_ASSERT(model, return ); - AbstractView::modelAttached(model); - - m_activeStatesGroupNode = rootModelNode(); - - if (m_statesEditorWidget) - m_statesEditorWidget->setNodeInstanceView(nodeInstanceView()); - - checkForStatesAvailability(); - - resetModel(); - resetStateGroups(); - - emit m_statesEditorModel->activeStateGroupChanged(); - emit m_statesEditorModel->activeStateGroupIndexChanged(); -} - -void StatesEditorView::modelAboutToBeDetached(Model *model) -{ - AbstractView::modelAboutToBeDetached(model); - resetModel(); -} - -void StatesEditorView::propertiesRemoved(const QList& propertyList) -{ - for (const AbstractProperty &property : propertyList) { - if (property.name() == "states" && property.parentModelNode() == activeStateGroup().modelNode()) - resetModel(); - if ((property.name() == "when" || property.name() == "name") - && QmlModelState::isValidQmlModelState(property.parentModelNode())) - resetModel(); - if (property.name() == "extend") - resetExtend(); - if (property.parentModelNode().simplifiedTypeName() == "PropertyChanges" - || (property.name() == "changes" - && property.parentModelNode().simplifiedTypeName() == "State")) - resetPropertyChangesModels(); - } -} - -void StatesEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) -{ - if (removedNode.hasParentProperty()) { - const NodeAbstractProperty propertyParent = removedNode.parentProperty(); - if (propertyParent.parentModelNode() == activeStateGroup().modelNode() - && propertyParent.name() == "states") - m_lastIndex = propertyParent.indexOf(removedNode); - } - if (currentState().isValid() && removedNode == currentState()) - setCurrentState(baseState()); - - if (removedNode.simplifiedTypeName() == "PropertyChanges") - m_propertyChangesRemoved = true; - - if (removedNode.simplifiedTypeName() == "StateGroup") { - if (removedNode == activeStatesGroupNode()) - setActiveStatesGroupNode(rootModelNode()); - - m_stateGroupRemoved = true; - } -} - -void StatesEditorView::nodeRemoved(const ModelNode & /*removedNode*/, - const NodeAbstractProperty &parentProperty, - PropertyChangeFlags /*propertyChange*/) -{ - if (parentProperty.isValid() - && parentProperty.parentModelNode() == activeStateGroup().modelNode() - && parentProperty.name() == "states") { - m_statesEditorModel->removeState(m_lastIndex); - m_lastIndex = -1; - resetModel(); - } - - if (m_propertyChangesRemoved) { - m_propertyChangesRemoved = false; - resetPropertyChangesModels(); - } - - if (m_stateGroupRemoved) { - m_stateGroupRemoved = false; - resetStateGroups(); - } -} - -void StatesEditorView::nodeAboutToBeReparented(const ModelNode &node, - const NodeAbstractProperty & /*newPropertyParent*/, - const NodeAbstractProperty &oldPropertyParent, - AbstractView::PropertyChangeFlags /*propertyChange*/) -{ - if (oldPropertyParent.isValid() - && oldPropertyParent.parentModelNode() == activeStateGroup().modelNode() - && oldPropertyParent.name() == "states") - m_lastIndex = oldPropertyParent.indexOf(node); - - if (node.simplifiedTypeName() == "StateGroup") - resetStateGroups(); -} - -void StatesEditorView::nodeReparented(const ModelNode &node, - const NodeAbstractProperty &newPropertyParent, - const NodeAbstractProperty &oldPropertyParent, - AbstractView::PropertyChangeFlags /*propertyChange*/) -{ - if (oldPropertyParent.isValid() - && oldPropertyParent.parentModelNode() == activeStateGroup().modelNode() - && oldPropertyParent.name() == "states") { - m_statesEditorModel->removeState(m_lastIndex); - resetModel(); - m_lastIndex = -1; - } - - if (newPropertyParent.isValid() - && newPropertyParent.parentModelNode() == activeStateGroup().modelNode() - && newPropertyParent.name() == "states") { - int index = newPropertyParent.indexOf(node); - m_statesEditorModel->insertState(index); - } - - if (node.simplifiedTypeName() == "PropertyChanges") - resetPropertyChangesModels(); -} - -void StatesEditorView::nodeOrderChanged(const NodeListProperty &listProperty) -{ - if (m_block) - return; - - if (listProperty.isValid() && listProperty.parentModelNode() == activeStateGroup().modelNode() - && listProperty.name() == "states") - resetModel(); -} - -void StatesEditorView::bindingPropertiesChanged(const QList &propertyList, AbstractView::PropertyChangeFlags propertyChange) -{ - Q_UNUSED(propertyChange) - - for (const BindingProperty &property : propertyList) { - if (property.name() == "when" - && QmlModelState::isValidQmlModelState(property.parentModelNode())) - resetModel(); - if (property.parentModelNode().simplifiedTypeName() == "PropertyChanges") - resetPropertyChangesModels(); - } -} - -void StatesEditorView::variantPropertiesChanged(const QList &propertyList, - AbstractView::PropertyChangeFlags /*propertyChange*/) -{ - if (m_block) - return; - - m_block = true; - auto guard = qScopeGuard([&]() { m_block = false; }); - - for (const VariantProperty &property : propertyList) { - if (property.name() == "name" - && QmlModelState::isValidQmlModelState(property.parentModelNode())) - resetModel(); - else if (property.name() == "state" - && property.parentModelNode() == activeStateGroup().modelNode()) - resetModel(); - else if (property.name() == "extend") - resetExtend(); - - if (property.parentModelNode().simplifiedTypeName() == "PropertyChanges") - resetPropertyChangesModels(); - } -} - -void StatesEditorView::customNotification(const AbstractView * /*view*/, - const QString &identifier, - const QList & /*nodeList*/, - const QList & /*data*/) -{ - if (identifier == StartRewriterAmend) - beginBulkChange(); - - if (identifier == EndRewriterAmend) - endBulkChange(); -} - -void StatesEditorView::rewriterBeginTransaction() -{ - beginBulkChange(); -} - -void StatesEditorView::rewriterEndTransaction() -{ - endBulkChange(); -} - -void StatesEditorView::currentStateChanged(const ModelNode &node) -{ - QmlModelState newQmlModelState(node); - - if (newQmlModelState.isBaseState()) - m_statesEditorWidget->setCurrentStateInternalId(0); - else - m_statesEditorWidget->setCurrentStateInternalId(newQmlModelState.modelNode().internalId()); -} - -void StatesEditorView::instancesPreviewImageChanged(const QVector &nodeList) -{ - if (!model()) - return; - - int minimumIndex = 10000; - int maximumIndex = -1; - for (const ModelNode &node : nodeList) { - if (node.isRootNode()) { - minimumIndex = qMin(minimumIndex, 0); - maximumIndex = qMax(maximumIndex, 0); - } else { - int index = activeStateGroup().allStates().indexOf(QmlModelState(node)) + 1; - if (index > 0) { - minimumIndex = qMin(minimumIndex, index); - maximumIndex = qMax(maximumIndex, index); - } - } - } - - if (maximumIndex >= 0) - m_statesEditorModel->updateState(minimumIndex, maximumIndex); -} - -void StatesEditorView::moveStates(int from, int to) -{ - if (m_block) - return; - - m_block = true; - auto guard = qScopeGuard([&]() { m_block = false; }); - - if (!activeStatesGroupNode().hasNodeListProperty("states")) - return; - - executeInTransaction("moveState", [this, from, to]() { - activeStatesGroupNode().nodeListProperty("states").slide(from - 1, to - 1); - }); -} - -} // namespace Experimental -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.h b/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.h deleted file mode 100644 index 57adacd87b8..00000000000 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.h +++ /dev/null @@ -1,157 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include - -#include - -#include - -namespace QmlDesigner { - -class AnnotationEditor; - -namespace Experimental { - -class StatesEditorModel; -class StatesEditorWidget; -class PropertyChangesModel; - -class StatesEditorView : public AbstractView { - Q_OBJECT - -public: - explicit StatesEditorView(ExternalDependenciesInterface &externalDependencies); - ~StatesEditorView() override; - - void renameState(int internalNodeId,const QString &newName); - void setWhenCondition(int internalNodeId, const QString &condition); - void resetWhenCondition(int internalNodeId); - void setStateAsDefault(int internalNodeId); - void resetDefaultState(); - bool hasDefaultState() const; - void setAnnotation(int internalNodeId); - void removeAnnotation(int internalNodeId); - bool hasAnnotation(int internalNodeId) const; - bool validStateName(const QString &name) const; - bool hasExtend() const; - QStringList extendedStates() const; - QString currentStateName() const; - void setCurrentState(const QmlModelState &state); - QmlModelState baseState() const; - QmlModelStateGroup activeStateGroup() const; - - void moveStates(int from, int to); - - // AbstractView - void modelAttached(Model *model) override; - void modelAboutToBeDetached(Model *model) override; - void propertiesRemoved(const QList& propertyList) override; - void nodeAboutToBeRemoved(const ModelNode &removedNode) override; - void nodeRemoved(const ModelNode &removedNode, - const NodeAbstractProperty &parentProperty, - PropertyChangeFlags propertyChange) override; - void nodeAboutToBeReparented(const ModelNode &node, - const NodeAbstractProperty &newPropertyParent, - const NodeAbstractProperty &oldPropertyParent, - AbstractView::PropertyChangeFlags propertyChange) override; - void nodeReparented(const ModelNode &node, - const NodeAbstractProperty &newPropertyParent, - const NodeAbstractProperty &oldPropertyParent, - AbstractView::PropertyChangeFlags propertyChange) override; - void nodeOrderChanged(const NodeListProperty &listProperty) override; - void bindingPropertiesChanged(const QList &propertyList, - PropertyChangeFlags propertyChange) override; - void variantPropertiesChanged(const QList &propertyList, - PropertyChangeFlags propertyChange) override; - - void customNotification(const AbstractView *view, - const QString &identifier, - const QList &nodeList, - const QList &data) override; - void rewriterBeginTransaction() override; - void rewriterEndTransaction() override; - - // AbstractView - void currentStateChanged(const ModelNode &node) override; - - void instancesPreviewImageChanged(const QVector &nodeList) override; - - WidgetInfo widgetInfo() override; - - void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override; - - ModelNode activeStatesGroupNode() const; - void setActiveStatesGroupNode(const ModelNode &modelNode); - - int activeStatesGroupIndex() const; - void setActiveStatesGroupIndex(int index); - - void registerPropertyChangesModel(PropertyChangesModel *model); - void deregisterPropertyChangesModel(PropertyChangesModel *model); - -public slots: - void synchonizeCurrentStateFromWidget(); - void createNewState(); - void cloneState(int nodeId); - void extendState(int nodeId); - void removeState(int nodeId); - -private: - void resetModel(); - void resetPropertyChangesModels(); - void resetExtend(); - void resetStateGroups(); - - void checkForStatesAvailability(); - - void beginBulkChange(); - void endBulkChange(); - -private: - QPointer m_statesEditorModel; - QPointer m_statesEditorWidget; - int m_lastIndex; - bool m_block = false; - QPointer m_editor; - ModelNode m_activeStatesGroupNode; - - bool m_propertyChangesRemoved = false; - bool m_stateGroupRemoved = false; - - bool m_bulkChange = false; - - bool m_modelDirty = false; - bool m_extendDirty = false; - bool m_propertyChangesDirty = false; - bool m_stateGroupsDirty = false; - - QSet m_propertyChangedModels; -}; - -} // namespace Experimental -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.cpp b/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.cpp deleted file mode 100644 index f3fd945ae6b..00000000000 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "stateseditorwidget.h" -#include "stateseditormodel.h" -#include "stateseditorview.h" -#include "stateseditorimageprovider.h" - -#include -#include -#include -#include - -#include - -#include -#include - -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include - -enum { - debug = false -}; - -namespace QmlDesigner { -namespace Experimental { - -static QString propertyEditorResourcesPath() -{ -#ifdef SHARE_QML_PATH - if (qEnvironmentVariableIsSet("LOAD_QML_FROM_SOURCE")) - return QLatin1String(SHARE_QML_PATH) + "/propertyEditorQmlSources"; -#endif - return Core::ICore::resourcePath("qmldesigner/propertyEditorQmlSources").toString(); -} - -int StatesEditorWidget::currentStateInternalId() const -{ - QTC_ASSERT(rootObject(), return -1); - QTC_ASSERT(rootObject()->property("currentStateInternalId").isValid(), return -1); - - return rootObject()->property("currentStateInternalId").toInt(); -} - -void StatesEditorWidget::setCurrentStateInternalId(int internalId) -{ - QTC_ASSERT(rootObject(), return); - rootObject()->setProperty("currentStateInternalId", internalId); -} - -void StatesEditorWidget::setNodeInstanceView(const NodeInstanceView *nodeInstanceView) -{ - m_imageProvider->setNodeInstanceView(nodeInstanceView); -} - -void StatesEditorWidget::showAddNewStatesButton(bool showAddNewStatesButton) -{ - rootContext()->setContextProperty(QLatin1String("canAddNewStates"), showAddNewStatesButton); -} - -StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, - StatesEditorModel *statesEditorModel) - : m_statesEditorView(statesEditorView) - , m_imageProvider(nullptr) - , m_qmlSourceUpdateShortcut(nullptr) -{ - m_imageProvider = new Internal::StatesEditorImageProvider; - m_imageProvider->setNodeInstanceView(statesEditorView->nodeInstanceView()); - - engine()->addImageProvider(QStringLiteral("qmldesigner_stateseditor"), m_imageProvider); - engine()->addImportPath(qmlSourcesPath()); - engine()->addImportPath(propertyEditorResourcesPath() + "/imports"); - engine()->addImportPath(qmlSourcesPath() + "/imports"); - - m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F10), this); - connect(m_qmlSourceUpdateShortcut, &QShortcut::activated, this, &StatesEditorWidget::reloadQmlSource); - - setObjectName(Constants::OBJECT_NAME_STATES_EDITOR); - setResizeMode(QQuickWidget::SizeRootObjectToView); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - rootContext()->setContextProperties( - QVector{{{"statesEditorModel"}, - QVariant::fromValue(statesEditorModel)}, - {{"canAddNewStates"}, true}}); - - Theme::setupTheme(engine()); - - setWindowTitle(tr("States New", "Title of Editor widget")); - setMinimumWidth(195); - setMinimumHeight(195); - - // init the first load of the QML UI elements - reloadQmlSource(); -} - -StatesEditorWidget::~StatesEditorWidget() = default; - -QString StatesEditorWidget::qmlSourcesPath() -{ -#ifdef SHARE_QML_PATH - if (qEnvironmentVariableIsSet("LOAD_QML_FROM_SOURCE")) - return QLatin1String(SHARE_QML_PATH) + "/newstateseditor"; -#endif - return Core::ICore::resourcePath("qmldesigner/newstateseditor").toString(); -} - -void StatesEditorWidget::showEvent(QShowEvent *event) -{ - QQuickWidget::showEvent(event); - update(); - QMetaObject::invokeMethod(rootObject(), "showEvent"); -} - -void StatesEditorWidget::focusOutEvent(QFocusEvent *focusEvent) -{ - QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_STATESEDITOR_TIME, - m_usageTimer.elapsed()); - QQuickWidget::focusOutEvent(focusEvent); -} - -void StatesEditorWidget::focusInEvent(QFocusEvent *focusEvent) -{ - m_usageTimer.restart(); - QQuickWidget::focusInEvent(focusEvent); -} - -void StatesEditorWidget::reloadQmlSource() -{ - QString statesListQmlFilePath = qmlSourcesPath() + QStringLiteral("/Main.qml"); - QTC_ASSERT(QFileInfo::exists(statesListQmlFilePath), return ); - setSource(QUrl::fromLocalFile(statesListQmlFilePath)); - - if (!rootObject()) { - QString errorString; - for (const QQmlError &error : errors()) - errorString += "\n" + error.toString(); - - Core::AsynchronousMessageBox::warning(tr("Cannot Create QtQuick View"), - tr("StatesEditorWidget: %1 cannot be created.%2") - .arg(qmlSourcesPath(), errorString)); - return; - } - - connect(rootObject(), - SIGNAL(currentStateInternalIdChanged()), - m_statesEditorView.data(), - SLOT(synchonizeCurrentStateFromWidget())); - connect(rootObject(), - SIGNAL(createNewState()), - m_statesEditorView.data(), - SLOT(createNewState())); - connect(rootObject(), SIGNAL(cloneState(int)), m_statesEditorView.data(), SLOT(cloneState(int))); - connect(rootObject(), - SIGNAL(extendState(int)), - m_statesEditorView.data(), - SLOT(extendState(int))); - connect(rootObject(), - SIGNAL(deleteState(int)), - m_statesEditorView.data(), - SLOT(removeState(int))); - m_statesEditorView.data()->synchonizeCurrentStateFromWidget(); -} - -} // namespace Experimental -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.h b/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.h deleted file mode 100644 index 0b8ca901e03..00000000000 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditorwidget.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE -class QShortcut; -QT_END_NAMESPACE - -namespace QmlDesigner { - -class NodeInstanceView; - -namespace Experimental { - -class StatesEditorModel; -class StatesEditorView; - -namespace Internal { class StatesEditorImageProvider; } - -class StatesEditorWidget : public QQuickWidget -{ - Q_OBJECT - -public: - StatesEditorWidget(StatesEditorView *m_statesEditorView, StatesEditorModel *statesEditorModel); - ~StatesEditorWidget() override; - - int currentStateInternalId() const; - void setCurrentStateInternalId(int internalId); - void setNodeInstanceView(const NodeInstanceView *nodeInstanceView); - - void showAddNewStatesButton(bool showAddNewStatesButton); - - static QString qmlSourcesPath(); - -protected: - void showEvent(QShowEvent *) override; - void focusOutEvent(QFocusEvent *focusEvent) override; - void focusInEvent(QFocusEvent *focusEvent) override; - -private: - void reloadQmlSource(); - -private: - QPointer m_statesEditorView; - Internal::StatesEditorImageProvider *m_imageProvider; - QShortcut *m_qmlSourceUpdateShortcut; - QElapsedTimer m_usageTimer; -}; - -} // namespace Experimental -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/qmlstate.h b/src/plugins/qmldesigner/designercore/include/qmlstate.h index 2e9ea7f895b..58515aff3b1 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlstate.h +++ b/src/plugins/qmldesigner/designercore/include/qmlstate.h @@ -23,7 +23,6 @@ class StatesEditorView; class QMLDESIGNERCORE_EXPORT QmlModelState final : public QmlModelNodeFacade { friend StatesEditorView; - friend Experimental::StatesEditorView; public: QmlModelState(); diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index fb7165d82a2..69917dbc23b 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -107,7 +107,6 @@ class QMLDESIGNERCORE_EXPORT QmlModelStateGroup { friend class QmlObjectNode; friend class StatesEditorView; - friend class Experimental::StatesEditorView; public: QmlModelStateGroup() = default; diff --git a/src/plugins/qmldesignerbase/utils/designersettings.cpp b/src/plugins/qmldesignerbase/utils/designersettings.cpp index 6e0ad8bdded..7071cfffbd1 100644 --- a/src/plugins/qmldesignerbase/utils/designersettings.cpp +++ b/src/plugins/qmldesignerbase/utils/designersettings.cpp @@ -85,7 +85,6 @@ void DesignerSettings::fromSettings(QSettings *settings) restoreValue(settings, DesignerSettingsKey::EDIT3DVIEW_GRID_COLOR, "#aaaaaa"); restoreValue(settings, DesignerSettingsKey::SMOOTH_RENDERING, false); restoreValue(settings, DesignerSettingsKey::SHOW_DEBUG_SETTINGS, false); - restoreValue(settings, DesignerSettingsKey::OLD_STATES_EDITOR, false); restoreValue(settings, DesignerSettingsKey::EDITOR_ZOOM_FACTOR, 1.0); restoreValue(settings, DesignerSettingsKey::ACTIONS_MERGE_TEMPLATE_ENABLED, false); restoreValue(settings, DesignerSettingsKey::DOWNLOADABLE_BUNDLES_URL, diff --git a/src/plugins/qmldesignerbase/utils/designersettings.h b/src/plugins/qmldesignerbase/utils/designersettings.h index ff80f3358a0..2e2e90c83f1 100644 --- a/src/plugins/qmldesignerbase/utils/designersettings.h +++ b/src/plugins/qmldesignerbase/utils/designersettings.h @@ -57,7 +57,6 @@ inline constexpr char ALWAYS_DESIGN_MODE[] = "AlwaysDesignMode"; inline constexpr char DISABLE_ITEM_LIBRARY_UPDATE_TIMER[] = "DisableItemLibraryUpdateTimer"; inline constexpr char ASK_BEFORE_DELETING_ASSET[] = "AskBeforeDeletingAsset"; inline constexpr char SMOOTH_RENDERING[] = "SmoothRendering"; -inline constexpr char OLD_STATES_EDITOR[] = "ForceOldStatesEditor"; inline constexpr char EDITOR_ZOOM_FACTOR[] = "EditorZoomFactor"; inline constexpr char ACTIONS_MERGE_TEMPLATE_ENABLED[] = "ActionsMergeTemplateEnabled"; inline constexpr char DOWNLOADABLE_BUNDLES_URL[] = "DownloadableBundlesLocation"; From 71e1a77197a579ceed878229ed0a6b16b5afaaa1 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 6 Jun 2023 11:27:29 +0200 Subject: [PATCH 060/149] QmlDesigner: Add removal for binding properties If an id is present in a binding expression and the node with that id is removed we remove the expression is removed too. Task-number: QDS-10018 Change-Id: I6c33005edcbcafbff7dd82af47977b238068eba1 Reviewed-by: Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/include/model.h | 1 + .../qmldesigner/designercore/model/model.cpp | 11 ++ .../model/modelresourcemanagement.cpp | 178 ++++++++++++------ .../unittest/modelresourcemanagement-test.cpp | 96 ++++++---- 4 files changed, 200 insertions(+), 86 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 63126b4de06..752d31321ab 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -140,6 +140,7 @@ public: ModelNode rootModelNode(); ModelNode modelNodeForId(const QString &id); + QHash idModelNodeDict(); ModelNode createModelNode(const TypeName &typeName); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 8e3029f4c9c..8b5bd02ac0f 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -2330,6 +2330,17 @@ ModelNode Model::modelNodeForId(const QString &id) { return ModelNode(d->nodeForId(id), this, nullptr); } + +QHash Model::idModelNodeDict() +{ + QHash idModelNodes; + + for (const auto &[key, internalNode] : d->m_idNodeHash.asKeyValueRange()) + idModelNodes.insert(key, ModelNode(internalNode, this, nullptr)); + + return idModelNodes; +} + namespace { ModelNode createNode(Model *model, Internal::ModelPrivate *d, diff --git a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp index cf2152baff5..a61f1001f96 100644 --- a/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelresourcemanagement.cpp @@ -12,6 +12,9 @@ #include #include +#include +#include + #include namespace QmlDesigner { @@ -81,6 +84,9 @@ private: { std::sort(newModelNodes.begin(), newModelNodes.end()); + newModelNodes.erase(std::unique(newModelNodes.begin(), newModelNodes.end()), + newModelNodes.end()); + auto oldModelNodes = std::move(resourceSet.removeModelNodes); resourceSet.removeModelNodes = {}; resourceSet.removeModelNodes.reserve(oldModelNodes.size() + newModelNodes.size()); @@ -98,6 +104,9 @@ private: { std::sort(newProperties.begin(), newProperties.end()); + newProperties.erase(std::unique(newProperties.begin(), newProperties.end()), + newProperties.end()); + auto oldProperties = std::move(resourceSet.removeProperties); resourceSet.removeProperties = {}; resourceSet.removeProperties.reserve(oldProperties.size() + newProperties.size()); @@ -210,35 +219,6 @@ struct RemoveLayerEnabled : public Base } }; -struct RemoveAliasExports : public Base -{ - RemoveAliasExports(ModelResourceSet &resourceSet, NodeActions &nodeActions, ModelNode rootNode) - : Base{resourceSet, nodeActions} - , rootNode{std::move(rootNode)} - {} - - AbstractProperties collectProperties(const ModelNodes &nodes) - { - AbstractProperties properties; - - for (const ModelNode &node : nodes) { - PropertyName propertyName = node.id().toUtf8(); - - if (rootNode.bindingProperty(propertyName).isAliasExport()) - properties.push_back(rootNode.property(propertyName)); - } - - return properties; - } - - void handleNodes(const ModelNodes &nodes) - { - removeProperties(collectProperties(nodes), CheckRecursive::Yes); - } - - ModelNode rootNode; -}; - struct NodeDependency { ModelNode target; @@ -262,6 +242,29 @@ struct NodeDependency using NodeDependencies = std::vector; +struct BindingDependency +{ + ModelNode target; + BindingProperty property; + + friend bool operator<(const BindingDependency &first, const BindingDependency &second) + { + return std::tie(first.target, first.property) < std::tie(second.target, second.property); + } + + friend bool operator<(const BindingDependency &first, const ModelNode &second) + { + return first.target < second; + } + + friend bool operator<(const ModelNode &first, const BindingDependency &second) + { + return first < second.target; + } +}; + +using BindingDependencies = std::vector; + struct NameNode { QString name; @@ -290,6 +293,37 @@ struct NodesProperty using NodesProperties = std::vector; +struct RemoveDependentBindings : public Base +{ + RemoveDependentBindings(ModelResourceSet &resourceSet, + NodeActions &nodeActions, + BindingDependencies dependencies) + : Base{resourceSet, nodeActions} + , dependencies{std::move(dependencies)} + {} + + AbstractProperties collectProperties(const ModelNodes &nodes) + { + AbstractProperties properties; + ::Utils::set_greedy_intersection(dependencies.begin(), + dependencies.end(), + nodes.begin(), + nodes.end(), + ::Utils::make_iterator([&](const BindingDependency &dependency) { + properties.push_back(dependency.property); + })); + + return properties; + } + + void handleNodes(const ModelNodes &nodes) + { + removeProperties(collectProperties(nodes), CheckRecursive::No); + } + + BindingDependencies dependencies; +}; + struct RemoveDependencies : public Base { RemoveDependencies(ModelResourceSet &resourceSet, @@ -441,6 +475,41 @@ struct DependenciesSet NodeDependencies nodeDependencies; NodeDependencies targetsDependencies; NodesProperties targetsNodesProperties; + BindingDependencies bindingDependencies; +}; + +struct BindingFilter +{ + BindingFilter(BindingDependencies &dependencies, Model *model) + : dependencies{dependencies} + , idModelNodeDict{model->idModelNodeDict()} + , wordsRegex{"[[:<:]](\\w+)[[:>:]]"} + {} + + void filterBindingProperty(const BindingProperty &property) + { + const QString &expression = property.expression(); + auto iterator = wordsRegex.globalMatch(expression); + + while (iterator.hasNext()) { + auto match = iterator.next(); + auto word = match.capturedView(); + if (auto modelNode = idModelNodeDict.value(word)) + dependencies.push_back({modelNode, property}); + } + } + + void operator()(const NodeMetaInfo &, const ModelNode &node) + { + for (const BindingProperty &property : node.bindingProperties()) + filterBindingProperty(property); + } + + void finally() { std::sort(dependencies.begin(), dependencies.end()); } + + BindingDependencies &dependencies; + QHash idModelNodeDict; + QRegularExpression wordsRegex; }; struct TargetFilter @@ -632,7 +701,8 @@ DependenciesSet createDependenciesSet(Model *model) set.targetsDependencies, set.targetsNodesProperties}, StateFilter{stateNames}, - TransitionFilter{set.nodeDependencies, stateNames}); + TransitionFilter{set.nodeDependencies, stateNames}, + BindingFilter{set.bindingDependencies, model}); for (const ModelNode &node : nodes) { auto metaInfo = node.metaInfo(); @@ -647,7 +717,7 @@ DependenciesSet createDependenciesSet(Model *model) using NodeActionsTuple = std::tuple; @@ -672,21 +742,22 @@ void forEachAction(NodeActions &nodeActions, ActionCall actionCall) ModelResourceSet ModelResourceManagement::removeNodes(ModelNodes nodes, Model *model) const { + std::sort(nodes.begin(), nodes.end()); + ModelResourceSet resourceSet; DependenciesSet set = createDependenciesSet(model); - NodeActions nodeActions = {CheckChildNodes{resourceSet, nodeActions}, - CheckNodesInNodeAbstractProperties{resourceSet, nodeActions}, - RemoveLayerEnabled{resourceSet, nodeActions}, - RemoveAliasExports{resourceSet, nodeActions, model->rootModelNode()}, - RemoveDependencies{resourceSet, - nodeActions, - std::move(set.nodeDependencies)}, - RemoveTargetsSources{resourceSet, - nodeActions, - std::move(set.targetsDependencies), - std::move(set.targetsNodesProperties)}}; + NodeActions nodeActions = { + CheckChildNodes{resourceSet, nodeActions}, + CheckNodesInNodeAbstractProperties{resourceSet, nodeActions}, + RemoveLayerEnabled{resourceSet, nodeActions}, + RemoveDependentBindings{resourceSet, nodeActions, std::move(set.bindingDependencies)}, + RemoveDependencies{resourceSet, nodeActions, std::move(set.nodeDependencies)}, + RemoveTargetsSources{resourceSet, + nodeActions, + std::move(set.targetsDependencies), + std::move(set.targetsNodesProperties)}}; Base{resourceSet, nodeActions}.removeNodes(nodes, CheckRecursive::Yes); @@ -698,21 +769,22 @@ ModelResourceSet ModelResourceManagement::removeNodes(ModelNodes nodes, Model *m ModelResourceSet ModelResourceManagement::removeProperties(AbstractProperties properties, Model *model) const { + std::sort(properties.begin(), properties.end()); + ModelResourceSet resourceSet; DependenciesSet set = createDependenciesSet(model); - NodeActions nodeActions = {CheckChildNodes{resourceSet, nodeActions}, - CheckNodesInNodeAbstractProperties{resourceSet, nodeActions}, - RemoveLayerEnabled{resourceSet, nodeActions}, - RemoveAliasExports{resourceSet, nodeActions, model->rootModelNode()}, - RemoveDependencies{resourceSet, - nodeActions, - std::move(set.nodeDependencies)}, - RemoveTargetsSources{resourceSet, - nodeActions, - std::move(set.targetsDependencies), - std::move(set.targetsNodesProperties)}}; + NodeActions nodeActions = { + CheckChildNodes{resourceSet, nodeActions}, + CheckNodesInNodeAbstractProperties{resourceSet, nodeActions}, + RemoveLayerEnabled{resourceSet, nodeActions}, + RemoveDependentBindings{resourceSet, nodeActions, std::move(set.bindingDependencies)}, + RemoveDependencies{resourceSet, nodeActions, std::move(set.nodeDependencies)}, + RemoveTargetsSources{resourceSet, + nodeActions, + std::move(set.targetsDependencies), + std::move(set.targetsNodesProperties)}}; Base{resourceSet, nodeActions}.removeProperties(properties, CheckRecursive::Yes); diff --git a/tests/unit/unittest/modelresourcemanagement-test.cpp b/tests/unit/unittest/modelresourcemanagement-test.cpp index 5b28d1a6393..45382b9f8ab 100644 --- a/tests/unit/unittest/modelresourcemanagement-test.cpp +++ b/tests/unit/unittest/modelresourcemanagement-test.cpp @@ -110,6 +110,16 @@ TEST_F(ModelResourceManagement, RemoveMultipleNodes) ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({node, node2})); } +TEST_F(ModelResourceManagement, RemoveMultipleNodesOnce) +{ + auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); + auto node2 = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); + + auto resources = management.removeNodes({node, node2, node, node2}, &model); + + ASSERT_THAT(resources.removeModelNodes, UnorderedElementsAre(node, node2)); +} + TEST_F(ModelResourceManagement, DontRemoveChildNodes) { auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); @@ -153,51 +163,71 @@ TEST_F(ModelResourceManagement, DontRemovePropertyLayerEnabledIfNotExists) ASSERT_THAT(resources.removeProperties, Not(Contains(layerEnabledProperty))); } -TEST_F(ModelResourceManagement, RemoveAliasExportProperty) +TEST_F(ModelResourceManagement, RemovePropertyWithId) { auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); - auto aliasExportProperty = rootNode.bindingProperty("foo"); - aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); + auto property = rootNode.bindingProperty("foo"); + property.setDynamicTypeNameAndExpression("var", "foo"); auto resources = management.removeNodes({fooNode}, &model); - ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); + ASSERT_THAT(resources.removeProperties, Contains(property)); } -TEST_F(ModelResourceManagement, RemoveAliasForChildExportProperty) -{ - auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); - auto fooNode = createNodeWithParent("QtQuick.Item", node.defaultNodeListProperty(), "foo"); - auto aliasExportProperty = rootNode.bindingProperty("foo"); - aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); - - auto resources = management.removeNodes({node}, &model); - - ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); -} - -TEST_F(ModelResourceManagement, RemoveAliasForGrandChildExportProperty) -{ - auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); - auto childNode = createNodeWithParent("QtQuick.Item", node.defaultNodeListProperty()); - auto fooNode = createNodeWithParent("QtQuick.Item", childNode.defaultNodeListProperty(), "foo"); - auto aliasExportProperty = rootNode.bindingProperty("foo"); - aliasExportProperty.setDynamicTypeNameAndExpression("alias", "foo"); - - auto resources = management.removeNodes({node}, &model); - - ASSERT_THAT(resources.removeProperties, Contains(aliasExportProperty)); -} - -TEST_F(ModelResourceManagement, DontRemoveNonAliasExportProperty) +TEST_F(ModelResourceManagement, RemovePropertyWithIdInComplexExpression) { auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); - auto aliasExportProperty = rootNode.bindingProperty("foo"); - aliasExportProperty.setDynamicTypeNameAndExpression("int", "foo"); + auto foobarProperty = rootNode.bindingProperty("foo"); + foobarProperty.setDynamicTypeNameAndExpression("var", "foo.x+bar.y"); + auto resources = management.removeNodes({fooNode}, &model); + + ASSERT_THAT(resources.removeProperties, Contains(foobarProperty)); +} + +TEST_F(ModelResourceManagement, DontRemovePropertyWithoutId) +{ + auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); + auto barNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "bar"); + auto fooProperty = rootNode.bindingProperty("foo"); + fooProperty.setDynamicTypeNameAndExpression("var", "foo.x"); + + auto resources = management.removeNodes({barNode}, &model); + + ASSERT_THAT(resources.removeProperties, Not(Contains(fooProperty))); +} + +TEST_F(ModelResourceManagement, RemovePropertyWithIdOnce) +{ + auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); + auto barNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "bar"); + auto foobarProperty = rootNode.bindingProperty("foo"); + foobarProperty.setDynamicTypeNameAndExpression("var", "foo.x+bar.y"); + + auto resources = management.removeNodes({fooNode, barNode}, &model); + + ASSERT_THAT(resources.removeProperties, ElementsAre(foobarProperty)); +} + +TEST_F(ModelResourceManagement, RemoveAliasPropertyWithId) +{ + auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); + auto property = rootNode.bindingProperty("foo"); + property.setDynamicTypeNameAndExpression("alias", "foo"); auto resources = management.removeNodes({fooNode}, &model); - ASSERT_THAT(resources.removeProperties, Not(Contains(aliasExportProperty))); + ASSERT_THAT(resources.removeProperties, Contains(property)); +} + +TEST_F(ModelResourceManagement, DontRemovePropertyWithDifferentIdWhichContainsIdString) +{ + auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); + auto property = rootNode.bindingProperty("foo"); + property.setDynamicTypeNameAndExpression("var", "foobar+barfoo"); + + auto resources = management.removeNodes({fooNode}, &model); + + ASSERT_THAT(resources.removeProperties, Not(Contains(property))); } struct TargetData From 69244a7a3aba1f2381655032dff0f36611b9edc8 Mon Sep 17 00:00:00 2001 From: Ali Kianian Date: Tue, 6 Jun 2023 11:15:32 +0300 Subject: [PATCH 061/149] QmlDesigner: Fix the Crash on hovering bake lights icon Task-number: QDS-10043 Change-Id: Ic049f55c6fc7aa86e1b3c1ec036df5cd5f25673e Reviewed-by: Reviewed-by: Marcus Tillmanns --- src/plugins/coreplugin/manhattanstyle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp index 0f16100e11e..e3205dae6d8 100644 --- a/src/plugins/coreplugin/manhattanstyle.cpp +++ b/src/plugins/coreplugin/manhattanstyle.cpp @@ -214,7 +214,7 @@ int ManhattanStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, switch (metric) { #ifdef Q_OS_MACOS case PM_MenuButtonIndicator: - if (widget && option->type == QStyleOption::SO_ToolButton) + if (widget && option && option->type == QStyleOption::SO_ToolButton) return 12; break; #endif From d87e420b39da9f2c055540dbe8ac841982217caf Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Wed, 7 Jun 2023 09:38:20 +0200 Subject: [PATCH 062/149] QmlDesigner: Remove old states editor QML source Task-number: QDS-10037 Change-Id: I3fac32afa35940bd857df04ad5f1a0ba2695401e Reviewed-by: Reviewed-by: Tim Jenssen --- .../statesEditorQmlSources/StatesDelegate.qml | 296 ------------------ .../statesEditorQmlSources/StatesList.qml | 159 ---------- .../images/checkers.png | Bin 80 -> 0 bytes .../Main.qml | 0 .../MenuButton.qml | 0 .../StateMenu.qml | 0 .../StateScrollBar.qml | 0 .../StateThumbnail.qml | 0 .../images/checkers.png | Bin .../imports/StatesEditor/Constants.qml | 0 .../imports/StatesEditor/qmldir | 0 11 files changed, 455 deletions(-) delete mode 100644 share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml delete mode 100644 share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml delete mode 100644 share/qtcreator/qmldesigner/statesEditorQmlSources/images/checkers.png rename share/qtcreator/qmldesigner/{newstateseditor => stateseditor}/Main.qml (100%) rename share/qtcreator/qmldesigner/{newstateseditor => stateseditor}/MenuButton.qml (100%) rename share/qtcreator/qmldesigner/{newstateseditor => stateseditor}/StateMenu.qml (100%) rename share/qtcreator/qmldesigner/{newstateseditor => stateseditor}/StateScrollBar.qml (100%) rename share/qtcreator/qmldesigner/{newstateseditor => stateseditor}/StateThumbnail.qml (100%) rename share/qtcreator/qmldesigner/{newstateseditor => stateseditor}/images/checkers.png (100%) rename share/qtcreator/qmldesigner/{newstateseditor => stateseditor}/imports/StatesEditor/Constants.qml (100%) rename share/qtcreator/qmldesigner/{newstateseditor => stateseditor}/imports/StatesEditor/qmldir (100%) diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml deleted file mode 100644 index 3f42fb75117..00000000000 --- a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright (C) 2020 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtQuickDesignerTheme 1.0 -import HelperWidgets 2.0 -import StudioControls 1.0 as StudioControls -import StudioTheme 1.0 as StudioTheme - -Rectangle { - id: myRoot - - property bool isBaseState - property bool isCurrentState - property string delegateStateName - property string delegateStateImageSource - property bool delegateHasWhenCondition - property string delegateWhenConditionString - property bool hasAnnotation: checkAnnotation() - property int topAreaHeight - property int bottomAreaHeight - property int stateMargin - property int previewMargin - - readonly property bool isDefaultState: isDefault - - property int closeButtonMargin: 6 - property int textFieldMargin: 4 - - property int scrollBarH: 0 - property int listMargin: 0 - - function autoComplete(text, pos, explicitComplete, filter) { - var stringList = statesEditorModel.autoComplete(text, pos, explicitComplete) - return stringList - } - - function checkAnnotation() { - return statesEditorModel.hasAnnotation(internalNodeId) - } - - color: isCurrentState ? StudioTheme.Values.themeInteraction - : StudioTheme.Values.themeControlBackgroundInteraction - MouseArea { - id: mouseArea - anchors.fill: parent - - onClicked: { - focus = true - root.currentStateInternalId = internalNodeId - contextMenu.dismiss() // close potentially open context menu - } - } - - StudioControls.AbstractButton { - id: removeStateButton - - buttonIcon: StudioTheme.Constants.closeCross - - anchors.right: parent.right - anchors.rightMargin: myRoot.closeButtonMargin - anchors.top: parent.top - anchors.topMargin: myRoot.closeButtonMargin - - visible: !isBaseState && isCurrentState - - onClicked: { - if (isDefaultState) - statesEditorModel.resetDefaultState() - - root.deleteState(internalNodeId) - } - } - - StudioControls.Menu { - id: contextMenu - - StudioControls.MenuItem { - enabled: !isBaseState - text: qsTr("Set when Condition") - onTriggered: { - bindingEditor.showWidget() - bindingEditor.text = delegateWhenConditionString - bindingEditor.prepareBindings() - bindingEditor.updateWindowName() - } - } - - StudioControls.MenuItem { - enabled: !isBaseState && delegateHasWhenCondition - text: qsTr("Reset when Condition") - onTriggered: { - statesEditorModel.resetWhenCondition(internalNodeId) - } - } - - StudioControls.MenuItem { - enabled: !isBaseState && !isDefaultState - text: qsTr("Set as Default") - onTriggered: { - statesEditorModel.setStateAsDefault(internalNodeId) - } - } - - StudioControls.MenuItem { - enabled: (!isBaseState && isDefaultState) || (isBaseState && modelHasDefaultState) - text: qsTr("Reset Default") - onTriggered: { - statesEditorModel.resetDefaultState() - } - } - - StudioControls.MenuItem { - enabled: !isBaseState - text: (hasAnnotation ? qsTr("Edit Annotation") - : qsTr("Add Annotation")) - onTriggered: { - statesEditorModel.setAnnotation(internalNodeId) - hasAnnotation = checkAnnotation() - } - } - - StudioControls.MenuItem { - enabled: !isBaseState && hasAnnotation - text: qsTr("Remove Annotation") - onTriggered: { - statesEditorModel.removeAnnotation(internalNodeId) - hasAnnotation = checkAnnotation() - } - } - - onClosed: { - stateNameField.actionIndicator.forceVisible = false - } - - onOpened: { - hasAnnotation = checkAnnotation() - myRoot.delegateInteraction() - } - } - - Column { - id: column - - anchors.margins: myRoot.stateMargin - anchors.fill: parent - - Rectangle { - width: myRoot.width - 2 * myRoot.stateMargin - height: myRoot.topAreaHeight - - color: StudioTheme.Values.themeStateBackground - - StudioControls.TextField { - id: stateNameField - - property string oldValue - - width: StudioTheme.Values.height * 5.5 - - anchors.top: parent.top - anchors.topMargin: myRoot.textFieldMargin - anchors.left: parent.left - anchors.leftMargin: myRoot.textFieldMargin - - translationIndicatorVisible: false - readOnly: isBaseState - - actionIndicator.icon.text: delegateHasWhenCondition - ? StudioTheme.Constants.actionIconBinding - : StudioTheme.Constants.actionIcon - - - actionIndicator.onClicked: { - stateNameField.actionIndicator.forceVisible = true - contextMenu.popup() - } - - onEditChanged: { - if (contextMenu.open && stateNameField.edit) - contextMenu.dismiss() - } - - onActiveFocusChanged: { - if (activeFocus) - root.currentStateInternalId = internalNodeId - } - - onEditingFinished: { - if (stateNameField.oldValue === stateNameField.text) - return - - stateNameField.oldValue = stateNameField.text - - if (stateNameField.text !== myRoot.delegateStateName) - statesEditorModel.renameState(internalNodeId, stateNameField.text) - } - - Component.onCompleted: { - text = myRoot.delegateStateName - } - - //QDS-5649: - Keys.priority: Keys.BeforeItem - Keys.onEscapePressed: function (event) { - event.accepted = true - stateNameField.text = myRoot.delegateStateName - stateNameField.focus = false - } - } - - Text { - id: stateDefaultIndicator - - anchors.right: parent.right - anchors.rightMargin: myRoot.previewMargin - anchors.verticalCenter: stateNameField.verticalCenter - - color: StudioTheme.Values.themeTextColor - font.italic: true - font.pixelSize: StudioTheme.Values.myFontSize - font.family: StudioTheme.Constants.font - - visible: isDefaultState || (isBaseState && !modelHasDefaultState) - - text: qsTr("Default") - } - } - - Rectangle { // separator - width: column.width - height: 2 - color: StudioTheme.Values.themeStateSeparator - } - - Rectangle { - id: stateImageArea - width: myRoot.width - 2 * myRoot.stateMargin - height: myRoot.bottomAreaHeight - color: StudioTheme.Values.themeStateBackground - - Image { - anchors.fill: stateImageBackground - source: "images/checkers.png" - fillMode: Image.Tile - } - - Rectangle { - id: stateImageBackground - anchors.centerIn: parent - width: Math.round(stateImage.paintedWidth) + 2 * StudioTheme.Values.border - height: Math.round(stateImage.paintedHeight) + 2 * StudioTheme.Values.border - color: "transparent" - border.width: StudioTheme.Values.border - border.color: StudioTheme.Values.themeStatePreviewOutline - } - - Image { - id: stateImage - anchors.margins: myRoot.previewMargin - anchors.centerIn: parent - anchors.fill: parent - source: delegateStateImageSource - fillMode: Image.PreserveAspectFit - mipmap: true - } - } - } - - BindingEditor { - id: bindingEditor - - property string newWhenCondition - - property Timer timer: Timer { - id: timer - running: false - interval: 50 - repeat: false - onTriggered: statesEditorModel.setWhenCondition(internalNodeId, bindingEditor.newWhenCondition) - } - - stateModelNodeProperty: statesEditorModel.stateModelNode() - stateNameProperty: myRoot.delegateStateName - - onRejected: { - hideWidget() - } - onAccepted: { - bindingEditor.newWhenCondition = bindingEditor.text.trim() - timer.start() - hideWidget() - } - } -} diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml deleted file mode 100644 index e56d7419099..00000000000 --- a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesList.qml +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (C) 2020 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -import QtQuick 2.15 -import QtQuick.Controls 2.15 -import QtQuickDesignerTheme 1.0 -import Qt.labs.qmlmodels 1.0 -import HelperWidgets 2.0 -import StudioControls 1.0 as StudioControls -import StudioTheme 1.0 as StudioTheme - -FocusScope { - id: root - - readonly property int delegateTopAreaHeight: StudioTheme.Values.height + 8 - readonly property int delegateBottomAreaHeight: delegateHeight - 2 * delegateStateMargin - delegateTopAreaHeight - 2 - readonly property int delegateStateMargin: 16 - readonly property int delegatePreviewMargin: 10 - readonly property int effectiveHeight: root.height < 130 ? 89 : Math.min(root.height, 287) - - readonly property int scrollBarH: statesListView.ScrollBar.horizontal.scrollBarVisible ? StudioTheme.Values.scrollBarThickness : 0 - readonly property int listMargin: 10 - readonly property int delegateWidth: 264 - readonly property int delegateHeight: Math.max(effectiveHeight - scrollBarH - 2 * listMargin, 69) - readonly property int innerSpacing: 2 - - property int currentStateInternalId: 0 - - signal createNewState - signal deleteState(int internalNodeId) - signal duplicateCurrentState - - Connections { - target: statesEditorModel - function onChangedToState(n) { root.currentStateInternalId = n } - } - - Rectangle { - id: background - anchors.fill: parent - color: StudioTheme.Values.themePanelBackground - } - - AbstractButton { - id: addStateButton - - buttonIcon: StudioTheme.Constants.plus - iconFont: StudioTheme.Constants.iconFont - iconSize: StudioTheme.Values.myIconFontSize - tooltip: qsTr("Add a new state.") - visible: canAddNewStates - anchors.right: parent.right - anchors.rightMargin: 4 - anchors.bottom: parent.bottom - anchors.bottomMargin: statesListView.contentWidth - statesListView.contentX - root.delegateWidth / 2 > statesListView.width ? scrollBarH + 5 : -35 - width: 35 - height: 35 - - Behavior on anchors.bottomMargin { - PropertyAnimation { - duration: 700 - easing.type: Easing.InOutBack - } - } - - onClicked: root.createNewState() - } - - ListView { - id: statesListView - - clip: true - anchors.fill: parent - anchors.topMargin: listMargin - anchors.leftMargin: listMargin - anchors.rightMargin: listMargin - - model: statesEditorModel - orientation: ListView.Horizontal - spacing: root.innerSpacing - - property int prevCount: 0 - onCountChanged: { - if (count > prevCount) - Qt.callLater(statesListView.positionViewAtEnd) - prevCount = count - } - - delegate: DelegateChooser { - role: "type" - - DelegateChoice { - roleValue: "state" - - StatesDelegate { - width: root.delegateWidth - height: root.delegateHeight - anchors.verticalCenter: parent ? parent.verticalCenter : undefined - anchors.verticalCenterOffset: -.5 * (scrollBarH + listMargin) - isBaseState: 0 === internalNodeId - isCurrentState: root.currentStateInternalId === internalNodeId - delegateStateName: stateName - delegateStateImageSource: stateImageSource - delegateHasWhenCondition: hasWhenCondition - delegateWhenConditionString: whenConditionString - - topAreaHeight: root.delegateTopAreaHeight - bottomAreaHeight: root.delegateBottomAreaHeight - stateMargin: root.delegateStateMargin - previewMargin: root.delegatePreviewMargin - scrollBarH: root.scrollBarH - listMargin: root.listMargin - } - } - - DelegateChoice { - roleValue: "add" - - Rectangle { - visible: canAddNewStates - - width: root.delegateWidth - height: root.delegateHeight - anchors.verticalCenter: parent ? parent.verticalCenter : undefined - anchors.verticalCenterOffset: -.5 * (scrollBarH + listMargin) - color: Qt.lighter(StudioTheme.Values.themeControlBackgroundInteraction, addState.containsMouse ? 1.5 : 1) - - ToolTip.text: qsTr("Add a new state.") - ToolTip.visible: addState.containsMouse - ToolTip.delay: 1000 - - Rectangle { // inner rect - width: parent.width - 30 - height: parent.height - 30 - anchors.centerIn: parent - color: StudioTheme.Values.themeStateBackground - } - - Text { - text: "+" - anchors.centerIn: parent - anchors.verticalCenterOffset: -(5 + (font.pixelSize - 35) / 9) - font.pixelSize: parent.height * .5 - color: Qt.lighter(StudioTheme.Values.themeControlBackgroundInteraction, addState.containsMouse ? 1.5 : 1) - } - - MouseArea { - id: addState - hoverEnabled: true - anchors.fill: parent - onClicked: root.createNewState() - } - } - } - } - - ScrollBar.horizontal: HorizontalScrollBar {} - } -} diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/images/checkers.png b/share/qtcreator/qmldesigner/statesEditorQmlSources/images/checkers.png deleted file mode 100644 index 72cb9f0350646967cbd0bdc5c69981796f43a2dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80 zcmeAS@N?(olHy`uVBq!ia0y~yVBi5^4h9AWhGIEpYX$}eaZeY=5RT~N3Kq8i2OAob f_*$Ac0?#lqSbc8ylogof3sUOo>gTe~DWM4fJ|+>W diff --git a/share/qtcreator/qmldesigner/newstateseditor/Main.qml b/share/qtcreator/qmldesigner/stateseditor/Main.qml similarity index 100% rename from share/qtcreator/qmldesigner/newstateseditor/Main.qml rename to share/qtcreator/qmldesigner/stateseditor/Main.qml diff --git a/share/qtcreator/qmldesigner/newstateseditor/MenuButton.qml b/share/qtcreator/qmldesigner/stateseditor/MenuButton.qml similarity index 100% rename from share/qtcreator/qmldesigner/newstateseditor/MenuButton.qml rename to share/qtcreator/qmldesigner/stateseditor/MenuButton.qml diff --git a/share/qtcreator/qmldesigner/newstateseditor/StateMenu.qml b/share/qtcreator/qmldesigner/stateseditor/StateMenu.qml similarity index 100% rename from share/qtcreator/qmldesigner/newstateseditor/StateMenu.qml rename to share/qtcreator/qmldesigner/stateseditor/StateMenu.qml diff --git a/share/qtcreator/qmldesigner/newstateseditor/StateScrollBar.qml b/share/qtcreator/qmldesigner/stateseditor/StateScrollBar.qml similarity index 100% rename from share/qtcreator/qmldesigner/newstateseditor/StateScrollBar.qml rename to share/qtcreator/qmldesigner/stateseditor/StateScrollBar.qml diff --git a/share/qtcreator/qmldesigner/newstateseditor/StateThumbnail.qml b/share/qtcreator/qmldesigner/stateseditor/StateThumbnail.qml similarity index 100% rename from share/qtcreator/qmldesigner/newstateseditor/StateThumbnail.qml rename to share/qtcreator/qmldesigner/stateseditor/StateThumbnail.qml diff --git a/share/qtcreator/qmldesigner/newstateseditor/images/checkers.png b/share/qtcreator/qmldesigner/stateseditor/images/checkers.png similarity index 100% rename from share/qtcreator/qmldesigner/newstateseditor/images/checkers.png rename to share/qtcreator/qmldesigner/stateseditor/images/checkers.png diff --git a/share/qtcreator/qmldesigner/newstateseditor/imports/StatesEditor/Constants.qml b/share/qtcreator/qmldesigner/stateseditor/imports/StatesEditor/Constants.qml similarity index 100% rename from share/qtcreator/qmldesigner/newstateseditor/imports/StatesEditor/Constants.qml rename to share/qtcreator/qmldesigner/stateseditor/imports/StatesEditor/Constants.qml diff --git a/share/qtcreator/qmldesigner/newstateseditor/imports/StatesEditor/qmldir b/share/qtcreator/qmldesigner/stateseditor/imports/StatesEditor/qmldir similarity index 100% rename from share/qtcreator/qmldesigner/newstateseditor/imports/StatesEditor/qmldir rename to share/qtcreator/qmldesigner/stateseditor/imports/StatesEditor/qmldir From 5d8bbe6f5dd8d5e4a1adddfd693c686fe5f719fc Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 6 Jun 2023 17:11:01 +0300 Subject: [PATCH 063/149] QmlDesigner: Cache graphics pipeline in puppet Caching the graphics pipeline to disk improves puppet reset speed somewhat when there are complicated 3d scenes. Task-number: QTBUG-103802 Change-Id: I49b4f1031ab79bb5f660578e3d82806675f468dc Reviewed-by: Mahmoud Badri Reviewed-by: --- .../qt5informationnodeinstanceserver.cpp | 11 +++ .../instances/qt5nodeinstanceserver.cpp | 67 ++++++++++++++++++- .../instances/qt5nodeinstanceserver.h | 5 ++ 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 0d7b4fa215c..01d5fcd4f60 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -179,6 +179,7 @@ void Qt5InformationNodeInstanceServer::createAuxiliaryQuickView(const QUrl &url, #else viewData.renderControl = new QQuickRenderControl; viewData.window = new QQuickWindow(viewData.renderControl); + setPipelineCacheConfig(viewData.window); viewData.renderControl->initialize(); #endif QQmlComponent component(engine()); @@ -1130,6 +1131,16 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView() m_render3DEditViewTimer.start(17); // 16.67ms = ~60fps, rounds up to 17 --m_need3DEditViewRender; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 1) + else { + static bool pipelineSaved = false; + if (!pipelineSaved) { + // Store pipeline cache for quicker initialization in future + savePipelineCacheData(); + pipelineSaved = true; + } + } +#endif #ifdef FPS_COUNTER // Force constant rendering for accurate fps count diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index 74481d150fc..e5cda877894 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -41,6 +41,14 @@ #include #endif +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 1) +#include +#include +#include +#include +#include +#endif + namespace QmlDesigner { Qt5NodeInstanceServer::Qt5NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) @@ -90,6 +98,7 @@ void Qt5NodeInstanceServer::initializeView() #else m_viewData.renderControl = new QQuickRenderControl; m_viewData.window = new QQuickWindow(m_viewData.renderControl); + setPipelineCacheConfig(m_viewData.window); m_viewData.renderControl->initialize(); m_qmlEngine = new QQmlEngine; #endif @@ -160,6 +169,20 @@ void Qt5NodeInstanceServer::setupScene(const CreateSceneCommand &command) setupInstances(command); resizeCanvasToRootItem(); + +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 1) + if (!m_pipelineCacheLocation.isEmpty()) { + QString fileId = command.fileUrl.toLocalFile(); + fileId.remove(':'); + fileId.remove('/'); + fileId.remove('.'); + m_pipelineCacheFile = QStringLiteral("%1/%2").arg(m_pipelineCacheLocation, fileId); + + QFile cacheFile(m_pipelineCacheFile); + if (cacheFile.open(QIODevice::ReadOnly)) + m_pipelineCacheData = cacheFile.readAll(); + } +#endif } QList subItems(QQuickItem *parentItem) @@ -185,7 +208,45 @@ const QList Qt5NodeInstanceServer::allItems() const bool Qt5NodeInstanceServer::rootIsRenderable3DObject() const { return rootNodeInstance().isSubclassOf("QQuick3DNode") - || rootNodeInstance().isSubclassOf("QQuick3DMaterial"); + || rootNodeInstance().isSubclassOf("QQuick3DMaterial"); +} + +void Qt5NodeInstanceServer::savePipelineCacheData() +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 1) + if (!m_viewData.rhi) + return; + + const QByteArray pipelineData = m_viewData.rhi->pipelineCacheData(); + + if (pipelineData.isEmpty()) + return; + + m_pipelineCacheData = pipelineData; + + QTimer::singleShot(0, this, [this]() { + QFile file(m_pipelineCacheFile); + if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + file.write(m_pipelineCacheData); + }); +#endif +} + +void Qt5NodeInstanceServer::setPipelineCacheConfig(QQuickWindow *w) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 1) + // This dummy file is not actually used for cache as we manage cache save/load ourselves, + // but some file needs to be set to enable pipeline caching + const QString cachePath = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); + m_pipelineCacheLocation = QStringLiteral("%1/%2").arg(cachePath, "pipecache"); + QDir(m_pipelineCacheLocation).mkpath("."); + const QString dummyCache = m_pipelineCacheLocation + "/dummycache"; + + QQuickGraphicsConfiguration config = w->graphicsConfiguration(); + config.setPipelineCacheSaveFile(dummyCache); + config.setAutomaticPipelineCache(false); + w->setGraphicsConfiguration(config); +#endif } bool Qt5NodeInstanceServer::initRhi([[maybe_unused]] RenderViewData &viewData) @@ -204,6 +265,10 @@ bool Qt5NodeInstanceServer::initRhi([[maybe_unused]] RenderViewData &viewData) qWarning() << __FUNCTION__ << "Rhi is null"; return false; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 1) + if (!m_pipelineCacheData.isEmpty()) + viewData.rhi->setPipelineCacheData(m_pipelineCacheData); +#endif } auto cleanRhiResources = [&viewData]() { diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h index ccbcc5c1e39..b76e639897a 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h @@ -59,6 +59,8 @@ protected: void setupScene(const CreateSceneCommand &command) override; const QList allItems() const; bool rootIsRenderable3DObject() const; + void savePipelineCacheData(); + void setPipelineCacheConfig(QQuickWindow *w); struct RenderViewData { QPointer window = nullptr; @@ -80,6 +82,9 @@ protected: private: RenderViewData m_viewData; + QByteArray m_pipelineCacheData; + QString m_pipelineCacheLocation; + QString m_pipelineCacheFile; std::unique_ptr m_designerSupport; QQmlEngine *m_qmlEngine = nullptr; }; From dd7027e30e2290f45c029e0704f5c2fb68bd2f11 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 7 Jun 2023 12:33:22 +0200 Subject: [PATCH 064/149] QmlDesigner: Improve internal property Remove useless lookups and make the code more clear. An enumeration instead of virtual functions defines now the property type. Change-Id: I5dc8704bdb24553e7b9c818562ea1c8de8ae2153 Reviewed-by: Vikas Pachdha --- .../designercore/include/abstractproperty.h | 4 +- .../designercore/model/abstractproperty.cpp | 16 ++- .../designercore/model/bindingproperty.cpp | 34 +++-- .../model/internalbindingproperty.cpp | 10 +- .../model/internalbindingproperty.h | 4 +- .../designercore/model/internalnode.cpp | 119 ++---------------- .../designercore/model/internalnode_p.h | 118 +++++++++++++---- .../model/internalnodeabstractproperty.cpp | 11 +- .../model/internalnodeabstractproperty.h | 6 +- .../model/internalnodelistproperty.cpp | 10 +- .../model/internalnodelistproperty.h | 3 +- .../model/internalnodeproperty.cpp | 10 +- .../designercore/model/internalnodeproperty.h | 2 +- .../designercore/model/internalproperty.cpp | 90 +------------ .../designercore/model/internalproperty.h | 97 +++++++++++--- .../model/internalsignalhandlerproperty.cpp | 23 ++-- .../model/internalsignalhandlerproperty.h | 7 +- .../model/internalvariantproperty.cpp | 10 +- .../model/internalvariantproperty.h | 4 +- .../qmldesigner/designercore/model/model.cpp | 5 +- .../model/nodeabstractproperty.cpp | 5 +- .../designercore/model/nodelistproperty.cpp | 12 +- .../designercore/model/nodeproperty.cpp | 17 ++- .../model/signalhandlerproperty.cpp | 30 +++-- .../designercore/model/variantproperty.cpp | 45 +++---- 25 files changed, 309 insertions(+), 383 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/abstractproperty.h b/src/plugins/qmldesigner/designercore/include/abstractproperty.h index d3f8c59ffe4..6074858265a 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/abstractproperty.h @@ -79,6 +79,8 @@ public: bool isSignalHandlerProperty() const; bool isSignalDeclarationProperty() const; + PropertyType type() const; + bool isDynamic() const; TypeName dynamicTypeName() const; @@ -124,7 +126,7 @@ public: protected: AbstractProperty(const PropertyName &propertyName, const Internal::InternalNodePointer &internalNode, Model* model, AbstractView *view); AbstractProperty(const Internal::InternalPropertyPointer &property, Model* model, AbstractView *view); - Internal::InternalNodePointer internalNode() const; + Internal::InternalNodePointer internalNode() const { return m_internalNode; } Internal::ModelPrivate *privateModel() const; private: diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index 108dea7b038..e2e5800cab3 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -51,11 +51,6 @@ AbstractProperty::AbstractProperty(const AbstractProperty &property, AbstractVie AbstractProperty::~AbstractProperty() = default; -Internal::InternalNodePointer AbstractProperty::internalNode() const -{ - return m_internalNode; -} - Internal::ModelPrivate *AbstractProperty::privateModel() const { return m_model ? m_model->d.get() : nullptr; @@ -295,6 +290,17 @@ bool AbstractProperty::isSignalDeclarationProperty() const return false; } +PropertyType AbstractProperty::type() const +{ + if (!isValid()) + return PropertyType::None; + + if (internalNode()->hasProperty(name())) + return internalNode()->property(name())->propertyType(); + + return PropertyType::None; +} + bool AbstractProperty::isBindingProperty() const { if (!isValid()) diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index 5381ecf4b8e..30f8d50fd4c 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -48,16 +48,15 @@ void BindingProperty::setExpression(const QString &expression) if (expression.isEmpty()) return; - if (internalNode()->hasProperty(name())) { //check if oldValue != value - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isBindingProperty() - && internalProperty->toBindingProperty()->expression() == expression) - + if (auto internalProperty = internalNode()->property(name())) { + auto bindingProperty = internalProperty->to(); + //check if oldValue != value + if (bindingProperty && bindingProperty->expression() == expression) return; - } - if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isBindingProperty()) - privateModel()->removePropertyAndRelatedResources(internalNode()->property(name())); + if (!bindingProperty) + privateModel()->removePropertyAndRelatedResources(internalProperty); + } privateModel()->setBindingProperty(internalNode(), name(), expression); } @@ -340,20 +339,19 @@ void BindingProperty::setDynamicTypeNameAndExpression(const TypeName &typeName, if (typeName.isEmpty()) return; - if (internalNode()->hasProperty(name())) { //check if oldValue != value - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isBindingProperty() - && internalProperty->toBindingProperty()->expression() == expression - && internalProperty->toBindingProperty()->dynamicTypeName() == typeName) { - + if (auto internalProperty = internalNode()->property(name())) { + auto bindingProperty = internalProperty->to(); + //check if oldValue != value + if (bindingProperty && bindingProperty->expression() == expression + && internalProperty->dynamicTypeName() == typeName) { return; } + + if (!bindingProperty) + privateModel()->removePropertyAndRelatedResources(internalProperty); } - if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isBindingProperty()) - privateModel()->removePropertyAndRelatedResources(internalNode()->property(name())); - - privateModel()->setDynamicBindingProperty(internalNode(), name(), typeName, expression); + privateModel()->setDynamicBindingProperty(internalNode(), name(), typeName, expression); } QDebug operator<<(QDebug debug, const BindingProperty &property) diff --git a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp index 3ac5b112bf9..6a3eee19753 100644 --- a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp @@ -6,8 +6,9 @@ namespace QmlDesigner { namespace Internal { -InternalBindingProperty::InternalBindingProperty(const PropertyName &name, const InternalNodePointer &propertyOwner) - : InternalProperty(name, propertyOwner) +InternalBindingProperty::InternalBindingProperty(const PropertyName &name, + const InternalNodePointer &propertyOwner) + : InternalProperty(name, propertyOwner, PropertyType::Binding) { } @@ -25,11 +26,6 @@ void InternalBindingProperty::setExpression(const QString &expression) m_expression = expression; } -bool InternalBindingProperty::isBindingProperty() const -{ - return true; -} - void InternalBindingProperty::setDynamicExpression(const TypeName &type, const QString &expression) { setExpression(expression); diff --git a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h index 3645839eb94..9ad0e19fc9e 100644 --- a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h @@ -12,6 +12,8 @@ class InternalBindingProperty : public InternalProperty { public: using Pointer = std::shared_ptr; + static constexpr PropertyType type = PropertyType::Binding; + InternalBindingProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); bool isValid() const override; @@ -21,8 +23,6 @@ public: void setDynamicExpression(const TypeName &type, const QString &expression); - bool isBindingProperty() const override; - protected: private: diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 705b405a55d..0c81d2ab28f 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -1,11 +1,14 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +#include "internalbindingproperty.h" #include "internalnode_p.h" -#include "internalproperty.h" -#include "internalvariantproperty.h" -#include "internalnodeproperty.h" +#include "internalnodeabstractproperty.h" #include "internalnodelistproperty.h" +#include "internalnodeproperty.h" +#include "internalproperty.h" +#include "internalsignalhandlerproperty.h" +#include "internalvariantproperty.h" #include @@ -111,111 +114,6 @@ AuxiliaryDatasForType InternalNode::auxiliaryData(AuxiliaryDataType type) const return data; } -InternalProperty::Pointer InternalNode::property(const PropertyName &name) const -{ - return m_namePropertyHash.value(name); -} - -InternalBindingProperty::Pointer InternalNode::bindingProperty(const PropertyName &name) const -{ - InternalProperty::Pointer property = m_namePropertyHash.value(name); - if (property && property->isBindingProperty()) - return std::static_pointer_cast(property); - - return InternalBindingProperty::Pointer(); -} - -InternalSignalHandlerProperty::Pointer InternalNode::signalHandlerProperty(const PropertyName &name) const -{ - InternalProperty::Pointer property = m_namePropertyHash.value(name); - if (property->isSignalHandlerProperty()) - return std::static_pointer_cast(property); - - return InternalSignalHandlerProperty::Pointer(); -} - -InternalSignalDeclarationProperty::Pointer InternalNode::signalDeclarationProperty(const PropertyName &name) const -{ - InternalProperty::Pointer property = m_namePropertyHash.value(name); - if (property->isSignalDeclarationProperty()) - return std::static_pointer_cast(property); - - return InternalSignalDeclarationProperty::Pointer(); -} - -InternalVariantProperty::Pointer InternalNode::variantProperty(const PropertyName &name) const -{ - InternalProperty::Pointer property = m_namePropertyHash.value(name); - if (property->isVariantProperty()) - return std::static_pointer_cast(property); - - return InternalVariantProperty::Pointer(); -} - -void InternalNode::addBindingProperty(const PropertyName &name) -{ - auto newProperty = std::make_shared(name, shared_from_this()); - m_namePropertyHash.insert(name, newProperty); -} - -void InternalNode::addSignalHandlerProperty(const PropertyName &name) -{ - auto newProperty = std::make_shared(name, shared_from_this()); - m_namePropertyHash.insert(name, newProperty); -} - -void InternalNode::addSignalDeclarationProperty(const PropertyName &name) -{ - auto newProperty = std::make_shared(name, shared_from_this()); - m_namePropertyHash.insert(name, newProperty); -} - -InternalNodeListProperty::Pointer InternalNode::nodeListProperty(const PropertyName &name) const -{ - auto property = m_namePropertyHash.value(name); - if (property && property->isNodeListProperty()) - return std::static_pointer_cast(property); - - return {}; -} - -InternalNodeAbstractProperty::Pointer InternalNode::nodeAbstractProperty(const PropertyName &name) const -{ - InternalProperty::Pointer property = m_namePropertyHash.value(name); - if (property && property->isNodeAbstractProperty()) - return std::static_pointer_cast(property); - - return {}; -} - -InternalNodeProperty::Pointer InternalNode::nodeProperty(const PropertyName &name) const -{ - InternalProperty::Pointer property = m_namePropertyHash.value(name); - if (property->isNodeProperty()) - return std::static_pointer_cast(property); - - return {}; -} - -void InternalNode::addVariantProperty(const PropertyName &name) -{ - auto newProperty = std::make_shared(name, shared_from_this()); - m_namePropertyHash.insert(name, newProperty); -} - -void InternalNode::addNodeProperty(const PropertyName &name, const TypeName &dynamicTypeName) -{ - auto newProperty = std::make_shared(name, shared_from_this()); - newProperty->setDynamicTypeName(dynamicTypeName); - m_namePropertyHash.insert(name, newProperty); -} - -void InternalNode::addNodeListProperty(const PropertyName &name) -{ - auto newProperty = std::make_shared(name, shared_from_this()); - m_namePropertyHash.insert(name, newProperty); -} - void InternalNode::removeProperty(const PropertyName &name) { InternalProperty::Pointer property = m_namePropertyHash.take(name); @@ -248,13 +146,12 @@ QList InternalNode::nodeAbstractPropertyL const QList properties = propertyList(); for (const InternalProperty::Pointer &property : properties) { if (property->isNodeAbstractProperty()) - abstractPropertyList.append(property->toNodeAbstractProperty()); + abstractPropertyList.append(property->toProperty()); } return abstractPropertyList; } - QList InternalNode::allSubNodes() const { QList nodeList; @@ -278,4 +175,4 @@ QList InternalNode::allDirectSubNodes() const } } // namespace Internal -} +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 7af01f5ae99..3e72296c01f 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -44,8 +44,7 @@ public: using Pointer = std::shared_ptr; using WeakPointer = std::weak_ptr; - explicit InternalNode() = default; - + InternalNode() = default; explicit InternalNode(TypeName typeName, int majorVersion, int minorVersion, qint32 internalId) : typeName(std::move(typeName)) , majorVersion(majorVersion) @@ -67,21 +66,100 @@ public: AuxiliaryDatasForType auxiliaryData(AuxiliaryDataType type) const; AuxiliaryDatasView auxiliaryData() const { return std::as_const(m_auxiliaryDatas); } - InternalProperty::Pointer property(const PropertyName &name) const; - InternalBindingProperty::Pointer bindingProperty(const PropertyName &name) const; - InternalSignalHandlerProperty::Pointer signalHandlerProperty(const PropertyName &name) const; - InternalSignalDeclarationProperty::Pointer signalDeclarationProperty(const PropertyName &name) const; - InternalVariantProperty::Pointer variantProperty(const PropertyName &name) const; - InternalNodeListProperty::Pointer nodeListProperty(const PropertyName &name) const; - InternalNodeAbstractProperty::Pointer nodeAbstractProperty(const PropertyName &name) const; - InternalNodeProperty::Pointer nodeProperty(const PropertyName &name) const; + template + typename Type::Pointer property(const PropertyName &name) const + { + auto property = m_namePropertyHash.value(name); + if (property && property->propertyType() == Type::type) + return std::static_pointer_cast(property); - void addBindingProperty(const PropertyName &name); - void addSignalHandlerProperty(const PropertyName &name); - void addSignalDeclarationProperty(const PropertyName &name); - void addNodeListProperty(const PropertyName &name); - void addVariantProperty(const PropertyName &name); - void addNodeProperty(const PropertyName &name, const TypeName &dynamicTypeName); + return {}; + } + + InternalProperty::Pointer property(const PropertyName &name) const + { + return m_namePropertyHash.value(name); + } + + auto bindingProperty(const PropertyName &name) const + { + return property(name); + } + + auto signalHandlerProperty(const PropertyName &name) const + { + return property(name); + } + + auto signalDeclarationProperty(const PropertyName &name) const + { + return property(name); + } + + auto variantProperty(const PropertyName &name) const + { + return property(name); + } + + auto nodeListProperty(const PropertyName &name) const + { + return property(name); + } + + InternalNodeAbstractProperty::Pointer nodeAbstractProperty(const PropertyName &name) const + { + auto property = m_namePropertyHash.value(name); + if (property->propertyType() == PropertyType::NodeList + || property->propertyType() == PropertyType::Node) { + return std::static_pointer_cast(property); + } + return {}; + } + + InternalNodeProperty::Pointer nodeProperty(const PropertyName &name) const + { + return property(name); + } + + template + auto &addProperty(const PropertyName &name) + { + auto newProperty = std::make_shared(name, shared_from_this()); + auto inserted = m_namePropertyHash.insert(name, std::move(newProperty)); + + return *inserted->get(); + } + + void addBindingProperty(const PropertyName &name) + { + addProperty(name); + } + + void addSignalHandlerProperty(const PropertyName &name) + { + addProperty(name); + } + + void addSignalDeclarationProperty(const PropertyName &name) + { + addProperty(name); + } + + void addNodeListProperty(const PropertyName &name) + { + addProperty(name); + } + + void addVariantProperty(const PropertyName &name) + { + addProperty(name); + } + + void addNodeProperty(const PropertyName &name, const TypeName &dynamicTypeName) + { + auto &property = addProperty(name); + property.setDynamicTypeName(dynamicTypeName); + } PropertyNameList propertyNameList() const; @@ -105,13 +183,7 @@ public: return firstNode->internalId < secondNode->internalId; } - friend size_t qHash(const InternalNodePointer &node) - { - if (!node) - return ::qHash(-1); - - return ::qHash(node->internalId); - } + friend size_t qHash(const InternalNodePointer &node) { return ::qHash(node.get()); } protected: void removeProperty(const PropertyName &name); diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.cpp index e2b753604f7..6dff33436e4 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.cpp @@ -7,16 +7,13 @@ namespace QmlDesigner { namespace Internal { -InternalNodeAbstractProperty::InternalNodeAbstractProperty(const PropertyName &name, const InternalNode::Pointer &propertyOwner) - : InternalProperty(name, propertyOwner) +InternalNodeAbstractProperty::InternalNodeAbstractProperty(const PropertyName &name, + const InternalNode::Pointer &propertyOwner, + PropertyType propertyType) + : InternalProperty(name, propertyOwner, propertyType) { } -bool InternalNodeAbstractProperty::isNodeAbstractProperty() const -{ - return true; -} - bool InternalNodeAbstractProperty::isValid() const { return InternalProperty::isValid() && isNodeAbstractProperty(); diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h index d3320c5487d..72e01d019b2 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h @@ -17,8 +17,6 @@ public: using Pointer = std::shared_ptr; using WeakPointer = std::weak_ptr; - bool isNodeAbstractProperty() const override; - virtual QList allSubNodes() const = 0; virtual QList directSubNodes() const = 0; @@ -31,7 +29,9 @@ public: using InternalProperty::remove; // keep the virtual remove(...) function around protected: - InternalNodeAbstractProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); + InternalNodeAbstractProperty(const PropertyName &name, + const InternalNodePointer &propertyOwner, + PropertyType propertyType); virtual void remove(const InternalNodePointer &node) = 0; virtual void add(const InternalNodePointer &node) = 0; }; diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp index 1889145751f..8c8b1c73e59 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp @@ -8,8 +8,9 @@ namespace QmlDesigner { namespace Internal { -InternalNodeListProperty::InternalNodeListProperty(const PropertyName &name, const InternalNodePointer &propertyOwner) - : InternalNodeAbstractProperty(name, propertyOwner) +InternalNodeListProperty::InternalNodeListProperty(const PropertyName &name, + const InternalNodePointer &propertyOwner) + : InternalNodeAbstractProperty(name, propertyOwner, PropertyType::NodeList) { } @@ -36,11 +37,6 @@ int InternalNodeListProperty::indexOf(const InternalNode::Pointer &node) const return m_nodeList.indexOf(node); } -bool InternalNodeListProperty::isNodeListProperty() const -{ - return true; -} - void InternalNodeListProperty::add(const InternalNode::Pointer &internalNode) { Q_ASSERT(!m_nodeList.contains(internalNode)); diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h index 8998f9c7ce7..72ab08ae74a 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h @@ -15,6 +15,7 @@ class InternalNodeListProperty final : public InternalNodeAbstractProperty { public: using Pointer = std::shared_ptr; + static constexpr PropertyType type = PropertyType::NodeList; InternalNodeListProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); @@ -43,8 +44,6 @@ public: return *found; } - bool isNodeListProperty() const override; - QList allSubNodes() const override; QList directSubNodes() const override; const QList &nodeList() const; diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp index b5811325db5..0dd286e765e 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp @@ -7,8 +7,9 @@ namespace QmlDesigner { namespace Internal { -InternalNodeProperty::InternalNodeProperty(const PropertyName &name, const InternalNode::Pointer &propertyOwner) - : InternalNodeAbstractProperty(name, propertyOwner) +InternalNodeProperty::InternalNodeProperty(const PropertyName &name, + const InternalNode::Pointer &propertyOwner) + : InternalNodeAbstractProperty(name, propertyOwner, PropertyType::Node) { } @@ -38,11 +39,6 @@ bool InternalNodeProperty::isValid() const return InternalProperty::isValid() && isNodeProperty(); } -bool InternalNodeProperty::isNodeProperty() const -{ - return true; -} - InternalNode::Pointer InternalNodeProperty::node() const { return m_node; diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h index deb9ee08120..65b9b895e8a 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h @@ -12,6 +12,7 @@ class InternalNodeProperty : public InternalNodeAbstractProperty { public: using Pointer = std::shared_ptr; + static constexpr PropertyType type = PropertyType::Node; InternalNodeProperty(const PropertyName &name, const InternalNodePointer &node); @@ -19,7 +20,6 @@ public: bool isEmpty() const override; int count() const override; int indexOf(const InternalNodePointer &node) const override; - bool isNodeProperty() const override; QList allSubNodes() const override; QList directSubNodes() const override; diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp index b382f096c73..076c14fa9b6 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp @@ -18,11 +18,13 @@ InternalProperty::InternalProperty() = default; InternalProperty::~InternalProperty() = default; -InternalProperty::InternalProperty(const PropertyName &name, const InternalNode::Pointer &propertyOwner) - : m_name(name), - m_propertyOwner(propertyOwner) +InternalProperty::InternalProperty(const PropertyName &name, + const InternalNode::Pointer &propertyOwner, + PropertyType propertyType) + : m_name(name) + , m_propertyOwner(propertyOwner) + , m_propertyType{propertyType} { - Q_ASSERT_X(!name.isEmpty(), Q_FUNC_INFO, "Name of property cannot be empty"); } bool InternalProperty::isValid() const @@ -35,90 +37,11 @@ PropertyName InternalProperty::name() const return m_name; } -bool InternalProperty::isBindingProperty() const -{ - return false; -} - -bool InternalProperty::isVariantProperty() const -{ - return false; -} - -std::shared_ptr InternalProperty::toBindingProperty() -{ - Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); - return std::static_pointer_cast(shared_from_this()); -} - - -bool InternalProperty::isNodeListProperty() const -{ - return false; -} - -bool InternalProperty::isNodeProperty() const -{ - return false; -} - -bool InternalProperty::isNodeAbstractProperty() const -{ - return false; -} - -bool InternalProperty::isSignalHandlerProperty() const -{ - return false; -} - -bool InternalProperty::isSignalDeclarationProperty() const -{ - return false; -} - -std::shared_ptr InternalProperty::toVariantProperty() - -{ - Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); - return std::static_pointer_cast(shared_from_this()); -} - InternalNode::Pointer InternalProperty::propertyOwner() const { return m_propertyOwner.lock(); } -std::shared_ptr InternalProperty::toNodeListProperty() -{ - Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); - return std::static_pointer_cast(shared_from_this()); -} - -std::shared_ptr InternalProperty::toNodeProperty() -{ - Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); - return std::static_pointer_cast(shared_from_this()); -} - -std::shared_ptr InternalProperty::toNodeAbstractProperty() -{ - Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); - return std::static_pointer_cast(shared_from_this()); -} - -std::shared_ptr InternalProperty::toSignalHandlerProperty() -{ - Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); - return std::static_pointer_cast(shared_from_this()); -} - -std::shared_ptr InternalProperty::toSignalDeclarationProperty() -{ - Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); - return std::static_pointer_cast(shared_from_this()); -} - void InternalProperty::remove() { propertyOwner()->removeProperty(name()); @@ -135,7 +58,6 @@ void InternalProperty::setDynamicTypeName(const TypeName &name) m_dynamicType = name; } - void InternalProperty::resetDynamicTypeName() { m_dynamicType.clear(); diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.h b/src/plugins/qmldesigner/designercore/model/internalproperty.h index cd9bad8847f..1f24b825093 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.h @@ -6,7 +6,6 @@ #include "qmldesignercorelib_global.h" #include -#include #include @@ -25,9 +24,54 @@ class InternalNode; using InternalNodePointer = std::shared_ptr; +template +struct TypeLookup +{}; + +template<> +struct TypeLookup +{ + using Type = InternalBindingProperty; +}; + +template<> +struct TypeLookup +{ + using Type = InternalNodeProperty; +}; + +template<> +struct TypeLookup +{ + using Type = InternalNodeListProperty; +}; + +template<> +struct TypeLookup +{}; + +template<> +struct TypeLookup +{ + using Type = InternalSignalDeclarationProperty; +}; + +template<> +struct TypeLookup +{ + using Type = InternalSignalHandlerProperty; +}; + +template<> +struct TypeLookup +{ + using Type = InternalVariantProperty; +}; + class QMLDESIGNERCORE_EXPORT InternalProperty : public std::enable_shared_from_this { public: + friend InternalNode; using Pointer = std::shared_ptr; InternalProperty(); @@ -37,21 +81,37 @@ public: PropertyName name() const; - virtual bool isBindingProperty() const; - virtual bool isVariantProperty() const; - virtual bool isNodeListProperty() const; - virtual bool isNodeProperty() const; - virtual bool isNodeAbstractProperty() const; - virtual bool isSignalHandlerProperty() const; - virtual bool isSignalDeclarationProperty() const; + bool isBindingProperty() const { return m_propertyType == PropertyType::Binding; } + bool isVariantProperty() const { return m_propertyType == PropertyType::Variant; } + bool isNodeListProperty() const { return m_propertyType == PropertyType::NodeList; } + bool isNodeProperty() const { return m_propertyType == PropertyType::Node; } + bool isNodeAbstractProperty() const + { + return m_propertyType == PropertyType::Node || m_propertyType == PropertyType::NodeList; + } + bool isSignalHandlerProperty() const { return m_propertyType == PropertyType::SignalHandler; } + bool isSignalDeclarationProperty() const + { + return m_propertyType == PropertyType::SignalDeclaration; + } + PropertyType propertyType() const { return m_propertyType; } - std::shared_ptr toBindingProperty(); - std::shared_ptr toVariantProperty(); - std::shared_ptr toNodeListProperty(); - std::shared_ptr toNodeProperty(); - std::shared_ptr toNodeAbstractProperty(); - std::shared_ptr toSignalHandlerProperty(); - std::shared_ptr toSignalDeclarationProperty(); + template + auto toProperty() + { + Q_ASSERT(std::dynamic_pointer_cast(shared_from_this())); + return std::static_pointer_cast(shared_from_this()); + } + + template + auto to() + { + if (propertyType == m_propertyType) + return std::static_pointer_cast::Type>( + shared_from_this()); + + return std::shared_ptr::Type>{}; + } InternalNodePointer propertyOwner() const; @@ -62,12 +122,17 @@ public: void resetDynamicTypeName(); protected: // functions - InternalProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); + InternalProperty(const PropertyName &name, + const InternalNodePointer &propertyOwner, + PropertyType propertyType); + void setDynamicTypeName(const TypeName &name); + private: PropertyName m_name; TypeName m_dynamicType; std::weak_ptr m_propertyOwner; + PropertyType m_propertyType = PropertyType::None; }; } // namespace Internal diff --git a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp index 96bdda06e47..70aade63a68 100644 --- a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp @@ -6,9 +6,11 @@ namespace QmlDesigner { namespace Internal { -InternalSignalHandlerProperty::InternalSignalHandlerProperty(const PropertyName &name, const InternalNodePointer &propertyOwner) - : InternalProperty(name, propertyOwner) -{} +InternalSignalHandlerProperty::InternalSignalHandlerProperty(const PropertyName &name, + const InternalNodePointer &propertyOwner) + : InternalProperty(name, propertyOwner, PropertyType::SignalHandler) +{ +} bool InternalSignalHandlerProperty::isValid() const { @@ -24,11 +26,6 @@ void InternalSignalHandlerProperty::setSource(const QString &source) m_source = source; } -bool InternalSignalHandlerProperty::isSignalHandlerProperty() const -{ - return true; -} - bool InternalSignalDeclarationProperty::isValid() const { return InternalProperty::isValid() && isSignalDeclarationProperty(); @@ -44,13 +41,9 @@ void InternalSignalDeclarationProperty::setSignature(const QString &signature) m_signature = signature; } -bool InternalSignalDeclarationProperty::isSignalDeclarationProperty() const -{ - return true; -} - -InternalSignalDeclarationProperty::InternalSignalDeclarationProperty(const PropertyName &name, const InternalNodePointer &propertyOwner) - : InternalProperty(name, propertyOwner) +InternalSignalDeclarationProperty::InternalSignalDeclarationProperty( + const PropertyName &name, const InternalNodePointer &propertyOwner) + : InternalProperty(name, propertyOwner, PropertyType::SignalDeclaration) { setDynamicTypeName("signal"); } diff --git a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h index f13df86e0d1..f0d88e2d239 100644 --- a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h @@ -12,6 +12,7 @@ class InternalSignalHandlerProperty : public InternalProperty { public: using Pointer = std::shared_ptr; + static constexpr PropertyType type = PropertyType::SignalHandler; InternalSignalHandlerProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); @@ -20,9 +21,6 @@ public: QString source() const; void setSource(const QString &source); - bool isSignalHandlerProperty() const override; - - private: QString m_source; }; @@ -31,6 +29,7 @@ class InternalSignalDeclarationProperty : public InternalProperty { public: using Pointer = std::shared_ptr; + static constexpr PropertyType type = PropertyType::SignalDeclaration; InternalSignalDeclarationProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); @@ -40,8 +39,6 @@ public: QString signature() const; void setSignature(const QString &source); - bool isSignalDeclarationProperty() const override; - private: QString m_signature; }; diff --git a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp index 661da75630b..53a0347c173 100644 --- a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp @@ -6,8 +6,9 @@ namespace QmlDesigner { namespace Internal { -InternalVariantProperty::InternalVariantProperty(const PropertyName &name, const InternalNodePointer &node) - : InternalProperty(name, node) +InternalVariantProperty::InternalVariantProperty(const PropertyName &name, + const InternalNodePointer &node) + : InternalProperty(name, node, PropertyType::Variant) { } @@ -21,11 +22,6 @@ void InternalVariantProperty::setValue(const QVariant &value) m_value = value; } -bool InternalVariantProperty::isVariantProperty() const -{ - return true; -} - void InternalVariantProperty::setDynamicValue(const TypeName &type, const QVariant &value) { setValue(value); diff --git a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h index 362c4bc87ca..f9bb85d38d7 100644 --- a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h @@ -12,6 +12,7 @@ class InternalVariantProperty : public InternalProperty { public: using Pointer = std::shared_ptr; + static constexpr PropertyType type = PropertyType::Variant; InternalVariantProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); @@ -22,9 +23,6 @@ public: void setDynamicValue(const TypeName &type, const QVariant &value); - bool isVariantProperty() const override; - - private: QVariant m_value; }; diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 8b5bd02ac0f..06056fd9382 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -8,10 +8,13 @@ #include "abstractview.h" #include "auxiliarydataproperties.h" +#include "internalbindingproperty.h" #include "internalnodeabstractproperty.h" #include "internalnodelistproperty.h" +#include "internalnodeproperty.h" #include "internalproperty.h" #include "internalsignalhandlerproperty.h" +#include "internalvariantproperty.h" #include "metainfo.h" #include "nodeinstanceview.h" #include "nodemetainfo.h" @@ -1131,7 +1134,7 @@ void ModelPrivate::deselectNode(const InternalNodePointer &node) void ModelPrivate::removePropertyWithoutNotification(const InternalPropertyPointer &property) { if (property->isNodeAbstractProperty()) { - const auto &&allSubNodes = property->toNodeAbstractProperty()->allSubNodes(); + const auto &&allSubNodes = property->toProperty()->allSubNodes(); for (const InternalNodePointer &node : allSubNodes) removeNodeFromModel(node); } diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index f2d3bd16d10..0688ff1c256 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -70,8 +70,9 @@ void NodeAbstractProperty::reparentHere(const ModelNode &modelNode, bool isNode if (modelNode.hasParentProperty() && modelNode.parentProperty().isDynamic()) return; - if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeAbstractProperty()) - privateModel()->removePropertyAndRelatedResources(internalNode()->property(name())); + auto internalProperty = internalNode()->property(name()); + if (internalProperty && !internalProperty->isNodeAbstractProperty()) + privateModel()->removePropertyAndRelatedResources(internalProperty); if (modelNode.hasParentProperty()) { Internal::InternalNodeAbstractProperty::Pointer oldParentProperty = modelNode.internalNode()->parentProperty(); diff --git a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp index af7405d340d..0e1fb45b4ef 100644 --- a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp @@ -41,11 +41,9 @@ Internal::InternalNodeListPropertyPointer &NodeListProperty::internalNodeListPro if (m_internalNodeListProperty) return m_internalNodeListProperty; - if (internalNode()->hasProperty(name())) { - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isNodeListProperty()) - m_internalNodeListProperty = internalProperty->toNodeListProperty(); - } + auto internalProperty = internalNode()->nodeListProperty(name()); + if (internalProperty) + m_internalNodeListProperty = internalProperty; return m_internalNodeListProperty; } @@ -65,9 +63,7 @@ QList NodeListProperty::toModelNodeList() const return {}; if (internalNodeListProperty()) - return internalNodesToModelNodes(m_internalNodeListProperty->toNodeListProperty()->nodeList(), - model(), - view()); + return internalNodesToModelNodes(m_internalNodeListProperty->nodeList(), model(), view()); return QList(); } diff --git a/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp index 4af8428e6be..a628c96b7d2 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp @@ -24,11 +24,10 @@ void NodeProperty::setModelNode(const ModelNode &modelNode) if (!modelNode.isValid()) return; - if (internalNode()->hasProperty(name())) { //check if oldValue != value - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isNodeProperty() - && internalProperty->toNodeProperty()->node() == modelNode.internalNode()) - return; + auto internalProperty = internalNode()->nodeProperty(name()); + if (internalProperty + && internalProperty->node() == modelNode.internalNode()) { //check if oldValue != value + return; } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeProperty()) @@ -42,11 +41,9 @@ ModelNode NodeProperty::modelNode() const if (!isValid()) return {}; - if (internalNode()->hasProperty(name())) { //check if oldValue != value - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isNodeProperty()) - return ModelNode(internalProperty->toNodeProperty()->node(), model(), view()); - } + auto internalProperty = internalNode()->nodeProperty(name()); + if (internalProperty) //check if oldValue != value + return ModelNode(internalProperty->node(), model(), view()); return ModelNode(); } diff --git a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp index 4690044fa61..8c8c887a660 100644 --- a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp @@ -32,16 +32,15 @@ void SignalHandlerProperty::setSource(const QString &source) if (source.isEmpty()) return; - if (internalNode()->hasProperty(name())) { //check if oldValue != value - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isSignalHandlerProperty() - && internalProperty->toSignalHandlerProperty()->source() == source) - + if (auto internalProperty = internalNode()->property(name())) { + auto signalHandlerProperty = internalProperty->to(); + //check if oldValue != value + if (signalHandlerProperty && signalHandlerProperty->source() == source) return; - } - if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isSignalHandlerProperty()) - privateModel()->removePropertyAndRelatedResources(internalNode()->property(name())); + if (!signalHandlerProperty) + privateModel()->removePropertyAndRelatedResources(internalProperty); + } privateModel()->setSignalHandlerProperty(internalNode(), name(), source); } @@ -109,16 +108,15 @@ void SignalDeclarationProperty::setSignature(const QString &signature) if (signature.isEmpty()) return; - if (internalNode()->hasProperty(name())) { //check if oldValue != value - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isSignalDeclarationProperty() - && internalProperty->toSignalDeclarationProperty()->signature() == signature) - + if (auto internalProperty = internalNode()->property(name())) { + auto signalDeclarationProperty = internalProperty->to(); + //check if oldValue != value + if (signalDeclarationProperty && signalDeclarationProperty->signature() == signature) return; - } - if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isSignalDeclarationProperty()) - privateModel()->removePropertyAndRelatedResources(internalNode()->property(name())); + if (!signalDeclarationProperty) + privateModel()->removePropertyAndRelatedResources(internalProperty); + } privateModel()->setSignalDeclarationProperty(internalNode(), name(), signature); } diff --git a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp index c879ec7a347..859bb0691ec 100644 --- a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp @@ -36,27 +36,29 @@ void VariantProperty::setValue(const QVariant &value) if (isDynamic()) qWarning() << "Calling VariantProperty::setValue on dynamic property."; + if (auto internalProperty = internalNode()->property(name())) { + auto variantProperty = internalProperty->to(); - if (internalNode()->hasProperty(name())) { //check if oldValue != value - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isVariantProperty() - && internalProperty->toVariantProperty()->value() == value - && dynamicTypeName().isEmpty()) - + //check if oldValue != value + if (variantProperty && variantProperty->value() == value + && variantProperty->dynamicTypeName().isEmpty()) { return; - } + } - if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isVariantProperty()) - privateModel()->removePropertyAndRelatedResources(internalNode()->property(name())); + if (!variantProperty) + privateModel()->removePropertyAndRelatedResources(internalProperty); + } privateModel()->setVariantProperty(internalNode(), name(), value); } QVariant VariantProperty::value() const { - if (isValid() && internalNode()->hasProperty(name()) - && internalNode()->property(name())->isVariantProperty()) - return internalNode()->variantProperty(name())->value(); + if (isValid()) { + auto property = internalNode()->variantProperty(name()); + if (property) + return property->value(); + } return QVariant(); } @@ -86,19 +88,18 @@ void VariantProperty::setDynamicTypeNameAndValue(const TypeName &type, const QVa Internal::WriteLocker locker(model()); - if (internalNode()->hasProperty(name())) { //check if oldValue != value - Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isVariantProperty() - && internalProperty->toVariantProperty()->value() == value - && internalProperty->toVariantProperty()->dynamicTypeName() == type) - + //check if oldValue != value + if (auto internalProperty = internalNode()->property(name())) { + auto variantProperty = internalProperty->to(); + if (variantProperty && variantProperty->value() == value + && internalProperty->dynamicTypeName() == type) return; + + if (!variantProperty) + privateModel()->removePropertyAndRelatedResources(internalProperty); } - if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isVariantProperty()) - privateModel()->removePropertyAndRelatedResources(internalNode()->property(name())); - - privateModel()->setDynamicVariantProperty(internalNode(), name(), type, value); + privateModel()->setDynamicVariantProperty(internalNode(), name(), type, value); } void VariantProperty::setDynamicTypeNameAndEnumeration(const TypeName &type, const EnumerationName &enumerationName) From 63f366efdd37b855d956ff239b3d6a30aa8c5e0a Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 26 May 2023 17:14:33 +0200 Subject: [PATCH 065/149] QmlDesigner: Don't initialize a default model node with an internal ode I think we introduced that because we had no valid checks in the methods but exceptions. But after we check for every method for validity we don't need it anymore. It would fix 093a8426508f045e7c011daae9767f10ccd0803e in a more optimal way. Needs good testing! Change-Id: I99b712c6526711836a760f3bb4031d4a9d51b935 Reviewed-by: Reviewed-by: Vikas Pachdha --- src/plugins/qmldesigner/designercore/include/modelnode.h | 2 +- .../qmldesigner/designercore/model/internalnode_p.h | 1 - src/plugins/qmldesigner/designercore/model/modelnode.cpp | 7 ++++++- .../qmldesigner/designercore/model/nodelistproperty.cpp | 9 +++++++++ .../designercore/model/signalhandlerproperty.cpp | 8 +++++++- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index c693809cb62..bfc1570cb62 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -253,7 +253,7 @@ public: friend bool operator==(const ModelNode &firstNode, const ModelNode &secondNode) { - return firstNode.internalId() == secondNode.internalId(); + return firstNode.m_internalNode == secondNode.m_internalNode; } friend bool operator!=(const ModelNode &firstNode, const ModelNode &secondNode) diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 3e72296c01f..d82d97251a1 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -44,7 +44,6 @@ public: using Pointer = std::shared_ptr; using WeakPointer = std::weak_ptr; - InternalNode() = default; explicit InternalNode(TypeName typeName, int majorVersion, int minorVersion, qint32 internalId) : typeName(std::move(typeName)) , majorVersion(majorVersion) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 824b362f45c..8fde4d0620d 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -75,7 +75,6 @@ ModelNode::ModelNode(const ModelNode &modelNode, AbstractView *view) \see invalid */ ModelNode::ModelNode() - : m_internalNode(std::make_shared()) { } @@ -1406,11 +1405,17 @@ QList ModelNode::pruneChildren(const QList &nodes) void ModelNode::setScriptFunctions(const QStringList &scriptFunctionList) { + if (!isValid()) + return; + model()->d->setScriptFunctions(m_internalNode, scriptFunctionList); } QStringList ModelNode::scriptFunctions() const { + if (!isValid()) + return {}; + return m_internalNode->scriptFunctions; } diff --git a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp index 0e1fb45b4ef..0822786467e 100644 --- a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp @@ -15,6 +15,9 @@ namespace QmlDesigner { Internal::NodeListPropertyIterator::value_type Internal::NodeListPropertyIterator::operator*() const { + if (!m_nodeListProperty) + return {}; + return {m_nodeListProperty->at(m_currentIndex), m_model, m_view}; } @@ -208,11 +211,17 @@ Internal::NodeListPropertyIterator NodeListProperty::end() Internal::NodeListPropertyIterator NodeListProperty::begin() const { + if (!isValid()) + return {}; + return {0, internalNodeListProperty().get(), model(), view()}; } Internal::NodeListPropertyIterator NodeListProperty::end() const { + if (!isValid()) + return {}; + auto nodeListProperty = internalNodeListProperty(); auto size = nodeListProperty ? nodeListProperty->size() : 0; diff --git a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp index 8c8c887a660..a260a2a0ef9 100644 --- a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp @@ -47,6 +47,9 @@ void SignalHandlerProperty::setSource(const QString &source) QString SignalHandlerProperty::source() const { + if (!isValid()) + return {}; + if (internalNode()->hasProperty(name()) && internalNode()->property(name())->isSignalHandlerProperty()) return internalNode()->signalHandlerProperty(name())->source(); @@ -123,7 +126,10 @@ void SignalDeclarationProperty::setSignature(const QString &signature) QString SignalDeclarationProperty::signature() const { - if (internalNode() && internalNode()->hasProperty(name()) + if (!isValid()) + return {}; + + if (internalNode()->hasProperty(name()) && internalNode()->property(name())->isSignalDeclarationProperty()) return internalNode()->signalDeclarationProperty(name())->signature(); From 278d69df4f5807e5049203e1cb2dccef2836b6a9 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 7 Jun 2023 13:03:11 +0200 Subject: [PATCH 066/149] QmlDesigner: Fix deprecated function calls count() -> size() userType() -> typeId() type() -> typeId() Fixes: QTCREATORBUG-29237 Change-Id: Ic63b79f6fab1f6ed5227d97aa12dcbfdebb4f05f Reviewed-by: Tim Jenssen --- .../assetexporterplugin/filepathmodel.cpp | 14 +- .../annotationeditor/annotationtableview.cpp | 34 ++-- .../annotationeditor/defaultannotations.cpp | 4 +- .../bindingeditor/actioneditordialog.cpp | 4 +- .../componentcore/designeractionmanager.cpp | 6 +- .../componentcore/formatoperation.cpp | 2 +- .../componentcore/layoutingridlayout.cpp | 10 +- .../componentcore/modelnodeoperations.cpp | 20 +-- .../componentcore/svgpasteaction.cpp | 6 +- .../connectioneditor/backendmodel.cpp | 2 +- .../connectioneditor/bindingmodel.cpp | 6 +- .../connectioneditor/connectionmodel.cpp | 2 +- .../connectioneditor/connectionview.cpp | 2 +- .../connectioneditor/connectionviewwidget.cpp | 8 +- .../dynamicpropertiesmodel.cpp | 10 +- .../contentlibrarymaterialsmodel.cpp | 2 +- .../contentlibrary/contentlibrarytexture.cpp | 2 +- .../contentlibrarytexturesmodel.cpp | 2 +- .../curveeditor/curveeditormodel.cpp | 2 +- .../curveeditor/curveeditorview.cpp | 2 +- .../components/curveeditor/curvesegment.cpp | 4 +- .../components/curveeditor/keyframe.cpp | 2 +- .../edit3d/bakelightsconnectionmanager.cpp | 2 +- .../components/edit3d/bakelightsdatamodel.cpp | 6 +- .../formeditor/abstractformeditortool.cpp | 2 +- .../components/formeditor/anchorindicator.cpp | 2 +- .../formeditor/backgroundaction.cpp | 4 +- .../formeditor/bindingindicator.cpp | 2 +- .../components/formeditor/movetool.cpp | 6 +- .../components/formeditor/snapper.cpp | 4 +- .../components/integration/designdocument.cpp | 3 +- .../integration/designdocumentview.cpp | 3 +- .../itemlibrary/assetimportupdatetreeitem.cpp | 2 +- .../itemlibrary/itemlibraryaddimportmodel.cpp | 4 +- .../itemlibrary/itemlibraryassetimporter.cpp | 2 +- .../itemlibrarycategoriesmodel.cpp | 4 +- .../itemlibrary/itemlibraryitemsmodel.cpp | 2 +- .../itemlibrary/itemlibrarymodel.cpp | 4 +- .../itemlibrary/itemlibrarywidget.cpp | 2 +- .../listmodeleditor/listmodeleditormodel.cpp | 4 +- .../materialbrowser/materialbrowsermodel.cpp | 6 +- .../materialbrowsertexturesmodel.cpp | 6 +- .../materialeditorqmlbackend.cpp | 8 +- .../materialeditor/materialeditorview.cpp | 8 +- .../choosefrompropertylistdialog.cpp | 8 +- .../navigator/navigatortreemodel.cpp | 16 +- .../components/navigator/navigatorview.cpp | 15 +- .../components/pathtool/pathitem.cpp | 12 +- .../pathtool/pathselectionmanipulator.cpp | 4 +- .../propertyeditor/aligndistribute.cpp | 10 +- .../dynamicpropertiesproxymodel.cpp | 2 +- .../propertyeditor/gradientmodel.cpp | 4 +- .../gradientpresetlistmodel.cpp | 4 +- .../propertyeditorqmlbackend.cpp | 17 +- .../propertyeditor/propertyeditorvalue.cpp | 10 +- .../propertyeditor/propertyeditorview.cpp | 8 +- .../propertyeditor/qmlmodelnodeproxy.cpp | 2 +- .../textureeditor/textureeditorqmlbackend.cpp | 8 +- .../textureeditor/textureeditorview.cpp | 8 +- .../components/timelineeditor/canvas.cpp | 2 +- .../components/timelineeditor/easingcurve.cpp | 26 +-- .../timelineeditor/timelineanimationform.cpp | 2 +- .../timelineeditor/timelinecontrols.cpp | 4 +- .../timelineeditor/timelinegraphicsscene.cpp | 2 +- .../timelineeditor/timelinepropertyitem.cpp | 4 +- .../timelineeditor/timelinesectionitem.cpp | 4 +- .../timelineeditor/timelineselectiontool.cpp | 2 +- .../components/toolbar/toolbarbackend.cpp | 8 +- .../transitioneditorsectionitem.cpp | 2 +- .../transitioneditor/transitionform.cpp | 8 +- .../imagecacheconnectionmanager.cpp | 2 +- .../designercore/include/modelnode.h | 4 +- .../designercore/include/propertynode.h | 2 +- .../instances/baseconnectionmanager.cpp | 4 +- .../instances/capturingconnectionmanager.cpp | 2 +- .../interactiveconnectionmanager.cpp | 2 +- .../designercore/instances/nodeinstance.cpp | 18 +-- .../instances/nodeinstanceserverproxy.cpp | 31 ++-- .../instances/nodeinstanceview.cpp | 13 +- .../designercore/metainfo/metainforeader.cpp | 2 +- .../designercore/metainfo/nodehints.cpp | 2 +- .../designercore/metainfo/nodemetainfo.cpp | 15 +- .../designercore/model/abstractview.cpp | 2 +- .../designercore/model/bindingproperty.cpp | 4 +- .../model/internalnodelistproperty.cpp | 2 +- .../model/internalnodelistproperty.h | 4 +- .../designercore/model/modelmerger.cpp | 4 +- .../designercore/model/modelnode.cpp | 151 +++++++----------- .../designercore/model/propertycontainer.cpp | 2 +- .../designercore/model/qmlchangeset.cpp | 2 +- .../designercore/model/qmltextgenerator.cpp | 4 +- .../designercore/model/rewriterview.cpp | 4 +- .../designercore/model/stylesheetmerger.cpp | 4 +- .../designercore/model/texttomodelmerger.cpp | 19 ++- .../projectstorage/projectstorage.h | 13 +- .../qmldesigner/documentwarningwidget.cpp | 4 +- src/plugins/qmldesigner/generateresource.cpp | 4 +- .../qmldesigner/utils/multifiledownloader.cpp | 2 +- .../instances/nodeinstanceclientproxy.cpp | 42 ++--- .../qml2puppet/editor3d/generalhelper.cpp | 4 +- .../instances/nodeinstanceserver.cpp | 14 +- .../instances/objectnodeinstance.cpp | 10 +- .../qt5informationnodeinstanceserver.cpp | 2 +- .../qmlprivategate/qmlprivategate.cpp | 9 +- .../qml/qmldesigner/testconnectionmanager.cpp | 2 +- 105 files changed, 393 insertions(+), 436 deletions(-) diff --git a/src/plugins/qmldesigner/assetexporterplugin/filepathmodel.cpp b/src/plugins/qmldesigner/assetexporterplugin/filepathmodel.cpp index 5020b095a34..f5df42df396 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/filepathmodel.cpp +++ b/src/plugins/qmldesigner/assetexporterplugin/filepathmodel.cpp @@ -67,7 +67,7 @@ Qt::ItemFlags FilePathModel::flags(const QModelIndex &index) const int FilePathModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) - return m_files.count(); + return m_files.size(); return 0; } @@ -123,12 +123,14 @@ void FilePathModel::processProject() beginResetModel(); m_preprocessWatcher.reset(new QFutureWatcher(this)); - connect(m_preprocessWatcher.get(), &QFutureWatcher::resultReadyAt, this, + connect(m_preprocessWatcher.get(), + &QFutureWatcher::resultReadyAt, + this, [this](int resultIndex) { - beginInsertRows(index(0, 0) , m_files.count(), m_files.count()); - m_files.append(m_preprocessWatcher->resultAt(resultIndex)); - endInsertRows(); - }); + beginInsertRows(index(0, 0), m_files.size(), m_files.size()); + m_files.append(m_preprocessWatcher->resultAt(resultIndex)); + endInsertRows(); + }); connect(m_preprocessWatcher.get(), &QFutureWatcher::finished, this, &FilePathModel::endResetModel); diff --git a/src/plugins/qmldesigner/components/annotationeditor/annotationtableview.cpp b/src/plugins/qmldesigner/components/annotationeditor/annotationtableview.cpp index 7c8daa5eebb..f3cc629dd80 100644 --- a/src/plugins/qmldesigner/components/annotationeditor/annotationtableview.cpp +++ b/src/plugins/qmldesigner/components/annotationeditor/annotationtableview.cpp @@ -66,7 +66,7 @@ void CommentDelegate::updateEditorGeometry(QWidget *editor, editor->setGeometry(option.rect); } -Comment CommentDelegate::comment(QModelIndex const &index) +Comment CommentDelegate::comment(const QModelIndex &index) { auto *model = index.model(); return model->data(model->index(index.row(), ColumnId::Title), CommentRole).value(); @@ -136,9 +136,9 @@ void CommentValueDelegate::paint(QPainter *painter, const QModelIndex &index) const { auto data = index.model()->data(index, Qt::DisplayRole); - if (data.userType() == qMetaTypeId()) + if (data.typeId() == qMetaTypeId()) drawDisplay(painter, option, option.rect, data.value().plainText()); - else if (data.userType() == QMetaType::QColor) + else if (data.typeId() == QMetaType::QColor) painter->fillRect(option.rect, data.value()); else QItemDelegate::paint(painter, option, index); @@ -147,7 +147,7 @@ void CommentValueDelegate::paint(QPainter *painter, void CommentValueDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { auto data = index.model()->data(index, Qt::DisplayRole); - if (data.userType() == qMetaTypeId()) { + if (data.typeId() == qMetaTypeId()) { auto richText = data.value(); auto *e = qobject_cast(editor); e->setText(richText.plainText()); @@ -157,10 +157,10 @@ void CommentValueDelegate::setEditorData(QWidget *editor, const QModelIndex &ind this, &CommentValueDelegate::richTextEditorRequested, Qt::UniqueConnection); - } else if (data.userType() == QMetaType::QString) { + } else if (data.typeId() == QMetaType::QString) { auto *e = qobject_cast(editor); e->setText(data.toString()); - } else if (data.userType() == QMetaType::QColor) { + } else if (data.typeId() == QMetaType::QColor) { auto *e = qobject_cast(editor); e->setColor(data.value()); e->installEventFilter(e); @@ -206,15 +206,13 @@ void CommentValueDelegate::setModelData(QWidget *editor, const QModelIndex &index) const { auto data = model->data(index, Qt::EditRole); - if (data.userType() == qMetaTypeId()) + if (data.typeId() == qMetaTypeId()) return; - else if (data.userType() == QMetaType::QColor) - { + else if (data.typeId() == QMetaType::QColor) { model->setData(index, qobject_cast(editor)->color(), Qt::DisplayRole); - } - else if (data.userType() == QMetaType::QString) + } else if (data.typeId() == QMetaType::QString) model->setData(index, qobject_cast(editor)->text(), Qt::DisplayRole); else QItemDelegate::setModelData(editor, model, index); @@ -288,7 +286,7 @@ AnnotationTableView::AnnotationTableView(QWidget *parent) // When comment title was edited, make value item editable if (item->column() == ColumnId::Title && valueItem) { valueItem->setEditable(!item->text().isEmpty()); - valueItem->setCheckable(valueItem->data(Qt::DisplayRole).userType() == QMetaType::Bool); + valueItem->setCheckable(valueItem->data(Qt::DisplayRole).typeId() == QMetaType::Bool); } m_modelUpdating = true; @@ -344,7 +342,7 @@ Comment AnnotationTableView::fetchComment(int row) const return comment; } -void AnnotationTableView::setupComments(QVector const &comments) +void AnnotationTableView::setupComments(const QVector &comments) { m_model->clear(); m_modelUpdating = true; @@ -379,7 +377,7 @@ void AnnotationTableView::setDefaultAnnotations(DefaultAnnotationsModel *default m_valueDelegate.setDefaultAnnotations(defaults); } -void AnnotationTableView::changeRow(int index, Comment const &comment) +void AnnotationTableView::changeRow(int index, const Comment &comment) { auto *titleItem = m_model->item(index, ColumnId::Title); auto *authorItem = m_model->item(index, ColumnId::Author); @@ -395,7 +393,7 @@ void AnnotationTableView::changeRow(int index, Comment const &comment) : QMetaType::UnknownType); textItem->setEditable(data.isValid()); - textItem->setCheckable(data.userType() == QMetaType::Bool); + textItem->setCheckable(data.typeId() == QMetaType::Bool); textItem->setData(data, Qt::DisplayRole); } @@ -433,9 +431,9 @@ bool AnnotationTableView::rowIsEmpty(int row) const return QString(itemText(0) + itemText(1) + itemText(2)).isEmpty(); } -QString AnnotationTableView::dataToCommentText(QVariant const &data) +QString AnnotationTableView::dataToCommentText(const QVariant &data) { - auto type = data.userType(); + auto type = data.typeId(); if (type == qMetaTypeId()) return data.value().text; @@ -451,7 +449,7 @@ QString AnnotationTableView::dataToCommentText(QVariant const &data) return {}; } -QVariant AnnotationTableView::commentToData(Comment const& comment, QMetaType::Type type) +QVariant AnnotationTableView::commentToData(const Comment &comment, QMetaType::Type type) { switch (type) { case QMetaType::Bool: diff --git a/src/plugins/qmldesigner/components/annotationeditor/defaultannotations.cpp b/src/plugins/qmldesigner/components/annotationeditor/defaultannotations.cpp index 7a9212d5353..d3a302a7829 100644 --- a/src/plugins/qmldesigner/components/annotationeditor/defaultannotations.cpp +++ b/src/plugins/qmldesigner/components/annotationeditor/defaultannotations.cpp @@ -58,7 +58,7 @@ bool DefaultAnnotationsModel::hasDefault(const Comment &comment) const QMetaType::Type DefaultAnnotationsModel::defaultType(const Comment &comment) const { - return hasDefault(comment) ? QMetaType::Type(m_defaultMap[comment.title().toLower()].userType()) + return hasDefault(comment) ? QMetaType::Type(m_defaultMap[comment.title().toLower()].typeId()) : QMetaType::UnknownType; } @@ -73,7 +73,7 @@ bool DefaultAnnotationsModel::isRichText(const Comment &comment) const return type == QMetaType::UnknownType || type == qMetaTypeId(); } -void DefaultAnnotationsModel::loadFromFile(QString const &filename) +void DefaultAnnotationsModel::loadFromFile(const QString &filename) { QFile file(filename); if (file.open(QFile::ReadOnly)) { diff --git a/src/plugins/qmldesigner/components/bindingeditor/actioneditordialog.cpp b/src/plugins/qmldesigner/components/bindingeditor/actioneditordialog.cpp index ba797ee1a77..8fddcb1ade8 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/actioneditordialog.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/actioneditordialog.cpp @@ -88,7 +88,7 @@ void ActionEditorDialog::adjustProperties() bool typeDone = false; bool targetDone = false; - for (int i = 0; i < expression.count(); ++i) { + for (int i = 0; i < expression.size(); ++i) { switch (expression[i].first) { case QmlJS::AST::Node::Kind::Kind_CallExpression: @@ -592,7 +592,7 @@ void ActionEditorDialog::fillAndSetSourceProperty(const QString &value, for (const auto &state : std::as_const(m_states)) m_assignmentSourceProperty->addItem(state, specificItem); - specificsEnd = m_states.count(); + specificsEnd = m_states.size(); } if (specificsEnd != -1) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 77976993e4f..32a3d4af700 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -50,7 +50,7 @@ namespace QmlDesigner { -static inline QString captionForModelNode(const ModelNode &modelNode) +inline static QString captionForModelNode(const ModelNode &modelNode) { if (modelNode.id().isEmpty()) return modelNode.simplifiedTypeName(); @@ -58,7 +58,7 @@ static inline QString captionForModelNode(const ModelNode &modelNode) return modelNode.id(); } -static inline bool contains(const QmlItemNode &node, const QPointF &position) +inline static bool contains(const QmlItemNode &node, const QPointF &position) { return node.isValid() && node.instanceSceneTransform().mapRect(node.instanceBoundingRect()).contains(position); } @@ -1208,7 +1208,7 @@ bool isStackedContainerAndIndexCanBeIncreased(const SelectionContext &context) const int value = containerItemNode.instanceValue(propertyName).toInt(); - const int maxValue = currentSelectedNode.directSubModelNodes().count() - 1; + const int maxValue = currentSelectedNode.directSubModelNodes().size() - 1; return value < maxValue; } diff --git a/src/plugins/qmldesigner/components/componentcore/formatoperation.cpp b/src/plugins/qmldesigner/components/componentcore/formatoperation.cpp index 4676e0f46a9..546ad0cc6b0 100644 --- a/src/plugins/qmldesigner/components/componentcore/formatoperation.cpp +++ b/src/plugins/qmldesigner/components/componentcore/formatoperation.cpp @@ -52,7 +52,7 @@ void readFormatConfiguration(){ QVariantMap rootMap = jsonObject.toVariantMap(); QJsonArray jsonArray = rootMap["propertylist"].toJsonArray(); - for (int i=0; i< jsonArray.count(); ++i){ + for (int i = 0; i < jsonArray.size(); ++i) { auto item = jsonArray.at(i).toObject(); QVariantMap itemMap = item.toVariantMap(); StylePropertyStruct current; diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp index 09d3fdeffd9..89a5868d89d 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp @@ -15,7 +15,7 @@ namespace QmlDesigner { -static inline void reparentTo(const ModelNode &node, const QmlItemNode &parent) +inline static void reparentTo(const ModelNode &node, const QmlItemNode &parent) { if (parent.isValid() && node.isValid()) { @@ -78,7 +78,7 @@ static int lowerBound(int i) return i; } -static inline QPointF getUpperLeftPosition(const QList &modelNodeList) +inline static QPointF getUpperLeftPosition(const QList &modelNodeList) { QPointF postion(std::numeric_limits::max(), std::numeric_limits::max()); for (const ModelNode &modelNode : modelNodeList) { @@ -193,7 +193,7 @@ void LayoutInGridLayout::doIt() } } -bool static hasQtQuickLayoutImport(const SelectionContext &context) +static bool hasQtQuickLayoutImport(const SelectionContext &context) { if (context.view() && context.view()->model()) { Import import = Import::createLibraryImport(QStringLiteral("QtQuick.Layouts"), QStringLiteral("1.0")); @@ -219,12 +219,12 @@ void LayoutInGridLayout::layout(const SelectionContext &context) int LayoutInGridLayout::columnCount() const { - return m_xTopOffsets.count(); + return m_xTopOffsets.size(); } int LayoutInGridLayout::rowCount() const { - return m_yTopOffsets.count(); + return m_yTopOffsets.size(); } void LayoutInGridLayout::collectItemNodes() diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 258ae0ba925..d791b04672b 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -88,7 +88,7 @@ Utils::SmallString auxPropertyString(Utils::SmallStringView name) } } // namespace -static inline void reparentTo(const ModelNode &node, const QmlItemNode &parent) +inline static void reparentTo(const ModelNode &node, const QmlItemNode &parent) { if (parent.isValid() && node.isValid()) { @@ -103,7 +103,7 @@ static inline void reparentTo(const ModelNode &node, const QmlItemNode &parent) } } -static inline QPointF getUpperLeftPosition(const QList &modelNodeList) +inline static QPointF getUpperLeftPosition(const QList &modelNodeList) { QPointF postion(std::numeric_limits::max(), std::numeric_limits::max()); for (const ModelNode &modelNode : modelNodeList) { @@ -364,7 +364,7 @@ void reverse(const SelectionContext &selectionState) }); } -static inline void backupPropertyAndRemove(const ModelNode &node, const PropertyName &propertyName) +inline static void backupPropertyAndRemove(const ModelNode &node, const PropertyName &propertyName) { if (node.hasVariantProperty(propertyName)) { node.setAuxiliaryData(AuxiliaryDataType::Document, @@ -695,7 +695,8 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); - if (!usages.isEmpty() && (addAlwaysNewSlot || usages.count() < 2) && (!isModelNodeRoot || addAlwaysNewSlot)) { + if (!usages.isEmpty() && (addAlwaysNewSlot || usages.size() < 2) + && (!isModelNodeRoot || addAlwaysNewSlot)) { Core::EditorManager::openEditorAt( {usages.constFirst().path, usages.constFirst().line, usages.constFirst().col}); @@ -879,7 +880,7 @@ void addItemToStackedContainer(const SelectionContext &selectionContext) if (potentialTabBar.isValid()) {// The stacked container is hooked up to a TabBar NodeMetaInfo tabButtonMetaInfo = view->model()->metaInfo("QtQuick.Controls.TabButton", -1, -1); if (tabButtonMetaInfo.isValid()) { - const int buttonIndex = potentialTabBar.directSubModelNodes().count(); + const int buttonIndex = potentialTabBar.directSubModelNodes().size(); ModelNode tabButtonNode = view->createModelNode("QtQuick.Controls.TabButton", tabButtonMetaInfo.majorVersion(), @@ -949,7 +950,7 @@ void increaseIndexOfStackedContainer(const SelectionContext &selectionContext) int value = containerItemNode.instanceValue(propertyName).toInt(); ++value; - const int maxValue = container.directSubModelNodes().count(); + const int maxValue = container.directSubModelNodes().size(); QTC_ASSERT(value < maxValue, return); @@ -1012,7 +1013,7 @@ void addTabBarToStackedContainer(const SelectionContext &selectionContext) container.parentProperty().reparentHere(tabBarNode); - const int maxValue = container.directSubModelNodes().count(); + const int maxValue = container.directSubModelNodes().size(); QmlItemNode tabBarItem(tabBarNode); @@ -1239,8 +1240,7 @@ void setFlowStartItem(const SelectionContext &selectionContext) }); } - -bool static hasStudioComponentsImport(const SelectionContext &context) +static bool hasStudioComponentsImport(const SelectionContext &context) { if (context.view() && context.view()->model()) { Import import = Import::createLibraryImport("QtQuick.Studio.Components", "1.0"); @@ -1250,7 +1250,7 @@ bool static hasStudioComponentsImport(const SelectionContext &context) return false; } -static inline void setAdjustedPos(const QmlDesigner::ModelNode &modelNode) +inline static void setAdjustedPos(const QmlDesigner::ModelNode &modelNode) { if (modelNode.hasParentProperty()) { ModelNode parentNode = modelNode.parentProperty().parentModelNode(); diff --git a/src/plugins/qmldesigner/components/componentcore/svgpasteaction.cpp b/src/plugins/qmldesigner/components/componentcore/svgpasteaction.cpp index 99bf56078b9..738b1affedd 100644 --- a/src/plugins/qmldesigner/components/componentcore/svgpasteaction.cpp +++ b/src/plugins/qmldesigner/components/componentcore/svgpasteaction.cpp @@ -27,7 +27,7 @@ namespace { /* Copied from qquicksvgparser.cpp 3e783b26a8fb41e3f5a53b883735f5d10fbbd98a */ // '0' is 0x30 and '9' is 0x39 -static inline bool isDigit(ushort ch) +inline static bool isDigit(ushort ch) { static quint16 magic = 0x3ff; return ((ch >> 4) == 3) && (magic >> (ch & 15)); @@ -110,7 +110,7 @@ static qreal toDouble(const QChar *&str) return val; } -static inline void parseNumbersArray(const QChar *&str, QVarLengthArray &points) +inline static void parseNumbersArray(const QChar *&str, QVarLengthArray &points) { while (str->isSpace()) ++str; @@ -261,7 +261,7 @@ bool parsePathDataFast(const QString &dataStr, QPainterPath &path) if (pathElem == QLatin1Char('z') || pathElem == QLatin1Char('Z')) arg.append(0);//dummy const qreal *num = arg.constData(); - int count = arg.count(); + int count = arg.size(); while (count > 0) { qreal offsetX = x; // correction offsets qreal offsetY = y; // for relative commands diff --git a/src/plugins/qmldesigner/components/connectioneditor/backendmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/backendmodel.cpp index 6c970f2646d..5778d8242f7 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/backendmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/backendmodel.cpp @@ -203,7 +203,7 @@ void BackendModel::addNewBackend() if (dialog.applied()) { QStringList importSplit = dialog.importString().split(" "); - if (importSplit.count() != 2) { + if (importSplit.size() != 2) { qWarning() << Q_FUNC_INFO << "invalid import" << importSplit; QTC_ASSERT(false, return); } diff --git a/src/plugins/qmldesigner/components/connectioneditor/bindingmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/bindingmodel.cpp index e0a8f03e99e..191900d5e9d 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/bindingmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/bindingmodel.cpp @@ -217,7 +217,7 @@ static PropertyName unusedProperty(const ModelNode &modelNode) void BindingModel::addBindingForCurrentNode() { - if (connectionView()->selectedModelNodes().count() == 1) { + if (connectionView()->selectedModelNodes().size() == 1) { const ModelNode modelNode = connectionView()->selectedModelNodes().constFirst(); if (modelNode.isValid()) { try { @@ -380,9 +380,9 @@ bool BindingModel::getExpressionStrings(const BindingProperty &bindingProperty, QString propertyName; - for (int i=1; i < stringList.count(); i++) { + for (int i = 1; i < stringList.size(); i++) { propertyName += stringList.at(i); - if (i != stringList.count() - 1) + if (i != stringList.size() - 1) propertyName += QLatin1String("."); } *sourceProperty = propertyName; diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp index 25a5756c28e..4abb7b21376 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp @@ -301,7 +301,7 @@ void ConnectionModel::addConnection() nodeMetaInfo.minorVersion()); QString source = "console.log(\"clicked\")"; - if (connectionView()->selectedModelNodes().count() == 1) { + if (connectionView()->selectedModelNodes().size() == 1) { ModelNode selectedNode = connectionView()->selectedModelNodes().constFirst(); if (QmlItemNode::isValidQmlItemNode(selectedNode)) selectedNode.nodeAbstractProperty("data").reparentHere(newNode); diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp index 56fcc7ef6bf..d8f84f3e0fc 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp @@ -155,7 +155,7 @@ void ConnectionView::selectedNodesChanged(const QList & selectedNodeL if (connectionViewWidget()->currentTab() == ConnectionViewWidget::BindingTab || connectionViewWidget()->currentTab() == ConnectionViewWidget::DynamicPropertiesTab) - emit connectionViewWidget()->setEnabledAddButton(selectedNodeList.count() == 1); + emit connectionViewWidget()->setEnabledAddButton(selectedNodeList.size() == 1); } void ConnectionView::auxiliaryDataChanged([[maybe_unused]] const ModelNode &node, diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp index f1b0c3f4cbe..edade6ae400 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp @@ -347,14 +347,14 @@ void ConnectionViewWidget::invalidateButtonStatus() } else if (currentTab() == BindingTab) { emit setEnabledRemoveButton(ui->bindingView->selectionModel()->hasSelection()); auto bindingModel = qobject_cast(ui->bindingView->model()); - emit setEnabledAddButton(bindingModel->connectionView()->model() && - bindingModel->connectionView()->selectedModelNodes().count() == 1); + emit setEnabledAddButton(bindingModel->connectionView()->model() + && bindingModel->connectionView()->selectedModelNodes().size() == 1); } else if (currentTab() == DynamicPropertiesTab) { emit setEnabledRemoveButton(ui->dynamicPropertiesView->selectionModel()->hasSelection()); auto dynamicPropertiesModel = qobject_cast(ui->dynamicPropertiesView->model()); - emit setEnabledAddButton(dynamicPropertiesModel->view()->model() && - dynamicPropertiesModel->selectedNodes().count() == 1); + emit setEnabledAddButton(dynamicPropertiesModel->view()->model() + && dynamicPropertiesModel->selectedNodes().size() == 1); } else if (currentTab() == BackendTab) { emit setEnabledAddButton(true); emit setEnabledRemoveButton(ui->backendView->selectionModel()->hasSelection()); diff --git a/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp index 89e08c5441f..4faf5d23f17 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp @@ -180,7 +180,7 @@ void DynamicPropertiesModel::resetModel() // Value copying is optional BindingProperty DynamicPropertiesModel::replaceVariantWithBinding(const PropertyName &name, bool copyValue) { - if (selectedNodes().count() == 1) { + if (selectedNodes().size() == 1) { const ModelNode modelNode = selectedNodes().constFirst(); if (modelNode.isValid()) { if (modelNode.hasVariantProperty(name)) { @@ -214,7 +214,7 @@ BindingProperty DynamicPropertiesModel::replaceVariantWithBinding(const Property // If it's a BindingProperty, then replaces it with empty VariantProperty void DynamicPropertiesModel::resetProperty(const PropertyName &name) { - if (selectedNodes().count() == 1) { + if (selectedNodes().size() == 1) { const ModelNode modelNode = selectedNodes().constFirst(); if (modelNode.isValid()) { if (modelNode.hasProperty(name)) { @@ -454,7 +454,7 @@ void DynamicPropertiesModel::addDynamicPropertyForCurrentNode() { QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_PROPERTY_ADDED); - if (selectedNodes().count() == 1) { + if (selectedNodes().size() == 1) { const ModelNode modelNode = selectedNodes().constFirst(); if (modelNode.isValid()) { try { @@ -839,9 +839,9 @@ bool DynamicPropertiesModel::getExpressionStrings(const BindingProperty &binding QString propertyName; - for (int i = 1; i < expressionParts.count(); ++i) { + for (int i = 1; i < expressionParts.size(); ++i) { propertyName += expressionParts.at(i); - if (i != expressionParts.count() - 1) + if (i != expressionParts.size() - 1) propertyName += QLatin1String("."); } *sourceProperty = propertyName; diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarymaterialsmodel.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarymaterialsmodel.cpp index f272a4121df..c25873c77fa 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarymaterialsmodel.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarymaterialsmodel.cpp @@ -53,7 +53,7 @@ int ContentLibraryMaterialsModel::rowCount(const QModelIndex &) const QVariant ContentLibraryMaterialsModel::data(const QModelIndex &index, int role) const { - QTC_ASSERT(index.isValid() && index.row() < m_bundleCategories.count(), return {}); + QTC_ASSERT(index.isValid() && index.row() < m_bundleCategories.size(), return {}); QTC_ASSERT(roleNames().contains(role), return {}); return m_bundleCategories.at(index.row())->property(roleNames().value(role)); diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.cpp index 8da65cd2fb4..7ab239aab4e 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexture.cpp @@ -64,7 +64,7 @@ QString ContentLibraryTexture::resolveFileExt() if (textureFiles.isEmpty()) return {}; - if (textureFiles.count() > 1) { + if (textureFiles.size() > 1) { qWarning() << "Found multiple textures with the same name in the same directories: " << Utils::transform(textureFiles, [](const QFileInfo &fi) { return fi.fileName(); diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp index 900376a4d3e..9026d944dab 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp @@ -36,7 +36,7 @@ int ContentLibraryTexturesModel::rowCount(const QModelIndex &) const QVariant ContentLibraryTexturesModel::data(const QModelIndex &index, int role) const { - QTC_ASSERT(index.isValid() && index.row() < m_bundleCategories.count(), return {}); + QTC_ASSERT(index.isValid() && index.row() < m_bundleCategories.size(), return {}); QTC_ASSERT(roleNames().contains(role), return {}); return m_bundleCategories.at(index.row())->property(roleNames().value(role)); diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp index 802a75c2bf8..84c8cb56bd8 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp @@ -319,7 +319,7 @@ std::vector resolveSmallCurves(const std::vector &frames) if (frame.hasData() && !out.empty()) { QEasingCurve curve = frame.data().toEasingCurve(); // One-segment-curve: Since (0,0) is implicit => 3 - if (curve.toCubicSpline().count() == 3) { + if (curve.toCubicSpline().size() == 3) { Keyframe &previous = out.back(); #if 0 // Do not resolve when two adjacent keyframes have the same value. diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp index 2a401fc4fb1..1d0b38b3f15 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp @@ -338,7 +338,7 @@ void CurveEditorView::commitKeyframes(TreeItem *item) attachEasingCurve(group, pos.x(), segment.easingCurve()); } else if (frame.interpolation() == Keyframe::Interpolation::Easing) { QVariant data = frame.data(); - if (data.type() == static_cast(QMetaType::QEasingCurve)) + if (data.typeId() == static_cast(QMetaType::QEasingCurve)) attachEasingCurve(group, pos.x(), data.value()); } } diff --git a/src/plugins/qmldesigner/components/curveeditor/curvesegment.cpp b/src/plugins/qmldesigner/components/curveeditor/curvesegment.cpp index 2608e65144c..76fa2a2ffc2 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curvesegment.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curvesegment.cpp @@ -244,7 +244,7 @@ void CurveSegment::extendWithEasingCurve(QPainterPath &path, const QEasingCurve }; QVector points = curve.toCubicSpline(); - int numSegments = points.count() / 3; + int numSegments = points.size() / 3; for (int i = 0; i < numSegments; i++) { QPointF p1 = mapEasing(m_left.position(), m_right.position(), points.at(i * 3)); QPointF p2 = mapEasing(m_left.position(), m_right.position(), points.at(i * 3 + 1)); @@ -264,7 +264,7 @@ void CurveSegment::extend(QPainterPath &path) const extendWithEasingCurve(path, easingCurve()); } else if (interpolation() == Keyframe::Interpolation::Easing) { QVariant data = m_right.data(); - if (data.isValid() && data.type() == static_cast(QMetaType::QEasingCurve)) { + if (data.isValid() && data.typeId() == static_cast(QMetaType::QEasingCurve)) { extendWithEasingCurve(path, data.value()); } } diff --git a/src/plugins/qmldesigner/components/curveeditor/keyframe.cpp b/src/plugins/qmldesigner/components/curveeditor/keyframe.cpp index aa698c35da5..8e71e593c3b 100644 --- a/src/plugins/qmldesigner/components/curveeditor/keyframe.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/keyframe.cpp @@ -149,7 +149,7 @@ void Keyframe::setRightHandle(const QPointF &pos) void Keyframe::setData(const QVariant &data) { - if (data.type() == static_cast(QMetaType::QEasingCurve)) + if (data.typeId() == static_cast(QMetaType::QEasingCurve)) m_interpolation = Interpolation::Easing; m_data = data; diff --git a/src/plugins/qmldesigner/components/edit3d/bakelightsconnectionmanager.cpp b/src/plugins/qmldesigner/components/edit3d/bakelightsconnectionmanager.cpp index d2a6f3d332d..6c334d2db56 100644 --- a/src/plugins/qmldesigner/components/edit3d/bakelightsconnectionmanager.cpp +++ b/src/plugins/qmldesigner/components/edit3d/bakelightsconnectionmanager.cpp @@ -27,7 +27,7 @@ void BakeLightsConnectionManager::dispatchCommand(const QVariant &command, { static const int commandType = QMetaType::type("PuppetToCreatorCommand"); - if (command.userType() == commandType) { + if (command.typeId() == commandType) { auto cmd = command.value(); switch (cmd.type()) { case PuppetToCreatorCommand::BakeLightsProgress: diff --git a/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.cpp b/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.cpp index 8bc0f9e7a6f..e812bb6d00e 100644 --- a/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.cpp +++ b/src/plugins/qmldesigner/components/edit3d/bakelightsdatamodel.cpp @@ -36,7 +36,7 @@ BakeLightsDataModel::~BakeLightsDataModel() int BakeLightsDataModel::rowCount(const QModelIndex &) const { - return m_dataList.count(); + return m_dataList.size(); } QHash BakeLightsDataModel::roleNames() const @@ -57,7 +57,7 @@ QHash BakeLightsDataModel::roleNames() const QVariant BakeLightsDataModel::data(const QModelIndex &index, int role) const { - QTC_ASSERT(index.isValid() && index.row() < m_dataList.count(), return {}); + QTC_ASSERT(index.isValid() && index.row() < m_dataList.size(), return {}); QTC_ASSERT(roleNames().contains(role), return {}); QByteArray roleName = roleNames().value(role); @@ -102,7 +102,7 @@ QVariant BakeLightsDataModel::data(const QModelIndex &index, int role) const bool BakeLightsDataModel::setData(const QModelIndex &index, const QVariant &value, int role) { - QTC_ASSERT(index.isValid() && index.row() < m_dataList.count(), return false); + QTC_ASSERT(index.isValid() && index.row() < m_dataList.size(), return false); QTC_ASSERT(roleNames().contains(role), return false); QByteArray roleName = roleNames().value(role); diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index c6cbb8252c4..774b4c0d911 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -260,7 +260,7 @@ void AbstractFormEditorTool::mouseReleaseEvent(const QList & ite QmlItemNode currentSelectedNode; - if (view()->selectedModelNodes().count() == 1) { + if (view()->selectedModelNodes().size() == 1) { currentSelectedNode = view()->selectedModelNodes().constFirst(); if (!containsItemNode(itemList, currentSelectedNode)) { diff --git a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp index 7d75c71c229..8a8a3e524ff 100644 --- a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp @@ -64,7 +64,7 @@ void AnchorIndicator::setItems(const QList &itemList) { clear(); - if (itemList.count() == 1) { + if (itemList.size() == 1) { m_formEditorItem = itemList.constFirst(); QmlItemNode sourceQmlItemNode = m_formEditorItem->qmlItemNode(); if (!sourceQmlItemNode.modelNode().isRootNode()) { diff --git a/src/plugins/qmldesigner/components/formeditor/backgroundaction.cpp b/src/plugins/qmldesigner/components/formeditor/backgroundaction.cpp index a9d72be8ddb..37dfafad9a2 100644 --- a/src/plugins/qmldesigner/components/formeditor/backgroundaction.cpp +++ b/src/plugins/qmldesigner/components/formeditor/backgroundaction.cpp @@ -45,7 +45,7 @@ QWidget *BackgroundAction::createWidget(QWidget *parent) auto comboBox = new QComboBox(parent); comboBox->setFixedWidth(42); - for (int i = 0; i < colors().count(); ++i) { + for (int i = 0; i < colors().size(); ++i) { comboBox->addItem(tr("")); comboBox->setItemIcon(i, iconForColor((colors().at(i)))); } @@ -62,7 +62,7 @@ QWidget *BackgroundAction::createWidget(QWidget *parent) void BackgroundAction::emitBackgroundChanged(int index) { - if (index < colors().count()) + if (index < colors().size()) emit backgroundChanged(colors().at(index)); } diff --git a/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp b/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp index e5a990d1efe..57958416937 100644 --- a/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp @@ -91,7 +91,7 @@ void BindingIndicator::setItems(const QList &itemList) { clear(); - if (itemList.count() == 1) { + if (itemList.size() == 1) { m_formEditorItem = itemList.constFirst(); const QmlItemNode qmlItemNode = m_formEditorItem->qmlItemNode(); diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.cpp b/src/plugins/qmldesigner/components/formeditor/movetool.cpp index 449cdd745cd..76b8f9a5f64 100644 --- a/src/plugins/qmldesigner/components/formeditor/movetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movetool.cpp @@ -94,9 +94,9 @@ void MoveTool::mouseMoveEvent(const QList &itemList, const FormEditorItem *movingItem = m_movingItems.constFirst(); - if (m_movingItems.count() > 1 - || (movingItem->qmlItemNode().canBereparentedTo(containerItem->qmlItemNode()))) - m_moveManipulator.reparentTo(containerItem, MoveManipulator::EnforceReparent); + if (m_movingItems.size() > 1 + || (movingItem->qmlItemNode().canBereparentedTo(containerItem->qmlItemNode()))) + m_moveManipulator.reparentTo(containerItem, MoveManipulator::EnforceReparent); } } diff --git a/src/plugins/qmldesigner/components/formeditor/snapper.cpp b/src/plugins/qmldesigner/components/formeditor/snapper.cpp index da50f92a81d..828a7132118 100644 --- a/src/plugins/qmldesigner/components/formeditor/snapper.cpp +++ b/src/plugins/qmldesigner/components/formeditor/snapper.cpp @@ -426,7 +426,7 @@ double Snapper::snappingDistance() const static QLineF mergedHorizontalLine(const QList &lineList) { - if (lineList.count() == 1) + if (lineList.size() == 1) return lineList.constFirst(); double minimumX = std::numeric_limits::max(); @@ -444,7 +444,7 @@ static QLineF mergedHorizontalLine(const QList &lineList) static QLineF mergedVerticalLine(const QList &lineList) { - if (lineList.count() == 1) + if (lineList.size() == 1) return lineList.constFirst(); double minimumY = std::numeric_limits::max(); diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index a61aeb50a01..f5d89a4e98d 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -211,8 +211,7 @@ void DesignDocument::moveNodesToPosition(const QList &nodes, const st targetNode = view.firstSelectedModelNode(); // in case we copy and paste a selection we paste in the parent item - if ((view.selectedModelNodes().count() == movingNodes.count()) - && targetNode.hasParentProperty()) { + if ((view.selectedModelNodes().size() == movingNodes.size()) && targetNode.hasParentProperty()) { targetNode = targetNode.parentProperty().parentModelNode(); } else if (view.selectedModelNodes().isEmpty()) { // if selection is empty and copied nodes are all 3D nodes, paste them under the active scene diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp index 4a1c92ad0aa..9d0deef713b 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp @@ -227,7 +227,7 @@ void DesignDocumentView::copyModelNodes(const QList &nodesToCopy, DesignDocumentView view{externalDependencies}; copyModel->attachView(&view); - if (selectedNodes.count() == 1) { + if (selectedNodes.size() == 1) { const ModelNode &selectedNode = selectedNodes.constFirst(); if (!selectedNode.isValid()) @@ -253,7 +253,6 @@ void DesignDocumentView::copyModelNodes(const QList &nodesToCopy, view.toClipboard(); } - } }// namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/itemlibrary/assetimportupdatetreeitem.cpp b/src/plugins/qmldesigner/components/itemlibrary/assetimportupdatetreeitem.cpp index 6fa6ec4c342..a5d84605dd2 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/assetimportupdatetreeitem.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/assetimportupdatetreeitem.cpp @@ -32,7 +32,7 @@ void AssetImportUpdateTreeItem::clear() int AssetImportUpdateTreeItem::childCount() const { - return m_children.count(); + return m_children.size(); } int AssetImportUpdateTreeItem::rowOfItem() const diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp index 41a9c6b5f4a..66afa19f8b8 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryaddimportmodel.cpp @@ -28,12 +28,12 @@ ItemLibraryAddImportModel::~ItemLibraryAddImportModel() int ItemLibraryAddImportModel::rowCount(const QModelIndex & /*parent*/) const { - return m_importList.count(); + return m_importList.size(); } QVariant ItemLibraryAddImportModel::data(const QModelIndex &index, int role) const { - if (!index.isValid() || index.row() >= m_importList.count()) + if (!index.isValid() || index.row() >= m_importList.size()) return {}; Import import = m_importList[index.row()]; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index d141b88dc85..c535e78c129 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -216,7 +216,7 @@ void ItemLibraryAssetImporter::parseFiles(const QStringList &filePaths, addInfo(progressTitle); notifyProgress(0, progressTitle); uint count = 0; - double quota = 100.0 / filePaths.count(); + double quota = 100.0 / filePaths.size(); std::function progress = [this, quota, &count, &progressTitle](double value) { notifyProgress(qRound(quota * (count + value)), progressTitle); }; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp index 187bd38e2fa..824027e5558 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp @@ -27,12 +27,12 @@ ItemLibraryCategoriesModel::~ItemLibraryCategoriesModel() int ItemLibraryCategoriesModel::rowCount(const QModelIndex &) const { - return m_categoryList.count(); + return m_categoryList.size(); } QVariant ItemLibraryCategoriesModel::data(const QModelIndex &index, int role) const { - if (!index.isValid() || index.row() >= m_categoryList.count()) { + if (!index.isValid() || index.row() >= m_categoryList.size()) { qWarning() << Q_FUNC_INFO << "invalid index requested"; return {}; } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryitemsmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryitemsmodel.cpp index 8ee40b6d248..65330af023a 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryitemsmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryitemsmodel.cpp @@ -21,7 +21,7 @@ ItemLibraryItemsModel::~ItemLibraryItemsModel() int ItemLibraryItemsModel::rowCount(const QModelIndex &) const { - return m_itemList.count(); + return m_itemList.size(); } QVariant ItemLibraryItemsModel::data(const QModelIndex &index, int role) const diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 21f2e6aa55d..40b7f50d372 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -228,12 +228,12 @@ ItemLibraryModel::~ItemLibraryModel() int ItemLibraryModel::rowCount(const QModelIndex & /*parent*/) const { - return m_importList.count(); + return m_importList.size(); } QVariant ItemLibraryModel::data(const QModelIndex &index, int role) const { - if (!index.isValid() || index.row() >= m_importList.count()) + if (!index.isValid() || index.row() >= m_importList.size()) return {}; if (m_roleNames.contains(role)) { diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index f98284f61d6..d43dcc47c67 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -217,7 +217,7 @@ QString ItemLibraryWidget::getDependencyImport(const Import &import) const QStringList splitImport = import.url().split('.'); - if (splitImport.count() > 1) { + if (splitImport.size() > 1) { if (prefixDependencies.contains(splitImport.first())) return splitImport.first(); } diff --git a/src/plugins/qmldesigner/components/listmodeleditor/listmodeleditormodel.cpp b/src/plugins/qmldesigner/components/listmodeleditor/listmodeleditormodel.cpp index a1b25c37c87..b6009edc774 100644 --- a/src/plugins/qmldesigner/components/listmodeleditor/listmodeleditormodel.cpp +++ b/src/plugins/qmldesigner/components/listmodeleditor/listmodeleditormodel.cpp @@ -29,10 +29,10 @@ public: QVariant maybeConvertToNumber(const QVariant &value) { - if (value.type() == QVariant::Bool) + if (value.typeId() == QVariant::Bool) return value; - if (value.type() == QVariant::String) { + if (value.typeId() == QVariant::String) { const QString text = value.toString(); if (text == "true") return QVariant(true); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp index d4aedb1cec9..d6a098168c7 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp @@ -24,12 +24,12 @@ MaterialBrowserModel::~MaterialBrowserModel() int MaterialBrowserModel::rowCount(const QModelIndex &) const { - return m_materialList.count(); + return m_materialList.size(); } QVariant MaterialBrowserModel::data(const QModelIndex &index, int role) const { - QTC_ASSERT(index.isValid() && index.row() < m_materialList.count(), return {}); + QTC_ASSERT(index.isValid() && index.row() < m_materialList.size(), return {}); QTC_ASSERT(roleNames().contains(role), return {}); QByteArray roleName = roleNames().value(role); @@ -223,7 +223,7 @@ void MaterialBrowserModel::refreshSearch() // if selected material goes invisible, select nearest material if (!isVisible(m_selectedIndex)) { int inc = 1; - int incCap = m_materialList.count(); + int incCap = m_materialList.size(); while (!isEmpty && inc < incCap) { if (isVisible(m_selectedIndex - inc)) { selectMaterial(m_selectedIndex - inc); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp index 4ed241abf98..ba4536132a2 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp @@ -24,12 +24,12 @@ MaterialBrowserTexturesModel::~MaterialBrowserTexturesModel() int MaterialBrowserTexturesModel::rowCount(const QModelIndex &) const { - return m_textureList.count(); + return m_textureList.size(); } QVariant MaterialBrowserTexturesModel::data(const QModelIndex &index, int role) const { - QTC_ASSERT(index.isValid() && index.row() < m_textureList.count(), return {}); + QTC_ASSERT(index.isValid() && index.row() < m_textureList.size(), return {}); QTC_ASSERT(roleNames().contains(role), return {}); if (role == RoleTexSource) { @@ -124,7 +124,7 @@ void MaterialBrowserTexturesModel::refreshSearch() // if selected texture goes invisible, select nearest one if (!isVisible(m_selectedIndex)) { int inc = 1; - int incCap = m_textureList.count(); + int incCap = m_textureList.size(); while (!isEmpty && inc < incCap) { if (isVisible(m_selectedIndex - inc)) { selectTexture(m_selectedIndex - inc); diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp index edae2377bfb..fe84c0c1841 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp @@ -31,7 +31,7 @@ static QObject *variantToQObject(const QVariant &value) { - if (value.userType() == QMetaType::QObjectStar || value.userType() > QMetaType::User) + if (value.typeId() == QMetaType::QObjectStar || value.typeId() > QMetaType::User) return *(QObject **)value.constData(); return nullptr; @@ -143,7 +143,7 @@ void MaterialEditorQmlBackend::createPropertyEditorValue(const QmlObjectNode &qm void MaterialEditorQmlBackend::setValue(const QmlObjectNode &, const PropertyName &name, const QVariant &value) { // Vector*D values need to be split into their subcomponents - if (value.type() == QVariant::Vector2D) { + if (value.typeId() == QVariant::Vector2D) { const char *suffix[2] = {"_x", "_y"}; auto vecValue = value.value(); for (int i = 0; i < 2; ++i) { @@ -154,7 +154,7 @@ void MaterialEditorQmlBackend::setValue(const QmlObjectNode &, const PropertyNam if (propertyValue) propertyValue->setValue(QVariant(vecValue[i])); } - } else if (value.type() == QVariant::Vector3D) { + } else if (value.typeId() == QVariant::Vector3D) { const char *suffix[3] = {"_x", "_y", "_z"}; auto vecValue = value.value(); for (int i = 0; i < 3; ++i) { @@ -165,7 +165,7 @@ void MaterialEditorQmlBackend::setValue(const QmlObjectNode &, const PropertyNam if (propertyValue) propertyValue->setValue(QVariant(vecValue[i])); } - } else if (value.type() == QVariant::Vector4D) { + } else if (value.typeId() == QVariant::Vector4D) { const char *suffix[4] = {"_x", "_y", "_z", "_w"}; auto vecValue = value.value(); for (int i = 0; i < 4; ++i) { diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index 96e01072904..01d55d13db5 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -149,7 +149,7 @@ void MaterialEditorView::changeValue(const QString &name) if (name == "state" && castedValue.toString() == "base state") castedValue = ""; - if (castedValue.type() == QVariant::Color) { + if (castedValue.typeId() == QVariant::Color) { QColor color = castedValue.value(); QColor newColor = QColor(color.name()); newColor.setAlpha(color.alpha()); @@ -161,9 +161,9 @@ void MaterialEditorView::changeValue(const QString &name) } else { // QVector*D(0, 0, 0) detects as null variant though it is valid value if (castedValue.isValid() - && (!castedValue.isNull() || castedValue.type() == QVariant::Vector2D - || castedValue.type() == QVariant::Vector3D - || castedValue.type() == QVariant::Vector4D)) { + && (!castedValue.isNull() || castedValue.typeId() == QVariant::Vector2D + || castedValue.typeId() == QVariant::Vector3D + || castedValue.typeId() == QVariant::Vector4D)) { commitVariantValueToModel(propertyName, castedValue); } } diff --git a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp index 91c300e87a2..304ff91fcda 100644 --- a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp +++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp @@ -115,10 +115,10 @@ ChooseFromPropertyListDialog::ChooseFromPropertyListDialog(const QStringList &pr : QDialog(parent) , m_ui(new Ui::ChooseFromPropertyListDialog) { - if (propNames.count() == 1) { - m_selectedProperty = propNames.first().toLatin1(); - m_isSoloProperty = true; - return; + if (propNames.size() == 1) { + m_selectedProperty = propNames.first().toLatin1(); + m_isSoloProperty = true; + return; } m_ui->setupUi(this); setWindowTitle(tr("Select Property")); diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 16dd2242863..8768f0703cd 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -69,13 +69,12 @@ static QList modelNodesFromMimeData(const QMimeData *mineData, Abstra bool fitsToTargetProperty(const NodeAbstractProperty &targetProperty, const QList &modelNodeList) { - bool const canBeContainer = - NodeHints::fromModelNode(targetProperty.parentModelNode()).canBeContainerFor(modelNodeList.first()); - return !(targetProperty.isNodeProperty() && - modelNodeList.count() > 1) && canBeContainer; + const bool canBeContainer = NodeHints::fromModelNode(targetProperty.parentModelNode()) + .canBeContainerFor(modelNodeList.first()); + return !(targetProperty.isNodeProperty() && modelNodeList.size() > 1) && canBeContainer; } -static inline QString msgUnknownItem(const QString &t) +inline static QString msgUnknownItem(const QString &t) { return NavigatorTreeModel::tr("Unknown component: %1").arg(t); } @@ -289,7 +288,7 @@ Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable; } -void static appendForcedNodes(const NodeListProperty &property, QList &list) +static void appendForcedNodes(const NodeListProperty &property, QList &list) { const QSet set = QSet(list.constBegin(), list.constEnd()); for (const ModelNode &node : property.parentModelNode().directSubModelNodes()) { @@ -411,7 +410,8 @@ int NavigatorTreeModel::rowCount(const QModelIndex &parent) const if (modelNode.defaultNodeListProperty().isValid()) { rows = filteredList(modelNode.defaultNodeListProperty(), m_showOnlyVisibleItems, - m_reverseItemOrder).count(); + m_reverseItemOrder) + .size(); } return rows; @@ -451,7 +451,7 @@ void NavigatorTreeModel::setView(NavigatorView *view) QStringList NavigatorTreeModel::mimeTypes() const { - const static QStringList types({Constants::MIME_TYPE_MODELNODE_LIST, + static const QStringList types({Constants::MIME_TYPE_MODELNODE_LIST, Constants::MIME_TYPE_ITEM_LIBRARY_INFO, Constants::MIME_TYPE_TEXTURE, Constants::MIME_TYPE_MATERIAL, diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index f1a00a36c7c..ceccf25554c 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -42,7 +42,7 @@ #include #include -static inline void setScenePos(const QmlDesigner::ModelNode &modelNode,const QPointF &pos) +inline static void setScenePos(const QmlDesigner::ModelNode &modelNode, const QPointF &pos) { if (modelNode.hasParentProperty() && QmlDesigner::QmlItemNode::isValidQmlItemNode(modelNode.parentProperty().parentModelNode())) { QmlDesigner::QmlItemNode parentNode = modelNode.parentProperty().parentQmlObjectNode().toQmlItemNode(); @@ -58,7 +58,7 @@ static inline void setScenePos(const QmlDesigner::ModelNode &modelNode,const QPo } } -static inline void moveNodesUp(const QList &nodes) +inline static void moveNodesUp(const QList &nodes) { for (const auto &node : nodes) { if (!node.isRootNode() && node.parentProperty().isNodeListProperty()) { @@ -73,7 +73,7 @@ static inline void moveNodesUp(const QList &nodes) } } -static inline void moveNodesDown(const QList &nodes) +inline static void moveNodesDown(const QList &nodes) { for (const auto &node : nodes) { if (!node.isRootNode() && node.parentProperty().isNodeListProperty()) { @@ -280,7 +280,7 @@ void NavigatorView::dragStarted(QMimeData *mimeData) m_widget->update(); } else if (mimeData->hasFormat(Constants::MIME_TYPE_ASSETS)) { const QStringList assetsPaths = QString::fromUtf8(mimeData->data(Constants::MIME_TYPE_ASSETS)).split(','); - if (assetsPaths.count() > 0) { + if (assetsPaths.size() > 0) { auto assetTypeAndData = AssetsLibraryWidget::getAssetTypeAndData(assetsPaths[0]); QString assetType = assetTypeAndData.first; if (assetType == Constants::MIME_TYPE_ASSET_EFFECT) { @@ -517,7 +517,7 @@ void NavigatorView::propagateInstanceErrorToExplorer(const ModelNode &modelNode) void NavigatorView::leftButtonClicked() { - if (selectedModelNodes().count() > 1) + if (selectedModelNodes().size() > 1) return; //Semantics are unclear for multi selection. bool blocked = blockSelectionChangedSignal(true); @@ -541,14 +541,15 @@ void NavigatorView::leftButtonClicked() void NavigatorView::rightButtonClicked() { - if (selectedModelNodes().count() > 1) + if (selectedModelNodes().size() > 1) return; //Semantics are unclear for multi selection. bool blocked = blockSelectionChangedSignal(true); bool reverse = QmlDesignerPlugin::settings().value(DesignerSettingsKey::NAVIGATOR_REVERSE_ITEM_ORDER).toBool(); for (const ModelNode &node : selectedModelNodes()) { - if (!node.isRootNode() && node.parentProperty().isNodeListProperty() && node.parentProperty().count() > 1) { + if (!node.isRootNode() && node.parentProperty().isNodeListProperty() + && node.parentProperty().count() > 1) { int index = node.parentProperty().indexOf(node); bool indexOk = false; diff --git a/src/plugins/qmldesigner/components/pathtool/pathitem.cpp b/src/plugins/qmldesigner/components/pathtool/pathitem.cpp index 10c93ad5594..801be712ad8 100644 --- a/src/plugins/qmldesigner/components/pathtool/pathitem.cpp +++ b/src/plugins/qmldesigner/components/pathtool/pathitem.cpp @@ -587,7 +587,7 @@ QAction *PathItem::createClosedPathAction(QMenu *contextMenu) const closedPathAction->setText(tr("Closed Path")); contextMenu->addAction(closedPathAction); - if (m_cubicSegments.count() == 1) + if (m_cubicSegments.size() == 1) closedPathAction->setDisabled(true); return closedPathAction; @@ -617,7 +617,7 @@ void PathItem::createCubicSegmentContextMenu(CubicSegment &cubicSegment, const Q straightLinePointAction->setText(tr("Make Curve Segment Straight")); contextMenu.addAction(straightLinePointAction); - if (m_cubicSegments.count() == 1 && isClosedPath()) + if (m_cubicSegments.size() == 1 && isClosedPath()) straightLinePointAction->setDisabled(true); QAction *closedPathAction = createClosedPathAction(&contextMenu); @@ -649,7 +649,7 @@ void PathItem::createEditPointContextMenu(const ControlPoint &controlPoint, cons QAction *closedPathAction = createClosedPathAction(&contextMenu); - if (m_cubicSegments.count() <= 1 || (m_cubicSegments.count() == 2 && isClosedPath())) + if (m_cubicSegments.size() <= 1 || (m_cubicSegments.size() == 2 && isClosedPath())) removeEditPointAction->setDisabled(true); QAction *activatedAction = contextMenu.exec(menuPosition); @@ -663,7 +663,7 @@ void PathItem::createEditPointContextMenu(const ControlPoint &controlPoint, cons const QList PathItem::controlPoints() const { QList controlPointList; - controlPointList.reserve((m_cubicSegments.count() * 4)); + controlPointList.reserve((m_cubicSegments.size() * 4)); if (!m_cubicSegments.isEmpty()) controlPointList.append(m_cubicSegments.constFirst().firstControlPoint()); @@ -914,9 +914,9 @@ void PathItem::removeEditPoint(const ControlPoint &controlPoint) { QList cubicSegments = cubicSegmentsContainingControlPoint(controlPoint, m_cubicSegments); - if (cubicSegments.count() == 1) { + if (cubicSegments.size() == 1) { m_cubicSegments.removeOne(cubicSegments.constFirst()); - } else if (cubicSegments.count() == 2){ + } else if (cubicSegments.size() == 2) { CubicSegment mergedCubicSegment = CubicSegment::create(); const CubicSegment &firstCubicSegment = cubicSegments.at(0); const CubicSegment &secondCubicSegment = cubicSegments.at(1); diff --git a/src/plugins/qmldesigner/components/pathtool/pathselectionmanipulator.cpp b/src/plugins/qmldesigner/components/pathtool/pathselectionmanipulator.cpp index 6d620578481..c1c2fd725ac 100644 --- a/src/plugins/qmldesigner/components/pathtool/pathselectionmanipulator.cpp +++ b/src/plugins/qmldesigner/components/pathtool/pathselectionmanipulator.cpp @@ -54,12 +54,12 @@ static ControlPoint getControlPoint(const QList &selectedPoints, c int controlPointIndex = selectedPoints.indexOf(controlPoint); if (controlPointIndex >= 0) { int offsetIndex = controlPointIndex + indexOffset; - if (offsetIndex >= 0 && offsetIndex < selectedPoints.count()) + if (offsetIndex >= 0 && offsetIndex < selectedPoints.size()) return selectedPoints.at(offsetIndex); else if (isClosedPath) { if (offsetIndex == -1) return selectedPoints.constLast(); - else if (offsetIndex < selectedPoints.count()) + else if (offsetIndex < selectedPoints.size()) return selectedPoints.at(1); } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp index 5d8400b47e2..f14e423c9f0 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp @@ -30,7 +30,7 @@ bool AlignDistribute::multiSelection() const if (!m_qmlObjectNode.isValid()) return false; - return m_qmlObjectNode.view()->selectedModelNodes().count() > 1; + return m_qmlObjectNode.view()->selectedModelNodes().size() > 1; } bool AlignDistribute::selectionHasAnchors() const @@ -210,7 +210,7 @@ bool compareByDepth(const ModelNode &node1, const ModelNode &node2) return false; } -static inline QRectF getBoundingRect(const QList &modelNodeList) +inline static QRectF getBoundingRect(const QList &modelNodeList) { QRectF boundingRect; for (const ModelNode &modelNode : modelNodeList) { @@ -222,7 +222,7 @@ static inline QRectF getBoundingRect(const QList &modelNodeList) return boundingRect; } -static inline QSizeF getSummedSize(const QList &modelNodeList) +inline static QSizeF getSummedSize(const QList &modelNodeList) { QSizeF summedSize = QSizeF(0, 0); for (const ModelNode &modelNode : modelNodeList) { @@ -234,7 +234,7 @@ static inline QSizeF getSummedSize(const QList &modelNodeList) return summedSize; } -static inline qreal getInstanceSceneX(const QmlItemNode &qmlItemNode) +inline static qreal getInstanceSceneX(const QmlItemNode &qmlItemNode) { const qreal x = qmlItemNode.modelValue("x").toReal(); if (qmlItemNode.hasInstanceParentItem()) @@ -242,7 +242,7 @@ static inline qreal getInstanceSceneX(const QmlItemNode &qmlItemNode) return x; } -static inline qreal getInstanceSceneY(const QmlItemNode &qmlItemNode) +inline static qreal getInstanceSceneY(const QmlItemNode &qmlItemNode) { const qreal y = qmlItemNode.modelValue("y").toReal(); if (qmlItemNode.hasInstanceParentItem()) diff --git a/src/plugins/qmldesigner/components/propertyeditor/dynamicpropertiesproxymodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/dynamicpropertiesproxymodel.cpp index 689753ff8be..5067a6f5b1b 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/dynamicpropertiesproxymodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/dynamicpropertiesproxymodel.cpp @@ -152,7 +152,7 @@ void DynamicPropertiesProxyModel::createProperty(const QString &name, const QStr TypeName typeName = type.toUtf8(); const auto selectedNodes = dynamicPropertiesModel()->selectedNodes(); - if (selectedNodes.count() == 1) { + if (selectedNodes.size() == 1) { const ModelNode modelNode = selectedNodes.constFirst(); if (modelNode.isValid()) { if (modelNode.hasProperty(name.toUtf8())) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index a81560f5662..d037846df75 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -100,11 +100,11 @@ int GradientModel::addStop(qreal position, const QColor &color) const QList stopNodes = gradientNode.nodeListProperty("stops").toModelNodeList(); - for (int i = 0; i < stopNodes.count(); i++) { + for (int i = 0; i < stopNodes.size(); i++) { if (QmlDesigner::QmlObjectNode(stopNodes.at(i)).modelValue("position").toReal() < position) properPos = i + 1; } - gradientNode.nodeListProperty("stops").slide(stopNodes.count() - 1, properPos); + gradientNode.nodeListProperty("stops").slide(stopNodes.size() - 1, properPos); setupModel(); resetPuppet(); diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientpresetlistmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientpresetlistmodel.cpp index 5b25f56f511..b4b41773321 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientpresetlistmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientpresetlistmodel.cpp @@ -28,12 +28,12 @@ GradientPresetListModel::~GradientPresetListModel() int GradientPresetListModel::rowCount(const QModelIndex & /*parent*/) const { - return m_items.count(); + return m_items.size(); } QVariant GradientPresetListModel::data(const QModelIndex &index, int role) const { - if (index.isValid() && (index.row() >= 0) && (index.row() < m_items.count())) { + if (index.isValid() && (index.row() >= 0) && (index.row() < m_items.size())) { if (m_roleNames.contains(role)) { QVariant value = m_items.at(index.row()) .getProperty(static_cast(role)); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index 18ac064737c..3b991a5f622 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -41,7 +41,7 @@ static Q_LOGGING_CATEGORY(propertyEditorBenchmark, "qtc.propertyeditor.load", Qt static QmlJS::SimpleReaderNode::Ptr s_templateConfiguration = QmlJS::SimpleReaderNode::Ptr(); -static inline QString propertyTemplatesPath() +inline static QString propertyTemplatesPath() { return QmlDesigner::PropertyEditorQmlBackend::propertyEditorResourcesPath() + QStringLiteral("/PropertyTemplates/"); } @@ -71,7 +71,7 @@ QStringList variantToStringList(const QVariant &variant) { static QObject *variantToQObject(const QVariant &value) { - if (value.userType() == QMetaType::QObjectStar || value.userType() > QMetaType::User) + if (value.typeId() == QMetaType::QObjectStar || value.typeId() > QMetaType::User) return *(QObject **)value.constData(); return nullptr; @@ -323,7 +323,7 @@ void PropertyEditorQmlBackend::createPropertyEditorValue(const QmlObjectNode &qm void PropertyEditorQmlBackend::setValue(const QmlObjectNode & , const PropertyName &name, const QVariant &value) { // Vector*D values need to be split into their subcomponents - if (value.type() == QVariant::Vector2D) { + if (value.typeId() == QVariant::Vector2D) { const char *suffix[2] = {"_x", "_y"}; auto vecValue = value.value(); for (int i = 0; i < 2; ++i) { @@ -334,7 +334,7 @@ void PropertyEditorQmlBackend::setValue(const QmlObjectNode & , const PropertyNa if (propertyValue) propertyValue->setValue(QVariant(vecValue[i])); } - } else if (value.type() == QVariant::Vector3D) { + } else if (value.typeId() == QVariant::Vector3D) { const char *suffix[3] = {"_x", "_y", "_z"}; auto vecValue = value.value(); for (int i = 0; i < 3; ++i) { @@ -345,7 +345,7 @@ void PropertyEditorQmlBackend::setValue(const QmlObjectNode & , const PropertyNa if (propertyValue) propertyValue->setValue(QVariant(vecValue[i])); } - } else if (value.type() == QVariant::Vector4D) { + } else if (value.typeId() == QVariant::Vector4D) { const char *suffix[4] = {"_x", "_y", "_z", "_w"}; auto vecValue = value.value(); for (int i = 0; i < 4; ++i) { @@ -495,7 +495,8 @@ void PropertyEditorQmlBackend::setup(const QmlObjectNode &qmlObjectNode, const Q if (!qmlObjectNode.isValid()) return; - context()->setContextProperty(QLatin1String("propertyCount"), QVariant(qmlObjectNode.modelNode().properties().count())); + context()->setContextProperty(QLatin1String("propertyCount"), + QVariant(qmlObjectNode.modelNode().properties().size())); QStringList stateNames = qmlObjectNode.allStateNames(); stateNames.prepend("base state"); @@ -862,7 +863,7 @@ NodeMetaInfo PropertyEditorQmlBackend::findCommonAncestor(const ModelNode &node) AbstractView *view = node.view(); - if (view->selectedModelNodes().count() > 1) { + if (view->selectedModelNodes().size() > 1) { NodeMetaInfo commonClass = node.metaInfo(); for (const ModelNode ¤tNode : view->selectedModelNodes()) { if (currentNode.metaInfo().isValid() && !currentNode.metaInfo().isBasedOn(commonClass)) @@ -977,7 +978,7 @@ QString PropertyEditorQmlBackend::locateQmlFile(const NodeMetaInfo &info, const const QDir importDir(info.importDirectoryPath() + Constants::QML_DESIGNER_SUBFOLDER); const QDir importDirVersion(info.importDirectoryPath() + QStringLiteral(".") + QString::number(info.majorVersion()) + Constants::QML_DESIGNER_SUBFOLDER); - const QString relativePathWithoutEnding = relativePath.left(relativePath.count() - 4); + const QString relativePathWithoutEnding = relativePath.left(relativePath.size() - 4); const QString relativePathWithVersion = QString("%1_%2_%3.qml").arg(relativePathWithoutEnding ).arg(info.majorVersion()).arg(info.minorVersion()); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index 89f8a77b0dc..3f3ddaaf162 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -41,7 +41,7 @@ QVariant PropertyEditorValue::value() const static bool cleverDoubleCompare(const QVariant &value1, const QVariant &value2) { - if (value1.type() == QVariant::Double && value2.type() == QVariant::Double) { + if (value1.typeId() == QVariant::Double && value2.typeId() == QVariant::Double) { // ignore slight changes on doubles if (qFuzzyCompare(value1.toDouble(), value2.toDouble())) return true; @@ -51,16 +51,16 @@ static bool cleverDoubleCompare(const QVariant &value1, const QVariant &value2) static bool cleverColorCompare(const QVariant &value1, const QVariant &value2) { - if (value1.type() == QVariant::Color && value2.type() == QVariant::Color) { + if (value1.typeId() == QVariant::Color && value2.typeId() == QVariant::Color) { QColor c1 = value1.value(); QColor c2 = value2.value(); return c1.name() == c2.name() && c1.alpha() == c2.alpha(); } - if (value1.type() == QVariant::String && value2.type() == QVariant::Color) + if (value1.typeId() == QVariant::String && value2.typeId() == QVariant::Color) return cleverColorCompare(QVariant(QColor(value1.toString())), value2); - if (value1.type() == QVariant::Color && value2.type() == QVariant::String) + if (value1.typeId() == QVariant::Color && value2.typeId() == QVariant::String) return cleverColorCompare(value1, QVariant(QColor(value2.toString()))); return false; @@ -71,7 +71,7 @@ static bool cleverColorCompare(const QVariant &value1, const QVariant &value2) static void fixAmbigousColorNames(const ModelNode &modelNode, const PropertyName &name, QVariant *value) { if (auto metaInfo = modelNode.metaInfo(); metaInfo.property(name).propertyType().isColor()) { - if (value->type() == QVariant::Color) { + if (value->typeId() == QVariant::Color) { QColor color = value->value(); int alpha = color.alpha(); color = QColor(color.name()); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index 17471733ae5..976d2078a56 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -201,7 +201,7 @@ void PropertyEditorView::changeValue(const QString &name) if (name == "state" && castedValue.toString() == "base state") castedValue = ""; - if (castedValue.type() == QVariant::Color) { + if (castedValue.typeId() == QVariant::Color) { QColor color = castedValue.value(); QColor newColor = QColor(color.name()); newColor.setAlpha(color.alpha()); @@ -214,9 +214,9 @@ void PropertyEditorView::changeValue(const QString &name) } else { // QVector*D(0, 0, 0) detects as null variant though it is valid value if (castedValue.isValid() - && (!castedValue.isNull() || castedValue.type() == QVariant::Vector2D - || castedValue.type() == QVariant::Vector3D - || castedValue.type() == QVariant::Vector4D)) { + && (!castedValue.isNull() || castedValue.typeId() == QVariant::Vector2D + || castedValue.typeId() == QVariant::Vector3D + || castedValue.typeId() == QVariant::Vector4D)) { commitVariantValueToModel(propertyName, castedValue); } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.cpp b/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.cpp index f121489916c..96ec5f92e7c 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.cpp @@ -50,7 +50,7 @@ bool QmlModelNodeProxy::multiSelection() const if (!m_qmlObjectNode.isValid()) return false; - return m_qmlObjectNode.view()->selectedModelNodes().count() > 1; + return m_qmlObjectNode.view()->selectedModelNodes().size() > 1; } QString QmlModelNodeProxy::nodeId() const diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorqmlbackend.cpp index e54909049ed..1325ade10c7 100644 --- a/src/plugins/qmldesigner/components/textureeditor/textureeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorqmlbackend.cpp @@ -34,7 +34,7 @@ static QObject *variantToQObject(const QVariant &value) { - if (value.userType() == QMetaType::QObjectStar || value.userType() > QMetaType::User) + if (value.typeId() == QMetaType::QObjectStar || value.typeId() > QMetaType::User) return *(QObject **)value.constData(); return nullptr; @@ -109,7 +109,7 @@ void TextureEditorQmlBackend::createPropertyEditorValue(const QmlObjectNode &qml void TextureEditorQmlBackend::setValue(const QmlObjectNode &, const PropertyName &name, const QVariant &value) { // Vector*D values need to be split into their subcomponents - if (value.type() == QVariant::Vector2D) { + if (value.typeId() == QVariant::Vector2D) { const char *suffix[2] = {"_x", "_y"}; auto vecValue = value.value(); for (int i = 0; i < 2; ++i) { @@ -120,7 +120,7 @@ void TextureEditorQmlBackend::setValue(const QmlObjectNode &, const PropertyName if (propertyValue) propertyValue->setValue(QVariant(vecValue[i])); } - } else if (value.type() == QVariant::Vector3D) { + } else if (value.typeId() == QVariant::Vector3D) { const char *suffix[3] = {"_x", "_y", "_z"}; auto vecValue = value.value(); for (int i = 0; i < 3; ++i) { @@ -131,7 +131,7 @@ void TextureEditorQmlBackend::setValue(const QmlObjectNode &, const PropertyName if (propertyValue) propertyValue->setValue(QVariant(vecValue[i])); } - } else if (value.type() == QVariant::Vector4D) { + } else if (value.typeId() == QVariant::Vector4D) { const char *suffix[4] = {"_x", "_y", "_z", "_w"}; auto vecValue = value.value(); for (int i = 0; i < 4; ++i) { diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp index a4132d0eb7a..250f3324e4e 100644 --- a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp +++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp @@ -141,7 +141,7 @@ void TextureEditorView::changeValue(const QString &name) if (name == "state" && castedValue.toString() == "base state") castedValue = ""; - if (castedValue.type() == QVariant::Color) { + if (castedValue.typeId() == QVariant::Color) { QColor color = castedValue.value(); QColor newColor = QColor(color.name()); newColor.setAlpha(color.alpha()); @@ -153,9 +153,9 @@ void TextureEditorView::changeValue(const QString &name) } else { // QVector*D(0, 0, 0) detects as null variant though it is valid value if (castedValue.isValid() - && (!castedValue.isNull() || castedValue.type() == QVariant::Vector2D - || castedValue.type() == QVariant::Vector3D - || castedValue.type() == QVariant::Vector4D)) { + && (!castedValue.isNull() || castedValue.typeId() == QVariant::Vector2D + || castedValue.typeId() == QVariant::Vector3D + || castedValue.typeId() == QVariant::Vector4D)) { commitVariantValueToModel(propertyName, castedValue); } } diff --git a/src/plugins/qmldesigner/components/timelineeditor/canvas.cpp b/src/plugins/qmldesigner/components/timelineeditor/canvas.cpp index f82d2098c6e..66f207bd836 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/canvas.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/canvas.cpp @@ -134,7 +134,7 @@ void Canvas::paintCurve(QPainter *painter, const EasingCurve &curve, const QColo void Canvas::paintControlPoints(QPainter *painter, const EasingCurve &curve) { QVector points = curve.toCubicSpline(); - int count = points.count(); + int count = points.size(); if (count <= 1) return; diff --git a/src/plugins/qmldesigner/components/timelineeditor/easingcurve.cpp b/src/plugins/qmldesigner/components/timelineeditor/easingcurve.cpp index 92f7590503e..ae9833e46ec 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/easingcurve.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/easingcurve.cpp @@ -49,7 +49,7 @@ void EasingCurve::registerStreamOperators() int EasingCurve::count() const { - return toCubicSpline().count(); + return toCubicSpline().size(); } int EasingCurve::active() const @@ -59,7 +59,7 @@ int EasingCurve::active() const int EasingCurve::segmentCount() const { - return toCubicSpline().count() / 3; + return toCubicSpline().size() / 3; } bool EasingCurve::isLegal() const @@ -127,10 +127,10 @@ bool EasingCurve::fromString(const QString &code) if (code.startsWith(QLatin1Char('[')) && code.endsWith(QLatin1Char(']'))) { const auto stringList = code.mid(1, code.size() - 2).split(QLatin1Char(','), Qt::SkipEmptyParts); - if (stringList.count() >= 6 && (stringList.count() % 6 == 0)) { + if (stringList.size() >= 6 && (stringList.size() % 6 == 0)) { bool checkX, checkY; QVector points; - for (int i = 0; i < stringList.count(); ++i) { + for (int i = 0; i < stringList.size(); ++i) { QPointF point; point.rx() = stringList[i].toDouble(&checkX); point.ry() = stringList[++i].toDouble(&checkY); @@ -146,7 +146,7 @@ bool EasingCurve::fromString(const QString &code) QEasingCurve easingCurve(QEasingCurve::BezierSpline); - for (int i = 0; i < points.count() / 3; ++i) { + for (int i = 0; i < points.size() / 3; ++i) { easingCurve.addCubicBezierSegment(points.at(i * 3), points.at(i * 3 + 1), points.at(i * 3 + 2)); @@ -176,7 +176,7 @@ QPainterPath EasingCurve::path() const QVector controlPoints = toCubicSpline(); - int numSegments = controlPoints.count() / 3; + int numSegments = controlPoints.size() / 3; for (int i = 0; i < numSegments; i++) { QPointF p1 = controlPoints.at(i * 3); QPointF p2 = controlPoints.at(i * 3 + 1); @@ -202,7 +202,7 @@ QPointF EasingCurve::point(int idx) const { QVector controlPoints = toCubicSpline(); - QTC_ASSERT(controlPoints.count() > idx || idx < 0, return QPointF()); + QTC_ASSERT(controlPoints.size() > idx || idx < 0, return QPointF()); return controlPoints.at(idx); } @@ -259,7 +259,7 @@ void EasingCurve::makeSmooth(int idx) before = controlPoints.at(idx - 3); QPointF after = end(); - if ((idx + 3) < controlPoints.count()) + if ((idx + 3) < controlPoints.size()) after = controlPoints.at(idx + 3); QPointF tangent = (after - before) / 6; @@ -269,7 +269,7 @@ void EasingCurve::makeSmooth(int idx) if (idx > 0) controlPoints[idx - 1] = thisPoint - tangent; - if (idx + 1 < controlPoints.count()) + if (idx + 1 < controlPoints.size()) controlPoints[idx + 1] = thisPoint + tangent; fromCubicSpline(controlPoints); @@ -288,7 +288,7 @@ void EasingCurve::breakTangent(int idx) before = controlPoints.at(idx - 3); QPointF after = end(); - if ((idx + 3) < controlPoints.count()) + if ((idx + 3) < controlPoints.size()) after = controlPoints.at(idx + 3); QPointF thisPoint = controlPoints.at(idx); @@ -296,7 +296,7 @@ void EasingCurve::breakTangent(int idx) if (idx > 0) controlPoints[idx - 1] = (before - thisPoint) / 3 + thisPoint; - if (idx + 1 < controlPoints.count()) + if (idx + 1 < controlPoints.size()) controlPoints[idx + 1] = (after - thisPoint) / 3 + thisPoint; fromCubicSpline(controlPoints); @@ -326,7 +326,7 @@ void EasingCurve::addPoint(const QPointF &point) } QPointF after = end(); - if ((splitIndex + 3) < controlPoints.count()) { + if ((splitIndex + 3) < controlPoints.size()) { after = controlPoints.at(splitIndex + 3); } @@ -394,7 +394,7 @@ void EasingCurve::fromCubicSpline(const QVector &points) { QEasingCurve tmp(QEasingCurve::BezierSpline); - int numSegments = points.count() / 3; + int numSegments = points.size() / 3; for (int i = 0; i < numSegments; ++i) { tmp.addCubicBezierSegment(points.at(i * 3), points.at(i * 3 + 1), points.at(i * 3 + 2)); } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineanimationform.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineanimationform.cpp index 494674891ea..dbb34c02c8e 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineanimationform.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineanimationform.cpp @@ -222,7 +222,7 @@ void TimelineAnimationForm::populateStateComboBox() if (m_animation.signalHandlerProperty("onFinished").isValid()) { const QString source = m_animation.signalHandlerProperty("onFinished").source(); const QStringList list = source.split("="); - if (list.count() == 2) { + if (list.size() == 2) { QString name = list.last().trimmed(); name.chop(1); name.remove(0, 1); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinecontrols.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinecontrols.cpp index d9f3dd4d167..708bd8c4d3e 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinecontrols.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinecontrols.cpp @@ -78,7 +78,7 @@ QVariant FloatControl::controlValue() const void FloatControl::setControlValue(const QVariant &value) { - if (value.userType() != QMetaType::Float && value.userType() != QMetaType::Double) + if (value.typeId() != QMetaType::Float && value.typeId() != QMetaType::Double) return; QSignalBlocker blocker(this); @@ -129,7 +129,7 @@ QVariant ColorControl::controlValue() const void ColorControl::setControlValue(const QVariant &value) { - if (value.userType() != QMetaType::QColor) + if (value.typeId() != QMetaType::QColor) return; m_color = qvariant_cast(value); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index ddddc7c753a..f116d96223e 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -386,7 +386,7 @@ bool AbstractScrollGraphicsScene::isKeyframeSelected(TimelineKeyframeItem *keyfr bool AbstractScrollGraphicsScene::multipleKeyframesSelected() const { - return m_selectedKeyframes.count() > 1; + return m_selectedKeyframes.size() > 1; } void TimelineGraphicsScene::invalidateSectionForTarget(const ModelNode &target) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp index 90e4a66acf4..6dcb39f2a01 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp @@ -105,7 +105,7 @@ static void editValue(const ModelNode &frameNode, const std::pair if (newFrame != frame) frameNode.variantProperty("frame").setValue(newFrame); - int userType = value.userType(); + int userType = value.typeId(); QVariant newValue = dialog->value(); if (newValue.canConvert(userType)) { @@ -264,7 +264,7 @@ bool TimelinePropertyItem::isSelected() const QString convertVariant(const QVariant &variant) { - if (variant.userType() == QMetaType::QColor) + if (variant.typeId() == QMetaType::QColor) return variant.toString(); return QString::number(variant.toFloat(), 'f', 2); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp index 4604e9e3b86..7a733c37291 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp @@ -420,7 +420,7 @@ void TimelineSectionItem::invalidateHeight() visible = false; } else { height = TimelineConstants::sectionHeight - + m_timeline.keyframeGroupsForTarget(m_targetNode).count() + + m_timeline.keyframeGroupsForTarget(m_targetNode).size() * TimelineConstants::sectionHeight; visible = true; } @@ -801,7 +801,7 @@ void TimelineRulerSectionItem::extendPlaybackLoop(const QList &positions, qreal right = m_playbackLoopEnd; if (reset) { - if (positions.count() >= 2) { + if (positions.size() >= 2) { left = m_duration; right = 0; } else { diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp index 68aeefcd238..230ab401a7b 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp @@ -169,7 +169,7 @@ void TimelineSelectionTool::aboutToSelect(SelectionMode mode, QList(scene())->layoutRuler()->extendPlaybackLoop(m_playbackLoopTimeSteps, mode == SelectionMode::Toggle); // TODO: Highlighting items with selection tool is set or added to loop range. Select shortcut for this QDS-4941 scene()->selectKeyframes(mode, m_aboutToSelectBuffer); diff --git a/src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp b/src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp index 1b9f1e3271f..c917dfe8a84 100644 --- a/src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp +++ b/src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp @@ -86,7 +86,7 @@ CrumbleBarModel::CrumbleBarModel(QObject *) int CrumbleBarModel::rowCount(const QModelIndex &) const { - return crumbleBar()->path().count(); + return crumbleBar()->path().size(); } QHash CrumbleBarModel::roleNames() const @@ -148,7 +148,7 @@ WorkspaceModel::WorkspaceModel(QObject *) int WorkspaceModel::rowCount(const QModelIndex &) const { if (designModeWidget() && designModeWidget()->dockManager()) - return designModeWidget()->dockManager()->workspaces().count(); + return designModeWidget()->dockManager()->workspaces().size(); return 0; } @@ -476,7 +476,7 @@ void ToolBarBackend::setCurrentStyle(int index) QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_STATUSBAR_SET_STYLE); const QList items = ChangeStyleWidgetAction::getAllStyleItems(); - QTC_ASSERT(items.count() > index, return ); + QTC_ASSERT(items.size() > index, return); QTC_ASSERT(index > 0, return ); QTC_ASSERT(currentDesignDocument(), return ); @@ -499,7 +499,7 @@ void ToolBarBackend::setCurrentKit(int index) const auto kits = ProjectExplorer::KitManager::kits(); - QTC_ASSERT(kits.count() > index, return ); + QTC_ASSERT(kits.size() > index, return); QTC_ASSERT(index >= 0, return ); const auto kit = kits.at(index); diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorsectionitem.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorsectionitem.cpp index d331e82b403..a5ec84fad2c 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorsectionitem.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorsectionitem.cpp @@ -441,7 +441,7 @@ void TransitionEditorSectionItem::invalidateHeight() model->qtQuickPropertyAnimationMetaInfo()); height = TimelineConstants::sectionHeight - + propertyAnimations.count() * TimelineConstants::sectionHeight; + + propertyAnimations.size() * TimelineConstants::sectionHeight; visible = true; } diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitionform.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitionform.cpp index 9613be51785..c58bdf61d52 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitionform.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitionform.cpp @@ -66,7 +66,7 @@ TransitionForm::TransitionForm(QWidget *parent) QTC_ASSERT(m_transition.isValid(), return ); const QmlItemNode root(m_transition.view()->rootModelNode()); QTC_ASSERT(root.isValid(), return ); - const int stateCount = root.states().names().count(); + const int stateCount = root.states().names().size(); QStringList stateNames; @@ -76,7 +76,7 @@ TransitionForm::TransitionForm(QWidget *parent) } QString toValue; - if (stateCount == stateNames.count()) + if (stateCount == stateNames.size()) toValue = "*"; else toValue = stateNames.join(","); @@ -90,7 +90,7 @@ TransitionForm::TransitionForm(QWidget *parent) QTC_ASSERT(m_transition.isValid(), return ); const QmlItemNode root(m_transition.view()->rootModelNode()); QTC_ASSERT(root.isValid(), return ); - const int stateCount = root.states().names().count(); + const int stateCount = root.states().names().size(); QStringList stateNames; @@ -100,7 +100,7 @@ TransitionForm::TransitionForm(QWidget *parent) } QString fromValue; - if (stateCount == stateNames.count()) + if (stateCount == stateNames.size()) fromValue = "*"; else fromValue = stateNames.join(","); diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecacheconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/imagecache/imagecacheconnectionmanager.cpp index ee40b3ec318..20728b445e4 100644 --- a/src/plugins/qmldesigner/designercore/imagecache/imagecacheconnectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/imagecache/imagecacheconnectionmanager.cpp @@ -47,7 +47,7 @@ void ImageCacheConnectionManager::dispatchCommand(const QVariant &command, { static const int capturedDataCommandType = QMetaType::type("CapturedDataCommand"); - if (command.userType() == capturedDataCommandType) { + if (command.typeId() == capturedDataCommandType) { m_captureCallback(command.value().image); m_capturedDataArrived = true; } diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index bfc1570cb62..657093b0ac0 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -74,7 +74,7 @@ public: NodeWithComponentSource = 2 }; - ModelNode(); + ModelNode() = default; ModelNode(const Internal::InternalNodePointer &internalNode, Model *model, const AbstractView *view); ModelNode(const ModelNode &modelNode, AbstractView *view); ModelNode(const ModelNode &) = default; @@ -173,7 +173,7 @@ public: void selectNode(); void deselectNode(); - static int variantUserType(); + static int variantTypeId(); QVariant toVariant() const; std::optional auxiliaryData(AuxiliaryDataKeyView key) const; diff --git a/src/plugins/qmldesigner/designercore/include/propertynode.h b/src/plugins/qmldesigner/designercore/include/propertynode.h index 2489bac3c03..2df0b195a46 100644 --- a/src/plugins/qmldesigner/designercore/include/propertynode.h +++ b/src/plugins/qmldesigner/designercore/include/propertynode.h @@ -12,7 +12,7 @@ class QMLDESIGNERCORE_EXPORT PropertyNode // : public BaseModelNode public: PropertyNode(); -// static int variantUserType() { return qMetaTypeId(); } +// static int variantTypeId() { return qMetaTypeId(); } // static QVariant toVariant(const InternalNode::Pointer &internalNodePointer) { return QVariant::fromValue(internalNodePointer); } }; diff --git a/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp index 15f84e92c97..39da5f99ba7 100644 --- a/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp @@ -107,8 +107,8 @@ void BaseConnectionManager::readDataStream(Connection &connection) connection.blockSize = 0; #ifdef NANOTRACE_ENABLED - if (command.userType() != QMetaType::type("PuppetAliveCommand")) { - if (command.userType() == QMetaType::type("SyncNanotraceCommand")) { + if (command.typeId() != QMetaType::type("PuppetAliveCommand")) { + if (command.typeId() == QMetaType::type("SyncNanotraceCommand")) { SyncNanotraceCommand cmd = command.value(); NANOTRACE_INSTANT_ARGS("Sync", "readCommand", {"name", cmd.name().toStdString()}, diff --git a/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.cpp index b2b8f297f71..77b087e8c9e 100644 --- a/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.cpp @@ -55,7 +55,7 @@ void CapturingConnectionManager::writeCommand(const QVariant &command) InteractiveConnectionManager::writeCommand(command); if (m_captureFileForTest.isWritable()) { - qDebug() << "command name: " << QMetaType::typeName(command.userType()); + qDebug() << "command name: " << QMetaType::typeName(command.typeId()); writeCommandToIODevice(command, &m_captureFileForTest, writeCommandCounter()); qDebug() << "\tcatpure file offset: " << m_captureFileForTest.pos(); } diff --git a/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp index 33dad3c37df..cd36cac76da 100644 --- a/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp @@ -70,7 +70,7 @@ void InteractiveConnectionManager::dispatchCommand(const QVariant &command, Conn { static const int puppetAliveCommandType = QMetaType::type("PuppetAliveCommand"); - if (command.userType() == puppetAliveCommandType) { + if (command.typeId() == puppetAliveCommandType) { puppetAlive(connection); } else { BaseConnectionManager::dispatchCommand(command, connection); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index 7ed29063383..414a05683e3 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -296,7 +296,7 @@ QVariant NodeInstance::property(const PropertyName &name) const if (index != -1) { PropertyName parentPropName = name.left(index); QVariant varValue = d->propertyValues.value(parentPropName); - if (varValue.type() == QVariant::Vector2D) { + if (varValue.typeId() == QVariant::Vector2D) { auto value = varValue.value(); char subProp = name.right(1)[0]; float subValue = 0.f; @@ -312,7 +312,7 @@ QVariant NodeInstance::property(const PropertyName &name) const break; } return QVariant(subValue); - } else if (varValue.type() == QVariant::Vector3D) { + } else if (varValue.typeId() == QVariant::Vector3D) { auto value = varValue.value(); char subProp = name.right(1)[0]; float subValue = 0.f; @@ -331,7 +331,7 @@ QVariant NodeInstance::property(const PropertyName &name) const break; } return QVariant(subValue); - } else if (varValue.type() == QVariant::Vector4D) { + } else if (varValue.typeId() == QVariant::Vector4D) { auto value = varValue.value(); char subProp = name.right(1)[0]; float subValue = 0.f; @@ -417,9 +417,9 @@ void NodeInstance::setProperty(const PropertyName &name, const QVariant &value) QVariant oldValue = d->propertyValues.value(parentPropName); QVariant newValueVar; bool update = false; - if (oldValue.type() == QVariant::Vector2D) { + if (oldValue.typeId() == QVariant::Vector2D) { QVector2D newValue; - if (oldValue.type() == QVariant::Vector2D) + if (oldValue.typeId() == QVariant::Vector2D) newValue = oldValue.value(); if (name.endsWith(".x")) { newValue.setX(value.toFloat()); @@ -429,9 +429,9 @@ void NodeInstance::setProperty(const PropertyName &name, const QVariant &value) update = true; } newValueVar = newValue; - } else if (oldValue.type() == QVariant::Vector3D) { + } else if (oldValue.typeId() == QVariant::Vector3D) { QVector3D newValue; - if (oldValue.type() == QVariant::Vector3D) + if (oldValue.typeId() == QVariant::Vector3D) newValue = oldValue.value(); if (name.endsWith(".x")) { newValue.setX(value.toFloat()); @@ -444,9 +444,9 @@ void NodeInstance::setProperty(const PropertyName &name, const QVariant &value) update = true; } newValueVar = newValue; - } else if (oldValue.type() == QVariant::Vector4D) { + } else if (oldValue.typeId() == QVariant::Vector4D) { QVector4D newValue; - if (oldValue.type() == QVariant::Vector4D) + if (oldValue.typeId() == QVariant::Vector4D) newValue = oldValue.value(); if (name.endsWith(".x")) { newValue.setX(value.toFloat()); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 2893d0e1314..8b80a9c4af2 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -107,37 +107,38 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command) static const int puppetToCreatorCommandType = QMetaType::type("PuppetToCreatorCommand"); static const int SyncNanotraceCommandType = QMetaType::type("SyncNanotraceCommand"); - qCInfo(instanceViewBenchmark) << "dispatching command" << command.userType() << command.typeName(); - if (command.userType() == informationChangedCommandType) { + qCInfo(instanceViewBenchmark) << "dispatching command" << command.typeId() << command.typeName(); + if (command.typeId() == informationChangedCommandType) { nodeInstanceClient()->informationChanged(command.value()); - } else if (command.userType() == valuesChangedCommandType) { + } else if (command.typeId() == valuesChangedCommandType) { nodeInstanceClient()->valuesChanged(command.value()); - } else if (command.userType() == valuesModifiedCommandType) { + } else if (command.typeId() == valuesModifiedCommandType) { nodeInstanceClient()->valuesModified(command.value()); - } else if (command.userType() == pixmapChangedCommandType) { + } else if (command.typeId() == pixmapChangedCommandType) { nodeInstanceClient()->pixmapChanged(command.value()); - } else if (command.userType() == childrenChangedCommandType) { + } else if (command.typeId() == childrenChangedCommandType) { nodeInstanceClient()->childrenChanged(command.value()); - } else if (command.userType() == statePreviewImageChangedCommandType) { + } else if (command.typeId() == statePreviewImageChangedCommandType) { nodeInstanceClient()->statePreviewImagesChanged(command.value()); - } else if (command.userType() == componentCompletedCommandType) { + } else if (command.typeId() == componentCompletedCommandType) { nodeInstanceClient()->componentCompleted(command.value()); - } else if (command.userType() == tokenCommandType) { + } else if (command.typeId() == tokenCommandType) { nodeInstanceClient()->token(command.value()); - } else if (command.userType() == debugOutputCommandType) { + } else if (command.typeId() == debugOutputCommandType) { nodeInstanceClient()->debugOutput(command.value()); - } else if (command.userType() == changeSelectionCommandType) { + } else if (command.typeId() == changeSelectionCommandType) { nodeInstanceClient()->selectionChanged(command.value()); - } else if (command.userType() == puppetToCreatorCommandType) { + } else if (command.typeId() == puppetToCreatorCommandType) { nodeInstanceClient()->handlePuppetToCreatorCommand(command.value()); - } else if (command.userType() == SyncNanotraceCommandType) { + } else if (command.typeId() == SyncNanotraceCommandType) { // ignore. } else { QTC_ASSERT(false, ); Q_ASSERT(false); } - qCInfo(instanceViewBenchmark) << "dispatching command" << "done" << command.userType(); + qCInfo(instanceViewBenchmark) << "dispatching command" + << "done" << command.typeId(); } NodeInstanceClientInterface *NodeInstanceServerProxy::nodeInstanceClient() const @@ -173,7 +174,7 @@ QString NodeInstanceServerProxy::qrcMappingString() const void NodeInstanceServerProxy::writeCommand(const QVariant &command) { #ifdef NANOTRACE_ENABLED - if (command.userType() == QMetaType::type("SyncNanotraceCommand")) { + if (command.typeId() == QMetaType::type("SyncNanotraceCommand")) { SyncNanotraceCommand cmd = command.value(); NANOTRACE_INSTANT_ARGS("Sync", "writeCommand", {"name", cmd.name().toStdString()}, diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 0864e137c24..e5775228ef7 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -201,7 +201,7 @@ NodeInstanceView::~NodeInstanceView() //\{ -bool static isSkippedRootNode(const ModelNode &node) +static bool isSkippedRootNode(const ModelNode &node) { static const PropertyNameList skipList({"Qt.ListModel", "QtQuick.ListModel", "Qt.ListModel", "QtQuick.ListModel"}); @@ -211,8 +211,7 @@ bool static isSkippedRootNode(const ModelNode &node) return false; } - -bool static isSkippedNode(const ModelNode &node) +static bool isSkippedNode(const ModelNode &node) { static const PropertyNameList skipList({"QtQuick.XmlRole", "Qt.XmlRole", "QtQuick.ListElement", "Qt.ListElement"}); @@ -222,7 +221,7 @@ bool static isSkippedNode(const ModelNode &node) return false; } -bool static parentTakesOverRendering(const ModelNode &modelNode) +static bool parentTakesOverRendering(const ModelNode &modelNode) { ModelNode currentNode = modelNode; @@ -1503,7 +1502,7 @@ void NodeInstanceView::pixmapChanged(const PixmapChangedCommand &command) } } - m_nodeInstanceServer->benchmark(Q_FUNC_INFO + QString::number(renderImageChangeSet.count())); + m_nodeInstanceServer->benchmark(Q_FUNC_INFO + QString::number(renderImageChangeSet.size())); if (!renderImageChangeSet.isEmpty()) emitInstancesRenderImageChanged(Utils::toList(renderImageChangeSet)); @@ -1542,7 +1541,7 @@ void NodeInstanceView::informationChanged(const InformationChangedCommand &comma QMultiHash informationChangeHash = informationChanged(command.informations()); - m_nodeInstanceServer->benchmark(Q_FUNC_INFO + QString::number(informationChangeHash.count())); + m_nodeInstanceServer->benchmark(Q_FUNC_INFO + QString::number(informationChangeHash.size())); if (!informationChangeHash.isEmpty()) emitInstanceInformationsChange(informationChangeHash); @@ -1615,7 +1614,7 @@ void NodeInstanceView::componentCompleted(const ComponentCompletedCommand &comma nodeVector.append(modelNodeForInternalId(instanceId)); } - m_nodeInstanceServer->benchmark(Q_FUNC_INFO + QString::number(nodeVector.count())); + m_nodeInstanceServer->benchmark(Q_FUNC_INFO + QString::number(nodeVector.size())); if (!nodeVector.isEmpty()) emitInstancesCompleted(nodeVector); diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp index f418d003e10..a56221f6438 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp @@ -289,7 +289,7 @@ inline QString deEscape(const QString &value) inline QVariant deEscapeVariant(const QVariant &value) { - if (value.type() == QVariant::String) + if (value.typeId() == QVariant::String) return deEscape(value.toString()); return value; } diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp index 0a4f84f3209..ece5b4bf6f1 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp @@ -266,7 +266,7 @@ QPair NodeHints::setParentProperty() const QStringList list = str.split(":"); - if (list.count() != 2) + if (list.size() != 2) return {}; return qMakePair(list.first().trimmed(), parseValue(list.last().trimmed())); diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index bdb7b63392e..09a9a1d72bd 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -336,7 +336,7 @@ private: const ContextPtr m_context; }; -static inline bool isValueType(const TypeName &type) +inline static bool isValueType(const TypeName &type) { static const PropertyTypeList objectValuesList({"QFont", "QPoint", @@ -356,7 +356,7 @@ static inline bool isValueType(const TypeName &type) return objectValuesList.contains(type); } -static inline bool isValueType(const QString &type) +inline static bool isValueType(const QString &type) { static const QStringList objectValuesList({"QFont", "QPoint", @@ -713,7 +713,7 @@ PropertyName NodeMetaInfoPrivate::defaultPropertyName() const return PropertyName("data"); } -static inline TypeName stringIdentifier( const TypeName &type, int maj, int min) +inline static TypeName stringIdentifier(const TypeName &type, int maj, int min) { return type + QByteArray::number(maj) + '_' + QByteArray::number(min); } @@ -2911,8 +2911,7 @@ QVariant PropertyMetaInfo::castedValue(const QVariant &value) const QVariant::Type typeId = nodeMetaInfoPrivateData()->variantTypeId(propertyName()); - if (variant.type() == QVariant::UserType - && variant.userType() == ModelNode::variantUserType()) { + if (variant.typeId() == QVariant::UserType && variant.typeId() == ModelNode::variantTypeId()) { return variant; } else if (typeId == QVariant::UserType && typeName == "QVariant") { return variant; @@ -2920,7 +2919,7 @@ QVariant PropertyMetaInfo::castedValue(const QVariant &value) const return variant; } else if (typeId == QVariant::UserType && typeName == "var") { return variant; - } else if (variant.type() == QVariant::List) { + } else if (variant.typeId() == QVariant::List) { // TODO: check the contents of the list return variant; } else if (typeName == "var" || typeName == "variant") { @@ -2946,11 +2945,11 @@ QVariant PropertyMetaInfo::castedValue(const QVariant &value) const const TypeId &typeId = propertyData().typeId; - if (value.type() == QVariant::UserType && value.userType() == ModelNode::variantUserType()) { + if (value.typeId() == QVariant::UserType && value.typeId() == ModelNode::variantTypeId()) { return value; } else if (typeId == m_projectStorage->builtinTypeId()) { return value; - } else if (value.type() == QVariant::List) { + } else if (value.typeId() == QVariant::List) { // TODO: check the contents of the list return value; } else if (typeId == m_projectStorage->builtinTypeId()) { diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 881f43b658c..a8ad4b76e7c 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -440,7 +440,7 @@ bool AbstractView::hasSelectedModelNodes() const bool AbstractView::hasSingleSelectedModelNode() const { - return model()->d->selectedNodes().count() == 1; + return model()->d->selectedNodes().size() == 1; } bool AbstractView::isSelectedModelNode(const ModelNode &modelNode) const diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index 30f8d50fd4c..558f6849be2 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -92,7 +92,7 @@ ModelNode BindingProperty::resolveBinding(const QString &binding, ModelNode curr currentNode = ModelNode(privateModel()->nodeForId(element), model(), view()); } index++; - if (index < binding.split(QLatin1Char('.')).count()) + if (index < binding.split(QLatin1Char('.')).size()) element = binding.split(QLatin1Char('.')).at(index); else element.clear(); @@ -117,7 +117,7 @@ ModelNode BindingProperty::resolveToModelNode() const return resolveBinding(binding, parentModelNode()); } -static inline QStringList commaSeparatedSimplifiedStringList(const QString &string) +inline static QStringList commaSeparatedSimplifiedStringList(const QString &string) { const QStringList stringList = string.split(QStringLiteral(",")); QStringList simpleList; diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp index 8c8b1c73e59..f5c46627856 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp @@ -26,7 +26,7 @@ bool InternalNodeListProperty::isEmpty() const int InternalNodeListProperty::count() const { - return m_nodeList.count(); + return m_nodeList.size(); } int InternalNodeListProperty::indexOf(const InternalNode::Pointer &node) const diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h index 72ab08ae74a..2e15fdf8aef 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h @@ -27,13 +27,13 @@ public: int indexOf(const InternalNodePointer &node) const override; const InternalNodePointer &at(int index) const { - Q_ASSERT(index >= 0 && index < m_nodeList.count()); + Q_ASSERT(index >= 0 && index < m_nodeList.size()); return m_nodeList[index]; } InternalNodePointer &at(int index) { - Q_ASSERT(index >= 0 && index < m_nodeList.count()); + Q_ASSERT(index >= 0 && index < m_nodeList.size()); return m_nodeList[index]; } diff --git a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp index 30d100f3503..a9fa1ebd19b 100644 --- a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp @@ -83,7 +83,7 @@ static void splitIdInBaseNameAndNumber(const QString &id, QString *baseId, int * { int counter = 0; - while (counter < id.count()) { + while (counter < id.size()) { bool canConvertToInteger = false; int newNumber = id.right(counter + 1).toInt(&canConvertToInteger); if (canConvertToInteger) @@ -94,7 +94,7 @@ static void splitIdInBaseNameAndNumber(const QString &id, QString *baseId, int * counter++; } - *baseId = id.left(id.count() - counter); + *baseId = id.left(id.size() - counter); } static void setupIdRenamingHash(const ModelNode &modelNode, QHash &idRenamingHash, AbstractView *view) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 8fde4d0620d..45c076022da 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -3,15 +3,15 @@ #include "modelnode.h" +#include "annotation.h" +#include "bindingproperty.h" #include "internalnode_p.h" #include "model_p.h" -#include "variantproperty.h" -#include "bindingproperty.h" -#include "signalhandlerproperty.h" #include "nodeabstractproperty.h" #include "nodelistproperty.h" #include "nodeproperty.h" -#include "annotation.h" +#include "signalhandlerproperty.h" +#include "variantproperty.h" #include #include @@ -51,32 +51,20 @@ childNode.addProperty("pos", QPoint(2, 12)); All the manipulation functions are generating undo commands internally. */ - - /*! \brief internal constructor */ -ModelNode::ModelNode(const InternalNodePointer &internalNode, Model *model, const AbstractView *view): - m_internalNode(internalNode), - m_model(model), - m_view(const_cast(view)) -{ -} +ModelNode::ModelNode(const InternalNodePointer &internalNode, Model *model, const AbstractView *view) + : m_internalNode(internalNode) + , m_model(model) + , m_view(const_cast(view)) +{} ModelNode::ModelNode(const ModelNode &modelNode, AbstractView *view) - : m_internalNode(modelNode.m_internalNode), - m_model(modelNode.model()), - m_view(view) -{ -} - -/*! \brief contructs a invalid model node -\return invalid node -\see invalid -*/ -ModelNode::ModelNode() -{ -} + : m_internalNode(modelNode.m_internalNode) + , m_model(modelNode.model()) + , m_view(view) +{} /*! \brief does nothing */ @@ -101,7 +89,7 @@ QString ModelNode::validId() return id(); } -static bool idIsQmlKeyWord(const QString& id) +static bool idIsQmlKeyWord(const QString &id) { static const QSet keywords = {"as", "break", "case", "catch", "continue", "debugger", "default", "delete", @@ -115,49 +103,22 @@ static bool idIsQmlKeyWord(const QString& id) return keywords.contains(id); } -static bool isIdToAvoid(const QString& id) +static bool isIdToAvoid(const QString &id) { - static const QSet ids = { - "top", - "bottom", - "left", - "right", - "width", - "height", - "x", - "y", - "opacity", - "parent", - "item", - "flow", - "color", - "margin", - "padding", - "border", - "font", - "text", - "source", - "state", - "visible", - "focus", - "data", - "clip", - "layer", - "scale", - "enabled", - "anchors", - "texture", - "shaderInfo", - "sprite", - "spriteSequence", - "baseState", - "rect" - }; + static const QSet ids = {"top", "bottom", "left", "right", + "width", "height", "x", "y", + "opacity", "parent", "item", "flow", + "color", "margin", "padding", "border", + "font", "text", "source", "state", + "visible", "focus", "data", "clip", + "layer", "scale", "enabled", "anchors", + "texture", "shaderInfo", "sprite", "spriteSequence", + "baseState", "rect"}; return ids.contains(id); } -static bool idContainsWrongLetter(const QString& id) +static bool idContainsWrongLetter(const QString &id) { static QRegularExpression idExpr(QStringLiteral("^[a-z_][a-zA-Z0-9_]*$")); return !id.contains(idExpr); @@ -199,7 +160,7 @@ bool ModelNode::hasId() const return !m_internalNode->id.isEmpty(); } -void ModelNode::setIdWithRefactoring(const QString& id) +void ModelNode::setIdWithRefactoring(const QString &id) { if (isValid()) { if (model()->rewriterView() && !id.isEmpty() @@ -325,10 +286,12 @@ NodeAbstractProperty ModelNode::parentProperty() const if (!m_internalNode->parentProperty()) return {}; - return NodeAbstractProperty(m_internalNode->parentProperty()->name(), m_internalNode->parentProperty()->propertyOwner(), m_model.data(), view()); + return NodeAbstractProperty(m_internalNode->parentProperty()->name(), + m_internalNode->parentProperty()->propertyOwner(), + m_model.data(), + view()); } - /*! \brief the command id is used to compress the some commands together. \param newParentNode parent of this node will be set to this node \param commandId integer which is used to descripe commands which should compressed together to one command @@ -542,7 +505,6 @@ QList ModelNode::properties() const return propertyList; } - /*! \brief returns a list of all VariantProperties \return list of all VariantProperties @@ -593,7 +555,6 @@ QList ModelNode::nodeListProperties() const return propertyList; } - /*! \brief returns a list of all BindingProperties \return list of all BindingProperties @@ -693,6 +654,7 @@ void ModelNode::destroy() removeModelNodeFromSelection(*this); model()->d->removeNodeAndRelatedResources(m_internalNode); } + //\} /*! \name Property Manipulation @@ -723,7 +685,6 @@ AbstractView *ModelNode::view() const return m_view.data(); } - /*! \brief returns all ModelNodes that are direct children of this ModelNode The list contains every ModelNode that belongs to one of this ModelNodes @@ -913,7 +874,7 @@ static bool recursiveAncestor(const ModelNode &possibleAncestor, const ModelNode if (node.hasParentProperty()) { if (node.parentProperty().parentModelNode() == possibleAncestor) - return true; + return true; return recursiveAncestor(possibleAncestor, node.parentProperty().parentModelNode()); } @@ -928,10 +889,8 @@ bool ModelNode::isAncestorOf(const ModelNode &node) const QDebug operator<<(QDebug debug, const ModelNode &modelNode) { if (modelNode.isValid()) { - debug.nospace() << "ModelNode(" - << modelNode.internalId() << ", " - << modelNode.type() << ", " - << modelNode.id() << ')'; + debug.nospace() << "ModelNode(" << modelNode.internalId() << ", " << modelNode.type() + << ", " << modelNode.id() << ')'; } else { debug.nospace() << "ModelNode(invalid)"; } @@ -939,12 +898,12 @@ QDebug operator<<(QDebug debug, const ModelNode &modelNode) return debug.space(); } -QTextStream& operator<<(QTextStream &stream, const ModelNode &modelNode) +QTextStream &operator<<(QTextStream &stream, const ModelNode &modelNode) { if (modelNode.isValid()) { stream << "ModelNode(" - << "type: " << modelNode.type() << ", " - << "id: " << modelNode.id() << ')'; + << "type: " << modelNode.type() << ", " + << "id: " << modelNode.id() << ')'; } else { stream << "ModelNode(invalid)"; } @@ -974,7 +933,7 @@ void ModelNode::deselectNode() view()->setSelectedModelNodes(selectedNodeList); } -int ModelNode::variantUserType() +int ModelNode::variantTypeId() { return qMetaTypeId(); } @@ -992,8 +951,7 @@ std::optional ModelNode::auxiliaryData(AuxiliaryDataKeyView key) const return m_internalNode->auxiliaryData(key); } -std::optional ModelNode::auxiliaryData(AuxiliaryDataType type, - Utils::SmallStringView name) const +std::optional ModelNode::auxiliaryData(AuxiliaryDataType type, Utils::SmallStringView name) const { return auxiliaryData({type, name}); } @@ -1306,7 +1264,7 @@ static ModelNode lowestCommonAncestor(const ModelNode &node1, { Q_ASSERT(node1.isValid() && node2.isValid()); - auto depthOfNode = [] (const ModelNode &node) -> int { + auto depthOfNode = [](const ModelNode &node) -> int { int depth = 0; ModelNode parentNode = node; while (!parentNode.isRootNode()) { @@ -1317,9 +1275,8 @@ static ModelNode lowestCommonAncestor(const ModelNode &node1, }; if (node1 == node2) { - depthOfLCA = (depthOfNode1 < 0) - ? ((depthOfNode2 < 0) ? depthOfNode(node1) : depthOfNode2) - : depthOfNode1; + depthOfLCA = (depthOfNode1 < 0) ? ((depthOfNode2 < 0) ? depthOfNode(node1) : depthOfNode2) + : depthOfNode1; return node1; } @@ -1336,7 +1293,7 @@ static ModelNode lowestCommonAncestor(const ModelNode &node1, ModelNode nodeLower = node1; ModelNode nodeHigher = node2; int depthLower = (depthOfNode1 < 0) ? depthOfNode(nodeLower) : depthOfNode1; - int depthHigher = (depthOfNode2 < 0) ? depthOfNode(nodeHigher) :depthOfNode2; + int depthHigher = (depthOfNode2 < 0) ? depthOfNode(nodeHigher) : depthOfNode2; if (depthLower > depthHigher) { std::swap(depthLower, depthHigher); @@ -1383,9 +1340,8 @@ QList ModelNode::pruneChildren(const QList &nodes) QList forwardNodes; QList backNodes; - auto pushIfIsNotChild = [] (QList &container, const ModelNode &node) { - bool hasAncestor = Utils::anyOf(container, - [node] (const ModelNode &testNode) -> bool { + auto pushIfIsNotChild = [](QList &container, const ModelNode &node) { + bool hasAncestor = Utils::anyOf(container, [node](const ModelNode &testNode) -> bool { return testNode.isAncestorOf(node); }); if (!hasAncestor) @@ -1403,7 +1359,7 @@ QList ModelNode::pruneChildren(const QList &nodes) return backNodes; } -void ModelNode::setScriptFunctions(const QStringList &scriptFunctionList) +void ModelNode::setScriptFunctions(const QStringList &scriptFunctionList) { if (!isValid()) return; @@ -1411,7 +1367,7 @@ void ModelNode::setScriptFunctions(const QStringList &scriptFunctionList) model()->d->setScriptFunctions(m_internalNode, scriptFunctionList); } -QStringList ModelNode::scriptFunctions() const +QStringList ModelNode::scriptFunctions() const { if (!isValid()) return {}; @@ -1510,8 +1466,7 @@ bool ModelNode::isComponent() const if (metaInfo().isQtQuickLoader()) { if (hasNodeListProperty("component")) { - - /* + /* * The component property should be a NodeProperty, but currently is a NodeListProperty, because * the default property is always implcitly a NodeListProperty. This is something that has to be fixed. */ @@ -1524,7 +1479,8 @@ bool ModelNode::isComponent() const } if (hasNodeProperty("sourceComponent")) { - if (nodeProperty("sourceComponent").modelNode().nodeSourceType() == ModelNode::NodeWithComponentSource) + if (nodeProperty("sourceComponent").modelNode().nodeSourceType() + == ModelNode::NodeWithComponentSource) return true; if (nodeProperty("sourceComponent").modelNode().metaInfo().isFileComponent()) return true; @@ -1542,8 +1498,9 @@ QIcon ModelNode::typeIcon() const if (isValid()) { // if node has no own icon, search for it in the itemlibrary const ItemLibraryInfo *libraryInfo = model()->metaInfo().itemLibraryInfo(); - QList itemLibraryEntryList = libraryInfo->entriesForType( - type(), majorVersion(), minorVersion()); + QList itemLibraryEntryList = libraryInfo->entriesForType(type(), + majorVersion(), + minorVersion()); if (!itemLibraryEntryList.isEmpty()) return itemLibraryEntryList.constFirst().typeIcon(); else if (metaInfo().isValid()) @@ -1561,4 +1518,4 @@ QString ModelNode::behaviorPropertyName() const return m_internalNode->behaviorPropertyName; } -} +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp b/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp index 8cd55cac4b9..cd7cebbb73a 100644 --- a/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp +++ b/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp @@ -41,7 +41,7 @@ PropertyName PropertyContainer::name() const QVariant PropertyContainer::value() const { - if (m_value.type() == QVariant::String) + if (m_value.typeId() == QVariant::String) m_value = PropertyParser::read(m_type, m_value.toString()); return m_value; } diff --git a/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp b/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp index 134c4bf1c20..889a5a38650 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp @@ -85,7 +85,7 @@ void QmlPropertyChanges::removeProperty(const PropertyName &name) if (name == "name") return; modelNode().removeProperty(name); - if (modelNode().variantProperties().isEmpty() && modelNode().bindingProperties().count() < 2) + if (modelNode().variantProperties().isEmpty() && modelNode().bindingProperties().size() < 2) modelNode().destroy(); } diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index bcf22aa3f04..e5721d21c32 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -50,7 +50,7 @@ inline static QString doubleToString(const PropertyName &propertyName, double d) static QString unicodeEscape(const QString &stringValue) { - if (stringValue.count() == 1) { + if (stringValue.size() == 1) { ushort code = stringValue.at(0).unicode(); bool isUnicode = code <= 127; if (isUnicode) { @@ -118,7 +118,7 @@ QString QmlTextGenerator::toQml(const AbstractProperty &property, int indentDept if (variantProperty.holdsEnumeration()) { return variantProperty.enumeration().toString(); } else { - switch (value.userType()) { + switch (value.typeId()) { case QMetaType::Bool: if (value.toBool()) return QStringLiteral("true"); diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 53a0f4de596..60156ff18ea 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -954,12 +954,12 @@ const QmlJS::Document *RewriterView::document() const return textToModelMerger()->document(); } -static inline QString getUrlFromType(const QString& typeName) +inline static QString getUrlFromType(const QString &typeName) { QStringList nameComponents = typeName.split('.'); QString result; - for (int i = 0; i < (nameComponents.count() - 1); i++) { + for (int i = 0; i < (nameComponents.size() - 1); i++) { result += nameComponents.at(i); } diff --git a/src/plugins/qmldesigner/designercore/model/stylesheetmerger.cpp b/src/plugins/qmldesigner/designercore/model/stylesheetmerger.cpp index 2a6b9f0fbf0..90891cbc8c1 100644 --- a/src/plugins/qmldesigner/designercore/model/stylesheetmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/stylesheetmerger.cpp @@ -65,7 +65,7 @@ static void splitIdInBaseNameAndNumber(const QString &id, QString *baseId, int * { int counter = 0; - while (counter < id.count()) { + while (counter < id.size()) { bool canConvertToInteger = false; int newNumber = id.right(counter + 1).toInt(&canConvertToInteger); if (canConvertToInteger) @@ -76,7 +76,7 @@ static void splitIdInBaseNameAndNumber(const QString &id, QString *baseId, int * counter++; } - *baseId = id.left(id.count() - counter); + *baseId = id.left(id.size() - counter); } void StylesheetMerger::syncNodeProperties(ModelNode &outputNode, const ModelNode &inputNode, bool skipDuplicates) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 7328ae01aa6..29088dac407 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -165,10 +165,13 @@ bool isHexDigit(ushort c) QString fixEscapedUnicodeChar(const QString &value) //convert "\u2939" { - if (value.count() == 6 && value.at(0) == QLatin1Char('\\') && value.at(1) == QLatin1Char('u') && - isHexDigit(value.at(2).unicode()) && isHexDigit(value.at(3).unicode()) && - isHexDigit(value.at(4).unicode()) && isHexDigit(value.at(5).unicode())) { - return convertUnicode(value.at(2).unicode(), value.at(3).unicode(), value.at(4).unicode(), value.at(5).unicode()); + if (value.size() == 6 && value.at(0) == QLatin1Char('\\') && value.at(1) == QLatin1Char('u') + && isHexDigit(value.at(2).unicode()) && isHexDigit(value.at(3).unicode()) + && isHexDigit(value.at(4).unicode()) && isHexDigit(value.at(5).unicode())) { + return convertUnicode(value.at(2).unicode(), + value.at(3).unicode(), + value.at(4).unicode(), + value.at(5).unicode()); } return value; } @@ -362,8 +365,8 @@ bool compareJavaScriptExpression(const QString &expression1, const QString &expr bool smartVeryFuzzyCompare(const QVariant &value1, const QVariant &value2) { //we ignore slight changes on doubles and only check three digits - const auto type1 = static_cast(value1.type()); - const auto type2 = static_cast(value2.type()); + const auto type1 = static_cast(value1.typeId()); + const auto type2 = static_cast(value2.typeId()); if (type1 == QMetaType::Double || type2 == QMetaType::Double || type1 == QMetaType::Float @@ -394,7 +397,7 @@ bool smartVeryFuzzyCompare(const QVariant &value1, const QVariant &value2) } bool smartColorCompare(const QVariant &value1, const QVariant &value2) { - if ((value1.type() == QVariant::Color) || (value2.type() == QVariant::Color)) + if ((value1.typeId() == QVariant::Color) || (value2.typeId() == QVariant::Color)) return value1.value().rgba() == value2.value().rgba(); return false; } @@ -720,7 +723,7 @@ public: { QStringList astValueList = astValue.split(QStringLiteral(".")); - if (astValueList.count() == 2) { + if (astValueList.size() == 2) { //Check for global Qt enums if (astValueList.constFirst() == QStringLiteral("Qt") && globalQtEnums().contains(astValueList.constLast())) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index 4288cd5cbb1..a668f80ee27 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -518,9 +518,7 @@ private: auto fetchModuleName(ModuleId id) { - return Sqlite::withDeferredTransaction(database, [&] { - return fetchModuleNameUnguarded(id); - }); + return Sqlite::withDeferredTransaction(database, [&] { return fetchModuleNameUnguarded(id); }); } auto fetchAllModules() const @@ -1039,6 +1037,7 @@ private: }, TypeCompare{}); } + template void relinkPrototypes(Prototypes &relinkablePrototypes, const TypeIds &deletedTypeIds, @@ -1551,10 +1550,10 @@ private: int majorVersion, int minorVersion, ModuleExportedImportId moduleExportedImportId) { - Storage::Synchronization::Import additionImport{ - exportedModuleId, - Storage::Version{majorVersion, minorVersion}, - import.sourceId}; + Storage::Synchronization::Import additionImport{exportedModuleId, + Storage::Version{majorVersion, + minorVersion}, + import.sourceId}; auto exportedImportKind = importKind == Storage::Synchronization::ImportKind::Import ? Storage::Synchronization::ImportKind::ModuleExportedImport diff --git a/src/plugins/qmldesigner/documentwarningwidget.cpp b/src/plugins/qmldesigner/documentwarningwidget.cpp index d7bd70d5e34..49eb5acd465 100644 --- a/src/plugins/qmldesigner/documentwarningwidget.cpp +++ b/src/plugins/qmldesigner/documentwarningwidget.cpp @@ -121,13 +121,13 @@ QString DocumentWarningWidget::generateNavigateLinks() { static const QString link("%2"); QStringList links; - if (m_messages.count() > 1) { + if (m_messages.size() > 1) { if (m_currentMessage != 0) links << link.arg(QLatin1String("previous"), tr("Previous")); else links << tr("Previous"); - if (m_messages.count() - 1 > m_currentMessage) + if (m_messages.size() - 1 > m_currentMessage) links << link.arg(QLatin1String("next"), tr("Next")); else links << tr("Next"); diff --git a/src/plugins/qmldesigner/generateresource.cpp b/src/plugins/qmldesigner/generateresource.cpp index 439e124b705..be7f536662c 100644 --- a/src/plugins/qmldesigner/generateresource.cpp +++ b/src/plugins/qmldesigner/generateresource.cpp @@ -288,7 +288,7 @@ void GenerateResource::generateMenuEntry(QObject *parent) bool found = false; QString compareString = "./" + relativepath.trimmed(); - for (int i = 0; i < fileList.count(); ++i) + for (int i = 0; i < fileList.size(); ++i) if (fileList.at(i).fileName == compareString) { fileList[i].inProject = true; found = true; @@ -424,7 +424,7 @@ void GenerateResource::generateMenuEntry(QObject *parent) bool found = false; QString compareString = "./" + relativepath.trimmed(); - for (int i = 0; i < fileList.count(); ++i) + for (int i = 0; i < fileList.size(); ++i) if (fileList.at(i).fileName == compareString) { fileList[i].inProject = true; found = true; diff --git a/src/plugins/qmldesigner/utils/multifiledownloader.cpp b/src/plugins/qmldesigner/utils/multifiledownloader.cpp index 6a8ac9761e9..6a452d6b098 100644 --- a/src/plugins/qmldesigner/utils/multifiledownloader.cpp +++ b/src/plugins/qmldesigner/utils/multifiledownloader.cpp @@ -24,7 +24,7 @@ void MultiFileDownloader::setDownloader(FileDownloader *downloader) QObject::connect(m_downloader, &FileDownloader::progressChanged, this, [this]() { double curProgress = m_downloader->progress() / 100.0; - double totalProgress = (m_nextFile + curProgress) / m_files.count(); + double totalProgress = (m_nextFile + curProgress) / m_files.size(); m_progress = totalProgress * 100; emit progressChanged(); }); diff --git a/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp b/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp index 7b7628e3191..489c8c840b7 100644 --- a/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp +++ b/src/tools/qml2puppet/instances/nodeinstanceclientproxy.cpp @@ -147,28 +147,28 @@ bool compareCommands(const QVariant &command, const QVariant &controlCommand) static const int debugOutputCommandType = QMetaType::type("DebugOutputCommand"); static const int changeSelectionCommandType = QMetaType::type("ChangeSelectionCommand"); - if (command.userType() == controlCommand.userType()) { - if (command.userType() == informationChangedCommandType) + if (command.typeId() == controlCommand.typeId()) { + if (command.typeId() == informationChangedCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == valuesChangedCommandType) + else if (command.typeId() == valuesChangedCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == valuesModifiedCommandType) + else if (command.typeId() == valuesModifiedCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == pixmapChangedCommandType) + else if (command.typeId() == pixmapChangedCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == childrenChangedCommandType) + else if (command.typeId() == childrenChangedCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == statePreviewImageChangedCommandType) + else if (command.typeId() == statePreviewImageChangedCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == componentCompletedCommandType) + else if (command.typeId() == componentCompletedCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == synchronizeCommandType) + else if (command.typeId() == synchronizeCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == tokenCommandType) + else if (command.typeId() == tokenCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == debugOutputCommandType) + else if (command.typeId() == debugOutputCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == changeSelectionCommandType) + else if (command.typeId() == changeSelectionCommandType) return command.value() == controlCommand.value(); } @@ -190,8 +190,8 @@ void NodeInstanceClientProxy::writeCommand(const QVariant &command) } } else if (m_outputIoDevice) { #ifdef NANOTRACE_ENABLED - if (command.userType() != QMetaType::type("PuppetAliveCommand")) { - if (command.userType() == QMetaType::type("SyncNanotraceCommand")) { + if (command.typeId() != QMetaType::type("PuppetAliveCommand")) { + if (command.typeId() == QMetaType::type("SyncNanotraceCommand")) { SyncNanotraceCommand cmd = command.value(); NANOTRACE_INSTANT_ARGS("Sync", "writeCommand", {"name", cmd.name().toStdString()}, @@ -395,8 +395,8 @@ void NodeInstanceClientProxy::readDataStream() QVariant command = readCommandFromIOStream(m_inputIoDevice, &readCommandCounter, &blockSize); #ifdef NANOTRACE_ENABLED - if (command.userType() != QMetaType::type("EndNanotraceCommand")) { - if (command.userType() == QMetaType::type("SyncNanotraceCommand")) { + if (command.typeId() != QMetaType::type("EndNanotraceCommand")) { + if (command.typeId() == QMetaType::type("SyncNanotraceCommand")) { SyncNanotraceCommand cmd = command.value(); NANOTRACE_INSTANT_ARGS("Sync", "readCommand", {"name", cmd.name().toStdString()}, @@ -574,7 +574,7 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) static const int startNanotraceCommandType = QMetaType::type("StartNanotraceCommand"); static const int endNanotraceCommandType = QMetaType::type("EndNanotraceCommand"); - const int commandType = command.userType(); + const int commandType = command.typeId(); if (commandType == inputEventCommandType) inputEvent(command.value()); @@ -624,13 +624,13 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) } else if (commandType == changeSelectionCommandType) { ChangeSelectionCommand changeSelectionCommand = command.value(); changeSelection(changeSelectionCommand); - } else if (command.userType() == changeLanguageCommand) { + } else if (command.typeId() == changeLanguageCommand) { changeLanguage(command.value()); - } else if (command.userType() == changePreviewImageSizeCommand) { + } else if (command.typeId() == changePreviewImageSizeCommand) { changePreviewImageSize(command.value()); - } else if (command.userType() == startNanotraceCommandType) { + } else if (command.typeId() == startNanotraceCommandType) { startNanotrace(command.value()); - } else if (command.userType() == endNanotraceCommandType) { + } else if (command.typeId() == endNanotraceCommandType) { NANOTRACE_SHUTDOWN(); } else { Q_ASSERT(false); diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp index 52a3f6d74aa..bfa2fcb1ae8 100644 --- a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp +++ b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp @@ -520,8 +520,8 @@ void GeneralHelper::storeToolState(const QString &sceneId, const QString &tool, handlePendingToolStateUpdate(); QVariant theState; // Convert JS arrays to QVariantLists for easier handling down the line - // metaType().id() which only exist in Qt6 is the same as userType() - if (state.userType() != QMetaType::QString && state.canConvert(QMetaType::QVariantList)) + // metaType().id() which only exist in Qt6 is the same as typeId() + if (state.typeId() != QMetaType::QString && state.canConvert(QMetaType::QVariantList)) theState = state.value(); else theState = state; diff --git a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp index aff80c62aff..3007db7af45 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1194,7 +1194,7 @@ ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QList< const QList propertyNames = instance.propertyNames(); for (const PropertyName &propertyName : propertyNames) { QVariant propertyValue = instance.property(propertyName); - if (supportedVariantType(propertyValue.userType())) { + if (supportedVariantType(propertyValue.typeId())) { valueVector.append(PropertyValueContainer(instance.instanceId(), propertyName, propertyValue, PropertyName())); } @@ -1236,13 +1236,13 @@ ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVecto if (instance.isValid()) { QVariant propertyValue = instance.property(propertyName); - bool isValid = QMetaType::isRegistered(propertyValue.userType()) - && supportedVariantType(propertyValue.type()); - if (!isValid && propertyValue.userType() == 0) { + bool isValid = QMetaType::isRegistered(propertyValue.typeId()) + && supportedVariantType(propertyValue.typeId()); + if (!isValid && propertyValue.typeId() == 0) { // If the property is QVariant type, invalid variant can be a valid value const QMetaObject *mo = instance.internalObject()->metaObject(); const int idx = mo->indexOfProperty(propertyName); - isValid = idx >= 0 && mo->property(idx).userType() == QMetaType::QVariant; + isValid = idx >= 0 && mo->property(idx).typeId() == QMetaType::QVariant; } if (isValid) { valueVector.append(PropertyValueContainer(instance.instanceId(), propertyName, @@ -1265,8 +1265,8 @@ ValuesModifiedCommand NodeInstanceServer::createValuesModifiedCommand( const QVariant propertyValue = property.propertyValue; if (instance.isValid()) { - if (QMetaType::isRegistered(propertyValue.userType()) - && supportedVariantType(propertyValue.type())) { + if (QMetaType::isRegistered(propertyValue.typeId()) + && supportedVariantType(propertyValue.typeId())) { valueVector.append(PropertyValueContainer(instance.instanceId(), propertyName, propertyValue, diff --git a/src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp b/src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp index 26999ef2a2f..24ac4004115 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/objectnodeinstance.cpp @@ -374,7 +374,7 @@ void ObjectNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParentIn QVariant ObjectNodeInstance::convertSpecialCharacter(const QVariant& value) const { QVariant specialCharacterConvertedValue = value; - if (value.type() == QVariant::String) { + if (value.typeId() == QVariant::String) { QString string = value.toString(); string.replace(QLatin1String("\\n"), QLatin1String("\n")); string.replace(QLatin1String("\\t"), QLatin1String("\t")); @@ -472,7 +472,7 @@ void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVar QVariant oldValue = property.read(); - if (oldValue.type() == QVariant::Url) { + if (oldValue.typeId() == QVariant::Url) { QUrl url = oldValue.toUrl(); QString path = url.toLocalFile(); if (QFileInfo::exists(path) && nodeInstanceServer() && !path.isEmpty()) @@ -489,7 +489,7 @@ void ObjectNodeInstance::setPropertyVariant(const PropertyName &name, const QVar qDebug() << "ObjectNodeInstance.setPropertyVariant: Cannot be written: " << object() << name << adjustedValue; QVariant newValue = property.read(); - if (newValue.type() == QVariant::Url) { + if (newValue.typeId() == QVariant::Url) { QUrl url = newValue.toUrl(); QString path = url.toLocalFile(); if (QFileInfo::exists(path) && nodeInstanceServer() && !path.isEmpty()) @@ -579,7 +579,7 @@ void ObjectNodeInstance::refreshProperty(const PropertyName &name) else property.write(resetValue(name)); - if (oldValue.type() == QVariant::Url) { + if (oldValue.typeId() == QVariant::Url) { QByteArray key = oldValue.toUrl().toEncoded(QUrl::UrlFormattingOption(0x100)); QString pixmapKey = QString::fromUtf8(key.constData(), key.size()); QPixmapCache::remove(pixmapKey); @@ -843,7 +843,7 @@ QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, cons //The component might also be shipped with Creator. //To avoid trouble with import "." we use the component shipped with Creator. -static inline QString fixComponentPathForIncompatibleQt(const QString &componentPath) +inline static QString fixComponentPathForIncompatibleQt(const QString &componentPath) { QString result = componentPath; const QLatin1String importString("/imports/"); diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 01d5fcd4f60..2f3747ef212 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -655,7 +655,7 @@ Qt5InformationNodeInstanceServer::propertyToPropertyValueTriples( QVector result; InstancePropertyValueTriple propTriple; - if (variant.type() == QVariant::Vector3D) { + if (variant.typeId() == QVariant::Vector3D) { auto vector3d = variant.value(); if (vector3d.isNull()) diff --git a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp index 7fd4e75dc23..a8c715c9958 100644 --- a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp +++ b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp @@ -110,8 +110,8 @@ PropertyNameList allPropertyNamesInline(QObject *object, inspectedObjects, depth + 1)); } - } else if (QQmlGadgetPtrWrapper *valueType - = QQmlGadgetPtrWrapper::instance(qmlEngine(object), metaProperty.userType())) { + } else if (QQmlGadgetPtrWrapper *valueType = QQmlGadgetPtrWrapper::instance( + qmlEngine(object), metaProperty.typeId())) { valueType->setValue(metaProperty.read(object)); propertyNameList.append(baseName + QQuickDesignerSupport::PropertyName(metaProperty.name())); @@ -224,8 +224,7 @@ static QString qmlDesignerRCPath() QVariant fixResourcePaths(const QVariant &value) { - if (value.type() == QVariant::Url) - { + if (value.typeId() == QVariant::Url) { const QUrl url = value.toUrl(); if (url.scheme() == QLatin1String("qrc")) { const QString path = QLatin1String("qrc:") + url.path(); @@ -246,7 +245,7 @@ QVariant fixResourcePaths(const QVariant &value) } } } - if (value.type() == QVariant::String) { + if (value.typeId() == QVariant::String) { const QString str = value.toString(); if (str.contains(QLatin1String("qrc:"))) { if (!qmlDesignerRCPath().isEmpty()) { diff --git a/tests/auto/qml/qmldesigner/testconnectionmanager.cpp b/tests/auto/qml/qmldesigner/testconnectionmanager.cpp index 0db53e538ea..9341d39a454 100644 --- a/tests/auto/qml/qmldesigner/testconnectionmanager.cpp +++ b/tests/auto/qml/qmldesigner/testconnectionmanager.cpp @@ -40,7 +40,7 @@ void TestConnectionManager::dispatchCommand(const QVariant &command, Connection { static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand"); - if (command.userType() == synchronizeCommandType) { + if (command.typeId() == synchronizeCommandType) { SynchronizeCommand synchronizeCommand = command.value(); m_synchronizeId = synchronizeCommand.synchronizeId(); } else { From 898a7cbc882c29c99c50428d049dad1f48c81a07 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 1 Jun 2023 20:27:13 +0200 Subject: [PATCH 067/149] QmlDesigner: Make more classes final Because the interface is for dependency injection only the implementation should be always final. Change-Id: I069126d8767b0e1072c1e938acb42086abed4a1e Reviewed-by: Tim Jenssen Reviewed-by: Reviewed-by: Burak Hancerli --- .../designercore/projectstorage/projectstorageupdater.h | 2 +- .../qmldesigner/designercore/projectstorage/qmldocumentparser.h | 2 +- .../qmldesigner/designercore/projectstorage/qmltypesparser.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.h index 22778ac932a..519d11a920a 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.h @@ -32,7 +32,7 @@ class ProjectStorage; class QmlDocumentParserInterface; class QmlTypesParserInterface; -class ProjectStorageUpdater : public ProjectStoragePathWatcherNotifierInterface +class ProjectStorageUpdater final : public ProjectStoragePathWatcherNotifierInterface { public: using PathCache = SourcePathCache, NonLockingMutex>; diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h index 2896d54ebe7..96f28a4585f 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/qmldocumentparser.h @@ -12,7 +12,7 @@ namespace QmlDesigner { template class SourcePathCache; -class QmlDocumentParser : public QmlDocumentParserInterface +class QmlDocumentParser final : public QmlDocumentParserInterface { public: using ProjectStorage = QmlDesigner::ProjectStorage; diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h index c1d9a3a0d45..6fcf82a2bb2 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h @@ -18,7 +18,7 @@ class ProjectStorage; template class SourcePathCache; -class QmlTypesParser : public QmlTypesParserInterface +class QmlTypesParser final : public QmlTypesParserInterface { public: using ProjectStorage = QmlDesigner::ProjectStorage; From ff2a14917f48606af2e153bdfd7e06fe46d8a31b Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 2 Jun 2023 09:38:40 +0200 Subject: [PATCH 068/149] QmlDesigner: Only enable error on warnings as you compile with tests or in debug There is no advantage for an enduser to get errors on warnings because he cannot do much about it. It is still nudging the developers to fix the warnings. Task-number: QTCREATORBUG-29238 Change-Id: If9f73f2766d686b119cd264ee7b3c3c9afa2c70d Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Tim Jenssen --- src/plugins/qmldesigner/CMakeLists.txt | 14 +++++++------- src/plugins/qmldesignerbase/CMakeLists.txt | 2 +- src/plugins/qmlprojectmanager/CMakeLists.txt | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index bbfcf9d37c4..267a04cad66 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -31,7 +31,7 @@ add_qtc_library(QmlDesignerUtils STATIC ) extend_qtc_library(QmlDesignerUtils - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) @@ -84,7 +84,7 @@ endif() extend_qtc_library(QmlDesignerCore - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) @@ -484,7 +484,7 @@ add_qtc_plugin(QmlDesigner ) extend_qtc_plugin(QmlDesigner - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) @@ -1085,7 +1085,7 @@ add_qtc_plugin(assetexporterplugin ) extend_qtc_plugin(assetexporterplugin - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) @@ -1118,7 +1118,7 @@ add_qtc_plugin(componentsplugin ) extend_qtc_plugin(componentsplugin - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) @@ -1143,7 +1143,7 @@ add_qtc_plugin(qmlpreviewplugin ) extend_qtc_plugin(qmlpreviewplugin - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) @@ -1165,7 +1165,7 @@ add_qtc_plugin(qtquickplugin ) extend_qtc_plugin(qtquickplugin - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) diff --git a/src/plugins/qmldesignerbase/CMakeLists.txt b/src/plugins/qmldesignerbase/CMakeLists.txt index 628403874c0..f798542dbd8 100644 --- a/src/plugins/qmldesignerbase/CMakeLists.txt +++ b/src/plugins/qmldesignerbase/CMakeLists.txt @@ -12,7 +12,7 @@ add_qtc_plugin(QmlDesignerBase ) extend_qtc_plugin(QmlDesignerBase - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) diff --git a/src/plugins/qmlprojectmanager/CMakeLists.txt b/src/plugins/qmlprojectmanager/CMakeLists.txt index ad71e3fbffb..df2357e106d 100644 --- a/src/plugins/qmlprojectmanager/CMakeLists.txt +++ b/src/plugins/qmlprojectmanager/CMakeLists.txt @@ -25,7 +25,7 @@ add_qtc_plugin(QmlProjectManager ) extend_qtc_plugin(QmlProjectManager - CONDITION NOT DISABLE_COMPILE_WARNING_AS_ERROR + CONDITION (NOT DISABLE_COMPILE_WARNING_AS_ERROR) AND ($ OR WITH_TESTS) PROPERTIES COMPILE_WARNING_AS_ERROR ON ) From 8af0c065acb4c1f672401d7a01ec236f25ea0cd2 Mon Sep 17 00:00:00 2001 From: Burak Hancerli Date: Thu, 25 May 2023 12:19:58 +0200 Subject: [PATCH 069/149] QmlProject: Reorganize unittests Task-number: QDS-9946 Change-Id: Ib165340d13e40c6e8fba08a828ceecb312dd5dde Reviewed-by: Qt CI Bot Reviewed-by: Marco Bubke --- .gitignore | 1 - .gitmodules | 6 +- cmake/FindGoogletest.cmake | 20 +- .../qtc_gtest_gmock/qtc_gtest_gmock.qbs | 2 +- tests/unit/{unittest => }/3rdparty/googletest | 0 tests/unit/CMakeLists.txt | 72 ++-- tests/unit/README.md | 49 ++- tests/unit/tests/CMakeLists.txt | 24 ++ tests/unit/tests/matchers/CMakeLists.txt | 5 + ...micastmatcherdiagnosticcontainer-matcher.h | 2 +- .../matchers}/unittest-matchers.h | 0 tests/unit/tests/mocks/CMakeLists.txt | 35 ++ .../mocks}/abstractviewmock.h | 2 +- .../mocks}/externaldependenciesmock.h | 2 +- .../mocks}/filesystemmock.h | 2 +- .../mocks}/imagecachecollectormock.h | 2 +- .../mocks}/mockimagecachegenerator.h | 2 +- .../mocks}/mockimagecachestorage.h | 2 +- .../mocks}/mocklistmodeleditorview.h | 2 +- .../{unittest => tests/mocks}/mockmutex.h | 2 +- .../mocks}/mockqfilesystemwatcher.h | 8 +- .../mocks}/mocksqlitestatement.h | 2 +- .../mocks}/mocksqlitetransactionbackend.h | 2 +- .../mocks}/mocksyntaxhighligher.h | 2 +- .../{unittest => tests/mocks}/mocktimer.cpp | 4 +- .../{unittest => tests/mocks}/mocktimer.h | 5 +- .../mocks}/mocktimestampprovider.h | 2 +- .../mocks}/modelresourcemanagementmock.h | 2 +- .../mocks}/projectstoragemock.cpp | 0 .../mocks}/projectstoragemock.h | 2 +- .../mocks}/projectstoragepathwatchermock.h | 2 +- .../projectstoragepathwatchernotifiermock.h | 2 +- .../mocks}/qmldocumentparsermock.h | 2 +- .../mocks}/qmltypesparsermock.h | 2 +- .../mocks}/sourcepathcachemock.h | 2 +- .../mocks}/sqlitedatabasemock.h | 2 +- .../mocks}/sqlitereadstatementmock.cpp | 0 .../mocks}/sqlitereadstatementmock.h | 2 +- .../mocks}/sqlitereadwritestatementmock.cpp | 0 .../mocks}/sqlitereadwritestatementmock.h | 6 +- .../mocks}/sqlitestatementmock.h | 2 +- .../mocks}/sqlitetransactionbackendmock.h | 2 +- .../mocks}/sqlitewritestatementmock.cpp | 0 .../mocks}/sqlitewritestatementmock.h | 2 +- tests/unit/tests/printers/CMakeLists.txt | 7 + .../printers}/gtest-creator-printing.cpp | 0 .../printers}/gtest-creator-printing.h | 0 .../printers}/gtest-llvm-printing.cpp | 0 .../printers}/gtest-llvm-printing.h | 0 .../printers}/gtest-qt-printing.cpp | 0 .../printers}/gtest-qt-printing.h | 0 .../printers}/gtest-std-printing.h | 0 tests/unit/tests/stubs/CMakeLists.txt | 139 +++++++ .../clangcompletionassistinterface.h | 0 .../stubs}/coreplugin/helpitem.h | 0 .../stubs}/coreplugin/icontext.h | 0 .../stubs}/coreplugin/icore.h | 2 +- .../stubs}/coreplugin/vcsmanager.h | 0 .../designercore/include/documentmessage.h | 0 .../designercore/include/itemlibraryitem.h | 0 .../designercore/include/nodeinstanceview.h | 0 .../designercore/include/qmlmodelnodefacade.h | 0 .../designercore/include/qmlobjectnode.h | 0 .../designercore/include/qmlstate.h | 0 .../designercore/include/qmltimeline.h | 0 .../designercore/include/rewriterview.h | 0 .../stubs}/texteditor/assistenums.h | 0 .../texteditor/codeassist/assistinterface.h | 0 .../stubs}/texteditor/quickfix.h | 0 .../stubs}/texteditor/refactoringchanges.h | 16 +- .../stubs}/texteditor/semantichighlighter.h | 0 .../stubs}/texteditor/syntaxhighlighter.h | 0 tests/unit/tests/unittests/CMakeLists.txt | 92 +++++ .../tests/unittests/imagecache/CMakeLists.txt | 11 + .../asynchronousexplicitimagecache-test.cpp | 6 +- .../asynchronousimagecache-test.cpp | 10 +- .../asynchronousimagefactory-test.cpp | 12 +- .../imagecachedispatchcollector-test.cpp | 4 +- .../imagecache}/imagecachegenerator-test.cpp | 8 +- .../imagecache}/imagecachestorage-test.cpp | 4 +- .../synchronousimagecache-test.cpp | 8 +- .../unittests/listmodeleditor/CMakeLists.txt | 27 ++ .../listmodeleditor}/listmodeleditor-test.cpp | 9 +- .../unit/tests/unittests/model/CMakeLists.txt | 8 + .../unittests/model}/import-test.cpp | 2 +- .../unittests/model}/model-test.cpp | 8 +- .../model}/modelresourcemanagement-test.cpp | 18 +- .../model}/nodelistproperty-test.cpp | 6 +- .../unittests/projectstorage/CMakeLists.txt | 34 ++ .../data/modulescanner/Example/qmldir | 0 .../projectstorage}/data/qml/QmlTime/qmldir | 0 .../data/qml/Qt/labs/animation/qmldir | 0 .../data/qml/Qt/labs/folderlistmodel/qmldir | 0 .../data/qml/Qt/labs/lottieqt/qmldir | 0 .../data/qml/Qt/labs/platform/qmldir | 0 .../data/qml/Qt/labs/qmlmodels/qmldir | 0 .../data/qml/Qt/labs/settings/qmldir | 0 .../data/qml/Qt/labs/sharedimage/qmldir | 0 .../data/qml/Qt/labs/wavefrontmesh/qmldir | 0 .../data/qml/Qt/test/controls/qmldir | 0 .../data/qml/Qt3D/Animation/qmldir | 0 .../data/qml/Qt3D/Extras/qmldir | 0 .../data/qml/Qt3D/Input/qmldir | 0 .../data/qml/Qt3D/Logic/qmldir | 0 .../data/qml/Qt3D/Render/qmldir | 0 .../Qt5Compat/GraphicalEffects/private/qmldir | 0 .../qml/Qt5Compat/GraphicalEffects/qmldir | 0 .../QtApplicationManager/Application/qmldir | 0 .../qml/QtApplicationManager/SystemUI/qmldir | 0 .../data/qml/QtApplicationManager/qmldir | 0 .../projectstorage}/data/qml/QtCharts/qmldir | 0 .../projectstorage}/data/qml/QtCore/qmldir | 0 .../data/qml/QtDataVisualization/qmldir | 0 .../data/qml/QtInsightTracker/qmldir | 0 .../qml/QtInterfaceFramework/Media/qmldir | 0 .../VehicleFunctions/qmldir | 0 .../data/qml/QtInterfaceFramework/qmldir | 0 .../data/qml/QtLocation/qmldir | 0 .../data/qml/QtMultimedia/qmldir | 0 .../projectstorage}/data/qml/QtOpcUa/qmldir | 0 .../data/qml/QtPositioning/qmldir | 0 .../data/qml/QtQml/Base/qmldir | 0 .../data/qml/QtQml/Models/qmldir | 0 .../data/qml/QtQml/StateMachine/qmldir | 0 .../data/qml/QtQml/WorkerScript/qmldir | 0 .../data/qml/QtQml/XmlListModel/qmldir | 0 .../projectstorage}/data/qml/QtQml/qmldir | 0 .../qml/QtQuick/Controls/Basic/impl/qmldir | 0 .../data/qml/QtQuick/Controls/Basic/qmldir | 0 .../qml/QtQuick/Controls/Fusion/impl/qmldir | 0 .../data/qml/QtQuick/Controls/Fusion/qmldir | 0 .../qml/QtQuick/Controls/Imagine/impl/qmldir | 0 .../data/qml/QtQuick/Controls/Imagine/qmldir | 0 .../qml/QtQuick/Controls/Material/impl/qmldir | 0 .../data/qml/QtQuick/Controls/Material/qmldir | 0 .../QtQuick/Controls/Universal/impl/qmldir | 0 .../qml/QtQuick/Controls/Universal/qmldir | 0 .../data/qml/QtQuick/Controls/impl/qmldir | 0 .../data/qml/QtQuick/Controls/qmldir | 0 .../data/qml/QtQuick/Dialogs/qmldir | 0 .../data/qml/QtQuick/Dialogs/quickimpl/qmldir | 0 .../data/qml/QtQuick/Effects/qmldir | 0 .../data/qml/QtQuick/Layouts/qmldir | 0 .../data/qml/QtQuick/LocalStorage/qmldir | 0 .../data/qml/QtQuick/NativeStyle/qmldir | 0 .../data/qml/QtQuick/Particles/qmldir | 0 .../data/qml/QtQuick/Pdf/qmldir | 0 .../data/qml/QtQuick/Scene2D/qmldir | 0 .../data/qml/QtQuick/Scene3D/qmldir | 0 .../data/qml/QtQuick/Shapes/qmldir | 0 .../data/qml/QtQuick/Templates/qmldir | 0 .../data/qml/QtQuick/Timeline/qmldir | 0 .../QtQuick/VirtualKeyboard/Components/qmldir | 0 .../QtQuick/VirtualKeyboard/Layouts/qmldir | 0 .../VirtualKeyboard/Plugins/Hangul/qmldir | 0 .../VirtualKeyboard/Plugins/OpenWNN/qmldir | 0 .../VirtualKeyboard/Plugins/Pinyin/qmldir | 0 .../VirtualKeyboard/Plugins/TCIme/qmldir | 0 .../VirtualKeyboard/Plugins/Thai/qmldir | 0 .../QtQuick/VirtualKeyboard/Plugins/qmldir | 0 .../QtQuick/VirtualKeyboard/Settings/qmldir | 0 .../VirtualKeyboard/Styles/Builtin/qmldir | 0 .../qml/QtQuick/VirtualKeyboard/Styles/qmldir | 0 .../data/qml/QtQuick/VirtualKeyboard/qmldir | 0 .../data/qml/QtQuick/Window/qmldir | 0 .../projectstorage}/data/qml/QtQuick/qmldir | 0 .../data/qml/QtQuick/tooling/qmldir | 0 .../data/qml/QtQuick3D/AssetUtils/qmldir | 0 .../data/qml/QtQuick3D/Effects/qmldir | 0 .../data/qml/QtQuick3D/Helpers/impl/qmldir | 0 .../data/qml/QtQuick3D/Helpers/qmldir | 0 .../data/qml/QtQuick3D/MaterialEditor/qmldir | 0 .../data/qml/QtQuick3D/ParticleEffects/qmldir | 0 .../data/qml/QtQuick3D/Particles3D/qmldir | 0 .../data/qml/QtQuick3D/Physics/Helpers/qmldir | 0 .../data/qml/QtQuick3D/Physics/qmldir | 0 .../data/qml/QtQuick3D/SpatialAudio/qmldir | 0 .../projectstorage}/data/qml/QtQuick3D/qmldir | 0 .../data/qml/QtRemoteObjects/qmldir | 0 .../projectstorage}/data/qml/QtScxml/qmldir | 0 .../projectstorage}/data/qml/QtSensors/qmldir | 0 .../projectstorage}/data/qml/QtTest/qmldir | 0 .../data/qml/QtTextToSpeech/qmldir | 0 .../data/qml/QtVncServer/qmldir | 0 .../QtWayland/Client/TextureSharing/qmldir | 0 .../Compositor/IviApplication/qmldir | 0 .../Compositor/PresentationTime/qmldir | 0 .../qml/QtWayland/Compositor/QtShell/qmldir | 0 .../Compositor/TextureSharingExtension/qmldir | 0 .../qml/QtWayland/Compositor/WlShell/qmldir | 0 .../qml/QtWayland/Compositor/XdgShell/qmldir | 0 .../data/qml/QtWayland/Compositor/qmldir | 0 .../data/qml/QtWebChannel/qmldir | 0 .../qml/QtWebEngine/ControlsDelegates/qmldir | 0 .../data/qml/QtWebEngine/qmldir | 0 .../data/qml/QtWebSockets/qmldir | 0 .../projectstorage}/data/qml/QtWebView/qmldir | 0 .../directorypathcompressor-test.cpp | 13 +- .../projectstorage}/filestatuscache-test.cpp | 4 +- .../projectstorage}/modulescanner-test.cpp | 11 +- .../projectstorage}/projectstorage-test.cpp | 2 +- .../projectstoragepathwatcher-test.cpp | 28 +- ...jectstoragesqlitefunctionregistry-test.cpp | 2 +- .../projectstorageupdater-test.cpp | 300 +++++++------- .../qmldocumentparser-test.cpp | 2 +- .../projectstorage}/qmltypesparser-test.cpp | 2 +- .../projectstorage}/sourcepath-test.cpp | 2 +- .../projectstorage}/sourcepathcache-test.cpp | 6 +- .../projectstorage}/sourcepathview-test.cpp | 2 +- .../projectstorage}/storagecache-test.cpp | 8 +- .../qmlprojectmanager/CMakeLists.txt | 2 + .../qmlprojectmanager/converters-test.cpp | 2 +- .../qmlprojectmanager/data/README.md | 0 .../converter/test-set-1/testfile.jsontoqml | 0 .../converter/test-set-1/testfile.qmlproject | 0 .../converter/test-set-1/testfile.qmltojson | 0 .../converter/test-set-2/testfile.jsontoqml | 0 .../converter/test-set-2/testfile.qmlproject | 0 .../converter/test-set-2/testfile.qmltojson | 0 .../file-filters/MaterialBundle.qmlproject | 0 .../MaterialBundle.qmlproject.qtds | 0 .../data/file-filters/MaterialLibrary.qrc | 0 .../file-filters/asset_imports/CMakeLists.txt | 0 .../ComponentBundles/CMakeLists.txt | 0 .../MaterialBundle/AcrylicPaintMaterial.qml | 0 .../MaterialBundle/AluminiumMaterial.qml | 0 .../MaterialBundle/AsphaltMaterial.qml | 0 .../MaterialBundle/BrickMaterial.qml | 0 .../MaterialBundle/CMakeLists.txt | 0 .../CarPaintGlitterMaterial.qml | 0 .../MaterialBundle/CarPaintMaterial.qml | 0 .../MaterialBundle/CarbonFiberMaterial.qml | 0 .../MaterialBundle/CeramicMaterial.qml | 0 .../MaterialBundle/ChromeMaterial.qml | 0 .../MaterialBundle/ConcreteMaterial.qml | 0 .../MaterialBundle/CopperMaterial.qml | 0 .../MaterialBundle/FabricMaterial.qml | 0 .../MaterialBundle/FabricRoughMaterial.qml | 0 .../MaterialBundle/FabricSatinMaterial.qml | 0 .../MaterialBundle/GlassMaterial.qml | 0 .../MaterialBundle/GlassTintedMaterial.qml | 0 .../MaterialBundle/GoldMaterial.qml | 0 .../MaterialBundle/LeatherMaterial.qml | 0 .../MaterialBundle/MirrorMaterial.qml | 0 .../MaterialBundle/PaperMaterial.qml | 0 .../MaterialBundle/PlasticMatteMaterial.qml | 0 .../MaterialBundle/PlasticShinyMaterial.qml | 0 .../PlasticTexturedMaterial.qml | 0 .../MaterialBundle/RubberMaterial.qml | 0 .../MaterialBundle/SilverMaterial.qml | 0 .../MaterialBundle/SteelBrushedMaterial.qml | 0 .../MaterialBundle/SteelFloorMaterial.qml | 0 .../MaterialBundle/SteelMaterial.qml | 0 .../MaterialBundle/StoneMaterial.qml | 0 .../MaterialBundle/WaxMaterial.qml | 0 .../MaterialBundle/WoodMaterial.qml | 0 .../MaterialBundle/WoodParquetMaterial.qml | 0 .../MaterialBundle/WoodPlanksMaterial.qml | 0 .../MaterialBundle/_asset_ref.json | 0 .../designer/acrylicpaint.metainfo | 0 .../designer/aluminium.metainfo | 0 .../MaterialBundle/designer/asphalt.metainfo | 0 .../MaterialBundle/designer/brick.metainfo | 0 .../designer/carbonfiber.metainfo | 0 .../MaterialBundle/designer/carpaint.metainfo | 0 .../designer/carpaintglitter.metainfo | 0 .../MaterialBundle/designer/ceramic.metainfo | 0 .../MaterialBundle/designer/chrome.metainfo | 0 .../MaterialBundle/designer/concrete.metainfo | 0 .../MaterialBundle/designer/copper.metainfo | 0 .../MaterialBundle/designer/fabric.metainfo | 0 .../designer/fabricrough.metainfo | 0 .../designer/fabricsatin.metainfo | 0 .../MaterialBundle/designer/glass.metainfo | 0 .../designer/glasstinted.metainfo | 0 .../MaterialBundle/designer/gold.metainfo | 0 .../designer/images/material.png | 0 .../designer/images/material16.png | 0 .../designer/images/material@2x.png | 0 .../MaterialBundle/designer/leather.metainfo | 0 .../MaterialBundle/designer/mirror.metainfo | 0 .../MaterialBundle/designer/paper.metainfo | 0 .../designer/plasticmatte.metainfo | 0 .../designer/plasticshiny.metainfo | 0 .../designer/plastictextured.metainfo | 0 .../MaterialBundle/designer/rubber.metainfo | 0 .../MaterialBundle/designer/silver.metainfo | 0 .../MaterialBundle/designer/steel.metainfo | 0 .../designer/steelbrushed.metainfo | 0 .../designer/steelfloor.metainfo | 0 .../MaterialBundle/designer/stone.metainfo | 0 .../MaterialBundle/designer/wax.metainfo | 0 .../MaterialBundle/designer/wood.metainfo | 0 .../designer/woodparquet.metainfo | 0 .../designer/woodplanks.metainfo | 0 .../images/Asphalt010_2K_NormalGL.png | 0 .../images/Asphalt010_2K_Opacity.png | 0 .../images/Asphalt010_2K_Roughness.png | 0 .../images/Bricks026_2K_AmbientOcclusion.png | 0 .../images/Bricks026_2K_Color.png | 0 .../images/Bricks026_2K_NormalGL.png | 0 .../images/Bricks026_2K_Roughness.png | 0 .../images/Concrete032_2K_NormalGL.png | 0 .../images/Concrete032_2K_Roughness.png | 0 .../images/DiamondPlate001_2K_NormalGL.png | 0 .../images/DiamondPlate001_2K_Roughness.png | 0 .../images/Fabric004_2K_NormalGL.png | 0 .../images/Fabric030_2K_Displacement.png | 0 .../images/Fabric030_2K_NormalGL.png | 0 .../images/Fabric030_2K_Roughness.png | 0 .../images/Fabric031_2K_Displacement.png | 0 .../images/Fabric031_2K_NormalGL.png | 0 .../images/Fabric031_2K_Roughness.png | 0 .../MaterialBundle/images/LDR_RGB1_3.png | 0 .../images/Leather037_2K_Color.png | 0 .../images/Leather037_2K_NormalGL.png | 0 .../images/Leather037_2K_Roughness.png | 0 .../images/Metal009_2K_NormalGL.png | 0 .../images/Metal009_2K_Roughness.png | 0 .../images/Metal029_2K_Displacement.jpg | 0 .../images/Metal029_2K_Displacement.png | 0 .../images/Paint006_2K_AmbientOcclusion.png | 0 .../images/Paint006_2K_NormalGL.png | 0 .../images/Paint006_2K_Roughness.png | 0 .../images/Rock023_2K_AmbientOcclusion.png | 0 .../images/Rock023_2K_Color.png | 0 .../images/Rock023_2K_NormalGL.png | 0 .../images/Rock023_2K_Roughness.png | 0 .../images/Wood048_2K_Color.png | 0 .../images/Wood048_2K_NormalGL.png | 0 .../images/Wood048_2K_Roughness.png | 0 .../images/WoodFloor044_2K_Color.png | 0 .../images/WoodFloor044_2K_NormalGL.png | 0 .../images/WoodFloor044_2K_Roughness.png | 0 .../WoodFloor054_2K_AmbientOcclusion.png | 0 .../images/WoodFloor054_2K_Color.png | 0 .../images/WoodFloor054_2K_NormalGL.png | 0 .../images/WoodFloor054_2K_Roughness.png | 0 .../MaterialBundle/images/blurrynoise.tga | 0 .../MaterialBundle/images/noisenormal.png | 0 .../ComponentBundles/MaterialBundle/qmldir | 0 .../MaterialBundle/shaders/CMakeLists.txt | 0 .../MaterialBundle/shaders/SSS.frag | 0 .../MaterialBundle/shaders/SSS.vert | 0 .../MaterialBundle/shaders/carmat_simple.frag | 0 .../MaterialBundle/shaders/carmat_simple.vert | 0 .../shaders/carmat_simple_nf.frag | 0 .../shaders/carmat_simple_nf.vert | 0 .../MaterialBundle/shaders/glass.frag | 0 .../MaterialBundle/shaders/glass.vert | 0 .../MaterialBundle/shaders/satin.frag | 0 .../MaterialBundle/shaders/satin.vert | 0 .../data/file-filters/content/App.qml | 0 .../data/file-filters/content/CMakeLists.txt | 0 .../content/CustomRoundButton.qml | 0 .../file-filters/content/MaterialNames.qml | 0 .../file-filters/content/MouseRotator.qml | 0 .../data/file-filters/content/Screen01.ui.qml | 0 .../content/fonts/OpenSans-Bold.ttf | 0 .../content/fonts/OpenSans-Regular.ttf | 0 .../data/file-filters/content/fonts/fonts.txt | 0 .../content/images/Ground_ShadowMap.png | 0 .../content/images/HDR/dark_mode.png | 0 .../content/images/HDR/day_mode.png | 0 .../content/images/LDR_RGB1_3.png | 0 .../file-filters/content/images/QtLogo_HD.png | 0 .../content/images/UI/innerMesh.png | 0 .../content/images/UI/lightToggle.png | 0 .../content/images/UI/outerMesh.png | 0 .../content/images/UI/perfhudicon.png | 0 .../content/images/UI/perfhudicon_on.png | 0 .../file-filters/content/images/White.png | 0 .../file-filters/content/images/checkmark.png | 0 .../content/images/groundAlpha.png | 0 .../file-filters/content/images/qtlogo.png | 0 .../content/images/scratchmap.png | 0 .../file-filters/content/images/shadow.png | 0 .../content/images/vlkhcah_2K_AO.jpg | 0 .../content/images/vlkhcah_2K_Albedo.jpg | 0 .../content/images/vlkhcah_2K_Normal.jpg | 0 .../content/images/vlkhcah_2K_Roughness.jpg | 0 .../file-filters/content/meshes/floor.mesh | 0 .../content/meshes/materialBall.mesh | 0 .../data/file-filters/filelist.txt | 0 .../data/file-filters/imports/CMakeLists.txt | 0 .../imports/MaterialLibrary/CMakeLists.txt | 0 .../imports/MaterialLibrary/Constants.qml | 0 .../MaterialLibrary/DirectoryFontLoader.qml | 0 .../MaterialLibrary/EventListModel.qml | 0 .../MaterialLibrary/EventListSimulator.qml | 0 .../MaterialLibrary/designer/plugin.metainfo | 0 .../imports/MaterialLibrary/qmldir | 0 .../data/file-filters/main.qml | 0 .../data/file-filters/qmlcomponents | 0 .../data/file-filters/qmlmodules | 0 .../data/file-filters/qtquickcontrols2.conf | 0 .../data/file-filters/share.qrc | 0 .../data/file-filters/src/app_environment.h | 0 .../file-filters/src/import_qml_plugins.h | 0 .../data/file-filters/src/main.cpp | 0 .../data/file-filters/translations.db | 0 .../data/getter-setter/empty.qmlproject | 0 .../getter-setter/with_qds_prefix.qmlproject | 0 .../without_qds_prefix.qmlproject | 0 .../qmlprojectmanager/projectitem-test.cpp | 4 +- .../tests/unittests/sqlite/CMakeLists.txt | 21 + .../createtablesqlstatementbuilder-test.cpp | 2 +- .../unittests/sqlite/data/sqlite_database.db | Bin 0 -> 12288 bytes .../sqlite}/lastchangedrowid-test.cpp | 4 +- .../sqlite}/sqlitealgorithms-test.cpp | 2 +- .../unittests/sqlite}/sqlitecolumn-test.cpp | 2 +- .../unittests/sqlite}/sqlitedatabase-test.cpp | 13 +- .../sqlite}/sqlitedatabasebackend-test.cpp | 2 +- .../sqlite}/sqlitefunctionregistry-test.cpp | 8 +- .../unittests/sqlite}/sqliteindex-test.cpp | 2 +- .../unittests/sqlite}/sqlitesessions-test.cpp | 2 +- .../sqlite}/sqlitestatement-test.cpp | 27 +- .../unittests/sqlite}/sqlitetable-test.cpp | 16 +- .../unittests/sqlite}/sqliteteststatement.h | 0 .../sqlite}/sqlitetransaction-test.cpp | 22 +- .../unittests/sqlite}/sqlitevalue-test.cpp | 2 +- .../sqlite}/sqlstatementbuilder-test.cpp | 2 +- .../unittests}/unittests-main.cpp | 2 +- .../unit/tests/unittests/utils/CMakeLists.txt | 16 + .../unittests/utils}/data/sqlite_database.db | Bin .../unittests/utils}/matchingtext-test.cpp | 2 +- .../unittests/utils}/sizedarray-test.cpp | 2 +- .../utils}/smallstring-benchmark.cpp | 0 .../unittests/utils}/smallstring-test.cpp | 2 +- tests/unit/tests/utils/CMakeLists.txt | 17 + .../utils}/conditionally-disabled-tests.h | 0 .../{unittest => tests/utils}/eventspy.cpp | 0 .../unit/{unittest => tests/utils}/eventspy.h | 0 .../{unittest => tests/utils}/fakeprocess.cpp | 0 .../{unittest => tests/utils}/fakeprocess.h | 0 .../utils}/google-using-declarations.h | 0 .../{unittest => tests/utils}/googletest.h | 19 +- .../{unittest => tests/utils}/notification.h | 2 +- .../utils}/processevents-utilities.cpp | 0 .../utils}/processevents-utilities.h | 0 .../{unittest => tests/utils}/spydummy.cpp | 0 .../unit/{unittest => tests/utils}/spydummy.h | 0 .../utils}/unittest-utility-functions.h | 0 tests/unit/unit.qbs | 4 - tests/unit/unittest/CMakeLists.txt | 369 ------------------ tests/unit/unittest/data/qml/Qt3D/Core/qmldir | 8 - tests/unit/unittest/mockfutureinterface.h | 20 - tests/unit/unittest/processcreator-test.cpp | 99 ----- 448 files changed, 864 insertions(+), 933 deletions(-) rename tests/unit/{unittest => }/3rdparty/googletest (100%) create mode 100644 tests/unit/tests/CMakeLists.txt create mode 100644 tests/unit/tests/matchers/CMakeLists.txt rename tests/unit/{unittest => tests/matchers}/dynamicastmatcherdiagnosticcontainer-matcher.h (98%) rename tests/unit/{unittest => tests/matchers}/unittest-matchers.h (100%) create mode 100644 tests/unit/tests/mocks/CMakeLists.txt rename tests/unit/{unittest => tests/mocks}/abstractviewmock.h (94%) rename tests/unit/{unittest => tests/mocks}/externaldependenciesmock.h (98%) rename tests/unit/{unittest => tests/mocks}/filesystemmock.h (96%) rename tests/unit/{unittest => tests/mocks}/imagecachecollectormock.h (97%) rename tests/unit/{unittest => tests/mocks}/mockimagecachegenerator.h (96%) rename tests/unit/{unittest => tests/mocks}/mockimagecachestorage.h (98%) rename tests/unit/{unittest => tests/mocks}/mocklistmodeleditorview.h (98%) rename tests/unit/{unittest => tests/mocks}/mockmutex.h (94%) rename tests/unit/{unittest => tests/mocks}/mockqfilesystemwatcher.h (66%) rename tests/unit/{unittest => tests/mocks}/mocksqlitestatement.h (98%) rename tests/unit/{unittest => tests/mocks}/mocksqlitetransactionbackend.h (95%) rename tests/unit/{unittest => tests/mocks}/mocksyntaxhighligher.h (91%) rename tests/unit/{unittest => tests/mocks}/mocktimer.cpp (91%) rename tests/unit/{unittest => tests/mocks}/mocktimer.h (83%) rename tests/unit/{unittest => tests/mocks}/mocktimestampprovider.h (93%) rename tests/unit/{unittest => tests/mocks}/modelresourcemanagementmock.h (97%) rename tests/unit/{unittest => tests/mocks}/projectstoragemock.cpp (100%) rename tests/unit/{unittest => tests/mocks}/projectstoragemock.h (99%) rename tests/unit/{unittest => tests/mocks}/projectstoragepathwatchermock.h (96%) rename tests/unit/{unittest => tests/mocks}/projectstoragepathwatchernotifiermock.h (94%) rename tests/unit/{unittest => tests/mocks}/qmldocumentparsermock.h (95%) rename tests/unit/{unittest => tests/mocks}/qmltypesparsermock.h (95%) rename tests/unit/{unittest => tests/mocks}/sourcepathcachemock.h (96%) rename tests/unit/{unittest => tests/mocks}/sqlitedatabasemock.h (98%) rename tests/unit/{unittest => tests/mocks}/sqlitereadstatementmock.cpp (100%) rename tests/unit/{unittest => tests/mocks}/sqlitereadstatementmock.h (99%) rename tests/unit/{unittest => tests/mocks}/sqlitereadwritestatementmock.cpp (100%) rename tests/unit/{unittest => tests/mocks}/sqlitereadwritestatementmock.h (92%) rename tests/unit/{unittest => tests/mocks}/sqlitestatementmock.h (98%) rename tests/unit/{unittest => tests/mocks}/sqlitetransactionbackendmock.h (96%) rename tests/unit/{unittest => tests/mocks}/sqlitewritestatementmock.cpp (100%) rename tests/unit/{unittest => tests/mocks}/sqlitewritestatementmock.h (99%) create mode 100644 tests/unit/tests/printers/CMakeLists.txt rename tests/unit/{unittest => tests/printers}/gtest-creator-printing.cpp (100%) rename tests/unit/{unittest => tests/printers}/gtest-creator-printing.h (100%) rename tests/unit/{unittest => tests/printers}/gtest-llvm-printing.cpp (100%) rename tests/unit/{unittest => tests/printers}/gtest-llvm-printing.h (100%) rename tests/unit/{unittest => tests/printers}/gtest-qt-printing.cpp (100%) rename tests/unit/{unittest => tests/printers}/gtest-qt-printing.h (100%) rename tests/unit/{unittest => tests/printers}/gtest-std-printing.h (100%) create mode 100644 tests/unit/tests/stubs/CMakeLists.txt rename tests/unit/{mockup => tests/stubs}/clangcodemodel/clangcompletionassistinterface.h (100%) rename tests/unit/{mockup => tests/stubs}/coreplugin/helpitem.h (100%) rename tests/unit/{mockup => tests/stubs}/coreplugin/icontext.h (100%) rename tests/unit/{mockup => tests/stubs}/coreplugin/icore.h (93%) rename tests/unit/{mockup => tests/stubs}/coreplugin/vcsmanager.h (100%) rename tests/unit/{mockup => tests/stubs}/qmldesigner/designercore/include/documentmessage.h (100%) rename tests/unit/{mockup => tests/stubs}/qmldesigner/designercore/include/itemlibraryitem.h (100%) rename tests/unit/{mockup => tests/stubs}/qmldesigner/designercore/include/nodeinstanceview.h (100%) rename tests/unit/{mockup => tests/stubs}/qmldesigner/designercore/include/qmlmodelnodefacade.h (100%) rename tests/unit/{mockup => tests/stubs}/qmldesigner/designercore/include/qmlobjectnode.h (100%) rename tests/unit/{mockup => tests/stubs}/qmldesigner/designercore/include/qmlstate.h (100%) rename tests/unit/{mockup => tests/stubs}/qmldesigner/designercore/include/qmltimeline.h (100%) rename tests/unit/{mockup => tests/stubs}/qmldesigner/designercore/include/rewriterview.h (100%) rename tests/unit/{mockup => tests/stubs}/texteditor/assistenums.h (100%) rename tests/unit/{mockup => tests/stubs}/texteditor/codeassist/assistinterface.h (100%) rename tests/unit/{mockup => tests/stubs}/texteditor/quickfix.h (100%) rename tests/unit/{mockup => tests/stubs}/texteditor/refactoringchanges.h (89%) rename tests/unit/{mockup => tests/stubs}/texteditor/semantichighlighter.h (100%) rename tests/unit/{mockup => tests/stubs}/texteditor/syntaxhighlighter.h (100%) create mode 100644 tests/unit/tests/unittests/CMakeLists.txt create mode 100644 tests/unit/tests/unittests/imagecache/CMakeLists.txt rename tests/unit/{unittest => tests/unittests/imagecache}/asynchronousexplicitimagecache-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/imagecache}/asynchronousimagecache-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/imagecache}/asynchronousimagefactory-test.cpp (96%) rename tests/unit/{unittest => tests/unittests/imagecache}/imagecachedispatchcollector-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/imagecache}/imagecachegenerator-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/imagecache}/imagecachestorage-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/imagecache}/synchronousimagecache-test.cpp (98%) create mode 100644 tests/unit/tests/unittests/listmodeleditor/CMakeLists.txt rename tests/unit/{unittest => tests/unittests/listmodeleditor}/listmodeleditor-test.cpp (99%) create mode 100644 tests/unit/tests/unittests/model/CMakeLists.txt rename tests/unit/{unittest => tests/unittests/model}/import-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/model}/model-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/model}/modelresourcemanagement-test.cpp (97%) rename tests/unit/{unittest => tests/unittests/model}/nodelistproperty-test.cpp (99%) create mode 100644 tests/unit/tests/unittests/projectstorage/CMakeLists.txt rename tests/unit/{unittest => tests/unittests/projectstorage}/data/modulescanner/Example/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QmlTime/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/labs/animation/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/labs/folderlistmodel/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/labs/lottieqt/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/labs/platform/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/labs/qmlmodels/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/labs/settings/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/labs/sharedimage/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/labs/wavefrontmesh/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt/test/controls/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt3D/Animation/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt3D/Extras/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt3D/Input/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt3D/Logic/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt3D/Render/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt5Compat/GraphicalEffects/private/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/Qt5Compat/GraphicalEffects/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtApplicationManager/Application/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtApplicationManager/SystemUI/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtApplicationManager/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtCharts/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtCore/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtDataVisualization/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtInsightTracker/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtInterfaceFramework/Media/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtInterfaceFramework/VehicleFunctions/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtInterfaceFramework/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtLocation/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtMultimedia/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtOpcUa/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtPositioning/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQml/Base/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQml/Models/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQml/StateMachine/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQml/WorkerScript/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQml/XmlListModel/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQml/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Basic/impl/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Basic/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Fusion/impl/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Fusion/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Imagine/impl/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Imagine/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Material/impl/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Material/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Universal/impl/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/Universal/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/impl/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Controls/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Dialogs/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Dialogs/quickimpl/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Effects/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Layouts/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/LocalStorage/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/NativeStyle/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Particles/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Pdf/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Scene2D/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Scene3D/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Shapes/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Templates/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Timeline/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Components/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Layouts/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Plugins/Hangul/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Plugins/OpenWNN/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Plugins/Pinyin/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Plugins/TCIme/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Plugins/Thai/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Plugins/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Settings/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Styles/Builtin/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/Styles/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/VirtualKeyboard/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/Window/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick/tooling/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/AssetUtils/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/Effects/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/Helpers/impl/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/Helpers/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/MaterialEditor/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/ParticleEffects/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/Particles3D/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/Physics/Helpers/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/Physics/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/SpatialAudio/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtQuick3D/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtRemoteObjects/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtScxml/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtSensors/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtTest/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtTextToSpeech/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtVncServer/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWayland/Client/TextureSharing/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWayland/Compositor/IviApplication/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWayland/Compositor/PresentationTime/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWayland/Compositor/QtShell/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWayland/Compositor/TextureSharingExtension/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWayland/Compositor/WlShell/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWayland/Compositor/XdgShell/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWayland/Compositor/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWebChannel/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWebEngine/ControlsDelegates/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWebEngine/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWebSockets/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/data/qml/QtWebView/qmldir (100%) rename tests/unit/{unittest => tests/unittests/projectstorage}/directorypathcompressor-test.cpp (90%) rename tests/unit/{unittest => tests/unittests/projectstorage}/filestatuscache-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/projectstorage}/modulescanner-test.cpp (94%) rename tests/unit/{unittest => tests/unittests/projectstorage}/projectstorage-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/projectstorage}/projectstoragepathwatcher-test.cpp (95%) rename tests/unit/{unittest => tests/unittests/projectstorage}/projectstoragesqlitefunctionregistry-test.cpp (98%) rename tests/unit/{unittest => tests/unittests/projectstorage}/projectstorageupdater-test.cpp (94%) rename tests/unit/{unittest => tests/unittests/projectstorage}/qmldocumentparser-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/projectstorage}/qmltypesparser-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/projectstorage}/sourcepath-test.cpp (98%) rename tests/unit/{unittest => tests/unittests/projectstorage}/sourcepathcache-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/projectstorage}/sourcepathview-test.cpp (98%) rename tests/unit/{unittest => tests/unittests/projectstorage}/storagecache-test.cpp (99%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/CMakeLists.txt (85%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/converters-test.cpp (98%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/README.md (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/converter/test-set-1/testfile.qmlproject (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/converter/test-set-2/testfile.qmlproject (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject.qtds (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/MaterialLibrary.qrc (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/CMakeLists.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/CMakeLists.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AcrylicPaintMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AluminiumMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AsphaltMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/BrickMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CMakeLists.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintGlitterMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarbonFiberMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CeramicMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ChromeMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ConcreteMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CopperMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricRoughMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricSatinMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassTintedMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GoldMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/LeatherMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/MirrorMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PaperMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticMatteMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticShinyMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticTexturedMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/RubberMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SilverMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelBrushedMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelFloorMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/StoneMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WaxMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodParquetMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodPlanksMaterial.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/_asset_ref.json (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/acrylicpaint.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/aluminium.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/asphalt.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/brick.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carbonfiber.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaint.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaintglitter.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/ceramic.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/chrome.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/concrete.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/copper.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabric.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricrough.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricsatin.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glass.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glasstinted.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/gold.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material16.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material@2x.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/leather.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/mirror.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/paper.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticmatte.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticshiny.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plastictextured.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/rubber.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/silver.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steel.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelbrushed.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelfloor.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/stone.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wax.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wood.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodparquet.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodplanks.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Opacity.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_AmbientOcclusion.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Color.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric004_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Displacement.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Displacement.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/LDR_RGB1_3.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Color.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.jpg (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_AmbientOcclusion.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_AmbientOcclusion.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Color.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Color.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Color.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_AmbientOcclusion.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Color.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_NormalGL.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Roughness.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/blurrynoise.tga (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/noisenormal.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/qmldir (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/CMakeLists.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.frag (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.vert (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.frag (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.vert (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.frag (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.vert (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.frag (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.vert (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.frag (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.vert (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/App.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/CMakeLists.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/CustomRoundButton.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/MaterialNames.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/MouseRotator.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/Screen01.ui.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Bold.ttf (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Regular.ttf (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/fonts/fonts.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/Ground_ShadowMap.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/HDR/dark_mode.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/HDR/day_mode.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/LDR_RGB1_3.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/QtLogo_HD.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/UI/innerMesh.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/UI/lightToggle.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/UI/outerMesh.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon_on.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/White.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/checkmark.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/groundAlpha.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/qtlogo.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/scratchmap.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/shadow.png (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_AO.jpg (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Albedo.jpg (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Normal.jpg (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Roughness.jpg (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/meshes/floor.mesh (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/content/meshes/materialBall.mesh (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/filelist.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/imports/CMakeLists.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/CMakeLists.txt (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/Constants.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/DirectoryFontLoader.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListModel.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListSimulator.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/designer/plugin.metainfo (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/qmldir (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/main.qml (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/qmlcomponents (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/qmlmodules (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/qtquickcontrols2.conf (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/share.qrc (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/src/app_environment.h (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/src/import_qml_plugins.h (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/src/main.cpp (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/file-filters/translations.db (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/getter-setter/empty.qmlproject (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/data/getter-setter/without_qds_prefix.qmlproject (100%) rename tests/unit/{unittest => tests/unittests}/qmlprojectmanager/projectitem-test.cpp (99%) create mode 100644 tests/unit/tests/unittests/sqlite/CMakeLists.txt rename tests/unit/{unittest => tests/unittests/sqlite}/createtablesqlstatementbuilder-test.cpp (99%) create mode 100644 tests/unit/tests/unittests/sqlite/data/sqlite_database.db rename tests/unit/{unittest => tests/unittests/sqlite}/lastchangedrowid-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitealgorithms-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitecolumn-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitedatabase-test.cpp (96%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitedatabasebackend-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitefunctionregistry-test.cpp (72%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqliteindex-test.cpp (97%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitesessions-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitestatement-test.cpp (98%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitetable-test.cpp (98%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqliteteststatement.h (100%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitetransaction-test.cpp (95%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlitevalue-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/sqlite}/sqlstatementbuilder-test.cpp (99%) rename tests/unit/{unittest => tests/unittests}/unittests-main.cpp (98%) create mode 100644 tests/unit/tests/unittests/utils/CMakeLists.txt rename tests/unit/{unittest => tests/unittests/utils}/data/sqlite_database.db (100%) rename tests/unit/{unittest => tests/unittests/utils}/matchingtext-test.cpp (99%) rename tests/unit/{unittest => tests/unittests/utils}/sizedarray-test.cpp (98%) rename tests/unit/{unittest => tests/unittests/utils}/smallstring-benchmark.cpp (100%) rename tests/unit/{unittest => tests/unittests/utils}/smallstring-test.cpp (99%) create mode 100644 tests/unit/tests/utils/CMakeLists.txt rename tests/unit/{unittest => tests/utils}/conditionally-disabled-tests.h (100%) rename tests/unit/{unittest => tests/utils}/eventspy.cpp (100%) rename tests/unit/{unittest => tests/utils}/eventspy.h (100%) rename tests/unit/{unittest => tests/utils}/fakeprocess.cpp (100%) rename tests/unit/{unittest => tests/utils}/fakeprocess.h (100%) rename tests/unit/{unittest => tests/utils}/google-using-declarations.h (100%) rename tests/unit/{unittest => tests/utils}/googletest.h (55%) rename tests/unit/{unittest => tests/utils}/notification.h (95%) rename tests/unit/{unittest => tests/utils}/processevents-utilities.cpp (100%) rename tests/unit/{unittest => tests/utils}/processevents-utilities.h (100%) rename tests/unit/{unittest => tests/utils}/spydummy.cpp (100%) rename tests/unit/{unittest => tests/utils}/spydummy.h (100%) rename tests/unit/{unittest => tests/utils}/unittest-utility-functions.h (100%) delete mode 100644 tests/unit/unit.qbs delete mode 100644 tests/unit/unittest/CMakeLists.txt delete mode 100644 tests/unit/unittest/data/qml/Qt3D/Core/qmldir delete mode 100644 tests/unit/unittest/mockfutureinterface.h delete mode 100644 tests/unit/unittest/processcreator-test.cpp diff --git a/.gitignore b/.gitignore index de76458a885..bb073b45dc2 100644 --- a/.gitignore +++ b/.gitignore @@ -280,7 +280,6 @@ tmp/ /tests/manual/ssh/shell/shell /tests/tools/qml-ast2dot/qml-ast2dot /tests/unit/echoserver/echo -/tests/unit/unittest/unittest # qbs builds /*-debug/ diff --git a/.gitmodules b/.gitmodules index 428e75ff118..024b61baedd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,9 +6,9 @@ path = src/tools/perfparser url = ../perfparser.git ignore = dirty -[submodule "googletest"] - path = tests/unit/unittest/3rdparty/googletest - url = https://github.com/google/googletest.git [submodule "src/libs/qlitehtml"] path = src/libs/qlitehtml url = https://code.qt.io/playground/qlitehtml.git +[submodule "googletest"] + path = tests/unit/3rdparty/googletest + url = https://github.com/google/googletest.git diff --git a/cmake/FindGoogletest.cmake b/cmake/FindGoogletest.cmake index e3bd22ba217..3e3c113b463 100644 --- a/cmake/FindGoogletest.cmake +++ b/cmake/FindGoogletest.cmake @@ -22,10 +22,7 @@ find_path(GOOGLE_TEST_INCLUDE_DIR PATH_SUFFIXES googletest/include HINTS "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR - "${PROJECT_SOURCE_DIR}/googletest" - "${PROJECT_SOURCE_DIR}/../googletest" - "${PROJECT_SOURCE_DIR}/../../googletest" - "${PROJECT_SOURCE_DIR}/tests/unit/unittest/3rdparty/googletest" + "${PROJECT_SOURCE_DIR}/tests/unit/3rdparty/googletest" ) find_path(GOOGLE_TEST_SRC_ALL @@ -33,10 +30,7 @@ find_path(GOOGLE_TEST_SRC_ALL PATH_SUFFIXES googletest/src HINTS "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR - "${PROJECT_SOURCE_DIR}/googletest" - "${PROJECT_SOURCE_DIR}/../googletest" - "${PROJECT_SOURCE_DIR}/../../googletest" - "${PROJECT_SOURCE_DIR}/tests/unit/unittest/3rdparty/googletest" + "${PROJECT_SOURCE_DIR}/tests/unit/3rdparty/googletest" ) @@ -45,10 +39,7 @@ find_path(GOOGLE_MOCK_INCLUDE_DIR PATH_SUFFIXES googlemock/include HINTS "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR - "${PROJECT_SOURCE_DIR}/googletest" - "${PROJECT_SOURCE_DIR}/../googletest" - "${PROJECT_SOURCE_DIR}/../../googletest" - "${PROJECT_SOURCE_DIR}/tests/unit/unittest/3rdparty/googletest" + "${PROJECT_SOURCE_DIR}/tests/unit/3rdparty/googletest" ) find_path(GOOGLE_MOCK_SRC_ALL @@ -56,10 +47,7 @@ find_path(GOOGLE_MOCK_SRC_ALL PATH_SUFFIXES googlemock/src HINTS "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR - "${PROJECT_SOURCE_DIR}/googletest" - "${PROJECT_SOURCE_DIR}/../googletest" - "${PROJECT_SOURCE_DIR}/../../googletest" - "${PROJECT_SOURCE_DIR}/tests/unit/unittest/3rdparty/googletest" + "${PROJECT_SOURCE_DIR}/tests/unit/3rdparty/googletest" ) include(FindPackageHandleStandardArgs) diff --git a/qbs/modules/qtc_gtest_gmock/qtc_gtest_gmock.qbs b/qbs/modules/qtc_gtest_gmock/qtc_gtest_gmock.qbs index 02bbb8a3022..7b1d663cf0e 100644 --- a/qbs/modules/qtc_gtest_gmock/qtc_gtest_gmock.qbs +++ b/qbs/modules/qtc_gtest_gmock/qtc_gtest_gmock.qbs @@ -19,7 +19,7 @@ Module { property bool hasRepo configure: { - repoDir = FileInfo.cleanPath(path + "/../../../tests/unit/unittest/3rdparty/googletest"); + repoDir = FileInfo.cleanPath(path + "/../../../tests/unit/3rdparty/googletest"); gtestDir = FileInfo.joinPaths(repoDir, "googletest"); gmockDir = FileInfo.joinPaths(repoDir, "googlemock"); hasRepo = File.exists(gtestDir); diff --git a/tests/unit/unittest/3rdparty/googletest b/tests/unit/3rdparty/googletest similarity index 100% rename from tests/unit/unittest/3rdparty/googletest rename to tests/unit/3rdparty/googletest diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index 95353c01ea6..d5a8e3ccad2 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -1,40 +1,46 @@ cmake_minimum_required(VERSION 3.16) -if (NOT QT_CREATOR_API_DEFINED) - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake") +set(GOOGLETEST_DIR ${CMAKE_CURRENT_LIST_DIR}/3rdparty/googletest) - project(unit) +find_package(Googletest MODULE) +find_package(GoogleBenchmark MODULE) - enable_testing() - - # Needed for pch - set(QtCreator_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../") - option(BUILD_WITH_PCH "Build with precompiled headers" ON) - - set(CMAKE_AUTOMOC ON) - set(CMAKE_AUTORCC ON) - set(CMAKE_AUTOUIC ON) - - set(CMAKE_CXX_STANDARD 17) - set(CMAKE_CXX_STANDARD_REQUIRED ON) - set(CMAKE_CXX_EXTENSIONS OFF) - - set(CMAKE_INCLUDE_CURRENT_DIR ON) - - set(IMPLICIT_DEPENDS Qt::Test) - - include(QtCreatorIDEBranding) - include(QtCreatorAPI) - - set(WITH_TESTS ON) - set(GOOGLETEST_DIR ${CMAKE_CURRENT_LIST_DIR}/unittest/3rdparty/googletest) - - find_package(Clang MODULE) - find_package(Qt6 - COMPONENTS - Gui Core Core5Compat Widgets Network Qml Concurrent Test Xml MODULE) - find_package(Threads) +if (NOT Googletest_FOUND) + message(STATUS "Googletest was not found. Please update the submodules with `git submodule update --init --recursive`.") + message(STATUS "Have a look at cmake/FindGoogletest.cmake file for more details.") + message(STATUS "unit module will be skipped.") + return() endif() -add_subdirectory(unittest) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake") +enable_testing() + +# Needed for pch +set(QtCreator_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../") +option(BUILD_WITH_PCH "Build with precompiled headers" ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(IMPLICIT_DEPENDS Qt::Test) + +include(QtCreatorIDEBranding) +include(QtCreatorAPI) + +set(WITH_TESTS ON) + +find_package(Clang MODULE) +find_package(Qt5 + COMPONENTS + Gui Core Core5Compat Widgets Network Qml Concurrent Test Xml MODULE) +find_package(Threads) + +add_subdirectory(tests) add_subdirectory(tools) diff --git a/tests/unit/README.md b/tests/unit/README.md index 38911b31ec2..eaf87af6e7c 100644 --- a/tests/unit/README.md +++ b/tests/unit/README.md @@ -3,6 +3,7 @@ This document summarizes; * Best practices for writing tests +* How the test folder is organized * How to add a new test * How to build only specific test @@ -15,11 +16,53 @@ We're following those patterns/approaches; * The Arrange, Act, and Assert (AAA) Pattern * Given When Then (GWT) Pattern -## Adding a New Unit Test +## Test Organization -* Please add your tests under `unit/unittest`. No subfolders are needed. -* Name your class as `foo-test.cpp` +Here is the general folder structure; +```cpp +unit (main CMakeLists.txt) +|- README.md +|- 3rdparty // 3rd party dependencies +| `- googletest +|- tools // custom tools for testing +| `- your-custom-folder +`- tests // all tests are here, they all extend main CMake + |- integrationtests // integration tests, executable + |- matchers // custom google-test matchers for testing, library + |- mocks // mocks for testing, library + |- stubs // stubs for testing, library or executable + |- printers // custom google-test matcher printers for testing, library + |- unittests // unit tests are here, executable + `- utils // common utilities which are mostly included by tests +``` + +Unit test and integration test folders are structured as the following; + +```cpp +unittests (and integrationtests) +|- †est-folder-1 // folder for a specific test cluster (or test set) +| |- CMakelists.txt // cmake file for extending main CMake +| |- data // data folder for testing +| `- foo-test.cpp // necessary test files +`- test-folder-2 + |- CMakelists.txt + |- data + `- foo-test.cpp +``` + +## Adding a New Test + +* Please add your tests under `tests/unittest` or `tests/integrationtest` folder. +* Always add your tests to a specific test folder. Please check the test organization section for more information. +* If you need to add a new test folder; + * Create a new folder + * Create a new CMakeLists.txt file + * Add your test files to the folder + * Add your test data to the folder. Please use `data` folder for test data. + * Add `unittest_copy_data_folder()` to your CMakeLists.txt file to copy your test data to the build folder. + * You can access test data from your test code with `UNITTEST_DIR` macro followed by `/data` path. +* Name your test files as `foo-test.cpp`. * Always include `googletest.h` header. Without that you may get the printer function can be broken because the are not anymore ODR (because of weak linking to printers for example). It is also necessary for nice printers, also adds Qt known matchers. ## Building Tests diff --git a/tests/unit/tests/CMakeLists.txt b/tests/unit/tests/CMakeLists.txt new file mode 100644 index 00000000000..5bf8e71bd3d --- /dev/null +++ b/tests/unit/tests/CMakeLists.txt @@ -0,0 +1,24 @@ +find_package(Qt6 COMPONENTS QmlDomPrivate QmlCompilerPrivate) + +if (MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") +elseif (MINGW) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj") +endif() + +set(QtCreatorLibsDir "${QtCreator_SOURCE_DIR}/src/libs") +set(QtCreatorPluginsDir "${QtCreator_SOURCE_DIR}/src/plugins") +set(QtCreatorResourcesDir "${QtCreator_SOURCE_DIR}/share/qtcreator") +set(QmlDesignerDir "${QtCreatorPluginsDir}/qmldesigner") + +set(UnittestStubsDir "${CMAKE_CURRENT_SOURCE_DIR}/stubs") +set(UnittestUtilsDir "${CMAKE_CURRENT_SOURCE_DIR}/utils") +set(UnittestPrintersDir "${CMAKE_CURRENT_SOURCE_DIR}/printers") +set(UnittestMatchersDir "${CMAKE_CURRENT_SOURCE_DIR}/matchers") + +add_subdirectory(unittests) +add_subdirectory(mocks) +add_subdirectory(utils) +add_subdirectory(printers) +add_subdirectory(matchers) +add_subdirectory(stubs) diff --git a/tests/unit/tests/matchers/CMakeLists.txt b/tests/unit/tests/matchers/CMakeLists.txt new file mode 100644 index 00000000000..f094eb2b478 --- /dev/null +++ b/tests/unit/tests/matchers/CMakeLists.txt @@ -0,0 +1,5 @@ +extend_qtc_test(unittest + SOURCES + dynamicastmatcherdiagnosticcontainer-matcher.h + unittest-matchers.h +) diff --git a/tests/unit/unittest/dynamicastmatcherdiagnosticcontainer-matcher.h b/tests/unit/tests/matchers/dynamicastmatcherdiagnosticcontainer-matcher.h similarity index 98% rename from tests/unit/unittest/dynamicastmatcherdiagnosticcontainer-matcher.h rename to tests/unit/tests/matchers/dynamicastmatcherdiagnosticcontainer-matcher.h index dd63682ec48..50c642c8a69 100644 --- a/tests/unit/unittest/dynamicastmatcherdiagnosticcontainer-matcher.h +++ b/tests/unit/tests/matchers/dynamicastmatcherdiagnosticcontainer-matcher.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" using testing::PrintToString; diff --git a/tests/unit/unittest/unittest-matchers.h b/tests/unit/tests/matchers/unittest-matchers.h similarity index 100% rename from tests/unit/unittest/unittest-matchers.h rename to tests/unit/tests/matchers/unittest-matchers.h diff --git a/tests/unit/tests/mocks/CMakeLists.txt b/tests/unit/tests/mocks/CMakeLists.txt new file mode 100644 index 00000000000..485c2d8fb63 --- /dev/null +++ b/tests/unit/tests/mocks/CMakeLists.txt @@ -0,0 +1,35 @@ +extend_qtc_test(unittest + SOURCES + abstractviewmock.h + externaldependenciesmock.h + filesystemmock.h + imagecachecollectormock.h + mockimagecachegenerator.h + mockimagecachestorage.h + mocklistmodeleditorview.h + mockmutex.h + mockqfilesystemwatcher.h + mocksqlitestatement.h + mocksqlitetransactionbackend.h + mocksyntaxhighligher.h + mocktimer.cpp + mocktimer.h + mocktimestampprovider.h + modelresourcemanagementmock.h + projectstoragemock.cpp + projectstoragemock.h + projectstoragepathwatchermock.h + projectstoragepathwatchernotifiermock.h + qmldocumentparsermock.h + qmltypesparsermock.h + sourcepathcachemock.h + sqlitedatabasemock.h + sqlitereadstatementmock.cpp + sqlitereadstatementmock.h + sqlitereadwritestatementmock.cpp + sqlitereadwritestatementmock.h + sqlitestatementmock.h + sqlitetransactionbackendmock.h + sqlitewritestatementmock.cpp + sqlitewritestatementmock.h +) diff --git a/tests/unit/unittest/abstractviewmock.h b/tests/unit/tests/mocks/abstractviewmock.h similarity index 94% rename from tests/unit/unittest/abstractviewmock.h rename to tests/unit/tests/mocks/abstractviewmock.h index d846311995f..0c7d9380677 100644 --- a/tests/unit/unittest/abstractviewmock.h +++ b/tests/unit/tests/mocks/abstractviewmock.h @@ -3,7 +3,7 @@ #pragma once -#include +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/externaldependenciesmock.h b/tests/unit/tests/mocks/externaldependenciesmock.h similarity index 98% rename from tests/unit/unittest/externaldependenciesmock.h rename to tests/unit/tests/mocks/externaldependenciesmock.h index 22654f70551..37c2da1850c 100644 --- a/tests/unit/unittest/externaldependenciesmock.h +++ b/tests/unit/tests/mocks/externaldependenciesmock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/filesystemmock.h b/tests/unit/tests/mocks/filesystemmock.h similarity index 96% rename from tests/unit/unittest/filesystemmock.h rename to tests/unit/tests/mocks/filesystemmock.h index 4e72ff6f7f2..cb1d4df4bc4 100644 --- a/tests/unit/unittest/filesystemmock.h +++ b/tests/unit/tests/mocks/filesystemmock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/imagecachecollectormock.h b/tests/unit/tests/mocks/imagecachecollectormock.h similarity index 97% rename from tests/unit/unittest/imagecachecollectormock.h rename to tests/unit/tests/mocks/imagecachecollectormock.h index 81575b7604f..d8a8608faa6 100644 --- a/tests/unit/unittest/imagecachecollectormock.h +++ b/tests/unit/tests/mocks/imagecachecollectormock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/mockimagecachegenerator.h b/tests/unit/tests/mocks/mockimagecachegenerator.h similarity index 96% rename from tests/unit/unittest/mockimagecachegenerator.h rename to tests/unit/tests/mocks/mockimagecachegenerator.h index e7118de5664..30d322ac7f2 100644 --- a/tests/unit/unittest/mockimagecachegenerator.h +++ b/tests/unit/tests/mocks/mockimagecachegenerator.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/mockimagecachestorage.h b/tests/unit/tests/mocks/mockimagecachestorage.h similarity index 98% rename from tests/unit/unittest/mockimagecachestorage.h rename to tests/unit/tests/mocks/mockimagecachestorage.h index 9eb8af53726..e723adbcaaa 100644 --- a/tests/unit/unittest/mockimagecachestorage.h +++ b/tests/unit/tests/mocks/mockimagecachestorage.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/mocklistmodeleditorview.h b/tests/unit/tests/mocks/mocklistmodeleditorview.h similarity index 98% rename from tests/unit/unittest/mocklistmodeleditorview.h rename to tests/unit/tests/mocks/mocklistmodeleditorview.h index 0f6ff38742e..ebf63987759 100644 --- a/tests/unit/unittest/mocklistmodeleditorview.h +++ b/tests/unit/tests/mocks/mocklistmodeleditorview.h @@ -3,7 +3,7 @@ #pragma once -#include +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/mockmutex.h b/tests/unit/tests/mocks/mockmutex.h similarity index 94% rename from tests/unit/unittest/mockmutex.h rename to tests/unit/tests/mocks/mockmutex.h index a26acb7a35a..2422ca96106 100644 --- a/tests/unit/unittest/mockmutex.h +++ b/tests/unit/tests/mocks/mockmutex.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" class MockMutex { diff --git a/tests/unit/unittest/mockqfilesystemwatcher.h b/tests/unit/tests/mocks/mockqfilesystemwatcher.h similarity index 66% rename from tests/unit/unittest/mockqfilesystemwatcher.h rename to tests/unit/tests/mocks/mockqfilesystemwatcher.h index 8a334c9afe0..be0dc9cfb29 100644 --- a/tests/unit/unittest/mockqfilesystemwatcher.h +++ b/tests/unit/tests/mocks/mockqfilesystemwatcher.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include @@ -12,10 +12,8 @@ class MockQFileSytemWatcher : public QObject Q_OBJECT public: - MOCK_METHOD1(addPaths, - void (const QStringList&)); - MOCK_METHOD1(removePaths, - void (const QStringList&)); + MOCK_METHOD1(addPaths, void(const QStringList &)); + MOCK_METHOD1(removePaths, void(const QStringList &)); signals: void fileChanged(const QString &); diff --git a/tests/unit/unittest/mocksqlitestatement.h b/tests/unit/tests/mocks/mocksqlitestatement.h similarity index 98% rename from tests/unit/unittest/mocksqlitestatement.h rename to tests/unit/tests/mocks/mocksqlitestatement.h index 20eed627bf4..f34b13f6d0f 100644 --- a/tests/unit/unittest/mocksqlitestatement.h +++ b/tests/unit/tests/mocks/mocksqlitestatement.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include "sqlitedatabasemock.h" #include diff --git a/tests/unit/unittest/mocksqlitetransactionbackend.h b/tests/unit/tests/mocks/mocksqlitetransactionbackend.h similarity index 95% rename from tests/unit/unittest/mocksqlitetransactionbackend.h rename to tests/unit/tests/mocks/mocksqlitetransactionbackend.h index e4114b537d4..478579d2395 100644 --- a/tests/unit/unittest/mocksqlitetransactionbackend.h +++ b/tests/unit/tests/mocks/mocksqlitetransactionbackend.h @@ -4,7 +4,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/mocksyntaxhighligher.h b/tests/unit/tests/mocks/mocksyntaxhighligher.h similarity index 91% rename from tests/unit/unittest/mocksyntaxhighligher.h rename to tests/unit/tests/mocks/mocksyntaxhighligher.h index 1b5f773835f..4ba7b773142 100644 --- a/tests/unit/unittest/mocksyntaxhighligher.h +++ b/tests/unit/tests/mocks/mocksyntaxhighligher.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/mocktimer.cpp b/tests/unit/tests/mocks/mocktimer.cpp similarity index 91% rename from tests/unit/unittest/mocktimer.cpp rename to tests/unit/tests/mocks/mocktimer.cpp index 9bd979ccc53..4dfac31ec86 100644 --- a/tests/unit/unittest/mocktimer.cpp +++ b/tests/unit/tests/mocks/mocktimer.cpp @@ -13,9 +13,7 @@ MockTimer::~MockTimer() emitTimoutIfStarted(); } -void MockTimer::setSingleShot(bool) -{ -} +void MockTimer::setSingleShot(bool) {} void MockTimer::emitTimoutIfStarted() { diff --git a/tests/unit/unittest/mocktimer.h b/tests/unit/tests/mocks/mocktimer.h similarity index 83% rename from tests/unit/unittest/mocktimer.h rename to tests/unit/tests/mocks/mocktimer.h index 478b0939a92..ea0adf8c6b3 100644 --- a/tests/unit/unittest/mocktimer.h +++ b/tests/unit/tests/mocks/mocktimer.h @@ -2,7 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include @@ -14,8 +14,7 @@ public: MockTimer(); ~MockTimer(); - MOCK_METHOD1(start, - void (int)); + MOCK_METHOD1(start, void(int)); void setSingleShot(bool); diff --git a/tests/unit/unittest/mocktimestampprovider.h b/tests/unit/tests/mocks/mocktimestampprovider.h similarity index 93% rename from tests/unit/unittest/mocktimestampprovider.h rename to tests/unit/tests/mocks/mocktimestampprovider.h index d954838819f..1b447a2b4ce 100644 --- a/tests/unit/unittest/mocktimestampprovider.h +++ b/tests/unit/tests/mocks/mocktimestampprovider.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/modelresourcemanagementmock.h b/tests/unit/tests/mocks/modelresourcemanagementmock.h similarity index 97% rename from tests/unit/unittest/modelresourcemanagementmock.h rename to tests/unit/tests/mocks/modelresourcemanagementmock.h index c15e04dbf98..87454b2d201 100644 --- a/tests/unit/unittest/modelresourcemanagementmock.h +++ b/tests/unit/tests/mocks/modelresourcemanagementmock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/projectstoragemock.cpp b/tests/unit/tests/mocks/projectstoragemock.cpp similarity index 100% rename from tests/unit/unittest/projectstoragemock.cpp rename to tests/unit/tests/mocks/projectstoragemock.cpp diff --git a/tests/unit/unittest/projectstoragemock.h b/tests/unit/tests/mocks/projectstoragemock.h similarity index 99% rename from tests/unit/unittest/projectstoragemock.h rename to tests/unit/tests/mocks/projectstoragemock.h index 67debddbd81..383e56e4ec1 100644 --- a/tests/unit/unittest/projectstoragemock.h +++ b/tests/unit/tests/mocks/projectstoragemock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include "sqlitedatabasemock.h" diff --git a/tests/unit/unittest/projectstoragepathwatchermock.h b/tests/unit/tests/mocks/projectstoragepathwatchermock.h similarity index 96% rename from tests/unit/unittest/projectstoragepathwatchermock.h rename to tests/unit/tests/mocks/projectstoragepathwatchermock.h index 97ebb65e45e..dd4e015d0b0 100644 --- a/tests/unit/unittest/projectstoragepathwatchermock.h +++ b/tests/unit/tests/mocks/projectstoragepathwatchermock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include "projectstorage/projectstoragepathwatcherinterface.h" diff --git a/tests/unit/unittest/projectstoragepathwatchernotifiermock.h b/tests/unit/tests/mocks/projectstoragepathwatchernotifiermock.h similarity index 94% rename from tests/unit/unittest/projectstoragepathwatchernotifiermock.h rename to tests/unit/tests/mocks/projectstoragepathwatchernotifiermock.h index 2a5f7fa9423..1131c5f2ac3 100644 --- a/tests/unit/unittest/projectstoragepathwatchernotifiermock.h +++ b/tests/unit/tests/mocks/projectstoragepathwatchernotifiermock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/qmldocumentparsermock.h b/tests/unit/tests/mocks/qmldocumentparsermock.h similarity index 95% rename from tests/unit/unittest/qmldocumentparsermock.h rename to tests/unit/tests/mocks/qmldocumentparsermock.h index 1bb41f57737..11b6cd7a1dc 100644 --- a/tests/unit/unittest/qmldocumentparsermock.h +++ b/tests/unit/tests/mocks/qmldocumentparsermock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/qmltypesparsermock.h b/tests/unit/tests/mocks/qmltypesparsermock.h similarity index 95% rename from tests/unit/unittest/qmltypesparsermock.h rename to tests/unit/tests/mocks/qmltypesparsermock.h index 4368f6e821c..b4590a405f4 100644 --- a/tests/unit/unittest/qmltypesparsermock.h +++ b/tests/unit/tests/mocks/qmltypesparsermock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/sourcepathcachemock.h b/tests/unit/tests/mocks/sourcepathcachemock.h similarity index 96% rename from tests/unit/unittest/sourcepathcachemock.h rename to tests/unit/tests/mocks/sourcepathcachemock.h index dd2f9e27d38..6a2cf2ec97d 100644 --- a/tests/unit/unittest/sourcepathcachemock.h +++ b/tests/unit/tests/mocks/sourcepathcachemock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/sqlitedatabasemock.h b/tests/unit/tests/mocks/sqlitedatabasemock.h similarity index 98% rename from tests/unit/unittest/sqlitedatabasemock.h rename to tests/unit/tests/mocks/sqlitedatabasemock.h index 658a0ec88b4..5d6ab107e0a 100644 --- a/tests/unit/unittest/sqlitedatabasemock.h +++ b/tests/unit/tests/mocks/sqlitedatabasemock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include "sqlitereadstatementmock.h" #include "sqlitereadwritestatementmock.h" diff --git a/tests/unit/unittest/sqlitereadstatementmock.cpp b/tests/unit/tests/mocks/sqlitereadstatementmock.cpp similarity index 100% rename from tests/unit/unittest/sqlitereadstatementmock.cpp rename to tests/unit/tests/mocks/sqlitereadstatementmock.cpp diff --git a/tests/unit/unittest/sqlitereadstatementmock.h b/tests/unit/tests/mocks/sqlitereadstatementmock.h similarity index 99% rename from tests/unit/unittest/sqlitereadstatementmock.h rename to tests/unit/tests/mocks/sqlitereadstatementmock.h index 38d7e41ecfb..615e3d23b14 100644 --- a/tests/unit/unittest/sqlitereadstatementmock.h +++ b/tests/unit/tests/mocks/sqlitereadstatementmock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/sqlitereadwritestatementmock.cpp b/tests/unit/tests/mocks/sqlitereadwritestatementmock.cpp similarity index 100% rename from tests/unit/unittest/sqlitereadwritestatementmock.cpp rename to tests/unit/tests/mocks/sqlitereadwritestatementmock.cpp diff --git a/tests/unit/unittest/sqlitereadwritestatementmock.h b/tests/unit/tests/mocks/sqlitereadwritestatementmock.h similarity index 92% rename from tests/unit/unittest/sqlitereadwritestatementmock.h rename to tests/unit/tests/mocks/sqlitereadwritestatementmock.h index aaf59530741..8a787cfb69e 100644 --- a/tests/unit/unittest/sqlitereadwritestatementmock.h +++ b/tests/unit/tests/mocks/sqlitereadwritestatementmock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include @@ -45,8 +45,8 @@ public: template auto optionalValue([[maybe_unused]] const QueryTypes &...queryValues) { - static_assert(!std::is_same_v, - "SqliteReadStatementMock::value does not handle result type!"); + static_assert(!std::is_same_v, + "SqliteReadStatementMock::value does not handle result type!"); } template diff --git a/tests/unit/unittest/sqlitestatementmock.h b/tests/unit/tests/mocks/sqlitestatementmock.h similarity index 98% rename from tests/unit/unittest/sqlitestatementmock.h rename to tests/unit/tests/mocks/sqlitestatementmock.h index bda9f537990..b641803da0a 100644 --- a/tests/unit/unittest/sqlitestatementmock.h +++ b/tests/unit/tests/mocks/sqlitestatementmock.h @@ -3,7 +3,7 @@ #pragma once -#include +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/sqlitetransactionbackendmock.h b/tests/unit/tests/mocks/sqlitetransactionbackendmock.h similarity index 96% rename from tests/unit/unittest/sqlitetransactionbackendmock.h rename to tests/unit/tests/mocks/sqlitetransactionbackendmock.h index a633662c00b..22cf4fa44d1 100644 --- a/tests/unit/unittest/sqlitetransactionbackendmock.h +++ b/tests/unit/tests/mocks/sqlitetransactionbackendmock.h @@ -4,7 +4,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/sqlitewritestatementmock.cpp b/tests/unit/tests/mocks/sqlitewritestatementmock.cpp similarity index 100% rename from tests/unit/unittest/sqlitewritestatementmock.cpp rename to tests/unit/tests/mocks/sqlitewritestatementmock.cpp diff --git a/tests/unit/unittest/sqlitewritestatementmock.h b/tests/unit/tests/mocks/sqlitewritestatementmock.h similarity index 99% rename from tests/unit/unittest/sqlitewritestatementmock.h rename to tests/unit/tests/mocks/sqlitewritestatementmock.h index 2fa3146601b..458beacc5c9 100644 --- a/tests/unit/unittest/sqlitewritestatementmock.h +++ b/tests/unit/tests/mocks/sqlitewritestatementmock.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/tests/printers/CMakeLists.txt b/tests/unit/tests/printers/CMakeLists.txt new file mode 100644 index 00000000000..4aa66cbaa8c --- /dev/null +++ b/tests/unit/tests/printers/CMakeLists.txt @@ -0,0 +1,7 @@ +extend_qtc_test(unittest + SOURCES + gtest-creator-printing.cpp gtest-creator-printing.h + gtest-qt-printing.cpp gtest-qt-printing.h + gtest-llvm-printing.h + gtest-std-printing.h +) diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/tests/printers/gtest-creator-printing.cpp similarity index 100% rename from tests/unit/unittest/gtest-creator-printing.cpp rename to tests/unit/tests/printers/gtest-creator-printing.cpp diff --git a/tests/unit/unittest/gtest-creator-printing.h b/tests/unit/tests/printers/gtest-creator-printing.h similarity index 100% rename from tests/unit/unittest/gtest-creator-printing.h rename to tests/unit/tests/printers/gtest-creator-printing.h diff --git a/tests/unit/unittest/gtest-llvm-printing.cpp b/tests/unit/tests/printers/gtest-llvm-printing.cpp similarity index 100% rename from tests/unit/unittest/gtest-llvm-printing.cpp rename to tests/unit/tests/printers/gtest-llvm-printing.cpp diff --git a/tests/unit/unittest/gtest-llvm-printing.h b/tests/unit/tests/printers/gtest-llvm-printing.h similarity index 100% rename from tests/unit/unittest/gtest-llvm-printing.h rename to tests/unit/tests/printers/gtest-llvm-printing.h diff --git a/tests/unit/unittest/gtest-qt-printing.cpp b/tests/unit/tests/printers/gtest-qt-printing.cpp similarity index 100% rename from tests/unit/unittest/gtest-qt-printing.cpp rename to tests/unit/tests/printers/gtest-qt-printing.cpp diff --git a/tests/unit/unittest/gtest-qt-printing.h b/tests/unit/tests/printers/gtest-qt-printing.h similarity index 100% rename from tests/unit/unittest/gtest-qt-printing.h rename to tests/unit/tests/printers/gtest-qt-printing.h diff --git a/tests/unit/unittest/gtest-std-printing.h b/tests/unit/tests/printers/gtest-std-printing.h similarity index 100% rename from tests/unit/unittest/gtest-std-printing.h rename to tests/unit/tests/printers/gtest-std-printing.h diff --git a/tests/unit/tests/stubs/CMakeLists.txt b/tests/unit/tests/stubs/CMakeLists.txt new file mode 100644 index 00000000000..8209784f252 --- /dev/null +++ b/tests/unit/tests/stubs/CMakeLists.txt @@ -0,0 +1,139 @@ +extend_qtc_test(unittest + SOURCES_PREFIX "${QmlDesignerDir}/designercore" + SOURCES + exceptions/exception.cpp + exceptions/invalidargumentexception.cpp + exceptions/invalididexception.cpp + exceptions/invalidmetainfoexception.cpp + exceptions/invalidmodelnodeexception.cpp + exceptions/invalidmodelstateexception.cpp + exceptions/invalidpropertyexception.cpp + exceptions/invalidqmlsourceexception.cpp + exceptions/invalidreparentingexception.cpp + exceptions/invalidslideindexexception.cpp + exceptions/notimplementedexception.cpp + exceptions/removebasestateexception.cpp + exceptions/rewritingexception.cpp + imagecache/asynchronousexplicitimagecache.cpp + imagecache/asynchronousimagecache.cpp + imagecache/asynchronousimagefactory.cpp + imagecache/asynchronousimagefactory.h + imagecache/imagecachecollectorinterface.h + imagecache/imagecachegenerator.cpp + imagecache/imagecachegenerator.h + imagecache/imagecachegeneratorinterface.h + imagecache/imagecachestorage.h + imagecache/imagecachedispatchcollector.h + imagecache/imagecachestorageinterface.h + imagecache/synchronousimagecache.cpp + imagecache/timestampproviderinterface.h + include/abstractproperty.h + include/abstractview.h + include/asynchronousexplicitimagecache.h + include/asynchronousimagecache.h + include/asynchronousimagecacheinterface.h + include/bindingproperty.h + include/imagecacheauxiliarydata.h + include/import.h + include/itemlibraryinfo.h + include/metainfo.h + include/metainforeader.h + include/model.h + include/modelnode.h + include/nodeabstractproperty.h + include/nodelistproperty.h + include/nodemetainfo.h + include/nodeproperty.h + include/projectstorageids.h + include/propertymetainfo.h + include/propertycontainer.h + include/propertyparser.h + include/qmldesignercorelib_global.h + include/signalhandlerproperty.h + include/synchronousimagecache.h + include/variantproperty.h + metainfo/itemlibraryinfo.cpp + metainfo/metainfo.cpp + metainfo/metainforeader.cpp + metainfo/nodemetainfo.cpp + model/abstractproperty.cpp + model/abstractview.cpp + model/annotation.cpp + model/bindingproperty.cpp + model/import.cpp + model/internalbindingproperty.cpp + model/internalbindingproperty.h + model/internalnode.cpp + model/internalnode_p.h + model/internalnodeabstractproperty.cpp + model/internalnodeabstractproperty.h + model/internalnodelistproperty.cpp + model/internalnodelistproperty.h + model/internalnodeproperty.cpp + model/internalnodeproperty.h + model/internalproperty.cpp + model/internalproperty.h + model/internalsignalhandlerproperty.cpp + model/internalsignalhandlerproperty.h + model/internalvariantproperty.cpp + model/internalvariantproperty.h + model/model.cpp + model/model_p.h + model/modelnode.cpp + model/modelresourcemanagementinterface.h + model/modelresourcemanagement.cpp model/modelresourcemanagement.h + model/propertycontainer.cpp + model/propertyparser.cpp + model/nodeabstractproperty.cpp + model/nodelistproperty.cpp + model/nodeproperty.cpp + model/signalhandlerproperty.cpp + model/variantproperty.cpp + pluginmanager/widgetpluginmanager.h pluginmanager/widgetpluginmanager.cpp + pluginmanager/widgetpluginpath.h pluginmanager/widgetpluginpath.cpp + projectstorage/directorypathcompressor.h + projectstorage/filesysteminterface.h + projectstorage/filesystem.cpp projectstorage/filesystem.h + projectstorage/filestatus.h + projectstorage/filestatuscache.cpp projectstorage/filestatuscache.h + projectstorage/modulescanner.cpp projectstorage/modulescanner.h + projectstorage/nonlockingmutex.h + projectstorage/projectstorageexceptions.cpp projectstorage/projectstorageexceptions.h + projectstorage/projectstorageinterface.h + projectstorage/projectstorage.cpp projectstorage/projectstorage.h + projectstorage/projectstoragepathwatcher.h + projectstorage/projectstoragepathwatcherinterface.h + projectstorage/projectstoragepathwatchernotifierinterface.h + projectstorage/projectstoragesqlitefunctionregistry.cpp + projectstorage/projectstoragesqlitefunctionregistry.h + projectstorage/projectstoragepathwatcher.h + projectstorage/projectstoragepathwatchertypes.h + projectstorage/projectstoragetypes.h + projectstorage/projectstorageupdater.cpp projectstorage/projectstorageupdater.h + projectstorage/sourcepath.h + projectstorage/sourcepathcache.h + projectstorage/sourcepathcache.h + projectstorage/sourcepathcachetypes.h + projectstorage/sourcepathview.h + projectstorage/storagecache.h + projectstorage/storagecacheentry.h + projectstorage/storagecachefwd.h + projectstorage/qmldocumentparserinterface.h + projectstorage/qmltypesparserinterface.h + rewritertransaction.cpp + rewritertransaction.h +) + +extend_qtc_test(unittest + SOURCES_PREFIX "${QmlDesignerDir}/designercore" + SOURCES_PROPERTIES AUTOMOC ON + SOURCES + include/model.h +) + +extend_qtc_test(unittest + SOURCES_PROPERTIES AUTOMOC ON + SOURCES + qmldesigner/designercore/include/nodeinstanceview.h + qmldesigner/designercore/include/rewriterview.h +) diff --git a/tests/unit/mockup/clangcodemodel/clangcompletionassistinterface.h b/tests/unit/tests/stubs/clangcodemodel/clangcompletionassistinterface.h similarity index 100% rename from tests/unit/mockup/clangcodemodel/clangcompletionassistinterface.h rename to tests/unit/tests/stubs/clangcodemodel/clangcompletionassistinterface.h diff --git a/tests/unit/mockup/coreplugin/helpitem.h b/tests/unit/tests/stubs/coreplugin/helpitem.h similarity index 100% rename from tests/unit/mockup/coreplugin/helpitem.h rename to tests/unit/tests/stubs/coreplugin/helpitem.h diff --git a/tests/unit/mockup/coreplugin/icontext.h b/tests/unit/tests/stubs/coreplugin/icontext.h similarity index 100% rename from tests/unit/mockup/coreplugin/icontext.h rename to tests/unit/tests/stubs/coreplugin/icontext.h diff --git a/tests/unit/mockup/coreplugin/icore.h b/tests/unit/tests/stubs/coreplugin/icore.h similarity index 93% rename from tests/unit/mockup/coreplugin/icore.h rename to tests/unit/tests/stubs/coreplugin/icore.h index 239085d56d6..6ede100bef9 100644 --- a/tests/unit/mockup/coreplugin/icore.h +++ b/tests/unit/tests/stubs/coreplugin/icore.h @@ -1,4 +1,4 @@ -#include "utils/fileutils.h" +#include "../utils/fileutils.h" #include diff --git a/tests/unit/mockup/coreplugin/vcsmanager.h b/tests/unit/tests/stubs/coreplugin/vcsmanager.h similarity index 100% rename from tests/unit/mockup/coreplugin/vcsmanager.h rename to tests/unit/tests/stubs/coreplugin/vcsmanager.h diff --git a/tests/unit/mockup/qmldesigner/designercore/include/documentmessage.h b/tests/unit/tests/stubs/qmldesigner/designercore/include/documentmessage.h similarity index 100% rename from tests/unit/mockup/qmldesigner/designercore/include/documentmessage.h rename to tests/unit/tests/stubs/qmldesigner/designercore/include/documentmessage.h diff --git a/tests/unit/mockup/qmldesigner/designercore/include/itemlibraryitem.h b/tests/unit/tests/stubs/qmldesigner/designercore/include/itemlibraryitem.h similarity index 100% rename from tests/unit/mockup/qmldesigner/designercore/include/itemlibraryitem.h rename to tests/unit/tests/stubs/qmldesigner/designercore/include/itemlibraryitem.h diff --git a/tests/unit/mockup/qmldesigner/designercore/include/nodeinstanceview.h b/tests/unit/tests/stubs/qmldesigner/designercore/include/nodeinstanceview.h similarity index 100% rename from tests/unit/mockup/qmldesigner/designercore/include/nodeinstanceview.h rename to tests/unit/tests/stubs/qmldesigner/designercore/include/nodeinstanceview.h diff --git a/tests/unit/mockup/qmldesigner/designercore/include/qmlmodelnodefacade.h b/tests/unit/tests/stubs/qmldesigner/designercore/include/qmlmodelnodefacade.h similarity index 100% rename from tests/unit/mockup/qmldesigner/designercore/include/qmlmodelnodefacade.h rename to tests/unit/tests/stubs/qmldesigner/designercore/include/qmlmodelnodefacade.h diff --git a/tests/unit/mockup/qmldesigner/designercore/include/qmlobjectnode.h b/tests/unit/tests/stubs/qmldesigner/designercore/include/qmlobjectnode.h similarity index 100% rename from tests/unit/mockup/qmldesigner/designercore/include/qmlobjectnode.h rename to tests/unit/tests/stubs/qmldesigner/designercore/include/qmlobjectnode.h diff --git a/tests/unit/mockup/qmldesigner/designercore/include/qmlstate.h b/tests/unit/tests/stubs/qmldesigner/designercore/include/qmlstate.h similarity index 100% rename from tests/unit/mockup/qmldesigner/designercore/include/qmlstate.h rename to tests/unit/tests/stubs/qmldesigner/designercore/include/qmlstate.h diff --git a/tests/unit/mockup/qmldesigner/designercore/include/qmltimeline.h b/tests/unit/tests/stubs/qmldesigner/designercore/include/qmltimeline.h similarity index 100% rename from tests/unit/mockup/qmldesigner/designercore/include/qmltimeline.h rename to tests/unit/tests/stubs/qmldesigner/designercore/include/qmltimeline.h diff --git a/tests/unit/mockup/qmldesigner/designercore/include/rewriterview.h b/tests/unit/tests/stubs/qmldesigner/designercore/include/rewriterview.h similarity index 100% rename from tests/unit/mockup/qmldesigner/designercore/include/rewriterview.h rename to tests/unit/tests/stubs/qmldesigner/designercore/include/rewriterview.h diff --git a/tests/unit/mockup/texteditor/assistenums.h b/tests/unit/tests/stubs/texteditor/assistenums.h similarity index 100% rename from tests/unit/mockup/texteditor/assistenums.h rename to tests/unit/tests/stubs/texteditor/assistenums.h diff --git a/tests/unit/mockup/texteditor/codeassist/assistinterface.h b/tests/unit/tests/stubs/texteditor/codeassist/assistinterface.h similarity index 100% rename from tests/unit/mockup/texteditor/codeassist/assistinterface.h rename to tests/unit/tests/stubs/texteditor/codeassist/assistinterface.h diff --git a/tests/unit/mockup/texteditor/quickfix.h b/tests/unit/tests/stubs/texteditor/quickfix.h similarity index 100% rename from tests/unit/mockup/texteditor/quickfix.h rename to tests/unit/tests/stubs/texteditor/quickfix.h diff --git a/tests/unit/mockup/texteditor/refactoringchanges.h b/tests/unit/tests/stubs/texteditor/refactoringchanges.h similarity index 89% rename from tests/unit/mockup/texteditor/refactoringchanges.h rename to tests/unit/tests/stubs/texteditor/refactoringchanges.h index 05bb9c96404..96121b59ff3 100644 --- a/tests/unit/mockup/texteditor/refactoringchanges.h +++ b/tests/unit/tests/stubs/texteditor/refactoringchanges.h @@ -3,7 +3,7 @@ #pragma once -#include "googletest.h" +// #include "../utils/googletest.h" #include #include @@ -36,18 +36,11 @@ class RefactoringFile public: RefactoringFile(std::unique_ptr &&textDocument) : textDocument(std::move(textDocument)) - { - } + {} - const QTextDocument *document() const - { - return textDocument.get(); - } + const QTextDocument *document() const { return textDocument.get(); } - void setChangeSet(const Utils::ChangeSet &changes) - { - this->changes = changes; - } + void setChangeSet(const Utils::ChangeSet &changes) { this->changes = changes; } void apply() { @@ -85,6 +78,7 @@ class RefactoringChanges { public: RefactoringChanges() {} + virtual ~RefactoringChanges() {} RefactoringFilePtr file(const Utils::FilePath &filePath) const diff --git a/tests/unit/mockup/texteditor/semantichighlighter.h b/tests/unit/tests/stubs/texteditor/semantichighlighter.h similarity index 100% rename from tests/unit/mockup/texteditor/semantichighlighter.h rename to tests/unit/tests/stubs/texteditor/semantichighlighter.h diff --git a/tests/unit/mockup/texteditor/syntaxhighlighter.h b/tests/unit/tests/stubs/texteditor/syntaxhighlighter.h similarity index 100% rename from tests/unit/mockup/texteditor/syntaxhighlighter.h rename to tests/unit/tests/stubs/texteditor/syntaxhighlighter.h diff --git a/tests/unit/tests/unittests/CMakeLists.txt b/tests/unit/tests/unittests/CMakeLists.txt new file mode 100644 index 00000000000..76473e96529 --- /dev/null +++ b/tests/unit/tests/unittests/CMakeLists.txt @@ -0,0 +1,92 @@ +file(RELATIVE_PATH RELATIVE_TEST_PATH "${PROJECT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}") +file(RELATIVE_PATH TEST_RELATIVE_LIBEXEC_PATH "/${RELATIVE_TEST_PATH}" "/${IDE_LIBEXEC_PATH}") + +add_qtc_test(unittest GTEST + PROPERTIES COMPILE_WARNING_AS_ERROR OFF + INCLUDES + BEFORE ${UnittestStubsDir} + BEFORE ${UnittestStubsDir}/qmldesigner/designercore/include + DEPENDS + Qt::Core Qt::Network Qt::Widgets + Qt::Xml Qt::Concurrent Qt::QmlPrivate Qt::Gui + Qt::Core5Compat QmlJS Sqlite SqliteC + Googletest + DEFINES + GTEST_INTERNAL_HAS_STRING_VIEW + QT_NO_CAST_TO_ASCII + QT_RESTRICTED_CAST_FROM_ASCII + UNIT_TESTS + DONT_CHECK_MESSAGE_COUNTER + QTC_RESOURCE_DIR="${QtCreatorResourcesDir}" + UNITTEST_DIR="${CMAKE_CURRENT_SOURCE_DIR}" + TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}" + QT6_INSTALL_PREFIX="${QT6_INSTALL_PREFIX}" + QDS_MODEL_USE_PROJECTSTORAGEINTERFACE + QDS_USE_PROJECTSTORAGE + SOURCES + unittests-main.cpp +) + +function(extend_qtc_test_with_target_sources target) + cmake_parse_arguments(_arg "" "" "DEFINES;INCLUDES" ${ARGN}) + + get_target_property(${target}Sources ${target} SOURCES) + # work around issue with CMake < 3.14 where target sources can contain + # $ + list(FILTER ${target}Sources EXCLUDE REGEX "^\\$ + ${_arg_DEFINES} + INCLUDES + $ + ${_arg_INCLUDES} + ) +endfunction() + +finalize_qtc_gtest(unittest + EXCLUDE_SOURCES_REGEX ".c$" + EXCLUDE_ALL_FROM_PRECHECK +) + +# Path needs to be before CppEditor +target_include_directories(unittest + PRIVATE + BEFORE ${QtCreatorPluginsDir} +) + +if (NOT TARGET Utils) + add_subdirectory(${QtCreatorLibsDir}/utils ${CMAKE_CURRENT_BINARY_DIR}/utils) +endif() +if (NOT TARGET CPlusPlus) + add_subdirectory(${QtCreatorLibsDir}/3rdparty/cplusplus ${CMAKE_CURRENT_BINARY_DIR}/3rd_cplusplus) + add_subdirectory(${QtCreatorLibsDir}/cplusplus ${CMAKE_CURRENT_BINARY_DIR}/cplusplus) +endif() + +extend_qtc_test(unittest DEPENDS Utils CPlusPlus) + +file(GLOB PROJECTSTORAGE_EXCLUDED_SOURCES ${QmlDesignerDir}/designercore/projectstorage/*.cpp) +set_property(SOURCE ${PROJECTSTORAGE_EXCLUDED_SOURCES} PROPERTY SKIP_AUTOMOC ON) + +file(GLOB UNITTEST_EXCLUDED_SOURCES *.cpp) +set_property(SOURCE ${UNITTEST_EXCLUDED_SOURCES} PROPERTY SKIP_AUTOMOC ON) + +function(unittest_copy_data_folder) + execute_process( + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_CURRENT_SOURCE_DIR}/data" + "${CMAKE_CURRENT_BINARY_DIR}/data" + ) +endfunction(unittest_copy_data_folder) + +add_subdirectory(listmodeleditor) +add_subdirectory(imagecache) +add_subdirectory(model) +add_subdirectory(sqlite) +add_subdirectory(projectstorage) +add_subdirectory(qmlprojectmanager) +add_subdirectory(utils) diff --git a/tests/unit/tests/unittests/imagecache/CMakeLists.txt b/tests/unit/tests/unittests/imagecache/CMakeLists.txt new file mode 100644 index 00000000000..7f004221d3a --- /dev/null +++ b/tests/unit/tests/unittests/imagecache/CMakeLists.txt @@ -0,0 +1,11 @@ +# qmldesigner/designercore/imagecache +extend_qtc_test(unittest + SOURCES + asynchronousexplicitimagecache-test.cpp + asynchronousimagecache-test.cpp + asynchronousimagefactory-test.cpp + imagecachedispatchcollector-test.cpp + imagecachegenerator-test.cpp + imagecachestorage-test.cpp + synchronousimagecache-test.cpp +) diff --git a/tests/unit/unittest/asynchronousexplicitimagecache-test.cpp b/tests/unit/tests/unittests/imagecache/asynchronousexplicitimagecache-test.cpp similarity index 99% rename from tests/unit/unittest/asynchronousexplicitimagecache-test.cpp rename to tests/unit/tests/unittests/imagecache/asynchronousexplicitimagecache-test.cpp index 3bad57fc832..f054e8f6246 100644 --- a/tests/unit/unittest/asynchronousexplicitimagecache-test.cpp +++ b/tests/unit/tests/unittests/imagecache/asynchronousexplicitimagecache-test.cpp @@ -1,10 +1,10 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "mockimagecachestorage.h" -#include "notification.h" +#include "../mocks/mockimagecachestorage.h" +#include "../utils/notification.h" #include diff --git a/tests/unit/unittest/asynchronousimagecache-test.cpp b/tests/unit/tests/unittests/imagecache/asynchronousimagecache-test.cpp similarity index 99% rename from tests/unit/unittest/asynchronousimagecache-test.cpp rename to tests/unit/tests/unittests/imagecache/asynchronousimagecache-test.cpp index 16e1a59d194..1d14271f5ed 100644 --- a/tests/unit/unittest/asynchronousimagecache-test.cpp +++ b/tests/unit/tests/unittests/imagecache/asynchronousimagecache-test.cpp @@ -1,12 +1,12 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" +#include "../utils/notification.h" -#include "mockimagecachegenerator.h" -#include "mockimagecachestorage.h" -#include "mocktimestampprovider.h" -#include "notification.h" +#include "../mocks/mockimagecachegenerator.h" +#include "../mocks/mockimagecachestorage.h" +#include "../mocks/mocktimestampprovider.h" #include diff --git a/tests/unit/unittest/asynchronousimagefactory-test.cpp b/tests/unit/tests/unittests/imagecache/asynchronousimagefactory-test.cpp similarity index 96% rename from tests/unit/unittest/asynchronousimagefactory-test.cpp rename to tests/unit/tests/unittests/imagecache/asynchronousimagefactory-test.cpp index 49a44c9afed..c8eaf5c6447 100644 --- a/tests/unit/unittest/asynchronousimagefactory-test.cpp +++ b/tests/unit/tests/unittests/imagecache/asynchronousimagefactory-test.cpp @@ -1,13 +1,13 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" +#include "../utils/notification.h" -#include "imagecachecollectormock.h" -#include "mockimagecachegenerator.h" -#include "mockimagecachestorage.h" -#include "mocktimestampprovider.h" -#include "notification.h" +#include "../mocks/imagecachecollectormock.h" +#include "../mocks/mockimagecachegenerator.h" +#include "../mocks/mockimagecachestorage.h" +#include "../mocks/mocktimestampprovider.h" #include diff --git a/tests/unit/unittest/imagecachedispatchcollector-test.cpp b/tests/unit/tests/unittests/imagecache/imagecachedispatchcollector-test.cpp similarity index 99% rename from tests/unit/unittest/imagecachedispatchcollector-test.cpp rename to tests/unit/tests/unittests/imagecache/imagecachedispatchcollector-test.cpp index 756304e7d1e..db0dad3052d 100644 --- a/tests/unit/unittest/imagecachedispatchcollector-test.cpp +++ b/tests/unit/tests/unittests/imagecache/imagecachedispatchcollector-test.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "imagecachecollectormock.h" +#include "../mocks/imagecachecollectormock.h" #include #include diff --git a/tests/unit/unittest/imagecachegenerator-test.cpp b/tests/unit/tests/unittests/imagecache/imagecachegenerator-test.cpp similarity index 99% rename from tests/unit/unittest/imagecachegenerator-test.cpp rename to tests/unit/tests/unittests/imagecache/imagecachegenerator-test.cpp index 871a3768bb6..2594e4b1ef6 100644 --- a/tests/unit/unittest/imagecachegenerator-test.cpp +++ b/tests/unit/tests/unittests/imagecache/imagecachegenerator-test.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "imagecachecollectormock.h" -#include "mockimagecachestorage.h" -#include "notification.h" +#include "../mocks/imagecachecollectormock.h" +#include "../mocks/mockimagecachestorage.h" +#include "../utils/notification.h" #include diff --git a/tests/unit/unittest/imagecachestorage-test.cpp b/tests/unit/tests/unittests/imagecache/imagecachestorage-test.cpp similarity index 99% rename from tests/unit/unittest/imagecachestorage-test.cpp rename to tests/unit/tests/unittests/imagecache/imagecachestorage-test.cpp index f596fce9d2d..a29fc341bab 100644 --- a/tests/unit/unittest/imagecachestorage-test.cpp +++ b/tests/unit/tests/unittests/imagecache/imagecachestorage-test.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "sqlitedatabasemock.h" +#include "../mocks/sqlitedatabasemock.h" #include #include diff --git a/tests/unit/unittest/synchronousimagecache-test.cpp b/tests/unit/tests/unittests/imagecache/synchronousimagecache-test.cpp similarity index 98% rename from tests/unit/unittest/synchronousimagecache-test.cpp rename to tests/unit/tests/unittests/imagecache/synchronousimagecache-test.cpp index d239c22b0dc..1b2dac08688 100644 --- a/tests/unit/unittest/synchronousimagecache-test.cpp +++ b/tests/unit/tests/unittests/imagecache/synchronousimagecache-test.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "imagecachecollectormock.h" -#include "mockimagecachestorage.h" -#include "mocktimestampprovider.h" +#include "../mocks/imagecachecollectormock.h" +#include "../mocks/mockimagecachestorage.h" +#include "../mocks/mocktimestampprovider.h" #include diff --git a/tests/unit/tests/unittests/listmodeleditor/CMakeLists.txt b/tests/unit/tests/unittests/listmodeleditor/CMakeLists.txt new file mode 100644 index 00000000000..f2a6c9855f4 --- /dev/null +++ b/tests/unit/tests/unittests/listmodeleditor/CMakeLists.txt @@ -0,0 +1,27 @@ +# qmldesigner/designercore/listmodeleditor +extend_qtc_test(unittest + SOURCES + listmodeleditor-test.cpp +) +extend_qtc_test(unittest + INCLUDES + "${QmlDesignerDir}" + "${QmlDesignerDir}/designercore" + "${QmlDesignerDir}/designercore/include" + "${QmlDesignerDir}/designercore/imagecache" + "${QmlDesignerDir}/../../../src/libs/qmlpuppetcommunication/interfaces" + "${QmlDesignerDir}/../../../src/libs/qmlpuppetcommunication/types" + DEFINES + QMLDESIGNERCORE_STATIC_LIBRARY QMLDESIGNER_STATIC_LIBRARY + SOURCES_PREFIX + "${QmlDesignerDir}" + SOURCES + components/listmodeleditor/listmodeleditormodel.cpp components/listmodeleditor/listmodeleditormodel.h +) + +extend_qtc_test(unittest + SOURCES + ${QtCreatorLibsDir}/qmlpuppetcommunication/interfaces/commondefines.h + ${QmlDesignerDir}/components/listmodeleditor/listmodeleditormodel.cpp + ${QmlDesignerDir}/components/listmodeleditor/listmodeleditormodel.h +) diff --git a/tests/unit/unittest/listmodeleditor-test.cpp b/tests/unit/tests/unittests/listmodeleditor/listmodeleditor-test.cpp similarity index 99% rename from tests/unit/unittest/listmodeleditor-test.cpp rename to tests/unit/tests/unittests/listmodeleditor/listmodeleditor-test.cpp index 146ba65ad5d..53dab2fc1e6 100644 --- a/tests/unit/unittest/listmodeleditor-test.cpp +++ b/tests/unit/tests/unittests/listmodeleditor/listmodeleditor-test.cpp @@ -1,10 +1,10 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "mocklistmodeleditorview.h" -#include "projectstoragemock.h" +#include "../mocks/mocklistmodeleditorview.h" +#include "../mocks/projectstoragemock.h" #include #include @@ -149,8 +149,7 @@ public: for (int columnIndex = 0; columnIndex < model.columnCount(); ++columnIndex) row.push_back( - model.data(model.index(rowIndex, columnIndex), Qt::BackgroundRole) - .value()); + model.data(model.index(rowIndex, columnIndex), Qt::BackgroundRole).value()); rows.push_back(row); } diff --git a/tests/unit/tests/unittests/model/CMakeLists.txt b/tests/unit/tests/unittests/model/CMakeLists.txt new file mode 100644 index 00000000000..8cd6b911ec7 --- /dev/null +++ b/tests/unit/tests/unittests/model/CMakeLists.txt @@ -0,0 +1,8 @@ +# qmldesigner/designercore/model +extend_qtc_test(unittest + SOURCES + import-test.cpp + model-test.cpp + nodelistproperty-test.cpp + modelresourcemanagement-test.cpp +) diff --git a/tests/unit/unittest/import-test.cpp b/tests/unit/tests/unittests/model/import-test.cpp similarity index 99% rename from tests/unit/unittest/import-test.cpp rename to tests/unit/tests/unittests/model/import-test.cpp index e4adfd7e5bb..25382862b2b 100644 --- a/tests/unit/unittest/import-test.cpp +++ b/tests/unit/tests/unittests/model/import-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/model-test.cpp b/tests/unit/tests/unittests/model/model-test.cpp similarity index 99% rename from tests/unit/unittest/model-test.cpp rename to tests/unit/tests/unittests/model/model-test.cpp index 82a2d253b40..9a971381084 100644 --- a/tests/unit/unittest/model-test.cpp +++ b/tests/unit/tests/unittests/model/model-test.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "mocklistmodeleditorview.h" -#include "modelresourcemanagementmock.h" -#include "projectstoragemock.h" +#include "../mocks/mocklistmodeleditorview.h" +#include "../mocks/modelresourcemanagementmock.h" +#include "../mocks/projectstoragemock.h" #include #include diff --git a/tests/unit/unittest/modelresourcemanagement-test.cpp b/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp similarity index 97% rename from tests/unit/unittest/modelresourcemanagement-test.cpp rename to tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp index 45382b9f8ab..4cbebc7b549 100644 --- a/tests/unit/unittest/modelresourcemanagement-test.cpp +++ b/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../../utils/googletest.h" -#include "mocklistmodeleditorview.h" -#include "modelresourcemanagementmock.h" -#include "projectstoragemock.h" +#include "../mocks/mocklistmodeleditorview.h" +#include "../mocks/modelresourcemanagementmock.h" +#include "../mocks/projectstoragemock.h" #include #include @@ -49,6 +49,7 @@ protected: model.attachView(&viewMock); rootNode = model.rootModelNode(); } + auto createNodeWithParent(const QmlDesigner::TypeName &typeName, QmlDesigner::NodeAbstractProperty parentProperty, const QString &id = {}) @@ -243,7 +244,8 @@ struct TargetData } }; -class ForTarget : public ModelResourceManagement, public testing::WithParamInterface +class ForTarget : public ModelResourceManagement, + public testing::WithParamInterface { protected: TargetData parameters = GetParam(); @@ -307,7 +309,8 @@ TEST_P(ForTarget, DontRemoveIfTargetCannotBeResolved) ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } -class ForTargets : public ModelResourceManagement, public testing::WithParamInterface +class ForTargets : public ModelResourceManagement, + public testing::WithParamInterface { protected: TargetData parameters = GetParam(); @@ -422,7 +425,8 @@ struct StateData } }; -class ForState : public ModelResourceManagement, public testing::WithParamInterface +class ForState : public ModelResourceManagement, + public testing::WithParamInterface { protected: ModelNode createStateWithParent(QmlDesigner::NodeAbstractProperty parentProperty, diff --git a/tests/unit/unittest/nodelistproperty-test.cpp b/tests/unit/tests/unittests/model/nodelistproperty-test.cpp similarity index 99% rename from tests/unit/unittest/nodelistproperty-test.cpp rename to tests/unit/tests/unittests/model/nodelistproperty-test.cpp index 36a8dcb6df7..2e5a034164b 100644 --- a/tests/unit/unittest/nodelistproperty-test.cpp +++ b/tests/unit/tests/unittests/model/nodelistproperty-test.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "abstractviewmock.h" -#include "googletest.h" -#include "projectstoragemock.h" +#include "../mocks/abstractviewmock.h" +#include "../mocks/projectstoragemock.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/tests/unittests/projectstorage/CMakeLists.txt b/tests/unit/tests/unittests/projectstorage/CMakeLists.txt new file mode 100644 index 00000000000..706d563c322 --- /dev/null +++ b/tests/unit/tests/unittests/projectstorage/CMakeLists.txt @@ -0,0 +1,34 @@ +# qmldesigner/designercore/projectstorage +extend_qtc_test(unittest + SOURCES + directorypathcompressor-test.cpp + filestatuscache-test.cpp + modulescanner-test.cpp + projectstorage-test.cpp + projectstoragepathwatcher-test.cpp + projectstoragesqlitefunctionregistry-test.cpp + projectstorageupdater-test.cpp + sourcepath-test.cpp + sourcepathcache-test.cpp + sourcepathview-test.cpp + storagecache-test.cpp +) + +extend_qtc_test(unittest + CONDITION TARGET Qt6::QmlDomPrivate AND TARGET Qt6::QmlCompilerPrivate AND Qt6_VERSION VERSION_GREATER_EQUAL 6.5.0 AND Qt6_VERSION VERSION_LESS 6.6.0 + DEPENDS Qt6::QmlDomPrivate Qt6::QmlCompilerPrivate + SOURCES + qmldocumentparser-test.cpp + qmltypesparser-test.cpp +) +extend_qtc_test(unittest + CONDITION TARGET Qt6::QmlDomPrivate AND TARGET Qt6::QmlCompilerPrivate AND Qt6_VERSION VERSION_GREATER_EQUAL 6.5.0 AND Qt6_VERSION VERSION_LESS 6.6.0 + SOURCES_PREFIX "${QmlDesignerDir}/designercore" + DEPENDS Qt6::QmlDomPrivate Qt6::QmlCompilerPrivate + DEFINES QDS_BUILD_QMLPARSER + SOURCES + projectstorage/qmldocumentparser.cpp projectstorage/qmldocumentparser.h + projectstorage/qmltypesparser.cpp projectstorage/qmltypesparser.h +) + +unittest_copy_data_folder() diff --git a/tests/unit/unittest/data/modulescanner/Example/qmldir b/tests/unit/tests/unittests/projectstorage/data/modulescanner/Example/qmldir similarity index 100% rename from tests/unit/unittest/data/modulescanner/Example/qmldir rename to tests/unit/tests/unittests/projectstorage/data/modulescanner/Example/qmldir diff --git a/tests/unit/unittest/data/qml/QmlTime/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QmlTime/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QmlTime/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QmlTime/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/labs/animation/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/animation/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/labs/animation/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/animation/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/labs/folderlistmodel/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/folderlistmodel/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/labs/folderlistmodel/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/folderlistmodel/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/labs/lottieqt/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/lottieqt/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/labs/lottieqt/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/lottieqt/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/labs/platform/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/platform/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/labs/platform/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/platform/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/labs/qmlmodels/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/qmlmodels/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/labs/qmlmodels/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/qmlmodels/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/labs/settings/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/settings/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/labs/settings/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/settings/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/labs/sharedimage/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/sharedimage/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/labs/sharedimage/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/sharedimage/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/labs/wavefrontmesh/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/wavefrontmesh/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/labs/wavefrontmesh/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/labs/wavefrontmesh/qmldir diff --git a/tests/unit/unittest/data/qml/Qt/test/controls/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt/test/controls/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt/test/controls/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt/test/controls/qmldir diff --git a/tests/unit/unittest/data/qml/Qt3D/Animation/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Animation/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt3D/Animation/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Animation/qmldir diff --git a/tests/unit/unittest/data/qml/Qt3D/Extras/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Extras/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt3D/Extras/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Extras/qmldir diff --git a/tests/unit/unittest/data/qml/Qt3D/Input/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Input/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt3D/Input/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Input/qmldir diff --git a/tests/unit/unittest/data/qml/Qt3D/Logic/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Logic/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt3D/Logic/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Logic/qmldir diff --git a/tests/unit/unittest/data/qml/Qt3D/Render/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Render/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt3D/Render/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt3D/Render/qmldir diff --git a/tests/unit/unittest/data/qml/Qt5Compat/GraphicalEffects/private/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt5Compat/GraphicalEffects/private/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt5Compat/GraphicalEffects/private/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt5Compat/GraphicalEffects/private/qmldir diff --git a/tests/unit/unittest/data/qml/Qt5Compat/GraphicalEffects/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/Qt5Compat/GraphicalEffects/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/Qt5Compat/GraphicalEffects/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/Qt5Compat/GraphicalEffects/qmldir diff --git a/tests/unit/unittest/data/qml/QtApplicationManager/Application/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtApplicationManager/Application/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtApplicationManager/Application/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtApplicationManager/Application/qmldir diff --git a/tests/unit/unittest/data/qml/QtApplicationManager/SystemUI/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtApplicationManager/SystemUI/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtApplicationManager/SystemUI/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtApplicationManager/SystemUI/qmldir diff --git a/tests/unit/unittest/data/qml/QtApplicationManager/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtApplicationManager/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtApplicationManager/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtApplicationManager/qmldir diff --git a/tests/unit/unittest/data/qml/QtCharts/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtCharts/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtCharts/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtCharts/qmldir diff --git a/tests/unit/unittest/data/qml/QtCore/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtCore/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtCore/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtCore/qmldir diff --git a/tests/unit/unittest/data/qml/QtDataVisualization/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtDataVisualization/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtDataVisualization/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtDataVisualization/qmldir diff --git a/tests/unit/unittest/data/qml/QtInsightTracker/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtInsightTracker/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtInsightTracker/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtInsightTracker/qmldir diff --git a/tests/unit/unittest/data/qml/QtInterfaceFramework/Media/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtInterfaceFramework/Media/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtInterfaceFramework/Media/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtInterfaceFramework/Media/qmldir diff --git a/tests/unit/unittest/data/qml/QtInterfaceFramework/VehicleFunctions/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtInterfaceFramework/VehicleFunctions/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtInterfaceFramework/VehicleFunctions/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtInterfaceFramework/VehicleFunctions/qmldir diff --git a/tests/unit/unittest/data/qml/QtInterfaceFramework/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtInterfaceFramework/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtInterfaceFramework/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtInterfaceFramework/qmldir diff --git a/tests/unit/unittest/data/qml/QtLocation/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtLocation/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtLocation/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtLocation/qmldir diff --git a/tests/unit/unittest/data/qml/QtMultimedia/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtMultimedia/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtMultimedia/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtMultimedia/qmldir diff --git a/tests/unit/unittest/data/qml/QtOpcUa/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtOpcUa/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtOpcUa/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtOpcUa/qmldir diff --git a/tests/unit/unittest/data/qml/QtPositioning/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtPositioning/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtPositioning/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtPositioning/qmldir diff --git a/tests/unit/unittest/data/qml/QtQml/Base/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQml/Base/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQml/Base/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQml/Base/qmldir diff --git a/tests/unit/unittest/data/qml/QtQml/Models/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQml/Models/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQml/Models/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQml/Models/qmldir diff --git a/tests/unit/unittest/data/qml/QtQml/StateMachine/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQml/StateMachine/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQml/StateMachine/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQml/StateMachine/qmldir diff --git a/tests/unit/unittest/data/qml/QtQml/WorkerScript/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQml/WorkerScript/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQml/WorkerScript/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQml/WorkerScript/qmldir diff --git a/tests/unit/unittest/data/qml/QtQml/XmlListModel/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQml/XmlListModel/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQml/XmlListModel/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQml/XmlListModel/qmldir diff --git a/tests/unit/unittest/data/qml/QtQml/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQml/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQml/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQml/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Basic/impl/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Basic/impl/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Basic/impl/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Basic/impl/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Basic/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Basic/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Basic/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Basic/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Fusion/impl/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Fusion/impl/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Fusion/impl/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Fusion/impl/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Fusion/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Fusion/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Fusion/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Fusion/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Imagine/impl/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Imagine/impl/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Imagine/impl/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Imagine/impl/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Imagine/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Imagine/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Imagine/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Imagine/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Material/impl/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Material/impl/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Material/impl/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Material/impl/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Material/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Material/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Material/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Material/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Universal/impl/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Universal/impl/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Universal/impl/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Universal/impl/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/Universal/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Universal/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/Universal/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/Universal/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/impl/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/impl/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/impl/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/impl/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Controls/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Controls/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Controls/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Dialogs/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Dialogs/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Dialogs/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Dialogs/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Dialogs/quickimpl/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Dialogs/quickimpl/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Dialogs/quickimpl/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Dialogs/quickimpl/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Effects/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Effects/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Effects/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Effects/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Layouts/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Layouts/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Layouts/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Layouts/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/LocalStorage/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/LocalStorage/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/LocalStorage/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/LocalStorage/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/NativeStyle/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/NativeStyle/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/NativeStyle/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/NativeStyle/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Particles/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Particles/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Particles/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Particles/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Pdf/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Pdf/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Pdf/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Pdf/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Scene2D/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Scene2D/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Scene2D/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Scene2D/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Scene3D/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Scene3D/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Scene3D/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Scene3D/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Shapes/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Shapes/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Shapes/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Shapes/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Templates/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Templates/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Templates/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Templates/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Timeline/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Timeline/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Timeline/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Timeline/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Components/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Components/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Components/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Components/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Layouts/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Layouts/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Layouts/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Layouts/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/Hangul/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/Hangul/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/Hangul/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/Hangul/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/OpenWNN/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/OpenWNN/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/OpenWNN/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/OpenWNN/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/Pinyin/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/Pinyin/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/Pinyin/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/Pinyin/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/TCIme/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/TCIme/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/TCIme/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/TCIme/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/Thai/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/Thai/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/Thai/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/Thai/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Plugins/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Plugins/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Settings/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Settings/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Settings/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Settings/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Styles/Builtin/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Styles/Builtin/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Styles/Builtin/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Styles/Builtin/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Styles/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Styles/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/Styles/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/Styles/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/VirtualKeyboard/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/VirtualKeyboard/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/Window/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Window/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/Window/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/Window/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick/tooling/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/tooling/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick/tooling/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick/tooling/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/AssetUtils/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/AssetUtils/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/AssetUtils/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/AssetUtils/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/Effects/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Effects/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/Effects/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Effects/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/Helpers/impl/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Helpers/impl/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/Helpers/impl/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Helpers/impl/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/Helpers/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Helpers/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/Helpers/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Helpers/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/MaterialEditor/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/MaterialEditor/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/MaterialEditor/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/MaterialEditor/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/ParticleEffects/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/ParticleEffects/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/ParticleEffects/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/ParticleEffects/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/Particles3D/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Particles3D/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/Particles3D/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Particles3D/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/Physics/Helpers/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Physics/Helpers/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/Physics/Helpers/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Physics/Helpers/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/Physics/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Physics/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/Physics/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/Physics/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/SpatialAudio/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/SpatialAudio/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/SpatialAudio/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/SpatialAudio/qmldir diff --git a/tests/unit/unittest/data/qml/QtQuick3D/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtQuick3D/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtQuick3D/qmldir diff --git a/tests/unit/unittest/data/qml/QtRemoteObjects/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtRemoteObjects/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtRemoteObjects/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtRemoteObjects/qmldir diff --git a/tests/unit/unittest/data/qml/QtScxml/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtScxml/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtScxml/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtScxml/qmldir diff --git a/tests/unit/unittest/data/qml/QtSensors/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtSensors/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtSensors/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtSensors/qmldir diff --git a/tests/unit/unittest/data/qml/QtTest/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtTest/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtTest/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtTest/qmldir diff --git a/tests/unit/unittest/data/qml/QtTextToSpeech/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtTextToSpeech/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtTextToSpeech/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtTextToSpeech/qmldir diff --git a/tests/unit/unittest/data/qml/QtVncServer/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtVncServer/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtVncServer/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtVncServer/qmldir diff --git a/tests/unit/unittest/data/qml/QtWayland/Client/TextureSharing/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Client/TextureSharing/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWayland/Client/TextureSharing/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Client/TextureSharing/qmldir diff --git a/tests/unit/unittest/data/qml/QtWayland/Compositor/IviApplication/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/IviApplication/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWayland/Compositor/IviApplication/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/IviApplication/qmldir diff --git a/tests/unit/unittest/data/qml/QtWayland/Compositor/PresentationTime/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/PresentationTime/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWayland/Compositor/PresentationTime/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/PresentationTime/qmldir diff --git a/tests/unit/unittest/data/qml/QtWayland/Compositor/QtShell/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/QtShell/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWayland/Compositor/QtShell/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/QtShell/qmldir diff --git a/tests/unit/unittest/data/qml/QtWayland/Compositor/TextureSharingExtension/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/TextureSharingExtension/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWayland/Compositor/TextureSharingExtension/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/TextureSharingExtension/qmldir diff --git a/tests/unit/unittest/data/qml/QtWayland/Compositor/WlShell/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/WlShell/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWayland/Compositor/WlShell/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/WlShell/qmldir diff --git a/tests/unit/unittest/data/qml/QtWayland/Compositor/XdgShell/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/XdgShell/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWayland/Compositor/XdgShell/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/XdgShell/qmldir diff --git a/tests/unit/unittest/data/qml/QtWayland/Compositor/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWayland/Compositor/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWayland/Compositor/qmldir diff --git a/tests/unit/unittest/data/qml/QtWebChannel/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWebChannel/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWebChannel/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWebChannel/qmldir diff --git a/tests/unit/unittest/data/qml/QtWebEngine/ControlsDelegates/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWebEngine/ControlsDelegates/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWebEngine/ControlsDelegates/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWebEngine/ControlsDelegates/qmldir diff --git a/tests/unit/unittest/data/qml/QtWebEngine/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWebEngine/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWebEngine/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWebEngine/qmldir diff --git a/tests/unit/unittest/data/qml/QtWebSockets/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWebSockets/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWebSockets/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWebSockets/qmldir diff --git a/tests/unit/unittest/data/qml/QtWebView/qmldir b/tests/unit/tests/unittests/projectstorage/data/qml/QtWebView/qmldir similarity index 100% rename from tests/unit/unittest/data/qml/QtWebView/qmldir rename to tests/unit/tests/unittests/projectstorage/data/qml/QtWebView/qmldir diff --git a/tests/unit/unittest/directorypathcompressor-test.cpp b/tests/unit/tests/unittests/projectstorage/directorypathcompressor-test.cpp similarity index 90% rename from tests/unit/unittest/directorypathcompressor-test.cpp rename to tests/unit/tests/unittests/projectstorage/directorypathcompressor-test.cpp index 4ce2d450012..cd50d39db51 100644 --- a/tests/unit/unittest/directorypathcompressor-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/directorypathcompressor-test.cpp @@ -1,10 +1,10 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "filesystemmock.h" -#include "mocktimer.h" +#include "../mocks/filesystemmock.h" +#include "../mocks/mocktimer.h" #include @@ -16,10 +16,7 @@ using QmlDesigner::SourceContextIds; class DirectoryPathCompressor : public testing::Test { protected: - void SetUp() - { - compressor.setCallback(mockCompressorCallback.AsStdFunction()); - } + void SetUp() { compressor.setCallback(mockCompressorCallback.AsStdFunction()); } protected: NiceMock> mockCompressorCallback; @@ -69,4 +66,4 @@ TEST_F(DirectoryPathCompressor, RemoveDuplicates) compressor.addSourceContextId(sourceContextId1); } -} +} // namespace diff --git a/tests/unit/unittest/filestatuscache-test.cpp b/tests/unit/tests/unittests/projectstorage/filestatuscache-test.cpp similarity index 99% rename from tests/unit/unittest/filestatuscache-test.cpp rename to tests/unit/tests/unittests/projectstorage/filestatuscache-test.cpp index 6e1d9c1a326..921536aa029 100644 --- a/tests/unit/unittest/filestatuscache-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/filestatuscache-test.cpp @@ -1,8 +1,8 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "filesystemmock.h" -#include "googletest.h" +#include "../mocks/filesystemmock.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/modulescanner-test.cpp b/tests/unit/tests/unittests/projectstorage/modulescanner-test.cpp similarity index 94% rename from tests/unit/unittest/modulescanner-test.cpp rename to tests/unit/tests/unittests/projectstorage/modulescanner-test.cpp index 554e3fc8398..86a80d87b57 100644 --- a/tests/unit/unittest/modulescanner-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/modulescanner-test.cpp @@ -1,8 +1,8 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "externaldependenciesmock.h" -#include "googletest.h" +#include "../mocks/externaldependenciesmock.h" +#include "../utils/googletest.h" #include @@ -10,7 +10,7 @@ namespace { -QLatin1String qmlModulesPath(TESTDATA_DIR "/qml"); +QLatin1String qmlModulesPath(UNITTEST_DIR "/projectstorage/data/qml"); template auto UrlProperty(const Matcher &matcher) @@ -115,10 +115,9 @@ TEST_F(ModuleScanner, Version) QmlDesigner::VersionScanning::Yes, externalDependenciesMock}; - scanner.scan(QStringList{TESTDATA_DIR "/modulescanner"}); + scanner.scan(QStringList{UNITTEST_DIR "/projectstorage/data/modulescanner"}); ASSERT_THAT(scanner.modules(), ElementsAre(AllOf(UrlProperty("Example"), VersionProperty("1.3")))); - } TEST_F(ModuleScanner, NoVersion) @@ -129,7 +128,7 @@ TEST_F(ModuleScanner, NoVersion) QmlDesigner::VersionScanning::No, externalDependenciesMock}; - scanner.scan(QStringList{TESTDATA_DIR "/modulescanner"}); + scanner.scan(QStringList{UNITTEST_DIR "/projectstorage/data/modulescanner"}); ASSERT_THAT(scanner.modules(), ElementsAre(AllOf(UrlProperty("Example"), VersionProperty(QString{})))); diff --git a/tests/unit/unittest/projectstorage-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp similarity index 99% rename from tests/unit/unittest/projectstorage-test.cpp rename to tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp index 7ff1df47c9e..75e6a90989d 100644 --- a/tests/unit/unittest/projectstorage-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/projectstoragepathwatcher-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstoragepathwatcher-test.cpp similarity index 95% rename from tests/unit/unittest/projectstoragepathwatcher-test.cpp rename to tests/unit/tests/unittests/projectstorage/projectstoragepathwatcher-test.cpp index ad5e0d14878..bb29e96fc38 100644 --- a/tests/unit/unittest/projectstoragepathwatcher-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstoragepathwatcher-test.cpp @@ -1,12 +1,12 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "filesystemmock.h" -#include "mockqfilesystemwatcher.h" -#include "mocktimer.h" -#include "projectstoragepathwatchernotifiermock.h" +#include "../mocks/filesystemmock.h" +#include "../mocks/mockqfilesystemwatcher.h" +#include "../mocks/mocktimer.h" +#include "../mocks/projectstoragepathwatchernotifiermock.h" #include #include @@ -192,13 +192,13 @@ TEST_F(ProjectStoragePathWatcher, MergeMoreEntries) watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}}); - ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4)); + ASSERT_THAT(watcher.watchedEntries(), + ElementsAre(watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4)); } TEST_F(ProjectStoragePathWatcher, AddEmptyEntries) { - EXPECT_CALL(mockQFileSytemWatcher, addPaths(_)) - .Times(0); + EXPECT_CALL(mockQFileSytemWatcher, addPaths(_)).Times(0); watcher.updateIdPaths({}); } @@ -254,8 +254,7 @@ TEST_F(ProjectStoragePathWatcher, RemoveEntriesWithId) TEST_F(ProjectStoragePathWatcher, RemoveNoPathsForEmptyIds) { - EXPECT_CALL(mockQFileSytemWatcher, removePaths(_)) - .Times(0); + EXPECT_CALL(mockQFileSytemWatcher, removePaths(_)).Times(0); watcher.removeIds({}); } @@ -265,8 +264,7 @@ TEST_F(ProjectStoragePathWatcher, RemoveNoPathsForOneId) watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); - EXPECT_CALL(mockQFileSytemWatcher, removePaths(_)) - .Times(0); + EXPECT_CALL(mockQFileSytemWatcher, removePaths(_)).Times(0); watcher.removeIds({projectChunkId3.id}); } @@ -319,7 +317,8 @@ TEST_F(ProjectStoragePathWatcher, NotAnymoreWatchedEntriesWithId) auto notContainsdId = [&](WatcherEntry entry) { return entry.id != ids[0] && entry.id != ids[1]; }; - watcher.addEntries(sorted({watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4, watcherEntry5})); + watcher.addEntries( + sorted({watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4, watcherEntry5})); auto oldEntries = watcher.notAnymoreWatchedEntriesWithIds({watcherEntry1, watcherEntry4}, notContainsdId); @@ -329,7 +328,8 @@ TEST_F(ProjectStoragePathWatcher, NotAnymoreWatchedEntriesWithId) TEST_F(ProjectStoragePathWatcher, RemoveUnusedEntries) { - watcher.addEntries(sorted({watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4, watcherEntry5})); + watcher.addEntries( + sorted({watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4, watcherEntry5})); watcher.removeFromWatchedEntries({watcherEntry2, watcherEntry3}); diff --git a/tests/unit/unittest/projectstoragesqlitefunctionregistry-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp similarity index 98% rename from tests/unit/unittest/projectstoragesqlitefunctionregistry-test.cpp rename to tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp index 8f272bc775e..8c22da2455f 100644 --- a/tests/unit/unittest/projectstoragesqlitefunctionregistry-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/projectstorageupdater-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp similarity index 94% rename from tests/unit/unittest/projectstorageupdater-test.cpp rename to tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp index f2f52d401f9..f78732df29f 100644 --- a/tests/unit/unittest/projectstorageupdater-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp @@ -1,13 +1,13 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "filesystemmock.h" -#include "projectstoragemock.h" -#include "projectstoragepathwatchermock.h" -#include "qmldocumentparsermock.h" -#include "qmltypesparsermock.h" +#include "../mocks/filesystemmock.h" +#include "../mocks/projectstoragemock.h" +#include "../mocks/projectstoragepathwatchermock.h" +#include "../mocks/qmldocumentparsermock.h" +#include "../mocks/qmltypesparsermock.h" #include #include @@ -25,13 +25,13 @@ using QmlDesigner::SourceId; namespace Storage = QmlDesigner::Storage; using QmlDesigner::IdPaths; using QmlDesigner::Storage::TypeTraits; +using QmlDesigner::Storage::Version; using QmlDesigner::Storage::Synchronization::FileType; using QmlDesigner::Storage::Synchronization::Import; using QmlDesigner::Storage::Synchronization::IsAutoVersion; using QmlDesigner::Storage::Synchronization::ModuleExportedImport; using QmlDesigner::Storage::Synchronization::ProjectData; using QmlDesigner::Storage::Synchronization::SynchronizationPackage; -using QmlDesigner::Storage::Version; MATCHER_P5(IsStorageType, typeName, @@ -327,21 +327,11 @@ protected: Storage::Synchronization::Type firstType; Storage::Synchronization::Type secondType; Storage::Synchronization::Type thirdType; - Storage::Synchronization::Import import1{qmlModuleId, - Storage::Version{2, 3}, - qmlDocumentSourceId1}; - Storage::Synchronization::Import import2{qmlModuleId, - Storage::Version{}, - qmlDocumentSourceId2}; - Storage::Synchronization::Import import3{qmlModuleId, - Storage::Version{2}, - qmlDocumentSourceId3}; - Storage::Synchronization::Import import4{qmlModuleId, - Storage::Version{2, 3}, - qmltypesPathSourceId}; - Storage::Synchronization::Import import5{qmlModuleId, - Storage::Version{2, 3}, - qmltypes2PathSourceId}; + Storage::Synchronization::Import import1{qmlModuleId, Storage::Version{2, 3}, qmlDocumentSourceId1}; + Storage::Synchronization::Import import2{qmlModuleId, Storage::Version{}, qmlDocumentSourceId2}; + Storage::Synchronization::Import import3{qmlModuleId, Storage::Version{2}, qmlDocumentSourceId3}; + Storage::Synchronization::Import import4{qmlModuleId, Storage::Version{2, 3}, qmltypesPathSourceId}; + Storage::Synchronization::Import import5{qmlModuleId, Storage::Version{2, 3}, qmltypes2PathSourceId}; QString qmldirContent{"module Example\ntypeinfo example.qmltypes\n"}; QString qmltypes1{"Module {\ndependencies: [module1]}"}; QString qmltypes2{"Module {\ndependencies: [module2]}"}; @@ -455,9 +445,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeIsEmptyForNoChange) TEST_F(ProjectStorageUpdater, SynchronizeQmlTypes) { - Storage::Synchronization::Import import{qmlModuleId, - Storage::Version{2, 3}, - qmltypesPathSourceId}; + Storage::Synchronization::Import import{qmlModuleId, Storage::Version{2, 3}, qmltypesPathSourceId}; QString qmltypes{"Module {\ndependencies: []}"}; setQmlFileNames(u"/path", {}); setContent(u"/path/example.qmltypes", qmltypes); @@ -492,9 +480,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlTypes) TEST_F(ProjectStorageUpdater, SynchronizeQmlTypesThrowsIfQmltpesDoesNotExists) { - Storage::Synchronization::Import import{qmlModuleId, - Storage::Version{2, 3}, - qmltypesPathSourceId}; + Storage::Synchronization::Import import{qmlModuleId, Storage::Version{2, 3}, qmltypesPathSourceId}; setFilesDontExists({qmltypesPathSourceId}); ASSERT_THROW(updater.update(directories, {}), QmlDesigner::CannotParseQmlTypesFile); @@ -1325,23 +1311,17 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependencies) )"}; setContent(u"/path/qmldir", qmldir); - EXPECT_CALL(projectStorageMock, - synchronize( - AllOf(Field(&SynchronizationPackage::moduleDependencies, - UnorderedElementsAre(Import{qmlCppNativeModuleId, - Storage::Version{}, - qmltypesPathSourceId}, - Import{builtinCppNativeModuleId, - Storage::Version{}, - qmltypesPathSourceId}, - Import{qmlCppNativeModuleId, - Storage::Version{}, - qmltypes2PathSourceId}, - Import{builtinCppNativeModuleId, - Storage::Version{}, - qmltypes2PathSourceId})), - Field(&SynchronizationPackage::updatedModuleDependencySourceIds, - UnorderedElementsAre(qmltypesPathSourceId, qmltypes2PathSourceId))))); + EXPECT_CALL( + projectStorageMock, + synchronize(AllOf( + Field(&SynchronizationPackage::moduleDependencies, + UnorderedElementsAre( + Import{qmlCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId}, + Import{builtinCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId}, + Import{qmlCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId}, + Import{builtinCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId})), + Field(&SynchronizationPackage::updatedModuleDependencySourceIds, + UnorderedElementsAre(qmltypesPathSourceId, qmltypes2PathSourceId))))); updater.update(directories, {}); } @@ -1357,23 +1337,17 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithDoubleEntries) )"}; setContent(u"/path/qmldir", qmldir); - EXPECT_CALL(projectStorageMock, - synchronize( - AllOf(Field(&SynchronizationPackage::moduleDependencies, - UnorderedElementsAre(Import{qmlCppNativeModuleId, - Storage::Version{}, - qmltypesPathSourceId}, - Import{builtinCppNativeModuleId, - Storage::Version{}, - qmltypesPathSourceId}, - Import{qmlCppNativeModuleId, - Storage::Version{}, - qmltypes2PathSourceId}, - Import{builtinCppNativeModuleId, - Storage::Version{}, - qmltypes2PathSourceId})), - Field(&SynchronizationPackage::updatedModuleDependencySourceIds, - UnorderedElementsAre(qmltypesPathSourceId, qmltypes2PathSourceId))))); + EXPECT_CALL( + projectStorageMock, + synchronize(AllOf( + Field(&SynchronizationPackage::moduleDependencies, + UnorderedElementsAre( + Import{qmlCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId}, + Import{builtinCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId}, + Import{qmlCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId}, + Import{builtinCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId})), + Field(&SynchronizationPackage::updatedModuleDependencySourceIds, + UnorderedElementsAre(qmltypesPathSourceId, qmltypes2PathSourceId))))); updater.update(directories, {}); } @@ -1389,23 +1363,17 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithCollidingImports) )"}; setContent(u"/path/qmldir", qmldir); - EXPECT_CALL(projectStorageMock, - synchronize( - AllOf(Field(&SynchronizationPackage::moduleDependencies, - UnorderedElementsAre(Import{qmlCppNativeModuleId, - Storage::Version{}, - qmltypesPathSourceId}, - Import{builtinCppNativeModuleId, - Storage::Version{}, - qmltypesPathSourceId}, - Import{qmlCppNativeModuleId, - Storage::Version{}, - qmltypes2PathSourceId}, - Import{builtinCppNativeModuleId, - Storage::Version{}, - qmltypes2PathSourceId})), - Field(&SynchronizationPackage::updatedModuleDependencySourceIds, - UnorderedElementsAre(qmltypesPathSourceId, qmltypes2PathSourceId))))); + EXPECT_CALL( + projectStorageMock, + synchronize(AllOf( + Field(&SynchronizationPackage::moduleDependencies, + UnorderedElementsAre( + Import{qmlCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId}, + Import{builtinCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId}, + Import{qmlCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId}, + Import{builtinCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId})), + Field(&SynchronizationPackage::updatedModuleDependencySourceIds, + UnorderedElementsAre(qmltypesPathSourceId, qmltypes2PathSourceId))))); updater.update(directories, {}); } @@ -1436,35 +1404,35 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirImports) )"}; setContent(u"/path/qmldir", qmldir); - EXPECT_CALL( - projectStorageMock, - synchronize(AllOf( - Field(&SynchronizationPackage::moduleExportedImports, - UnorderedElementsAre(ModuleExportedImport{exampleModuleId, - qmlModuleId, - Storage::Version{}, - IsAutoVersion::Yes}, - ModuleExportedImport{exampleCppNativeModuleId, - qmlCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleModuleId, - builtinModuleId, - Storage::Version{2, 1}, - IsAutoVersion::No}, - ModuleExportedImport{exampleCppNativeModuleId, - builtinCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleModuleId, - quickModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleCppNativeModuleId, - quickCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No})), - Field(&SynchronizationPackage::updatedModuleIds, ElementsAre(exampleModuleId))))); + EXPECT_CALL(projectStorageMock, + synchronize( + AllOf(Field(&SynchronizationPackage::moduleExportedImports, + UnorderedElementsAre(ModuleExportedImport{exampleModuleId, + qmlModuleId, + Storage::Version{}, + IsAutoVersion::Yes}, + ModuleExportedImport{exampleCppNativeModuleId, + qmlCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleModuleId, + builtinModuleId, + Storage::Version{2, 1}, + IsAutoVersion::No}, + ModuleExportedImport{exampleCppNativeModuleId, + builtinCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleModuleId, + quickModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleCppNativeModuleId, + quickCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No})), + Field(&SynchronizationPackage::updatedModuleIds, + ElementsAre(exampleModuleId))))); updater.update(directories, {}); } @@ -1493,35 +1461,35 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirImportsWithDoubleEntries) )"}; setContent(u"/path/qmldir", qmldir); - EXPECT_CALL( - projectStorageMock, - synchronize(AllOf( - Field(&SynchronizationPackage::moduleExportedImports, - UnorderedElementsAre(ModuleExportedImport{exampleModuleId, - qmlModuleId, - Storage::Version{}, - IsAutoVersion::Yes}, - ModuleExportedImport{exampleCppNativeModuleId, - qmlCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleModuleId, - builtinModuleId, - Storage::Version{2, 1}, - IsAutoVersion::No}, - ModuleExportedImport{exampleCppNativeModuleId, - builtinCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleModuleId, - quickModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleCppNativeModuleId, - quickCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No})), - Field(&SynchronizationPackage::updatedModuleIds, ElementsAre(exampleModuleId))))); + EXPECT_CALL(projectStorageMock, + synchronize( + AllOf(Field(&SynchronizationPackage::moduleExportedImports, + UnorderedElementsAre(ModuleExportedImport{exampleModuleId, + qmlModuleId, + Storage::Version{}, + IsAutoVersion::Yes}, + ModuleExportedImport{exampleCppNativeModuleId, + qmlCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleModuleId, + builtinModuleId, + Storage::Version{2, 1}, + IsAutoVersion::No}, + ModuleExportedImport{exampleCppNativeModuleId, + builtinCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleModuleId, + quickModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleCppNativeModuleId, + quickCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No})), + Field(&SynchronizationPackage::updatedModuleIds, + ElementsAre(exampleModuleId))))); updater.update(directories, {}); } @@ -1535,35 +1503,35 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirOptionalImports) )"}; setContent(u"/path/qmldir", qmldir); - EXPECT_CALL( - projectStorageMock, - synchronize(AllOf( - Field(&SynchronizationPackage::moduleExportedImports, - UnorderedElementsAre(ModuleExportedImport{exampleModuleId, - qmlModuleId, - Storage::Version{}, - IsAutoVersion::Yes}, - ModuleExportedImport{exampleCppNativeModuleId, - qmlCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleModuleId, - builtinModuleId, - Storage::Version{2, 1}, - IsAutoVersion::No}, - ModuleExportedImport{exampleCppNativeModuleId, - builtinCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleModuleId, - quickModuleId, - Storage::Version{}, - IsAutoVersion::No}, - ModuleExportedImport{exampleCppNativeModuleId, - quickCppNativeModuleId, - Storage::Version{}, - IsAutoVersion::No})), - Field(&SynchronizationPackage::updatedModuleIds, ElementsAre(exampleModuleId))))); + EXPECT_CALL(projectStorageMock, + synchronize( + AllOf(Field(&SynchronizationPackage::moduleExportedImports, + UnorderedElementsAre(ModuleExportedImport{exampleModuleId, + qmlModuleId, + Storage::Version{}, + IsAutoVersion::Yes}, + ModuleExportedImport{exampleCppNativeModuleId, + qmlCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleModuleId, + builtinModuleId, + Storage::Version{2, 1}, + IsAutoVersion::No}, + ModuleExportedImport{exampleCppNativeModuleId, + builtinCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleModuleId, + quickModuleId, + Storage::Version{}, + IsAutoVersion::No}, + ModuleExportedImport{exampleCppNativeModuleId, + quickCppNativeModuleId, + Storage::Version{}, + IsAutoVersion::No})), + Field(&SynchronizationPackage::updatedModuleIds, + ElementsAre(exampleModuleId))))); updater.update(directories, {}); } diff --git a/tests/unit/unittest/qmldocumentparser-test.cpp b/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp similarity index 99% rename from tests/unit/unittest/qmldocumentparser-test.cpp rename to tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp index a9103d06ea4..73bf363f990 100644 --- a/tests/unit/unittest/qmldocumentparser-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/qmltypesparser-test.cpp b/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp similarity index 99% rename from tests/unit/unittest/qmltypesparser-test.cpp rename to tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp index 3fbbaa6b8cc..3631e80500f 100644 --- a/tests/unit/unittest/qmltypesparser-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/sourcepath-test.cpp b/tests/unit/tests/unittests/projectstorage/sourcepath-test.cpp similarity index 98% rename from tests/unit/unittest/sourcepath-test.cpp rename to tests/unit/tests/unittests/projectstorage/sourcepath-test.cpp index bea5404d7a3..7ab21c37fa4 100644 --- a/tests/unit/unittest/sourcepath-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/sourcepath-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/sourcepathcache-test.cpp b/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp similarity index 99% rename from tests/unit/unittest/sourcepathcache-test.cpp rename to tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp index ffcf08299e9..7a3c72991ea 100644 --- a/tests/unit/unittest/sourcepathcache-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp @@ -1,10 +1,10 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "projectstoragemock.h" -#include "sqlitedatabasemock.h" +#include "../mocks/projectstoragemock.h" +#include "../mocks/sqlitedatabasemock.h" #include diff --git a/tests/unit/unittest/sourcepathview-test.cpp b/tests/unit/tests/unittests/projectstorage/sourcepathview-test.cpp similarity index 98% rename from tests/unit/unittest/sourcepathview-test.cpp rename to tests/unit/tests/unittests/projectstorage/sourcepathview-test.cpp index b6236648baa..652c37dae89 100644 --- a/tests/unit/unittest/sourcepathview-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/sourcepathview-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/storagecache-test.cpp b/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp similarity index 99% rename from tests/unit/unittest/storagecache-test.cpp rename to tests/unit/tests/unittests/projectstorage/storagecache-test.cpp index 543b4dc5787..555d8410b88 100644 --- a/tests/unit/unittest/storagecache-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "mockmutex.h" -#include "projectstoragemock.h" -#include "sqlitedatabasemock.h" +#include "../mocks/mockmutex.h" +#include "../mocks/projectstoragemock.h" +#include "../mocks/sqlitedatabasemock.h" #include #include diff --git a/tests/unit/unittest/qmlprojectmanager/CMakeLists.txt b/tests/unit/tests/unittests/qmlprojectmanager/CMakeLists.txt similarity index 85% rename from tests/unit/unittest/qmlprojectmanager/CMakeLists.txt rename to tests/unit/tests/unittests/qmlprojectmanager/CMakeLists.txt index 52a70c0736a..a3859a9ce7b 100644 --- a/tests/unit/unittest/qmlprojectmanager/CMakeLists.txt +++ b/tests/unit/tests/unittests/qmlprojectmanager/CMakeLists.txt @@ -7,3 +7,5 @@ extend_qtc_test(unittest converters-test.cpp projectitem-test.cpp ) + +unittest_copy_data_folder() diff --git a/tests/unit/unittest/qmlprojectmanager/converters-test.cpp b/tests/unit/tests/unittests/qmlprojectmanager/converters-test.cpp similarity index 98% rename from tests/unit/unittest/qmlprojectmanager/converters-test.cpp rename to tests/unit/tests/unittests/qmlprojectmanager/converters-test.cpp index b985fff53d3..b7681610dee 100644 --- a/tests/unit/unittest/qmlprojectmanager/converters-test.cpp +++ b/tests/unit/tests/unittests/qmlprojectmanager/converters-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" // IWYU pragma: keep +#include "../utils/googletest.h" // IWYU pragma: keep #include diff --git a/tests/unit/unittest/qmlprojectmanager/data/README.md b/tests/unit/tests/unittests/qmlprojectmanager/data/README.md similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/README.md rename to tests/unit/tests/unittests/qmlprojectmanager/data/README.md diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml rename to tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.jsontoqml diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.qmlproject b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.qmlproject similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.qmlproject rename to tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.qmlproject diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson rename to tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-1/testfile.qmltojson diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml rename to tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.jsontoqml diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.qmlproject b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.qmlproject similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.qmlproject rename to tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.qmlproject diff --git a/tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson b/tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson rename to tests/unit/tests/unittests/qmlprojectmanager/data/converter/test-set-2/testfile.qmltojson diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject.qtds b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject.qtds similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject.qtds rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/MaterialBundle.qmlproject.qtds diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/MaterialLibrary.qrc b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/MaterialLibrary.qrc similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/MaterialLibrary.qrc rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/MaterialLibrary.qrc diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/CMakeLists.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/CMakeLists.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/CMakeLists.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/CMakeLists.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/CMakeLists.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/CMakeLists.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/CMakeLists.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/CMakeLists.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AcrylicPaintMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AcrylicPaintMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AcrylicPaintMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AcrylicPaintMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AluminiumMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AluminiumMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AluminiumMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AluminiumMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AsphaltMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AsphaltMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AsphaltMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/AsphaltMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/BrickMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/BrickMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/BrickMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/BrickMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CMakeLists.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CMakeLists.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CMakeLists.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CMakeLists.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintGlitterMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintGlitterMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintGlitterMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintGlitterMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarPaintMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarbonFiberMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarbonFiberMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarbonFiberMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CarbonFiberMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CeramicMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CeramicMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CeramicMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CeramicMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ChromeMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ChromeMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ChromeMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ChromeMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ConcreteMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ConcreteMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ConcreteMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/ConcreteMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CopperMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CopperMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CopperMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/CopperMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricRoughMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricRoughMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricRoughMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricRoughMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricSatinMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricSatinMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricSatinMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/FabricSatinMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassTintedMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassTintedMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassTintedMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GlassTintedMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GoldMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GoldMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GoldMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/GoldMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/LeatherMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/LeatherMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/LeatherMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/LeatherMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/MirrorMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/MirrorMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/MirrorMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/MirrorMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PaperMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PaperMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PaperMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PaperMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticMatteMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticMatteMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticMatteMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticMatteMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticShinyMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticShinyMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticShinyMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticShinyMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticTexturedMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticTexturedMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticTexturedMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/PlasticTexturedMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/RubberMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/RubberMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/RubberMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/RubberMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SilverMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SilverMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SilverMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SilverMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelBrushedMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelBrushedMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelBrushedMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelBrushedMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelFloorMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelFloorMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelFloorMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelFloorMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/SteelMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/StoneMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/StoneMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/StoneMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/StoneMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WaxMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WaxMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WaxMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WaxMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodParquetMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodParquetMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodParquetMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodParquetMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodPlanksMaterial.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodPlanksMaterial.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodPlanksMaterial.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/WoodPlanksMaterial.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/_asset_ref.json b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/_asset_ref.json similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/_asset_ref.json rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/_asset_ref.json diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/acrylicpaint.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/acrylicpaint.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/acrylicpaint.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/acrylicpaint.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/aluminium.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/aluminium.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/aluminium.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/aluminium.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/asphalt.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/asphalt.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/asphalt.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/asphalt.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/brick.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/brick.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/brick.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/brick.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carbonfiber.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carbonfiber.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carbonfiber.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carbonfiber.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaint.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaint.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaint.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaint.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaintglitter.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaintglitter.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaintglitter.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/carpaintglitter.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/ceramic.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/ceramic.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/ceramic.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/ceramic.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/chrome.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/chrome.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/chrome.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/chrome.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/concrete.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/concrete.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/concrete.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/concrete.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/copper.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/copper.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/copper.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/copper.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabric.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabric.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabric.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabric.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricrough.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricrough.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricrough.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricrough.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricsatin.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricsatin.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricsatin.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/fabricsatin.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glass.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glass.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glass.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glass.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glasstinted.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glasstinted.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glasstinted.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/glasstinted.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/gold.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/gold.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/gold.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/gold.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material16.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material16.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material16.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material16.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material@2x.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material@2x.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material@2x.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/images/material@2x.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/leather.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/leather.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/leather.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/leather.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/mirror.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/mirror.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/mirror.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/mirror.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/paper.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/paper.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/paper.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/paper.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticmatte.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticmatte.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticmatte.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticmatte.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticshiny.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticshiny.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticshiny.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plasticshiny.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plastictextured.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plastictextured.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plastictextured.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/plastictextured.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/rubber.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/rubber.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/rubber.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/rubber.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/silver.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/silver.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/silver.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/silver.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steel.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steel.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steel.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steel.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelbrushed.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelbrushed.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelbrushed.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelbrushed.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelfloor.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelfloor.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelfloor.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/steelfloor.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/stone.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/stone.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/stone.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/stone.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wax.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wax.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wax.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wax.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wood.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wood.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wood.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/wood.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodparquet.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodparquet.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodparquet.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodparquet.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodplanks.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodplanks.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodplanks.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/designer/woodplanks.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Opacity.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Opacity.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Opacity.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Opacity.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Asphalt010_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_AmbientOcclusion.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_AmbientOcclusion.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_AmbientOcclusion.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_AmbientOcclusion.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Color.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Color.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Color.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Color.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Bricks026_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Concrete032_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/DiamondPlate001_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric004_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric004_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric004_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric004_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Displacement.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Displacement.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Displacement.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Displacement.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric030_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Displacement.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Displacement.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Displacement.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Displacement.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Fabric031_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/LDR_RGB1_3.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/LDR_RGB1_3.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/LDR_RGB1_3.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/LDR_RGB1_3.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Color.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Color.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Color.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Color.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Leather037_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal009_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.jpg b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.jpg similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.jpg rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.jpg diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Metal029_2K_Displacement.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_AmbientOcclusion.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_AmbientOcclusion.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_AmbientOcclusion.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_AmbientOcclusion.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Paint006_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_AmbientOcclusion.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_AmbientOcclusion.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_AmbientOcclusion.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_AmbientOcclusion.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Color.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Color.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Color.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Color.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Rock023_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Color.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Color.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Color.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Color.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/Wood048_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Color.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Color.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Color.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Color.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor044_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_AmbientOcclusion.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_AmbientOcclusion.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_AmbientOcclusion.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_AmbientOcclusion.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Color.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Color.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Color.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Color.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_NormalGL.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_NormalGL.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_NormalGL.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_NormalGL.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Roughness.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Roughness.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Roughness.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/WoodFloor054_2K_Roughness.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/blurrynoise.tga b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/blurrynoise.tga similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/blurrynoise.tga rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/blurrynoise.tga diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/noisenormal.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/noisenormal.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/noisenormal.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/images/noisenormal.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/qmldir b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/qmldir similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/qmldir rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/qmldir diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/CMakeLists.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/CMakeLists.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/CMakeLists.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/CMakeLists.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.frag b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.frag similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.frag rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.frag diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.vert b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.vert similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.vert rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/SSS.vert diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.frag b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.frag similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.frag rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.frag diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.vert b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.vert similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.vert rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple.vert diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.frag b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.frag similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.frag rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.frag diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.vert b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.vert similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.vert rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/carmat_simple_nf.vert diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.frag b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.frag similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.frag rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.frag diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.vert b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.vert similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.vert rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/glass.vert diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.frag b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.frag similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.frag rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.frag diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.vert b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.vert similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.vert rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/asset_imports/ComponentBundles/MaterialBundle/shaders/satin.vert diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/App.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/App.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/App.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/App.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/CMakeLists.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/CMakeLists.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/CMakeLists.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/CMakeLists.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/CustomRoundButton.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/CustomRoundButton.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/CustomRoundButton.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/CustomRoundButton.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/MaterialNames.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/MaterialNames.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/MaterialNames.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/MaterialNames.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/MouseRotator.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/MouseRotator.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/MouseRotator.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/MouseRotator.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/Screen01.ui.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/Screen01.ui.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/Screen01.ui.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/Screen01.ui.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Bold.ttf b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Bold.ttf similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Bold.ttf rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Bold.ttf diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Regular.ttf b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Regular.ttf similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Regular.ttf rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/fonts/OpenSans-Regular.ttf diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/fonts/fonts.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/fonts/fonts.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/fonts/fonts.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/fonts/fonts.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/Ground_ShadowMap.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/Ground_ShadowMap.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/Ground_ShadowMap.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/Ground_ShadowMap.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/HDR/dark_mode.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/HDR/dark_mode.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/HDR/dark_mode.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/HDR/dark_mode.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/HDR/day_mode.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/HDR/day_mode.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/HDR/day_mode.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/HDR/day_mode.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/LDR_RGB1_3.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/LDR_RGB1_3.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/LDR_RGB1_3.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/LDR_RGB1_3.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/QtLogo_HD.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/QtLogo_HD.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/QtLogo_HD.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/QtLogo_HD.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/innerMesh.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/innerMesh.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/innerMesh.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/innerMesh.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/lightToggle.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/lightToggle.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/lightToggle.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/lightToggle.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/outerMesh.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/outerMesh.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/outerMesh.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/outerMesh.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon_on.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon_on.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon_on.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/UI/perfhudicon_on.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/White.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/White.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/White.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/White.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/checkmark.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/checkmark.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/checkmark.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/checkmark.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/groundAlpha.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/groundAlpha.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/groundAlpha.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/groundAlpha.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/qtlogo.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/qtlogo.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/qtlogo.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/qtlogo.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/scratchmap.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/scratchmap.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/scratchmap.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/scratchmap.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/shadow.png b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/shadow.png similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/shadow.png rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/shadow.png diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_AO.jpg b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_AO.jpg similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_AO.jpg rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_AO.jpg diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Albedo.jpg b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Albedo.jpg similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Albedo.jpg rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Albedo.jpg diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Normal.jpg b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Normal.jpg similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Normal.jpg rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Normal.jpg diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Roughness.jpg b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Roughness.jpg similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Roughness.jpg rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/images/vlkhcah_2K_Roughness.jpg diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/meshes/floor.mesh b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/meshes/floor.mesh similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/meshes/floor.mesh rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/meshes/floor.mesh diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/content/meshes/materialBall.mesh b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/meshes/materialBall.mesh similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/content/meshes/materialBall.mesh rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/content/meshes/materialBall.mesh diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/filelist.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/filelist.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/filelist.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/filelist.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/CMakeLists.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/CMakeLists.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/CMakeLists.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/CMakeLists.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/CMakeLists.txt b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/CMakeLists.txt similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/CMakeLists.txt rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/CMakeLists.txt diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/Constants.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/Constants.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/Constants.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/Constants.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/DirectoryFontLoader.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/DirectoryFontLoader.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/DirectoryFontLoader.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/DirectoryFontLoader.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListModel.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListModel.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListModel.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListModel.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListSimulator.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListSimulator.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListSimulator.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/EventListSimulator.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/designer/plugin.metainfo b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/designer/plugin.metainfo similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/designer/plugin.metainfo rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/designer/plugin.metainfo diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/qmldir b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/qmldir similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/qmldir rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/imports/MaterialLibrary/qmldir diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/main.qml b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/main.qml similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/main.qml rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/main.qml diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/qmlcomponents b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/qmlcomponents similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/qmlcomponents rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/qmlcomponents diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/qmlmodules b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/qmlmodules similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/qmlmodules rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/qmlmodules diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/qtquickcontrols2.conf b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/qtquickcontrols2.conf similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/qtquickcontrols2.conf rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/qtquickcontrols2.conf diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/share.qrc b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/share.qrc similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/share.qrc rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/share.qrc diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/src/app_environment.h b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/src/app_environment.h similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/src/app_environment.h rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/src/app_environment.h diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/src/import_qml_plugins.h b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/src/import_qml_plugins.h similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/src/import_qml_plugins.h rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/src/import_qml_plugins.h diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/src/main.cpp b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/src/main.cpp similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/src/main.cpp rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/src/main.cpp diff --git a/tests/unit/unittest/qmlprojectmanager/data/file-filters/translations.db b/tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/translations.db similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/file-filters/translations.db rename to tests/unit/tests/unittests/qmlprojectmanager/data/file-filters/translations.db diff --git a/tests/unit/unittest/qmlprojectmanager/data/getter-setter/empty.qmlproject b/tests/unit/tests/unittests/qmlprojectmanager/data/getter-setter/empty.qmlproject similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/getter-setter/empty.qmlproject rename to tests/unit/tests/unittests/qmlprojectmanager/data/getter-setter/empty.qmlproject diff --git a/tests/unit/unittest/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject b/tests/unit/tests/unittests/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject rename to tests/unit/tests/unittests/qmlprojectmanager/data/getter-setter/with_qds_prefix.qmlproject diff --git a/tests/unit/unittest/qmlprojectmanager/data/getter-setter/without_qds_prefix.qmlproject b/tests/unit/tests/unittests/qmlprojectmanager/data/getter-setter/without_qds_prefix.qmlproject similarity index 100% rename from tests/unit/unittest/qmlprojectmanager/data/getter-setter/without_qds_prefix.qmlproject rename to tests/unit/tests/unittests/qmlprojectmanager/data/getter-setter/without_qds_prefix.qmlproject diff --git a/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp b/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp similarity index 99% rename from tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp rename to tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp index ea8dcdae707..f6ae87c2c81 100644 --- a/tests/unit/unittest/qmlprojectmanager/projectitem-test.cpp +++ b/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp @@ -1,8 +1,8 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "google-using-declarations.h" -#include "googletest.h" // IWYU pragma: keep +#include "../utils/google-using-declarations.h" +#include "../utils/googletest.h" // IWYU pragma: keep #include diff --git a/tests/unit/tests/unittests/sqlite/CMakeLists.txt b/tests/unit/tests/unittests/sqlite/CMakeLists.txt new file mode 100644 index 00000000000..ba178fade6e --- /dev/null +++ b/tests/unit/tests/unittests/sqlite/CMakeLists.txt @@ -0,0 +1,21 @@ +# Sqlite tests +extend_qtc_test(unittest +SOURCES + lastchangedrowid-test.cpp + sqlitealgorithms-test.cpp + sqliteindex-test.cpp + sqliteteststatement.h + sqlitetransaction-test.cpp + sqlitecolumn-test.cpp + sqlitedatabasebackend-test.cpp + sqlitedatabase-test.cpp + sqlitefunctionregistry-test.cpp + sqlitesessions-test.cpp + sqlitestatement-test.cpp + sqlitetable-test.cpp + sqlstatementbuilder-test.cpp + createtablesqlstatementbuilder-test.cpp + sqlitevalue-test.cpp +) + +unittest_copy_data_folder() diff --git a/tests/unit/unittest/createtablesqlstatementbuilder-test.cpp b/tests/unit/tests/unittests/sqlite/createtablesqlstatementbuilder-test.cpp similarity index 99% rename from tests/unit/unittest/createtablesqlstatementbuilder-test.cpp rename to tests/unit/tests/unittests/sqlite/createtablesqlstatementbuilder-test.cpp index 050b626fb15..06d8d630b0e 100644 --- a/tests/unit/unittest/createtablesqlstatementbuilder-test.cpp +++ b/tests/unit/tests/unittests/sqlite/createtablesqlstatementbuilder-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/tests/unittests/sqlite/data/sqlite_database.db b/tests/unit/tests/unittests/sqlite/data/sqlite_database.db new file mode 100644 index 0000000000000000000000000000000000000000..51e0f41eb7f9de602c5b84997214c41f230113a7 GIT binary patch literal 12288 zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|?ckU|?oI07eD|1{MUD0mMh*Vr4Qh z=w)5t1sTS#&A?yFuZ>mJsNiS_jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb23R z5C~vm6W7*ej4Vk^%1JFQ%*iZCjW13uEKSWzM&~j+2e~?ixGID=I{CONpsCf!OUzBx zDNZfaY-C_$7uVHgY%~U&nUYwNn3PzY8k|~OoSC0jjLv65F%?}_BQr(8(=Wu;-8D!d zAjs3#F(^{O+ci?bF*L;A)6Y4`)z{T8L`NYxBQY;MwK%mz!O6$pNfXpJXAl@XfjsJx z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!3jHhrnq6pZZ}sYT{@JjE2By i2#kinXb6mkz-S1JhQMeDjE2By2#kinXb23p5C8z7TTj^l literal 0 HcmV?d00001 diff --git a/tests/unit/unittest/lastchangedrowid-test.cpp b/tests/unit/tests/unittests/sqlite/lastchangedrowid-test.cpp similarity index 99% rename from tests/unit/unittest/lastchangedrowid-test.cpp rename to tests/unit/tests/unittests/sqlite/lastchangedrowid-test.cpp index 0980b0209b9..fc2d03fada4 100644 --- a/tests/unit/unittest/lastchangedrowid-test.cpp +++ b/tests/unit/tests/unittests/sqlite/lastchangedrowid-test.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "sqlitedatabasemock.h" +#include "../mocks/sqlitedatabasemock.h" #include diff --git a/tests/unit/unittest/sqlitealgorithms-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitealgorithms-test.cpp similarity index 99% rename from tests/unit/unittest/sqlitealgorithms-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitealgorithms-test.cpp index 956d49147a5..e9adde292b6 100644 --- a/tests/unit/unittest/sqlitealgorithms-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitealgorithms-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/sqlitecolumn-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitecolumn-test.cpp similarity index 99% rename from tests/unit/unittest/sqlitecolumn-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitecolumn-test.cpp index c7e2218cb8f..924f4359163 100644 --- a/tests/unit/unittest/sqlitecolumn-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitecolumn-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/sqlitedatabase-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitedatabase-test.cpp similarity index 96% rename from tests/unit/unittest/sqlitedatabase-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitedatabase-test.cpp index f5fe435b813..7872efa7a11 100644 --- a/tests/unit/unittest/sqlitedatabase-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitedatabase-test.cpp @@ -1,9 +1,8 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" - -#include "spydummy.h" +#include "../utils/googletest.h" +#include "../utils/spydummy.h" #include #include @@ -52,7 +51,7 @@ protected: } static void updateHookCallback( - void *object, int type, char const *database, char const *table, long long rowId) + void *object, int type, const char *database, const char *table, long long rowId) { static_cast(object)->callback(static_cast(type), database, @@ -65,8 +64,8 @@ protected: Table table; mutable Sqlite::Database database{":memory:", JournalMode::Memory}; Sqlite::TransactionInterface &transactionInterface = database; - MockFunction callbackMock; - std::function + MockFunction callbackMock; + std::function callback = callbackMock.AsStdFunction(); std::unique_lock lock{database}; }; @@ -155,7 +154,7 @@ TEST_F(SqliteDatabase, DatabaseIsIntializedAfterSettingItBeforeOpening) TEST_F(SqliteDatabase, DatabaseIsInitializedIfDatabasePathExistsAtOpening) { - Sqlite::Database database{TESTDATA_DIR "/sqlite_database.db"}; + Sqlite::Database database{UNITTEST_DIR "/sqlite/data/sqlite_database.db"}; ASSERT_TRUE(database.isInitialized()); } diff --git a/tests/unit/unittest/sqlitedatabasebackend-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp similarity index 99% rename from tests/unit/unittest/sqlitedatabasebackend-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp index 9e08eb5b00d..610918f2682 100644 --- a/tests/unit/unittest/sqlitedatabasebackend-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/sqlitefunctionregistry-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitefunctionregistry-test.cpp similarity index 72% rename from tests/unit/unittest/sqlitefunctionregistry-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitefunctionregistry-test.cpp index de9a566fd50..f0435bb1ef1 100644 --- a/tests/unit/unittest/sqlitefunctionregistry-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitefunctionregistry-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include @@ -19,7 +19,8 @@ protected: TEST_F(SqliteFunctionRegistry, PathExists) { std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement{"SELECT pathExists('" TESTDATA_DIR "/sqlite_database.db')", + Sqlite::ReadStatement<1> statement{"SELECT pathExists('" UNITTEST_DIR + "/sqlite/data/sqlite_database.db')", database}; auto pathExists = statement.value(); @@ -30,7 +31,8 @@ TEST_F(SqliteFunctionRegistry, PathExists) TEST_F(SqliteFunctionRegistry, PathDoesntExists) { std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement{"SELECT pathExists('" TESTDATA_DIR "/sqlite_database2.db')", + Sqlite::ReadStatement<1> statement{"SELECT pathExists('" UNITTEST_DIR + "/sqlite/data/sqlite_database2.db')", database}; auto pathExists = statement.value(); diff --git a/tests/unit/unittest/sqliteindex-test.cpp b/tests/unit/tests/unittests/sqlite/sqliteindex-test.cpp similarity index 97% rename from tests/unit/unittest/sqliteindex-test.cpp rename to tests/unit/tests/unittests/sqlite/sqliteindex-test.cpp index e2e9172b525..528d9a3d3db 100644 --- a/tests/unit/unittest/sqliteindex-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqliteindex-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/sqlitesessions-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitesessions-test.cpp similarity index 99% rename from tests/unit/unittest/sqlitesessions-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitesessions-test.cpp index be651ae208b..c61d3004312 100644 --- a/tests/unit/unittest/sqlitesessions-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitesessions-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/sqlitestatement-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitestatement-test.cpp similarity index 98% rename from tests/unit/unittest/sqlitestatement-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitestatement-test.cpp index e50d28dd2b3..dd31e1f90ac 100644 --- a/tests/unit/unittest/sqlitestatement-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitestatement-test.cpp @@ -1,9 +1,11 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" -#include "mocksqlitestatement.h" -#include "sqlitedatabasemock.h" +#include "../utils/googletest.h" + +#include "../mocks/mocksqlitestatement.h" +#include "../mocks/sqlitedatabasemock.h" + #include "sqliteteststatement.h" #include @@ -51,12 +53,12 @@ bool compareValue(SqliteTestStatement<2, 1> &statement, Type value, int column) return false; } -MATCHER_P3(HasValues, value1, value2, rowid, - std::string(negation ? "isn't" : "is") - + PrintToString(value1) - + ", " + PrintToString(value2) - + " and " + PrintToString(rowid) - ) +MATCHER_P3(HasValues, + value1, + value2, + rowid, + std::string(negation ? "isn't" : "is") + PrintToString(value1) + ", " + + PrintToString(value2) + " and " + PrintToString(rowid)) { Database &database = arg.database(); @@ -132,7 +134,8 @@ struct Output } friend std::ostream &operator<<(std::ostream &out, const Output &o) { - return out << "(" << o.name << ", " << ", " << o.number<< ", " << o.value<< ")"; + return out << "(" << o.name << ", " + << ", " << o.number << ", " << o.value << ")"; } }; @@ -311,7 +314,7 @@ TEST_F(SqliteStatement, BindInteger) statement.bind(1, 40); statement.next(); - ASSERT_THAT(statement.fetchSmallStringViewValue(0),"poo"); + ASSERT_THAT(statement.fetchSmallStringViewValue(0), "poo"); } TEST_F(SqliteStatement, BindLongInteger) @@ -1385,7 +1388,7 @@ TEST_F(SqliteStatement, ResetIfWriteIsThrowingException) MockSqliteStatement<1, 1> mockStatement{databaseMock}; EXPECT_CALL(mockStatement, bind(1, TypedEq("bar"))) - .WillOnce(Throw(Sqlite::StatementIsBusy(""))); + .WillOnce(Throw(Sqlite::StatementIsBusy(""))); EXPECT_CALL(mockStatement, reset()); ASSERT_ANY_THROW(mockStatement.write("bar")); diff --git a/tests/unit/unittest/sqlitetable-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitetable-test.cpp similarity index 98% rename from tests/unit/unittest/sqlitetable-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitetable-test.cpp index 0560937997d..be2f0fa3dee 100644 --- a/tests/unit/unittest/sqlitetable-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitetable-test.cpp @@ -1,11 +1,12 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" -#include "spydummy.h" +#include "../utils/googletest.h" +#include "../utils/spydummy.h" + +#include "../../mocks/sqlitedatabasemock.h" #include -#include #include namespace { @@ -30,7 +31,6 @@ protected: Utils::SmallString tableName = "testTable"; }; - TEST_F(SqliteTable, ColumnIsAddedToTable) { table.setUseWithoutRowId(true); @@ -60,8 +60,9 @@ TEST_F(SqliteTable, AddIndex) auto index = table.addIndex({column, column2}); - ASSERT_THAT(Utils::SmallStringView(index.sqlStatement()), - Eq("CREATE INDEX IF NOT EXISTS index_testTable_name_value ON testTable(name, value)")); + ASSERT_THAT( + Utils::SmallStringView(index.sqlStatement()), + Eq("CREATE INDEX IF NOT EXISTS index_testTable_name_value ON testTable(name, value)")); } TEST_F(SqliteTable, InitializeTable) @@ -90,7 +91,8 @@ TEST_F(SqliteTable, InitializeTableWithIndex) table.addIndex({column2}, "value IS NOT NULL"); EXPECT_CALL(databaseMock, execute(Eq("CREATE TABLE testTable(name, value)"))); - EXPECT_CALL(databaseMock, execute(Eq("CREATE INDEX IF NOT EXISTS index_testTable_name ON testTable(name)"))); + EXPECT_CALL(databaseMock, + execute(Eq("CREATE INDEX IF NOT EXISTS index_testTable_name ON testTable(name)"))); EXPECT_CALL(databaseMock, execute(Eq("CREATE INDEX IF NOT EXISTS index_testTable_value ON testTable(value) " "WHERE value IS NOT NULL"))); diff --git a/tests/unit/unittest/sqliteteststatement.h b/tests/unit/tests/unittests/sqlite/sqliteteststatement.h similarity index 100% rename from tests/unit/unittest/sqliteteststatement.h rename to tests/unit/tests/unittests/sqlite/sqliteteststatement.h diff --git a/tests/unit/unittest/sqlitetransaction-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitetransaction-test.cpp similarity index 95% rename from tests/unit/unittest/sqlitetransaction-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitetransaction-test.cpp index ca52dd0ae11..7bb4770fc79 100644 --- a/tests/unit/unittest/sqlitetransaction-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitetransaction-test.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" -#include "mocksqlitetransactionbackend.h" +#include "../mocks/mocksqlitetransactionbackend.h" +#include "../mocks/sqlitedatabasemock.h" -#include #include #include @@ -197,24 +197,21 @@ TEST_F(SqliteTransaction, DeferredTransactionBeginThrows) { ON_CALL(mockTransactionBackend, deferredBegin()).WillByDefault(Throw(Sqlite::Exception())); - ASSERT_THROW(DeferredTransaction{mockTransactionBackend}, - Sqlite::Exception); + ASSERT_THROW(DeferredTransaction{mockTransactionBackend}, Sqlite::Exception); } TEST_F(SqliteTransaction, ImmediateTransactionBeginThrows) { ON_CALL(mockTransactionBackend, immediateBegin()).WillByDefault(Throw(Sqlite::Exception())); - ASSERT_THROW(ImmediateTransaction{mockTransactionBackend}, - Sqlite::Exception); + ASSERT_THROW(ImmediateTransaction{mockTransactionBackend}, Sqlite::Exception); } TEST_F(SqliteTransaction, ExclusiveTransactionBeginThrows) { ON_CALL(mockTransactionBackend, exclusiveBegin()).WillByDefault(Throw(Sqlite::Exception())); - ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend}, - Sqlite::Exception); + ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend}, Sqlite::Exception); } TEST_F(SqliteTransaction, DeferredTransactionBeginThrowsAndNotRollback) @@ -238,7 +235,6 @@ TEST_F(SqliteTransaction, ImmediateTransactionBeginThrowsAndNotRollback) EXPECT_CALL(mockTransactionBackend, rollback()).Times(0); EXPECT_CALL(mockTransactionBackend, unlock()); - ASSERT_ANY_THROW(ImmediateTransaction{mockTransactionBackend}); } @@ -259,16 +255,14 @@ TEST_F(SqliteTransaction, TransactionCommitThrows) ON_CALL(mockTransactionBackend, commit()).WillByDefault(Throw(Sqlite::Exception())); ImmediateTransaction transaction{mockTransactionBackend}; - ASSERT_THROW(transaction.commit(), - Sqlite::Exception); + ASSERT_THROW(transaction.commit(), Sqlite::Exception); } TEST_F(SqliteTransaction, TransactionRollbackInDestructorThrows) { ON_CALL(mockTransactionBackend, rollback()).WillByDefault(Throw(Sqlite::Exception())); - ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend}, - Sqlite::Exception); + ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend}, Sqlite::Exception); } TEST_F(SqliteTransaction, TransactionRollbackInDestructorDontThrows) diff --git a/tests/unit/unittest/sqlitevalue-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitevalue-test.cpp similarity index 99% rename from tests/unit/unittest/sqlitevalue-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlitevalue-test.cpp index e69c981cd56..ea1514439bd 100644 --- a/tests/unit/unittest/sqlitevalue-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitevalue-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/sqlstatementbuilder-test.cpp b/tests/unit/tests/unittests/sqlite/sqlstatementbuilder-test.cpp similarity index 99% rename from tests/unit/unittest/sqlstatementbuilder-test.cpp rename to tests/unit/tests/unittests/sqlite/sqlstatementbuilder-test.cpp index d70ea1fa2f1..d4ebadf0b38 100644 --- a/tests/unit/unittest/sqlstatementbuilder-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlstatementbuilder-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/unittests-main.cpp b/tests/unit/tests/unittests/unittests-main.cpp similarity index 98% rename from tests/unit/unittest/unittests-main.cpp rename to tests/unit/tests/unittests/unittests-main.cpp index af6f5db4fb2..8fc6da3402a 100644 --- a/tests/unit/unittest/unittests-main.cpp +++ b/tests/unit/tests/unittests/unittests-main.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/tests/unittests/utils/CMakeLists.txt b/tests/unit/tests/unittests/utils/CMakeLists.txt new file mode 100644 index 00000000000..d4e8e56e2e4 --- /dev/null +++ b/tests/unit/tests/unittests/utils/CMakeLists.txt @@ -0,0 +1,16 @@ +# QtCreator Utils Tests +extend_qtc_test(unittest + SOURCES + matchingtext-test.cpp + sizedarray-test.cpp + smallstring-test.cpp +) + +extend_qtc_test(unittest + CONDITION TARGET GoogleBenchmark + DEPENDS GoogleBenchmark + SOURCES + smallstring-benchmark.cpp +) + +unittest_copy_data_folder() diff --git a/tests/unit/unittest/data/sqlite_database.db b/tests/unit/tests/unittests/utils/data/sqlite_database.db similarity index 100% rename from tests/unit/unittest/data/sqlite_database.db rename to tests/unit/tests/unittests/utils/data/sqlite_database.db diff --git a/tests/unit/unittest/matchingtext-test.cpp b/tests/unit/tests/unittests/utils/matchingtext-test.cpp similarity index 99% rename from tests/unit/unittest/matchingtext-test.cpp rename to tests/unit/tests/unittests/utils/matchingtext-test.cpp index 5028081bdb1..b8ebee9cab2 100644 --- a/tests/unit/unittest/matchingtext-test.cpp +++ b/tests/unit/tests/unittests/utils/matchingtext-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/sizedarray-test.cpp b/tests/unit/tests/unittests/utils/sizedarray-test.cpp similarity index 98% rename from tests/unit/unittest/sizedarray-test.cpp rename to tests/unit/tests/unittests/utils/sizedarray-test.cpp index 8e78771ca55..bf4cad43012 100644 --- a/tests/unit/unittest/sizedarray-test.cpp +++ b/tests/unit/tests/unittests/utils/sizedarray-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/unittest/smallstring-benchmark.cpp b/tests/unit/tests/unittests/utils/smallstring-benchmark.cpp similarity index 100% rename from tests/unit/unittest/smallstring-benchmark.cpp rename to tests/unit/tests/unittests/utils/smallstring-benchmark.cpp diff --git a/tests/unit/unittest/smallstring-test.cpp b/tests/unit/tests/unittests/utils/smallstring-test.cpp similarity index 99% rename from tests/unit/unittest/smallstring-test.cpp rename to tests/unit/tests/unittests/utils/smallstring-test.cpp index a77e0bdc2d4..f00417c96e0 100644 --- a/tests/unit/unittest/smallstring-test.cpp +++ b/tests/unit/tests/unittests/utils/smallstring-test.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include diff --git a/tests/unit/tests/utils/CMakeLists.txt b/tests/unit/tests/utils/CMakeLists.txt new file mode 100644 index 00000000000..71df3cdb49b --- /dev/null +++ b/tests/unit/tests/utils/CMakeLists.txt @@ -0,0 +1,17 @@ +extend_qtc_test(unittest + DEPENDS Utils + SOURCES + googletest.h + google-using-declarations.h + conditionally-disabled-tests.h + eventspy.cpp + eventspy.h + fakeprocess.cpp + fakeprocess.h + notification.h + processevents-utilities.cpp + processevents-utilities.h + spydummy.cpp + spydummy.h + unittest-utility-functions.h +) diff --git a/tests/unit/unittest/conditionally-disabled-tests.h b/tests/unit/tests/utils/conditionally-disabled-tests.h similarity index 100% rename from tests/unit/unittest/conditionally-disabled-tests.h rename to tests/unit/tests/utils/conditionally-disabled-tests.h diff --git a/tests/unit/unittest/eventspy.cpp b/tests/unit/tests/utils/eventspy.cpp similarity index 100% rename from tests/unit/unittest/eventspy.cpp rename to tests/unit/tests/utils/eventspy.cpp diff --git a/tests/unit/unittest/eventspy.h b/tests/unit/tests/utils/eventspy.h similarity index 100% rename from tests/unit/unittest/eventspy.h rename to tests/unit/tests/utils/eventspy.h diff --git a/tests/unit/unittest/fakeprocess.cpp b/tests/unit/tests/utils/fakeprocess.cpp similarity index 100% rename from tests/unit/unittest/fakeprocess.cpp rename to tests/unit/tests/utils/fakeprocess.cpp diff --git a/tests/unit/unittest/fakeprocess.h b/tests/unit/tests/utils/fakeprocess.h similarity index 100% rename from tests/unit/unittest/fakeprocess.h rename to tests/unit/tests/utils/fakeprocess.h diff --git a/tests/unit/unittest/google-using-declarations.h b/tests/unit/tests/utils/google-using-declarations.h similarity index 100% rename from tests/unit/unittest/google-using-declarations.h rename to tests/unit/tests/utils/google-using-declarations.h diff --git a/tests/unit/unittest/googletest.h b/tests/unit/tests/utils/googletest.h similarity index 55% rename from tests/unit/unittest/googletest.h rename to tests/unit/tests/utils/googletest.h index a3d3012a09a..e64c8f5b639 100644 --- a/tests/unit/unittest/googletest.h +++ b/tests/unit/tests/utils/googletest.h @@ -4,23 +4,24 @@ #pragma once #ifdef __GNUC__ -#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" +# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" #endif -#include #include -#include +#include #include #include +#include + +#include "../utils/google-using-declarations.h" #include "conditionally-disabled-tests.h" -#include "gtest-creator-printing.h" -#include "gtest-llvm-printing.h" -#include "gtest-qt-printing.h" -#include "gtest-std-printing.h" -#include "google-using-declarations.h" +#include "../printers/gtest-creator-printing.h" +#include "../printers/gtest-llvm-printing.h" +#include "../printers/gtest-qt-printing.h" +#include "../printers/gtest-std-printing.h" -#include "unittest-matchers.h" +#include "../matchers/unittest-matchers.h" #include "unittest-utility-functions.h" diff --git a/tests/unit/unittest/notification.h b/tests/unit/tests/utils/notification.h similarity index 95% rename from tests/unit/unittest/notification.h rename to tests/unit/tests/utils/notification.h index f34f1545cd9..85624a27962 100644 --- a/tests/unit/unittest/notification.h +++ b/tests/unit/tests/utils/notification.h @@ -1,7 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "googletest.h" +#include "../utils/googletest.h" #include #include diff --git a/tests/unit/unittest/processevents-utilities.cpp b/tests/unit/tests/utils/processevents-utilities.cpp similarity index 100% rename from tests/unit/unittest/processevents-utilities.cpp rename to tests/unit/tests/utils/processevents-utilities.cpp diff --git a/tests/unit/unittest/processevents-utilities.h b/tests/unit/tests/utils/processevents-utilities.h similarity index 100% rename from tests/unit/unittest/processevents-utilities.h rename to tests/unit/tests/utils/processevents-utilities.h diff --git a/tests/unit/unittest/spydummy.cpp b/tests/unit/tests/utils/spydummy.cpp similarity index 100% rename from tests/unit/unittest/spydummy.cpp rename to tests/unit/tests/utils/spydummy.cpp diff --git a/tests/unit/unittest/spydummy.h b/tests/unit/tests/utils/spydummy.h similarity index 100% rename from tests/unit/unittest/spydummy.h rename to tests/unit/tests/utils/spydummy.h diff --git a/tests/unit/unittest/unittest-utility-functions.h b/tests/unit/tests/utils/unittest-utility-functions.h similarity index 100% rename from tests/unit/unittest/unittest-utility-functions.h rename to tests/unit/tests/utils/unittest-utility-functions.h diff --git a/tests/unit/unit.qbs b/tests/unit/unit.qbs deleted file mode 100644 index b263b933f8f..00000000000 --- a/tests/unit/unit.qbs +++ /dev/null @@ -1,4 +0,0 @@ -Product { - name: "QmlDesigner unit tests" - files: ["*", "**/*"] -} diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt deleted file mode 100644 index 0fd002dd7af..00000000000 --- a/tests/unit/unittest/CMakeLists.txt +++ /dev/null @@ -1,369 +0,0 @@ -find_package(Googletest MODULE) -find_package(GoogleBenchmark MODULE) -find_package(Qt6 COMPONENTS QmlDomPrivate QmlCompilerPrivate) - -if (NOT Googletest_FOUND) - message(STATUS "Googletest was not found. Please set GOOGLETEST_DIR (CMake or Environment) variable.") - message(STATUS "Have a look at cmake/FindGoogletest.cmake file for more details.") - message(STATUS "unittest module will be skipped.") - return() -endif() - -if (MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") -elseif (MINGW) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj") -endif() - -file(RELATIVE_PATH RELATIVE_TEST_PATH "${PROJECT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}") -file(RELATIVE_PATH TEST_RELATIVE_LIBEXEC_PATH "/${RELATIVE_TEST_PATH}" "/${IDE_LIBEXEC_PATH}") - -add_qtc_test(unittest GTEST - PROPERTIES COMPILE_WARNING_AS_ERROR OFF - INCLUDES - BEFORE "../mockup" - BEFORE "../mockup/qmldesigner/designercore/include" - DEPENDS - Qt::Core Qt::Network Qt::Widgets - Qt::Xml Qt::Concurrent Qt::QmlPrivate Qt::Gui - Qt::Core5Compat QmlJS Sqlite SqliteC - Googletest - DEFINES - GTEST_INTERNAL_HAS_STRING_VIEW - QT_NO_CAST_TO_ASCII - QT_RESTRICTED_CAST_FROM_ASCII - UNIT_TESTS - DONT_CHECK_MESSAGE_COUNTER - QTC_RESOURCE_DIR="${CMAKE_CURRENT_LIST_DIR}/../../../share/qtcreator" - TESTDATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data" - UNITTEST_DIR="${CMAKE_CURRENT_SOURCE_DIR}" - TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}" - QT6_INSTALL_PREFIX="${QT6_INSTALL_PREFIX}" - QDS_MODEL_USE_PROJECTSTORAGEINTERFACE - QDS_USE_PROJECTSTORAGE - SOURCES - abstractviewmock.h - conditionally-disabled-tests.h - dynamicastmatcherdiagnosticcontainer-matcher.h - eventspy.cpp eventspy.h - fakeprocess.cpp fakeprocess.h - googletest.h - google-using-declarations.h - gtest-creator-printing.cpp gtest-creator-printing.h - gtest-llvm-printing.h - gtest-qt-printing.cpp gtest-qt-printing.h - gtest-std-printing.h - lastchangedrowid-test.cpp - import-test.cpp - model-test.cpp - modelresourcemanagement-test.cpp - modelresourcemanagementmock.h - matchingtext-test.cpp - mockfutureinterface.h - mockmutex.h - mockqfilesystemwatcher.h - mocksqlitestatement.h - mocksqlitetransactionbackend.h - mocksyntaxhighligher.h - mocktimer.cpp mocktimer.h - nodelistproperty-test.cpp - processevents-utilities.cpp processevents-utilities.h - projectstoragemock.cpp projectstoragemock.h - sizedarray-test.cpp - smallstring-test.cpp - spydummy.cpp spydummy.h - sqlitealgorithms-test.cpp - sqliteindex-test.cpp - sqliteteststatement.h - sqlitetransaction-test.cpp - unittests-main.cpp - unittest-utility-functions.h - sqlitecolumn-test.cpp - sqlitedatabasebackend-test.cpp - sqlitedatabase-test.cpp - sqlitefunctionregistry-test.cpp - sqlitesessions-test.cpp - sqlitestatement-test.cpp - sqlitetable-test.cpp - sqlstatementbuilder-test.cpp - createtablesqlstatementbuilder-test.cpp - sqlitevalue-test.cpp - asynchronousimagecache-test.cpp - synchronousimagecache-test.cpp - imagecachegenerator-test.cpp - imagecachestorage-test.cpp - imagecachedispatchcollector-test.cpp - sqlitedatabasemock.h - sqlitereadstatementmock.cpp sqlitereadstatementmock.h - sqlitereadwritestatementmock.cpp - sqlitestatementmock.h - sqlitetransactionbackendmock.h - sqlitewritestatementmock.cpp sqlitewritestatementmock.h - notification.h - mocktimestampprovider.h - imagecachecollectormock.h - mockimagecachegenerator.h - mockimagecachestorage.h - asynchronousexplicitimagecache-test.cpp - asynchronousimagefactory-test.cpp - modulescanner-test.cpp -) - -if (NOT TARGET unittest) - return() -endif() - -function(extend_qtc_test_with_target_sources target) - cmake_parse_arguments(_arg "" "" "DEFINES;INCLUDES" ${ARGN}) - - get_target_property(${target}Sources ${target} SOURCES) - # work around issue with CMake < 3.14 where target sources can contain - # $ - list(FILTER ${target}Sources EXCLUDE REGEX "^\\$ - ${_arg_DEFINES} - INCLUDES - $ - ${_arg_INCLUDES} - ) -endfunction() - -# Do not work on the source directory data -add_custom_command(TARGET unittest POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${CMAKE_CURRENT_SOURCE_DIR}/data" - "${CMAKE_CURRENT_BINARY_DIR}/data" -) - -extend_qtc_test(unittest - CONDITION TARGET GoogleBenchmark - DEPENDS GoogleBenchmark - SOURCES - smallstring-benchmark.cpp -) - -finalize_qtc_gtest(unittest - EXCLUDE_SOURCES_REGEX ".c$" - EXCLUDE_ALL_FROM_PRECHECK) - -# Path needs to be before CppEditor -target_include_directories(unittest - PRIVATE - BEFORE ../../../src/plugins -) - -# QmlDesigner tests - -set(QmlDesignerDir ../../../src/plugins/qmldesigner) -extend_qtc_test(unittest - INCLUDES - "${QmlDesignerDir}" - "${QmlDesignerDir}/designercore" - "${QmlDesignerDir}/designercore/include" - "${QmlDesignerDir}/designercore/imagecache" - "${QmlDesignerDir}/../../../src/libs/qmlpuppetcommunication/interfaces" - "${QmlDesignerDir}/../../../src/libs/qmlpuppetcommunication/types" - DEFINES - QMLDESIGNERCORE_STATIC_LIBRARY QMLDESIGNER_STATIC_LIBRARY - SOURCES_PREFIX - "${QmlDesignerDir}" - SOURCES - components/listmodeleditor/listmodeleditormodel.cpp components/listmodeleditor/listmodeleditormodel.h -) -extend_qtc_test(unittest - SOURCES_PREFIX "${QmlDesignerDir}/designercore" - SOURCES - ../../../../src/libs/qmlpuppetcommunication/interfaces/commondefines.h - ../components/listmodeleditor/listmodeleditormodel.cpp - ../components/listmodeleditor/listmodeleditormodel.h - exceptions/exception.cpp - exceptions/invalidargumentexception.cpp - exceptions/invalididexception.cpp - exceptions/invalidmetainfoexception.cpp - exceptions/invalidmodelnodeexception.cpp - exceptions/invalidmodelstateexception.cpp - exceptions/invalidpropertyexception.cpp - exceptions/invalidqmlsourceexception.cpp - exceptions/invalidreparentingexception.cpp - exceptions/invalidslideindexexception.cpp - exceptions/notimplementedexception.cpp - exceptions/removebasestateexception.cpp - exceptions/rewritingexception.cpp - imagecache/asynchronousexplicitimagecache.cpp - imagecache/asynchronousimagecache.cpp - imagecache/asynchronousimagefactory.cpp - imagecache/asynchronousimagefactory.h - imagecache/imagecachecollectorinterface.h - imagecache/imagecachegenerator.cpp - imagecache/imagecachegenerator.h - imagecache/imagecachegeneratorinterface.h - imagecache/imagecachestorage.h - imagecache/imagecachedispatchcollector.h - imagecache/imagecachestorageinterface.h - imagecache/synchronousimagecache.cpp - imagecache/timestampproviderinterface.h - include/abstractproperty.h - include/abstractview.h - include/asynchronousexplicitimagecache.h - include/asynchronousimagecache.h - include/asynchronousimagecacheinterface.h - include/bindingproperty.h - include/imagecacheauxiliarydata.h - include/import.h - include/itemlibraryinfo.h - include/metainfo.h - include/metainforeader.h - include/model.h - include/modelnode.h - include/nodeabstractproperty.h - include/nodelistproperty.h - include/nodemetainfo.h - include/nodeproperty.h - include/projectstorageids.h - include/propertymetainfo.h - include/propertycontainer.h - include/propertyparser.h - include/qmldesignercorelib_global.h - include/signalhandlerproperty.h - include/synchronousimagecache.h - include/variantproperty.h - metainfo/itemlibraryinfo.cpp - metainfo/metainfo.cpp - metainfo/metainforeader.cpp - metainfo/nodemetainfo.cpp - model/abstractproperty.cpp - model/abstractview.cpp - model/annotation.cpp - model/bindingproperty.cpp - model/import.cpp - model/internalbindingproperty.cpp - model/internalbindingproperty.h - model/internalnode.cpp - model/internalnode_p.h - model/internalnodeabstractproperty.cpp - model/internalnodeabstractproperty.h - model/internalnodelistproperty.cpp - model/internalnodelistproperty.h - model/internalnodeproperty.cpp - model/internalnodeproperty.h - model/internalproperty.cpp - model/internalproperty.h - model/internalsignalhandlerproperty.cpp - model/internalsignalhandlerproperty.h - model/internalvariantproperty.cpp - model/internalvariantproperty.h - model/model.cpp - model/model_p.h - model/modelnode.cpp - model/modelresourcemanagementinterface.h - model/modelresourcemanagement.cpp model/modelresourcemanagement.h - model/propertycontainer.cpp - model/propertyparser.cpp - model/nodeabstractproperty.cpp - model/nodelistproperty.cpp - model/nodeproperty.cpp - model/signalhandlerproperty.cpp - model/variantproperty.cpp - pluginmanager/widgetpluginmanager.h pluginmanager/widgetpluginmanager.cpp - pluginmanager/widgetpluginpath.h pluginmanager/widgetpluginpath.cpp - projectstorage/directorypathcompressor.h - projectstorage/filesysteminterface.h - projectstorage/filesystem.cpp projectstorage/filesystem.h - projectstorage/filestatus.h - projectstorage/filestatuscache.cpp projectstorage/filestatuscache.h - projectstorage/modulescanner.cpp projectstorage/modulescanner.h - projectstorage/nonlockingmutex.h - projectstorage/projectstorageexceptions.cpp projectstorage/projectstorageexceptions.h - projectstorage/projectstorageinterface.h - projectstorage/projectstorage.cpp projectstorage/projectstorage.h - projectstorage/projectstoragepathwatcher.h - projectstorage/projectstoragepathwatcherinterface.h - projectstorage/projectstoragepathwatchernotifierinterface.h - projectstorage/projectstoragesqlitefunctionregistry.cpp - projectstorage/projectstoragesqlitefunctionregistry.h - projectstorage/projectstoragepathwatcher.h - projectstorage/projectstoragepathwatchertypes.h - projectstorage/projectstoragetypes.h - projectstorage/projectstorageupdater.cpp projectstorage/projectstorageupdater.h - projectstorage/sourcepath.h - projectstorage/sourcepathcache.h - projectstorage/sourcepathcache.h - projectstorage/sourcepathcachetypes.h - projectstorage/sourcepathview.h - projectstorage/storagecache.h - projectstorage/storagecacheentry.h - projectstorage/storagecachefwd.h - projectstorage/qmldocumentparserinterface.h - projectstorage/qmltypesparserinterface.h - rewritertransaction.cpp - rewritertransaction.h - EXPLICIT_MOC - "../mockup/qmldesigner/designercore/include/nodeinstanceview.h" - "../mockup/qmldesigner/designercore/include/rewriterview.h" - "${QmlDesignerDir}/designercore/include/model.h" -) - -extend_qtc_test(unittest - SOURCES - directorypathcompressor-test.cpp - filesystemmock.h - filestatuscache-test.cpp - listmodeleditor-test.cpp - projectstorage-test.cpp - projectstorageupdater-test.cpp - projectstoragesqlitefunctionregistry-test.cpp - projectstoragepathwatchermock.h - projectstoragepathwatchernotifiermock.h - projectstoragepathwatcher-test.cpp - sourcepath-test.cpp - sourcepathcache-test.cpp - sourcepathcachemock.h - sourcepathview-test.cpp - storagecache-test.cpp - qmldocumentparsermock.h - qmltypesparsermock.h -) - -# QmlDesigner tests END - -if (NOT TARGET Utils) - add_subdirectory(../../../src/libs/utils ${CMAKE_CURRENT_BINARY_DIR}/utils) -endif() -if (NOT TARGET CPlusPlus) - add_subdirectory(../../../src/libs/3rdparty/cplusplus ${CMAKE_CURRENT_BINARY_DIR}/3rd_cplusplus) - add_subdirectory(../../../src/libs/cplusplus ${CMAKE_CURRENT_BINARY_DIR}/cplusplus) -endif() - -extend_qtc_test(unittest DEPENDS Utils CPlusPlus) - -extend_qtc_test(unittest - CONDITION TARGET Qt6::QmlDomPrivate AND TARGET Qt6::QmlCompilerPrivate AND Qt6_VERSION VERSION_GREATER_EQUAL 6.5.0 AND Qt6_VERSION VERSION_LESS 6.6.0 - DEPENDS Qt6::QmlDomPrivate Qt6::QmlCompilerPrivate - SOURCES - qmldocumentparser-test.cpp - qmltypesparser-test.cpp -) - -extend_qtc_test(unittest - CONDITION TARGET Qt6::QmlDomPrivate AND TARGET Qt6::QmlCompilerPrivate AND Qt6_VERSION VERSION_GREATER_EQUAL 6.5.0 AND Qt6_VERSION VERSION_LESS 6.6.0 - SOURCES_PREFIX "${QmlDesignerDir}/designercore" - DEPENDS Qt6::QmlDomPrivate Qt6::QmlCompilerPrivate - DEFINES QDS_BUILD_QMLPARSER - SOURCES - projectstorage/qmldocumentparser.cpp projectstorage/qmldocumentparser.h - projectstorage/qmltypesparser.cpp projectstorage/qmltypesparser.h -) - -file(GLOB PROJECTSTORAGE_EXCLUDED_SOURCES ${QmlDesignerDir}/designercore/projectstorage/*.cpp) -set_property(SOURCE ${PROJECTSTORAGE_EXCLUDED_SOURCES} PROPERTY SKIP_AUTOMOC ON) - -file(GLOB UNITTEST_EXCLUDED_SOURCES *.cpp) -set_property(SOURCE ${UNITTEST_EXCLUDED_SOURCES} PROPERTY SKIP_AUTOMOC ON) - -add_subdirectory(qmlprojectmanager) diff --git a/tests/unit/unittest/data/qml/Qt3D/Core/qmldir b/tests/unit/unittest/data/qml/Qt3D/Core/qmldir deleted file mode 100644 index 7c8712f946c..00000000000 --- a/tests/unit/unittest/data/qml/Qt3D/Core/qmldir +++ /dev/null @@ -1,8 +0,0 @@ -module Qt3D.Core -linktarget Qt6::quick3dcoreplugin -plugin quick3dcoreplugin -classname Qt3DQuick3DCorePlugin -typeinfo plugins.qmltypes -depends QtQuick auto -prefer :/qt-project.org/imports/Qt3D/Core/ - diff --git a/tests/unit/unittest/mockfutureinterface.h b/tests/unit/unittest/mockfutureinterface.h deleted file mode 100644 index a2601cd1ffa..00000000000 --- a/tests/unit/unittest/mockfutureinterface.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2018 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "googletest.h" - -class MockQFutureInterface -{ -public: - MOCK_METHOD1(setExpectedResultCount, - void (int)); - MOCK_METHOD1(setProgressValue, - void (int)); - MOCK_CONST_METHOD0(isRunning, - bool ()); - MOCK_METHOD0(reportFinished, - void ()); - -}; diff --git a/tests/unit/unittest/processcreator-test.cpp b/tests/unit/unittest/processcreator-test.cpp deleted file mode 100644 index 2aa3a615004..00000000000 --- a/tests/unit/unittest/processcreator-test.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "googletest.h" - -#include "eventspy.h" - -#include -#include -#include - -#include - -#include - -#include - -using testing::NotNull; - -using ClangBackEnd::ProcessCreator; -using ClangBackEnd::ProcessException; -using ClangBackEnd::ProcessStartedEvent; - -namespace { - -class ProcessCreator : public testing::Test -{ -protected: - void SetUp(); - -protected: - ::ProcessCreator processCreator; - QStringList m_arguments = {QStringLiteral("connectionName")}; -}; - -TEST_F(ProcessCreator, ProcessIsNotNull) -{ - auto future = processCreator.createProcess(); - auto process = future.get(); - - ASSERT_THAT(process.get(), NotNull()); -} - -TEST_F(ProcessCreator, ProcessIsRunning) -{ - auto future = processCreator.createProcess(); - auto process = future.get(); - - ASSERT_THAT(process->state(), QProcess::Running); -} - -TEST_F(ProcessCreator, ProcessPathIsNotExisting) -{ - processCreator.setProcessPath(Utils::HostOsInfo::withExecutableSuffix(ECHOSERVER"fail")); - - auto future = processCreator.createProcess(); - ASSERT_THROW(future.get(), ProcessException); -} - -TEST_F(ProcessCreator, ProcessStartIsSucessfull) -{ - auto future = processCreator.createProcess(); - ASSERT_NO_THROW(future.get()); -} - -TEST_F(ProcessCreator, ProcessObserverGetsEvent) -{ - EventSpy eventSpy(ProcessStartedEvent::ProcessStarted); - processCreator.setObserver(&eventSpy); - auto future = processCreator.createProcess(); - - eventSpy.waitForEvent(); -} - -TEST_F(ProcessCreator, TemporayPathIsSetForDefaultInitialization) -{ - QString path = processCreator.temporaryDirectory().path(); - - ASSERT_THAT(path.size(), Gt(0)); -} - -TEST_F(ProcessCreator, TemporayPathIsResetted) -{ - std::string oldPath = processCreator.temporaryDirectory().path().toStdString(); - - processCreator.resetTemporaryDirectory(); - - ASSERT_THAT(processCreator.temporaryDirectory().path().toStdString(), - AllOf(Not(IsEmpty()), Ne(oldPath))); -} - -void ProcessCreator::SetUp() -{ - processCreator.setTemporaryDirectoryPattern("process-XXXXXXX"); - processCreator.resetTemporaryDirectory(); - processCreator.setProcessPath(Utils::HostOsInfo::withExecutableSuffix(ECHOSERVER)); - processCreator.setArguments(m_arguments); -} -} From eaf43916601a1e8e879a73fbcd425680f116eda9 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 7 Jun 2023 15:26:58 +0200 Subject: [PATCH 070/149] UnitTests: Make test names more readable A majority prefers snake case for long names and because test names are describtive they have to be long. Change-Id: I898beb5c9f1b9ab7f7c285b6278454068744f5da Reviewed-by: Burak Hancerli Reviewed-by: Qt CI Bot Reviewed-by: Tim Jenssen --- tests/unit/README.md | 1 + .../asynchronousexplicitimagecache-test.cpp | 38 +- .../asynchronousimagecache-test.cpp | 68 +- .../asynchronousimagefactory-test.cpp | 16 +- .../imagecachedispatchcollector-test.cpp | 26 +- .../imagecache/imagecachegenerator-test.cpp | 66 +- .../imagecache/imagecachestorage-test.cpp | 108 +-- .../imagecache/synchronousimagecache-test.cpp | 38 +- .../listmodeleditor/listmodeleditor-test.cpp | 206 +++--- .../tests/unittests/model/import-test.cpp | 68 +- .../unit/tests/unittests/model/model-test.cpp | 98 +-- .../model/modelresourcemanagement-test.cpp | 58 +- .../unittests/model/nodelistproperty-test.cpp | 90 +-- .../directorypathcompressor-test.cpp | 10 +- .../projectstorage/filestatuscache-test.cpp | 44 +- .../projectstorage/modulescanner-test.cpp | 26 +- .../projectstorage/projectstorage-test.cpp | 646 +++++++++--------- .../projectstoragepathwatcher-test.cpp | 60 +- ...jectstoragesqlitefunctionregistry-test.cpp | 18 +- .../projectstorageupdater-test.cpp | 182 ++--- .../projectstorage/qmldocumentparser-test.cpp | 40 +- .../projectstorage/qmltypesparser-test.cpp | 38 +- .../projectstorage/sourcepath-test.cpp | 14 +- .../projectstorage/sourcepathcache-test.cpp | 100 +-- .../projectstorage/sourcepathview-test.cpp | 26 +- .../projectstorage/storagecache-test.cpp | 84 +-- .../qmlprojectmanager/converters-test.cpp | 4 +- .../qmlprojectmanager/projectitem-test.cpp | 162 ++--- .../createtablesqlstatementbuilder-test.cpp | 188 ++--- .../sqlite/lastchangedrowid-test.cpp | 96 +-- .../sqlite/sqlitealgorithms-test.cpp | 30 +- .../unittests/sqlite/sqlitecolumn-test.cpp | 16 +- .../unittests/sqlite/sqlitedatabase-test.cpp | 72 +- .../sqlite/sqlitedatabasebackend-test.cpp | 22 +- .../sqlite/sqlitefunctionregistry-test.cpp | 4 +- .../unittests/sqlite/sqliteindex-test.cpp | 12 +- .../unittests/sqlite/sqlitesessions-test.cpp | 82 +-- .../unittests/sqlite/sqlitestatement-test.cpp | 282 ++++---- .../unittests/sqlite/sqlitetable-test.cpp | 64 +- .../sqlite/sqlitetransaction-test.cpp | 70 +- .../unittests/sqlite/sqlitevalue-test.cpp | 120 ++-- .../sqlite/sqlstatementbuilder-test.cpp | 20 +- .../unittests/utils/matchingtext-test.cpp | 72 +- .../tests/unittests/utils/sizedarray-test.cpp | 30 +- .../unittests/utils/smallstring-test.cpp | 416 +++++------ 45 files changed, 1966 insertions(+), 1965 deletions(-) diff --git a/tests/unit/README.md b/tests/unit/README.md index eaf87af6e7c..80247b769a8 100644 --- a/tests/unit/README.md +++ b/tests/unit/README.md @@ -64,6 +64,7 @@ unittests (and integrationtests) * You can access test data from your test code with `UNITTEST_DIR` macro followed by `/data` path. * Name your test files as `foo-test.cpp`. * Always include `googletest.h` header. Without that you may get the printer function can be broken because the are not anymore ODR (because of weak linking to printers for example). It is also necessary for nice printers, also adds Qt known matchers. +* Use snake_case for the test name to improve readability for long sentences ## Building Tests diff --git a/tests/unit/tests/unittests/imagecache/asynchronousexplicitimagecache-test.cpp b/tests/unit/tests/unittests/imagecache/asynchronousexplicitimagecache-test.cpp index f054e8f6246..15d8f1dd7e5 100644 --- a/tests/unit/tests/unittests/imagecache/asynchronousexplicitimagecache-test.cpp +++ b/tests/unit/tests/unittests/imagecache/asynchronousexplicitimagecache-test.cpp @@ -26,7 +26,7 @@ protected: QImage smallImage1{1, 1, QImage::Format_ARGB32}; }; -TEST_F(AsynchronousExplicitImageCache, RequestImageFetchesImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_image_fetches_image_from_storage) { EXPECT_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml"), Eq(Sqlite::TimeStamp{}))) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -40,7 +40,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestImageFetchesImageFromStorage) notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestImageFetchesImageFromStorageWithTimeStamp) +TEST_F(AsynchronousExplicitImageCache, request_image_fetches_image_from_storage_with_time_stamp) { EXPECT_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml"), Eq(Sqlite::TimeStamp{}))) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -54,7 +54,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestImageFetchesImageFromStorageWithTi notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestImageCallsCaptureCallbackWithImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_image_calls_capture_callback_with_image_from_storage) { ON_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{image1})); @@ -69,7 +69,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestImageCallsCaptureCallbackWithImage notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestImageCallsAbortCallbackWithoutEntry) +TEST_F(AsynchronousExplicitImageCache, request_image_calls_abort_callback_without_entry) { ON_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{})); @@ -83,7 +83,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestImageCallsAbortCallbackWithoutEntr notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestImageCallsAbortCallbackWithoutImage) +TEST_F(AsynchronousExplicitImageCache, request_image_calls_abort_callback_without_image) { ON_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{QImage{}})); @@ -97,7 +97,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestImageCallsAbortCallbackWithoutImag notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageFetchesMidSizeImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_mid_size_image_fetches_mid_size_image_from_storage) { EXPECT_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml"), Eq(Sqlite::TimeStamp{}))) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -111,7 +111,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageFetchesMidSizeImageFro notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageCallsCaptureCallbackWithImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_mid_size_image_calls_capture_callback_with_image_from_storage) { ON_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{midSizeImage1})); @@ -126,7 +126,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageCallsCaptureCallbackWi notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageCallsAbortCallbackWithoutEntry) +TEST_F(AsynchronousExplicitImageCache, request_mid_size_image_calls_abort_callback_without_entry) { ON_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{})); @@ -140,7 +140,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageCallsAbortCallbackWith notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageCallsAbortCallbackWithoutMidSizeImage) +TEST_F(AsynchronousExplicitImageCache, request_mid_size_image_calls_abort_callback_without_mid_size_image) { ON_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{QImage{}})); @@ -154,7 +154,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageCallsAbortCallbackWith notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestSmallImageFetchesSmallImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_small_image_fetches_small_image_from_storage) { EXPECT_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml"), Eq(Sqlite::TimeStamp{}))) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -168,7 +168,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestSmallImageFetchesSmallImageFromSto notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestSmallImageCallsCaptureCallbackWithImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_small_image_calls_capture_callback_with_image_from_storage) { ON_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{smallImage1})); @@ -183,7 +183,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestSmallImageCallsCaptureCallbackWith notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestSmallImageCallsAbortCallbackWithoutEntry) +TEST_F(AsynchronousExplicitImageCache, request_small_image_calls_abort_callback_without_entry) { ON_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{})); @@ -197,7 +197,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestSmallImageCallsAbortCallbackWithou notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestSmallImageCallsAbortCallbackWithoutSmallImage) +TEST_F(AsynchronousExplicitImageCache, request_small_image_calls_abort_callback_without_small_image) { ON_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{QImage{}})); @@ -211,7 +211,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestSmallImageCallsAbortCallbackWithou notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, CleanRemovesEntries) +TEST_F(AsynchronousExplicitImageCache, clean_removes_entries) { ON_CALL(mockStorage, fetchSmallImage(_, _)).WillByDefault([&](Utils::SmallStringView, auto) { return QmlDesigner::ImageCacheStorageInterface::ImageEntry{smallImage1}; @@ -230,7 +230,7 @@ TEST_F(AsynchronousExplicitImageCache, CleanRemovesEntries) waitInThread.notify(); } -TEST_F(AsynchronousExplicitImageCache, CleanCallsAbort) +TEST_F(AsynchronousExplicitImageCache, clean_calls_abort) { ON_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component1.qml"), _)) .WillByDefault([&](Utils::SmallStringView, auto) { @@ -250,7 +250,7 @@ TEST_F(AsynchronousExplicitImageCache, CleanCallsAbort) waitInThread.notify(); } -TEST_F(AsynchronousExplicitImageCache, AfterCleanNewJobsWorks) +TEST_F(AsynchronousExplicitImageCache, after_clean_new_jobs_works) { cache.clean(); @@ -266,7 +266,7 @@ TEST_F(AsynchronousExplicitImageCache, AfterCleanNewJobsWorks) notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestImageWithExtraIdFetchesImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_image_with_extra_id_fetches_image_from_storage) { EXPECT_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml+extraId1"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -281,7 +281,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestImageWithExtraIdFetchesImageFromSt notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageWithExtraIdFetchesImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_mid_size_image_with_extra_id_fetches_image_from_storage) { EXPECT_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml+extraId1"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -296,7 +296,7 @@ TEST_F(AsynchronousExplicitImageCache, RequestMidSizeImageWithExtraIdFetchesImag notification.wait(); } -TEST_F(AsynchronousExplicitImageCache, RequestSmallImageWithExtraIdFetchesImageFromStorage) +TEST_F(AsynchronousExplicitImageCache, request_small_image_with_extra_id_fetches_image_from_storage) { EXPECT_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml+extraId1"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { diff --git a/tests/unit/tests/unittests/imagecache/asynchronousimagecache-test.cpp b/tests/unit/tests/unittests/imagecache/asynchronousimagecache-test.cpp index 1d14271f5ed..e7c51c40fc4 100644 --- a/tests/unit/tests/unittests/imagecache/asynchronousimagecache-test.cpp +++ b/tests/unit/tests/unittests/imagecache/asynchronousimagecache-test.cpp @@ -28,7 +28,7 @@ protected: QImage smallImage1{1, 1, QImage::Format_ARGB32}; }; -TEST_F(AsynchronousImageCache, RequestImageFetchesImageFromStorage) +TEST_F(AsynchronousImageCache, request_image_fetches_image_from_storage) { EXPECT_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -42,7 +42,7 @@ TEST_F(AsynchronousImageCache, RequestImageFetchesImageFromStorage) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageFetchesImageFromStorageWithTimeStamp) +TEST_F(AsynchronousImageCache, request_image_fetches_image_from_storage_with_time_stamp) { EXPECT_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillRepeatedly(Return(Sqlite::TimeStamp{123})); @@ -58,7 +58,7 @@ TEST_F(AsynchronousImageCache, RequestImageFetchesImageFromStorageWithTimeStamp) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageCallsCaptureCallbackWithImageFromStorage) +TEST_F(AsynchronousImageCache, request_image_calls_capture_callback_with_image_from_storage) { ON_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{image1})); @@ -73,7 +73,7 @@ TEST_F(AsynchronousImageCache, RequestImageCallsCaptureCallbackWithImageFromStor notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageCallsAbortCallbackWithoutImage) +TEST_F(AsynchronousImageCache, request_image_calls_abort_callback_without_image) { ON_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{QImage{}})); @@ -87,7 +87,7 @@ TEST_F(AsynchronousImageCache, RequestImageCallsAbortCallbackWithoutImage) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_image_request_image_from_generator) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{123})); @@ -102,7 +102,7 @@ TEST_F(AsynchronousImageCache, RequestImageRequestImageFromGenerator) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageCallsCaptureCallbackWithImageFromGenerator) +TEST_F(AsynchronousImageCache, request_image_calls_capture_callback_with_image_from_generator) { ON_CALL(mockGenerator, generateImage(Eq("/path/to/Component.qml"), _, _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto &&callback, auto, auto) { @@ -118,7 +118,7 @@ TEST_F(AsynchronousImageCache, RequestImageCallsCaptureCallbackWithImageFromGene notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageCallsAbortCallbackFromGenerator) +TEST_F(AsynchronousImageCache, request_image_calls_abort_callback_from_generator) { ON_CALL(mockGenerator, generateImage(Eq("/path/to/Component.qml"), _, _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto &&, auto &&abortCallback, auto) { @@ -134,7 +134,7 @@ TEST_F(AsynchronousImageCache, RequestImageCallsAbortCallbackFromGenerator) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageFetchesMidSizeImageFromStorage) +TEST_F(AsynchronousImageCache, request_mid_size_image_fetches_mid_size_image_from_storage) { EXPECT_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -148,7 +148,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageFetchesMidSizeImageFromStorage notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageFetchesMidSizeImageFromStorageWithTimeStamp) +TEST_F(AsynchronousImageCache, request_mid_size_image_fetches_mid_size_image_from_storage_with_time_stamp) { EXPECT_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillRepeatedly(Return(Sqlite::TimeStamp{123})); @@ -165,7 +165,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageFetchesMidSizeImageFromStorage notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageCallsCaptureCallbackWithImageFromStorage) +TEST_F(AsynchronousImageCache, request_mid_size_image_calls_capture_callback_with_image_from_storage) { ON_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{smallImage1})); @@ -180,7 +180,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageCallsCaptureCallbackWithImageF notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageCallsAbortCallbackWithoutMidSizeImage) +TEST_F(AsynchronousImageCache, request_mid_size_image_calls_abort_callback_without_mid_size_image) { ON_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{QImage{}})); @@ -194,7 +194,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageCallsAbortCallbackWithoutMidSi notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_mid_size_image_request_image_from_generator) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{123})); @@ -209,7 +209,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageRequestImageFromGenerator) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageCallsCaptureCallbackWithImageFromGenerator) +TEST_F(AsynchronousImageCache, request_mid_size_image_calls_capture_callback_with_image_from_generator) { ON_CALL(mockGenerator, generateImage(Eq("/path/to/Component.qml"), _, _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto &&callback, auto, auto) { @@ -225,7 +225,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageCallsCaptureCallbackWithImageF notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageCallsAbortCallbackFromGenerator) +TEST_F(AsynchronousImageCache, request_mid_size_image_calls_abort_callback_from_generator) { ON_CALL(mockGenerator, generateImage(Eq("/path/to/Component.qml"), _, _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto &&, auto &&abortCallback, auto) { @@ -241,7 +241,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageCallsAbortCallbackFromGenerato notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageFetchesSmallImageFromStorage) +TEST_F(AsynchronousImageCache, request_small_image_fetches_small_image_from_storage) { EXPECT_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -255,7 +255,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageFetchesSmallImageFromStorage) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageFetchesSmallImageFromStorageWithTimeStamp) +TEST_F(AsynchronousImageCache, request_small_image_fetches_small_image_from_storage_with_time_stamp) { EXPECT_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillRepeatedly(Return(Sqlite::TimeStamp{123})); @@ -271,7 +271,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageFetchesSmallImageFromStorageWith notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageCallsCaptureCallbackWithImageFromStorage) +TEST_F(AsynchronousImageCache, request_small_image_calls_capture_callback_with_image_from_storage) { ON_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{smallImage1})); @@ -286,7 +286,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageCallsCaptureCallbackWithImageFro notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageCallsAbortCallbackWithoutSmallImage) +TEST_F(AsynchronousImageCache, request_small_image_calls_abort_callback_without_small_image) { ON_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml"), _)) .WillByDefault(Return(QmlDesigner::ImageCacheStorageInterface::ImageEntry{QImage{}})); @@ -300,7 +300,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageCallsAbortCallbackWithoutSmallIm notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_small_image_request_image_from_generator) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{123})); @@ -315,7 +315,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageRequestImageFromGenerator) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageCallsCaptureCallbackWithImageFromGenerator) +TEST_F(AsynchronousImageCache, request_small_image_calls_capture_callback_with_image_from_generator) { ON_CALL(mockGenerator, generateImage(Eq("/path/to/Component.qml"), _, _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto &&callback, auto, auto) { @@ -331,7 +331,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageCallsCaptureCallbackWithImageFro notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageCallsAbortCallbackFromGenerator) +TEST_F(AsynchronousImageCache, request_small_image_calls_abort_callback_from_generator) { ON_CALL(mockGenerator, generateImage(Eq("/path/to/Component.qml"), _, _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto &&, auto &&abortCallback, auto) { @@ -347,7 +347,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageCallsAbortCallbackFromGenerator) notification.wait(); } -TEST_F(AsynchronousImageCache, CleanRemovesEntries) +TEST_F(AsynchronousImageCache, clean_removes_entries) { EXPECT_CALL(mockGenerator, generateImage(_, _, _, _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto &&captureCallback, auto &&, auto) { @@ -367,7 +367,7 @@ TEST_F(AsynchronousImageCache, CleanRemovesEntries) waitInThread.notify(); } -TEST_F(AsynchronousImageCache, CleanCallsAbort) +TEST_F(AsynchronousImageCache, clean_calls_abort) { ON_CALL(mockGenerator, generateImage(_, _, _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto, auto &&, auto) { waitInThread.wait(); }); @@ -388,14 +388,14 @@ TEST_F(AsynchronousImageCache, CleanCallsAbort) waitInThread.notify(); } -TEST_F(AsynchronousImageCache, CleanCallsGeneratorClean) +TEST_F(AsynchronousImageCache, clean_calls_generator_clean) { EXPECT_CALL(mockGenerator, clean()).Times(AtLeast(1)); cache.clean(); } -TEST_F(AsynchronousImageCache, AfterCleanNewJobsWorks) +TEST_F(AsynchronousImageCache, after_clean_new_jobs_works) { cache.clean(); @@ -408,7 +408,7 @@ TEST_F(AsynchronousImageCache, AfterCleanNewJobsWorks) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageWithExtraIdFetchesImageFromStorage) +TEST_F(AsynchronousImageCache, request_image_with_extra_id_fetches_image_from_storage) { EXPECT_CALL(mockStorage, fetchImage(Eq("/path/to/Component.qml+extraId1"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -423,7 +423,7 @@ TEST_F(AsynchronousImageCache, RequestImageWithExtraIdFetchesImageFromStorage) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageWithExtraIdFetchesImageFromStorage) +TEST_F(AsynchronousImageCache, request_mid_size_image_with_extra_id_fetches_image_from_storage) { EXPECT_CALL(mockStorage, fetchMidSizeImage(Eq("/path/to/Component.qml+extraId1"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -438,7 +438,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageWithExtraIdFetchesImageFromSto notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageWithExtraIdFetchesImageFromStorage) +TEST_F(AsynchronousImageCache, request_small_image_with_extra_id_fetches_image_from_storage) { EXPECT_CALL(mockStorage, fetchSmallImage(Eq("/path/to/Component.qml+extraId1"), _)) .WillRepeatedly([&](Utils::SmallStringView, auto) { @@ -453,7 +453,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageWithExtraIdFetchesImageFromStora notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageWithExtraIdRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_image_with_extra_id_request_image_from_generator) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{123})); @@ -470,7 +470,7 @@ TEST_F(AsynchronousImageCache, RequestImageWithExtraIdRequestImageFromGenerator) notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageWithExtraIdRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_mid_size_image_with_extra_id_request_image_from_generator) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{123})); @@ -487,7 +487,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageWithExtraIdRequestImageFromGen notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageWithExtraIdRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_small_image_with_extra_id_request_image_from_generator) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{123})); @@ -504,7 +504,7 @@ TEST_F(AsynchronousImageCache, RequestSmallImageWithExtraIdRequestImageFromGener notification.wait(); } -TEST_F(AsynchronousImageCache, RequestImageWithAuxiliaryDataRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_image_with_auxiliary_data_request_image_from_generator) { using QmlDesigner::ImageCache::FontCollectorSizesAuxiliaryData; std::vector sizes{{20, 11}}; @@ -532,7 +532,7 @@ TEST_F(AsynchronousImageCache, RequestImageWithAuxiliaryDataRequestImageFromGene notification.wait(); } -TEST_F(AsynchronousImageCache, RequestMidSizeImageWithAuxiliaryDataRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_mid_size_image_with_auxiliary_data_request_image_from_generator) { using QmlDesigner::ImageCache::FontCollectorSizesAuxiliaryData; std::vector sizes{{20, 11}}; @@ -560,7 +560,7 @@ TEST_F(AsynchronousImageCache, RequestMidSizeImageWithAuxiliaryDataRequestImageF notification.wait(); } -TEST_F(AsynchronousImageCache, RequestSmallImageWithAuxiliaryDataRequestImageFromGenerator) +TEST_F(AsynchronousImageCache, request_small_image_with_auxiliary_data_request_image_from_generator) { using QmlDesigner::ImageCache::FontCollectorSizesAuxiliaryData; std::vector sizes{{20, 11}}; diff --git a/tests/unit/tests/unittests/imagecache/asynchronousimagefactory-test.cpp b/tests/unit/tests/unittests/imagecache/asynchronousimagefactory-test.cpp index c8eaf5c6447..e98f0d70e52 100644 --- a/tests/unit/tests/unittests/imagecache/asynchronousimagefactory-test.cpp +++ b/tests/unit/tests/unittests/imagecache/asynchronousimagefactory-test.cpp @@ -36,7 +36,7 @@ protected: QImage smallImage1{1, 1, QImage::Format_ARGB32}; }; -TEST_F(AsynchronousImageFactory, RequestImageRequestImageFromCollector) +TEST_F(AsynchronousImageFactory, request_image_request_image_from_collector) { EXPECT_CALL(collectorMock, start(Eq("/path/to/Component.qml"), @@ -50,7 +50,7 @@ TEST_F(AsynchronousImageFactory, RequestImageRequestImageFromCollector) notification.wait(); } -TEST_F(AsynchronousImageFactory, RequestImageWithExtraIdRequestImageFromCollector) +TEST_F(AsynchronousImageFactory, request_image_with_extra_id_request_image_from_collector) { EXPECT_CALL(collectorMock, start(Eq("/path/to/Component.qml"), @@ -64,7 +64,7 @@ TEST_F(AsynchronousImageFactory, RequestImageWithExtraIdRequestImageFromCollecto notification.wait(); } -TEST_F(AsynchronousImageFactory, RequestImageWithAuxiliaryDataRequestImageFromCollector) +TEST_F(AsynchronousImageFactory, request_image_with_auxiliary_data_request_image_from_collector) { std::vector sizes{{20, 11}}; @@ -88,7 +88,7 @@ TEST_F(AsynchronousImageFactory, RequestImageWithAuxiliaryDataRequestImageFromCo notification.wait(); } -TEST_F(AsynchronousImageFactory, DontRequestImageRequestImageFromCollectorIfFileWasUpdatedRecently) +TEST_F(AsynchronousImageFactory, dont_request_image_request_image_from_collector_if_file_was_updated_recently) { ON_CALL(storageMock, fetchModifiedImageTime(Eq("/path/to/Component.qml"))).WillByDefault([&](auto) { notification.notify(); @@ -105,7 +105,7 @@ TEST_F(AsynchronousImageFactory, DontRequestImageRequestImageFromCollectorIfFile notification.wait(); } -TEST_F(AsynchronousImageFactory, RequestImageRequestImageFromCollectorIfFileWasNotUpdatedRecently) +TEST_F(AsynchronousImageFactory, request_image_request_image_from_collector_if_file_was_not_updated_recently) { ON_CALL(storageMock, fetchModifiedImageTime(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{123})); @@ -121,7 +121,7 @@ TEST_F(AsynchronousImageFactory, RequestImageRequestImageFromCollectorIfFileWasN notification.wait(); } -TEST_F(AsynchronousImageFactory, CleanRemovesEntries) +TEST_F(AsynchronousImageFactory, clean_removes_entries) { EXPECT_CALL(collectorMock, start(Eq("/path/to/Component1.qml"), _, _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto, auto) { waitInThread.wait(); }); @@ -134,7 +134,7 @@ TEST_F(AsynchronousImageFactory, CleanRemovesEntries) waitInThread.notify(); } -TEST_F(AsynchronousImageFactory, AfterCleanNewJobsWorks) +TEST_F(AsynchronousImageFactory, after_clean_new_jobs_works) { factory.clean(); @@ -150,7 +150,7 @@ TEST_F(AsynchronousImageFactory, AfterCleanNewJobsWorks) notification.wait(); } -TEST_F(AsynchronousImageFactory, CaptureImageCallbackStoresImage) +TEST_F(AsynchronousImageFactory, capture_image_callback_stores_image) { ON_CALL(storageMock, fetchModifiedImageTime(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{123})); diff --git a/tests/unit/tests/unittests/imagecache/imagecachedispatchcollector-test.cpp b/tests/unit/tests/unittests/imagecache/imagecachedispatchcollector-test.cpp index db0dad3052d..8d459916ffc 100644 --- a/tests/unit/tests/unittests/imagecache/imagecachedispatchcollector-test.cpp +++ b/tests/unit/tests/unittests/imagecache/imagecachedispatchcollector-test.cpp @@ -61,7 +61,7 @@ protected: QIcon icon2{QPixmap::fromImage(image2)}; }; -TEST_F(ImageCacheDispatchCollector, CallQmlCollectorStart) +TEST_F(ImageCacheDispatchCollector, call_qml_collector_start) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair( @@ -107,7 +107,7 @@ TEST_F(ImageCacheDispatchCollector, CallQmlCollectorStart) abortCallbackMock.AsStdFunction()); } -TEST_F(ImageCacheDispatchCollector, CallUiFileCollectorStart) +TEST_F(ImageCacheDispatchCollector, call_ui_file_collector_start) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -143,7 +143,7 @@ TEST_F(ImageCacheDispatchCollector, CallUiFileCollectorStart) abortCallbackMock.AsStdFunction()); } -TEST_F(ImageCacheDispatchCollector, DontCallCollectorStartForUnknownFile) +TEST_F(ImageCacheDispatchCollector, dont_call_collector_start_for_unknown_file) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -165,7 +165,7 @@ TEST_F(ImageCacheDispatchCollector, DontCallCollectorStartForUnknownFile) abortCallbackMock.AsStdFunction()); } -TEST_F(ImageCacheDispatchCollector, CallFirstCollectorCreateIcon) +TEST_F(ImageCacheDispatchCollector, call_first_collector_create_icon) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -184,7 +184,7 @@ TEST_F(ImageCacheDispatchCollector, CallFirstCollectorCreateIcon) ASSERT_THAT(icon, IsIcon(icon1)); } -TEST_F(ImageCacheDispatchCollector, FirstCollectorCreateIconCalls) +TEST_F(ImageCacheDispatchCollector, first_collector_create_icon_calls) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -211,7 +211,7 @@ TEST_F(ImageCacheDispatchCollector, FirstCollectorCreateIconCalls) FontCollectorSizesAuxiliaryData{sizes, "color", "text"}); } -TEST_F(ImageCacheDispatchCollector, CallSecondCollectorCreateIcon) +TEST_F(ImageCacheDispatchCollector, call_second_collector_create_icon) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -230,7 +230,7 @@ TEST_F(ImageCacheDispatchCollector, CallSecondCollectorCreateIcon) ASSERT_THAT(icon, IsIcon(icon2)); } -TEST_F(ImageCacheDispatchCollector, SecondCollectorCreateIconCalls) +TEST_F(ImageCacheDispatchCollector, second_collector_create_icon_calls) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -257,7 +257,7 @@ TEST_F(ImageCacheDispatchCollector, SecondCollectorCreateIconCalls) FontCollectorSizesAuxiliaryData{sizes, "color", "text"}); } -TEST_F(ImageCacheDispatchCollector, DontCallCollectorCreateIconForUnknownFile) +TEST_F(ImageCacheDispatchCollector, dont_call_collector_create_icon_for_unknown_file) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -276,7 +276,7 @@ TEST_F(ImageCacheDispatchCollector, DontCallCollectorCreateIconForUnknownFile) ASSERT_TRUE(icon.isNull()); } -TEST_F(ImageCacheDispatchCollector, CallFirstCollectorCreateImage) +TEST_F(ImageCacheDispatchCollector, call_first_collector_create_image) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -295,7 +295,7 @@ TEST_F(ImageCacheDispatchCollector, CallFirstCollectorCreateImage) ASSERT_THAT(image, IsImage(image1, midSizeImage1, smallImage1)); } -TEST_F(ImageCacheDispatchCollector, FirstCollectorCreateImageCalls) +TEST_F(ImageCacheDispatchCollector, first_collector_create_image_calls) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -322,7 +322,7 @@ TEST_F(ImageCacheDispatchCollector, FirstCollectorCreateImageCalls) FontCollectorSizesAuxiliaryData{sizes, "color", "text"}); } -TEST_F(ImageCacheDispatchCollector, CallSecondCollectorCreateImage) +TEST_F(ImageCacheDispatchCollector, call_second_collector_create_image) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -341,7 +341,7 @@ TEST_F(ImageCacheDispatchCollector, CallSecondCollectorCreateImage) ASSERT_THAT(image, IsImage(image2, midSizeImage2, smallImage2)); } -TEST_F(ImageCacheDispatchCollector, SecondCollectorCreateImageCalls) +TEST_F(ImageCacheDispatchCollector, second_collector_create_image_calls) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, @@ -368,7 +368,7 @@ TEST_F(ImageCacheDispatchCollector, SecondCollectorCreateImageCalls) FontCollectorSizesAuxiliaryData{sizes, "color", "text"}); } -TEST_F(ImageCacheDispatchCollector, DontCallCollectorCreateImageForUnknownFile) +TEST_F(ImageCacheDispatchCollector, dont_call_collector_create_image_for_unknown_file) { QmlDesigner::ImageCacheDispatchCollector collector{std::make_tuple( std::make_pair([](Utils::SmallStringView, diff --git a/tests/unit/tests/unittests/imagecache/imagecachegenerator-test.cpp b/tests/unit/tests/unittests/imagecache/imagecachegenerator-test.cpp index 2594e4b1ef6..dfbcdee3dd0 100644 --- a/tests/unit/tests/unittests/imagecache/imagecachegenerator-test.cpp +++ b/tests/unit/tests/unittests/imagecache/imagecachegenerator-test.cpp @@ -41,7 +41,7 @@ protected: QmlDesigner::ImageCacheGenerator generator{collectorMock, storageMock}; }; -TEST_F(ImageCacheGenerator, CallsCollectorWithCaptureCallback) +TEST_F(ImageCacheGenerator, calls_collector_with_capture_callback) { EXPECT_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto captureCallback, auto) { @@ -55,7 +55,7 @@ TEST_F(ImageCacheGenerator, CallsCollectorWithCaptureCallback) notification.wait(); } -TEST_F(ImageCacheGenerator, CallsCollectorOnlyIfNotProcessing) +TEST_F(ImageCacheGenerator, calls_collector_only_if_not_processing) { EXPECT_CALL(collectorMock, start(AnyOf(Eq("name"), Eq("name2")), _, _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto, auto) { notification.notify(); }); @@ -65,7 +65,7 @@ TEST_F(ImageCacheGenerator, CallsCollectorOnlyIfNotProcessing) notification.wait(2); } -TEST_F(ImageCacheGenerator, ProcessTaskAfterFirstFinished) +TEST_F(ImageCacheGenerator, process_task_after_first_finished) { ON_CALL(imageCallbackMock, Call(_, _, _)) .WillByDefault([&](const QImage &, const QImage &, const QImage &) { notification.notify(); }); @@ -84,7 +84,7 @@ TEST_F(ImageCacheGenerator, ProcessTaskAfterFirstFinished) notification.wait(2); } -TEST_F(ImageCacheGenerator, DontCrashAtDestructingGenerator) +TEST_F(ImageCacheGenerator, dont_crash_at_destructing_generator) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -101,7 +101,7 @@ TEST_F(ImageCacheGenerator, DontCrashAtDestructingGenerator) "name4", {}, {}, imageCallbackMock.AsStdFunction(), abortCallbackMock.AsStdFunction(), {}); } -TEST_F(ImageCacheGenerator, StoreImage) +TEST_F(ImageCacheGenerator, store_image) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -120,7 +120,7 @@ TEST_F(ImageCacheGenerator, StoreImage) notification.wait(); } -TEST_F(ImageCacheGenerator, StoreImageWithExtraId) +TEST_F(ImageCacheGenerator, store_image_with_extra_id) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -139,7 +139,7 @@ TEST_F(ImageCacheGenerator, StoreImageWithExtraId) notification.wait(); } -TEST_F(ImageCacheGenerator, StoreNullImage) +TEST_F(ImageCacheGenerator, store_null_image) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -156,7 +156,7 @@ TEST_F(ImageCacheGenerator, StoreNullImage) notification.wait(); } -TEST_F(ImageCacheGenerator, StoreNullImageWithExtraId) +TEST_F(ImageCacheGenerator, store_null_image_with_extra_id) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -180,7 +180,7 @@ TEST_F(ImageCacheGenerator, StoreNullImageWithExtraId) notification.wait(); } -TEST_F(ImageCacheGenerator, AbortCallback) +TEST_F(ImageCacheGenerator, abort_callback) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -203,7 +203,7 @@ TEST_F(ImageCacheGenerator, AbortCallback) notification.wait(2); } -TEST_F(ImageCacheGenerator, StoreNullImageForAbortCallbackAbort) +TEST_F(ImageCacheGenerator, store_null_image_for_abort_callback_abort) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto, auto abortCallback) { @@ -220,7 +220,7 @@ TEST_F(ImageCacheGenerator, StoreNullImageForAbortCallbackAbort) notification.wait(); } -TEST_F(ImageCacheGenerator, DontStoreNullImageForAbortCallbackFailed) +TEST_F(ImageCacheGenerator, dont_store_null_image_for_abort_callback_failed) { ON_CALL(collectorMock, start(_, _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto, auto abortCallback) { @@ -237,7 +237,7 @@ TEST_F(ImageCacheGenerator, DontStoreNullImageForAbortCallbackFailed) notification.wait(); } -TEST_F(ImageCacheGenerator, AbortForNullImage) +TEST_F(ImageCacheGenerator, abort_for_null_image) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -252,7 +252,7 @@ TEST_F(ImageCacheGenerator, AbortForNullImage) notification.wait(); } -TEST_F(ImageCacheGenerator, CallImageCallbackIfSmallImageIsNotNull) +TEST_F(ImageCacheGenerator, call_image_callback_if_small_image_is_not_null) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -267,7 +267,7 @@ TEST_F(ImageCacheGenerator, CallImageCallbackIfSmallImageIsNotNull) notification.wait(); } -TEST_F(ImageCacheGenerator, StoreImageIfSmallImageIsNotNull) +TEST_F(ImageCacheGenerator, store_image_if_small_image_is_not_null) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -282,7 +282,7 @@ TEST_F(ImageCacheGenerator, StoreImageIfSmallImageIsNotNull) notification.wait(); } -TEST_F(ImageCacheGenerator, CallImageCallbackIfMidSizeImageIsNotNull) +TEST_F(ImageCacheGenerator, call_image_callback_if_mid_size_image_is_not_null) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -297,7 +297,7 @@ TEST_F(ImageCacheGenerator, CallImageCallbackIfMidSizeImageIsNotNull) notification.wait(); } -TEST_F(ImageCacheGenerator, StoreImageIfMidSizeImageIsNotNull) +TEST_F(ImageCacheGenerator, store_image_if_mid_size_image_is_not_null) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -312,7 +312,7 @@ TEST_F(ImageCacheGenerator, StoreImageIfMidSizeImageIsNotNull) notification.wait(); } -TEST_F(ImageCacheGenerator, CallImageCallbackIfImageIsNotNull) +TEST_F(ImageCacheGenerator, call_image_callback_if_image_is_not_null) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault( @@ -326,7 +326,7 @@ TEST_F(ImageCacheGenerator, CallImageCallbackIfImageIsNotNull) notification.wait(); } -TEST_F(ImageCacheGenerator, StoreImageIfImageIsNotNull) +TEST_F(ImageCacheGenerator, store_image_if_image_is_not_null) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault( @@ -340,7 +340,7 @@ TEST_F(ImageCacheGenerator, StoreImageIfImageIsNotNull) notification.wait(); } -TEST_F(ImageCacheGenerator, CallWalCheckpointFullIfQueueIsEmpty) +TEST_F(ImageCacheGenerator, call_wal_checkpoint_full_if_queue_is_empty) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault( @@ -355,7 +355,7 @@ TEST_F(ImageCacheGenerator, CallWalCheckpointFullIfQueueIsEmpty) notification.wait(); } -TEST_F(ImageCacheGenerator, CleanIsCallingAbortCallback) +TEST_F(ImageCacheGenerator, clean_is_calling_abort_callback) { ON_CALL(collectorMock, start(_, _, _, _, _)).WillByDefault([&](auto, auto, auto, auto, auto) { notification.wait(); @@ -374,7 +374,7 @@ TEST_F(ImageCacheGenerator, CleanIsCallingAbortCallback) waitInThread.wait(); } -TEST_F(ImageCacheGenerator, WaitForFinished) +TEST_F(ImageCacheGenerator, wait_for_finished) { ON_CALL(collectorMock, start(Eq("name"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto captureCallback, auto) { @@ -397,7 +397,7 @@ TEST_F(ImageCacheGenerator, WaitForFinished) generator.waitForFinished(); } -TEST_F(ImageCacheGenerator, CallsCollectorWithExtraId) +TEST_F(ImageCacheGenerator, calls_collector_with_extra_id) { EXPECT_CALL(collectorMock, start(Eq("name"), Eq("extraId1"), _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto, auto) { notification.notify(); }); @@ -406,7 +406,7 @@ TEST_F(ImageCacheGenerator, CallsCollectorWithExtraId) notification.wait(); } -TEST_F(ImageCacheGenerator, CallsCollectorWithAuxiliaryData) +TEST_F(ImageCacheGenerator, calls_collector_with_auxiliary_data) { using QmlDesigner::ImageCache::FontCollectorSizesAuxiliaryData; std::vector sizes{{20, 11}}; @@ -431,7 +431,7 @@ TEST_F(ImageCacheGenerator, CallsCollectorWithAuxiliaryData) notification.wait(); } -TEST_F(ImageCacheGenerator, MergeTasks) +TEST_F(ImageCacheGenerator, merge_tasks) { EXPECT_CALL(collectorMock, start(Eq("waitDummy"), _, _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto, auto) { waitInThread.wait(); }); @@ -448,7 +448,7 @@ TEST_F(ImageCacheGenerator, MergeTasks) notification.wait(); } -TEST_F(ImageCacheGenerator, DontMergeTasksWithDifferentId) +TEST_F(ImageCacheGenerator, dont_merge_tasks_with_different_id) { EXPECT_CALL(collectorMock, start(Eq("waitDummy"), _, _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto, auto) { waitInThread.wait(); }); @@ -465,7 +465,7 @@ TEST_F(ImageCacheGenerator, DontMergeTasksWithDifferentId) notification.wait(2); } -TEST_F(ImageCacheGenerator, MergeTasksWithSameExtraId) +TEST_F(ImageCacheGenerator, merge_tasks_with_same_extra_id) { EXPECT_CALL(collectorMock, start(Eq("waitDummy"), _, _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto, auto) { waitInThread.wait(); }); @@ -482,7 +482,7 @@ TEST_F(ImageCacheGenerator, MergeTasksWithSameExtraId) notification.wait(); } -TEST_F(ImageCacheGenerator, DontMergeTasksWithDifferentExtraId) +TEST_F(ImageCacheGenerator, dont_merge_tasks_with_different_extra_id) { EXPECT_CALL(collectorMock, start(Eq("waitDummy"), _, _, _, _)) .WillRepeatedly([&](auto, auto, auto, auto, auto) { waitInThread.wait(); }); @@ -498,7 +498,7 @@ TEST_F(ImageCacheGenerator, DontMergeTasksWithDifferentExtraId) notification.wait(2); } -TEST_F(ImageCacheGenerator, UseLastTimeStampIfTasksAreMerged) +TEST_F(ImageCacheGenerator, use_last_time_stamp_if_tasks_are_merged) { ON_CALL(collectorMock, start(Eq("waitDummy"), _, _, _, _)) .WillByDefault([&](auto, auto, auto, auto, auto) { waitInThread.wait(); }); @@ -519,7 +519,7 @@ TEST_F(ImageCacheGenerator, UseLastTimeStampIfTasksAreMerged) notification.wait(); } -TEST_F(ImageCacheGenerator, MergeCaptureCallbackIfTasksAreMerged) +TEST_F(ImageCacheGenerator, merge_capture_callback_if_tasks_are_merged) { NiceMock> newerImageCallbackMock; ON_CALL(collectorMock, start(Eq("waitDummy"), _, _, _, _)) @@ -542,7 +542,7 @@ TEST_F(ImageCacheGenerator, MergeCaptureCallbackIfTasksAreMerged) notification.wait(); } -TEST_F(ImageCacheGenerator, MergeAbortCallbackIfTasksAreMerged) +TEST_F(ImageCacheGenerator, merge_abort_callback_if_tasks_are_merged) { NiceMock> newerAbortCallbackMock; ON_CALL(collectorMock, start(Eq("waitDummy"), _, _, _, _)) @@ -565,7 +565,7 @@ TEST_F(ImageCacheGenerator, MergeAbortCallbackIfTasksAreMerged) notification.wait(); } -TEST_F(ImageCacheGenerator, DontCallNullImageCallback) +TEST_F(ImageCacheGenerator, dont_call_null_image_callback) { EXPECT_CALL(collectorMock, start(_, _, _, _, _)) .WillOnce([&](auto, auto, auto, auto captureCallback, auto) { @@ -577,7 +577,7 @@ TEST_F(ImageCacheGenerator, DontCallNullImageCallback) notification.wait(); } -TEST_F(ImageCacheGenerator, DontCallNullAbortCallbackForNullImage) +TEST_F(ImageCacheGenerator, dont_call_null_abort_callback_for_null_image) { EXPECT_CALL(collectorMock, start(_, _, _, _, _)) .WillOnce([&](auto, auto, auto, auto captureCallback, auto) { @@ -589,7 +589,7 @@ TEST_F(ImageCacheGenerator, DontCallNullAbortCallbackForNullImage) notification.wait(); } -TEST_F(ImageCacheGenerator, DontCallNullAbortCallback) +TEST_F(ImageCacheGenerator, dont_call_null_abort_callback) { EXPECT_CALL(collectorMock, start(_, _, _, _, _)) .WillOnce([&](auto, auto, auto, auto, auto abortCallback) { diff --git a/tests/unit/tests/unittests/imagecache/imagecachestorage-test.cpp b/tests/unit/tests/unittests/imagecache/imagecachestorage-test.cpp index a29fc341bab..45f602130b9 100644 --- a/tests/unit/tests/unittests/imagecache/imagecachestorage-test.cpp +++ b/tests/unit/tests/unittests/imagecache/imagecachestorage-test.cpp @@ -15,7 +15,7 @@ MATCHER_P(IsIcon, icon, std::string(negation ? "is't" : "is") + PrintToString(ic return arg.availableSizes() == icon.availableSizes(); } -TEST(ImageCacheStorageUpdateTest, CheckVersionIfDatabaseIsAlreadyInitialized) +TEST(ImageCacheStorageUpdateTest, check_version_if_database_is_already_initialized) { NiceMock databaseMock; ON_CALL(databaseMock, isInitialized()).WillByDefault(Return(true)); @@ -25,7 +25,7 @@ TEST(ImageCacheStorageUpdateTest, CheckVersionIfDatabaseIsAlreadyInitialized) QmlDesigner::ImageCacheStorage storage{databaseMock}; } -TEST(ImageCacheStorageUpdateTest, AddColumnMidSizeIfVersionIsZero) +TEST(ImageCacheStorageUpdateTest, add_column_mid_size_if_version_is_zero) { NiceMock databaseMock; ON_CALL(databaseMock, isInitialized()).WillByDefault(Return(true)); @@ -36,7 +36,7 @@ TEST(ImageCacheStorageUpdateTest, AddColumnMidSizeIfVersionIsZero) QmlDesigner::ImageCacheStorage storage{databaseMock}; } -TEST(ImageCacheStorageUpdateTest, DeleteAllRowsBeforeAddingMidSizeColumn) +TEST(ImageCacheStorageUpdateTest, delete_all_rows_before_adding_mid_size_column) { NiceMock databaseMock; ON_CALL(databaseMock, isInitialized()).WillByDefault(Return(true)); @@ -48,7 +48,7 @@ TEST(ImageCacheStorageUpdateTest, DeleteAllRowsBeforeAddingMidSizeColumn) QmlDesigner::ImageCacheStorage storage{databaseMock}; } -TEST(ImageCacheStorageUpdateTest, DontCallAddColumnMidSizeIfDatabaseWasNotAlreadyInitialized) +TEST(ImageCacheStorageUpdateTest, dont_call_add_column_mid_size_if_database_was_not_already_initialized) { NiceMock databaseMock; ON_CALL(databaseMock, isInitialized()).WillByDefault(Return(false)); @@ -59,7 +59,7 @@ TEST(ImageCacheStorageUpdateTest, DontCallAddColumnMidSizeIfDatabaseWasNotAlread QmlDesigner::ImageCacheStorage storage{databaseMock}; } -TEST(ImageCacheStorageUpdateTest, SetVersionToOneIfVersionIsZero) +TEST(ImageCacheStorageUpdateTest, set_version_to_one_if_version_is_zero) { NiceMock databaseMock; ON_CALL(databaseMock, isInitialized()).WillByDefault(Return(true)); @@ -69,7 +69,7 @@ TEST(ImageCacheStorageUpdateTest, SetVersionToOneIfVersionIsZero) QmlDesigner::ImageCacheStorage storage{databaseMock}; } -TEST(ImageCacheStorageUpdateTest, DontSetVersionIfVersionIsOne) +TEST(ImageCacheStorageUpdateTest, dont_set_version_if_version_is_one) { NiceMock databaseMock; ON_CALL(databaseMock, isInitialized()).WillByDefault(Return(true)); @@ -80,7 +80,7 @@ TEST(ImageCacheStorageUpdateTest, DontSetVersionIfVersionIsOne) QmlDesigner::ImageCacheStorage storage{databaseMock}; } -TEST(ImageCacheStorageUpdateTest, SetVersionToOneForInitialization) +TEST(ImageCacheStorageUpdateTest, set_version_to_one_for_initialization) { NiceMock databaseMock; ON_CALL(databaseMock, isInitialized()).WillByDefault(Return(false)); @@ -114,7 +114,7 @@ protected: QIcon icon1{QPixmap::fromImage(image1)}; }; -TEST_F(ImageCacheStorageTest, FetchImageCalls) +TEST_F(ImageCacheStorageTest, fetch_image_calls) { InSequence s; @@ -127,7 +127,7 @@ TEST_F(ImageCacheStorageTest, FetchImageCalls) storage.fetchImage("/path/to/component", {123}); } -TEST_F(ImageCacheStorageTest, FetchImageCallsIsBusy) +TEST_F(ImageCacheStorageTest, fetch_image_calls_is_busy) { InSequence s; @@ -146,7 +146,7 @@ TEST_F(ImageCacheStorageTest, FetchImageCallsIsBusy) storage.fetchImage("/path/to/component", {123}); } -TEST_F(ImageCacheStorageTest, FetchMidSizeImageCalls) +TEST_F(ImageCacheStorageTest, fetch_mid_size_image_calls) { InSequence s; @@ -159,7 +159,7 @@ TEST_F(ImageCacheStorageTest, FetchMidSizeImageCalls) storage.fetchMidSizeImage("/path/to/component", {123}); } -TEST_F(ImageCacheStorageTest, FetchMidSizeImageCallsIsBusy) +TEST_F(ImageCacheStorageTest, fetch_mid_size_image_calls_is_busy) { InSequence s; @@ -178,7 +178,7 @@ TEST_F(ImageCacheStorageTest, FetchMidSizeImageCallsIsBusy) storage.fetchMidSizeImage("/path/to/component", {123}); } -TEST_F(ImageCacheStorageTest, FetchSmallImageCalls) +TEST_F(ImageCacheStorageTest, fetch_small_image_calls) { InSequence s; @@ -191,7 +191,7 @@ TEST_F(ImageCacheStorageTest, FetchSmallImageCalls) storage.fetchSmallImage("/path/to/component", {123}); } -TEST_F(ImageCacheStorageTest, FetchSmallImageCallsIsBusy) +TEST_F(ImageCacheStorageTest, fetch_small_image_calls_is_busy) { InSequence s; @@ -210,7 +210,7 @@ TEST_F(ImageCacheStorageTest, FetchSmallImageCallsIsBusy) storage.fetchSmallImage("/path/to/component", {123}); } -TEST_F(ImageCacheStorageTest, FetchIconCalls) +TEST_F(ImageCacheStorageTest, fetch_icon_calls) { InSequence s; @@ -223,7 +223,7 @@ TEST_F(ImageCacheStorageTest, FetchIconCalls) storage.fetchIcon("/path/to/component", {123}); } -TEST_F(ImageCacheStorageTest, FetchIconCallsIsBusy) +TEST_F(ImageCacheStorageTest, fetch_icon_calls_is_busy) { InSequence s; @@ -242,7 +242,7 @@ TEST_F(ImageCacheStorageTest, FetchIconCallsIsBusy) storage.fetchIcon("/path/to/component", {123}); } -TEST_F(ImageCacheStorageTest, StoreImageCalls) +TEST_F(ImageCacheStorageTest, store_image_calls) { InSequence s; @@ -258,7 +258,7 @@ TEST_F(ImageCacheStorageTest, StoreImageCalls) storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); } -TEST_F(ImageCacheStorageTest, StoreEmptyImageCalls) +TEST_F(ImageCacheStorageTest, store_empty_image_calls) { InSequence s; @@ -274,7 +274,7 @@ TEST_F(ImageCacheStorageTest, StoreEmptyImageCalls) storage.storeImage("/path/to/component", {123}, QImage{}, QImage{}, QImage{}); } -TEST_F(ImageCacheStorageTest, StoreImageCallsIsBusy) +TEST_F(ImageCacheStorageTest, store_image_calls_is_busy) { InSequence s; @@ -291,7 +291,7 @@ TEST_F(ImageCacheStorageTest, StoreImageCallsIsBusy) storage.storeImage("/path/to/component", {123}, QImage{}, QImage{}, QImage{}); } -TEST_F(ImageCacheStorageTest, StoreIconCalls) +TEST_F(ImageCacheStorageTest, store_icon_calls) { InSequence s; @@ -305,7 +305,7 @@ TEST_F(ImageCacheStorageTest, StoreIconCalls) storage.storeIcon("/path/to/component", {123}, icon1); } -TEST_F(ImageCacheStorageTest, StoreEmptyIconCalls) +TEST_F(ImageCacheStorageTest, store_empty_icon_calls) { InSequence s; @@ -319,7 +319,7 @@ TEST_F(ImageCacheStorageTest, StoreEmptyIconCalls) storage.storeIcon("/path/to/component", {123}, QIcon{}); } -TEST_F(ImageCacheStorageTest, StoreIconCallsIsBusy) +TEST_F(ImageCacheStorageTest, store_icon_calls_is_busy) { InSequence s; @@ -334,14 +334,14 @@ TEST_F(ImageCacheStorageTest, StoreIconCallsIsBusy) storage.storeIcon("/path/to/component", {123}, QIcon{}); } -TEST_F(ImageCacheStorageTest, CallWalCheckointFull) +TEST_F(ImageCacheStorageTest, call_wal_checkoint_full) { EXPECT_CALL(databaseMock, walCheckpointFull()); storage.walCheckpointFull(); } -TEST_F(ImageCacheStorageTest, CallWalCheckointFullIsBusy) +TEST_F(ImageCacheStorageTest, call_wal_checkoint_full_is_busy) { InSequence s; @@ -372,14 +372,14 @@ protected: QIcon icon1{QPixmap::fromImage(image1)}; }; -TEST_F(ImageCacheStorageSlowTest, StoreImage) +TEST_F(ImageCacheStorageSlowTest, store_image) { storage.storeImage("/path/to/component", {123}, image1, QImage{}, QImage{}); ASSERT_THAT(storage.fetchImage("/path/to/component", {123}), Optional(image1)); } -TEST_F(ImageCacheStorageSlowTest, StoreEmptyImageAfterEntry) +TEST_F(ImageCacheStorageSlowTest, store_empty_image_after_entry) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -388,14 +388,14 @@ TEST_F(ImageCacheStorageSlowTest, StoreEmptyImageAfterEntry) ASSERT_THAT(storage.fetchImage("/path/to/component", {123}), Optional(QImage{})); } -TEST_F(ImageCacheStorageSlowTest, StoreMidSizeImage) +TEST_F(ImageCacheStorageSlowTest, store_mid_size_image) { storage.storeImage("/path/to/component", {123}, QImage{}, midSizeImage1, QImage{}); ASSERT_THAT(storage.fetchMidSizeImage("/path/to/component", {123}), Optional(midSizeImage1)); } -TEST_F(ImageCacheStorageSlowTest, StoreEmptyMidSizeImageAfterEntry) +TEST_F(ImageCacheStorageSlowTest, store_empty_mid_size_image_after_entry) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -404,14 +404,14 @@ TEST_F(ImageCacheStorageSlowTest, StoreEmptyMidSizeImageAfterEntry) ASSERT_THAT(storage.fetchMidSizeImage("/path/to/component", {123}), Optional(QImage{})); } -TEST_F(ImageCacheStorageSlowTest, StoreSmallImage) +TEST_F(ImageCacheStorageSlowTest, store_small_image) { storage.storeImage("/path/to/component", {123}, QImage{}, QImage{}, smallImage1); ASSERT_THAT(storage.fetchSmallImage("/path/to/component", {123}), Optional(smallImage1)); } -TEST_F(ImageCacheStorageSlowTest, StoreEmptySmallImageAfterEntry) +TEST_F(ImageCacheStorageSlowTest, store_empty_small_image_after_entry) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -420,21 +420,21 @@ TEST_F(ImageCacheStorageSlowTest, StoreEmptySmallImageAfterEntry) ASSERT_THAT(storage.fetchSmallImage("/path/to/component", {123}), Optional(QImage{})); } -TEST_F(ImageCacheStorageSlowTest, StoreEmptyEntry) +TEST_F(ImageCacheStorageSlowTest, store_empty_entry) { storage.storeImage("/path/to/component", {123}, QImage{}, QImage{}, QImage{}); ASSERT_THAT(storage.fetchImage("/path/to/component", {123}), Optional(QImage{})); } -TEST_F(ImageCacheStorageSlowTest, FetchNonExistingImageIsEmpty) +TEST_F(ImageCacheStorageSlowTest, fetch_non_existing_image_is_empty) { auto image = storage.fetchImage("/path/to/component", {123}); ASSERT_THAT(image, Eq(std::nullopt)); } -TEST_F(ImageCacheStorageSlowTest, FetchSameTimeImage) +TEST_F(ImageCacheStorageSlowTest, fetch_same_time_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -443,7 +443,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchSameTimeImage) ASSERT_THAT(image, Optional(image1)); } -TEST_F(ImageCacheStorageSlowTest, DoNotFetchOlderImage) +TEST_F(ImageCacheStorageSlowTest, do_not_fetch_older_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -452,7 +452,7 @@ TEST_F(ImageCacheStorageSlowTest, DoNotFetchOlderImage) ASSERT_THAT(image, Eq(std::nullopt)); } -TEST_F(ImageCacheStorageSlowTest, FetchNewerImage) +TEST_F(ImageCacheStorageSlowTest, fetch_newer_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -461,14 +461,14 @@ TEST_F(ImageCacheStorageSlowTest, FetchNewerImage) ASSERT_THAT(image, Optional(image1)); } -TEST_F(ImageCacheStorageSlowTest, FetchNonExistingMidSizeImageIsEmpty) +TEST_F(ImageCacheStorageSlowTest, fetch_non_existing_mid_size_image_is_empty) { auto image = storage.fetchMidSizeImage("/path/to/component", {123}); ASSERT_THAT(image, Eq(std::nullopt)); } -TEST_F(ImageCacheStorageSlowTest, FetchSameTimeMidSizeImage) +TEST_F(ImageCacheStorageSlowTest, fetch_same_time_mid_size_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -477,7 +477,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchSameTimeMidSizeImage) ASSERT_THAT(image, Optional(midSizeImage1)); } -TEST_F(ImageCacheStorageSlowTest, DoNotFetchOlderMidSizeImage) +TEST_F(ImageCacheStorageSlowTest, do_not_fetch_older_mid_size_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -486,7 +486,7 @@ TEST_F(ImageCacheStorageSlowTest, DoNotFetchOlderMidSizeImage) ASSERT_THAT(image, Eq(std::nullopt)); } -TEST_F(ImageCacheStorageSlowTest, FetchNewerMidSizeImage) +TEST_F(ImageCacheStorageSlowTest, fetch_newer_mid_size_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -495,14 +495,14 @@ TEST_F(ImageCacheStorageSlowTest, FetchNewerMidSizeImage) ASSERT_THAT(image, Optional(midSizeImage1)); } -TEST_F(ImageCacheStorageSlowTest, FetchNonExistingSmallImageIsEmpty) +TEST_F(ImageCacheStorageSlowTest, fetch_non_existing_small_image_is_empty) { auto image = storage.fetchSmallImage("/path/to/component", {123}); ASSERT_THAT(image, Eq(std::nullopt)); } -TEST_F(ImageCacheStorageSlowTest, FetchSameTimeSmallImage) +TEST_F(ImageCacheStorageSlowTest, fetch_same_time_small_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -511,7 +511,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchSameTimeSmallImage) ASSERT_THAT(image, Optional(smallImage1)); } -TEST_F(ImageCacheStorageSlowTest, DoNotFetchOlderSmallImage) +TEST_F(ImageCacheStorageSlowTest, do_not_fetch_older_small_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -520,7 +520,7 @@ TEST_F(ImageCacheStorageSlowTest, DoNotFetchOlderSmallImage) ASSERT_THAT(image, Eq(std::nullopt)); } -TEST_F(ImageCacheStorageSlowTest, FetchNewerSmallImage) +TEST_F(ImageCacheStorageSlowTest, fetch_newer_small_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -529,14 +529,14 @@ TEST_F(ImageCacheStorageSlowTest, FetchNewerSmallImage) ASSERT_THAT(image, Optional(smallImage1)); } -TEST_F(ImageCacheStorageSlowTest, StoreIcon) +TEST_F(ImageCacheStorageSlowTest, store_icon) { storage.storeIcon("/path/to/component", {123}, icon1); ASSERT_THAT(storage.fetchIcon("/path/to/component", {123}), Optional(IsIcon(icon1))); } -TEST_F(ImageCacheStorageSlowTest, StoreEmptyIconAfterEntry) +TEST_F(ImageCacheStorageSlowTest, store_empty_icon_after_entry) { storage.storeIcon("/path/to/component", {123}, icon1); @@ -545,21 +545,21 @@ TEST_F(ImageCacheStorageSlowTest, StoreEmptyIconAfterEntry) ASSERT_THAT(storage.fetchIcon("/path/to/component", {123}), Optional(IsIcon(QIcon{}))); } -TEST_F(ImageCacheStorageSlowTest, StoreEmptyIconEntry) +TEST_F(ImageCacheStorageSlowTest, store_empty_icon_entry) { storage.storeIcon("/path/to/component", {123}, QIcon{}); ASSERT_THAT(storage.fetchIcon("/path/to/component", {123}), Optional(IsIcon(QIcon{}))); } -TEST_F(ImageCacheStorageSlowTest, FetchNonExistingIconIsEmpty) +TEST_F(ImageCacheStorageSlowTest, fetch_non_existing_icon_is_empty) { auto image = storage.fetchIcon("/path/to/component", {123}); ASSERT_THAT(image, Eq(std::nullopt)); } -TEST_F(ImageCacheStorageSlowTest, FetchSameTimeIcon) +TEST_F(ImageCacheStorageSlowTest, fetch_same_time_icon) { storage.storeIcon("/path/to/component", {123}, icon1); @@ -568,7 +568,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchSameTimeIcon) ASSERT_THAT(image, Optional(IsIcon(icon1))); } -TEST_F(ImageCacheStorageSlowTest, DoNotFetchOlderIcon) +TEST_F(ImageCacheStorageSlowTest, do_not_fetch_older_icon) { storage.storeIcon("/path/to/component", {123}, icon1); @@ -577,7 +577,7 @@ TEST_F(ImageCacheStorageSlowTest, DoNotFetchOlderIcon) ASSERT_THAT(image, Eq(std::nullopt)); } -TEST_F(ImageCacheStorageSlowTest, FetchNewerIcon) +TEST_F(ImageCacheStorageSlowTest, fetch_newer_icon) { storage.storeIcon("/path/to/component", {123}, icon1); @@ -586,7 +586,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchNewerIcon) ASSERT_THAT(image, Optional(IsIcon(icon1))); } -TEST_F(ImageCacheStorageSlowTest, FetchModifiedImageTime) +TEST_F(ImageCacheStorageSlowTest, fetch_modified_image_time) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -595,7 +595,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchModifiedImageTime) ASSERT_THAT(timeStamp, Eq(Sqlite::TimeStamp{123})); } -TEST_F(ImageCacheStorageSlowTest, FetchInvalidModifiedImageTimeForNoEntry) +TEST_F(ImageCacheStorageSlowTest, fetch_invalid_modified_image_time_for_no_entry) { storage.storeImage("/path/to/component2", {123}, image1, midSizeImage1, smallImage1); @@ -604,7 +604,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchInvalidModifiedImageTimeForNoEntry) ASSERT_THAT(timeStamp, Eq(Sqlite::TimeStamp{})); } -TEST_F(ImageCacheStorageSlowTest, FetchHasImage) +TEST_F(ImageCacheStorageSlowTest, fetch_has_image) { storage.storeImage("/path/to/component", {123}, image1, midSizeImage1, smallImage1); @@ -613,7 +613,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchHasImage) ASSERT_TRUE(hasImage); } -TEST_F(ImageCacheStorageSlowTest, FetchHasImageForNullImage) +TEST_F(ImageCacheStorageSlowTest, fetch_has_image_for_null_image) { storage.storeImage("/path/to/component", {123}, QImage{}, QImage{}, QImage{}); @@ -622,7 +622,7 @@ TEST_F(ImageCacheStorageSlowTest, FetchHasImageForNullImage) ASSERT_FALSE(hasImage); } -TEST_F(ImageCacheStorageSlowTest, FetchHasImageForNoEntry) +TEST_F(ImageCacheStorageSlowTest, fetch_has_image_for_no_entry) { storage.storeImage("/path/to/component", {123}, QImage{}, QImage{}, QImage{}); diff --git a/tests/unit/tests/unittests/imagecache/synchronousimagecache-test.cpp b/tests/unit/tests/unittests/imagecache/synchronousimagecache-test.cpp index 1b2dac08688..0f6a053988a 100644 --- a/tests/unit/tests/unittests/imagecache/synchronousimagecache-test.cpp +++ b/tests/unit/tests/unittests/imagecache/synchronousimagecache-test.cpp @@ -71,21 +71,21 @@ protected: QIcon icon3{QPixmap::fromImage(image3)}; }; -TEST_F(SynchronousImageCache, GetImageFromStorage) +TEST_F(SynchronousImageCache, get_image_from_storage) { auto image = cache.image("/path/to/Component.qml"); ASSERT_THAT(image, image1); } -TEST_F(SynchronousImageCache, GetImageWithExtraIdFromStorage) +TEST_F(SynchronousImageCache, get_image_with_extra_id_from_storage) { auto image = cache.image("/path/to/Component.qml", "extraId1"); ASSERT_THAT(image, image2); } -TEST_F(SynchronousImageCache, GetImageWithOutdatedTimeStampFromCollector) +TEST_F(SynchronousImageCache, get_image_with_outdated_time_stamp_from_collector) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{124})); @@ -95,7 +95,7 @@ TEST_F(SynchronousImageCache, GetImageWithOutdatedTimeStampFromCollector) ASSERT_THAT(image, image3); } -TEST_F(SynchronousImageCache, GetImageWithOutdatedTimeStampStored) +TEST_F(SynchronousImageCache, get_image_with_outdated_time_stamp_stored) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{124})); @@ -110,21 +110,21 @@ TEST_F(SynchronousImageCache, GetImageWithOutdatedTimeStampStored) auto image = cache.image("/path/to/Component.qml", "extraId1"); } -TEST_F(SynchronousImageCache, GetMidSizeImageFromStorage) +TEST_F(SynchronousImageCache, get_mid_size_image_from_storage) { auto image = cache.midSizeImage("/path/to/Component.qml"); ASSERT_THAT(image, midSizeImage1); } -TEST_F(SynchronousImageCache, GetMidSizeImageWithExtraIdFromStorage) +TEST_F(SynchronousImageCache, get_mid_size_image_with_extra_id_from_storage) { auto image = cache.midSizeImage("/path/to/Component.qml", "extraId1"); ASSERT_THAT(image, midSizeImage2); } -TEST_F(SynchronousImageCache, GetMidSizeImageWithOutdatedTimeStampFromCollector) +TEST_F(SynchronousImageCache, get_mid_size_image_with_outdated_time_stamp_from_collector) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{124})); @@ -134,7 +134,7 @@ TEST_F(SynchronousImageCache, GetMidSizeImageWithOutdatedTimeStampFromCollector) ASSERT_THAT(image, midSizeImage3); } -TEST_F(SynchronousImageCache, GetMidSizeImageWithOutdatedTimeStampStored) +TEST_F(SynchronousImageCache, get_mid_size_image_with_outdated_time_stamp_stored) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{124})); @@ -149,21 +149,21 @@ TEST_F(SynchronousImageCache, GetMidSizeImageWithOutdatedTimeStampStored) auto image = cache.midSizeImage("/path/to/Component.qml", "extraId1"); } -TEST_F(SynchronousImageCache, GetSmallImageFromStorage) +TEST_F(SynchronousImageCache, get_small_image_from_storage) { auto image = cache.smallImage("/path/to/Component.qml"); ASSERT_THAT(image, smallImage1); } -TEST_F(SynchronousImageCache, GetSmallImageWithExtraIdFromStorage) +TEST_F(SynchronousImageCache, get_small_image_with_extra_id_from_storage) { auto image = cache.smallImage("/path/to/Component.qml", "extraId1"); ASSERT_THAT(image, smallImage2); } -TEST_F(SynchronousImageCache, GetSmallImageWithOutdatedTimeStampFromCollector) +TEST_F(SynchronousImageCache, get_small_image_with_outdated_time_stamp_from_collector) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{124})); @@ -173,7 +173,7 @@ TEST_F(SynchronousImageCache, GetSmallImageWithOutdatedTimeStampFromCollector) ASSERT_THAT(image, smallImage3); } -TEST_F(SynchronousImageCache, GetSmallImageWithOutdatedTimeStampStored) +TEST_F(SynchronousImageCache, get_small_image_with_outdated_time_stamp_stored) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{124})); @@ -188,21 +188,21 @@ TEST_F(SynchronousImageCache, GetSmallImageWithOutdatedTimeStampStored) auto image = cache.smallImage("/path/to/Component.qml", "extraId1"); } -TEST_F(SynchronousImageCache, GetIconFromStorage) +TEST_F(SynchronousImageCache, get_icon_from_storage) { auto icon = cache.icon("/path/to/Component.qml"); ASSERT_THAT(icon, IsIcon(icon1)); } -TEST_F(SynchronousImageCache, GetIconWithExtraIdFromStorage) +TEST_F(SynchronousImageCache, get_icon_with_extra_id_from_storage) { auto icon = cache.icon("/path/to/Component.qml", "extraId1"); ASSERT_THAT(icon, IsIcon(icon2)); } -TEST_F(SynchronousImageCache, GetIconWithOutdatedTimeStampFromCollector) +TEST_F(SynchronousImageCache, get_icon_with_outdated_time_stamp_from_collector) { ON_CALL(mockTimeStampProvider, timeStamp(Eq("/path/to/Component.qml"))) .WillByDefault(Return(Sqlite::TimeStamp{124})); @@ -212,7 +212,7 @@ TEST_F(SynchronousImageCache, GetIconWithOutdatedTimeStampFromCollector) ASSERT_THAT(icon, IsIcon(icon3)); } -TEST_F(SynchronousImageCache, GetIconWithOutdatedTimeStampStored) +TEST_F(SynchronousImageCache, get_icon_with_outdated_time_stamp_stored) { using QmlDesigner::ImageCache::FontCollectorSizesAuxiliaryData; std::vector sizes{{20, 11}}; @@ -229,7 +229,7 @@ TEST_F(SynchronousImageCache, GetIconWithOutdatedTimeStampStored) FontCollectorSizesAuxiliaryData{sizes, "color", "text"}); } -TEST_F(SynchronousImageCache, IconCallsCollectorWithAuxiliaryData) +TEST_F(SynchronousImageCache, icon_calls_collector_with_auxiliary_data) { using QmlDesigner::ImageCache::FontCollectorSizesAuxiliaryData; std::vector sizes{{20, 11}}; @@ -250,7 +250,7 @@ TEST_F(SynchronousImageCache, IconCallsCollectorWithAuxiliaryData) FontCollectorSizesAuxiliaryData{sizes, "color", "text"}); } -TEST_F(SynchronousImageCache, ImageCallsCollectorWithAuxiliaryData) +TEST_F(SynchronousImageCache, image_calls_collector_with_auxiliary_data) { using QmlDesigner::ImageCache::FontCollectorSizesAuxiliaryData; std::vector sizes{{20, 11}}; @@ -271,7 +271,7 @@ TEST_F(SynchronousImageCache, ImageCallsCollectorWithAuxiliaryData) FontCollectorSizesAuxiliaryData{sizes, "color", "text"}); } -TEST_F(SynchronousImageCache, SmallImageCallsCollectorWithAuxiliaryData) +TEST_F(SynchronousImageCache, small_image_calls_collector_with_auxiliary_data) { using QmlDesigner::ImageCache::FontCollectorSizesAuxiliaryData; std::vector sizes{{20, 11}}; diff --git a/tests/unit/tests/unittests/listmodeleditor/listmodeleditor-test.cpp b/tests/unit/tests/unittests/listmodeleditor/listmodeleditor-test.cpp index 53dab2fc1e6..618711e87b9 100644 --- a/tests/unit/tests/unittests/listmodeleditor/listmodeleditor-test.cpp +++ b/tests/unit/tests/unittests/listmodeleditor/listmodeleditor-test.cpp @@ -199,35 +199,35 @@ protected: ModelNode componentElement; }; -TEST_F(ListModelEditor, CreatePropertyNameSet) +TEST_F(ListModelEditor, create_property_name_set) { model.setListModel(listModelNode); ASSERT_THAT(model.propertyNames(), ElementsAre("image", "name", "value", "value2")); } -TEST_F(ListModelEditor, CreatePropertyNameSetForEmptyList) +TEST_F(ListModelEditor, create_property_name_set_for_empty_list) { model.setListModel(emptyListModelNode); ASSERT_THAT(model.propertyNames(), IsEmpty()); } -TEST_F(ListModelEditor, HorizontalLabels) +TEST_F(ListModelEditor, horizontal_labels) { model.setListModel(listModelNode); ASSERT_THAT(headerLabels(model), ElementsAre("image", "name", "value", "value2")); } -TEST_F(ListModelEditor, HorizontalLabelsForEmptyList) +TEST_F(ListModelEditor, horizontal_labels_for_empty_list) { model.setListModel(emptyListModelNode); ASSERT_THAT(headerLabels(model), IsEmpty()); } -TEST_F(ListModelEditor, DisplayValues) +TEST_F(ListModelEditor, display_values) { model.setListModel(listModelNode); @@ -237,7 +237,7 @@ TEST_F(ListModelEditor, DisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, ChangeValueChangesDisplayValues) +TEST_F(ListModelEditor, change_value_changes_display_values) { model.setListModel(listModelNode); @@ -249,7 +249,7 @@ TEST_F(ListModelEditor, ChangeValueChangesDisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, EditValueCallVariantPropertiesChanged) +TEST_F(ListModelEditor, edit_value_call_variant_properties_changed) { model.setListModel(listModelNode); @@ -260,7 +260,7 @@ TEST_F(ListModelEditor, EditValueCallVariantPropertiesChanged) model.setValue(0, 1, "hello"); } -TEST_F(ListModelEditor, ChangeDisplayValueCallsVariantPropertiesChanged) +TEST_F(ListModelEditor, change_display_value_calls_variant_properties_changed) { model.setListModel(listModelNode); @@ -272,7 +272,7 @@ TEST_F(ListModelEditor, ChangeDisplayValueCallsVariantPropertiesChanged) model.setValue(0, 1, "hello", Qt::DisplayRole); } -TEST_F(ListModelEditor, AddRowAddedInvalidRow) +TEST_F(ListModelEditor, add_row_added_invalid_row) { model.setListModel(listModelNode); @@ -285,7 +285,7 @@ TEST_F(ListModelEditor, AddRowAddedInvalidRow) ElementsAre(IsInvalid(), IsInvalid(), IsInvalid(), IsInvalid()))); } -TEST_F(ListModelEditor, AddRowCreatesNewModelNodeAndReparents) +TEST_F(ListModelEditor, add_row_creates_new_model_node_and_reparents) { model.setListModel(listModelNode); @@ -299,7 +299,7 @@ TEST_F(ListModelEditor, AddRowCreatesNewModelNodeAndReparents) model.addRow(); } -TEST_F(ListModelEditor, ChangeAddedRowPropery) +TEST_F(ListModelEditor, change_added_row_propery) { model.setListModel(listModelNode); model.addRow(); @@ -313,7 +313,7 @@ TEST_F(ListModelEditor, ChangeAddedRowPropery) ElementsAre(IsInvalid(), IsInvalid(), 22, IsInvalid()))); } -TEST_F(ListModelEditor, ChangeAddedRowProperyCallsVariantPropertiesChanged) +TEST_F(ListModelEditor, change_added_row_propery_calls_variant_properties_changed) { model.setListModel(listModelNode); ModelNode element4; @@ -327,7 +327,7 @@ TEST_F(ListModelEditor, ChangeAddedRowProperyCallsVariantPropertiesChanged) model.setValue(3, 2, 22); } -TEST_F(ListModelEditor, AddColumnInsertsPropertyName) +TEST_F(ListModelEditor, add_column_inserts_property_name) { model.setListModel(listModelNode); @@ -336,7 +336,7 @@ TEST_F(ListModelEditor, AddColumnInsertsPropertyName) ASSERT_THAT(model.propertyNames(), ElementsAre("image", "name", "other", "value", "value2")); } -TEST_F(ListModelEditor, AddColumnInsertsPropertyNameToEmptyModel) +TEST_F(ListModelEditor, add_column_inserts_property_name_to_empty_model) { model.setListModel(emptyListModelNode); @@ -345,7 +345,7 @@ TEST_F(ListModelEditor, AddColumnInsertsPropertyNameToEmptyModel) ASSERT_THAT(model.propertyNames(), ElementsAre("foo")); } -TEST_F(ListModelEditor, AddTwiceColumnInsertsPropertyNameToEmptyModel) +TEST_F(ListModelEditor, add_twice_column_inserts_property_name_to_empty_model) { model.setListModel(emptyListModelNode); model.addColumn("foo"); @@ -355,7 +355,7 @@ TEST_F(ListModelEditor, AddTwiceColumnInsertsPropertyNameToEmptyModel) ASSERT_THAT(model.propertyNames(), ElementsAre("foo", "foo2")); } -TEST_F(ListModelEditor, AddSameColumnInsertsPropertyName) +TEST_F(ListModelEditor, add_same_column_inserts_property_name) { model.setListModel(emptyListModelNode); model.addColumn("foo"); @@ -365,7 +365,7 @@ TEST_F(ListModelEditor, AddSameColumnInsertsPropertyName) ASSERT_THAT(model.propertyNames(), ElementsAre("foo")); } -TEST_F(ListModelEditor, AddColumnInsertsHeaderLabel) +TEST_F(ListModelEditor, add_column_inserts_header_label) { model.setListModel(listModelNode); @@ -374,7 +374,7 @@ TEST_F(ListModelEditor, AddColumnInsertsHeaderLabel) ASSERT_THAT(headerLabels(model), ElementsAre("image", "name", "other", "value", "value2")); } -TEST_F(ListModelEditor, AddColumnInsertsHeaderLabelToEmptyModel) +TEST_F(ListModelEditor, add_column_inserts_header_label_to_empty_model) { model.setListModel(emptyListModelNode); @@ -383,7 +383,7 @@ TEST_F(ListModelEditor, AddColumnInsertsHeaderLabelToEmptyModel) ASSERT_THAT(headerLabels(model), ElementsAre("foo")); } -TEST_F(ListModelEditor, AddTwiceColumnInsertsHeaderLabelToEmptyModel) +TEST_F(ListModelEditor, add_twice_column_inserts_header_label_to_empty_model) { model.setListModel(emptyListModelNode); model.addColumn("foo"); @@ -393,7 +393,7 @@ TEST_F(ListModelEditor, AddTwiceColumnInsertsHeaderLabelToEmptyModel) ASSERT_THAT(headerLabels(model), ElementsAre("foo", "foo2")); } -TEST_F(ListModelEditor, AddSameColumnInsertsHeaderLabel) +TEST_F(ListModelEditor, add_same_column_inserts_header_label) { model.setListModel(emptyListModelNode); model.addColumn("foo"); @@ -403,7 +403,7 @@ TEST_F(ListModelEditor, AddSameColumnInsertsHeaderLabel) ASSERT_THAT(headerLabels(model), ElementsAre("foo")); } -TEST_F(ListModelEditor, AddColumnInsertsDisplayValues) +TEST_F(ListModelEditor, add_column_inserts_display_values) { model.setListModel(listModelNode); @@ -415,7 +415,7 @@ TEST_F(ListModelEditor, AddColumnInsertsDisplayValues) ElementsAre("pic.png", "poo", IsInvalid(), 111, IsInvalid()))); } -TEST_F(ListModelEditor, ChangeAddColumnPropertyDisplayValue) +TEST_F(ListModelEditor, change_add_column_property_display_value) { model.setListModel(listModelNode); model.addColumn("other"); @@ -428,7 +428,7 @@ TEST_F(ListModelEditor, ChangeAddColumnPropertyDisplayValue) ElementsAre("pic.png", "poo", IsInvalid(), 111, IsInvalid()))); } -TEST_F(ListModelEditor, ChangeAddColumnPropertyCallsVariantPropertiesChanged) +TEST_F(ListModelEditor, change_add_column_property_calls_variant_properties_changed) { model.setListModel(listModelNode); model.addColumn("other"); @@ -439,7 +439,7 @@ TEST_F(ListModelEditor, ChangeAddColumnPropertyCallsVariantPropertiesChanged) model.setValue(1, 2, 434); } -TEST_F(ListModelEditor, RemoveColumnRemovesDisplayValues) +TEST_F(ListModelEditor, remove_column_removes_display_values) { model.setListModel(listModelNode); @@ -451,7 +451,7 @@ TEST_F(ListModelEditor, RemoveColumnRemovesDisplayValues) ElementsAre("pic.png", "poo", IsInvalid()))); } -TEST_F(ListModelEditor, RemoveColumnRemovesProperties) +TEST_F(ListModelEditor, remove_column_removes_properties) { model.setListModel(listModelNode); @@ -461,7 +461,7 @@ TEST_F(ListModelEditor, RemoveColumnRemovesProperties) model.removeColumns({index(0, 0)}); } -TEST_F(ListModelEditor, RemoveColumnRemovesPropertyName) +TEST_F(ListModelEditor, remove_column_removes_property_name) { model.setListModel(listModelNode); @@ -470,7 +470,7 @@ TEST_F(ListModelEditor, RemoveColumnRemovesPropertyName) ASSERT_THAT(model.propertyNames(), ElementsAre("image", "value", "value2")); } -TEST_F(ListModelEditor, RemoveRowRemovesDisplayValues) +TEST_F(ListModelEditor, remove_row_removes_display_values) { model.setListModel(listModelNode); @@ -481,7 +481,7 @@ TEST_F(ListModelEditor, RemoveRowRemovesDisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, RemoveRowRemovesElementInListModel) +TEST_F(ListModelEditor, remove_row_removes_element_in_list_model) { model.setListModel(listModelNode); @@ -490,7 +490,7 @@ TEST_F(ListModelEditor, RemoveRowRemovesElementInListModel) model.removeRows({index(1, 0)}); } -TEST_F(ListModelEditor, ConvertStringFloatToFloat) +TEST_F(ListModelEditor, convert_string_float_to_float) { model.setListModel(listModelNode); @@ -500,7 +500,7 @@ TEST_F(ListModelEditor, ConvertStringFloatToFloat) ASSERT_THAT(element2.variantProperty("name").value().type(), QVariant::Double); } -TEST_F(ListModelEditor, ConvertStringIntegerToDouble) +TEST_F(ListModelEditor, convert_string_integer_to_double) { model.setListModel(listModelNode); @@ -510,7 +510,7 @@ TEST_F(ListModelEditor, ConvertStringIntegerToDouble) ASSERT_THAT(element2.variantProperty("name").value().type(), QVariant::Double); } -TEST_F(ListModelEditor, DontConvertStringToNumber) +TEST_F(ListModelEditor, dont_convert_string_to_number) { model.setListModel(listModelNode); @@ -520,7 +520,7 @@ TEST_F(ListModelEditor, DontConvertStringToNumber) ASSERT_THAT(element2.variantProperty("name").value().type(), QVariant::String); } -TEST_F(ListModelEditor, EmptyStringsRemovesProperty) +TEST_F(ListModelEditor, empty_strings_removes_property) { model.setListModel(listModelNode); @@ -529,7 +529,7 @@ TEST_F(ListModelEditor, EmptyStringsRemovesProperty) ASSERT_THAT(element2.variantProperty("name").value().value(), Eq("")); } -TEST_F(ListModelEditor, InvalidVariantRemovesProperty) +TEST_F(ListModelEditor, invalid_variant_removes_property) { model.setListModel(listModelNode); @@ -538,7 +538,7 @@ TEST_F(ListModelEditor, InvalidVariantRemovesProperty) ASSERT_FALSE(element2.hasProperty("name")); } -TEST_F(ListModelEditor, DispayValueIsChangedToDouble) +TEST_F(ListModelEditor, dispay_value_is_changed_to_double) { model.setListModel(listModelNode); @@ -547,7 +547,7 @@ TEST_F(ListModelEditor, DispayValueIsChangedToDouble) ASSERT_THAT(displayValues()[1][1].type(), QVariant::Double); } -TEST_F(ListModelEditor, StringDispayValueIsNotChanged) +TEST_F(ListModelEditor, string_dispay_value_is_not_changed) { model.setListModel(listModelNode); @@ -556,7 +556,7 @@ TEST_F(ListModelEditor, StringDispayValueIsNotChanged) ASSERT_THAT(displayValues()[1][1].type(), QVariant::String); } -TEST_F(ListModelEditor, SetInvalidToDarkYellowBackgroundColor) +TEST_F(ListModelEditor, set_invalid_to_dark_yellow_background_color) { model.setListModel(listModelNode); @@ -568,7 +568,7 @@ TEST_F(ListModelEditor, SetInvalidToDarkYellowBackgroundColor) ElementsAre(Not(Qt::darkYellow), Not(Qt::darkYellow), Not(Qt::darkYellow), Qt::darkYellow))); } -TEST_F(ListModelEditor, SettingValueChangesBackgroundColor) +TEST_F(ListModelEditor, setting_value_changes_background_color) { model.setListModel(listModelNode); @@ -582,7 +582,7 @@ TEST_F(ListModelEditor, SettingValueChangesBackgroundColor) ElementsAre(Not(Qt::darkYellow), Not(Qt::darkYellow), Not(Qt::darkYellow), Qt::darkYellow))); } -TEST_F(ListModelEditor, SettingValueChangesByDisplayRoleBackgroundColor) +TEST_F(ListModelEditor, setting_value_changes_by_display_role_background_color) { model.setListModel(listModelNode); @@ -596,7 +596,7 @@ TEST_F(ListModelEditor, SettingValueChangesByDisplayRoleBackgroundColor) ElementsAre(Not(Qt::darkYellow), Not(Qt::darkYellow), Not(Qt::darkYellow), Qt::darkYellow))); } -TEST_F(ListModelEditor, ResettingValueChangesBackgroundColor) +TEST_F(ListModelEditor, resetting_value_changes_background_color) { model.setListModel(listModelNode); @@ -610,7 +610,7 @@ TEST_F(ListModelEditor, ResettingValueChangesBackgroundColor) ElementsAre(Not(Qt::darkYellow), Not(Qt::darkYellow), Not(Qt::darkYellow), Qt::darkYellow))); } -TEST_F(ListModelEditor, ResettingValueChangesByDisplayRoleBackgroundColor) +TEST_F(ListModelEditor, resetting_value_changes_by_display_role_background_color) { model.setListModel(listModelNode); @@ -624,7 +624,7 @@ TEST_F(ListModelEditor, ResettingValueChangesByDisplayRoleBackgroundColor) ElementsAre(Not(Qt::darkYellow), Not(Qt::darkYellow), Not(Qt::darkYellow), Qt::darkYellow))); } -TEST_F(ListModelEditor, SettingNullValueChangesBackgroundColor) +TEST_F(ListModelEditor, setting_null_value_changes_background_color) { model.setListModel(listModelNode); @@ -636,7 +636,7 @@ TEST_F(ListModelEditor, SettingNullValueChangesBackgroundColor) ElementsAre(_, _, _, Qt::darkYellow))); } -TEST_F(ListModelEditor, DontRenamePropertyIfColumnNameExists) +TEST_F(ListModelEditor, dont_rename_property_if_column_name_exists) { model.setListModel(listModelNode); @@ -645,7 +645,7 @@ TEST_F(ListModelEditor, DontRenamePropertyIfColumnNameExists) ASSERT_THAT(model.propertyNames(), ElementsAre("image", "name", "value", "value2")); } -TEST_F(ListModelEditor, DontRenameColumnIfColumnNameExists) +TEST_F(ListModelEditor, dont_rename_column_if_column_name_exists) { model.setListModel(listModelNode); @@ -654,7 +654,7 @@ TEST_F(ListModelEditor, DontRenameColumnIfColumnNameExists) ASSERT_THAT(headerLabels(model), ElementsAre("image", "name", "value", "value2")); } -TEST_F(ListModelEditor, DontRenameColumnIfColumnNameExistsDoesNotChangeDisplayValues) +TEST_F(ListModelEditor, dont_rename_column_if_column_name_exists_does_not_change_display_values) { model.setListModel(listModelNode); @@ -666,7 +666,7 @@ TEST_F(ListModelEditor, DontRenameColumnIfColumnNameExistsDoesNotChangeDisplayVa ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, DontRenameColumnIfColumnNameExistsDoesNotChangeProperties) +TEST_F(ListModelEditor, dont_rename_column_if_column_name_exists_does_not_change_properties) { model.setListModel(listModelNode); @@ -684,7 +684,7 @@ TEST_F(ListModelEditor, DontRenameColumnIfColumnNameExistsDoesNotChangePropertie IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, RenamePropertyButDontChangeOrder) +TEST_F(ListModelEditor, rename_property_but_dont_change_order) { model.setListModel(listModelNode); @@ -693,7 +693,7 @@ TEST_F(ListModelEditor, RenamePropertyButDontChangeOrder) ASSERT_THAT(model.propertyNames(), ElementsAre("image", "mood", "value", "value2")); } -TEST_F(ListModelEditor, RenameColumnButDontChangeOrder) +TEST_F(ListModelEditor, rename_column_but_dont_change_order) { model.setListModel(listModelNode); @@ -702,7 +702,7 @@ TEST_F(ListModelEditor, RenameColumnButDontChangeOrder) ASSERT_THAT(headerLabels(model), ElementsAre("image", "mood", "value", "value2")); } -TEST_F(ListModelEditor, RenameColumnButDontChangeOrderDisplayValues) +TEST_F(ListModelEditor, rename_column_but_dont_change_order_display_values) { model.setListModel(listModelNode); @@ -714,7 +714,7 @@ TEST_F(ListModelEditor, RenameColumnButDontChangeOrderDisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, RenameColumnButDontChangeOrderProperies) +TEST_F(ListModelEditor, rename_column_but_dont_change_order_properies) { model.setListModel(listModelNode); @@ -732,7 +732,7 @@ TEST_F(ListModelEditor, RenameColumnButDontChangeOrderProperies) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, RemoveColumnAfterRenameColumn) +TEST_F(ListModelEditor, remove_column_after_rename_column) { model.setListModel(listModelNode); model.renameColumn(1, "mood"); @@ -748,7 +748,7 @@ TEST_F(ListModelEditor, RemoveColumnAfterRenameColumn) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, ChangeValueAfterRenameColumn) +TEST_F(ListModelEditor, change_value_after_rename_column) { model.setListModel(listModelNode); model.renameColumn(1, "mood"); @@ -767,7 +767,7 @@ TEST_F(ListModelEditor, ChangeValueAfterRenameColumn) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, RemovePropertyAfterRenameColumn) +TEST_F(ListModelEditor, remove_property_after_rename_column) { model.setListModel(listModelNode); model.renameColumn(1, "mood"); @@ -785,7 +785,7 @@ TEST_F(ListModelEditor, RemovePropertyAfterRenameColumn) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, RenameToPrecedingProperty) +TEST_F(ListModelEditor, rename_to_preceding_property) { model.setListModel(listModelNode); @@ -794,7 +794,7 @@ TEST_F(ListModelEditor, RenameToPrecedingProperty) ASSERT_THAT(model.propertyNames(), ElementsAre("alpha", "image", "value", "value2")); } -TEST_F(ListModelEditor, RenameToPrecedingColumn) +TEST_F(ListModelEditor, rename_to_preceding_column) { model.setListModel(listModelNode); @@ -803,7 +803,7 @@ TEST_F(ListModelEditor, RenameToPrecedingColumn) ASSERT_THAT(headerLabels(model), ElementsAre("alpha", "image", "value", "value2")); } -TEST_F(ListModelEditor, RenameToPrecedingColumnDisplayValues) +TEST_F(ListModelEditor, rename_to_preceding_column_display_values) { model.setListModel(listModelNode); @@ -815,7 +815,7 @@ TEST_F(ListModelEditor, RenameToPrecedingColumnDisplayValues) ElementsAre("poo", "pic.png", 111, IsInvalid()))); } -TEST_F(ListModelEditor, RenameToPrecedingColumnProperties) +TEST_F(ListModelEditor, rename_to_preceding_column_properties) { model.setListModel(listModelNode); @@ -833,7 +833,7 @@ TEST_F(ListModelEditor, RenameToPrecedingColumnProperties) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, RenameToFollowingProperty) +TEST_F(ListModelEditor, rename_to_following_property) { model.setListModel(listModelNode); @@ -842,7 +842,7 @@ TEST_F(ListModelEditor, RenameToFollowingProperty) ASSERT_THAT(model.propertyNames(), ElementsAre("image", "name", "value2", "zoo")); } -TEST_F(ListModelEditor, RenameToFollowingColumn) +TEST_F(ListModelEditor, rename_to_following_column) { model.setListModel(listModelNode); @@ -851,7 +851,7 @@ TEST_F(ListModelEditor, RenameToFollowingColumn) ASSERT_THAT(headerLabels(model), ElementsAre("image", "name", "value2", "zoo")); } -TEST_F(ListModelEditor, RenameToFollowingColumnDisplayValues) +TEST_F(ListModelEditor, rename_to_following_column_display_values) { model.setListModel(listModelNode); @@ -863,7 +863,7 @@ TEST_F(ListModelEditor, RenameToFollowingColumnDisplayValues) ElementsAre("pic.png", "poo", IsInvalid(), 111))); } -TEST_F(ListModelEditor, RenameToFollowingColumnProperties) +TEST_F(ListModelEditor, rename_to_following_column_properties) { model.setListModel(listModelNode); @@ -881,7 +881,7 @@ TEST_F(ListModelEditor, RenameToFollowingColumnProperties) IsVariantProperty("zoo", 111)))); } -TEST_F(ListModelEditor, RenamePropertiesWithInvalidValue) +TEST_F(ListModelEditor, rename_properties_with_invalid_value) { model.setListModel(listModelNode); @@ -899,7 +899,7 @@ TEST_F(ListModelEditor, RenamePropertiesWithInvalidValue) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, ChangeValueAfterRenamePropertiesWithInvalidValue) +TEST_F(ListModelEditor, change_value_after_rename_properties_with_invalid_value) { model.setListModel(listModelNode); model.renameColumn(0, "mood"); @@ -919,7 +919,7 @@ TEST_F(ListModelEditor, ChangeValueAfterRenamePropertiesWithInvalidValue) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, RemoveLastRow) +TEST_F(ListModelEditor, remove_last_row) { model.setListModel(emptyListModelNode); model.addColumn("mood"); @@ -930,7 +930,7 @@ TEST_F(ListModelEditor, RemoveLastRow) ASSERT_THAT(displayValues(), IsEmpty()); } -TEST_F(ListModelEditor, RemoveLastEmptyRow) +TEST_F(ListModelEditor, remove_last_empty_row) { model.setListModel(emptyListModelNode); model.addColumn("mood"); @@ -942,7 +942,7 @@ TEST_F(ListModelEditor, RemoveLastEmptyRow) ASSERT_THAT(displayValues(), ElementsAre(IsEmpty())); } -TEST_F(ListModelEditor, RemoveLastColumn) +TEST_F(ListModelEditor, remove_last_column) { model.setListModel(emptyListModelNode); model.addColumn("mood"); @@ -953,7 +953,7 @@ TEST_F(ListModelEditor, RemoveLastColumn) ASSERT_THAT(displayValues(), ElementsAre(IsEmpty())); } -TEST_F(ListModelEditor, RemoveLastEmptyColumn) +TEST_F(ListModelEditor, remove_last_empty_column) { model.setListModel(emptyListModelNode); model.addColumn("mood"); @@ -965,7 +965,7 @@ TEST_F(ListModelEditor, RemoveLastEmptyColumn) ASSERT_THAT(displayValues(), IsEmpty()); } -TEST_F(ListModelEditor, RemoveColumns) +TEST_F(ListModelEditor, remove_columns) { model.setListModel(listModelNode); model.removeColumns({index(0, 1), index(0, 3), index(1, 1), index(0, 4)}); @@ -978,7 +978,7 @@ TEST_F(ListModelEditor, RemoveColumns) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, RemoveRows) +TEST_F(ListModelEditor, remove_rows) { model.setListModel(listModelNode); @@ -990,7 +990,7 @@ TEST_F(ListModelEditor, RemoveRows) IsVariantProperty("value2", 42)))); } -TEST_F(ListModelEditor, FilterColumns) +TEST_F(ListModelEditor, filter_columns) { model.setListModel(listModelNode); QList indices = {index(0, 0), index(1, 1), index(0, 2), index(0, 1)}; @@ -1000,7 +1000,7 @@ TEST_F(ListModelEditor, FilterColumns) ASSERT_THAT(columns, ElementsAre(0, 1, 2)); } -TEST_F(ListModelEditor, FilterColumnsInvalidColumns) +TEST_F(ListModelEditor, filter_columns_invalid_columns) { QList indices = {index(0, 0), index(1, 1), index(0, 2), index(0, 1)}; @@ -1009,7 +1009,7 @@ TEST_F(ListModelEditor, FilterColumnsInvalidColumns) ASSERT_THAT(columns, IsEmpty()); } -TEST_F(ListModelEditor, FilterColumnsEmptyInput) +TEST_F(ListModelEditor, filter_columns_empty_input) { QList indices; @@ -1018,7 +1018,7 @@ TEST_F(ListModelEditor, FilterColumnsEmptyInput) ASSERT_THAT(columns, IsEmpty()); } -TEST_F(ListModelEditor, FilterRows) +TEST_F(ListModelEditor, filter_rows) { model.setListModel(listModelNode); QList indices = {index(0, 0), index(1, 1), index(2, 2), index(0, 1)}; @@ -1028,7 +1028,7 @@ TEST_F(ListModelEditor, FilterRows) ASSERT_THAT(rows, ElementsAre(0, 1, 2)); } -TEST_F(ListModelEditor, FilterRowsInvalidColumns) +TEST_F(ListModelEditor, filter_rows_invalid_columns) { QList indices = {index(0, 0), index(1, 1), index(2, 2), index(0, 1)}; @@ -1037,7 +1037,7 @@ TEST_F(ListModelEditor, FilterRowsInvalidColumns) ASSERT_THAT(rows, IsEmpty()); } -TEST_F(ListModelEditor, FilterRowsEmptyInput) +TEST_F(ListModelEditor, filter_rows_empty_input) { QList indices; @@ -1046,7 +1046,7 @@ TEST_F(ListModelEditor, FilterRowsEmptyInput) ASSERT_THAT(rows, IsEmpty()); } -TEST_F(ListModelEditor, CannotMoveEmptyRowsUp) +TEST_F(ListModelEditor, cannot_move_empty_rows_up) { model.setListModel(listModelNode); QList indices = {index(-1, 1)}; @@ -1056,7 +1056,7 @@ TEST_F(ListModelEditor, CannotMoveEmptyRowsUp) ASSERT_THAT(elements(listModelNode), ElementsAre(element1, element2, element3)); } -TEST_F(ListModelEditor, MoveRowUp) +TEST_F(ListModelEditor, move_row_up) { model.setListModel(listModelNode); QList indices = {index(1, 1), index(1, 2), index(1, 0)}; @@ -1066,7 +1066,7 @@ TEST_F(ListModelEditor, MoveRowUp) ASSERT_THAT(elements(listModelNode), ElementsAre(element2, element1, element3)); } -TEST_F(ListModelEditor, MoveRowsUp) +TEST_F(ListModelEditor, move_rows_up) { model.setListModel(listModelNode); QList indices = {index(1, 1), index(2, 2), index(1, 0)}; @@ -1076,7 +1076,7 @@ TEST_F(ListModelEditor, MoveRowsUp) ASSERT_THAT(elements(listModelNode), ElementsAre(element2, element3, element1)); } -TEST_F(ListModelEditor, CannotMoveFirstRowsUp) +TEST_F(ListModelEditor, cannot_move_first_rows_up) { model.setListModel(listModelNode); QList indices = {index(0, 1), index(1, 2), index(0, 0)}; @@ -1086,7 +1086,7 @@ TEST_F(ListModelEditor, CannotMoveFirstRowsUp) ASSERT_THAT(elements(listModelNode), ElementsAre(element1, element2, element3)); } -TEST_F(ListModelEditor, CannotMoveEmptyRowsUpDisplayValues) +TEST_F(ListModelEditor, cannot_move_empty_rows_up_display_values) { model.setListModel(listModelNode); QList indices = {index(-1, 1)}; @@ -1099,7 +1099,7 @@ TEST_F(ListModelEditor, CannotMoveEmptyRowsUpDisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, CannotMoveFirstRowUpDisplayValues) +TEST_F(ListModelEditor, cannot_move_first_row_up_display_values) { model.setListModel(listModelNode); QList indices = {index(0, 1), index(1, 2), index(0, 0)}; @@ -1112,7 +1112,7 @@ TEST_F(ListModelEditor, CannotMoveFirstRowUpDisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, MoveRowsUpDisplayValues) +TEST_F(ListModelEditor, move_rows_up_display_values) { model.setListModel(listModelNode); QList indices = {index(1, 1), index(2, 2), index(1, 0)}; @@ -1125,7 +1125,7 @@ TEST_F(ListModelEditor, MoveRowsUpDisplayValues) ElementsAre(IsInvalid(), "foo", 1, 42))); } -TEST_F(ListModelEditor, NoSelectionAfterCannotMoveLastRowsDown) +TEST_F(ListModelEditor, no_selection_after_cannot_move_last_rows_down) { model.setListModel(listModelNode); QList indices = {index(0, 1), index(1, 2), index(0, 0)}; @@ -1135,7 +1135,7 @@ TEST_F(ListModelEditor, NoSelectionAfterCannotMoveLastRowsDown) ASSERT_THAT(selection.indexes(), IsEmpty()); } -TEST_F(ListModelEditor, NoSelectionAfterMoveEmptyRowsDown) +TEST_F(ListModelEditor, no_selection_after_move_empty_rows_down) { model.setListModel(listModelNode); QList indices = {index(-1, 1)}; @@ -1145,7 +1145,7 @@ TEST_F(ListModelEditor, NoSelectionAfterMoveEmptyRowsDown) ASSERT_THAT(selection.indexes(), IsEmpty()); } -TEST_F(ListModelEditor, SelectionAfterMoveRowsDown) +TEST_F(ListModelEditor, selection_after_move_rows_down) { model.setListModel(listModelNode); QList indices = {index(1, 1), index(2, 2), index(1, 0)}; @@ -1163,7 +1163,7 @@ TEST_F(ListModelEditor, SelectionAfterMoveRowsDown) index(1, 3))); } -TEST_F(ListModelEditor, CannotMoveEmptyRowsDown) +TEST_F(ListModelEditor, cannot_move_empty_rows_down) { model.setListModel(listModelNode); QList indices = {index(-1, 1)}; @@ -1173,7 +1173,7 @@ TEST_F(ListModelEditor, CannotMoveEmptyRowsDown) ASSERT_THAT(elements(listModelNode), ElementsAre(element1, element2, element3)); } -TEST_F(ListModelEditor, MoveRowDown) +TEST_F(ListModelEditor, move_row_down) { model.setListModel(listModelNode); QList indices = {index(1, 1), index(1, 2), index(1, 0)}; @@ -1183,7 +1183,7 @@ TEST_F(ListModelEditor, MoveRowDown) ASSERT_THAT(elements(listModelNode), ElementsAre(element1, element3, element2)); } -TEST_F(ListModelEditor, MoveRowsDown) +TEST_F(ListModelEditor, move_rows_down) { model.setListModel(listModelNode); QList indices = {index(1, 1), index(0, 2), index(1, 0)}; @@ -1193,7 +1193,7 @@ TEST_F(ListModelEditor, MoveRowsDown) ASSERT_THAT(elements(listModelNode), ElementsAre(element3, element1, element2)); } -TEST_F(ListModelEditor, CannotMoveLastRowsDown) +TEST_F(ListModelEditor, cannot_move_last_rows_down) { model.setListModel(listModelNode); QList indices = {index(2, 1), index(1, 2), index(2, 0)}; @@ -1203,7 +1203,7 @@ TEST_F(ListModelEditor, CannotMoveLastRowsDown) ASSERT_THAT(elements(listModelNode), ElementsAre(element1, element2, element3)); } -TEST_F(ListModelEditor, CannotMoveEmptyRowsDownDisplayValues) +TEST_F(ListModelEditor, cannot_move_empty_rows_down_display_values) { model.setListModel(listModelNode); QList indices = {index(-1, 1)}; @@ -1216,7 +1216,7 @@ TEST_F(ListModelEditor, CannotMoveEmptyRowsDownDisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, CannotMoveLastRowDownDisplayValues) +TEST_F(ListModelEditor, cannot_move_last_row_down_display_values) { model.setListModel(listModelNode); QList indices = {index(2, 1), index(1, 2), index(2, 0)}; @@ -1229,7 +1229,7 @@ TEST_F(ListModelEditor, CannotMoveLastRowDownDisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, MoveRowsDownDisplayValues) +TEST_F(ListModelEditor, move_rows_down_display_values) { model.setListModel(listModelNode); QList indices = {index(1, 1), index(0, 2), index(1, 0)}; @@ -1242,7 +1242,7 @@ TEST_F(ListModelEditor, MoveRowsDownDisplayValues) ElementsAre("pic.png", "bar", 4, IsInvalid()))); } -TEST_F(ListModelEditor, NoSelectionAfterCannotMoveLastRowsUp) +TEST_F(ListModelEditor, no_selection_after_cannot_move_last_rows_up) { model.setListModel(listModelNode); QList indices = {index(2, 1), index(1, 2), index(2, 0)}; @@ -1252,7 +1252,7 @@ TEST_F(ListModelEditor, NoSelectionAfterCannotMoveLastRowsUp) ASSERT_THAT(selection.indexes(), IsEmpty()); } -TEST_F(ListModelEditor, NoSelectionAfterMoveEmptyRowsUp) +TEST_F(ListModelEditor, no_selection_after_move_empty_rows_up) { model.setListModel(listModelNode); QList indices = {index(-1, 1)}; @@ -1262,7 +1262,7 @@ TEST_F(ListModelEditor, NoSelectionAfterMoveEmptyRowsUp) ASSERT_THAT(selection.indexes(), IsEmpty()); } -TEST_F(ListModelEditor, SelectionAfterMoveRowsUp) +TEST_F(ListModelEditor, selection_after_move_rows_up) { model.setListModel(listModelNode); QList indices = {index(1, 1), index(0, 2), index(1, 0)}; @@ -1280,14 +1280,14 @@ TEST_F(ListModelEditor, SelectionAfterMoveRowsUp) index(2, 3))); } -TEST_F(ListModelEditor, ListViewHasNoModel) +TEST_F(ListModelEditor, list_view_has_no_model) { model.setListView(listViewNode); ASSERT_THAT(listViewNode.nodeProperty("model").modelNode().type(), Eq("QtQml.Models.ListModel")); } -TEST_F(ListModelEditor, ListViewHasModelInside) +TEST_F(ListModelEditor, list_view_has_model_inside) { listViewNode.nodeProperty("model").reparentHere(listModelNode); @@ -1299,7 +1299,7 @@ TEST_F(ListModelEditor, ListViewHasModelInside) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, ListViewHasModelBinding) +TEST_F(ListModelEditor, list_view_has_model_binding) { listModelNode.setIdWithoutRefactoring("listModel"); listViewNode.bindingProperty("model").setExpression("listModel"); @@ -1312,7 +1312,7 @@ TEST_F(ListModelEditor, ListViewHasModelBinding) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, AddBooleanDisplayValues) +TEST_F(ListModelEditor, add_boolean_display_values) { model.setListModel(listModelNode); @@ -1324,7 +1324,7 @@ TEST_F(ListModelEditor, AddBooleanDisplayValues) ElementsAre("pic.png", "poo", 111, IsInvalid()))); } -TEST_F(ListModelEditor, AddBooleanProperties) +TEST_F(ListModelEditor, add_boolean_properties) { model.setListModel(listModelNode); @@ -1342,7 +1342,7 @@ TEST_F(ListModelEditor, AddBooleanProperties) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, AddTrueAsStringProperties) +TEST_F(ListModelEditor, add_true_as_string_properties) { model.setListModel(listModelNode); @@ -1360,7 +1360,7 @@ TEST_F(ListModelEditor, AddTrueAsStringProperties) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, AddFalseAsStringProperties) +TEST_F(ListModelEditor, add_false_as_string_properties) { model.setListModel(listModelNode); @@ -1378,7 +1378,7 @@ TEST_F(ListModelEditor, AddFalseAsStringProperties) IsVariantProperty("value", 111)))); } -TEST_F(ListModelEditor, GoIntoComponentForBinding) +TEST_F(ListModelEditor, go_into_component_for_binding) { EXPECT_CALL(goIntoComponentMock, Call(Eq(listModelNode))) .WillRepeatedly(Return(mockComponentView.rootModelNode())); @@ -1390,7 +1390,7 @@ TEST_F(ListModelEditor, GoIntoComponentForBinding) ASSERT_THAT(displayValues(), ElementsAre(ElementsAre("com", 11, 55))); } -TEST_F(ListModelEditor, GoIntoComponentForModelNode) +TEST_F(ListModelEditor, go_into_component_for_model_node) { EXPECT_CALL(goIntoComponentMock, Call(Eq(listModelNode))) .WillRepeatedly(Return(mockComponentView.rootModelNode())); diff --git a/tests/unit/tests/unittests/model/import-test.cpp b/tests/unit/tests/unittests/model/import-test.cpp index 25382862b2b..695d286f376 100644 --- a/tests/unit/tests/unittests/model/import-test.cpp +++ b/tests/unit/tests/unittests/model/import-test.cpp @@ -7,7 +7,7 @@ namespace { -TEST(Import, ParseVersion) +TEST(Import, parse_version) { auto import = QmlDesigner::Import::createLibraryImport("Qml", "6.5"); @@ -16,7 +16,7 @@ TEST(Import, ParseVersion) ASSERT_THAT(version, FieldsAre(6, 5)); } -TEST(Import, ParseMajorVersion) +TEST(Import, parse_major_version) { auto import = QmlDesigner::Import::createLibraryImport("Qml", "6.5"); @@ -25,7 +25,7 @@ TEST(Import, ParseMajorVersion) ASSERT_THAT(version, 6); } -TEST(Import, MajorVersionIsInvalidForEmptyString) +TEST(Import, major_version_is_invalid_for_empty_string) { auto import = QmlDesigner::Import::createLibraryImport("Qml"); @@ -34,7 +34,7 @@ TEST(Import, MajorVersionIsInvalidForEmptyString) ASSERT_THAT(version, -1); } -TEST(Import, MajorVersionIsInvalidForBrokenString) +TEST(Import, major_version_is_invalid_for_broken_string) { auto import = QmlDesigner::Import::createLibraryImport("Qml", "6,5"); @@ -43,7 +43,7 @@ TEST(Import, MajorVersionIsInvalidForBrokenString) ASSERT_THAT(version, -1); } -TEST(Import, ParseMinorVersion) +TEST(Import, parse_minor_version) { auto import = QmlDesigner::Import::createLibraryImport("Qml", "6.5"); @@ -52,7 +52,7 @@ TEST(Import, ParseMinorVersion) ASSERT_THAT(version, 5); } -TEST(Import, MinorVersionIsInvalidForEmptyString) +TEST(Import, minor_version_is_invalid_for_empty_string) { auto import = QmlDesigner::Import::createLibraryImport("Qml"); @@ -61,7 +61,7 @@ TEST(Import, MinorVersionIsInvalidForEmptyString) ASSERT_THAT(version, -1); } -TEST(Import, MinorVersionIsInvalidForBrokenString) +TEST(Import, minor_version_is_invalid_for_broken_string) { auto import = QmlDesigner::Import::createLibraryImport("Qml", "6,5"); @@ -70,7 +70,7 @@ TEST(Import, MinorVersionIsInvalidForBrokenString) ASSERT_THAT(version, -1); } -TEST(Import, VersionIsNotEmpty) +TEST(Import, version_is_not_empty) { auto import = QmlDesigner::Import::createLibraryImport("Qml", "6.5"); @@ -79,7 +79,7 @@ TEST(Import, VersionIsNotEmpty) ASSERT_FALSE(version.isEmpty()); } -TEST(Import, BrokenVersionStringIsEmptyVersion) +TEST(Import, broken_version_string_is_empty_version) { auto import = QmlDesigner::Import::createLibraryImport("Qml", "6"); @@ -88,7 +88,7 @@ TEST(Import, BrokenVersionStringIsEmptyVersion) ASSERT_TRUE(version.isEmpty()); } -TEST(Import, EmptyVersionStringIsEmptyVersion) +TEST(Import, empty_version_string_is_empty_version) { auto import = QmlDesigner::Import::createLibraryImport("Qml"); @@ -97,7 +97,7 @@ TEST(Import, EmptyVersionStringIsEmptyVersion) ASSERT_TRUE(version.isEmpty()); } -TEST(Import, SameVersionsAreEqual) +TEST(Import, same_versions_are_equal) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2{6, 5}; @@ -107,7 +107,7 @@ TEST(Import, SameVersionsAreEqual) ASSERT_TRUE(isEqual); } -TEST(Import, InvalidVersionsAreEqual) +TEST(Import, invalid_versions_are_equal) { QmlDesigner::Version version1; QmlDesigner::Version version2; @@ -117,7 +117,7 @@ TEST(Import, InvalidVersionsAreEqual) ASSERT_TRUE(isEqual); } -TEST(Import, DifferentMinorVersionsAreNotEqual) +TEST(Import, different_minor_versions_are_not_equal) { QmlDesigner::Version version1{6, 4}; QmlDesigner::Version version2{6, 5}; @@ -127,7 +127,7 @@ TEST(Import, DifferentMinorVersionsAreNotEqual) ASSERT_FALSE(isEqual); } -TEST(Import, DifferentMajorVersionsAreNotEqual) +TEST(Import, different_major_versions_are_not_equal) { QmlDesigner::Version version1{5, 5}; QmlDesigner::Version version2{6, 5}; @@ -137,7 +137,7 @@ TEST(Import, DifferentMajorVersionsAreNotEqual) ASSERT_FALSE(isEqual); } -TEST(Import, LessMinorVersionsAreLess) +TEST(Import, less_minor_versions_are_less) { QmlDesigner::Version version1{6, 4}; QmlDesigner::Version version2{6, 5}; @@ -147,7 +147,7 @@ TEST(Import, LessMinorVersionsAreLess) ASSERT_TRUE(isLess); } -TEST(Import, LessMajorVersionsAreLess) +TEST(Import, less_major_versions_are_less) { QmlDesigner::Version version1{5, 15}; QmlDesigner::Version version2{6, 5}; @@ -157,7 +157,7 @@ TEST(Import, LessMajorVersionsAreLess) ASSERT_TRUE(isLess); } -TEST(Import, SameVersionsAreNotLess) +TEST(Import, same_versions_are_not_less) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2{6, 5}; @@ -167,7 +167,7 @@ TEST(Import, SameVersionsAreNotLess) ASSERT_FALSE(isLess); } -TEST(Import, EmptyVersionIsNotLess) +TEST(Import, empty_version_is_not_less) { QmlDesigner::Version version1; QmlDesigner::Version version2{6, 5}; @@ -177,7 +177,7 @@ TEST(Import, EmptyVersionIsNotLess) ASSERT_FALSE(isLess); } -TEST(Import, NonEmptyVersionIsIsLessThanEmptyVersion) +TEST(Import, non_empty_version_is_is_less_than_empty_version) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2; @@ -187,7 +187,7 @@ TEST(Import, NonEmptyVersionIsIsLessThanEmptyVersion) ASSERT_TRUE(isLess); } -TEST(Import, GreaterMinorVersionsAreGreater) +TEST(Import, greater_minor_versions_are_greater) { QmlDesigner::Version version1{6, 6}; QmlDesigner::Version version2{6, 5}; @@ -197,7 +197,7 @@ TEST(Import, GreaterMinorVersionsAreGreater) ASSERT_TRUE(isGreater); } -TEST(Import, GreaterMajorVersionsAreGreater) +TEST(Import, greater_major_versions_are_greater) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2{5, 15}; @@ -207,7 +207,7 @@ TEST(Import, GreaterMajorVersionsAreGreater) ASSERT_TRUE(isGreater); } -TEST(Import, SameVersionsAreNotGreater) +TEST(Import, same_versions_are_not_greater) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2{6, 5}; @@ -217,7 +217,7 @@ TEST(Import, SameVersionsAreNotGreater) ASSERT_FALSE(isGreater); } -TEST(Import, EmptyVersionIsGreater) +TEST(Import, empty_version_is_greater) { QmlDesigner::Version version1; QmlDesigner::Version version2{6, 5}; @@ -227,7 +227,7 @@ TEST(Import, EmptyVersionIsGreater) ASSERT_TRUE(isGreater); } -TEST(Import, NonEmptyVersionIsIsNotGreaterThanEmptyVersion) +TEST(Import, non_empty_version_is_is_not_greater_than_empty_version) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2; @@ -237,7 +237,7 @@ TEST(Import, NonEmptyVersionIsIsNotGreaterThanEmptyVersion) ASSERT_FALSE(isGreater); } -TEST(Import, LessEqualMinorVersionsAreLessEqual) +TEST(Import, less_equal_minor_versions_are_less_equal) { QmlDesigner::Version version1{6, 4}; QmlDesigner::Version version2{6, 5}; @@ -247,7 +247,7 @@ TEST(Import, LessEqualMinorVersionsAreLessEqual) ASSERT_TRUE(isLessEqual); } -TEST(Import, LessqualMajorVersionsAreLessqual) +TEST(Import, lessqual_major_versions_are_lessqual) { QmlDesigner::Version version1{5, 15}; QmlDesigner::Version version2{6, 5}; @@ -257,7 +257,7 @@ TEST(Import, LessqualMajorVersionsAreLessqual) ASSERT_TRUE(isLessEqual); } -TEST(Import, SameVersionsAreLessqual) +TEST(Import, same_versions_are_lessqual) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2{6, 5}; @@ -267,7 +267,7 @@ TEST(Import, SameVersionsAreLessqual) ASSERT_TRUE(isLessEqual); } -TEST(Import, EmptyVersionIsNotLessqual) +TEST(Import, empty_version_is_not_lessqual) { QmlDesigner::Version version1; QmlDesigner::Version version2{6, 5}; @@ -277,7 +277,7 @@ TEST(Import, EmptyVersionIsNotLessqual) ASSERT_FALSE(isLessEqual); } -TEST(Import, NonEmptyVersionIsIsLessqualThanEmptyVersion) +TEST(Import, non_empty_version_is_is_lessqual_than_empty_version) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2; @@ -287,7 +287,7 @@ TEST(Import, NonEmptyVersionIsIsLessqualThanEmptyVersion) ASSERT_TRUE(isLessEqual); } -TEST(Import, GreaterEqualMinorVersionsAreGreaterEqual) +TEST(Import, greater_equal_minor_versions_are_greater_equal) { QmlDesigner::Version version1{6, 6}; QmlDesigner::Version version2{6, 5}; @@ -297,7 +297,7 @@ TEST(Import, GreaterEqualMinorVersionsAreGreaterEqual) ASSERT_TRUE(isGreaterEqual); } -TEST(Import, GreaterEqualMajorVersionsAreGreaterEqual) +TEST(Import, greater_equal_major_versions_are_greater_equal) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2{5, 15}; @@ -307,7 +307,7 @@ TEST(Import, GreaterEqualMajorVersionsAreGreaterEqual) ASSERT_TRUE(isGreaterEqual); } -TEST(Import, SameVersionsAreGreaterEqual) +TEST(Import, same_versions_are_greater_equal) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2{6, 5}; @@ -317,7 +317,7 @@ TEST(Import, SameVersionsAreGreaterEqual) ASSERT_TRUE(isGreaterEqual); } -TEST(Import, EmptyVersionIsGreaterEqual) +TEST(Import, empty_version_is_greater_equal) { QmlDesigner::Version version1; QmlDesigner::Version version2{6, 5}; @@ -327,7 +327,7 @@ TEST(Import, EmptyVersionIsGreaterEqual) ASSERT_TRUE(isGreaterEqual); } -TEST(Import, NonEmptyVersionIsIsNotGreaterEqualThanEmptyVersion) +TEST(Import, non_empty_version_is_is_not_greater_equal_than_empty_version) { QmlDesigner::Version version1{6, 5}; QmlDesigner::Version version2; diff --git a/tests/unit/tests/unittests/model/model-test.cpp b/tests/unit/tests/unittests/model/model-test.cpp index 9a971381084..75e865aa1de 100644 --- a/tests/unit/tests/unittests/model/model-test.cpp +++ b/tests/unit/tests/unittests/model/model-test.cpp @@ -91,7 +91,7 @@ protected: ModelNode rootNode; }; -TEST_F(Model, ModelNodeDestroyIsCallingModelResourceManagementRemoveNode) +TEST_F(Model, model_node_destroy_is_calling_model_resource_management_remove_node) { auto node = createNodeWithParent(rootNode); @@ -100,7 +100,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingModelResourceManagementRemoveNode) node.destroy(); } -TEST_F(Model, ModelNodeRemoveProperyIsCallingModelResourceManagementRemoveProperty) +TEST_F(Model, model_node_remove_propery_is_calling_model_resource_management_remove_property) { auto property = rootNode.variantProperty("foo"); property.setValue(4); @@ -110,7 +110,7 @@ TEST_F(Model, ModelNodeRemoveProperyIsCallingModelResourceManagementRemoveProper rootNode.removeProperty("foo"); } -TEST_F(Model, NodeAbstractPropertyReparentHereIsCallingModelResourceManagementRemoveProperty) +TEST_F(Model, node_abstract_property_reparent_here_is_calling_model_resource_management_remove_property) { auto node = createNodeWithParent(rootNode); auto property = rootNode.variantProperty("foo"); @@ -121,7 +121,7 @@ TEST_F(Model, NodeAbstractPropertyReparentHereIsCallingModelResourceManagementRe rootNode.nodeListProperty("foo").reparentHere(node); } -TEST_F(Model, NodePropertySetModelNodeIsCallingModelResourceManagementRemoveProperty) +TEST_F(Model, node_property_set_model_node_is_calling_model_resource_management_remove_property) { auto node = createNodeWithParent(rootNode); auto property = rootNode.variantProperty("foo"); @@ -132,7 +132,7 @@ TEST_F(Model, NodePropertySetModelNodeIsCallingModelResourceManagementRemoveProp rootNode.nodeProperty("foo").setModelNode(node); } -TEST_F(Model, VariantPropertySetValueIsCallingModelResourceManagementRemoveProperty) +TEST_F(Model, variant_property_set_value_is_calling_model_resource_management_remove_property) { auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); @@ -143,7 +143,7 @@ TEST_F(Model, VariantPropertySetValueIsCallingModelResourceManagementRemovePrope } TEST_F(Model, - VariantPropertySetDynamicTypeNameAndEnumerationIsCallingModelResourceManagementRemoveProperty) + variant_property_set_dynamic_type_name_and_enumeration_is_calling_model_resource_management_remove_property) { auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); @@ -153,7 +153,7 @@ TEST_F(Model, rootNode.variantProperty("foo").setDynamicTypeNameAndEnumeration("int", "Ha"); } -TEST_F(Model, VariantPropertySetDynamicTypeNameAndValueIsCallingModelResourceManagementRemoveProperty) +TEST_F(Model, variant_property_set_dynamic_type_name_and_value_is_calling_model_resource_management_remove_property) { auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); @@ -163,7 +163,7 @@ TEST_F(Model, VariantPropertySetDynamicTypeNameAndValueIsCallingModelResourceMan rootNode.variantProperty("foo").setDynamicTypeNameAndValue("int", 7); } -TEST_F(Model, BindingPropertySetExpressionIsCallingModelResourceManagementRemoveProperty) +TEST_F(Model, binding_property_set_expression_is_calling_model_resource_management_remove_property) { auto property = rootNode.variantProperty("foo"); property.setValue(4); @@ -174,7 +174,7 @@ TEST_F(Model, BindingPropertySetExpressionIsCallingModelResourceManagementRemove } TEST_F(Model, - BindingPropertySetDynamicTypeNameAndExpressionIsCallingModelResourceManagementRemoveProperty) + binding_property_set_dynamic_type_name_and_expression_is_calling_model_resource_management_remove_property) { auto property = rootNode.variantProperty("foo"); property.setValue(4); @@ -184,7 +184,7 @@ TEST_F(Model, rootNode.bindingProperty("foo").setDynamicTypeNameAndExpression("int", "blah"); } -TEST_F(Model, SignalHandlerPropertySetSourceIsCallingModelResourceManagementRemoveProperty) +TEST_F(Model, signal_handler_property_set_source_is_calling_model_resource_management_remove_property) { auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); @@ -194,7 +194,7 @@ TEST_F(Model, SignalHandlerPropertySetSourceIsCallingModelResourceManagementRemo rootNode.signalHandlerProperty("foo").setSource("blah"); } -TEST_F(Model, SignalDeclarationPropertySetSignatureIsCallingModelResourceManagementRemoveProperty) +TEST_F(Model, signal_declaration_property_set_signature_is_calling_model_resource_management_remove_property) { auto property = rootNode.bindingProperty("foo"); property.setExpression("blah"); @@ -204,7 +204,7 @@ TEST_F(Model, SignalDeclarationPropertySetSignatureIsCallingModelResourceManagem rootNode.signalDeclarationProperty("foo").setSignature("blah"); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeAboutToBeRemoved) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_node_about_to_be_removed) { auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); @@ -217,7 +217,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeAboutToBeRemoved) node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeRemoved) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_node_removed) { auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); @@ -230,7 +230,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeRemoved) node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeRemovedWithValidNodes) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_node_removed_with_valid_nodes) { auto node = createNodeWithParent(rootNode); auto node2 = createNodeWithParent(rootNode); @@ -243,7 +243,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewNodeRemovedWithValidNodes) node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesAboutToBeRemoved) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_properties_about_to_be_removed) { auto node = createNodeWithParent(rootNode); auto property = createProperty(rootNode, "foo"); @@ -256,7 +256,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesAboutToBeRemoved) node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesRemoved) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_properties_removed) { auto node = createNodeWithParent(rootNode); auto property = createProperty(rootNode, "foo"); @@ -269,7 +269,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesRemoved) node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesRemovedOnlyWithValidProperties) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_properties_removed_only_with_valid_properties) { auto node = createNodeWithParent(rootNode); auto property = createProperty(rootNode, "foo"); @@ -282,7 +282,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewPropertiesRemovedOnlyWithVali node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesAboutToBeChanged) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_binding_properties_about_to_be_changed) { auto node = createNodeWithParent(rootNode); auto property = createBindingProperty(rootNode, "foo"); @@ -296,7 +296,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesAboutToBeCha node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesChanged) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_binding_properties_changed) { auto node = createNodeWithParent(rootNode); auto property = createBindingProperty(rootNode, "foo"); @@ -309,7 +309,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesChanged) node.destroy(); } -TEST_F(Model, ModelNodeDestroyIsChangingBindingPropertyExpression) +TEST_F(Model, model_node_destroy_is_changing_binding_property_expression) { auto node = createNodeWithParent(rootNode); auto property = createBindingProperty(rootNode, "foo"); @@ -323,7 +323,7 @@ TEST_F(Model, ModelNodeDestroyIsChangingBindingPropertyExpression) ASSERT_THAT(property2.expression(), "er"); } -TEST_F(Model, ModelNodeDestroyIsOnlyChangingExistingBindingProperty) +TEST_F(Model, model_node_destroy_is_only_changing_existing_binding_property) { auto node = createNodeWithParent(rootNode); auto property = rootNode.bindingProperty("foo"); @@ -335,7 +335,7 @@ TEST_F(Model, ModelNodeDestroyIsOnlyChangingExistingBindingProperty) ASSERT_FALSE(rootNode.hasBindingProperty("foo")); } -TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesChangedOnlyWithExistingProperties) +TEST_F(Model, model_node_destroy_is_calling_abstract_view_binding_properties_changed_only_with_existing_properties) { auto node = createNodeWithParent(rootNode); auto property = createBindingProperty(rootNode, "foo"); @@ -349,7 +349,7 @@ TEST_F(Model, ModelNodeDestroyIsCallingAbstractViewBindingPropertiesChangedOnlyW node.destroy(); } -TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeAboutToBeRemoved) +TEST_F(Model, model_node_remove_property_is_calling_abstract_view_node_about_to_be_removed) { auto property = createProperty(rootNode, "foo"); auto node = createNodeWithParent(rootNode); @@ -363,7 +363,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeAboutToBeRemoved) rootNode.removeProperty("foo"); } -TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeRemoved) +TEST_F(Model, model_node_remove_property_is_calling_abstract_view_node_removed) { auto property = createProperty(rootNode, "foo"); auto node = createNodeWithParent(rootNode); @@ -377,7 +377,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeRemoved) rootNode.removeProperty("foo"); } -TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeRemovedWithValidNodes) +TEST_F(Model, model_node_remove_property_is_calling_abstract_view_node_removed_with_valid_nodes) { auto property = createProperty(rootNode, "foo"); auto node = createNodeWithParent(rootNode); @@ -391,7 +391,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewNodeRemovedWithValidNo rootNode.removeProperty("foo"); } -TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesAboutToBeRemoved) +TEST_F(Model, model_node_remove_property_is_calling_abstract_view_properties_about_to_be_removed) { auto property = createProperty(rootNode, "yi"); auto property2 = createProperty(rootNode, "er"); @@ -403,7 +403,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesAboutToBeRem rootNode.removeProperty("yi"); } -TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesRemoved) +TEST_F(Model, model_node_remove_property_is_calling_abstract_view_properties_removed) { auto property = createProperty(rootNode, "yi"); auto property2 = createProperty(rootNode, "er"); @@ -415,7 +415,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesRemoved) rootNode.removeProperty("yi"); } -TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesRemovedOnlyWithValidProperties) +TEST_F(Model, model_node_remove_property_is_calling_abstract_view_properties_removed_only_with_valid_properties) { auto property = createProperty(rootNode, "yi"); auto property2 = createProperty(rootNode, "er"); @@ -427,7 +427,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewPropertiesRemovedOnlyW rootNode.removeProperty("yi"); } -TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesAboutToBeChanged) +TEST_F(Model, model_node_remove_property_is_calling_abstract_view_binding_properties_about_to_be_changed) { auto property = createProperty(rootNode, "yi"); auto property1 = createBindingProperty(rootNode, "foo"); @@ -441,7 +441,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesAbout rootNode.removeProperty("yi"); } -TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesChanged) +TEST_F(Model, model_node_remove_property_is_calling_abstract_view_binding_properties_changed) { auto property = createProperty(rootNode, "yi"); auto property1 = createBindingProperty(rootNode, "foo"); @@ -456,7 +456,7 @@ TEST_F(Model, ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesChang } TEST_F(Model, - ModelNodeRemovePropertyIsCallingAbstractViewBindingPropertiesChangedOnlyWithValidProperties) + model_node_remove_property_is_calling_abstract_view_binding_properties_changed_only_with_valid_properties) { auto property = createProperty(rootNode, "yi"); auto property1 = createBindingProperty(rootNode, "foo"); @@ -470,7 +470,7 @@ TEST_F(Model, rootNode.removeProperty("yi"); } -TEST_F(Model, ByDefaultRemoveModelNodeRemovesNode) +TEST_F(Model, by_default_remove_model_node_removes_node) { model.detachView(&viewMock); QmlDesigner::Model newModel{projectStorageMock, "QtQuick.Item"}; @@ -482,7 +482,7 @@ TEST_F(Model, ByDefaultRemoveModelNodeRemovesNode) node.destroy(); } -TEST_F(Model, ByDefaultRemovePropertiesRemovesProperty) +TEST_F(Model, by_default_remove_properties_removes_property) { model.detachView(&viewMock); QmlDesigner::Model newModel{projectStorageMock, "QtQuick.Item"}; @@ -495,7 +495,7 @@ TEST_F(Model, ByDefaultRemovePropertiesRemovesProperty) rootNode.removeProperty("yi"); } -TEST_F(Model, ByDefaultRemoveModelNodeInFactoryMethodCallsRemovesNode) +TEST_F(Model, by_default_remove_model_node_in_factory_method_calls_removes_node) { model.detachView(&viewMock); auto newModel = QmlDesigner::Model::create(projectStorageMock, "QtQuick.Item"); @@ -507,7 +507,7 @@ TEST_F(Model, ByDefaultRemoveModelNodeInFactoryMethodCallsRemovesNode) node.destroy(); } -TEST_F(Model, ByDefaultRemovePropertiesInFactoryMethodCallsRemoveProperty) +TEST_F(Model, by_default_remove_properties_in_factory_method_calls_remove_property) { model.detachView(&viewMock); auto newModel = QmlDesigner::Model::create(projectStorageMock, "QtQuick.Item"); @@ -520,7 +520,7 @@ TEST_F(Model, ByDefaultRemovePropertiesInFactoryMethodCallsRemoveProperty) rootNode.removeProperty("yi"); } -TEST_F(Model, RemoveModelNodes) +TEST_F(Model, remove_model_nodes) { auto node = createNodeWithParent(rootNode, "yi"); auto node2 = createNodeWithParent(rootNode, "er"); @@ -531,7 +531,7 @@ TEST_F(Model, RemoveModelNodes) model.removeModelNodes({node, node2}); } -TEST_F(Model, RemoveModelNodesFiltersInvalidModelNodes) +TEST_F(Model, remove_model_nodes_filters_invalid_model_nodes) { auto node = createNodeWithParent(rootNode, "yi"); @@ -540,14 +540,14 @@ TEST_F(Model, RemoveModelNodesFiltersInvalidModelNodes) model.removeModelNodes({{}, node}); } -TEST_F(Model, RemoveModelNodesForOnlyInvalidModelNodesDoesNothing) +TEST_F(Model, remove_model_nodes_for_only_invalid_model_nodes_does_nothing) { EXPECT_CALL(resourceManagementMock, removeNodes(_, _)).Times(0); model.removeModelNodes({{}}); } -TEST_F(Model, RemoveModelNodesReverse) +TEST_F(Model, remove_model_nodes_reverse) { auto node = createNodeWithParent(rootNode, "yi"); auto node2 = createNodeWithParent(rootNode, "er"); @@ -558,7 +558,7 @@ TEST_F(Model, RemoveModelNodesReverse) model.removeModelNodes({node2, node}); } -TEST_F(Model, RemoveModelNodesCallsNotifier) +TEST_F(Model, remove_model_nodes_calls_notifier) { auto node = createNodeWithParent(rootNode, "yi"); auto node2 = createNodeWithParent(rootNode, "er"); @@ -579,7 +579,7 @@ TEST_F(Model, RemoveModelNodesCallsNotifier) model.removeModelNodes({node, node2}); } -TEST_F(Model, RemoveModelNodesBypassesModelResourceManagement) +TEST_F(Model, remove_model_nodes_bypasses_model_resource_management) { auto node = createNodeWithParent(rootNode, "yi"); auto node2 = createNodeWithParent(rootNode, "er"); @@ -599,7 +599,7 @@ TEST_F(Model, RemoveModelNodesBypassesModelResourceManagement) model.removeModelNodes({node, node2}, QmlDesigner::BypassModelResourceManagement::Yes); } -TEST_F(Model, ByDefaultRemoveModelNodesInFactoryMethodCallsRemovesNode) +TEST_F(Model, by_default_remove_model_nodes_in_factory_method_calls_removes_node) { model.detachView(&viewMock); QmlDesigner::Model newModel{projectStorageMock, "QtQuick.Item"}; @@ -614,7 +614,7 @@ TEST_F(Model, ByDefaultRemoveModelNodesInFactoryMethodCallsRemovesNode) newModel.removeModelNodes({node, node2}); } -TEST_F(Model, RemoveProperties) +TEST_F(Model, remove_properties) { auto property = createProperty(rootNode, "yi"); auto property2 = createProperty(rootNode, "er"); @@ -625,7 +625,7 @@ TEST_F(Model, RemoveProperties) model.removeProperties({property, property2}); } -TEST_F(Model, RemovePropertiesFiltersInvalidProperties) +TEST_F(Model, remove_properties_filters_invalid_properties) { auto property = createProperty(rootNode, "yi"); @@ -634,14 +634,14 @@ TEST_F(Model, RemovePropertiesFiltersInvalidProperties) model.removeProperties({{}, property}); } -TEST_F(Model, RemovePropertiesForOnlyInvalidPropertiesDoesNothing) +TEST_F(Model, remove_properties_for_only_invalid_properties_does_nothing) { EXPECT_CALL(resourceManagementMock, removeProperties(_, _)).Times(0); model.removeProperties({{}}); } -TEST_F(Model, RemovePropertiesReverse) +TEST_F(Model, remove_properties_reverse) { auto property = createProperty(rootNode, "yi"); auto property2 = createProperty(rootNode, "er"); @@ -652,7 +652,7 @@ TEST_F(Model, RemovePropertiesReverse) model.removeProperties({property2, property}); } -TEST_F(Model, RemovePropertiesCallsNotifier) +TEST_F(Model, remove_properties_calls_notifier) { auto node = createNodeWithParent(rootNode, "yi"); auto node2 = createNodeWithParent(rootNode, "er"); @@ -673,7 +673,7 @@ TEST_F(Model, RemovePropertiesCallsNotifier) model.removeProperties({property, property3}); } -TEST_F(Model, RemovePropertiesBypassesModelResourceManagement) +TEST_F(Model, remove_properties_bypasses_model_resource_management) { auto node = createNodeWithParent(rootNode, "yi"); auto node2 = createNodeWithParent(rootNode, "er"); @@ -692,7 +692,7 @@ TEST_F(Model, RemovePropertiesBypassesModelResourceManagement) model.removeProperties({property, property3}, QmlDesigner::BypassModelResourceManagement::Yes); } -TEST_F(Model, ByDefaultRemovePropertiesInFactoryMethodCallsRemovesProperties) +TEST_F(Model, by_default_remove_properties_in_factory_method_calls_removes_properties) { model.detachView(&viewMock); QmlDesigner::Model newModel{projectStorageMock, "QtQuick.Item"}; diff --git a/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp b/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp index 4cbebc7b549..371c048f0dc 100644 --- a/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp +++ b/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp @@ -70,7 +70,7 @@ protected: ModelNode rootNode; }; -TEST_F(ModelResourceManagement, RemoveProperty) +TEST_F(ModelResourceManagement, remove_property) { auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); layerEnabledProperty.setValue(true); @@ -80,7 +80,7 @@ TEST_F(ModelResourceManagement, RemoveProperty) ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); } -TEST_F(ModelResourceManagement, RemoveMultipleProperties) +TEST_F(ModelResourceManagement, remove_multiple_properties) { auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); layerEnabledProperty.setValue(true); @@ -92,7 +92,7 @@ TEST_F(ModelResourceManagement, RemoveMultipleProperties) ASSERT_THAT(resources.removeProperties, IsSupersetOf({layerEnabledProperty, layerHiddenProperty})); } -TEST_F(ModelResourceManagement, RemoveNode) +TEST_F(ModelResourceManagement, remove_node) { auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); @@ -101,7 +101,7 @@ TEST_F(ModelResourceManagement, RemoveNode) ASSERT_THAT(resources.removeModelNodes, Contains(node)); } -TEST_F(ModelResourceManagement, RemoveMultipleNodes) +TEST_F(ModelResourceManagement, remove_multiple_nodes) { auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); auto node2 = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); @@ -111,7 +111,7 @@ TEST_F(ModelResourceManagement, RemoveMultipleNodes) ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({node, node2})); } -TEST_F(ModelResourceManagement, RemoveMultipleNodesOnce) +TEST_F(ModelResourceManagement, remove_multiple_nodes_once) { auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); auto node2 = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); @@ -121,7 +121,7 @@ TEST_F(ModelResourceManagement, RemoveMultipleNodesOnce) ASSERT_THAT(resources.removeModelNodes, UnorderedElementsAre(node, node2)); } -TEST_F(ModelResourceManagement, DontRemoveChildNodes) +TEST_F(ModelResourceManagement, dont_remove_child_nodes) { auto node = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty()); auto childNode = createNodeWithParent("QtQuick.Item", node.defaultNodeListProperty()); @@ -131,7 +131,7 @@ TEST_F(ModelResourceManagement, DontRemoveChildNodes) ASSERT_THAT(resources.removeModelNodes, Not(Contains(childNode))); } -TEST_F(ModelResourceManagement, RemovePropertyLayerEnabled) +TEST_F(ModelResourceManagement, remove_property_layer_enabled) { auto node = createNodeWithParent("QtQuick.Item", rootNode.nodeProperty("layer.effect")); auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); @@ -142,7 +142,7 @@ TEST_F(ModelResourceManagement, RemovePropertyLayerEnabled) ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); } -TEST_F(ModelResourceManagement, RemovePropertyLayerEnabledIfLayerEffectPropertyIsRemoved) +TEST_F(ModelResourceManagement, remove_property_layer_enabled_if_layer_effect_property_is_removed) { auto layerEffectProperty = rootNode.nodeProperty("layer.effect"); auto node = createNodeWithParent("QtQuick.Item", layerEffectProperty); @@ -154,7 +154,7 @@ TEST_F(ModelResourceManagement, RemovePropertyLayerEnabledIfLayerEffectPropertyI ASSERT_THAT(resources.removeProperties, Contains(layerEnabledProperty)); } -TEST_F(ModelResourceManagement, DontRemovePropertyLayerEnabledIfNotExists) +TEST_F(ModelResourceManagement, dont_remove_property_layer_enabled_if_not_exists) { auto node = createNodeWithParent("QtQuick.Item", rootNode.nodeProperty("layer.effect")); auto layerEnabledProperty = rootNode.variantProperty("layer.enabled"); @@ -164,7 +164,7 @@ TEST_F(ModelResourceManagement, DontRemovePropertyLayerEnabledIfNotExists) ASSERT_THAT(resources.removeProperties, Not(Contains(layerEnabledProperty))); } -TEST_F(ModelResourceManagement, RemovePropertyWithId) +TEST_F(ModelResourceManagement, remove_property_with_id) { auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); auto property = rootNode.bindingProperty("foo"); @@ -175,7 +175,7 @@ TEST_F(ModelResourceManagement, RemovePropertyWithId) ASSERT_THAT(resources.removeProperties, Contains(property)); } -TEST_F(ModelResourceManagement, RemovePropertyWithIdInComplexExpression) +TEST_F(ModelResourceManagement, remove_property_with_id_in_complex_expression) { auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); auto foobarProperty = rootNode.bindingProperty("foo"); @@ -185,7 +185,7 @@ TEST_F(ModelResourceManagement, RemovePropertyWithIdInComplexExpression) ASSERT_THAT(resources.removeProperties, Contains(foobarProperty)); } -TEST_F(ModelResourceManagement, DontRemovePropertyWithoutId) +TEST_F(ModelResourceManagement, dont_remove_property_without_id) { auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); auto barNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "bar"); @@ -197,7 +197,7 @@ TEST_F(ModelResourceManagement, DontRemovePropertyWithoutId) ASSERT_THAT(resources.removeProperties, Not(Contains(fooProperty))); } -TEST_F(ModelResourceManagement, RemovePropertyWithIdOnce) +TEST_F(ModelResourceManagement, remove_property_with_id_once) { auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); auto barNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "bar"); @@ -209,7 +209,7 @@ TEST_F(ModelResourceManagement, RemovePropertyWithIdOnce) ASSERT_THAT(resources.removeProperties, ElementsAre(foobarProperty)); } -TEST_F(ModelResourceManagement, RemoveAliasPropertyWithId) +TEST_F(ModelResourceManagement, remove_alias_property_with_id) { auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); auto property = rootNode.bindingProperty("foo"); @@ -220,7 +220,7 @@ TEST_F(ModelResourceManagement, RemoveAliasPropertyWithId) ASSERT_THAT(resources.removeProperties, Contains(property)); } -TEST_F(ModelResourceManagement, DontRemovePropertyWithDifferentIdWhichContainsIdString) +TEST_F(ModelResourceManagement, dont_remove_property_with_different_id_which_contains_id_string) { auto fooNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "foo"); auto property = rootNode.bindingProperty("foo"); @@ -274,7 +274,7 @@ INSTANTIATE_TEST_SUITE_P( TargetData{"FlowView.FlowItem", "FlowView.FlowTransition", "to"}, TargetData{"FlowView.FlowItem", "FlowView.FlowTransition", "from"})); -TEST_P(ForTarget, Remove) +TEST_P(ForTarget, remove) { sourceTargetProperty.setExpression("foo"); source2TargetProperty.setExpression("foo"); @@ -284,7 +284,7 @@ TEST_P(ForTarget, Remove) ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } -TEST_P(ForTarget, DontRemoveForDifferentTarget) +TEST_P(ForTarget, dont_remove_for_different_target) { sourceTargetProperty.setExpression("bar"); @@ -293,14 +293,14 @@ TEST_P(ForTarget, DontRemoveForDifferentTarget) ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } -TEST_P(ForTarget, DontRemoveKeyIfTargetIsNotSet) +TEST_P(ForTarget, dont_remove_key_if_target_is_not_set) { auto resources = management.removeNodes({fooNode}, &model); ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } -TEST_P(ForTarget, DontRemoveIfTargetCannotBeResolved) +TEST_P(ForTarget, dont_remove_if_target_cannot_be_resolved) { sourceTargetProperty.setExpression("not_exists"); @@ -348,7 +348,7 @@ INSTANTIATE_TEST_SUITE_P( TargetData{"FlowView.FlowTransition", "FlowView.FlowWildcard", "targets"}, TargetData{"QtQuick.Item", "QtQuick.PropertyAnimation", "targets"})); -TEST_P(ForTargets, Remove) +TEST_P(ForTargets, remove) { sourceTargetsProperty.setExpression("[foo]"); source2TargetsProperty.setExpression("[foo]"); @@ -358,7 +358,7 @@ TEST_P(ForTargets, Remove) ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } -TEST_P(ForTargets, HandleInvalidBinding) +TEST_P(ForTargets, handle_invalid_binding) { sourceTargetsProperty.setExpression("[foo, broken]"); source2TargetsProperty.setExpression("[foo, fail]"); @@ -368,7 +368,7 @@ TEST_P(ForTargets, HandleInvalidBinding) ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } -TEST_P(ForTargets, RemoveIndirectly) +TEST_P(ForTargets, remove_indirectly) { auto parenNode = createNodeWithParent("QtQuick.Item", rootNode.defaultNodeListProperty(), "hoo"); parenNode.defaultNodeListProperty().reparentHere(fooNode); @@ -381,7 +381,7 @@ TEST_P(ForTargets, RemoveIndirectly) ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } -TEST_P(ForTargets, DontRemoveTargetIfThereAreStillAnOtherTargets) +TEST_P(ForTargets, dont_remove_target_if_there_are_still_an_other_targets) { sourceTargetsProperty.setExpression("[foo, bar]"); source2TargetsProperty.setExpression("[foo, bar]"); @@ -391,7 +391,7 @@ TEST_P(ForTargets, DontRemoveTargetIfThereAreStillAnOtherTargets) ASSERT_THAT(resources.removeModelNodes, AllOf(Not(Contains(source)), Not(Contains(source2)))); } -TEST_P(ForTargets, ChangeExpressionIfThereAreStillAnOtherTargets) +TEST_P(ForTargets, change_expression_if_there_are_still_an_other_targets) { sourceTargetsProperty.setExpression("[foo, bar]"); source2TargetsProperty.setExpression("[foo, bar]"); @@ -403,7 +403,7 @@ TEST_P(ForTargets, ChangeExpressionIfThereAreStillAnOtherTargets) SetExpression(source2TargetsProperty, "[bar]"))); } -TEST_P(ForTargets, DontChangeOrderInExpression) +TEST_P(ForTargets, dont_change_order_in_expression) { sourceTargetsProperty.setExpression("[yi, foo, er, san]"); @@ -461,7 +461,7 @@ INSTANTIATE_TEST_SUITE_P(ModelResourceManagement, testing::Values(StateData{"QtQuick.Transition", "from"}, StateData{"QtQuick.Transition", "to"})); -TEST_P(ForState, Remove) +TEST_P(ForState, remove) { sourceStateProperty.setValue(QString{"foo"}); source2StateProperty.setValue(QString{"foo"}); @@ -471,7 +471,7 @@ TEST_P(ForState, Remove) ASSERT_THAT(resources.removeModelNodes, IsSupersetOf({source, source2})); } -TEST_P(ForState, DontRemoveForStarState) +TEST_P(ForState, dont_remove_for_star_state) { fooNode.variantProperty("name").setValue("*"); sourceStateProperty.setValue(QString{"*"}); @@ -481,7 +481,7 @@ TEST_P(ForState, DontRemoveForStarState) ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } -TEST_P(ForState, DontRemoveForEmptyState) +TEST_P(ForState, dont_remove_for_empty_state) { fooNode.variantProperty("name").setValue(""); sourceStateProperty.setValue(QString{""}); @@ -491,7 +491,7 @@ TEST_P(ForState, DontRemoveForEmptyState) ASSERT_THAT(resources.removeModelNodes, Not(Contains(source))); } -TEST_P(ForState, DontRemoveForDifferentState) +TEST_P(ForState, dont_remove_for_different_state) { sourceStateProperty.setValue(QString{"foo"}); source2StateProperty.setValue(QString{"bar"}); diff --git a/tests/unit/tests/unittests/model/nodelistproperty-test.cpp b/tests/unit/tests/unittests/model/nodelistproperty-test.cpp index 2e5a034164b..a8af5d0263e 100644 --- a/tests/unit/tests/unittests/model/nodelistproperty-test.cpp +++ b/tests/unit/tests/unittests/model/nodelistproperty-test.cpp @@ -89,14 +89,14 @@ protected: ModelNode node5; }; -TEST_F(NodeListProperty, BeginAndEndItertors) +TEST_F(NodeListProperty, begin_and_end_itertors) { std::vector nodes{nodeListProperty.begin(), nodeListProperty.end()}; ASSERT_THAT(nodes, ElementsAre(node1, node2, node3, node4, node5)); } -TEST_F(NodeListProperty, LoopOverRange) +TEST_F(NodeListProperty, loop_over_range) { std::vector nodes; @@ -106,7 +106,7 @@ TEST_F(NodeListProperty, LoopOverRange) ASSERT_THAT(nodes, ElementsAre(node1, node2, node3, node4, node5)); } -TEST_F(NodeListProperty, NextIterator) +TEST_F(NodeListProperty, next_iterator) { auto begin = nodeListProperty.begin(); @@ -115,7 +115,7 @@ TEST_F(NodeListProperty, NextIterator) ASSERT_THAT(nodes(nextIterator, nodeListProperty.end()), ElementsAre(node2, node3, node4, node5)); } -TEST_F(NodeListProperty, PreviousIterator) +TEST_F(NodeListProperty, previous_iterator) { auto end = nodeListProperty.end(); @@ -125,7 +125,7 @@ TEST_F(NodeListProperty, PreviousIterator) ElementsAre(node1, node2, node3, node4)); } -TEST_F(NodeListProperty, IncrementIterator) +TEST_F(NodeListProperty, increment_iterator) { auto incrementIterator = nodeListProperty.begin(); @@ -135,7 +135,7 @@ TEST_F(NodeListProperty, IncrementIterator) ElementsAre(node2, node3, node4, node5)); } -TEST_F(NodeListProperty, IncrementIteratorReturnsIterator) +TEST_F(NodeListProperty, increment_iterator_returns_iterator) { auto begin = nodeListProperty.begin(); @@ -145,7 +145,7 @@ TEST_F(NodeListProperty, IncrementIteratorReturnsIterator) ElementsAre(node2, node3, node4, node5)); } -TEST_F(NodeListProperty, PostIncrementIterator) +TEST_F(NodeListProperty, post_increment_iterator) { auto postIncrementIterator = nodeListProperty.begin(); @@ -155,7 +155,7 @@ TEST_F(NodeListProperty, PostIncrementIterator) ElementsAre(node2, node3, node4, node5)); } -TEST_F(NodeListProperty, PostIncrementIteratorReturnsPreincrementIterator) +TEST_F(NodeListProperty, post_increment_iterator_returns_preincrement_iterator) { auto begin = nodeListProperty.begin(); @@ -165,7 +165,7 @@ TEST_F(NodeListProperty, PostIncrementIteratorReturnsPreincrementIterator) ElementsAre(node1, node2, node3, node4, node5)); } -TEST_F(NodeListProperty, DecrementIterator) +TEST_F(NodeListProperty, decrement_iterator) { auto decrementIterator = nodeListProperty.end(); @@ -175,7 +175,7 @@ TEST_F(NodeListProperty, DecrementIterator) ElementsAre(node1, node2, node3, node4)); } -TEST_F(NodeListProperty, DerementIteratorReturnsIterator) +TEST_F(NodeListProperty, derement_iterator_returns_iterator) { auto end = nodeListProperty.end(); @@ -185,7 +185,7 @@ TEST_F(NodeListProperty, DerementIteratorReturnsIterator) ElementsAre(node1, node2, node3, node4)); } -TEST_F(NodeListProperty, PostDecrementIterator) +TEST_F(NodeListProperty, post_decrement_iterator) { auto postDecrementIterator = nodeListProperty.end(); @@ -195,7 +195,7 @@ TEST_F(NodeListProperty, PostDecrementIterator) ElementsAre(node1, node2, node3, node4)); } -TEST_F(NodeListProperty, PostDecrementIteratorReturnsPredecrementIterator) +TEST_F(NodeListProperty, post_decrement_iterator_returns_predecrement_iterator) { auto end = nodeListProperty.end(); @@ -205,7 +205,7 @@ TEST_F(NodeListProperty, PostDecrementIteratorReturnsPredecrementIterator) ElementsAre(node1, node2, node3, node4, node5)); } -TEST_F(NodeListProperty, IncrementIteratorByTwo) +TEST_F(NodeListProperty, increment_iterator_by_two) { auto incrementIterator = nodeListProperty.begin(); @@ -214,7 +214,7 @@ TEST_F(NodeListProperty, IncrementIteratorByTwo) ASSERT_THAT(nodes(incrementIterator, nodeListProperty.end()), ElementsAre(node3, node4, node5)); } -TEST_F(NodeListProperty, IncrementIteratorByTwoReturnsIterator) +TEST_F(NodeListProperty, increment_iterator_by_two_returns_iterator) { auto begin = nodeListProperty.begin(); @@ -223,7 +223,7 @@ TEST_F(NodeListProperty, IncrementIteratorByTwoReturnsIterator) ASSERT_THAT(nodes(incrementIterator, nodeListProperty.end()), ElementsAre(node3, node4, node5)); } -TEST_F(NodeListProperty, DecrementIteratorByTwo) +TEST_F(NodeListProperty, decrement_iterator_by_two) { auto decrementIterator = nodeListProperty.end(); @@ -232,7 +232,7 @@ TEST_F(NodeListProperty, DecrementIteratorByTwo) ASSERT_THAT(nodes(nodeListProperty.begin(), decrementIterator), ElementsAre(node1, node2, node3)); } -TEST_F(NodeListProperty, DecrementIteratorByTwoReturnsIterator) +TEST_F(NodeListProperty, decrement_iterator_by_two_returns_iterator) { auto end = nodeListProperty.end(); @@ -241,7 +241,7 @@ TEST_F(NodeListProperty, DecrementIteratorByTwoReturnsIterator) ASSERT_THAT(nodes(nodeListProperty.begin(), decrementIterator), ElementsAre(node1, node2, node3)); } -TEST_F(NodeListProperty, AccessIterator) +TEST_F(NodeListProperty, access_iterator) { auto iterator = std::next(nodeListProperty.begin(), 3); @@ -250,7 +250,7 @@ TEST_F(NodeListProperty, AccessIterator) ASSERT_THAT(nodes(accessIterator, nodeListProperty.end()), ElementsAre(node3, node4, node5)); } -TEST_F(NodeListProperty, AddIteratorByIndexSecondOperand) +TEST_F(NodeListProperty, add_iterator_by_index_second_operand) { auto begin = nodeListProperty.begin(); @@ -259,7 +259,7 @@ TEST_F(NodeListProperty, AddIteratorByIndexSecondOperand) ASSERT_THAT(nodes(addedIterator, nodeListProperty.end()), ElementsAre(node3, node4, node5)); } -TEST_F(NodeListProperty, AddIteratorByIndexFirstOperand) +TEST_F(NodeListProperty, add_iterator_by_index_first_operand) { auto begin = nodeListProperty.begin(); @@ -268,7 +268,7 @@ TEST_F(NodeListProperty, AddIteratorByIndexFirstOperand) ASSERT_THAT(nodes(addedIterator, nodeListProperty.end()), ElementsAre(node3, node4, node5)); } -TEST_F(NodeListProperty, SubtractIterator) +TEST_F(NodeListProperty, subtract_iterator) { auto end = nodeListProperty.end(); @@ -277,7 +277,7 @@ TEST_F(NodeListProperty, SubtractIterator) ASSERT_THAT(nodes(subtractedIterator, nodeListProperty.end()), ElementsAre(node3, node4, node5)); } -TEST_F(NodeListProperty, CompareEqualIteratorAreEqual) +TEST_F(NodeListProperty, compare_equal_iterator_are_equal) { auto first = nodeListProperty.begin(); auto second = nodeListProperty.begin(); @@ -287,7 +287,7 @@ TEST_F(NodeListProperty, CompareEqualIteratorAreEqual) ASSERT_TRUE(isEqual); } -TEST_F(NodeListProperty, CompareEqualIteratorAreNotEqual) +TEST_F(NodeListProperty, compare_equal_iterator_are_not_equal) { auto first = nodeListProperty.begin(); auto second = std::next(nodeListProperty.begin()); @@ -297,7 +297,7 @@ TEST_F(NodeListProperty, CompareEqualIteratorAreNotEqual) ASSERT_FALSE(isEqual); } -TEST_F(NodeListProperty, CompareUnqualIteratorAreEqual) +TEST_F(NodeListProperty, compare_unqual_iterator_are_equal) { auto first = nodeListProperty.begin(); auto second = nodeListProperty.begin(); @@ -307,7 +307,7 @@ TEST_F(NodeListProperty, CompareUnqualIteratorAreEqual) ASSERT_FALSE(isUnequal); } -TEST_F(NodeListProperty, CompareUnequalIteratorAreNotEqual) +TEST_F(NodeListProperty, compare_unequal_iterator_are_not_equal) { auto first = nodeListProperty.begin(); auto second = std::next(nodeListProperty.begin()); @@ -317,7 +317,7 @@ TEST_F(NodeListProperty, CompareUnequalIteratorAreNotEqual) ASSERT_TRUE(isUnequal); } -TEST_F(NodeListProperty, CompareLessIteratorAreNotLessIfEqual) +TEST_F(NodeListProperty, compare_less_iterator_are_not_less_if_equal) { auto first = nodeListProperty.begin(); auto second = nodeListProperty.begin(); @@ -327,7 +327,7 @@ TEST_F(NodeListProperty, CompareLessIteratorAreNotLessIfEqual) ASSERT_FALSE(isLess); } -TEST_F(NodeListProperty, CompareLessIteratorAreNotLessIfGreater) +TEST_F(NodeListProperty, compare_less_iterator_are_not_less_if_greater) { auto first = std::next(nodeListProperty.begin()); auto second = nodeListProperty.begin(); @@ -337,7 +337,7 @@ TEST_F(NodeListProperty, CompareLessIteratorAreNotLessIfGreater) ASSERT_FALSE(isLess); } -TEST_F(NodeListProperty, CompareLessIteratorAreLessIfLess) +TEST_F(NodeListProperty, compare_less_iterator_are_less_if_less) { auto first = nodeListProperty.begin(); auto second = std::next(nodeListProperty.begin()); @@ -347,7 +347,7 @@ TEST_F(NodeListProperty, CompareLessIteratorAreLessIfLess) ASSERT_TRUE(isLess); } -TEST_F(NodeListProperty, CompareLessEqualIteratorAreLessEqualIfEqual) +TEST_F(NodeListProperty, compare_less_equal_iterator_are_less_equal_if_equal) { auto first = nodeListProperty.begin(); auto second = nodeListProperty.begin(); @@ -357,7 +357,7 @@ TEST_F(NodeListProperty, CompareLessEqualIteratorAreLessEqualIfEqual) ASSERT_TRUE(isLessEqual); } -TEST_F(NodeListProperty, CompareLessEqualIteratorAreNotLessEqualIfGreater) +TEST_F(NodeListProperty, compare_less_equal_iterator_are_not_less_equal_if_greater) { auto first = std::next(nodeListProperty.begin()); auto second = nodeListProperty.begin(); @@ -367,7 +367,7 @@ TEST_F(NodeListProperty, CompareLessEqualIteratorAreNotLessEqualIfGreater) ASSERT_FALSE(isLessEqual); } -TEST_F(NodeListProperty, CompareLessEqualIteratorAreLessEqualIfLess) +TEST_F(NodeListProperty, compare_less_equal_iterator_are_less_equal_if_less) { auto first = nodeListProperty.begin(); auto second = std::next(nodeListProperty.begin()); @@ -377,7 +377,7 @@ TEST_F(NodeListProperty, CompareLessEqualIteratorAreLessEqualIfLess) ASSERT_TRUE(isLessEqual); } -TEST_F(NodeListProperty, CompareGreaterIteratorAreGreaterIfEqual) +TEST_F(NodeListProperty, compare_greater_iterator_are_greater_if_equal) { auto first = nodeListProperty.begin(); auto second = nodeListProperty.begin(); @@ -387,7 +387,7 @@ TEST_F(NodeListProperty, CompareGreaterIteratorAreGreaterIfEqual) ASSERT_FALSE(isGreater); } -TEST_F(NodeListProperty, CompareGreaterIteratorAreGreaterIfGreater) +TEST_F(NodeListProperty, compare_greater_iterator_are_greater_if_greater) { auto first = std::next(nodeListProperty.begin()); auto second = nodeListProperty.begin(); @@ -397,7 +397,7 @@ TEST_F(NodeListProperty, CompareGreaterIteratorAreGreaterIfGreater) ASSERT_TRUE(isGreater); } -TEST_F(NodeListProperty, CompareGreaterIteratorAreNotGreaterIfLess) +TEST_F(NodeListProperty, compare_greater_iterator_are_not_greater_if_less) { auto first = nodeListProperty.begin(); auto second = std::next(nodeListProperty.begin()); @@ -407,7 +407,7 @@ TEST_F(NodeListProperty, CompareGreaterIteratorAreNotGreaterIfLess) ASSERT_FALSE(isGreater); } -TEST_F(NodeListProperty, CompareGreaterEqualIteratorAreGreaterEqualIfEqual) +TEST_F(NodeListProperty, compare_greater_equal_iterator_are_greater_equal_if_equal) { auto first = nodeListProperty.begin(); auto second = nodeListProperty.begin(); @@ -417,7 +417,7 @@ TEST_F(NodeListProperty, CompareGreaterEqualIteratorAreGreaterEqualIfEqual) ASSERT_TRUE(isGreaterEqual); } -TEST_F(NodeListProperty, CompareGreaterEqualIteratorAreGreaterEqualIfGreater) +TEST_F(NodeListProperty, compare_greater_equal_iterator_are_greater_equal_if_greater) { auto first = std::next(nodeListProperty.begin()); auto second = nodeListProperty.begin(); @@ -427,7 +427,7 @@ TEST_F(NodeListProperty, CompareGreaterEqualIteratorAreGreaterEqualIfGreater) ASSERT_TRUE(isGreaterEqual); } -TEST_F(NodeListProperty, CompareGreaterEqualIteratorAreNotGreaterEqualIfLess) +TEST_F(NodeListProperty, compare_greater_equal_iterator_are_not_greater_equal_if_less) { auto first = nodeListProperty.begin(); auto second = std::next(nodeListProperty.begin()); @@ -437,7 +437,7 @@ TEST_F(NodeListProperty, CompareGreaterEqualIteratorAreNotGreaterEqualIfLess) ASSERT_FALSE(isGreaterEqual); } -TEST_F(NodeListProperty, DereferenceIterator) +TEST_F(NodeListProperty, dereference_iterator) { auto iterator = std::next(nodeListProperty.begin()); @@ -446,7 +446,7 @@ TEST_F(NodeListProperty, DereferenceIterator) ASSERT_THAT(node, Eq(node2)); } -TEST_F(NodeListProperty, IterSwap) +TEST_F(NodeListProperty, iter_swap) { auto first = std::next(nodeListProperty.begin(), 2); auto second = nodeListProperty.begin(); @@ -456,7 +456,7 @@ TEST_F(NodeListProperty, IterSwap) ASSERT_THAT(nodes(), ElementsAre(node3, node2, node1, node4, node5)); } -TEST_F(NodeListProperty, Rotate) +TEST_F(NodeListProperty, rotate) { auto first = std::next(nodeListProperty.begin()); auto newFirst = std::next(nodeListProperty.begin(), 2); @@ -467,7 +467,7 @@ TEST_F(NodeListProperty, Rotate) ASSERT_THAT(nodes(), ElementsAre(node1, node3, node4, node2, node5)); } -TEST_F(NodeListProperty, RotateCallsNodeOrderedChanged) +TEST_F(NodeListProperty, rotate_calls_node_ordered_changed) { auto first = std::next(nodeListProperty.begin()); auto newFirst = std::next(nodeListProperty.begin(), 2); @@ -478,7 +478,7 @@ TEST_F(NodeListProperty, RotateCallsNodeOrderedChanged) nodeListProperty.rotate(first, newFirst, last); } -TEST_F(NodeListProperty, RotateRange) +TEST_F(NodeListProperty, rotate_range) { auto newFirst = std::prev(nodeListProperty.end(), 2); @@ -487,7 +487,7 @@ TEST_F(NodeListProperty, RotateRange) ASSERT_THAT(nodes(), ElementsAre(node4, node5, node1, node2, node3)); } -TEST_F(NodeListProperty, RotateReturnsIterator) +TEST_F(NodeListProperty, rotate_returns_iterator) { auto first = std::next(nodeListProperty.begin()); auto newFirst = std::next(nodeListProperty.begin(), 2); @@ -498,7 +498,7 @@ TEST_F(NodeListProperty, RotateReturnsIterator) ASSERT_THAT(iterator, Eq(first + (last - newFirst))); } -TEST_F(NodeListProperty, RotateRangeReturnsIterator) +TEST_F(NodeListProperty, rotate_range_returns_iterator) { auto newFirst = std::prev(nodeListProperty.end(), 2); @@ -507,7 +507,7 @@ TEST_F(NodeListProperty, RotateRangeReturnsIterator) ASSERT_THAT(iterator, Eq(nodeListProperty.begin() + (nodeListProperty.end() - newFirst))); } -TEST_F(NodeListProperty, Reverse) +TEST_F(NodeListProperty, reverse) { auto first = std::next(nodeListProperty.begin()); auto last = std::prev(nodeListProperty.end()); @@ -517,7 +517,7 @@ TEST_F(NodeListProperty, Reverse) ASSERT_THAT(nodes(), ElementsAre(node1, node4, node3, node2, node5)); } -TEST_F(NodeListProperty, ReverseCallsNodeOrderedChanged) +TEST_F(NodeListProperty, reverse_calls_node_ordered_changed) { auto first = std::next(nodeListProperty.begin()); auto last = std::prev(nodeListProperty.end()); diff --git a/tests/unit/tests/unittests/projectstorage/directorypathcompressor-test.cpp b/tests/unit/tests/unittests/projectstorage/directorypathcompressor-test.cpp index cd50d39db51..d86e2d28287 100644 --- a/tests/unit/tests/unittests/projectstorage/directorypathcompressor-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/directorypathcompressor-test.cpp @@ -26,14 +26,14 @@ protected: SourceContextId sourceContextId2{SourceContextId::create(2)}; }; -TEST_F(DirectoryPathCompressor, AddFilePath) +TEST_F(DirectoryPathCompressor, add_file_path) { compressor.addSourceContextId(sourceContextId1); ASSERT_THAT(compressor.takeSourceContextIds(), ElementsAre(sourceContextId1)); } -TEST_F(DirectoryPathCompressor, NoFilePathsAferTakenThem) +TEST_F(DirectoryPathCompressor, no_file_paths_afer_taken_them) { compressor.addSourceContextId(sourceContextId1); @@ -42,14 +42,14 @@ TEST_F(DirectoryPathCompressor, NoFilePathsAferTakenThem) ASSERT_THAT(compressor.takeSourceContextIds(), IsEmpty()); } -TEST_F(DirectoryPathCompressor, CallRestartTimerAfterAddingPath) +TEST_F(DirectoryPathCompressor, call_restart_timer_after_adding_path) { EXPECT_CALL(mockTimer, start(20)); compressor.addSourceContextId(sourceContextId1); } -TEST_F(DirectoryPathCompressor, CallTimeOutAfterAddingPath) +TEST_F(DirectoryPathCompressor, call_time_out_after_adding_path) { EXPECT_CALL(mockCompressorCallback, Call(ElementsAre(sourceContextId1, sourceContextId2))); @@ -57,7 +57,7 @@ TEST_F(DirectoryPathCompressor, CallTimeOutAfterAddingPath) compressor.addSourceContextId(sourceContextId2); } -TEST_F(DirectoryPathCompressor, RemoveDuplicates) +TEST_F(DirectoryPathCompressor, remove_duplicates) { EXPECT_CALL(mockCompressorCallback, Call(ElementsAre(sourceContextId1, sourceContextId2))); diff --git a/tests/unit/tests/unittests/projectstorage/filestatuscache-test.cpp b/tests/unit/tests/unittests/projectstorage/filestatuscache-test.cpp index 921536aa029..67eb953e9a8 100644 --- a/tests/unit/tests/unittests/projectstorage/filestatuscache-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/filestatuscache-test.cpp @@ -54,21 +54,21 @@ protected: long long source2FileSize = 4000; }; -TEST_F(FileStatusCache, CreateEntry) +TEST_F(FileStatusCache, create_entry) { cache.find(header); ASSERT_THAT(cache, SizeIs(1)); } -TEST_F(FileStatusCache, AskCreatedEntryForLastModifiedTime) +TEST_F(FileStatusCache, ask_created_entry_for_last_modified_time) { auto fileStatus = cache.find(header); ASSERT_THAT(fileStatus, (FileStatus{header, headerFileSize, headerLastModifiedTime})); } -TEST_F(FileStatusCache, FindCachedEntry) +TEST_F(FileStatusCache, find_cached_entry) { cache.find(header); @@ -77,7 +77,7 @@ TEST_F(FileStatusCache, FindCachedEntry) ASSERT_THAT(fileStatus, (FileStatus{header, headerFileSize, headerLastModifiedTime})); } -TEST_F(FileStatusCache, LastModifiedTime) +TEST_F(FileStatusCache, last_modified_time) { cache.find(header); @@ -86,7 +86,7 @@ TEST_F(FileStatusCache, LastModifiedTime) ASSERT_THAT(lastModifiedTime, headerLastModifiedTime); } -TEST_F(FileStatusCache, FileSize) +TEST_F(FileStatusCache, file_size) { cache.find(header); @@ -95,7 +95,7 @@ TEST_F(FileStatusCache, FileSize) ASSERT_THAT(fileSize, headerFileSize); } -TEST_F(FileStatusCache, DontAddEntryTwice) +TEST_F(FileStatusCache, dont_add_entry_twice) { cache.find(header); @@ -104,7 +104,7 @@ TEST_F(FileStatusCache, DontAddEntryTwice) ASSERT_THAT(cache, SizeIs(1)); } -TEST_F(FileStatusCache, AddNewEntry) +TEST_F(FileStatusCache, add_new_entry) { cache.find(header); @@ -113,7 +113,7 @@ TEST_F(FileStatusCache, AddNewEntry) ASSERT_THAT(cache, SizeIs(2)); } -TEST_F(FileStatusCache, AskNewEntryForLastModifiedTime) +TEST_F(FileStatusCache, ask_new_entry_for_last_modified_time) { cache.find(header); @@ -122,7 +122,7 @@ TEST_F(FileStatusCache, AskNewEntryForLastModifiedTime) ASSERT_THAT(fileStatus, (FileStatus{source, sourceFileSize, sourceLastModifiedTime})); } -TEST_F(FileStatusCache, AddNewEntryReverseOrder) +TEST_F(FileStatusCache, add_new_entry_reverse_order) { cache.find(source); @@ -131,7 +131,7 @@ TEST_F(FileStatusCache, AddNewEntryReverseOrder) ASSERT_THAT(cache, SizeIs(2)); } -TEST_F(FileStatusCache, AskNewEntryReverseOrderAddedForLastModifiedTime) +TEST_F(FileStatusCache, ask_new_entry_reverse_order_added_for_last_modified_time) { cache.find(source); @@ -140,7 +140,7 @@ TEST_F(FileStatusCache, AskNewEntryReverseOrderAddedForLastModifiedTime) ASSERT_THAT(fileStatus, (FileStatus{header, headerFileSize, headerLastModifiedTime})); } -TEST_F(FileStatusCache, UpdateFile) +TEST_F(FileStatusCache, update_file) { EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) @@ -153,7 +153,7 @@ TEST_F(FileStatusCache, UpdateFile) ASSERT_THAT(cache.find(header), (FileStatus{header, headerFileSize2, headerLastModifiedTime2})); } -TEST_F(FileStatusCache, UpdateFileDoesNotChangeEntryCount) +TEST_F(FileStatusCache, update_file_does_not_change_entry_count) { EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) @@ -166,14 +166,14 @@ TEST_F(FileStatusCache, UpdateFileDoesNotChangeEntryCount) ASSERT_THAT(cache, SizeIs(1)); } -TEST_F(FileStatusCache, UpdateFileForNonExistingEntry) +TEST_F(FileStatusCache, update_file_for_non_existing_entry) { cache.update(header); ASSERT_THAT(cache, SizeIs(0)); } -TEST_F(FileStatusCache, UpdateFileStats) +TEST_F(FileStatusCache, update_file_stats) { EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) @@ -193,7 +193,7 @@ TEST_F(FileStatusCache, UpdateFileStats) (FileStatus{header2, header2FileSize2, header2LastModifiedTime2})); } -TEST_F(FileStatusCache, UpdateFilesDoesNotChangeEntryCount) +TEST_F(FileStatusCache, update_files_does_not_change_entry_count) { EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) @@ -211,21 +211,21 @@ TEST_F(FileStatusCache, UpdateFilesDoesNotChangeEntryCount) ASSERT_THAT(cache, SizeIs(2)); } -TEST_F(FileStatusCache, UpdateFilesForNonExistingEntry) +TEST_F(FileStatusCache, update_files_for_non_existing_entry) { cache.update(entries); ASSERT_THAT(cache, SizeIs(0)); } -TEST_F(FileStatusCache, NewModifiedEntries) +TEST_F(FileStatusCache, new_modified_entries) { auto modifiedIds = cache.modified(entries); ASSERT_THAT(modifiedIds, entries); } -TEST_F(FileStatusCache, NoNewModifiedEntries) +TEST_F(FileStatusCache, no_new_modified_entries) { cache.modified(entries); @@ -234,7 +234,7 @@ TEST_F(FileStatusCache, NoNewModifiedEntries) ASSERT_THAT(modifiedIds, IsEmpty()); } -TEST_F(FileStatusCache, SomeNewModifiedEntries) +TEST_F(FileStatusCache, some_new_modified_entries) { cache.modified({source, header2}); @@ -243,7 +243,7 @@ TEST_F(FileStatusCache, SomeNewModifiedEntries) ASSERT_THAT(modifiedIds, ElementsAre(header, source2)); } -TEST_F(FileStatusCache, SomeAlreadyExistingModifiedEntries) +TEST_F(FileStatusCache, some_already_existing_modified_entries) { EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) @@ -266,7 +266,7 @@ TEST_F(FileStatusCache, SomeAlreadyExistingModifiedEntries) ASSERT_THAT(modifiedIds, ElementsAre(header, header2)); } -TEST_F(FileStatusCache, SomeAlreadyExistingAndSomeNewModifiedEntries) +TEST_F(FileStatusCache, some_already_existing_and_some_new_modified_entries) { EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .WillRepeatedly(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})); @@ -286,7 +286,7 @@ TEST_F(FileStatusCache, SomeAlreadyExistingAndSomeNewModifiedEntries) ASSERT_THAT(modifiedIds, ElementsAre(header, header2, source2)); } -TEST_F(FileStatusCache, TimeIsUpdatedForSomeAlreadyExistingModifiedEntries) +TEST_F(FileStatusCache, time_is_updated_for_some_already_existing_modified_entries) { EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) diff --git a/tests/unit/tests/unittests/projectstorage/modulescanner-test.cpp b/tests/unit/tests/unittests/projectstorage/modulescanner-test.cpp index 86a80d87b57..c0d7e7b540c 100644 --- a/tests/unit/tests/unittests/projectstorage/modulescanner-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/modulescanner-test.cpp @@ -65,49 +65,49 @@ protected: externalDependenciesMock}; }; -TEST_F(ModuleScanner, ReturnEmptyOptionalForEmptyPath) +TEST_F(ModuleScanner, return_empty_optional_for_empty_path) { scanner.scan(QStringList{""}); ASSERT_THAT(scanner.modules(), IsEmpty()); } -TEST_F(ModuleScanner, ReturnEmptyOptionalForNullStringPath) +TEST_F(ModuleScanner, return_empty_optional_for_null_string_path) { scanner.scan(QStringList{QString{}}); ASSERT_THAT(scanner.modules(), IsEmpty()); } -TEST_F(ModuleScanner, ReturnEmptyOptionalForEmptyPaths) +TEST_F(ModuleScanner, return_empty_optional_for_empty_paths) { scanner.scan(QStringList{}); ASSERT_THAT(scanner.modules(), IsEmpty()); } -TEST_F(ModuleScanner, GetQtQuick) +TEST_F(ModuleScanner, get_qt_quick) { scanner.scan(QStringList{qmlModulesPath}); ASSERT_THAT(scanner.modules(), Contains(UrlProperty("QtQuick"))); } -TEST_F(ModuleScanner, SkipEmptyModules) +TEST_F(ModuleScanner, skip_empty_modules) { scanner.scan(QStringList{qmlModulesPath}); ASSERT_THAT(scanner.modules(), Not(Contains(UrlProperty(IsEmpty())))); } -TEST_F(ModuleScanner, UseSkipFunction) +TEST_F(ModuleScanner, use_skip_function) { scanner.scan(QStringList{qmlModulesPath}); ASSERT_THAT(scanner.modules(), Not(Contains(UrlProperty(EndsWith(QStringView{u"impl"}))))); } -TEST_F(ModuleScanner, Version) +TEST_F(ModuleScanner, version) { QmlDesigner::ModuleScanner scanner{[](QStringView moduleName) { return moduleName.endsWith(u"impl"); @@ -120,7 +120,7 @@ TEST_F(ModuleScanner, Version) ASSERT_THAT(scanner.modules(), ElementsAre(AllOf(UrlProperty("Example"), VersionProperty("1.3")))); } -TEST_F(ModuleScanner, NoVersion) +TEST_F(ModuleScanner, no_version) { QmlDesigner::ModuleScanner scanner{[](QStringView moduleName) { return moduleName.endsWith(u"impl"); @@ -134,14 +134,14 @@ TEST_F(ModuleScanner, NoVersion) ElementsAre(AllOf(UrlProperty("Example"), VersionProperty(QString{})))); } -TEST_F(ModuleScanner, Duplicates) +TEST_F(ModuleScanner, duplicates) { scanner.scan(QStringList{qmlModulesPath}); ASSERT_THAT(scanner.modules(), Not(HasDuplicates())); } -TEST_F(ModuleScanner, DontAddModulesAgain) +TEST_F(ModuleScanner, dont_add_modules_again) { scanner.scan(QStringList{qmlModulesPath}); @@ -150,14 +150,14 @@ TEST_F(ModuleScanner, DontAddModulesAgain) ASSERT_THAT(scanner.modules(), Not(HasDuplicates())); } -TEST_F(ModuleScanner, SetNoVersionForQtQuickVersion) +TEST_F(ModuleScanner, set_no_version_for_qt_quick_version) { scanner.scan(QStringList{qmlModulesPath}); ASSERT_THAT(scanner.modules(), CorePropertiesHave(VersionProperty(QString{}))); } -TEST_F(ModuleScanner, SetVersionForQtQuickVersion) +TEST_F(ModuleScanner, set_version_for_qt_quick_version) { ON_CALL(externalDependenciesMock, qtQuickVersion()).WillByDefault(Return(QString{"6.4"})); @@ -166,7 +166,7 @@ TEST_F(ModuleScanner, SetVersionForQtQuickVersion) ASSERT_THAT(scanner.modules(), CorePropertiesHave(VersionProperty(u"6.4"))); } -TEST_F(ModuleScanner, DontSetVersionForNonQtQuickVersion) +TEST_F(ModuleScanner, dont_set_version_for_non_qt_quick_version) { ON_CALL(externalDependenciesMock, qtQuickVersion()).WillByDefault(Return(QString{"6.4"})); diff --git a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp index 75e6a90989d..e99182ea2df 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp @@ -1051,7 +1051,7 @@ protected: Storage::Synchronization::Imports moduleDependenciesSourceId5; }; -TEST_F(ProjectStorage, FetchSourceContextIdReturnsAlwaysTheSameIdForTheSamePath) +TEST_F(ProjectStorage, fetch_source_context_id_returns_always_the_same_id_for_the_same_path) { auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1060,7 +1060,7 @@ TEST_F(ProjectStorage, FetchSourceContextIdReturnsAlwaysTheSameIdForTheSamePath) ASSERT_THAT(newSourceContextId, Eq(sourceContextId)); } -TEST_F(ProjectStorage, FetchSourceContextIdReturnsNotTheSameIdForDifferentPath) +TEST_F(ProjectStorage, fetch_source_context_id_returns_not_the_same_id_for_different_path) { auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1069,7 +1069,7 @@ TEST_F(ProjectStorage, FetchSourceContextIdReturnsNotTheSameIdForDifferentPath) ASSERT_THAT(newSourceContextId, Ne(sourceContextId)); } -TEST_F(ProjectStorage, FetchSourceContextPath) +TEST_F(ProjectStorage, fetch_source_context_path) { auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1078,13 +1078,13 @@ TEST_F(ProjectStorage, FetchSourceContextPath) ASSERT_THAT(path, Eq("/path/to")); } -TEST_F(ProjectStorage, FetchUnknownSourceContextPathThrows) +TEST_F(ProjectStorage, fetch_unknown_source_context_path_throws) { ASSERT_THROW(storage.fetchSourceContextPath(SourceContextId::create(323)), QmlDesigner::SourceContextIdDoesNotExists); } -TEST_F(ProjectStorage, FetchAllSourceContextsAreEmptyIfNoSourceContextsExists) +TEST_F(ProjectStorage, fetch_all_source_contexts_are_empty_if_no_source_contexts_exists) { storage.clearSources(); @@ -1093,7 +1093,7 @@ TEST_F(ProjectStorage, FetchAllSourceContextsAreEmptyIfNoSourceContextsExists) ASSERT_THAT(toValues(sourceContexts), IsEmpty()); } -TEST_F(ProjectStorage, FetchAllSourceContexts) +TEST_F(ProjectStorage, fetch_all_source_contexts) { storage.clearSources(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1106,7 +1106,7 @@ TEST_F(ProjectStorage, FetchAllSourceContexts) IsSourceContext(sourceContextId2, "/path/to2"))); } -TEST_F(ProjectStorage, FetchSourceIdFirstTime) +TEST_F(ProjectStorage, fetch_source_id_first_time) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1116,7 +1116,7 @@ TEST_F(ProjectStorage, FetchSourceIdFirstTime) ASSERT_TRUE(sourceId.isValid()); } -TEST_F(ProjectStorage, FetchExistingSourceId) +TEST_F(ProjectStorage, fetch_existing_source_id) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1127,7 +1127,7 @@ TEST_F(ProjectStorage, FetchExistingSourceId) ASSERT_THAT(sourceId, createdSourceId); } -TEST_F(ProjectStorage, FetchSourceIdWithDifferentContextIdAreNotEqual) +TEST_F(ProjectStorage, fetch_source_id_with_different_context_id_are_not_equal) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1139,7 +1139,7 @@ TEST_F(ProjectStorage, FetchSourceIdWithDifferentContextIdAreNotEqual) ASSERT_THAT(sourceId, Ne(sourceId2)); } -TEST_F(ProjectStorage, FetchSourceIdWithDifferentNameAreNotEqual) +TEST_F(ProjectStorage, fetch_source_id_with_different_name_are_not_equal) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1150,19 +1150,19 @@ TEST_F(ProjectStorage, FetchSourceIdWithDifferentNameAreNotEqual) ASSERT_THAT(sourceId, Ne(sourceId2)); } -TEST_F(ProjectStorage, FetchSourceIdWithNonExistingSourceContextIdThrows) +TEST_F(ProjectStorage, fetch_source_id_with_non_existing_source_context_id_throws) { ASSERT_THROW(storage.fetchSourceId(SourceContextId::create(42), "foo"), Sqlite::ConstraintPreventsModification); } -TEST_F(ProjectStorage, FetchSourceNameAndSourceContextIdForNonExistingSourceId) +TEST_F(ProjectStorage, fetch_source_name_and_source_context_id_for_non_existing_source_id) { ASSERT_THROW(storage.fetchSourceNameAndSourceContextId(SourceId::create(212)), QmlDesigner::SourceIdDoesNotExists); } -TEST_F(ProjectStorage, FetchSourceNameAndSourceContextIdForNonExistingEntry) +TEST_F(ProjectStorage, fetch_source_name_and_source_context_id_for_non_existing_entry) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1173,13 +1173,13 @@ TEST_F(ProjectStorage, FetchSourceNameAndSourceContextIdForNonExistingEntry) ASSERT_THAT(sourceNameAndSourceContextId, IsSourceNameAndSourceContextId("foo", sourceContextId)); } -TEST_F(ProjectStorage, FetchSourceContextIdForNonExistingSourceId) +TEST_F(ProjectStorage, fetch_source_context_id_for_non_existing_source_id) { ASSERT_THROW(storage.fetchSourceContextId(SourceId::create(212)), QmlDesigner::SourceIdDoesNotExists); } -TEST_F(ProjectStorage, FetchSourceContextIdForExistingSourceId) +TEST_F(ProjectStorage, fetch_source_context_id_for_existing_source_id) { addSomeDummyData(); auto originalSourceContextId = storage.fetchSourceContextId("/path/to3"); @@ -1190,7 +1190,7 @@ TEST_F(ProjectStorage, FetchSourceContextIdForExistingSourceId) ASSERT_THAT(sourceContextId, Eq(originalSourceContextId)); } -TEST_F(ProjectStorage, FetchAllSources) +TEST_F(ProjectStorage, fetch_all_sources) { storage.clearSources(); @@ -1199,7 +1199,7 @@ TEST_F(ProjectStorage, FetchAllSources) ASSERT_THAT(toValues(sources), IsEmpty()); } -TEST_F(ProjectStorage, FetchSourceIdUnguardedFirstTime) +TEST_F(ProjectStorage, fetch_source_id_unguarded_first_time) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1210,7 +1210,7 @@ TEST_F(ProjectStorage, FetchSourceIdUnguardedFirstTime) ASSERT_TRUE(sourceId.isValid()); } -TEST_F(ProjectStorage, FetchExistingSourceIdUnguarded) +TEST_F(ProjectStorage, fetch_existing_source_id_unguarded) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1222,7 +1222,7 @@ TEST_F(ProjectStorage, FetchExistingSourceIdUnguarded) ASSERT_THAT(sourceId, createdSourceId); } -TEST_F(ProjectStorage, FetchSourceIdUnguardedWithDifferentContextIdAreNotEqual) +TEST_F(ProjectStorage, fetch_source_id_unguarded_with_different_context_id_are_not_equal) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1235,7 +1235,7 @@ TEST_F(ProjectStorage, FetchSourceIdUnguardedWithDifferentContextIdAreNotEqual) ASSERT_THAT(sourceId, Ne(sourceId2)); } -TEST_F(ProjectStorage, FetchSourceIdUnguardedWithDifferentNameAreNotEqual) +TEST_F(ProjectStorage, fetch_source_id_unguarded_with_different_name_are_not_equal) { addSomeDummyData(); auto sourceContextId = storage.fetchSourceContextId("/path/to"); @@ -1247,7 +1247,7 @@ TEST_F(ProjectStorage, FetchSourceIdUnguardedWithDifferentNameAreNotEqual) ASSERT_THAT(sourceId, Ne(sourceId2)); } -TEST_F(ProjectStorage, FetchSourceIdUnguardedWithNonExistingSourceContextIdThrows) +TEST_F(ProjectStorage, fetch_source_id_unguarded_with_non_existing_source_context_id_throws) { std::lock_guard lock{database}; @@ -1255,7 +1255,7 @@ TEST_F(ProjectStorage, FetchSourceIdUnguardedWithNonExistingSourceContextIdThrow Sqlite::ConstraintPreventsModification); } -TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypes) +TEST_F(ProjectStorage, synchronize_types_adds_new_types) { auto package{createSimpleSynchronizationPackage()}; @@ -1278,7 +1278,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypes) "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesWithExtensionChain) +TEST_F(ProjectStorage, synchronize_types_adds_new_types_with_extension_chain) { auto package{createSimpleSynchronizationPackage()}; swap(package.types.front().extension, package.types.front().prototype); @@ -1303,7 +1303,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesWithExtensionChain) "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesWithExportedPrototypeName) +TEST_F(ProjectStorage, synchronize_types_adds_new_types_with_exported_prototype_name) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::ImportedType{"Object"}; @@ -1328,7 +1328,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesWithExportedPrototypeName) IsExportedType(qtQuickNativeModuleId, "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesWithExportedExtensionName) +TEST_F(ProjectStorage, synchronize_types_adds_new_types_with_exported_extension_name) { auto package{createSimpleSynchronizationPackage()}; swap(package.types.front().extension, package.types.front().prototype); @@ -1354,7 +1354,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesWithExportedExtensionName) "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesThrowsWithWrongPrototypeName) +TEST_F(ProjectStorage, synchronize_types_adds_new_types_throws_with_wrong_prototype_name) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::ImportedType{"Objec"}; @@ -1362,7 +1362,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesThrowsWithWrongPrototypeName) ASSERT_THROW(storage.synchronize(std::move(package)), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesThrowsWithWrongExtensionName) +TEST_F(ProjectStorage, synchronize_types_adds_new_types_throws_with_wrong_extension_name) { auto package{createSimpleSynchronizationPackage()}; package.types[0].extension = Storage::Synchronization::ImportedType{"Objec"}; @@ -1370,7 +1370,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesThrowsWithWrongExtensionName) ASSERT_THROW(storage.synchronize(std::move(package)), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesWithMissingModule) +TEST_F(ProjectStorage, synchronize_types_adds_new_types_with_missing_module) { auto package{createSimpleSynchronizationPackage()}; package.types.push_back(Storage::Synchronization::Type{ @@ -1385,7 +1385,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesWithMissingModule) ASSERT_THROW(storage.synchronize(std::move(package)), QmlDesigner::ExportedTypeCannotBeInserted); } -TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesReverseOrder) +TEST_F(ProjectStorage, synchronize_types_adds_new_types_reverse_order) { auto package{createSimpleSynchronizationPackage()}; std::reverse(package.types.begin(), package.types.end()); @@ -1409,7 +1409,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsNewTypesReverseOrder) "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesOverwritesTypeTraits) +TEST_F(ProjectStorage, synchronize_types_overwrites_type_traits) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1432,7 +1432,7 @@ TEST_F(ProjectStorage, SynchronizeTypesOverwritesTypeTraits) IsExportedType(qtQuickNativeModuleId, "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesOverwritesSources) +TEST_F(ProjectStorage, synchronize_types_overwrites_sources) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1467,7 +1467,7 @@ TEST_F(ProjectStorage, SynchronizeTypesOverwritesSources) "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesInsertTypeIntoPrototypeChain) +TEST_F(ProjectStorage, synchronize_types_insert_type_into_prototype_chain) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1510,7 +1510,7 @@ TEST_F(ProjectStorage, SynchronizeTypesInsertTypeIntoPrototypeChain) IsExportedType(qtQuickNativeModuleId, "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesInsertTypeIntoExtensionChain) +TEST_F(ProjectStorage, synchronize_types_insert_type_into_extension_chain) { auto package{createSimpleSynchronizationPackage()}; swap(package.types.front().extension, package.types.front().prototype); @@ -1554,7 +1554,7 @@ TEST_F(ProjectStorage, SynchronizeTypesInsertTypeIntoExtensionChain) IsExportedType(qtQuickNativeModuleId, "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddQualifiedPrototype) +TEST_F(ProjectStorage, synchronize_types_add_qualified_prototype) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::QualifiedImportedType{ @@ -1599,7 +1599,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddQualifiedPrototype) IsExportedType(qtQuickNativeModuleId, "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddQualifiedExtension) +TEST_F(ProjectStorage, synchronize_types_add_qualified_extension) { auto package{createSimpleSynchronizationPackage()}; swap(package.types.front().extension, package.types.front().prototype); @@ -1645,7 +1645,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddQualifiedExtension) IsExportedType(qtQuickNativeModuleId, "QQuickItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesThrowsForMissingPrototype) +TEST_F(ProjectStorage, synchronize_types_throws_for_missing_prototype) { auto package{createSimpleSynchronizationPackage()}; package.types = {Storage::Synchronization::Type{ @@ -1660,7 +1660,7 @@ TEST_F(ProjectStorage, SynchronizeTypesThrowsForMissingPrototype) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesThrowsForMissingExtension) +TEST_F(ProjectStorage, synchronize_types_throws_for_missing_extension) { auto package{createSimpleSynchronizationPackage()}; package.types = {Storage::Synchronization::Type{ @@ -1675,7 +1675,7 @@ TEST_F(ProjectStorage, SynchronizeTypesThrowsForMissingExtension) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesThrowsForInvalidModule) +TEST_F(ProjectStorage, synchronize_types_throws_for_invalid_module) { auto package{createSimpleSynchronizationPackage()}; package.types = { @@ -1689,7 +1689,7 @@ TEST_F(ProjectStorage, SynchronizeTypesThrowsForInvalidModule) ASSERT_THROW(storage.synchronize(package), QmlDesigner::ModuleDoesNotExists); } -TEST_F(ProjectStorage, TypeWithInvalidSourceIdThrows) +TEST_F(ProjectStorage, type_with_invalid_source_id_throws) { auto package{createSimpleSynchronizationPackage()}; package.types = { @@ -1704,7 +1704,7 @@ TEST_F(ProjectStorage, TypeWithInvalidSourceIdThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeHasInvalidSourceId); } -TEST_F(ProjectStorage, DeleteTypeIfSourceIdIsSynchronized) +TEST_F(ProjectStorage, delete_type_if_source_id_is_synchronized) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1721,7 +1721,7 @@ TEST_F(ProjectStorage, DeleteTypeIfSourceIdIsSynchronized) IsExportedType(qmlNativeModuleId, "QObject")))))); } -TEST_F(ProjectStorage, DontDeleteTypeIfSourceIdIsNotSynchronized) +TEST_F(ProjectStorage, dont_delete_type_if_source_id_is_not_synchronized) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1745,7 +1745,7 @@ TEST_F(ProjectStorage, DontDeleteTypeIfSourceIdIsNotSynchronized) "QQuickItem")))))); } -TEST_F(ProjectStorage, UpdateExportedTypesIfTypeNameChanges) +TEST_F(ProjectStorage, update_exported_types_if_type_name_changes) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1770,7 +1770,7 @@ TEST_F(ProjectStorage, UpdateExportedTypesIfTypeNameChanges) "QQuickItem")))))); } -TEST_F(ProjectStorage, BreakingPrototypeChainByDeletingBaseComponentThrows) +TEST_F(ProjectStorage, breaking_prototype_chain_by_deleting_base_component_throws) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1781,7 +1781,7 @@ TEST_F(ProjectStorage, BreakingPrototypeChainByDeletingBaseComponentThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, BreakingExtensionChainByDeletingBaseComponentThrows) +TEST_F(ProjectStorage, breaking_extension_chain_by_deleting_base_component_throws) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -1793,7 +1793,7 @@ TEST_F(ProjectStorage, BreakingExtensionChainByDeletingBaseComponentThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesAddPropertyDeclarations) +TEST_F(ProjectStorage, synchronize_types_add_property_declarations) { auto package{createSimpleSynchronizationPackage()}; @@ -1814,7 +1814,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddPropertyDeclarations) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddPropertyDeclarationsWithMissingImports) +TEST_F(ProjectStorage, synchronize_types_add_property_declarations_with_missing_imports) { auto package{createSimpleSynchronizationPackage()}; package.imports.clear(); @@ -1822,7 +1822,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddPropertyDeclarationsWithMissingImports ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesAddPropertyDeclarationQualifiedType) +TEST_F(ProjectStorage, synchronize_types_add_property_declaration_qualified_type) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -1856,7 +1856,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddPropertyDeclarationQualifiedType) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesPropertyDeclarationType) +TEST_F(ProjectStorage, synchronize_types_changes_property_declaration_type) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1880,7 +1880,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesPropertyDeclarationType) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesDeclarationTraits) +TEST_F(ProjectStorage, synchronize_types_changes_declaration_traits) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1903,7 +1903,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesDeclarationTraits) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesDeclarationTraitsAndType) +TEST_F(ProjectStorage, synchronize_types_changes_declaration_traits_and_type) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1928,7 +1928,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesDeclarationTraitsAndType) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemovesAPropertyDeclaration) +TEST_F(ProjectStorage, synchronize_types_removes_a_property_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1948,7 +1948,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovesAPropertyDeclaration) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddsAPropertyDeclaration) +TEST_F(ProjectStorage, synchronize_types_adds_a_property_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -1978,7 +1978,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddsAPropertyDeclaration) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesRenameAPropertyDeclaration) +TEST_F(ProjectStorage, synchronize_types_rename_a_property_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2001,7 +2001,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRenameAPropertyDeclaration) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, UsingNonExistingPropertyTypeThrows) +TEST_F(ProjectStorage, using_non_existing_property_type_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::ImportedType{ @@ -2012,7 +2012,7 @@ TEST_F(ProjectStorage, UsingNonExistingPropertyTypeThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, UsingNonExistingQualifiedExportedPropertyTypeWithWrongNameThrows) +TEST_F(ProjectStorage, using_non_existing_qualified_exported_property_type_with_wrong_name_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -2026,7 +2026,7 @@ TEST_F(ProjectStorage, UsingNonExistingQualifiedExportedPropertyTypeWithWrongNam ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, UsingNonExistingQualifiedExportedPropertyTypeWithWrongModuleThrows) +TEST_F(ProjectStorage, using_non_existing_qualified_exported_property_type_with_wrong_module_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -2038,7 +2038,7 @@ TEST_F(ProjectStorage, UsingNonExistingQualifiedExportedPropertyTypeWithWrongMod ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, BreakingPropertyDeclarationTypeDependencyByDeletingTypeThrows) +TEST_F(ProjectStorage, breaking_property_declaration_type_dependency_by_deleting_type_throws) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2049,7 +2049,7 @@ TEST_F(ProjectStorage, BreakingPropertyDeclarationTypeDependencyByDeletingTypeTh ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesAddFunctionDeclarations) +TEST_F(ProjectStorage, synchronize_types_add_function_declarations) { auto package{createSimpleSynchronizationPackage()}; @@ -2066,7 +2066,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddFunctionDeclarations) Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationReturnType) +TEST_F(ProjectStorage, synchronize_types_changes_function_declaration_return_type) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2085,7 +2085,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationReturnType) Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationName) +TEST_F(ProjectStorage, synchronize_types_changes_function_declaration_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2104,7 +2104,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationName) Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationPopParameters) +TEST_F(ProjectStorage, synchronize_types_changes_function_declaration_pop_parameters) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2123,7 +2123,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationPopParameters) Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationAppendParameters) +TEST_F(ProjectStorage, synchronize_types_changes_function_declaration_append_parameters) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2143,7 +2143,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationAppendParameter Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationChangeParameterName) +TEST_F(ProjectStorage, synchronize_types_changes_function_declaration_change_parameter_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2162,7 +2162,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationChangeParameter Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationChangeParameterTypeName) +TEST_F(ProjectStorage, synchronize_types_changes_function_declaration_change_parameter_type_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2181,7 +2181,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationChangeParameter Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationChangeParameterTraits) +TEST_F(ProjectStorage, synchronize_types_changes_function_declaration_change_parameter_traits) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2201,7 +2201,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesFunctionDeclarationChangeParameter Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemovesFunctionDeclaration) +TEST_F(ProjectStorage, synchronize_types_removes_function_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2219,7 +2219,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovesFunctionDeclaration) UnorderedElementsAre(Eq(package.types[0].functionDeclarations[0])))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddFunctionDeclaration) +TEST_F(ProjectStorage, synchronize_types_add_function_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2240,7 +2240,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddFunctionDeclaration) Eq(package.types[0].functionDeclarations[2])))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddFunctionDeclarationsWithOverloads) +TEST_F(ProjectStorage, synchronize_types_add_function_declarations_with_overloads) { auto package{createSimpleSynchronizationPackage()}; package.types[0].functionDeclarations.push_back( @@ -2260,7 +2260,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddFunctionDeclarationsWithOverloads) Eq(package.types[0].functionDeclarations[2])))))); } -TEST_F(ProjectStorage, SynchronizeTypesFunctionDeclarationsAddingOverload) +TEST_F(ProjectStorage, synchronize_types_function_declarations_adding_overload) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2281,7 +2281,7 @@ TEST_F(ProjectStorage, SynchronizeTypesFunctionDeclarationsAddingOverload) Eq(package.types[0].functionDeclarations[2])))))); } -TEST_F(ProjectStorage, SynchronizeTypesFunctionDeclarationsRemovingOverload) +TEST_F(ProjectStorage, synchronize_types_function_declarations_removing_overload) { auto package{createSimpleSynchronizationPackage()}; package.types[0].functionDeclarations.push_back( @@ -2302,7 +2302,7 @@ TEST_F(ProjectStorage, SynchronizeTypesFunctionDeclarationsRemovingOverload) Eq(package.types[0].functionDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddSignalDeclarations) +TEST_F(ProjectStorage, synchronize_types_add_signal_declarations) { auto package{createSimpleSynchronizationPackage()}; @@ -2319,7 +2319,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddSignalDeclarations) Eq(package.types[0].signalDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationName) +TEST_F(ProjectStorage, synchronize_types_changes_signal_declaration_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2338,7 +2338,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationName) Eq(package.types[0].signalDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationPopParameters) +TEST_F(ProjectStorage, synchronize_types_changes_signal_declaration_pop_parameters) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2357,7 +2357,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationPopParameters) Eq(package.types[0].signalDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationAppendParameters) +TEST_F(ProjectStorage, synchronize_types_changes_signal_declaration_append_parameters) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2377,7 +2377,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationAppendParameters) Eq(package.types[0].signalDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationChangeParameterName) +TEST_F(ProjectStorage, synchronize_types_changes_signal_declaration_change_parameter_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2396,7 +2396,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationChangeParameterNa Eq(package.types[0].signalDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationChangeParameterTypeName) +TEST_F(ProjectStorage, synchronize_types_changes_signal_declaration_change_parameter_type_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2415,7 +2415,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationChangeParameterTy Eq(package.types[0].signalDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationChangeParameterTraits) +TEST_F(ProjectStorage, synchronize_types_changes_signal_declaration_change_parameter_traits) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2434,7 +2434,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesSignalDeclarationChangeParameterTr Eq(package.types[0].signalDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemovesSignalDeclaration) +TEST_F(ProjectStorage, synchronize_types_removes_signal_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2452,7 +2452,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovesSignalDeclaration) UnorderedElementsAre(Eq(package.types[0].signalDeclarations[0])))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddSignalDeclaration) +TEST_F(ProjectStorage, synchronize_types_add_signal_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2473,7 +2473,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddSignalDeclaration) Eq(package.types[0].signalDeclarations[2])))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddSignalDeclarationsWithOverloads) +TEST_F(ProjectStorage, synchronize_types_add_signal_declarations_with_overloads) { auto package{createSimpleSynchronizationPackage()}; package.types[0].signalDeclarations.push_back( @@ -2493,7 +2493,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddSignalDeclarationsWithOverloads) Eq(package.types[0].signalDeclarations[2])))))); } -TEST_F(ProjectStorage, SynchronizeTypesSignalDeclarationsAddingOverload) +TEST_F(ProjectStorage, synchronize_types_signal_declarations_adding_overload) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2514,7 +2514,7 @@ TEST_F(ProjectStorage, SynchronizeTypesSignalDeclarationsAddingOverload) Eq(package.types[0].signalDeclarations[2])))))); } -TEST_F(ProjectStorage, SynchronizeTypesSignalDeclarationsRemovingOverload) +TEST_F(ProjectStorage, synchronize_types_signal_declarations_removing_overload) { auto package{createSimpleSynchronizationPackage()}; package.types[0].signalDeclarations.push_back( @@ -2535,7 +2535,7 @@ TEST_F(ProjectStorage, SynchronizeTypesSignalDeclarationsRemovingOverload) Eq(package.types[0].signalDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddEnumerationDeclarations) +TEST_F(ProjectStorage, synchronize_types_add_enumeration_declarations) { auto package{createSimpleSynchronizationPackage()}; @@ -2552,7 +2552,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddEnumerationDeclarations) Eq(package.types[0].enumerationDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationName) +TEST_F(ProjectStorage, synchronize_types_changes_enumeration_declaration_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2571,7 +2571,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationName) Eq(package.types[0].enumerationDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationPopEnumeratorDeclaration) +TEST_F(ProjectStorage, synchronize_types_changes_enumeration_declaration_pop_enumerator_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2590,7 +2590,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationPopEnumerato Eq(package.types[0].enumerationDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationAppendEnumeratorDeclaration) +TEST_F(ProjectStorage, synchronize_types_changes_enumeration_declaration_append_enumerator_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2610,7 +2610,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationAppendEnumer Eq(package.types[0].enumerationDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationChangeEnumeratorDeclarationName) +TEST_F(ProjectStorage, synchronize_types_changes_enumeration_declaration_change_enumerator_declaration_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2629,7 +2629,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationChangeEnumer Eq(package.types[0].enumerationDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationChangeEnumeratorDeclarationValue) +TEST_F(ProjectStorage, synchronize_types_changes_enumeration_declaration_change_enumerator_declaration_value) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2649,7 +2649,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangesEnumerationDeclarationChangeEnumer } TEST_F(ProjectStorage, - SynchronizeTypesChangesEnumerationDeclarationAddThatEnumeratorDeclarationHasValue) + synchronize_types_changes_enumeration_declaration_add_that_enumerator_declaration_has_value) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2670,7 +2670,7 @@ TEST_F(ProjectStorage, } TEST_F(ProjectStorage, - SynchronizeTypesChangesEnumerationDeclarationRemoveThatEnumeratorDeclarationHasValue) + synchronize_types_changes_enumeration_declaration_remove_that_enumerator_declaration_has_value) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2689,7 +2689,7 @@ TEST_F(ProjectStorage, Eq(package.types[0].enumerationDeclarations[1])))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemovesEnumerationDeclaration) +TEST_F(ProjectStorage, synchronize_types_removes_enumeration_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2707,7 +2707,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovesEnumerationDeclaration) Eq(package.types[0].enumerationDeclarations[0])))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddEnumerationDeclaration) +TEST_F(ProjectStorage, synchronize_types_add_enumeration_declaration) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2728,7 +2728,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddEnumerationDeclaration) Eq(package.types[0].enumerationDeclarations[2])))))); } -TEST_F(ProjectStorage, FetchTypeIdBySourceIdAndName) +TEST_F(ProjectStorage, fetch_type_id_by_source_id_and_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2738,7 +2738,7 @@ TEST_F(ProjectStorage, FetchTypeIdBySourceIdAndName) ASSERT_THAT(storage.fetchTypeIdByExportedName("Object"), Eq(typeId)); } -TEST_F(ProjectStorage, FetchTypeIdByExportedName) +TEST_F(ProjectStorage, fetch_type_id_by_exported_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2748,7 +2748,7 @@ TEST_F(ProjectStorage, FetchTypeIdByExportedName) ASSERT_THAT(storage.fetchTypeIdByName(sourceId2, "QObject"), Eq(typeId)); } -TEST_F(ProjectStorage, FetchTypeIdByImporIdsAndExportedName) +TEST_F(ProjectStorage, fetch_type_id_by_impor_ids_and_exported_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2759,7 +2759,7 @@ TEST_F(ProjectStorage, FetchTypeIdByImporIdsAndExportedName) ASSERT_THAT(storage.fetchTypeIdByName(sourceId2, "QObject"), Eq(typeId)); } -TEST_F(ProjectStorage, FetchInvalidTypeIdByImporIdsAndExportedNameIfModuleIdsAreEmpty) +TEST_F(ProjectStorage, fetch_invalid_type_id_by_impor_ids_and_exported_name_if_module_ids_are_empty) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2769,7 +2769,7 @@ TEST_F(ProjectStorage, FetchInvalidTypeIdByImporIdsAndExportedNameIfModuleIdsAre ASSERT_FALSE(typeId.isValid()); } -TEST_F(ProjectStorage, FetchInvalidTypeIdByImporIdsAndExportedNameIfModuleIdsAreInvalid) +TEST_F(ProjectStorage, fetch_invalid_type_id_by_impor_ids_and_exported_name_if_module_ids_are_invalid) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2779,7 +2779,7 @@ TEST_F(ProjectStorage, FetchInvalidTypeIdByImporIdsAndExportedNameIfModuleIdsAre ASSERT_FALSE(typeId.isValid()); } -TEST_F(ProjectStorage, FetchInvalidTypeIdByImporIdsAndExportedNameIfNotInModule) +TEST_F(ProjectStorage, fetch_invalid_type_id_by_impor_ids_and_exported_name_if_not_in_module) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -2790,7 +2790,7 @@ TEST_F(ProjectStorage, FetchInvalidTypeIdByImporIdsAndExportedNameIfNotInModule) ASSERT_FALSE(typeId.isValid()); } -TEST_F(ProjectStorage, SynchronizeTypesAddAliasDeclarations) +TEST_F(ProjectStorage, synchronize_types_add_alias_declarations) { auto package{createSynchronizationPackageWithAliases()}; @@ -2816,7 +2816,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddAliasDeclarations) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddAliasDeclarationsAgain) +TEST_F(ProjectStorage, synchronize_types_add_alias_declarations_again) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -2843,7 +2843,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddAliasDeclarationsAgain) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemoveAliasDeclarations) +TEST_F(ProjectStorage, synchronize_types_remove_alias_declarations) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -2868,7 +2868,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemoveAliasDeclarations) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddAliasDeclarationsThrowsForWrongTypeName) +TEST_F(ProjectStorage, synchronize_types_add_alias_declarations_throws_for_wrong_type_name) { auto package{createSynchronizationPackageWithAliases()}; package.types[2].propertyDeclarations[1].typeName = Storage::Synchronization::ImportedType{ @@ -2881,7 +2881,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddAliasDeclarationsThrowsForWrongTypeNam {sourceId4}}), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesAddAliasDeclarationsThrowsForWrongPropertyName) +TEST_F(ProjectStorage, synchronize_types_add_alias_declarations_throws_for_wrong_property_name) { auto package{createSynchronizationPackageWithAliases()}; package.types[2].propertyDeclarations[1].aliasPropertyName = "childrenWrong"; @@ -2894,7 +2894,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddAliasDeclarationsThrowsForWrongPropert QmlDesigner::PropertyNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesChangeAliasDeclarationsTypeName) +TEST_F(ProjectStorage, synchronize_types_change_alias_declarations_type_name) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -2924,7 +2924,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeAliasDeclarationsTypeName) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeAliasDeclarationsPropertyName) +TEST_F(ProjectStorage, synchronize_types_change_alias_declarations_property_name) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -2951,7 +2951,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeAliasDeclarationsPropertyName) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeAliasDeclarationsToPropertyDeclaration) +TEST_F(ProjectStorage, synchronize_types_change_alias_declarations_to_property_declaration) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -2982,7 +2982,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeAliasDeclarationsToPropertyDeclarat Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangePropertyDeclarationsToAliasDeclaration) +TEST_F(ProjectStorage, synchronize_types_change_property_declarations_to_alias_declaration) { auto package{createSynchronizationPackageWithAliases()}; auto packageChanged = package; @@ -3015,7 +3015,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangePropertyDeclarationsToAliasDeclarat Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeAliasTargetPropertyDeclarationTraits) +TEST_F(ProjectStorage, synchronize_types_change_alias_target_property_declaration_traits) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -3043,7 +3043,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeAliasTargetPropertyDeclarationTrait Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeAliasTargetPropertyDeclarationTypeName) +TEST_F(ProjectStorage, synchronize_types_change_alias_target_property_declaration_type_name) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -3073,7 +3073,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeAliasTargetPropertyDeclarationTypeN Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationWithAnAliasThrows) +TEST_F(ProjectStorage, synchronize_types_remove_property_declaration_with_an_alias_throws) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -3084,7 +3084,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationWithAnAliasThrow Sqlite::ConstraintPreventsModification); } -TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationAndAlias) +TEST_F(ProjectStorage, synchronize_types_remove_property_declaration_and_alias) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -3112,7 +3112,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationAndAlias) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemoveTypeWithAliasTargetPropertyDeclarationThrows) +TEST_F(ProjectStorage, synchronize_types_remove_type_with_alias_target_property_declaration_throws) { auto package{createSynchronizationPackageWithAliases()}; package.types[2].propertyDeclarations[2].typeName = Storage::Synchronization::ImportedType{ @@ -3124,7 +3124,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemoveTypeWithAliasTargetPropertyDeclarat QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesRemoveTypeAndAliasPropertyDeclaration) +TEST_F(ProjectStorage, synchronize_types_remove_type_and_alias_property_declaration) { auto package{createSynchronizationPackageWithAliases()}; package.types[2].propertyDeclarations[2].typeName = Storage::Synchronization::ImportedType{ @@ -3154,7 +3154,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemoveTypeAndAliasPropertyDeclaration) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, UpdateAliasPropertyIfPropertyIsOverloaded) +TEST_F(ProjectStorage, update_alias_property_if_property_is_overloaded) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -3184,7 +3184,7 @@ TEST_F(ProjectStorage, UpdateAliasPropertyIfPropertyIsOverloaded) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, AliasPropertyIsOverloaded) +TEST_F(ProjectStorage, alias_property_is_overloaded) { auto package{createSynchronizationPackageWithAliases()}; package.types[0].propertyDeclarations.push_back(Storage::Synchronization::PropertyDeclaration{ @@ -3213,7 +3213,7 @@ TEST_F(ProjectStorage, AliasPropertyIsOverloaded) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, UpdateAliasPropertyIfOverloadedPropertyIsRemoved) +TEST_F(ProjectStorage, update_alias_property_if_overloaded_property_is_removed) { auto package{createSynchronizationPackageWithAliases()}; package.types[0].propertyDeclarations.push_back(Storage::Synchronization::PropertyDeclaration{ @@ -3245,7 +3245,7 @@ TEST_F(ProjectStorage, UpdateAliasPropertyIfOverloadedPropertyIsRemoved) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, RelinkAliasProperty) +TEST_F(ProjectStorage, relink_alias_property) { auto package{createSynchronizationPackageWithAliases()}; package.types[1].propertyDeclarations[0].typeName = Storage::Synchronization::ImportedType{ @@ -3277,7 +3277,7 @@ TEST_F(ProjectStorage, RelinkAliasProperty) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, DoNotRelinkAliasPropertyForQualifiedImportedTypeName) +TEST_F(ProjectStorage, do_not_relink_alias_property_for_qualified_imported_type_name) { auto package{createSynchronizationPackageWithAliases()}; package.types[1].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -3294,7 +3294,7 @@ TEST_F(ProjectStorage, DoNotRelinkAliasPropertyForQualifiedImportedTypeName) } TEST_F(ProjectStorage, - DoRelinkAliasPropertyForQualifiedImportedTypeNameEvenIfAnOtherSimilarTimeNameExists) + do_relink_alias_property_for_qualified_imported_type_name_even_if_an_other_similar_time_name_exists) { auto package{createSynchronizationPackageWithAliases()}; package.types[1].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -3333,7 +3333,7 @@ TEST_F(ProjectStorage, Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, RelinkAliasPropertyReactToTypeNameChange) +TEST_F(ProjectStorage, relink_alias_property_react_to_type_name_change) { auto package{createSynchronizationPackageWithAliases2()}; package.types[2].propertyDeclarations.push_back(Storage::Synchronization::PropertyDeclaration{ @@ -3361,7 +3361,7 @@ TEST_F(ProjectStorage, RelinkAliasPropertyReactToTypeNameChange) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, DoNotRelinkAliasPropertyForDeletedType) +TEST_F(ProjectStorage, do_not_relink_alias_property_for_deleted_type) { auto package{createSynchronizationPackageWithAliases()}; package.types[1].propertyDeclarations[0].typeName = Storage::Synchronization::ImportedType{ @@ -3381,7 +3381,7 @@ TEST_F(ProjectStorage, DoNotRelinkAliasPropertyForDeletedType) TypeTraits::Reference)))); } -TEST_F(ProjectStorage, DoNotRelinkAliasPropertyForDeletedTypeAndPropertyType) +TEST_F(ProjectStorage, do_not_relink_alias_property_for_deleted_type_and_property_type) { auto package{createSynchronizationPackageWithAliases()}; package.types[1].propertyDeclarations[0].typeName = Storage::Synchronization::ImportedType{ @@ -3404,7 +3404,7 @@ TEST_F(ProjectStorage, DoNotRelinkAliasPropertyForDeletedTypeAndPropertyType) ASSERT_THAT(storage.fetchTypes(), SizeIs(2)); } -TEST_F(ProjectStorage, DoNotRelinkAliasPropertyForDeletedTypeAndPropertyTypeNameChange) +TEST_F(ProjectStorage, do_not_relink_alias_property_for_deleted_type_and_property_type_name_change) { auto package{createSynchronizationPackageWithAliases()}; package.types[1].propertyDeclarations[0].typeName = Storage::Synchronization::ImportedType{ @@ -3427,7 +3427,7 @@ TEST_F(ProjectStorage, DoNotRelinkAliasPropertyForDeletedTypeAndPropertyTypeName TypeTraits::Reference)))); } -TEST_F(ProjectStorage, DoNotRelinkPropertyTypeDoesNotExists) +TEST_F(ProjectStorage, do_not_relink_property_type_does_not_exists) { auto package{createSynchronizationPackageWithAliases()}; package.types[1].propertyDeclarations[0].typeName = Storage::Synchronization::ImportedType{ @@ -3440,7 +3440,7 @@ TEST_F(ProjectStorage, DoNotRelinkPropertyTypeDoesNotExists) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, DoNotRelinkAliasPropertyTypeDoesNotExists) +TEST_F(ProjectStorage, do_not_relink_alias_property_type_does_not_exists) { auto package{createSynchronizationPackageWithAliases2()}; package.types[1].propertyDeclarations[0].typeName = Storage::Synchronization::ImportedType{ @@ -3452,7 +3452,7 @@ TEST_F(ProjectStorage, DoNotRelinkAliasPropertyTypeDoesNotExists) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, ChangePrototypeTypeName) +TEST_F(ProjectStorage, change_prototype_type_name) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -3468,7 +3468,7 @@ TEST_F(ProjectStorage, ChangePrototypeTypeName) TypeTraits::Reference))); } -TEST_F(ProjectStorage, ChangeExtensionTypeName) +TEST_F(ProjectStorage, change_extension_type_name) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3485,7 +3485,7 @@ TEST_F(ProjectStorage, ChangeExtensionTypeName) TypeTraits::Reference))); } -TEST_F(ProjectStorage, ChangePrototypeTypeModuleId) +TEST_F(ProjectStorage, change_prototype_type_module_id) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -3501,7 +3501,7 @@ TEST_F(ProjectStorage, ChangePrototypeTypeModuleId) TypeTraits::Reference))); } -TEST_F(ProjectStorage, ChangeExtensionTypeModuleId) +TEST_F(ProjectStorage, change_extension_type_module_id) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3518,7 +3518,7 @@ TEST_F(ProjectStorage, ChangeExtensionTypeModuleId) TypeTraits::Reference))); } -TEST_F(ProjectStorage, ChangeQualifiedPrototypeTypeModuleIdThrows) +TEST_F(ProjectStorage, change_qualified_prototype_type_module_id_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::QualifiedImportedType{ @@ -3532,7 +3532,7 @@ TEST_F(ProjectStorage, ChangeQualifiedPrototypeTypeModuleIdThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, ChangeQualifiedExtensionTypeModuleIdThrows) +TEST_F(ProjectStorage, change_qualified_extension_type_module_id_throws) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3547,7 +3547,7 @@ TEST_F(ProjectStorage, ChangeQualifiedExtensionTypeModuleIdThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, ChangeQualifiedPrototypeTypeModuleId) +TEST_F(ProjectStorage, change_qualified_prototype_type_module_id) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::QualifiedImportedType{ @@ -3573,7 +3573,7 @@ TEST_F(ProjectStorage, ChangeQualifiedPrototypeTypeModuleId) TypeTraits::Reference))); } -TEST_F(ProjectStorage, ChangeQualifiedExtensionTypeModuleId) +TEST_F(ProjectStorage, change_qualified_extension_type_module_id) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3600,7 +3600,7 @@ TEST_F(ProjectStorage, ChangeQualifiedExtensionTypeModuleId) TypeTraits::Reference))); } -TEST_F(ProjectStorage, ChangePrototypeTypeNameAndModuleId) +TEST_F(ProjectStorage, change_prototype_type_name_and_module_id) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::ImportedType{"Object"}; @@ -3623,7 +3623,7 @@ TEST_F(ProjectStorage, ChangePrototypeTypeNameAndModuleId) TypeTraits::Reference))); } -TEST_F(ProjectStorage, ChangeExtensionTypeNameAndModuleId) +TEST_F(ProjectStorage, change_extension_type_name_and_module_id) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3647,7 +3647,7 @@ TEST_F(ProjectStorage, ChangeExtensionTypeNameAndModuleId) TypeTraits::Reference))); } -TEST_F(ProjectStorage, ChangePrototypeTypeNameThrowsForWrongNativePrototupeTypeName) +TEST_F(ProjectStorage, change_prototype_type_name_throws_for_wrong_native_prototupe_type_name) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::ImportedType{ @@ -3661,7 +3661,7 @@ TEST_F(ProjectStorage, ChangePrototypeTypeNameThrowsForWrongNativePrototupeTypeN QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, ChangeExtensionTypeNameThrowsForWrongNativeExtensionTypeName) +TEST_F(ProjectStorage, change_extension_type_name_throws_for_wrong_native_extension_type_name) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3676,7 +3676,7 @@ TEST_F(ProjectStorage, ChangeExtensionTypeNameThrowsForWrongNativeExtensionTypeN QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, ThrowForPrototypeChainCycles) +TEST_F(ProjectStorage, throw_for_prototype_chain_cycles) { auto package{createSimpleSynchronizationPackage()}; package.types[1].prototype = Storage::Synchronization::ImportedType{"Object2"}; @@ -3700,7 +3700,7 @@ TEST_F(ProjectStorage, ThrowForPrototypeChainCycles) QmlDesigner::PrototypeChainCycle); } -TEST_F(ProjectStorage, ThrowForExtensionChainCycles) +TEST_F(ProjectStorage, throw_for_extension_chain_cycles) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3725,7 +3725,7 @@ TEST_F(ProjectStorage, ThrowForExtensionChainCycles) QmlDesigner::PrototypeChainCycle); } -TEST_F(ProjectStorage, ThrowForTypeIdAndPrototypeIdAreTheSame) +TEST_F(ProjectStorage, throw_for_type_id_and_prototype_id_are_the_same) { auto package{createSimpleSynchronizationPackage()}; package.types[1].prototype = Storage::Synchronization::ImportedType{"Object"}; @@ -3733,7 +3733,7 @@ TEST_F(ProjectStorage, ThrowForTypeIdAndPrototypeIdAreTheSame) ASSERT_THROW(storage.synchronize(package), QmlDesigner::PrototypeChainCycle); } -TEST_F(ProjectStorage, ThrowForTypeIdAndExtensionIdAreTheSame) +TEST_F(ProjectStorage, throw_for_type_id_and_extension_id_are_the_same) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3742,7 +3742,7 @@ TEST_F(ProjectStorage, ThrowForTypeIdAndExtensionIdAreTheSame) ASSERT_THROW(storage.synchronize(package), QmlDesigner::PrototypeChainCycle); } -TEST_F(ProjectStorage, ThrowForTypeIdAndPrototypeIdAreTheSameForRelinking) +TEST_F(ProjectStorage, throw_for_type_id_and_prototype_id_are_the_same_for_relinking) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -3755,7 +3755,7 @@ TEST_F(ProjectStorage, ThrowForTypeIdAndPrototypeIdAreTheSameForRelinking) QmlDesigner::PrototypeChainCycle); } -TEST_F(ProjectStorage, ThrowForTypeIdAndExtenssionIdAreTheSameForRelinking) +TEST_F(ProjectStorage, throw_for_type_id_and_extenssion_id_are_the_same_for_relinking) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3769,7 +3769,7 @@ TEST_F(ProjectStorage, ThrowForTypeIdAndExtenssionIdAreTheSameForRelinking) QmlDesigner::PrototypeChainCycle); } -TEST_F(ProjectStorage, RecursiveAliases) +TEST_F(ProjectStorage, recursive_aliases) { auto package{createSynchronizationPackageWithRecursiveAliases()}; @@ -3787,7 +3787,7 @@ TEST_F(ProjectStorage, RecursiveAliases) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, RecursiveAliasesChangePropertyType) +TEST_F(ProjectStorage, recursive_aliases_change_property_type) { auto package{createSynchronizationPackageWithRecursiveAliases()}; storage.synchronize(package); @@ -3809,7 +3809,7 @@ TEST_F(ProjectStorage, RecursiveAliasesChangePropertyType) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, UpdateAliasesAfterInjectingProperty) +TEST_F(ProjectStorage, update_aliases_after_injecting_property) { auto package{createSynchronizationPackageWithRecursiveAliases()}; storage.synchronize(package); @@ -3833,7 +3833,7 @@ TEST_F(ProjectStorage, UpdateAliasesAfterInjectingProperty) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, UpdateAliasesAfterChangeAliasToProperty) +TEST_F(ProjectStorage, update_aliases_after_change_alias_to_property) { auto package{createSynchronizationPackageWithRecursiveAliases()}; storage.synchronize(package); @@ -3870,7 +3870,7 @@ TEST_F(ProjectStorage, UpdateAliasesAfterChangeAliasToProperty) ""))))))); } -TEST_F(ProjectStorage, UpdateAliasesAfterChangePropertyToAlias) +TEST_F(ProjectStorage, update_aliases_after_change_property_to_alias) { auto package{createSynchronizationPackageWithRecursiveAliases()}; package.types[3].propertyDeclarations[0].traits = Storage::PropertyDeclarationTraits::IsList @@ -3897,7 +3897,7 @@ TEST_F(ProjectStorage, UpdateAliasesAfterChangePropertyToAlias) "objects")))))); } -TEST_F(ProjectStorage, CheckForProtoTypeCycleThrows) +TEST_F(ProjectStorage, check_for_proto_type_cycle_throws) { auto package{createSynchronizationPackageWithRecursiveAliases()}; package.types[1].propertyDeclarations.clear(); @@ -3908,7 +3908,7 @@ TEST_F(ProjectStorage, CheckForProtoTypeCycleThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::AliasChainCycle); } -TEST_F(ProjectStorage, CheckForProtoTypeCycleAfterUpdateThrows) +TEST_F(ProjectStorage, check_for_proto_type_cycle_after_update_throws) { auto package{createSynchronizationPackageWithRecursiveAliases()}; storage.synchronize(package); @@ -3922,7 +3922,7 @@ TEST_F(ProjectStorage, CheckForProtoTypeCycleAfterUpdateThrows) QmlDesigner::AliasChainCycle); } -TEST_F(ProjectStorage, QualifiedPrototype) +TEST_F(ProjectStorage, qualified_prototype) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::QualifiedImportedType{ @@ -3949,7 +3949,7 @@ TEST_F(ProjectStorage, QualifiedPrototype) TypeTraits::Reference))); } -TEST_F(ProjectStorage, QualifiedExtension) +TEST_F(ProjectStorage, qualified_extension) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -3977,7 +3977,7 @@ TEST_F(ProjectStorage, QualifiedExtension) TypeTraits::Reference))); } -TEST_F(ProjectStorage, QualifiedPrototypeUpperDownTheModuleChainThrows) +TEST_F(ProjectStorage, qualified_prototype_upper_down_the_module_chain_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::QualifiedImportedType{ @@ -3989,7 +3989,7 @@ TEST_F(ProjectStorage, QualifiedPrototypeUpperDownTheModuleChainThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, QualifiedExtensionUpperDownTheModuleChainThrows) +TEST_F(ProjectStorage, qualified_extension_upper_down_the_module_chain_throws) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -4002,7 +4002,7 @@ TEST_F(ProjectStorage, QualifiedExtensionUpperDownTheModuleChainThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, QualifiedPrototypeUpperInTheModuleChain) +TEST_F(ProjectStorage, qualified_prototype_upper_in_the_module_chain) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::QualifiedImportedType{ @@ -4031,7 +4031,7 @@ TEST_F(ProjectStorage, QualifiedPrototypeUpperInTheModuleChain) TypeTraits::Reference))); } -TEST_F(ProjectStorage, QualifiedExtensionUpperInTheModuleChain) +TEST_F(ProjectStorage, qualified_extension_upper_in_the_module_chain) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -4061,7 +4061,7 @@ TEST_F(ProjectStorage, QualifiedExtensionUpperInTheModuleChain) TypeTraits::Reference))); } -TEST_F(ProjectStorage, QualifiedPrototypeWithWrongVersionThrows) +TEST_F(ProjectStorage, qualified_prototype_with_wrong_version_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::QualifiedImportedType{ @@ -4081,7 +4081,7 @@ TEST_F(ProjectStorage, QualifiedPrototypeWithWrongVersionThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, QualifiedExtensionWithWrongVersionThrows) +TEST_F(ProjectStorage, qualified_extension_with_wrong_version_throws) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -4102,7 +4102,7 @@ TEST_F(ProjectStorage, QualifiedExtensionWithWrongVersionThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, QualifiedPrototypeWithVersion) +TEST_F(ProjectStorage, qualified_prototype_with_version) { auto package{createSimpleSynchronizationPackage()}; package.imports[0].version = Storage::Version{2}; @@ -4129,7 +4129,7 @@ TEST_F(ProjectStorage, QualifiedPrototypeWithVersion) TypeTraits::Reference))); } -TEST_F(ProjectStorage, QualifiedExtensionWithVersion) +TEST_F(ProjectStorage, qualified_extension_with_version) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -4157,7 +4157,7 @@ TEST_F(ProjectStorage, QualifiedExtensionWithVersion) TypeTraits::Reference))); } -TEST_F(ProjectStorage, QualifiedPrototypeWithVersionInTheProtoTypeChain) +TEST_F(ProjectStorage, qualified_prototype_with_version_in_the_proto_type_chain) { auto package{createSimpleSynchronizationPackage()}; package.imports[1].version = Storage::Version{2}; @@ -4186,7 +4186,7 @@ TEST_F(ProjectStorage, QualifiedPrototypeWithVersionInTheProtoTypeChain) TypeTraits::Reference))); } -TEST_F(ProjectStorage, QualifiedExtensionWithVersionInTheProtoTypeChain) +TEST_F(ProjectStorage, qualified_extension_with_version_in_the_proto_type_chain) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -4216,7 +4216,7 @@ TEST_F(ProjectStorage, QualifiedExtensionWithVersionInTheProtoTypeChain) TypeTraits::Reference))); } -TEST_F(ProjectStorage, QualifiedPrototypeWithVersionDownTheProtoTypeChainThrows) +TEST_F(ProjectStorage, qualified_prototype_with_version_down_the_proto_type_chain_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].prototype = Storage::Synchronization::QualifiedImportedType{ @@ -4228,7 +4228,7 @@ TEST_F(ProjectStorage, QualifiedPrototypeWithVersionDownTheProtoTypeChainThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, QualifiedExtensionWithVersionDownTheProtoTypeChainThrows) +TEST_F(ProjectStorage, qualified_extension_with_version_down_the_proto_type_chain_throws) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -4241,7 +4241,7 @@ TEST_F(ProjectStorage, QualifiedExtensionWithVersionDownTheProtoTypeChainThrows) ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, QualifiedPropertyDeclarationTypeName) +TEST_F(ProjectStorage, qualified_property_declaration_type_name) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -4268,7 +4268,7 @@ TEST_F(ProjectStorage, QualifiedPropertyDeclarationTypeName) Storage::PropertyDeclarationTraits::IsList))))); } -TEST_F(ProjectStorage, QualifiedPropertyDeclarationTypeNameDownTheModuleChainThrows) +TEST_F(ProjectStorage, qualified_property_declaration_type_name_down_the_module_chain_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -4280,7 +4280,7 @@ TEST_F(ProjectStorage, QualifiedPropertyDeclarationTypeNameDownTheModuleChainThr ASSERT_THROW(storage.synchronize(package), QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, QualifiedPropertyDeclarationTypeNameInTheModuleChain) +TEST_F(ProjectStorage, qualified_property_declaration_type_name_in_the_module_chain) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -4309,7 +4309,7 @@ TEST_F(ProjectStorage, QualifiedPropertyDeclarationTypeNameInTheModuleChain) Storage::PropertyDeclarationTraits::IsList))))); } -TEST_F(ProjectStorage, QualifiedPropertyDeclarationTypeNameWithVersion) +TEST_F(ProjectStorage, qualified_property_declaration_type_name_with_version) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -4327,7 +4327,7 @@ TEST_F(ProjectStorage, QualifiedPropertyDeclarationTypeNameWithVersion) Storage::PropertyDeclarationTraits::IsList))))); } -TEST_F(ProjectStorage, ChangePropertyTypeModuleIdWithQualifiedTypeThrows) +TEST_F(ProjectStorage, change_property_type_module_id_with_qualified_type_throws) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -4341,7 +4341,7 @@ TEST_F(ProjectStorage, ChangePropertyTypeModuleIdWithQualifiedTypeThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, ChangePropertyTypeModuleIdWithQualifiedType) +TEST_F(ProjectStorage, change_property_type_module_id_with_qualified_type) { auto package{createSimpleSynchronizationPackage()}; package.types[0].propertyDeclarations[0].typeName = Storage::Synchronization::QualifiedImportedType{ @@ -4368,7 +4368,7 @@ TEST_F(ProjectStorage, ChangePropertyTypeModuleIdWithQualifiedType) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, AddFileStatuses) +TEST_F(ProjectStorage, add_file_statuses) { FileStatus fileStatus1{sourceId1, 100, 100}; FileStatus fileStatus2{sourceId2, 101, 101}; @@ -4379,7 +4379,7 @@ TEST_F(ProjectStorage, AddFileStatuses) UnorderedElementsAre(fileStatus1, fileStatus2)); } -TEST_F(ProjectStorage, RemoveFileStatus) +TEST_F(ProjectStorage, remove_file_status) { FileStatus fileStatus1{sourceId1, 100, 100}; FileStatus fileStatus2{sourceId2, 101, 101}; @@ -4390,7 +4390,7 @@ TEST_F(ProjectStorage, RemoveFileStatus) ASSERT_THAT(convert(storage.fetchAllFileStatuses()), UnorderedElementsAre(fileStatus1)); } -TEST_F(ProjectStorage, UpdateFileStatus) +TEST_F(ProjectStorage, update_file_status) { FileStatus fileStatus1{sourceId1, 100, 100}; FileStatus fileStatus2{sourceId2, 101, 101}; @@ -4403,7 +4403,7 @@ TEST_F(ProjectStorage, UpdateFileStatus) UnorderedElementsAre(fileStatus1, fileStatus2b)); } -TEST_F(ProjectStorage, ThrowForInvalidSourceIdInFileStatus) +TEST_F(ProjectStorage, throw_for_invalid_source_id_in_file_status) { FileStatus fileStatus1{SourceId{}, 100, 100}; @@ -4411,7 +4411,7 @@ TEST_F(ProjectStorage, ThrowForInvalidSourceIdInFileStatus) QmlDesigner::FileStatusHasInvalidSourceId); } -TEST_F(ProjectStorage, FetchAllFileStatuses) +TEST_F(ProjectStorage, fetch_all_file_statuses) { FileStatus fileStatus1{sourceId1, 100, 100}; FileStatus fileStatus2{sourceId2, 101, 101}; @@ -4422,7 +4422,7 @@ TEST_F(ProjectStorage, FetchAllFileStatuses) ASSERT_THAT(fileStatuses, ElementsAre(fileStatus1, fileStatus2)); } -TEST_F(ProjectStorage, FetchAllFileStatusesReverse) +TEST_F(ProjectStorage, fetch_all_file_statuses_reverse) { FileStatus fileStatus1{sourceId1, 100, 100}; FileStatus fileStatus2{sourceId2, 101, 101}; @@ -4433,7 +4433,7 @@ TEST_F(ProjectStorage, FetchAllFileStatusesReverse) ASSERT_THAT(fileStatuses, ElementsAre(fileStatus1, fileStatus2)); } -TEST_F(ProjectStorage, FetchFileStatus) +TEST_F(ProjectStorage, fetch_file_status) { FileStatus fileStatus1{sourceId1, 100, 100}; FileStatus fileStatus2{sourceId2, 101, 101}; @@ -4444,7 +4444,7 @@ TEST_F(ProjectStorage, FetchFileStatus) ASSERT_THAT(fileStatus, Eq(fileStatus1)); } -TEST_F(ProjectStorage, SynchronizeTypesWithoutTypeName) +TEST_F(ProjectStorage, synchronize_types_without_type_name) { auto package{createSynchronizationPackageWithAliases()}; storage.synchronize(package); @@ -4463,7 +4463,7 @@ TEST_F(ProjectStorage, SynchronizeTypesWithoutTypeName) IsExportedType("Obj2")))))); } -TEST_F(ProjectStorage, FetchByMajorVersionForImportedType) +TEST_F(ProjectStorage, fetch_by_major_version_for_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4487,7 +4487,7 @@ TEST_F(ProjectStorage, FetchByMajorVersionForImportedType) sourceId2, "Item", fetchTypeId(sourceId1, "QObject"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchByMajorVersionForQualifiedImportedType) +TEST_F(ProjectStorage, fetch_by_major_version_for_qualified_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4511,7 +4511,7 @@ TEST_F(ProjectStorage, FetchByMajorVersionForQualifiedImportedType) sourceId2, "Item", fetchTypeId(sourceId1, "QObject"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchByMajorVersionAndMinorVersionForImportedType) +TEST_F(ProjectStorage, fetch_by_major_version_and_minor_version_for_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4535,7 +4535,7 @@ TEST_F(ProjectStorage, FetchByMajorVersionAndMinorVersionForImportedType) sourceId2, "Item", fetchTypeId(sourceId1, "QObject"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchByMajorVersionAndMinorVersionForQualifiedImportedType) +TEST_F(ProjectStorage, fetch_by_major_version_and_minor_version_for_qualified_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4560,7 +4560,7 @@ TEST_F(ProjectStorage, FetchByMajorVersionAndMinorVersionForQualifiedImportedTyp } TEST_F(ProjectStorage, - FetchByMajorVersionAndMinorVersionForImportedTypeIfMinorVersionIsNotExportedThrows) + fetch_by_major_version_and_minor_version_for_imported_type_if_minor_version_is_not_exported_throws) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4582,7 +4582,7 @@ TEST_F(ProjectStorage, } TEST_F(ProjectStorage, - FetchByMajorVersionAndMinorVersionForQualifiedImportedTypeIfMinorVersionIsNotExportedThrows) + fetch_by_major_version_and_minor_version_for_qualified_imported_type_if_minor_version_is_not_exported_throws) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4603,7 +4603,7 @@ TEST_F(ProjectStorage, QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, FetchLowMinorVersionForImportedTypeThrows) +TEST_F(ProjectStorage, fetch_low_minor_version_for_imported_type_throws) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4624,7 +4624,7 @@ TEST_F(ProjectStorage, FetchLowMinorVersionForImportedTypeThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, FetchLowMinorVersionForQualifiedImportedTypeThrows) +TEST_F(ProjectStorage, fetch_low_minor_version_for_qualified_imported_type_throws) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4645,7 +4645,7 @@ TEST_F(ProjectStorage, FetchLowMinorVersionForQualifiedImportedTypeThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, FetchHigherMinorVersionForImportedType) +TEST_F(ProjectStorage, fetch_higher_minor_version_for_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4669,7 +4669,7 @@ TEST_F(ProjectStorage, FetchHigherMinorVersionForImportedType) sourceId2, "Item", fetchTypeId(sourceId1, "QObject"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchHigherMinorVersionForQualifiedImportedType) +TEST_F(ProjectStorage, fetch_higher_minor_version_for_qualified_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4693,7 +4693,7 @@ TEST_F(ProjectStorage, FetchHigherMinorVersionForQualifiedImportedType) sourceId2, "Item", fetchTypeId(sourceId1, "QObject"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchDifferentMajorVersionForImportedTypeThrows) +TEST_F(ProjectStorage, fetch_different_major_version_for_imported_type_throws) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4714,7 +4714,7 @@ TEST_F(ProjectStorage, FetchDifferentMajorVersionForImportedTypeThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, FetchDifferentMajorVersionForQualifiedImportedTypeThrows) +TEST_F(ProjectStorage, fetch_different_major_version_for_qualified_imported_type_throws) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4735,7 +4735,7 @@ TEST_F(ProjectStorage, FetchDifferentMajorVersionForQualifiedImportedTypeThrows) QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, FetchOtherTypeByDifferentVersionForImportedType) +TEST_F(ProjectStorage, fetch_other_type_by_different_version_for_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4759,7 +4759,7 @@ TEST_F(ProjectStorage, FetchOtherTypeByDifferentVersionForImportedType) sourceId2, "Item", fetchTypeId(sourceId1, "QObject2"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchOtherTypeByDifferentVersionForQualifiedImportedType) +TEST_F(ProjectStorage, fetch_other_type_by_different_version_for_qualified_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4783,7 +4783,7 @@ TEST_F(ProjectStorage, FetchOtherTypeByDifferentVersionForQualifiedImportedType) sourceId2, "Item", fetchTypeId(sourceId1, "QObject2"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchHighestVersionForImportWithoutVersionForImportedType) +TEST_F(ProjectStorage, fetch_highest_version_for_import_without_version_for_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4805,7 +4805,7 @@ TEST_F(ProjectStorage, FetchHighestVersionForImportWithoutVersionForImportedType sourceId2, "Item", fetchTypeId(sourceId1, "QObject4"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchHighestVersionForImportWithoutVersionForQualifiedImportedType) +TEST_F(ProjectStorage, fetch_highest_version_for_import_without_version_for_qualified_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4827,7 +4827,7 @@ TEST_F(ProjectStorage, FetchHighestVersionForImportWithoutVersionForQualifiedImp sourceId2, "Item", fetchTypeId(sourceId1, "QObject4"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchHighestVersionForImportWithMajorVersionForImportedType) +TEST_F(ProjectStorage, fetch_highest_version_for_import_with_major_version_for_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4851,7 +4851,7 @@ TEST_F(ProjectStorage, FetchHighestVersionForImportWithMajorVersionForImportedTy sourceId2, "Item", fetchTypeId(sourceId1, "QObject3"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchHighestVersionForImportWithMajorVersionForQualifiedImportedType) +TEST_F(ProjectStorage, fetch_highest_version_for_import_with_major_version_for_qualified_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4875,7 +4875,7 @@ TEST_F(ProjectStorage, FetchHighestVersionForImportWithMajorVersionForQualifiedI sourceId2, "Item", fetchTypeId(sourceId1, "QObject3"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchExportedTypeWithoutVersionFirstForImportedType) +TEST_F(ProjectStorage, fetch_exported_type_without_version_first_for_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4897,7 +4897,7 @@ TEST_F(ProjectStorage, FetchExportedTypeWithoutVersionFirstForImportedType) sourceId2, "Item", fetchTypeId(sourceId1, "QObject"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, FetchExportedTypeWithoutVersionFirstForQualifiedImportedType) +TEST_F(ProjectStorage, fetch_exported_type_without_version_first_for_qualified_imported_type) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -4919,7 +4919,7 @@ TEST_F(ProjectStorage, FetchExportedTypeWithoutVersionFirstForQualifiedImportedT sourceId2, "Item", fetchTypeId(sourceId1, "QObject"), TypeTraits::Reference))); } -TEST_F(ProjectStorage, EnsureThatPropertiesForRemovedTypesAreNotAnymoreRelinked) +TEST_F(ProjectStorage, ensure_that_properties_for_removed_types_are_not_anymore_relinked) { Storage::Synchronization::Type type{ "QObject", @@ -4940,7 +4940,7 @@ TEST_F(ProjectStorage, EnsureThatPropertiesForRemovedTypesAreNotAnymoreRelinked) ASSERT_NO_THROW(storage.synchronize(SynchronizationPackage{{sourceId1}})); } -TEST_F(ProjectStorage, EnsureThatPrototypesForRemovedTypesAreNotAnymoreRelinked) +TEST_F(ProjectStorage, ensure_that_prototypes_for_removed_types_are_not_anymore_relinked) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -4948,7 +4948,7 @@ TEST_F(ProjectStorage, EnsureThatPrototypesForRemovedTypesAreNotAnymoreRelinked) ASSERT_NO_THROW(storage.synchronize(SynchronizationPackage{{sourceId1, sourceId2}})); } -TEST_F(ProjectStorage, EnsureThatExtensionsForRemovedTypesAreNotAnymoreRelinked) +TEST_F(ProjectStorage, ensure_that_extensions_for_removed_types_are_not_anymore_relinked) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -4957,7 +4957,7 @@ TEST_F(ProjectStorage, EnsureThatExtensionsForRemovedTypesAreNotAnymoreRelinked) ASSERT_NO_THROW(storage.synchronize(SynchronizationPackage{{sourceId1, sourceId2}})); } -TEST_F(ProjectStorage, MinimalUpdates) +TEST_F(ProjectStorage, minimal_updates) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -5000,14 +5000,14 @@ TEST_F(ProjectStorage, MinimalUpdates) Field(&Storage::Synchronization::Type::enumerationDeclarations, Not(IsEmpty()))))); } -TEST_F(ProjectStorage, GetModuleId) +TEST_F(ProjectStorage, get_module_id) { auto id = storage.moduleId("Qml"); ASSERT_TRUE(id); } -TEST_F(ProjectStorage, GetSameModuleIdAgain) +TEST_F(ProjectStorage, get_same_module_id_again) { auto initialId = storage.moduleId("Qml"); @@ -5016,17 +5016,17 @@ TEST_F(ProjectStorage, GetSameModuleIdAgain) ASSERT_THAT(id, Eq(initialId)); } -TEST_F(ProjectStorage, ModuleNameThrowsIfIdIsInvalid) +TEST_F(ProjectStorage, module_name_throws_if_id_is_invalid) { ASSERT_THROW(storage.moduleName(ModuleId{}), QmlDesigner::ModuleDoesNotExists); } -TEST_F(ProjectStorage, ModuleNameThrowsIfIdDoesNotExists) +TEST_F(ProjectStorage, module_name_throws_if_id_does_not_exists) { ASSERT_THROW(storage.moduleName(ModuleId::create(222)), QmlDesigner::ModuleDoesNotExists); } -TEST_F(ProjectStorage, GetModuleName) +TEST_F(ProjectStorage, get_module_name) { auto id = storage.moduleId("Qml"); @@ -5035,7 +5035,7 @@ TEST_F(ProjectStorage, GetModuleName) ASSERT_THAT(name, Eq("Qml")); } -TEST_F(ProjectStorage, PopulateModuleCache) +TEST_F(ProjectStorage, populate_module_cache) { auto id = storage.moduleId("Qml"); @@ -5044,7 +5044,7 @@ TEST_F(ProjectStorage, PopulateModuleCache) ASSERT_THAT(newStorage.moduleName(id), Eq("Qml")); } -TEST_F(ProjectStorage, AddProjectDataes) +TEST_F(ProjectStorage, add_project_dataes) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5066,7 +5066,7 @@ TEST_F(ProjectStorage, AddProjectDataes) UnorderedElementsAre(projectData1, projectData2, projectData3)); } -TEST_F(ProjectStorage, RemoveProjectData) +TEST_F(ProjectStorage, remove_project_data) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5090,7 +5090,7 @@ TEST_F(ProjectStorage, RemoveProjectData) UnorderedElementsAre(projectData1)); } -TEST_F(ProjectStorage, UpdateProjectDataFileType) +TEST_F(ProjectStorage, update_project_data_file_type) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5117,7 +5117,7 @@ TEST_F(ProjectStorage, UpdateProjectDataFileType) UnorderedElementsAre(projectData1, projectData2b, projectData3)); } -TEST_F(ProjectStorage, UpdateProjectDataModuleId) +TEST_F(ProjectStorage, update_project_data_module_id) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5144,7 +5144,7 @@ TEST_F(ProjectStorage, UpdateProjectDataModuleId) UnorderedElementsAre(projectData1, projectData2b, projectData3)); } -TEST_F(ProjectStorage, ThrowForInvalidSourceIdInProjectData) +TEST_F(ProjectStorage, throw_for_invalid_source_id_in_project_data) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, SourceId{}, @@ -5155,7 +5155,7 @@ TEST_F(ProjectStorage, ThrowForInvalidSourceIdInProjectData) QmlDesigner::ProjectDataHasInvalidSourceId); } -TEST_F(ProjectStorage, ThrowForInvalidModuleIdInProjectData) +TEST_F(ProjectStorage, throw_for_invalid_module_id_in_project_data) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5166,7 +5166,7 @@ TEST_F(ProjectStorage, ThrowForInvalidModuleIdInProjectData) QmlDesigner::ProjectDataHasInvalidModuleId); } -TEST_F(ProjectStorage, ThrowForUpdatingWithInvalidModuleIdInProjectData) +TEST_F(ProjectStorage, throw_for_updating_with_invalid_module_id_in_project_data) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5179,7 +5179,7 @@ TEST_F(ProjectStorage, ThrowForUpdatingWithInvalidModuleIdInProjectData) QmlDesigner::ProjectDataHasInvalidModuleId); } -TEST_F(ProjectStorage, ThrowForUpdatingWithInvalidProjectSourceIdInProjectData) +TEST_F(ProjectStorage, throw_for_updating_with_invalid_project_source_id_in_project_data) { Storage::Synchronization::ProjectData projectData1{SourceId{}, sourceId1, @@ -5190,7 +5190,7 @@ TEST_F(ProjectStorage, ThrowForUpdatingWithInvalidProjectSourceIdInProjectData) QmlDesigner::ProjectDataHasInvalidProjectSourceId); } -TEST_F(ProjectStorage, FetchProjectDatasByDirectorySourceIds) +TEST_F(ProjectStorage, fetch_project_datas_by_directory_source_ids) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5212,7 +5212,7 @@ TEST_F(ProjectStorage, FetchProjectDatasByDirectorySourceIds) ASSERT_THAT(projectDatas, UnorderedElementsAre(projectData1, projectData2, projectData3)); } -TEST_F(ProjectStorage, FetchProjectDatasByDirectorySourceId) +TEST_F(ProjectStorage, fetch_project_datas_by_directory_source_id) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5234,7 +5234,7 @@ TEST_F(ProjectStorage, FetchProjectDatasByDirectorySourceId) ASSERT_THAT(projectData, UnorderedElementsAre(projectData1, projectData2)); } -TEST_F(ProjectStorage, FetchProjectDataBySourceIds) +TEST_F(ProjectStorage, fetch_project_data_by_source_ids) { Storage::Synchronization::ProjectData projectData1{qmlProjectSourceId, sourceId1, @@ -5256,7 +5256,7 @@ TEST_F(ProjectStorage, FetchProjectDataBySourceIds) ASSERT_THAT(projectData, Eq(projectData2)); } -TEST_F(ProjectStorage, ExcludeExportedTypes) +TEST_F(ProjectStorage, exclude_exported_types) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -5282,7 +5282,7 @@ TEST_F(ProjectStorage, ExcludeExportedTypes) "QQuickItem")))))); } -TEST_F(ProjectStorage, ModuleExportedImport) +TEST_F(ProjectStorage, module_exported_import) { auto package{createModuleExportedImportSynchronizationPackage()}; @@ -5313,7 +5313,7 @@ TEST_F(ProjectStorage, ModuleExportedImport) UnorderedElementsAre(IsExportedType(myModuleModuleId, "MyItem")))))); } -TEST_F(ProjectStorage, ModuleExportedImportWithDifferentVersions) +TEST_F(ProjectStorage, module_exported_import_with_different_versions) { auto package{createModuleExportedImportSynchronizationPackage()}; package.imports.back().version.major.value = 2; @@ -5348,7 +5348,7 @@ TEST_F(ProjectStorage, ModuleExportedImportWithDifferentVersions) UnorderedElementsAre(IsExportedType(myModuleModuleId, "MyItem")))))); } -TEST_F(ProjectStorage, ModuleExportedImportWithIndirectDifferentVersions) +TEST_F(ProjectStorage, module_exported_import_with_indirect_different_versions) { auto package{createModuleExportedImportSynchronizationPackage()}; package.imports[1].version.major.value = 2; @@ -5385,7 +5385,7 @@ TEST_F(ProjectStorage, ModuleExportedImportWithIndirectDifferentVersions) UnorderedElementsAre(IsExportedType(myModuleModuleId, "MyItem")))))); } -TEST_F(ProjectStorage, ModuleExportedImportPreventCollisionIfModuleIsIndirectlyReexportedMultipleTimes) +TEST_F(ProjectStorage, module_exported_import_prevent_collision_if_module_is_indirectly_reexported_multiple_times) { ModuleId qtQuick4DModuleId{storage.moduleId("QtQuick4D")}; auto package{createModuleExportedImportSynchronizationPackage()}; @@ -5443,7 +5443,7 @@ TEST_F(ProjectStorage, ModuleExportedImportPreventCollisionIfModuleIsIndirectlyR UnorderedElementsAre(IsExportedType(myModuleModuleId, "MyItem")))))); } -TEST_F(ProjectStorage, DistinguishBetweenImportKinds) +TEST_F(ProjectStorage, distinguish_between_import_kinds) { ModuleId qml1ModuleId{storage.moduleId("Qml1")}; ModuleId qml11ModuleId{storage.moduleId("Qml11")}; @@ -5477,7 +5477,7 @@ TEST_F(ProjectStorage, DistinguishBetweenImportKinds) "QQuickItem")))))); } -TEST_F(ProjectStorage, ModuleExportedImportDistinguishBetweenDependencyAndImportReExports) +TEST_F(ProjectStorage, module_exported_import_distinguish_between_dependency_and_import_re_exports) { auto package{createModuleExportedImportSynchronizationPackage()}; package.moduleDependencies.emplace_back(qtQuick3DModuleId, @@ -5511,7 +5511,7 @@ TEST_F(ProjectStorage, ModuleExportedImportDistinguishBetweenDependencyAndImport UnorderedElementsAre(IsExportedType(myModuleModuleId, "MyItem")))))); } -TEST_F(ProjectStorage, ModuleExportedImportWithQualifiedImportedType) +TEST_F(ProjectStorage, module_exported_import_with_qualified_imported_type) { auto package{createModuleExportedImportSynchronizationPackage()}; package.types.back().prototype = Storage::Synchronization::QualifiedImportedType{ @@ -5547,7 +5547,7 @@ TEST_F(ProjectStorage, ModuleExportedImportWithQualifiedImportedType) UnorderedElementsAre(IsExportedType(myModuleModuleId, "MyItem")))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarations) +TEST_F(ProjectStorage, synchronize_types_add_indirect_alias_declarations) { auto package{createSynchronizationPackageWithIndirectAliases()}; @@ -5568,7 +5568,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarations) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarationsAgain) +TEST_F(ProjectStorage, synchronize_types_add_indirect_alias_declarations_again) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5590,7 +5590,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarationsAgain) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemoveIndirectAliasDeclaration) +TEST_F(ProjectStorage, synchronize_types_remove_indirect_alias_declaration) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5610,7 +5610,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemoveIndirectAliasDeclaration) Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarationsThrowsForWrongTypeName) +TEST_F(ProjectStorage, synchronize_types_add_indirect_alias_declarations_throws_for_wrong_type_name) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5625,7 +5625,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarationsThrowsForWron QmlDesigner::TypeNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarationsThrowsForWrongPropertyName) +TEST_F(ProjectStorage, synchronize_types_add_indirect_alias_declarations_throws_for_wrong_property_name) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5639,7 +5639,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarationsThrowsForWron QmlDesigner::PropertyNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarationsThrowsForWrongPropertyNameTail) +TEST_F(ProjectStorage, synchronize_types_add_indirect_alias_declarations_throws_for_wrong_property_name_tail) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5653,7 +5653,7 @@ TEST_F(ProjectStorage, SynchronizeTypesAddIndirectAliasDeclarationsThrowsForWron QmlDesigner::PropertyNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationTypeName) +TEST_F(ProjectStorage, synchronize_types_change_indirect_alias_declaration_type_name) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5679,7 +5679,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationTypeName) | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationTailsTypeName) +TEST_F(ProjectStorage, synchronize_types_change_indirect_alias_declaration_tails_type_name) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5705,7 +5705,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationTailsTypeNa | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationsPropertyName) +TEST_F(ProjectStorage, synchronize_types_change_indirect_alias_declarations_property_name) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5729,7 +5729,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationsPropertyNa | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationsPropertyNameTail) +TEST_F(ProjectStorage, synchronize_types_change_indirect_alias_declarations_property_name_tail) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5754,7 +5754,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationsPropertyNa Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationsToPropertyDeclaration) +TEST_F(ProjectStorage, synchronize_types_change_indirect_alias_declarations_to_property_declaration) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5782,7 +5782,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasDeclarationsToProperty | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangePropertyDeclarationsToIndirectAliasDeclaration) +TEST_F(ProjectStorage, synchronize_types_change_property_declarations_to_indirect_alias_declaration) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5816,7 +5816,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangePropertyDeclarationsToIndirectAlias | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasTargetPropertyDeclarationTraits) +TEST_F(ProjectStorage, synchronize_types_change_indirect_alias_target_property_declaration_traits) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5842,7 +5842,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasTargetPropertyDeclarat | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasTargetPropertyDeclarationTypeName) +TEST_F(ProjectStorage, synchronize_types_change_indirect_alias_target_property_declaration_type_name) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5867,7 +5867,7 @@ TEST_F(ProjectStorage, SynchronizeTypesChangeIndirectAliasTargetPropertyDeclarat | Storage::PropertyDeclarationTraits::IsReadOnly)))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationWithAnIndirectAliasThrows) +TEST_F(ProjectStorage, synchronize_types_remove_property_declaration_with_an_indirect_alias_throws) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5881,7 +5881,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationWithAnIndirectAl Sqlite::ConstraintPreventsModification); } -TEST_F(ProjectStorage, DISABLED_SynchronizeTypesRemoveStemPropertyDeclarationWithAnIndirectAliasThrows) +TEST_F(ProjectStorage, disabled_synchronize_types_remove_stem_property_declaration_with_an_indirect_alias_throws) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5895,7 +5895,7 @@ TEST_F(ProjectStorage, DISABLED_SynchronizeTypesRemoveStemPropertyDeclarationWit Sqlite::ConstraintPreventsModification); } -TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationAndIndirectAlias) +TEST_F(ProjectStorage, synchronize_types_remove_property_declaration_and_indirect_alias) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5920,7 +5920,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationAndIndirectAlias Storage::PropertyDeclarationTraits::IsList)))))); } -TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationAndIndirectAliasSteam) +TEST_F(ProjectStorage, synchronize_types_remove_property_declaration_and_indirect_alias_steam) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); @@ -5942,7 +5942,7 @@ TEST_F(ProjectStorage, SynchronizeTypesRemovePropertyDeclarationAndIndirectAlias Field(&Storage::Synchronization::Type::propertyDeclarations, IsEmpty())))); } -TEST_F(ProjectStorage, GetTypeId) +TEST_F(ProjectStorage, get_type_id) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -5952,7 +5952,7 @@ TEST_F(ProjectStorage, GetTypeId) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "QObject4")); } -TEST_F(ProjectStorage, GetNoTypeIdForNonExistingTypeName) +TEST_F(ProjectStorage, get_no_type_id_for_non_existing_type_name) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -5962,7 +5962,7 @@ TEST_F(ProjectStorage, GetNoTypeIdForNonExistingTypeName) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetNoTypeIdForInvalidModuleId) +TEST_F(ProjectStorage, get_no_type_id_for_invalid_module_id) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -5972,7 +5972,7 @@ TEST_F(ProjectStorage, GetNoTypeIdForInvalidModuleId) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetNoTypeIdForWrongModuleId) +TEST_F(ProjectStorage, get_no_type_id_for_wrong_module_id) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -5982,7 +5982,7 @@ TEST_F(ProjectStorage, GetNoTypeIdForWrongModuleId) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetTypeIdWithMajorVersion) +TEST_F(ProjectStorage, get_type_id_with_major_version) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -5992,7 +5992,7 @@ TEST_F(ProjectStorage, GetTypeIdWithMajorVersion) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "QObject3")); } -TEST_F(ProjectStorage, GetNoTypeIdWithMajorVersionForNonExistingTypeName) +TEST_F(ProjectStorage, get_no_type_id_with_major_version_for_non_existing_type_name) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6002,7 +6002,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithMajorVersionForNonExistingTypeName) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetNoTypeIdWithMajorVersionForInvalidModuleId) +TEST_F(ProjectStorage, get_no_type_id_with_major_version_for_invalid_module_id) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6012,7 +6012,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithMajorVersionForInvalidModuleId) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetNoTypeIdWithMajorVersionForWrongModuleId) +TEST_F(ProjectStorage, get_no_type_id_with_major_version_for_wrong_module_id) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6022,7 +6022,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithMajorVersionForWrongModuleId) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetNoTypeIdWithMajorVersionForWrongVersion) +TEST_F(ProjectStorage, get_no_type_id_with_major_version_for_wrong_version) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6032,7 +6032,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithMajorVersionForWrongVersion) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetTypeIdWithCompleteVersion) +TEST_F(ProjectStorage, get_type_id_with_complete_version) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6042,7 +6042,7 @@ TEST_F(ProjectStorage, GetTypeIdWithCompleteVersion) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "QObject2")); } -TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionWithHigherMinorVersion) +TEST_F(ProjectStorage, get_no_type_id_with_complete_version_with_higher_minor_version) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6052,7 +6052,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionWithHigherMinorVersion) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "QObject3")); } -TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionForNonExistingTypeName) +TEST_F(ProjectStorage, get_no_type_id_with_complete_version_for_non_existing_type_name) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6062,7 +6062,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionForNonExistingTypeName) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionForInvalidModuleId) +TEST_F(ProjectStorage, get_no_type_id_with_complete_version_for_invalid_module_id) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6072,7 +6072,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionForInvalidModuleId) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionForWrongModuleId) +TEST_F(ProjectStorage, get_no_type_id_with_complete_version_for_wrong_module_id) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6082,7 +6082,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionForWrongModuleId) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionForWrongMajorVersion) +TEST_F(ProjectStorage, get_no_type_id_with_complete_version_for_wrong_major_version) { auto package{createSynchronizationPackageWithVersions()}; storage.synchronize(package); @@ -6092,7 +6092,7 @@ TEST_F(ProjectStorage, GetNoTypeIdWithCompleteVersionForWrongMajorVersion) ASSERT_FALSE(typeId); } -TEST_F(ProjectStorage, GetPropertyDeclarationIdsOverPrototypeChain) +TEST_F(ProjectStorage, get_property_declaration_ids_over_prototype_chain) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6109,7 +6109,7 @@ TEST_F(ProjectStorage, GetPropertyDeclarationIdsOverPrototypeChain) HasName("children3"))); } -TEST_F(ProjectStorage, GetPropertyDeclarationIdsOverExtensionChain) +TEST_F(ProjectStorage, get_property_declaration_ids_over_extension_chain) { auto package{createPackageWithProperties()}; std::swap(package.types[1].extension, package.types[1].prototype); @@ -6127,7 +6127,7 @@ TEST_F(ProjectStorage, GetPropertyDeclarationIdsOverExtensionChain) HasName("children3"))); } -TEST_F(ProjectStorage, GetPropertyDeclarationIdsAreReturnedSorted) +TEST_F(ProjectStorage, get_property_declaration_ids_are_returned_sorted) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6138,7 +6138,7 @@ TEST_F(ProjectStorage, GetPropertyDeclarationIdsAreReturnedSorted) ASSERT_THAT(propertyIds, IsSorted()); } -TEST_F(ProjectStorage, GetNoPropertyDeclarationIdsPropertiesFromDerivedTypes) +TEST_F(ProjectStorage, get_no_property_declaration_ids_properties_from_derived_types) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6153,7 +6153,7 @@ TEST_F(ProjectStorage, GetNoPropertyDeclarationIdsPropertiesFromDerivedTypes) HasName("children2"))); } -TEST_F(ProjectStorage, GetNoPropertyDeclarationIdsForWrongTypeId) +TEST_F(ProjectStorage, get_no_property_declaration_ids_for_wrong_type_id) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6164,7 +6164,7 @@ TEST_F(ProjectStorage, GetNoPropertyDeclarationIdsForWrongTypeId) ASSERT_THAT(propertyIds, IsEmpty()); } -TEST_F(ProjectStorage, GetLocalPropertyDeclarationIds) +TEST_F(ProjectStorage, get_local_property_declaration_ids) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6175,7 +6175,7 @@ TEST_F(ProjectStorage, GetLocalPropertyDeclarationIds) ASSERT_THAT(propertyIds, UnorderedElementsAre(HasName("data2"), HasName("children2"))); } -TEST_F(ProjectStorage, GetLocalPropertyDeclarationIdsAreReturnedSorted) +TEST_F(ProjectStorage, get_local_property_declaration_ids_are_returned_sorted) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6186,7 +6186,7 @@ TEST_F(ProjectStorage, GetLocalPropertyDeclarationIdsAreReturnedSorted) ASSERT_THAT(propertyIds, IsSorted()); } -TEST_F(ProjectStorage, GetPropertyDeclarationIdOverPrototypeChain) +TEST_F(ProjectStorage, get_property_declaration_id_over_prototype_chain) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6197,7 +6197,7 @@ TEST_F(ProjectStorage, GetPropertyDeclarationIdOverPrototypeChain) ASSERT_THAT(propertyId, HasName("data")); } -TEST_F(ProjectStorage, GetPropertyDeclarationIdOverExtensionChain) +TEST_F(ProjectStorage, get_property_declaration_id_over_extension_chain) { auto package{createPackageWithProperties()}; std::swap(package.types[1].extension, package.types[1].prototype); @@ -6209,7 +6209,7 @@ TEST_F(ProjectStorage, GetPropertyDeclarationIdOverExtensionChain) ASSERT_THAT(propertyId, HasName("data")); } -TEST_F(ProjectStorage, GetLatestPropertyDeclarationId) +TEST_F(ProjectStorage, get_latest_property_declaration_id) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6229,7 +6229,7 @@ TEST_F(ProjectStorage, GetLatestPropertyDeclarationId) ASSERT_THAT(oldPropertyId, HasName("data")); } -TEST_F(ProjectStorage, GetInvalidPropertyDeclarationIdForInvalidTypeId) +TEST_F(ProjectStorage, get_invalid_property_declaration_id_for_invalid_type_id) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6240,7 +6240,7 @@ TEST_F(ProjectStorage, GetInvalidPropertyDeclarationIdForInvalidTypeId) ASSERT_FALSE(propertyId); } -TEST_F(ProjectStorage, GetInvalidPropertyDeclarationIdForWrongPropertyName) +TEST_F(ProjectStorage, get_invalid_property_declaration_id_for_wrong_property_name) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6251,7 +6251,7 @@ TEST_F(ProjectStorage, GetInvalidPropertyDeclarationIdForWrongPropertyName) ASSERT_FALSE(propertyId); } -TEST_F(ProjectStorage, GetLocalPropertyDeclarationId) +TEST_F(ProjectStorage, get_local_property_declaration_id) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6262,7 +6262,7 @@ TEST_F(ProjectStorage, GetLocalPropertyDeclarationId) ASSERT_THAT(propertyId, HasName("data")); } -TEST_F(ProjectStorage, GetInvalidLocalPropertyDeclarationIdForWrongType) +TEST_F(ProjectStorage, get_invalid_local_property_declaration_id_for_wrong_type) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6273,7 +6273,7 @@ TEST_F(ProjectStorage, GetInvalidLocalPropertyDeclarationIdForWrongType) ASSERT_FALSE(propertyId); } -TEST_F(ProjectStorage, GetInvalidLocalPropertyDeclarationIdForInvalidTypeId) +TEST_F(ProjectStorage, get_invalid_local_property_declaration_id_for_invalid_type_id) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6284,7 +6284,7 @@ TEST_F(ProjectStorage, GetInvalidLocalPropertyDeclarationIdForInvalidTypeId) ASSERT_FALSE(propertyId); } -TEST_F(ProjectStorage, GetInvalidLocalPropertyDeclarationIdForWrongPropertyName) +TEST_F(ProjectStorage, get_invalid_local_property_declaration_id_for_wrong_property_name) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6295,7 +6295,7 @@ TEST_F(ProjectStorage, GetInvalidLocalPropertyDeclarationIdForWrongPropertyName) ASSERT_FALSE(propertyId); } -TEST_F(ProjectStorage, GetPropertyDeclaration) +TEST_F(ProjectStorage, get_property_declaration) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6310,7 +6310,7 @@ TEST_F(ProjectStorage, GetPropertyDeclaration) typeId2, "data2", Storage::PropertyDeclarationTraits::IsReadOnly, typeId3))); } -TEST_F(ProjectStorage, GetInvalidOptionalPropertyDeclarationForInvalidPropertyDeclarationId) +TEST_F(ProjectStorage, get_invalid_optional_property_declaration_for_invalid_property_declaration_id) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6320,7 +6320,7 @@ TEST_F(ProjectStorage, GetInvalidOptionalPropertyDeclarationForInvalidPropertyDe ASSERT_THAT(property, Eq(std::nullopt)); } -TEST_F(ProjectStorage, GetSignalDeclarationNames) +TEST_F(ProjectStorage, get_signal_declaration_names) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6331,7 +6331,7 @@ TEST_F(ProjectStorage, GetSignalDeclarationNames) ASSERT_THAT(signalNames, ElementsAre("itemsChanged", "objectsChanged", "valuesChanged")); } -TEST_F(ProjectStorage, GetSignalDeclarationNamesAreOrdered) +TEST_F(ProjectStorage, get_signal_declaration_names_are_ordered) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6342,7 +6342,7 @@ TEST_F(ProjectStorage, GetSignalDeclarationNamesAreOrdered) ASSERT_THAT(signalNames, StringsAreSorted()); } -TEST_F(ProjectStorage, GetNoSignalDeclarationNamesForInvalidTypeId) +TEST_F(ProjectStorage, get_no_signal_declaration_names_for_invalid_type_id) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6353,7 +6353,7 @@ TEST_F(ProjectStorage, GetNoSignalDeclarationNamesForInvalidTypeId) ASSERT_THAT(signalNames, IsEmpty()); } -TEST_F(ProjectStorage, GetOnlySignalDeclarationNamesFromUpIntoThePrototypeChain) +TEST_F(ProjectStorage, get_only_signal_declaration_names_from_up_into_the_prototype_chain) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6364,7 +6364,7 @@ TEST_F(ProjectStorage, GetOnlySignalDeclarationNamesFromUpIntoThePrototypeChain) ASSERT_THAT(signalNames, ElementsAre("itemsChanged", "valuesChanged")); } -TEST_F(ProjectStorage, GetOnlySignalDeclarationNamesFromUpIntoTheExtensionChain) +TEST_F(ProjectStorage, get_only_signal_declaration_names_from_up_into_the_extension_chain) { auto package{createPackageWithProperties()}; std::swap(package.types[1].extension, package.types[1].prototype); @@ -6376,7 +6376,7 @@ TEST_F(ProjectStorage, GetOnlySignalDeclarationNamesFromUpIntoTheExtensionChain) ASSERT_THAT(signalNames, ElementsAre("itemsChanged", "valuesChanged")); } -TEST_F(ProjectStorage, GetFunctionDeclarationNames) +TEST_F(ProjectStorage, get_function_declaration_names) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6387,7 +6387,7 @@ TEST_F(ProjectStorage, GetFunctionDeclarationNames) ASSERT_THAT(functionNames, ElementsAre("items", "objects", "values")); } -TEST_F(ProjectStorage, GetFunctionDeclarationNamesAreOrdered) +TEST_F(ProjectStorage, get_function_declaration_names_are_ordered) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6398,7 +6398,7 @@ TEST_F(ProjectStorage, GetFunctionDeclarationNamesAreOrdered) ASSERT_THAT(functionNames, StringsAreSorted()); } -TEST_F(ProjectStorage, GetNoFunctionDeclarationNamesForInvalidTypeId) +TEST_F(ProjectStorage, get_no_function_declaration_names_for_invalid_type_id) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6409,7 +6409,7 @@ TEST_F(ProjectStorage, GetNoFunctionDeclarationNamesForInvalidTypeId) ASSERT_THAT(functionNames, IsEmpty()); } -TEST_F(ProjectStorage, GetOnlyFunctionDeclarationNamesFromUpIntoThePrototypeChain) +TEST_F(ProjectStorage, get_only_function_declaration_names_from_up_into_the_prototype_chain) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6420,7 +6420,7 @@ TEST_F(ProjectStorage, GetOnlyFunctionDeclarationNamesFromUpIntoThePrototypeChai ASSERT_THAT(functionNames, ElementsAre("items", "values")); } -TEST_F(ProjectStorage, GetOnlyFunctionDeclarationNamesFromUpIntoTheExtensionChain) +TEST_F(ProjectStorage, get_only_function_declaration_names_from_up_into_the_extension_chain) { auto package{createPackageWithProperties()}; std::swap(package.types[1].extension, package.types[1].prototype); @@ -6432,7 +6432,7 @@ TEST_F(ProjectStorage, GetOnlyFunctionDeclarationNamesFromUpIntoTheExtensionChai ASSERT_THAT(functionNames, ElementsAre("items", "values")); } -TEST_F(ProjectStorage, SynchronizeDefaultProperty) +TEST_F(ProjectStorage, synchronize_default_property) { auto package{createSimpleSynchronizationPackage()}; package.types.front().defaultPropertyName = "children"; @@ -6445,7 +6445,7 @@ TEST_F(ProjectStorage, SynchronizeDefaultProperty) Eq("children"))))); } -TEST_F(ProjectStorage, SynchronizeDefaultPropertyToADifferentName) +TEST_F(ProjectStorage, synchronize_default_property_to_a_different_name) { auto package{createSimpleSynchronizationPackage()}; package.types.front().defaultPropertyName = "children"; @@ -6460,7 +6460,7 @@ TEST_F(ProjectStorage, SynchronizeDefaultPropertyToADifferentName) Field(&Storage::Synchronization::Type::defaultPropertyName, Eq("data"))))); } -TEST_F(ProjectStorage, SynchronizeToRemovedDefaultProperty) +TEST_F(ProjectStorage, synchronize_to_removed_default_property) { auto package{createSimpleSynchronizationPackage()}; package.types.front().defaultPropertyName = "children"; @@ -6475,7 +6475,7 @@ TEST_F(ProjectStorage, SynchronizeToRemovedDefaultProperty) Field(&Storage::Synchronization::Type::defaultPropertyName, IsEmpty())))); } -TEST_F(ProjectStorage, SynchronizeDefaultPropertyThrowsForMissingDefaultProperty) +TEST_F(ProjectStorage, synchronize_default_property_throws_for_missing_default_property) { auto package{createSimpleSynchronizationPackage()}; package.types.front().defaultPropertyName = "child"; @@ -6484,7 +6484,7 @@ TEST_F(ProjectStorage, SynchronizeDefaultPropertyThrowsForMissingDefaultProperty } TEST_F(ProjectStorage, - SynchronizeDefaultPropertyThrowsForRemovingPropertyWithoutChangingDefaultProperty) + synchronize_default_property_throws_for_removing_property_without_changing_default_property) { auto package{createSimpleSynchronizationPackage()}; package.types.front().defaultPropertyName = "children"; @@ -6494,7 +6494,7 @@ TEST_F(ProjectStorage, ASSERT_THROW(storage.synchronize(package), QmlDesigner::PropertyNameDoesNotExists); } -TEST_F(ProjectStorage, SynchronizeChangesDefaultPropertyAndRemovesOldDefaultProperty) +TEST_F(ProjectStorage, synchronize_changes_default_property_and_removes_old_default_property) { auto package{createSimpleSynchronizationPackage()}; auto &type = findType(package, "QQuickItem"); @@ -6511,7 +6511,7 @@ TEST_F(ProjectStorage, SynchronizeChangesDefaultPropertyAndRemovesOldDefaultProp Field(&Storage::Synchronization::Type::defaultPropertyName, Eq("data"))))); } -TEST_F(ProjectStorage, SynchronizeAddNewDefaultPropertyAndRemovesOldDefaultProperty) +TEST_F(ProjectStorage, synchronize_add_new_default_property_and_removes_old_default_property) { auto package{createSimpleSynchronizationPackage()}; auto &type = findType(package, "QQuickItem"); @@ -6533,7 +6533,7 @@ TEST_F(ProjectStorage, SynchronizeAddNewDefaultPropertyAndRemovesOldDefaultPrope Field(&Storage::Synchronization::Type::defaultPropertyName, Eq("data2"))))); } -TEST_F(ProjectStorage, SynchronizeDefaultPropertyToThePrototypeProperty) +TEST_F(ProjectStorage, synchronize_default_property_to_the_prototype_property) { auto package{createSimpleSynchronizationPackage()}; package.types.front().defaultPropertyName = "children"; @@ -6550,7 +6550,7 @@ TEST_F(ProjectStorage, SynchronizeDefaultPropertyToThePrototypeProperty) Eq("children"))))); } -TEST_F(ProjectStorage, SynchronizeDefaultPropertyToTheExtensionProperty) +TEST_F(ProjectStorage, synchronize_default_property_to_the_extension_property) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -6568,7 +6568,7 @@ TEST_F(ProjectStorage, SynchronizeDefaultPropertyToTheExtensionProperty) Eq("children"))))); } -TEST_F(ProjectStorage, SynchronizeMoveTheDefaultPropertyToThePrototypeProperty) +TEST_F(ProjectStorage, synchronize_move_the_default_property_to_the_prototype_property) { auto package{createSimpleSynchronizationPackage()}; package.types.front().defaultPropertyName = "children"; @@ -6586,7 +6586,7 @@ TEST_F(ProjectStorage, SynchronizeMoveTheDefaultPropertyToThePrototypeProperty) Eq("children"))))); } -TEST_F(ProjectStorage, SynchronizeMoveTheDefaultPropertyToTheExtensionProperty) +TEST_F(ProjectStorage, synchronize_move_the_default_property_to_the_extension_property) { auto package{createSimpleSynchronizationPackage()}; std::swap(package.types.front().extension, package.types.front().prototype); @@ -6605,7 +6605,7 @@ TEST_F(ProjectStorage, SynchronizeMoveTheDefaultPropertyToTheExtensionProperty) Eq("children"))))); } -TEST_F(ProjectStorage, GetType) +TEST_F(ProjectStorage, get_type) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -6618,7 +6618,7 @@ TEST_F(ProjectStorage, GetType) ASSERT_THAT(type, Optional(IsInfoType(defaultPropertyId, TypeTraits::Reference))); } -TEST_F(ProjectStorage, DontGetTypeForInvalidId) +TEST_F(ProjectStorage, dont_get_type_for_invalid_id) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -6628,7 +6628,7 @@ TEST_F(ProjectStorage, DontGetTypeForInvalidId) ASSERT_THAT(type, Eq(std::nullopt)); } -TEST_F(ProjectStorage, GetCommonType) +TEST_F(ProjectStorage, get_common_type) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -6639,7 +6639,7 @@ TEST_F(ProjectStorage, GetCommonType) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "QQuickItem")); } -TEST_F(ProjectStorage, GetCommonTypeAgain) +TEST_F(ProjectStorage, get_common_type_again) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -6652,7 +6652,7 @@ TEST_F(ProjectStorage, GetCommonTypeAgain) ASSERT_THAT(typeId, firstTypeId); } -TEST_F(ProjectStorage, GetCommonTypeAfterChangingType) +TEST_F(ProjectStorage, get_common_type_after_changing_type) { auto package{createSimpleSynchronizationPackage()}; storage.synchronize(package); @@ -6668,7 +6668,7 @@ TEST_F(ProjectStorage, GetCommonTypeAfterChangingType) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "QQuickItem2")); } -TEST_F(ProjectStorage, GetBuiltinType) +TEST_F(ProjectStorage, get_builtin_type) { auto package{createBuiltinSynchronizationPackage()}; storage.synchronize(package); @@ -6678,7 +6678,7 @@ TEST_F(ProjectStorage, GetBuiltinType) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "double")); } -TEST_F(ProjectStorage, GetBuiltinTypeAgain) +TEST_F(ProjectStorage, get_builtin_type_again) { auto package{createBuiltinSynchronizationPackage()}; storage.synchronize(package); @@ -6689,7 +6689,7 @@ TEST_F(ProjectStorage, GetBuiltinTypeAgain) ASSERT_THAT(typeId, firstTypeId); } -TEST_F(ProjectStorage, GetBuiltinTypeAfterChangingType) +TEST_F(ProjectStorage, get_builtin_type_after_changing_type) { auto package{createBuiltinSynchronizationPackage()}; storage.synchronize(package); @@ -6703,7 +6703,7 @@ TEST_F(ProjectStorage, GetBuiltinTypeAfterChangingType) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "float")); } -TEST_F(ProjectStorage, GetBuiltinStringType) +TEST_F(ProjectStorage, get_builtin_string_type) { auto package{createBuiltinSynchronizationPackage()}; storage.synchronize(package); @@ -6713,7 +6713,7 @@ TEST_F(ProjectStorage, GetBuiltinStringType) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "var")); } -TEST_F(ProjectStorage, GetBuiltinStringTypeAgain) +TEST_F(ProjectStorage, get_builtin_string_type_again) { auto package{createBuiltinSynchronizationPackage()}; storage.synchronize(package); @@ -6724,7 +6724,7 @@ TEST_F(ProjectStorage, GetBuiltinStringTypeAgain) ASSERT_THAT(typeId, firstTypeId); } -TEST_F(ProjectStorage, GetBuiltinStringTypeAfterChangingType) +TEST_F(ProjectStorage, get_builtin_string_type_after_changing_type) { auto package{createBuiltinSynchronizationPackage()}; storage.synchronize(package); @@ -6738,7 +6738,7 @@ TEST_F(ProjectStorage, GetBuiltinStringTypeAfterChangingType) ASSERT_THAT(typeId, fetchTypeId(sourceId1, "variant")); } -TEST_F(ProjectStorage, GetPrototypeIds) +TEST_F(ProjectStorage, get_prototype_ids) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6750,7 +6750,7 @@ TEST_F(ProjectStorage, GetPrototypeIds) ElementsAre(fetchTypeId(sourceId1, "QObject2"), fetchTypeId(sourceId1, "QObject"))); } -TEST_F(ProjectStorage, GetNoPrototypeIdsForNoPrototype) +TEST_F(ProjectStorage, get_no_prototype_ids_for_no_prototype) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6761,7 +6761,7 @@ TEST_F(ProjectStorage, GetNoPrototypeIdsForNoPrototype) ASSERT_THAT(prototypeIds, IsEmpty()); } -TEST_F(ProjectStorage, GetPrototypeIdsWithExtension) +TEST_F(ProjectStorage, get_prototype_ids_with_extension) { auto package{createPackageWithProperties()}; std::swap(package.types[1].extension, package.types[1].prototype); @@ -6774,7 +6774,7 @@ TEST_F(ProjectStorage, GetPrototypeIdsWithExtension) ElementsAre(fetchTypeId(sourceId1, "QObject2"), fetchTypeId(sourceId1, "QObject"))); } -TEST_F(ProjectStorage, GetPrototypeAndSelfIds) +TEST_F(ProjectStorage, get_prototype_and_self_ids) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6788,7 +6788,7 @@ TEST_F(ProjectStorage, GetPrototypeAndSelfIds) fetchTypeId(sourceId1, "QObject"))); } -TEST_F(ProjectStorage, GetSelfForNoPrototypeIds) +TEST_F(ProjectStorage, get_self_for_no_prototype_ids) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6799,7 +6799,7 @@ TEST_F(ProjectStorage, GetSelfForNoPrototypeIds) ASSERT_THAT(prototypeAndSelfIds, ElementsAre(fetchTypeId(sourceId1, "QObject"))); } -TEST_F(ProjectStorage, GetPrototypeAndSelfIdsWithExtension) +TEST_F(ProjectStorage, get_prototype_and_self_ids_with_extension) { auto package{createPackageWithProperties()}; std::swap(package.types[1].extension, package.types[1].prototype); @@ -6814,7 +6814,7 @@ TEST_F(ProjectStorage, GetPrototypeAndSelfIdsWithExtension) fetchTypeId(sourceId1, "QObject"))); } -TEST_F(ProjectStorage, IsBasedOnForDirectPrototype) +TEST_F(ProjectStorage, is_based_on_for_direct_prototype) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6827,7 +6827,7 @@ TEST_F(ProjectStorage, IsBasedOnForDirectPrototype) ASSERT_TRUE(isBasedOn); } -TEST_F(ProjectStorage, IsBasedOnForIndirectPrototype) +TEST_F(ProjectStorage, is_based_on_for_indirect_prototype) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6839,7 +6839,7 @@ TEST_F(ProjectStorage, IsBasedOnForIndirectPrototype) ASSERT_TRUE(isBasedOn); } -TEST_F(ProjectStorage, IsBasedOnForDirectExtension) +TEST_F(ProjectStorage, is_based_on_for_direct_extension) { auto package{createPackageWithProperties()}; std::swap(package.types[1].extension, package.types[1].prototype); @@ -6852,7 +6852,7 @@ TEST_F(ProjectStorage, IsBasedOnForDirectExtension) ASSERT_TRUE(isBasedOn); } -TEST_F(ProjectStorage, IsBasedOnForIndirectExtension) +TEST_F(ProjectStorage, is_based_on_for_indirect_extension) { auto package{createPackageWithProperties()}; std::swap(package.types[1].extension, package.types[1].prototype); @@ -6865,7 +6865,7 @@ TEST_F(ProjectStorage, IsBasedOnForIndirectExtension) ASSERT_TRUE(isBasedOn); } -TEST_F(ProjectStorage, IsBasedOnForSelf) +TEST_F(ProjectStorage, is_based_on_for_self) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6877,7 +6877,7 @@ TEST_F(ProjectStorage, IsBasedOnForSelf) ASSERT_TRUE(isBasedOn); } -TEST_F(ProjectStorage, IsNotBasedOn) +TEST_F(ProjectStorage, is_not_based_on) { auto package{createPackageWithProperties()}; storage.synchronize(package); @@ -6890,7 +6890,7 @@ TEST_F(ProjectStorage, IsNotBasedOn) ASSERT_FALSE(isBasedOn); } -TEST_F(ProjectStorage, IsNotBasedOnIfNoBaseTypeIsGiven) +TEST_F(ProjectStorage, is_not_based_on_if_no_base_type_is_given) { auto package{createPackageWithProperties()}; storage.synchronize(package); diff --git a/tests/unit/tests/unittests/projectstorage/projectstoragepathwatcher-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstoragepathwatcher-test.cpp index bb29e96fc38..9fc9c30551b 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstoragepathwatcher-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstoragepathwatcher-test.cpp @@ -107,7 +107,7 @@ protected: WatcherEntry watcherEntry13{projectChunkId4, sourceContextIds[2], sourceIds[4]}; }; -TEST_F(ProjectStoragePathWatcher, AddIdPaths) +TEST_F(ProjectStoragePathWatcher, add_id_paths) { EXPECT_CALL(mockQFileSytemWatcher, addPaths( @@ -117,7 +117,7 @@ TEST_F(ProjectStoragePathWatcher, AddIdPaths) {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); } -TEST_F(ProjectStoragePathWatcher, UpdateIdPathsCallsAddPathInFileWatcher) +TEST_F(ProjectStoragePathWatcher, update_id_paths_calls_add_path_in_file_watcher) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, {projectChunkId2, {sourceIds[0], sourceIds[1]}}}); @@ -128,7 +128,7 @@ TEST_F(ProjectStoragePathWatcher, UpdateIdPathsCallsAddPathInFileWatcher) {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); } -TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPathsCallsRemovePathInFileWatcher) +TEST_F(ProjectStoragePathWatcher, update_id_paths_and_remove_unused_paths_calls_remove_path_in_file_watcher) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); @@ -139,7 +139,7 @@ TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPathsCallsRemovePa {projectChunkId2, {sourceIds[0], sourceIds[1]}}}); } -TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPathsDoNotCallsRemovePathInFileWatcher) +TEST_F(ProjectStoragePathWatcher, update_id_paths_and_remove_unused_paths_do_not_calls_remove_path_in_file_watcher) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}, @@ -150,7 +150,7 @@ TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPathsDoNotCallsRem watcher.updateIdPaths({{projectChunkId1, {sourceIds[1]}}, {projectChunkId2, {sourceIds[3]}}}); } -TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPaths) +TEST_F(ProjectStoragePathWatcher, update_id_paths_and_remove_unused_paths) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, {projectChunkId2, {sourceIds[0], sourceIds[1]}}, @@ -161,7 +161,7 @@ TEST_F(ProjectStoragePathWatcher, UpdateIdPathsAndRemoveUnusedPaths) ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry1, watcherEntry4, watcherEntry5)); } -TEST_F(ProjectStoragePathWatcher, ExtractSortedEntriesFromConvertIdPaths) +TEST_F(ProjectStoragePathWatcher, extract_sorted_entries_from_convert_id_paths) { auto entriesAndIds = watcher.convertIdPathsToWatcherEntriesAndIds( {{projectChunkId2, {sourceIds[0], sourceIds[1]}}, @@ -171,7 +171,7 @@ TEST_F(ProjectStoragePathWatcher, ExtractSortedEntriesFromConvertIdPaths) ElementsAre(watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4)); } -TEST_F(ProjectStoragePathWatcher, ExtractSortedIdsFromConvertIdPaths) +TEST_F(ProjectStoragePathWatcher, extract_sorted_ids_from_convert_id_paths) { auto entriesAndIds = watcher.convertIdPathsToWatcherEntriesAndIds( {{projectChunkId2, {}}, {projectChunkId1, {}}, {projectChunkId3, {}}}); @@ -179,14 +179,14 @@ TEST_F(ProjectStoragePathWatcher, ExtractSortedIdsFromConvertIdPaths) ASSERT_THAT(entriesAndIds.second, ElementsAre(ids[0], ids[1], ids[2])); } -TEST_F(ProjectStoragePathWatcher, MergeEntries) +TEST_F(ProjectStoragePathWatcher, merge_entries) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0]}}, {projectChunkId2, {sourceIds[1]}}}); ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry1, watcherEntry4)); } -TEST_F(ProjectStoragePathWatcher, MergeMoreEntries) +TEST_F(ProjectStoragePathWatcher, merge_more_entries) { watcher.updateIdPaths({{projectChunkId2, {sourceIds[0], sourceIds[1]}}}); @@ -196,14 +196,14 @@ TEST_F(ProjectStoragePathWatcher, MergeMoreEntries) ElementsAre(watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4)); } -TEST_F(ProjectStoragePathWatcher, AddEmptyEntries) +TEST_F(ProjectStoragePathWatcher, add_empty_entries) { EXPECT_CALL(mockQFileSytemWatcher, addPaths(_)).Times(0); watcher.updateIdPaths({}); } -TEST_F(ProjectStoragePathWatcher, AddEntriesWithSameIdAndDifferentPaths) +TEST_F(ProjectStoragePathWatcher, add_entries_with_same_id_and_different_paths) { EXPECT_CALL(mockQFileSytemWatcher, addPaths(ElementsAre(sourceContextPath, sourceContextPath2, sourceContextPath3))); @@ -212,14 +212,14 @@ TEST_F(ProjectStoragePathWatcher, AddEntriesWithSameIdAndDifferentPaths) {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[4]}}}); } -TEST_F(ProjectStoragePathWatcher, AddEntriesWithDifferentIdAndSamePaths) +TEST_F(ProjectStoragePathWatcher, add_entries_with_different_id_and_same_paths) { EXPECT_CALL(mockQFileSytemWatcher, addPaths(ElementsAre(sourceContextPath))); watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}}); } -TEST_F(ProjectStoragePathWatcher, DontAddNewEntriesWithSameIdAndSamePaths) +TEST_F(ProjectStoragePathWatcher, dont_add_new_entries_with_same_id_and_same_paths) { watcher.updateIdPaths( {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}}); @@ -230,7 +230,7 @@ TEST_F(ProjectStoragePathWatcher, DontAddNewEntriesWithSameIdAndSamePaths) {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}}); } -TEST_F(ProjectStoragePathWatcher, DontAddNewEntriesWithDifferentIdAndSamePaths) +TEST_F(ProjectStoragePathWatcher, dont_add_new_entries_with_different_id_and_same_paths) { watcher.updateIdPaths( {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}}); @@ -241,7 +241,7 @@ TEST_F(ProjectStoragePathWatcher, DontAddNewEntriesWithDifferentIdAndSamePaths) {{projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[2], sourceIds[3], sourceIds[4]}}}); } -TEST_F(ProjectStoragePathWatcher, RemoveEntriesWithId) +TEST_F(ProjectStoragePathWatcher, remove_entries_with_id) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, {projectChunkId2, {sourceIds[0], sourceIds[1]}}, @@ -252,14 +252,14 @@ TEST_F(ProjectStoragePathWatcher, RemoveEntriesWithId) ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry5, watcherEntry8)); } -TEST_F(ProjectStoragePathWatcher, RemoveNoPathsForEmptyIds) +TEST_F(ProjectStoragePathWatcher, remove_no_paths_for_empty_ids) { EXPECT_CALL(mockQFileSytemWatcher, removePaths(_)).Times(0); watcher.removeIds({}); } -TEST_F(ProjectStoragePathWatcher, RemoveNoPathsForOneId) +TEST_F(ProjectStoragePathWatcher, remove_no_paths_for_one_id) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); @@ -269,7 +269,7 @@ TEST_F(ProjectStoragePathWatcher, RemoveNoPathsForOneId) watcher.removeIds({projectChunkId3.id}); } -TEST_F(ProjectStoragePathWatcher, RemovePathForOneId) +TEST_F(ProjectStoragePathWatcher, remove_path_for_one_id) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, {projectChunkId3, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); @@ -279,7 +279,7 @@ TEST_F(ProjectStoragePathWatcher, RemovePathForOneId) watcher.removeIds({projectChunkId3.id}); } -TEST_F(ProjectStoragePathWatcher, RemoveNoPathSecondTime) +TEST_F(ProjectStoragePathWatcher, remove_no_path_second_time) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); @@ -290,7 +290,7 @@ TEST_F(ProjectStoragePathWatcher, RemoveNoPathSecondTime) watcher.removeIds({projectChunkId2.id}); } -TEST_F(ProjectStoragePathWatcher, RemoveAllPathsForThreeId) +TEST_F(ProjectStoragePathWatcher, remove_all_paths_for_three_id) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); @@ -301,7 +301,7 @@ TEST_F(ProjectStoragePathWatcher, RemoveAllPathsForThreeId) watcher.removeIds({projectChunkId1.id, projectChunkId2.id, projectChunkId3.id}); } -TEST_F(ProjectStoragePathWatcher, RemoveOnePathForTwoId) +TEST_F(ProjectStoragePathWatcher, remove_one_path_for_two_id) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1]}}, {projectChunkId2, {sourceIds[0], sourceIds[1]}}, @@ -312,7 +312,7 @@ TEST_F(ProjectStoragePathWatcher, RemoveOnePathForTwoId) watcher.removeIds({projectChunkId1.id, projectChunkId2.id}); } -TEST_F(ProjectStoragePathWatcher, NotAnymoreWatchedEntriesWithId) +TEST_F(ProjectStoragePathWatcher, not_anymore_watched_entries_with_id) { auto notContainsdId = [&](WatcherEntry entry) { return entry.id != ids[0] && entry.id != ids[1]; @@ -326,7 +326,7 @@ TEST_F(ProjectStoragePathWatcher, NotAnymoreWatchedEntriesWithId) ASSERT_THAT(oldEntries, ElementsAre(watcherEntry2, watcherEntry3)); } -TEST_F(ProjectStoragePathWatcher, RemoveUnusedEntries) +TEST_F(ProjectStoragePathWatcher, remove_unused_entries) { watcher.addEntries( sorted({watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4, watcherEntry5})); @@ -336,7 +336,7 @@ TEST_F(ProjectStoragePathWatcher, RemoveUnusedEntries) ASSERT_THAT(watcher.watchedEntries(), ElementsAre(watcherEntry1, watcherEntry4, watcherEntry5)); } -TEST_F(ProjectStoragePathWatcher, TwoNotifyFileChanges) +TEST_F(ProjectStoragePathWatcher, two_notify_file_changes) { watcher.updateIdPaths( {{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, @@ -359,7 +359,7 @@ TEST_F(ProjectStoragePathWatcher, TwoNotifyFileChanges) mockQFileSytemWatcher.directoryChanged(sourceContextPath2); } -TEST_F(ProjectStoragePathWatcher, NotifyForPathChanges) +TEST_F(ProjectStoragePathWatcher, notify_for_path_changes) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); @@ -374,7 +374,7 @@ TEST_F(ProjectStoragePathWatcher, NotifyForPathChanges) mockQFileSytemWatcher.directoryChanged(sourceContextPath); } -TEST_F(ProjectStoragePathWatcher, NoNotifyForUnwatchedPathChanges) +TEST_F(ProjectStoragePathWatcher, no_notify_for_unwatched_path_changes) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[3]}}, {projectChunkId2, {sourceIds[3]}}}); @@ -383,7 +383,7 @@ TEST_F(ProjectStoragePathWatcher, NoNotifyForUnwatchedPathChanges) mockQFileSytemWatcher.directoryChanged(sourceContextPath); } -TEST_F(ProjectStoragePathWatcher, NoDuplicatePathChanges) +TEST_F(ProjectStoragePathWatcher, no_duplicate_path_changes) { watcher.updateIdPaths({{projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, {projectChunkId2, {sourceIds[0], sourceIds[1], sourceIds[3]}}}); @@ -396,7 +396,7 @@ TEST_F(ProjectStoragePathWatcher, NoDuplicatePathChanges) mockQFileSytemWatcher.directoryChanged(sourceContextPath); } -TEST_F(ProjectStoragePathWatcher, UpdateContextIdPathsAddsEntryInNewDirectory) +TEST_F(ProjectStoragePathWatcher, update_context_id_paths_adds_entry_in_new_directory) { watcher.updateIdPaths({ {projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, @@ -416,7 +416,7 @@ TEST_F(ProjectStoragePathWatcher, UpdateContextIdPathsAddsEntryInNewDirectory) watcherEntry13)); } -TEST_F(ProjectStoragePathWatcher, UpdateContextIdPathsAddsEntryToDirectory) +TEST_F(ProjectStoragePathWatcher, update_context_id_paths_adds_entry_to_directory) { watcher.updateIdPaths({ {projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, @@ -437,7 +437,7 @@ TEST_F(ProjectStoragePathWatcher, UpdateContextIdPathsAddsEntryToDirectory) watcherEntry12)); } -TEST_F(ProjectStoragePathWatcher, UpdateContextIdPathsRemovesEntry) +TEST_F(ProjectStoragePathWatcher, update_context_id_paths_removes_entry) { watcher.updateIdPaths({ {projectChunkId1, {sourceIds[0], sourceIds[1], sourceIds[2]}}, diff --git a/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp index 8c22da2455f..560e2413c64 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp @@ -14,7 +14,7 @@ protected: QmlDesigner::ProjectStorageSqliteFunctionRegistry registry{database}; }; -TEST_F(ProjectStorageSqliteFunctionRegistry, ReturnsUnqualifiedType) +TEST_F(ProjectStorageSqliteFunctionRegistry, returns_unqualified_type) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement{"SELECT unqualifiedTypeName('Foo.Bar')", database}; @@ -24,7 +24,7 @@ TEST_F(ProjectStorageSqliteFunctionRegistry, ReturnsUnqualifiedType) ASSERT_THAT(typeName, Eq("Bar")); } -TEST_F(ProjectStorageSqliteFunctionRegistry, ReturnsWholeStringIfNotDotIsFound) +TEST_F(ProjectStorageSqliteFunctionRegistry, returns_whole_string_if_not_dot_is_found) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement{"SELECT unqualifiedTypeName('Foo_Bar')", database}; @@ -34,7 +34,7 @@ TEST_F(ProjectStorageSqliteFunctionRegistry, ReturnsWholeStringIfNotDotIsFound) ASSERT_THAT(typeName, Eq("Foo_Bar")); } -TEST_F(ProjectStorageSqliteFunctionRegistry, ReturnEmptyStringForEmptyInput) +TEST_F(ProjectStorageSqliteFunctionRegistry, return_empty_string_for_empty_input) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement{"SELECT unqualifiedTypeName('')", database}; @@ -44,7 +44,7 @@ TEST_F(ProjectStorageSqliteFunctionRegistry, ReturnEmptyStringForEmptyInput) ASSERT_THAT(typeName, IsEmpty()); } -TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForInteger) +TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_integer) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName(1)", database); @@ -52,7 +52,7 @@ TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForInteger) ASSERT_THROW(statement.value(), Sqlite::StatementHasError); } -TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForFloat) +TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_float) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName(1.4)", database); @@ -60,7 +60,7 @@ TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForFloat) ASSERT_THROW(statement.value(), Sqlite::StatementHasError); } -TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForBlob) +TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_blob) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName(x'0500')", database); @@ -68,7 +68,7 @@ TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForBlob) ASSERT_THROW(statement.value(), Sqlite::StatementHasError); } -TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForNull) +TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_null) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName(NULL)", database); @@ -76,7 +76,7 @@ TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForNull) ASSERT_THROW(statement.value(), Sqlite::StatementHasError); } -TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForNoArgument) +TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_no_argument) { std::lock_guard lock{database}; @@ -84,7 +84,7 @@ TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForNoArgument) Sqlite::StatementHasError); } -TEST_F(ProjectStorageSqliteFunctionRegistry, ThrowsErrorForToManyArgument) +TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_to_many_argument) { std::lock_guard lock{database}; diff --git a/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp index f78732df29f..80cb7215fce 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorageupdater-test.cpp @@ -365,7 +365,7 @@ protected: SourceId qmltypes2SourceId = sourcePathCache.sourceId("/path/two/example2.qmltypes"); }; -TEST_F(ProjectStorageUpdater, GetContentForQmlDirPathsIfFileStatusIsDifferent) +TEST_F(ProjectStorageUpdater, get_content_for_qml_dir_paths_if_file_status_is_different) { SourceId qmlDir1PathSourceId = sourcePathCache.sourceId("/path/one/qmldir"); SourceId qmlDir2PathSourceId = sourcePathCache.sourceId("/path/two/qmldir"); @@ -381,7 +381,7 @@ TEST_F(ProjectStorageUpdater, GetContentForQmlDirPathsIfFileStatusIsDifferent) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, RequestFileStatusFromFileSystem) +TEST_F(ProjectStorageUpdater, request_file_status_from_file_system) { EXPECT_CALL(fileSystemMock, fileStatus(Ne(directoryPathSourceId))).Times(AnyNumber()); @@ -390,7 +390,7 @@ TEST_F(ProjectStorageUpdater, RequestFileStatusFromFileSystem) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, GetContentForQmlTypes) +TEST_F(ProjectStorageUpdater, get_content_for_qml_types) { QString qmldir{R"(module Example typeinfo example.qmltypes)"}; @@ -402,7 +402,7 @@ TEST_F(ProjectStorageUpdater, GetContentForQmlTypes) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, GetContentForQmlTypesIfProjectStorageFileStatusIsInvalid) +TEST_F(ProjectStorageUpdater, get_content_for_qml_types_if_project_storage_file_status_is_invalid) { QString qmldir{R"(module Example typeinfo example.qmltypes)"}; @@ -415,7 +415,7 @@ TEST_F(ProjectStorageUpdater, GetContentForQmlTypesIfProjectStorageFileStatusIsI updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, ParseQmlTypes) +TEST_F(ProjectStorageUpdater, parse_qml_types) { QString qmldir{R"(module Example typeinfo example.qmltypes @@ -434,7 +434,7 @@ TEST_F(ProjectStorageUpdater, ParseQmlTypes) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeIsEmptyForNoChange) +TEST_F(ProjectStorageUpdater, synchronize_is_empty_for_no_change) { setFilesDontChanged({qmltypesPathSourceId, qmltypes2PathSourceId, qmlDirPathSourceId}); @@ -443,7 +443,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeIsEmptyForNoChange) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlTypes) +TEST_F(ProjectStorageUpdater, synchronize_qml_types) { Storage::Synchronization::Import import{qmlModuleId, Storage::Version{2, 3}, qmltypesPathSourceId}; QString qmltypes{"Module {\ndependencies: []}"}; @@ -478,7 +478,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlTypes) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlTypesThrowsIfQmltpesDoesNotExists) +TEST_F(ProjectStorageUpdater, synchronize_qml_types_throws_if_qmltpes_does_not_exists) { Storage::Synchronization::Import import{qmlModuleId, Storage::Version{2, 3}, qmltypesPathSourceId}; setFilesDontExists({qmltypesPathSourceId}); @@ -486,7 +486,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlTypesThrowsIfQmltpesDoesNotExists) ASSERT_THROW(updater.update(directories, {}), QmlDesigner::CannotParseQmlTypesFile); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlTypesAreEmptyIfFileDoesNotChanged) +TEST_F(ProjectStorageUpdater, synchronize_qml_types_are_empty_if_file_does_not_changed) { QString qmltypes{"Module {\ndependencies: []}"}; setContent(u"/path/example.qmltypes", qmltypes); @@ -499,7 +499,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlTypesAreEmptyIfFileDoesNotChanged) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, GetContentForQmlDocuments) +TEST_F(ProjectStorageUpdater, get_content_for_qml_documents) { SourceId oldSecondSourceId3 = sourcePathCache.sourceId("/path/OldSecond.qml"); setQmlFileNames(u"/path", {"First.qml", "First2.qml", "OldSecond.qml", "Second.qml"}); @@ -520,7 +520,7 @@ TEST_F(ProjectStorageUpdater, GetContentForQmlDocuments) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, ParseQmlDocuments) +TEST_F(ProjectStorageUpdater, parse_qml_documents) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -541,7 +541,7 @@ TEST_F(ProjectStorageUpdater, ParseQmlDocuments) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, ParseQmlDocumentsWithNonExistingQmlDocumentThrows) +TEST_F(ProjectStorageUpdater, parse_qml_documents_with_non_existing_qml_document_throws) { QString qmldir{R"(module Example NonexitingType 1.0 NonexitingType.qml)"}; @@ -550,7 +550,7 @@ TEST_F(ProjectStorageUpdater, ParseQmlDocumentsWithNonExistingQmlDocumentThrows) ASSERT_THROW(updater.update(directories, {}), QmlDesigner::CannotParseQmlDocumentFile); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocuments) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -623,7 +623,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocuments) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeAddOnlyQmlDocumentInDirectory) +TEST_F(ProjectStorageUpdater, synchronize_add_only_qml_document_in_directory) { QString qmldir{R"(module Example FirstType 1.0 First.qml)"}; @@ -679,7 +679,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeAddOnlyQmlDocumentInDirectory) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeRemovesQmlDocument) +TEST_F(ProjectStorageUpdater, synchronize_removes_qml_document) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -742,7 +742,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeRemovesQmlDocument) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeRemovesQmlDocumentInQmldirOnly) +TEST_F(ProjectStorageUpdater, synchronize_removes_qml_document_in_qmldir_only) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -797,7 +797,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeRemovesQmlDocumentInQmldirOnly) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeAddQmlDocumentToQmldir) +TEST_F(ProjectStorageUpdater, synchronize_add_qml_document_to_qmldir) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -855,7 +855,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeAddQmlDocumentToQmldir) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeRemoveQmlDocumentFromQmldir) +TEST_F(ProjectStorageUpdater, synchronize_remove_qml_document_from_qmldir) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -910,7 +910,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeRemoveQmlDocumentFromQmldir) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsDontUpdateIfUpToDate) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents_dont_update_if_up_to_date) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -980,7 +980,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsDontUpdateIfUpToDate) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileHasNotChanged) +TEST_F(ProjectStorageUpdater, synchroniz_if_qmldir_file_has_not_changed) { setProjectDatas( directoryPathSourceId, @@ -1031,7 +1031,7 @@ TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileHasNotChanged) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileHasNotChangedAndSomeUpdatedFiles) +TEST_F(ProjectStorageUpdater, synchroniz_if_qmldir_file_has_not_changed_and_some_updated_files) { setProjectDatas( directoryPathSourceId, @@ -1066,7 +1066,7 @@ TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileHasNotChangedAndSomeUpdatedF updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileNotChangedAndSomeRemovedFiles) +TEST_F(ProjectStorageUpdater, synchroniz_if_qmldir_file_not_changed_and_some_removed_files) { setQmlFileNames(u"/path", {"First2.qml"}); setProjectDatas( @@ -1081,7 +1081,7 @@ TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileNotChangedAndSomeRemovedFile ASSERT_THROW(updater.update(directories, {}), QmlDesigner::CannotParseQmlTypesFile); } -TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileHasChangedAndSomeRemovedFiles) +TEST_F(ProjectStorageUpdater, synchroniz_if_qmldir_file_has_changed_and_some_removed_files) { QString qmldir{R"(module Example FirstType 2.2 First2.qml @@ -1133,7 +1133,7 @@ TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileHasChangedAndSomeRemovedFile updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, UpdateQmlTypesFilesIsEmpty) +TEST_F(ProjectStorageUpdater, update_qml_types_files_is_empty) { EXPECT_CALL(projectStorageMock, synchronize( @@ -1148,7 +1148,7 @@ TEST_F(ProjectStorageUpdater, UpdateQmlTypesFilesIsEmpty) updater.update({}, {}); } -TEST_F(ProjectStorageUpdater, UpdateQmlTypesFiles) +TEST_F(ProjectStorageUpdater, update_qml_types_files) { EXPECT_CALL(projectStorageMock, synchronize(AllOf( @@ -1175,7 +1175,7 @@ TEST_F(ProjectStorageUpdater, UpdateQmlTypesFiles) updater.update({}, {"/path/example.qmltypes", "/path/example2.qmltypes"}); } -TEST_F(ProjectStorageUpdater, DontUpdateQmlTypesFilesIfUnchanged) +TEST_F(ProjectStorageUpdater, dont_update_qml_types_files_if_unchanged) { setFilesDontChanged({qmltypes2PathSourceId}); @@ -1199,7 +1199,7 @@ TEST_F(ProjectStorageUpdater, DontUpdateQmlTypesFilesIfUnchanged) updater.update({}, {"/path/example.qmltypes", "/path/example2.qmltypes"}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithDifferentVersionButSameTypeNameAndFileName) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents_with_different_version_but_same_type_name_and_file_name) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -1242,7 +1242,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithDifferentVersionButSame updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithDifferentTypeNameButSameVersionAndFileName) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents_with_different_type_name_but_same_version_and_file_name) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -1283,7 +1283,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithDifferentTypeNameButSam updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, DontSynchronizeSelectors) +TEST_F(ProjectStorageUpdater, dont_synchronize_selectors) { setContent(u"/path/+First.qml", qmlDocument1); setContent(u"/path/qml/+First.qml", qmlDocument1); @@ -1301,7 +1301,7 @@ TEST_F(ProjectStorageUpdater, DontSynchronizeSelectors) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependencies) +TEST_F(ProjectStorageUpdater, synchronize_qmldir_dependencies) { QString qmldir{R"(module Example depends Qml @@ -1326,7 +1326,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependencies) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithDoubleEntries) +TEST_F(ProjectStorageUpdater, synchronize_qmldir_dependencies_with_double_entries) { QString qmldir{R"(module Example depends Qml @@ -1352,7 +1352,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithDoubleEntries) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithCollidingImports) +TEST_F(ProjectStorageUpdater, synchronize_qmldir_dependencies_with_colliding_imports) { QString qmldir{R"(module Example depends Qml @@ -1378,7 +1378,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithCollidingImports) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmldirWithNoDependencies) +TEST_F(ProjectStorageUpdater, synchronize_qmldir_with_no_dependencies) { QString qmldir{R"(module Example typeinfo example.qmltypes @@ -1395,7 +1395,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirWithNoDependencies) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmldirImports) +TEST_F(ProjectStorageUpdater, synchronize_qmldir_imports) { QString qmldir{R"(module Example import Qml auto @@ -1437,7 +1437,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirImports) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmldirWithNoImports) +TEST_F(ProjectStorageUpdater, synchronize_qmldir_with_no_imports) { QString qmldir{R"(module Example )"}; @@ -1451,7 +1451,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirWithNoImports) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmldirImportsWithDoubleEntries) +TEST_F(ProjectStorageUpdater, synchronize_qmldir_imports_with_double_entries) { QString qmldir{R"(module Example import Qml auto @@ -1494,7 +1494,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirImportsWithDoubleEntries) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmldirOptionalImports) +TEST_F(ProjectStorageUpdater, synchronize_qmldir_optional_imports) { QString qmldir{R"(module Example import Qml auto @@ -1536,7 +1536,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirOptionalImports) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherDirectories) +TEST_F(ProjectStorageUpdater, update_path_watcher_directories) { EXPECT_CALL(patchWatcherMock, updateIdPaths(Contains(IdPaths{projectPartId, @@ -1546,7 +1546,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherDirectories) updater.update(directories3, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherDirectoryDoesNotExists) +TEST_F(ProjectStorageUpdater, update_path_watcher_directory_does_not_exists) { setFilesDontExists({path2SourceId}); @@ -1558,7 +1558,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherDirectoryDoesNotExists) updater.update(directories3, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherDirectoryDoesNotChanged) +TEST_F(ProjectStorageUpdater, update_path_watcher_directory_does_not_changed) { setFilesDontChanged({qmldir1SourceId, qmldir2SourceId, path1SourceId, path2SourceId}); @@ -1570,7 +1570,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherDirectoryDoesNotChanged) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherDirectoryRemoved) +TEST_F(ProjectStorageUpdater, update_path_watcher_directory_removed) { setFilesRemoved({qmldir1SourceId, path1SourceId}); @@ -1581,7 +1581,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherDirectoryRemoved) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmldirs) +TEST_F(ProjectStorageUpdater, update_path_watcher_qmldirs) { EXPECT_CALL(patchWatcherMock, updateIdPaths(Contains(IdPaths{projectPartId, @@ -1591,7 +1591,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmldirs) updater.update(directories3, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmldirDoesNotExists) +TEST_F(ProjectStorageUpdater, update_path_watcher_qmldir_does_not_exists) { setFilesDontExists({qmldir2SourceId}); @@ -1603,7 +1603,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmldirDoesNotExists) updater.update(directories3, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmldirDoesNotChanged) +TEST_F(ProjectStorageUpdater, update_path_watcher_qmldir_does_not_changed) { setFilesDontChanged({qmldir1SourceId, qmldir2SourceId, path1SourceId, path2SourceId}); @@ -1615,7 +1615,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmldirDoesNotChanged) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmldirRemoved) +TEST_F(ProjectStorageUpdater, update_path_watcher_qmldir_removed) { setFilesRemoved({qmldir1SourceId, path1SourceId}); @@ -1626,7 +1626,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmldirRemoved) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmlFiles) +TEST_F(ProjectStorageUpdater, update_path_watcher_qml_files) { QString qmldir1{R"(module Example FirstType 1.0 First.qml @@ -1643,7 +1643,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmlFiles) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherOnlyQmlFilesDontChanged) +TEST_F(ProjectStorageUpdater, update_path_watcher_only_qml_files_dont_changed) { QString qmldir1{R"(module Example FirstType 1.0 First.qml @@ -1661,7 +1661,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherOnlyQmlFilesDontChanged) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherOnlyQmlFilesChanged) +TEST_F(ProjectStorageUpdater, update_path_watcher_only_qml_files_changed) { setFilesDontChanged({qmldir1SourceId, qmldir2SourceId, path1SourceId, path2SourceId}); setFilesChanged({firstSourceId, secondSourceId, thirdSourceId}); @@ -1679,7 +1679,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherOnlyQmlFilesChanged) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmlFilesAndDirectoriesDontChanged) +TEST_F(ProjectStorageUpdater, update_path_watcher_qml_files_and_directories_dont_changed) { setFilesDontChanged({qmldir1SourceId, qmldir2SourceId, @@ -1702,7 +1702,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmlFilesAndDirectoriesDontChanged updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmltypesFilesInQmldir) +TEST_F(ProjectStorageUpdater, update_path_watcher_qmltypes_files_in_qmldir) { QString qmldir1{R"(module Example typeinfo example.qmltypes)"}; @@ -1721,7 +1721,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmltypesFilesInQmldir) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherOnlyQmltypesFilesInQmldirDontChanged) +TEST_F(ProjectStorageUpdater, update_path_watcher_only_qmltypes_files_in_qmldir_dont_changed) { QString qmldir1{R"(module Example typeinfo example.qmltypes)"}; @@ -1739,7 +1739,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherOnlyQmltypesFilesInQmldirDontChan updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherOnlyQmltypesFilesChanged) +TEST_F(ProjectStorageUpdater, update_path_watcher_only_qmltypes_files_changed) { setFilesDontChanged({qmldir1SourceId, qmldir2SourceId, path1SourceId, path2SourceId}); setFilesChanged({qmltypes1SourceId, qmltypes2SourceId}); @@ -1756,7 +1756,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherOnlyQmltypesFilesChanged) updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmltypesFilesAndDirectoriesDontChanged) +TEST_F(ProjectStorageUpdater, update_path_watcher_qmltypes_files_and_directories_dont_changed) { setFilesDontChanged({qmldir1SourceId, qmldir2SourceId, @@ -1777,7 +1777,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherQmltypesFilesAndDirectoriesDontCh updater.update(directories2, {}); } -TEST_F(ProjectStorageUpdater, UpdatePathWatcherBuiltinQmltypesFiles) +TEST_F(ProjectStorageUpdater, update_path_watcher_builtin_qmltypes_files) { QString builtinQmltyplesPath1{"/path/one/example.qmltypes"}; QString builtinQmltyplesPath2{"/path/two/example2.qmltypes"}; @@ -1792,7 +1792,7 @@ TEST_F(ProjectStorageUpdater, UpdatePathWatcherBuiltinQmltypesFiles) updater.update({}, {builtinQmltyplesPath1, builtinQmltyplesPath2}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldir) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents_without_qmldir) { setFilesDontExists({qmlDirPathSourceId}); setFilesChanged({directoryPathSourceId}); @@ -1859,7 +1859,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldir) updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldirThrowsIfQmlDocumentDoesNotExists) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents_without_qmldir_throws_if_qml_document_does_not_exists) { setFilesDontExists({qmlDirPathSourceId, qmlDocumentSourceId1}); setFilesAdded({directoryPathSourceId}); @@ -1867,7 +1867,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldirThrowsIfQmlDoc ASSERT_THROW(updater.update(directories, {}), QmlDesigner::CannotParseQmlDocumentFile); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldirThrowsIfDirectoryDoesNotExists) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents_without_qmldir_throws_if_directory_does_not_exists) { setFilesDontExists({qmlDirPathSourceId, directoryPathSourceId}); setProjectDatas(directoryPathSourceId, @@ -1897,7 +1897,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldirThrowsIfDirect updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldirAddQmlDocument) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents_without_qmldir_add_qml_document) { setFilesDontExists({qmlDirPathSourceId}); setFilesChanged({directoryPathSourceId}); @@ -1946,7 +1946,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldirAddQmlDocument updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldirRemovesQmlDocument) +TEST_F(ProjectStorageUpdater, synchronize_qml_documents_without_qmldir_removes_qml_document) { setFilesDontExists({qmlDirPathSourceId}); setFilesChanged({directoryPathSourceId}); @@ -1985,7 +1985,7 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsWithoutQmldirRemovesQmlDocu updater.update(directories, {}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectories) +TEST_F(ProjectStorageUpdater, watcher_updates_directories) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2057,7 +2057,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectories) updater.pathsWithIdsChanged({{directoryProjectChunkId, {directoryPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovedDirectory) +TEST_F(ProjectStorageUpdater, watcher_updates_removed_directory) { setFilesRemoved({directoryPathSourceId, qmlDirPathSourceId, @@ -2091,7 +2091,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovedDirectory) updater.pathsWithIdsChanged({{directoryProjectChunkId, {directoryPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherWatchesDirectoriesAfterDirectoryChanges) +TEST_F(ProjectStorageUpdater, watcher_watches_directories_after_directory_changes) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2116,7 +2116,7 @@ TEST_F(ProjectStorageUpdater, WatcherWatchesDirectoriesAfterDirectoryChanges) updater.pathsWithIdsChanged({{directoryProjectChunkId, {directoryPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherDontUpdatesDirectoriesForOtherProject) +TEST_F(ProjectStorageUpdater, watcher_dont_updates_directories_for_other_project) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2129,7 +2129,7 @@ TEST_F(ProjectStorageUpdater, WatcherDontUpdatesDirectoriesForOtherProject) updater.pathsWithIdsChanged({{otherDirectoryProjectChunkId, {directoryPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesAndQmldir) +TEST_F(ProjectStorageUpdater, watcher_updates_directories_and_qmldir) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2206,7 +2206,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesAndQmldir) {qmldirProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherWatchesDirectoriesAfterQmldirChanges) +TEST_F(ProjectStorageUpdater, watcher_watches_directories_after_qmldir_changes) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2229,7 +2229,7 @@ TEST_F(ProjectStorageUpdater, WatcherWatchesDirectoriesAfterQmldirChanges) updater.pathsWithIdsChanged({{qmldirProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherDontUpdatesQmldirForOtherProject) +TEST_F(ProjectStorageUpdater, watcher_dont_updates_qmldir_for_other_project) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2242,7 +2242,7 @@ TEST_F(ProjectStorageUpdater, WatcherDontUpdatesQmldirForOtherProject) updater.pathsWithIdsChanged({{otherQmldirProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesAddOnlyQmlDocumentInDirectory) +TEST_F(ProjectStorageUpdater, watcher_updates_add_only_qml_document_in_directory) { QString qmldir{R"(module Example FirstType 1.0 First.qml)"}; @@ -2298,7 +2298,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesAddOnlyQmlDocumentInDirectory) updater.pathsWithIdsChanged({{directoryProjectChunkId, {directoryPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovesQmlDocument) +TEST_F(ProjectStorageUpdater, watcher_updates_removes_qml_document) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2361,7 +2361,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovesQmlDocument) updater.pathsWithIdsChanged({{directoryProjectChunkId, {directoryPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovesQmlDocumentInQmldirOnly) +TEST_F(ProjectStorageUpdater, watcher_updates_removes_qml_document_in_qmldir_only) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2416,7 +2416,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovesQmlDocumentInQmldirOnly) updater.pathsWithIdsChanged({{qmldirProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesAddQmlDocumentToQmldir) +TEST_F(ProjectStorageUpdater, watcher_updates_directories_add_qml_document_to_qmldir) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2474,7 +2474,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesAddQmlDocumentToQmldir) updater.pathsWithIdsChanged({{qmldirProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesRemoveQmlDocumentFromQmldir) +TEST_F(ProjectStorageUpdater, watcher_updates_directories_remove_qml_document_from_qmldir) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2529,7 +2529,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesRemoveQmlDocumentFromQmld updater.pathsWithIdsChanged({{qmldirProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesDontUpdateQmlDocumentsIfUpToDate) +TEST_F(ProjectStorageUpdater, watcher_updates_directories_dont_update_qml_documents_if_up_to_date) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2599,7 +2599,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesDontUpdateQmlDocumentsIfU updater.pathsWithIdsChanged({{directoryProjectChunkId, {directoryPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesQmldirsDontUpdateQmlDocumentsIfUpToDate) +TEST_F(ProjectStorageUpdater, watcher_updates_qmldirs_dont_update_qml_documents_if_up_to_date) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2669,7 +2669,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesQmldirsDontUpdateQmlDocumentsIfUpToD updater.pathsWithIdsChanged({{qmldirProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoryButNotQmldir) +TEST_F(ProjectStorageUpdater, watcher_updates_directory_but_not_qmldir) { setProjectDatas( directoryPathSourceId, @@ -2720,7 +2720,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoryButNotQmldir) updater.pathsWithIdsChanged({{directoryProjectChunkId, {directoryPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesQmlDocuments) +TEST_F(ProjectStorageUpdater, watcher_updates_qml_documents) { EXPECT_CALL( projectStorageMock, @@ -2753,7 +2753,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesQmlDocuments) {{qmlDocumentProjectChunkId, {qmlDocumentSourceId1, qmlDocumentSourceId2}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovedQmlDocuments) +TEST_F(ProjectStorageUpdater, watcher_updates_removed_qml_documents) { setFilesRemoved({qmlDocumentSourceId2}); @@ -2780,14 +2780,14 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovedQmlDocuments) {{qmlDocumentProjectChunkId, {qmlDocumentSourceId1, qmlDocumentSourceId2}}}); } -TEST_F(ProjectStorageUpdater, WatcherDontWatchesDirectoriesAfterQmlDocumentChanges) +TEST_F(ProjectStorageUpdater, watcher_dont_watches_directories_after_qml_document_changes) { EXPECT_CALL(patchWatcherMock, updateContextIdPaths(_, _)).Times(0); updater.pathsWithIdsChanged({{qmlDocumentProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherDontUpdatesQmlDocumentsForOtherProjects) +TEST_F(ProjectStorageUpdater, watcher_dont_updates_qml_documents_for_other_projects) { EXPECT_CALL(projectStorageMock, synchronize(PackageIsEmpty())); @@ -2795,7 +2795,7 @@ TEST_F(ProjectStorageUpdater, WatcherDontUpdatesQmlDocumentsForOtherProjects) {{otherQmlDocumentProjectChunkId, {qmlDocumentSourceId1, qmlDocumentSourceId2}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesQmltypes) +TEST_F(ProjectStorageUpdater, watcher_updates_qmltypes) { setProjectDatas( directoryPathSourceId, @@ -2823,7 +2823,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesQmltypes) {{qmltypesProjectChunkId, {qmltypesPathSourceId, qmltypes2PathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovedQmltypesWithoutUpdatedQmldir) +TEST_F(ProjectStorageUpdater, watcher_updates_removed_qmltypes_without_updated_qmldir) { setProjectDatas( directoryPathSourceId, @@ -2839,7 +2839,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovedQmltypesWithoutUpdatedQmldir) {{qmltypesProjectChunkId, {qmltypesPathSourceId, qmltypes2PathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovedQmltypesWithUpdatedQmldir) +TEST_F(ProjectStorageUpdater, watcher_updates_removed_qmltypes_with_updated_qmldir) { setProjectDatas( directoryPathSourceId, @@ -2880,7 +2880,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesRemovedQmltypesWithUpdatedQmldir) updater.pathsWithIdsChanged({{qmldirProjectChunkId, {qmlDirPathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherDontWatchesDirectoriesAfterQmltypesChanges) +TEST_F(ProjectStorageUpdater, watcher_dont_watches_directories_after_qmltypes_changes) { setProjectDatas( directoryPathSourceId, @@ -2895,7 +2895,7 @@ TEST_F(ProjectStorageUpdater, WatcherDontWatchesDirectoriesAfterQmltypesChanges) {{qmltypesProjectChunkId, {qmltypesPathSourceId, qmltypes2PathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherDontUpdatesQmltypesForOtherProjects) +TEST_F(ProjectStorageUpdater, watcher_dont_updates_qmltypes_for_other_projects) { setProjectDatas( directoryPathSourceId, @@ -2910,7 +2910,7 @@ TEST_F(ProjectStorageUpdater, WatcherDontUpdatesQmltypesForOtherProjects) {{otherQmltypesProjectChunkId, {qmltypesPathSourceId, qmltypes2PathSourceId}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesAndButNotIncludedQmlDocument) +TEST_F(ProjectStorageUpdater, watcher_updates_directories_and_but_not_included_qml_document) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -2984,7 +2984,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesDirectoriesAndButNotIncludedQmlDocum {qmlDocumentSourceId1, qmlDocumentSourceId2, qmlDocumentSourceId3}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesQmldirAndButNotIncludedQmlDocument) +TEST_F(ProjectStorageUpdater, watcher_updates_qmldir_and_but_not_included_qml_document) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -3061,7 +3061,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesQmldirAndButNotIncludedQmlDocument) {qmlDocumentSourceId1, qmlDocumentSourceId2, qmlDocumentSourceId3}}}); } -TEST_F(ProjectStorageUpdater, WatcherUpdatesQmldirAndButNotIncludedQmltypes) +TEST_F(ProjectStorageUpdater, watcher_updates_qmldir_and_but_not_included_qmltypes) { setProjectDatas( directoryPathSourceId, @@ -3168,7 +3168,7 @@ TEST_F(ProjectStorageUpdater, WatcherUpdatesQmldirAndButNotIncludedQmltypes) {qmltypesProjectChunkId, {qmltypesPathSourceId, qmltypes2PathSourceId}}}); } -TEST_F(ProjectStorageUpdater, ErrorsForWatcherUpdatesAreHandled) +TEST_F(ProjectStorageUpdater, errors_for_watcher_updates_are_handled) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -3181,7 +3181,7 @@ TEST_F(ProjectStorageUpdater, ErrorsForWatcherUpdatesAreHandled) ASSERT_NO_THROW(updater.pathsWithIdsChanged({{directoryProjectChunkId, {directoryPathSourceId}}})); } -TEST_F(ProjectStorageUpdater, InputIsReusedNextCallIfAnErrorHappens) +TEST_F(ProjectStorageUpdater, input_is_reused_next_call_if_an_error_happens) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -3240,7 +3240,7 @@ TEST_F(ProjectStorageUpdater, InputIsReusedNextCallIfAnErrorHappens) {{qmlDocumentProjectChunkId, {qmlDocumentSourceId1, qmlDocumentSourceId2}}}); } -TEST_F(ProjectStorageUpdater, InputIsReusedNextCallIfAnErrorHappensAndQmltypesDuplicatesAreRemoved) +TEST_F(ProjectStorageUpdater, input_is_reused_next_call_if_an_error_happens_and_qmltypes_duplicates_are_removed) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -3300,7 +3300,7 @@ TEST_F(ProjectStorageUpdater, InputIsReusedNextCallIfAnErrorHappensAndQmltypesDu {qmlDocumentProjectChunkId, {qmlDocumentSourceId1, qmlDocumentSourceId2}}}); } -TEST_F(ProjectStorageUpdater, InputIsReusedNextCallIfAnErrorHappensAndQmlDocumentDuplicatesAreRemoved) +TEST_F(ProjectStorageUpdater, input_is_reused_next_call_if_an_error_happens_and_qml_document_duplicates_are_removed) { QString qmldir{R"(module Example FirstType 1.0 First.qml @@ -3362,7 +3362,7 @@ TEST_F(ProjectStorageUpdater, InputIsReusedNextCallIfAnErrorHappensAndQmlDocumen {qmlDocumentProjectChunkId, {qmlDocumentSourceId1, qmlDocumentSourceId2}}}); } -TEST_F(ProjectStorageUpdater, InputIsClearedAfterSuccessfulUpdate) +TEST_F(ProjectStorageUpdater, input_is_cleared_after_successful_update) { QString qmldir{R"(module Example FirstType 1.0 First.qml diff --git a/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp b/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp index 73bf363f990..700067e1e38 100644 --- a/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp @@ -150,14 +150,14 @@ protected: ModuleId directoryModuleId{storage.moduleId(directoryPath)}; }; -TEST_F(QmlDocumentParser, Prototype) +TEST_F(QmlDocumentParser, prototype) { auto type = parser.parse("Example{}", imports, qmlFileSourceId, directoryPath); ASSERT_THAT(type, HasPrototype(Storage::ImportedType("Example"))); } -TEST_F(QmlDocumentParser, QualifiedPrototype) +TEST_F(QmlDocumentParser, qualified_prototype) { auto exampleModuleId = storage.moduleId("Example"); QString text = R"(import Example 2.1 as Example @@ -173,7 +173,7 @@ TEST_F(QmlDocumentParser, QualifiedPrototype) qmlFileSourceId}))); } -TEST_F(QmlDocumentParser, Properties) +TEST_F(QmlDocumentParser, properties) { auto type = parser.parse(R"(Example{ property int foo })", imports, qmlFileSourceId, directoryPath); @@ -184,7 +184,7 @@ TEST_F(QmlDocumentParser, Properties) QmlDesigner::Storage::PropertyDeclarationTraits::None))); } -TEST_F(QmlDocumentParser, QualifiedProperties) +TEST_F(QmlDocumentParser, qualified_properties) { auto exampleModuleId = storage.moduleId("Example"); @@ -204,7 +204,7 @@ TEST_F(QmlDocumentParser, QualifiedProperties) QmlDesigner::Storage::PropertyDeclarationTraits::None))); } -TEST_F(QmlDocumentParser, EnumerationInProperties) +TEST_F(QmlDocumentParser, enumeration_in_properties) { auto type = parser.parse(R"(import Example 2.1 as Example Item{ property Enumeration.Foo foo})", @@ -219,7 +219,7 @@ TEST_F(QmlDocumentParser, EnumerationInProperties) QmlDesigner::Storage::PropertyDeclarationTraits::None))); } -TEST_F(QmlDocumentParser, QualifiedEnumerationInProperties) +TEST_F(QmlDocumentParser, qualified_enumeration_in_properties) { auto exampleModuleId = storage.moduleId("Example"); @@ -239,7 +239,7 @@ TEST_F(QmlDocumentParser, QualifiedEnumerationInProperties) QmlDesigner::Storage::PropertyDeclarationTraits::None))); } -TEST_F(QmlDocumentParser, Imports) +TEST_F(QmlDocumentParser, imports) { ModuleId fooDirectoryModuleId = storage.moduleId("/path/foo"); ModuleId qmlModuleId = storage.moduleId("QML"); @@ -261,7 +261,7 @@ TEST_F(QmlDocumentParser, Imports) Storage::Import{qtQuickModuleId, QmlDesigner::Storage::Version{}, qmlFileSourceId})); } -TEST_F(QmlDocumentParser, ImportsWithVersion) +TEST_F(QmlDocumentParser, imports_with_version) { ModuleId fooDirectoryModuleId = storage.moduleId("/path/foo"); ModuleId qmlModuleId = storage.moduleId("QML"); @@ -283,7 +283,7 @@ TEST_F(QmlDocumentParser, ImportsWithVersion) Storage::Import{qtQuickModuleId, QmlDesigner::Storage::Version{2, 1}, qmlFileSourceId})); } -TEST_F(QmlDocumentParser, ImportsWithExplictDirectory) +TEST_F(QmlDocumentParser, imports_with_explict_directory) { ModuleId qmlModuleId = storage.moduleId("QML"); ModuleId qtQuickModuleId = storage.moduleId("QtQuick"); @@ -303,7 +303,7 @@ TEST_F(QmlDocumentParser, ImportsWithExplictDirectory) Storage::Import{qtQuickModuleId, QmlDesigner::Storage::Version{}, qmlFileSourceId})); } -TEST_F(QmlDocumentParser, Functions) +TEST_F(QmlDocumentParser, functions) { auto type = parser.parse( "Example{\n function someScript(x, y) {}\n function otherFunction() {}\n}", @@ -320,7 +320,7 @@ TEST_F(QmlDocumentParser, Functions) IsParameter("y", "")))))); } -TEST_F(QmlDocumentParser, Signals) +TEST_F(QmlDocumentParser, signals) { auto type = parser.parse("Example{\n signal someSignal(int x, real y)\n signal signal2()\n}", imports, @@ -336,7 +336,7 @@ TEST_F(QmlDocumentParser, Signals) Field(&Storage::SignalDeclaration::parameters, IsEmpty())))); } -TEST_F(QmlDocumentParser, Enumeration) +TEST_F(QmlDocumentParser, enumeration) { auto type = parser.parse("Example{\n enum Color{red, green, blue=10, white}\n enum " "State{On,Off}\n}", @@ -357,7 +357,7 @@ TEST_F(QmlDocumentParser, Enumeration) ElementsAre(IsEnumerator("On", 0), IsEnumerator("Off", 1)))))); } -TEST_F(QmlDocumentParser, DISABLED_DuplicateImportsAreRemoved) +TEST_F(QmlDocumentParser, disabled_duplicate_imports_are_removed) { ModuleId fooDirectoryModuleId = storage.moduleId("/path/foo"); ModuleId qmlModuleId = storage.moduleId("QML"); @@ -386,7 +386,7 @@ TEST_F(QmlDocumentParser, DISABLED_DuplicateImportsAreRemoved) Storage::Import{qtQuickModuleId, QmlDesigner::Storage::Version{}, qmlFileSourceId})); } -TEST_F(QmlDocumentParser, AliasItemProperties) +TEST_F(QmlDocumentParser, alias_item_properties) { auto type = parser.parse(R"(Example{ property alias delegate: foo @@ -405,7 +405,7 @@ TEST_F(QmlDocumentParser, AliasItemProperties) QmlDesigner::Storage::PropertyDeclarationTraits::None))); } -TEST_F(QmlDocumentParser, AliasProperties) +TEST_F(QmlDocumentParser, alias_properties) { auto type = parser.parse(R"(Example{ property alias text: foo.text2 @@ -425,7 +425,7 @@ TEST_F(QmlDocumentParser, AliasProperties) "text2"))); } -TEST_F(QmlDocumentParser, IndirectAliasProperties) +TEST_F(QmlDocumentParser, indirect_alias_properties) { auto type = parser.parse(R"(Example{ property alias textSize: foo.text.size @@ -446,7 +446,7 @@ TEST_F(QmlDocumentParser, IndirectAliasProperties) "size"))); } -TEST_F(QmlDocumentParser, InvalidAliasPropertiesAreSkipped) +TEST_F(QmlDocumentParser, invalid_alias_properties_are_skipped) { auto type = parser.parse(R"(Example{ property alias textSize: foo2.text.size @@ -461,7 +461,7 @@ TEST_F(QmlDocumentParser, InvalidAliasPropertiesAreSkipped) ASSERT_THAT(type.propertyDeclarations, IsEmpty()); } -TEST_F(QmlDocumentParser, ListProperty) +TEST_F(QmlDocumentParser, list_property) { auto type = parser.parse(R"(Item{ property list foos @@ -477,7 +477,7 @@ TEST_F(QmlDocumentParser, ListProperty) QmlDesigner::Storage::PropertyDeclarationTraits::IsList))); } -TEST_F(QmlDocumentParser, AliasOnListProperty) +TEST_F(QmlDocumentParser, alias_on_list_property) { auto type = parser.parse(R"(Item{ property alias foos: foo.foos @@ -498,7 +498,7 @@ TEST_F(QmlDocumentParser, AliasOnListProperty) QmlDesigner::Storage::PropertyDeclarationTraits::IsList))); } -TEST_F(QmlDocumentParser, QualifiedListProperty) +TEST_F(QmlDocumentParser, qualified_list_property) { auto exampleModuleId = storage.moduleId("Example"); auto type = parser.parse(R"(import Example 2.1 as Example diff --git a/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp b/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp index 3631e80500f..02b4514841d 100644 --- a/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/qmltypesparser-test.cpp @@ -162,7 +162,7 @@ protected: ModuleId directoryModuleId{storage.moduleId("path/to/")}; }; -TEST_F(QmlTypesParser, Imports) +TEST_F(QmlTypesParser, imports) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -189,7 +189,7 @@ TEST_F(QmlTypesParser, Imports) qmltypesFileSourceId))); } -TEST_F(QmlTypesParser, Types) +TEST_F(QmlTypesParser, types) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -211,7 +211,7 @@ TEST_F(QmlTypesParser, Types) qmltypesFileSourceId))); } -TEST_F(QmlTypesParser, Prototype) +TEST_F(QmlTypesParser, prototype) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -234,7 +234,7 @@ TEST_F(QmlTypesParser, Prototype) qmltypesFileSourceId))); } -TEST_F(QmlTypesParser, Extension) +TEST_F(QmlTypesParser, extension) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -257,7 +257,7 @@ TEST_F(QmlTypesParser, Extension) qmltypesFileSourceId))); } -TEST_F(QmlTypesParser, ExportedTypes) +TEST_F(QmlTypesParser, exported_types) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -279,7 +279,7 @@ TEST_F(QmlTypesParser, ExportedTypes) IsExportedType(qtQmlNativeModuleId, "QObject", QmlDesigner::Storage::Version{}))))); } -TEST_F(QmlTypesParser, Properties) +TEST_F(QmlTypesParser, properties) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -313,7 +313,7 @@ TEST_F(QmlTypesParser, Properties) | QmlDesigner::Storage::PropertyDeclarationTraits::IsPointer))))); } -TEST_F(QmlTypesParser, PropertiesWithQualifiedTypes) +TEST_F(QmlTypesParser, properties_with_qualified_types) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -343,7 +343,7 @@ TEST_F(QmlTypesParser, PropertiesWithQualifiedTypes) QmlDesigner::Storage::PropertyDeclarationTraits::None))))); } -TEST_F(QmlTypesParser, PropertiesWithoutType) +TEST_F(QmlTypesParser, properties_without_type) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -362,7 +362,7 @@ TEST_F(QmlTypesParser, PropertiesWithoutType) QmlDesigner::Storage::PropertyDeclarationTraits::IsPointer))))); } -TEST_F(QmlTypesParser, Functions) +TEST_F(QmlTypesParser, functions) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -404,7 +404,7 @@ TEST_F(QmlTypesParser, Functions) Field(&Storage::FunctionDeclaration::parameters, IsEmpty())))))); } -TEST_F(QmlTypesParser, SkipJavaScriptFunctions) +TEST_F(QmlTypesParser, skip_java_script_functions) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -420,7 +420,7 @@ TEST_F(QmlTypesParser, SkipJavaScriptFunctions) ASSERT_THAT(types, ElementsAre(Field(&Storage::Type::functionDeclarations, IsEmpty()))); } -TEST_F(QmlTypesParser, FunctionsWithQualifiedTypes) +TEST_F(QmlTypesParser, functions_with_qualified_types) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -448,7 +448,7 @@ TEST_F(QmlTypesParser, FunctionsWithQualifiedTypes) IsParameter("values2", "Qt::Vector")))))))); } -TEST_F(QmlTypesParser, Signals) +TEST_F(QmlTypesParser, signals) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -487,7 +487,7 @@ TEST_F(QmlTypesParser, Signals) IsParameter("args", "QQmlV4Function")))))))); } -TEST_F(QmlTypesParser, SignalsWithQualifiedTypes) +TEST_F(QmlTypesParser, signals_with_qualified_types) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -515,7 +515,7 @@ TEST_F(QmlTypesParser, SignalsWithQualifiedTypes) IsParameter("values2", "Qt::Vector")))))))); } -TEST_F(QmlTypesParser, Enumerations) +TEST_F(QmlTypesParser, enumerations) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -553,7 +553,7 @@ TEST_F(QmlTypesParser, Enumerations) IsEnumerator("BottomToTop")))))))); } -TEST_F(QmlTypesParser, EnumerationIsExportedAsType) +TEST_F(QmlTypesParser, enumeration_is_exported_as_type) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -600,7 +600,7 @@ TEST_F(QmlTypesParser, EnumerationIsExportedAsType) _)); } -TEST_F(QmlTypesParser, EnumerationIsExportedAsTypeWithAlias) +TEST_F(QmlTypesParser, enumeration_is_exported_as_type_with_alias) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -638,7 +638,7 @@ TEST_F(QmlTypesParser, EnumerationIsExportedAsTypeWithAlias) _)); } -TEST_F(QmlTypesParser, EnumerationIsExportedAsTypeWithAliasToo) +TEST_F(QmlTypesParser, enumeration_is_exported_as_type_with_alias_too) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -685,7 +685,7 @@ TEST_F(QmlTypesParser, EnumerationIsExportedAsTypeWithAliasToo) _)); } -TEST_F(QmlTypesParser, EnumerationIsReferencedByQualifiedName) +TEST_F(QmlTypesParser, enumeration_is_referenced_by_qualified_name) { QString source{R"(import QtQuick.tooling 1.2 Module{ @@ -712,7 +712,7 @@ TEST_F(QmlTypesParser, EnumerationIsReferencedByQualifiedName) QmlDesigner::Storage::PropertyDeclarationTraits::None))))); } -TEST_F(QmlTypesParser, AliasEnumerationIsReferencedByQualifiedName) +TEST_F(QmlTypesParser, alias_enumeration_is_referenced_by_qualified_name) { QString source{R"(import QtQuick.tooling 1.2 Module{ diff --git a/tests/unit/tests/unittests/projectstorage/sourcepath-test.cpp b/tests/unit/tests/unittests/projectstorage/sourcepath-test.cpp index 7ab21c37fa4..ffa4aa84d14 100644 --- a/tests/unit/tests/unittests/projectstorage/sourcepath-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/sourcepath-test.cpp @@ -7,7 +7,7 @@ namespace { -TEST(SourcePath, CreateFromPathString) +TEST(SourcePath, create_from_path_string) { QmlDesigner::SourcePath sourcePath{Utils::PathString{"/file/pathOne"}}; @@ -15,7 +15,7 @@ TEST(SourcePath, CreateFromPathString) ASSERT_THAT(sourcePath.name(), "pathOne"); } -TEST(FilePath, CreateFromDirectoryAndFileName) +TEST(FilePath, create_from_directory_and_file_name) { QmlDesigner::SourcePath sourcePath{Utils::PathString{"/file"}, Utils::PathString{"pathOne"}}; @@ -24,7 +24,7 @@ TEST(FilePath, CreateFromDirectoryAndFileName) ASSERT_THAT(sourcePath.path(), "/file/pathOne"); } -TEST(FilePath, CreateFromCString) +TEST(FilePath, create_from_c_string) { QmlDesigner::SourcePath sourcePath{"/file/pathOne"}; @@ -32,7 +32,7 @@ TEST(FilePath, CreateFromCString) ASSERT_THAT(sourcePath.name(), "pathOne"); } -TEST(FilePath, CreateFromFilePathView) +TEST(FilePath, create_from_file_path_view) { QmlDesigner::SourcePath sourcePath{QmlDesigner::SourcePathView{"/file/pathOne"}}; @@ -40,7 +40,7 @@ TEST(FilePath, CreateFromFilePathView) ASSERT_THAT(sourcePath.name(), "pathOne"); } -TEST(FilePath, CreateFromQString) +TEST(FilePath, create_from_q_string) { QmlDesigner::SourcePath sourcePath{QString{"/file/pathOne"}}; @@ -48,7 +48,7 @@ TEST(FilePath, CreateFromQString) ASSERT_THAT(sourcePath.name(), "pathOne"); } -TEST(FilePath, DefaultFilePath) +TEST(FilePath, default_file_path) { QmlDesigner::SourcePath sourcePath; @@ -56,7 +56,7 @@ TEST(FilePath, DefaultFilePath) ASSERT_THAT(sourcePath.name(), ""); } -TEST(FilePath, EmptyFilePath) +TEST(FilePath, empty_file_path) { QmlDesigner::SourcePath sourcePath(""); diff --git a/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp b/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp index 7a3c72991ea..050ac337695 100644 --- a/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp @@ -61,28 +61,28 @@ protected: Cache cacheNotFilled{storageMockFilled}; }; -TEST_F(SourcePathCache, SourceIdWithOutAnyEntryCallSourceContextId) +TEST_F(SourcePathCache, source_id_with_out_any_entry_call_source_context_id) { EXPECT_CALL(storageMock, fetchSourceContextId(Eq("/path/to"))); cache.sourceId(SourcePathView("/path/to/file.cpp")); } -TEST_F(SourcePathCache, SourceIdWithOutAnyEntryCalls) +TEST_F(SourcePathCache, source_id_with_out_any_entry_calls) { EXPECT_CALL(storageMock, fetchSourceId(SourceContextId::create(5), Eq("file.cpp"))); cache.sourceId(SourcePathView("/path/to/file.cpp")); } -TEST_F(SourcePathCache, SourceIdOfSourceIdWithOutAnyEntry) +TEST_F(SourcePathCache, source_id_of_source_id_with_out_any_entry) { auto sourceId = cache.sourceId(SourcePathView("/path/to/file.cpp")); ASSERT_THAT(sourceId, SourceId::create(42)); } -TEST_F(SourcePathCache, SourceIdWithSourceContextIdAndSourceName) +TEST_F(SourcePathCache, source_id_with_source_context_id_and_source_name) { auto sourceContextId = cache.sourceContextId("/path/to"_sv); @@ -91,7 +91,7 @@ TEST_F(SourcePathCache, SourceIdWithSourceContextIdAndSourceName) ASSERT_THAT(sourceId, SourceId::create(42)); } -TEST_F(SourcePathCache, IfEntryExistsDontCallInStrorage) +TEST_F(SourcePathCache, if_entry_exists_dont_call_in_strorage) { cache.sourceId(SourcePathView("/path/to/file.cpp")); @@ -101,7 +101,7 @@ TEST_F(SourcePathCache, IfEntryExistsDontCallInStrorage) cache.sourceId(SourcePathView("/path/to/file.cpp")); } -TEST_F(SourcePathCache, IfDirectoryEntryExistsDontCallFetchSourceContextIdButStillCallFetchSourceId) +TEST_F(SourcePathCache, if_directory_entry_exists_dont_call_fetch_source_context_id_but_still_call_fetch_source_id) { cache.sourceId(SourcePathView("/path/to/file2.cpp")); @@ -111,7 +111,7 @@ TEST_F(SourcePathCache, IfDirectoryEntryExistsDontCallFetchSourceContextIdButSti cache.sourceId(SourcePathView("/path/to/file.cpp")); } -TEST_F(SourcePathCache, GetSourceIdWithCachedValue) +TEST_F(SourcePathCache, get_source_id_with_cached_value) { cache.sourceId(SourcePathView("/path/to/file.cpp")); @@ -120,7 +120,7 @@ TEST_F(SourcePathCache, GetSourceIdWithCachedValue) ASSERT_THAT(sourceId, SourceId::create(42)); } -TEST_F(SourcePathCache, GetSourceIdWithSourceContextIdCached) +TEST_F(SourcePathCache, get_source_id_with_source_context_id_cached) { cache.sourceId(SourcePathView("/path/to/file.cpp")); @@ -129,14 +129,14 @@ TEST_F(SourcePathCache, GetSourceIdWithSourceContextIdCached) ASSERT_THAT(sourceId, SourceId::create(63)); } -TEST_F(SourcePathCache, ThrowForGettingAFilePathWithAnInvalidId) +TEST_F(SourcePathCache, throw_for_getting_a_file_path_with_an_invalid_id) { SourceId sourceId; ASSERT_THROW(cache.sourcePath(sourceId), QmlDesigner::NoSourcePathForInvalidSourceId); } -TEST_F(SourcePathCache, GetAFilePath) +TEST_F(SourcePathCache, get_a_file_path) { SourceId sourceId = cache.sourceId(SourcePathView("/path/to/file.cpp")); @@ -145,7 +145,7 @@ TEST_F(SourcePathCache, GetAFilePath) ASSERT_THAT(sourcePath, Eq(SourcePathView{"/path/to/file.cpp"})); } -TEST_F(SourcePathCache, GetAFilePathWithCachedSourceId) +TEST_F(SourcePathCache, get_a_file_path_with_cached_source_id) { SourceId sourceId{SourceId::create(42)}; @@ -154,7 +154,7 @@ TEST_F(SourcePathCache, GetAFilePathWithCachedSourceId) ASSERT_THAT(sourcePath, Eq(SourcePathView{"/path/to/file.cpp"})); } -TEST_F(SourcePathCache, FileNamesAreUniqueForEveryDirectory) +TEST_F(SourcePathCache, file_names_are_unique_for_every_directory) { SourceId sourceId = cache.sourceId(SourcePathView("/path/to/file.cpp")); @@ -163,7 +163,7 @@ TEST_F(SourcePathCache, FileNamesAreUniqueForEveryDirectory) ASSERT_THAT(sourcePath2Id, Ne(sourceId)); } -TEST_F(SourcePathCache, DuplicateFilePathsAreEqual) +TEST_F(SourcePathCache, duplicate_file_paths_are_equal) { SourceId sourcePath1Id = cache.sourceId(SourcePathView("/path/to/file.cpp")); @@ -172,14 +172,14 @@ TEST_F(SourcePathCache, DuplicateFilePathsAreEqual) ASSERT_THAT(sourcePath2Id, Eq(sourcePath1Id)); } -TEST_F(SourcePathCache, SourceContextIdCallsFetchSourceContextId) +TEST_F(SourcePathCache, source_context_id_calls_fetch_source_context_id) { EXPECT_CALL(storageMock, fetchSourceContextId(Eq("/path/to"))); cache.sourceContextId(Utils::SmallString("/path/to")); } -TEST_F(SourcePathCache, SecondSourceContextIdCallsNotFetchSourceContextId) +TEST_F(SourcePathCache, second_source_context_id_calls_not_fetch_source_context_id) { cache.sourceContextId(Utils::SmallString("/path/to")); @@ -188,21 +188,21 @@ TEST_F(SourcePathCache, SecondSourceContextIdCallsNotFetchSourceContextId) cache.sourceContextId(Utils::SmallString("/path/to")); } -TEST_F(SourcePathCache, SourceContextIdWithTrailingSlash) +TEST_F(SourcePathCache, source_context_id_with_trailing_slash) { EXPECT_CALL(storageMock, fetchSourceContextId(Eq("/path/to"))); cache.sourceContextId(Utils::SmallString("/path/to/")); } -TEST_F(SourcePathCache, SourceContextId) +TEST_F(SourcePathCache, source_context_id) { auto id = cache.sourceContextId(Utils::SmallString("/path/to")); ASSERT_THAT(id, Eq(SourceContextId::create(5))); } -TEST_F(SourcePathCache, SourceContextIdIsAlreadyInCache) +TEST_F(SourcePathCache, source_context_id_is_already_in_cache) { auto firstId = cache.sourceContextId(Utils::SmallString("/path/to")); @@ -211,7 +211,7 @@ TEST_F(SourcePathCache, SourceContextIdIsAlreadyInCache) ASSERT_THAT(secondId, firstId); } -TEST_F(SourcePathCache, SourceContextIdIsAlreadyInCacheWithTrailingSlash) +TEST_F(SourcePathCache, source_context_id_is_already_in_cache_with_trailing_slash) { auto firstId = cache.sourceContextId(Utils::SmallString("/path/to/")); @@ -220,7 +220,7 @@ TEST_F(SourcePathCache, SourceContextIdIsAlreadyInCacheWithTrailingSlash) ASSERT_THAT(secondId, firstId); } -TEST_F(SourcePathCache, SourceContextIdIsAlreadyInCacheWithAndWithoutTrailingSlash) +TEST_F(SourcePathCache, source_context_id_is_already_in_cache_with_and_without_trailing_slash) { auto firstId = cache.sourceContextId(Utils::SmallString("/path/to/")); @@ -229,7 +229,7 @@ TEST_F(SourcePathCache, SourceContextIdIsAlreadyInCacheWithAndWithoutTrailingSla ASSERT_THAT(secondId, firstId); } -TEST_F(SourcePathCache, SourceContextIdIsAlreadyInCacheWithoutAndWithTrailingSlash) +TEST_F(SourcePathCache, source_context_id_is_already_in_cache_without_and_with_trailing_slash) { auto firstId = cache.sourceContextId(Utils::SmallString("/path/to")); @@ -238,7 +238,7 @@ TEST_F(SourcePathCache, SourceContextIdIsAlreadyInCacheWithoutAndWithTrailingSla ASSERT_THAT(secondId, firstId); } -TEST_F(SourcePathCache, ThrowForGettingADirectoryPathWithAnInvalidId) +TEST_F(SourcePathCache, throw_for_getting_a_directory_path_with_an_invalid_id) { SourceContextId sourceContextId; @@ -246,7 +246,7 @@ TEST_F(SourcePathCache, ThrowForGettingADirectoryPathWithAnInvalidId) QmlDesigner::NoSourceContextPathForInvalidSourceContextId); } -TEST_F(SourcePathCache, GetADirectoryPath) +TEST_F(SourcePathCache, get_a_directory_path) { SourceContextId sourceContextId{SourceContextId::create(5)}; @@ -255,7 +255,7 @@ TEST_F(SourcePathCache, GetADirectoryPath) ASSERT_THAT(sourceContextPath, Eq(Utils::SmallStringView{"/path/to"})); } -TEST_F(SourcePathCache, GetADirectoryPathWithCachedSourceContextId) +TEST_F(SourcePathCache, get_a_directory_path_with_cached_source_context_id) { SourceContextId sourceContextId{SourceContextId::create(5)}; cache.sourceContextPath(sourceContextId); @@ -265,14 +265,14 @@ TEST_F(SourcePathCache, GetADirectoryPathWithCachedSourceContextId) ASSERT_THAT(sourceContextPath, Eq(Utils::SmallStringView{"/path/to"})); } -TEST_F(SourcePathCache, DirectoryPathCallsFetchDirectoryPath) +TEST_F(SourcePathCache, directory_path_calls_fetch_directory_path) { EXPECT_CALL(storageMock, fetchSourceContextPath(Eq(SourceContextId::create(5)))); cache.sourceContextPath(SourceContextId::create(5)); } -TEST_F(SourcePathCache, SecondDirectoryPathCallsNotFetchDirectoryPath) +TEST_F(SourcePathCache, second_directory_path_calls_not_fetch_directory_path) { cache.sourceContextPath(SourceContextId::create(5)); @@ -281,21 +281,21 @@ TEST_F(SourcePathCache, SecondDirectoryPathCallsNotFetchDirectoryPath) cache.sourceContextPath(SourceContextId::create(5)); } -TEST_F(SourcePathCache, ThrowForGettingASourceContextIdWithAnInvalidSourceId) +TEST_F(SourcePathCache, throw_for_getting_a_source_context_id_with_an_invalid_source_id) { SourceId sourceId; ASSERT_THROW(cache.sourceContextId(sourceId), QmlDesigner::NoSourcePathForInvalidSourceId); } -TEST_F(SourcePathCache, FetchSourceContextIdBySourceId) +TEST_F(SourcePathCache, fetch_source_context_id_by_source_id) { auto sourceContextId = cache.sourceContextId(SourceId::create(42)); ASSERT_THAT(sourceContextId, Eq(SourceContextId::create(5))); } -TEST_F(SourcePathCache, FetchSourceContextIdBySourceIdCached) +TEST_F(SourcePathCache, fetch_source_context_id_by_source_id_cached) { cache.sourceContextId(SourceId::create(42)); @@ -304,7 +304,7 @@ TEST_F(SourcePathCache, FetchSourceContextIdBySourceIdCached) ASSERT_THAT(sourceContextId, Eq(SourceContextId::create(5))); } -TEST_F(SourcePathCache, FetchFilePathAfterFetchingSourceContextIdBySourceId) +TEST_F(SourcePathCache, fetch_file_path_after_fetching_source_context_id_by_source_id) { cache.sourceContextId(SourceId::create(42)); @@ -313,7 +313,7 @@ TEST_F(SourcePathCache, FetchFilePathAfterFetchingSourceContextIdBySourceId) ASSERT_THAT(sourcePath, Eq("/path/to/file.cpp")); } -TEST_F(SourcePathCache, FetchSourceContextIdAfterFetchingFilePathBySourceId) +TEST_F(SourcePathCache, fetch_source_context_id_after_fetching_file_path_by_source_id) { cache.sourcePath(SourceId::create(42)); @@ -322,7 +322,7 @@ TEST_F(SourcePathCache, FetchSourceContextIdAfterFetchingFilePathBySourceId) ASSERT_THAT(sourceContextId, Eq(SourceContextId::create(5))); } -TEST_F(SourcePathCache, FetchAllSourceContextsAndSourcesAtCreation) +TEST_F(SourcePathCache, fetch_all_source_contexts_and_sources_at_creation) { EXPECT_CALL(storageMock, fetchAllSourceContexts()); EXPECT_CALL(storageMock, fetchAllSources()); @@ -330,7 +330,7 @@ TEST_F(SourcePathCache, FetchAllSourceContextsAndSourcesAtCreation) Cache cache{storageMock}; } -TEST_F(SourcePathCache, GetFileIdInFilledCache) +TEST_F(SourcePathCache, get_file_id_in_filled_cache) { Cache cacheFilled{storageMockFilled}; @@ -339,7 +339,7 @@ TEST_F(SourcePathCache, GetFileIdInFilledCache) ASSERT_THAT(id, Eq(SourceId::create(72))); } -TEST_F(SourcePathCache, GetSourceContextIdInFilledCache) +TEST_F(SourcePathCache, get_source_context_id_in_filled_cache) { Cache cacheFilled{storageMockFilled}; @@ -348,7 +348,7 @@ TEST_F(SourcePathCache, GetSourceContextIdInFilledCache) ASSERT_THAT(id, Eq(SourceContextId::create(5))); } -TEST_F(SourcePathCache, GetDirectoryPathInFilledCache) +TEST_F(SourcePathCache, get_directory_path_in_filled_cache) { Cache cacheFilled{storageMockFilled}; @@ -357,7 +357,7 @@ TEST_F(SourcePathCache, GetDirectoryPathInFilledCache) ASSERT_THAT(path, Eq("/path/to")); } -TEST_F(SourcePathCache, GetFilePathInFilledCache) +TEST_F(SourcePathCache, get_file_path_in_filled_cache) { Cache cacheFilled{storageMockFilled}; @@ -366,7 +366,7 @@ TEST_F(SourcePathCache, GetFilePathInFilledCache) ASSERT_THAT(path, Eq("/path/to/file.cpp")); } -TEST_F(SourcePathCache, GetFileIdInAfterPopulateIfEmpty) +TEST_F(SourcePathCache, get_file_id_in_after_populate_if_empty) { cacheNotFilled.populateIfEmpty(); @@ -375,7 +375,7 @@ TEST_F(SourcePathCache, GetFileIdInAfterPopulateIfEmpty) ASSERT_THAT(id, Eq(SourceId::create(72))); } -TEST_F(SourcePathCache, DontPopulateIfNotEmpty) +TEST_F(SourcePathCache, dont_populate_if_not_empty) { cacheNotFilled.sourceId("/path/to/file.cpp"); @@ -385,7 +385,7 @@ TEST_F(SourcePathCache, DontPopulateIfNotEmpty) cacheNotFilled.populateIfEmpty(); } -TEST_F(SourcePathCache, GetSourceContextIdAfterPopulateIfEmpty) +TEST_F(SourcePathCache, get_source_context_id_after_populate_if_empty) { cacheNotFilled.populateIfEmpty(); @@ -394,7 +394,7 @@ TEST_F(SourcePathCache, GetSourceContextIdAfterPopulateIfEmpty) ASSERT_THAT(id, Eq(SourceContextId::create(5))); } -TEST_F(SourcePathCache, GetDirectoryPathAfterPopulateIfEmpty) +TEST_F(SourcePathCache, get_directory_path_after_populate_if_empty) { cacheNotFilled.populateIfEmpty(); @@ -403,7 +403,7 @@ TEST_F(SourcePathCache, GetDirectoryPathAfterPopulateIfEmpty) ASSERT_THAT(path, Eq("/path/to")); } -TEST_F(SourcePathCache, GetFilePathAfterPopulateIfEmptye) +TEST_F(SourcePathCache, get_file_path_after_populate_if_emptye) { cacheNotFilled.populateIfEmpty(); @@ -412,21 +412,21 @@ TEST_F(SourcePathCache, GetFilePathAfterPopulateIfEmptye) ASSERT_THAT(path, Eq("/path/to/file.cpp")); } -TEST_F(SourcePathCache, SourceContextAndSourceIdWithOutAnyEntryCallSourceContextId) +TEST_F(SourcePathCache, source_context_and_source_id_with_out_any_entry_call_source_context_id) { EXPECT_CALL(storageMock, fetchSourceContextId(Eq("/path/to"))); cache.sourceContextAndSourceId(SourcePathView("/path/to/file.cpp")); } -TEST_F(SourcePathCache, SourceContextAndSourceIdWithOutAnyEntryCalls) +TEST_F(SourcePathCache, source_context_and_source_id_with_out_any_entry_calls) { EXPECT_CALL(storageMock, fetchSourceId(SourceContextId::create(5), Eq("file.cpp"))); cache.sourceContextAndSourceId(SourcePathView("/path/to/file.cpp")); } -TEST_F(SourcePathCache, SourceContextAndSourceIdOfSourceIdWithOutAnyEntry) +TEST_F(SourcePathCache, source_context_and_source_id_of_source_id_with_out_any_entry) { auto sourceContextAndSourceId = cache.sourceContextAndSourceId( SourcePathView("/path/to/file.cpp")); @@ -434,7 +434,7 @@ TEST_F(SourcePathCache, SourceContextAndSourceIdOfSourceIdWithOutAnyEntry) ASSERT_THAT(sourceContextAndSourceId, Pair(SourceContextId::create(5), SourceId::create(42))); } -TEST_F(SourcePathCache, SourceContextAndSourceIdIfEntryExistsDontCallInStrorage) +TEST_F(SourcePathCache, source_context_and_source_id_if_entry_exists_dont_call_in_strorage) { cache.sourceContextAndSourceId(SourcePathView("/path/to/file.cpp")); @@ -445,7 +445,7 @@ TEST_F(SourcePathCache, SourceContextAndSourceIdIfEntryExistsDontCallInStrorage) } TEST_F(SourcePathCache, - SourceContextAndSourceIdIfDirectoryEntryExistsDontCallFetchSourceContextIdButStillCallFetchSourceId) + source_context_and_source_id_if_directory_entry_exists_dont_call_fetch_source_context_id_but_still_call_fetch_source_id) { cache.sourceContextAndSourceId(SourcePathView("/path/to/file2.cpp")); @@ -455,7 +455,7 @@ TEST_F(SourcePathCache, cache.sourceContextAndSourceId(SourcePathView("/path/to/file.cpp")); } -TEST_F(SourcePathCache, SourceContextAndSourceIdGetSourceIdWithCachedValue) +TEST_F(SourcePathCache, source_context_and_source_id_get_source_id_with_cached_value) { cache.sourceContextAndSourceId(SourcePathView("/path/to/file.cpp")); @@ -464,7 +464,7 @@ TEST_F(SourcePathCache, SourceContextAndSourceIdGetSourceIdWithCachedValue) ASSERT_THAT(sourceId, Pair(SourceContextId::create(5), SourceId::create(42))); } -TEST_F(SourcePathCache, GetSourceContextAndSourceIdWithSourceContextIdCached) +TEST_F(SourcePathCache, get_source_context_and_source_id_with_source_context_id_cached) { cache.sourceContextAndSourceId(SourcePathView("/path/to/file.cpp")); @@ -474,7 +474,7 @@ TEST_F(SourcePathCache, GetSourceContextAndSourceIdWithSourceContextIdCached) ASSERT_THAT(sourceContextAndSourceId, Pair(SourceContextId::create(5), SourceId::create(63))); } -TEST_F(SourcePathCache, GetSourceContextAndSourceIdFileNamesAreUniqueForEveryDirectory) +TEST_F(SourcePathCache, get_source_context_and_source_id_file_names_are_unique_for_every_directory) { auto sourceContextAndSourceId = cache.sourceContextAndSourceId( SourcePathView("/path/to/file.cpp")); @@ -485,7 +485,7 @@ TEST_F(SourcePathCache, GetSourceContextAndSourceIdFileNamesAreUniqueForEveryDir ASSERT_THAT(sourceContextAndSourceId, Ne(sourceContextAndSourceId2)); } -TEST_F(SourcePathCache, GetSourceContextAndSourceIdDuplicateFilePathsAreEqual) +TEST_F(SourcePathCache, get_source_context_and_source_id_duplicate_file_paths_are_equal) { auto sourceContextAndSourceId = cache.sourceContextAndSourceId( SourcePathView("/path/to/file.cpp")); diff --git a/tests/unit/tests/unittests/projectstorage/sourcepathview-test.cpp b/tests/unit/tests/unittests/projectstorage/sourcepathview-test.cpp index 652c37dae89..a05d91ac159 100644 --- a/tests/unit/tests/unittests/projectstorage/sourcepathview-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/sourcepathview-test.cpp @@ -7,91 +7,91 @@ namespace { -TEST(SourcePathView, FilePathSlashForEmptyPath) +TEST(SourcePathView, file_path_slash_for_empty_path) { QmlDesigner::SourcePathView filePath(""); ASSERT_THAT(filePath.slashIndex(), -1); } -TEST(SourcePathView, FilePathSlashForSingleSlash) +TEST(SourcePathView, file_path_slash_for_single_slash) { QmlDesigner::SourcePathView filePath("/"); ASSERT_THAT(filePath.slashIndex(), 0); } -TEST(SourcePathView, FilePathSlashForFileInRoot) +TEST(SourcePathView, file_path_slash_for_file_in_root) { QmlDesigner::SourcePathView filePath("/file.h"); ASSERT_THAT(filePath.slashIndex(), 0); } -TEST(SourcePathView, FilePathSlashForSomeLongerPath) +TEST(SourcePathView, file_path_slash_for_some_longer_path) { QmlDesigner::SourcePathView filePath("/path/to/some/file.h"); ASSERT_THAT(filePath.slashIndex(), 13); } -TEST(SourcePathView, FilePathSlashForFileNameOnly) +TEST(SourcePathView, file_path_slash_for_file_name_only) { QmlDesigner::SourcePathView filePath("file.h"); ASSERT_THAT(filePath.slashIndex(), -1); } -TEST(SourcePathView, DirectoryPathForEmptyPath) +TEST(SourcePathView, directory_path_for_empty_path) { QmlDesigner::SourcePathView filePath(""); ASSERT_THAT(filePath.directory(), ""); } -TEST(SourcePathView, DirectoryPathForSingleSlashPath) +TEST(SourcePathView, directory_path_for_single_slash_path) { QmlDesigner::SourcePathView filePath{"/"}; ASSERT_THAT(filePath.directory(), ""); } -TEST(SourcePathView, DirectoryPathForLongerPath) +TEST(SourcePathView, directory_path_for_longer_path) { QmlDesigner::SourcePathView filePath{"/path/to/some/file.h"}; ASSERT_THAT(filePath.directory(), "/path/to/some"); } -TEST(SourcePathView, DirectoryPathForFileNameOnly) +TEST(SourcePathView, directory_path_for_file_name_only) { QmlDesigner::SourcePathView filePath{"file.h"}; ASSERT_THAT(filePath.directory(), IsEmpty()); } -TEST(SourcePathView, FileNameForEmptyPath) +TEST(SourcePathView, file_name_for_empty_path) { QmlDesigner::SourcePathView filePath(""); ASSERT_THAT(filePath.name(), ""); } -TEST(SourcePathView, FileNameForSingleSlashPath) +TEST(SourcePathView, file_name_for_single_slash_path) { QmlDesigner::SourcePathView filePath{"/"}; ASSERT_THAT(filePath.name(), ""); } -TEST(SourcePathView, FileNameForLongerPath) +TEST(SourcePathView, file_name_for_longer_path) { QmlDesigner::SourcePathView filePath{"/path/to/some/file.h"}; ASSERT_THAT(filePath.name(), "file.h"); } -TEST(SourcePathView, FileNameForFileNameOnly) +TEST(SourcePathView, file_name_for_file_name_only) { QmlDesigner::SourcePathView filePath{"file.h"}; diff --git a/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp b/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp index 555d8410b88..b097cf860ba 100644 --- a/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp @@ -105,14 +105,14 @@ protected: using CacheTypes = ::testing::Types; TYPED_TEST_SUITE(StorageCache, CacheTypes); -TYPED_TEST(StorageCache, AddFilePath) +TYPED_TEST(StorageCache, add_file_path) { auto id = this->cache.id(this->filePath1); ASSERT_THAT(id, this->id1); } -TYPED_TEST(StorageCache, AddSecondFilePath) +TYPED_TEST(StorageCache, add_second_file_path) { this->cache.id(this->filePath1); @@ -121,7 +121,7 @@ TYPED_TEST(StorageCache, AddSecondFilePath) ASSERT_THAT(id, this->id2); } -TYPED_TEST(StorageCache, AddDuplicateFilePath) +TYPED_TEST(StorageCache, add_duplicate_file_path) { this->cache.id(this->filePath1); @@ -130,7 +130,7 @@ TYPED_TEST(StorageCache, AddDuplicateFilePath) ASSERT_THAT(id, this->id1); } -TYPED_TEST(StorageCache, AddDuplicateFilePathBetweenOtherEntries) +TYPED_TEST(StorageCache, add_duplicate_file_path_between_other_entries) { this->cache.id(this->filePath1); this->cache.id(this->filePath2); @@ -142,7 +142,7 @@ TYPED_TEST(StorageCache, AddDuplicateFilePathBetweenOtherEntries) ASSERT_THAT(id, this->id3); } -TYPED_TEST(StorageCache, GetFilePathForIdWithOneEntry) +TYPED_TEST(StorageCache, get_file_path_for_id_with_one_entry) { this->cache.id(this->filePath1); @@ -151,7 +151,7 @@ TYPED_TEST(StorageCache, GetFilePathForIdWithOneEntry) ASSERT_THAT(filePath, this->filePath1); } -TYPED_TEST(StorageCache, GetFilePathForIdWithSomeEntries) +TYPED_TEST(StorageCache, get_file_path_for_id_with_some_entries) { this->cache.id(this->filePath1); this->cache.id(this->filePath2); @@ -163,7 +163,7 @@ TYPED_TEST(StorageCache, GetFilePathForIdWithSomeEntries) ASSERT_THAT(filePath, this->filePath3); } -TYPED_TEST(StorageCache, GetAllFilePaths) +TYPED_TEST(StorageCache, get_all_file_paths) { this->cache.id(this->filePath1); this->cache.id(this->filePath2); @@ -176,28 +176,28 @@ TYPED_TEST(StorageCache, GetAllFilePaths) ElementsAre(this->filePath1, this->filePath2, this->filePath3, this->filePath4)); } -TYPED_TEST(StorageCache, AddFilePaths) +TYPED_TEST(StorageCache, add_file_paths) { auto ids = this->cache.ids({this->filePath1, this->filePath2, this->filePath3, this->filePath4}); ASSERT_THAT(ids, ElementsAre(this->id1, this->id2, this->id3, this->id4)); } -TYPED_TEST(StorageCache, AddFilePathsWithStorageFunction) +TYPED_TEST(StorageCache, add_file_paths_with_storage_function) { auto ids = this->cache.ids({"foo", "taa", "poo", "bar"}); ASSERT_THAT(ids, UnorderedElementsAre(this->id42, this->id43, this->id44, this->id45)); } -TYPED_TEST(StorageCache, IsEmpty) +TYPED_TEST(StorageCache, is_empty) { auto isEmpty = this->cache.isEmpty(); ASSERT_TRUE(isEmpty); } -TYPED_TEST(StorageCache, IsNotEmpty) +TYPED_TEST(StorageCache, is_not_empty) { this->cache.id(this->filePath1); @@ -206,14 +206,14 @@ TYPED_TEST(StorageCache, IsNotEmpty) ASSERT_FALSE(isEmpty); } -TYPED_TEST(StorageCache, PopulateWithEmptyVector) +TYPED_TEST(StorageCache, populate_with_empty_vector) { this->cache.uncheckedPopulate(); ASSERT_TRUE(this->cache.isEmpty()); } -TYPED_TEST(StorageCache, IsNotEmptyAfterPopulateWithSomeEntries) +TYPED_TEST(StorageCache, is_not_empty_after_populate_with_some_entries) { typename TypeParam::CacheEntries entries{{this->filePath1.clone(), this->id1}, {this->filePath2.clone(), this->id4}, @@ -226,7 +226,7 @@ TYPED_TEST(StorageCache, IsNotEmptyAfterPopulateWithSomeEntries) ASSERT_TRUE(!this->cache.isEmpty()); } -TYPED_TEST(StorageCache, GetEntryAfterPopulateWithSomeEntries) +TYPED_TEST(StorageCache, get_entry_after_populate_with_some_entries) { typename TypeParam::CacheEntries entries{{this->filePath1.clone(), this->id1}, {this->filePath2.clone(), this->id2}, @@ -240,7 +240,7 @@ TYPED_TEST(StorageCache, GetEntryAfterPopulateWithSomeEntries) ASSERT_THAT(value, this->filePath3); } -TYPED_TEST(StorageCache, EntriesHaveUniqueIds) +TYPED_TEST(StorageCache, entries_have_unique_ids) { typename TypeParam::CacheEntries entries{{this->filePath1.clone(), this->id1}, {this->filePath2.clone(), this->id2}, @@ -251,7 +251,7 @@ TYPED_TEST(StorageCache, EntriesHaveUniqueIds) ASSERT_THROW(this->cache.populate(), StorageCacheException); } -TYPED_TEST(StorageCache, MultipleEntries) +TYPED_TEST(StorageCache, multiple_entries) { typename TypeParam::CacheEntries entries{{this->filePath1.clone(), this->id1}, {this->filePath1.clone(), this->id2}, @@ -262,7 +262,7 @@ TYPED_TEST(StorageCache, MultipleEntries) ASSERT_THROW(this->cache.populate(), StorageCacheException); } -TYPED_TEST(StorageCache, IdIsReadAndWriteLockedForUnknownEntry) +TYPED_TEST(StorageCache, id_is_read_and_write_locked_for_unknown_entry) { InSequence s; @@ -274,7 +274,7 @@ TYPED_TEST(StorageCache, IdIsReadAndWriteLockedForUnknownEntry) this->cache.id("foo"); } -TYPED_TEST(StorageCache, IdWithStorageFunctionIsReadAndWriteLockedForUnknownEntry) +TYPED_TEST(StorageCache, id_with_storage_function_is_read_and_write_locked_for_unknown_entry) { InSequence s; @@ -287,7 +287,7 @@ TYPED_TEST(StorageCache, IdWithStorageFunctionIsReadAndWriteLockedForUnknownEntr this->cache.id("foo"); } -TYPED_TEST(StorageCache, IdWithStorageFunctionIsReadLockedForKnownEntry) +TYPED_TEST(StorageCache, id_with_storage_function_is_read_locked_for_known_entry) { InSequence s; this->cache.id("foo"); @@ -301,7 +301,7 @@ TYPED_TEST(StorageCache, IdWithStorageFunctionIsReadLockedForKnownEntry) this->cache.id("foo"); } -TYPED_TEST(StorageCache, IdIsReadLockedForKnownEntry) +TYPED_TEST(StorageCache, id_is_read_locked_for_known_entry) { this->cache.id("foo"); @@ -313,7 +313,7 @@ TYPED_TEST(StorageCache, IdIsReadLockedForKnownEntry) this->cache.id("foo"); } -TYPED_TEST(StorageCache, IdsIsLocked) +TYPED_TEST(StorageCache, ids_is_locked) { EXPECT_CALL(this->mockMutex, lock_shared()); EXPECT_CALL(this->mockMutex, unlock_shared()); @@ -321,7 +321,7 @@ TYPED_TEST(StorageCache, IdsIsLocked) this->cache.ids({"foo"}); } -TYPED_TEST(StorageCache, IdsWithStorageIsLocked) +TYPED_TEST(StorageCache, ids_with_storage_is_locked) { EXPECT_CALL(this->mockMutex, lock_shared()); EXPECT_CALL(this->mockMutex, unlock_shared()); @@ -329,7 +329,7 @@ TYPED_TEST(StorageCache, IdsWithStorageIsLocked) this->cache.ids({"foo"}); } -TYPED_TEST(StorageCache, ValueIsLocked) +TYPED_TEST(StorageCache, value_is_locked) { auto id = this->cache.id("foo"); @@ -339,7 +339,7 @@ TYPED_TEST(StorageCache, ValueIsLocked) this->cache.value(id); } -TYPED_TEST(StorageCache, ValuesIsLocked) +TYPED_TEST(StorageCache, values_is_locked) { auto ids = this->cache.ids({"foo", "bar"}); @@ -349,7 +349,7 @@ TYPED_TEST(StorageCache, ValuesIsLocked) this->cache.values(ids); } -TYPED_TEST(StorageCache, ValueWithStorageFunctionIsReadAndWriteLockedForUnknownId) +TYPED_TEST(StorageCache, value_with_storage_function_is_read_and_write_locked_for_unknown_id) { InSequence s; @@ -362,7 +362,7 @@ TYPED_TEST(StorageCache, ValueWithStorageFunctionIsReadAndWriteLockedForUnknownI this->cache.value(this->id41); } -TYPED_TEST(StorageCache, ValueWithStorageFunctionIsReadLockedForKnownId) +TYPED_TEST(StorageCache, value_with_storage_function_is_read_locked_for_known_id) { InSequence s; this->cache.value(this->id41); @@ -376,14 +376,14 @@ TYPED_TEST(StorageCache, ValueWithStorageFunctionIsReadLockedForKnownId) this->cache.value(this->id41); } -TYPED_TEST(StorageCache, IdWithStorageFunctionWhichHasNoEntryIsCallingStorageFunction) +TYPED_TEST(StorageCache, id_with_storage_function_which_has_no_entry_is_calling_storage_function) { EXPECT_CALL(this->mockStorage, fetchSourceContextId(Eq("foo"))); this->cache.id("foo"); } -TYPED_TEST(StorageCache, IdWithStorageFunctionWhichHasEntryIsNotCallingStorageFunction) +TYPED_TEST(StorageCache, id_with_storage_function_which_has_entry_is_not_calling_storage_function) { this->cache.id("foo"); @@ -392,7 +392,7 @@ TYPED_TEST(StorageCache, IdWithStorageFunctionWhichHasEntryIsNotCallingStorageFu this->cache.id("foo"); } -TYPED_TEST(StorageCache, IndexOfIdWithStorageFunctionWhichHasEntry) +TYPED_TEST(StorageCache, index_of_id_with_storage_function_which_has_entry) { this->cache.id("foo"); @@ -401,14 +401,14 @@ TYPED_TEST(StorageCache, IndexOfIdWithStorageFunctionWhichHasEntry) ASSERT_THAT(index, this->id42); } -TYPED_TEST(StorageCache, IndexOfIdWithStorageFunctionWhichHasNoEntry) +TYPED_TEST(StorageCache, index_of_id_with_storage_function_which_has_no_entry) { auto index = this->cache.id("foo"); ASSERT_THAT(index, this->id42); } -TYPED_TEST(StorageCache, GetEntryByIndexAfterInsertingByCustomIndex) +TYPED_TEST(StorageCache, get_entry_by_index_after_inserting_by_custom_index) { auto index = this->cache.id("foo"); @@ -417,7 +417,7 @@ TYPED_TEST(StorageCache, GetEntryByIndexAfterInsertingByCustomIndex) ASSERT_THAT(value, Eq("foo")); } -TYPED_TEST(StorageCache, CallFetchSourceContextPathForLowerIndex) +TYPED_TEST(StorageCache, call_fetch_source_context_path_for_lower_index) { auto index = this->cache.id("foo"); SourceContextId lowerIndex{SourceContextId::create(index.internalId() - 1)}; @@ -427,21 +427,21 @@ TYPED_TEST(StorageCache, CallFetchSourceContextPathForLowerIndex) this->cache.value(lowerIndex); } -TYPED_TEST(StorageCache, CallFetchSourceContextPathForUnknownIndex) +TYPED_TEST(StorageCache, call_fetch_source_context_path_for_unknown_index) { EXPECT_CALL(this->mockStorage, fetchSourceContextPath(Eq(this->id1))); this->cache.value(this->id1); } -TYPED_TEST(StorageCache, FetchSourceContextPathForUnknownIndex) +TYPED_TEST(StorageCache, fetch_source_context_path_for_unknown_index) { auto value = this->cache.value(this->id41); ASSERT_THAT(value, Eq("bar")); } -TYPED_TEST(StorageCache, AddCalls) +TYPED_TEST(StorageCache, add_calls) { EXPECT_CALL(this->mockStorage, fetchSourceContextId(Eq("foo"))); EXPECT_CALL(this->mockStorage, fetchSourceContextId(Eq("bar"))); @@ -450,7 +450,7 @@ TYPED_TEST(StorageCache, AddCalls) this->cache.add({"foo", "bar", "poo"}); } -TYPED_TEST(StorageCache, AddCallsOnlyForNewValues) +TYPED_TEST(StorageCache, add_calls_only_for_new_values) { this->cache.add({"foo", "poo"}); @@ -460,21 +460,21 @@ TYPED_TEST(StorageCache, AddCallsOnlyForNewValues) this->cache.add({"foo", "bar", "poo", "taa"}); } -TYPED_TEST(StorageCache, GetIdAfterAddingValues) +TYPED_TEST(StorageCache, get_id_after_adding_values) { this->cache.add({"foo", "bar", "poo", "taa"}); ASSERT_THAT(this->cache.value(this->cache.id("taa")), Eq("taa")); } -TYPED_TEST(StorageCache, GetValueAfterAddingValues) +TYPED_TEST(StorageCache, get_value_after_adding_values) { this->cache.add({"foo", "bar", "poo", "taa"}); ASSERT_THAT(this->cache.value(this->cache.id("taa")), Eq("taa")); } -TYPED_TEST(StorageCache, GetIdAfterAddingValuesMultipleTimes) +TYPED_TEST(StorageCache, get_id_after_adding_values_multiple_times) { this->cache.add({"foo", "taa"}); @@ -483,19 +483,19 @@ TYPED_TEST(StorageCache, GetIdAfterAddingValuesMultipleTimes) ASSERT_THAT(this->cache.value(this->cache.id("taa")), Eq("taa")); } -TYPED_TEST(StorageCache, GetIdAfterAddingTheSameValuesMultipleTimes) +TYPED_TEST(StorageCache, get_id_after_adding_the_same_values_multiple_times) { this->cache.add({"foo", "taa", "poo", "taa", "bar", "taa"}); ASSERT_THAT(this->cache.value(this->cache.id("taa")), Eq("taa")); } -TYPED_TEST(StorageCache, AddingEmptyValues) +TYPED_TEST(StorageCache, adding_empty_values) { this->cache.add({}); } -TYPED_TEST(StorageCache, FetchIdsFromStorageCalls) +TYPED_TEST(StorageCache, fetch_ids_from_storage_calls) { InSequence s; diff --git a/tests/unit/tests/unittests/qmlprojectmanager/converters-test.cpp b/tests/unit/tests/unittests/qmlprojectmanager/converters-test.cpp index b7681610dee..4131ec48a56 100644 --- a/tests/unit/tests/unittests/qmlprojectmanager/converters-test.cpp +++ b/tests/unit/tests/unittests/qmlprojectmanager/converters-test.cpp @@ -67,7 +67,7 @@ INSTANTIATE_TEST_SUITE_P(QmlProjectItem, DataSet, ::testing::Values(QString("test-set-1"), QString("test-set-2"))); -TEST_P(DataSet, QmlProjectToJson) +TEST_P(DataSet, qml_project_to_json) { // GIVEN setDataSource(GetParam()); @@ -82,7 +82,7 @@ TEST_P(DataSet, QmlProjectToJson) ASSERT_THAT(convertedContent, Eq(targetContent)); } -TEST_P(DataSet, JsonToQmlProject) +TEST_P(DataSet, json_to_qml_project) { // GIVEN setDataSource(GetParam()); diff --git a/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp b/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp index f6ae87c2c81..976841b541a 100644 --- a/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp +++ b/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp @@ -62,49 +62,49 @@ auto createAbsoluteFilePaths(const QStringList &fileList) }); } -TEST_F(QmlProjectItem, GetWithQdsPrefixMainFileProject) +TEST_F(QmlProjectItem, get_with_qds_prefix_main_file_project) { auto mainFile = projectItemWithQdsPrefix->mainFile(); ASSERT_THAT(mainFile, Eq("content/App.qml")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixMainUIFileProject) +TEST_F(QmlProjectItem, get_with_qds_prefix_main_ui_file_project) { auto mainUiFile = projectItemWithQdsPrefix->mainUiFile(); ASSERT_THAT(mainUiFile, Eq("Screen01.ui.qml")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixMcuProject) +TEST_F(QmlProjectItem, get_with_qds_prefix_mcu_project) { auto isMcuProject = projectItemWithQdsPrefix->isQt4McuProject(); ASSERT_TRUE(isMcuProject); } -TEST_F(QmlProjectItem, GetWithQdsPrefixQtVersion) +TEST_F(QmlProjectItem, get_with_qds_prefix_qt_version) { auto qtVersion = projectItemWithQdsPrefix->versionQt(); ASSERT_THAT(qtVersion, Eq("6")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixQtQuickVersion) +TEST_F(QmlProjectItem, get_with_qds_prefix_qt_quick_version) { auto qtQuickVersion = projectItemWithQdsPrefix->versionQtQuick(); ASSERT_THAT(qtQuickVersion, Eq("6.2")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixDesignStudioVersion) +TEST_F(QmlProjectItem, get_with_qds_prefix_design_studio_version) { auto designStudioVersion = projectItemWithQdsPrefix->versionDesignStudio(); ASSERT_THAT(designStudioVersion, Eq("3.9")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixSourceDirectory) +TEST_F(QmlProjectItem, get_with_qds_prefix_source_directory) { auto sourceDirectory = projectItemWithQdsPrefix->sourceDirectory().path(); @@ -113,42 +113,42 @@ TEST_F(QmlProjectItem, GetWithQdsPrefixSourceDirectory) ASSERT_THAT(sourceDirectory, Eq(expectedSourceDir)); } -TEST_F(QmlProjectItem, GetWithQdsPrefixTarGetWithQdsPrefixDirectory) +TEST_F(QmlProjectItem, get_with_qds_prefix_tar_get_with_qds_prefix_directory) { auto targetDirectory = projectItemWithQdsPrefix->targetDirectory(); ASSERT_THAT(targetDirectory, Eq("/opt/targetDirectory")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixImportPaths) +TEST_F(QmlProjectItem, get_with_qds_prefix_import_paths) { auto importPaths = projectItemWithQdsPrefix->importPaths(); ASSERT_THAT(importPaths, UnorderedElementsAre("imports", "asset_imports")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixFileSelectors) +TEST_F(QmlProjectItem, get_with_qds_prefix_file_selectors) { auto fileSelectors = projectItemWithQdsPrefix->fileSelectors(); ASSERT_THAT(fileSelectors, UnorderedElementsAre("WXGA", "darkTheme", "ShowIndicator")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixMultiLanguageSupport) +TEST_F(QmlProjectItem, get_with_qds_prefix_multi_language_support) { auto multilanguageSupport = projectItemWithQdsPrefix->multilanguageSupport(); ASSERT_TRUE(multilanguageSupport); } -TEST_F(QmlProjectItem, GetWithQdsPrefixSupportedLanguages) +TEST_F(QmlProjectItem, get_with_qds_prefix_supported_languages) { auto supportedLanguages = projectItemWithQdsPrefix->supportedLanguages(); ASSERT_THAT(supportedLanguages, UnorderedElementsAre("en", "fr")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixPrimaryLanguage) +TEST_F(QmlProjectItem, get_with_qds_prefix_primary_language) { auto primaryLanguage = projectItemWithQdsPrefix->primaryLanguage(); ; @@ -156,14 +156,14 @@ TEST_F(QmlProjectItem, GetWithQdsPrefixPrimaryLanguage) ASSERT_THAT(primaryLanguage, Eq("en")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixWidgetApp) +TEST_F(QmlProjectItem, get_with_qds_prefix_widget_app) { auto widgetApp = projectItemWithQdsPrefix->widgetApp(); ASSERT_TRUE(widgetApp); } -TEST_F(QmlProjectItem, GetWithQdsPrefixFileList) +TEST_F(QmlProjectItem, get_with_qds_prefix_file_list) { QStringList fileList; for (const auto &file : projectItemWithQdsPrefix->files()) { @@ -175,7 +175,7 @@ TEST_F(QmlProjectItem, GetWithQdsPrefixFileList) ASSERT_THAT(fileList, UnorderedElementsAre(expectedFileList)); } -TEST_F(QmlProjectItem, GetWithQdsPrefixShaderToolArgs) +TEST_F(QmlProjectItem, get_with_qds_prefix_shader_tool_args) { auto shaderToolArgs = projectItemWithQdsPrefix->shaderToolArgs(); @@ -184,14 +184,14 @@ TEST_F(QmlProjectItem, GetWithQdsPrefixShaderToolArgs) UnorderedElementsAre("-s", "--glsl", "\"100 es,120,150\"", "--hlsl", "50", "--msl", "12")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixShaderToolFiles) +TEST_F(QmlProjectItem, get_with_qds_prefix_shader_tool_files) { auto shaderToolFiles = projectItemWithQdsPrefix->shaderToolFiles(); ASSERT_THAT(shaderToolFiles, UnorderedElementsAre("content/shaders/*")); } -TEST_F(QmlProjectItem, GetWithQdsPrefixEnvironment) +TEST_F(QmlProjectItem, get_with_qds_prefix_environment) { auto env = projectItemWithQdsPrefix->environment(); @@ -200,56 +200,56 @@ TEST_F(QmlProjectItem, GetWithQdsPrefixEnvironment) Utils::EnvironmentItem("QT_QUICK_CONTROLS_CONF", "qtquickcontrols2.conf"))); } -TEST_F(QmlProjectItem, GetWithQdsPrefixForceFreeType) +TEST_F(QmlProjectItem, get_with_qds_prefix_force_free_type) { auto forceFreeType = projectItemWithQdsPrefix->forceFreeType(); ASSERT_TRUE(forceFreeType); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixMainFileProject) +TEST_F(QmlProjectItem, get_without_qds_prefix_main_file_project) { auto mainFile = projectItemWithoutQdsPrefix->mainFile(); ASSERT_THAT(mainFile, Eq("content/App.qml")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixMainUIFileProject) +TEST_F(QmlProjectItem, get_without_qds_prefix_main_ui_file_project) { auto mainUiFile = projectItemWithoutQdsPrefix->mainUiFile(); ASSERT_THAT(mainUiFile, Eq("Screen01.ui.qml")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixMcuProject) +TEST_F(QmlProjectItem, get_without_qds_prefix_mcu_project) { auto isMcuProject = projectItemWithoutQdsPrefix->isQt4McuProject(); ASSERT_TRUE(isMcuProject); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixQtVersion) +TEST_F(QmlProjectItem, get_without_qds_prefix_qt_version) { auto qtVersion = projectItemWithoutQdsPrefix->versionQt(); ASSERT_THAT(qtVersion, Eq("6")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixQtQuickVersion) +TEST_F(QmlProjectItem, get_without_qds_prefix_qt_quick_version) { auto qtQuickVersion = projectItemWithoutQdsPrefix->versionQtQuick(); ASSERT_THAT(qtQuickVersion, Eq("6.2")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixDesignStudioVersion) +TEST_F(QmlProjectItem, get_without_qds_prefix_design_studio_version) { auto designStudioVersion = projectItemWithoutQdsPrefix->versionDesignStudio(); ASSERT_THAT(designStudioVersion, Eq("3.9")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixSourceDirectory) +TEST_F(QmlProjectItem, get_without_qds_prefix_source_directory) { auto sourceDirectory = projectItemWithoutQdsPrefix->sourceDirectory().path(); @@ -258,42 +258,42 @@ TEST_F(QmlProjectItem, GetWithoutQdsPrefixSourceDirectory) ASSERT_THAT(sourceDirectory, Eq(expectedSourceDir)); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixTarGetWithoutQdsPrefixDirectory) +TEST_F(QmlProjectItem, get_without_qds_prefix_tar_get_without_qds_prefix_directory) { auto targetDirectory = projectItemWithoutQdsPrefix->targetDirectory(); ASSERT_THAT(targetDirectory, Eq("/opt/targetDirectory")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixImportPaths) +TEST_F(QmlProjectItem, get_without_qds_prefix_import_paths) { auto importPaths = projectItemWithoutQdsPrefix->importPaths(); ASSERT_THAT(importPaths, UnorderedElementsAre("imports", "asset_imports")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixFileSelectors) +TEST_F(QmlProjectItem, get_without_qds_prefix_file_selectors) { auto fileSelectors = projectItemWithoutQdsPrefix->fileSelectors(); ASSERT_THAT(fileSelectors, UnorderedElementsAre("WXGA", "darkTheme", "ShowIndicator")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixMultiLanguageSupport) +TEST_F(QmlProjectItem, get_without_qds_prefix_multi_language_support) { auto multilanguageSupport = projectItemWithoutQdsPrefix->multilanguageSupport(); ASSERT_TRUE(multilanguageSupport); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixSupportedLanguages) +TEST_F(QmlProjectItem, get_without_qds_prefix_supported_languages) { auto supportedLanguages = projectItemWithoutQdsPrefix->supportedLanguages(); ASSERT_THAT(supportedLanguages, UnorderedElementsAre("en", "fr")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixPrimaryLanguage) +TEST_F(QmlProjectItem, get_without_qds_prefix_primary_language) { auto primaryLanguage = projectItemWithoutQdsPrefix->primaryLanguage(); ; @@ -301,14 +301,14 @@ TEST_F(QmlProjectItem, GetWithoutQdsPrefixPrimaryLanguage) ASSERT_THAT(primaryLanguage, Eq("en")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixWidgetApp) +TEST_F(QmlProjectItem, get_without_qds_prefix_widget_app) { auto widgetApp = projectItemWithoutQdsPrefix->widgetApp(); ASSERT_TRUE(widgetApp); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixFileList) +TEST_F(QmlProjectItem, get_without_qds_prefix_file_list) { QStringList fileList; for (const auto &file : projectItemWithoutQdsPrefix->files()) { @@ -320,7 +320,7 @@ TEST_F(QmlProjectItem, GetWithoutQdsPrefixFileList) ASSERT_THAT(fileList, UnorderedElementsAre(expectedFileList)); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixShaderToolArgs) +TEST_F(QmlProjectItem, get_without_qds_prefix_shader_tool_args) { auto shaderToolArgs = projectItemWithoutQdsPrefix->shaderToolArgs(); @@ -329,14 +329,14 @@ TEST_F(QmlProjectItem, GetWithoutQdsPrefixShaderToolArgs) UnorderedElementsAre("-s", "--glsl", "\"100 es,120,150\"", "--hlsl", "50", "--msl", "12")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixShaderToolFiles) +TEST_F(QmlProjectItem, get_without_qds_prefix_shader_tool_files) { auto shaderToolFiles = projectItemWithoutQdsPrefix->shaderToolFiles(); ASSERT_THAT(shaderToolFiles, UnorderedElementsAre("content/shaders/*")); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixEnvironment) +TEST_F(QmlProjectItem, get_without_qds_prefix_environment) { auto env = projectItemWithoutQdsPrefix->environment(); @@ -345,35 +345,35 @@ TEST_F(QmlProjectItem, GetWithoutQdsPrefixEnvironment) Utils::EnvironmentItem("QT_QUICK_CONTROLS_CONF", "qtquickcontrols2.conf"))); } -TEST_F(QmlProjectItem, GetWithoutQdsPrefixForceFreeType) +TEST_F(QmlProjectItem, get_without_qds_prefix_force_free_type) { auto forceFreeType = projectItemWithoutQdsPrefix->forceFreeType(); ASSERT_TRUE(forceFreeType); } -TEST_F(QmlProjectItem, GetEmptyMainFileProject) +TEST_F(QmlProjectItem, get_empty_main_file_project) { auto mainFile = projectItemEmpty->mainFile(); ASSERT_THAT(mainFile, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyMainUIFileProject) +TEST_F(QmlProjectItem, get_empty_main_ui_file_project) { auto mainUiFile = projectItemEmpty->mainUiFile(); ASSERT_THAT(mainUiFile, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyMcuProject) +TEST_F(QmlProjectItem, get_empty_mcu_project) { auto isMcuProject = projectItemEmpty->isQt4McuProject(); ASSERT_FALSE(isMcuProject); } -TEST_F(QmlProjectItem, GetEmptyQtVersion) +TEST_F(QmlProjectItem, get_empty_qt_version) { auto qtVersion = projectItemEmpty->versionQt(); @@ -381,21 +381,21 @@ TEST_F(QmlProjectItem, GetEmptyQtVersion) ASSERT_THAT(qtVersion, Eq("5")); } -TEST_F(QmlProjectItem, GetEmptyQtQuickVersion) +TEST_F(QmlProjectItem, get_empty_qt_quick_version) { auto qtQuickVersion = projectItemEmpty->versionQtQuick(); ASSERT_THAT(projectItemEmpty->versionQtQuick(), IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyDesignStudioVersion) +TEST_F(QmlProjectItem, get_empty_design_studio_version) { auto designStudioVersion = projectItemEmpty->versionDesignStudio(); ASSERT_THAT(projectItemEmpty->versionDesignStudio(), IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptySourceDirectory) +TEST_F(QmlProjectItem, get_empty_source_directory) { auto sourceDirectory = projectItemEmpty->sourceDirectory().path(); @@ -405,91 +405,91 @@ TEST_F(QmlProjectItem, GetEmptySourceDirectory) ASSERT_THAT(sourceDirectory, Eq(expectedSourceDir)); } -TEST_F(QmlProjectItem, GetEmptyTarGetEmptyDirectory) +TEST_F(QmlProjectItem, get_empty_tar_get_empty_directory) { auto targetDirectory = projectItemEmpty->targetDirectory(); ASSERT_THAT(targetDirectory, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyImportPaths) +TEST_F(QmlProjectItem, get_empty_import_paths) { auto importPaths = projectItemEmpty->importPaths(); ASSERT_THAT(importPaths, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyFileSelectors) +TEST_F(QmlProjectItem, get_empty_file_selectors) { auto fileSelectors = projectItemEmpty->fileSelectors(); ASSERT_THAT(fileSelectors, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyMultiLanguageSupport) +TEST_F(QmlProjectItem, get_empty_multi_language_support) { auto multilanguageSupport = projectItemEmpty->multilanguageSupport(); ASSERT_FALSE(multilanguageSupport); } -TEST_F(QmlProjectItem, GetEmptySupportedLanguages) +TEST_F(QmlProjectItem, get_empty_supported_languages) { auto supportedLanguages = projectItemEmpty->supportedLanguages(); ASSERT_THAT(supportedLanguages, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyPrimaryLanguage) +TEST_F(QmlProjectItem, get_empty_primary_language) { auto primaryLanguage = projectItemEmpty->primaryLanguage(); ASSERT_THAT(primaryLanguage, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyWidgetApp) +TEST_F(QmlProjectItem, get_empty_widget_app) { auto widgetApp = projectItemEmpty->widgetApp(); ASSERT_FALSE(widgetApp); } -TEST_F(QmlProjectItem, GetEmptyFileList) +TEST_F(QmlProjectItem, get_empty_file_list) { auto fileList = projectItemEmpty->files(); ASSERT_THAT(fileList, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyShaderToolArgs) +TEST_F(QmlProjectItem, get_empty_shader_tool_args) { auto shaderToolArgs = projectItemEmpty->shaderToolArgs(); ASSERT_THAT(shaderToolArgs, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyShaderToolFiles) +TEST_F(QmlProjectItem, get_empty_shader_tool_files) { auto shaderToolFiles = projectItemEmpty->shaderToolFiles(); ASSERT_THAT(shaderToolFiles, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyEnvironment) +TEST_F(QmlProjectItem, get_empty_environment) { auto env = projectItemEmpty->environment(); ASSERT_THAT(env, IsEmpty()); } -TEST_F(QmlProjectItem, GetEmptyForceFreeType) +TEST_F(QmlProjectItem, get_empty_force_free_type) { auto forceFreeType = projectItemEmpty->forceFreeType(); ASSERT_FALSE(forceFreeType); } -TEST_F(QmlProjectItem, SetMainFileProject) +TEST_F(QmlProjectItem, set_main_file_project) { projectItemSetters->setMainFile("testing"); @@ -498,7 +498,7 @@ TEST_F(QmlProjectItem, SetMainFileProject) ASSERT_THAT(mainFile, Eq("testing")); } -TEST_F(QmlProjectItem, SetMainUIFileProject) +TEST_F(QmlProjectItem, set_main_ui_file_project) { projectItemSetters->setMainUiFile("testing"); @@ -507,7 +507,7 @@ TEST_F(QmlProjectItem, SetMainUIFileProject) ASSERT_THAT(mainUiFile, Eq("testing")); } -TEST_F(QmlProjectItem, SetImportPaths) +TEST_F(QmlProjectItem, set_import_paths) { projectItemSetters->setImportPaths({"testing"}); @@ -516,7 +516,7 @@ TEST_F(QmlProjectItem, SetImportPaths) ASSERT_THAT(importPaths, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, AddImportPaths) +TEST_F(QmlProjectItem, add_import_paths) { projectItemSetters->setImportPaths({}); projectItemSetters->addImportPath("testing"); @@ -526,7 +526,7 @@ TEST_F(QmlProjectItem, AddImportPaths) ASSERT_THAT(importPaths, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, SetFileSelectors) +TEST_F(QmlProjectItem, set_file_selectors) { projectItemSetters->setFileSelectors({"testing"}); @@ -535,7 +535,7 @@ TEST_F(QmlProjectItem, SetFileSelectors) ASSERT_THAT(fileSelectors, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, AddFileSelectors) +TEST_F(QmlProjectItem, add_file_selectors) { projectItemSetters->setFileSelectors({}); projectItemSetters->addFileSelector("testing"); @@ -545,7 +545,7 @@ TEST_F(QmlProjectItem, AddFileSelectors) ASSERT_THAT(fileSelectors, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, SetMultiLanguageSupport) +TEST_F(QmlProjectItem, set_multi_language_support) { projectItemSetters->setMultilanguageSupport(true); @@ -554,7 +554,7 @@ TEST_F(QmlProjectItem, SetMultiLanguageSupport) ASSERT_TRUE(multilanguageSupport); } -TEST_F(QmlProjectItem, SetSupportedLanguages) +TEST_F(QmlProjectItem, set_supported_languages) { projectItemSetters->setSupportedLanguages({"testing"}); @@ -563,7 +563,7 @@ TEST_F(QmlProjectItem, SetSupportedLanguages) ASSERT_THAT(supportedLanguages, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, AddSupportedLanguages) +TEST_F(QmlProjectItem, add_supported_languages) { projectItemSetters->setSupportedLanguages({}); projectItemSetters->addSupportedLanguage("testing"); @@ -573,7 +573,7 @@ TEST_F(QmlProjectItem, AddSupportedLanguages) ASSERT_THAT(supportedLanguages, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, SetPrimaryLanguage) +TEST_F(QmlProjectItem, set_primary_language) { projectItemSetters->setPrimaryLanguage("testing"); @@ -583,7 +583,7 @@ TEST_F(QmlProjectItem, SetPrimaryLanguage) ASSERT_THAT(primaryLanguage, Eq("testing")); } -TEST_F(QmlProjectItem, SetWidgetApp) +TEST_F(QmlProjectItem, set_widget_app) { projectItemSetters->setWidgetApp(true); @@ -592,7 +592,7 @@ TEST_F(QmlProjectItem, SetWidgetApp) ASSERT_TRUE(widgetApp); } -TEST_F(QmlProjectItem, SetShaderToolArgs) +TEST_F(QmlProjectItem, set_shader_tool_args) { projectItemSetters->setShaderToolArgs({"testing"}); @@ -601,7 +601,7 @@ TEST_F(QmlProjectItem, SetShaderToolArgs) ASSERT_THAT(shaderToolArgs, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, AddShaderToolArgs) +TEST_F(QmlProjectItem, add_shader_tool_args) { projectItemSetters->setShaderToolArgs({}); projectItemSetters->addShaderToolArg("testing"); @@ -611,7 +611,7 @@ TEST_F(QmlProjectItem, AddShaderToolArgs) ASSERT_THAT(shaderToolArgs, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, SetShaderToolFiles) +TEST_F(QmlProjectItem, set_shader_tool_files) { projectItemSetters->setShaderToolFiles({"testing"}); @@ -620,7 +620,7 @@ TEST_F(QmlProjectItem, SetShaderToolFiles) ASSERT_THAT(shaderToolFiles, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, AddShaderToolFiles) +TEST_F(QmlProjectItem, add_shader_tool_files) { projectItemSetters->setShaderToolFiles({}); projectItemSetters->addShaderToolFile("testing"); @@ -630,7 +630,7 @@ TEST_F(QmlProjectItem, AddShaderToolFiles) ASSERT_THAT(shaderToolFiles, UnorderedElementsAre("testing")); } -TEST_F(QmlProjectItem, AddEnvironment) +TEST_F(QmlProjectItem, add_environment) { projectItemSetters->addToEnviroment("testing", "testing"); auto envs = projectItemSetters->environment(); @@ -641,35 +641,35 @@ TEST_F(QmlProjectItem, AddEnvironment) ASSERT_EQ(envs, expectedEnvs); } -TEST_F(QmlProjectItem, SetForceFreeTypeTrue) +TEST_F(QmlProjectItem, set_force_free_type_true) { projectItemSetters->setForceFreeType(true); ASSERT_EQ(projectItemSetters->forceFreeType(), true); } -TEST_F(QmlProjectItem, SetForceFreeTypeFalse) +TEST_F(QmlProjectItem, set_force_free_type_false) { projectItemSetters->setForceFreeType(false); ASSERT_EQ(projectItemSetters->forceFreeType(), false); } -TEST_F(QmlProjectItem, SetQtVersion) +TEST_F(QmlProjectItem, set_qt_version) { projectItemSetters->setVersionQt("6"); ASSERT_EQ(projectItemSetters->versionQt().toStdString(), "6"); } -TEST_F(QmlProjectItem, SetQtQuickVersion) +TEST_F(QmlProjectItem, set_qt_quick_version) { projectItemSetters->setVersionQtQuick("6"); ASSERT_EQ(projectItemSetters->versionQtQuick(), "6"); } -TEST_F(QmlProjectItem, SetDesignStudioVersion) +TEST_F(QmlProjectItem, set_design_studio_version) { projectItemSetters->setVersionDesignStudio("6"); @@ -677,7 +677,7 @@ TEST_F(QmlProjectItem, SetDesignStudioVersion) } // TODO: We should move these 2 tests into the integration tests -TEST_F(QmlProjectItem, TestFileFilters) +TEST_F(QmlProjectItem, test_file_filters) { // GIVEN auto fileListPath = Utils::FilePath::fromString(localTestDataDir + "/file-filters/filelist.txt"); @@ -692,7 +692,7 @@ TEST_F(QmlProjectItem, TestFileFilters) ASSERT_THAT(filePaths, UnorderedElementsAreArray(expectedAbsoluteFilePaths)); } -TEST_F(QmlProjectItem, MatchesFile) +TEST_F(QmlProjectItem, matches_file) { // GIVEN auto fileSearched = localTestDataDir + "/file-filters/content/MaterialNames.qml"; @@ -704,7 +704,7 @@ TEST_F(QmlProjectItem, MatchesFile) ASSERT_TRUE(fileFound); } -TEST_F(QmlProjectItem, NotMatchesFile) +TEST_F(QmlProjectItem, not_matches_file) { // GIVEN auto fileSearched = localTestDataDir + "/file-filters/content/non-existing-file.qwerty"; diff --git a/tests/unit/tests/unittests/sqlite/createtablesqlstatementbuilder-test.cpp b/tests/unit/tests/unittests/sqlite/createtablesqlstatementbuilder-test.cpp index 06d8d630b0e..f9ae5bcfdbc 100644 --- a/tests/unit/tests/unittests/sqlite/createtablesqlstatementbuilder-test.cpp +++ b/tests/unit/tests/unittests/sqlite/createtablesqlstatementbuilder-test.cpp @@ -49,19 +49,19 @@ protected: Builder builder; }; -TEST_F(CreateTableSqlStatementBuilder, IsNotValidAfterCreation) +TEST_F(CreateTableSqlStatementBuilder, is_not_valid_after_creation) { ASSERT_FALSE(builder.isValid()); } -TEST_F(CreateTableSqlStatementBuilder, IsValidAfterBinding) +TEST_F(CreateTableSqlStatementBuilder, is_valid_after_binding) { bindValues(); ASSERT_TRUE(builder.isValid()); } -TEST_F(CreateTableSqlStatementBuilder, InvalidAfterClear) +TEST_F(CreateTableSqlStatementBuilder, invalid_after_clear) { bindValues(); @@ -70,7 +70,7 @@ TEST_F(CreateTableSqlStatementBuilder, InvalidAfterClear) ASSERT_TRUE(!builder.isValid()); } -TEST_F(CreateTableSqlStatementBuilder, NoSqlStatementAfterClear) +TEST_F(CreateTableSqlStatementBuilder, no_sql_statement_after_clear) { bindValues(); builder.sqlStatement(); @@ -80,7 +80,7 @@ TEST_F(CreateTableSqlStatementBuilder, NoSqlStatementAfterClear) ASSERT_THROW(builder.sqlStatement(), SqlStatementBuilderException); } -TEST_F(CreateTableSqlStatementBuilder, SqlStatement) +TEST_F(CreateTableSqlStatementBuilder, sql_statement) { bindValues(); @@ -88,7 +88,7 @@ TEST_F(CreateTableSqlStatementBuilder, SqlStatement) "CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT, number NUMERIC)"); } -TEST_F(CreateTableSqlStatementBuilder, AddColumnToExistingColumns) +TEST_F(CreateTableSqlStatementBuilder, add_column_to_existing_columns) { bindValues(); @@ -98,7 +98,7 @@ TEST_F(CreateTableSqlStatementBuilder, AddColumnToExistingColumns) "CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT, number NUMERIC, number2 REAL)"); } -TEST_F(CreateTableSqlStatementBuilder, ChangeTable) +TEST_F(CreateTableSqlStatementBuilder, change_table) { bindValues(); @@ -108,7 +108,7 @@ TEST_F(CreateTableSqlStatementBuilder, ChangeTable) "CREATE TABLE test2(id INTEGER PRIMARY KEY, name TEXT, number NUMERIC)"); } -TEST_F(CreateTableSqlStatementBuilder, IsInvalidAfterClearColumsOnly) +TEST_F(CreateTableSqlStatementBuilder, is_invalid_after_clear_colums_only) { bindValues(); builder.sqlStatement(); @@ -118,7 +118,7 @@ TEST_F(CreateTableSqlStatementBuilder, IsInvalidAfterClearColumsOnly) ASSERT_THROW(builder.sqlStatement(), SqlStatementBuilderException); } -TEST_F(CreateTableSqlStatementBuilder, ClearColumnsAndAddColumnNewColumns) +TEST_F(CreateTableSqlStatementBuilder, clear_columns_and_add_column_new_columns) { bindValues(); builder.clearColumns(); @@ -130,7 +130,7 @@ TEST_F(CreateTableSqlStatementBuilder, ClearColumnsAndAddColumnNewColumns) "CREATE TABLE test(name3 TEXT, number3 REAL)"); } -TEST_F(CreateTableSqlStatementBuilder, SetWitoutRowId) +TEST_F(CreateTableSqlStatementBuilder, set_witout_row_id) { bindValues(); @@ -140,7 +140,7 @@ TEST_F(CreateTableSqlStatementBuilder, SetWitoutRowId) "CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT, number NUMERIC) WITHOUT ROWID"); } -TEST_F(CreateTableSqlStatementBuilder, SetColumnDefinitions) +TEST_F(CreateTableSqlStatementBuilder, set_column_definitions) { builder.setTableName("test"); @@ -150,7 +150,7 @@ TEST_F(CreateTableSqlStatementBuilder, SetColumnDefinitions) "CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT, number NUMERIC)"); } -TEST_F(CreateTableSqlStatementBuilder, UniqueContraint) +TEST_F(CreateTableSqlStatementBuilder, unique_contraint) { builder.setTableName("test"); @@ -160,7 +160,7 @@ TEST_F(CreateTableSqlStatementBuilder, UniqueContraint) "CREATE TABLE test(id INTEGER UNIQUE)"); } -TEST_F(CreateTableSqlStatementBuilder, IfNotExitsModifier) +TEST_F(CreateTableSqlStatementBuilder, if_not_exits_modifier) { builder.setTableName("test"); builder.addColumn("id", ColumnType::Integer, {}); @@ -171,7 +171,7 @@ TEST_F(CreateTableSqlStatementBuilder, IfNotExitsModifier) "CREATE TABLE IF NOT EXISTS test(id INTEGER)"); } -TEST_F(CreateTableSqlStatementBuilder, TemporaryTable) +TEST_F(CreateTableSqlStatementBuilder, temporary_table) { builder.setTableName("test"); builder.addColumn("id", ColumnType::Integer, {}); @@ -182,7 +182,7 @@ TEST_F(CreateTableSqlStatementBuilder, TemporaryTable) "CREATE TEMPORARY TABLE test(id INTEGER)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyWithoutColumn) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_without_column) { builder.setTableName("test"); @@ -191,7 +191,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyWithoutColumn) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER REFERENCES otherTable)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyWithColumn) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_with_column) { builder.setTableName("test"); @@ -201,7 +201,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyWithColumn) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn))"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateNoAction) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_update_no_action) { builder.setTableName("test"); @@ -211,7 +211,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateNoAction) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn))"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateRestrict) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_update_restrict) { builder.setTableName("test"); @@ -224,7 +224,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateRestrict) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn) ON UPDATE RESTRICT)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateSetNull) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_update_set_null) { builder.setTableName("test"); @@ -237,7 +237,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateSetNull) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn) ON UPDATE SET NULL)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateSetDefault) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_update_set_default) { builder.setTableName("test"); @@ -250,7 +250,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateSetDefault) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn) ON UPDATE SET DEFAULT)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateCascade) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_update_cascade) { builder.setTableName("test"); @@ -263,7 +263,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyUpdateCascade) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn) ON UPDATE CASCADE)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteNoAction) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_delete_no_action) { builder.setTableName("test"); @@ -273,7 +273,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteNoAction) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn))"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteRestrict) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_delete_restrict) { builder.setTableName("test"); @@ -286,7 +286,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteRestrict) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn) ON DELETE RESTRICT)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteSetNull) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_delete_set_null) { builder.setTableName("test"); @@ -299,7 +299,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteSetNull) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn) ON DELETE SET NULL)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteSetDefault) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_delete_set_default) { builder.setTableName("test"); @@ -312,7 +312,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteSetDefault) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn) ON DELETE SET DEFAULT)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteCascade) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_delete_cascade) { builder.setTableName("test"); @@ -325,7 +325,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteCascade) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn) ON DELETE CASCADE)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteAndUpdateAction) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_delete_and_update_action) { builder.setTableName("test"); @@ -341,7 +341,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeleteAndUpdateAction) "DEFAULT ON DELETE CASCADE)"); } -TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeferred) +TEST_F(CreateTableSqlStatementBuilder, foreign_key_deferred) { builder.setTableName("test"); @@ -358,7 +358,7 @@ TEST_F(CreateTableSqlStatementBuilder, ForeignKeyDeferred) "DEFAULT ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)"); } -TEST_F(CreateTableSqlStatementBuilder, NotNullConstraint) +TEST_F(CreateTableSqlStatementBuilder, not_null_constraint) { builder.setTableName("test"); @@ -367,7 +367,7 @@ TEST_F(CreateTableSqlStatementBuilder, NotNullConstraint) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER NOT NULL)"); } -TEST_F(CreateTableSqlStatementBuilder, NotNullAndUniqueConstraint) +TEST_F(CreateTableSqlStatementBuilder, not_null_and_unique_constraint) { builder.setTableName("test"); @@ -376,7 +376,7 @@ TEST_F(CreateTableSqlStatementBuilder, NotNullAndUniqueConstraint) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER UNIQUE NOT NULL)"); } -TEST_F(CreateTableSqlStatementBuilder, Check) +TEST_F(CreateTableSqlStatementBuilder, check) { builder.setTableName("test"); @@ -385,7 +385,7 @@ TEST_F(CreateTableSqlStatementBuilder, Check) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id TEXT CHECK (id != ''))"); } -TEST_F(CreateTableSqlStatementBuilder, DefaultValueInt) +TEST_F(CreateTableSqlStatementBuilder, default_value_int) { builder.setTableName("test"); @@ -394,7 +394,7 @@ TEST_F(CreateTableSqlStatementBuilder, DefaultValueInt) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER DEFAULT 1)"); } -TEST_F(CreateTableSqlStatementBuilder, DefaultValueFloat) +TEST_F(CreateTableSqlStatementBuilder, default_value_float) { builder.setTableName("test"); @@ -403,7 +403,7 @@ TEST_F(CreateTableSqlStatementBuilder, DefaultValueFloat) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id REAL DEFAULT 1.100000)"); } -TEST_F(CreateTableSqlStatementBuilder, DefaultValueString) +TEST_F(CreateTableSqlStatementBuilder, default_value_string) { builder.setTableName("test"); @@ -412,7 +412,7 @@ TEST_F(CreateTableSqlStatementBuilder, DefaultValueString) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id TEXT DEFAULT 'foo')"); } -TEST_F(CreateTableSqlStatementBuilder, DefaultExpression) +TEST_F(CreateTableSqlStatementBuilder, default_expression) { builder.setTableName("test"); @@ -424,7 +424,7 @@ TEST_F(CreateTableSqlStatementBuilder, DefaultExpression) "CREATE TABLE test(id INTEGER DEFAULT (SELECT name FROM foo WHERE id=?))"); } -TEST_F(CreateTableSqlStatementBuilder, Collation) +TEST_F(CreateTableSqlStatementBuilder, collation) { builder.setTableName("test"); @@ -433,7 +433,7 @@ TEST_F(CreateTableSqlStatementBuilder, Collation) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id TEXT COLLATE unicode)"); } -TEST_F(CreateTableSqlStatementBuilder, GeneratedAlwaysStored) +TEST_F(CreateTableSqlStatementBuilder, generated_always_stored) { builder.setTableName("test"); @@ -447,7 +447,7 @@ TEST_F(CreateTableSqlStatementBuilder, GeneratedAlwaysStored) "CREATE TABLE test(id TEXT GENERATED ALWAYS AS (SELECT name FROM foo WHERE id=?) STORED)"); } -TEST_F(CreateTableSqlStatementBuilder, GeneratedAlwaysVirtual) +TEST_F(CreateTableSqlStatementBuilder, generated_always_virtual) { builder.setTableName("test"); @@ -461,7 +461,7 @@ TEST_F(CreateTableSqlStatementBuilder, GeneratedAlwaysVirtual) "VIRTUAL)"); } -TEST_F(CreateTableSqlStatementBuilder, PrimaryKeyAutoincrement) +TEST_F(CreateTableSqlStatementBuilder, primary_key_autoincrement) { builder.setTableName("test"); @@ -470,7 +470,7 @@ TEST_F(CreateTableSqlStatementBuilder, PrimaryKeyAutoincrement) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER PRIMARY KEY AUTOINCREMENT)"); } -TEST_F(CreateTableSqlStatementBuilder, BlobType) +TEST_F(CreateTableSqlStatementBuilder, blob_type) { builder.setTableName("test"); @@ -479,7 +479,7 @@ TEST_F(CreateTableSqlStatementBuilder, BlobType) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(data BLOB)"); } -TEST_F(CreateTableSqlStatementBuilder, TablePrimaryKeyConstaint) +TEST_F(CreateTableSqlStatementBuilder, table_primary_key_constaint) { builder.setTableName("test"); builder.addColumn("id", ColumnType::Integer); @@ -491,7 +491,7 @@ TEST_F(CreateTableSqlStatementBuilder, TablePrimaryKeyConstaint) ASSERT_THAT(statement, "CREATE TABLE test(id INTEGER, text TEXT, PRIMARY KEY(id, text))"); } -TEST_F(CreateTableSqlStatementBuilder, NoneColumnTypeStringConversion) +TEST_F(CreateTableSqlStatementBuilder, none_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", ColumnType::None); @@ -501,7 +501,7 @@ TEST_F(CreateTableSqlStatementBuilder, NoneColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id)"); } -TEST_F(CreateTableSqlStatementBuilder, NumericColumnTypeStringConversion) +TEST_F(CreateTableSqlStatementBuilder, numeric_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", ColumnType::Numeric); @@ -511,7 +511,7 @@ TEST_F(CreateTableSqlStatementBuilder, NumericColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id NUMERIC)"); } -TEST_F(CreateTableSqlStatementBuilder, IntegerColumnTypeStringConversion) +TEST_F(CreateTableSqlStatementBuilder, integer_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", ColumnType::Integer); @@ -521,7 +521,7 @@ TEST_F(CreateTableSqlStatementBuilder, IntegerColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id INTEGER)"); } -TEST_F(CreateTableSqlStatementBuilder, RealColumnTypeStringConversion) +TEST_F(CreateTableSqlStatementBuilder, real_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", ColumnType::Real); @@ -531,7 +531,7 @@ TEST_F(CreateTableSqlStatementBuilder, RealColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id REAL)"); } -TEST_F(CreateTableSqlStatementBuilder, TextColumnTypeStringConversion) +TEST_F(CreateTableSqlStatementBuilder, text_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", ColumnType::Text); @@ -541,7 +541,7 @@ TEST_F(CreateTableSqlStatementBuilder, TextColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id TEXT)"); } -TEST_F(CreateTableSqlStatementBuilder, BlobColumnTypeStringConversion) +TEST_F(CreateTableSqlStatementBuilder, blob_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", ColumnType::Blob); @@ -579,19 +579,19 @@ protected: Sqlite::CreateTableSqlStatementBuilder builder; }; -TEST_F(CreateStrictTableSqlStatementBuilder, IsNotValidAfterCreation) +TEST_F(CreateStrictTableSqlStatementBuilder, is_not_valid_after_creation) { ASSERT_FALSE(builder.isValid()); } -TEST_F(CreateStrictTableSqlStatementBuilder, IsValidAfterBinding) +TEST_F(CreateStrictTableSqlStatementBuilder, is_valid_after_binding) { bindValues(); ASSERT_TRUE(builder.isValid()); } -TEST_F(CreateStrictTableSqlStatementBuilder, InvalidAfterClear) +TEST_F(CreateStrictTableSqlStatementBuilder, invalid_after_clear) { bindValues(); @@ -600,7 +600,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, InvalidAfterClear) ASSERT_TRUE(!builder.isValid()); } -TEST_F(CreateStrictTableSqlStatementBuilder, NoSqlStatementAfterClear) +TEST_F(CreateStrictTableSqlStatementBuilder, no_sql_statement_after_clear) { bindValues(); builder.sqlStatement(); @@ -610,7 +610,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, NoSqlStatementAfterClear) ASSERT_THROW(builder.sqlStatement(), SqlStatementBuilderException); } -TEST_F(CreateStrictTableSqlStatementBuilder, SqlStatement) +TEST_F(CreateStrictTableSqlStatementBuilder, sql_statement) { bindValues(); @@ -618,7 +618,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, SqlStatement) "CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT, number ANY) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, AddColumnToExistingColumns) +TEST_F(CreateStrictTableSqlStatementBuilder, add_column_to_existing_columns) { bindValues(); @@ -629,7 +629,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, AddColumnToExistingColumns) "CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT, number ANY, number2 REAL) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ChangeTable) +TEST_F(CreateStrictTableSqlStatementBuilder, change_table) { bindValues(); @@ -639,7 +639,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ChangeTable) "CREATE TABLE test2(id INTEGER PRIMARY KEY, name TEXT, number ANY) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, IsInvalidAfterClearColumsOnly) +TEST_F(CreateStrictTableSqlStatementBuilder, is_invalid_after_clear_colums_only) { bindValues(); builder.sqlStatement(); @@ -649,7 +649,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, IsInvalidAfterClearColumsOnly) ASSERT_THROW(builder.sqlStatement(), SqlStatementBuilderException); } -TEST_F(CreateStrictTableSqlStatementBuilder, ClearColumnsAndAddColumnNewColumns) +TEST_F(CreateStrictTableSqlStatementBuilder, clear_columns_and_add_column_new_columns) { bindValues(); builder.clearColumns(); @@ -660,7 +660,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ClearColumnsAndAddColumnNewColumns) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(name3 TEXT, number3 REAL) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, SetWitoutRowId) +TEST_F(CreateStrictTableSqlStatementBuilder, set_witout_row_id) { bindValues(); @@ -671,7 +671,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, SetWitoutRowId) "CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT, number ANY) WITHOUT ROWID, STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, SetColumnDefinitions) +TEST_F(CreateStrictTableSqlStatementBuilder, set_column_definitions) { builder.setTableName("test"); @@ -681,7 +681,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, SetColumnDefinitions) "CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT, number ANY) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, UniqueContraint) +TEST_F(CreateStrictTableSqlStatementBuilder, unique_contraint) { builder.setTableName("test"); @@ -690,7 +690,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, UniqueContraint) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER UNIQUE) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, IfNotExitsModifier) +TEST_F(CreateStrictTableSqlStatementBuilder, if_not_exits_modifier) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Integer, {}); @@ -700,7 +700,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, IfNotExitsModifier) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE IF NOT EXISTS test(id INTEGER) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, TemporaryTable) +TEST_F(CreateStrictTableSqlStatementBuilder, temporary_table) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Integer, {}); @@ -710,7 +710,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, TemporaryTable) ASSERT_THAT(builder.sqlStatement(), "CREATE TEMPORARY TABLE test(id INTEGER) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyWithoutColumn) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_without_column) { builder.setTableName("test"); @@ -719,7 +719,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyWithoutColumn) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER REFERENCES otherTable) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyWithColumn) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_with_column) { builder.setTableName("test"); @@ -729,7 +729,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyWithColumn) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn)) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateNoAction) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_update_no_action) { builder.setTableName("test"); @@ -739,7 +739,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateNoAction) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn)) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateRestrict) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_update_restrict) { builder.setTableName("test"); @@ -752,7 +752,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateRestrict) "RESTRICT) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateSetNull) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_update_set_null) { builder.setTableName("test"); @@ -765,7 +765,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateSetNull) "NULL) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateSetDefault) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_update_set_default) { builder.setTableName("test"); @@ -778,7 +778,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateSetDefault) "DEFAULT) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateCascade) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_update_cascade) { builder.setTableName("test"); @@ -791,7 +791,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyUpdateCascade) "CASCADE) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteNoAction) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_delete_no_action) { builder.setTableName("test"); @@ -801,7 +801,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteNoAction) "CREATE TABLE test(id INTEGER REFERENCES otherTable(otherColumn)) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteRestrict) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_delete_restrict) { builder.setTableName("test"); @@ -814,7 +814,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteRestrict) "RESTRICT) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteSetNull) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_delete_set_null) { builder.setTableName("test"); @@ -827,7 +827,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteSetNull) "NULL) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteSetDefault) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_delete_set_default) { builder.setTableName("test"); @@ -840,7 +840,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteSetDefault) "DEFAULT) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteCascade) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_delete_cascade) { builder.setTableName("test"); @@ -853,7 +853,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteCascade) "CASCADE) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteAndUpdateAction) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_delete_and_update_action) { builder.setTableName("test"); @@ -869,7 +869,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeleteAndUpdateAction) "DEFAULT ON DELETE CASCADE) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeferred) +TEST_F(CreateStrictTableSqlStatementBuilder, foreign_key_deferred) { builder.setTableName("test"); @@ -886,7 +886,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, ForeignKeyDeferred) "DEFAULT ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, NotNullConstraint) +TEST_F(CreateStrictTableSqlStatementBuilder, not_null_constraint) { builder.setTableName("test"); @@ -895,7 +895,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, NotNullConstraint) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER NOT NULL) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, NotNullAndUniqueConstraint) +TEST_F(CreateStrictTableSqlStatementBuilder, not_null_and_unique_constraint) { builder.setTableName("test"); @@ -904,7 +904,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, NotNullAndUniqueConstraint) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER UNIQUE NOT NULL) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, Check) +TEST_F(CreateStrictTableSqlStatementBuilder, check) { builder.setTableName("test"); @@ -913,7 +913,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, Check) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id TEXT CHECK (id != '')) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, DefaultValueInt) +TEST_F(CreateStrictTableSqlStatementBuilder, default_value_int) { builder.setTableName("test"); @@ -922,7 +922,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, DefaultValueInt) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id INTEGER DEFAULT 1) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, DefaultValueFloat) +TEST_F(CreateStrictTableSqlStatementBuilder, default_value_float) { builder.setTableName("test"); @@ -931,7 +931,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, DefaultValueFloat) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id REAL DEFAULT 1.100000) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, DefaultValueString) +TEST_F(CreateStrictTableSqlStatementBuilder, default_value_string) { builder.setTableName("test"); @@ -940,7 +940,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, DefaultValueString) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id TEXT DEFAULT 'foo') STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, DefaultExpression) +TEST_F(CreateStrictTableSqlStatementBuilder, default_expression) { builder.setTableName("test"); @@ -952,7 +952,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, DefaultExpression) "CREATE TABLE test(id INTEGER DEFAULT (SELECT name FROM foo WHERE id=?)) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, Collation) +TEST_F(CreateStrictTableSqlStatementBuilder, collation) { builder.setTableName("test"); @@ -961,7 +961,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, Collation) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id TEXT COLLATE unicode) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, GeneratedAlwaysStored) +TEST_F(CreateStrictTableSqlStatementBuilder, generated_always_stored) { builder.setTableName("test"); @@ -975,7 +975,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, GeneratedAlwaysStored) "STORED) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, GeneratedAlwaysVirtual) +TEST_F(CreateStrictTableSqlStatementBuilder, generated_always_virtual) { builder.setTableName("test"); @@ -989,7 +989,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, GeneratedAlwaysVirtual) "VIRTUAL) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, PrimaryKeyAutoincrement) +TEST_F(CreateStrictTableSqlStatementBuilder, primary_key_autoincrement) { builder.setTableName("test"); @@ -1001,7 +1001,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, PrimaryKeyAutoincrement) "CREATE TABLE test(id INTEGER PRIMARY KEY AUTOINCREMENT) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, BlobType) +TEST_F(CreateStrictTableSqlStatementBuilder, blob_type) { builder.setTableName("test"); @@ -1010,7 +1010,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, BlobType) ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(data BLOB) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, TablePrimaryKeyConstaint) +TEST_F(CreateStrictTableSqlStatementBuilder, table_primary_key_constaint) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Integer); @@ -1022,7 +1022,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, TablePrimaryKeyConstaint) ASSERT_THAT(statement, "CREATE TABLE test(id INTEGER, text TEXT, PRIMARY KEY(id, text)) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, AnyColumnTypeStringConversion) +TEST_F(CreateStrictTableSqlStatementBuilder, any_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Any); @@ -1032,7 +1032,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, AnyColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id ANY) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, IntColumnTypeStringConversion) +TEST_F(CreateStrictTableSqlStatementBuilder, int_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Int); @@ -1042,7 +1042,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, IntColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id INT) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, IntegerColumnTypeStringConversion) +TEST_F(CreateStrictTableSqlStatementBuilder, integer_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Integer); @@ -1052,7 +1052,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, IntegerColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id INTEGER) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, RealColumnTypeStringConversion) +TEST_F(CreateStrictTableSqlStatementBuilder, real_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Real); @@ -1062,7 +1062,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, RealColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id REAL) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, TextColumnTypeStringConversion) +TEST_F(CreateStrictTableSqlStatementBuilder, text_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Text); @@ -1072,7 +1072,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, TextColumnTypeStringConversion) ASSERT_THAT(statement, "CREATE TABLE test(id TEXT) STRICT"); } -TEST_F(CreateStrictTableSqlStatementBuilder, BlobColumnTypeStringConversion) +TEST_F(CreateStrictTableSqlStatementBuilder, blob_column_type_string_conversion) { builder.setTableName("test"); builder.addColumn("id", StrictColumnType::Blob); diff --git a/tests/unit/tests/unittests/sqlite/lastchangedrowid-test.cpp b/tests/unit/tests/unittests/sqlite/lastchangedrowid-test.cpp index fc2d03fada4..cadada2c9f2 100644 --- a/tests/unit/tests/unittests/sqlite/lastchangedrowid-test.cpp +++ b/tests/unit/tests/unittests/sqlite/lastchangedrowid-test.cpp @@ -16,31 +16,31 @@ protected: Sqlite::LastChangedRowId<1> lastRowId{mockSqliteDatabase, "main", "foo"}; }; -TEST_F(LastChangedRowId, SetUpdateHookInContructor) +TEST_F(LastChangedRowId, set_update_hook_in_contructor) { EXPECT_CALL(mockSqliteDatabase, setUpdateHook(_, _)); Sqlite::LastChangedRowId<1> lastRowId{mockSqliteDatabase, "main", "foo"}; } -TEST_F(LastChangedRowId, ResetUpdateHookInDestructor) +TEST_F(LastChangedRowId, reset_update_hook_in_destructor) { EXPECT_CALL(mockSqliteDatabase, resetUpdateHook()); } -TEST_F(LastChangedRowId, GetMinusOneAsRowIdIfNoCallbackWasCalled) +TEST_F(LastChangedRowId, get_minus_one_as_row_id_if_no_callback_was_called) { ASSERT_THAT(lastRowId.lastRowId, -1); } -TEST_F(LastChangedRowId, CallbackSetsLastRowId) +TEST_F(LastChangedRowId, callback_sets_last_row_id) { lastRowId("main", "foo", 42); ASSERT_THAT(lastRowId.lastRowId, 42); } -TEST_F(LastChangedRowId, CallbackChecksDatabaseName) +TEST_F(LastChangedRowId, callback_checks_database_name) { lastRowId("main", "foo", 33); @@ -49,7 +49,7 @@ TEST_F(LastChangedRowId, CallbackChecksDatabaseName) ASSERT_THAT(lastRowId.lastRowId, 33); } -TEST_F(LastChangedRowId, CallbackChecksTableName) +TEST_F(LastChangedRowId, callback_checks_table_name) { lastRowId("main", "foo", 33); @@ -58,7 +58,7 @@ TEST_F(LastChangedRowId, CallbackChecksTableName) ASSERT_THAT(lastRowId.lastRowId, 33); } -TEST_F(LastChangedRowId, LastCallSetsRowId) +TEST_F(LastChangedRowId, last_call_sets_row_id) { lastRowId("main", "foo", 42); lastRowId("main", "foo", 33); @@ -68,7 +68,7 @@ TEST_F(LastChangedRowId, LastCallSetsRowId) ASSERT_THAT(lastRowId.lastRowId, 66); } -TEST_F(LastChangedRowId, TakeLastRowId) +TEST_F(LastChangedRowId, take_last_row_id) { lastRowId("main", "foo", 42); @@ -77,7 +77,7 @@ TEST_F(LastChangedRowId, TakeLastRowId) ASSERT_THAT(id, 42); } -TEST_F(LastChangedRowId, TakeLastRowIdResetsRowIdToMinusOne) +TEST_F(LastChangedRowId, take_last_row_id_resets_row_id_to_minus_one) { lastRowId("main", "foo", 42); lastRowId.takeLastRowId(); @@ -95,38 +95,38 @@ protected: Sqlite::LastChangedRowId<2> lastRowId{mockSqliteDatabase, "main", "foo", "bar"}; }; -TEST_F(LastChangedRowIdWithTwoTables, SetUpdateHookInContructor) +TEST_F(LastChangedRowIdWithTwoTables, set_update_hook_in_contructor) { EXPECT_CALL(mockSqliteDatabase, setUpdateHook(_, _)); Sqlite::LastChangedRowId<2> lastRowId{mockSqliteDatabase, "main", "foo", "bar"}; } -TEST_F(LastChangedRowIdWithTwoTables, ResetUpdateHookInDestructor) +TEST_F(LastChangedRowIdWithTwoTables, reset_update_hook_in_destructor) { EXPECT_CALL(mockSqliteDatabase, resetUpdateHook()); } -TEST_F(LastChangedRowIdWithTwoTables, GetMinusOneAsRowIdIfNoCallbackWasCalled) +TEST_F(LastChangedRowIdWithTwoTables, get_minus_one_as_row_id_if_no_callback_was_called) { ASSERT_THAT(lastRowId.lastRowId, -1); } -TEST_F(LastChangedRowIdWithTwoTables, CallbackSetsLastRowIdFirstTable) +TEST_F(LastChangedRowIdWithTwoTables, callback_sets_last_row_id_first_table) { lastRowId("main", "foo", 42); ASSERT_THAT(lastRowId.lastRowId, 42); } -TEST_F(LastChangedRowIdWithTwoTables, CallbackSetsLastRowIdSecondTable) +TEST_F(LastChangedRowIdWithTwoTables, callback_sets_last_row_id_second_table) { lastRowId("main", "bar", 66); ASSERT_THAT(lastRowId.lastRowId, 66); } -TEST_F(LastChangedRowIdWithTwoTables, CallbackChecksDatabaseName) +TEST_F(LastChangedRowIdWithTwoTables, callback_checks_database_name) { lastRowId("main", "foo", 33); @@ -135,7 +135,7 @@ TEST_F(LastChangedRowIdWithTwoTables, CallbackChecksDatabaseName) ASSERT_THAT(lastRowId.lastRowId, 33); } -TEST_F(LastChangedRowIdWithTwoTables, CallbackChecksTableName) +TEST_F(LastChangedRowIdWithTwoTables, callback_checks_table_name) { lastRowId("main", "foo", 33); @@ -144,7 +144,7 @@ TEST_F(LastChangedRowIdWithTwoTables, CallbackChecksTableName) ASSERT_THAT(lastRowId.lastRowId, 33); } -TEST_F(LastChangedRowIdWithTwoTables, LastCallSetsRowId) +TEST_F(LastChangedRowIdWithTwoTables, last_call_sets_row_id) { lastRowId("main", "foo", 42); @@ -153,7 +153,7 @@ TEST_F(LastChangedRowIdWithTwoTables, LastCallSetsRowId) ASSERT_THAT(lastRowId.lastRowId, 66); } -TEST_F(LastChangedRowIdWithTwoTables, TakeLastRowId) +TEST_F(LastChangedRowIdWithTwoTables, take_last_row_id) { lastRowId("main", "foo", 42); @@ -162,7 +162,7 @@ TEST_F(LastChangedRowIdWithTwoTables, TakeLastRowId) ASSERT_THAT(id, 42); } -TEST_F(LastChangedRowIdWithTwoTables, TakeLastRowIdResetsRowIdToMinusOne) +TEST_F(LastChangedRowIdWithTwoTables, take_last_row_id_resets_row_id_to_minus_one) { lastRowId("main", "foo", 42); lastRowId.takeLastRowId(); @@ -180,45 +180,45 @@ protected: Sqlite::LastChangedRowId<3> lastRowId{mockSqliteDatabase, "main", "foo", "bar", "too"}; }; -TEST_F(LastChangedRowIdWithThreeTables, SetUpdateHookInContructor) +TEST_F(LastChangedRowIdWithThreeTables, set_update_hook_in_contructor) { EXPECT_CALL(mockSqliteDatabase, setUpdateHook(_, _)); Sqlite::LastChangedRowId<3> lastRowId{mockSqliteDatabase, "main", "foo", "bar", "too"}; } -TEST_F(LastChangedRowIdWithThreeTables, ResetUpdateHookInDestructor) +TEST_F(LastChangedRowIdWithThreeTables, reset_update_hook_in_destructor) { EXPECT_CALL(mockSqliteDatabase, resetUpdateHook()); } -TEST_F(LastChangedRowIdWithThreeTables, GetMinusOneAsRowIdIfNoCallbackWasCalled) +TEST_F(LastChangedRowIdWithThreeTables, get_minus_one_as_row_id_if_no_callback_was_called) { ASSERT_THAT(lastRowId.lastRowId, -1); } -TEST_F(LastChangedRowIdWithThreeTables, CallbackSetsLastRowIdFirstTable) +TEST_F(LastChangedRowIdWithThreeTables, callback_sets_last_row_id_first_table) { lastRowId("main", "foo", 42); ASSERT_THAT(lastRowId.lastRowId, 42); } -TEST_F(LastChangedRowIdWithThreeTables, CallbackSetsLastRowIdSecondTable) +TEST_F(LastChangedRowIdWithThreeTables, callback_sets_last_row_id_second_table) { lastRowId("main", "bar", 42); ASSERT_THAT(lastRowId.lastRowId, 42); } -TEST_F(LastChangedRowIdWithThreeTables, CallbackSetsLastRowIdThirdTable) +TEST_F(LastChangedRowIdWithThreeTables, callback_sets_last_row_id_third_table) { lastRowId("main", "too", 42); ASSERT_THAT(lastRowId.lastRowId, 42); } -TEST_F(LastChangedRowIdWithThreeTables, CallbackChecksDatabaseName) +TEST_F(LastChangedRowIdWithThreeTables, callback_checks_database_name) { lastRowId("main", "foo", 33); @@ -227,7 +227,7 @@ TEST_F(LastChangedRowIdWithThreeTables, CallbackChecksDatabaseName) ASSERT_THAT(lastRowId.lastRowId, 33); } -TEST_F(LastChangedRowIdWithThreeTables, CallbackChecksTableName) +TEST_F(LastChangedRowIdWithThreeTables, callback_checks_table_name) { lastRowId("main", "foo", 33); @@ -236,7 +236,7 @@ TEST_F(LastChangedRowIdWithThreeTables, CallbackChecksTableName) ASSERT_THAT(lastRowId.lastRowId, 33); } -TEST_F(LastChangedRowIdWithThreeTables, LastCallSetsRowId) +TEST_F(LastChangedRowIdWithThreeTables, last_call_sets_row_id) { lastRowId("main", "bar", 42); lastRowId("main", "too", 33); @@ -246,7 +246,7 @@ TEST_F(LastChangedRowIdWithThreeTables, LastCallSetsRowId) ASSERT_THAT(lastRowId.lastRowId, 66); } -TEST_F(LastChangedRowIdWithThreeTables, TakeLastRowId) +TEST_F(LastChangedRowIdWithThreeTables, take_last_row_id) { lastRowId("main", "foo", 42); @@ -255,7 +255,7 @@ TEST_F(LastChangedRowIdWithThreeTables, TakeLastRowId) ASSERT_THAT(id, 42); } -TEST_F(LastChangedRowIdWithThreeTables, TakeLastRowIdResetsRowIdToMinusOne) +TEST_F(LastChangedRowIdWithThreeTables, take_last_row_id_resets_row_id_to_minus_one) { lastRowId("main", "foo", 42); lastRowId.takeLastRowId(); @@ -272,31 +272,31 @@ protected: Sqlite::LastChangedRowId<> lastRowId{mockSqliteDatabase}; }; -TEST_F(LastChangedRowIdWithNoDatabaseAndTable, SetUpdateHookInContructor) +TEST_F(LastChangedRowIdWithNoDatabaseAndTable, set_update_hook_in_contructor) { EXPECT_CALL(mockSqliteDatabase, setUpdateHook(_, _)); Sqlite::LastChangedRowId<> lastRowId{mockSqliteDatabase}; } -TEST_F(LastChangedRowIdWithNoDatabaseAndTable, ResetUpdateHookInDestructor) +TEST_F(LastChangedRowIdWithNoDatabaseAndTable, reset_update_hook_in_destructor) { EXPECT_CALL(mockSqliteDatabase, resetUpdateHook()); } -TEST_F(LastChangedRowIdWithNoDatabaseAndTable, GetMinusOneAsRowIdIfNoCallbackWasCalled) +TEST_F(LastChangedRowIdWithNoDatabaseAndTable, get_minus_one_as_row_id_if_no_callback_was_called) { ASSERT_THAT(lastRowId.lastRowId, -1); } -TEST_F(LastChangedRowIdWithNoDatabaseAndTable, CallbackSetsLastRowId) +TEST_F(LastChangedRowIdWithNoDatabaseAndTable, callback_sets_last_row_id) { lastRowId(42); ASSERT_THAT(lastRowId.lastRowId, 42); } -TEST_F(LastChangedRowIdWithNoDatabaseAndTable, LastCallSetsRowId) +TEST_F(LastChangedRowIdWithNoDatabaseAndTable, last_call_sets_row_id) { lastRowId(42); lastRowId(33); @@ -306,7 +306,7 @@ TEST_F(LastChangedRowIdWithNoDatabaseAndTable, LastCallSetsRowId) ASSERT_THAT(lastRowId.lastRowId, 66); } -TEST_F(LastChangedRowIdWithNoDatabaseAndTable, TakeLastRowId) +TEST_F(LastChangedRowIdWithNoDatabaseAndTable, take_last_row_id) { lastRowId(42); @@ -315,7 +315,7 @@ TEST_F(LastChangedRowIdWithNoDatabaseAndTable, TakeLastRowId) ASSERT_THAT(id, 42); } -TEST_F(LastChangedRowIdWithNoDatabaseAndTable, TakeLastRowIdResetsRowIdToMinusOne) +TEST_F(LastChangedRowIdWithNoDatabaseAndTable, take_last_row_id_resets_row_id_to_minus_one) { lastRowId(42); lastRowId.takeLastRowId(); @@ -332,31 +332,31 @@ protected: Sqlite::LastChangedRowId<> lastRowId{mockSqliteDatabase, "main"}; }; -TEST_F(LastChangedRowIdWithNoTable, SetUpdateHookInContructor) +TEST_F(LastChangedRowIdWithNoTable, set_update_hook_in_contructor) { EXPECT_CALL(mockSqliteDatabase, setUpdateHook(_, _)); Sqlite::LastChangedRowId<> lastRowId{mockSqliteDatabase, "main"}; } -TEST_F(LastChangedRowIdWithNoTable, ResetUpdateHookInDestructor) +TEST_F(LastChangedRowIdWithNoTable, reset_update_hook_in_destructor) { EXPECT_CALL(mockSqliteDatabase, resetUpdateHook()); } -TEST_F(LastChangedRowIdWithNoTable, GetMinusOneAsRowIdIfNoCallbackWasCalled) +TEST_F(LastChangedRowIdWithNoTable, get_minus_one_as_row_id_if_no_callback_was_called) { ASSERT_THAT(lastRowId.lastRowId, -1); } -TEST_F(LastChangedRowIdWithNoTable, CallbackSetsLastRowId) +TEST_F(LastChangedRowIdWithNoTable, callback_sets_last_row_id) { lastRowId("main", 42); ASSERT_THAT(lastRowId.lastRowId, 42); } -TEST_F(LastChangedRowIdWithNoTable, CallbackChecksDatabaseName) +TEST_F(LastChangedRowIdWithNoTable, callback_checks_database_name) { lastRowId("main", 33); @@ -365,7 +365,7 @@ TEST_F(LastChangedRowIdWithNoTable, CallbackChecksDatabaseName) ASSERT_THAT(lastRowId.lastRowId, 33); } -TEST_F(LastChangedRowIdWithNoTable, LastCallSetsRowId) +TEST_F(LastChangedRowIdWithNoTable, last_call_sets_row_id) { lastRowId("main", 42); lastRowId("main", 33); @@ -375,7 +375,7 @@ TEST_F(LastChangedRowIdWithNoTable, LastCallSetsRowId) ASSERT_THAT(lastRowId.lastRowId, 66); } -TEST_F(LastChangedRowIdWithNoTable, TakeLastRowId) +TEST_F(LastChangedRowIdWithNoTable, take_last_row_id) { lastRowId("main", 42); @@ -384,7 +384,7 @@ TEST_F(LastChangedRowIdWithNoTable, TakeLastRowId) ASSERT_THAT(id, 42); } -TEST_F(LastChangedRowIdWithNoTable, TakeLastRowIdResetsRowIdToMinusOne) +TEST_F(LastChangedRowIdWithNoTable, take_last_row_id_resets_row_id_to_minus_one) { lastRowId("main", 42); lastRowId.takeLastRowId(); @@ -394,14 +394,14 @@ TEST_F(LastChangedRowIdWithNoTable, TakeLastRowIdResetsRowIdToMinusOne) ASSERT_THAT(id, -1); } -TEST_F(LastChangedRowIdWithNoTable, LastRowIdIsNotValidForNegativeValues) +TEST_F(LastChangedRowIdWithNoTable, last_row_id_is_not_valid_for_negative_values) { auto isValid = lastRowId.lastRowIdIsValid(); ASSERT_FALSE(isValid); } -TEST_F(LastChangedRowIdWithNoTable, LastRowIdIsValidForNull) +TEST_F(LastChangedRowIdWithNoTable, last_row_id_is_valid_for_null) { lastRowId("main", 0); @@ -410,7 +410,7 @@ TEST_F(LastChangedRowIdWithNoTable, LastRowIdIsValidForNull) ASSERT_TRUE(isValid); } -TEST_F(LastChangedRowIdWithNoTable, LastRowIdIsValidForPositiveValues) +TEST_F(LastChangedRowIdWithNoTable, last_row_id_is_valid_for_positive_values) { lastRowId("main", 777); diff --git a/tests/unit/tests/unittests/sqlite/sqlitealgorithms-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitealgorithms-test.cpp index e9adde292b6..a29a552ce59 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitealgorithms-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitealgorithms-test.cpp @@ -112,7 +112,7 @@ auto compareKey = [](KeyValueView keyValueView, const KeyValue &keyValue) { return Sqlite::compare(keyValueView.key, keyValue.key); }; -TEST_F(SqliteAlgorithms, InsertValues) +TEST_F(SqliteAlgorithms, insert_values) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}}; @@ -121,7 +121,7 @@ TEST_F(SqliteAlgorithms, InsertValues) ASSERT_THAT(fetchKeyValues(), UnorderedElementsAre(KeyValue{"one", 1}, KeyValue{"oneone", 11})); } -TEST_F(SqliteAlgorithms, InsertBeforeValues) +TEST_F(SqliteAlgorithms, insert_before_values) { KeyValues keyValues = {{"two", 2}, {"twotwo", 22}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -136,7 +136,7 @@ TEST_F(SqliteAlgorithms, InsertBeforeValues) KeyValue{"twotwo", 22})); } -TEST_F(SqliteAlgorithms, InsertInBetweenValues) +TEST_F(SqliteAlgorithms, insert_in_between_values) { KeyValues keyValues = {{"one", 1}, {"two", 2}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -151,7 +151,7 @@ TEST_F(SqliteAlgorithms, InsertInBetweenValues) KeyValue{"twotwo", 22})); } -TEST_F(SqliteAlgorithms, InsertTrailingValues) +TEST_F(SqliteAlgorithms, insert_trailing_values) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -166,7 +166,7 @@ TEST_F(SqliteAlgorithms, InsertTrailingValues) KeyValue{"twotwo", 22})); } -TEST_F(SqliteAlgorithms, UpdateValues) +TEST_F(SqliteAlgorithms, update_values) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -177,7 +177,7 @@ TEST_F(SqliteAlgorithms, UpdateValues) ASSERT_THAT(fetchKeyValues(), UnorderedElementsAre(KeyValue{"one", 2}, KeyValue{"oneone", 22})); } -TEST_F(SqliteAlgorithms, UpdateSomeValues) +TEST_F(SqliteAlgorithms, update_some_values) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}, {"two", 2}, {"twotwo", 22}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -192,7 +192,7 @@ TEST_F(SqliteAlgorithms, UpdateSomeValues) KeyValue{"twotwo", 22})); } -TEST_F(SqliteAlgorithms, DeleteBeforeSqliteEntries) +TEST_F(SqliteAlgorithms, delete_before_sqlite_entries) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}, {"two", 2}, {"twotwo", 22}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -203,7 +203,7 @@ TEST_F(SqliteAlgorithms, DeleteBeforeSqliteEntries) ASSERT_THAT(fetchKeyValues(), UnorderedElementsAre(KeyValue{"two", 2}, KeyValue{"twotwo", 22})); } -TEST_F(SqliteAlgorithms, DeleteTrailingSqliteEntries2) +TEST_F(SqliteAlgorithms, delete_trailing_sqlite_entries2) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}, {"two", 2}, {"twotwo", 22}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -214,7 +214,7 @@ TEST_F(SqliteAlgorithms, DeleteTrailingSqliteEntries2) ASSERT_THAT(fetchKeyValues(), UnorderedElementsAre(KeyValue{"one", 1}, KeyValue{"oneone", 11})); } -TEST_F(SqliteAlgorithms, DeleteTrailingSqliteEntries) +TEST_F(SqliteAlgorithms, delete_trailing_sqlite_entries) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}, {"two", 2}, {"twotwo", 22}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -225,7 +225,7 @@ TEST_F(SqliteAlgorithms, DeleteTrailingSqliteEntries) ASSERT_THAT(fetchKeyValues(), UnorderedElementsAre(KeyValue{"one", 1}, KeyValue{"oneone", 11})); } -TEST_F(SqliteAlgorithms, DeleteSqliteEntries) +TEST_F(SqliteAlgorithms, delete_sqlite_entries) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}, {"two", 2}, {"twotwo", 22}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -236,7 +236,7 @@ TEST_F(SqliteAlgorithms, DeleteSqliteEntries) ASSERT_THAT(fetchKeyValues(), IsEmpty()); } -TEST_F(SqliteAlgorithms, Synchonize) +TEST_F(SqliteAlgorithms, synchonize) { KeyValues keyValues = {{"one", 1}, {"oneone", 11}, {"two", 2}, {"twotwo", 22}}; Sqlite::insertUpdateDelete(select(), keyValues, compareKey, insert, update, remove); @@ -250,28 +250,28 @@ TEST_F(SqliteAlgorithms, Synchonize) KeyValue{"twotwo", 202})); } -TEST_F(SqliteAlgorithms, CompareEqual) +TEST_F(SqliteAlgorithms, compare_equal) { auto compare = Sqlite::compare("one", "one"); ASSERT_THAT(compare, Eq(0)); } -TEST_F(SqliteAlgorithms, CompareGreater) +TEST_F(SqliteAlgorithms, compare_greater) { auto compare = Sqlite::compare("two", "one"); ASSERT_THAT(compare, Gt(0)); } -TEST_F(SqliteAlgorithms, CompareGreaterForTrailingText) +TEST_F(SqliteAlgorithms, compare_greater_for_trailing_text) { auto compare = Sqlite::compare("oneone", "one"); ASSERT_THAT(compare, Gt(0)); } -TEST_F(SqliteAlgorithms, CompareLessForTrailingText) +TEST_F(SqliteAlgorithms, compare_less_for_trailing_text) { auto compare = Sqlite::compare("one", "oneone"); diff --git a/tests/unit/tests/unittests/sqlite/sqlitecolumn-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitecolumn-test.cpp index 924f4359163..f75deb65710 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitecolumn-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitecolumn-test.cpp @@ -24,7 +24,7 @@ protected: Column column; }; -TEST_F(SqliteColumn, DefaultConstruct) +TEST_F(SqliteColumn, default_construct) { ASSERT_THAT(column, AllOf(Field(&Column::name, IsEmpty()), @@ -33,7 +33,7 @@ TEST_F(SqliteColumn, DefaultConstruct) Field(&Column::constraints, IsEmpty()))); } -TEST_F(SqliteColumn, Clear) +TEST_F(SqliteColumn, clear) { column.name = "foo"; column.name = "foo"; @@ -49,7 +49,7 @@ TEST_F(SqliteColumn, Clear) Field(&Column::constraints, IsEmpty()))); } -TEST_F(SqliteColumn, Constructor) +TEST_F(SqliteColumn, constructor) { column = Column{"table", "column", @@ -73,7 +73,7 @@ TEST_F(SqliteColumn, Constructor) Field(&ForeignKey::enforcement, Enforment::Deferred))))))); } -TEST_F(SqliteColumn, FlatConstructor) +TEST_F(SqliteColumn, flat_constructor) { column = Column{"table", "column", @@ -105,7 +105,7 @@ protected: Column column; }; -TEST_F(SqliteStrictColumn, DefaultConstruct) +TEST_F(SqliteStrictColumn, default_construct) { ASSERT_THAT(column, AllOf(Field(&Column::name, IsEmpty()), @@ -114,7 +114,7 @@ TEST_F(SqliteStrictColumn, DefaultConstruct) Field(&Column::constraints, IsEmpty()))); } -TEST_F(SqliteStrictColumn, Clear) +TEST_F(SqliteStrictColumn, clear) { column.name = "foo"; column.name = "foo"; @@ -130,7 +130,7 @@ TEST_F(SqliteStrictColumn, Clear) Field(&Column::constraints, IsEmpty()))); } -TEST_F(SqliteStrictColumn, Constructor) +TEST_F(SqliteStrictColumn, constructor) { column = Column{"table", "column", @@ -154,7 +154,7 @@ TEST_F(SqliteStrictColumn, Constructor) Field(&ForeignKey::enforcement, Enforment::Deferred))))))); } -TEST_F(SqliteStrictColumn, FlatConstructor) +TEST_F(SqliteStrictColumn, flat_constructor) { column = Column{"table", "column", diff --git a/tests/unit/tests/unittests/sqlite/sqlitedatabase-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitedatabase-test.cpp index 7872efa7a11..50b5c012c52 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitedatabase-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitedatabase-test.cpp @@ -70,24 +70,24 @@ protected: std::unique_lock lock{database}; }; -TEST_F(SqliteDatabase, SetDatabaseFilePath) +TEST_F(SqliteDatabase, set_database_file_path) { ASSERT_THAT(database.databaseFilePath(), ":memory:"); } -TEST_F(SqliteDatabase, SetJournalMode) +TEST_F(SqliteDatabase, set_journal_mode) { database.setJournalMode(JournalMode::Memory); ASSERT_THAT(database.journalMode(), JournalMode::Memory); } -TEST_F(SqliteDatabase, LockingModeIsByDefaultExlusive) +TEST_F(SqliteDatabase, locking_mode_is_by_default_exlusive) { ASSERT_THAT(database.lockingMode(), Sqlite::LockingMode::Exclusive); } -TEST_F(SqliteDatabase, CreateDatabaseWithLockingModeNormal) +TEST_F(SqliteDatabase, create_database_with_locking_mode_normal) { Utils::PathString path{Utils::TemporaryDirectory::masterDirectoryPath() + "/database_exclusive_locked.db"}; @@ -98,7 +98,7 @@ TEST_F(SqliteDatabase, CreateDatabaseWithLockingModeNormal) Sqlite::LockingMode::Normal); } -TEST_F(SqliteDatabase, ExclusivelyLockedDatabaseIsLockedForSecondConnection) +TEST_F(SqliteDatabase, exclusively_locked_database_is_locked_for_second_connection) { using namespace std::chrono_literals; Utils::PathString path{Utils::TemporaryDirectory::masterDirectoryPath() @@ -108,7 +108,7 @@ TEST_F(SqliteDatabase, ExclusivelyLockedDatabaseIsLockedForSecondConnection) ASSERT_THROW(Sqlite::Database database2(path, 1ms), Sqlite::StatementIsBusy); } -TEST_F(SqliteDatabase, NormalLockedDatabaseCanBeReopened) +TEST_F(SqliteDatabase, normal_locked_database_can_be_reopened) { Utils::PathString path{Utils::TemporaryDirectory::masterDirectoryPath() + "/database_exclusive_locked.db"}; @@ -117,14 +117,14 @@ TEST_F(SqliteDatabase, NormalLockedDatabaseCanBeReopened) ASSERT_NO_THROW((Sqlite::Database{path, JournalMode::Wal, Sqlite::LockingMode::Normal})); } -TEST_F(SqliteDatabase, SetOpenlMode) +TEST_F(SqliteDatabase, set_openl_mode) { database.setOpenMode(OpenMode::ReadOnly); ASSERT_THAT(database.openMode(), OpenMode::ReadOnly); } -TEST_F(SqliteDatabase, OpenDatabase) +TEST_F(SqliteDatabase, open_database) { database.close(); @@ -133,33 +133,33 @@ TEST_F(SqliteDatabase, OpenDatabase) ASSERT_TRUE(database.isOpen()); } -TEST_F(SqliteDatabase, CloseDatabase) +TEST_F(SqliteDatabase, close_database) { database.close(); ASSERT_FALSE(database.isOpen()); } -TEST_F(SqliteDatabase, DatabaseIsNotInitializedAfterOpening) +TEST_F(SqliteDatabase, database_is_not_initialized_after_opening) { ASSERT_FALSE(database.isInitialized()); } -TEST_F(SqliteDatabase, DatabaseIsIntializedAfterSettingItBeforeOpening) +TEST_F(SqliteDatabase, database_is_intialized_after_setting_it_before_opening) { database.setIsInitialized(true); ASSERT_TRUE(database.isInitialized()); } -TEST_F(SqliteDatabase, DatabaseIsInitializedIfDatabasePathExistsAtOpening) +TEST_F(SqliteDatabase, database_is_initialized_if_database_path_exists_at_opening) { Sqlite::Database database{UNITTEST_DIR "/sqlite/data/sqlite_database.db"}; ASSERT_TRUE(database.isInitialized()); } -TEST_F(SqliteDatabase, DatabaseIsNotInitializedIfDatabasePathDoesNotExistAtOpening) +TEST_F(SqliteDatabase, database_is_not_initialized_if_database_path_does_not_exist_at_opening) { Sqlite::Database database{Utils::PathString{Utils::TemporaryDirectory::masterDirectoryPath() + "/database_does_not_exist.db"}}; @@ -167,7 +167,7 @@ TEST_F(SqliteDatabase, DatabaseIsNotInitializedIfDatabasePathDoesNotExistAtOpeni ASSERT_FALSE(database.isInitialized()); } -TEST_F(SqliteDatabase, GetChangesCount) +TEST_F(SqliteDatabase, get_changes_count) { Sqlite::WriteStatement<1> statement("INSERT INTO test(name) VALUES (?)", database); statement.write(42); @@ -175,7 +175,7 @@ TEST_F(SqliteDatabase, GetChangesCount) ASSERT_THAT(database.changesCount(), 1); } -TEST_F(SqliteDatabase, GetTotalChangesCount) +TEST_F(SqliteDatabase, get_total_changes_count) { Sqlite::WriteStatement<1> statement("INSERT INTO test(name) VALUES (?)", database); statement.write(42); @@ -183,7 +183,7 @@ TEST_F(SqliteDatabase, GetTotalChangesCount) ASSERT_THAT(database.lastInsertedRowId(), 1); } -TEST_F(SqliteDatabase, GetLastInsertedRowId) +TEST_F(SqliteDatabase, get_last_inserted_row_id) { Sqlite::WriteStatement<1> statement("INSERT INTO test(name) VALUES (?)", database); statement.write(42); @@ -191,49 +191,49 @@ TEST_F(SqliteDatabase, GetLastInsertedRowId) ASSERT_THAT(database.lastInsertedRowId(), 1); } -TEST_F(SqliteDatabase, LastRowId) +TEST_F(SqliteDatabase, last_row_id) { database.setLastInsertedRowId(42); ASSERT_THAT(database.lastInsertedRowId(), 42); } -TEST_F(SqliteDatabase, DeferredBegin) +TEST_F(SqliteDatabase, deferred_begin) { ASSERT_NO_THROW(transactionInterface.deferredBegin()); transactionInterface.commit(); } -TEST_F(SqliteDatabase, ImmediateBegin) +TEST_F(SqliteDatabase, immediate_begin) { ASSERT_NO_THROW(transactionInterface.immediateBegin()); transactionInterface.commit(); } -TEST_F(SqliteDatabase, ExclusiveBegin) +TEST_F(SqliteDatabase, exclusive_begin) { ASSERT_NO_THROW(transactionInterface.exclusiveBegin()); transactionInterface.commit(); } -TEST_F(SqliteDatabase, Commit) +TEST_F(SqliteDatabase, commit) { transactionInterface.deferredBegin(); ASSERT_NO_THROW(transactionInterface.commit()); } -TEST_F(SqliteDatabase, Rollback) +TEST_F(SqliteDatabase, rollback) { transactionInterface.deferredBegin(); ASSERT_NO_THROW(transactionInterface.rollback()); } -TEST_F(SqliteDatabase, SetUpdateHookSet) +TEST_F(SqliteDatabase, set_update_hook_set) { database.setUpdateHook(this, updateHookCallback); @@ -241,7 +241,7 @@ TEST_F(SqliteDatabase, SetUpdateHookSet) Sqlite::WriteStatement<1>("INSERT INTO test(name) VALUES (?)", database).write(42); } -TEST_F(SqliteDatabase, SetNullUpdateHook) +TEST_F(SqliteDatabase, set_null_update_hook) { database.setUpdateHook(this, updateHookCallback); @@ -251,7 +251,7 @@ TEST_F(SqliteDatabase, SetNullUpdateHook) Sqlite::WriteStatement<1>("INSERT INTO test(name) VALUES (?)", database).write(42); } -TEST_F(SqliteDatabase, ResetUpdateHook) +TEST_F(SqliteDatabase, reset_update_hook) { database.setUpdateHook(this, updateHookCallback); @@ -261,7 +261,7 @@ TEST_F(SqliteDatabase, ResetUpdateHook) Sqlite::WriteStatement<1>("INSERT INTO test(name) VALUES (?)", database).write(42); } -TEST_F(SqliteDatabase, DeleteUpdateHookCall) +TEST_F(SqliteDatabase, delete_update_hook_call) { Sqlite::WriteStatement<1>("INSERT INTO test(name) VALUES (?)", database).write(42); database.setUpdateHook(this, updateHookCallback); @@ -271,7 +271,7 @@ TEST_F(SqliteDatabase, DeleteUpdateHookCall) Sqlite::WriteStatement("DELETE FROM test WHERE name = 42", database).execute(); } -TEST_F(SqliteDatabase, InsertUpdateHookCall) +TEST_F(SqliteDatabase, insert_update_hook_call) { database.setUpdateHook(this, updateHookCallback); @@ -280,7 +280,7 @@ TEST_F(SqliteDatabase, InsertUpdateHookCall) Sqlite::WriteStatement<1>("INSERT INTO test(name) VALUES (?)", database).write(42); } -TEST_F(SqliteDatabase, UpdateUpdateHookCall) +TEST_F(SqliteDatabase, update_update_hook_call) { database.setUpdateHook(this, updateHookCallback); @@ -289,7 +289,7 @@ TEST_F(SqliteDatabase, UpdateUpdateHookCall) Sqlite::WriteStatement<1>("INSERT INTO test(name) VALUES (?)", database).write(42); } -TEST_F(SqliteDatabase, RowIdUpdateHookCall) +TEST_F(SqliteDatabase, row_id_update_hook_call) { database.setUpdateHook(this, updateHookCallback); @@ -298,7 +298,7 @@ TEST_F(SqliteDatabase, RowIdUpdateHookCall) Sqlite::WriteStatement<2>("INSERT INTO test(rowid, name) VALUES (?,?)", database).write(42, "foo"); } -TEST_F(SqliteDatabase, DatabaseUpdateHookCall) +TEST_F(SqliteDatabase, database_update_hook_call) { database.setUpdateHook(this, updateHookCallback); @@ -307,7 +307,7 @@ TEST_F(SqliteDatabase, DatabaseUpdateHookCall) Sqlite::WriteStatement<1>("INSERT INTO test(name) VALUES (?)", database).write(42); } -TEST_F(SqliteDatabase, TableUpdateHookCall) +TEST_F(SqliteDatabase, table_update_hook_call) { database.setUpdateHook(this, updateHookCallback); @@ -316,7 +316,7 @@ TEST_F(SqliteDatabase, TableUpdateHookCall) Sqlite::WriteStatement<1>("INSERT INTO test(name) VALUES (?)", database).write(42); } -TEST_F(SqliteDatabase, SessionsCommit) +TEST_F(SqliteDatabase, sessions_commit) { database.setAttachedTables({"test"}); Sqlite::WriteStatement<2>("INSERT INTO test(id, name) VALUES (?,?)", database).write(1, "foo"); @@ -333,7 +333,7 @@ TEST_F(SqliteDatabase, SessionsCommit) ASSERT_THAT(names(), UnorderedElementsAre("foo", "bar")); } -TEST_F(SqliteDatabase, SessionsRollback) +TEST_F(SqliteDatabase, sessions_rollback) { database.setAttachedTables({"test"}); Sqlite::WriteStatement<2>("INSERT INTO test(id, name) VALUES (?,?)", database).write(1, "foo"); @@ -351,7 +351,7 @@ TEST_F(SqliteDatabase, SessionsRollback) ASSERT_THAT(names(), UnorderedElementsAre("foo", "hoo")); } -TEST_F(SqliteDatabase, ProgressHandlerInterrupts) +TEST_F(SqliteDatabase, progress_handler_interrupts) { Sqlite::WriteStatement<1> statement("INSERT INTO test(name) VALUES (?)", database); lock.unlock(); @@ -362,7 +362,7 @@ TEST_F(SqliteDatabase, ProgressHandlerInterrupts) lock.unlock(); } -TEST_F(SqliteDatabase, ProgressHandlerContinues) +TEST_F(SqliteDatabase, progress_handler_continues) { Sqlite::WriteStatement<1> statement("INSERT INTO test(name) VALUES (?)", database); lock.unlock(); @@ -373,7 +373,7 @@ TEST_F(SqliteDatabase, ProgressHandlerContinues) lock.unlock(); } -TEST_F(SqliteDatabase, ProgressHandlerResetsAfterLeavingScope) +TEST_F(SqliteDatabase, progress_handler_resets_after_leaving_scope) { lock.unlock(); { diff --git a/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp index 610918f2682..7178bac34ae 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp @@ -47,20 +47,20 @@ protected: using SqliteDatabaseBackendSlowTest = SqliteDatabaseBackend; -TEST_F(SqliteDatabaseBackend, OpenAlreadyOpenDatabase) +TEST_F(SqliteDatabaseBackend, open_already_open_database) { ASSERT_THROW(databaseBackend.open(databaseFilePath, OpenMode::ReadWrite, Sqlite::JournalMode::Wal), Sqlite::DatabaseIsAlreadyOpen); } -TEST_F(SqliteDatabaseBackend, CloseAlreadyClosedDatabase) +TEST_F(SqliteDatabaseBackend, close_already_closed_database) { databaseBackend.close(); ASSERT_THROW(databaseBackend.close(), Sqlite::DatabaseIsAlreadyClosed); } -TEST_F(SqliteDatabaseBackend, OpenWithWrongPath) +TEST_F(SqliteDatabaseBackend, open_with_wrong_path) { ASSERT_THROW(databaseBackend.open("/xxx/SqliteDatabaseBackendTest.db", OpenMode::ReadWrite, @@ -68,54 +68,54 @@ TEST_F(SqliteDatabaseBackend, OpenWithWrongPath) Sqlite::WrongFilePath); } -TEST_F(SqliteDatabaseBackend, DefaultJournalMode) +TEST_F(SqliteDatabaseBackend, default_journal_mode) { ASSERT_THAT(databaseBackend.journalMode(), JournalMode::Delete); } -TEST_F(SqliteDatabaseBackendSlowTest, WalJournalMode) +TEST_F(SqliteDatabaseBackendSlowTest, wal_journal_mode) { databaseBackend.setJournalMode(JournalMode::Wal); ASSERT_THAT(databaseBackend.journalMode(), JournalMode::Wal); } -TEST_F(SqliteDatabaseBackend, TruncateJournalMode) +TEST_F(SqliteDatabaseBackend, truncate_journal_mode) { databaseBackend.setJournalMode(JournalMode::Truncate); ASSERT_THAT(databaseBackend.journalMode(), JournalMode::Truncate); } -TEST_F(SqliteDatabaseBackend, MemoryJournalMode) +TEST_F(SqliteDatabaseBackend, memory_journal_mode) { databaseBackend.setJournalMode(JournalMode::Memory); ASSERT_THAT(databaseBackend.journalMode(), JournalMode::Memory); } -TEST_F(SqliteDatabaseBackend, PersistJournalMode) +TEST_F(SqliteDatabaseBackend, persist_journal_mode) { databaseBackend.setJournalMode(JournalMode::Persist); ASSERT_THAT(databaseBackend.journalMode(), JournalMode::Persist); } -TEST_F(SqliteDatabaseBackend, OpenModeReadOnly) +TEST_F(SqliteDatabaseBackend, open_mode_read_only) { auto mode = Backend::createOpenFlags(OpenMode::ReadOnly, Sqlite::JournalMode::Wal); ASSERT_THAT(mode, SQLITE_OPEN_CREATE | SQLITE_OPEN_READONLY | SQLITE_OPEN_EXRESCODE); } -TEST_F(SqliteDatabaseBackend, OpenModeReadWrite) +TEST_F(SqliteDatabaseBackend, open_mode_read_write) { auto mode = Backend::createOpenFlags(OpenMode::ReadWrite, Sqlite::JournalMode::Wal); ASSERT_THAT(mode, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_EXRESCODE); } -TEST_F(SqliteDatabaseBackend, OpenModeReadWriteAndMemoryJournal) +TEST_F(SqliteDatabaseBackend, open_mode_read_write_and_memory_journal) { auto mode = Backend::createOpenFlags(OpenMode::ReadWrite, Sqlite::JournalMode::Memory); diff --git a/tests/unit/tests/unittests/sqlite/sqlitefunctionregistry-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitefunctionregistry-test.cpp index f0435bb1ef1..2973ec6167c 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitefunctionregistry-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitefunctionregistry-test.cpp @@ -16,7 +16,7 @@ protected: Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory}; }; -TEST_F(SqliteFunctionRegistry, PathExists) +TEST_F(SqliteFunctionRegistry, path_exists) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement{"SELECT pathExists('" UNITTEST_DIR @@ -28,7 +28,7 @@ TEST_F(SqliteFunctionRegistry, PathExists) ASSERT_TRUE(pathExists); } -TEST_F(SqliteFunctionRegistry, PathDoesntExists) +TEST_F(SqliteFunctionRegistry, path_doesnt_exists) { std::lock_guard lock{database}; Sqlite::ReadStatement<1> statement{"SELECT pathExists('" UNITTEST_DIR diff --git a/tests/unit/tests/unittests/sqlite/sqliteindex-test.cpp b/tests/unit/tests/unittests/sqlite/sqliteindex-test.cpp index 528d9a3d3db..9d3fca88ffa 100644 --- a/tests/unit/tests/unittests/sqlite/sqliteindex-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqliteindex-test.cpp @@ -11,7 +11,7 @@ using Sqlite::Exception; using Sqlite::Index; using Sqlite::IndexType; -TEST(Index, OneColumn) +TEST(Index, one_column) { Index index{"tableName", {"column1"}}; @@ -20,7 +20,7 @@ TEST(Index, OneColumn) ASSERT_THAT(sqlStatement, Eq("CREATE INDEX IF NOT EXISTS index_tableName_column1 ON tableName(column1)")); } -TEST(Index, TwoColumn) +TEST(Index, two_column) { Index index{"tableName", {"column1", "column2"}}; @@ -29,21 +29,21 @@ TEST(Index, TwoColumn) ASSERT_THAT(sqlStatement, Eq("CREATE INDEX IF NOT EXISTS index_tableName_column1_column2 ON tableName(column1, column2)")); } -TEST(Index, EmptyTableName) +TEST(Index, empty_table_name) { Index index{"", {"column1", "column2"}}; ASSERT_THROW(index.sqlStatement(), Exception); } -TEST(Index, EmptyColumns) +TEST(Index, empty_columns) { Index index{"tableName", {}}; ASSERT_THROW(index.sqlStatement(), Exception); } -TEST(Index, UniqueIndex) +TEST(Index, unique_index) { Index index{"tableName", {"column1"}, IndexType::Unique}; @@ -52,7 +52,7 @@ TEST(Index, UniqueIndex) ASSERT_THAT(sqlStatement, Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_tableName_column1 ON tableName(column1)")); } -TEST(Index, Condition) +TEST(Index, condition) { Index index{"tableName", {"column1"}, IndexType::Normal, "column1 IS NOT NULL"}; diff --git a/tests/unit/tests/unittests/sqlite/sqlitesessions-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitesessions-test.cpp index c61d3004312..e6d5fcc1426 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitesessions-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitesessions-test.cpp @@ -136,12 +136,12 @@ protected: Sqlite::ReadStatement<1> selectChangeSets{"SELECT changeset FROM testsessions", database}; }; -TEST_F(SqliteSessions, DontThrowForCommittingWithoutSessionStart) +TEST_F(SqliteSessions, dont_throw_for_committing_without_session_start) { ASSERT_NO_THROW(sessions.commit()); } -TEST_F(SqliteSessions, CreateEmptySession) +TEST_F(SqliteSessions, create_empty_session) { sessions.create(); sessions.commit(); @@ -149,7 +149,7 @@ TEST_F(SqliteSessions, CreateEmptySession) ASSERT_THAT(sessions.changeSets(), IsEmpty()); } -TEST_F(SqliteSessions, CreateSessionWithInsert) +TEST_F(SqliteSessions, create_session_with_insert) { sessions.create(); insertData.write("foo", 22, 3.14); @@ -158,7 +158,7 @@ TEST_F(SqliteSessions, CreateSessionWithInsert) ASSERT_THAT(sessions.changeSets(), SizeIs(1)); } -TEST_F(SqliteSessions, CreateSessionWithUpdate) +TEST_F(SqliteSessions, create_session_with_update) { insertData.write("foo", 22, 3.14); @@ -169,7 +169,7 @@ TEST_F(SqliteSessions, CreateSessionWithUpdate) ASSERT_THAT(sessions.changeSets(), SizeIs(1)); } -TEST_F(SqliteSessions, CreateSessionWithDelete) +TEST_F(SqliteSessions, create_session_with_delete) { insertData.write("foo", 22, 3.14); @@ -180,7 +180,7 @@ TEST_F(SqliteSessions, CreateSessionWithDelete) ASSERT_THAT(sessions.changeSets(), SizeIs(1)); } -TEST_F(SqliteSessions, CreateSessionWithInsertAndUpdate) +TEST_F(SqliteSessions, create_session_with_insert_and_update) { sessions.create(); insertData.write("foo", 22, 3.14); @@ -193,7 +193,7 @@ TEST_F(SqliteSessions, CreateSessionWithInsertAndUpdate) ASSERT_THAT(sessions.changeSets(), SizeIs(2)); } -TEST_F(SqliteSessions, CreateSession) +TEST_F(SqliteSessions, create_session) { sessions.create(); insertData.write("foo", 22, 3.14); @@ -203,7 +203,7 @@ TEST_F(SqliteSessions, CreateSession) ASSERT_THAT(sessions.changeSets(), SizeIs(1)); } -TEST_F(SqliteSessions, RevertSession) +TEST_F(SqliteSessions, revert_session) { sessions.create(); insertData.write("foo", 22, 3.14); @@ -214,7 +214,7 @@ TEST_F(SqliteSessions, RevertSession) ASSERT_THAT(fetchData(), IsEmpty()); } -TEST_F(SqliteSessions, RevertSessionToBase) +TEST_F(SqliteSessions, revert_session_to_base) { insertData.write("bar", "foo", 99); sessions.create(); @@ -226,7 +226,7 @@ TEST_F(SqliteSessions, RevertSessionToBase) ASSERT_THAT(fetchData(), ElementsAre(HasData("bar", "foo", 99))); } -TEST_F(SqliteSessions, RevertMultipleSession) +TEST_F(SqliteSessions, revert_multiple_session) { sessions.create(); insertData.write("foo", 22, 3.14); @@ -240,7 +240,7 @@ TEST_F(SqliteSessions, RevertMultipleSession) ASSERT_THAT(fetchData(), IsEmpty()); } -TEST_F(SqliteSessions, ApplySession) +TEST_F(SqliteSessions, apply_session) { sessions.create(); insertData.write("foo", 22, 3.14); @@ -251,7 +251,7 @@ TEST_F(SqliteSessions, ApplySession) ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", 22, 3.14))); } -TEST_F(SqliteSessions, ApplySessionAfterAddingNewEntries) +TEST_F(SqliteSessions, apply_session_after_adding_new_entries) { sessions.create(); insertData.write("foo", 22, 3.14); @@ -264,7 +264,7 @@ TEST_F(SqliteSessions, ApplySessionAfterAddingNewEntries) UnorderedElementsAre(HasData("foo", 22, 3.14), HasData("bar", "foo", 99))); } -TEST_F(SqliteSessions, ApplyOverridesEntriesWithUniqueConstraint) +TEST_F(SqliteSessions, apply_overrides_entries_with_unique_constraint) { sessions.create(); insertData.write("foo", 22, 3.14); @@ -276,7 +276,7 @@ TEST_F(SqliteSessions, ApplyOverridesEntriesWithUniqueConstraint) ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", 22, 3.14))); } -TEST_F(SqliteSessions, ApplyDoesNotOverrideDeletedEntries) +TEST_F(SqliteSessions, apply_does_not_override_deleted_entries) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -289,7 +289,7 @@ TEST_F(SqliteSessions, ApplyDoesNotOverrideDeletedEntries) ASSERT_THAT(fetchData(), IsEmpty()); } -TEST_F(SqliteSessions, ApplyDoesOnlyOverwriteUpdatedValues) +TEST_F(SqliteSessions, apply_does_only_overwrite_updated_values) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -302,7 +302,7 @@ TEST_F(SqliteSessions, ApplyDoesOnlyOverwriteUpdatedValues) ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "poo", 1234))); } -TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideForeignKeyIfReferenceIsDeleted) +TEST_F(SqliteSessions, apply_does_does_not_override_foreign_key_if_reference_is_deleted) { insertData.write("foo2", "bar", 3.14); insertData.write("foo", "bar", 3.14); @@ -317,7 +317,7 @@ TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideForeignKeyIfReferenceIsDeleted) ASSERT_THAT(fetchTags(), ElementsAre(HasTag("foo2", 4321))); } -TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideIfConstraintsIsApplied) +TEST_F(SqliteSessions, apply_does_does_not_override_if_constraints_is_applied) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -331,7 +331,7 @@ TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideIfConstraintsIsApplied) ASSERT_THAT(fetchTags(), IsEmpty()); } -TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideForeignKeyIfReferenceIsDeletedDeferred) +TEST_F(SqliteSessions, apply_does_does_not_override_foreign_key_if_reference_is_deleted_deferred) { database.unlock(); Sqlite::DeferredTransaction transaction{database}; @@ -350,7 +350,7 @@ TEST_F(SqliteSessions, ApplyDoesDoesNotOverrideForeignKeyIfReferenceIsDeletedDef ASSERT_THAT(fetchTags(), ElementsAre(HasTag("foo2", 4321))); } -TEST_F(SqliteSessions, EndSessionOnRollback) +TEST_F(SqliteSessions, end_session_on_rollback) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -367,7 +367,7 @@ TEST_F(SqliteSessions, EndSessionOnRollback) ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", 333, 666))); } -TEST_F(SqliteSessions, EndSessionOnCommit) +TEST_F(SqliteSessions, end_session_on_commit) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -381,7 +381,7 @@ TEST_F(SqliteSessions, EndSessionOnCommit) ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "bar", 99))); } -TEST_F(SqliteSessions, DeleteSessions) +TEST_F(SqliteSessions, delete_sessions) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -395,7 +395,7 @@ TEST_F(SqliteSessions, DeleteSessions) ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "bar", 3.14))); } -TEST_F(SqliteSessions, DeleteAllSessions) +TEST_F(SqliteSessions, delete_all_sessions) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -409,7 +409,7 @@ TEST_F(SqliteSessions, DeleteAllSessions) ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "bar", 3.14))); } -TEST_F(SqliteSessions, ApplyAndUpdateSessions) +TEST_F(SqliteSessions, apply_and_update_sessions) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -424,7 +424,7 @@ TEST_F(SqliteSessions, ApplyAndUpdateSessions) ASSERT_THAT(fetchData(), ElementsAre(HasData("foo", "bar", 22))); } -TEST_F(SqliteSessions, ApplyAndUpdateSessionsHasOnlyOneChangeSet) +TEST_F(SqliteSessions, apply_and_update_sessions_has_only_one_change_set) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -437,7 +437,7 @@ TEST_F(SqliteSessions, ApplyAndUpdateSessionsHasOnlyOneChangeSet) ASSERT_THAT(sessions.changeSets(), SizeIs(1)); } -TEST_F(SqliteSessions, ForEmptySessionBeginEqualsEnd) +TEST_F(SqliteSessions, for_empty_session_begin_equals_end) { auto changeSets = sessions.changeSets(); @@ -446,7 +446,7 @@ TEST_F(SqliteSessions, ForEmptySessionBeginEqualsEnd) ASSERT_THAT(begin, Eq(changeSets.end())); } -TEST_F(SqliteSessions, IteratorBeginUnequalsEndIfChangeSetHasContent) +TEST_F(SqliteSessions, iterator_begin_unequals_end_if_change_set_has_content) { sessions.create(); insertData.write("foo", "bar", 3.14); @@ -459,7 +459,7 @@ TEST_F(SqliteSessions, IteratorBeginUnequalsEndIfChangeSetHasContent) ASSERT_THAT(begin, Ne(changeSet.end())); } -TEST_F(SqliteSessions, NextIteratorUnequalsBeginIfChangeSetHasContent) +TEST_F(SqliteSessions, next_iterator_unequals_begin_if_change_set_has_content) { sessions.create(); insertData.write("foo", "bar", 3.14); @@ -472,7 +472,7 @@ TEST_F(SqliteSessions, NextIteratorUnequalsBeginIfChangeSetHasContent) ASSERT_NE(next, changeSet.begin()); } -TEST_F(SqliteSessions, NextIteratorEqualsEndIfChangeSetHasContent) +TEST_F(SqliteSessions, next_iterator_equals_end_if_change_set_has_content) { sessions.create(); insertData.write("foo", "bar", 3.14); @@ -485,7 +485,7 @@ TEST_F(SqliteSessions, NextIteratorEqualsEndIfChangeSetHasContent) ASSERT_THAT(next, Eq(changeSet.end())); } -TEST_F(SqliteSessions, NextIteratorNotUnqualsEndIfChangeSetHasContent) +TEST_F(SqliteSessions, next_iterator_not_unquals_end_if_change_set_has_content) { sessions.create(); insertData.write("foo", "bar", 3.14); @@ -498,7 +498,7 @@ TEST_F(SqliteSessions, NextIteratorNotUnqualsEndIfChangeSetHasContent) ASSERT_THAT(next, Not(Ne(changeSet.end()))); } -TEST_F(SqliteSessions, BeginIteratorHasInsertOperation) +TEST_F(SqliteSessions, begin_iterator_has_insert_operation) { sessions.create(); insertData.write("foo", "bar", 3.14); @@ -512,7 +512,7 @@ TEST_F(SqliteSessions, BeginIteratorHasInsertOperation) ASSERT_THAT(tuple.operation, Eq(Operation::Insert)); } -TEST_F(SqliteSessions, BeginIteratorHasUpdateOperation) +TEST_F(SqliteSessions, begin_iterator_has_update_operation) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -527,7 +527,7 @@ TEST_F(SqliteSessions, BeginIteratorHasUpdateOperation) ASSERT_THAT(tuple.operation, Eq(Operation::Update)); } -TEST_F(SqliteSessions, BeginIteratorHasDeleteOperation) +TEST_F(SqliteSessions, begin_iterator_has_delete_operation) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -542,7 +542,7 @@ TEST_F(SqliteSessions, BeginIteratorHasDeleteOperation) ASSERT_THAT(tuple.operation, Eq(Operation::Delete)); } -TEST_F(SqliteSessions, BeginIteratorHasDataTableName) +TEST_F(SqliteSessions, begin_iterator_has_data_table_name) { sessions.create(); insertData.write("foo", "bar", 3.14); @@ -556,7 +556,7 @@ TEST_F(SqliteSessions, BeginIteratorHasDataTableName) ASSERT_THAT(tuple.table, Eq("data")); } -TEST_F(SqliteSessions, ConvertAllValueTypesInChangeSet) +TEST_F(SqliteSessions, convert_all_value_types_in_change_set) { sessions.create(); insertData.write("foo", "bar", 3.14); @@ -575,7 +575,7 @@ TEST_F(SqliteSessions, ConvertAllValueTypesInChangeSet) HasValues(3.14, nullptr))); } -TEST_F(SqliteSessions, InsertOneValueChangeSet) +TEST_F(SqliteSessions, insert_one_value_change_set) { sessions.create(); insertOneDatum.write("foo", Sqlite::NullValue{}); @@ -594,7 +594,7 @@ TEST_F(SqliteSessions, InsertOneValueChangeSet) HasValues("foo", nullptr))); } -TEST_F(SqliteSessions, UpdateOneValueChangeSet) +TEST_F(SqliteSessions, update_one_value_change_set) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -614,7 +614,7 @@ TEST_F(SqliteSessions, UpdateOneValueChangeSet) HasValues(99, 3.14))); } -TEST_F(SqliteSessions, DeleteRowChangeSet) +TEST_F(SqliteSessions, delete_row_change_set) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -635,7 +635,7 @@ TEST_F(SqliteSessions, DeleteRowChangeSet) HasValues(nullptr, 3.14))); } -TEST_F(SqliteSessions, EmptyChangeSet) +TEST_F(SqliteSessions, empty_change_set) { sessions.create(); sessions.commit(); @@ -645,7 +645,7 @@ TEST_F(SqliteSessions, EmptyChangeSet) ASSERT_THAT(changeSets, ElementsAre()); } -TEST_F(SqliteSessions, AccessInsertOneValueChangeSet) +TEST_F(SqliteSessions, access_insert_one_value_change_set) { sessions.create(); insertOneDatum.write("foo", Sqlite::NullValue{}); @@ -660,7 +660,7 @@ TEST_F(SqliteSessions, AccessInsertOneValueChangeSet) ASSERT_THAT(value, HasValues("foo", nullptr)); } -TEST_F(SqliteSessions, AccessUpdateOneValueChangeSet) +TEST_F(SqliteSessions, access_update_one_value_change_set) { insertData.write("foo", "bar", 3.14); sessions.create(); @@ -676,7 +676,7 @@ TEST_F(SqliteSessions, AccessUpdateOneValueChangeSet) ASSERT_THAT(value, HasValues(99, 3.14)); } -TEST_F(SqliteSessions, AccessDeleteRowChangeSet) +TEST_F(SqliteSessions, access_delete_row_change_set) { insertData.write("foo", "bar", 3.14); sessions.create(); diff --git a/tests/unit/tests/unittests/sqlite/sqlitestatement-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitestatement-test.cpp index dd31e1f90ac..64a9cdd2772 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitestatement-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitestatement-test.cpp @@ -139,24 +139,24 @@ struct Output } }; -TEST_F(SqliteStatement, ThrowsStatementHasErrorForWrongSqlStatement) +TEST_F(SqliteStatement, throws_statement_has_error_for_wrong_sql_statement) { ASSERT_THROW(ReadStatement<0>("blah blah blah", database), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, ThrowsNotReadOnlySqlStatementForWritableSqlStatementInReadStatement) +TEST_F(SqliteStatement, throws_not_read_only_sql_statement_for_writable_sql_statement_in_read_statement) { ASSERT_THROW(ReadStatement<0>("INSERT INTO test(name, number) VALUES (?, ?)", database), Sqlite::NotReadOnlySqlStatement); } -TEST_F(SqliteStatement, ThrowsNotReadonlySqlStatementForWritableSqlStatementInReadStatement) +TEST_F(SqliteStatement, throws_not_readonly_sql_statement_for_writable_sql_statement_in_read_statement) { ASSERT_THROW(WriteStatement("SELECT name, number FROM test", database), Sqlite::NotWriteSqlStatement); } -TEST_F(SqliteStatement, CountRows) +TEST_F(SqliteStatement, count_rows) { SqliteTestStatement<3> statement("SELECT * FROM test", database); int nextCount = 0; @@ -168,7 +168,7 @@ TEST_F(SqliteStatement, CountRows) ASSERT_THAT(nextCount, sqlCount); } -TEST_F(SqliteStatement, Value) +TEST_F(SqliteStatement, value) { SqliteTestStatement<3> statement("SELECT name, number, value FROM test ORDER BY name", database); statement.next(); @@ -192,33 +192,33 @@ TEST_F(SqliteStatement, Value) ASSERT_THAT(statement.fetchValueView(2), Eq(2)); } -TEST_F(SqliteStatement, ToIntegerValue) +TEST_F(SqliteStatement, to_integer_value) { auto value = ReadStatement<1>::toValue("SELECT number FROM test WHERE name='foo'", database); ASSERT_THAT(value, 23); } -TEST_F(SqliteStatement, ToLongIntegerValue) +TEST_F(SqliteStatement, to_long_integer_value) { ASSERT_THAT(ReadStatement<1>::toValue("SELECT number FROM test WHERE name='foo'", database), Eq(23)); } -TEST_F(SqliteStatement, ToDoubleValue) +TEST_F(SqliteStatement, to_double_value) { ASSERT_THAT(ReadStatement<1>::toValue("SELECT number FROM test WHERE name='foo'", database), 23.3); } -TEST_F(SqliteStatement, ToStringValue) +TEST_F(SqliteStatement, to_string_value) { ASSERT_THAT(ReadStatement<1>::toValue( "SELECT name FROM test WHERE name='foo'", database), "foo"); } -TEST_F(SqliteStatement, BindNull) +TEST_F(SqliteStatement, bind_null) { database.execute("INSERT INTO test VALUES (NULL, 323, 344)"); SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE name IS ?", database); @@ -230,7 +230,7 @@ TEST_F(SqliteStatement, BindNull) ASSERT_THAT(statement.fetchValue(1), 323); } -TEST_F(SqliteStatement, BindNullValue) +TEST_F(SqliteStatement, bind_null_value) { database.execute("INSERT INTO test VALUES (NULL, 323, 344)"); SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE name IS ?", database); @@ -242,7 +242,7 @@ TEST_F(SqliteStatement, BindNullValue) ASSERT_THAT(statement.fetchValue(1), 323); } -TEST_F(SqliteStatement, BindInvalidIntIdToNull) +TEST_F(SqliteStatement, bind_invalid_int_id_to_null) { TestIntId id; SqliteTestStatement<0, 1> statement("INSERT INTO test VALUES ('id', 323, ?)", database); @@ -255,7 +255,7 @@ TEST_F(SqliteStatement, BindInvalidIntIdToNull) ASSERT_THAT(readStatement.fetchType(0), Sqlite::Type::Null); } -TEST_F(SqliteStatement, BindIntId) +TEST_F(SqliteStatement, bind_int_id) { TestIntId id{TestIntId::create(42)}; SqliteTestStatement<0, 1> statement("INSERT INTO test VALUES ('id', 323, ?)", database); @@ -269,7 +269,7 @@ TEST_F(SqliteStatement, BindIntId) ASSERT_THAT(readStatement.fetchIntValue(0), 42); } -TEST_F(SqliteStatement, BindInvalidLongLongIdToNull) +TEST_F(SqliteStatement, bind_invalid_long_long_id_to_null) { TestLongLongId id; SqliteTestStatement<0, 1> statement("INSERT INTO test VALUES ('id', 323, ?)", database); @@ -282,7 +282,7 @@ TEST_F(SqliteStatement, BindInvalidLongLongIdToNull) ASSERT_THAT(readStatement.fetchType(0), Sqlite::Type::Null); } -TEST_F(SqliteStatement, BindLongLongId) +TEST_F(SqliteStatement, bind_long_long_id) { TestLongLongId id{TestLongLongId::create(42)}; SqliteTestStatement<0, 1> statement("INSERT INTO test VALUES ('id', 323, ?)", database); @@ -296,7 +296,7 @@ TEST_F(SqliteStatement, BindLongLongId) ASSERT_THAT(readStatement.fetchIntValue(0), 42); } -TEST_F(SqliteStatement, BindString) +TEST_F(SqliteStatement, bind_string) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE name=?", database); @@ -307,7 +307,7 @@ TEST_F(SqliteStatement, BindString) ASSERT_THAT(statement.fetchValue(1), 23.3); } -TEST_F(SqliteStatement, BindInteger) +TEST_F(SqliteStatement, bind_integer) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=?", database); @@ -317,7 +317,7 @@ TEST_F(SqliteStatement, BindInteger) ASSERT_THAT(statement.fetchSmallStringViewValue(0), "poo"); } -TEST_F(SqliteStatement, BindLongInteger) +TEST_F(SqliteStatement, bind_long_integer) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=?", database); @@ -327,7 +327,7 @@ TEST_F(SqliteStatement, BindLongInteger) ASSERT_THAT(statement.fetchSmallStringViewValue(0), "poo"); } -TEST_F(SqliteStatement, BindDouble) +TEST_F(SqliteStatement, bind_double) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=?", database); @@ -337,7 +337,7 @@ TEST_F(SqliteStatement, BindDouble) ASSERT_THAT(statement.fetchSmallStringViewValue(0), "foo"); } -TEST_F(SqliteStatement, BindPointer) +TEST_F(SqliteStatement, bind_pointer) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?, 5, 'int64')", database); std::vector values{1, 1, 2, 3, 5}; @@ -348,7 +348,7 @@ TEST_F(SqliteStatement, BindPointer) ASSERT_THAT(statement.fetchIntValue(0), 1); } -TEST_F(SqliteStatement, BindIntCarray) +TEST_F(SqliteStatement, bind_int_carray) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?)", database); std::vector values{3, 10, 20, 33, 55}; @@ -362,7 +362,7 @@ TEST_F(SqliteStatement, BindIntCarray) ASSERT_THAT(statement.fetchIntValue(0), 33); } -TEST_F(SqliteStatement, BindLongLongCarray) +TEST_F(SqliteStatement, bind_long_long_carray) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?)", database); std::vector values{3, 10, 20, 33, 55}; @@ -376,7 +376,7 @@ TEST_F(SqliteStatement, BindLongLongCarray) ASSERT_THAT(statement.fetchLongLongValue(0), 33); } -TEST_F(SqliteStatement, BindDoubleCarray) +TEST_F(SqliteStatement, bind_double_carray) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?)", database); std::vector values{3.3, 10.2, 20.54, 33.21, 55}; @@ -390,7 +390,7 @@ TEST_F(SqliteStatement, BindDoubleCarray) ASSERT_THAT(statement.fetchDoubleValue(0), 33.21); } -TEST_F(SqliteStatement, BindTextCarray) +TEST_F(SqliteStatement, bind_text_carray) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?)", database); std::vector values{"yi", "er", "san", "se", "wu"}; @@ -404,7 +404,7 @@ TEST_F(SqliteStatement, BindTextCarray) ASSERT_THAT(statement.fetchSmallStringViewValue(0), Eq("se")); } -TEST_F(SqliteStatement, BindBlob) +TEST_F(SqliteStatement, bind_blob) { SqliteTestStatement<1, 1> statement("WITH T(blob) AS (VALUES (?)) SELECT blob FROM T", database); const unsigned char chars[] = "aaafdfdlll"; @@ -417,7 +417,7 @@ TEST_F(SqliteStatement, BindBlob) ASSERT_THAT(statement.fetchBlobValue(0), Eq(bytes)); } -TEST_F(SqliteStatement, BindEmptyBlob) +TEST_F(SqliteStatement, bind_empty_blob) { SqliteTestStatement<1, 1> statement("WITH T(blob) AS (VALUES (?)) SELECT blob FROM T", database); Sqlite::BlobView bytes; @@ -428,56 +428,56 @@ TEST_F(SqliteStatement, BindEmptyBlob) ASSERT_THAT(statement.fetchBlobValue(0), IsEmpty()); } -TEST_F(SqliteStatement, BindIndexIsZeroIsThrowingBindingIndexIsOutOfBoundInt) +TEST_F(SqliteStatement, bind_index_is_zero_is_throwing_binding_index_is_out_of_bound_int) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=$1", database); ASSERT_THROW(statement.bind(0, 40), Sqlite::BindingIndexIsOutOfRange); } -TEST_F(SqliteStatement, BindIndexIsZeroIsThrowingBindingIndexIsOutOfBoundNull) +TEST_F(SqliteStatement, bind_index_is_zero_is_throwing_binding_index_is_out_of_bound_null) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=$1", database); ASSERT_THROW(statement.bind(0, Sqlite::NullValue{}), Sqlite::BindingIndexIsOutOfRange); } -TEST_F(SqliteStatement, BindIndexIsToLargeIsThrowingBindingIndexIsOutOfBoundLongLong) +TEST_F(SqliteStatement, bind_index_is_to_large_is_throwing_binding_index_is_out_of_bound_long_long) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=$1", database); ASSERT_THROW(statement.bind(2, 40LL), Sqlite::BindingIndexIsOutOfRange); } -TEST_F(SqliteStatement, BindIndexIsToLargeIsThrowingBindingIndexIsOutOfBoundStringView) +TEST_F(SqliteStatement, bind_index_is_to_large_is_throwing_binding_index_is_out_of_bound_string_view) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=$1", database); ASSERT_THROW(statement.bind(2, "foo"), Sqlite::BindingIndexIsOutOfRange); } -TEST_F(SqliteStatement, BindIndexIsToLargeIsThrowingBindingIndexIsOutOfBoundStringFloat) +TEST_F(SqliteStatement, bind_index_is_to_large_is_throwing_binding_index_is_out_of_bound_string_float) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=$1", database); ASSERT_THROW(statement.bind(2, 2.), Sqlite::BindingIndexIsOutOfRange); } -TEST_F(SqliteStatement, BindIndexIsToLargeIsThrowingBindingIndexIsOutOfBoundPointer) +TEST_F(SqliteStatement, bind_index_is_to_large_is_throwing_binding_index_is_out_of_bound_pointer) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=$1", database); ASSERT_THROW(statement.bind(2, nullptr), Sqlite::BindingIndexIsOutOfRange); } -TEST_F(SqliteStatement, BindIndexIsToLargeIsThrowingBindingIndexIsOutOfBoundValue) +TEST_F(SqliteStatement, bind_index_is_to_large_is_throwing_binding_index_is_out_of_bound_value) { SqliteTestStatement<2, 1> statement("SELECT name, number FROM test WHERE number=$1", database); ASSERT_THROW(statement.bind(2, Sqlite::Value{1}), Sqlite::BindingIndexIsOutOfRange); } -TEST_F(SqliteStatement, BindIndexIsToLargeIsThrowingBindingIndexIsOutOfBoundBlob) +TEST_F(SqliteStatement, bind_index_is_to_large_is_throwing_binding_index_is_out_of_bound_blob) { SqliteTestStatement<1, 1> statement("WITH T(blob) AS (VALUES (?)) SELECT blob FROM T", database); Sqlite::BlobView bytes{QByteArray{"XXX"}}; @@ -485,7 +485,7 @@ TEST_F(SqliteStatement, BindIndexIsToLargeIsThrowingBindingIndexIsOutOfBoundBlob ASSERT_THROW(statement.bind(2, bytes), Sqlite::BindingIndexIsOutOfRange); } -TEST_F(SqliteStatement, BindValues) +TEST_F(SqliteStatement, bind_values) { SqliteTestStatement<0, 3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); @@ -495,7 +495,7 @@ TEST_F(SqliteStatement, BindValues) ASSERT_THAT(statement, HasValues("see", "7.23", 1)); } -TEST_F(SqliteStatement, BindNullValues) +TEST_F(SqliteStatement, bind_null_values) { SqliteTestStatement<0, 3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); @@ -505,7 +505,7 @@ TEST_F(SqliteStatement, BindNullValues) ASSERT_THAT(statement, HasNullValues(1)); } -TEST_F(SqliteStatement, WriteValues) +TEST_F(SqliteStatement, write_values) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); @@ -514,7 +514,7 @@ TEST_F(SqliteStatement, WriteValues) ASSERT_THAT(statement, HasValues("see", "7.23", 1)); } -TEST_F(SqliteStatement, WritePointerValues) +TEST_F(SqliteStatement, write_pointer_values) { SqliteTestStatement<1, 2> statement("SELECT value FROM carray(?, ?, 'int64')", database); std::vector values{1, 1, 2, 3, 5}; @@ -524,7 +524,7 @@ TEST_F(SqliteStatement, WritePointerValues) ASSERT_THAT(results, ElementsAre(1, 1, 2, 3, 5)); } -TEST_F(SqliteStatement, WriteIntCarrayValues) +TEST_F(SqliteStatement, write_int_carray_values) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?)", database); std::vector values{3, 10, 20, 33, 55}; @@ -534,7 +534,7 @@ TEST_F(SqliteStatement, WriteIntCarrayValues) ASSERT_THAT(results, ElementsAre(3, 10, 20, 33, 55)); } -TEST_F(SqliteStatement, WriteLongLongCarrayValues) +TEST_F(SqliteStatement, write_long_long_carray_values) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?)", database); std::vector values{3, 10, 20, 33, 55}; @@ -544,7 +544,7 @@ TEST_F(SqliteStatement, WriteLongLongCarrayValues) ASSERT_THAT(results, ElementsAre(3, 10, 20, 33, 55)); } -TEST_F(SqliteStatement, WriteDoubleCarrayValues) +TEST_F(SqliteStatement, write_double_carray_values) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?)", database); std::vector values{3.3, 10.2, 20.54, 33.21, 55}; @@ -554,7 +554,7 @@ TEST_F(SqliteStatement, WriteDoubleCarrayValues) ASSERT_THAT(results, ElementsAre(3.3, 10.2, 20.54, 33.21, 55)); } -TEST_F(SqliteStatement, WriteTextCarrayValues) +TEST_F(SqliteStatement, write_text_carray_values) { SqliteTestStatement<1, 1> statement("SELECT value FROM carray(?)", database); std::vector values{"yi", "er", "san", "se", "wu"}; @@ -564,7 +564,7 @@ TEST_F(SqliteStatement, WriteTextCarrayValues) ASSERT_THAT(results, ElementsAre("yi", "er", "san", "se", "wu")); } -TEST_F(SqliteStatement, WriteNullValues) +TEST_F(SqliteStatement, write_null_values) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); statement.write(1, 1, 1); @@ -574,7 +574,7 @@ TEST_F(SqliteStatement, WriteNullValues) ASSERT_THAT(statement, HasNullValues(1)); } -TEST_F(SqliteStatement, WriteSqliteIntegerValue) +TEST_F(SqliteStatement, write_sqlite_integer_value) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); statement.write(1, 1, 1); @@ -584,7 +584,7 @@ TEST_F(SqliteStatement, WriteSqliteIntegerValue) ASSERT_THAT(statement, HasValues("see", 33, 1)); } -TEST_F(SqliteStatement, WriteSqliteDoubeValue) +TEST_F(SqliteStatement, write_sqlite_doube_value) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); @@ -593,7 +593,7 @@ TEST_F(SqliteStatement, WriteSqliteDoubeValue) ASSERT_THAT(statement, HasValues("see", 7.23, 1)); } -TEST_F(SqliteStatement, WriteSqliteStringValue) +TEST_F(SqliteStatement, write_sqlite_string_value) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); @@ -602,7 +602,7 @@ TEST_F(SqliteStatement, WriteSqliteStringValue) ASSERT_THAT(statement, HasValues("see", "foo", 1)); } -TEST_F(SqliteStatement, WriteSqliteBlobValue) +TEST_F(SqliteStatement, write_sqlite_blob_value) { SqliteTestStatement<0, 1> statement("INSERT INTO test VALUES ('blob', 40, ?)", database); SqliteTestStatement<1, 0> readStatement("SELECT value FROM test WHERE name = 'blob'", database); @@ -616,7 +616,7 @@ TEST_F(SqliteStatement, WriteSqliteBlobValue) Optional(Field(&Sqlite::Blob::bytes, Eq(bytes)))); } -TEST_F(SqliteStatement, WriteNullValueView) +TEST_F(SqliteStatement, write_null_value_view) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); statement.write(1, 1, 1); @@ -626,7 +626,7 @@ TEST_F(SqliteStatement, WriteNullValueView) ASSERT_THAT(statement, HasNullValues(1)); } -TEST_F(SqliteStatement, WriteSqliteIntegerValueView) +TEST_F(SqliteStatement, write_sqlite_integer_value_view) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); statement.write(1, 1, 1); @@ -636,7 +636,7 @@ TEST_F(SqliteStatement, WriteSqliteIntegerValueView) ASSERT_THAT(statement, HasValues("see", 33, 1)); } -TEST_F(SqliteStatement, WriteSqliteDoubeValueView) +TEST_F(SqliteStatement, write_sqlite_doube_value_view) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); @@ -645,7 +645,7 @@ TEST_F(SqliteStatement, WriteSqliteDoubeValueView) ASSERT_THAT(statement, HasValues("see", 7.23, 1)); } -TEST_F(SqliteStatement, WriteSqliteStringValueView) +TEST_F(SqliteStatement, write_sqlite_string_value_view) { WriteStatement<3> statement("UPDATE test SET name=?, number=? WHERE rowid=?", database); @@ -654,7 +654,7 @@ TEST_F(SqliteStatement, WriteSqliteStringValueView) ASSERT_THAT(statement, HasValues("see", "foo", 1)); } -TEST_F(SqliteStatement, WriteSqliteBlobValueView) +TEST_F(SqliteStatement, write_sqlite_blob_value_view) { SqliteTestStatement<0, 1> statement("INSERT INTO test VALUES ('blob', 40, ?)", database); SqliteTestStatement<1, 0> readStatement("SELECT value FROM test WHERE name = 'blob'", database); @@ -668,7 +668,7 @@ TEST_F(SqliteStatement, WriteSqliteBlobValueView) Optional(Field(&Sqlite::Blob::bytes, Eq(bytes)))); } -TEST_F(SqliteStatement, WriteEmptyBlobs) +TEST_F(SqliteStatement, write_empty_blobs) { SqliteTestStatement<1, 1> statement("WITH T(blob) AS (VALUES (?)) SELECT blob FROM T", database); @@ -679,7 +679,7 @@ TEST_F(SqliteStatement, WriteEmptyBlobs) ASSERT_THAT(statement.fetchBlobValue(0), IsEmpty()); } -TEST_F(SqliteStatement, EmptyBlobsAreNull) +TEST_F(SqliteStatement, empty_blobs_are_null) { SqliteTestStatement<1, 1> statement( "WITH T(blob) AS (VALUES (?)) SELECT ifnull(blob, 1) FROM T", database); @@ -691,7 +691,7 @@ TEST_F(SqliteStatement, EmptyBlobsAreNull) ASSERT_THAT(statement.fetchType(0), Eq(Sqlite::Type::Null)); } -TEST_F(SqliteStatement, WriteBlobs) +TEST_F(SqliteStatement, write_blobs) { SqliteTestStatement<0, 1> statement("INSERT INTO test VALUES ('blob', 40, ?)", database); SqliteTestStatement<1, 0> readStatement("SELECT value FROM test WHERE name = 'blob'", database); @@ -705,7 +705,7 @@ TEST_F(SqliteStatement, WriteBlobs) Optional(Field(&Sqlite::Blob::bytes, Eq(bytes)))); } -TEST_F(SqliteStatement, CannotWriteToClosedDatabase) +TEST_F(SqliteStatement, cannot_write_to_closed_database) { database.close(); @@ -713,14 +713,14 @@ TEST_F(SqliteStatement, CannotWriteToClosedDatabase) Sqlite::DatabaseIsNotOpen); } -TEST_F(SqliteStatement, CannotReadFromClosedDatabase) +TEST_F(SqliteStatement, cannot_read_from_closed_database) { database.close(); ASSERT_THROW(ReadStatement<3>("SELECT * FROM test", database), Sqlite::DatabaseIsNotOpen); } -TEST_F(SqliteStatement, GetTupleValuesWithoutArguments) +TEST_F(SqliteStatement, get_tuple_values_without_arguments) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test", database); @@ -731,7 +731,7 @@ TEST_F(SqliteStatement, GetTupleValuesWithoutArguments) UnorderedElementsAre(Tuple{"bar", 0, 1}, Tuple{"foo", 23.3, 2}, Tuple{"poo", 40.0, 3})); } -TEST_F(SqliteStatement, GetTupleRangeWithoutArguments) +TEST_F(SqliteStatement, get_tuple_range_without_arguments) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test", database); @@ -742,7 +742,7 @@ TEST_F(SqliteStatement, GetTupleRangeWithoutArguments) UnorderedElementsAre(Tuple{"bar", 0, 1}, Tuple{"foo", 23.3, 2}, Tuple{"poo", 40.0, 3})); } -TEST_F(SqliteStatement, GetTupleRangeWithTransactionWithoutArguments) +TEST_F(SqliteStatement, get_tuple_range_with_transaction_without_arguments) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test", database); @@ -755,7 +755,7 @@ TEST_F(SqliteStatement, GetTupleRangeWithTransactionWithoutArguments) database.lock(); } -TEST_F(SqliteStatement, GetTupleRangeInForRangeLoop) +TEST_F(SqliteStatement, get_tuple_range_in_for_range_loop) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test", database); @@ -768,7 +768,7 @@ TEST_F(SqliteStatement, GetTupleRangeInForRangeLoop) UnorderedElementsAre(Tuple{"bar", 0, 1}, Tuple{"foo", 23.3, 2}, Tuple{"poo", 40.0, 3})); } -TEST_F(SqliteStatement, GetTupleRangeWithTransactionInForRangeLoop) +TEST_F(SqliteStatement, get_tuple_range_with_transaction_in_for_range_loop) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test", database); @@ -783,7 +783,7 @@ TEST_F(SqliteStatement, GetTupleRangeWithTransactionInForRangeLoop) database.lock(); } -TEST_F(SqliteStatement, GetTupleRangeInForRangeLoopWithBreak) +TEST_F(SqliteStatement, get_tuple_range_in_for_range_loop_with_break) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test ORDER BY name", database); @@ -798,7 +798,7 @@ TEST_F(SqliteStatement, GetTupleRangeInForRangeLoopWithBreak) ASSERT_THAT(values, UnorderedElementsAre(Tuple{"bar", 0, 1}, Tuple{"foo", 23.3, 2})); } -TEST_F(SqliteStatement, GetTupleRangeWithTransactionInForRangeLoopWithBreak) +TEST_F(SqliteStatement, get_tuple_range_with_transaction_in_for_range_loop_with_break) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test ORDER BY name", database); @@ -815,7 +815,7 @@ TEST_F(SqliteStatement, GetTupleRangeWithTransactionInForRangeLoopWithBreak) database.lock(); } -TEST_F(SqliteStatement, GetTupleRangeInForRangeLoopWithContinue) +TEST_F(SqliteStatement, get_tuple_range_in_for_range_loop_with_continue) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test ORDER BY name", database); @@ -830,7 +830,7 @@ TEST_F(SqliteStatement, GetTupleRangeInForRangeLoopWithContinue) ASSERT_THAT(values, UnorderedElementsAre(Tuple{"bar", 0, 1}, Tuple{"poo", 40.0, 3})); } -TEST_F(SqliteStatement, GetTupleRangeWithTransactionInForRangeLoopWithContinue) +TEST_F(SqliteStatement, get_tuple_range_with_transaction_in_for_range_loop_with_continue) { using Tuple = std::tuple; ReadStatement<3> statement("SELECT name, number, value FROM test ORDER BY name", database); @@ -847,7 +847,7 @@ TEST_F(SqliteStatement, GetTupleRangeWithTransactionInForRangeLoopWithContinue) database.lock(); } -TEST_F(SqliteStatement, GetSingleValuesWithoutArguments) +TEST_F(SqliteStatement, get_single_values_without_arguments) { ReadStatement<1> statement("SELECT name FROM test", database); @@ -856,7 +856,7 @@ TEST_F(SqliteStatement, GetSingleValuesWithoutArguments) ASSERT_THAT(values, UnorderedElementsAre("bar", "foo", "poo")); } -TEST_F(SqliteStatement, GetSingleRangeWithoutArguments) +TEST_F(SqliteStatement, get_single_range_without_arguments) { ReadStatement<1> statement("SELECT name FROM test", database); @@ -866,7 +866,7 @@ TEST_F(SqliteStatement, GetSingleRangeWithoutArguments) ASSERT_THAT(values, UnorderedElementsAre("bar", "foo", "poo")); } -TEST_F(SqliteStatement, GetSingleRangeWithTransactionWithoutArguments) +TEST_F(SqliteStatement, get_single_range_with_transaction_without_arguments) { ReadStatement<1> statement("SELECT name FROM test", database); database.unlock(); @@ -894,7 +894,7 @@ public: } }; -TEST_F(SqliteStatement, GetSingleSqliteValuesWithoutArguments) +TEST_F(SqliteStatement, get_single_sqlite_values_without_arguments) { ReadStatement<1> statement("SELECT number FROM test", database); database.execute("INSERT INTO test VALUES (NULL, NULL, NULL)"); @@ -904,7 +904,7 @@ TEST_F(SqliteStatement, GetSingleSqliteValuesWithoutArguments) ASSERT_THAT(values, UnorderedElementsAre(Eq("blah"), Eq(23.3), Eq(40), IsNull())); } -TEST_F(SqliteStatement, GetSingleSqliteRangeWithoutArguments) +TEST_F(SqliteStatement, get_single_sqlite_range_without_arguments) { ReadStatement<1> statement("SELECT number FROM test", database); database.execute("INSERT INTO test VALUES (NULL, NULL, NULL)"); @@ -915,7 +915,7 @@ TEST_F(SqliteStatement, GetSingleSqliteRangeWithoutArguments) ASSERT_THAT(values, UnorderedElementsAre(Eq("blah"), Eq(23.3), Eq(40), IsNull())); } -TEST_F(SqliteStatement, GetSingleSqliteRangeWithTransactionWithoutArguments) +TEST_F(SqliteStatement, get_single_sqlite_range_with_transaction_without_arguments) { ReadStatement<1> statement("SELECT number FROM test", database); database.execute("INSERT INTO test VALUES (NULL, NULL, NULL)"); @@ -927,7 +927,7 @@ TEST_F(SqliteStatement, GetSingleSqliteRangeWithTransactionWithoutArguments) database.lock(); } -TEST_F(SqliteStatement, GetStructValuesWithoutArguments) +TEST_F(SqliteStatement, get_struct_values_without_arguments) { ReadStatement<3> statement("SELECT name, number, value FROM test", database); @@ -939,7 +939,7 @@ TEST_F(SqliteStatement, GetStructValuesWithoutArguments) Output{"poo", "40", 3})); } -TEST_F(SqliteStatement, GetStructRangeWithoutArguments) +TEST_F(SqliteStatement, get_struct_range_without_arguments) { ReadStatement<3> statement("SELECT name, number, value FROM test", database); @@ -952,7 +952,7 @@ TEST_F(SqliteStatement, GetStructRangeWithoutArguments) Output{"poo", "40", 3})); } -TEST_F(SqliteStatement, GetStructRangeWithTransactionWithoutArguments) +TEST_F(SqliteStatement, get_struct_range_with_transaction_without_arguments) { ReadStatement<3> statement("SELECT name, number, value FROM test", database); database.unlock(); @@ -966,7 +966,7 @@ TEST_F(SqliteStatement, GetStructRangeWithTransactionWithoutArguments) database.lock(); } -TEST_F(SqliteStatement, GetValuesForSingleOutputWithBindingMultipleTimes) +TEST_F(SqliteStatement, get_values_for_single_output_with_binding_multiple_times) { ReadStatement<1, 1> statement("SELECT name FROM test WHERE number=?", database); statement.values(3, 40); @@ -976,7 +976,7 @@ TEST_F(SqliteStatement, GetValuesForSingleOutputWithBindingMultipleTimes) ASSERT_THAT(values, ElementsAre("poo")); } -TEST_F(SqliteStatement, GetRangeForSingleOutputWithBindingMultipleTimes) +TEST_F(SqliteStatement, get_range_for_single_output_with_binding_multiple_times) { ReadStatement<1, 1> statement("SELECT name FROM test WHERE number=?", database); statement.values(3, 40); @@ -987,7 +987,7 @@ TEST_F(SqliteStatement, GetRangeForSingleOutputWithBindingMultipleTimes) ASSERT_THAT(values, ElementsAre("poo")); } -TEST_F(SqliteStatement, GetRangeWithTransactionForSingleOutputWithBindingMultipleTimes) +TEST_F(SqliteStatement, get_range_with_transaction_for_single_output_with_binding_multiple_times) { ReadStatement<1, 1> statement("SELECT name FROM test WHERE number=?", database); statement.values(3, 40); @@ -1000,7 +1000,7 @@ TEST_F(SqliteStatement, GetRangeWithTransactionForSingleOutputWithBindingMultipl database.lock(); } -TEST_F(SqliteStatement, GetValuesForMultipleOutputValuesAndMultipleQueryValue) +TEST_F(SqliteStatement, get_values_for_multiple_output_values_and_multiple_query_value) { using Tuple = std::tuple; ReadStatement<3, 3> statement( @@ -1011,7 +1011,7 @@ TEST_F(SqliteStatement, GetValuesForMultipleOutputValuesAndMultipleQueryValue) ASSERT_THAT(values, ElementsAre(Tuple{"bar", "blah", 1})); } -TEST_F(SqliteStatement, GetRangeForMultipleOutputValuesAndMultipleQueryValue) +TEST_F(SqliteStatement, get_range_for_multiple_output_values_and_multiple_query_value) { using Tuple = std::tuple; ReadStatement<3, 3> statement( @@ -1023,7 +1023,7 @@ TEST_F(SqliteStatement, GetRangeForMultipleOutputValuesAndMultipleQueryValue) ASSERT_THAT(values, ElementsAre(Tuple{"bar", "blah", 1})); } -TEST_F(SqliteStatement, GetRangeWithTransactionForMultipleOutputValuesAndMultipleQueryValue) +TEST_F(SqliteStatement, get_range_with_transaction_for_multiple_output_values_and_multiple_query_value) { using Tuple = std::tuple; ReadStatement<3, 3> statement( @@ -1036,7 +1036,7 @@ TEST_F(SqliteStatement, GetRangeWithTransactionForMultipleOutputValuesAndMultipl database.lock(); } -TEST_F(SqliteStatement, CallGetValuesForMultipleOutputValuesAndMultipleQueryValueMultipleTimes) +TEST_F(SqliteStatement, call_get_values_for_multiple_output_values_and_multiple_query_value_multiple_times) { using Tuple = std::tuple; ReadStatement<3, 2> statement("SELECT name, number, value FROM test WHERE name=? AND number=?", @@ -1048,7 +1048,7 @@ TEST_F(SqliteStatement, CallGetValuesForMultipleOutputValuesAndMultipleQueryValu ASSERT_THAT(values, ElementsAre(Tuple{"bar", "blah", 1})); } -TEST_F(SqliteStatement, CallGetRangeForMultipleOutputValuesAndMultipleQueryValueMultipleTimes) +TEST_F(SqliteStatement, call_get_range_for_multiple_output_values_and_multiple_query_value_multiple_times) { using Tuple = std::tuple; ReadStatement<3, 2> statement("SELECT name, number, value FROM test WHERE name=? AND number=?", @@ -1065,7 +1065,7 @@ TEST_F(SqliteStatement, CallGetRangeForMultipleOutputValuesAndMultipleQueryValue } TEST_F(SqliteStatement, - CallGetRangeWithTransactionForMultipleOutputValuesAndMultipleQueryValueMultipleTimes) + call_get_range_with_transaction_for_multiple_output_values_and_multiple_query_value_multiple_times) { using Tuple = std::tuple; ReadStatement<3, 2> statement("SELECT name, number, value FROM test WHERE name=? AND number=?", @@ -1079,7 +1079,7 @@ TEST_F(SqliteStatement, database.lock(); } -TEST_F(SqliteStatement, GetStructOutputValuesAndMultipleQueryValue) +TEST_F(SqliteStatement, get_struct_output_values_and_multiple_query_value) { ReadStatement<3, 3> statement( "SELECT name, number, value FROM test WHERE name=? AND number=? AND value=?", database); @@ -1089,7 +1089,7 @@ TEST_F(SqliteStatement, GetStructOutputValuesAndMultipleQueryValue) ASSERT_THAT(values, ElementsAre(Output{"bar", "blah", 1})); } -TEST_F(SqliteStatement, GetBlobValues) +TEST_F(SqliteStatement, get_blob_values) { database.execute("INSERT INTO test VALUES ('blob', 40, x'AABBCCDD')"); ReadStatement<1> statement("SELECT value FROM test WHERE name='blob'", database); @@ -1102,7 +1102,7 @@ TEST_F(SqliteStatement, GetBlobValues) ASSERT_THAT(values, ElementsAre(Field(&Sqlite::Blob::bytes, Eq(bytes)))); } -TEST_F(SqliteStatement, GetEmptyOptionalBlobValueForInteger) +TEST_F(SqliteStatement, get_empty_optional_blob_value_for_integer) { ReadStatement<1> statement("SELECT value FROM test WHERE name='poo'", database); @@ -1111,7 +1111,7 @@ TEST_F(SqliteStatement, GetEmptyOptionalBlobValueForInteger) ASSERT_THAT(value, Optional(Field(&Sqlite::Blob::bytes, IsEmpty()))); } -TEST_F(SqliteStatement, GetEmptyOptionalBlobValueForFloat) +TEST_F(SqliteStatement, get_empty_optional_blob_value_for_float) { ReadStatement<1> statement("SELECT number FROM test WHERE name='foo'", database); @@ -1120,7 +1120,7 @@ TEST_F(SqliteStatement, GetEmptyOptionalBlobValueForFloat) ASSERT_THAT(value, Optional(Field(&Sqlite::Blob::bytes, IsEmpty()))); } -TEST_F(SqliteStatement, GetEmptyOptionalBlobValueForText) +TEST_F(SqliteStatement, get_empty_optional_blob_value_for_text) { ReadStatement<1> statement("SELECT number FROM test WHERE name='bar'", database); @@ -1129,7 +1129,7 @@ TEST_F(SqliteStatement, GetEmptyOptionalBlobValueForText) ASSERT_THAT(value, Optional(Field(&Sqlite::Blob::bytes, IsEmpty()))); } -TEST_F(SqliteStatement, GetOptionalSingleValueAndMultipleQueryValue) +TEST_F(SqliteStatement, get_optional_single_value_and_multiple_query_value) { ReadStatement<1, 3> statement("SELECT name FROM test WHERE name=? AND number=? AND value=?", database); @@ -1139,7 +1139,7 @@ TEST_F(SqliteStatement, GetOptionalSingleValueAndMultipleQueryValue) ASSERT_THAT(value.value(), Eq("bar")); } -TEST_F(SqliteStatement, GetOptionalOutputValueAndMultipleQueryValue) +TEST_F(SqliteStatement, get_optional_output_value_and_multiple_query_value) { ReadStatement<3, 3> statement( "SELECT name, number, value FROM test WHERE name=? AND number=? AND value=?", database); @@ -1149,7 +1149,7 @@ TEST_F(SqliteStatement, GetOptionalOutputValueAndMultipleQueryValue) ASSERT_THAT(value.value(), Eq(Output{"bar", "blah", 1})); } -TEST_F(SqliteStatement, GetOptionalTupleValueAndMultipleQueryValue) +TEST_F(SqliteStatement, get_optional_tuple_value_and_multiple_query_value) { using Tuple = std::tuple; ReadStatement<3, 3> statement( @@ -1160,7 +1160,7 @@ TEST_F(SqliteStatement, GetOptionalTupleValueAndMultipleQueryValue) ASSERT_THAT(value.value(), Eq(Tuple{"bar", "blah", 1})); } -TEST_F(SqliteStatement, GetOptionalValueCallsReset) +TEST_F(SqliteStatement, get_optional_value_calls_reset) { MockSqliteStatement<1, 1> mockStatement{databaseMock}; @@ -1169,7 +1169,7 @@ TEST_F(SqliteStatement, GetOptionalValueCallsReset) mockStatement.optionalValue("bar"); } -TEST_F(SqliteStatement, GetOptionalValueCallsResetIfExceptionIsThrown) +TEST_F(SqliteStatement, get_optional_value_calls_reset_if_exception_is_thrown) { MockSqliteStatement<1, 1> mockStatement{databaseMock}; ON_CALL(mockStatement, next()).WillByDefault(Throw(Sqlite::StatementHasError(""))); @@ -1179,7 +1179,7 @@ TEST_F(SqliteStatement, GetOptionalValueCallsResetIfExceptionIsThrown) EXPECT_THROW(mockStatement.optionalValue("bar"), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, GetSingleValueAndMultipleQueryValue) +TEST_F(SqliteStatement, get_single_value_and_multiple_query_value) { ReadStatement<1, 3> statement("SELECT name FROM test WHERE name=? AND number=? AND value=?", database); @@ -1189,7 +1189,7 @@ TEST_F(SqliteStatement, GetSingleValueAndMultipleQueryValue) ASSERT_THAT(value, Eq("bar")); } -TEST_F(SqliteStatement, GetOutputValueAndMultipleQueryValue) +TEST_F(SqliteStatement, get_output_value_and_multiple_query_value) { ReadStatement<3, 3> statement( "SELECT name, number, value FROM test WHERE name=? AND number=? AND value=?", database); @@ -1199,7 +1199,7 @@ TEST_F(SqliteStatement, GetOutputValueAndMultipleQueryValue) ASSERT_THAT(value, Eq(Output{"bar", "blah", 1})); } -TEST_F(SqliteStatement, GetTupleValueAndMultipleQueryValue) +TEST_F(SqliteStatement, get_tuple_value_and_multiple_query_value) { using Tuple = std::tuple; ReadStatement<3, 3> statement( @@ -1210,7 +1210,7 @@ TEST_F(SqliteStatement, GetTupleValueAndMultipleQueryValue) ASSERT_THAT(value, Eq(Tuple{"bar", "blah", 1})); } -TEST_F(SqliteStatement, GetSingleInvalidLongLongId) +TEST_F(SqliteStatement, get_single_invalid_long_long_id) { TestLongLongId id; WriteStatement<1>("INSERT INTO test VALUES ('id', 323, ?)", database).write(id); @@ -1221,7 +1221,7 @@ TEST_F(SqliteStatement, GetSingleInvalidLongLongId) ASSERT_FALSE(value.isValid()); } -TEST_F(SqliteStatement, GetSingleLongLongId) +TEST_F(SqliteStatement, get_single_long_long_id) { TestLongLongId id{TestLongLongId::create(42)}; WriteStatement<1>("INSERT INTO test VALUES ('id', 323, ?)", database).write(id); @@ -1232,7 +1232,7 @@ TEST_F(SqliteStatement, GetSingleLongLongId) ASSERT_THAT(value.internalId(), Eq(42)); } -TEST_F(SqliteStatement, GetSingleInvalidIntId) +TEST_F(SqliteStatement, get_single_invalid_int_id) { TestIntId id; WriteStatement<1>("INSERT INTO test VALUES ('id', 323, ?)", database).write(id); @@ -1243,7 +1243,7 @@ TEST_F(SqliteStatement, GetSingleInvalidIntId) ASSERT_FALSE(value.isValid()); } -TEST_F(SqliteStatement, GetSingleIntId) +TEST_F(SqliteStatement, get_single_int_id) { TestIntId id{TestIntId::create(42)}; WriteStatement<1>("INSERT INTO test VALUES ('id', 323, ?)", database).write(id); @@ -1254,7 +1254,7 @@ TEST_F(SqliteStatement, GetSingleIntId) ASSERT_THAT(value.internalId(), Eq(42)); } -TEST_F(SqliteStatement, GetValueCallsReset) +TEST_F(SqliteStatement, get_value_calls_reset) { struct Value { @@ -1272,7 +1272,7 @@ TEST_F(SqliteStatement, GetValueCallsReset) mockStatement.value("bar"); } -TEST_F(SqliteStatement, GetValueCallsResetIfExceptionIsThrown) +TEST_F(SqliteStatement, get_value_calls_reset_if_exception_is_thrown) { struct Value { @@ -1291,7 +1291,7 @@ TEST_F(SqliteStatement, GetValueCallsResetIfExceptionIsThrown) EXPECT_THROW(mockStatement.value("bar"), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, GetValuesWithoutArgumentsCallsReset) +TEST_F(SqliteStatement, get_values_without_arguments_calls_reset) { MockSqliteStatement<1, 0> mockStatement{databaseMock}; @@ -1300,7 +1300,7 @@ TEST_F(SqliteStatement, GetValuesWithoutArgumentsCallsReset) mockStatement.values(3); } -TEST_F(SqliteStatement, GetRangeWithoutArgumentsCallsReset) +TEST_F(SqliteStatement, get_range_without_arguments_calls_reset) { MockSqliteStatement<1, 0> mockStatement{databaseMock}; @@ -1309,7 +1309,7 @@ TEST_F(SqliteStatement, GetRangeWithoutArgumentsCallsReset) mockStatement.range(); } -TEST_F(SqliteStatement, GetRangeWithTransactionWithoutArgumentsCalls) +TEST_F(SqliteStatement, get_range_with_transaction_without_arguments_calls) { InSequence s; MockSqliteStatement<1, 0> mockStatement{databaseMock}; @@ -1323,7 +1323,7 @@ TEST_F(SqliteStatement, GetRangeWithTransactionWithoutArgumentsCalls) mockStatement.rangeWithTransaction(); } -TEST_F(SqliteStatement, GetValuesWithoutArgumentsCallsResetIfExceptionIsThrown) +TEST_F(SqliteStatement, get_values_without_arguments_calls_reset_if_exception_is_thrown) { MockSqliteStatement<1, 0> mockStatement{databaseMock}; ON_CALL(mockStatement, next()).WillByDefault(Throw(Sqlite::StatementHasError(""))); @@ -1333,7 +1333,7 @@ TEST_F(SqliteStatement, GetValuesWithoutArgumentsCallsResetIfExceptionIsThrown) EXPECT_THROW(mockStatement.values(3), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, GetRangeWithoutArgumentsCallsResetIfExceptionIsThrown) +TEST_F(SqliteStatement, get_range_without_arguments_calls_reset_if_exception_is_thrown) { MockSqliteStatement<1, 0> mockStatement{databaseMock}; ON_CALL(mockStatement, next()).WillByDefault(Throw(Sqlite::StatementHasError(""))); @@ -1344,7 +1344,7 @@ TEST_F(SqliteStatement, GetRangeWithoutArgumentsCallsResetIfExceptionIsThrown) EXPECT_THROW(range.begin(), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, GetRangeWithTransactionWithoutArgumentsCallsResetIfExceptionIsThrown) +TEST_F(SqliteStatement, get_range_with_transaction_without_arguments_calls_reset_if_exception_is_thrown) { InSequence s; MockSqliteStatement<1, 0> mockStatement{databaseMock}; @@ -1364,7 +1364,7 @@ TEST_F(SqliteStatement, GetRangeWithTransactionWithoutArgumentsCallsResetIfExcep Sqlite::StatementHasError); } -TEST_F(SqliteStatement, GetValuesWithSimpleArgumentsCallsReset) +TEST_F(SqliteStatement, get_values_with_simple_arguments_calls_reset) { MockSqliteStatement<1, 2> mockStatement{databaseMock}; @@ -1373,7 +1373,7 @@ TEST_F(SqliteStatement, GetValuesWithSimpleArgumentsCallsReset) mockStatement.values(3, "foo", "bar"); } -TEST_F(SqliteStatement, GetValuesWithSimpleArgumentsCallsResetIfExceptionIsThrown) +TEST_F(SqliteStatement, get_values_with_simple_arguments_calls_reset_if_exception_is_thrown) { MockSqliteStatement<1, 2> mockStatement{databaseMock}; ON_CALL(mockStatement, next()).WillByDefault(Throw(Sqlite::StatementHasError(""))); @@ -1383,7 +1383,7 @@ TEST_F(SqliteStatement, GetValuesWithSimpleArgumentsCallsResetIfExceptionIsThrow EXPECT_THROW(mockStatement.values(3, "foo", "bar"), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, ResetIfWriteIsThrowingException) +TEST_F(SqliteStatement, reset_if_write_is_throwing_exception) { MockSqliteStatement<1, 1> mockStatement{databaseMock}; @@ -1394,7 +1394,7 @@ TEST_F(SqliteStatement, ResetIfWriteIsThrowingException) ASSERT_ANY_THROW(mockStatement.write("bar")); } -TEST_F(SqliteStatement, ResetIfExecuteThrowsException) +TEST_F(SqliteStatement, reset_if_execute_throws_exception) { MockSqliteStatement<1, 0> mockStatement{databaseMock}; @@ -1404,37 +1404,37 @@ TEST_F(SqliteStatement, ResetIfExecuteThrowsException) ASSERT_ANY_THROW(mockStatement.execute()); } -TEST_F(SqliteStatement, ReadStatementThrowsWrongColumnCount) +TEST_F(SqliteStatement, read_statement_throws_wrong_column_count) { ASSERT_THROW(ReadStatement<1> statement("SELECT name, number FROM test", database), Sqlite::WrongColumnCount); } -TEST_F(SqliteStatement, ReadWriteStatementThrowsWrongColumnCount) +TEST_F(SqliteStatement, read_write_statement_throws_wrong_column_count) { ASSERT_THROW(ReadWriteStatement<1> statement("SELECT name, number FROM test", database), Sqlite::WrongColumnCount); } -TEST_F(SqliteStatement, WriteStatementThrowsWrongBindingParameterCount) +TEST_F(SqliteStatement, write_statement_throws_wrong_binding_parameter_count) { ASSERT_THROW(WriteStatement<1>("INSERT INTO test(name, number) VALUES(?1, ?2)", database), Sqlite::WrongBindingParameterCount); } -TEST_F(SqliteStatement, ReadWriteStatementThrowsWrongBindingParameterCount) +TEST_F(SqliteStatement, read_write_statement_throws_wrong_binding_parameter_count) { ASSERT_THROW((ReadWriteStatement<0, 1>("INSERT INTO test(name, number) VALUES(?1, ?2)", database)), Sqlite::WrongBindingParameterCount); } -TEST_F(SqliteStatement, ReadStatementThrowsWrongBindingParameterCount) +TEST_F(SqliteStatement, read_statement_throws_wrong_binding_parameter_count) { ASSERT_THROW((ReadStatement<2, 0>("SELECT name, number FROM test WHERE name=?", database)), Sqlite::WrongBindingParameterCount); } -TEST_F(SqliteStatement, ReadCallback) +TEST_F(SqliteStatement, read_callback) { MockFunction callbackMock; ReadStatement<2> statement("SELECT name, value FROM test", database); @@ -1446,7 +1446,7 @@ TEST_F(SqliteStatement, ReadCallback) statement.readCallback(callbackMock.AsStdFunction()); } -TEST_F(SqliteStatement, ReadCallbackWithoutControl) +TEST_F(SqliteStatement, read_callback_without_control) { MockFunction callbackMock; ReadStatement<2> statement("SELECT name, value FROM test", database); @@ -1458,7 +1458,7 @@ TEST_F(SqliteStatement, ReadCallbackWithoutControl) statement.readCallback(callbackMock.AsStdFunction()); } -TEST_F(SqliteStatement, ReadCallbackCalledWithArguments) +TEST_F(SqliteStatement, read_callback_called_with_arguments) { MockFunction callbackMock; ReadStatement<2, 1> statement("SELECT name, value FROM test WHERE value=?", database); @@ -1468,7 +1468,7 @@ TEST_F(SqliteStatement, ReadCallbackCalledWithArguments) statement.readCallback(callbackMock.AsStdFunction(), 2); } -TEST_F(SqliteStatement, ReadCallbackAborts) +TEST_F(SqliteStatement, read_callback_aborts) { MockFunction callbackMock; ReadStatement<2> statement("SELECT name, value FROM test ORDER BY name", database); @@ -1480,7 +1480,7 @@ TEST_F(SqliteStatement, ReadCallbackAborts) statement.readCallback(callbackMock.AsStdFunction()); } -TEST_F(SqliteStatement, ReadCallbackCallsResetAfterCallbacks) +TEST_F(SqliteStatement, read_callback_calls_reset_after_callbacks) { MockFunction callbackMock; MockSqliteStatement<2> mockStatement{databaseMock}; @@ -1490,7 +1490,7 @@ TEST_F(SqliteStatement, ReadCallbackCallsResetAfterCallbacks) mockStatement.readCallback(callbackMock.AsStdFunction()); } -TEST_F(SqliteStatement, ReadCallbackCallsResetAfterCallbacksAborts) +TEST_F(SqliteStatement, read_callback_calls_reset_after_callbacks_aborts) { MockFunction callbackMock; MockSqliteStatement<2> mockStatement{databaseMock}; @@ -1501,7 +1501,7 @@ TEST_F(SqliteStatement, ReadCallbackCallsResetAfterCallbacksAborts) mockStatement.readCallback(callbackMock.AsStdFunction()); } -TEST_F(SqliteStatement, ReadCallbackThrowsForError) +TEST_F(SqliteStatement, read_callback_throws_for_error) { MockFunction callbackMock; MockSqliteStatement<2> mockStatement{databaseMock}; @@ -1510,7 +1510,7 @@ TEST_F(SqliteStatement, ReadCallbackThrowsForError) ASSERT_THROW(mockStatement.readCallback(callbackMock.AsStdFunction()), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, ReadCallbackCallsResetIfExceptionIsThrown) +TEST_F(SqliteStatement, read_callback_calls_reset_if_exception_is_thrown) { MockFunction callbackMock; MockSqliteStatement<2> mockStatement{databaseMock}; @@ -1521,7 +1521,7 @@ TEST_F(SqliteStatement, ReadCallbackCallsResetIfExceptionIsThrown) EXPECT_THROW(mockStatement.readCallback(callbackMock.AsStdFunction()), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, ReadToContainer) +TEST_F(SqliteStatement, read_to_container) { std::deque values; ReadStatement<1> statement("SELECT number FROM test", database); @@ -1531,7 +1531,7 @@ TEST_F(SqliteStatement, ReadToContainer) ASSERT_THAT(values, UnorderedElementsAre(Eq("blah"), Eq(23.3), Eq(40))); } -TEST_F(SqliteStatement, ReadToContainerCallCallbackWithArguments) +TEST_F(SqliteStatement, read_to_container_call_callback_with_arguments) { std::deque values; ReadStatement<1, 1> statement("SELECT number FROM test WHERE value=?", database); @@ -1541,7 +1541,7 @@ TEST_F(SqliteStatement, ReadToContainerCallCallbackWithArguments) ASSERT_THAT(values, ElementsAre(Eq(23.3))); } -TEST_F(SqliteStatement, ReadToCallsResetAfterPushingAllValuesBack) +TEST_F(SqliteStatement, read_to_calls_reset_after_pushing_all_values_back) { std::deque values; MockSqliteStatement mockStatement{databaseMock}; @@ -1551,7 +1551,7 @@ TEST_F(SqliteStatement, ReadToCallsResetAfterPushingAllValuesBack) mockStatement.readTo(values); } -TEST_F(SqliteStatement, ReadToThrowsForError) +TEST_F(SqliteStatement, read_to_throws_for_error) { std::deque values; MockSqliteStatement mockStatement{databaseMock}; @@ -1560,7 +1560,7 @@ TEST_F(SqliteStatement, ReadToThrowsForError) ASSERT_THROW(mockStatement.readTo(values), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, ReadToCallsResetIfExceptionIsThrown) +TEST_F(SqliteStatement, read_to_calls_reset_if_exception_is_thrown) { std::deque values; MockSqliteStatement mockStatement{databaseMock}; @@ -1571,7 +1571,7 @@ TEST_F(SqliteStatement, ReadToCallsResetIfExceptionIsThrown) EXPECT_THROW(mockStatement.readTo(values), Sqlite::StatementHasError); } -TEST_F(SqliteStatement, ReadStatementValuesWithTransactions) +TEST_F(SqliteStatement, read_statement_values_with_transactions) { using Tuple = std::tuple; ReadStatement<3, 2> statement("SELECT name, number, value FROM test WHERE name=? AND number=?", @@ -1584,7 +1584,7 @@ TEST_F(SqliteStatement, ReadStatementValuesWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadStatementValueWithTransactions) +TEST_F(SqliteStatement, read_statement_value_with_transactions) { using Tuple = std::tuple; ReadStatement<3, 2> statement("SELECT name, number, value FROM test WHERE name=? AND number=?", @@ -1597,7 +1597,7 @@ TEST_F(SqliteStatement, ReadStatementValueWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadStatementOptionalValueWithTransactions) +TEST_F(SqliteStatement, read_statement_optional_value_with_transactions) { using Tuple = std::tuple; ReadStatement<3, 2> statement("SELECT name, number, value FROM test WHERE name=? AND number=?", @@ -1610,7 +1610,7 @@ TEST_F(SqliteStatement, ReadStatementOptionalValueWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadStatementReadCallbackWithTransactions) +TEST_F(SqliteStatement, read_statement_read_callback_with_transactions) { MockFunction callbackMock; ReadStatement<3, 2> statement("SELECT name, number, value FROM test WHERE name=? AND number=?", @@ -1623,7 +1623,7 @@ TEST_F(SqliteStatement, ReadStatementReadCallbackWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadStatementReadToWithTransactions) +TEST_F(SqliteStatement, read_statement_read_to_with_transactions) { using Tuple = std::tuple; ReadStatement<3, 2> statement("SELECT name, number, value FROM test WHERE name=? AND number=?", @@ -1637,7 +1637,7 @@ TEST_F(SqliteStatement, ReadStatementReadToWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadWriteStatementValuesWithTransactions) +TEST_F(SqliteStatement, read_write_statement_values_with_transactions) { using Tuple = std::tuple; ReadWriteStatement<3, 2> statement( @@ -1650,7 +1650,7 @@ TEST_F(SqliteStatement, ReadWriteStatementValuesWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadWriteStatementValueWithTransactions) +TEST_F(SqliteStatement, read_write_statement_value_with_transactions) { using Tuple = std::tuple; ReadWriteStatement<3, 2> statement( @@ -1663,7 +1663,7 @@ TEST_F(SqliteStatement, ReadWriteStatementValueWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadWriteStatementOptionalValueWithTransactions) +TEST_F(SqliteStatement, read_write_statement_optional_value_with_transactions) { using Tuple = std::tuple; ReadWriteStatement<3, 2> statement( @@ -1676,7 +1676,7 @@ TEST_F(SqliteStatement, ReadWriteStatementOptionalValueWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadWriteStatementReadCallbackWithTransactions) +TEST_F(SqliteStatement, read_write_statement_read_callback_with_transactions) { MockFunction callbackMock; ReadWriteStatement<3, 2> statement( @@ -1689,7 +1689,7 @@ TEST_F(SqliteStatement, ReadWriteStatementReadCallbackWithTransactions) database.lock(); } -TEST_F(SqliteStatement, ReadWriteStatementReadToWithTransactions) +TEST_F(SqliteStatement, read_write_statement_read_to_with_transactions) { using Tuple = std::tuple; ReadWriteStatement<3, 2> statement( diff --git a/tests/unit/tests/unittests/sqlite/sqlitetable-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitetable-test.cpp index be2f0fa3dee..7b8189b51e4 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitetable-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitetable-test.cpp @@ -31,28 +31,28 @@ protected: Utils::SmallString tableName = "testTable"; }; -TEST_F(SqliteTable, ColumnIsAddedToTable) +TEST_F(SqliteTable, column_is_added_to_table) { table.setUseWithoutRowId(true); ASSERT_TRUE(table.useWithoutRowId()); } -TEST_F(SqliteTable, SetTableName) +TEST_F(SqliteTable, set_table_name) { table.setName(tableName.clone()); ASSERT_THAT(table.name(), tableName); } -TEST_F(SqliteTable, SetUseWithoutRowid) +TEST_F(SqliteTable, set_use_without_rowid) { table.setUseWithoutRowId(true); ASSERT_TRUE(table.useWithoutRowId()); } -TEST_F(SqliteTable, AddIndex) +TEST_F(SqliteTable, add_index) { table.setName(tableName.clone()); auto &column = table.addColumn("name"); @@ -65,7 +65,7 @@ TEST_F(SqliteTable, AddIndex) Eq("CREATE INDEX IF NOT EXISTS index_testTable_name_value ON testTable(name, value)")); } -TEST_F(SqliteTable, InitializeTable) +TEST_F(SqliteTable, initialize_table) { table.setName(tableName.clone()); table.setUseIfNotExists(true); @@ -81,7 +81,7 @@ TEST_F(SqliteTable, InitializeTable) table.initialize(databaseMock); } -TEST_F(SqliteTable, InitializeTableWithIndex) +TEST_F(SqliteTable, initialize_table_with_index) { InSequence sequence; table.setName(tableName.clone()); @@ -100,7 +100,7 @@ TEST_F(SqliteTable, InitializeTableWithIndex) table.initialize(databaseMock); } -TEST_F(SqliteTable, InitializeTableWithUniqueIndex) +TEST_F(SqliteTable, initialize_table_with_unique_index) { InSequence sequence; table.setName(tableName.clone()); @@ -121,7 +121,7 @@ TEST_F(SqliteTable, InitializeTableWithUniqueIndex) table.initialize(databaseMock); } -TEST_F(SqliteTable, AddForeignKeyColumnWithTableCalls) +TEST_F(SqliteTable, add_foreign_key_column_with_table_calls) { Sqlite::Table foreignTable; foreignTable.setName("foreignTable"); @@ -139,7 +139,7 @@ TEST_F(SqliteTable, AddForeignKeyColumnWithTableCalls) table.initialize(databaseMock); } -TEST_F(SqliteTable, AddForeignKeyColumnWithColumnCalls) +TEST_F(SqliteTable, add_foreign_key_column_with_column_calls) { Sqlite::Table foreignTable; foreignTable.setName("foreignTable"); @@ -160,7 +160,7 @@ TEST_F(SqliteTable, AddForeignKeyColumnWithColumnCalls) table.initialize(databaseMock); } -TEST_F(SqliteTable, AddColumn) +TEST_F(SqliteTable, add_column) { table.setName(tableName); @@ -174,7 +174,7 @@ TEST_F(SqliteTable, AddColumn) ElementsAre(VariantWith(Eq(Sqlite::Unique{})))))); } -TEST_F(SqliteTable, AddForeignKeyColumnWithTable) +TEST_F(SqliteTable, add_foreign_key_column_with_table) { Sqlite::Table foreignTable; foreignTable.setName("foreignTable"); @@ -200,7 +200,7 @@ TEST_F(SqliteTable, AddForeignKeyColumnWithTable) Field(&ForeignKey::enforcement, Enforment::Deferred))))))); } -TEST_F(SqliteTable, AddForeignKeyColumnWithColumn) +TEST_F(SqliteTable, add_foreign_key_column_with_column) { Sqlite::Table foreignTable; foreignTable.setName("foreignTable"); @@ -226,7 +226,7 @@ TEST_F(SqliteTable, AddForeignKeyColumnWithColumn) Field(&ForeignKey::enforcement, Enforment::Deferred))))))); } -TEST_F(SqliteTable, AddForeignKeyWhichIsNotUniqueThrowsAnExceptions) +TEST_F(SqliteTable, add_foreign_key_which_is_not_unique_throws_an_exceptions) { Sqlite::Table foreignTable; foreignTable.setName("foreignTable"); @@ -241,7 +241,7 @@ TEST_F(SqliteTable, AddForeignKeyWhichIsNotUniqueThrowsAnExceptions) Sqlite::ForeignKeyColumnIsNotUnique); } -TEST_F(SqliteTable, AddForeignKeyColumnWithTableAndNotNull) +TEST_F(SqliteTable, add_foreign_key_column_with_table_and_not_null) { Sqlite::Table foreignTable; foreignTable.setName("foreignTable"); @@ -270,7 +270,7 @@ TEST_F(SqliteTable, AddForeignKeyColumnWithTableAndNotNull) VariantWith(Eq(Sqlite::NotNull{})))))); } -TEST_F(SqliteTable, AddForeignKeyColumnWithColumnAndNotNull) +TEST_F(SqliteTable, add_foreign_key_column_with_column_and_not_null) { Sqlite::Table foreignTable; foreignTable.setName("foreignTable"); @@ -299,7 +299,7 @@ TEST_F(SqliteTable, AddForeignKeyColumnWithColumnAndNotNull) VariantWith(Eq(Sqlite::NotNull{})))))); } -TEST_F(SqliteTable, AddPrimaryTableContraint) +TEST_F(SqliteTable, add_primary_table_contraint) { table.setName(tableName.clone()); const auto &idColumn = table.addColumn("id"); @@ -321,28 +321,28 @@ protected: Utils::SmallString tableName = "testTable"; }; -TEST_F(StrictSqliteTable, ColumnIsAddedToTable) +TEST_F(StrictSqliteTable, column_is_added_to_table) { table.setUseWithoutRowId(true); ASSERT_TRUE(table.useWithoutRowId()); } -TEST_F(StrictSqliteTable, SetTableName) +TEST_F(StrictSqliteTable, set_table_name) { table.setName(tableName.clone()); ASSERT_THAT(table.name(), tableName); } -TEST_F(StrictSqliteTable, SetUseWithoutRowid) +TEST_F(StrictSqliteTable, set_use_without_rowid) { table.setUseWithoutRowId(true); ASSERT_TRUE(table.useWithoutRowId()); } -TEST_F(StrictSqliteTable, AddIndex) +TEST_F(StrictSqliteTable, add_index) { table.setName(tableName.clone()); auto &column = table.addColumn("name"); @@ -355,7 +355,7 @@ TEST_F(StrictSqliteTable, AddIndex) "value)")); } -TEST_F(StrictSqliteTable, InitializeTable) +TEST_F(StrictSqliteTable, initialize_table) { table.setName(tableName.clone()); table.setUseIfNotExists(true); @@ -371,7 +371,7 @@ TEST_F(StrictSqliteTable, InitializeTable) table.initialize(databaseMock); } -TEST_F(StrictSqliteTable, InitializeTableWithIndex) +TEST_F(StrictSqliteTable, initialize_table_with_index) { InSequence sequence; table.setName(tableName.clone()); @@ -390,7 +390,7 @@ TEST_F(StrictSqliteTable, InitializeTableWithIndex) table.initialize(databaseMock); } -TEST_F(StrictSqliteTable, InitializeTableWithUniqueIndex) +TEST_F(StrictSqliteTable, initialize_table_with_unique_index) { InSequence sequence; table.setName(tableName.clone()); @@ -411,7 +411,7 @@ TEST_F(StrictSqliteTable, InitializeTableWithUniqueIndex) table.initialize(databaseMock); } -TEST_F(StrictSqliteTable, AddForeignKeyColumnWithTableCalls) +TEST_F(StrictSqliteTable, add_foreign_key_column_with_table_calls) { Sqlite::StrictTable foreignTable; foreignTable.setName("foreignTable"); @@ -429,7 +429,7 @@ TEST_F(StrictSqliteTable, AddForeignKeyColumnWithTableCalls) table.initialize(databaseMock); } -TEST_F(StrictSqliteTable, AddForeignKeyColumnWithColumnCalls) +TEST_F(StrictSqliteTable, add_foreign_key_column_with_column_calls) { Sqlite::StrictTable foreignTable; foreignTable.setName("foreignTable"); @@ -452,7 +452,7 @@ TEST_F(StrictSqliteTable, AddForeignKeyColumnWithColumnCalls) table.initialize(databaseMock); } -TEST_F(StrictSqliteTable, AddColumn) +TEST_F(StrictSqliteTable, add_column) { table.setName(tableName); @@ -466,7 +466,7 @@ TEST_F(StrictSqliteTable, AddColumn) ElementsAre(VariantWith(Eq(Sqlite::Unique{})))))); } -TEST_F(StrictSqliteTable, AddForeignKeyColumnWithTable) +TEST_F(StrictSqliteTable, add_foreign_key_column_with_table) { Sqlite::StrictTable foreignTable; foreignTable.setName("foreignTable"); @@ -492,7 +492,7 @@ TEST_F(StrictSqliteTable, AddForeignKeyColumnWithTable) Field(&ForeignKey::enforcement, Enforment::Deferred))))))); } -TEST_F(StrictSqliteTable, AddForeignKeyColumnWithColumn) +TEST_F(StrictSqliteTable, add_foreign_key_column_with_column) { Sqlite::StrictTable foreignTable; foreignTable.setName("foreignTable"); @@ -520,7 +520,7 @@ TEST_F(StrictSqliteTable, AddForeignKeyColumnWithColumn) Field(&ForeignKey::enforcement, Enforment::Deferred))))))); } -TEST_F(StrictSqliteTable, AddForeignKeyWhichIsNotUniqueThrowsAnExceptions) +TEST_F(StrictSqliteTable, add_foreign_key_which_is_not_unique_throws_an_exceptions) { Sqlite::StrictTable foreignTable; foreignTable.setName("foreignTable"); @@ -535,7 +535,7 @@ TEST_F(StrictSqliteTable, AddForeignKeyWhichIsNotUniqueThrowsAnExceptions) Sqlite::ForeignKeyColumnIsNotUnique); } -TEST_F(StrictSqliteTable, AddForeignKeyColumnWithTableAndNotNull) +TEST_F(StrictSqliteTable, add_foreign_key_column_with_table_and_not_null) { Sqlite::StrictTable foreignTable; foreignTable.setName("foreignTable"); @@ -564,7 +564,7 @@ TEST_F(StrictSqliteTable, AddForeignKeyColumnWithTableAndNotNull) VariantWith(Eq(Sqlite::NotNull{})))))); } -TEST_F(StrictSqliteTable, AddForeignKeyColumnWithColumnAndNotNull) +TEST_F(StrictSqliteTable, add_foreign_key_column_with_column_and_not_null) { Sqlite::StrictTable foreignTable; foreignTable.setName("foreignTable"); @@ -595,7 +595,7 @@ TEST_F(StrictSqliteTable, AddForeignKeyColumnWithColumnAndNotNull) VariantWith(Eq(Sqlite::NotNull{})))))); } -TEST_F(StrictSqliteTable, AddPrimaryTableContraint) +TEST_F(StrictSqliteTable, add_primary_table_contraint) { table.setName(tableName.clone()); const auto &idColumn = table.addColumn("id"); diff --git a/tests/unit/tests/unittests/sqlite/sqlitetransaction-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitetransaction-test.cpp index 7bb4770fc79..ac98a258c96 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitetransaction-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitetransaction-test.cpp @@ -30,7 +30,7 @@ protected: NiceMock> callableWithReturnMock; }; -TEST_F(SqliteTransaction, DeferredTransactionCommit) +TEST_F(SqliteTransaction, deferred_transaction_commit) { InSequence s; @@ -43,7 +43,7 @@ TEST_F(SqliteTransaction, DeferredTransactionCommit) transaction.commit(); } -TEST_F(SqliteTransaction, DeferredTransactionRollBack) +TEST_F(SqliteTransaction, deferred_transaction_roll_back) { InSequence s; @@ -55,7 +55,7 @@ TEST_F(SqliteTransaction, DeferredTransactionRollBack) DeferredTransaction transaction{mockTransactionBackend}; } -TEST_F(SqliteTransaction, ImmediateTransactionCommit) +TEST_F(SqliteTransaction, immediate_transaction_commit) { InSequence s; @@ -68,7 +68,7 @@ TEST_F(SqliteTransaction, ImmediateTransactionCommit) transaction.commit(); } -TEST_F(SqliteTransaction, ImmediateTransactionRollBack) +TEST_F(SqliteTransaction, immediate_transaction_roll_back) { InSequence s; @@ -80,7 +80,7 @@ TEST_F(SqliteTransaction, ImmediateTransactionRollBack) ImmediateTransaction transaction{mockTransactionBackend}; } -TEST_F(SqliteTransaction, ExclusiveTransactionCommit) +TEST_F(SqliteTransaction, exclusive_transaction_commit) { InSequence s; @@ -93,7 +93,7 @@ TEST_F(SqliteTransaction, ExclusiveTransactionCommit) transaction.commit(); } -TEST_F(SqliteTransaction, ExclusiveTransactionRollBack) +TEST_F(SqliteTransaction, exclusive_transaction_roll_back) { InSequence s; @@ -105,7 +105,7 @@ TEST_F(SqliteTransaction, ExclusiveTransactionRollBack) ExclusiveTransaction transaction{mockTransactionBackend}; } -TEST_F(SqliteTransaction, DeferredNonThrowingDestructorTransactionCommit) +TEST_F(SqliteTransaction, deferred_non_throwing_destructor_transaction_commit) { InSequence s; @@ -118,7 +118,7 @@ TEST_F(SqliteTransaction, DeferredNonThrowingDestructorTransactionCommit) transaction.commit(); } -TEST_F(SqliteTransaction, DeferredNonThrowingDestructorTransactionCommitCallsInterface) +TEST_F(SqliteTransaction, deferred_non_throwing_destructor_transaction_commit_calls_interface) { InSequence s; @@ -131,7 +131,7 @@ TEST_F(SqliteTransaction, DeferredNonThrowingDestructorTransactionCommitCallsInt transaction.commit(); } -TEST_F(SqliteTransaction, DeferredNonThrowingDestructorTransactionRollBack) +TEST_F(SqliteTransaction, deferred_non_throwing_destructor_transaction_roll_back) { InSequence s; @@ -143,7 +143,7 @@ TEST_F(SqliteTransaction, DeferredNonThrowingDestructorTransactionRollBack) DeferredNonThrowingDestructorTransaction transaction{mockTransactionBackend}; } -TEST_F(SqliteTransaction, ImmediateNonThrowingDestructorTransactionCommit) +TEST_F(SqliteTransaction, immediate_non_throwing_destructor_transaction_commit) { InSequence s; @@ -156,7 +156,7 @@ TEST_F(SqliteTransaction, ImmediateNonThrowingDestructorTransactionCommit) transaction.commit(); } -TEST_F(SqliteTransaction, ImmediateNonThrowingDestructorTransactionRollBack) +TEST_F(SqliteTransaction, immediate_non_throwing_destructor_transaction_roll_back) { InSequence s; @@ -168,7 +168,7 @@ TEST_F(SqliteTransaction, ImmediateNonThrowingDestructorTransactionRollBack) ImmediateNonThrowingDestructorTransaction transaction{mockTransactionBackend}; } -TEST_F(SqliteTransaction, ExclusiveNonThrowingDestructorTransactionCommit) +TEST_F(SqliteTransaction, exclusive_non_throwing_destructor_transaction_commit) { InSequence s; @@ -181,7 +181,7 @@ TEST_F(SqliteTransaction, ExclusiveNonThrowingDestructorTransactionCommit) transaction.commit(); } -TEST_F(SqliteTransaction, ExclusiveTNonThrowingDestructorransactionRollBack) +TEST_F(SqliteTransaction, exclusive_t_non_throwing_destructorransaction_roll_back) { InSequence s; @@ -193,28 +193,28 @@ TEST_F(SqliteTransaction, ExclusiveTNonThrowingDestructorransactionRollBack) ExclusiveNonThrowingDestructorTransaction transaction{mockTransactionBackend}; } -TEST_F(SqliteTransaction, DeferredTransactionBeginThrows) +TEST_F(SqliteTransaction, deferred_transaction_begin_throws) { ON_CALL(mockTransactionBackend, deferredBegin()).WillByDefault(Throw(Sqlite::Exception())); ASSERT_THROW(DeferredTransaction{mockTransactionBackend}, Sqlite::Exception); } -TEST_F(SqliteTransaction, ImmediateTransactionBeginThrows) +TEST_F(SqliteTransaction, immediate_transaction_begin_throws) { ON_CALL(mockTransactionBackend, immediateBegin()).WillByDefault(Throw(Sqlite::Exception())); ASSERT_THROW(ImmediateTransaction{mockTransactionBackend}, Sqlite::Exception); } -TEST_F(SqliteTransaction, ExclusiveTransactionBeginThrows) +TEST_F(SqliteTransaction, exclusive_transaction_begin_throws) { ON_CALL(mockTransactionBackend, exclusiveBegin()).WillByDefault(Throw(Sqlite::Exception())); ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend}, Sqlite::Exception); } -TEST_F(SqliteTransaction, DeferredTransactionBeginThrowsAndNotRollback) +TEST_F(SqliteTransaction, deferred_transaction_begin_throws_and_not_rollback) { InSequence s; @@ -226,7 +226,7 @@ TEST_F(SqliteTransaction, DeferredTransactionBeginThrowsAndNotRollback) ASSERT_ANY_THROW(DeferredTransaction{mockTransactionBackend}); } -TEST_F(SqliteTransaction, ImmediateTransactionBeginThrowsAndNotRollback) +TEST_F(SqliteTransaction, immediate_transaction_begin_throws_and_not_rollback) { InSequence s; @@ -238,7 +238,7 @@ TEST_F(SqliteTransaction, ImmediateTransactionBeginThrowsAndNotRollback) ASSERT_ANY_THROW(ImmediateTransaction{mockTransactionBackend}); } -TEST_F(SqliteTransaction, ExclusiveTransactionBeginThrowsAndNotRollback) +TEST_F(SqliteTransaction, exclusive_transaction_begin_throws_and_not_rollback) { InSequence s; @@ -250,7 +250,7 @@ TEST_F(SqliteTransaction, ExclusiveTransactionBeginThrowsAndNotRollback) ASSERT_ANY_THROW(ExclusiveTransaction{mockTransactionBackend}); } -TEST_F(SqliteTransaction, TransactionCommitThrows) +TEST_F(SqliteTransaction, transaction_commit_throws) { ON_CALL(mockTransactionBackend, commit()).WillByDefault(Throw(Sqlite::Exception())); ImmediateTransaction transaction{mockTransactionBackend}; @@ -258,21 +258,21 @@ TEST_F(SqliteTransaction, TransactionCommitThrows) ASSERT_THROW(transaction.commit(), Sqlite::Exception); } -TEST_F(SqliteTransaction, TransactionRollbackInDestructorThrows) +TEST_F(SqliteTransaction, transaction_rollback_in_destructor_throws) { ON_CALL(mockTransactionBackend, rollback()).WillByDefault(Throw(Sqlite::Exception())); ASSERT_THROW(ExclusiveTransaction{mockTransactionBackend}, Sqlite::Exception); } -TEST_F(SqliteTransaction, TransactionRollbackInDestructorDontThrows) +TEST_F(SqliteTransaction, transaction_rollback_in_destructor_dont_throws) { ON_CALL(mockTransactionBackend, rollback()).WillByDefault(Throw(Sqlite::Exception())); ASSERT_NO_THROW(ExclusiveNonThrowingDestructorTransaction{mockTransactionBackend}); } -TEST_F(SqliteTransaction, ImmediateSessionTransactionCommit) +TEST_F(SqliteTransaction, immediate_session_transaction_commit) { InSequence s; @@ -285,7 +285,7 @@ TEST_F(SqliteTransaction, ImmediateSessionTransactionCommit) transaction.commit(); } -TEST_F(SqliteTransaction, ImmediateSessionTransactionRollBack) +TEST_F(SqliteTransaction, immediate_session_transaction_roll_back) { InSequence s; @@ -297,21 +297,21 @@ TEST_F(SqliteTransaction, ImmediateSessionTransactionRollBack) ImmediateSessionTransaction transaction{mockTransactionBackend}; } -TEST_F(SqliteTransaction, SessionTransactionRollbackInDestructorThrows) +TEST_F(SqliteTransaction, session_transaction_rollback_in_destructor_throws) { ON_CALL(mockTransactionBackend, sessionRollback()).WillByDefault(Throw(Sqlite::Exception())); ASSERT_THROW(ImmediateSessionTransaction{mockTransactionBackend}, Sqlite::Exception); } -TEST_F(SqliteTransaction, ImmidiateSessionTransactionBeginThrows) +TEST_F(SqliteTransaction, immidiate_session_transaction_begin_throws) { ON_CALL(mockTransactionBackend, immediateSessionBegin()).WillByDefault(Throw(Sqlite::Exception())); ASSERT_THROW(ImmediateSessionTransaction{mockTransactionBackend}, Sqlite::Exception); } -TEST_F(SqliteTransaction, ImmediateSessionTransactionBeginThrowsAndNotRollback) +TEST_F(SqliteTransaction, immediate_session_transaction_begin_throws_and_not_rollback) { InSequence s; @@ -323,7 +323,7 @@ TEST_F(SqliteTransaction, ImmediateSessionTransactionBeginThrowsAndNotRollback) ASSERT_ANY_THROW(ImmediateSessionTransaction{mockTransactionBackend}); } -TEST_F(SqliteTransaction, WithDeferredTransactionNoReturnCommit) +TEST_F(SqliteTransaction, with_deferred_transaction_no_return_commit) { InSequence s; @@ -336,7 +336,7 @@ TEST_F(SqliteTransaction, WithDeferredTransactionNoReturnCommit) Sqlite::withDeferredTransaction(mockTransactionBackend, callableMock.AsStdFunction()); } -TEST_F(SqliteTransaction, WithDeferredTransactionWithReturnCommit) +TEST_F(SqliteTransaction, with_deferred_transaction_with_return_commit) { InSequence s; @@ -349,7 +349,7 @@ TEST_F(SqliteTransaction, WithDeferredTransactionWithReturnCommit) Sqlite::withDeferredTransaction(mockTransactionBackend, callableWithReturnMock.AsStdFunction()); } -TEST_F(SqliteTransaction, WithDeferredTransactionReturnsValue) +TEST_F(SqliteTransaction, with_deferred_transaction_returns_value) { auto callable = callableWithReturnMock.AsStdFunction(); @@ -359,7 +359,7 @@ TEST_F(SqliteTransaction, WithDeferredTransactionReturnsValue) ASSERT_THAT(value, Eq(212)); } -TEST_F(SqliteTransaction, WithDeferredTransactionRollsbackForException) +TEST_F(SqliteTransaction, with_deferred_transaction_rollsback_for_exception) { InSequence s; ON_CALL(callableMock, Call()).WillByDefault(Throw(std::exception{})); @@ -376,7 +376,7 @@ TEST_F(SqliteTransaction, WithDeferredTransactionRollsbackForException) } } -TEST_F(SqliteTransaction, WithImmediateTransactionNoReturnCommit) +TEST_F(SqliteTransaction, with_immediate_transaction_no_return_commit) { InSequence s; @@ -389,7 +389,7 @@ TEST_F(SqliteTransaction, WithImmediateTransactionNoReturnCommit) Sqlite::withImmediateTransaction(mockTransactionBackend, callableMock.AsStdFunction()); } -TEST_F(SqliteTransaction, WithImmediateTransactionWithReturnCommit) +TEST_F(SqliteTransaction, with_immediate_transaction_with_return_commit) { InSequence s; @@ -402,7 +402,7 @@ TEST_F(SqliteTransaction, WithImmediateTransactionWithReturnCommit) Sqlite::withImmediateTransaction(mockTransactionBackend, callableWithReturnMock.AsStdFunction()); } -TEST_F(SqliteTransaction, WithImmediateTransactionReturnsValue) +TEST_F(SqliteTransaction, with_immediate_transaction_returns_value) { auto callable = callableWithReturnMock.AsStdFunction(); @@ -412,7 +412,7 @@ TEST_F(SqliteTransaction, WithImmediateTransactionReturnsValue) ASSERT_THAT(value, Eq(212)); } -TEST_F(SqliteTransaction, WithImmediateTransactionRollsbackForException) +TEST_F(SqliteTransaction, with_immediate_transaction_rollsback_for_exception) { InSequence s; ON_CALL(callableMock, Call()).WillByDefault(Throw(std::exception{})); diff --git a/tests/unit/tests/unittests/sqlite/sqlitevalue-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitevalue-test.cpp index ea1514439bd..56d30419d2b 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitevalue-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitevalue-test.cpp @@ -8,63 +8,63 @@ namespace { -TEST(SqliteValue, ConstructDefault) +TEST(SqliteValue, construct_default) { Sqlite::Value value{}; ASSERT_TRUE(value.isNull()); } -TEST(SqliteValue, ConstructNullValue) +TEST(SqliteValue, construct_null_value) { Sqlite::Value value{Sqlite::NullValue{}}; ASSERT_TRUE(value.isNull()); } -TEST(SqliteValue, ConstructLongLong) +TEST(SqliteValue, construct_long_long) { Sqlite::Value value{1LL}; ASSERT_THAT(value.toInteger(), Eq(1LL)); } -TEST(SqliteValue, ConstructInteger) +TEST(SqliteValue, construct_integer) { Sqlite::Value value{1}; ASSERT_THAT(value.toInteger(), Eq(1LL)); } -TEST(SqliteValue, ConstructFloatingPoint) +TEST(SqliteValue, construct_floating_point) { Sqlite::Value value{1.1}; ASSERT_THAT(value.toFloat(), Eq(1.1)); } -TEST(SqliteValue, ConstructStringFromCString) +TEST(SqliteValue, construct_string_from_c_string) { Sqlite::Value value{"foo"}; ASSERT_THAT(value.toStringView(), Eq("foo")); } -TEST(SqliteValue, ConstructStringFromUtilsString) +TEST(SqliteValue, construct_string_from_utils_string) { Sqlite::Value value{Utils::SmallString{"foo"}}; ASSERT_THAT(value.toStringView(), Eq("foo")); } -TEST(SqliteValue, ConstructStringFromQString) +TEST(SqliteValue, construct_string_from_q_string) { Sqlite::Value value{QString{"foo"}}; ASSERT_THAT(value.toStringView(), Eq("foo")); } -TEST(SqliteValue, ConstructBlobFromSpan) +TEST(SqliteValue, construct_blob_from_span) { Utils::span bytes{reinterpret_cast("abcd"), 4}; @@ -73,7 +73,7 @@ TEST(SqliteValue, ConstructBlobFromSpan) ASSERT_THAT(value.toBlobView(), Eq(bytes)); } -TEST(SqliteValue, ConstructBlobFromBlob) +TEST(SqliteValue, construct_blob_from_blob) { Utils::span bytes{reinterpret_cast("abcd"), 4}; @@ -82,7 +82,7 @@ TEST(SqliteValue, ConstructBlobFromBlob) ASSERT_THAT(value.toBlobView(), Eq(bytes)); } -TEST(SqliteValue, ConstructNullFromNullQVariant) +TEST(SqliteValue, construct_null_from_null_q_variant) { QVariant variant{}; @@ -91,7 +91,7 @@ TEST(SqliteValue, ConstructNullFromNullQVariant) ASSERT_TRUE(value.isNull()); } -TEST(SqliteValue, ConstructStringFromIntQVariant) +TEST(SqliteValue, construct_string_from_int_q_variant) { QVariant variant{1}; @@ -100,7 +100,7 @@ TEST(SqliteValue, ConstructStringFromIntQVariant) ASSERT_THAT(value.toInteger(), Eq(1)); } -TEST(SqliteValue, ConstructStringFromLongLongQVariant) +TEST(SqliteValue, construct_string_from_long_long_q_variant) { QVariant variant{1LL}; @@ -109,7 +109,7 @@ TEST(SqliteValue, ConstructStringFromLongLongQVariant) ASSERT_THAT(value.toInteger(), Eq(1)); } -TEST(SqliteValue, ConstructStringFromUintQVariant) +TEST(SqliteValue, construct_string_from_uint_q_variant) { QVariant variant{1u}; @@ -118,7 +118,7 @@ TEST(SqliteValue, ConstructStringFromUintQVariant) ASSERT_THAT(value.toInteger(), Eq(1)); } -TEST(SqliteValue, ConstructStringFromFloatQVariant) +TEST(SqliteValue, construct_string_from_float_q_variant) { QVariant variant{1.}; @@ -127,7 +127,7 @@ TEST(SqliteValue, ConstructStringFromFloatQVariant) ASSERT_THAT(value.toFloat(), Eq(1)); } -TEST(SqliteValue, ConstructStringFromStringQVariant) +TEST(SqliteValue, construct_string_from_string_q_variant) { QVariant variant{QString{"foo"}}; @@ -136,7 +136,7 @@ TEST(SqliteValue, ConstructStringFromStringQVariant) ASSERT_THAT(value.toStringView(), Eq("foo")); } -TEST(SqliteValue, ConstructBlobFromByteArrayQVariant) +TEST(SqliteValue, construct_blob_from_byte_array_q_variant) { Utils::span bytes{reinterpret_cast("abcd"), 4}; QVariant variant{QByteArray{"abcd"}}; @@ -146,7 +146,7 @@ TEST(SqliteValue, ConstructBlobFromByteArrayQVariant) ASSERT_THAT(value.toBlobView(), Eq(bytes)); } -TEST(SqliteValue, ConvertToNullQVariant) +TEST(SqliteValue, convert_to_null_q_variant) { Sqlite::Value value{}; @@ -155,7 +155,7 @@ TEST(SqliteValue, ConvertToNullQVariant) ASSERT_TRUE(variant.isNull()); } -TEST(SqliteValue, ConvertToStringQVariant) +TEST(SqliteValue, convert_to_string_q_variant) { Sqlite::Value value{"foo"}; @@ -164,7 +164,7 @@ TEST(SqliteValue, ConvertToStringQVariant) ASSERT_THAT(variant, Eq("foo")); } -TEST(SqliteValue, ConvertToIntegerQVariant) +TEST(SqliteValue, convert_to_integer_q_variant) { Sqlite::Value value{1}; @@ -173,7 +173,7 @@ TEST(SqliteValue, ConvertToIntegerQVariant) ASSERT_THAT(variant, Eq(1)); } -TEST(SqliteValue, ConvertToFloatQVariant) +TEST(SqliteValue, convert_to_float_q_variant) { Sqlite::Value value{1.1}; @@ -182,7 +182,7 @@ TEST(SqliteValue, ConvertToFloatQVariant) ASSERT_THAT(variant, Eq(1.1)); } -TEST(SqliteValue, ConvertToByteArrayQVariant) +TEST(SqliteValue, convert_to_byte_array_q_variant) { Utils::span bytes{reinterpret_cast("abcd"), 4}; Sqlite::Value value{bytes}; @@ -192,49 +192,49 @@ TEST(SqliteValue, ConvertToByteArrayQVariant) ASSERT_THAT(variant, Eq(QByteArray{"abcd"})); } -TEST(SqliteValue, IntegerEquals) +TEST(SqliteValue, integer_equals) { bool isEqual = Sqlite::Value{1} == 1LL; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, IntegerEqualsInverse) +TEST(SqliteValue, integer_equals_inverse) { bool isEqual = 1LL == Sqlite::Value{1}; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, FloatEquals) +TEST(SqliteValue, float_equals) { bool isEqual = Sqlite::Value{1.0} == 1.; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, FloatEqualsInverse) +TEST(SqliteValue, float_equals_inverse) { bool isEqual = 1. == Sqlite::Value{1.0}; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, StringEquals) +TEST(SqliteValue, string_equals) { bool isEqual = Sqlite::Value{"foo"} == "foo"; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, StringEqualsInverse) +TEST(SqliteValue, string_equals_inverse) { bool isEqual = "foo" == Sqlite::Value{"foo"}; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, BlobEquals) +TEST(SqliteValue, blob_equals) { Utils::span bytes{reinterpret_cast("abcd"), 4}; bool isEqual = Sqlite::Value{bytes} == bytes; @@ -242,7 +242,7 @@ TEST(SqliteValue, BlobEquals) ASSERT_TRUE(isEqual); } -TEST(SqliteValue, BlobInverseEquals) +TEST(SqliteValue, blob_inverse_equals) { Utils::span bytes{reinterpret_cast("abcd"), 4}; bool isEqual = bytes == Sqlite::Value{bytes}; @@ -250,105 +250,105 @@ TEST(SqliteValue, BlobInverseEquals) ASSERT_TRUE(isEqual); } -TEST(SqliteValue, IntegerAndFloatAreNotEquals) +TEST(SqliteValue, integer_and_float_are_not_equals) { bool isEqual = Sqlite::Value{1} == 1.; ASSERT_FALSE(isEqual); } -TEST(SqliteValue, NullValuesNeverEqual) +TEST(SqliteValue, null_values_never_equal) { bool isEqual = Sqlite::Value{} == Sqlite::Value{}; ASSERT_FALSE(isEqual); } -TEST(SqliteValue, IntegerValuesAreEquals) +TEST(SqliteValue, integer_values_are_equals) { bool isEqual = Sqlite::Value{1} == Sqlite::Value{1}; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, IntegerAndFloatValuesAreNotEquals) +TEST(SqliteValue, integer_and_float_values_are_not_equals) { bool isEqual = Sqlite::Value{1} == Sqlite::Value{1.}; ASSERT_FALSE(isEqual); } -TEST(SqliteValue, StringAndQStringAreEquals) +TEST(SqliteValue, string_and_q_string_are_equals) { bool isEqual = Sqlite::Value{"foo"} == QString{"foo"}; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, IntegerAndFloatValuesAreUnequal) +TEST(SqliteValue, integer_and_float_values_are_unequal) { bool isUnequal = Sqlite::Value{1} != Sqlite::Value{1.0}; ASSERT_TRUE(isUnequal); } -TEST(SqliteValue, IntegerAndFloatAreUnequal) +TEST(SqliteValue, integer_and_float_are_unequal) { bool isUnequal = Sqlite::Value{1} != 1.0; ASSERT_TRUE(isUnequal); } -TEST(SqliteValue, IntegerAndFloatAreUnequalInverse) +TEST(SqliteValue, integer_and_float_are_unequal_inverse) { bool isUnequal = 1.0 != Sqlite::Value{1}; ASSERT_TRUE(isUnequal); } -TEST(SqliteValue, IntegersAreUnequal) +TEST(SqliteValue, integers_are_unequal) { bool isUnequal = Sqlite::Value{1} != 2; ASSERT_TRUE(isUnequal); } -TEST(SqliteValue, IntegersAreUnequalInverse) +TEST(SqliteValue, integers_are_unequal_inverse) { bool isUnequal = 2 != Sqlite::Value{1}; ASSERT_TRUE(isUnequal); } -TEST(SqliteValue, NullType) +TEST(SqliteValue, null_type) { auto type = Sqlite::Value{}.type(); ASSERT_THAT(type, Sqlite::ValueType::Null); } -TEST(SqliteValue, IntegerType) +TEST(SqliteValue, integer_type) { auto type = Sqlite::Value{1}.type(); ASSERT_THAT(type, Sqlite::ValueType::Integer); } -TEST(SqliteValue, FloatType) +TEST(SqliteValue, float_type) { auto type = Sqlite::Value{1.}.type(); ASSERT_THAT(type, Sqlite::ValueType::Float); } -TEST(SqliteValue, StringType) +TEST(SqliteValue, string_type) { auto type = Sqlite::Value{"foo"}.type(); ASSERT_THAT(type, Sqlite::ValueType::String); } -TEST(SqliteValue, BlobType) +TEST(SqliteValue, blob_type) { Utils::span bytes{reinterpret_cast("abcd"), 4}; auto type = Sqlite::Value{bytes}.type(); @@ -356,70 +356,70 @@ TEST(SqliteValue, BlobType) ASSERT_THAT(type, Sqlite::ValueType::Blob); } -TEST(SqliteValue, NullValueAndValueViewAreNotEqual) +TEST(SqliteValue, null_value_and_value_view_are_not_equal) { bool isEqual = Sqlite::ValueView::create(Sqlite::NullValue{}) == Sqlite::Value{}; ASSERT_FALSE(isEqual); } -TEST(SqliteValue, NullValueViewAndValueAreNotEqual) +TEST(SqliteValue, null_value_view_and_value_are_not_equal) { bool isEqual = Sqlite::Value{} == Sqlite::ValueView::create(Sqlite::NullValue{}); ASSERT_FALSE(isEqual); } -TEST(SqliteValue, StringValueAndValueViewEquals) +TEST(SqliteValue, string_value_and_value_view_equals) { bool isEqual = Sqlite::ValueView::create("foo") == Sqlite::Value{"foo"}; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, StringValueAndValueViewEqualsInverse) +TEST(SqliteValue, string_value_and_value_view_equals_inverse) { bool isEqual = Sqlite::Value{"foo"} == Sqlite::ValueView::create("foo"); ASSERT_TRUE(isEqual); } -TEST(SqliteValue, IntegerValueAndValueViewEquals) +TEST(SqliteValue, integer_value_and_value_view_equals) { bool isEqual = Sqlite::ValueView::create(1) == Sqlite::Value{1}; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, IntegerValueAndValueViewEqualsInverse) +TEST(SqliteValue, integer_value_and_value_view_equals_inverse) { bool isEqual = Sqlite::Value{2} == Sqlite::ValueView::create(2); ASSERT_TRUE(isEqual); } -TEST(SqliteValue, FloatValueAndValueViewEquals) +TEST(SqliteValue, float_value_and_value_view_equals) { bool isEqual = Sqlite::ValueView::create(1.1) == Sqlite::Value{1.1}; ASSERT_TRUE(isEqual); } -TEST(SqliteValue, FloatValueAndValueViewEqualsInverse) +TEST(SqliteValue, float_value_and_value_view_equals_inverse) { bool isEqual = Sqlite::Value{1.1} == Sqlite::ValueView::create(1.1); ASSERT_TRUE(isEqual); } -TEST(SqliteValue, StringValueAndIntergerValueViewAreNotEqual) +TEST(SqliteValue, string_value_and_interger_value_view_are_not_equal) { bool isEqual = Sqlite::Value{"foo"} == Sqlite::ValueView::create(1); ASSERT_FALSE(isEqual); } -TEST(SqliteValue, BlobValueAndValueViewEquals) +TEST(SqliteValue, blob_value_and_value_view_equals) { Utils::span bytes{reinterpret_cast("abcd"), 4}; @@ -428,7 +428,7 @@ TEST(SqliteValue, BlobValueAndValueViewEquals) ASSERT_TRUE(isEqual); } -TEST(SqliteValue, ConvertNullValueViewIntoValue) +TEST(SqliteValue, convert_null_value_view_into_value) { auto view = Sqlite::ValueView::create(Sqlite::NullValue{}); @@ -437,7 +437,7 @@ TEST(SqliteValue, ConvertNullValueViewIntoValue) ASSERT_TRUE(value.isNull()); } -TEST(SqliteValue, ConvertStringValueViewIntoValue) +TEST(SqliteValue, convert_string_value_view_into_value) { auto view = Sqlite::ValueView::create("foo"); @@ -446,7 +446,7 @@ TEST(SqliteValue, ConvertStringValueViewIntoValue) ASSERT_THAT(value, Eq("foo")); } -TEST(SqliteValue, ConvertIntegerValueViewIntoValue) +TEST(SqliteValue, convert_integer_value_view_into_value) { auto view = Sqlite::ValueView::create(1); @@ -455,7 +455,7 @@ TEST(SqliteValue, ConvertIntegerValueViewIntoValue) ASSERT_THAT(value, Eq(1)); } -TEST(SqliteValue, ConvertFloatValueViewIntoValue) +TEST(SqliteValue, convert_float_value_view_into_value) { auto view = Sqlite::ValueView::create(1.4); @@ -464,7 +464,7 @@ TEST(SqliteValue, ConvertFloatValueViewIntoValue) ASSERT_THAT(value, Eq(1.4)); } -TEST(SqliteValue, ConvertBlobValueViewIntoValue) +TEST(SqliteValue, convert_blob_value_view_into_value) { Utils::span bytes{reinterpret_cast("abcd"), 4}; auto view = Sqlite::ValueView::create(Sqlite::BlobView{bytes}); diff --git a/tests/unit/tests/unittests/sqlite/sqlstatementbuilder-test.cpp b/tests/unit/tests/unittests/sqlite/sqlstatementbuilder-test.cpp index d4ebadf0b38..799cf911a17 100644 --- a/tests/unit/tests/unittests/sqlite/sqlstatementbuilder-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlstatementbuilder-test.cpp @@ -14,7 +14,7 @@ using Sqlite::SqlStatementBuilderException; using SV = Utils::SmallStringVector; -TEST(SqlStatementBuilder, Bind) +TEST(SqlStatementBuilder, bind) { SqlStatementBuilder sqlStatementBuilder("SELECT $columns FROM $table WHERE $column = 'foo' AND rowid=$row AND rowid IN ($rows)"); @@ -27,7 +27,7 @@ TEST(SqlStatementBuilder, Bind) ASSERT_THAT(sqlStatementBuilder.sqlStatement(), "SELECT name, number FROM test WHERE name = 'foo' AND rowid=20 AND rowid IN (1, 2, 3)"); } -TEST(SqlStatementBuilder, BindEmpty) +TEST(SqlStatementBuilder, bind_empty) { SqlStatementBuilder sqlStatementBuilder("SELECT $columns FROM $table$emptyPart"); sqlStatementBuilder.bind("$columns", SV{"name", "number"}); @@ -38,7 +38,7 @@ TEST(SqlStatementBuilder, BindEmpty) ASSERT_THAT(sqlStatementBuilder.sqlStatement(), "SELECT name, number FROM test"); } -TEST(SqlStatementBuilder, BindFailure) +TEST(SqlStatementBuilder, bind_failure) { SqlStatementBuilder sqlStatementBuilder("SELECT $columns FROM $table"); @@ -51,7 +51,7 @@ TEST(SqlStatementBuilder, BindFailure) ASSERT_THROW(sqlStatementBuilder.bindWithUpdateTemplateParameters("$columns", columns), SqlStatementBuilderException); } -TEST(SqlStatementBuilder, BindWithInsertTemplateParameters) +TEST(SqlStatementBuilder, bind_with_insert_template_parameters) { Utils::SmallStringVector columns = {"name", "number"}; @@ -63,7 +63,7 @@ TEST(SqlStatementBuilder, BindWithInsertTemplateParameters) ASSERT_THAT(sqlStatementBuilder.sqlStatement(), "INSERT OR IGNORE INTO test (name, number) VALUES (?, ?)"); } -TEST(SqlStatementBuilder, BindWithUpdateTemplateParameters) +TEST(SqlStatementBuilder, bind_with_update_template_parameters) { Utils::SmallStringVector columns = {"name", "number"}; @@ -74,7 +74,7 @@ TEST(SqlStatementBuilder, BindWithUpdateTemplateParameters) ASSERT_THAT(sqlStatementBuilder.sqlStatement(), "UPDATE test SET name=?, number=? WHERE id=?"); } -TEST(SqlStatementBuilder, BindWithUpdateTemplateNames) +TEST(SqlStatementBuilder, bind_with_update_template_names) { Utils::SmallStringVector columns = {"name", "number"}; @@ -85,7 +85,7 @@ TEST(SqlStatementBuilder, BindWithUpdateTemplateNames) ASSERT_THAT(sqlStatementBuilder.sqlStatement(), "UPDATE test SET name=@name, number=@number WHERE id=@id"); } -TEST(SqlStatementBuilder, ClearOnRebinding) +TEST(SqlStatementBuilder, clear_on_rebinding) { SqlStatementBuilder sqlStatementBuilder("SELECT $columns FROM $table"); @@ -99,7 +99,7 @@ TEST(SqlStatementBuilder, ClearOnRebinding) ASSERT_THAT(sqlStatementBuilder.sqlStatement(), "SELECT name, number FROM test2"); } -TEST(SqlStatementBuilder, ClearBinding) +TEST(SqlStatementBuilder, clear_binding) { SqlStatementBuilder sqlStatementBuilder("SELECT $columns FROM $table"); @@ -113,7 +113,7 @@ TEST(SqlStatementBuilder, ClearBinding) ASSERT_THROW(sqlStatementBuilder.sqlStatement(), SqlStatementBuilderException); } -TEST(SqlStatementBuilder, SqlStatementFailure) +TEST(SqlStatementBuilder, sql_statement_failure) { SqlStatementBuilder sqlStatementBuilder("SELECT $columns FROM $table"); @@ -122,7 +122,7 @@ TEST(SqlStatementBuilder, SqlStatementFailure) ASSERT_THROW(sqlStatementBuilder.sqlStatement(), SqlStatementBuilderException); } -TEST(SqlStatementBuilder, IsBuild) +TEST(SqlStatementBuilder, is_build) { SqlStatementBuilder sqlStatementBuilder("SELECT $columns FROM $table"); diff --git a/tests/unit/tests/unittests/utils/matchingtext-test.cpp b/tests/unit/tests/unittests/utils/matchingtext-test.cpp index b8ebee9cab2..716eb7ff8b8 100644 --- a/tests/unit/tests/unittests/utils/matchingtext-test.cpp +++ b/tests/unit/tests/unittests/utils/matchingtext-test.cpp @@ -42,35 +42,35 @@ protected: const IsNextBlockDeeperIndented nextBlockIsIndented = [](const QTextBlock &) { return true; }; }; -TEST_F(MatchingText, ContextAllowsAutoParentheses_ForNoInput) +TEST_F(MatchingText, context_allows_auto_parentheses_for_no_input) { const Document document("@"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotInEmptyLine) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_in_empty_line) { const Document document("@"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_Initializer) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_initializer) { const Document document("Type object@"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_AfterFunctionDeclaratorSameLine) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_after_function_declarator_same_line) { const Document document("void g() @"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_AfterFunctionDeclaratorNewLine) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_after_function_declarator_new_line) { const Document document("void g()\n" "@"); @@ -78,7 +78,7 @@ TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_AfterFunctionDeclar ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_AfterFunctionDeclaratorNewLineAndMore) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_after_function_declarator_new_line_and_more) { const Document document("void g()\n" "@\n" @@ -87,70 +87,70 @@ TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_AfterFunctionDeclar ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_AfterLambdaDeclarator) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_after_lambda_declarator) { const Document document("[]() @"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeOpeningCurlyBrace) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_opening_curly_brace) { const Document document("@{"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_BeforeClosingCurlyBrace) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_before_closing_curly_brace) { const Document document("@}"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_BeforeClosingBracket) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_before_closing_bracket) { const Document document("@]"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_BeforeClosingParen) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_before_closing_paren) { const Document document("@)"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_BeforeSemicolon) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_before_semicolon) { const Document document("@;"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_BeforeComma) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_before_comma) { const Document document("@,"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotInCppComment) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_in_cpp_comment) { const Document document("// @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotInCppDoxygenComment) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_in_cpp_doxygen_comment) { const Document document("//! @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndented) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_indented) { const Document document("@\n" " 1+1;"); @@ -158,7 +158,7 @@ TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndented) ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{", nextBlockIsIndented)); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndentedWithFollowingComment) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_indented_with_following_comment) { const Document document("@\n // comment" " 1+1;"); @@ -166,7 +166,7 @@ TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndentedWi ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{", nextBlockIsIndented)); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndentedWithTextInFront) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_indented_with_text_in_front) { const Document document("if (true) @\n" " 1+1;"); @@ -174,7 +174,7 @@ TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndentedWi ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{", nextBlockIsIndented)); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndentedOnEmptyLine1) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_indented_on_empty_line1) { const Document document("if (true)\n" "@\n" @@ -183,7 +183,7 @@ TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndentedOn ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{", nextBlockIsIndented)); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndentedOnEmptyLine2) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_indented_on_empty_line2) { const Document document("if (true)\n" " @\n" @@ -192,112 +192,112 @@ TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeIndentedOn ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{", nextBlockIsIndented)); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotInTheMiddle) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_in_the_middle) { const Document document("if (true) @ true;"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotAfterControlFlow_WhileAndFriends) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_after_control_flow_while_and_friends) { const Document document("while (true) @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotAfterControlFlow_DoAndFriends) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_after_control_flow_do_and_friends) { const Document document("do @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_InvalidCode_UnbalancedParens) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_invalid_code_unbalanced_parens) { const Document document(") @"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_InvalidCode_UnbalancedParens2) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_invalid_code_unbalanced_parens2) { const Document document("while true) @"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_InvalidCode_OnlyBalancedParens) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_invalid_code_only_balanced_parens) { const Document document("() @"); ASSERT_TRUE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeNamedNamespace) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_named_namespace) { const Document document("namespace X @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeNamedNamespaceWithAttributeSpecifier) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_named_namespace_with_attribute_specifier) { const Document document("namespace [[xyz]] X @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeUnnamedNamespace) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_unnamed_namespace) { const Document document("namespace @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeUnnamedNamespaceWithAttributeSpecifier) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_unnamed_namespace_with_attribute_specifier) { const Document document("namespace [[xyz]] @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeNestedNamespace) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_nested_namespace) { const Document document("namespace X::Y::Z @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeClass) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_class) { const Document document("class X @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeStruct) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_struct) { const Document document("struct X @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeEnum) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_enum) { const Document document("enum X @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotBeforeUnion) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_before_union) { const Document document("union X @"); ASSERT_FALSE(MT::contextAllowsAutoParentheses(document.cursor, "{")); } -TEST_F(MatchingText, ContextAllowsAutoParentheses_CurlyBrace_NotWithinString) +TEST_F(MatchingText, context_allows_auto_parentheses_curly_brace_not_within_string) { const Document document("\"a@b\""); diff --git a/tests/unit/tests/unittests/utils/sizedarray-test.cpp b/tests/unit/tests/unittests/utils/sizedarray-test.cpp index bf4cad43012..c672c8c762e 100644 --- a/tests/unit/tests/unittests/utils/sizedarray-test.cpp +++ b/tests/unit/tests/unittests/utils/sizedarray-test.cpp @@ -9,21 +9,21 @@ namespace { using Utils::SizedArray; -TEST(SizedArray, EmptySize) +TEST(SizedArray, empty_size) { SizedArray array; ASSERT_THAT(array.size(), 0); } -TEST(SizedArray, IsEmpty) +TEST(SizedArray, is_empty) { SizedArray array; ASSERT_TRUE(array.empty()); } -TEST(SizedArray, IsNotEmpty) +TEST(SizedArray, is_not_empty) { SizedArray array; @@ -32,7 +32,7 @@ TEST(SizedArray, IsNotEmpty) ASSERT_FALSE(array.empty()); } -TEST(SizedArray, SizeOneAfterPushBack) +TEST(SizedArray, size_one_after_push_back) { SizedArray array; @@ -41,7 +41,7 @@ TEST(SizedArray, SizeOneAfterPushBack) ASSERT_THAT(array.size(), 1); } -TEST(SizedArray, FirstValueAfterPushBack) +TEST(SizedArray, first_value_after_push_back) { SizedArray array; @@ -50,7 +50,7 @@ TEST(SizedArray, FirstValueAfterPushBack) ASSERT_THAT(array.front(), 'x'); } -TEST(SizedArray, LastValueAfterPushBack) +TEST(SizedArray, last_value_after_push_back) { SizedArray array; @@ -59,21 +59,21 @@ TEST(SizedArray, LastValueAfterPushBack) ASSERT_THAT(array.back(), 'x'); } -TEST(SizedArray, EndIteratorIsEqualBeginForEmptyArray) +TEST(SizedArray, end_iterator_is_equal_begin_for_empty_array) { SizedArray array; ASSERT_THAT(array.begin(), array.end()); } -TEST(SizedArray, ConstEndIteratorIsEqualBeginForEmptyArray) +TEST(SizedArray, const_end_iterator_is_equal_begin_for_empty_array) { const SizedArray array = {}; ASSERT_THAT(array.begin(), array.end()); } -TEST(SizedArray, EndIteratorIsOneAfterBeginForOneSizedArray) +TEST(SizedArray, end_iterator_is_one_after_begin_for_one_sized_array) { SizedArray array; @@ -82,7 +82,7 @@ TEST(SizedArray, EndIteratorIsOneAfterBeginForOneSizedArray) ASSERT_THAT(std::next(array.begin(), 1), array.end()); } -TEST(SizedArray, CEndIteratorIsOneAfterBeginForOneSizedArray) +TEST(SizedArray, c_end_iterator_is_one_after_begin_for_one_sized_array) { SizedArray array = {}; @@ -91,21 +91,21 @@ TEST(SizedArray, CEndIteratorIsOneAfterBeginForOneSizedArray) ASSERT_THAT(std::next(array.cbegin(), 1), array.cend()); } -TEST(SizedArray, REndIteratorIsEqualRBeginForEmptyArray) +TEST(SizedArray, r_end_iterator_is_equal_r_begin_for_empty_array) { SizedArray array; ASSERT_THAT(array.rbegin(), array.rend()); } -TEST(SizedArray, ConstREndIteratorIsEqualRBeginForEmptyArray) +TEST(SizedArray, const_r_end_iterator_is_equal_r_begin_for_empty_array) { const SizedArray array = {}; ASSERT_THAT(array.rbegin(), array.rend()); } -TEST(SizedArray, REndIteratorIsOneAfterRBeginForOneSizedArray) +TEST(SizedArray, r_end_iterator_is_one_after_r_begin_for_one_sized_array) { SizedArray array; @@ -114,7 +114,7 @@ TEST(SizedArray, REndIteratorIsOneAfterRBeginForOneSizedArray) ASSERT_THAT(std::next(array.rbegin(), 1), array.rend()); } -TEST(SizedArray, ConstREndIteratorIsOneAfterRBeginForOneSizedArray) +TEST(SizedArray, const_r_end_iterator_is_one_after_r_begin_for_one_sized_array) { SizedArray array = {}; @@ -123,7 +123,7 @@ TEST(SizedArray, ConstREndIteratorIsOneAfterRBeginForOneSizedArray) ASSERT_THAT(std::next(array.crbegin(), 1), array.crend()); } -TEST(SizedArray, InitializerListSize) +TEST(SizedArray, initializer_list_size) { SizedArray array{'a', 'b'}; diff --git a/tests/unit/tests/unittests/utils/smallstring-test.cpp b/tests/unit/tests/unittests/utils/smallstring-test.cpp index f00417c96e0..fb806ac861f 100644 --- a/tests/unit/tests/unittests/utils/smallstring-test.cpp +++ b/tests/unit/tests/unittests/utils/smallstring-test.cpp @@ -22,22 +22,22 @@ static_assert(16 == alignof(Utils::BasicSmallString<31>)); static_assert(16 == alignof(Utils::BasicSmallString<63>)); static_assert(16 == alignof(Utils::BasicSmallString<190>)); -TEST(SmallString, BasicStringEqual) +TEST(SmallString, basic_string_equal) { ASSERT_THAT(SmallString("text"), Eq(SmallString("text"))); } -TEST(SmallString, BasicSmallStringUnequal) +TEST(SmallString, basic_small_string_unequal) { ASSERT_THAT(SmallString("text"), Ne(SmallString("other text"))); } -TEST(SmallString, NullSmallStringIsEqualToEmptySmallString) +TEST(SmallString, null_small_string_is_equal_to_empty_small_string) { ASSERT_THAT(SmallString(), Eq(SmallString(""))); } -TEST(SmallString, ShortSmallStringLiteralIsShortSmallString) +TEST(SmallString, short_small_string_literal_is_short_small_string) { // constexpr SmallStringLiteral shortText("short string"); @@ -45,14 +45,14 @@ TEST(SmallString, ShortSmallStringLiteralIsShortSmallString) ASSERT_TRUE(shortText.isShortString()); } -TEST(SmallString, ShortSmallStringIsShortSmallString) +TEST(SmallString, short_small_string_is_short_small_string) { SmallString shortText("short string"); ASSERT_TRUE(shortText.isShortString()); } -TEST(SmallString, CreateFromCStringIterators) +TEST(SmallString, create_from_c_string_iterators) { char sourceText[] = "this is very very very very very much text"; @@ -61,7 +61,7 @@ TEST(SmallString, CreateFromCStringIterators) ASSERT_THAT(text, SmallString("this is very very very very very much text")); } -TEST(SmallString, CreateFromQByteArrayIterators) +TEST(SmallString, create_from_q_byte_array_iterators) { QByteArray sourceText = "this is very very very very very much text"; @@ -70,7 +70,7 @@ TEST(SmallString, CreateFromQByteArrayIterators) ASSERT_THAT(text, SmallString("this is very very very very very much text")); } -TEST(SmallString, CreateFromSmallStringIterators) +TEST(SmallString, create_from_small_string_iterators) { SmallString sourceText = "this is very very very very very much text"; @@ -79,7 +79,7 @@ TEST(SmallString, CreateFromSmallStringIterators) ASSERT_THAT(text, SmallString("this is very very very very very much text")); } -TEST(SmallString, CreateFromStringView) +TEST(SmallString, create_from_string_view) { SmallStringView sourceText = "this is very very very very very much text"; @@ -88,14 +88,14 @@ TEST(SmallString, CreateFromStringView) ASSERT_THAT(text, SmallString("this is very very very very very much text")); } -TEST(SmallString, ShortSmallStringIsReference) +TEST(SmallString, short_small_string_is_reference) { SmallString longText("very very very very very long text"); ASSERT_TRUE(longText.isReadOnlyReference()); } -TEST(SmallString, SmallStringContructorIsNotReference) +TEST(SmallString, small_string_contructor_is_not_reference) { const char *shortCSmallString = "short string"; auto shortText = SmallString(shortCSmallString); @@ -103,7 +103,7 @@ TEST(SmallString, SmallStringContructorIsNotReference) ASSERT_TRUE(shortText.isShortString()); } -TEST(SmallString, ShortSmallStringIsNotReference) +TEST(SmallString, short_small_string_is_not_reference) { const char *shortCSmallString = "short string"; auto shortText = SmallString::fromUtf8(shortCSmallString); @@ -111,7 +111,7 @@ TEST(SmallString, ShortSmallStringIsNotReference) ASSERT_FALSE(shortText.isReadOnlyReference()); } -TEST(SmallString, LongSmallStringConstrutorIsAllocated) +TEST(SmallString, long_small_string_construtor_is_allocated) { const char *longCSmallString = "very very very very very long text"; auto longText = SmallString(longCSmallString); @@ -119,21 +119,21 @@ TEST(SmallString, LongSmallStringConstrutorIsAllocated) ASSERT_TRUE(longText.hasAllocatedMemory()); } -TEST(SmallString, MaximumShortSmallString) +TEST(SmallString, maximum_short_small_string) { SmallString maximumShortText("very very very very short text", 30); ASSERT_THAT(maximumShortText, StrEq("very very very very short text")); } -TEST(SmallString, LongConstExpressionSmallStringIsReference) +TEST(SmallString, long_const_expression_small_string_is_reference) { SmallString longText("very very very very very very very very very very very long string"); ASSERT_TRUE(longText.isReadOnlyReference()); } -TEST(SmallString, CloneShortSmallString) +TEST(SmallString, clone_short_small_string) { SmallString shortText("short string"); @@ -142,7 +142,7 @@ TEST(SmallString, CloneShortSmallString) ASSERT_THAT(clonedText, Eq("short string")); } -TEST(SmallString, CloneLongSmallString) +TEST(SmallString, clone_long_small_string) { SmallString longText = SmallString::fromUtf8("very very very very very very very very very very very long string"); @@ -151,7 +151,7 @@ TEST(SmallString, CloneLongSmallString) ASSERT_THAT(clonedText, Eq("very very very very very very very very very very very long string")); } -TEST(SmallString, ClonedLongSmallStringDataPointerIsDifferent) +TEST(SmallString, cloned_long_small_string_data_pointer_is_different) { SmallString longText = SmallString::fromUtf8("very very very very very very very very very very very long string"); @@ -160,7 +160,7 @@ TEST(SmallString, ClonedLongSmallStringDataPointerIsDifferent) ASSERT_THAT(clonedText.data(), Ne(longText.data())); } -TEST(SmallString, CopyShortConstExpressionSmallStringIsShortSmallString) +TEST(SmallString, copy_short_const_expression_small_string_is_short_small_string) { SmallString shortText("short string"); @@ -169,7 +169,7 @@ TEST(SmallString, CopyShortConstExpressionSmallStringIsShortSmallString) ASSERT_TRUE(shortTextCopy.isShortString()); } -TEST(SmallString, CopyLongConstExpressionSmallStringIsLongSmallString) +TEST(SmallString, copy_long_const_expression_small_string_is_long_small_string) { SmallString longText("very very very very very very very very very very very long string"); @@ -178,7 +178,7 @@ TEST(SmallString, CopyLongConstExpressionSmallStringIsLongSmallString) ASSERT_FALSE(longTextCopy.isShortString()); } -TEST(SmallString, ShortPathStringIsShortString) +TEST(SmallString, short_path_string_is_short_string) { const char *rawText = "very very very very very very very very very very very long path which fits in the short memory"; @@ -187,7 +187,7 @@ TEST(SmallString, ShortPathStringIsShortString) ASSERT_TRUE(text.isShortString()); } -TEST(SmallString, SmallStringFromCharacterArrayIsReference) +TEST(SmallString, small_string_from_character_array_is_reference) { const char longCString[] = "very very very very very very very very very very very long string"; @@ -196,7 +196,7 @@ TEST(SmallString, SmallStringFromCharacterArrayIsReference) ASSERT_TRUE(longString.isReadOnlyReference()); } -TEST(SmallString, SmallStringFromCharacterPointerIsNotReference) +TEST(SmallString, small_string_from_character_pointer_is_not_reference) { const char *longCString = "very very very very very very very very very very very long string"; @@ -205,7 +205,7 @@ TEST(SmallString, SmallStringFromCharacterPointerIsNotReference) ASSERT_FALSE(longString.isReadOnlyReference()); } -TEST(SmallString, CopyStringFromReference) +TEST(SmallString, copy_string_from_reference) { SmallString longText("very very very very very very very very very very very long string"); SmallString longTextCopy; @@ -215,28 +215,28 @@ TEST(SmallString, CopyStringFromReference) ASSERT_TRUE(longTextCopy.isReadOnlyReference()); } -TEST(SmallString, SmallStringLiteralShortSmallStringDataAccess) +TEST(SmallString, small_string_literal_short_small_string_data_access) { SmallStringLiteral literalText("very very very very very very very very very very very long string"); ASSERT_THAT(literalText, StrEq("very very very very very very very very very very very long string")); } -TEST(SmallString, SmallStringLiteralLongSmallStringDataAccess) +TEST(SmallString, small_string_literal_long_small_string_data_access) { SmallStringLiteral literalText("short string"); ASSERT_THAT(literalText, StrEq("short string")); } -TEST(SmallString, ReferenceDataAccess) +TEST(SmallString, reference_data_access) { SmallString literalText("short string"); ASSERT_THAT(literalText, StrEq("short string")); } -TEST(SmallString, ShortDataAccess) +TEST(SmallString, short_data_access) { const char *shortCString = "short string"; auto shortText = SmallString::fromUtf8(shortCString); @@ -244,7 +244,7 @@ TEST(SmallString, ShortDataAccess) ASSERT_THAT(shortText, StrEq("short string")); } -TEST(SmallString, LongDataAccess) +TEST(SmallString, long_data_access) { const char *longCString = "very very very very very very very very very very very long string"; auto longText = SmallString::fromUtf8(longCString); @@ -252,28 +252,28 @@ TEST(SmallString, LongDataAccess) ASSERT_THAT(longText, StrEq(longCString)); } -TEST(SmallString, LongSmallStringHasShortSmallStringSizeZero) +TEST(SmallString, long_small_string_has_short_small_string_size_zero) { auto longText = SmallString::fromUtf8("very very very very very very very very very very very long string"); ASSERT_THAT(longText.shortStringSize(), 0); } -TEST(SmallString, SmallStringBeginIsEqualEndForEmptySmallString) +TEST(SmallString, small_string_begin_is_equal_end_for_empty_small_string) { SmallString text; ASSERT_THAT(text.begin(), Eq(text.end())); } -TEST(SmallString, SmallStringBeginIsNotEqualEndForNonEmptySmallString) +TEST(SmallString, small_string_begin_is_not_equal_end_for_non_empty_small_string) { SmallString text("x"); ASSERT_THAT(text.begin(), Ne(text.end())); } -TEST(SmallString, SmallStringBeginPlusOneIsEqualEndForSmallStringWidthSizeOne) +TEST(SmallString, small_string_begin_plus_one_is_equal_end_for_small_string_width_size_one) { SmallString text("x"); @@ -282,21 +282,21 @@ TEST(SmallString, SmallStringBeginPlusOneIsEqualEndForSmallStringWidthSizeOne) ASSERT_THAT(beginPlusOne, Eq(text.end())); } -TEST(SmallString, SmallStringRBeginIsEqualREndForEmptySmallString) +TEST(SmallString, small_string_r_begin_is_equal_r_end_for_empty_small_string) { SmallString text; ASSERT_THAT(text.rbegin(), Eq(text.rend())); } -TEST(SmallString, SmallStringRBeginIsNotEqualREndForNonEmptySmallString) +TEST(SmallString, small_string_r_begin_is_not_equal_r_end_for_non_empty_small_string) { SmallString text("x"); ASSERT_THAT(text.rbegin(), Ne(text.rend())); } -TEST(SmallString, SmallStringRBeginPlusOneIsEqualREndForSmallStringWidthSizeOne) +TEST(SmallString, small_string_r_begin_plus_one_is_equal_r_end_for_small_string_width_size_one) { SmallString text("x"); @@ -305,21 +305,21 @@ TEST(SmallString, SmallStringRBeginPlusOneIsEqualREndForSmallStringWidthSizeOne) ASSERT_THAT(beginPlusOne, Eq(text.rend())); } -TEST(SmallString, SmallStringConstRBeginIsEqualREndForEmptySmallString) +TEST(SmallString, small_string_const_r_begin_is_equal_r_end_for_empty_small_string) { const SmallString text; ASSERT_THAT(text.rbegin(), Eq(text.rend())); } -TEST(SmallString, SmallStringConstRBeginIsNotEqualREndForNonEmptySmallString) +TEST(SmallString, small_string_const_r_begin_is_not_equal_r_end_for_non_empty_small_string) { const SmallString text("x"); ASSERT_THAT(text.rbegin(), Ne(text.rend())); } -TEST(SmallString, SmallStringSmallStringConstRBeginPlusOneIsEqualREndForSmallStringWidthSizeOne) +TEST(SmallString, small_string_small_string_const_r_begin_plus_one_is_equal_r_end_for_small_string_width_size_one) { const SmallString text("x"); @@ -328,7 +328,7 @@ TEST(SmallString, SmallStringSmallStringConstRBeginPlusOneIsEqualREndForSmallStr ASSERT_THAT(beginPlusOne, Eq(text.rend())); } -TEST(SmallString, SmallStringDistanceBetweenBeginAndEndIsZeroForEmptyText) +TEST(SmallString, small_string_distance_between_begin_and_end_is_zero_for_empty_text) { SmallString text(""); @@ -337,7 +337,7 @@ TEST(SmallString, SmallStringDistanceBetweenBeginAndEndIsZeroForEmptyText) ASSERT_THAT(distance, 0); } -TEST(SmallString, SmallStringDistanceBetweenBeginAndEndIsOneForOneSign) +TEST(SmallString, small_string_distance_between_begin_and_end_is_one_for_one_sign) { SmallString text("x"); @@ -346,7 +346,7 @@ TEST(SmallString, SmallStringDistanceBetweenBeginAndEndIsOneForOneSign) ASSERT_THAT(distance, 1); } -TEST(SmallString, SmallStringDistanceBetweenRBeginAndREndIsZeroForEmptyText) +TEST(SmallString, small_string_distance_between_r_begin_and_r_end_is_zero_for_empty_text) { SmallString text(""); @@ -355,7 +355,7 @@ TEST(SmallString, SmallStringDistanceBetweenRBeginAndREndIsZeroForEmptyText) ASSERT_THAT(distance, 0); } -TEST(SmallString, SmallStringDistanceBetweenRBeginAndREndIsOneForOneSign) +TEST(SmallString, small_string_distance_between_r_begin_and_r_end_is_one_for_one_sign) { SmallString text("x"); @@ -364,7 +364,7 @@ TEST(SmallString, SmallStringDistanceBetweenRBeginAndREndIsOneForOneSign) ASSERT_THAT(distance, 1); } -TEST(SmallString, SmallStringBeginPointsToX) +TEST(SmallString, small_string_begin_points_to_x) { SmallString text("x"); @@ -373,7 +373,7 @@ TEST(SmallString, SmallStringBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, SmallStringRBeginPointsToX) +TEST(SmallString, small_string_r_begin_points_to_x) { SmallString text("x"); @@ -382,7 +382,7 @@ TEST(SmallString, SmallStringRBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, ConstSmallStringBeginPointsToX) +TEST(SmallString, const_small_string_begin_points_to_x) { const SmallString text("x"); @@ -391,7 +391,7 @@ TEST(SmallString, ConstSmallStringBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, ConstSmallStringRBeginPointsToX) +TEST(SmallString, const_small_string_r_begin_points_to_x) { const SmallString text("x"); @@ -400,21 +400,21 @@ TEST(SmallString, ConstSmallStringRBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, SmallStringViewBeginIsEqualEndForEmptySmallString) +TEST(SmallString, small_string_view_begin_is_equal_end_for_empty_small_string) { SmallStringView text{""}; ASSERT_THAT(text.begin(), Eq(text.end())); } -TEST(SmallString, SmallStringViewBeginIsNotEqualEndForNonEmptySmallString) +TEST(SmallString, small_string_view_begin_is_not_equal_end_for_non_empty_small_string) { SmallStringView text("x"); ASSERT_THAT(text.begin(), Ne(text.end())); } -TEST(SmallString, SmallStringViewBeginPlusOneIsEqualEndForSmallStringWidthSizeOne) +TEST(SmallString, small_string_view_begin_plus_one_is_equal_end_for_small_string_width_size_one) { SmallStringView text("x"); @@ -423,21 +423,21 @@ TEST(SmallString, SmallStringViewBeginPlusOneIsEqualEndForSmallStringWidthSizeOn ASSERT_THAT(beginPlusOne, Eq(text.end())); } -TEST(SmallString, SmallStringViewRBeginIsEqualREndForEmptySmallString) +TEST(SmallString, small_string_view_r_begin_is_equal_r_end_for_empty_small_string) { SmallStringView text{""}; ASSERT_THAT(text.rbegin(), Eq(text.rend())); } -TEST(SmallString, SmallStringViewRBeginIsNotEqualREndForNonEmptySmallString) +TEST(SmallString, small_string_view_r_begin_is_not_equal_r_end_for_non_empty_small_string) { SmallStringView text("x"); ASSERT_THAT(text.rbegin(), Ne(text.rend())); } -TEST(SmallString, SmallStringViewRBeginPlusOneIsEqualREndForSmallStringWidthSizeOne) +TEST(SmallString, small_string_view_r_begin_plus_one_is_equal_r_end_for_small_string_width_size_one) { SmallStringView text("x"); @@ -446,21 +446,21 @@ TEST(SmallString, SmallStringViewRBeginPlusOneIsEqualREndForSmallStringWidthSize ASSERT_THAT(beginPlusOne, Eq(text.rend())); } -TEST(SmallString, SmallStringViewConstRBeginIsEqualREndForEmptySmallString) +TEST(SmallString, small_string_view_const_r_begin_is_equal_r_end_for_empty_small_string) { const SmallStringView text{""}; ASSERT_THAT(text.rbegin(), Eq(text.rend())); } -TEST(SmallString, SmallStringViewConstRBeginIsNotEqualREndForNonEmptySmallString) +TEST(SmallString, small_string_view_const_r_begin_is_not_equal_r_end_for_non_empty_small_string) { const SmallStringView text("x"); ASSERT_THAT(text.rbegin(), Ne(text.rend())); } -TEST(SmallString, SmallStringViewConstRBeginPlusOneIsEqualREndForSmallStringWidthSizeOne) +TEST(SmallString, small_string_view_const_r_begin_plus_one_is_equal_r_end_for_small_string_width_size_one) { const SmallStringView text("x"); @@ -469,7 +469,7 @@ TEST(SmallString, SmallStringViewConstRBeginPlusOneIsEqualREndForSmallStringWidt ASSERT_THAT(beginPlusOne, Eq(text.rend())); } -TEST(SmallString, SmallStringViewDistanceBetweenBeginAndEndIsZeroForEmptyText) +TEST(SmallString, small_string_view_distance_between_begin_and_end_is_zero_for_empty_text) { SmallStringView text(""); @@ -478,7 +478,7 @@ TEST(SmallString, SmallStringViewDistanceBetweenBeginAndEndIsZeroForEmptyText) ASSERT_THAT(distance, 0); } -TEST(SmallString, SmallStringViewDistanceBetweenBeginAndEndIsOneForOneSign) +TEST(SmallString, small_string_view_distance_between_begin_and_end_is_one_for_one_sign) { SmallStringView text("x"); @@ -487,7 +487,7 @@ TEST(SmallString, SmallStringViewDistanceBetweenBeginAndEndIsOneForOneSign) ASSERT_THAT(distance, 1); } -TEST(SmallString, SmallStringViewDistanceBetweenRBeginAndREndIsZeroForEmptyText) +TEST(SmallString, small_string_view_distance_between_r_begin_and_r_end_is_zero_for_empty_text) { SmallStringView text(""); @@ -496,7 +496,7 @@ TEST(SmallString, SmallStringViewDistanceBetweenRBeginAndREndIsZeroForEmptyText) ASSERT_THAT(distance, 0); } -TEST(SmallString, SmallStringViewDistanceBetweenRBeginAndREndIsOneForOneSign) +TEST(SmallString, small_string_view_distance_between_r_begin_and_r_end_is_one_for_one_sign) { SmallStringView text("x"); @@ -505,7 +505,7 @@ TEST(SmallString, SmallStringViewDistanceBetweenRBeginAndREndIsOneForOneSign) ASSERT_THAT(distance, 1); } -TEST(SmallString, ConstSmallStringViewDistanceBetweenBeginAndEndIsZeroForEmptyText) +TEST(SmallString, const_small_string_view_distance_between_begin_and_end_is_zero_for_empty_text) { const SmallStringView text(""); @@ -514,7 +514,7 @@ TEST(SmallString, ConstSmallStringViewDistanceBetweenBeginAndEndIsZeroForEmptyTe ASSERT_THAT(distance, 0); } -TEST(SmallString, ConstSmallStringViewDistanceBetweenBeginAndEndIsOneForOneSign) +TEST(SmallString, const_small_string_view_distance_between_begin_and_end_is_one_for_one_sign) { const SmallStringView text("x"); @@ -523,7 +523,7 @@ TEST(SmallString, ConstSmallStringViewDistanceBetweenBeginAndEndIsOneForOneSign) ASSERT_THAT(distance, 1); } -TEST(SmallString, ConstSmallStringViewDistanceBetweenRBeginAndREndIsZeroForEmptyText) +TEST(SmallString, const_small_string_view_distance_between_r_begin_and_r_end_is_zero_for_empty_text) { const SmallStringView text(""); @@ -532,7 +532,7 @@ TEST(SmallString, ConstSmallStringViewDistanceBetweenRBeginAndREndIsZeroForEmpty ASSERT_THAT(distance, 0); } -TEST(SmallString, ConstSmallStringViewDistanceBetweenRBeginAndREndIsOneForOneSign) +TEST(SmallString, const_small_string_view_distance_between_r_begin_and_r_end_is_one_for_one_sign) { const SmallStringView text("x"); @@ -541,7 +541,7 @@ TEST(SmallString, ConstSmallStringViewDistanceBetweenRBeginAndREndIsOneForOneSig ASSERT_THAT(distance, 1); } -TEST(SmallString, SmallStringViewBeginPointsToX) +TEST(SmallString, small_string_view_begin_points_to_x) { SmallStringView text("x"); @@ -550,7 +550,7 @@ TEST(SmallString, SmallStringViewBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, SmallStringViewRBeginPointsToX) +TEST(SmallString, small_string_view_r_begin_points_to_x) { SmallStringView text("x"); @@ -559,7 +559,7 @@ TEST(SmallString, SmallStringViewRBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, ConstSmallStringViewBeginPointsToX) +TEST(SmallString, const_small_string_view_begin_points_to_x) { const SmallStringView text("x"); @@ -568,7 +568,7 @@ TEST(SmallString, ConstSmallStringViewBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, ConstSmallStringViewRBeginPointsToX) +TEST(SmallString, const_small_string_view_r_begin_points_to_x) { const SmallStringView text("x"); @@ -577,7 +577,7 @@ TEST(SmallString, ConstSmallStringViewRBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, SmallStringLiteralViewRBeginPointsToX) +TEST(SmallString, small_string_literal_view_r_begin_points_to_x) { SmallStringLiteral text("x"); @@ -586,7 +586,7 @@ TEST(SmallString, SmallStringLiteralViewRBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, ConstSmallStringLiteralViewRBeginPointsToX) +TEST(SmallString, const_small_string_literal_view_r_begin_points_to_x) { const SmallStringLiteral text("x"); @@ -595,7 +595,7 @@ TEST(SmallString, ConstSmallStringLiteralViewRBeginPointsToX) ASSERT_THAT(sign, 'x'); } -TEST(SmallString, ConstructorStandardString) +TEST(SmallString, constructor_standard_string) { std::string stdStringText = "short string"; @@ -604,7 +604,7 @@ TEST(SmallString, ConstructorStandardString) ASSERT_THAT(text, SmallString("short string")); } -TEST(SmallString, ToQString) +TEST(SmallString, to_q_string) { SmallString text("short string"); @@ -613,7 +613,7 @@ TEST(SmallString, ToQString) ASSERT_THAT(qStringText, QStringLiteral("short string")); } -TEST(SmallString, FromQString) +TEST(SmallString, from_q_string) { QString qStringText = QStringLiteral("short string"); @@ -623,7 +623,7 @@ TEST(SmallString, FromQString) } -TEST(SmallString, FromQByteArray) +TEST(SmallString, from_q_byte_array) { QByteArray qByteArray = QByteArrayLiteral("short string"); @@ -632,7 +632,7 @@ TEST(SmallString, FromQByteArray) ASSERT_THAT(text, SmallString("short string")); } -TEST(SmallString, MidOneParameter) +TEST(SmallString, mid_one_parameter) { SmallString text("some text"); @@ -641,7 +641,7 @@ TEST(SmallString, MidOneParameter) ASSERT_THAT(midString, Eq(SmallString("text"))); } -TEST(SmallString, MidTwoParameter) +TEST(SmallString, mid_two_parameter) { SmallString text("some text and more"); @@ -650,7 +650,7 @@ TEST(SmallString, MidTwoParameter) ASSERT_THAT(midString, Eq(SmallString("text"))); } -TEST(SmallString, SmallStringViewMidOneParameter) +TEST(SmallString, small_string_view_mid_one_parameter) { SmallStringView text("some text"); @@ -659,7 +659,7 @@ TEST(SmallString, SmallStringViewMidOneParameter) ASSERT_THAT(midString, Eq(SmallStringView("text"))); } -TEST(SmallString, SmallStringViewMidTwoParameter) +TEST(SmallString, small_string_view_mid_two_parameter) { SmallStringView text("some text and more"); @@ -668,7 +668,7 @@ TEST(SmallString, SmallStringViewMidTwoParameter) ASSERT_THAT(midString, Eq(SmallStringView("text"))); } -TEST(SmallString, SizeOfEmptyStringl) +TEST(SmallString, size_of_empty_stringl) { SmallString emptyString; @@ -677,7 +677,7 @@ TEST(SmallString, SizeOfEmptyStringl) ASSERT_THAT(size, 0); } -TEST(SmallString, SizeShortSmallStringLiteral) +TEST(SmallString, size_short_small_string_literal) { SmallStringLiteral shortText("text"); @@ -686,7 +686,7 @@ TEST(SmallString, SizeShortSmallStringLiteral) ASSERT_THAT(size, 4); } -TEST(SmallString, SizeLongSmallStringLiteral) +TEST(SmallString, size_long_small_string_literal) { auto longText = SmallStringLiteral("very very very very very very very very very very very long string"); @@ -695,7 +695,7 @@ TEST(SmallString, SizeLongSmallStringLiteral) ASSERT_THAT(size, 66); } -TEST(SmallString, SizeReference) +TEST(SmallString, size_reference) { SmallString shortText("text"); @@ -704,7 +704,7 @@ TEST(SmallString, SizeReference) ASSERT_THAT(size, 4); } -TEST(SmallString, SizeShortSmallString) +TEST(SmallString, size_short_small_string) { SmallString shortText("text", 4); @@ -713,7 +713,7 @@ TEST(SmallString, SizeShortSmallString) ASSERT_THAT(size, 4); } -TEST(SmallString, SizeShortPathString) +TEST(SmallString, size_short_path_string) { SmallString shortPath("very very very very very very very very very very very long path which fits in the short memory"); @@ -722,7 +722,7 @@ TEST(SmallString, SizeShortPathString) ASSERT_THAT(size, 95); } -TEST(SmallString, SizeLongSmallString) +TEST(SmallString, size_long_small_string) { auto longText = SmallString::fromUtf8("very very very very very very very very very very very long string"); @@ -731,7 +731,7 @@ TEST(SmallString, SizeLongSmallString) ASSERT_THAT(size, 66); } -TEST(SmallString, CapacityReference) +TEST(SmallString, capacity_reference) { SmallString shortText("very very very very very very very long string"); @@ -740,7 +740,7 @@ TEST(SmallString, CapacityReference) ASSERT_THAT(capacity, 0); } -TEST(SmallString, CapacityShortSmallString) +TEST(SmallString, capacity_short_small_string) { SmallString shortText("text", 4); @@ -749,7 +749,7 @@ TEST(SmallString, CapacityShortSmallString) ASSERT_THAT(capacity, 31); } -TEST(SmallString, CapacityLongSmallString) +TEST(SmallString, capacity_long_small_string) { auto longText = SmallString::fromUtf8("very very very very very very very very very very very long string"); @@ -758,49 +758,49 @@ TEST(SmallString, CapacityLongSmallString) ASSERT_THAT(capacity, 66); } -TEST(SmallString, FitsNotInCapacityBecauseNullSmallStringIsAShortSmallString) +TEST(SmallString, fits_not_in_capacity_because_null_small_string_is_a_short_small_string) { SmallString text; ASSERT_FALSE(text.fitsNotInCapacity(30)); } -TEST(SmallString, FitsNotInCapacityBecauseItIsReference) +TEST(SmallString, fits_not_in_capacity_because_it_is_reference) { SmallString text("very very very very very very very long string"); ASSERT_TRUE(text.fitsNotInCapacity(1)); } -TEST(SmallString, FitsInShortSmallStringCapacity) +TEST(SmallString, fits_in_short_small_string_capacity) { SmallString text("text", 4); ASSERT_FALSE(text.fitsNotInCapacity(30)); } -TEST(SmallString, FitsInNotShortSmallStringCapacity) +TEST(SmallString, fits_in_not_short_small_string_capacity) { SmallString text("text", 4); ASSERT_TRUE(text.fitsNotInCapacity(32)); } -TEST(SmallString, FitsInLongSmallStringCapacity) +TEST(SmallString, fits_in_long_small_string_capacity) { SmallString text = SmallString::fromUtf8("very very very very very very long string"); ASSERT_FALSE(text.fitsNotInCapacity(33)) << text.capacity(); } -TEST(SmallString, FitsNotInLongSmallStringCapacity) +TEST(SmallString, fits_not_in_long_small_string_capacity) { SmallString text = SmallString::fromUtf8("very very very very very very long string"); ASSERT_TRUE(text.fitsNotInCapacity(65)) << text.capacity(); } -TEST(SmallString, AppendNullSmallString) +TEST(SmallString, append_null_small_string) { SmallString text("text"); @@ -809,7 +809,7 @@ TEST(SmallString, AppendNullSmallString) ASSERT_THAT(text, SmallString("text")); } -TEST(SmallString, AppendNullQString) +TEST(SmallString, append_null_q_string) { SmallString text("text"); @@ -818,7 +818,7 @@ TEST(SmallString, AppendNullQString) ASSERT_THAT(text, SmallString("text")); } -TEST(SmallString, AppendEmptySmallString) +TEST(SmallString, append_empty_small_string) { SmallString text("text"); @@ -827,7 +827,7 @@ TEST(SmallString, AppendEmptySmallString) ASSERT_THAT(text, SmallString("text")); } -TEST(SmallString, AppendEmptyQString) +TEST(SmallString, append_empty_q_string) { SmallString text("text"); @@ -836,7 +836,7 @@ TEST(SmallString, AppendEmptyQString) ASSERT_THAT(text, SmallString("text")); } -TEST(SmallString, AppendShortSmallString) +TEST(SmallString, append_short_small_string) { SmallString text("some "); @@ -845,7 +845,7 @@ TEST(SmallString, AppendShortSmallString) ASSERT_THAT(text, SmallString("some text")); } -TEST(SmallString, AppendShortQString) +TEST(SmallString, append_short_q_string) { SmallString text("some "); @@ -854,7 +854,7 @@ TEST(SmallString, AppendShortQString) ASSERT_THAT(text, SmallString("some text")); } -TEST(SmallString, AppendLongSmallStringToShortSmallString) +TEST(SmallString, append_long_small_string_to_short_small_string) { SmallString text("some "); @@ -863,7 +863,7 @@ TEST(SmallString, AppendLongSmallStringToShortSmallString) ASSERT_THAT(text, SmallString("some very very very very very long string")); } -TEST(SmallString, AppendLongQStringToShortSmallString) +TEST(SmallString, append_long_q_string_to_short_small_string) { SmallString text("some "); @@ -872,7 +872,7 @@ TEST(SmallString, AppendLongQStringToShortSmallString) ASSERT_THAT(text, SmallString("some very very very very very long string")); } -TEST(SmallString, AppendLongSmallString) +TEST(SmallString, append_long_small_string) { SmallString longText("some very very very very very very very very very very very long string"); @@ -881,7 +881,7 @@ TEST(SmallString, AppendLongSmallString) ASSERT_THAT(longText, SmallString("some very very very very very very very very very very very long string text")); } -TEST(SmallString, AppendLongQString) +TEST(SmallString, append_long_q_string) { SmallString longText("some very very very very very very very very very very very long string"); @@ -893,7 +893,7 @@ TEST(SmallString, AppendLongQString) "some very very very very very very very very very very very long string text")); } -TEST(SmallString, AppendInitializerList) +TEST(SmallString, append_initializer_list) { SmallString text("some text"); @@ -902,7 +902,7 @@ TEST(SmallString, AppendInitializerList) ASSERT_THAT(text, Eq("some text and some other text")); } -TEST(SmallString, AppendEmptyInitializerList) +TEST(SmallString, append_empty_initializer_list) { SmallString text("some text"); @@ -911,14 +911,14 @@ TEST(SmallString, AppendEmptyInitializerList) ASSERT_THAT(text, Eq("some text")); } -TEST(SmallString, ToByteArray) +TEST(SmallString, to_byte_array) { SmallString text("some text"); ASSERT_THAT(text.toQByteArray(), QByteArrayLiteral("some text")); } -TEST(SmallString, Contains) +TEST(SmallString, contains) { SmallString text("some text"); @@ -927,7 +927,7 @@ TEST(SmallString, Contains) ASSERT_TRUE(text.contains('x')); } -TEST(SmallString, NotContains) +TEST(SmallString, not_contains) { SmallString text("some text"); @@ -936,7 +936,7 @@ TEST(SmallString, NotContains) ASSERT_FALSE(text.contains('q')); } -TEST(SmallString, EqualSmallStringOperator) +TEST(SmallString, equal_small_string_operator) { ASSERT_TRUE(SmallString() == SmallString("")); ASSERT_FALSE(SmallString() == SmallString("text")); @@ -944,7 +944,7 @@ TEST(SmallString, EqualSmallStringOperator) ASSERT_FALSE(SmallString("text") == SmallString("text2")); } -TEST(SmallString, EqualSmallStringOperatorWithDifferenceClassSizes) +TEST(SmallString, equal_small_string_operator_with_difference_class_sizes) { ASSERT_TRUE(SmallString() == PathString("")); ASSERT_FALSE(SmallString() == PathString("text")); @@ -952,7 +952,7 @@ TEST(SmallString, EqualSmallStringOperatorWithDifferenceClassSizes) ASSERT_FALSE(SmallString("text") == PathString("text2")); } -TEST(SmallString, EqualCStringArrayOperator) +TEST(SmallString, equal_c_string_array_operator) { ASSERT_TRUE(SmallString() == ""); ASSERT_FALSE(SmallString() == "text"); @@ -960,55 +960,55 @@ TEST(SmallString, EqualCStringArrayOperator) ASSERT_FALSE(SmallString("text") == "text2"); } -TEST(SmallString, EqualCStringPointerOperator) +TEST(SmallString, equal_c_string_pointer_operator) { ASSERT_TRUE(SmallString("text") == std::string("text").data()); ASSERT_FALSE(SmallString("text") == std::string("text2").data()); } -TEST(SmallString, EqualSmallStringViewOperator) +TEST(SmallString, equal_small_string_view_operator) { ASSERT_TRUE(SmallString("text") == SmallStringView("text")); ASSERT_FALSE(SmallString("text") == SmallStringView("text2")); } -TEST(SmallString, EqualSmallStringViewsOperator) +TEST(SmallString, equal_small_string_views_operator) { ASSERT_TRUE(SmallStringView("text") == SmallStringView("text")); ASSERT_FALSE(SmallStringView("text") == SmallStringView("text2")); } -TEST(SmallString, UnequalOperator) +TEST(SmallString, unequal_operator) { ASSERT_FALSE(SmallString("text") != SmallString("text")); ASSERT_TRUE(SmallString("text") != SmallString("text2")); } -TEST(SmallString, UnequalCStringArrayOperator) +TEST(SmallString, unequal_c_string_array_operator) { ASSERT_FALSE(SmallString("text") != "text"); ASSERT_TRUE(SmallString("text") != "text2"); } -TEST(SmallString, UnequalCStringPointerOperator) +TEST(SmallString, unequal_c_string_pointer_operator) { ASSERT_FALSE(SmallString("text") != std::string("text").data()); ASSERT_TRUE(SmallString("text") != std::string("text2").data()); } -TEST(SmallString, UnequalSmallStringViewArrayOperator) +TEST(SmallString, unequal_small_string_view_array_operator) { ASSERT_FALSE(SmallString("text") != SmallStringView("text")); ASSERT_TRUE(SmallString("text") != SmallStringView("text2")); } -TEST(SmallString, UnequalSmallStringViewsArrayOperator) +TEST(SmallString, unequal_small_string_views_array_operator) { ASSERT_FALSE(SmallStringView("text") != SmallStringView("text")); ASSERT_TRUE(SmallStringView("text") != SmallStringView("text2")); } -TEST(SmallString, SmallerOperator) +TEST(SmallString, smaller_operator) { ASSERT_TRUE(SmallString() < SmallString("text")); ASSERT_TRUE(SmallString("some") < SmallString("text")); @@ -1018,7 +1018,7 @@ TEST(SmallString, SmallerOperator) ASSERT_FALSE(SmallString("text") < SmallString("text")); } -TEST(SmallString, SmallerOperatorWithStringViewRight) +TEST(SmallString, smaller_operator_with_string_view_right) { ASSERT_TRUE(SmallString() < SmallStringView("text")); ASSERT_TRUE(SmallString("some") < SmallStringView("text")); @@ -1028,7 +1028,7 @@ TEST(SmallString, SmallerOperatorWithStringViewRight) ASSERT_FALSE(SmallString("text") < SmallStringView("text")); } -TEST(SmallString, SmallerOperatorWithStringViewLeft) +TEST(SmallString, smaller_operator_with_string_view_left) { ASSERT_TRUE(SmallStringView("") < SmallString("text")); ASSERT_TRUE(SmallStringView("some") < SmallString("text")); @@ -1038,7 +1038,7 @@ TEST(SmallString, SmallerOperatorWithStringViewLeft) ASSERT_FALSE(SmallStringView("text") < SmallString("text")); } -TEST(SmallString, SmallerOperatorForDifferenceClassSizes) +TEST(SmallString, smaller_operator_for_difference_class_sizes) { ASSERT_TRUE(SmallString() < PathString("text")); ASSERT_TRUE(SmallString("some") < PathString("text")); @@ -1048,33 +1048,33 @@ TEST(SmallString, SmallerOperatorForDifferenceClassSizes) ASSERT_FALSE(SmallString("text") < PathString("text")); } -TEST(SmallString, IsEmpty) +TEST(SmallString, is_empty) { ASSERT_FALSE(SmallString("text").isEmpty()); ASSERT_TRUE(SmallString("").isEmpty()); ASSERT_TRUE(SmallString().isEmpty()); } -TEST(SmallString, StringViewIsEmpty) +TEST(SmallString, string_view_is_empty) { ASSERT_FALSE(SmallStringView("text").isEmpty()); ASSERT_TRUE(SmallStringView("").isEmpty()); } -TEST(SmallString, StringViewEmpty) +TEST(SmallString, string_view_empty) { ASSERT_FALSE(SmallStringView("text").empty()); ASSERT_TRUE(SmallStringView("").empty()); } -TEST(SmallString, HasContent) +TEST(SmallString, has_content) { ASSERT_TRUE(SmallString("text").hasContent()); ASSERT_FALSE(SmallString("").hasContent()); ASSERT_FALSE(SmallString().hasContent()); } -TEST(SmallString, Clear) +TEST(SmallString, clear) { SmallString text("text"); @@ -1083,7 +1083,7 @@ TEST(SmallString, Clear) ASSERT_TRUE(text.isEmpty()); } -TEST(SmallString, NoOccurrencesForEmptyText) +TEST(SmallString, no_occurrences_for_empty_text) { SmallString text; @@ -1092,7 +1092,7 @@ TEST(SmallString, NoOccurrencesForEmptyText) ASSERT_THAT(occurrences, 0); } -TEST(SmallString, NoOccurrencesInText) +TEST(SmallString, no_occurrences_in_text) { SmallString text("here is some text, here is some text, here is some text"); @@ -1101,7 +1101,7 @@ TEST(SmallString, NoOccurrencesInText) ASSERT_THAT(occurrences, 0); } -TEST(SmallString, SomeOccurrences) +TEST(SmallString, some_occurrences) { SmallString text("here is some text, here is some text, here is some text"); @@ -1110,7 +1110,7 @@ TEST(SmallString, SomeOccurrences) ASSERT_THAT(occurrences, 3); } -TEST(SmallString, SomeMoreOccurrences) +TEST(SmallString, some_more_occurrences) { SmallString text("texttexttext"); @@ -1119,7 +1119,7 @@ TEST(SmallString, SomeMoreOccurrences) ASSERT_THAT(occurrences, 3); } -TEST(SmallString, ReplaceWithCharacter) +TEST(SmallString, replace_with_character) { SmallString text("here is some text, here is some text, here is some text"); @@ -1128,7 +1128,7 @@ TEST(SmallString, ReplaceWithCharacter) ASSERT_THAT(text, SmallString("here ix xome text, here ix xome text, here ix xome text")); } -TEST(SmallString, ReplaceWithEqualSizedText) +TEST(SmallString, replace_with_equal_sized_text) { SmallString text("here is some text"); @@ -1137,7 +1137,7 @@ TEST(SmallString, ReplaceWithEqualSizedText) ASSERT_THAT(text, SmallString("here is much text")); } -TEST(SmallString, ReplaceWithEqualSizedTextOnEmptyText) +TEST(SmallString, replace_with_equal_sized_text_on_empty_text) { SmallString text; @@ -1146,7 +1146,7 @@ TEST(SmallString, ReplaceWithEqualSizedTextOnEmptyText) ASSERT_THAT(text, SmallString()); } -TEST(SmallString, ReplaceWithShorterText) +TEST(SmallString, replace_with_shorter_text) { SmallString text("here is some text"); @@ -1155,7 +1155,7 @@ TEST(SmallString, ReplaceWithShorterText) ASSERT_THAT(text, SmallString("here is any text")); } -TEST(SmallString, ReplaceWithShorterTextOnEmptyText) +TEST(SmallString, replace_with_shorter_text_on_empty_text) { SmallString text; @@ -1164,7 +1164,7 @@ TEST(SmallString, ReplaceWithShorterTextOnEmptyText) ASSERT_THAT(text, SmallString()); } -TEST(SmallString, ReplaceWithLongerText) +TEST(SmallString, replace_with_longer_text) { SmallString text("here is some text"); @@ -1173,7 +1173,7 @@ TEST(SmallString, ReplaceWithLongerText) ASSERT_THAT(text, SmallString("here is much more text")); } -TEST(SmallString, ReplaceWithLongerTextOnEmptyText) +TEST(SmallString, replace_with_longer_text_on_empty_text) { SmallString text; @@ -1182,7 +1182,7 @@ TEST(SmallString, ReplaceWithLongerTextOnEmptyText) ASSERT_THAT(text, SmallString()); } -TEST(SmallString, ReplaceShortSmallStringWithLongerText) +TEST(SmallString, replace_short_small_string_with_longer_text) { SmallString text = SmallString::fromUtf8("here is some text"); @@ -1191,7 +1191,7 @@ TEST(SmallString, ReplaceShortSmallStringWithLongerText) ASSERT_THAT(text, SmallString("here is much more text")); } -TEST(SmallString, ReplaceLongSmallStringWithLongerText) +TEST(SmallString, replace_long_small_string_with_longer_text) { SmallString text = SmallString::fromUtf8("some very very very very very very very very very very very long string"); @@ -1200,7 +1200,7 @@ TEST(SmallString, ReplaceLongSmallStringWithLongerText) ASSERT_THAT(text, "some very very very very very very very very very very very much much much much much much much much much much much much much much much much much much more string"); } -TEST(SmallString, MultipleReplaceSmallStringWithLongerText) +TEST(SmallString, multiple_replace_small_string_with_longer_text) { SmallString text = SmallString("here is some text with some longer text"); @@ -1209,7 +1209,7 @@ TEST(SmallString, MultipleReplaceSmallStringWithLongerText) ASSERT_THAT(text, SmallString("here is much more text with much more longer text")); } -TEST(SmallString, MultipleReplaceSmallStringWithShorterText) +TEST(SmallString, multiple_replace_small_string_with_shorter_text) { SmallString text = SmallString("here is some text with some longer text"); @@ -1218,7 +1218,7 @@ TEST(SmallString, MultipleReplaceSmallStringWithShorterText) ASSERT_THAT(text, SmallString("here is a text with a longer text")); } -TEST(SmallString, DontReplaceReplacedText) +TEST(SmallString, dont_replace_replaced_text) { SmallString text("here is some foo text"); @@ -1227,7 +1227,7 @@ TEST(SmallString, DontReplaceReplacedText) ASSERT_THAT(text, SmallString("here is some foofoo text")); } -TEST(SmallString, DontReserveIfNothingIsReplacedForLongerReplacementText) +TEST(SmallString, dont_reserve_if_nothing_is_replaced_for_longer_replacement_text) { SmallString text("here is some text with some longer text"); @@ -1236,7 +1236,7 @@ TEST(SmallString, DontReserveIfNothingIsReplacedForLongerReplacementText) ASSERT_TRUE(text.isReadOnlyReference()); } -TEST(SmallString, DontReserveIfNothingIsReplacedForShorterReplacementText) +TEST(SmallString, dont_reserve_if_nothing_is_replaced_for_shorter_replacement_text) { SmallString text("here is some text with some longer text"); @@ -1245,7 +1245,7 @@ TEST(SmallString, DontReserveIfNothingIsReplacedForShorterReplacementText) ASSERT_TRUE(text.isReadOnlyReference()); } -TEST(SmallString, StartsWith) +TEST(SmallString, starts_with) { SmallString text("$column"); @@ -1257,7 +1257,7 @@ TEST(SmallString, StartsWith) ASSERT_FALSE(text.startsWith('@')); } -TEST(SmallString, StartsWithStringView) +TEST(SmallString, starts_with_string_view) { SmallStringView text("$column"); @@ -1269,7 +1269,7 @@ TEST(SmallString, StartsWithStringView) ASSERT_FALSE(text.startsWith('@')); } -TEST(SmallString, EndsWith) +TEST(SmallString, ends_with) { SmallString text("/my/path"); @@ -1280,7 +1280,7 @@ TEST(SmallString, EndsWith) ASSERT_FALSE(text.endsWith('x')); } -TEST(SmallString, EndsWithStringView) +TEST(SmallString, ends_with_string_view) { SmallStringView text("/my/path"); @@ -1289,7 +1289,7 @@ TEST(SmallString, EndsWithStringView) ASSERT_FALSE(text.endsWith("paths")); } -TEST(SmallString, EndsWithSmallString) +TEST(SmallString, ends_with_small_string) { SmallString text("/my/path"); @@ -1297,7 +1297,7 @@ TEST(SmallString, EndsWithSmallString) ASSERT_TRUE(text.endsWith('h')); } -TEST(SmallString, ReserveSmallerThanShortStringCapacity) +TEST(SmallString, reserve_smaller_than_short_string_capacity) { SmallString text("text"); @@ -1306,7 +1306,7 @@ TEST(SmallString, ReserveSmallerThanShortStringCapacity) ASSERT_THAT(text.capacity(), 31); } -TEST(SmallString, ReserveSmallerThanShortStringCapacityIsShortString) +TEST(SmallString, reserve_smaller_than_short_string_capacity_is_short_string) { SmallString text("text"); @@ -1315,7 +1315,7 @@ TEST(SmallString, ReserveSmallerThanShortStringCapacityIsShortString) ASSERT_TRUE(text.isShortString()); } -TEST(SmallString, ReserveSmallerThanReference) +TEST(SmallString, reserve_smaller_than_reference) { SmallString text("some very very very very very very very very very very very long string"); @@ -1324,7 +1324,7 @@ TEST(SmallString, ReserveSmallerThanReference) ASSERT_THAT(text.capacity(), 71); } -TEST(SmallString, ReserveBiggerThanShortStringCapacity) +TEST(SmallString, reserve_bigger_than_short_string_capacity) { SmallString text("text"); @@ -1333,7 +1333,7 @@ TEST(SmallString, ReserveBiggerThanShortStringCapacity) ASSERT_THAT(text.capacity(), 31); } -TEST(SmallString, ReserveBiggerThanReference) +TEST(SmallString, reserve_bigger_than_reference) { SmallString text("some very very very very very very very very very very very long string"); @@ -1342,7 +1342,7 @@ TEST(SmallString, ReserveBiggerThanReference) ASSERT_THAT(text.capacity(), 71); } -TEST(SmallString, ReserveMuchBiggerThanShortStringCapacity) +TEST(SmallString, reserve_much_bigger_than_short_string_capacity) { SmallString text("text"); @@ -1351,7 +1351,7 @@ TEST(SmallString, ReserveMuchBiggerThanShortStringCapacity) ASSERT_THAT(text.capacity(), 100); } -TEST(SmallString, TextIsCopiedAfterReserveFromShortToLongString) +TEST(SmallString, text_is_copied_after_reserve_from_short_to_long_string) { SmallString text("text"); @@ -1360,7 +1360,7 @@ TEST(SmallString, TextIsCopiedAfterReserveFromShortToLongString) ASSERT_THAT(text, "text"); } -TEST(SmallString, TextIsCopiedAfterReserveReferenceToLongString) +TEST(SmallString, text_is_copied_after_reserve_reference_to_long_string) { SmallString text("some very very very very very very very very very very very long string"); @@ -1369,7 +1369,7 @@ TEST(SmallString, TextIsCopiedAfterReserveReferenceToLongString) ASSERT_THAT(text, "some very very very very very very very very very very very long string"); } -TEST(SmallString, ReserveSmallerThanShortSmallString) +TEST(SmallString, reserve_smaller_than_short_small_string) { SmallString text = SmallString::fromUtf8("text"); @@ -1378,7 +1378,7 @@ TEST(SmallString, ReserveSmallerThanShortSmallString) ASSERT_THAT(text.capacity(), 31); } -TEST(SmallString, ReserveBiggerThanShortSmallString) +TEST(SmallString, reserve_bigger_than_short_small_string) { SmallString text = SmallString::fromUtf8("text"); @@ -1387,7 +1387,7 @@ TEST(SmallString, ReserveBiggerThanShortSmallString) ASSERT_THAT(text.capacity(), 100); } -TEST(SmallString, ReserveBiggerThanLongSmallString) +TEST(SmallString, reserve_bigger_than_long_small_string) { SmallString text = SmallString::fromUtf8("some very very very very very very very very very very very long string"); @@ -1396,7 +1396,7 @@ TEST(SmallString, ReserveBiggerThanLongSmallString) ASSERT_THAT(text.capacity(), 100); } -TEST(SmallString, OptimalHeapCacheLineForSize) +TEST(SmallString, optimal_heap_cache_line_for_size) { ASSERT_THAT(SmallString::optimalHeapCapacity(64), 64); ASSERT_THAT(SmallString::optimalHeapCapacity(65), 128); @@ -1415,7 +1415,7 @@ TEST(SmallString, OptimalHeapCacheLineForSize) ASSERT_THAT(SmallString::optimalHeapCapacity(4097), 4160); } -TEST(SmallString, OptimalCapacityForSize) +TEST(SmallString, optimal_capacity_for_size) { SmallString text; @@ -1427,7 +1427,7 @@ TEST(SmallString, OptimalCapacityForSize) ASSERT_THAT(text.optimalCapacity(129), 192); } -TEST(SmallString, DataStreamData) +TEST(SmallString, data_stream_data) { SmallString inputText("foo"); QByteArray byteArray; @@ -1438,7 +1438,7 @@ TEST(SmallString, DataStreamData) ASSERT_TRUE(byteArray.endsWith("foo")); } -TEST(SmallString, ReadDataStreamSize) +TEST(SmallString, read_data_stream_size) { SmallString outputText("foo"); QByteArray byteArray; @@ -1454,7 +1454,7 @@ TEST(SmallString, ReadDataStreamSize) ASSERT_THAT(size, 3); } -TEST(SmallString, ReadDataStreamData) +TEST(SmallString, read_data_stream_data) { SmallString outputText("foo"); QByteArray byteArray; @@ -1470,7 +1470,7 @@ TEST(SmallString, ReadDataStreamData) ASSERT_THAT(outputString, SmallString("foo")); } -TEST(SmallString, ShortSmallStringCopyConstuctor) +TEST(SmallString, short_small_string_copy_constuctor) { SmallString text("text"); @@ -1479,7 +1479,7 @@ TEST(SmallString, ShortSmallStringCopyConstuctor) ASSERT_THAT(copy, text); } -TEST(SmallString, LongSmallStringCopyConstuctor) +TEST(SmallString, long_small_string_copy_constuctor) { SmallString text("this is a very very very very long text"); @@ -1488,7 +1488,7 @@ TEST(SmallString, LongSmallStringCopyConstuctor) ASSERT_THAT(copy, text); } -TEST(SmallString, ShortSmallStringMoveConstuctor) +TEST(SmallString, short_small_string_move_constuctor) { SmallString text("text"); @@ -1497,7 +1497,7 @@ TEST(SmallString, ShortSmallStringMoveConstuctor) ASSERT_THAT(copy, SmallString("text")); } -TEST(SmallString, LongSmallStringMoveConstuctor) +TEST(SmallString, long_small_string_move_constuctor) { SmallString text("this is a very very very very long text"); @@ -1506,7 +1506,7 @@ TEST(SmallString, LongSmallStringMoveConstuctor) ASSERT_THAT(copy, SmallString("this is a very very very very long text")); } -TEST(SmallString, ShortPathStringMoveConstuctor) +TEST(SmallString, short_path_string_move_constuctor) { PathString text("text"); @@ -1515,7 +1515,7 @@ TEST(SmallString, ShortPathStringMoveConstuctor) ASSERT_THAT(copy, SmallString("text")); } -TEST(SmallString, LongPathStringMoveConstuctor) +TEST(SmallString, long_path_string_move_constuctor) { PathString text( "this is a very very very very very very very very very very very very very very very very " @@ -1537,7 +1537,7 @@ QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wself-move") QT_WARNING_DISABLE_CLANG("-Wself-move") -TEST(SmallString, ShortSmallStringMoveConstuctorToSelf) +TEST(SmallString, short_small_string_move_constuctor_to_self) { SmallString text("text"); @@ -1546,7 +1546,7 @@ TEST(SmallString, ShortSmallStringMoveConstuctorToSelf) ASSERT_THAT(text, SmallString("text")); } -TEST(SmallString, LongSmallStringMoveConstuctorToSelf) +TEST(SmallString, long_small_string_move_constuctor_to_self) { SmallString text("this is a very very very very long text"); @@ -1555,7 +1555,7 @@ TEST(SmallString, LongSmallStringMoveConstuctorToSelf) ASSERT_THAT(text, SmallString("this is a very very very very long text")); } -TEST(SmallString, ShortPathStringMoveConstuctorToSelf) +TEST(SmallString, short_path_string_move_constuctor_to_self) { PathString text("text"); @@ -1564,7 +1564,7 @@ TEST(SmallString, ShortPathStringMoveConstuctorToSelf) ASSERT_THAT(text, SmallString("text")); } -TEST(SmallString, LongPathStringMoveConstuctorToSelf) +TEST(SmallString, long_path_string_move_constuctor_to_self) { PathString text( "this is a very very very very very very very very very very very very very very very very " @@ -1584,7 +1584,7 @@ TEST(SmallString, LongPathStringMoveConstuctorToSelf) QT_WARNING_POP -TEST(SmallString, ShortSmallStringCopyAssignment) +TEST(SmallString, short_small_string_copy_assignment) { SmallString text("text"); SmallString copy("more text"); @@ -1594,7 +1594,7 @@ TEST(SmallString, ShortSmallStringCopyAssignment) ASSERT_THAT(copy, text); } -TEST(SmallString, LongSmallStringCopyAssignment) +TEST(SmallString, long_small_string_copy_assignment) { SmallString text("this is a very very very very long text"); SmallString copy("more text"); @@ -1609,7 +1609,7 @@ TEST(SmallString, LongSmallStringCopyAssignment) #pragma clang diagnostic ignored "-Wself-assign-overloaded" #endif -TEST(SmallString, LongSmallStringCopySelfAssignment) +TEST(SmallString, long_small_string_copy_self_assignment) { SmallString text("this is a very very very very long text"); @@ -1622,7 +1622,7 @@ TEST(SmallString, LongSmallStringCopySelfAssignment) #pragma clang diagnostic pop #endif -TEST(SmallString, ShortSmallStringMoveAssignment) +TEST(SmallString, short_small_string_move_assignment) { SmallString text("text"); SmallString copy("more text"); @@ -1632,7 +1632,7 @@ TEST(SmallString, ShortSmallStringMoveAssignment) ASSERT_THAT(copy, SmallString("text")); } -TEST(SmallString, LongSmallStringMoveAssignment) +TEST(SmallString, long_small_string_move_assignment) { SmallString text("this is a very very very very long text"); SmallString copy("more text"); @@ -1642,7 +1642,7 @@ TEST(SmallString, LongSmallStringMoveAssignment) ASSERT_THAT(copy, SmallString("this is a very very very very long text")); } -TEST(SmallString, ShortPathStringMoveAssignment) +TEST(SmallString, short_path_string_move_assignment) { PathString text("text"); PathString copy("more text"); @@ -1652,7 +1652,7 @@ TEST(SmallString, ShortPathStringMoveAssignment) ASSERT_THAT(copy, SmallString("text")); } -TEST(SmallString, LongPathStringMoveAssignment) +TEST(SmallString, long_path_string_move_assignment) { PathString text( "this is a very very very very very very very very very very very very very very very very " @@ -1671,7 +1671,7 @@ TEST(SmallString, LongPathStringMoveAssignment) "text")); } -TEST(SmallString, ShortSmallStringTake) +TEST(SmallString, short_small_string_take) { SmallString text("text"); SmallString copy("more text"); @@ -1682,7 +1682,7 @@ TEST(SmallString, ShortSmallStringTake) ASSERT_THAT(copy, SmallString("text")); } -TEST(SmallString, LongSmallStringTake) +TEST(SmallString, long_small_string_take) { SmallString text("this is a very very very very long text"); SmallString copy("more text"); @@ -1693,7 +1693,7 @@ TEST(SmallString, LongSmallStringTake) ASSERT_THAT(copy, SmallString("this is a very very very very long text")); } -TEST(SmallString, ReplaceByPositionShorterWithLongerText) +TEST(SmallString, replace_by_position_shorter_with_longer_text) { SmallString text("this is a very very very very long text"); @@ -1702,7 +1702,7 @@ TEST(SmallString, ReplaceByPositionShorterWithLongerText) ASSERT_THAT(text, SmallString("this is some very very very very long text")); } -TEST(SmallString, ReplaceByPositionLongerWithShortText) +TEST(SmallString, replace_by_position_longer_with_short_text) { SmallString text("this is some very very very very long text"); @@ -1711,7 +1711,7 @@ TEST(SmallString, ReplaceByPositionLongerWithShortText) ASSERT_THAT(text, SmallString("this is a very very very very long text")); } -TEST(SmallString, ReplaceByPositionEqualSizedTexts) +TEST(SmallString, replace_by_position_equal_sized_texts) { SmallString text("this is very very very very very long text"); @@ -1720,7 +1720,7 @@ TEST(SmallString, ReplaceByPositionEqualSizedTexts) ASSERT_THAT(text, SmallString("this is very very very very very much text")); } -TEST(SmallString, CompareTextWithDifferentLineEndings) +TEST(SmallString, compare_text_with_different_line_endings) { SmallString unixText("some \ntext"); SmallString windowsText("some \n\rtext"); @@ -1730,7 +1730,7 @@ TEST(SmallString, CompareTextWithDifferentLineEndings) ASSERT_THAT(unixText, convertedText); } -TEST(SmallString, ConstSubscriptOperator) +TEST(SmallString, const_subscript_operator) { const SmallString text{"some text"}; @@ -1739,7 +1739,7 @@ TEST(SmallString, ConstSubscriptOperator) ASSERT_THAT(sign, 't'); } -TEST(SmallString, NonConstSubscriptOperator) +TEST(SmallString, non_const_subscript_operator) { SmallString text{"some text"}; @@ -1748,7 +1748,7 @@ TEST(SmallString, NonConstSubscriptOperator) ASSERT_THAT(sign, 't'); } -TEST(SmallString, ManipulateConstSubscriptOperator) +TEST(SmallString, manipulate_const_subscript_operator) { const SmallString text{"some text"}; auto &&sign = text[5]; @@ -1758,7 +1758,7 @@ TEST(SmallString, ManipulateConstSubscriptOperator) ASSERT_THAT(text, SmallString{"some text"}); } -TEST(SmallString, ManipulateNonConstSubscriptOperator) +TEST(SmallString, manipulate_non_const_subscript_operator) { char rawText[] = "some text"; SmallString text{rawText}; @@ -1769,35 +1769,35 @@ TEST(SmallString, ManipulateNonConstSubscriptOperator) ASSERT_THAT(text, SmallString{"some qext"}); } -TEST(SmallString, EmptyInitializerListContent) +TEST(SmallString, empty_initializer_list_content) { SmallString text = {}; ASSERT_THAT(text, SmallString()); } -TEST(SmallString, EmptyInitializerListSize) +TEST(SmallString, empty_initializer_list_size) { SmallString text = {}; ASSERT_THAT(text, SizeIs(0)); } -TEST(SmallString, InitializerListContent) +TEST(SmallString, initializer_list_content) { auto text = SmallString::join({"some", " ", "text"}); ASSERT_THAT(text, SmallString("some text")); } -TEST(SmallString, InitializerListSize) +TEST(SmallString, initializer_list_size) { auto text = SmallString::join({"some", " ", "text"}); ASSERT_THAT(text, SizeIs(9)); } -TEST(SmallString, NumberToString) +TEST(SmallString, number_to_string) { ASSERT_THAT(SmallString::number(-0), "0"); ASSERT_THAT(SmallString::number(1), "1"); @@ -1810,7 +1810,7 @@ TEST(SmallString, NumberToString) ASSERT_THAT(SmallString::number(-1.2), "-1.200000"); } -TEST(SmallString, StringViewPlusOperator) +TEST(SmallString, string_view_plus_operator) { SmallStringView text = "text"; @@ -1819,7 +1819,7 @@ TEST(SmallString, StringViewPlusOperator) ASSERT_THAT(result, "text and more text"); } -TEST(SmallString, StringViewPlusOperatorReverseOrder) +TEST(SmallString, string_view_plus_operator_reverse_order) { SmallStringView text = " and more text"; @@ -1828,7 +1828,7 @@ TEST(SmallString, StringViewPlusOperatorReverseOrder) ASSERT_THAT(result, "text and more text"); } -TEST(SmallString, StringPlusOperator) +TEST(SmallString, string_plus_operator) { SmallString text = "text"; @@ -1837,7 +1837,7 @@ TEST(SmallString, StringPlusOperator) ASSERT_THAT(result, "text and more text"); } -TEST(SmallString, StringPlusOperatorReverseOrder) +TEST(SmallString, string_plus_operator_reverse_order) { SmallString text = " and more text"; @@ -1846,13 +1846,13 @@ TEST(SmallString, StringPlusOperatorReverseOrder) ASSERT_THAT(result, "text and more text"); } -TEST(SmallString, ShortStringCapacity) +TEST(SmallString, short_string_capacity) { ASSERT_THAT(SmallString().shortStringCapacity(), 31); ASSERT_THAT(PathString().shortStringCapacity(), 190); } -TEST(SmallString, ToView) +TEST(SmallString, to_view) { SmallString text = "text"; @@ -1862,7 +1862,7 @@ TEST(SmallString, ToView) } -TEST(SmallString, Compare) +TEST(SmallString, compare) { const char longText[] = "textfoo"; @@ -1876,7 +1876,7 @@ TEST(SmallString, Compare) ASSERT_THAT(Utils::compare("texta", "textx"), Le(0)); } -TEST(SmallString, ReverseCompare) +TEST(SmallString, reverse_compare) { const char longText[] = "textfoo"; From 7620c01b3a868291cebfbed81f5646de1ba6c62c Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 7 Jun 2023 17:57:28 +0200 Subject: [PATCH 071/149] QmlDesigner: Make QmlDesignerCore depend on QmlDesignerBase Change-Id: I8a91da52f9bd59d36964714418a9dc56096761cd Reviewed-by: Marco Bubke --- src/plugins/qmldesigner/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 267a04cad66..ab736137041 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -36,7 +36,7 @@ extend_qtc_library(QmlDesignerUtils ) add_qtc_library(QmlDesignerCore STATIC - CONDITION Qt6_VERSION VERSION_GREATER_EQUAL 6.4.3 AND TARGET Qt6::QmlPrivate AND TARGET Qt6::QmlDomPrivate AND TARGET Qt6::QmlCompilerPrivate + CONDITION Qt6_VERSION VERSION_GREATER_EQUAL 6.4.3 AND TARGET QmlDesignerBase AND TARGET Qt6::QmlPrivate AND TARGET Qt6::QmlDomPrivate AND TARGET Qt6::QmlCompilerPrivate EXCLUDE_FROM_INSTALL PROPERTIES SKIP_AUTOUIC ON DEPENDS From d10641a7aa228dd8c10527560204b14870104fa9 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 8 Jun 2023 08:58:06 +0200 Subject: [PATCH 072/149] QmlDesigner: Remove double lock There is already a lock by an other transaction so we don't need this anymore. Change-Id: I0f97c41e2a680344e05fec3d02c199108e599a3a Reviewed-by: Tim Jenssen --- .../qmldesigner/designercore/imagecache/imagecachestorage.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h b/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h index c5c7b61160b..0306349b23e 100644 --- a/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h +++ b/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h @@ -198,13 +198,9 @@ private: void updateTableToVersion1(DatabaseType &database) { - Sqlite::ExclusiveTransaction transaction{database}; - database.execute("DELETE FROM images"); database.execute("ALTER TABLE images ADD COLUMN midSizeImage"); database.setVersion(1); - - transaction.commit(); } }; From 263152cc8155de38780edb301e22ac5d7db7d697 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 8 Jun 2023 11:15:41 +0200 Subject: [PATCH 073/149] UnitTests: Cleanup Instead of putting everything into one big target there are now libraries which are used by the tests. Change-Id: I15727924f76b5cb600b7e533e7a6b8701dba81e0 Reviewed-by: Qt CI Bot Reviewed-by: Burak Hancerli Reviewed-by: Tim Jenssen --- .../components/integration/designdocument.cpp | 3 -- .../qmldesigner/designercore/include/model.h | 2 - .../qmldesigner/designercore/model/model.cpp | 11 ----- .../qmldesigner/designercore/model/model_p.h | 1 - .../designercore/model/rewriterview.cpp | 3 -- tests/unit/CMakeLists.txt | 25 ----------- tests/unit/tests/CMakeLists.txt | 7 ++- tests/unit/tests/matchers/CMakeLists.txt | 7 ++- tests/unit/tests/mocks/CMakeLists.txt | 7 ++- tests/unit/tests/mocks/abstractviewmock.h | 2 +- .../tests/mocks/mocklistmodeleditorview.h | 2 +- tests/unit/tests/printers/CMakeLists.txt | 8 +++- .../tests/printers/gtest-creator-printing.cpp | 37 +--------------- .../tests/printers/gtest-llvm-printing.cpp | 23 ---------- .../unit/tests/printers/gtest-llvm-printing.h | 17 ------- .../CMakeLists.txt | 44 +++++++++++++++---- tests/unit/tests/unittests/CMakeLists.txt | 30 ++----------- .../unittests/listmodeleditor/CMakeLists.txt | 9 ---- .../unittests/model/nodelistproperty-test.cpp | 6 +-- tests/unit/tests/utils/CMakeLists.txt | 7 ++- tests/unit/tests/utils/googletest.h | 1 - 21 files changed, 71 insertions(+), 181 deletions(-) delete mode 100644 tests/unit/tests/printers/gtest-llvm-printing.cpp delete mode 100644 tests/unit/tests/printers/gtest-llvm-printing.h rename tests/unit/tests/{stubs => testdesignercore}/CMakeLists.txt (80%) diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index f5d89a4e98d..94d5bd112e9 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -371,8 +371,6 @@ void DesignDocument::loadDocument(QPlainTextEdit *edit) connect(m_documentTextModifier.data(), &TextModifier::textChanged, this, &DesignDocument::updateQrcFiles); - m_documentModel->setTextModifier(m_documentTextModifier.data()); - m_inFileComponentTextModifier.reset(); updateFileName(Utils::FilePath(), fileName()); @@ -431,7 +429,6 @@ void DesignDocument::changeToInFileComponentModel(ComponentTextModifier *textMod edit->document()->clearUndoRedoStacks(); m_inFileComponentModel = createInFileComponentModel(); - m_inFileComponentModel->setTextModifier(m_inFileComponentTextModifier.data()); viewManager().attachRewriterView(); viewManager().attachViewsExceptRewriterAndComponetView(); diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 752d31321ab..c44953d41d7 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -172,8 +172,6 @@ public: Model *metaInfoProxyModel() const; - TextModifier *textModifier() const; - void setTextModifier(TextModifier *textModifier); void setDocumentMessages(const QList &errors, const QList &warnings); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 06056fd9382..12a8c091838 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -26,7 +26,6 @@ #include "rewriterview.h" #include "rewritingexception.h" #include "signalhandlerproperty.h" -#include "textmodifier.h" #include "variantproperty.h" #include @@ -1850,16 +1849,6 @@ Model *Model::metaInfoProxyModel() const return const_cast(this); } -TextModifier *Model::textModifier() const -{ - return d->m_textModifier.data(); -} - -void Model::setTextModifier(TextModifier *textModifier) -{ - d->m_textModifier = textModifier; -} - void Model::setDocumentMessages(const QList &errors, const QList &warnings) { diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 9ecd0a8c2de..4d3ae4e782b 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -322,7 +322,6 @@ private: QUrl m_fileUrl; QPointer m_rewriterView; QPointer m_nodeInstanceView; - QPointer m_textModifier; QPointer m_metaInfoProxyModel; QHash> m_nodeMetaInfoCache; bool m_writeLock = false; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 60156ff18ea..60067a6bc91 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -88,9 +88,6 @@ void RewriterView::modelAttached(Model *model) { m_modelAttachPending = false; - if (model && model->textModifier()) - setTextModifier(model->textModifier()); - AbstractView::modelAttached(model); ModelAmender differenceHandler(m_textToModelMerger.data()); diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index d5a8e3ccad2..cee69545232 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -12,35 +12,10 @@ if (NOT Googletest_FOUND) return() endif() -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake") -enable_testing() - -# Needed for pch -set(QtCreator_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../") -option(BUILD_WITH_PCH "Build with precompiled headers" ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(IMPLICIT_DEPENDS Qt::Test) -include(QtCreatorIDEBranding) -include(QtCreatorAPI) - -set(WITH_TESTS ON) - -find_package(Clang MODULE) -find_package(Qt5 - COMPONENTS - Gui Core Core5Compat Widgets Network Qml Concurrent Test Xml MODULE) -find_package(Threads) - add_subdirectory(tests) add_subdirectory(tools) diff --git a/tests/unit/tests/CMakeLists.txt b/tests/unit/tests/CMakeLists.txt index 5bf8e71bd3d..fe1f0c84b32 100644 --- a/tests/unit/tests/CMakeLists.txt +++ b/tests/unit/tests/CMakeLists.txt @@ -14,11 +14,10 @@ set(QmlDesignerDir "${QtCreatorPluginsDir}/qmldesigner") set(UnittestStubsDir "${CMAKE_CURRENT_SOURCE_DIR}/stubs") set(UnittestUtilsDir "${CMAKE_CURRENT_SOURCE_DIR}/utils") set(UnittestPrintersDir "${CMAKE_CURRENT_SOURCE_DIR}/printers") -set(UnittestMatchersDir "${CMAKE_CURRENT_SOURCE_DIR}/matchers") -add_subdirectory(unittests) -add_subdirectory(mocks) +add_subdirectory(testdesignercore) add_subdirectory(utils) +add_subdirectory(mocks) add_subdirectory(printers) add_subdirectory(matchers) -add_subdirectory(stubs) +add_subdirectory(unittests) diff --git a/tests/unit/tests/matchers/CMakeLists.txt b/tests/unit/tests/matchers/CMakeLists.txt index f094eb2b478..cedc3c2a462 100644 --- a/tests/unit/tests/matchers/CMakeLists.txt +++ b/tests/unit/tests/matchers/CMakeLists.txt @@ -1,4 +1,9 @@ -extend_qtc_test(unittest +add_qtc_library(TestMatchers OBJECT + EXCLUDE_FROM_INSTALL + SKIP_AUTOMOC ON + PUBLIC_INCLUDES ${CMAKE_CURRENT_LIST_DIR} + DEPENDS + Googletest SOURCES dynamicastmatcherdiagnosticcontainer-matcher.h unittest-matchers.h diff --git a/tests/unit/tests/mocks/CMakeLists.txt b/tests/unit/tests/mocks/CMakeLists.txt index 485c2d8fb63..b357164c93e 100644 --- a/tests/unit/tests/mocks/CMakeLists.txt +++ b/tests/unit/tests/mocks/CMakeLists.txt @@ -1,4 +1,9 @@ -extend_qtc_test(unittest +add_qtc_library(TestMocks OBJECT + EXCLUDE_FROM_INSTALL + SKIP_AUTOMOC ON + PUBLIC_INCLUDES ${CMAKE_CURRENT_LIST_DIR} + DEPENDS + Qt::Core Qt::Widgets Googletest Sqlite TestDesignerCore SOURCES abstractviewmock.h externaldependenciesmock.h diff --git a/tests/unit/tests/mocks/abstractviewmock.h b/tests/unit/tests/mocks/abstractviewmock.h index 0c7d9380677..c3a3be581cb 100644 --- a/tests/unit/tests/mocks/abstractviewmock.h +++ b/tests/unit/tests/mocks/abstractviewmock.h @@ -5,7 +5,7 @@ #include "../utils/googletest.h" -#include +#include class AbstractViewMock : public QmlDesigner::AbstractView { diff --git a/tests/unit/tests/mocks/mocklistmodeleditorview.h b/tests/unit/tests/mocks/mocklistmodeleditorview.h index ebf63987759..df228dcf2f7 100644 --- a/tests/unit/tests/mocks/mocklistmodeleditorview.h +++ b/tests/unit/tests/mocks/mocklistmodeleditorview.h @@ -5,7 +5,7 @@ #include "../utils/googletest.h" -#include +#include class MockListModelEditorView : public QmlDesigner::AbstractView { diff --git a/tests/unit/tests/printers/CMakeLists.txt b/tests/unit/tests/printers/CMakeLists.txt index 4aa66cbaa8c..62b1ad966e1 100644 --- a/tests/unit/tests/printers/CMakeLists.txt +++ b/tests/unit/tests/printers/CMakeLists.txt @@ -1,7 +1,11 @@ -extend_qtc_test(unittest +add_qtc_library(TestPrinters OBJECT + EXCLUDE_FROM_INSTALL + SKIP_AUTOMOC ON + PUBLIC_INCLUDES ${CMAKE_CURRENT_LIST_DIR} + DEPENDS + Qt::Core Qt::Widgets SqliteC Sqlite Googletest TestDesignerCore SOURCES gtest-creator-printing.cpp gtest-creator-printing.h gtest-qt-printing.cpp gtest-qt-printing.h - gtest-llvm-printing.h gtest-std-printing.h ) diff --git a/tests/unit/tests/printers/gtest-creator-printing.cpp b/tests/unit/tests/printers/gtest-creator-printing.cpp index 8c88ee07515..4f0a4171051 100644 --- a/tests/unit/tests/printers/gtest-creator-printing.cpp +++ b/tests/unit/tests/printers/gtest-creator-printing.cpp @@ -9,8 +9,7 @@ #include #include -#include -#include +#include #include #include #include @@ -23,7 +22,6 @@ #include #include #include -#include namespace std { template ostream &operator<<(ostream &out, const QVector &vector) @@ -403,39 +401,6 @@ std::ostream &operator<<(std::ostream &out, const ConstTupleIterator &iterator) } // namespace SessionChangeSetInternal } // namespace Sqlite -namespace Debugger { -std::ostream &operator<<(std::ostream &out, const DiagnosticLocation &loc) -{ - return out << "(" << loc.filePath << ", " << loc.line << ", " << loc.column << ")"; -} -} // namespace Debugger - -namespace ClangTools { -namespace Internal { -std::ostream &operator<<(std::ostream &out, const ExplainingStep &step) -{ - return out << "(" - << step.message << ", " - << step.location << ", " - << step.ranges << ", " - << step.isFixIt - << ")"; -} - -std::ostream &operator<<(std::ostream &out, const Diagnostic &diag) { - return out << "(" - << diag.name << ", " - << diag.description << ", " - << diag.category << ", " - << diag.type << ", " - << diag.location << ", " - << diag.explainingSteps << ", " - << diag.hasFixits - << ")"; -} -} // namespace Internal -} // namespace ClangTools - namespace QmlDesigner { namespace { const char *sourceTypeToText(SourceType sourceType) diff --git a/tests/unit/tests/printers/gtest-llvm-printing.cpp b/tests/unit/tests/printers/gtest-llvm-printing.cpp deleted file mode 100644 index 3e7108dd847..00000000000 --- a/tests/unit/tests/printers/gtest-llvm-printing.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (C) 2019 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "gtest-llvm-printing.h" -#include "gtest-std-printing.h" - -#include - -#include - -#include - -namespace clang { -namespace tooling { -struct CompileCommand; - -std::ostream &operator<<(std::ostream &out, const CompileCommand &command) -{ - return out << "(" << command.Directory << ", " << command.Filename << ", " - << command.CommandLine << ", " << command.Output << ")"; -} -} // namespace tooling -} // namespace clang diff --git a/tests/unit/tests/printers/gtest-llvm-printing.h b/tests/unit/tests/printers/gtest-llvm-printing.h deleted file mode 100644 index 9530f32d1bb..00000000000 --- a/tests/unit/tests/printers/gtest-llvm-printing.h +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (C) 2019 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -#include - -namespace clang { -namespace tooling { -struct CompileCommand; - -std::ostream &operator<<(std::ostream &out, const CompileCommand &command); - -} // namespace tooling -} // namespace clang diff --git a/tests/unit/tests/stubs/CMakeLists.txt b/tests/unit/tests/testdesignercore/CMakeLists.txt similarity index 80% rename from tests/unit/tests/stubs/CMakeLists.txt rename to tests/unit/tests/testdesignercore/CMakeLists.txt index 8209784f252..00cbfeda1a9 100644 --- a/tests/unit/tests/stubs/CMakeLists.txt +++ b/tests/unit/tests/testdesignercore/CMakeLists.txt @@ -1,5 +1,31 @@ -extend_qtc_test(unittest - SOURCES_PREFIX "${QmlDesignerDir}/designercore" +add_qtc_library(TestDesignerCore OBJECT + EXCLUDE_FROM_INSTALL + PUBLIC_INCLUDES ${CMAKE_CURRENT_LIST_DIR} + SKIP_AUTOMOC ON + DEPENDS + Qt::Core Qt::Network Qt::Widgets + Qt::Xml Qt::Concurrent Qt::QmlPrivate Qt::Gui + Qt::Core5Compat Utils QmlJS Sqlite SqliteC + PUBLIC_DEPENDS + QmlPuppetCommunication + SOURCES_PREFIX ${QmlDesignerDir}/designercore + PUBLIC_INCLUDES + ${UnittestStubsDir} + ${UnittestStubsDir}/qmldesigner/designercore/include + ${QtCreatorLibsDir} + ${QtCreatorPluginsDir} + ${QmlDesignerDir} + ${QmlDesignerDir}/designercore + ${QmlDesignerDir}/designercore/include + ${QmlDesignerDir}/designercore/imagecache + PUBLIC_DEFINES + UNIT_TESTS + DONT_CHECK_MESSAGE_COUNTER + QTC_RESOURCE_DIR="${QtCreatorResourcesDir}" + QDS_MODEL_USE_PROJECTSTORAGEINTERFACE + QDS_USE_PROJECTSTORAGE + QMLDESIGNERCORE_STATIC_LIBRARY + QMLDESIGNER_STATIC_LIBRARY SOURCES exceptions/exception.cpp exceptions/invalidargumentexception.cpp @@ -124,16 +150,18 @@ extend_qtc_test(unittest rewritertransaction.h ) -extend_qtc_test(unittest - SOURCES_PREFIX "${QmlDesignerDir}/designercore" +extend_qtc_library(TestDesignerCore + SOURCES_PREFIX ${QmlDesignerDir}/designercore/include SOURCES_PROPERTIES AUTOMOC ON SOURCES - include/model.h + model.h + abstractview.h ) -extend_qtc_test(unittest +extend_qtc_library(TestDesignerCore SOURCES_PROPERTIES AUTOMOC ON + SOURCES_PREFIX ../stubs/qmldesigner/designercore/include SOURCES - qmldesigner/designercore/include/nodeinstanceview.h - qmldesigner/designercore/include/rewriterview.h + nodeinstanceview.h + rewriterview.h ) diff --git a/tests/unit/tests/unittests/CMakeLists.txt b/tests/unit/tests/unittests/CMakeLists.txt index 76473e96529..0cd03124042 100644 --- a/tests/unit/tests/unittests/CMakeLists.txt +++ b/tests/unit/tests/unittests/CMakeLists.txt @@ -3,14 +3,12 @@ file(RELATIVE_PATH TEST_RELATIVE_LIBEXEC_PATH "/${RELATIVE_TEST_PATH}" "/${IDE_L add_qtc_test(unittest GTEST PROPERTIES COMPILE_WARNING_AS_ERROR OFF - INCLUDES - BEFORE ${UnittestStubsDir} - BEFORE ${UnittestStubsDir}/qmldesigner/designercore/include + SKIP_AUTOMOC ON DEPENDS Qt::Core Qt::Network Qt::Widgets Qt::Xml Qt::Concurrent Qt::QmlPrivate Qt::Gui - Qt::Core5Compat QmlJS Sqlite SqliteC - Googletest + Qt::Core5Compat Utils QmlJS Sqlite SqliteC + Googletest TestDesignerCore TestUtils TestMatchers TestPrinters TestMocks DEFINES GTEST_INTERNAL_HAS_STRING_VIEW QT_NO_CAST_TO_ASCII @@ -53,28 +51,6 @@ finalize_qtc_gtest(unittest EXCLUDE_ALL_FROM_PRECHECK ) -# Path needs to be before CppEditor -target_include_directories(unittest - PRIVATE - BEFORE ${QtCreatorPluginsDir} -) - -if (NOT TARGET Utils) - add_subdirectory(${QtCreatorLibsDir}/utils ${CMAKE_CURRENT_BINARY_DIR}/utils) -endif() -if (NOT TARGET CPlusPlus) - add_subdirectory(${QtCreatorLibsDir}/3rdparty/cplusplus ${CMAKE_CURRENT_BINARY_DIR}/3rd_cplusplus) - add_subdirectory(${QtCreatorLibsDir}/cplusplus ${CMAKE_CURRENT_BINARY_DIR}/cplusplus) -endif() - -extend_qtc_test(unittest DEPENDS Utils CPlusPlus) - -file(GLOB PROJECTSTORAGE_EXCLUDED_SOURCES ${QmlDesignerDir}/designercore/projectstorage/*.cpp) -set_property(SOURCE ${PROJECTSTORAGE_EXCLUDED_SOURCES} PROPERTY SKIP_AUTOMOC ON) - -file(GLOB UNITTEST_EXCLUDED_SOURCES *.cpp) -set_property(SOURCE ${UNITTEST_EXCLUDED_SOURCES} PROPERTY SKIP_AUTOMOC ON) - function(unittest_copy_data_folder) execute_process( COMMAND ${CMAKE_COMMAND} -E copy_directory diff --git a/tests/unit/tests/unittests/listmodeleditor/CMakeLists.txt b/tests/unit/tests/unittests/listmodeleditor/CMakeLists.txt index f2a6c9855f4..639a6fca290 100644 --- a/tests/unit/tests/unittests/listmodeleditor/CMakeLists.txt +++ b/tests/unit/tests/unittests/listmodeleditor/CMakeLists.txt @@ -4,15 +4,6 @@ extend_qtc_test(unittest listmodeleditor-test.cpp ) extend_qtc_test(unittest - INCLUDES - "${QmlDesignerDir}" - "${QmlDesignerDir}/designercore" - "${QmlDesignerDir}/designercore/include" - "${QmlDesignerDir}/designercore/imagecache" - "${QmlDesignerDir}/../../../src/libs/qmlpuppetcommunication/interfaces" - "${QmlDesignerDir}/../../../src/libs/qmlpuppetcommunication/types" - DEFINES - QMLDESIGNERCORE_STATIC_LIBRARY QMLDESIGNER_STATIC_LIBRARY SOURCES_PREFIX "${QmlDesignerDir}" SOURCES diff --git a/tests/unit/tests/unittests/model/nodelistproperty-test.cpp b/tests/unit/tests/unittests/model/nodelistproperty-test.cpp index a8af5d0263e..2fa80aa9f3a 100644 --- a/tests/unit/tests/unittests/model/nodelistproperty-test.cpp +++ b/tests/unit/tests/unittests/model/nodelistproperty-test.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "../mocks/abstractviewmock.h" -#include "../mocks/projectstoragemock.h" -#include "../utils/googletest.h" +#include +#include +#include #include #include diff --git a/tests/unit/tests/utils/CMakeLists.txt b/tests/unit/tests/utils/CMakeLists.txt index 71df3cdb49b..d29e78863b2 100644 --- a/tests/unit/tests/utils/CMakeLists.txt +++ b/tests/unit/tests/utils/CMakeLists.txt @@ -1,5 +1,8 @@ -extend_qtc_test(unittest - DEPENDS Utils +add_qtc_library(TestUtils OBJECT + EXCLUDE_FROM_INSTALL + PUBLIC_INCLUDES ${CMAKE_CURRENT_LIST_DIR} + DEPENDS + Qt::Core Googletest Utils SOURCES googletest.h google-using-declarations.h diff --git a/tests/unit/tests/utils/googletest.h b/tests/unit/tests/utils/googletest.h index e64c8f5b639..a64bdb4435f 100644 --- a/tests/unit/tests/utils/googletest.h +++ b/tests/unit/tests/utils/googletest.h @@ -18,7 +18,6 @@ #include "conditionally-disabled-tests.h" #include "../printers/gtest-creator-printing.h" -#include "../printers/gtest-llvm-printing.h" #include "../printers/gtest-qt-printing.h" #include "../printers/gtest-std-printing.h" From 110b1cb86cbc68c450ede86300f257e26c1b1028 Mon Sep 17 00:00:00 2001 From: Mats Honkamaa Date: Thu, 8 Jun 2023 12:29:07 +0300 Subject: [PATCH 074/149] Doc: Fix wrong icon for pausing particle animation Task-number: QDS-10065 Change-Id: Ibec5ecc5ec331bc536e8d90209adc85f7cde327d Reviewed-by: Leena Miettinen Reviewed-by: --- .../src/qtquick3d-editor/qtdesignstudio-3d-editor.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-editor.qdoc b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-editor.qdoc index 1f69fe95cdf..23c998d9fcd 100644 --- a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-editor.qdoc +++ b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-editor.qdoc @@ -313,7 +313,7 @@ \endlist You can pause the particle animation by selecting - \inlineimage icons/particle-animation-on.png + \inlineimage icons/particle-pause.png . When the animation is paused, you can use \inlineimage icons/particles-seek.png to manually seek forward or backward in the particle animation. From 42173761c0cd34b8a6839871b184a16ea2a65879 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 8 Jun 2023 19:58:57 +0200 Subject: [PATCH 075/149] QmlDesigner: Fix crash Change-Id: I429bb8d2935e0bc94297fab623b92578d5889287 Reviewed-by: Tim Jenssen --- .../components/integration/designdocument.cpp | 6 ++ .../qmldesigner/designercore/include/model.h | 4 +- .../designercore/include/nodemetainfo.h | 11 ++- .../designercore/include/propertymetainfo.h | 13 ++-- .../designercore/metainfo/nodemetainfo.cpp | 69 ++++++++++++------- .../qmldesigner/designercore/model/model_p.h | 10 ++- 6 files changed, 81 insertions(+), 32 deletions(-) diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 94d5bd112e9..089efb87cdd 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -371,6 +371,8 @@ void DesignDocument::loadDocument(QPlainTextEdit *edit) connect(m_documentTextModifier.data(), &TextModifier::textChanged, this, &DesignDocument::updateQrcFiles); + m_rewriterView->setTextModifier(m_documentTextModifier.data()); + m_inFileComponentTextModifier.reset(); updateFileName(Utils::FilePath(), fileName()); @@ -389,6 +391,8 @@ void DesignDocument::changeToDocumentModel() if (edit) edit->document()->clearUndoRedoStacks(); + m_rewriterView->setTextModifier(m_documentTextModifier.data()); + m_inFileComponentModel.reset(); m_inFileComponentTextModifier.reset(); @@ -430,6 +434,8 @@ void DesignDocument::changeToInFileComponentModel(ComponentTextModifier *textMod m_inFileComponentModel = createInFileComponentModel(); + m_rewriterView->setTextModifier(m_inFileComponentTextModifier.data()); + viewManager().attachRewriterView(); viewManager().attachViewsExceptRewriterAndComponetView(); } diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index c44953d41d7..3dbb0cceac2 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -34,6 +34,7 @@ class AbstractView; class NodeStateChangeSet; class MetaInfo; class NodeMetaInfo; +class NodeMetaInfoPrivate; class ModelState; class NodeAnchors; class AbstractProperty; @@ -48,12 +49,13 @@ enum class BypassModelResourceManagement { No, Yes }; class QMLDESIGNERCORE_EXPORT Model : public QObject { friend ModelNode; + friend NodeMetaInfo; + friend NodeMetaInfoPrivate; friend AbstractProperty; friend AbstractView; friend Internal::ModelPrivate; friend Internal::WriteLocker; friend ModelDeleter; - friend class NodeMetaInfoPrivate; Q_OBJECT diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index d7bc414e77e..f483e53af54 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -26,11 +27,12 @@ namespace QmlDesigner { class MetaInfo; class Model; class AbstractProperty; +class NodeMetaInfoPrivate; class QMLDESIGNERCORE_EXPORT NodeMetaInfo { public: - NodeMetaInfo() = default; + NodeMetaInfo(); NodeMetaInfo(Model *model, const TypeName &typeName, int majorVersion, int minorVersion); NodeMetaInfo(TypeId typeId, NotNullPointer projectStorage) : m_typeId{typeId} @@ -39,6 +41,11 @@ public: NodeMetaInfo(NotNullPointer projectStorage) : m_projectStorage{projectStorage} {} + + NodeMetaInfo(const NodeMetaInfo &); + NodeMetaInfo &operator=(const NodeMetaInfo &); + NodeMetaInfo(NodeMetaInfo &&); + NodeMetaInfo &operator=(NodeMetaInfo &&); ~NodeMetaInfo(); bool isValid() const; @@ -199,7 +206,7 @@ private: TypeId m_typeId; NotNullPointer m_projectStorage = {}; mutable std::optional m_typeData; - QSharedPointer m_privateData; + std::shared_ptr m_privateData; }; using NodeMetaInfos = std::vector; diff --git a/src/plugins/qmldesigner/designercore/include/propertymetainfo.h b/src/plugins/qmldesigner/designercore/include/propertymetainfo.h index a3c928bc36f..ecda132a0aa 100644 --- a/src/plugins/qmldesigner/designercore/include/propertymetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/propertymetainfo.h @@ -9,21 +9,22 @@ #include #include -#include #include +#include #include #include namespace QmlDesigner { class NodeMetaInfo; +class NodeMetaInfoPrivate; class QMLDESIGNERCORE_EXPORT PropertyMetaInfo { public: - PropertyMetaInfo() = default; - PropertyMetaInfo(QSharedPointer nodeMetaInfoPrivateData, + PropertyMetaInfo(); + PropertyMetaInfo(std::shared_ptr nodeMetaInfoPrivateData, const PropertyName &propertyName); PropertyMetaInfo([[maybe_unused]] PropertyDeclarationId id, [[maybe_unused]] NotNullPointer projectStorage) @@ -32,6 +33,10 @@ public: , m_id{id} #endif {} + PropertyMetaInfo(const PropertyMetaInfo &); + PropertyMetaInfo &operator=(const PropertyMetaInfo &); + PropertyMetaInfo(PropertyMetaInfo &&); + PropertyMetaInfo &operator=(PropertyMetaInfo &&); ~PropertyMetaInfo(); explicit operator bool() const { return isValid(); } @@ -74,7 +79,7 @@ private: mutable std::optional m_propertyData; PropertyDeclarationId m_id; #ifndef QDS_USE_PROJECTSTORAGE - QSharedPointer m_nodeMetaInfoPrivateData; + std::shared_ptr m_nodeMetaInfoPrivateData; PropertyName m_propertyName; #endif }; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 09a9a1d72bd..502ecc149a8 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -587,8 +587,11 @@ QVector getObjectTypes(const ObjectValue *objectValue, const Conte class NodeMetaInfoPrivate { public: - using Pointer = QSharedPointer; - NodeMetaInfoPrivate() = default; + using Pointer = std::shared_ptr; + NodeMetaInfoPrivate() = delete; + NodeMetaInfoPrivate(Model *model, TypeName type, int maj = -1, int min = -1); + NodeMetaInfoPrivate(const NodeMetaInfoPrivate &) = delete; + NodeMetaInfoPrivate &operator=(const NodeMetaInfoPrivate &) = delete; ~NodeMetaInfoPrivate() = default; bool isValid() const; @@ -621,13 +624,15 @@ public: QString componentFileName() const; QString importDirectoryPath() const; - static Pointer create(Model *model, const TypeName &type, int maj = -1, int min = -1); + static std::shared_ptr create(Model *model, + const TypeName &type, + int maj = -1, + int min = -1); QSet &prototypeCachePositives(); QSet &prototypeCacheNegatives(); private: - NodeMetaInfoPrivate(Model *model, TypeName type, int maj = -1, int min = -1); const CppComponentValue *getCppComponentValue() const; const ObjectValue *getObjectValue() const; @@ -718,15 +723,18 @@ inline static TypeName stringIdentifier(const TypeName &type, int maj, int min) return type + QByteArray::number(maj) + '_' + QByteArray::number(min); } -NodeMetaInfoPrivate::Pointer NodeMetaInfoPrivate::create(Model *model, const TypeName &type, int major, int minor) +std::shared_ptr NodeMetaInfoPrivate::create(Model *model, + const TypeName &type, + int major, + int minor) { - auto &&cache = model->d->m_nodeMetaInfoCache; + auto &cache = model->d->nodeMetaInfoCache(); if (auto found = cache.find(stringIdentifier(type, major, minor)); found != cache.end()) return *found; - Pointer newData(new NodeMetaInfoPrivate(model, type, major, minor)); + auto newData = std::make_shared(model, type, major, minor); if (newData->isValid()) - model->d->m_nodeMetaInfoCache.insert(stringIdentifier(type, major, minor), newData); + cache.insert(stringIdentifier(type, major, minor), newData); return newData; } @@ -931,7 +939,7 @@ bool NodeMetaInfoPrivate::isPropertyWritable(const PropertyName &propertyName) c if (isValueType(objectType)) return true; - QSharedPointer objectInfo(create(m_model, objectType)); + auto objectInfo = create(m_model, objectType); if (objectInfo->isValid()) return objectInfo->isPropertyWritable(rawPropertyName); else @@ -947,7 +955,6 @@ bool NodeMetaInfoPrivate::isPropertyWritable(const PropertyName &propertyName) c return true; //all properties of components are writable } - bool NodeMetaInfoPrivate::isPropertyList(const PropertyName &propertyName) const { if (!isValid()) @@ -964,7 +971,7 @@ bool NodeMetaInfoPrivate::isPropertyList(const PropertyName &propertyName) const if (isValueType(objectType)) return false; - QSharedPointer objectInfo(create(m_model, objectType)); + auto objectInfo = create(m_model, objectType); if (objectInfo->isValid()) return objectInfo->isPropertyList(rawPropertyName); else @@ -999,7 +1006,7 @@ bool NodeMetaInfoPrivate::isPropertyPointer(const PropertyName &propertyName) co if (isValueType(objectType)) return false; - QSharedPointer objectInfo(create(m_model, objectType)); + auto objectInfo = create(m_model, objectType); if (objectInfo->isValid()) return objectInfo->isPropertyPointer(rawPropertyName); else @@ -1031,7 +1038,7 @@ bool NodeMetaInfoPrivate::isPropertyEnum(const PropertyName &propertyName) const if (isValueType(objectType)) return false; - QSharedPointer objectInfo(create(m_model, objectType)); + auto objectInfo = create(m_model, objectType); if (objectInfo->isValid()) return objectInfo->isPropertyEnum(rawPropertyName); else @@ -1157,7 +1164,6 @@ Model *NodeMetaInfoPrivate::model() const return m_model; } - QStringList NodeMetaInfoPrivate::keysForEnum(const QString &enumName) const { if (!isValid()) @@ -1245,7 +1251,6 @@ QStringList NodeMetaInfoPrivate::lookupNameComponent() const return tempString.split('.'); } - bool NodeMetaInfoPrivate::isValid() const { return m_isValid && context() && document(); @@ -1349,7 +1354,6 @@ void NodeMetaInfoPrivate::setupPrototypes() } } - QList NodeMetaInfoPrivate::prototypes() const { return m_prototypes; @@ -1393,6 +1397,12 @@ void NodeMetaInfoPrivate::initialiseProperties() m_slots = getSlots(m_objectValue, context()); } +NodeMetaInfo::NodeMetaInfo() = default; +NodeMetaInfo::NodeMetaInfo(const NodeMetaInfo &) = default; +NodeMetaInfo &NodeMetaInfo::operator=(const NodeMetaInfo &) = default; +NodeMetaInfo::NodeMetaInfo(NodeMetaInfo &&) = default; +NodeMetaInfo &NodeMetaInfo::operator=(NodeMetaInfo &&) = default; + NodeMetaInfo::NodeMetaInfo(Model *model, const TypeName &type, int maj, int min) : m_privateData(NodeMetaInfoPrivate::create(model, type, maj, min)) { @@ -1426,6 +1436,9 @@ bool NodeMetaInfo::hasProperty(Utils::SmallStringView propertyName) const PropertyMetaInfos NodeMetaInfo::properties() const { + if (!isValid()) + return {}; + if constexpr (useProjectStorage()) { return Utils::transform( m_projectStorage->propertyDeclarationIds(m_typeId), [&](auto id) { @@ -1439,7 +1452,7 @@ PropertyMetaInfos NodeMetaInfo::properties() const propertyMetaInfos.reserve(static_cast(properties.size())); for (const auto &name : properties) - propertyMetaInfos.emplace_back(m_privateData, name); + propertyMetaInfos.push_back({m_privateData, name}); return propertyMetaInfos; } @@ -2822,8 +2835,14 @@ bool NodeMetaInfo::isEnumeration() const return false; } +PropertyMetaInfo::PropertyMetaInfo() = default; +PropertyMetaInfo::PropertyMetaInfo(const PropertyMetaInfo &) = default; +PropertyMetaInfo &PropertyMetaInfo::operator=(const PropertyMetaInfo &) = default; +PropertyMetaInfo::PropertyMetaInfo(PropertyMetaInfo &&) = default; +PropertyMetaInfo &PropertyMetaInfo::operator=(PropertyMetaInfo &&) = default; + PropertyMetaInfo::PropertyMetaInfo( - [[maybe_unused]] QSharedPointer nodeMetaInfoPrivateData, + [[maybe_unused]] std::shared_ptr nodeMetaInfoPrivateData, [[maybe_unused]] const PropertyName &propertyName) #ifndef QDS_USE_PROJECTSTORAGE : m_nodeMetaInfoPrivateData{nodeMetaInfoPrivateData} @@ -2850,10 +2869,14 @@ NodeMetaInfo PropertyMetaInfo::propertyType() const PropertyName PropertyMetaInfo::name() const { - if constexpr (useProjectStorage()) - return PropertyName(Utils::SmallStringView(propertyData().name)); - else - return propertyName(); + if (isValid()) { + if constexpr (useProjectStorage()) + return PropertyName(Utils::SmallStringView(propertyData().name)); + else + return propertyName(); + } + + return {}; } bool PropertyMetaInfo::isWritable() const @@ -3003,7 +3026,7 @@ TypeName PropertyMetaInfo::propertyTypeName() const const NodeMetaInfoPrivate *PropertyMetaInfo::nodeMetaInfoPrivateData() const { #ifndef QDS_USE_PROJECTSTORAGE - return m_nodeMetaInfoPrivateData.data(); + return m_nodeMetaInfoPrivateData.get(); #else return nullptr; #endif diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 4d3ae4e782b..5c69e756164 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -10,6 +10,8 @@ #include "modelnode.h" #include "skipiterator.h" +#include + #include #include #include @@ -93,7 +95,6 @@ class ModelPrivate : public QObject friend Model; friend Internal::WriteLocker; - friend NodeMetaInfoPrivate; public: ModelPrivate(Model *model, @@ -288,6 +289,11 @@ public: void handleResourceSet(const ModelResourceSet &resourceSet); + QHash> &nodeMetaInfoCache() + { + return m_nodeMetaInfoCache; + } + private: void removePropertyWithoutNotification(const InternalPropertyPointer &property); void removeAllSubNodes(const InternalNodePointer &node); @@ -323,7 +329,7 @@ private: QPointer m_rewriterView; QPointer m_nodeInstanceView; QPointer m_metaInfoProxyModel; - QHash> m_nodeMetaInfoCache; + QHash> m_nodeMetaInfoCache; bool m_writeLock = false; qint32 m_internalIdCounter = 1; }; From 850d3444dd1ec84c43a55691cfe59690f38eb685 Mon Sep 17 00:00:00 2001 From: Mats Honkamaa Date: Fri, 9 Jun 2023 09:25:41 +0300 Subject: [PATCH 076/149] Doc: Fix index images Task-number: QDS-10069 Change-Id: I362afbc1728cf96a9cf55cc211f1af86fd9a79f7 Reviewed-by: Leena Miettinen --- .../images/qds-front-advanced.png | Bin 0 -> 4873 bytes doc/qtdesignstudio/images/qds-front-gs.png | Bin 0 -> 5150 bytes doc/qtdesignstudio/images/qds-front-help.png | Bin 0 -> 1937 bytes doc/qtdesignstudio/images/qds-front-preview.png | Bin 0 -> 4789 bytes .../images/qds-front-projects.png | Bin 0 -> 2712 bytes doc/qtdesignstudio/images/qds-front-ui.png | Bin 0 -> 3491 bytes .../images/qds-studio-3d-scenes.png | Bin 0 -> 2751 bytes .../images/qds-studio-animation.png | Bin 0 -> 6392 bytes .../src/overviews/qtquick-motion-design.qdoc | 2 +- .../src/overviews/qtquick-prototyping.qdoc | 2 +- .../src/overviews/qtquick-uis.qdoc | 2 +- .../src/qtdesignstudio-advanced.qdoc | 2 +- .../src/qtdesignstudio-developer-topics.qdoc | 2 +- .../src/qtdesignstudio-getting-started.qdoc | 2 +- .../src/qtdesignstudio-help-overview.qdoc | 2 +- ...tdesignstudio-implementing-applications.qdoc | 2 +- .../src/qtdesignstudio-use-cases.qdoc | 6 +++--- doc/qtdesignstudio/src/qtdesignstudio.qdoc | 16 ++++++++-------- 18 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 doc/qtdesignstudio/images/qds-front-advanced.png create mode 100644 doc/qtdesignstudio/images/qds-front-gs.png create mode 100644 doc/qtdesignstudio/images/qds-front-help.png create mode 100644 doc/qtdesignstudio/images/qds-front-preview.png create mode 100644 doc/qtdesignstudio/images/qds-front-projects.png create mode 100644 doc/qtdesignstudio/images/qds-front-ui.png create mode 100644 doc/qtdesignstudio/images/qds-studio-3d-scenes.png create mode 100644 doc/qtdesignstudio/images/qds-studio-animation.png diff --git a/doc/qtdesignstudio/images/qds-front-advanced.png b/doc/qtdesignstudio/images/qds-front-advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..87780aa3863bd3f1d8fff9778e0d66d4fe686801 GIT binary patch literal 4873 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 V(P7j3s|*Yb44$rjF6*2UngH#*@=^c* literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/qds-front-gs.png b/doc/qtdesignstudio/images/qds-front-gs.png new file mode 100644 index 0000000000000000000000000000000000000000..27706a8cc6ac2c084b61ba6833c675dcaaa1b4cb GIT binary patch literal 5150 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 II;Vst0J_SUVgLXD literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/qds-front-help.png b/doc/qtdesignstudio/images/qds-front-help.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f9d42fecec83c8c9ae3bf9e2a3a6f5f5f85bb4 GIT binary patch literal 1937 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 SH-~|Nfx*+&&t;ucLK6TY{vk~O literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/qds-front-projects.png b/doc/qtdesignstudio/images/qds-front-projects.png new file mode 100644 index 0000000000000000000000000000000000000000..69414f48626f9d19136f9bfbef688fd27c421aa9 GIT binary patch literal 2712 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/qds-front-ui.png b/doc/qtdesignstudio/images/qds-front-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..d413b52dbfd4ade02508a0f54ebaa54532d6522c GIT binary patch literal 3491 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 K=d#Wzp$Pyn+J&nC literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/qds-studio-3d-scenes.png b/doc/qtdesignstudio/images/qds-studio-3d-scenes.png new file mode 100644 index 0000000000000000000000000000000000000000..e4774e8223e244259f01404b27ed20e13e39da95 GIT binary patch literal 2751 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 VIyaZkn}LCW!PC{xWt~$(69B6x5_tds literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/qds-studio-animation.png b/doc/qtdesignstudio/images/qds-studio-animation.png new file mode 100644 index 0000000000000000000000000000000000000000..b08a6deed867787ca01a95e928e5ea3d9ba4bce6 GIT binary patch literal 6392 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 TVLROjG&kYt>gTe~DWM4f+((<4 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/src/overviews/qtquick-motion-design.qdoc b/doc/qtdesignstudio/src/overviews/qtquick-motion-design.qdoc index 70ebb9115dc..382c2f5fea8 100644 --- a/doc/qtdesignstudio/src/overviews/qtquick-motion-design.qdoc +++ b/doc/qtdesignstudio/src/overviews/qtquick-motion-design.qdoc @@ -10,7 +10,7 @@ \table \row - \li \image studio-animation.png + \li \image qds-studio-animation.png \li You can use different animation techniques for different purposes. \QDS supports common motion design techniques, such as timeline and keyframe based animation and easing diff --git a/doc/qtdesignstudio/src/overviews/qtquick-prototyping.qdoc b/doc/qtdesignstudio/src/overviews/qtquick-prototyping.qdoc index 2cda8239de4..af936f1507f 100644 --- a/doc/qtdesignstudio/src/overviews/qtquick-prototyping.qdoc +++ b/doc/qtdesignstudio/src/overviews/qtquick-prototyping.qdoc @@ -10,7 +10,7 @@ \table \row - \li \image studio-3d-scenes.png + \li \image qds-studio-3d-scenes.png \li After your UI wireframe has been approved, you can turn it into an interactive prototype to ensure that you and the developers share a common vision about the UI appearance diff --git a/doc/qtdesignstudio/src/overviews/qtquick-uis.qdoc b/doc/qtdesignstudio/src/overviews/qtquick-uis.qdoc index 82a6f2acfa3..2f0aa723b8f 100644 --- a/doc/qtdesignstudio/src/overviews/qtquick-uis.qdoc +++ b/doc/qtdesignstudio/src/overviews/qtquick-uis.qdoc @@ -10,7 +10,7 @@ \table \row - \li \image front-ui.png + \li \image qds-front-ui.png \li Plan your UI properly. Know what elements, such as screens, components, and states, you need. Create a descriptive wireframe and acquire a detailed UI specification before you start to make diff --git a/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc index 21733c996ac..fbc362f6c8c 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc @@ -10,7 +10,7 @@ \table \row - \li \image front-advanced.png + \li \image qds-front-advanced.png \li Learn more about the UI files (.ui.qml), collecting data about using \QDS, and about packaging applications for delivering them to users or uploading them to app stores. diff --git a/doc/qtdesignstudio/src/qtdesignstudio-developer-topics.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-developer-topics.qdoc index 845e25b0198..da1799439a4 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-developer-topics.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-developer-topics.qdoc @@ -10,7 +10,7 @@ \table \row - \li \image front-projects.png + \li \image qds-front-projects.png \li Learn more about using the Git version control system, converting UI projects into applications, and using external tools directly from \QDS. diff --git a/doc/qtdesignstudio/src/qtdesignstudio-getting-started.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-getting-started.qdoc index 76aac701ce8..47800afab72 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-getting-started.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-getting-started.qdoc @@ -10,7 +10,7 @@ \table \row - \li \image front-gs.png + \li \image qds-front-gs.png \li When you install \QDS, everything you need to start wireframing and prototyping UIs is installed and set up for you. You can move directly to learning about how to use the different \QDS diff --git a/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc index e3a00cb8dfb..3db1a5cd1fe 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc @@ -10,7 +10,7 @@ \table \row - \li \image front-help.png + \li \image qds-front-help.png \li Learn more about using the \uicontrol Help mode, frequently asked questions, and supported platforms. \endtable diff --git a/doc/qtdesignstudio/src/qtdesignstudio-implementing-applications.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-implementing-applications.qdoc index ace3fe41482..8c88d525426 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-implementing-applications.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-implementing-applications.qdoc @@ -10,7 +10,7 @@ \table \row - \li \image front-preview.png + \li \image qds-front-preview.png \li \QDS attempts to meet your needs, whether you have previous experience with QML and coding or not. When you install \QDS, the default configuration allows you to start wireframing, diff --git a/doc/qtdesignstudio/src/qtdesignstudio-use-cases.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-use-cases.qdoc index 1efb484160c..54e90305c0c 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-use-cases.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-use-cases.qdoc @@ -13,10 +13,10 @@ \table \row - \li \inlineimage front-ui.png + \li \inlineimage qds-front-ui.png \li \inlineimage studio-flow.png - \li \inlineimage studio-3d-scenes.png - \li \inlineimage front-projects.png + \li \inlineimage qds-studio-3d-scenes.png + \li \inlineimage qds-front-projects.png \row \li \b {Creating UI wireframes} \li \b {Creating UI prototypes} diff --git a/doc/qtdesignstudio/src/qtdesignstudio.qdoc b/doc/qtdesignstudio/src/qtdesignstudio.qdoc index adf772987d4..94ad24b6cc5 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio.qdoc @@ -18,10 +18,10 @@ \table \row - \li \inlineimage front-gs.png - \li \inlineimage front-ui.png - \li \inlineimage studio-3d-scenes.png - \li \inlineimage studio-animation.png + \li \inlineimage qds-front-gs.png + \li \inlineimage qds-front-ui.png + \li \inlineimage qds-studio-3d-scenes.png + \li \inlineimage qds-studio-animation.png \row \li \b {\l{Getting Started}} \list @@ -58,10 +58,10 @@ \li \l{Optimizing Designs} \endlist \row - \li \inlineimage front-preview.png - \li \inlineimage front-advanced.png - \li \inlineimage front-projects.png - \li \inlineimage front-help.png + \li \inlineimage qds-front-preview.png + \li \inlineimage qds-front-advanced.png + \li \inlineimage qds-front-projects.png + \li \inlineimage qds-front-help.png \row \li \b {\l{Implementing Applications}} \list From b6050d6f0d111e973befab0a92a0e481415b27c1 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 9 Jun 2023 16:27:12 +0200 Subject: [PATCH 077/149] QmlDesigner: Use StudioQuickWidget in StatesEditor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The context property canAddNewStates is moved to the statesEditorModel. The statesEditorModel is moved to the backend singleton under the namespace StatesEditorBackend. Imports for StatesEditorBackend added. StatesEditorBackend used to qualify statesEditorModel. Change-Id: I1d4493751ac7b01101060e30f385562a6dfe58c3 Reviewed-by: Henning Gründl Reviewed-by: Qt CI Bot --- .../qmldesigner/stateseditor/Main.qml | 59 ++++++++++--------- .../stateseditor/StateThumbnail.qml | 19 +++--- .../stateseditor/stateseditormodel.cpp | 15 +++++ .../stateseditor/stateseditormodel.h | 8 +++ .../stateseditor/stateseditorview.cpp | 2 +- .../stateseditor/stateseditorwidget.cpp | 17 ++---- .../stateseditor/stateseditorwidget.h | 7 +-- 7 files changed, 72 insertions(+), 55 deletions(-) diff --git a/share/qtcreator/qmldesigner/stateseditor/Main.qml b/share/qtcreator/qmldesigner/stateseditor/Main.qml index 4cd85bb1ad3..221e300ad3e 100644 --- a/share/qtcreator/qmldesigner/stateseditor/Main.qml +++ b/share/qtcreator/qmldesigner/stateseditor/Main.qml @@ -29,6 +29,7 @@ import StatesEditor import HelperWidgets 2.0 as HelperWidgets import StudioControls 1.0 as StudioControls import StudioTheme as StudioTheme +import StatesEditorBackend Rectangle { id: root @@ -221,20 +222,20 @@ Rectangle { // These function assume that the order of the states is as follows: // State A, State B (extends State A), ... so the extended state always comes first function isInRange(i) { - return i >= 0 && i < statesEditorModel.count() + return i >= 0 && i < StatesEditorBackend.statesEditorModel.count() } function nextStateHasExtend(i) { let next = i + 1 - return root.isInRange(next) ? statesEditorModel.get(next).hasExtend : false + return root.isInRange(next) ? StatesEditorBackend.statesEditorModel.get(next).hasExtend : false } function previousStateHasExtend(i) { let prev = i - 1 - return root.isInRange(prev) ? statesEditorModel.get(prev).hasExtend : false + return root.isInRange(prev) ? StatesEditorBackend.statesEditorModel.get(prev).hasExtend : false } - property bool showExtendGroups: statesEditorModel.hasExtend + property bool showExtendGroups: StatesEditorBackend.statesEditorModel.hasExtend onShowExtendGroupsChanged: root.responsiveResize(root.width, root.height) @@ -263,7 +264,7 @@ Rectangle { property int menuOpen: 0 Connections { - target: statesEditorModel + target: StatesEditorBackend.statesEditorModel function onModelReset() { root.menuOpen = 0 editDialog.close() @@ -343,7 +344,7 @@ Rectangle { } onAccepted: { - let renamed = statesEditorModel.renameActiveStateGroup(editTextField.text) + let renamed = StatesEditorBackend.statesEditorModel.renameActiveStateGroup(editTextField.text) if (renamed) editDialog.close() } @@ -351,8 +352,8 @@ Rectangle { property string previousString onAboutToShow: { - editTextField.text = statesEditorModel.activeStateGroup - editDialog.previousString = statesEditorModel.activeStateGroup + editTextField.text = StatesEditorBackend.statesEditorModel.activeStateGroup + editDialog.previousString = StatesEditorBackend.statesEditorModel.activeStateGroup let btn = editDialog.standardButton(Dialog.Apply) btn.enabled = false @@ -406,8 +407,8 @@ Rectangle { style: StudioTheme.Values.viewBarControlStyle id: stateGroupComboBox actionIndicatorVisible: false - model: statesEditorModel.stateGroups - currentIndex: statesEditorModel.activeStateGroupIndex + model: StatesEditorBackend.statesEditorModel.stateGroups + currentIndex: StatesEditorBackend.statesEditorModel.activeStateGroupIndex anchors.verticalCenter: parent.verticalCenter width: stateGroupLabel.visible ? StudioTheme.Values.defaultControlWidth : root.width - 2 * root.padding @@ -434,18 +435,18 @@ Rectangle { // currentIndex needs special treatment, because if model is changed, it will be // reset regardless of binding. Connections { - target: statesEditorModel + target: StatesEditorBackend.statesEditorModel function onActiveStateGroupIndexChanged() { - stateGroupComboBox.currentIndex = statesEditorModel.activeStateGroupIndex + stateGroupComboBox.currentIndex = StatesEditorBackend.statesEditorModel.activeStateGroupIndex } } onModelChanged: { - stateGroupComboBox.currentIndex = statesEditorModel.activeStateGroupIndex + stateGroupComboBox.currentIndex = StatesEditorBackend.statesEditorModel.activeStateGroupIndex } onCompressedActivated: function (index, reason) { - statesEditorModel.activeStateGroupIndex = index + StatesEditorBackend.statesEditorModel.activeStateGroupIndex = index root.responsiveResize(root.width, root.height) } } @@ -463,16 +464,16 @@ Rectangle { buttonIcon: StudioTheme.Constants.add_medium anchors.verticalCenter: parent.verticalCenter tooltip: qsTr("Create State Group") - onClicked: statesEditorModel.addStateGroup("stateGroup") + onClicked: StatesEditorBackend.statesEditorModel.addStateGroup("stateGroup") } HelperWidgets.AbstractButton { style: StudioTheme.Values.viewBarButtonStyle buttonIcon: StudioTheme.Constants.remove_medium anchors.verticalCenter: parent.verticalCenter - enabled: statesEditorModel.activeStateGroupIndex !== 0 + enabled: StatesEditorBackend.statesEditorModel.activeStateGroupIndex !== 0 tooltip: qsTr("Remove State Group") - onClicked: statesEditorModel.removeStateGroup() + onClicked: StatesEditorBackend.statesEditorModel.removeStateGroup() } HelperWidgets.AbstractButton { @@ -480,7 +481,7 @@ Rectangle { style: StudioTheme.Values.viewBarButtonStyle buttonIcon: StudioTheme.Constants.edit_medium anchors.verticalCenter: parent.verticalCenter - enabled: statesEditorModel.activeStateGroupIndex !== 0 + enabled: StatesEditorBackend.statesEditorModel.activeStateGroupIndex !== 0 checked: editDialog.visible tooltip: qsTr("Rename State Group") onClicked: { @@ -550,13 +551,13 @@ Rectangle { width: Constants.thumbnailSize height: Constants.thumbnailSize baseState: true - defaultChecked: !statesEditorModel.baseState.modelHasDefaultState // TODO Make this one a model property + defaultChecked: !StatesEditorBackend.statesEditorModel.baseState.modelHasDefaultState // TODO Make this one a model property isChecked: root.currentStateInternalId === 0 - thumbnailImageSource: statesEditorModel.baseState.stateImageSource ?? "" // TODO Get rid of the QVariantMap + thumbnailImageSource: StatesEditorBackend.statesEditorModel.baseState.stateImageSource ?? "" // TODO Get rid of the QVariantMap isTiny: root.tinyMode onFocusSignal: root.currentStateInternalId = 0 - onDefaultClicked: statesEditorModel.resetDefaultState() + onDefaultClicked: StatesEditorBackend.statesEditorModel.resetDefaultState } } @@ -649,7 +650,7 @@ Rectangle { property int grabIndex: -1 - model: statesEditorModel + model: StatesEditorBackend.statesEditorModel onItemAdded: root.responsiveResize(root.width, root.height) onItemRemoved: root.responsiveResize(root.width, root.height) @@ -691,7 +692,7 @@ Rectangle { return } - statesEditorModel.move(dragSource.visualIndex, + StatesEditorBackend.statesEditorModel.move(dragSource.visualIndex, stateThumbnail.visualIndex) } @@ -709,7 +710,7 @@ Rectangle { if (statesRepeater.grabIndex === dropSource.visualIndex) return - statesEditorModel.drop(statesRepeater.grabIndex, + StatesEditorBackend.statesEditorModel.drop(statesRepeater.grabIndex, dropSource.visualIndex) statesRepeater.grabIndex = -1 } @@ -807,7 +808,7 @@ Rectangle { hasExtend: delegateRoot.hasExtend extendString: delegateRoot.extendString - extendedState: statesEditorModel.extendedStates.includes( + extendedState: StatesEditorBackend.statesEditorModel.extendedStates.includes( delegateRoot.stateName) hasWhenCondition: delegateRoot.hasWhenCondition @@ -840,19 +841,19 @@ Rectangle { isChecked: root.currentStateInternalId === delegateRoot.internalNodeId onFocusSignal: root.currentStateInternalId = delegateRoot.internalNodeId - onDefaultClicked: statesEditorModel.setStateAsDefault( + onDefaultClicked: StatesEditorBackend.statesEditorModel.setStateAsDefault( delegateRoot.internalNodeId) onClone: root.cloneState(delegateRoot.internalNodeId) onExtend: root.extendState(delegateRoot.internalNodeId) onRemove: { if (delegateRoot.isDefault) - statesEditorModel.resetDefaultState() + StatesEditorBackend.statesEditorModel.resetDefaultState() root.deleteState(delegateRoot.internalNodeId) } - onStateNameFinished: statesEditorModel.renameState( + onStateNameFinished: StatesEditorBackend.statesEditorModel.renameState( delegateRoot.internalNodeId, stateThumbnail.stateName) } @@ -865,7 +866,7 @@ Rectangle { Item { id: addWrapper - visible: canAddNewStates + visible: StatesEditorBackend.statesEditorModel.canAddNewStates Canvas { id: addCanvas diff --git a/share/qtcreator/qmldesigner/stateseditor/StateThumbnail.qml b/share/qtcreator/qmldesigner/stateseditor/StateThumbnail.qml index e54732c8d09..1d8147d0425 100644 --- a/share/qtcreator/qmldesigner/stateseditor/StateThumbnail.qml +++ b/share/qtcreator/qmldesigner/stateseditor/StateThumbnail.qml @@ -28,6 +28,7 @@ import QtQuick.Controls import HelperWidgets 2.0 as HelperWidgets import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme +import StatesEditorBackend Item { id: root @@ -77,7 +78,7 @@ Item { property alias dragActive: dragHandler.active function checkAnnotation() { - return statesEditorModel.hasAnnotation(root.internalNodeId) + return StatesEditorBackend.statesEditorModel.hasAnnotation(root.internalNodeId) } function setPropertyChangesVisible(value) { @@ -256,7 +257,7 @@ Item { PropertyChangesModel { id: propertyChangesModel - modelNodeBackendProperty: statesEditorModel.stateModelNode(root.internalNodeId) + modelNodeBackendProperty: StatesEditorBackend.statesEditorModel.stateModelNode(root.internalNodeId) } Text { @@ -631,14 +632,14 @@ Item { return if ( bindingEditor.newWhenCondition !== "") - statesEditorModel.setWhenCondition(root.internalNodeId, + StatesEditorBackend.statesEditorModel.setWhenCondition(root.internalNodeId, bindingEditor.newWhenCondition) else - statesEditorModel.resetWhenCondition(root.internalNodeId) + StatesEditorBackend.statesEditorModel.resetWhenCondition(root.internalNodeId) } } - stateModelNodeProperty: statesEditorModel.stateModelNode(root.internalNodeId) + stateModelNodeProperty: StatesEditorBackend.statesEditorModel.stateModelNode(root.internalNodeId) stateNameProperty: root.stateName onRejected: bindingEditor.hideWidget() @@ -691,9 +692,9 @@ Item { whenCondition.previousCondition = whenCondition.text if (whenCondition.text !== "") - statesEditorModel.setWhenCondition(root.internalNodeId, root.whenCondition) + StatesEditorBackend.statesEditorModel.setWhenCondition(root.internalNodeId, root.whenCondition) else - statesEditorModel.resetWhenCondition(root.internalNodeId) + StatesEditorBackend.statesEditorModel.resetWhenCondition(root.internalNodeId) } @@ -736,11 +737,11 @@ Item { onToggle: root.setPropertyChangesVisible(!root.propertyChangesVisible) onResetWhenCondition: statesEditorModel.resetWhenCondition(root.internalNodeId) onEditAnnotation: { - statesEditorModel.setAnnotation(root.internalNodeId) + StatesEditorBackend.statesEditorModel.setAnnotation(root.internalNodeId) stateMenu.hasAnnotation = root.checkAnnotation() } onRemoveAnnotation: { - statesEditorModel.removeAnnotation(root.internalNodeId) + StatesEditorBackend.statesEditorModel.removeAnnotation(root.internalNodeId) stateMenu.hasAnnotation = root.checkAnnotation() } diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp index 52036175cf2..0b53af121b8 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp @@ -435,4 +435,19 @@ void StatesEditorModel::evaluateExtend() } } +bool StatesEditorModel::canAddNewStates() const +{ + return m_canAddNewStates; +} + +void StatesEditorModel::setCanAddNewStates(bool b) +{ + if (b == m_canAddNewStates) + return; + + m_canAddNewStates = b; + + emit canAddNewStatesChanged(); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h index 0790ef697c2..8eff287c869 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h @@ -14,6 +14,9 @@ class StatesEditorModel : public QAbstractListModel { Q_OBJECT + Q_PROPERTY(bool canAddNewStates READ canAddNewStates WRITE setCanAddNewStates NOTIFY + canAddNewStatesChanged) + enum { StateNameRole = Qt::DisplayRole, StateImageSourceRole = Qt::UserRole, @@ -85,6 +88,9 @@ public: void reset(); void evaluateExtend(); + bool canAddNewStates() const; + void setCanAddNewStates(bool b); + signals: void changedToState(int n); void baseStateChanged(); @@ -93,11 +99,13 @@ signals: void activeStateGroupChanged(); void activeStateGroupIndexChanged(); void stateGroupsChanged(); + void canAddNewStatesChanged(); private: QPointer m_statesEditorView; bool m_hasExtend; QStringList m_extendedStates; + bool m_canAddNewStates = false; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 5334110cacf..376e74f5de6 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -420,7 +420,7 @@ void StatesEditorView::checkForStatesAvailability() const bool isVisual = activeStatesGroupNode().metaInfo().isBasedOn( model()->qtQuickItemMetaInfo(), model()->qtQuick3DNodeMetaInfo()); const bool isRoot = activeStatesGroupNode().isRootNode(); - m_statesEditorWidget->showAddNewStatesButton(isVisual || !isRoot); + m_statesEditorModel->setCanAddNewStates(isVisual || !isRoot); } } diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp index d5685233f5c..ad30a0dfa10 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp @@ -64,11 +64,6 @@ void StatesEditorWidget::setNodeInstanceView(const NodeInstanceView *nodeInstanc m_imageProvider->setNodeInstanceView(nodeInstanceView); } -void StatesEditorWidget::showAddNewStatesButton(bool showAddNewStatesButton) -{ - rootContext()->setContextProperty(QLatin1String("canAddNewStates"), showAddNewStatesButton); -} - StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, StatesEditorModel *statesEditorModel) : m_statesEditorView(statesEditorView) @@ -90,10 +85,8 @@ StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, setResizeMode(QQuickWidget::SizeRootObjectToView); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - rootContext()->setContextProperties( - QVector{{{"statesEditorModel"}, - QVariant::fromValue(statesEditorModel)}, - {{"canAddNewStates"}, true}}); + auto map = registerPropertyMap("StatesEditorBackend"); + map->setProperties({{"statesEditorModel", QVariant::fromValue(statesEditorModel)}}); Theme::setupTheme(engine()); @@ -118,7 +111,7 @@ QString StatesEditorWidget::qmlSourcesPath() void StatesEditorWidget::showEvent(QShowEvent *event) { - QQuickWidget::showEvent(event); + StudioQuickWidget::showEvent(event); update(); QMetaObject::invokeMethod(rootObject(), "showEvent"); } @@ -127,13 +120,13 @@ void StatesEditorWidget::focusOutEvent(QFocusEvent *focusEvent) { QmlDesignerPlugin::emitUsageStatisticsTime(Constants::EVENT_STATESEDITOR_TIME, m_usageTimer.elapsed()); - QQuickWidget::focusOutEvent(focusEvent); + StudioQuickWidget::focusOutEvent(focusEvent); } void StatesEditorWidget::focusInEvent(QFocusEvent *focusEvent) { m_usageTimer.restart(); - QQuickWidget::focusInEvent(focusEvent); + StudioQuickWidget::focusInEvent(focusEvent); } void StatesEditorWidget::reloadQmlSource() diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h index 061ddb8970c..395cdbfac21 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h @@ -3,10 +3,11 @@ #pragma once +#include + #include #include #include -#include QT_BEGIN_NAMESPACE class QShortcut; @@ -21,7 +22,7 @@ class StatesEditorView; namespace Internal { class StatesEditorImageProvider; } -class StatesEditorWidget : public QQuickWidget +class StatesEditorWidget : public StudioQuickWidget { Q_OBJECT @@ -33,8 +34,6 @@ public: void setCurrentStateInternalId(int internalId); void setNodeInstanceView(const NodeInstanceView *nodeInstanceView); - void showAddNewStatesButton(bool showAddNewStatesButton); - static QString qmlSourcesPath(); protected: From 5de0bd268f80e07750f067080b27c3edb902d36b Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 9 Jun 2023 16:08:34 +0300 Subject: [PATCH 078/149] QmlDesigner: Delete puppet rhi pipeline cache every now and then Unused pipelines are never removed from the cache, so if we don't delete it ourselves, the cache file will keep growing indefinitely. We now keep count of how many times we have stored the cache and remove it after set number of times to avoid bloat. Fixes: QDS-10075 Change-Id: I5a4d25a7e40c8ff761c6c523cb80cda3f721528f Reviewed-by: Reviewed-by: Mahmoud Badri --- .../instances/qt5nodeinstanceserver.cpp | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index e5cda877894..a696fd45cea 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -217,18 +217,34 @@ void Qt5NodeInstanceServer::savePipelineCacheData() if (!m_viewData.rhi) return; - const QByteArray pipelineData = m_viewData.rhi->pipelineCacheData(); + QByteArray pipelineData = m_viewData.rhi->pipelineCacheData(); if (pipelineData.isEmpty()) return; - m_pipelineCacheData = pipelineData; + char count = 0; + if (!m_pipelineCacheData.isEmpty()) + count = m_pipelineCacheData[m_pipelineCacheData.size() - 1]; + pipelineData.append(++count); - QTimer::singleShot(0, this, [this]() { - QFile file(m_pipelineCacheFile); - if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) - file.write(m_pipelineCacheData); - }); + const bool needWrite = m_pipelineCacheData.size() != pipelineData.size() + && !m_pipelineCacheFile.isEmpty(); + + if (needWrite) { + m_pipelineCacheData = pipelineData; + + QTimer::singleShot(0, this, [this]() { + QFile cacheFile(m_pipelineCacheFile); + + // Cache file can grow indefinitely, so let's just purge it every so often. + // The count is stored as the last char in the data. + char count = m_pipelineCacheData[m_pipelineCacheData.size() - 1]; + if (count > 25) + cacheFile.remove(); + else if (cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) + cacheFile.write(m_pipelineCacheData); + }); + } #endif } @@ -267,7 +283,7 @@ bool Qt5NodeInstanceServer::initRhi([[maybe_unused]] RenderViewData &viewData) } #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 1) if (!m_pipelineCacheData.isEmpty()) - viewData.rhi->setPipelineCacheData(m_pipelineCacheData); + viewData.rhi->setPipelineCacheData(m_pipelineCacheData.left(m_pipelineCacheData.size() - 1)); #endif } From c9e5a7dba9aef6a17e5d2032d14633468c56c620 Mon Sep 17 00:00:00 2001 From: Vikas Pachdha Date: Mon, 12 Jun 2023 09:36:33 +0200 Subject: [PATCH 079/149] Fix QDS crash on calling property count Change-Id: Ibd3492751ac7b01101060e30f385562a6dfe5ba3 Reviewed-by: Marco Bubke --- src/plugins/qmldesigner/designercore/model/internalnode_p.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index d82d97251a1..8b3ff86d2bc 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -108,8 +108,9 @@ public: InternalNodeAbstractProperty::Pointer nodeAbstractProperty(const PropertyName &name) const { auto property = m_namePropertyHash.value(name); - if (property->propertyType() == PropertyType::NodeList - || property->propertyType() == PropertyType::Node) { + if (property + && (property->propertyType() == PropertyType::NodeList + || property->propertyType() == PropertyType::Node)) { return std::static_pointer_cast(property); } return {}; From e14a2d5285daf27668d92f80e0341a300454dd5f Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 12 Jun 2023 12:58:27 +0200 Subject: [PATCH 080/149] QmlDesigner: Close origin popup on selection change Task-number: QDS-10083 Change-Id: I9a5b47ac1851de1ed8121a2545bf19a2390584eb Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/OriginControl.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/OriginControl.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/OriginControl.qml index f4d4f7af856..e07b371cbde 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/OriginControl.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/OriginControl.qml @@ -17,6 +17,11 @@ Row { root.backendValue.setEnumeration("Item", value) } + Connections { + target: modelNodeBackend + function onSelectionChanged() { originPopup.close() } + } + ExtendedFunctionLogic { id: extFuncLogic backendValue: root.backendValue From d80bd29feb2b0ca49bc9bc9afaf5bba9e5293954 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Fri, 9 Jun 2023 15:51:09 +0200 Subject: [PATCH 081/149] QmlDesigner: Fix for missing ItemBuffer properties Task-number: QDS-10077 Change-Id: I19f0862a9c3ef99a4e0389f3271306212ba94239 Reviewed-by: Thomas Hartmann Reviewed-by: --- share/qtcreator/qmldesigner/qt4mcu/qul-24.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/share/qtcreator/qmldesigner/qt4mcu/qul-24.qml b/share/qtcreator/qmldesigner/qt4mcu/qul-24.qml index f78b00b8c65..1c5d00a33f3 100644 --- a/share/qtcreator/qmldesigner/qt4mcu/qul-24.qml +++ b/share/qtcreator/qmldesigner/qt4mcu/qul-24.qml @@ -207,4 +207,8 @@ VersionData { bannedProperties: ["dashOffset", "dashPattern", "fillGradient", "strokeStyle"] } + + QtQuickUltralite.Extras.ItemBuffer { + allowedProperties: ["rotation", "scale", "transformOrigin"] + } } From fb042cba219aa634d4ed8101fa511526f0e0f22e Mon Sep 17 00:00:00 2001 From: Samuel Ghinet Date: Mon, 12 Jun 2023 20:03:28 +0300 Subject: [PATCH 082/149] QmlDesigner: Use new icon(s) for update button for textures Task-number: QDS-9855 Change-Id: I012c1e96a11216a30da6e15124d55733da2fdcdc Reviewed-by: Miikka Heikkinen Reviewed-by: Ali Kianian --- .../ContentLibraryTexture.qml | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexture.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexture.qml index bad54116572..6a938ed14d6 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexture.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexture.qml @@ -199,31 +199,41 @@ Item { } } // IconButton - Rectangle { - width: 22 - height: 22 - color: "#323232" + IconButton { + id: updateButton + icon: StudioTheme.Constants.updateAvailable_medium + iconColor: "white" + tooltip: qsTr("Update texture") + buttonSize: 22 + iconSize: 22 - visible: root.downloadState === "downloaded" && modelData.textureHasUpdate + iconScale: updateButton.containsMouse ? 1.2 : 1 + iconStyle: Text.Outline + iconStyleColor: "black" anchors.left: parent.left anchors.bottom: parent.bottom - IconButton { - id: updateButton - icon: StudioTheme.Constants.rotationFill - iconColor: "white" - tooltip: qsTr("Update texture") - buttonSize: 22 + visible: root.downloadState === "downloaded" && modelData.textureHasUpdate + transparentBg: true - property color c: "white" - normalColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .2) - hoverColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .3) - pressColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .4) + onClicked: root.updateTexture() - onClicked: root.updateTexture() - } // Update IconButton - } + Text { + text: StudioTheme.Constants.updateContent_medium + font.family: StudioTheme.Constants.iconFont.family + color: "black" + + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.bottomMargin: 5 + + font.pixelSize: 10 + font.bold: true + + scale: updateButton.containsMouse ? 1.2 : 1 + } + } // Update IconButton Rectangle { id: isNewFlag From 456c8a4ef463d8fe0c8e755fb2ebf8e5f94aa0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esa=20T=C3=B6rm=C3=A4nen?= Date: Wed, 31 May 2023 16:30:44 +0300 Subject: [PATCH 083/149] Doc: Add QDS Features on MCU Projects topic Added the QDS Features on MCU Projects topic and modified the related topics accordingly. Task-number: QDS-9286 Change-Id: Ifda898f59578d31567f2e2d4292a1a76882ccb16 Reviewed-by: Leena Miettinen Reviewed-by: Aleksei German Reviewed-by: Mats Honkamaa --- .../external-resources-qds.qdoc | 4 + ...ignstudio-compatibility-with-mcu-sdks.qdoc | 2 +- ...designstudio-features-on-mcu-projects.qdoc | 129 ++++++++++++++++++ .../src/qtdesignstudio-help-overview.qdoc | 2 +- .../src/qtdesignstudio-toc.qdoc | 1 + 5 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 doc/qtdesignstudio/src/mcus/qtdesignstudio-features-on-mcu-projects.qdoc diff --git a/doc/qtcreator/src/external-resources/external-resources-qds.qdoc b/doc/qtcreator/src/external-resources/external-resources-qds.qdoc index b1c64e785d1..610e0926344 100644 --- a/doc/qtcreator/src/external-resources/external-resources-qds.qdoc +++ b/doc/qtcreator/src/external-resources/external-resources-qds.qdoc @@ -57,3 +57,7 @@ \externalpage https://doc.qt.io/QtForMCUs/qtul-renesas-rh850-qsg.html \title Renesas RH850-D1M1A quick start guide */ +/*! + \externalpage https://doc.qt.io/QtForMCUs/qtul-known-issues.html + \title \QMCU Known Issues or Limitations +*/ diff --git a/doc/qtdesignstudio/src/mcus/qtdesignstudio-compatibility-with-mcu-sdks.qdoc b/doc/qtdesignstudio/src/mcus/qtdesignstudio-compatibility-with-mcu-sdks.qdoc index c6dab76398d..2a0e49cda65 100644 --- a/doc/qtdesignstudio/src/mcus/qtdesignstudio-compatibility-with-mcu-sdks.qdoc +++ b/doc/qtdesignstudio/src/mcus/qtdesignstudio-compatibility-with-mcu-sdks.qdoc @@ -4,7 +4,7 @@ /*! \previouspage studio-on-mcus.html \page studio-compatibility-with-mcu-sdks.html - \nextpage studio-help.html + \nextpage studio-features-on-mcu-projects.html \title \QDS Version Compatibility with \QMCU SDKs diff --git a/doc/qtdesignstudio/src/mcus/qtdesignstudio-features-on-mcu-projects.qdoc b/doc/qtdesignstudio/src/mcus/qtdesignstudio-features-on-mcu-projects.qdoc new file mode 100644 index 00000000000..5cec8d690e4 --- /dev/null +++ b/doc/qtdesignstudio/src/mcus/qtdesignstudio-features-on-mcu-projects.qdoc @@ -0,0 +1,129 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \previouspage studio-compatibility-with-mcu-sdks.html + \page studio-features-on-mcu-projects.html + \nextpage studio-help.html + + \title \QDS Features on MCU Projects + + The table below provides a summary of how the key \QDS features are supported + for developing MCU projects. + + \table + \header + \li View + \li Fully Supported + \li Partially Supported + \li Not Supported + \li Comments + \row + \li \l 2D + \li \b X + \li \b - + \li \b - + \li A scene in the \uicontrol 2D view is rendered by the regular Qt Quick + and QML, and not as \QUL and \QMCU, so some imperfections or inaccuracies + can occur. + \row + \li \l 3D + \li \b - + \li \b - + \li \b X + \li The \uicontrol 3D view is not a part of \QUL or \QMCU. + \row + \li \l {Material Editor and Browser} + \li \b - + \li \b - + \li \b X + \li The \uicontrol {Material Editor} and \uicontrol {Material Browser} views + are not a part of \QUL or \QMCU. + \row + \li \l {Components} + \li \b X + \li \b - + \li \b - + \li Shows only the components and modules available for MCU projects. + \row + \li \l {Assets} + \li \b X + \li \b - + \li \b - + \li Shows all the listed assets in the \c QmlProject file. + \row + \li \l {Navigator} + \li \b X + \li \b - + \li \b - + \li Displays the composition of the current component file as a tree + structure. + \row + \li \l {Properties} + \li \b X + \li \b - + \li \b - + \li Shows only the preset properties available for MCU projects (such as + by Qt Quick and its modules). + \row + \li \l {Connections} + \li \b X + \li \b - + \li \b - + \li The \uicontrol Connections view displays all signal handlers in the + current file but it doesn't filter available signals, so you can still + see and select signals that are available in Qt Quick, but not in \QUL. + \row + \li \l {States} + \li \b X + \li \b - + \li \b - + \li The feature is fully supported as such, but there are some + limitations listed in \l {\QMCU Known Issues or Limitations}. + \row + \li \l {Transitions} + \li \b X + \li \b - + \li \b - + \li \b - + \row + \li \l {Translations} + \li \b - + \li \b - + \li \b X + \li \b - + \row + \li \l {Timeline} + \li \b X + \li \b - + \li \b - + \li \b - + \row + \li \l {Curves} + \li \b - + \li \b X + \li \b - + \li Linear interpolation works, but \QMCU does not support the + \c easing.bezierCurve property of a keyframe. + \row + \li \l Code + \li \b X + \li \b - + \li \b - + \li The \uicontrol Code view uses regular Qt Quick instead of \QUL, so it may + not show an error if you are using or assigning an unsupported property. + \row + \li \l {Content Library} + \li \b - + \li \b - + \li \b X + \li The \uicontrol {Content Library} view is not a part of \QUL or \QMCU. + \row + \li \l {Texture Editor} + \li \b - + \li \b - + \li \b X + \li The \uicontrol {Texture Editor} view is not a part of \QUL or \QMCU. + \endtable + +*/ diff --git a/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc index 3db1a5cd1fe..578129024a9 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-help-overview.qdoc @@ -3,7 +3,7 @@ /*! \page studio-help.html - \previouspage studio-compatibility-with-mcu-sdks.html + \previouspage studio-features-on-mcu-projects.html \nextpage creator-help.html \title Help diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 6fc2014020f..7b42139cb43 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -262,6 +262,7 @@ \li \l{\QDS on MCUs} \list \li \l {\QDS Version Compatibility with \QMCU SDKs} + \li \l {\QDS Features on MCU Projects} \endlist \endlist \li \l Help From 147702da6e522dec9d3da07dad2aa42873240516 Mon Sep 17 00:00:00 2001 From: Samuel Ghinet Date: Tue, 13 Jun 2023 16:01:22 +0300 Subject: [PATCH 084/149] QmlDesigner: Use http as fallback if SSL is not supported Task-number: QDS-10011 Change-Id: Id3f2e406414a4e103471b9351db3fea3f686c83d Reviewed-by: Thomas Hartmann --- .../qmldesigner/utils/filedownloader.cpp | 25 ++++++++++++++----- .../qmldesigner/utils/filedownloader.h | 1 + 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/utils/filedownloader.cpp b/src/plugins/qmldesigner/utils/filedownloader.cpp index dc8cf85c204..8b3bb63993e 100644 --- a/src/plugins/qmldesigner/utils/filedownloader.cpp +++ b/src/plugins/qmldesigner/utils/filedownloader.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace QmlDesigner { @@ -38,6 +39,22 @@ bool FileDownloader::deleteFileAtTheEnd() const return m_targetFilePath.isEmpty(); } +QNetworkRequest FileDownloader::makeRequest() const +{ + QUrl url = m_url; + + if (url.scheme() == "https" && !QSslSocket::supportsSsl()) { + qWarning() << "SSL is not available. HTTP will be used instead of HTTPS."; + url.setScheme("http"); + } + + auto request = QNetworkRequest(url); + request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, + QNetworkRequest::UserVerifiedRedirectPolicy); + + return request; +} + void FileDownloader::start() { emit downloadStarting(); @@ -48,9 +65,7 @@ void FileDownloader::start() m_outputFile.setFileName(tempFileName); m_outputFile.open(QIODevice::WriteOnly); - auto request = QNetworkRequest(m_url); - request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, - QNetworkRequest::UserVerifiedRedirectPolicy); + QNetworkRequest request = makeRequest(); QNetworkReply *reply = Utils::NetworkAccessManager::instance()->get(request); m_reply = reply; @@ -255,9 +270,7 @@ void FileDownloader::doProbeUrl() return; } - auto request = QNetworkRequest(m_url); - request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, - QNetworkRequest::UserVerifiedRedirectPolicy); + QNetworkRequest request = makeRequest(); QNetworkReply *reply = Utils::NetworkAccessManager::instance()->head(request); QNetworkReply::connect(reply, &QNetworkReply::redirected, [reply](const QUrl &) { diff --git a/src/plugins/qmldesigner/utils/filedownloader.h b/src/plugins/qmldesigner/utils/filedownloader.h index 9bdd70943fa..6027338af02 100644 --- a/src/plugins/qmldesigner/utils/filedownloader.h +++ b/src/plugins/qmldesigner/utils/filedownloader.h @@ -78,6 +78,7 @@ signals: private: void doProbeUrl(); bool deleteFileAtTheEnd() const; + QNetworkRequest makeRequest() const; QUrl m_url; bool m_probeUrl = false; From 21305dfebaa983fe002e83fdfa381f1f1b373901 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Wed, 14 Jun 2023 12:16:08 +0200 Subject: [PATCH 085/149] QmlDesigner: Fix premature default state reset Task-number: QDS-9433 Change-Id: I2709a52d0d23cfe1a1ead91a0c19f5a959e62540 Reviewed-by: Thomas Hartmann Reviewed-by: --- share/qtcreator/qmldesigner/stateseditor/Main.qml | 7 +------ .../components/stateseditor/stateseditorview.cpp | 3 +++ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/qmldesigner/stateseditor/Main.qml b/share/qtcreator/qmldesigner/stateseditor/Main.qml index 221e300ad3e..13f26884bcf 100644 --- a/share/qtcreator/qmldesigner/stateseditor/Main.qml +++ b/share/qtcreator/qmldesigner/stateseditor/Main.qml @@ -846,12 +846,7 @@ Rectangle { onClone: root.cloneState(delegateRoot.internalNodeId) onExtend: root.extendState(delegateRoot.internalNodeId) - onRemove: { - if (delegateRoot.isDefault) - StatesEditorBackend.statesEditorModel.resetDefaultState() - - root.deleteState(delegateRoot.internalNodeId) - } + onRemove: root.deleteState(delegateRoot.internalNodeId) onStateNameFinished: StatesEditorBackend.statesEditorModel.renameState( delegateRoot.internalNodeId, diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 376e74f5de6..03cd658f22a 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -339,6 +339,9 @@ void StatesEditorView::removeState(int nodeId) NodeListProperty parentProperty = stateNode.parentProperty().toNodeListProperty(); + if (modelState.isDefault()) + m_statesEditorModel->resetDefaultState(); + if (parentProperty.count() <= 1) { setCurrentState(baseState()); } else if (parentProperty.isValid()) { From 6cb6d87746a409ad1a0f59952d5b15e5eeedf1c2 Mon Sep 17 00:00:00 2001 From: Mats Honkamaa Date: Wed, 7 Jun 2023 12:51:30 +0300 Subject: [PATCH 086/149] Doc: Add robotarm workflow tutorial MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a tutorial on the workflow from QDS to QC based on the robotarm example. Task-number: QDS-9536 Change-Id: I5f09290c4a836d46056058fe179edc3e012b3d76 Reviewed-by: Esa Törmänen Reviewed-by: Alessandro Portale Reviewed-by: Thomas Hartmann Reviewed-by: --- .../doc/images/robot-arm-components.png | Bin 0 -> 6424 bytes .../examples/doc/images/robotarm-3d-view.png | Bin 0 -> 3418 bytes .../images/robotarm-button-connections.png | Bin 0 -> 7776 bytes .../examples/doc/images/robotarm-example.webp | Bin 0 -> 15990 bytes doc/qtdesignstudio/examples/doc/robotarm.qdoc | 97 ++++++++++++++++++ 5 files changed, 97 insertions(+) create mode 100644 doc/qtdesignstudio/examples/doc/images/robot-arm-components.png create mode 100644 doc/qtdesignstudio/examples/doc/images/robotarm-3d-view.png create mode 100644 doc/qtdesignstudio/examples/doc/images/robotarm-button-connections.png create mode 100644 doc/qtdesignstudio/examples/doc/images/robotarm-example.webp create mode 100644 doc/qtdesignstudio/examples/doc/robotarm.qdoc diff --git a/doc/qtdesignstudio/examples/doc/images/robot-arm-components.png b/doc/qtdesignstudio/examples/doc/images/robot-arm-components.png new file mode 100644 index 0000000000000000000000000000000000000000..6db6cbddff2e4f1a563e91ec0e219a4244375fb7 GIT binary patch literal 6424 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 IbxsLQ0L&ogsQ>@~ literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/images/robotarm-3d-view.png b/doc/qtdesignstudio/examples/doc/images/robotarm-3d-view.png new file mode 100644 index 0000000000000000000000000000000000000000..70de427f164ba1ad96483b90465d7947ebd0b1b5 GIT binary patch literal 3418 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/images/robotarm-button-connections.png b/doc/qtdesignstudio/examples/doc/images/robotarm-button-connections.png new file mode 100644 index 0000000000000000000000000000000000000000..93bb6c4016e17b88acfb1914cb30c16dec3544f8 GIT binary patch literal 7776 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

EBIUgrz@oPXmL^+$3KyMcmH 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/robotarm.qdoc b/doc/qtdesignstudio/examples/doc/robotarm.qdoc new file mode 100644 index 00000000000..6c6ae78b023 --- /dev/null +++ b/doc/qtdesignstudio/examples/doc/robotarm.qdoc @@ -0,0 +1,97 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page robotarm-example.html + \ingroup gstutorials + + \title Creating a C++ Backend for a \QDS Application + + \brief Illustrates how to create an application in \QDS and add a backend + in Qt Creator. + + \image robotarm-example.webp + + The \e Robotarm example demonstrates adding a C++ backend to a 3D project created in \QDS. + + The example itself consists of an interactive industrial robot arm in a Qt Quick 3D scene. + The 2D UI to control the robot arm is implemented using Qt Quick Controls. + + You can open the example from the \uicontrol Examples tab on the \uicontrol Welcome page + in \QDS. + + To complete this tutorial, you need experience in using \QDS and Qt Creator as well as knowledge + in C++ programming. + + \section1 The Designer-Developer Workflow + + This section describes the high-level steps for creating the robot arm example. + + \section2 Creating the User Interface + + First, the designer creates the user interface in \QDS. + + \list 1 + \li Create a new 3D project. + \li Import the 3D asset (RoboticArm). + \li Create the following custom components: + \list + \li NodeIndicator: This component consists of a rounded rectangle and a label. It is used + to indicate which joint in the robotic arm is currently active. Located in the 3D + scene, it follows the movement of the 3D model. + \li LabeledSlider: This component is a slider with a label. It is connected to the + rotation of the different robot arm parts so that you can use it to control the rotation + of those parts. + \li Toggle: This component consists of a switch and a label. It is used in two places; to + toggle dark mode and to toggle the claw of the robotic arm. + \li Backend: This serves as a mock backend for the \QDS application. Once you open, + compile, and run the application in Qt Creator, it uses the C++ backend. + \endlist + \li Add the 3D model and lights to the \uicontrol View3D scene. + \image robotarm-3d-view.png + \li Create the 2D UI controls: + \list + \li Four buttons for preset positions. As you can see from the \uicontrol Connections tab + in the \uicontrol Connections view, each button changes the rotation of the robot arm + parts. + \image robotarm-button-connections.png + \li Four sliders for controlling the robot arm parts individually. The \uicontrol Backend + component uses these sliders to control the robot arm position. + \li A switch to control the robot arm claw. This is also done through the + \uicontrol Backend component. + \li A switch to toggle dark mode of the application. + \li A label to display the status of the robot arm through the \uicontrol Backend + component. + \endlist + \endlist + + \section2 Creating the C++ Backend + + With the frontend and user interface created, it is time to create the C++ backend. + + To open the project in Qt Creator: + \list 1 + \li Open \c CMakeLists.txt located in the root folder of the robot arm example. This is the + CMake project file. + \li In Qt Creator, add the empty C++ backend classes in the \c backend folder. + \li Ensure that the \c CMakeLists.txt file in the \c backend folder has the classes in it. It + should look something like this: + \code + find_package(Qt6 REQUIRED COMPONENTS Gui) + + qt_add_qml_module(backend + URI Backend + VERSION 1.0 + SOURCES + animatedparam.cpp + animatedparam.h + backend.cpp + backend.h + ) + + target_link_libraries(backend PRIVATE Qt6::Gui) + \endcode + \li Add the backend logic to the created backend classes. + \endlist + +*/ From a2b2a2eaa13597224d53f57861ba65acf6f9d013 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 15 Jun 2023 13:20:53 +0300 Subject: [PATCH 087/149] QmlDesigner: Copy extra files regardless of the way component is added ExtraFile property of item library entries was only handled when item was dragged to navigator. Moved the handling to QmlVisualNode so it would be done regardless of how the item is created. Fixes: QDS-10058 Change-Id: Ied0c418a731104cdf727b1e2a0fe15a8e3b6ff5e Reviewed-by: Qt CI Bot Reviewed-by: Mahmoud Badri --- .../components/navigator/navigatortreemodel.cpp | 15 --------------- .../designercore/model/qmlvisualnode.cpp | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 8768f0703cd..1dd628c2952 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -777,21 +777,6 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in if (newQmlObjectNode.isValid()) m_view->setSelectedModelNode(newQmlObjectNode.modelNode()); } - - const QStringList copyFiles = itemLibraryEntry.extraFilePaths(); - if (!copyFiles.isEmpty()) { - // Files are copied into the same directory as the current qml document - for (const auto ©File : copyFiles) { - QFileInfo fi(copyFile); - const QString targetFile = DocumentManager::currentFilePath().toFileInfo().dir() - .absoluteFilePath(fi.fileName()); - // We don't want to overwrite existing default files - if (!QFileInfo::exists(targetFile)) { - if (!QFile::copy(copyFile, targetFile)) - qWarning() << QStringLiteral("Copying extra file '%1' failed.").arg(copyFile); - } - } - } } } diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index 3831a90d97c..2bfbe860314 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -417,6 +417,20 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, newQmlObjectNode.setBindingProperty(property, parent.validId()); } + const QStringList copyFiles = itemLibraryEntry.extraFilePaths(); + if (!copyFiles.isEmpty()) { + // Files are copied into the same directory as the current qml document + for (const auto ©FileStr : copyFiles) { + Utils::FilePath sourceFile = Utils::FilePath::fromString(copyFileStr); + Utils::FilePath qmlFilePath = Utils::FilePath::fromString( + view->model()->fileUrl().toLocalFile()).absolutePath(); + Utils::FilePath targetFile = qmlFilePath.pathAppended(sourceFile.fileName()); + // We don't want to overwrite existing default files + if (!targetFile.exists() && !sourceFile.copyFile(targetFile)) + qWarning() << QStringLiteral("Copying extra file '%1' failed.").arg(copyFileStr); + } + } + return newQmlObjectNode; } From 2926d4feabe80fec8aa9df00a17cc0684ca60b53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esa=20T=C3=B6rm=C3=A4nen?= Date: Fri, 16 Jun 2023 09:56:02 +0300 Subject: [PATCH 088/149] Doc: Add MCU column to the Summary of Design Views table This update is a follow-up to the comments received during the review of the Qt Design Studio Features on MCU Projects page. The MCU column content follows the 'fully supported' content agreed during the review of the Qt Design Studio Features on MCU Projects page with the following views marked as being also supported for MCUs: - Projects - File System - Open Documents Task-number: QDS-10100 Change-Id: Ia3561ccf958dad1b2f1ca7f1782263d032ab8733 Reviewed-by: Leena Miettinen Reviewed-by: --- .../src/views/qtquick-designer.qdoc | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/qtdesignstudio/src/views/qtquick-designer.qdoc b/doc/qtdesignstudio/src/views/qtquick-designer.qdoc index cc18d924417..e07b798b634 100644 --- a/doc/qtdesignstudio/src/views/qtquick-designer.qdoc +++ b/doc/qtdesignstudio/src/views/qtquick-designer.qdoc @@ -31,52 +31,65 @@ \section1 Summary of Design Views + In addition to the summary of design views, the table below includes an MCU + column that indicates the views which are fully supported on MCU projects. + For more information, see \l {\QDS Features on MCU Projects}. + \table \header \li View \li Purpose + \li MCU \li Read More \row \li \l {2D} \li Provides a working area for designing 2D UIs. When you are editing 3D scenes, the \uicontrol {2D} view is used as a canvas for the 3D scene projected by the camera. + \li \image ok.png \li \l {2D} \row \li \l {3D} \li Provides an editor for files you created using 3D graphics applications and stored in one of the supported formats. + \li \li \l {3D} \row \li \l {Material Editor and Browser} \li In the \uicontrol {Material Editor} and \uicontrol {Material Browser} views, you create and manage materials and textures. + \li \li \l {Material Editor and Browser} \row \li \l Components \li Contains preset components and your own components, that you can use to design you application. + \li \image ok.png \li \l{Using Components} \row \li \l Assets \li Contains assets such as images and fonts that you can use in your application. + \li \image ok.png \li \l Assets \row \li \l Navigator \li Displays the composition of the current component file as a tree structure. A component file can contain references to other components and assets. + \li \image ok.png \li \l Navigator \row \li \l Properties \li Enables you to modify the properties of the selected component. + \li \image ok.png \li \l {Specifying Component Properties} \row \li \l{Connections} \li Enables you to add functionality to the UI by creating connections between components, signals, and component properties. + \li \image ok.png \li \l{Working with Connections} \row \li \l States @@ -84,54 +97,65 @@ Typically, states describe UI configurations, such as the visibility and behavior of components and the available user actions. + \li \image ok.png \li \l{Working with States} \row \li \l{Transitions} \li Enables you to make movement between states smooth by animating the changes between states. + \li \image ok.png \li \l{Animating Transitions Between States} \row \li \l Translations \li Provides functionality to add multi-language support to your project. + \li \li \l{Translations} \row \li \l Timeline \li Provides a timeline and keyframe based editor for animating the properties of components. + \li \image ok.png \li \l{Creating Timeline Animations} \row \li \l{Curves} \li Enables you to view and modify the whole animation curve by inserting keyframes to the curve and dragging them and the point handlers to modify the curve. + \li \li \l {Editing Animation Curves} \row \li \l{Code} \li Provides a code editor for viewing and modifying the code generated by the visual editors. + \li \image ok.png \li \l {Working in Edit Mode} \row \li \l Projects \li Shows a list of open projects and the files they contain. + \li \image ok.png \li \l Projects \row \li \l{File System} \li Shows all files in the currently selected directory. + \li \image ok.png \li \l{File System} \row \li \l{Open Documents} \li Shows currently open files. + \li \image ok.png \li \l{Open Documents} \row \li \l{Content Library} \li The \uicontrol {Content Library} view contains material, texture, and environment bundles with assets that you can use in your project. + \li \li \l{Content Library} \row \li \l{Texture Editor} \li In the \uicontrol {Texture Editor} view, you create and manage textures. + \li \li \l{Texture Editor} \endtable From b6fc485a434743c0d0b2cf26c862f899e3807280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Jen=C3=9Fen?= Date: Fri, 16 Jun 2023 14:12:53 +0200 Subject: [PATCH 089/149] qds: increase version to 4.3.0 Change-Id: Ic6d8ac48aa5d89309450add8042fada7c55e0044 Reviewed-by: Tim Jenssen --- dist/branding/qtdesignstudio/QtCreatorIDEBranding.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/branding/qtdesignstudio/QtCreatorIDEBranding.cmake b/dist/branding/qtdesignstudio/QtCreatorIDEBranding.cmake index 9b805bff125..5877838a481 100644 --- a/dist/branding/qtdesignstudio/QtCreatorIDEBranding.cmake +++ b/dist/branding/qtdesignstudio/QtCreatorIDEBranding.cmake @@ -1,6 +1,6 @@ -set(IDE_VERSION "4.2.0") # The IDE version. -set(IDE_VERSION_COMPAT "4.2.0") # The IDE Compatibility version. -set(IDE_VERSION_DISPLAY "4.2.0") # The IDE display version. +set(IDE_VERSION "4.3.0") # The IDE version. +set(IDE_VERSION_COMPAT "4.3.0") # The IDE Compatibility version. +set(IDE_VERSION_DISPLAY "4.3.0") # The IDE display version. set(IDE_COPYRIGHT_YEAR "2023") # The IDE current copyright year. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. From c0ef0895b3b74ed4859c8a143bd2cf7646333da6 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Fri, 16 Jun 2023 14:26:16 +0200 Subject: [PATCH 090/149] QmlDesigner: Cleanup MCU template Change-Id: Id75b042921fd2e3c6644abfce10a752ca20ff0a4 Reviewed-by: Tim Jenssen --- .../qmldesigner/studio_templates/projects/app_mcu.qmlproject | 2 +- .../projects/application-mcu/Constants.qml.tpl | 2 +- .../projects/application-mcu/Screen01.ui.qml.tpl | 4 ++-- .../studio_templates/projects/application-mcu/main.qml.tpl | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject b/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject index 84bd0791ce9..50e5b9a357c 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject +++ b/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject @@ -54,7 +54,7 @@ Project { QDS.qtForMCUs: true QDS.qt6Project: true - QDS.qdsVersion: "4.1" + QDS.qdsVersion: "4.2" QDS.quickVersion: "6.5" /* List of plugin directories passed to QML runtime */ diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/Constants.qml.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/Constants.qml.tpl index ad50e39e9ac..c6bbb001993 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/Constants.qml.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/Constants.qml.tpl @@ -1,5 +1,5 @@ pragma Singleton -import QtQuick 6.5 +import QtQuick QtObject { readonly property int width: %{ScreenWidth} diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/Screen01.ui.qml.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/Screen01.ui.qml.tpl index 4a70ce692b6..4a16e2c6b1c 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/Screen01.ui.qml.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/Screen01.ui.qml.tpl @@ -5,8 +5,8 @@ this file manually, you might introduce QML code that is not supported by Qt Des Check out https://doc.qt.io/qtcreator/creator-quick-ui-forms.html for details on .ui.qml files. */ -import QtQuick 6.5 -import Constants 1.0 +import QtQuick +import Constants Rectangle { width: Constants.width diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/main.qml.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/main.qml.tpl index e25113c67f9..cd6a735a099 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/main.qml.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application-mcu/main.qml.tpl @@ -1,5 +1,5 @@ -import QtQuick 6.5 -import Constants 1.0 +import QtQuick +import Constants Item { width: Constants.width From 9021558bcc1edc2b44c9be5461367a3706c844f7 Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Thu, 15 Jun 2023 15:21:26 +0200 Subject: [PATCH 091/149] Fix policy warnings in project templates When compiling default created projects with Qt 6.5 and cmake warnings about Qt policy QTP0001 where issued. This is now fixed for the project templates. A second patch for the qtquick-components repo will be provided to get rid of the remaining policy warnings Change-Id: Ia701a0cc7e030c9cb1459dc48e5ed2a91a6c6c0e Reviewed-by: Reviewed-by: Ulf Hermann --- doc/qtdesignstudio/examples/Loginui1/src/main.cpp | 2 +- .../projects/common/CMakeLists.content.txt.tpl | 1 + .../studio_templates/projects/common/main.cpp.tpl | 2 +- .../projects/common/qmlmodules.tpl | 1 + .../mobile-stack/CMakeLists.content.txt.tpl | 1 + .../mobile-swipe/CMakeLists.content.txt.tpl | 1 + .../name/CMakeLists.importmodule.txt.tpl | 15 ++++++++------- .../cmakegen/qmlprojectmaincpp.tpl | 2 +- .../cmakegen/qmlprojectmodulecmakelists.tpl | 1 + .../cmakegen/qmlprojectmodules.tpl | 1 + 10 files changed, 17 insertions(+), 10 deletions(-) diff --git a/doc/qtdesignstudio/examples/Loginui1/src/main.cpp b/doc/qtdesignstudio/examples/Loginui1/src/main.cpp index 1df03ed16b6..eacbde58784 100644 --- a/doc/qtdesignstudio/examples/Loginui1/src/main.cpp +++ b/doc/qtdesignstudio/examples/Loginui1/src/main.cpp @@ -14,7 +14,7 @@ int main(int argc, char *argv[]) QGuiApplication app(argc, argv); QQmlApplicationEngine engine; - const QUrl url(u"qrc:Main/main.qml"_qs); + const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/common/CMakeLists.content.txt.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/common/CMakeLists.content.txt.tpl index a95da583f37..a5a4360e3f2 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/common/CMakeLists.content.txt.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/common/CMakeLists.content.txt.tpl @@ -5,6 +5,7 @@ qt_add_library(content STATIC) qt6_add_qml_module(content URI "content" VERSION 1.0 + RESOURCE_PREFIX "/qt/qml" QML_FILES App.qml %{UIClassFileName} diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/common/main.cpp.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/common/main.cpp.tpl index 53c355b6b8a..915d08462e2 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/common/main.cpp.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/common/main.cpp.tpl @@ -15,7 +15,7 @@ int main(int argc, char *argv[]) QGuiApplication app(argc, argv); QQmlApplicationEngine engine; - const QUrl url(u"qrc:Main/main.qml"_qs); + const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/common/qmlmodules.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/common/qmlmodules.tpl index fa3069a770a..5a22661b5a1 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/common/qmlmodules.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/common/qmlmodules.tpl @@ -4,6 +4,7 @@ qt6_add_qml_module(${CMAKE_PROJECT_NAME} URI "Main" VERSION 1.0 + RESOURCE_PREFIX "/qt/qml" NO_PLUGIN QML_FILES main.qml ) diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-stack/CMakeLists.content.txt.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-stack/CMakeLists.content.txt.tpl index 255afffa3ea..5601c89997d 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-stack/CMakeLists.content.txt.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-stack/CMakeLists.content.txt.tpl @@ -5,6 +5,7 @@ qt_add_library(content STATIC) qt6_add_qml_module(content URI "content" VERSION 1.0 + RESOURCE_PREFIX "/qt/qml" QML_FILES App.qml Screen01.ui.qml diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-swipe/CMakeLists.content.txt.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-swipe/CMakeLists.content.txt.tpl index 255afffa3ea..5601c89997d 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/mobile-swipe/CMakeLists.content.txt.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/mobile-swipe/CMakeLists.content.txt.tpl @@ -5,6 +5,7 @@ qt_add_library(content STATIC) qt6_add_qml_module(content URI "content" VERSION 1.0 + RESOURCE_PREFIX "/qt/qml" QML_FILES App.qml Screen01.ui.qml diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/shared-plugin/name/CMakeLists.importmodule.txt.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/shared-plugin/name/CMakeLists.importmodule.txt.tpl index df10020cb23..517b91355a7 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/shared-plugin/name/CMakeLists.importmodule.txt.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/shared-plugin/name/CMakeLists.importmodule.txt.tpl @@ -8,11 +8,12 @@ set_source_files_properties(Constants.qml ) qt6_add_qml_module(%{ImportModuleName} - URI "%{ImportModuleName}" - VERSION 1.0 - QML_FILES - Constants.qml - DirectoryFontLoader.qml - EventListModel.qml - EventListSimulator.qml + URI "%{ImportModuleName}" + VERSION 1.0 + RESOURCE_PREFIX "/qt/qml" + QML_FILES + Constants.qml + DirectoryFontLoader.qml + EventListModel.qml + EventListSimulator.qml ) diff --git a/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmaincpp.tpl b/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmaincpp.tpl index cedd80d76dd..0ff9201d916 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmaincpp.tpl +++ b/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmaincpp.tpl @@ -13,7 +13,7 @@ int main(int argc, char *argv[]) QGuiApplication app(argc, argv); QQmlApplicationEngine engine; - const QUrl url(u"qrc:Main/main.qml"_qs); + const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { diff --git a/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmodulecmakelists.tpl b/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmodulecmakelists.tpl index e193ebf5ba1..93573a1ed7a 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmodulecmakelists.tpl +++ b/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmodulecmakelists.tpl @@ -7,5 +7,6 @@ qt_add_library(%2 STATIC) qt6_add_qml_module(%2 URI "%3" VERSION 1.0 + RESOURCE_PREFIX "/qt/qml" %4 ) diff --git a/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmodules.tpl b/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmodules.tpl index a1fdb4071dc..2b74c49af38 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmodules.tpl +++ b/src/plugins/qmlprojectmanager/cmakegen/qmlprojectmodules.tpl @@ -4,6 +4,7 @@ qt6_add_qml_module(%1 URI "Main" VERSION 1.0 + RESOURCE_PREFIX "/qt/qml" NO_PLUGIN QML_FILES main.qml ) From 6fcbc7dd9641ec6de212964f848ffc104ebfa536 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 21 Jun 2023 15:53:42 +0300 Subject: [PATCH 092/149] QmlDesigner: Fix QT_NO_SSL build Change-Id: I313231142115acd00e9076df1e551c65490f8c48 Reviewed-by: Mahmoud Badri Reviewed-by: Tim Jenssen Reviewed-by: Burak Hancerli Reviewed-by: --- src/plugins/qmldesigner/utils/filedownloader.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/utils/filedownloader.cpp b/src/plugins/qmldesigner/utils/filedownloader.cpp index 8b3bb63993e..38f0caeeb36 100644 --- a/src/plugins/qmldesigner/utils/filedownloader.cpp +++ b/src/plugins/qmldesigner/utils/filedownloader.cpp @@ -43,9 +43,14 @@ QNetworkRequest FileDownloader::makeRequest() const { QUrl url = m_url; - if (url.scheme() == "https" && !QSslSocket::supportsSsl()) { - qWarning() << "SSL is not available. HTTP will be used instead of HTTPS."; - url.setScheme("http"); + if (url.scheme() == "https") { +#ifndef QT_NO_SSL + if (!QSslSocket::supportsSsl()) +#endif + { + qWarning() << "SSL is not available. HTTP will be used instead of HTTPS."; + url.setScheme("http"); + } } auto request = QNetworkRequest(url); From d8c8a005c30c5c2932f985409b3bd4ffe84f3110 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 21 Jun 2023 10:04:21 +0200 Subject: [PATCH 093/149] Doc: Fix links to restructured I18N documentation Some titles were changed in Qt 6.5. Change-Id: Ie3fa9bbe8ddf9453b615868016411e0938f79834 Reviewed-by: Mats Honkamaa --- doc/qtdesignstudio/examples/doc/loginui1.qdoc | 3 +-- doc/qtdesignstudio/src/components/qtquick-text.qdoc | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/doc/qtdesignstudio/examples/doc/loginui1.qdoc b/doc/qtdesignstudio/examples/doc/loginui1.qdoc index c10c118fdd6..afb7c50556e 100644 --- a/doc/qtdesignstudio/examples/doc/loginui1.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui1.qdoc @@ -275,8 +275,7 @@ \li In \uicontrol Component > \uicontrol ID, enter \e username. \li In \uicontrol {Button Content} > \uicontrol Text, enter \e {Username or Email} and select \uicontrol tr to mark the text - \l {Internationalization and Localization with Qt Quick} - {translatable}. + \l {Mark Strings for Translation}{translatable}. \li Select the second EntryField instance, and change its ID to \e password and text to \e Password. Again, mark the text translatable. diff --git a/doc/qtdesignstudio/src/components/qtquick-text.qdoc b/doc/qtdesignstudio/src/components/qtquick-text.qdoc index f47ac82d7bd..0bb541f1c31 100644 --- a/doc/qtdesignstudio/src/components/qtquick-text.qdoc +++ b/doc/qtdesignstudio/src/components/qtquick-text.qdoc @@ -69,15 +69,13 @@ \c qsTrId(). Select \uicontrol Edit > \uicontrol Preferences > \uicontrol {Qt Quick} > \uicontrol {Qt Quick Designer}, and then select the \uicontrol {qsTrId()} radio button in the \uicontrol Internationalization - group. For more information about text ID based translations, see - \l {Qt Linguist Manual: Text ID Based Translations}. + group. For more information, see \l {Text ID based translations}. To preserve the context when editing the text or to change the context by setting a binding on the text property, change the default call to \c qsTranslate() by selecting the \uicontrol {qsTranslate()} radio button. - For more information, see - \l {Internationalization and Localization with Qt Quick}. + For more information, see \l {Mark Strings for Translation}. \section1 Character Properties From fc4138d491e2cfbe6c386e17bca9f6dee7d1bc13 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 9 Jun 2023 18:45:57 +0200 Subject: [PATCH 094/149] QmlDesigner: Add metaInfo to modelutils.h This simplifies the API to retrieve a PropertyMetaInfo. Change-Id: I937485a573c2149c7bd514cc0317c2b6014eba81 Reviewed-by: Marco Bubke Reviewed-by: --- .../qmldesigner/designercore/model/modelutils.cpp | 12 ++++++++++++ .../qmldesigner/designercore/model/modelutils.h | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/model/modelutils.cpp b/src/plugins/qmldesigner/designercore/model/modelutils.cpp index 2e454527b88..8c04c201797 100644 --- a/src/plugins/qmldesigner/designercore/model/modelutils.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelutils.cpp @@ -3,6 +3,8 @@ #include "modelutils.h" +#include + #include #include @@ -90,4 +92,14 @@ bool addImportsWithCheck(const QStringList &importNames, return true; } +PropertyMetaInfo metainfo(const AbstractProperty &property) +{ + return metainfo(property.parentModelNode(), property.name()); +} + +PropertyMetaInfo metainfo(const ModelNode &node, const PropertyName &propertyName) +{ + return node.metaInfo().property(propertyName); +} + } // namespace QmlDesigner::Utils diff --git a/src/plugins/qmldesigner/designercore/model/modelutils.h b/src/plugins/qmldesigner/designercore/model/modelutils.h index 58055f39065..5cbeb7e5ec0 100644 --- a/src/plugins/qmldesigner/designercore/model/modelutils.h +++ b/src/plugins/qmldesigner/designercore/model/modelutils.h @@ -10,6 +10,10 @@ #include +namespace QmlDesigner { +class PropertyMetaInfo; +} + namespace QmlDesigner::Utils { QMLDESIGNERCORE_EXPORT bool addImportsWithCheck(const QStringList &importNames, @@ -21,4 +25,8 @@ QMLDESIGNERCORE_EXPORT bool addImportWithCheck(const QString &importName, Model *model); QMLDESIGNERCORE_EXPORT bool addImportWithCheck(const QString &importName, Model *model); +QMLDESIGNERCORE_EXPORT PropertyMetaInfo metainfo(const AbstractProperty &property); +QMLDESIGNERCORE_EXPORT PropertyMetaInfo metainfo(const ModelNode &node, + const PropertyName &propertyName); + } // namespace QmlDesigner::Utils From c5117d0de1f69a29a283d4a841b42b412411cabc Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 21 Jun 2023 16:24:57 +0200 Subject: [PATCH 095/149] QmlDesigner: Rename QmlDesigner::Utils to QmlDesigner::ModelUtils Change-Id: Ie586482c49e84660cb725f4581fd9413e42f80a8 Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Marco Bubke --- src/plugins/qmldesigner/components/edit3d/edit3dview.cpp | 2 +- .../components/itemlibrary/itemlibraryassetimporter.cpp | 2 +- .../qmldesigner/components/itemlibrary/itemlibrarywidget.cpp | 2 +- .../qmldesigner/components/navigator/navigatortreemodel.cpp | 2 +- src/plugins/qmldesigner/designercore/model/modelutils.cpp | 4 ++-- src/plugins/qmldesigner/designercore/model/modelutils.h | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 10d62a5dc21..0d30617396a 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -922,7 +922,7 @@ void Edit3DView::addQuick3DImport() { DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); if (document && !document->inFileComponentModelActive() && model() - && Utils::addImportWithCheck( + && ModelUtils::addImportWithCheck( "QtQuick3D", [](const Import &import) { return !import.hasVersion() || import.majorVersion() >= 6; }, model())) { diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index c535e78c129..99f07cb8a8a 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -709,7 +709,7 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport() try { RewriterTransaction transaction = model->rewriterView()->beginRewriterTransaction( QByteArrayLiteral("ItemLibraryAssetImporter::finalizeQuick3DImport")); - bool success = Utils::addImportsWithCheck(m_requiredImports, model); + bool success = ModelUtils::addImportsWithCheck(m_requiredImports, model); if (!success) addError(tr("Failed to insert import statement into qml document.")); transaction.commit(); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 2fab06dea89..1cbde45ba0b 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -82,7 +82,7 @@ bool ItemLibraryWidget::eventFilter(QObject *obj, QEvent *event) // For drag to be handled correctly, we must have the component properly imported // beforehand, so we import the module immediately when the drag starts if (!entry.requiredImport().isEmpty() - && !Utils::addImportWithCheck(entry.requiredImport(), m_model)) { + && !ModelUtils::addImportWithCheck(entry.requiredImport(), m_model)) { qWarning() << __FUNCTION__ << "Required import adding failed:" << entry.requiredImport(); } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 1dd628c2952..e7d116c61cf 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -885,7 +885,7 @@ ModelNode NavigatorTreeModel::handleItemLibraryFontDrop(const QString &fontFamil void NavigatorTreeModel::addImport(const QString &importName) { - if (!Utils::addImportWithCheck(importName, m_view->model())) + if (!ModelUtils::addImportWithCheck(importName, m_view->model())) qWarning() << __FUNCTION__ << "Adding import failed:" << importName; } diff --git a/src/plugins/qmldesigner/designercore/model/modelutils.cpp b/src/plugins/qmldesigner/designercore/model/modelutils.cpp index 8c04c201797..70da6f98b9c 100644 --- a/src/plugins/qmldesigner/designercore/model/modelutils.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelutils.cpp @@ -9,7 +9,7 @@ #include -namespace QmlDesigner::Utils { +namespace QmlDesigner::ModelUtils { namespace { @@ -102,4 +102,4 @@ PropertyMetaInfo metainfo(const ModelNode &node, const PropertyName &propertyNam return node.metaInfo().property(propertyName); } -} // namespace QmlDesigner::Utils +} // namespace QmlDesigner::ModelUtils diff --git a/src/plugins/qmldesigner/designercore/model/modelutils.h b/src/plugins/qmldesigner/designercore/model/modelutils.h index 5cbeb7e5ec0..578a7adb444 100644 --- a/src/plugins/qmldesigner/designercore/model/modelutils.h +++ b/src/plugins/qmldesigner/designercore/model/modelutils.h @@ -14,7 +14,7 @@ namespace QmlDesigner { class PropertyMetaInfo; } -namespace QmlDesigner::Utils { +namespace QmlDesigner::ModelUtils { QMLDESIGNERCORE_EXPORT bool addImportsWithCheck(const QStringList &importNames, const std::function &predicate, @@ -29,4 +29,4 @@ QMLDESIGNERCORE_EXPORT PropertyMetaInfo metainfo(const AbstractProperty &propert QMLDESIGNERCORE_EXPORT PropertyMetaInfo metainfo(const ModelNode &node, const PropertyName &propertyName); -} // namespace QmlDesigner::Utils +} // namespace QmlDesigner::ModelUtils From cfafb36fbd0ae7b8a2b6e2a0cbe68723065ceb3d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 9 Jun 2023 18:47:13 +0200 Subject: [PATCH 096/149] QmlDesigner: Move isArray to MetaInfo API Change-Id: I7e011d2529e0f940295845c4e259234b05690536 Reviewed-by: Thomas Hartmann --- .../designercore/model/texttomodelmerger.cpp | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 9f9c200ecfb..8ff4c19d66c 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -586,25 +586,9 @@ public: return true; } - bool isArrayProperty(const Value *value, const ObjectValue *containingObject, const QString &name) + bool isArrayProperty(const AbstractProperty &property) { - if (!value) - return false; - const ObjectValue *objectValue = value->asObjectValue(); - if (objectValue && objectValue->prototype(m_context) == m_context->valueOwner()->arrayPrototype()) - return true; - - PrototypeIterator iter(containingObject, m_context); - while (iter.hasNext()) { - const ObjectValue *proto = iter.next(); - if (proto->lookupMember(name, m_context) == m_context->valueOwner()->arrayPrototype()) - return true; - if (const CppComponentValue *qmlIter = value_cast(proto)) { - if (qmlIter->isListProperty(name)) - return true; - } - } - return false; + return ModelUtils::metainfo(property).isListProperty(); } QVariant convertToVariant(const ModelNode &node, @@ -1328,7 +1312,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, || isPropertyChangesType(typeName) || isConnectionsType(typeName)) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); - if (context->isArrayProperty(propertyType, containingObject, name)) + if (context->isArrayProperty(modelProperty)) syncArrayProperty(modelProperty, {member}, context, differenceHandler); else syncNodeProperty(modelProperty, binding, context, TypeName(), differenceHandler); From 5eeae78fc9bfc70e0f97ff7ed0df0f9d99e3488f Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 16 Jun 2023 13:26:57 +0300 Subject: [PATCH 097/149] QmlDesigner: Allow copying text from bake lights progress dialog Fixes: QDS-10052 Change-Id: I6ca030f71c76d4153a715d4e74e9a0a6d6a127a2 Reviewed-by: Reviewed-by: Mahmoud Badri Reviewed-by: Ali Kianian --- .../qmldesigner/edit3dQmlSource/BakeLightsProgressDialog.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/qmldesigner/edit3dQmlSource/BakeLightsProgressDialog.qml b/share/qtcreator/qmldesigner/edit3dQmlSource/BakeLightsProgressDialog.qml index 18494d5f327..259a0a1ab59 100644 --- a/share/qtcreator/qmldesigner/edit3dQmlSource/BakeLightsProgressDialog.qml +++ b/share/qtcreator/qmldesigner/edit3dQmlSource/BakeLightsProgressDialog.qml @@ -63,11 +63,14 @@ Rectangle { } } - Text { + TextEdit { id: progressText width: scrollView.width font.pixelSize: StudioTheme.Values.myFontSize color: StudioTheme.Values.themeTextColor + readOnly: true + selectByMouse: true + selectByKeyboard: true } function ensureVisible() From 31895b55c81fb733110a2c5f05fd7478404d99db Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 9 Jun 2023 18:48:02 +0200 Subject: [PATCH 098/149] QmlDesigner: Remove unused reference parameter Change-Id: I28b835c9c2e0c687a9f2a8549a7ded4ddcaa5257 Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 8ff4c19d66c..cc31e551592 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1307,10 +1307,11 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, } else { const Value *propertyType = nullptr; const ObjectValue *containingObject = nullptr; - QString name; - if (context->lookupProperty(QString(), binding->qualifiedId, &propertyType, &containingObject, &name) - || isPropertyChangesType(typeName) - || isConnectionsType(typeName)) { + if (context->lookupProperty({}, + binding->qualifiedId, + &propertyType, + &containingObject) + || isPropertyChangesType(typeName) || isConnectionsType(typeName)) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); if (context->isArrayProperty(modelProperty)) syncArrayProperty(modelProperty, {member}, context, differenceHandler); From bc3a8201ad744de800b38753ee54d380057985d8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 22 Jun 2023 10:17:40 +0200 Subject: [PATCH 099/149] QmlDesigner: Fix build Change-Id: I8ae0671c43b0ea2662513b714e5343e6a29d248e Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index cc31e551592..3108e26a618 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -12,6 +12,7 @@ #include "itemlibraryinfo.h" #include "metainfo.h" #include "modelnodepositionstorage.h" +#include "modelutils.h" #include "nodemetainfo.h" #include "nodeproperty.h" #include "propertyparser.h" From d066a848fbae64ba7cd033244c75eda2bd186893 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 15 Jun 2023 16:56:02 +0300 Subject: [PATCH 100/149] QmlDesigner: Make particle seeker slider follow action enable state Slider widget for particle seeker is recreated whenever slider changes between being shown on the toolbar and being moved behind the extension button. However, the widget shown in the extension menu didn't follow action's enabled state. Fixed by making the slider's enabled state explicitly follow the associated action's enabled state. Fixes: QDS-10057 Change-Id: Ie5f14d0072bab0a1c0b396c0589d39758990acef Reviewed-by: Ali Kianian Reviewed-by: Mahmoud Badri Reviewed-by: --- src/plugins/qmldesigner/components/formeditor/seekerslider.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmldesigner/components/formeditor/seekerslider.cpp b/src/plugins/qmldesigner/components/formeditor/seekerslider.cpp index 804f061657a..a6bfd25873f 100644 --- a/src/plugins/qmldesigner/components/formeditor/seekerslider.cpp +++ b/src/plugins/qmldesigner/components/formeditor/seekerslider.cpp @@ -97,9 +97,11 @@ QWidget *SeekerSliderAction::createWidget(QWidget *parent) QObject::connect(m_defaultSlider, &SeekerSlider::valueChanged, slider, &SeekerSlider::setValue); QObject::connect(slider, &SeekerSlider::valueChanged, m_defaultSlider, &SeekerSlider::setValue); QObject::connect(m_defaultSlider, &QSlider::rangeChanged, slider, &QSlider::setRange); + QObject::connect(this, &QWidgetAction::enabledChanged, slider, &QSlider::setEnabled); slider->setValue(m_defaultSlider->value()); slider->setMaxValue(m_defaultSlider->maxValue()); + slider->setEnabled(isEnabled()); return slider; } From f68fe887f06368442399b56e138074043c27532b Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 12 Jun 2023 13:32:44 +0300 Subject: [PATCH 101/149] QmlDesigner: Align camera buttons work on any camera on scene It's no longer necessary to select camera to be able to align it. Targeted camera is selected according to this priority list: - Selected camera - Previously selected camera - Camera explicitly set as the camera for View3D of the scene - Any camera Fixes: QDS-10045 Change-Id: I3eedc92b7523e77ed5bc52f116ef83b4fe599b35 Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Mahmoud Badri --- .../components/edit3d/edit3dactions.cpp | 19 ----- .../components/edit3d/edit3dactions.h | 17 ----- .../components/edit3d/edit3dview.cpp | 53 ++++++++++---- .../components/edit3d/edit3dview.h | 15 ++-- .../components/edit3d/edit3dwidget.cpp | 7 +- .../qml2puppet/mockfiles/qt5/EditView3D.qml | 12 ++-- .../qml2puppet/mockfiles/qt6/EditView3D.qml | 12 ++-- .../instances/nodeinstanceserver.cpp | 15 ++++ .../qml2puppet/instances/nodeinstanceserver.h | 1 + .../qt5informationnodeinstanceserver.cpp | 72 +++++++++++++++++-- .../qt5informationnodeinstanceserver.h | 4 ++ 11 files changed, 151 insertions(+), 76 deletions(-) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dactions.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dactions.cpp index 12d2dd05528..4ffdf0e801c 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dactions.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dactions.cpp @@ -98,25 +98,6 @@ bool Edit3DAction::isEnabled(const SelectionContext &selectionContext) const return isVisible(selectionContext); } -Edit3DCameraAction::Edit3DCameraAction(const QByteArray &menuId, - View3DActionType type, - const QString &description, - const QKeySequence &key, - bool checkable, - bool checked, - const QIcon &icon, - Edit3DView *view, - SelectionContextOperation selectionAction) - : Edit3DAction(menuId, type, description, key, checkable, checked, icon, view, selectionAction) -{ -} - -bool Edit3DCameraAction::isEnabled(const SelectionContext &selectionContext) const -{ - return Utils::anyOf(selectionContext.selectedModelNodes(), - [](const ModelNode &node) { return node.metaInfo().isQtQuick3DCamera(); }); -} - Edit3DParticleSeekerAction::Edit3DParticleSeekerAction(const QByteArray &menuId, View3DActionType type, Edit3DView *view) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dactions.h b/src/plugins/qmldesigner/components/edit3d/edit3dactions.h index 4e8be202b9f..cd4e2be7732 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dactions.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dactions.h @@ -88,23 +88,6 @@ private: View3DActionType m_actionType; }; -class Edit3DCameraAction : public Edit3DAction -{ -public: - Edit3DCameraAction(const QByteArray &menuId, - View3DActionType type, - const QString &description, - const QKeySequence &key, - bool checkable, - bool checked, - const QIcon &icon, - Edit3DView *view, - SelectionContextOperation selectionAction = nullptr); - -protected: - bool isEnabled(const SelectionContext &selectionContext) const override; -}; - class Edit3DParticleSeekerAction : public Edit3DAction { public: diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 0d30617396a..7376fb323f0 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -106,17 +106,6 @@ Edit3DWidget *Edit3DView::edit3DWidget() const return m_edit3DWidget.data(); } -void Edit3DView::selectedNodesChanged([[maybe_unused]] const QList &selectedNodeList, - [[maybe_unused]] const QList &lastSelectedNodeList) -{ - SelectionContext selectionContext(this); - selectionContext.setUpdateMode(SelectionContext::UpdateMode::Fast); - if (m_alignCamerasAction) - m_alignCamerasAction->currentContextChanged(selectionContext); - if (m_alignViewAction) - m_alignViewAction->currentContextChanged(selectionContext); -} - void Edit3DView::renderImage3DChanged(const QImage &img) { edit3DWidget()->canvas()->updateRenderImage(img); @@ -149,6 +138,7 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) qint32 newActiveScene = sceneState[sceneKey].value(); edit3DWidget()->canvas()->updateActiveScene(newActiveScene); model()->setActive3DSceneId(newActiveScene); + updateAlignActionStates(); } if (sceneState.contains(selectKey)) @@ -298,6 +288,22 @@ void Edit3DView::handleEntriesChanged() m_edit3DWidget->updateCreateSubMenu(entriesMap.values()); } +void Edit3DView::updateAlignActionStates() +{ + bool enabled = false; + + ModelNode activeScene = active3DSceneNode(); + if (activeScene.isValid()) { + const QList nodes = activeScene.allSubModelNodes(); + enabled = ::Utils::anyOf(nodes, [](const ModelNode &node) { + return node.metaInfo().isQtQuick3DCamera(); + }); + } + + m_alignCamerasAction->action()->setEnabled(enabled); + m_alignViewAction->action()->setEnabled(enabled); +} + void Edit3DView::modelAboutToBeDetached(Model *model) { m_isBakingLightsSupported = false; @@ -377,6 +383,21 @@ void Edit3DView::nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos m_nodeAtPosReqType = NodeAtPosReqType::None; } +void Edit3DView::nodeReparented(const ModelNode &, + const NodeAbstractProperty &, + const NodeAbstractProperty &, + PropertyChangeFlags) +{ + updateAlignActionStates(); +} + +void Edit3DView::nodeRemoved(const ModelNode &, + const NodeAbstractProperty &, + PropertyChangeFlags) +{ + updateAlignActionStates(); +} + void Edit3DView::sendInputEvent(QInputEvent *e) const { if (nodeInstanceView()) @@ -581,25 +602,27 @@ void Edit3DView::createEdit3DActions() toolbarIcon(Theme::fitToView_medium), this); - m_alignCamerasAction = new Edit3DCameraAction( + m_alignCamerasAction = new Edit3DAction( QmlDesigner::Constants::EDIT3D_ALIGN_CAMERAS, View3DActionType::AlignCamerasToView, - QCoreApplication::translate("AlignCamerasToViewAction", "Align Selected Cameras to View"), + QCoreApplication::translate("AlignCamerasToViewAction", "Align Cameras to View"), QKeySequence(), false, false, toolbarIcon(Theme::alignToCam_medium), this); + m_alignCamerasAction->action()->setEnabled(false); - m_alignViewAction = new Edit3DCameraAction( + m_alignViewAction = new Edit3DAction( QmlDesigner::Constants::EDIT3D_ALIGN_VIEW, View3DActionType::AlignViewToCamera, - QCoreApplication::translate("AlignCamerasToViewAction", "Align View to Selected Camera"), + QCoreApplication::translate("AlignCamerasToViewAction", "Align View to Camera"), QKeySequence(), false, false, toolbarIcon(Theme::alignToView_medium), this); + m_alignViewAction->action()->setEnabled(false); m_cameraModeAction = new Edit3DAction( QmlDesigner::Constants::EDIT3D_EDIT_CAMERA, diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index cd3e686d3bb..1c6851dabcc 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -26,7 +26,6 @@ class BakeLights; class Edit3DWidget; class Edit3DAction; class Edit3DBakeLightsAction; -class Edit3DCameraAction; class QMLDESIGNERCOMPONENTS_EXPORT Edit3DView : public AbstractView { @@ -39,14 +38,19 @@ public: Edit3DWidget *edit3DWidget() const; - void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) override; void renderImage3DChanged(const QImage &img) override; void updateActiveScene3D(const QVariantMap &sceneState) override; void modelAttached(Model *model) override; void modelAboutToBeDetached(Model *model) override; void importsChanged(const Imports &addedImports, const Imports &removedImports) override; - void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data) override; + void customNotification(const AbstractView *view, const QString &identifier, + const QList &nodeList, const QList &data) override; void nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos3d) override; + void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, + const NodeAbstractProperty &oldPropertyParent, + PropertyChangeFlags propertyChange) override; + void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, + PropertyChangeFlags propertyChange) override; void sendInputEvent(QInputEvent *e) const; void edit3DViewResized(const QSize &size) const; @@ -91,6 +95,7 @@ private: void checkImports(); void handleEntriesChanged(); void showMaterialPropertiesView(); + void updateAlignActionStates(); Edit3DAction *createSelectBackgroundColorAction(QAction *syncBackgroundColorAction); Edit3DAction *createGridColorSelectionAction(); @@ -110,8 +115,8 @@ private: Edit3DAction *m_rotateToolAction = nullptr; Edit3DAction *m_scaleToolAction = nullptr; Edit3DAction *m_fitAction = nullptr; - Edit3DCameraAction *m_alignCamerasAction = nullptr; - Edit3DCameraAction *m_alignViewAction = nullptr; + Edit3DAction *m_alignCamerasAction = nullptr; + Edit3DAction *m_alignViewAction = nullptr; Edit3DAction *m_cameraModeAction = nullptr; Edit3DAction *m_orientationModeAction = nullptr; Edit3DAction *m_editLightAction = nullptr; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 16d5a60fde7..f050b40c3ce 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -474,9 +474,8 @@ void Edit3DWidget::showContextMenu(const QPoint &pos, const ModelNode &modelNode m_contextMenuTarget = modelNode; m_contextMenuPos3d = pos3d; - const bool isValid = modelNode.isValid(); const bool isModel = modelNode.metaInfo().isQtQuick3DModel(); - const bool isCamera = isValid && modelNode.metaInfo().isQtQuick3DCamera(); + const bool allowAlign = view()->edit3DAction(View3DActionType::AlignCamerasToView)->action()->isEnabled(); const bool isSingleComponent = view()->hasSingleSelectedModelNode() && modelNode.isComponent(); const bool anyNodeSelected = view()->hasSelectedModelNodes(); const bool selectionExcludingRoot = anyNodeSelected && !view()->rootModelNode().isSelected(); @@ -491,8 +490,8 @@ void Edit3DWidget::showContextMenu(const QPoint &pos, const ModelNode &modelNode m_pasteAction->setEnabled(isPasteAvailable()); m_deleteAction->setEnabled(selectionExcludingRoot); m_fitSelectedAction->setEnabled(anyNodeSelected); - m_alignCameraAction->setEnabled(isCamera); - m_alignViewAction->setEnabled(isCamera); + m_alignCameraAction->setEnabled(allowAlign); + m_alignViewAction->setEnabled(allowAlign); m_selectParentAction->setEnabled(selectionExcludingRoot); m_toggleGroupAction->setEnabled(true); m_bakeLightsAction->setVisible(view()->bakeLightsAction()->action()->isVisible()); diff --git a/src/tools/qml2puppet/mockfiles/qt5/EditView3D.qml b/src/tools/qml2puppet/mockfiles/qt5/EditView3D.qml index bc8ef4e46b7..1860e70efb4 100644 --- a/src/tools/qml2puppet/mockfiles/qt5/EditView3D.qml +++ b/src/tools/qml2puppet/mockfiles/qt5/EditView3D.qml @@ -181,20 +181,20 @@ Item { } } - function alignCamerasToView() + function alignCamerasToView(cameraNodes) { if (editView) { - cameraControl.alignCameras(selectedNodes); + cameraControl.alignCameras(cameraNodes); var propertyNames = ["position", "eulerRotation"]; - viewRoot.changeObjectProperty(selectedNodes, propertyNames); - viewRoot.commitObjectProperty(selectedNodes, propertyNames); + viewRoot.changeObjectProperty(cameraNodes, propertyNames); + viewRoot.commitObjectProperty(cameraNodes, propertyNames); } } - function alignViewToCamera() + function alignViewToCamera(cameraNodes) { if (editView) - cameraControl.alignView(selectedNodes); + cameraControl.alignView(cameraNodes); } function updateViewStates(viewStates) diff --git a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml index fad4ae822f5..964f47941bf 100644 --- a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml +++ b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml @@ -175,20 +175,20 @@ Item { } } - function alignCamerasToView() + function alignCamerasToView(cameraNodes) { if (editView) { - cameraControl.alignCameras(selectedNodes); + cameraControl.alignCameras(cameraNodes); var propertyNames = ["position", "eulerRotation"]; - viewRoot.changeObjectProperty(selectedNodes, propertyNames); - viewRoot.commitObjectProperty(selectedNodes, propertyNames); + viewRoot.changeObjectProperty(cameraNodes, propertyNames); + viewRoot.commitObjectProperty(cameraNodes, propertyNames); } } - function alignViewToCamera() + function alignViewToCamera(cameraNodes) { if (editView) - cameraControl.alignView(selectedNodes); + cameraControl.alignView(cameraNodes); } function updateViewStates(viewStates) diff --git a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp index 3007db7af45..3d6445e2404 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1058,6 +1058,21 @@ QList NodeInstanceServer::allView3DInstances() const return view3Ds; } +QList NodeInstanceServer::allCameraInstances() const +{ + QList cameras; + std::copy_if(nodeInstances().cbegin(), + nodeInstances().cend(), + std::back_inserter(cameras), + [](const ServerNodeInstance &instance) { + return instance.isValid() + && ServerNodeInstance::isSubclassOf(instance.internalObject(), + QByteArrayLiteral("QQuick3DCamera")); + }); + + return cameras; +} + void NodeInstanceServer::setStateInstance(const ServerNodeInstance &stateInstance) { m_activeStateInstance = stateInstance; diff --git a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h index 0fed4790baf..f4eee1e8745 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h +++ b/src/tools/qml2puppet/qml2puppet/instances/nodeinstanceserver.h @@ -180,6 +180,7 @@ public: QList allGroupStateInstances() const; QList allView3DInstances() const; + QList allCameraInstances() const; void notifyPropertyChange(qint32 instanceid, const PropertyName &propertyName); diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 2f3747ef212..b4c47a0a2a9 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -951,6 +951,18 @@ void Qt5InformationNodeInstanceServer::removeNode3D(QObject *node) m_active3DView = nullptr; updateActiveSceneToEditView3D(); } + if (m_selectedCameras.contains(node)) { + m_selectedCameras.remove(node); + } else { + auto cit = m_selectedCameras.constBegin(); + while (cit != m_selectedCameras.constEnd()) { + if (cit.value().contains(node)) { + m_selectedCameras[cit.key()].removeOne(node); + break; + } + ++cit; + } + } } void Qt5InformationNodeInstanceServer::resolveSceneRoots() @@ -2184,6 +2196,7 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm QVariantList selectedObjs; QObject *firstSceneRoot = nullptr; ServerNodeInstance firstInstance; + QObjectList selectedCameras; #ifdef QUICK3D_PARTICLES_MODULE QList selectedParticleSystems; #endif @@ -2226,15 +2239,20 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm if (node) { const auto childItems = node->childItems(); for (const auto &childItem : childItems) { - if (qobject_cast(childItem) && !hasInstanceForObject(childItem)) + if (qobject_cast(childItem)) return true; } } #endif return false; }; - if (object && (firstSceneRoot != object || isSelectableAsRoot())) + if (object && (firstSceneRoot != object || isSelectableAsRoot())) { selectedObjs << objectToVariant(object); +#ifdef QUICK3D_MODULE + if (qobject_cast(object)) + selectedCameras << object; +#endif + } } } @@ -2252,6 +2270,11 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm updateActiveSceneToEditView3D(); } + // Only update selected cameras if there are cameras in selection. + // This way m_selectedCameras retains previous camera selection. + if (!selectedCameras.isEmpty()) + m_selectedCameras.insert(m_active3DScene, selectedCameras); + // Ensure the UI has enough selection box items. If it doesn't yet have them, which can be the // case when the first selection processed is a multiselection, we wait a bit as // using the new boxes immediately leads to visual glitches. @@ -2308,6 +2331,45 @@ void Qt5InformationNodeInstanceServer::setSceneEnvironmentColor(const PropertyVa #endif } +// Returns list of camera objects to align +// If m_selectedCameras contains cameras, return those +// If no cameras have been selected yet, return camera associated with current view3D, if any +// If scene is not View3D scene, return first camera in the scene +QVariantList Qt5InformationNodeInstanceServer::alignCameraList() const +{ +#ifdef QUICK3D_MODULE + QVariantList cameras; + if (m_selectedCameras.contains(m_active3DScene)) { + const QObjectList cameraList = m_selectedCameras[m_active3DScene]; + for (const auto camera : cameraList) { + if (hasInstanceForObject(camera) && find3DSceneRoot(camera) == m_active3DScene) + cameras.append(objectToVariant(camera)); + } + } + + if (cameras.isEmpty()) { + if (auto activeView = qobject_cast(m_active3DView)) { + if (auto camera = activeView->camera()) { + if (hasInstanceForObject(camera) && find3DSceneRoot(camera) == m_active3DScene) + cameras.append(objectToVariant(camera)); + } + } + } + + if (cameras.isEmpty()) { + const QList allCameras = allCameraInstances(); + for (const auto &camera : allCameras) { + if (find3DSceneRoot(camera) == m_active3DScene) { + cameras.append(objectToVariant(camera.internalObject())); + break; + } + } + } + + return cameras; +#endif +} + void Qt5InformationNodeInstanceServer::changePropertyValues(const ChangeValuesCommand &command) { bool hasDynamicProperties = false; @@ -2386,10 +2448,12 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c QMetaObject::invokeMethod(m_editView3DData.rootItem, "fitToView"); break; case View3DActionType::AlignCamerasToView: - QMetaObject::invokeMethod(m_editView3DData.rootItem, "alignCamerasToView"); + QMetaObject::invokeMethod(m_editView3DData.rootItem, "alignCamerasToView", + Q_ARG(QVariant, alignCameraList())); break; case View3DActionType::AlignViewToCamera: - QMetaObject::invokeMethod(m_editView3DData.rootItem, "alignViewToCamera"); + QMetaObject::invokeMethod(m_editView3DData.rootItem, "alignViewToCamera", + Q_ARG(QVariant, alignCameraList())); break; case View3DActionType::SelectionModeToggle: updatedToolState.insert("selectionMode", command.isEnabled() ? 1 : 0); diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index c8b6c1c2507..8d02b586c20 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -135,6 +135,7 @@ private: void handleParticleSystemDeselected(); #endif void setSceneEnvironmentColor(const PropertyValueContainer &container); + QVariantList alignCameraList() const; RenderViewData m_editView3DData; RenderViewData m_modelNode3DImageViewData; @@ -172,6 +173,9 @@ private: int m_need3DEditViewRender = 0; QSet m_dynamicObjectConstructors; + // Current or previous camera selections for each scene + QHash m_selectedCameras; // key: scene root, value: camera node + struct PreviewData { QString env; QString envValue; From aef755bc16c919437230eede3ac93fc55ca62c2c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 22 Jun 2023 11:10:19 +0300 Subject: [PATCH 102/149] QmlDesigner: Make import button default in 3d asset import dialog Fixes: QDS-10120 Change-Id: I65c7ec53ef7b8e74e7851aee301e5a95e25115b9 Reviewed-by: Mahmoud Badri --- .../components/itemlibrary/itemlibraryassetimportdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp index 91f403f218a..f8a9fd97718 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp @@ -109,7 +109,7 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog( connect(ui->buttonBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, this, &ItemLibraryAssetImportDialog::onImport); - ui->buttonBox->button(QDialogButtonBox::Close)->setDefault(true); + ui->buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); ui->advancedSettingsButton->setStyleSheet( "QPushButton#advancedSettingsButton {background-color: transparent}"); From 44565bc39ba06a7daace1619289e60db7f9c99a7 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 21 Jun 2023 15:49:38 +0200 Subject: [PATCH 103/149] GoogleTest: Hard wire google tests There were problems with older google test versions which were found instead. Now the google test version is always the same and there cannot be "strange" compile bugs. Change-Id: Ib3dc74d1abbe369fb37a4ee5616011d8e3696c01 Reviewed-by: Qt CI Bot Reviewed-by: Eike Ziller --- .gitmodules | 2 +- cmake/FindGoogletest.cmake | 104 ------------------ {tests/unit => src/libs}/3rdparty/googletest | 0 src/libs/CMakeLists.txt | 4 + src/libs/googletest/CMakeLists.txt | 29 +++++ src/plugins/mcusupport/test/CMakeLists.txt | 21 ++-- .../qml/qmldesigner/wizard/CMakeLists.txt | 3 +- tests/unit/CMakeLists.txt | 11 +- 8 files changed, 44 insertions(+), 130 deletions(-) delete mode 100644 cmake/FindGoogletest.cmake rename {tests/unit => src/libs}/3rdparty/googletest (100%) create mode 100644 src/libs/googletest/CMakeLists.txt diff --git a/.gitmodules b/.gitmodules index 024b61baedd..45d62de0644 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,5 +10,5 @@ path = src/libs/qlitehtml url = https://code.qt.io/playground/qlitehtml.git [submodule "googletest"] - path = tests/unit/3rdparty/googletest + path = src/libs/3rdparty/googletest url = https://github.com/google/googletest.git diff --git a/cmake/FindGoogletest.cmake b/cmake/FindGoogletest.cmake deleted file mode 100644 index 3e3c113b463..00000000000 --- a/cmake/FindGoogletest.cmake +++ /dev/null @@ -1,104 +0,0 @@ -#.rst: -# FindGoogletest -# ----------------- -# -# Try to locate the Googletest source files, and then build them as a -# static library. -# -# The ``GOOGLETEST_DIR`` (CMake or Environment) variable should be used -# to pinpoint the Googletest source files. -# -# If found, this will define the following variables: -# -# ``Googletest_FOUND`` -# True if the Googletest source package has been found. -# -# ``Googletest`` -# Target compiled as static library. -# - -find_path(GOOGLE_TEST_INCLUDE_DIR - NAMES gtest/gtest.h - PATH_SUFFIXES googletest/include - HINTS - "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR - "${PROJECT_SOURCE_DIR}/tests/unit/3rdparty/googletest" -) - -find_path(GOOGLE_TEST_SRC_ALL - NAMES gtest-all.cc - PATH_SUFFIXES googletest/src - HINTS - "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR - "${PROJECT_SOURCE_DIR}/tests/unit/3rdparty/googletest" -) - - -find_path(GOOGLE_MOCK_INCLUDE_DIR - NAMES gmock/gmock.h - PATH_SUFFIXES googlemock/include - HINTS - "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR - "${PROJECT_SOURCE_DIR}/tests/unit/3rdparty/googletest" -) - -find_path(GOOGLE_MOCK_SRC_ALL - NAMES gmock-all.cc - PATH_SUFFIXES googlemock/src - HINTS - "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR - "${PROJECT_SOURCE_DIR}/tests/unit/3rdparty/googletest" -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Googletest - DEFAULT_MSG - GOOGLE_TEST_INCLUDE_DIR GOOGLE_MOCK_INCLUDE_DIR - GOOGLE_TEST_SRC_ALL GOOGLE_MOCK_SRC_ALL -) -find_package(Threads REQUIRED) - -if(Googletest_FOUND AND NOT TARGET Googletest) - add_library(Googletest STATIC - "${GOOGLE_TEST_SRC_ALL}/gtest-all.cc" - "${GOOGLE_MOCK_SRC_ALL}/gmock-all.cc" - ) - target_include_directories(Googletest - PUBLIC - "${GOOGLE_TEST_INCLUDE_DIR}" - "${GOOGLE_MOCK_INCLUDE_DIR}" - PRIVATE - "${GOOGLE_TEST_SRC_ALL}/.." - "${GOOGLE_MOCK_SRC_ALL}/.." - ) - target_compile_definitions(Googletest - PRIVATE - GTEST_HAS_STD_INITIALIZER_LIST_ - GTEST_LANG_CXX11 - GTEST_HAS_STD_TUPLE_ - GTEST_HAS_STD_TYPE_TRAITS_ - GTEST_HAS_STD_FUNCTION_ - GTEST_HAS_RTTI - GTEST_HAS_STD_BEGIN_AND_END_ - GTEST_HAS_STD_UNIQUE_PTR_ - GTEST_HAS_EXCEPTIONS - GTEST_HAS_STREAM_REDIRECTION - GTEST_HAS_TYPED_TEST - GTEST_HAS_TYPED_TEST_P - GTEST_HAS_PARAM_TEST - GTEST_HAS_DEATH_TEST - ) - set_target_properties(Googletest PROPERTIES AUTOMOC OFF AUTOUIC OFF QT_COMPILE_OPTIONS_DISABLE_WARNINGS ON) - set_property(TARGET Googletest PROPERTY POSITION_INDEPENDENT_CODE ON) - target_compile_definitions(Googletest PUBLIC GOOGLE_TEST_IS_FOUND) - - target_link_libraries(Googletest Threads::Threads) -endif() - -mark_as_advanced(GOOGLE_TEST_INCLUDE_DIR GOOGLE_MOCK_INCLUDE_DIR - GOOGLE_TEST_SRC_ALL GOOGLE_MOCK_SRC_ALL) - -include(FeatureSummary) -set_package_properties(Googletest PROPERTIES - URL "https://github.com/google/googletest" - DESCRIPTION "Google Testing and Mocking Framework") diff --git a/tests/unit/3rdparty/googletest b/src/libs/3rdparty/googletest similarity index 100% rename from tests/unit/3rdparty/googletest rename to src/libs/3rdparty/googletest diff --git a/src/libs/CMakeLists.txt b/src/libs/CMakeLists.txt index de2d2b01ef3..73a554bae8b 100644 --- a/src/libs/CMakeLists.txt +++ b/src/libs/CMakeLists.txt @@ -22,6 +22,10 @@ if (WITH_QMLDESIGNER) add_subdirectory(qmlpuppetcommunication) endif() +if (WITH_TESTS) + add_subdirectory(googletest) +endif() + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/qlitehtml/src/CMakeLists.txt) option(BUILD_LIBRARY_QLITEHTML "Build library qlitehtml." ${BUILD_LIBRARIES_BY_DEFAULT}) set(QLITEHTML_VERSION_COMPAT ${IDE_VERSION_COMPAT} CACHE STRING "") diff --git a/src/libs/googletest/CMakeLists.txt b/src/libs/googletest/CMakeLists.txt new file mode 100644 index 00000000000..c785323056b --- /dev/null +++ b/src/libs/googletest/CMakeLists.txt @@ -0,0 +1,29 @@ +set(GOOGLETEST_DIR ${CMAKE_CURRENT_LIST_DIR}/../3rdparty/googletest) + +if (EXISTS "${GOOGLETEST_DIR}/googletest") + add_library(Googletest STATIC + "${GOOGLETEST_DIR}/googletest/src/gtest-all.cc" + "${GOOGLETEST_DIR}/googlemock/src/gmock-all.cc" + ) + target_include_directories(Googletest + PUBLIC + "${GOOGLETEST_DIR}/googletest/include" + "${GOOGLETEST_DIR}/googlemock/include" + PRIVATE + "${GOOGLETEST_DIR}/googletest" + "${GOOGLETEST_DIR}/googlemock" + ) + set_target_properties(Googletest PROPERTIES AUTOMOC OFF AUTOUIC OFF QT_COMPILE_OPTIONS_DISABLE_WARNINGS ON) + set_property(TARGET Googletest PROPERTY POSITION_INDEPENDENT_CODE ON) + + target_link_libraries(Googletest Threads::Threads) +else() + message(STATUS "Googletest was not found. Please update the submodules with `git submodule update --init --recursive`.") + message(STATUS "Otherwise tests that depend on Googletest will be skipped.") + return() +endif() + +include(FeatureSummary) +set_package_properties(Googletest PROPERTIES + URL "https://github.com/google/googletest" + DESCRIPTION "Google Testing and Mocking Framework") diff --git a/src/plugins/mcusupport/test/CMakeLists.txt b/src/plugins/mcusupport/test/CMakeLists.txt index 2df4faa891d..7d2a94c286e 100644 --- a/src/plugins/mcusupport/test/CMakeLists.txt +++ b/src/plugins/mcusupport/test/CMakeLists.txt @@ -1,13 +1,8 @@ -find_package(Googletest MODULE) - -if(TARGET Googletest) - message("Googletest target is present") - extend_qtc_plugin(McuSupport - CONDITION WITH_TESTS - DEPENDS Googletest - SOURCES - unittest.h unittest.cpp packagemock.h settingshandlermock.h - ) -else() - message("Googletest target is missing") -endif() +extend_qtc_plugin(McuSupport + CONDITION WITH_TESTS AND TARGET Googletest + DEPENDS Googletest + SOURCES + unittest.h unittest.cpp + packagemock.h + settingshandlermock.h +) diff --git a/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt b/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt index 9a50fab71be..c61214d404f 100644 --- a/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt +++ b/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt @@ -2,9 +2,8 @@ set(StudioWelcomeDir "${PROJECT_SOURCE_DIR}/src/plugins/studiowelcome") set(WITH_TESTS ON) -find_package(Googletest MODULE) - add_qtc_test(tst_qml_wizard + CONDITION TARGET Googletest DEPENDS Core Utils StudioWelcome ProjectExplorer QmlDesigner Googletest DEFINES QT_CREATOR diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index cee69545232..9d395567961 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -1,18 +1,9 @@ -cmake_minimum_required(VERSION 3.16) - -set(GOOGLETEST_DIR ${CMAKE_CURRENT_LIST_DIR}/3rdparty/googletest) - -find_package(Googletest MODULE) find_package(GoogleBenchmark MODULE) -if (NOT Googletest_FOUND) - message(STATUS "Googletest was not found. Please update the submodules with `git submodule update --init --recursive`.") - message(STATUS "Have a look at cmake/FindGoogletest.cmake file for more details.") - message(STATUS "unit module will be skipped.") +if (NOT TARGET Googletest) return() endif() - set(CMAKE_INCLUDE_CURRENT_DIR ON) set(IMPLICIT_DEPENDS Qt::Test) From dfe77895068ef74ed495c7053576dcdf6b8ad7a1 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 22 Jun 2023 10:23:30 +0200 Subject: [PATCH 104/149] Googletest: Use add_qtc_library add_qtc_library makes the code much more readable. Change-Id: I60b397f3dc19de6911263c0818a25b41ab5a4209 Reviewed-by: Eike Ziller Reviewed-by: Qt CI Bot --- src/libs/googletest/CMakeLists.txt | 44 ++++++++++++++---------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/libs/googletest/CMakeLists.txt b/src/libs/googletest/CMakeLists.txt index c785323056b..50e82e1edf6 100644 --- a/src/libs/googletest/CMakeLists.txt +++ b/src/libs/googletest/CMakeLists.txt @@ -1,29 +1,27 @@ set(GOOGLETEST_DIR ${CMAKE_CURRENT_LIST_DIR}/../3rdparty/googletest) -if (EXISTS "${GOOGLETEST_DIR}/googletest") - add_library(Googletest STATIC - "${GOOGLETEST_DIR}/googletest/src/gtest-all.cc" - "${GOOGLETEST_DIR}/googlemock/src/gmock-all.cc" - ) - target_include_directories(Googletest - PUBLIC - "${GOOGLETEST_DIR}/googletest/include" - "${GOOGLETEST_DIR}/googlemock/include" - PRIVATE - "${GOOGLETEST_DIR}/googletest" - "${GOOGLETEST_DIR}/googlemock" - ) - set_target_properties(Googletest PROPERTIES AUTOMOC OFF AUTOUIC OFF QT_COMPILE_OPTIONS_DISABLE_WARNINGS ON) - set_property(TARGET Googletest PROPERTY POSITION_INDEPENDENT_CODE ON) - - target_link_libraries(Googletest Threads::Threads) +if(EXISTS "${GOOGLETEST_DIR}/googletest") + set(GOOGLETEST_SUBMODULE_IS_CHECKED_OUT YES) else() - message(STATUS "Googletest was not found. Please update the submodules with `git submodule update --init --recursive`.") - message(STATUS "Otherwise tests that depend on Googletest will be skipped.") - return() + set(GOOGLETEST_SUBMODULE_IS_CHECKED_OUT NO) endif() -include(FeatureSummary) -set_package_properties(Googletest PROPERTIES +add_qtc_library(Googletest STATIC + CONDITION GOOGLETEST_SUBMODULE_IS_CHECKED_OUT + DEPENDS + Threads::Threads + PUBLIC_INCLUDES + "${GOOGLETEST_DIR}/googletest/include" + "${GOOGLETEST_DIR}/googlemock/include" + INCLUDES + "${GOOGLETEST_DIR}/googletest" + "${GOOGLETEST_DIR}/googlemock" + PROPERTIES + AUTOMOC OFF AUTOUIC OFF QT_COMPILE_OPTIONS_DISABLE_WARNINGS ON + POSITION_INDEPENDENT_CODE ON URL "https://github.com/google/googletest" - DESCRIPTION "Google Testing and Mocking Framework") + DESCRIPTION "Google Testing and Mocking Framework" + SOURCES + "${GOOGLETEST_DIR}/googletest/src/gtest-all.cc" + "${GOOGLETEST_DIR}/googlemock/src/gmock-all.cc" +) From 802d1227ea4db310e2f6a8c7a704c67887a13873 Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Thu, 22 Jun 2023 11:23:28 +0200 Subject: [PATCH 105/149] Set a minimum section size in curve editors treeview This fixes a bug on some systems where resizeSection did not work as expected making the sections for the icons too wide and therefore the item names unreadable for the default treeview width. Fixes: QDS-10131 Change-Id: I10242a7f3f96c580b3256f7ca420466173581e35 Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/curveeditor/detail/treeview.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/treeview.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/treeview.cpp index c8b99d61c8d..82d8e2dd99d 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/treeview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/treeview.cpp @@ -37,6 +37,8 @@ TreeView::TreeView(CurveEditorModel *model, QWidget *parent) setStyle(model->style()); + header()->setMinimumSectionSize(20); + header()->setSectionResizeMode(0, QHeaderView::Stretch); header()->setSectionResizeMode(1, QHeaderView::Fixed); header()->setSectionResizeMode(2, QHeaderView::Fixed); From 4d516058665e79ffc06d17d82ff1d422e290faae Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Thu, 22 Jun 2023 13:57:33 +0200 Subject: [PATCH 106/149] Make locked curves brighter Locked curves had roughly the same color as the background color of the curveeditor. They are now a little bit brighter in order to see them better. Fixes: QDS-10130 Change-Id: Ic9cfc8358d9e1f2d4df132b27cb286653a0c35e8 Reviewed-by: Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/curveeditor/curveeditorstyle.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h b/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h index 163f998d7d1..8193bdbf530 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditorstyle.h @@ -59,7 +59,7 @@ struct KeyframeItemStyleOption double size = 10.0; QColor color = QColor(200, 200, 0); QColor selectionColor = QColor(200, 200, 200); - QColor lockedColor = QColor(50, 50, 50); + QColor lockedColor = QColor(80, 80, 80); QColor unifiedColor = QColor(250, 50, 250); QColor splitColor = QColor(0, 250, 0); }; @@ -71,7 +71,7 @@ struct CurveItemStyleOption QColor errorColor = QColor(200, 0, 0); QColor selectionColor = QColor(200, 200, 200); QColor easingCurveColor = QColor(200, 0, 200); - QColor lockedColor = QColor(50, 50, 50); + QColor lockedColor = QColor(120, 120, 120); QColor hoverColor = QColor(200, 0, 200); }; From 68d7aee49265c97870434a3a72e998c36935c18a Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Thu, 22 Jun 2023 14:02:53 +0200 Subject: [PATCH 107/149] Use the viewport center as pivot when zooming into the curve editor Fixes: QDS-10128 Fixes: QDS-10129 Change-Id: I7959a7b83b04cbc95b0d541fd1de7b45b387e752 Reviewed-by: Thomas Hartmann --- .../curveeditor/detail/graphicsview.cpp | 27 ++++++++++++++++--- .../curveeditor/detail/graphicsview.h | 2 ++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp index 819a52d2159..b7548020723 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp @@ -252,13 +252,21 @@ void GraphicsView::setPinned(TreeItem *item) void GraphicsView::setZoomX(double zoom, const QPoint &pivot) { - applyZoom(zoom, m_zoomY, pivot); + if (pivot.isNull()) + applyZoom(zoom, m_zoomY, viewportCenter()); + else + applyZoom(zoom, m_zoomY, pivot); + viewport()->update(); } void GraphicsView::setZoomY(double zoom, const QPoint &pivot) { - applyZoom(m_zoomX, zoom, pivot); + if (pivot.isNull()) + applyZoom(zoom, m_zoomY, viewportCenter()); + else + applyZoom(zoom, m_zoomY, pivot); + viewport()->update(); } @@ -514,7 +522,14 @@ void GraphicsView::applyZoom(double x, double y, const QPoint &pivot) m_transform = QTransform::fromScale(scaleX, scaleY); m_scene->setComponentTransform(m_transform); - QRectF sr = m_scene->rect().adjusted( + QRectF sr = m_scene->rect(); + if (sr.isNull()) { + sr.setLeft(m_scene->animationRangeMin()); + sr.setRight(m_scene->animationRangeMax()); + sr = m_transform.mapRect(sr); + } + + sr = sr.adjusted( -m_style.valueAxisWidth - m_style.canvasMargin, -m_style.timeAxisHeight - m_style.canvasMargin, m_style.canvasMargin, @@ -750,4 +765,10 @@ QRectF GraphicsView::rangeMaxHandle(const QRectF &rect) return QRectF(QPointF(handle, bottom), size); } +QPoint GraphicsView::viewportCenter() const +{ + QPoint viewCenter = viewport()->rect().center(); + return viewport()->mapToGlobal(viewCenter); +} + } // End namespace QmlDesigner. diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.h b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.h index c292d0203da..120249b605f 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.h +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.h @@ -136,6 +136,8 @@ private: QRectF rangeMaxHandle(const QRectF &rect); + QPoint viewportCenter() const; + private: bool m_dragging; From 977facbbda3162533932f68997b2d2d777b12018 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Thu, 22 Jun 2023 15:17:04 +0300 Subject: [PATCH 108/149] QmlDesigner: Update content library models when visibility change ...instead of resetting the model. This prevents downloading materials and textures from getting interrupted and is more efficient performance-wise. Fixes: QDS-9654 Change-Id: Id15a86c43ba06aa07071229259b9ea163979b619 Reviewed-by: Reviewed-by: Thomas Hartmann --- .../contentlibrary/contentlibrarymaterialsmodel.cpp | 12 ++++++------ .../contentlibrary/contentlibrarytexturesmodel.cpp | 13 ++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarymaterialsmodel.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarymaterialsmodel.cpp index c25873c77fa..e5ee371002e 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarymaterialsmodel.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarymaterialsmodel.cpp @@ -332,14 +332,14 @@ void ContentLibraryMaterialsModel::setSearchText(const QString &searchText) m_searchText = lowerSearchText; - bool catVisibilityChanged = false; - for (ContentLibraryMaterialsCategory *cat : std::as_const(m_bundleCategories)) - catVisibilityChanged |= cat->filter(m_searchText); + for (int i = 0; i < m_bundleCategories.size(); ++i) { + ContentLibraryMaterialsCategory *cat = m_bundleCategories.at(i); + bool catVisibilityChanged = cat->filter(m_searchText); + if (catVisibilityChanged) + emit dataChanged(index(i), index(i), {roleNames().keys("bundleCategoryVisible")}); + } updateIsEmpty(); - - if (catVisibilityChanged) - resetModel(); } void ContentLibraryMaterialsModel::updateImportedState(const QStringList &importedMats) diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp index 9026d944dab..319ca2686f2 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarytexturesmodel.cpp @@ -225,15 +225,14 @@ void ContentLibraryTexturesModel::setSearchText(const QString &searchText) m_searchText = lowerSearchText; - bool catVisibilityChanged = false; - - for (ContentLibraryTexturesCategory *cat : std::as_const(m_bundleCategories)) - catVisibilityChanged |= cat->filter(m_searchText); + for (int i = 0; i < m_bundleCategories.size(); ++i) { + ContentLibraryTexturesCategory *cat = m_bundleCategories.at(i); + bool catVisibilityChanged = cat->filter(m_searchText); + if (catVisibilityChanged) + emit dataChanged(index(i), index(i), {roleNames().keys("bundleCategoryVisible")}); + } updateIsEmpty(); - - if (catVisibilityChanged) - resetModel(); } void ContentLibraryTexturesModel::resetModel() From 57c4316e546351ffec4b68f33ede916645e32b3e Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 21 Jun 2023 14:47:13 +0200 Subject: [PATCH 109/149] UnitTests: Fix dependencies Change-Id: Ia5e3968aea4ae724f7554c2f7fa7223953236816 Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann Reviewed-by: Burak Hancerli --- tests/unit/tests/matchers/CMakeLists.txt | 2 +- tests/unit/tests/matchers/unittest-matchers.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/tests/matchers/CMakeLists.txt b/tests/unit/tests/matchers/CMakeLists.txt index cedc3c2a462..79e8e34d479 100644 --- a/tests/unit/tests/matchers/CMakeLists.txt +++ b/tests/unit/tests/matchers/CMakeLists.txt @@ -3,7 +3,7 @@ add_qtc_library(TestMatchers OBJECT SKIP_AUTOMOC ON PUBLIC_INCLUDES ${CMAKE_CURRENT_LIST_DIR} DEPENDS - Googletest + Googletest Utils SOURCES dynamicastmatcherdiagnosticcontainer-matcher.h unittest-matchers.h diff --git a/tests/unit/tests/matchers/unittest-matchers.h b/tests/unit/tests/matchers/unittest-matchers.h index 0f59a5e79a8..8d1c8bbf5ac 100644 --- a/tests/unit/tests/matchers/unittest-matchers.h +++ b/tests/unit/tests/matchers/unittest-matchers.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include From 5d4dffdc890c1b7085e917d4954d4ee129f89436 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 21 Jun 2023 15:00:41 +0200 Subject: [PATCH 110/149] UnitTests: Remove unused matcher There are no clang test anymore. Change-Id: I2140c4ff97e0351d627ec7b0f7306e0158fb95ca Reviewed-by: Qt CI Bot Reviewed-by: Burak Hancerli Reviewed-by: Reviewed-by: Thomas Hartmann --- tests/unit/tests/matchers/CMakeLists.txt | 1 - ...micastmatcherdiagnosticcontainer-matcher.h | 62 ------------------- 2 files changed, 63 deletions(-) delete mode 100644 tests/unit/tests/matchers/dynamicastmatcherdiagnosticcontainer-matcher.h diff --git a/tests/unit/tests/matchers/CMakeLists.txt b/tests/unit/tests/matchers/CMakeLists.txt index 79e8e34d479..2aebc0bc58b 100644 --- a/tests/unit/tests/matchers/CMakeLists.txt +++ b/tests/unit/tests/matchers/CMakeLists.txt @@ -5,6 +5,5 @@ add_qtc_library(TestMatchers OBJECT DEPENDS Googletest Utils SOURCES - dynamicastmatcherdiagnosticcontainer-matcher.h unittest-matchers.h ) diff --git a/tests/unit/tests/matchers/dynamicastmatcherdiagnosticcontainer-matcher.h b/tests/unit/tests/matchers/dynamicastmatcherdiagnosticcontainer-matcher.h deleted file mode 100644 index 50c642c8a69..00000000000 --- a/tests/unit/tests/matchers/dynamicastmatcherdiagnosticcontainer-matcher.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "../utils/googletest.h" - -using testing::PrintToString; - -namespace { - -MATCHER_P5(HasDiagnosticMessage, errorTypeText, startLine, startColumn, endLine, endColumn, - std::string(negation ? "isn't " : "is ") - + "{" + PrintToString(errorTypeText) - + ": (" + PrintToString(startLine) - + ", " + PrintToString(startColumn) - + "), (" + PrintToString(endLine) - + ", " + PrintToString(endColumn) - + ")}" - ) -{ - if (!arg.empty() && arg.front().messages.empty()) { - *result_listener << "no messages"; - return false; - } - - auto message = arg.front().messages.front(); - auto sourceRange = message.sourceRange; - - return message.errorTypeText() == errorTypeText - && sourceRange.start.line == uint(startLine) - && sourceRange.start.column == uint(startColumn) - && sourceRange.end.line == uint(endLine) - && sourceRange.end.column == uint(endColumn); -} - -MATCHER_P5(HasDiagnosticContext, contextTypeText, startLine, startColumn, endLine, endColumn, - std::string(negation ? "isn't " : "is ") - + "{" + PrintToString(contextTypeText) - + ": (" + PrintToString(startLine) - + ", " + PrintToString(startColumn) - + "), (" + PrintToString(endLine) - + ", " + PrintToString(endColumn) - + ")}" - ) -{ - if (!arg.empty() && arg.front().messages.empty()) { - *result_listener << "no context"; - return false; - } - - auto context = arg.front().contexts.front(); - auto sourceRange = context.sourceRange; - - return context.contextTypeText() == contextTypeText - && sourceRange.start.line == uint(startLine) - && sourceRange.start.column == uint(startColumn) - && sourceRange.end.line == uint(endLine) - && sourceRange.end.column == uint(endColumn); -} - -} From 474e7fff474b5435c61f1c44f6f1b1aee60de30e Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 20 Jun 2023 16:13:11 +0200 Subject: [PATCH 111/149] QmlDesigner: Fix missing property in MCU template Task-number: QDS-10091 Change-Id: I2f3c0949aea394761eb53f0f20081c1834c8dee5 Reviewed-by: Thomas Hartmann Reviewed-by: Reviewed-by: Burak Hancerli --- .../qmldesigner/studio_templates/projects/app_mcu.qmlproject | 1 + 1 file changed, 1 insertion(+) diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject b/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject index 50e5b9a357c..80bb0c5743e 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject +++ b/share/qtcreator/qmldesigner/studio_templates/projects/app_mcu.qmlproject @@ -4,6 +4,7 @@ import QmlProject 1.3 Project { mainFile: "%{MainQmlFileName}" + QDS.mainUiFile: "Screen01.ui.qml" /* Include .qml, .js, and image files from current directory and subdirectories */ QmlFiles { From 96cd0b3668db3524ea7ed97e3dd0280044bf3bd0 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Thu, 22 Jun 2023 19:31:58 +0200 Subject: [PATCH 112/149] QmlDesigner: Fix for mainFiles missing filepath It always returns projectDirectory otherwise Task-number: QDS-9984 Change-Id: Ia8a7d660eef46ec4e0afd53c1452798f95367dcd Reviewed-by: Thomas Hartmann Reviewed-by: Burak Hancerli --- .../qmlprojectmanager/buildsystem/qmlbuildsystem.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp index bce1b5babc1..d07df6b0fe3 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp @@ -317,12 +317,20 @@ void QmlBuildSystem::setBlockFilesUpdate(bool newBlockFilesUpdate) Utils::FilePath QmlBuildSystem::mainFilePath() const { - return projectDirectory().pathAppended(mainFile()); + const QString fileName = mainFile(); + if (fileName.isEmpty() || fileName.isNull()) { + return {}; + } + return projectDirectory().pathAppended(fileName); } Utils::FilePath QmlBuildSystem::mainUiFilePath() const { - return projectDirectory().pathAppended(mainUiFile()); + const QString fileName = mainUiFile(); + if (fileName.isEmpty() || fileName.isNull()) { + return {}; + } + return projectDirectory().pathAppended(fileName); } bool QmlBuildSystem::setMainFileInProjectFile(const Utils::FilePath &newMainFilePath) From fcab6a10d2f953b9868d86515c9f293079718c52 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Thu, 22 Jun 2023 19:34:15 +0200 Subject: [PATCH 113/149] QmlDesigner: Improve project open functions This patch: unifies lookup for the first qml file to open; increases number of possible fallback options; adds missing implementations to some methods in QmlBuildSystem. Task-number: QDS-9984 Change-Id: Ib282b1fca8b0564fe80f00e3d9ffe82c1a15c540 Reviewed-by: Reviewed-by: Burak Hancerli Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../buildsystem/qmlbuildsystem.cpp | 66 +++++++++++++++++++ .../buildsystem/qmlbuildsystem.h | 2 + src/plugins/qmlprojectmanager/qmlproject.cpp | 48 ++++++-------- .../studiowelcome/studiowelcomeplugin.cpp | 26 +++----- 4 files changed, 97 insertions(+), 45 deletions(-) diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp index d07df6b0fe3..6ecdeed638b 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp @@ -5,6 +5,7 @@ #include "../qmlprojectconstants.h" #include "../qmlprojectmanagertr.h" +#include "../qmlproject.h" #include #include @@ -155,6 +156,11 @@ bool QmlBuildSystem::updateProjectFile() return true; } +QmlProject *QmlBuildSystem::qmlProject() const +{ + return qobject_cast(project()); +} + void QmlBuildSystem::triggerParsing() { refresh(RefreshOptions::Project); @@ -315,6 +321,66 @@ void QmlBuildSystem::setBlockFilesUpdate(bool newBlockFilesUpdate) m_blockFilesUpdate = newBlockFilesUpdate; } +Utils::FilePath QmlBuildSystem::getStartupQmlFileWithFallback() const +{ + const auto currentProject = project(); + + if (!currentProject) + return {}; + + if (!target()) + return {}; + + const auto getFirstFittingFile = [](const Utils::FilePaths &files) -> Utils::FilePath { + for (const auto &file : files) { + if (file.exists()) + return file; + } + return {}; + }; + + const QStringView uiqmlstr = u"ui.qml"; + const QStringView qmlstr = u"qml"; + + //we will check mainUiFile twice: + //first priority if it's ui.qml file, second if it's just a qml file + const Utils::FilePath mainUiFile = mainUiFilePath(); + if (mainUiFile.exists() && mainUiFile.completeSuffix() == uiqmlstr) + return mainUiFile; + + const Utils::FilePaths uiFiles = currentProject->files([&](const ProjectExplorer::Node *node) { + return node->filePath().completeSuffix() == uiqmlstr; + }); + if (!uiFiles.isEmpty()) { + if (const auto file = getFirstFittingFile(uiFiles); !file.isEmpty()) + return file; + } + + //check the suffix of mainUiFile again, since there are no ui.qml files: + if (mainUiFile.exists() && mainUiFile.completeSuffix() == qmlstr) + return mainUiFile; + + const Utils::FilePath mainQmlFile = mainFilePath(); + if (mainQmlFile.exists() && mainQmlFile.completeSuffix() == qmlstr) + return mainQmlFile; + + //maybe it's also worth priotizing qml files containing common words like "Screen"? + const Utils::FilePaths qmlFiles = currentProject->files([&](const ProjectExplorer::Node *node) { + return node->filePath().completeSuffix() == qmlstr; + }); + if (!qmlFiles.isEmpty()) { + if (const auto file = getFirstFittingFile(qmlFiles); !file.isEmpty()) + return file; + } + + //if no source files exist in the project, lets try to open the .qmlproject file itself + const Utils::FilePath projectFile = projectFilePath(); + if (projectFile.exists()) + return projectFile; + + return {}; +} + Utils::FilePath QmlBuildSystem::mainFilePath() const { const QString fileName = mainFile(); diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.h b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.h index 0a0e9cfcbaf..2d689a19712 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.h +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.h @@ -94,6 +94,8 @@ public: bool blockFilesUpdate() const; void setBlockFilesUpdate(bool newBlockFilesUpdate); + Utils::FilePath getStartupQmlFileWithFallback() const; + signals: void projectChanged(); diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 45aedb0177f..12e1b9f7cbe 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -67,40 +67,24 @@ void QmlProject::parsingFinished(const Target *target, bool success) // trigger only once disconnect(this, &QmlProject::anyParsingFinished, this, &QmlProject::parsingFinished); - // FIXME: what to do in this case? if (!target || !success || !activeTarget()) return; - auto targetActive = activeTarget(); - auto qmlBuildSystem = qobject_cast( - targetActive->buildSystem()); - - const Utils::FilePath mainUiFile = qmlBuildSystem->mainUiFilePath(); - - if (mainUiFile.completeSuffix() == "ui.qml" && mainUiFile.exists()) { - QTimer::singleShot(1000, [mainUiFile]() { - Core::EditorManager::openEditor(mainUiFile, Utils::Id()); - }); + const auto qmlBuildSystem = qobject_cast( + activeTarget()->buildSystem()); + if (!qmlBuildSystem) return; - } - Utils::FilePaths uiFiles = collectUiQmlFilesForFolder( - projectDirectory().pathAppended("content")); - if (uiFiles.isEmpty()) { - uiFiles = collectUiQmlFilesForFolder(projectDirectory()); - if (uiFiles.isEmpty()) - return; - } - - Utils::FilePath currentFile; - if (auto cd = Core::EditorManager::currentDocument()) - currentFile = cd->filePath(); - - if (currentFile.isEmpty() || !isKnownFile(currentFile)) { - QTimer::singleShot(1000, [uiFiles]() { - Core::EditorManager::openEditor(uiFiles.first(), Utils::Id()); + const auto openFile = [&](const Utils::FilePath file) { + //why is this timer needed here? + QTimer::singleShot(1000, this, [file] { + Core::EditorManager::openEditor(file, Utils::Id()); }); - } + }; + + const Utils::FilePath fileToOpen = qmlBuildSystem->getStartupQmlFileWithFallback(); + if (!fileToOpen.isEmpty() && fileToOpen.exists() && !fileToOpen.isDir()) + openFile(fileToOpen); } Project::RestoreResult QmlProject::fromMap(const QVariantMap &map, QString *errorMessage) @@ -175,6 +159,14 @@ Utils::FilePaths QmlProject::collectUiQmlFilesForFolder(const Utils::FilePath &f return uiFiles; } +Utils::FilePaths QmlProject::collectQmlFiles() const +{ + const Utils::FilePaths qmlFiles = files([&](const Node *node) { + return node->filePath().completeSuffix() == "qml"; + }); + return qmlFiles; +} + Tasks QmlProject::projectIssues(const Kit *k) const { Tasks result = Project::projectIssues(k); diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index 5729b952e9e..7e9fce6f131 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -103,30 +103,20 @@ static StudioWelcomePlugin *s_pluginInstance = nullptr; static Utils::FilePath getMainUiFileWithFallback() { - auto project = ProjectExplorer::ProjectManager::startupProject(); + const auto project = ProjectExplorer::ProjectManager::startupProject(); if (!project) return {}; if (!project->activeTarget()) return {}; - auto qmlBuildSystem = qobject_cast( + const auto qmlBuildSystem = qobject_cast( project->activeTarget()->buildSystem()); if (!qmlBuildSystem) return {}; - auto mainUiFile = qmlBuildSystem->mainUiFilePath(); - if (mainUiFile.exists()) - return mainUiFile; - - const Utils::FilePaths uiFiles = project->files([&](const ProjectExplorer::Node *node) { - return node->filePath().completeSuffix() == "ui.qml"; - }); - if (!uiFiles.isEmpty()) - return uiFiles.first(); - - return {}; + return qmlBuildSystem->getStartupQmlFileWithFallback(); } std::unique_ptr makeUserFeedbackSettings() @@ -255,14 +245,16 @@ public: return; m_blockOpenRecent = true; - const FilePath projectFile = FilePath::fromVariant(data(index(row, 0), ProjectModel::FilePathRole)); + const FilePath projectFile = FilePath::fromVariant( + data(index(row, 0), ProjectModel::FilePathRole)); if (projectFile.exists()) { const ProjectExplorerPlugin::OpenProjectResult result = ProjectExplorer::ProjectExplorerPlugin::openProject(projectFile); if (!result && !result.alreadyOpen().isEmpty()) { - const auto mainUiFile = getMainUiFileWithFallback(); - if (mainUiFile.exists()) - Core::EditorManager::openEditor(mainUiFile, Utils::Id()); + const auto fileToOpen = getMainUiFileWithFallback(); + if (!fileToOpen.isEmpty() && fileToOpen.exists() && !fileToOpen.isDir()) { + Core::EditorManager::openEditor(fileToOpen, Utils::Id()); + } }; } From 2810106c2c4bd9f8132719b02358f02f5b67ece7 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 26 Jun 2023 16:53:48 +0300 Subject: [PATCH 114/149] QmlDesigner: Fix shader asset source property setting on navigator drop The property type of the shader source property is url, so use that instead of bytearray type. Fixes: QDS-9721 Change-Id: I244ed455f83e3f70d130a6085b9af083ee60c131 Reviewed-by: Mahmoud Badri --- .../qmldesigner/components/navigator/navigatortreemodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index e7d116c61cf..898b6f72cc1 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -928,7 +928,7 @@ ModelNode NavigatorTreeModel::handleItemLibraryShaderDrop(const QString &shaderP // set shader properties PropertyName prop = "shader"; - QString type = "QByteArray"; + QString type = "QUrl"; QVariant val = relPath; itemLibraryEntry.addProperty(prop, type, val); prop = "stage"; From 53579298c5b620d50356c8ab7a7baf349586d3eb Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 26 Jun 2023 17:34:02 +0200 Subject: [PATCH 115/149] UnitTest: add mock property "layer.effect" Change-Id: Ibd9698b8e4a365818ff9e5a3233a08eb891325c8 Reviewed-by: Marco Bubke --- .../tests/unittests/model/modelresourcemanagement-test.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp b/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp index 371c048f0dc..c5f5ebd7326 100644 --- a/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp +++ b/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,11 @@ protected: { model.attachView(&viewMock); rootNode = model.rootModelNode(); + auto itemId = rootNode.metaInfo().id(); + projectStorageMock.createProperty(itemId, + "layer.effect", + QmlDesigner::Storage::PropertyDeclarationTraits::IsList, + itemId); } auto createNodeWithParent(const QmlDesigner::TypeName &typeName, From 623ee6061111fb5e76dd6bee0c77e0201233465e Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 26 Jun 2023 20:25:35 +0200 Subject: [PATCH 116/149] UnitTest: disabled needs to be DISABLED Change-Id: Id6e4cb898934bcc2993c1e402ce7741162e0ab91 Reviewed-by: Marco Bubke --- .../unit/tests/unittests/projectstorage/projectstorage-test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp index e99182ea2df..19a60594373 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp @@ -5881,7 +5881,7 @@ TEST_F(ProjectStorage, synchronize_types_remove_property_declaration_with_an_ind Sqlite::ConstraintPreventsModification); } -TEST_F(ProjectStorage, disabled_synchronize_types_remove_stem_property_declaration_with_an_indirect_alias_throws) +TEST_F(ProjectStorage, DISABLED_synchronize_types_remove_stem_property_declaration_with_an_indirect_alias_throws) { auto package{createSynchronizationPackageWithIndirectAliases()}; storage.synchronize(package); From 85c4c90c636af8dc7ae35b0ce0e0476d091a6f54 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 27 Jun 2023 12:49:36 +0300 Subject: [PATCH 117/149] QmlDesigner: Delete materials and textures inside a transaction Removal of the node and references to the removed node are separate operations done during node deletion, so the deletion must be done inside a transaction to avoid getting multiple undo stack entries. Fixes: QDS-10169 Change-Id: I2ef142b98cfaa60b1130ac729dd89347bb8cac13 Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot --- .../materialbrowser/materialbrowsermodel.cpp | 13 +++++++++---- .../materialbrowser/materialbrowsermodel.h | 6 +++++- .../materialbrowsertexturesmodel.cpp | 13 +++++++++---- .../materialbrowser/materialbrowsertexturesmodel.h | 6 +++++- .../materialbrowser/materialbrowserwidget.cpp | 4 ++-- .../materialeditor/materialeditorview.cpp | 7 +++++-- .../components/textureeditor/textureeditorview.cpp | 7 +++++-- 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp index d6a098168c7..81ec4cbb3a5 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp @@ -4,6 +4,7 @@ #include "materialbrowsermodel.h" #include "designmodewidget.h" +#include "materialbrowserview.h" #include "qmldesignerplugin.h" #include "qmlobjectnode.h" #include "variantproperty.h" @@ -13,8 +14,9 @@ namespace QmlDesigner { -MaterialBrowserModel::MaterialBrowserModel(QObject *parent) +MaterialBrowserModel::MaterialBrowserModel(MaterialBrowserView *view, QObject *parent) : QAbstractListModel(parent) + , m_view(view) { } @@ -459,10 +461,13 @@ void MaterialBrowserModel::pasteMaterialProperties(int idx) void MaterialBrowserModel::deleteMaterial(int idx) { - if (isValidIndex(idx)) { + if (m_view && isValidIndex(idx)) { ModelNode node = m_materialList[idx]; - if (node.isValid()) - QmlObjectNode(node).destroy(); + if (node.isValid()) { + m_view->executeInTransaction(__FUNCTION__, [&] { + node.destroy(); + }); + } } } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h index 23e6a68973b..24c34394386 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h @@ -12,6 +12,8 @@ namespace QmlDesigner { +class MaterialBrowserView; + class MaterialBrowserModel : public QAbstractListModel { Q_OBJECT @@ -28,7 +30,7 @@ class MaterialBrowserModel : public QAbstractListModel Q_PROPERTY(QStringList customMaterialSections MEMBER m_customMaterialSections NOTIFY materialSectionsChanged) public: - MaterialBrowserModel(QObject *parent = nullptr); + MaterialBrowserModel(MaterialBrowserView *view, QObject *parent = nullptr); ~MaterialBrowserModel() override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; @@ -125,6 +127,8 @@ private: bool m_hasMaterialLibrary = false; bool m_allPropsCopied = true; QString m_copiedMaterialType; + + QPointer m_view; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp index ba4536132a2..ec95f3e5d3d 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp @@ -5,6 +5,7 @@ #include "designmodewidget.h" #include "imageutils.h" +#include "materialbrowserview.h" #include "qmldesignerplugin.h" #include "qmlobjectnode.h" #include "variantproperty.h" @@ -13,8 +14,9 @@ namespace QmlDesigner { -MaterialBrowserTexturesModel::MaterialBrowserTexturesModel(QObject *parent) +MaterialBrowserTexturesModel::MaterialBrowserTexturesModel(MaterialBrowserView *view, QObject *parent) : QAbstractListModel(parent) + , m_view(view) { } @@ -292,10 +294,13 @@ void MaterialBrowserTexturesModel::duplicateTexture(int idx) void MaterialBrowserTexturesModel::deleteTexture(int idx) { - if (isValidIndex(idx)) { + if (m_view && isValidIndex(idx)) { ModelNode node = m_textureList[idx]; - if (node.isValid()) - QmlObjectNode(node).destroy(); + if (node.isValid()) { + m_view->executeInTransaction(__FUNCTION__, [&] { + node.destroy(); + }); + } } } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h index 9cb7c5ac18f..8836d3b5db8 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h @@ -10,6 +10,8 @@ namespace QmlDesigner { +class MaterialBrowserView; + class MaterialBrowserTexturesModel : public QAbstractListModel { Q_OBJECT @@ -20,7 +22,7 @@ class MaterialBrowserTexturesModel : public QAbstractListModel Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv NOTIFY hasSceneEnvChanged) public: - MaterialBrowserTexturesModel(QObject *parent = nullptr); + MaterialBrowserTexturesModel(MaterialBrowserView *view, QObject *parent = nullptr); ~MaterialBrowserTexturesModel() override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; @@ -89,6 +91,8 @@ private: bool m_hasSingleModelSelection = false; bool m_hasSceneEnv = false; + QPointer m_view; + enum { RoleTexHasDynamicProps = Qt::UserRole + 1, RoleTexInternalId, diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index e2bb82216bb..bde22fdccad 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -141,8 +141,8 @@ bool MaterialBrowserWidget::eventFilter(QObject *obj, QEvent *event) MaterialBrowserWidget::MaterialBrowserWidget(AsynchronousImageCache &imageCache, MaterialBrowserView *view) : m_materialBrowserView(view) - , m_materialBrowserModel(new MaterialBrowserModel(this)) - , m_materialBrowserTexturesModel(new MaterialBrowserTexturesModel(this)) + , m_materialBrowserModel(new MaterialBrowserModel(view, this)) + , m_materialBrowserTexturesModel(new MaterialBrowserTexturesModel(view, this)) , m_quickWidget(new StudioQuickWidget(this)) , m_previewImageProvider(new PreviewImageProvider()) { diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index 55c587f3cb4..933686febda 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -442,8 +442,11 @@ void MaterialEditorView::handleToolBarAction(int action) } case MaterialEditorContextObject::DeleteCurrentMaterial: { - if (m_selectedMaterial.isValid()) - m_selectedMaterial.destroy(); + if (m_selectedMaterial.isValid()) { + executeInTransaction(__FUNCTION__, [&] { + m_selectedMaterial.destroy(); + }); + } break; } diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp index 0c2756db238..98601ce45ed 100644 --- a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp +++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp @@ -389,8 +389,11 @@ void TextureEditorView::handleToolBarAction(int action) } case TextureEditorContextObject::DeleteCurrentTexture: { - if (m_selectedTexture.isValid()) - m_selectedTexture.destroy(); + if (m_selectedTexture.isValid()) { + executeInTransaction(__FUNCTION__, [&] { + m_selectedTexture.destroy(); + }); + } break; } From 53bb2f95e5dc8aafacb207c1d8e9a2f5efe26859 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 27 Jun 2023 14:15:00 +0300 Subject: [PATCH 118/149] QmlDesigner: Fix rename context menu option in material browser The method the rename context menu option calls was moved in a recent refactoring. Fixes: QDS-10170 Change-Id: Ia96efa0782a4b62f07ea0e7cfd9b0d9588595d06 Reviewed-by: Mahmoud Badri --- .../qmldesigner/materialBrowserQmlSource/MaterialItem.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml index 86fec0936da..f055d1d665d 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml @@ -24,6 +24,11 @@ Rectangle { matName.commitRename() } + function startRename() + { + matName.startRename() + } + border.width: MaterialBrowserBackend.materialBrowserModel.selectedIndex === index ? MaterialBrowserBackend.rootView.materialSectionFocused ? 3 : 1 : 0 border.color: MaterialBrowserBackend.materialBrowserModel.selectedIndex === index ? StudioTheme.Values.themeControlOutlineInteraction From d7ee848efddabd75b7bfc8cd591de13774c2d385 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 7 Jun 2023 17:58:55 +0200 Subject: [PATCH 119/149] QmlDesigner: Improve NodeMetaInfo Change-Id: I1b31a1b08332f6bdba74c46af3d0a190901e9607 Reviewed-by: Reviewed-by: Tim Jenssen --- .../designercore/include/nodemetainfo.h | 2 + .../designercore/include/propertymetainfo.h | 3 + .../designercore/metainfo/nodemetainfo.cpp | 73 +-- tests/unit/tests/matchers/unittest-matchers.h | 10 + tests/unit/tests/mocks/projectstoragemock.cpp | 294 +++++++++---- tests/unit/tests/mocks/projectstoragemock.h | 41 ++ tests/unit/tests/unittests/CMakeLists.txt | 1 + .../tests/unittests/metainfo/CMakeLists.txt | 5 + .../unittests/metainfo/nodemetainfo-test.cpp | 415 ++++++++++++++++++ .../unit/tests/unittests/model/CMakeLists.txt | 1 + .../tests/unittests/model/modelnode-test.cpp | 27 ++ .../tests/utils/google-using-declarations.h | 2 + 12 files changed, 758 insertions(+), 116 deletions(-) create mode 100644 tests/unit/tests/unittests/metainfo/CMakeLists.txt create mode 100644 tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp create mode 100644 tests/unit/tests/unittests/model/modelnode-test.cpp diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 5e905ca4db5..55ce166d904 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -50,6 +50,8 @@ public: bool isValid() const; explicit operator bool() const { return isValid(); } + + TypeId id() const { return m_typeId; } bool isFileComponent() const; bool hasProperty(::Utils::SmallStringView propertyName) const; PropertyMetaInfos properties() const; diff --git a/src/plugins/qmldesigner/designercore/include/propertymetainfo.h b/src/plugins/qmldesigner/designercore/include/propertymetainfo.h index ecda132a0aa..99a704a4066 100644 --- a/src/plugins/qmldesigner/designercore/include/propertymetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/propertymetainfo.h @@ -49,6 +49,9 @@ public: return bool(m_nodeMetaInfoPrivateData); #endif } + + PropertyDeclarationId id() const { return m_id; } + PropertyName name() const; NodeMetaInfo propertyType() const; bool isWritable() const; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 1888ca847be..fd25d9c450d 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -1421,7 +1421,7 @@ bool NodeMetaInfo::isValid() const bool NodeMetaInfo::isFileComponent() const { if constexpr (useProjectStorage()) - return bool(typeData().traits & Storage::TypeTraits::IsFileComponent); + return isValid() && bool(typeData().traits & Storage::TypeTraits::IsFileComponent); else return isValid() && m_privateData->isFileComponent(); } @@ -1429,7 +1429,7 @@ bool NodeMetaInfo::isFileComponent() const bool NodeMetaInfo::hasProperty(Utils::SmallStringView propertyName) const { if constexpr (useProjectStorage()) - return bool(m_projectStorage->propertyDeclarationId(m_typeId, propertyName)); + return isValid() && bool(m_projectStorage->propertyDeclarationId(m_typeId, propertyName)); else return isValid() && m_privateData->properties().contains(propertyName); } @@ -1440,11 +1440,12 @@ PropertyMetaInfos NodeMetaInfo::properties() const return {}; if constexpr (useProjectStorage()) { - return Utils::transform( - m_projectStorage->propertyDeclarationIds(m_typeId), [&](auto id) { - return PropertyMetaInfo{id, m_projectStorage}; - }); - + if (isValid()) { + return Utils::transform( + m_projectStorage->propertyDeclarationIds(m_typeId), [&](auto id) { + return PropertyMetaInfo{id, m_projectStorage}; + }); + } } else { const auto &properties = m_privateData->properties(); @@ -1456,15 +1457,19 @@ PropertyMetaInfos NodeMetaInfo::properties() const return propertyMetaInfos; } + + return {}; } PropertyMetaInfos NodeMetaInfo::localProperties() const { if constexpr (useProjectStorage()) { - return Utils::transform( - m_projectStorage->localPropertyDeclarationIds(m_typeId), [&](auto id) { - return PropertyMetaInfo{id, m_projectStorage}; - }); + if (isValid()) { + return Utils::transform( + m_projectStorage->localPropertyDeclarationIds(m_typeId), [&](auto id) { + return PropertyMetaInfo{id, m_projectStorage}; + }); + } } else { const auto &properties = m_privateData->localProperties(); @@ -1476,15 +1481,21 @@ PropertyMetaInfos NodeMetaInfo::localProperties() const return propertyMetaInfos; } + + return {}; } PropertyMetaInfo NodeMetaInfo::property(const PropertyName &propertyName) const { if constexpr (useProjectStorage()) { - return {m_projectStorage->propertyDeclarationId(m_typeId, propertyName), m_projectStorage}; + if (isValid()) { + return {m_projectStorage->propertyDeclarationId(m_typeId, propertyName), + m_projectStorage}; + } } else { - if (hasProperty(propertyName)) + if (hasProperty(propertyName)) { return PropertyMetaInfo{m_privateData, propertyName}; + } } return {}; @@ -1493,10 +1504,13 @@ PropertyMetaInfo NodeMetaInfo::property(const PropertyName &propertyName) const PropertyNameList NodeMetaInfo::signalNames() const { if constexpr (useProjectStorage()) { - return Utils::transform(m_projectStorage->signalDeclarationNames(m_typeId), - [&](const auto &name) { - return name.toQByteArray(); - }); + if (isValid()) { + return Utils::transform(m_projectStorage->signalDeclarationNames( + m_typeId), + [&](const auto &name) { + return name.toQByteArray(); + }); + } } else { if (isValid()) return m_privateData->signalNames(); @@ -1508,10 +1522,13 @@ PropertyNameList NodeMetaInfo::signalNames() const PropertyNameList NodeMetaInfo::slotNames() const { if constexpr (useProjectStorage()) { - return Utils::transform(m_projectStorage->functionDeclarationNames(m_typeId), - [&](const auto &name) { - return name.toQByteArray(); - }); + if (isValid()) { + return Utils::transform(m_projectStorage->functionDeclarationNames( + m_typeId), + [&](const auto &name) { + return name.toQByteArray(); + }); + } } else { if (isValid()) return m_privateData->slotNames(); @@ -1523,9 +1540,11 @@ PropertyNameList NodeMetaInfo::slotNames() const PropertyName NodeMetaInfo::defaultPropertyName() const { if constexpr (useProjectStorage()) { - if (auto name = m_projectStorage->propertyName(typeData().defaultPropertyId)) - return name->toQByteArray(); - return {}; + if (isValid()) { + if (auto name = m_projectStorage->propertyName(typeData().defaultPropertyId)) { + return name->toQByteArray(); + } + } } else { if (isValid()) return m_privateData->defaultPropertyName(); @@ -1537,10 +1556,14 @@ PropertyName NodeMetaInfo::defaultPropertyName() const PropertyMetaInfo NodeMetaInfo::defaultProperty() const { if constexpr (useProjectStorage()) { - return PropertyMetaInfo(typeData().defaultPropertyId, m_projectStorage); + if (isValid()) { + return PropertyMetaInfo(typeData().defaultPropertyId, m_projectStorage); + } } else { return property(defaultPropertyName()); } + + return {}; } bool NodeMetaInfo::hasDefaultProperty() const { diff --git a/tests/unit/tests/matchers/unittest-matchers.h b/tests/unit/tests/matchers/unittest-matchers.h index 8d1c8bbf5ac..f4ff225c747 100644 --- a/tests/unit/tests/matchers/unittest-matchers.h +++ b/tests/unit/tests/matchers/unittest-matchers.h @@ -91,6 +91,16 @@ public: return false; } + bool MatchAndExplain(const QByteArray &s, testing::MatchResultListener *listener) const + { + if (s.isEmpty()) { + return true; + } + + *listener << "whose size is " << s.size(); + return false; + } + void DescribeTo(std::ostream *os) const { *os << "is empty"; } void DescribeNegationTo(std::ostream *os) const { *os << "isn't empty"; } diff --git a/tests/unit/tests/mocks/projectstoragemock.cpp b/tests/unit/tests/mocks/projectstoragemock.cpp index 71d789d0d95..37384e48507 100644 --- a/tests/unit/tests/mocks/projectstoragemock.cpp +++ b/tests/unit/tests/mocks/projectstoragemock.cpp @@ -3,7 +3,16 @@ #include "projectstoragemock.h" -namespace QmlDesigner { +#include + +using QmlDesigner::ModuleId; +using QmlDesigner::PropertyDeclarationId; +using QmlDesigner::TypeId; +using QmlDesigner::TypeIds; +using QmlDesigner::Storage::PropertyDeclarationTraits; + +namespace Storage = QmlDesigner::Storage; + namespace { template @@ -12,62 +21,6 @@ void incrementBasicId(BasicId &id) id = BasicId::create(id.internalId() + 1); } -ModuleId createModule(ProjectStorageMock &mock, Utils::SmallStringView moduleName) -{ - static ModuleId moduleId; - incrementBasicId(moduleId); - - ON_CALL(mock, moduleId(Eq(moduleName))).WillByDefault(Return(moduleId)); - - return moduleId; -} - -PropertyDeclarationId createProperty(ProjectStorageMock &mock, TypeId typeId, Utils::SmallString name) -{ - static PropertyDeclarationId propertyId; - incrementBasicId(propertyId); - - ON_CALL(mock, propertyDeclarationId(Eq(typeId), Eq(name))).WillByDefault(Return(propertyId)); - ON_CALL(mock, propertyName(Eq(propertyId))).WillByDefault(Return(name)); - - return propertyId; -} - -TypeId createType(ProjectStorageMock &mock, - ModuleId moduleId, - Utils::SmallStringView typeName, - Utils::SmallString defaultPropertyName, - Storage::TypeTraits typeTraits, - TypeIds baseTypeIds = {}) -{ - static TypeId typeId; - incrementBasicId(typeId); - - ON_CALL(mock, typeId(Eq(moduleId), Eq(typeName), _)).WillByDefault(Return(typeId)); - PropertyDeclarationId defaultPropertyDeclarationId; - if (defaultPropertyName.size()) - defaultPropertyDeclarationId = createProperty(mock, typeId, defaultPropertyName); - ON_CALL(mock, type(Eq(typeId))) - .WillByDefault(Return(Storage::Info::Type{defaultPropertyDeclarationId, typeTraits})); - - ON_CALL(mock, isBasedOn(Eq(typeId), Eq(typeId))).WillByDefault(Return(true)); - - for (TypeId baseTypeId : baseTypeIds) - ON_CALL(mock, isBasedOn(Eq(typeId), Eq(baseTypeId))).WillByDefault(Return(true)); - - return typeId; -} - -TypeId createObject(ProjectStorageMock &mock, - ModuleId moduleId, - Utils::SmallStringView typeName, - Utils::SmallString defaultPropertyName, - TypeIds baseTypeIds = {}) -{ - return createType( - mock, moduleId, typeName, defaultPropertyName, Storage::TypeTraits::Reference, baseTypeIds); -} - void setupIsBasedOn(ProjectStorageMock &mock) { auto call = [&](TypeId typeId, auto... ids) -> bool { @@ -82,49 +35,208 @@ void setupIsBasedOn(ProjectStorageMock &mock) } } // namespace -} // namespace QmlDesigner + +ModuleId ProjectStorageMock::createModule(Utils::SmallStringView moduleName) +{ + static ModuleId moduleId; + incrementBasicId(moduleId); + + ON_CALL(*this, moduleId(Eq(moduleName))).WillByDefault(Return(moduleId)); + + return moduleId; +} + +PropertyDeclarationId ProjectStorageMock::createProperty(TypeId typeId, + Utils::SmallString name, + PropertyDeclarationTraits traits, + TypeId propertyTypeId) +{ + static PropertyDeclarationId propertyId; + incrementBasicId(propertyId); + + ON_CALL(*this, propertyDeclarationId(Eq(typeId), Eq(name))).WillByDefault(Return(propertyId)); + ON_CALL(*this, propertyName(Eq(propertyId))).WillByDefault(Return(name)); + + ON_CALL(*this, propertyDeclaration(Eq(propertyId))) + .WillByDefault(Return( + QmlDesigner::Storage::Info::PropertyDeclaration{typeId, name, traits, propertyTypeId})); + + auto ids = localPropertyDeclarationIds(typeId); + ids.push_back(propertyId); + ON_CALL(*this, propertyDeclarationIds(Eq(typeId))).WillByDefault(Return(ids)); + ON_CALL(*this, localPropertyDeclarationIds(Eq(typeId))).WillByDefault(Return(ids)); + + return propertyId; +} + +QmlDesigner::PropertyDeclarationId ProjectStorageMock::createProperty( + QmlDesigner::TypeId typeId, Utils::SmallString name, QmlDesigner::TypeId propertyTypeId) +{ + return createProperty(typeId, name, {}, propertyTypeId); +} + +void ProjectStorageMock::createSignal(QmlDesigner::TypeId typeId, Utils::SmallString name) +{ + auto signalNames = signalDeclarationNames(typeId); + signalNames.push_back(name); + ON_CALL(*this, signalDeclarationNames(Eq(typeId))).WillByDefault(Return(signalNames)); +} + +void ProjectStorageMock::createFunction(QmlDesigner::TypeId typeId, Utils::SmallString name) +{ + auto functionNames = functionDeclarationNames(typeId); + functionNames.push_back(name); + ON_CALL(*this, functionDeclarationNames(Eq(typeId))).WillByDefault(Return(functionNames)); +} + +TypeId ProjectStorageMock::createType(ModuleId moduleId, + Utils::SmallStringView typeName, + Utils::SmallStringView defaultPropertyName, + PropertyDeclarationTraits defaultPropertyTraits, + TypeId defaultPropertyTypeId, + Storage::TypeTraits typeTraits, + TypeIds baseTypeIds) +{ + static TypeId typeId; + incrementBasicId(typeId); + + ON_CALL(*this, typeId(Eq(moduleId), Eq(typeName), _)).WillByDefault(Return(typeId)); + PropertyDeclarationId defaultPropertyDeclarationId; + if (defaultPropertyName.size()) { + if (!defaultPropertyTypeId) { + defaultPropertyTypeId = typeId; + } + + defaultPropertyDeclarationId = createProperty(typeId, + defaultPropertyName, + defaultPropertyTraits, + defaultPropertyTypeId); + } + + ON_CALL(*this, type(Eq(typeId))) + .WillByDefault(Return(Storage::Info::Type{defaultPropertyDeclarationId, typeTraits})); + + ON_CALL(*this, isBasedOn(Eq(typeId), Eq(typeId))).WillByDefault(Return(true)); + + for (TypeId baseTypeId : baseTypeIds) + ON_CALL(*this, isBasedOn(Eq(typeId), Eq(baseTypeId))).WillByDefault(Return(true)); + + return typeId; +} + +QmlDesigner::TypeId ProjectStorageMock::createType(QmlDesigner::ModuleId moduleId, + Utils::SmallStringView typeName, + QmlDesigner::Storage::TypeTraits typeTraits, + QmlDesigner::TypeIds baseTypeIds) +{ + return createType(moduleId, typeName, {}, {}, TypeId{}, typeTraits, baseTypeIds); +} + +TypeId ProjectStorageMock::createObject(ModuleId moduleId, + Utils::SmallStringView typeName, + Utils::SmallStringView defaultPropertyName, + PropertyDeclarationTraits defaultPropertyTraits, + QmlDesigner::TypeId defaultPropertyTypeId, + TypeIds baseTypeIds) +{ + return createType(moduleId, + typeName, + defaultPropertyName, + defaultPropertyTraits, + defaultPropertyTypeId, + Storage::TypeTraits::Reference, + baseTypeIds); +} + +TypeId ProjectStorageMock::createObject(ModuleId moduleId, + Utils::SmallStringView typeName, + TypeIds baseTypeIds) +{ + return createType(moduleId, typeName, Storage::TypeTraits::Reference, baseTypeIds); +} void ProjectStorageMock::setupQtQtuick() { - QmlDesigner::setupIsBasedOn(*this); + setupIsBasedOn(*this); - auto qmlModuleId = QmlDesigner::createModule(*this, "QML"); - auto qtQmlModelsModuleId = QmlDesigner::createModule(*this, "QtQml.Models"); - auto qtQuickModuleId = QmlDesigner::createModule(*this, "QtQuick"); - auto qtQuickNativeModuleId = QmlDesigner::createModule(*this, "QtQuick-cppnative"); + auto qmlModuleId = createModule("QML"); + auto qtQmlModelsModuleId = createModule("QtQml.Models"); + auto qtQuickModuleId = createModule("QtQuick"); + auto qtQuickNativeModuleId = createModule("QtQuick-cppnative"); - auto qtObjectId = QmlDesigner::createObject(*this, qmlModuleId, "QtObject", "children"); + auto intId = createType(qmlModuleId, "int", Storage::TypeTraits::Value); - QmlDesigner::createObject(*this, qtQmlModelsModuleId, "ListModel", "children", {qtObjectId}); - QmlDesigner::createObject(*this, qtQmlModelsModuleId, "ListElement", "children", {qtObjectId}); + auto qtObjectId = createObject(qmlModuleId, + "QtObject", + "children", + PropertyDeclarationTraits::IsList, + TypeId{}); - auto itemId = QmlDesigner::createObject(*this, qtQuickModuleId, "Item", "data", {qtObjectId}); - QmlDesigner::createObject(*this, qtQuickModuleId, "ListView", "data", {qtObjectId, itemId}); - QmlDesigner::createObject(*this, qtQuickModuleId, "StateGroup", "states", {qtObjectId}); - QmlDesigner::createObject(*this, qtQuickModuleId, "State", "changes", {qtObjectId}); - QmlDesigner::createObject(*this, qtQuickModuleId, "Transition", "animations", {qtObjectId}); - QmlDesigner::createObject(*this, qtQuickModuleId, "PropertyAnimation", "", {qtObjectId}); - auto stateOperationsId = QmlDesigner::createObject(*this, - qtQuickNativeModuleId, - " QQuickStateOperation", - "", - {qtObjectId}); - QmlDesigner::createObject(*this, - qtQuickModuleId, - "PropertyChanges", - "", - {qtObjectId, stateOperationsId}); + auto listElementId = createObject(qtQmlModelsModuleId, "ListElement", {qtObjectId}); + createObject(qtQmlModelsModuleId, + "ListModel", + "children", + PropertyDeclarationTraits::IsList, + listElementId, + {qtObjectId}); - auto qtQuickTimelineModuleId = QmlDesigner::createModule(*this, "QtQuick.Timeline"); - QmlDesigner::createObject(*this, qtQuickTimelineModuleId, "KeyframeGroup", "keyframes", {qtObjectId}); - QmlDesigner::createObject(*this, qtQuickTimelineModuleId, "Keyframe", "", {qtObjectId}); + auto itemId = createObject(qtQuickModuleId, + "Item", + "data", + PropertyDeclarationTraits::IsList, + qtObjectId, + {qtObjectId}); + createObject(qtQuickModuleId, + "ListView", + "data", + PropertyDeclarationTraits::IsList, + qtObjectId, + {qtObjectId, itemId}); + createObject(qtQuickModuleId, "StateGroup", {qtObjectId}); + createObject(qtQuickModuleId, + "State", + "changes", + PropertyDeclarationTraits::IsList, + qtObjectId, + {qtObjectId}); + auto animationId = createObject(qtQuickModuleId, "Animation", {qtObjectId}); + createObject(qtQuickModuleId, + "Transition", + "animations", + PropertyDeclarationTraits::IsList, + animationId, + {qtObjectId}); + createObject(qtQuickModuleId, "PropertyAnimation", {qtObjectId}); + auto stateOperationsId = createObject(qtQuickNativeModuleId, + " QQuickStateOperation", + {qtObjectId}); + createObject(qtQuickModuleId, "PropertyChanges", {qtObjectId, stateOperationsId}); - auto flowViewModuleId = QmlDesigner::createModule(*this, "FlowView"); - QmlDesigner::createObject(*this, flowViewModuleId, "FlowActionArea", "data", {qtObjectId, itemId}); - QmlDesigner::createObject(*this, flowViewModuleId, "FlowWildcard", "data", {qtObjectId}); - QmlDesigner::createObject(*this, flowViewModuleId, "FlowDecision", "", {qtObjectId}); - QmlDesigner::createObject(*this, flowViewModuleId, "FlowTransition", "", {qtObjectId}); - QmlDesigner::createObject(*this, flowViewModuleId, "FlowItem", "data", {qtObjectId, itemId}); + auto qtQuickTimelineModuleId = createModule("QtQuick.Timeline"); + createObject(qtQuickTimelineModuleId, "KeyframeGroup", {qtObjectId}); + createObject(qtQuickTimelineModuleId, "Keyframe", {qtObjectId}); + + auto flowViewModuleId = createModule("FlowView"); + createObject(flowViewModuleId, + "FlowActionArea", + "data", + PropertyDeclarationTraits::IsList, + qtObjectId, + {qtObjectId, itemId}); + createObject(flowViewModuleId, + "FlowWildcard", + "data", + PropertyDeclarationTraits::IsList, + qtObjectId, + {qtObjectId}); + createObject(flowViewModuleId, "FlowDecision", {qtObjectId}); + createObject(flowViewModuleId, "FlowTransition", {qtObjectId}); + createObject(flowViewModuleId, + "FlowItem", + "data", + PropertyDeclarationTraits::IsList, + qtObjectId, + {qtObjectId, itemId}); } void ProjectStorageMock::setupCommonTypeCache() diff --git a/tests/unit/tests/mocks/projectstoragemock.h b/tests/unit/tests/mocks/projectstoragemock.h index 383e56e4ec1..fc2544979ae 100644 --- a/tests/unit/tests/mocks/projectstoragemock.h +++ b/tests/unit/tests/mocks/projectstoragemock.h @@ -18,6 +18,47 @@ public: void setupQtQtuick(); void setupCommonTypeCache(); + QmlDesigner::ModuleId createModule(Utils::SmallStringView moduleName); + + QmlDesigner::TypeId createType( + QmlDesigner::ModuleId moduleId, + Utils::SmallStringView typeName, + Utils::SmallStringView defaultPropertyName, + QmlDesigner::Storage::PropertyDeclarationTraits defaultPropertyTraits, + QmlDesigner::TypeId defaultPropertyTypeId, + QmlDesigner::Storage::TypeTraits typeTraits, + QmlDesigner::TypeIds baseTypeIds = {}); + + QmlDesigner::TypeId createType(QmlDesigner::ModuleId moduleId, + Utils::SmallStringView typeName, + QmlDesigner::Storage::TypeTraits typeTraits, + QmlDesigner::TypeIds baseTypeIds = {}); + + QmlDesigner::TypeId createObject( + QmlDesigner::ModuleId moduleId, + Utils::SmallStringView typeName, + Utils::SmallStringView defaultPropertyName, + QmlDesigner::Storage::PropertyDeclarationTraits defaultPropertyTraits, + QmlDesigner::TypeId defaultPropertyTypeId, + QmlDesigner::TypeIds baseTypeIds = {}); + + QmlDesigner::TypeId createObject(QmlDesigner::ModuleId moduleId, + Utils::SmallStringView typeName, + QmlDesigner::TypeIds baseTypeIds = {}); + + QmlDesigner::PropertyDeclarationId createProperty( + QmlDesigner::TypeId typeId, + Utils::SmallString name, + QmlDesigner::Storage::PropertyDeclarationTraits traits, + QmlDesigner::TypeId propertyTypeId); + + QmlDesigner::PropertyDeclarationId createProperty(QmlDesigner::TypeId typeId, + Utils::SmallString name, + QmlDesigner::TypeId propertyTypeId); + + void createSignal(QmlDesigner::TypeId typeId, Utils::SmallString name); + void createFunction(QmlDesigner::TypeId typeId, Utils::SmallString name); + MOCK_METHOD(void, synchronize, (QmlDesigner::Storage::Synchronization::SynchronizationPackage package), diff --git a/tests/unit/tests/unittests/CMakeLists.txt b/tests/unit/tests/unittests/CMakeLists.txt index 0cd03124042..a50a0a2a761 100644 --- a/tests/unit/tests/unittests/CMakeLists.txt +++ b/tests/unit/tests/unittests/CMakeLists.txt @@ -61,6 +61,7 @@ endfunction(unittest_copy_data_folder) add_subdirectory(listmodeleditor) add_subdirectory(imagecache) +add_subdirectory(metainfo) add_subdirectory(model) add_subdirectory(sqlite) add_subdirectory(projectstorage) diff --git a/tests/unit/tests/unittests/metainfo/CMakeLists.txt b/tests/unit/tests/unittests/metainfo/CMakeLists.txt new file mode 100644 index 00000000000..7f2728f078b --- /dev/null +++ b/tests/unit/tests/unittests/metainfo/CMakeLists.txt @@ -0,0 +1,5 @@ +# qmldesigner/designercore/model +extend_qtc_test(unittest + SOURCES + nodemetainfo-test.cpp +) diff --git a/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp new file mode 100644 index 00000000000..b2532938a3e --- /dev/null +++ b/tests/unit/tests/unittests/metainfo/nodemetainfo-test.cpp @@ -0,0 +1,415 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "../utils/googletest.h" + +#include "../mocks/projectstoragemock.h" + +#include +#include +#include + +namespace { + +using QmlDesigner::ModelNode; +using QmlDesigner::ModelNodes; + +template +auto PropertyId(const Matcher &matcher) +{ + return Property(&QmlDesigner::PropertyMetaInfo::id, matcher); +} + +class NodeMetaInfo : public testing::Test +{ +protected: + NiceMock projectStorageMock; + QmlDesigner::Model model{projectStorageMock, "QtQuick.Item"}; + ModelNode rootNode = model.rootModelNode(); + ModelNode item = model.createModelNode("QtQuick.Item"); + ModelNode object = model.createModelNode("QML.QtObject"); + QmlDesigner::NodeMetaInfo itemMetaInfo = item.metaInfo(); + QmlDesigner::NodeMetaInfo objectMetaInfo = object.metaInfo(); + QmlDesigner::TypeId intTypeId = projectStorageMock.typeId(projectStorageMock.moduleId("QML"), + "int", + QmlDesigner::Storage::Version{}); +}; + +TEST_F(NodeMetaInfo, is_true_if_meta_info_exists) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + + auto isValid = bool(metaInfo); + + ASSERT_TRUE(isValid); +} + +TEST_F(NodeMetaInfo, is_valid_if_meta_info_exists) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + + auto isValid = metaInfo.isValid(); + + ASSERT_TRUE(isValid); +} + +TEST_F(NodeMetaInfo, is_false_if_meta_info_not_exists) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto isValid = bool(metaInfo); + + ASSERT_FALSE(isValid); +} + +TEST_F(NodeMetaInfo, default_is_false) +{ + auto isValid = bool(QmlDesigner::NodeMetaInfo{}); + + ASSERT_FALSE(isValid); +} + +TEST_F(NodeMetaInfo, is_invalid_if_meta_info_not_exists) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto isValid = metaInfo.isValid(); + + ASSERT_FALSE(isValid); +} + +TEST_F(NodeMetaInfo, default_is_invalid) +{ + auto isValid = QmlDesigner::NodeMetaInfo{}.isValid(); + + ASSERT_FALSE(isValid); +} + +TEST_F(NodeMetaInfo, item_is_based_on_object) +{ + bool isBasedOn = itemMetaInfo.isBasedOn(objectMetaInfo); + + ASSERT_TRUE(isBasedOn); +} + +TEST_F(NodeMetaInfo, item_is_based_on_item) +{ + bool isBasedOn = itemMetaInfo.isBasedOn(itemMetaInfo); + + ASSERT_TRUE(isBasedOn); +} + +TEST_F(NodeMetaInfo, object_is_no_based_on_item) +{ + bool isBasedOn = objectMetaInfo.isBasedOn(itemMetaInfo); + + ASSERT_FALSE(isBasedOn); +} + +TEST_F(NodeMetaInfo, object_is_not_file_component) +{ + bool isFileComponent = objectMetaInfo.isFileComponent(); + + ASSERT_FALSE(isFileComponent); +} + +TEST_F(NodeMetaInfo, default_is_not_file_component) +{ + bool isFileComponent = QmlDesigner::NodeMetaInfo{}.isFileComponent(); + + ASSERT_FALSE(isFileComponent); +} + +TEST_F(NodeMetaInfo, invalid_is_not_file_component) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + bool isFileComponent = metaInfo.isFileComponent(); + + ASSERT_FALSE(isFileComponent); +} + +TEST_F(NodeMetaInfo, component_is_file_component) +{ + using QmlDesigner::Storage::TypeTraits; + auto moduleId = projectStorageMock.createModule("/path/to/project"); + auto typeId = projectStorageMock.createType(moduleId, + "Foo", + TypeTraits::IsFileComponent | TypeTraits::Reference); + QmlDesigner::NodeMetaInfo metaInfo{typeId, &projectStorageMock}; + + bool isFileComponent = metaInfo.isFileComponent(); + + ASSERT_TRUE(isFileComponent); +} + +TEST_F(NodeMetaInfo, has_property) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + projectStorageMock.createProperty(metaInfo.id(), "x", intTypeId); + + bool hasProperty = metaInfo.hasProperty("x"); + + ASSERT_TRUE(hasProperty); +} + +TEST_F(NodeMetaInfo, has_not_property) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + + bool hasProperty = metaInfo.hasProperty("foo"); + + ASSERT_FALSE(hasProperty); +} + +TEST_F(NodeMetaInfo, default_has_not_property) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + bool hasProperty = metaInfo.hasProperty("x"); + + ASSERT_FALSE(hasProperty); +} + +TEST_F(NodeMetaInfo, invalid_has_not_property) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + bool hasProperty = metaInfo.hasProperty("x"); + + ASSERT_FALSE(hasProperty); +} + +TEST_F(NodeMetaInfo, get_property) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + auto propertyId = projectStorageMock.createProperty(metaInfo.id(), "x", intTypeId); + + auto property = metaInfo.property("x"); + + ASSERT_THAT(property, PropertyId(propertyId)); +} + +TEST_F(NodeMetaInfo, get_invalid_property_if_not_exists) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + + auto property = metaInfo.property("x"); + + ASSERT_THAT(property, PropertyId(IsFalse())); +} + +TEST_F(NodeMetaInfo, get_invalid_property_for_default) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + auto property = metaInfo.property("x"); + + ASSERT_THAT(property, PropertyId(IsFalse())); +} + +TEST_F(NodeMetaInfo, get_invalid_property_if_meta_info_is_invalid) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto property = metaInfo.property("x"); + + ASSERT_THAT(property, PropertyId(IsFalse())); +} + +TEST_F(NodeMetaInfo, get_properties) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + auto xPropertyId = projectStorageMock.createProperty(metaInfo.id(), "x", intTypeId); + auto yPropertyId = projectStorageMock.createProperty(metaInfo.id(), "y", intTypeId); + + auto properties = metaInfo.properties(); + + ASSERT_THAT(properties, IsSupersetOf({PropertyId(xPropertyId), PropertyId(yPropertyId)})); +} + +TEST_F(NodeMetaInfo, get_no_properties_for_default) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + auto properties = metaInfo.properties(); + + ASSERT_THAT(properties, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_no_properties_if_is_invalid) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto properties = metaInfo.properties(); + + ASSERT_THAT(properties, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_local_properties) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + auto xPropertyId = projectStorageMock.createProperty(metaInfo.id(), "x", intTypeId); + auto yPropertyId = projectStorageMock.createProperty(metaInfo.id(), "y", intTypeId); + + auto properties = metaInfo.localProperties(); + + ASSERT_THAT(properties, IsSupersetOf({PropertyId(xPropertyId), PropertyId(yPropertyId)})); +} + +TEST_F(NodeMetaInfo, get_no_local_properties_for_default_metainfo) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + auto properties = metaInfo.localProperties(); + + ASSERT_THAT(properties, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_no_local_properties_if_node_is_invalid) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto properties = metaInfo.localProperties(); + + ASSERT_THAT(properties, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_signal_names) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + projectStorageMock.createSignal(metaInfo.id(), "xChanged"); + projectStorageMock.createSignal(metaInfo.id(), "yChanged"); + + auto signalNames = metaInfo.signalNames(); + + ASSERT_THAT(signalNames, IsSupersetOf({"xChanged", "yChanged"})); +} + +TEST_F(NodeMetaInfo, get_no_signal_names_for_default_metainfo) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + auto signalNames = metaInfo.signalNames(); + + ASSERT_THAT(signalNames, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_no_signal_names_if_node_is_invalid) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto signalNames = metaInfo.signalNames(); + + ASSERT_THAT(signalNames, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_function_names) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + projectStorageMock.createFunction(metaInfo.id(), "setX"); + projectStorageMock.createFunction(metaInfo.id(), "setY"); + + auto functionNames = metaInfo.slotNames(); + + ASSERT_THAT(functionNames, IsSupersetOf({"setX", "setY"})); +} + +TEST_F(NodeMetaInfo, get_no_function_names_for_default_metainfo) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + auto functionNames = metaInfo.slotNames(); + + ASSERT_THAT(functionNames, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_no_function_names_if_node_is_invalid) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto functionNames = metaInfo.slotNames(); + + ASSERT_THAT(functionNames, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_default_property) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + auto defaultProperty = metaInfo.property("data"); + + auto property = metaInfo.defaultProperty(); + + ASSERT_THAT(property, defaultProperty); +} + +TEST_F(NodeMetaInfo, get_no_default_property_for_default_metainfo) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + auto property = metaInfo.defaultProperty(); + + ASSERT_THAT(property, IsFalse()); +} + +TEST_F(NodeMetaInfo, get_no_default_property_if_node_is_invalid) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto property = metaInfo.defaultProperty(); + + ASSERT_THAT(property, IsFalse()); +} + +TEST_F(NodeMetaInfo, get_default_property_name) +{ + auto node = model.createModelNode("QtQuick.Item"); + auto metaInfo = node.metaInfo(); + auto defaultProperty = metaInfo.property("data"); + + auto property = metaInfo.defaultPropertyName(); + + ASSERT_THAT(property, "data"); +} + +TEST_F(NodeMetaInfo, get_no_default_property_name_for_default_metainfo) +{ + auto metaInfo = QmlDesigner::NodeMetaInfo{}; + + auto property = metaInfo.defaultPropertyName(); + + ASSERT_THAT(property, IsEmpty()); +} + +TEST_F(NodeMetaInfo, get_no_default_property_name_if_node_is_invalid) +{ + auto node = model.createModelNode("QtQuick.Foo"); + auto metaInfo = node.metaInfo(); + + auto property = metaInfo.defaultPropertyName(); + + ASSERT_THAT(property, IsEmpty()); +} + +} // namespace diff --git a/tests/unit/tests/unittests/model/CMakeLists.txt b/tests/unit/tests/unittests/model/CMakeLists.txt index 8cd6b911ec7..187ed9f99a0 100644 --- a/tests/unit/tests/unittests/model/CMakeLists.txt +++ b/tests/unit/tests/unittests/model/CMakeLists.txt @@ -3,6 +3,7 @@ extend_qtc_test(unittest SOURCES import-test.cpp model-test.cpp + modelnode-test.cpp nodelistproperty-test.cpp modelresourcemanagement-test.cpp ) diff --git a/tests/unit/tests/unittests/model/modelnode-test.cpp b/tests/unit/tests/unittests/model/modelnode-test.cpp new file mode 100644 index 00000000000..0d9cf1b1842 --- /dev/null +++ b/tests/unit/tests/unittests/model/modelnode-test.cpp @@ -0,0 +1,27 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "../utils/googletest.h" + +#include "../mocks/projectstoragemock.h" + +#include +#include +#include + +namespace { + +class ModelNode : public testing::Test +{ +protected: + NiceMock projectStorageMock; + QmlDesigner::Model model{projectStorageMock, "QtQuick.Item"}; + QmlDesigner::ModelNode rootNode = model.rootModelNode(); +}; + +TEST_F(ModelNode, get_meta_info) +{ + auto metaInfo = rootNode.metaInfo(); +} + +} // namespace diff --git a/tests/unit/tests/utils/google-using-declarations.h b/tests/unit/tests/utils/google-using-declarations.h index 105b65714c7..19e8df2ef20 100644 --- a/tests/unit/tests/utils/google-using-declarations.h +++ b/tests/unit/tests/utils/google-using-declarations.h @@ -30,9 +30,11 @@ using testing::Gt; using testing::HasSubstr; using testing::InSequence; using testing::Invoke; +using testing::IsFalse; using testing::IsNull; using testing::IsSubsetOf; using testing::IsSupersetOf; +using testing::IsTrue; using testing::Le; using testing::Lt; using testing::Matcher; From 90cfc2f7e85914f51e38e698d6636b10302e54ad Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 27 Jun 2023 14:57:12 +0200 Subject: [PATCH 120/149] QmlDesigner: Fix warnings Change-Id: I2b9c2d024b1c09c157e448f590e2748337cbeb89 Reviewed-by: Tim Jenssen --- .../qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp | 2 +- tests/unit/tests/mocks/projectstoragemock.cpp | 2 +- .../unit/tests/unittests/model/modelresourcemanagement-test.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index a696fd45cea..e520079a5d1 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -248,7 +248,7 @@ void Qt5NodeInstanceServer::savePipelineCacheData() #endif } -void Qt5NodeInstanceServer::setPipelineCacheConfig(QQuickWindow *w) +void Qt5NodeInstanceServer::setPipelineCacheConfig([[maybe_unused]] QQuickWindow *w) { #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 1) // This dummy file is not actually used for cache as we manage cache save/load ourselves, diff --git a/tests/unit/tests/mocks/projectstoragemock.cpp b/tests/unit/tests/mocks/projectstoragemock.cpp index 37384e48507..2c3a4a622ff 100644 --- a/tests/unit/tests/mocks/projectstoragemock.cpp +++ b/tests/unit/tests/mocks/projectstoragemock.cpp @@ -164,7 +164,7 @@ void ProjectStorageMock::setupQtQtuick() auto qtQuickModuleId = createModule("QtQuick"); auto qtQuickNativeModuleId = createModule("QtQuick-cppnative"); - auto intId = createType(qmlModuleId, "int", Storage::TypeTraits::Value); + createType(qmlModuleId, "int", Storage::TypeTraits::Value); auto qtObjectId = createObject(qmlModuleId, "QtObject", diff --git a/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp b/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp index c5f5ebd7326..d0dc04db402 100644 --- a/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp +++ b/tests/unit/tests/unittests/model/modelresourcemanagement-test.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include From 5bd9721f010d32a2be932fe8d7cffa4433474f08 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 27 Jun 2023 14:58:50 +0200 Subject: [PATCH 121/149] UnitTests: Fix disabled test Change-Id: I828ba785ac352a72b0fe7e3c3ea23c72df219fe5 Reviewed-by: Tim Jenssen --- .../tests/unittests/projectstorage/qmldocumentparser-test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp b/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp index 700067e1e38..e823f5f7f44 100644 --- a/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/qmldocumentparser-test.cpp @@ -357,7 +357,7 @@ TEST_F(QmlDocumentParser, enumeration) ElementsAre(IsEnumerator("On", 0), IsEnumerator("Off", 1)))))); } -TEST_F(QmlDocumentParser, disabled_duplicate_imports_are_removed) +TEST_F(QmlDocumentParser, DISABLED_duplicate_imports_are_removed) { ModuleId fooDirectoryModuleId = storage.moduleId("/path/foo"); ModuleId qmlModuleId = storage.moduleId("QML"); From d7a60e41184ee4489db70d541a66ab4dc3cfd285 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 27 Jun 2023 12:24:31 +0200 Subject: [PATCH 122/149] QmlDesigner: Improve main qmlFile fallback logic Change-Id: Ie08373478518e17c9c0525b945ff5397eeb824a0 Reviewed-by: Burak Hancerli Reviewed-by: Aleksei German --- .../qmlprojectmanager/buildsystem/qmlbuildsystem.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp index 6ecdeed638b..3d6e74fe524 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp @@ -342,12 +342,16 @@ Utils::FilePath QmlBuildSystem::getStartupQmlFileWithFallback() const const QStringView uiqmlstr = u"ui.qml"; const QStringView qmlstr = u"qml"; - //we will check mainUiFile twice: + //we will check mainUiFile and mainFile twice: //first priority if it's ui.qml file, second if it's just a qml file const Utils::FilePath mainUiFile = mainUiFilePath(); if (mainUiFile.exists() && mainUiFile.completeSuffix() == uiqmlstr) return mainUiFile; + const Utils::FilePath mainQmlFile = mainFilePath(); + if (mainQmlFile.exists() && mainQmlFile.completeSuffix() == uiqmlstr) + return mainQmlFile; + const Utils::FilePaths uiFiles = currentProject->files([&](const ProjectExplorer::Node *node) { return node->filePath().completeSuffix() == uiqmlstr; }); @@ -356,11 +360,10 @@ Utils::FilePath QmlBuildSystem::getStartupQmlFileWithFallback() const return file; } - //check the suffix of mainUiFile again, since there are no ui.qml files: + //check the suffix of mainUiFiles again, since there are no ui.qml files: if (mainUiFile.exists() && mainUiFile.completeSuffix() == qmlstr) return mainUiFile; - const Utils::FilePath mainQmlFile = mainFilePath(); if (mainQmlFile.exists() && mainQmlFile.completeSuffix() == qmlstr) return mainQmlFile; From cbe6d53fa7debab32a3d6c3faee56d8d050717b4 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 27 Jun 2023 12:51:18 +0200 Subject: [PATCH 123/149] QmlDesigner: Fix multi-arg warning Change-Id: Ic88706b92001a60d56f901684d7a08dab9f26c3d Reviewed-by: Aleksei German Reviewed-by: Burak Hancerli --- src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp index 3d6e74fe524..8415d0ef895 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp @@ -290,14 +290,14 @@ bool QmlBuildSystem::setFileSettingInProjectFile(const QString &setting, const QString relativePath = mainFilePath.relativeChildPath(projectDir).path(); if (fileContent.indexOf(settingQmlCode) < 0) { - QString addedText = QString("\n %1 \"%2\"\n").arg(settingQmlCode).arg(relativePath); + QString addedText = QString("\n %1 \"%2\"\n").arg(settingQmlCode, relativePath); auto index = fileContent.lastIndexOf("}"); fileContent.insert(index, addedText); } else { QString originalFileName = oldFile; originalFileName.replace(".", "\\."); const QRegularExpression expression( - QString("%1\\s*\"(%2)\"").arg(settingQmlCode).arg(originalFileName)); + QString("%1\\s*\"(%2)\"").arg(settingQmlCode, originalFileName)); const QRegularExpressionMatch match = expression.match(fileContent); From cfadc5a984f059b59d87194e2c7a98b92a98ad26 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 27 Jun 2023 12:52:33 +0200 Subject: [PATCH 124/149] QmlDesigner: Add context object to a connection Change-Id: I3662737acf3d80c17c8004594540220296971ef3 Reviewed-by: Burak Hancerli Reviewed-by: Qt CI Bot Reviewed-by: Aleksei German --- src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp index 8415d0ef895..307b6d61451 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp @@ -83,11 +83,11 @@ QmlBuildSystem::QmlBuildSystem(Target *target) updateDeploymentData(); registerMenuButtons(); - connect(target->project(), &Project::activeTargetChanged, [this](Target *target) { + connect(target->project(), &Project::activeTargetChanged, this, [this](Target *target) { refresh(RefreshOptions::NoFileRefresh); updateMcuBuildStep(target, qtForMCUs()); }); - connect(target->project(), &Project::projectFileIsDirty, [this]() { + connect(target->project(), &Project::projectFileIsDirty, this, [this]() { refresh(RefreshOptions::Project); updateMcuBuildStep(project()->activeTarget(), qtForMCUs()); }); From f36062c084d8d1c0bf0cd672cb2f7144d81b5e03 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 27 Jun 2023 17:51:07 +0200 Subject: [PATCH 125/149] UnitTests: Temporary remove function registry The function is not used but triggers strange accesses to null pointer. Task-number: QDS-10178 Change-Id: Iea51609f7b8956a98fe9391aef8edac899e14c03 Reviewed-by: Tim Jenssen --- tests/unit/tests/unittests/projectstorage/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/tests/unittests/projectstorage/CMakeLists.txt b/tests/unit/tests/unittests/projectstorage/CMakeLists.txt index 706d563c322..5c3fd4011e2 100644 --- a/tests/unit/tests/unittests/projectstorage/CMakeLists.txt +++ b/tests/unit/tests/unittests/projectstorage/CMakeLists.txt @@ -6,7 +6,6 @@ extend_qtc_test(unittest modulescanner-test.cpp projectstorage-test.cpp projectstoragepathwatcher-test.cpp - projectstoragesqlitefunctionregistry-test.cpp projectstorageupdater-test.cpp sourcepath-test.cpp sourcepathcache-test.cpp From 37983e0c535689c5d2703e766de873e1974aee5f Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Fri, 16 Jun 2023 17:30:39 +0200 Subject: [PATCH 126/149] QmlDesigner: Fix assets library indicator icon * Add proper themeable indicator to expandable TreeViewDelegate * Adapt font pixel size to property editor section head Task-number: QDS-10106 Change-Id: If9cef52bfeedaf8fcdd734f0c7564701f25e2114 Reviewed-by: Reviewed-by: Thomas Hartmann Reviewed-by: Brook Cronin --- .../assetsLibraryQmlSources/AssetDelegate.qml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/qmldesigner/assetsLibraryQmlSources/AssetDelegate.qml b/share/qtcreator/qmldesigner/assetsLibraryQmlSources/AssetDelegate.qml index 7c017476cdd..12f5ebf4c15 100644 --- a/share/qtcreator/qmldesigner/assetsLibraryQmlSources/AssetDelegate.qml +++ b/share/qtcreator/qmldesigner/assetsLibraryQmlSources/AssetDelegate.qml @@ -9,6 +9,8 @@ import AssetsLibraryBackend TreeViewDelegate { id: root + property StudioTheme.ControlStyle style: StudioTheme.Values.controlStyle + required property Item assetsView required property Item assetsRoot @@ -68,6 +70,21 @@ TreeViewDelegate { root.depth = root.initialDepth } + indicator: Item { + implicitWidth: 20 + implicitHeight: root.implicitHeight + anchors.left: bg.left + + Image { + id: arrow + width: 8 + height: 4 + source: "image://icons/down-arrow" + anchors.centerIn: parent + rotation: root.expanded ? 0 : -90 + } + } + background: Rectangle { id: bg @@ -109,7 +126,7 @@ TreeViewDelegate { id: assetLabel text: assetLabel.__computeText() color: StudioTheme.Values.themeTextColor - font.pixelSize: StudioTheme.Values.mediumFont + font.pixelSize: StudioTheme.Values.baseFontSize anchors.verticalCenter: parent.verticalCenter verticalAlignment: Qt.AlignVCenter From b65ba2f7028cdf2ed9584dc51ed4757c028a4f6a Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 28 Jun 2023 16:33:07 +0200 Subject: [PATCH 127/149] QmlDesigner: Remove ProjectStorageSqliteFunctionRegistry It is not used. Change-Id: I7c2968a0a9876c04afffceedb87d46f19f0a7ace Reviewed-by: Tim Jenssen --- .../projectstoragesqlitefunctionregistry.cpp | 61 ------------ .../projectstoragesqlitefunctionregistry.h | 16 ---- .../tests/testdesignercore/CMakeLists.txt | 2 - ...jectstoragesqlitefunctionregistry-test.cpp | 95 ------------------- 4 files changed, 174 deletions(-) delete mode 100644 src/plugins/qmldesigner/designercore/projectstorage/projectstoragesqlitefunctionregistry.cpp delete mode 100644 src/plugins/qmldesigner/designercore/projectstorage/projectstoragesqlitefunctionregistry.h delete mode 100644 tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragesqlitefunctionregistry.cpp b/src/plugins/qmldesigner/designercore/projectstorage/projectstoragesqlitefunctionregistry.cpp deleted file mode 100644 index 5f50c5bcdad..00000000000 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragesqlitefunctionregistry.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "projectstoragesqlitefunctionregistry.h" - -#include "sqlite.h" - -namespace QmlDesigner { - -extern "C" { -namespace { -void unqualifiedTypeName(sqlite3_context *context, int, sqlite3_value **arguments) -{ - auto argument = arguments[0]; - - auto errorText = "unqualifiedTypeName only accepts text"; - - if (sqlite3_value_type(argument) != SQLITE_TEXT) { - sqlite3_result_error(context, errorText, int(std::char_traits::length(errorText))); - return; - } - - auto size = sqlite3_value_bytes(argument); - - auto content = reinterpret_cast(sqlite3_value_text(argument)); - - auto begin = content; - auto end = content + size; - - auto rbegin = std::make_reverse_iterator(end); - auto rend = std::make_reverse_iterator(begin); - - auto found = std::find(rbegin, rend, '.').base(); - - auto unqualifiedSize = end - found; - - sqlite3_result_text(context, found, int(unqualifiedSize), SQLITE_STATIC); -} - -void registerUnqualifiedTypeName(sqlite3 *database) -{ - sqlite3_create_function(database, - "unqualifiedTypeName", - 1, - SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS, - nullptr, - unqualifiedTypeName, - nullptr, - nullptr); -} -} // namespace -} - -ProjectStorageSqliteFunctionRegistry::ProjectStorageSqliteFunctionRegistry(Sqlite::Database &database) -{ - auto databaseHandle = database.backend().sqliteDatabaseHandle(); - - registerUnqualifiedTypeName(databaseHandle); -} - -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragesqlitefunctionregistry.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstoragesqlitefunctionregistry.h deleted file mode 100644 index 64836dd686c..00000000000 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragesqlitefunctionregistry.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -namespace QmlDesigner { - -class ProjectStorageSqliteFunctionRegistry -{ -public: - ProjectStorageSqliteFunctionRegistry(Sqlite::Database &database); -}; - -} // namespace QmlDesigner diff --git a/tests/unit/tests/testdesignercore/CMakeLists.txt b/tests/unit/tests/testdesignercore/CMakeLists.txt index 00cbfeda1a9..83f03c39e23 100644 --- a/tests/unit/tests/testdesignercore/CMakeLists.txt +++ b/tests/unit/tests/testdesignercore/CMakeLists.txt @@ -130,8 +130,6 @@ add_qtc_library(TestDesignerCore OBJECT projectstorage/projectstoragepathwatcher.h projectstorage/projectstoragepathwatcherinterface.h projectstorage/projectstoragepathwatchernotifierinterface.h - projectstorage/projectstoragesqlitefunctionregistry.cpp - projectstorage/projectstoragesqlitefunctionregistry.h projectstorage/projectstoragepathwatcher.h projectstorage/projectstoragepathwatchertypes.h projectstorage/projectstoragetypes.h diff --git a/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp deleted file mode 100644 index 560e2413c64..00000000000 --- a/tests/unit/tests/unittests/projectstorage/projectstoragesqlitefunctionregistry-test.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "../utils/googletest.h" - -#include - -namespace { - -class ProjectStorageSqliteFunctionRegistry : public testing::Test -{ -protected: - Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory}; - QmlDesigner::ProjectStorageSqliteFunctionRegistry registry{database}; -}; - -TEST_F(ProjectStorageSqliteFunctionRegistry, returns_unqualified_type) -{ - std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement{"SELECT unqualifiedTypeName('Foo.Bar')", database}; - - auto typeName = statement.value(); - - ASSERT_THAT(typeName, Eq("Bar")); -} - -TEST_F(ProjectStorageSqliteFunctionRegistry, returns_whole_string_if_not_dot_is_found) -{ - std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement{"SELECT unqualifiedTypeName('Foo_Bar')", database}; - - auto typeName = statement.value(); - - ASSERT_THAT(typeName, Eq("Foo_Bar")); -} - -TEST_F(ProjectStorageSqliteFunctionRegistry, return_empty_string_for_empty_input) -{ - std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement{"SELECT unqualifiedTypeName('')", database}; - - auto typeName = statement.value(); - - ASSERT_THAT(typeName, IsEmpty()); -} - -TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_integer) -{ - std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName(1)", database); - - ASSERT_THROW(statement.value(), Sqlite::StatementHasError); -} - -TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_float) -{ - std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName(1.4)", database); - - ASSERT_THROW(statement.value(), Sqlite::StatementHasError); -} - -TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_blob) -{ - std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName(x'0500')", database); - - ASSERT_THROW(statement.value(), Sqlite::StatementHasError); -} - -TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_null) -{ - std::lock_guard lock{database}; - Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName(NULL)", database); - - ASSERT_THROW(statement.value(), Sqlite::StatementHasError); -} - -TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_no_argument) -{ - std::lock_guard lock{database}; - - ASSERT_THROW(Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName()", database), - Sqlite::StatementHasError); -} - -TEST_F(ProjectStorageSqliteFunctionRegistry, throws_error_for_to_many_argument) -{ - std::lock_guard lock{database}; - - ASSERT_THROW(Sqlite::ReadStatement<1> statement("SELECT unqualifiedTypeName('foo', 'bar')", - database), - Sqlite::StatementHasError); -} -} // namespace From f81ef9b2d6c010c8d9e0952f1ed6d308567bb63f Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 28 Jun 2023 15:22:23 +0200 Subject: [PATCH 128/149] Sqlite: Don't link to the internal Sqlite library If you link to the internal Sqlite library you link actually twice. That leads to strange bugs because you have an uninitialized object file. The static linking workaround is now moved to cmake. Change-Id: I51d966a623a18486ce5870d898999f3ce139f092 Reviewed-by: Tim Jenssen --- src/libs/3rdparty/sqlite/config.h | 4 --- src/libs/sqlite/CMakeLists.txt | 30 +++++++++++++------ tests/unit/tests/printers/CMakeLists.txt | 2 +- .../tests/printers/gtest-creator-printing.cpp | 2 +- .../tests/testdesignercore/CMakeLists.txt | 2 +- tests/unit/tests/unittests/CMakeLists.txt | 2 +- .../sqlite/sqlitedatabasebackend-test.cpp | 2 +- 7 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/libs/3rdparty/sqlite/config.h b/src/libs/3rdparty/sqlite/config.h index 3672f4c5ddf..f0e73be3009 100644 --- a/src/libs/3rdparty/sqlite/config.h +++ b/src/libs/3rdparty/sqlite/config.h @@ -27,10 +27,6 @@ #include -#if defined(SQLITE_STATIC_LIBRARY) || defined(SQLITEC_STATIC_LIBRARY) -#include "sqlite_static_config.h" -#endif - #if __has_include() #include #endif diff --git a/src/libs/sqlite/CMakeLists.txt b/src/libs/sqlite/CMakeLists.txt index 4c7cd774c60..aa33171bab1 100644 --- a/src/libs/sqlite/CMakeLists.txt +++ b/src/libs/sqlite/CMakeLists.txt @@ -1,8 +1,7 @@ -add_qtc_library(SqliteC OBJECT +add_qtc_library(SqliteInternal OBJECT PROPERTIES AUTOMOC OFF AUTOUIC OFF QT_COMPILE_OPTIONS_DISABLE_WARNINGS ON DEFINES SQLITE_CORE SQLITE_CUSTOM_INCLUDE=config.h $<$:SQLITE_DEBUG> - PROPERTIES COMPILE_OPTIONS $,/FIconfig.h,-includeconfig.h> - PUBLIC_INCLUDES + INCLUDES ../3rdparty/sqlite SOURCES ../3rdparty/sqlite @@ -11,12 +10,26 @@ add_qtc_library(SqliteC OBJECT ../3rdparty/sqlite/sqlite3ext.h ../3rdparty/sqlite/carray.c ../3rdparty/sqlite/config.h + ../3rdparty/sqlite/sqlite_static_config.h ../3rdparty/sqlite/sqlite.h ) +extend_qtc_library(SqliteInternal + CONDITION QTC_STATIC_BUILD + PROPERTIES COMPILE_OPTIONS $,/FIsqlite_static_config.h,-includesqlite_static_config.h> +) + +if (APPLE) + extend_qtc_library(SqliteInternal DEFINES _BSD_SOURCE) +elseif (UNIX) + extend_qtc_library(SqliteInternal DEFINES _POSIX_C_SOURCE=200809L _GNU_SOURCE _DEFAULT_SOURCE) +endif() + add_qtc_library(Sqlite PROPERTIES AUTOMOC OFF AUTOUIC OFF - DEPENDS Qt::Core Threads::Threads ${CMAKE_DL_LIBS} SqliteC + DEPENDS Qt::Core Threads::Threads ${CMAKE_DL_LIBS} SqliteInternal + INCLUDES + ../3rdparty/sqlite PUBLIC_INCLUDES "${CMAKE_CURRENT_LIST_DIR}" DEFINES SQLITE_CUSTOM_INCLUDE=config.h $<$:SQLITE_REVERSE> @@ -53,8 +66,7 @@ add_qtc_library(Sqlite sqliteids.h ) -if (APPLE) - extend_qtc_library(SqliteC DEFINES _BSD_SOURCE) -elseif (UNIX) - extend_qtc_library(SqliteC DEFINES _POSIX_C_SOURCE=200809L _GNU_SOURCE _DEFAULT_SOURCE) -endif() +extend_qtc_library(Sqlite + CONDITION QTC_STATIC_BUILD + PROPERTIES COMPILE_OPTIONS $,/FIsqlite_static_config.h,-includesqlite_static_config.h> +) diff --git a/tests/unit/tests/printers/CMakeLists.txt b/tests/unit/tests/printers/CMakeLists.txt index 62b1ad966e1..83f6812ef03 100644 --- a/tests/unit/tests/printers/CMakeLists.txt +++ b/tests/unit/tests/printers/CMakeLists.txt @@ -3,7 +3,7 @@ add_qtc_library(TestPrinters OBJECT SKIP_AUTOMOC ON PUBLIC_INCLUDES ${CMAKE_CURRENT_LIST_DIR} DEPENDS - Qt::Core Qt::Widgets SqliteC Sqlite Googletest TestDesignerCore + Qt::Core Qt::Widgets Sqlite Googletest TestDesignerCore SOURCES gtest-creator-printing.cpp gtest-creator-printing.h gtest-qt-printing.cpp gtest-qt-printing.h diff --git a/tests/unit/tests/printers/gtest-creator-printing.cpp b/tests/unit/tests/printers/gtest-creator-printing.cpp index 4f0a4171051..61922895c04 100644 --- a/tests/unit/tests/printers/gtest-creator-printing.cpp +++ b/tests/unit/tests/printers/gtest-creator-printing.cpp @@ -9,6 +9,7 @@ #include #include +#include <3rdparty/sqlite/sqlite.h> #include #include #include @@ -17,7 +18,6 @@ #include #include #include -#include #include #include #include diff --git a/tests/unit/tests/testdesignercore/CMakeLists.txt b/tests/unit/tests/testdesignercore/CMakeLists.txt index 83f03c39e23..a3f1697f68a 100644 --- a/tests/unit/tests/testdesignercore/CMakeLists.txt +++ b/tests/unit/tests/testdesignercore/CMakeLists.txt @@ -5,7 +5,7 @@ add_qtc_library(TestDesignerCore OBJECT DEPENDS Qt::Core Qt::Network Qt::Widgets Qt::Xml Qt::Concurrent Qt::QmlPrivate Qt::Gui - Qt::Core5Compat Utils QmlJS Sqlite SqliteC + Qt::Core5Compat Utils QmlJS Sqlite PUBLIC_DEPENDS QmlPuppetCommunication SOURCES_PREFIX ${QmlDesignerDir}/designercore diff --git a/tests/unit/tests/unittests/CMakeLists.txt b/tests/unit/tests/unittests/CMakeLists.txt index a50a0a2a761..7f745301670 100644 --- a/tests/unit/tests/unittests/CMakeLists.txt +++ b/tests/unit/tests/unittests/CMakeLists.txt @@ -7,7 +7,7 @@ add_qtc_test(unittest GTEST DEPENDS Qt::Core Qt::Network Qt::Widgets Qt::Xml Qt::Concurrent Qt::QmlPrivate Qt::Gui - Qt::Core5Compat Utils QmlJS Sqlite SqliteC + Qt::Core5Compat Utils QmlJS Sqlite Googletest TestDesignerCore TestUtils TestMatchers TestPrinters TestMocks DEFINES GTEST_INTERNAL_HAS_STRING_VIEW diff --git a/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp b/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp index 7178bac34ae..b009b7a5252 100644 --- a/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp +++ b/tests/unit/tests/unittests/sqlite/sqlitedatabasebackend-test.cpp @@ -9,7 +9,7 @@ #include #include -#include +#include <3rdparty/sqlite/sqlite.h> #include From 2b3ffe61c949f9568ec9e31f78ba2a84ccfd0de8 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Tue, 18 Apr 2023 14:09:48 +0300 Subject: [PATCH 129/149] QmlDesigner: Add effects bundle to the Content Library Fixes: QDS-9683 Fixes: QDS-10167 Fixes: QDS-10171 Fixes: QDS-10191 Fixes: QDS-10192 Change-Id: Ia6f764737783277c719109b28fad248ae3ea2990 Reviewed-by: Miikka Heikkinen --- .../ContentLibrary.qml | 21 +- .../ContentLibraryEffect.qml | 90 ++++ .../ContentLibraryEffectContextMenu.qml | 39 ++ .../ContentLibraryEffectsView.qml | 112 +++++ .../UnimportBundleMaterialDialog.qml | 14 +- .../imports/StudioTheme/InternalConstants.qml | 411 +++++++++--------- .../imports/StudioTheme/icons.ttf | Bin 57492 -> 60040 bytes src/plugins/qmldesigner/CMakeLists.txt | 3 + .../components/componentcore/theme.h | 1 + .../contentlibrary/contentlibraryeffect.cpp | 78 ++++ .../contentlibrary/contentlibraryeffect.h | 62 +++ .../contentlibraryeffectscategory.cpp | 63 +++ .../contentlibraryeffectscategory.h | 47 ++ .../contentlibraryeffectsmodel.cpp | 286 ++++++++++++ .../contentlibraryeffectsmodel.h | 90 ++++ .../contentlibrary/contentlibraryview.cpp | 80 +++- .../contentlibrary/contentlibraryview.h | 9 +- .../contentlibrary/contentlibrarywidget.cpp | 42 +- .../contentlibrary/contentlibrarywidget.h | 11 +- .../components/edit3d/edit3dview.cpp | 8 + .../components/edit3d/edit3dview.h | 2 + .../components/edit3d/edit3dwidget.cpp | 8 + .../navigator/navigatortreemodel.cpp | 5 + .../qmldesigner/qmldesignerconstants.h | 1 + 24 files changed, 1260 insertions(+), 223 deletions(-) create mode 100644 share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffect.qml create mode 100644 share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectContextMenu.qml create mode 100644 share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectsView.qml create mode 100644 src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffect.cpp create mode 100644 src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffect.h create mode 100644 src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectscategory.cpp create mode 100644 src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectscategory.h create mode 100644 src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectsmodel.cpp create mode 100644 src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectsmodel.h diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml index 37154ec170b..b8c406b8291 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml @@ -19,6 +19,7 @@ Item { materialsView.closeContextMenu() texturesView.closeContextMenu() environmentsView.closeContextMenu() + effectsView.closeContextMenu() HelperWidgets.Controller.closeContextMenu() } @@ -76,7 +77,8 @@ Item { height: StudioTheme.Values.toolbarHeight tabsModel: [{name: qsTr("Materials"), icon: StudioTheme.Constants.material_medium}, {name: qsTr("Textures"), icon: StudioTheme.Constants.textures_medium}, - {name: qsTr("Environments"), icon: StudioTheme.Constants.languageList_medium}] + {name: qsTr("Environments"), icon: StudioTheme.Constants.languageList_medium}, + {name: qsTr("Effects"), icon: StudioTheme.Constants.effects}] } } } @@ -98,7 +100,8 @@ Item { searchBox: searchBox onUnimport: (bundleMat) => { - confirmUnimportDialog.targetBundleMaterial = bundleMat + confirmUnimportDialog.targetBundleItem = bundleMat + confirmUnimportDialog.targetBundleType = "material" confirmUnimportDialog.open() } } @@ -122,6 +125,20 @@ Item { searchBox: searchBox } + + ContentLibraryEffectsView { + id: effectsView + + width: root.width + + searchBox: searchBox + + onUnimport: (bundleItem) => { + confirmUnimportDialog.targetBundleItem = bundleItem + confirmUnimportDialog.targetBundleType = "effect" + confirmUnimportDialog.open() + } + } } } } diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffect.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffect.qml new file mode 100644 index 00000000000..6230d38974e --- /dev/null +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffect.qml @@ -0,0 +1,90 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +import QtQuick +import QtQuick.Layouts +import QtQuickDesignerTheme +import HelperWidgets +import QtQuick.Controls + +import StudioTheme as StudioTheme +import ContentLibraryBackend + +Item { + id: root + + signal showContextMenu() + + visible: modelData.bundleItemVisible + + MouseArea { + id: mouseArea + + hoverEnabled: true + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + + onPressed: (mouse) => { + if (mouse.button === Qt.LeftButton && !ContentLibraryBackend.effectsModel.importerRunning) + ContentLibraryBackend.rootView.startDragEffect(modelData, mapToGlobal(mouse.x, mouse.y)) + else if (mouse.button === Qt.RightButton) + root.showContextMenu() + } + } + + Column { + anchors.fill: parent + spacing: 1 + + Item { width: 1; height: 5 } // spacer + + Image { + id: img + + width: root.width - 10 + height: img.width + anchors.horizontalCenter: parent.horizontalCenter + source: modelData.bundleItemIcon + cache: false + + Rectangle { // circular indicator for imported bundle effect + width: 10 + height: 10 + radius: 5 + anchors.right: img.right + anchors.top: img.top + anchors.margins: 5 + color: "#00ff00" + border.color: "#555555" + border.width: 1 + visible: modelData.bundleItemImported + + ToolTip { + visible: indicatorMouseArea.containsMouse + text: qsTr("Effect is imported to project") + delay: 1000 + } + + MouseArea { + id: indicatorMouseArea + anchors.fill: parent + hoverEnabled: true + } + } + } + + Text { + text: modelData.bundleItemName + + width: img.width + clip: true + + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: TextInput.AlignHCenter + + font.pixelSize: StudioTheme.Values.myFontSize + + color: StudioTheme.Values.themeTextColor + } + } // Column +} diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectContextMenu.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectContextMenu.qml new file mode 100644 index 00000000000..3abbfe88ada --- /dev/null +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectContextMenu.qml @@ -0,0 +1,39 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +import QtQuick +import HelperWidgets +import StudioControls as StudioControls +import StudioTheme as StudioTheme +import ContentLibraryBackend + +StudioControls.Menu { + id: root + + property var targetItem: null + + readonly property bool targetAvailable: targetItem && !ContentLibraryBackend.effectsModel.importerRunning + + signal unimport(var bundleEff); + + function popupMenu(targetItem = null) + { + this.targetItem = targetItem + popup() + } + + closePolicy: StudioControls.Menu.CloseOnEscape | StudioControls.Menu.CloseOnPressOutside + + StudioControls.MenuItem { + text: qsTr("Add an instance") + enabled: root.targetAvailable + onTriggered: ContentLibraryBackend.effectsModel.addInstance(root.targetItem) + } + + StudioControls.MenuItem { + enabled: root.targetAvailable && root.targetItem.bundleItemImported + text: qsTr("Remove from project") + + onTriggered: root.unimport(root.targetItem) + } +} diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectsView.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectsView.qml new file mode 100644 index 00000000000..1fe8f52c134 --- /dev/null +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectsView.qml @@ -0,0 +1,112 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +import QtQuick +import HelperWidgets as HelperWidgets +import StudioControls as StudioControls +import StudioTheme as StudioTheme +import ContentLibraryBackend + +HelperWidgets.ScrollView { + id: root + + clip: true + interactive: !ctxMenu.opened && !ContentLibraryBackend.rootView.isDragging + && !HelperWidgets.Controller.contextMenuOpened + + readonly property int cellWidth: 100 + readonly property int cellHeight: 120 + + required property var searchBox + + signal unimport(var bundleItem); + + function closeContextMenu() + { + ctxMenu.close() + } + + function expandVisibleSections() + { + for (let i = 0; i < categoryRepeater.count; ++i) { + let cat = categoryRepeater.itemAt(i) + if (cat.visible && !cat.expanded) + cat.expandSection() + } + } + + Column { + ContentLibraryEffectContextMenu { + id: ctxMenu + + onUnimport: (bundleEff) => root.unimport(bundleEff) + } + + Repeater { + id: categoryRepeater + + model: ContentLibraryBackend.effectsModel + + delegate: HelperWidgets.Section { + width: root.width + caption: bundleCategoryName + addTopPadding: false + sectionBackgroundColor: "transparent" + visible: bundleCategoryVisible && !ContentLibraryBackend.effectsModel.isEmpty + expanded: bundleCategoryExpanded + expandOnClick: false + category: "ContentLib_Effect" + + onToggleExpand: bundleCategoryExpanded = !bundleCategoryExpanded + onExpand: bundleCategoryExpanded = true + onCollapse: bundleCategoryExpanded = false + + function expandSection() { + bundleCategoryExpanded = true + } + + Grid { + width: root.width + leftPadding: 5 + rightPadding: 5 + bottomPadding: 5 + columns: root.width / root.cellWidth + + Repeater { + model: bundleCategoryItems + + delegate: ContentLibraryEffect { + width: root.cellWidth + height: root.cellHeight + + onShowContextMenu: ctxMenu.popupMenu(modelData) + } + } + } + } + } + + Text { + id: infoText + text: { + if (!ContentLibraryBackend.effectsModel.bundleExists) + qsTr("No effects available.") + else if (!ContentLibraryBackend.rootView.hasQuick3DImport) + qsTr("To use Content Library, first add the QtQuick3D module in the Components view.") + else if (!ContentLibraryBackend.effectsModel.hasRequiredQuick3DImport) + qsTr("To use Content Library, version 6.4 or later of the QtQuick3D module is required.") + else if (!ContentLibraryBackend.rootView.hasMaterialLibrary) + qsTr("Content Library is disabled inside a non-visual component.") + else if (!searchBox.isEmpty()) + qsTr("No match found.") + else + "" + } + color: StudioTheme.Values.themeTextColor + font.pixelSize: StudioTheme.Values.baseFontSize + topPadding: 10 + leftPadding: 10 + visible: ContentLibraryBackend.effectsModel.isEmpty + } + } +} diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/UnimportBundleMaterialDialog.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/UnimportBundleMaterialDialog.qml index a8c3758eb5b..edb6ce36707 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/UnimportBundleMaterialDialog.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/UnimportBundleMaterialDialog.qml @@ -10,7 +10,7 @@ import StudioControls as StudioControls import StudioTheme as StudioTheme import ContentLibraryBackend -Dialog { +StudioControls.Dialog { id: root title: qsTr("Bundle material might be in use") @@ -19,7 +19,8 @@ Dialog { implicitWidth: 300 modal: true - property var targetBundleMaterial + property var targetBundleType // "effect" or "material" + property var targetBundleItem contentItem: Column { spacing: 20 @@ -28,7 +29,8 @@ Dialog { Text { id: folderNotEmpty - text: qsTr("If the material you are removing is in use, it might cause the project to malfunction.\n\nAre you sure you want to remove the material?") + text: qsTr("If the %1 you are removing is in use, it might cause the project to malfunction.\n\nAre you sure you want to remove the %1?") + .arg(root.targetBundleType) color: StudioTheme.Values.themeTextColor wrapMode: Text.WordWrap anchors.right: parent.right @@ -48,7 +50,11 @@ Dialog { text: qsTr("Remove") onClicked: { - ContentLibraryBackend.materialsModel.removeFromProject(root.targetBundleMaterial) + if (root.targetBundleType === "material") + ContentLibraryBackend.materialsModel.removeFromProject(root.targetBundleItem) + else if (root.targetBundleType === "effect") + ContentLibraryBackend.effectsModel.removeFromProject(root.targetBundleItem) + root.accept() } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml index 864f4b8092d..f5a3bbdc7bf 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/InternalConstants.qml @@ -133,211 +133,212 @@ QtObject { readonly property string editLightOn_medium: "\u0096" readonly property string edit_medium: "\u0097" readonly property string edit_small: "\u0098" - readonly property string events_small: "\u0099" - readonly property string export_medium: "\u009A" - readonly property string eyeDropper: "\u009B" - readonly property string favorite: "\u009D" - readonly property string fitAll_medium: "\u009E" - readonly property string fitSelected_small: "\u009F" - readonly property string fitSelection_medium: "\u00A0" - readonly property string fitToView_medium: "\u00A1" - readonly property string flowAction: "\u00A2" - readonly property string flowTransition: "\u00A3" - readonly property string fontStyleBold: "\u00A4" - readonly property string fontStyleItalic: "\u00A5" - readonly property string fontStyleStrikethrough: "\u00A6" - readonly property string fontStyleUnderline: "\u00A7" - readonly property string forward_medium: "\u00A8" - readonly property string globalOrient_medium: "\u00A9" - readonly property string gradient: "\u00AA" - readonly property string gridView: "\u00AB" - readonly property string grid_medium: "\u00AC" - readonly property string group_small: "\u00AE" - readonly property string home_large: "\u00AF" - readonly property string idAliasOff: "\u00B0" - readonly property string idAliasOn: "\u00B1" - readonly property string import_medium: "\u00B2" - readonly property string imported: "\u00B3" - readonly property string importedModels_small: "\u00B4" - readonly property string infinity: "\u00B5" - readonly property string invisible_medium: "\u00B6" - readonly property string keyframe: "\u00B7" - readonly property string languageList_medium: "\u00B8" - readonly property string layouts_small: "\u00B9" - readonly property string lights_small: "\u00BA" - readonly property string linear_medium: "\u00BB" - readonly property string linkTriangle: "\u00BC" - readonly property string linked: "\u00BD" - readonly property string listView: "\u00BE" - readonly property string list_medium: "\u00BF" - readonly property string localOrient_medium: "\u00C0" - readonly property string lockOff: "\u00C1" - readonly property string lockOn: "\u00C2" - readonly property string loopPlayback_medium: "\u00C3" - readonly property string materialBrowser_medium: "\u00C4" - readonly property string materialPreviewEnvironment: "\u00C5" - readonly property string materialPreviewModel: "\u00C6" - readonly property string material_medium: "\u00C7" - readonly property string mergeCells: "\u00C8" - readonly property string merge_small: "\u00C9" - readonly property string minus: "\u00CA" - readonly property string mirror: "\u00CB" - readonly property string more_medium: "\u00CC" - readonly property string mouseArea_small: "\u00CD" - readonly property string moveDown_medium: "\u00CE" - readonly property string moveInwards_medium: "\u00CF" - readonly property string moveUp_medium: "\u00D0" - readonly property string moveUpwards_medium: "\u00D1" - readonly property string move_medium: "\u00D2" - readonly property string newMaterial: "\u00D3" - readonly property string nextFile_large: "\u00D4" - readonly property string openLink: "\u00D5" - readonly property string openMaterialBrowser: "\u00D6" - readonly property string orientation: "\u00D7" - readonly property string orthCam_medium: "\u00D8" - readonly property string orthCam_small: "\u00D9" - readonly property string paddingEdge: "\u00DA" - readonly property string paddingFrame: "\u00DB" - readonly property string particleAnimation_medium: "\u00DC" - readonly property string pasteStyle: "\u00DD" - readonly property string paste_small: "\u00DE" - readonly property string pause: "\u00DF" - readonly property string perspectiveCam_medium: "\u00E0" - readonly property string perspectiveCam_small: "\u00E1" - readonly property string pin: "\u00E2" - readonly property string plane_medium: "\u00E3" - readonly property string plane_small: "\u00E4" - readonly property string play: "\u00E5" - readonly property string playFill_medium: "\u00E6" - readonly property string playOutline_medium: "\u00E7" - readonly property string plus: "\u00E8" - readonly property string pointLight_small: "\u00E9" - readonly property string positioners_small: "\u00EA" - readonly property string previewEnv_medium: "\u00EB" - readonly property string previousFile_large: "\u00EC" - readonly property string promote: "\u00ED" - readonly property string properties_medium: "\u00EE" - readonly property string readOnly: "\u00EF" - readonly property string recordFill_medium: "\u00F0" - readonly property string recordOutline_medium: "\u00F1" - readonly property string redo: "\u00F2" - readonly property string reload_medium: "\u00F3" - readonly property string remove_medium: "\u00F4" - readonly property string remove_small: "\u00F5" - readonly property string rename_small: "\u00F6" - readonly property string replace_small: "\u00F7" - readonly property string resetView_small: "\u00F8" - readonly property string restartParticles_medium: "\u00F9" - readonly property string reverseOrder_medium: "\u00FA" - readonly property string roatate_medium: "\u00FB" - readonly property string rotationFill: "\u00FC" - readonly property string rotationOutline: "\u00FD" - readonly property string runProjFill_large: "\u00FE" - readonly property string runProjOutline_large: "\u00FF" - readonly property string s_anchors: "\u0100" - readonly property string s_annotations: "\u0101" - readonly property string s_arrange: "\u0102" - readonly property string s_boundingBox: "\u0103" - readonly property string s_component: "\u0104" - readonly property string s_connections: "\u0105" - readonly property string s_edit: "\u0106" - readonly property string s_enterComponent: "\u0107" - readonly property string s_eventList: "\u0108" - readonly property string s_group: "\u0109" - readonly property string s_layouts: "\u010A" - readonly property string s_merging: "\u010B" - readonly property string s_mouseArea: "\u010C" - readonly property string s_positioners: "\u010D" - readonly property string s_selection: "\u010E" - readonly property string s_snapping: "\u010F" - readonly property string s_timeline: "\u0110" - readonly property string s_visibility: "\u0111" - readonly property string saveLogs_medium: "\u0112" - readonly property string scale_medium: "\u0113" - readonly property string search: "\u0114" - readonly property string search_small: "\u0115" - readonly property string sectionToggle: "\u0116" - readonly property string selectFill_medium: "\u0117" - readonly property string selectOutline_medium: "\u0118" - readonly property string selectParent_small: "\u0119" - readonly property string selection_small: "\u011A" - readonly property string settings_medium: "\u011B" - readonly property string signal_small: "\u011C" - readonly property string snapping_small: "\u011D" - readonly property string sphere_medium: "\u011E" - readonly property string sphere_small: "\u011F" - readonly property string splitColumns: "\u0120" - readonly property string splitRows: "\u0121" - readonly property string spotLight_small: "\u0122" - readonly property string stackedContainer_small: "\u0123" - readonly property string startNode: "\u0124" - readonly property string step_medium: "\u0125" - readonly property string stop_medium: "\u0126" - readonly property string testIcon: "\u0127" - readonly property string textAlignBottom: "\u0128" - readonly property string textAlignCenter: "\u0129" - readonly property string textAlignJustified: "\u012A" - readonly property string textAlignLeft: "\u012B" - readonly property string textAlignMiddle: "\u012C" - readonly property string textAlignRight: "\u012D" - readonly property string textAlignTop: "\u012E" - readonly property string textBulletList: "\u012F" - readonly property string textFullJustification: "\u0130" - readonly property string textNumberedList: "\u0131" - readonly property string textures_medium: "\u0132" - readonly property string tickIcon: "\u0133" - readonly property string tickMark_small: "\u0134" - readonly property string timeline_small: "\u0135" - readonly property string toEndFrame_medium: "\u0136" - readonly property string toNextFrame_medium: "\u0137" - readonly property string toPrevFrame_medium: "\u0138" - readonly property string toStartFrame_medium: "\u0139" - readonly property string topToolbar_annotations: "\u013A" - readonly property string topToolbar_closeFile: "\u013B" - readonly property string topToolbar_designMode: "\u013C" - readonly property string topToolbar_enterComponent: "\u013D" - readonly property string topToolbar_home: "\u013E" - readonly property string topToolbar_makeComponent: "\u013F" - readonly property string topToolbar_navFile: "\u0140" - readonly property string topToolbar_runProject: "\u0141" - readonly property string translationCreateFiles: "\u0142" - readonly property string translationCreateReport: "\u0143" - readonly property string translationExport: "\u0144" - readonly property string translationImport: "\u0145" - readonly property string translationSelectLanguages: "\u0146" - readonly property string translationTest: "\u0147" - readonly property string transparent: "\u0148" - readonly property string triState: "\u0149" - readonly property string triangleArcA: "\u014A" - readonly property string triangleArcB: "\u014B" - readonly property string triangleCornerA: "\u014C" - readonly property string triangleCornerB: "\u014D" - readonly property string unLinked: "\u014E" - readonly property string undo: "\u014F" - readonly property string unify_medium: "\u0150" - readonly property string unpin: "\u0151" - readonly property string upDownIcon: "\u0152" - readonly property string upDownSquare2: "\u0153" - readonly property string updateAvailable_medium: "\u0154" - readonly property string updateContent_medium: "\u0155" - readonly property string visibilityOff: "\u0156" - readonly property string visibilityOn: "\u0157" - readonly property string visible_medium: "\u0158" - readonly property string visible_small: "\u0159" - readonly property string wildcard: "\u015A" - readonly property string wizardsAutomotive: "\u015B" - readonly property string wizardsDesktop: "\u015C" - readonly property string wizardsGeneric: "\u015D" - readonly property string wizardsMcuEmpty: "\u015E" - readonly property string wizardsMcuGraph: "\u015F" - readonly property string wizardsMobile: "\u0160" - readonly property string wizardsUnknown: "\u0161" - readonly property string zoomAll: "\u0162" - readonly property string zoomIn: "\u0163" - readonly property string zoomIn_medium: "\u0164" - readonly property string zoomOut: "\u0165" - readonly property string zoomOut_medium: "\u0166" - readonly property string zoomSelection: "\u0167" + readonly property string effects: "\u0099" + readonly property string events_small: "\u009A" + readonly property string export_medium: "\u009B" + readonly property string eyeDropper: "\u009D" + readonly property string favorite: "\u009E" + readonly property string fitAll_medium: "\u009F" + readonly property string fitSelected_small: "\u00A0" + readonly property string fitSelection_medium: "\u00A1" + readonly property string fitToView_medium: "\u00A2" + readonly property string flowAction: "\u00A3" + readonly property string flowTransition: "\u00A4" + readonly property string fontStyleBold: "\u00A5" + readonly property string fontStyleItalic: "\u00A6" + readonly property string fontStyleStrikethrough: "\u00A7" + readonly property string fontStyleUnderline: "\u00A8" + readonly property string forward_medium: "\u00A9" + readonly property string globalOrient_medium: "\u00AA" + readonly property string gradient: "\u00AB" + readonly property string gridView: "\u00AC" + readonly property string grid_medium: "\u00AE" + readonly property string group_small: "\u00AF" + readonly property string home_large: "\u00B0" + readonly property string idAliasOff: "\u00B1" + readonly property string idAliasOn: "\u00B2" + readonly property string import_medium: "\u00B3" + readonly property string imported: "\u00B4" + readonly property string importedModels_small: "\u00B5" + readonly property string infinity: "\u00B6" + readonly property string invisible_medium: "\u00B7" + readonly property string keyframe: "\u00B8" + readonly property string languageList_medium: "\u00B9" + readonly property string layouts_small: "\u00BA" + readonly property string lights_small: "\u00BB" + readonly property string linear_medium: "\u00BC" + readonly property string linkTriangle: "\u00BD" + readonly property string linked: "\u00BE" + readonly property string listView: "\u00BF" + readonly property string list_medium: "\u00C0" + readonly property string localOrient_medium: "\u00C1" + readonly property string lockOff: "\u00C2" + readonly property string lockOn: "\u00C3" + readonly property string loopPlayback_medium: "\u00C4" + readonly property string materialBrowser_medium: "\u00C5" + readonly property string materialPreviewEnvironment: "\u00C6" + readonly property string materialPreviewModel: "\u00C7" + readonly property string material_medium: "\u00C8" + readonly property string mergeCells: "\u00C9" + readonly property string merge_small: "\u00CA" + readonly property string minus: "\u00CB" + readonly property string mirror: "\u00CC" + readonly property string more_medium: "\u00CD" + readonly property string mouseArea_small: "\u00CE" + readonly property string moveDown_medium: "\u00CF" + readonly property string moveInwards_medium: "\u00D0" + readonly property string moveUp_medium: "\u00D1" + readonly property string moveUpwards_medium: "\u00D2" + readonly property string move_medium: "\u00D3" + readonly property string newMaterial: "\u00D4" + readonly property string nextFile_large: "\u00D5" + readonly property string openLink: "\u00D6" + readonly property string openMaterialBrowser: "\u00D7" + readonly property string orientation: "\u00D8" + readonly property string orthCam_medium: "\u00D9" + readonly property string orthCam_small: "\u00DA" + readonly property string paddingEdge: "\u00DB" + readonly property string paddingFrame: "\u00DC" + readonly property string particleAnimation_medium: "\u00DD" + readonly property string pasteStyle: "\u00DE" + readonly property string paste_small: "\u00DF" + readonly property string pause: "\u00E0" + readonly property string perspectiveCam_medium: "\u00E1" + readonly property string perspectiveCam_small: "\u00E2" + readonly property string pin: "\u00E3" + readonly property string plane_medium: "\u00E4" + readonly property string plane_small: "\u00E5" + readonly property string play: "\u00E6" + readonly property string playFill_medium: "\u00E7" + readonly property string playOutline_medium: "\u00E8" + readonly property string plus: "\u00E9" + readonly property string pointLight_small: "\u00EA" + readonly property string positioners_small: "\u00EB" + readonly property string previewEnv_medium: "\u00EC" + readonly property string previousFile_large: "\u00ED" + readonly property string promote: "\u00EE" + readonly property string properties_medium: "\u00EF" + readonly property string readOnly: "\u00F0" + readonly property string recordFill_medium: "\u00F1" + readonly property string recordOutline_medium: "\u00F2" + readonly property string redo: "\u00F3" + readonly property string reload_medium: "\u00F4" + readonly property string remove_medium: "\u00F5" + readonly property string remove_small: "\u00F6" + readonly property string rename_small: "\u00F7" + readonly property string replace_small: "\u00F8" + readonly property string resetView_small: "\u00F9" + readonly property string restartParticles_medium: "\u00FA" + readonly property string reverseOrder_medium: "\u00FB" + readonly property string roatate_medium: "\u00FC" + readonly property string rotationFill: "\u00FD" + readonly property string rotationOutline: "\u00FE" + readonly property string runProjFill_large: "\u00FF" + readonly property string runProjOutline_large: "\u0100" + readonly property string s_anchors: "\u0101" + readonly property string s_annotations: "\u0102" + readonly property string s_arrange: "\u0103" + readonly property string s_boundingBox: "\u0104" + readonly property string s_component: "\u0105" + readonly property string s_connections: "\u0106" + readonly property string s_edit: "\u0107" + readonly property string s_enterComponent: "\u0108" + readonly property string s_eventList: "\u0109" + readonly property string s_group: "\u010A" + readonly property string s_layouts: "\u010B" + readonly property string s_merging: "\u010C" + readonly property string s_mouseArea: "\u010D" + readonly property string s_positioners: "\u010E" + readonly property string s_selection: "\u010F" + readonly property string s_snapping: "\u0110" + readonly property string s_timeline: "\u0111" + readonly property string s_visibility: "\u0112" + readonly property string saveLogs_medium: "\u0113" + readonly property string scale_medium: "\u0114" + readonly property string search: "\u0115" + readonly property string search_small: "\u0116" + readonly property string sectionToggle: "\u0117" + readonly property string selectFill_medium: "\u0118" + readonly property string selectOutline_medium: "\u0119" + readonly property string selectParent_small: "\u011A" + readonly property string selection_small: "\u011B" + readonly property string settings_medium: "\u011C" + readonly property string signal_small: "\u011D" + readonly property string snapping_small: "\u011E" + readonly property string sphere_medium: "\u011F" + readonly property string sphere_small: "\u0120" + readonly property string splitColumns: "\u0121" + readonly property string splitRows: "\u0122" + readonly property string spotLight_small: "\u0123" + readonly property string stackedContainer_small: "\u0124" + readonly property string startNode: "\u0125" + readonly property string step_medium: "\u0126" + readonly property string stop_medium: "\u0127" + readonly property string testIcon: "\u0128" + readonly property string textAlignBottom: "\u0129" + readonly property string textAlignCenter: "\u012A" + readonly property string textAlignJustified: "\u012B" + readonly property string textAlignLeft: "\u012C" + readonly property string textAlignMiddle: "\u012D" + readonly property string textAlignRight: "\u012E" + readonly property string textAlignTop: "\u012F" + readonly property string textBulletList: "\u0130" + readonly property string textFullJustification: "\u0131" + readonly property string textNumberedList: "\u0132" + readonly property string textures_medium: "\u0133" + readonly property string tickIcon: "\u0134" + readonly property string tickMark_small: "\u0135" + readonly property string timeline_small: "\u0136" + readonly property string toEndFrame_medium: "\u0137" + readonly property string toNextFrame_medium: "\u0138" + readonly property string toPrevFrame_medium: "\u0139" + readonly property string toStartFrame_medium: "\u013A" + readonly property string topToolbar_annotations: "\u013B" + readonly property string topToolbar_closeFile: "\u013C" + readonly property string topToolbar_designMode: "\u013D" + readonly property string topToolbar_enterComponent: "\u013E" + readonly property string topToolbar_home: "\u013F" + readonly property string topToolbar_makeComponent: "\u0140" + readonly property string topToolbar_navFile: "\u0141" + readonly property string topToolbar_runProject: "\u0142" + readonly property string translationCreateFiles: "\u0143" + readonly property string translationCreateReport: "\u0144" + readonly property string translationExport: "\u0145" + readonly property string translationImport: "\u0146" + readonly property string translationSelectLanguages: "\u0147" + readonly property string translationTest: "\u0148" + readonly property string transparent: "\u0149" + readonly property string triState: "\u014A" + readonly property string triangleArcA: "\u014B" + readonly property string triangleArcB: "\u014C" + readonly property string triangleCornerA: "\u014D" + readonly property string triangleCornerB: "\u014E" + readonly property string unLinked: "\u014F" + readonly property string undo: "\u0150" + readonly property string unify_medium: "\u0151" + readonly property string unpin: "\u0152" + readonly property string upDownIcon: "\u0153" + readonly property string upDownSquare2: "\u0154" + readonly property string updateAvailable_medium: "\u0155" + readonly property string updateContent_medium: "\u0156" + readonly property string visibilityOff: "\u0157" + readonly property string visibilityOn: "\u0158" + readonly property string visible_medium: "\u0159" + readonly property string visible_small: "\u015A" + readonly property string wildcard: "\u015B" + readonly property string wizardsAutomotive: "\u015C" + readonly property string wizardsDesktop: "\u015D" + readonly property string wizardsGeneric: "\u015E" + readonly property string wizardsMcuEmpty: "\u015F" + readonly property string wizardsMcuGraph: "\u0160" + readonly property string wizardsMobile: "\u0161" + readonly property string wizardsUnknown: "\u0162" + readonly property string zoomAll: "\u0163" + readonly property string zoomIn: "\u0164" + readonly property string zoomIn_medium: "\u0165" + readonly property string zoomOut: "\u0166" + readonly property string zoomOut_medium: "\u0167" + readonly property string zoomSelection: "\u0168" readonly property font iconFont: Qt.font({ "family": controlIcons.name, diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/icons.ttf index 884b4b7c48439df60df8db0984fbdc6e115400fe..3c3fa3bd67d08c4bbe423837be5304773e053183 100644 GIT binary patch delta 11628 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 delta 9105 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 + +namespace QmlDesigner { + +ContentLibraryEffect::ContentLibraryEffect(QObject *parent, + const QString &name, + const QString &qml, + const TypeName &type, + const QUrl &icon, + const QStringList &files) + : QObject(parent), m_name(name), m_qml(qml), m_type(type), m_icon(icon), m_files(files) +{ + m_allFiles = m_files; + m_allFiles.push_back(m_qml); +} + +bool ContentLibraryEffect::filter(const QString &searchText) +{ + if (m_visible != m_name.contains(searchText, Qt::CaseInsensitive)) { + m_visible = !m_visible; + emit itemVisibleChanged(); + } + + return m_visible; +} + +QUrl ContentLibraryEffect::icon() const +{ + return m_icon; +} + +QString ContentLibraryEffect::qml() const +{ + return m_qml; +} + +TypeName ContentLibraryEffect::type() const +{ + return m_type; +} + +QStringList ContentLibraryEffect::files() const +{ + return m_files; +} + +bool ContentLibraryEffect::visible() const +{ + return m_visible; +} + +bool ContentLibraryEffect::setImported(bool imported) +{ + if (m_imported != imported) { + m_imported = imported; + emit itemImportedChanged(); + return true; + } + + return false; +} + +bool ContentLibraryEffect::imported() const +{ + return m_imported; +} + +QStringList ContentLibraryEffect::allFiles() const +{ + return m_allFiles; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffect.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffect.h new file mode 100644 index 00000000000..fdb302b6139 --- /dev/null +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffect.h @@ -0,0 +1,62 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "modelfwd.h" + +#include +#include + +namespace QmlDesigner { + +class ContentLibraryEffect : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString bundleItemName MEMBER m_name CONSTANT) + Q_PROPERTY(QUrl bundleItemIcon MEMBER m_icon CONSTANT) + Q_PROPERTY(QStringList bundleItemFiles READ allFiles CONSTANT) + Q_PROPERTY(bool bundleItemVisible MEMBER m_visible NOTIFY itemVisibleChanged) + Q_PROPERTY(bool bundleItemImported READ imported WRITE setImported NOTIFY itemImportedChanged) + +public: + ContentLibraryEffect(QObject *parent, + const QString &name, + const QString &qml, + const TypeName &type, + const QUrl &icon, + const QStringList &files); + + bool filter(const QString &searchText); + + QUrl icon() const; + QString qml() const; + TypeName type() const; + QStringList files() const; + bool visible() const; + QString qmlFilePath() const; + + bool setImported(bool imported); + bool imported() const; + QString parentDirPath() const; + QStringList allFiles() const; + +signals: + void itemVisibleChanged(); + void itemImportedChanged(); + +private: + QString m_name; + QString m_qml; + TypeName m_type; + QUrl m_icon; + QStringList m_files; + + bool m_visible = true; + bool m_imported = false; + + QStringList m_allFiles; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectscategory.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectscategory.cpp new file mode 100644 index 00000000000..38e6eed3dad --- /dev/null +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectscategory.cpp @@ -0,0 +1,63 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "contentlibraryeffectscategory.h" + +#include "contentlibraryeffect.h" + +namespace QmlDesigner { + +ContentLibraryEffectsCategory::ContentLibraryEffectsCategory(QObject *parent, const QString &name) + : QObject(parent), m_name(name) {} + +void ContentLibraryEffectsCategory::addBundleItem(ContentLibraryEffect *bundleItem) +{ + m_categoryItems.append(bundleItem); +} + +bool ContentLibraryEffectsCategory::updateImportedState(const QStringList &importedItems) +{ + bool changed = false; + + for (ContentLibraryEffect *item : std::as_const(m_categoryItems)) + changed |= item->setImported(importedItems.contains(item->qml().chopped(4))); + + return changed; +} + +bool ContentLibraryEffectsCategory::filter(const QString &searchText) +{ + bool visible = false; + for (ContentLibraryEffect *item : std::as_const(m_categoryItems)) + visible |= item->filter(searchText); + + if (visible != m_visible) { + m_visible = visible; + emit categoryVisibleChanged(); + return true; + } + + return false; +} + +QString ContentLibraryEffectsCategory::name() const +{ + return m_name; +} + +bool ContentLibraryEffectsCategory::visible() const +{ + return m_visible; +} + +bool ContentLibraryEffectsCategory::expanded() const +{ + return m_expanded; +} + +QList ContentLibraryEffectsCategory::categoryItems() const +{ + return m_categoryItems; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectscategory.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectscategory.h new file mode 100644 index 00000000000..79737c1ec24 --- /dev/null +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectscategory.h @@ -0,0 +1,47 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include + +namespace QmlDesigner { + +class ContentLibraryEffect; + +class ContentLibraryEffectsCategory : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString bundleCategoryName MEMBER m_name CONSTANT) + Q_PROPERTY(bool bundleCategoryVisible MEMBER m_visible NOTIFY categoryVisibleChanged) + Q_PROPERTY(bool bundleCategoryExpanded MEMBER m_expanded NOTIFY categoryExpandChanged) + Q_PROPERTY(QList bundleCategoryItems MEMBER m_categoryItems + NOTIFY categoryItemsChanged) + +public: + ContentLibraryEffectsCategory(QObject *parent, const QString &name); + + void addBundleItem(ContentLibraryEffect *bundleItem); + bool updateImportedState(const QStringList &importedMats); + bool filter(const QString &searchText); + + QString name() const; + bool visible() const; + bool expanded() const; + QList categoryItems() const; + +signals: + void categoryVisibleChanged(); + void categoryExpandChanged(); + void categoryItemsChanged(); + +private: + QString m_name; + bool m_visible = true; + bool m_expanded = true; + + QList m_categoryItems; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectsmodel.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectsmodel.cpp new file mode 100644 index 00000000000..3bfd374bd81 --- /dev/null +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectsmodel.cpp @@ -0,0 +1,286 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "contentlibraryeffectsmodel.h" + +#include "contentlibrarybundleimporter.h" +#include "contentlibraryeffect.h" +#include "contentlibraryeffectscategory.h" +#include "contentlibrarywidget.h" +#include "qmldesignerconstants.h" + +#include +#include + +#include +#include +#include +#include + +namespace QmlDesigner { + +ContentLibraryEffectsModel::ContentLibraryEffectsModel(ContentLibraryWidget *parent) + : QAbstractListModel(parent) + , m_widget(parent) +{ +} + +int ContentLibraryEffectsModel::rowCount(const QModelIndex &) const +{ + return m_bundleCategories.size(); +} + +QVariant ContentLibraryEffectsModel::data(const QModelIndex &index, int role) const +{ + QTC_ASSERT(index.isValid() && index.row() < m_bundleCategories.count(), return {}); + QTC_ASSERT(roleNames().contains(role), return {}); + + return m_bundleCategories.at(index.row())->property(roleNames().value(role)); +} + +bool ContentLibraryEffectsModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!index.isValid() || !roleNames().contains(role)) + return false; + + QByteArray roleName = roleNames().value(role); + ContentLibraryEffectsCategory *bundleCategory = m_bundleCategories.at(index.row()); + QVariant currValue = bundleCategory->property(roleName); + + if (currValue != value) { + bundleCategory->setProperty(roleName, value); + + emit dataChanged(index, index, {role}); + return true; + } + + return false; +} + +bool ContentLibraryEffectsModel::isValidIndex(int idx) const +{ + return idx > -1 && idx < rowCount(); +} + +void ContentLibraryEffectsModel::updateIsEmpty() +{ + bool anyCatVisible = Utils::anyOf(m_bundleCategories, [&](ContentLibraryEffectsCategory *cat) { + return cat->visible(); + }); + + bool newEmpty = !anyCatVisible || m_bundleCategories.isEmpty() || !hasRequiredQuick3DImport(); + + if (newEmpty != m_isEmpty) { + m_isEmpty = newEmpty; + emit isEmptyChanged(); + } +} + +QHash ContentLibraryEffectsModel::roleNames() const +{ + static const QHash roles { + {Qt::UserRole + 1, "bundleCategoryName"}, + {Qt::UserRole + 2, "bundleCategoryVisible"}, + {Qt::UserRole + 3, "bundleCategoryExpanded"}, + {Qt::UserRole + 4, "bundleCategoryItems"} + }; + return roles; +} + +void ContentLibraryEffectsModel::createImporter(const QString &bundlePath, const QString &bundleId, + const QStringList &sharedFiles) +{ + m_importer = new Internal::ContentLibraryBundleImporter(bundlePath, bundleId, sharedFiles); + connect(m_importer, &Internal::ContentLibraryBundleImporter::importFinished, this, + [&](const QmlDesigner::NodeMetaInfo &metaInfo) { + m_importerRunning = false; + emit importerRunningChanged(); + if (metaInfo.isValid()) + emit bundleItemImported(metaInfo); + }); + + connect(m_importer, &Internal::ContentLibraryBundleImporter::unimportFinished, this, + [&](const QmlDesigner::NodeMetaInfo &metaInfo) { + Q_UNUSED(metaInfo) + m_importerRunning = false; + emit importerRunningChanged(); + emit bundleItemUnimported(metaInfo); + }); + + resetModel(); + updateIsEmpty(); +} + +void ContentLibraryEffectsModel::loadBundle() +{ + if (m_bundleExists || m_probeBundleDir) + return; + + QDir bundleDir = qEnvironmentVariable("EFFECT_BUNDLE_PATH"); + + // search for bundleDir from exec dir and up + if (bundleDir.dirName() == ".") { + m_probeBundleDir = true; // probe only once + bundleDir.setPath(QCoreApplication::applicationDirPath()); + while (!bundleDir.cd("effect_bundle") && bundleDir.cdUp()) + ; // do nothing + + if (bundleDir.dirName() != "effect_bundle") // bundlePathDir not found + return; + } + + QString bundlePath = bundleDir.filePath("effect_bundle.json"); + + if (m_bundleObj.isEmpty()) { + QFile propsFile(bundlePath); + + if (!propsFile.open(QIODevice::ReadOnly)) { + qWarning("Couldn't open effect_bundle.json"); + return; + } + + QJsonDocument bundleJsonDoc = QJsonDocument::fromJson(propsFile.readAll()); + if (bundleJsonDoc.isNull()) { + qWarning("Invalid effect_bundle.json file"); + return; + } else { + m_bundleObj = bundleJsonDoc.object(); + } + } + + QString bundleId = m_bundleObj.value("id").toString(); + + const QJsonObject catsObj = m_bundleObj.value("categories").toObject(); + const QStringList categories = catsObj.keys(); + for (const QString &cat : categories) { + auto category = new ContentLibraryEffectsCategory(this, cat); + + const QJsonObject itemsObj = catsObj.value(cat).toObject(); + const QStringList items = itemsObj.keys(); + for (const QString &item : items) { + const QJsonObject itemObj = itemsObj.value(item).toObject(); + + QStringList files; + const QJsonArray assetsArr = itemObj.value("files").toArray(); + for (const auto /*QJson{Const,}ValueRef*/ &asset : assetsArr) + files.append(asset.toString()); + + QUrl icon = QUrl::fromLocalFile(bundleDir.filePath(itemObj.value("icon").toString())); + QString qml = itemObj.value("qml").toString(); + TypeName type = QLatin1String("%1.%2.%3").arg( + QLatin1String(Constants::COMPONENT_BUNDLES_FOLDER).mid(1), + bundleId, + qml.chopped(4)).toLatin1(); // chopped(4): remove .qml + + auto bundleItem = new ContentLibraryEffect(category, item, qml, type, icon, files); + + category->addBundleItem(bundleItem); + } + m_bundleCategories.append(category); + } + + QStringList sharedFiles; + const QJsonArray sharedFilesArr = m_bundleObj.value("sharedFiles").toArray(); + for (const auto /*QJson{Const,}ValueRef*/ &file : sharedFilesArr) + sharedFiles.append(file.toString()); + + createImporter(bundleDir.path(), bundleId, sharedFiles); + + m_bundleExists = true; + emit bundleExistsChanged(); +} + +bool ContentLibraryEffectsModel::hasRequiredQuick3DImport() const +{ + return m_widget->hasQuick3DImport() && m_quick3dMajorVersion == 6 && m_quick3dMinorVersion >= 4; +} + +bool ContentLibraryEffectsModel::bundleExists() const +{ + return m_bundleExists; +} + +Internal::ContentLibraryBundleImporter *ContentLibraryEffectsModel::bundleImporter() const +{ + return m_importer; +} + +void ContentLibraryEffectsModel::setSearchText(const QString &searchText) +{ + QString lowerSearchText = searchText.toLower(); + + if (m_searchText == lowerSearchText) + return; + + m_searchText = lowerSearchText; + + for (int i = 0; i < m_bundleCategories.size(); ++i) { + ContentLibraryEffectsCategory *cat = m_bundleCategories.at(i); + bool catVisibilityChanged = cat->filter(m_searchText); + if (catVisibilityChanged) + emit dataChanged(index(i), index(i), {roleNames().keys("bundleCategoryVisible")}); + } + + updateIsEmpty(); +} + +void ContentLibraryEffectsModel::updateImportedState(const QStringList &importedItems) +{ + bool changed = false; + for (ContentLibraryEffectsCategory *cat : std::as_const(m_bundleCategories)) + changed |= cat->updateImportedState(importedItems); + + if (changed) + resetModel(); +} + +void ContentLibraryEffectsModel::setQuick3DImportVersion(int major, int minor) +{ + bool oldRequiredImport = hasRequiredQuick3DImport(); + + m_quick3dMajorVersion = major; + m_quick3dMinorVersion = minor; + + bool newRequiredImport = hasRequiredQuick3DImport(); + + if (oldRequiredImport == newRequiredImport) + return; + + emit hasRequiredQuick3DImportChanged(); + + updateIsEmpty(); +} + +void ContentLibraryEffectsModel::resetModel() +{ + beginResetModel(); + endResetModel(); +} + +void ContentLibraryEffectsModel::addInstance(ContentLibraryEffect *bundleItem) +{ + QString err = m_importer->importComponent(bundleItem->qml(), bundleItem->files()); + + if (err.isEmpty()) { + m_importerRunning = true; + emit importerRunningChanged(); + } else { + qWarning() << __FUNCTION__ << err; + } +} + +void ContentLibraryEffectsModel::removeFromProject(ContentLibraryEffect *bundleItem) +{ + emit bundleItemAboutToUnimport(bundleItem->type()); + + QString err = m_importer->unimportComponent(bundleItem->qml()); + + if (err.isEmpty()) { + m_importerRunning = true; + emit importerRunningChanged(); + } else { + qWarning() << __FUNCTION__ << err; + } +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectsmodel.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectsmodel.h new file mode 100644 index 00000000000..104d34af2d2 --- /dev/null +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryeffectsmodel.h @@ -0,0 +1,90 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "nodemetainfo.h" + +#include +#include +#include + +namespace QmlDesigner { + +class ContentLibraryEffect; +class ContentLibraryEffectsCategory; +class ContentLibraryWidget; + +namespace Internal { +class ContentLibraryBundleImporter; +} + +class ContentLibraryEffectsModel : public QAbstractListModel +{ + Q_OBJECT + + Q_PROPERTY(bool bundleExists READ bundleExists NOTIFY bundleExistsChanged) + Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged) + Q_PROPERTY(bool hasRequiredQuick3DImport READ hasRequiredQuick3DImport NOTIFY hasRequiredQuick3DImportChanged) + Q_PROPERTY(bool importerRunning MEMBER m_importerRunning NOTIFY importerRunningChanged) + +public: + ContentLibraryEffectsModel(ContentLibraryWidget *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + QHash roleNames() const override; + + void loadBundle(); + void setSearchText(const QString &searchText); + void updateImportedState(const QStringList &importedItems); + + void setQuick3DImportVersion(int major, int minor); + + bool hasRequiredQuick3DImport() const; + + bool bundleExists() const; + + void resetModel(); + void updateIsEmpty(); + + Internal::ContentLibraryBundleImporter *bundleImporter() const; + + Q_INVOKABLE void addInstance(QmlDesigner::ContentLibraryEffect *bundleItem); + Q_INVOKABLE void removeFromProject(QmlDesigner::ContentLibraryEffect *bundleItem); + +signals: + void isEmptyChanged(); + void hasRequiredQuick3DImportChanged(); + void bundleItemImported(const QmlDesigner::NodeMetaInfo &metaInfo); + void bundleItemAboutToUnimport(const QmlDesigner::TypeName &type); + void bundleItemUnimported(const QmlDesigner::NodeMetaInfo &metaInfo); + void importerRunningChanged(); + void bundleExistsChanged(); + +private: + bool isValidIndex(int idx) const; + void createImporter(const QString &bundlePath, const QString &bundleId, + const QStringList &sharedFiles); + + ContentLibraryWidget *m_widget = nullptr; + QString m_searchText; + QList m_bundleCategories; + QJsonObject m_bundleObj; + Internal::ContentLibraryBundleImporter *m_importer = nullptr; + + bool m_isEmpty = true; + bool m_bundleExists = false; + bool m_probeBundleDir = false; + bool m_importerRunning = false; + + int m_quick3dMajorVersion = -1; + int m_quick3dMinorVersion = -1; + + QString m_importerBundlePath; + QString m_importerBundleId; + QStringList m_importerSharedFiles; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp index 3bb579273f6..4c9915ce8bd 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp @@ -4,6 +4,8 @@ #include "contentlibraryview.h" #include "contentlibrarybundleimporter.h" +#include "contentlibraryeffect.h" +#include "contentlibraryeffectsmodel.h" #include "contentlibrarymaterial.h" #include "contentlibrarymaterialsmodel.h" #include "contentlibrarytexture.h" @@ -26,6 +28,8 @@ #include #endif +#include + namespace QmlDesigner { ContentLibraryView::ContentLibraryView(ExternalDependenciesInterface &externalDependencies) @@ -54,6 +58,10 @@ WidgetInfo ContentLibraryView::widgetInfo() [&] (QmlDesigner::ContentLibraryTexture *tex) { m_draggedBundleTexture = tex; }); + connect(m_widget, &ContentLibraryWidget::bundleEffectDragStarted, this, + [&] (QmlDesigner::ContentLibraryEffect *eff) { + m_draggedBundleEffect = eff; + }); connect(m_widget, &ContentLibraryWidget::addTextureRequested, this, [&] (const QString &texPath, AddTextureMode mode) { @@ -109,6 +117,43 @@ WidgetInfo ContentLibraryView::widgetInfo() connect(materialsModel, &ContentLibraryMaterialsModel::bundleMaterialUnimported, this, &ContentLibraryView::updateBundleMaterialsImportedState); + + ContentLibraryEffectsModel *effectsModel = m_widget->effectsModel().data(); + + connect(effectsModel, &ContentLibraryEffectsModel::bundleItemImported, this, + [&] (const QmlDesigner::NodeMetaInfo &metaInfo) { + QTC_ASSERT(metaInfo.isValid(), return); + + if (!m_bundleEffectTarget) + m_bundleEffectTarget = active3DSceneNode(); + + QTC_ASSERT(m_bundleEffectTarget, return); + + executeInTransaction("ContentLibraryView::widgetInfo", [&] { + QVector3D pos = m_bundleEffectPos.value(); + ModelNode newEffNode = createModelNode(metaInfo.typeName(), metaInfo.majorVersion(), + metaInfo.minorVersion(), + {{"x", pos.x()}, {"y", pos.y()}, {"z", pos.z()}}); + m_bundleEffectTarget.defaultNodeListProperty().reparentHere(newEffNode); + }); + + updateBundleEffectsImportedState(); + m_bundleEffectTarget = {}; + }); + + connect(effectsModel, &ContentLibraryEffectsModel::bundleItemAboutToUnimport, this, + [&] (const QmlDesigner::TypeName &type) { + // delete instances of the bundle effect that is about to be unimported + executeInTransaction("ContentLibraryView::widgetInfo", [&] { + NodeMetaInfo metaInfo = model()->metaInfo(type); + QList effects = allModelNodesOfType(metaInfo); + for (ModelNode &eff : effects) + eff.destroy(); + }); + }); + + connect(effectsModel, &ContentLibraryEffectsModel::bundleItemUnimported, this, + &ContentLibraryView::updateBundleEffectsImportedState); } return createWidgetInfo(m_widget.data(), @@ -124,7 +169,7 @@ void ContentLibraryView::modelAttached(Model *model) m_hasQuick3DImport = model->hasImport("QtQuick3D"); - updateBundleMaterialsQuick3DVersion(); + updateBundlesQuick3DVersion(); updateBundleMaterialsImportedState(); const bool hasLibrary = materialLibraryNode().isValid(); @@ -134,6 +179,9 @@ void ContentLibraryView::modelAttached(Model *model) m_sceneId = model->active3DSceneId(); m_widget->clearSearchFilter(); + + m_widget->effectsModel()->loadBundle(); + updateBundleEffectsImportedState(); } void ContentLibraryView::modelAboutToBeDetached(Model *model) @@ -149,7 +197,7 @@ void ContentLibraryView::importsChanged(const Imports &addedImports, const Impor Q_UNUSED(addedImports) Q_UNUSED(removedImports) - updateBundleMaterialsQuick3DVersion(); + updateBundlesQuick3DVersion(); bool hasQuick3DImport = model()->hasImport("QtQuick3D"); @@ -211,6 +259,12 @@ void ContentLibraryView::customNotification(const AbstractView *view, const QStr m_widget->addTexture(m_draggedBundleTexture); m_draggedBundleTexture = nullptr; + } else if (identifier == "drop_bundle_effect") { + QTC_ASSERT(nodeList.size() == 1, return); + + m_bundleEffectPos = data.size() == 1 ? data.first() : QVariant(); + m_widget->effectsModel()->addInstance(m_draggedBundleEffect); + m_bundleEffectTarget = nodeList.first() ? nodeList.first() : active3DSceneNode(); } } @@ -349,7 +403,26 @@ void ContentLibraryView::updateBundleMaterialsImportedState() m_widget->materialsModel()->updateImportedState(importedBundleMats); } -void ContentLibraryView::updateBundleMaterialsQuick3DVersion() +void ContentLibraryView::updateBundleEffectsImportedState() +{ + using namespace Utils; + + if (!m_widget->effectsModel()->bundleImporter()) + return; + + QStringList importedBundleEffs; + + FilePath bundlePath = m_widget->effectsModel()->bundleImporter()->resolveBundleImportPath(); + + if (bundlePath.exists()) { + importedBundleEffs = transform(bundlePath.dirEntries({{"*.qml"}, QDir::Files}), + [](const FilePath &f) { return f.fileName().chopped(4); }); + } + + m_widget->effectsModel()->updateImportedState(importedBundleEffs); +} + +void ContentLibraryView::updateBundlesQuick3DVersion() { bool hasImport = false; int major = -1; @@ -382,6 +455,7 @@ void ContentLibraryView::updateBundleMaterialsQuick3DVersion() } #endif m_widget->materialsModel()->setQuick3DImportVersion(major, minor); + m_widget->effectsModel()->setQuick3DImportVersion(major, minor); } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h index 137034dd955..741a77759eb 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h @@ -3,8 +3,8 @@ #pragma once -#include "createtexture.h" #include "abstractview.h" +#include "createtexture.h" #include "nodemetainfo.h" #include @@ -12,6 +12,7 @@ namespace QmlDesigner { +class ContentLibraryEffect; class ContentLibraryMaterial; class ContentLibraryTexture; class ContentLibraryWidget; @@ -44,16 +45,20 @@ public: private: void updateBundleMaterialsImportedState(); - void updateBundleMaterialsQuick3DVersion(); + void updateBundleEffectsImportedState(); + void updateBundlesQuick3DVersion(); void applyBundleMaterialToDropTarget(const ModelNode &bundleMat, const NodeMetaInfo &metaInfo = {}); ModelNode getBundleMaterialDefaultInstance(const TypeName &type); ModelNode createMaterial(const NodeMetaInfo &metaInfo); QPointer m_widget; QList m_bundleMaterialTargets; + ModelNode m_bundleEffectTarget; // target of the dropped bundle effect + QVariant m_bundleEffectPos; // pos of the dropped bundle effect QList m_selectedModels; // selected 3D model nodes ContentLibraryMaterial *m_draggedBundleMaterial = nullptr; ContentLibraryTexture *m_draggedBundleTexture = nullptr; + ContentLibraryEffect *m_draggedBundleEffect = nullptr; bool m_bundleMaterialAddToSelected = false; bool m_hasQuick3DImport = false; qint32 m_sceneId = -1; diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp index 3de609a3142..e193e5ece17 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp @@ -3,6 +3,8 @@ #include "contentlibrarywidget.h" +#include "contentlibraryeffect.h" +#include "contentlibraryeffectsmodel.h" #include "contentlibrarymaterial.h" #include "contentlibrarymaterialsmodel.h" #include "contentlibrarytexture.h" @@ -64,7 +66,20 @@ bool ContentLibraryWidget::eventFilter(QObject *obj, QEvent *event) Model *model = document->currentModel(); QTC_ASSERT(model, return false); - if (m_materialToDrag) { + if (m_effectToDrag) { + QMouseEvent *me = static_cast(event); + if ((me->globalPos() - m_dragStartPoint).manhattanLength() > 20) { + QByteArray data; + QMimeData *mimeData = new QMimeData; + QDataStream stream(&data, QIODevice::WriteOnly); + stream << m_effectToDrag->type(); + mimeData->setData(Constants::MIME_TYPE_BUNDLE_EFFECT, data); + + emit bundleEffectDragStarted(m_effectToDrag); + model->startDrag(mimeData, m_effectToDrag->icon().toLocalFile()); + m_effectToDrag = nullptr; + } + } else if (m_materialToDrag) { QMouseEvent *me = static_cast(event); if ((me->globalPosition().toPoint() - m_dragStartPoint).manhattanLength() > 20 && m_materialToDrag->isDownloaded()) { @@ -96,6 +111,7 @@ bool ContentLibraryWidget::eventFilter(QObject *obj, QEvent *event) } } } else if (event->type() == QMouseEvent::MouseButtonRelease) { + m_effectToDrag = nullptr; m_materialToDrag = nullptr; m_textureToDrag = nullptr; setIsDragging(false); @@ -109,6 +125,7 @@ ContentLibraryWidget::ContentLibraryWidget() , m_materialsModel(new ContentLibraryMaterialsModel(this)) , m_texturesModel(new ContentLibraryTexturesModel("Textures", this)) , m_environmentsModel(new ContentLibraryTexturesModel("Environments", this)) + , m_effectsModel(new ContentLibraryEffectsModel(this)) { qmlRegisterType("WebFetcher", 1, 0, "FileDownloader"); qmlRegisterType("WebFetcher", 1, 0, "FileExtractor"); @@ -156,10 +173,11 @@ ContentLibraryWidget::ContentLibraryWidget() auto map = m_quickWidget->registerPropertyMap("ContentLibraryBackend"); - map->setProperties({{"rootView", QVariant::fromValue(this)}, - {"materialsModel", QVariant::fromValue(m_materialsModel.data())}, - {"texturesModel", QVariant::fromValue(m_texturesModel.data())}, - {"environmentsModel", QVariant::fromValue(m_environmentsModel.data())}}); + map->setProperties({{"rootView", QVariant::fromValue(this)}, + {"materialsModel", QVariant::fromValue(m_materialsModel.data())}, + {"texturesModel", QVariant::fromValue(m_texturesModel.data())}, + {"environmentsModel", QVariant::fromValue(m_environmentsModel.data())}, + {"effectsModel", QVariant::fromValue(m_effectsModel.data())}}); reloadQmlSource(); } @@ -655,6 +673,7 @@ void ContentLibraryWidget::reloadQmlSource() void ContentLibraryWidget::updateSearch() { m_materialsModel->setSearchText(m_filterText); + m_effectsModel->setSearchText(m_filterText); m_texturesModel->setSearchText(m_filterText); m_environmentsModel->setSearchText(m_filterText); m_quickWidget->update(); @@ -690,6 +709,14 @@ QString ContentLibraryWidget::findTextureBundlePath() return texBundleDir.path(); } +void ContentLibraryWidget::startDragEffect(QmlDesigner::ContentLibraryEffect *eff, + const QPointF &mousePos) +{ + m_effectToDrag = eff; + m_dragStartPoint = mousePos.toPoint(); + setIsDragging(true); +} + void ContentLibraryWidget::startDragMaterial(QmlDesigner::ContentLibraryMaterial *mat, const QPointF &mousePos) { @@ -750,4 +777,9 @@ QPointer ContentLibraryWidget::environmentsModel() return m_environmentsModel; } +QPointer ContentLibraryWidget::effectsModel() const +{ + return m_effectsModel; +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h index 894448f2dce..9f9fd167c32 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h @@ -18,10 +18,12 @@ class StudioQuickWidget; namespace QmlDesigner { -class ContentLibraryTexture; +class ContentLibraryEffect; +class ContentLibraryEffectsModel; class ContentLibraryMaterial; -class ContentLibraryTexturesModel; class ContentLibraryMaterialsModel; +class ContentLibraryTexture; +class ContentLibraryTexturesModel; class ContentLibraryWidget : public QFrame { @@ -54,7 +56,9 @@ public: QPointer materialsModel() const; QPointer texturesModel() const; QPointer environmentsModel() const; + QPointer effectsModel() const; + Q_INVOKABLE void startDragEffect(QmlDesigner::ContentLibraryEffect *eff, const QPointF &mousePos); Q_INVOKABLE void startDragMaterial(QmlDesigner::ContentLibraryMaterial *mat, const QPointF &mousePos); Q_INVOKABLE void startDragTexture(QmlDesigner::ContentLibraryTexture *tex, const QPointF &mousePos); Q_INVOKABLE void addImage(QmlDesigner::ContentLibraryTexture *tex); @@ -64,6 +68,7 @@ public: Q_INVOKABLE void markTextureUpdated(const QString &textureKey); signals: + void bundleEffectDragStarted(QmlDesigner::ContentLibraryEffect *bundleEff); void bundleMaterialDragStarted(QmlDesigner::ContentLibraryMaterial *bundleMat); void bundleTextureDragStarted(QmlDesigner::ContentLibraryTexture *bundleTex); void addTextureRequested(const QString texPath, QmlDesigner::AddTextureMode mode); @@ -94,11 +99,13 @@ private: QPointer m_materialsModel; QPointer m_texturesModel; QPointer m_environmentsModel; + QPointer m_effectsModel; QShortcut *m_qmlSourceUpdateShortcut = nullptr; QString m_filterText; + ContentLibraryEffect *m_effectToDrag = nullptr; ContentLibraryMaterial *m_materialToDrag = nullptr; ContentLibraryTexture *m_textureToDrag = nullptr; QPoint m_dragStartPoint; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 7376fb323f0..a96ca59cae7 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -370,6 +370,8 @@ void Edit3DView::nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos } } else if (m_nodeAtPosReqType == NodeAtPosReqType::BundleMaterialDrop) { emitCustomNotification("drop_bundle_material", {modelNode}); // To ContentLibraryView + } else if (m_nodeAtPosReqType == NodeAtPosReqType::BundleEffectDrop) { + emitCustomNotification("drop_bundle_effect", {modelNode}, {pos3d}); // To ContentLibraryView } else if (m_nodeAtPosReqType == NodeAtPosReqType::TextureDrop) { emitCustomNotification("apply_texture_to_model3D", {modelNode, m_droppedModelNode}); } else if (m_nodeAtPosReqType == NodeAtPosReqType::AssetDrop) { @@ -976,6 +978,12 @@ void Edit3DView::dropBundleMaterial(const QPointF &pos) emitView3DAction(View3DActionType::GetNodeAtPos, pos); } +void Edit3DView::dropBundleEffect(const QPointF &pos) +{ + m_nodeAtPosReqType = NodeAtPosReqType::BundleEffectDrop; + emitView3DAction(View3DActionType::GetNodeAtPos, pos); +} + void Edit3DView::dropTexture(const ModelNode &textureNode, const QPointF &pos) { m_nodeAtPosReqType = NodeAtPosReqType::TextureDrop; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index 1c6851dabcc..6e6b82948e5 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -69,6 +69,7 @@ public: void startContextMenu(const QPoint &pos); void dropMaterial(const ModelNode &matNode, const QPointF &pos); void dropBundleMaterial(const QPointF &pos); + void dropBundleEffect(const QPointF &pos); void dropTexture(const ModelNode &textureNode, const QPointF &pos); void dropComponent(const ItemLibraryEntry &entry, const QPointF &pos); void dropAsset(const QString &file, const QPointF &pos); @@ -80,6 +81,7 @@ private slots: private: enum class NodeAtPosReqType { + BundleEffectDrop, BundleMaterialDrop, ComponentDrop, MaterialDrop, diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index f050b40c3ce..163cfc951ed 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -539,6 +539,7 @@ void Edit3DWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent) } else if (actionManager.externalDragHasSupportedAssets(dragEnterEvent->mimeData()) || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_MATERIAL) || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_MATERIAL) + || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_EFFECT) || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_TEXTURE)) { dragEnterEvent->acceptProposedAction(); } else if (dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO)) { @@ -582,6 +583,13 @@ void Edit3DWidget::dropEvent(QDropEvent *dropEvent) return; } + // handle dropping bundle effects + if (dropEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_EFFECT)) { + m_view->dropBundleEffect(pos); + m_view->model()->endDrag(); + return; + } + // handle dropping from component view if (dropEvent->mimeData()->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO)) { if (!m_draggedEntry.name().isEmpty()) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 898b6f72cc1..8b7f1f8a61e 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -457,6 +457,7 @@ QStringList NavigatorTreeModel::mimeTypes() const Constants::MIME_TYPE_MATERIAL, Constants::MIME_TYPE_BUNDLE_TEXTURE, Constants::MIME_TYPE_BUNDLE_MATERIAL, + Constants::MIME_TYPE_BUNDLE_EFFECT, Constants::MIME_TYPE_ASSETS}); return types; @@ -565,6 +566,10 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *mimeData, ModelNode targetNode(modelNodeForIndex(dropModelIndex)); if (targetNode.isValid()) m_view->emitCustomNotification("drop_bundle_material", {targetNode}); // To ContentLibraryView + } else if (mimeData->hasFormat(Constants::MIME_TYPE_BUNDLE_EFFECT)) { + ModelNode targetNode(modelNodeForIndex(dropModelIndex)); + if (targetNode.isValid()) + m_view->emitCustomNotification("drop_bundle_effect", {targetNode}); // To ContentLibraryView } else if (mimeData->hasFormat(Constants::MIME_TYPE_ASSETS)) { const QStringList assetsPaths = QString::fromUtf8(mimeData->data(Constants::MIME_TYPE_ASSETS)).split(','); NodeAbstractProperty targetProperty; diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 8e570b5f722..1e16848c6b5 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -80,6 +80,7 @@ const char MIME_TYPE_ITEM_LIBRARY_INFO[] = "application/vnd.qtdesignstudio.iteml const char MIME_TYPE_ASSETS[] = "application/vnd.qtdesignstudio.assets"; const char MIME_TYPE_MATERIAL[] = "application/vnd.qtdesignstudio.material"; const char MIME_TYPE_TEXTURE[] = "application/vnd.qtdesignstudio.texture"; +const char MIME_TYPE_BUNDLE_EFFECT[] = "application/vnd.qtdesignstudio.bundleeffect"; const char MIME_TYPE_BUNDLE_MATERIAL[] = "application/vnd.qtdesignstudio.bundlematerial"; const char MIME_TYPE_BUNDLE_TEXTURE[] = "application/vnd.qtdesignstudio.bundletexture"; const char MIME_TYPE_ASSET_IMAGE[] = "application/vnd.qtdesignstudio.asset.image"; From cca5b382339c8dd21c1eea9e23537cc6824331f1 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Wed, 28 Jun 2023 15:12:42 +0300 Subject: [PATCH 130/149] QmlDesigner: Select added bundle effect Fixes: QDS-10184 Change-Id: Id7bb1f0087f658c1eb3c17d5862dbcf36a663628 Reviewed-by: Reviewed-by: Miikka Heikkinen --- .../components/contentlibrary/contentlibraryview.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp index 4c9915ce8bd..da01f0b1105 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp @@ -135,6 +135,8 @@ WidgetInfo ContentLibraryView::widgetInfo() metaInfo.minorVersion(), {{"x", pos.x()}, {"y", pos.y()}, {"z", pos.z()}}); m_bundleEffectTarget.defaultNodeListProperty().reparentHere(newEffNode); + clearSelectedModelNodes(); + selectModelNode(newEffNode); }); updateBundleEffectsImportedState(); From fcaa050d4e121b1b3b17284b6afae73eac21a795 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Thu, 29 Jun 2023 13:04:06 +0300 Subject: [PATCH 131/149] QmlDesigner: Update effects bundle empty state initially Fixes: QDS-10195 Change-Id: Icdaba14879ac19743d9ebe91beed1d7947837362 Reviewed-by: Miikka Heikkinen --- .../components/contentlibrary/contentlibrarywidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp index e193e5ece17..78bc1f07c3c 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp @@ -643,6 +643,7 @@ void ContentLibraryWidget::setHasQuick3DImport(bool b) emit hasQuick3DImportChanged(); m_materialsModel->updateIsEmpty(); + m_effectsModel->updateIsEmpty(); } bool ContentLibraryWidget::hasMaterialLibrary() const From 65f45d31f020d60b5f51e0e4889434d17db54d9d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 29 Jun 2023 14:40:56 +0300 Subject: [PATCH 132/149] QmlDesigner: Fix material browser focus proxy Introducing StudioQuickWidget caused additional widget to be added between MaterialBrowserWidget and the actual quick widget showing MaterialBrowser.qml. Updated material browser's focus proxy to point to the correct widget. Fixes: QDS-9104 Change-Id: I25f69ab6ad8d05a6ff98f34053c9585aa23402d8 Reviewed-by: Mahmoud Badri --- .../components/materialbrowser/materialbrowserwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index bde22fdccad..98a1a5a5def 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -204,7 +204,7 @@ MaterialBrowserWidget::MaterialBrowserWidget(AsynchronousImageCache &imageCache, reloadQmlSource(); - setFocusProxy(m_quickWidget.data()); + setFocusProxy(m_quickWidget->quickWidget()); } void MaterialBrowserWidget::updateMaterialPreview(const ModelNode &node, const QPixmap &pixmap) From cc244f6bed896831bf53b93c5a614fd5b36615a0 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Thu, 29 Jun 2023 14:52:24 +0300 Subject: [PATCH 133/149] QmlDesigner: Expand matched bundle effects sections on search Fixes: QDS-10193 Change-Id: I66acdab870cd358b2c70811fc30e190c068b652f Reviewed-by: Miikka Heikkinen --- .../qmldesigner/contentLibraryQmlSource/ContentLibrary.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml index b8c406b8291..1932af0eef9 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml @@ -68,6 +68,7 @@ Item { materialsView.expandVisibleSections() texturesView.expandVisibleSections() environmentsView.expandVisibleSections() + effectsView.expandVisibleSections() } } From 941e890804691ca844ec80e4829379d47814e868 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 29 Jun 2023 15:36:24 +0200 Subject: [PATCH 134/149] UnitTests: Fix flacky tests There were multiple reasons why the tests were flacky. First Utils::reverseCompare had a bug. Now std::lexicographical_compare(first.rbegin(), first.rend(), second.rbegin(), second.rend()) is used. Second the check StorageCache::checkEntries was not const. So it would change the vector which it was iterating. So the iterator could be an dangling. Fixes: QDS-10197 Change-Id: I84fca6a2b24e1cae9fb85a01b6208de7e58240df Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Tim Jenssen --- src/libs/utils/smallstringview.h | 32 ------------ .../projectstorage/projectstorage.h | 2 +- .../projectstorage/sourcepathcache.h | 5 +- .../projectstorage/sourcepathcachetypes.h | 1 + .../projectstorage/storagecache.h | 52 ++++++++++++++++--- .../projectstorage/sourcepathcache-test.cpp | 2 +- .../projectstorage/storagecache-test.cpp | 5 +- .../unittests/utils/smallstring-test.cpp | 14 ----- 8 files changed, 54 insertions(+), 59 deletions(-) diff --git a/src/libs/utils/smallstringview.h b/src/libs/utils/smallstringview.h index 82a8c503051..fd7f1edfd24 100644 --- a/src/libs/utils/smallstringview.h +++ b/src/libs/utils/smallstringview.h @@ -131,38 +131,6 @@ constexpr int compare(SmallStringView first, SmallStringView second) noexcept return first.compare(second); } -namespace Internal { -constexpr int reverse_memcmp(const char *first, const char *second, size_t n) -{ - const char *currentFirst = first + n - 1; - const char *currentSecond = second + n - 1; - - while (n > 0) { - // If the current characters differ, return an appropriately signed - // value; otherwise, keep searching backwards - int difference = *currentFirst - *currentSecond; - if (difference != 0) - return difference; - - --currentFirst; - --currentSecond; - --n; - } - - return 0; -} -} // namespace Internal - -constexpr int reverseCompare(SmallStringView first, SmallStringView second) noexcept -{ - int difference = Internal::reverse_memcmp(first.data(), second.data(), first.size()); - - if (difference == 0) - return int(first.size()) - int(second.size()); - - return difference; -} - } // namespace Utils constexpr Utils::SmallStringView operator""_sv(const char *const string, size_t size) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index a668f80ee27..337145638c1 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -499,7 +499,7 @@ private: static bool moduleNameLess(Utils::SmallStringView first, Utils::SmallStringView second) noexcept { - return Utils::reverseCompare(first, second) < 0; + return first < second; } using ModuleCache = StorageCache + static auto find(Entries &&entries, ViewType view) { - auto found = std::lower_bound(m_entries.begin(), m_entries.end(), view, compare); + auto begin = entries.begin(); + auto end = entries.end(); + auto found = std::lower_bound(begin, end, view, compare); - if (found == m_entries.end()) - return m_entries.end(); + if (found == entries.end()) { + return entries.end(); + } - if (*found == view) + auto value = *found; + + if (value == view) { return found; + } - return m_entries.end(); + return entries.end(); } + IndexType id(ViewType view) const + { + std::shared_lock sharedLock(m_mutex); + + auto found = find(view); + + if (found != m_entries.end()) { + return found->id; + } + + return IndexType(); + } + + ResultType value(IndexType id) const + { + std::shared_lock sharedLock(m_mutex); + + if (IndexType::create(static_cast(m_indices.size()) + 1) > id) { + if (StorageCacheIndex indirectionIndex = m_indices.at(static_cast(id) - 1); + indirectionIndex.isValid()) { + return m_entries.at(static_cast(indirectionIndex)).value; + } + } + + return ResultType(); + } + + auto find(ViewType view) const { return find(m_entries, view); } + + auto find(ViewType view) { return find(m_entries, view); } + void incrementLargerOrEqualIndicesByOne(StorageCacheIndex newIndirectionIndex) { std::transform(m_indices.begin(), m_indices.end(), m_indices.begin(), [&](StorageCacheIndex index) { @@ -337,7 +375,7 @@ private: return inserted; } - void checkEntries() + void checkEntries() const { for (const auto &entry : m_entries) { if (entry.value != value(entry.id) || entry.id != id(entry.value)) diff --git a/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp b/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp index 050ac337695..fdc757c2c05 100644 --- a/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/sourcepathcache-test.cpp @@ -403,7 +403,7 @@ TEST_F(SourcePathCache, get_directory_path_after_populate_if_empty) ASSERT_THAT(path, Eq("/path/to")); } -TEST_F(SourcePathCache, get_file_path_after_populate_if_emptye) +TEST_F(SourcePathCache, get_file_path_after_populate_if_empty) { cacheNotFilled.populateIfEmpty(); diff --git a/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp b/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp index b097cf860ba..c95ea23a676 100644 --- a/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/storagecache-test.cpp @@ -17,7 +17,6 @@ namespace { using QmlDesigner::SourceContextId; using QmlDesigner::StorageCacheException; using Utils::compare; -using Utils::reverseCompare; class StorageAdapter { @@ -33,7 +32,7 @@ public: auto less(Utils::SmallStringView first, Utils::SmallStringView second) -> bool { - return Utils::reverseCompare(first, second) < 0; + return Utils::compare(first, second) < 0; }; using CacheWithMockLocking = QmlDesigner::StorageCachemockStorage, fetchSourceContextId(Eq("foo"))).WillByDefault(Return(id42)); diff --git a/tests/unit/tests/unittests/utils/smallstring-test.cpp b/tests/unit/tests/unittests/utils/smallstring-test.cpp index fb806ac861f..8d18980328c 100644 --- a/tests/unit/tests/unittests/utils/smallstring-test.cpp +++ b/tests/unit/tests/unittests/utils/smallstring-test.cpp @@ -1875,17 +1875,3 @@ TEST(SmallString, compare) ASSERT_THAT(Utils::compare("textx", "texta"), Gt(0)); ASSERT_THAT(Utils::compare("texta", "textx"), Le(0)); } - -TEST(SmallString, reverse_compare) -{ - const char longText[] = "textfoo"; - - ASSERT_THAT(Utils::reverseCompare("", ""), Eq(0)); - ASSERT_THAT(Utils::reverseCompare("text", "text"), Eq(0)); - ASSERT_THAT(Utils::reverseCompare("text", Utils::SmallStringView(longText, 4)), Eq(0)); - ASSERT_THAT(Utils::reverseCompare("", "text"), Le(0)); - ASSERT_THAT(Utils::reverseCompare("textx", "text"), Gt(0)); - ASSERT_THAT(Utils::reverseCompare("text", "textx"), Le(0)); - ASSERT_THAT(Utils::reverseCompare("textx", "texta"), Gt(0)); - ASSERT_THAT(Utils::reverseCompare("texta", "textx"), Le(0)); -} From 624774118ef041eb5b471b0639e30d72767b0d2e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 28 Jun 2023 18:06:17 +0200 Subject: [PATCH 135/149] QmlDesigner: Remove Qt 5 option from 3D wizard Change-Id: I897fbc7cf88e463a5aa52384adf28b36d1042519 Reviewed-by: Tim Jenssen Reviewed-by: Qt CI Patch Build Bot --- .../studio_templates/projects/application-3d/wizard.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/wizard.json b/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/wizard.json index 3e26a5f0f20..0bc60900074 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/wizard.json +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/wizard.json @@ -241,14 +241,6 @@ "index": 4, "items": [ - { - "trKey": "Qt 5", - "value": - "({ - 'TargetQuickVersion': '2.15', - 'TargetQuick3DVersion': '1.15' - })" - }, { "trKey": "Qt 6.2", "value": From 878c921f9651f310827005230e81f230fbeba2d5 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 28 Jun 2023 18:04:14 +0200 Subject: [PATCH 136/149] StudioWelcomePlugin: Fix potential crash Change-Id: I00b9b59c645e086860dd904c0545858f9a82e07c Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Reviewed-by: Tim Jenssen --- src/plugins/studiowelcome/studiowelcomeplugin.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index 7e9fce6f131..d5ad29e44a2 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -422,6 +422,9 @@ static QString tags(const FilePath &projectFilePath) QVariant ProjectModel::data(const QModelIndex &index, int role) const { + if (index.row() >= ProjectExplorer::ProjectExplorerPlugin::recentProjects().count()) + return {}; + const ProjectExplorer::RecentProjectsEntry data = ProjectExplorer::ProjectExplorerPlugin::recentProjects().at(index.row()); switch (role) { From 2f5b6aeb8b56c24376191c33a6a7ec0ac2e50668 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Fri, 30 Jun 2023 10:50:00 +0300 Subject: [PATCH 137/149] QmlDesigner: Hide effect bundle from components view Fixes: QDS-10194 Change-Id: I4b5deea65211e8063a7d88e18a7f3d1b27aec94d Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Miikka Heikkinen --- .../components/itemlibrary/itemlibrarymodel.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 40b7f50d372..3f611a0dbba 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -317,15 +317,17 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) ProjectExplorer::Project *project = ProjectExplorer::ProjectManager::projectForFile(qmlFileName); QString projectName = project ? project->displayName() : ""; - QString materialBundlePrefix = QLatin1String(Constants::COMPONENT_BUNDLES_FOLDER).mid(1); - materialBundlePrefix.append(".MaterialBundle"); + QStringList excludedImports { + QLatin1String(Constants::COMPONENT_BUNDLES_FOLDER).mid(1) + ".MaterialBundle", + QLatin1String(Constants::COMPONENT_BUNDLES_FOLDER).mid(1) + ".EffectBundle" + }; // create import sections const Imports usedImports = model->usedImports(); QHash importHash; for (const Import &import : model->imports()) { if (import.url() != projectName) { - if (import.url() == materialBundlePrefix) + if (excludedImports.contains(import.url())) continue; bool addNew = true; bool isQuick3DAsset = import.url().startsWith("Quick3DAssets."); From d4cfd52035764a70bf868823545e94d74aabd7fd Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Fri, 30 Jun 2023 10:19:14 +0300 Subject: [PATCH 138/149] QmlDesigner: Reset bundle effect's position after drop Fixes: QDS-10200 Change-Id: I90f47c714219a334f9d60832a69330dd9a57e999 Reviewed-by: Mahmoud Badri Reviewed-by: Miikka Heikkinen Reviewed-by: Qt CI Patch Build Bot --- .../qmldesigner/components/contentlibrary/contentlibraryview.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp index da01f0b1105..3f64f8d8b4f 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp @@ -141,6 +141,7 @@ WidgetInfo ContentLibraryView::widgetInfo() updateBundleEffectsImportedState(); m_bundleEffectTarget = {}; + m_bundleEffectPos = {}; }); connect(effectsModel, &ContentLibraryEffectsModel::bundleItemAboutToUnimport, this, From a139b354b13f8bba2bf7b20e64b8ca9620f63ac0 Mon Sep 17 00:00:00 2001 From: Mats Honkamaa Date: Mon, 19 Jun 2023 10:20:28 +0300 Subject: [PATCH 139/149] Doc: Add setting up 3D scene tutorial Task-number: QDS-10030 Change-Id: I48f717c13b33549f4d4b889105df8ac1964706a9 Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Leena Miettinen --- .../examples/doc/3DsceneTutorial.qdoc | 120 ++++++++++++++++++ .../doc/images/3d-scene-add-light-probe.webp | Bin 0 -> 54658 bytes .../doc/images/3d-scene-add-texture.webp | Bin 0 -> 11658 bytes .../doc/images/3d-scene-bread-crumb.png | Bin 0 -> 3726 bytes .../doc/images/3d-scene-drag-material.png | Bin 0 -> 23027 bytes .../images/3d-scene-edit-component-menu.png | Bin 0 -> 12570 bytes .../doc/images/3d-scene-fill-parent.png | Bin 0 -> 6997 bytes .../images/3d-scene-navigator-background.png | Bin 0 -> 4816 bytes .../doc/images/3d-scene-tutorial.webp | Bin 0 -> 40854 bytes 9 files changed, 120 insertions(+) create mode 100644 doc/qtdesignstudio/examples/doc/3DsceneTutorial.qdoc create mode 100644 doc/qtdesignstudio/examples/doc/images/3d-scene-add-light-probe.webp create mode 100644 doc/qtdesignstudio/examples/doc/images/3d-scene-add-texture.webp create mode 100644 doc/qtdesignstudio/examples/doc/images/3d-scene-bread-crumb.png create mode 100644 doc/qtdesignstudio/examples/doc/images/3d-scene-drag-material.png create mode 100644 doc/qtdesignstudio/examples/doc/images/3d-scene-edit-component-menu.png create mode 100644 doc/qtdesignstudio/examples/doc/images/3d-scene-fill-parent.png create mode 100644 doc/qtdesignstudio/examples/doc/images/3d-scene-navigator-background.png create mode 100644 doc/qtdesignstudio/examples/doc/images/3d-scene-tutorial.webp diff --git a/doc/qtdesignstudio/examples/doc/3DsceneTutorial.qdoc b/doc/qtdesignstudio/examples/doc/3DsceneTutorial.qdoc new file mode 100644 index 00000000000..78a3490113f --- /dev/null +++ b/doc/qtdesignstudio/examples/doc/3DsceneTutorial.qdoc @@ -0,0 +1,120 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page 3d-scene-tutorial.html + \ingroup gstutorials + + \title Setting up a 3D Scene + \sa {Content Library} + \brief Illustrates how to set up a 3D scene with, for example, lights, models, and materials in + \QDS. + + \image 3d-scene-tutorial.webp + + The \e {Setting up a 3D Scene} tutorial illustrates how you can set up and improve a 3D + scene with the following: + \list + \li 3D models + \li Materials + \li Lights + \li Environmental lights + \li Background images + \endlist + + The assets you use in this tutorial are available in \uicontrol {Content Library}. + + To follow this tutorial, you need to first download the starting project from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/3Dscene%20tutorial/Start}{here}. + + Download the completed project from + \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/3Dscene%20tutorial/Completed/}{here}. + + This tutorial requires that you know the basics of \QDS, see + \l{Getting Started}. + + \section1 The Starting Project + + The starting project consists of an animated 3D model of a ball bearing. Control the animations + with a slider and a switch in the user interface. + + Besides the 3D model, the 3D scene also has the default camera and the default directional + light. + + \section1 Adding Materials to the 3D Models + + First, use materials from \uicontrol {Content Library} on the ball bearing. + + \list 1 + \li In the \uicontrol 3D view, right-click the ball bearing and select + \uicontrol {Edit Component}. + \image 3d-scene-edit-component-menu.png + \li From \uicontrol {Content Library}, drag materials to the different parts of the ball + bearing in the \uicontrol Navigator view. + Drag the following materials to the following parts: + \list + \li Chrome to \e inner_race and \e outer_race. + \li Copper to \e balls. + \li Gold to \e retainer. + \li Carbon Fiber to \e shield_left and \e shield_right. + \endlist + \note The first time you use an asset from \uicontrol {Content Library}, you need to + download it. + \image 3d-scene-drag-material.png + \li Select \e {Screen01.ui.qml} in the breadcrumb in the top menu bar to return to the 3D + scene. + \image 3d-scene-bread-crumb.png + \endlist + When you run the application or live preview, notice that you don't see much of the materials. + The next step is to set up the environmental light. + + \section1 Adding Environmental Lighting to the Scene + + Environmental lighting is a good way to create a realistic light for your scene. + + \list 1 + \li In \uicontrol {Content Library}, go to the \uicontrol Environments tab. + \li Right-click the image \e BasicLights3_4k.hdr and select \uicontrol {Add Light Probe}. + \image 3d-scene-add-light-probe.webp + Setting an image as a light probe for a scene adds the image as the source for the image-based + lighting and also sets it as a skybox, meaning that the same image is used as the background + in the scene. + \endlist + + When you run the application, notice an improvement in the scene lighting. + + Next, adjust the environmental light. As you will add a background image to the scene later, + you don't want to use the skybox. + \list 1 + \li In the \uicontrol Navigator view, select \e sceneEnvironment. + \li In the \uicontrol Properties view, set \uicontrol {Background Mode} to + \uicontrol Transparent. + \endlist + + You also want to increase the brightness of the light a bit. In the \uicontrol Properties view, + set \uicontrol Exposure to 10. + + \section2 Adding a Background Image to the Scene + + In the final step of this tutorial, you add a background image to your scene. + + \list 1 + \li Go to the \uicontrol Textures tab in \uicontrol {Content Library}. + \li Right-click the image \e 4kScratchySurface.png and select \uicontrol {Add Texture} + \image 3d-scene-add-texture.webp + This adds the image as a texture to the project. It is now available in the \uicontrol Assets + view. + \li From the \uicontrol Assets view, drag \e 4KScratchySurface.png to \e Rectangle in the + \uicontrol Navigator view. + \li Go to the \uicontrol Layout tab in \uicontrol Properties and set \uicontrol Anchors to + \uicontrol FillParentComponent. + \image 3d-scene-fill-parent.png + \li Go to the \uicontrol Image tab and set \uicontrol {Fill Mode} to \uicontrol Stretch. + \li The background is rendered on top of the 3D scene as it is located at the bottom of the + \uicontrol Navigator view. + With the background image selected, select the down arrow to move it to the top of the + hierarchy. + \image 3d-scene-navigator-background.png + \endlist + +*/ diff --git a/doc/qtdesignstudio/examples/doc/images/3d-scene-add-light-probe.webp b/doc/qtdesignstudio/examples/doc/images/3d-scene-add-light-probe.webp new file mode 100644 index 0000000000000000000000000000000000000000..79ea955232b92fbe726b8eb482c60732c8e7cf44 GIT binary patch literal 54658 zcmWIYbaSh^%D@or>J$(bU=hK^z`!8Dz`!tpk-?FXAuPbchwUl@gZ>1^00Ccz9u?0l zm#=TytFF~IN9uN1Gb{bFXWaHNjdOpAv*1(H-#^9UGNXf9zG&(2$?I4D-~Z@-#3mJ$ z#BK*}?)r)EJSKipjN~}kUfWVTvF54RY$m68#dE>0%3K4ug!3t#eMsR-Moy|7N*AMC6d3)6f6=t zuu%P1YsZC~S!;U?rLLBxF^TLx(x>+~C_9$-Si-|I+qx8lGkS|w&b{}$%eOdpZKJPR zOUBLxVK44_EH9h3EHzGPfy3z|-8Zdfp4fIxI(&BS?VMX|IcD>B*50gd-?~RM>bUc^ ze&;@E54OkcJAS&Z5s!O%=zL{L6R(fvWwqyR*PM4fKDjB1&0tz;V)E@xysU3RwQHpc z+-4-TA2M5gS9kioTXW_$IP#Sm%$RLd!#L?x=RwYGEDxfOv@KMfC%j>=!M41c)}HSj zdPH3>Z~MLWENki2ZDO96lsKC{{n~Z>ZtcDQiGQ|DzwR!eB7fA~vrRR3|5EMS-?p7? z6;N~T(7(Go|2X59Kl}^!e>>N=X}W>@A&x{lmfWkiZl_&#nj!EnZu#^(|4V(W=Nz{C zEU+)hhvSfha*x2@^atA}E_zZhQ=YNm0*Av7S%#pkTeK^DCt32JDhd$WllPN1e{&1( zDPGpz>)pLy^md4Dz8W#1bdP>*%-Kg~{-2H~34Q3y7E9W7I(%o&j;RLoBdTPRy}v8y zuX(`u$NWHiiB8}K?j^Hl=_&lvVDPPfvUUHT=Xz{aTm5!+GG3@uVDao)s+l>Rzjx=y zD}QJ1{Fc{k@IU=%PwK4O_C^x3D_&M*$Ni`@Kby)NmVRi#-e;|+o;-T-Z|axBe&y4i zE3N-7bkf1arAwqCM?ghLVRb`8;0}&Zmk>q)1s@L4|@wa@?Yvmix*=V@0D59iF1v?9f+XD27tmYGJ+pR-T+b0^PU&GE)!IgX@nSGogz1dOJ&oZ(?< zIXdy+`jw@<%c}&K6b^hiV8IaF(mNwups^s>I(kP&E*oR>Oa+DpoyA`#9`p!&evFT4 zNk@mkgPlIdtnN6+&+&3FGG@DNAs}SLT$;(TOucny{DP#bd0RCPpJ_2m-7Vm8q@dLI z())F#-&>zPd$edvk`Kr0jG_Eof&kFHCg*Scvt1aXC=j-AH96C^6=G#;kz#%T>trK1dq0M zv)=r&e>YFBImO%Rb$0pf?%>SRLa)<*g)d8)f9p@uTzi?6Q{B(|R#(ljD8E`UXDPSl zbdwV`s}{!lo%6D?-O;=Wa8VTI8vCW>oF|+&}BF#fCrq z9h@`fx9I*j=KqP?xNrV*_8I$6&-S0PnxSh)0PFe+f$QCS)|owDd2ZP`-4h>wPWI9J zd7;OAzvX;`8FR0TuCNjeV83ItaZSGKmn93r&#~S6{E$22%<@M+_pqN~$d#FU^WoEX zbwNk(<~J-j_e=Zv^Mb9jp8tIGAhF_M#qW@ii$#3lSxet)FL-qD>Q=AM3fx-L-px3D zC1`f8eA&t0-A{wf&c=jgWlf!bVvnz_!R*MWSy8dm`roicSWgw8$}q? zHtBAhb;K&^@0-+^_~hN^MT|G!d{;C*;(G17LTjdjXP@j?G~Hq6XP$rl)hgKb+CrF!N$|JkR;s$|-+q9(p;6HQ$}#^mOCV zD%pk=N&-8*91=5l($X}7b2B^ma&9lnUERO+{N~)-+rHO6+rIY3wVUs?x6D;6TJd|$ zo7>yg_g|BmvL-iLPV@S2x7%I?<>lqR4|g$FFEHc?Ppyl2|8VBH8=1m+x$y&<*k3$1M4LDzx1`d+?<_VwY#KjZ@E&#z3dxT=Q!t= zPmL}6;<3Q_+ZWmAcmBNpKfOr*dEBe?G?5<0S&Tjll%fShbT>Avs*vhcW>Vxhc)8<% z8&8a;WpYZ`nu`~&EpA)%@SUI$UlPNAqa?<@ZS`G~_4Ov}?(Hs>llirip{T)@f&GC& zHD}GQ+HE~$CjyQZls7cx-ro59U#|N9|2fK)?>9cnTK_jbdQ-0Q&YM-!r%CKpy?sql zLE}@siF=N+=A`Vtm3^7~_vWn2jV?3a_Sr^%zx?HtYjb98x-jXP$So!BO(#O)rWH>0 z2~AtZH2ri)>bBE*Qv;W&-Zr`&ni{?7z$BfOI?+0jVt&3Co>cb;9EoAR?URHeP_v)OV_Rb(h>Ga3T zm5;snuukOcox68e7CbCjDthiqN!x9{!t$N(?j@E-yu7*Nw3p?7COt*z^7h`#vhzxo z?#*vId`z{Zy!`tcF~8R9sgLJ~Y*)FxO2u>2)^9uO?kZ23J@Y5?uJ+YGyPr?2oHs+V z+gnT1=+57Jo2S3`*cN(wTdsD{sijx0Rn2b}Gd5nm!R-Ct-K;mcbkZWfiF+P6b7s%? zl$h)<7p1RE3N~m`IT^6_tnvLF@+}SZaF4wJ!WfuZB)*a6`k~E=RPMjhOF&ZuTB=5{H^b&8TXX;=e7Rb65Bod zfUH9a|1@jO9rKvGRbBRrYMr{ZYPa4|?tpmz3#L0_W(M;wRg0B-+#p_XO#oL{$2$?syE znBf1rYqr%=uRv?Z4bsb0<&A!?4PaB)W2#zvoz?C^^8T%|NfS3%=9Q_qpKoA|TleUe z*LAv~fl!EN;PW1_~KV<*s#OD@&_06yP>MwPa z<>&Q=tfD6YdAD}|`s2ETckh>^qIYM+8a}L^w$4K&^1;iU5(&R9o%?sOt&Kb5`U9~l z<`7|x&Y;ASIq7G)v$od6T7N1s_qt=av-`&t^JPcuuHQU$;(F9WJ;~g~>$6vTPIAzb zJ3IG#YxpUR&I=3nrZ07^Sm*jSYW|aBr=%y}FMRxIQfv17?2|tZb5)A(dmTHu;G%AQ z+G9y~ZBCAjZRZ}9Zqz#=P*x?jETH_z{TZ+3N!c^@#pSPd($kG;Zr@kt*ioFDG_&aQ z)tN7M^{$sW8{2|t~jEVV2ckr#csK{SZ`oDdPzDLg!)oRa# zsYmRhW~5BhWH?}6SgUkto)qJr*q}3Nno3hnIKF9)S$s{%>FhC&)l3_fmmU497SkJ@ za@#JpkZYz%Yw!~vrfIgXUaxz#QA8!Ky5RAnU2n6)->rT;HEH8l)vJ?M2WQ%xIoZ-6 z!FjCtTtzLH|D98hYIM$|ojG@yZ%&u!4Q~DNFCsBdZv4NsV+G^u4xh+~FTLtjQk0dHv}QBN(`wjp{8!28$>q~Zrgj*p$5#J* zq#pmiV*T4a5&Pf#|Lr#a|6J+X*N<75SLB7xk^HuA=Z9pTy6M}h-d>$;#b8lhtM&58 zH6cBIvCU=QWPZL_%e}8!=hEW|y}weY%YV||pM3pX?FO!uZi|a;{~xM<_wziD^*qPf z#%D`-rd_GO#@Ni~?cEk{w@)OQ!92yv|JThme?#0)F=@OFe6XO&R4&mcqjqs|yTANJ z#m)1NtbLn!I-zj->i&6wc`{ais}8MX%&Y$P@^0G3pWjX@cbz_SYu@7W7jduK&vBGo zc;mipa`p|IId`8QdNXrYUdc1&3&(`k%uavRZ2!|XAmPsmM&|okM;|1-ufKES{~_=8 zzxp#iXct>L@I6xheX=#XFXm=NWA%J{^WDFrR-4}b6TZAj|L(4;4R_wE7oWZNhyTdL z39|m%UbUy|-@6ywe)n_oQu$ZGaz8VgU2H#Wdsmj%B$)zsSA6K`GyP;l_uH`Ex((-<^G_Zt>lXOPv4L{5&ol zZELtgdIR4y?|X7NUw*w>aop_OO`9npN#8mTREkO4|9=v+w|MJO&&`iM%(u1vai+W| zZDW!v-ztWpD}VKQ|Lg2r_VwC~)5VhWrl(B*lhszc=l*2-8>Q7HR~K^0gkAfSzrX%` z{QnK#>+iZtANgu{;STe^o;{B)UcV+;f2>}2?n?va3i0&F{MG5<*Zw>>5~scXi7aQ@ z>7w?p|EsUZUJW)%XSBSK{{O*8;rKe!_KzM6$GpW{7^Vm|u;?D#^}O-@zTeO5Yc|#M zzy4R;p4?S(#rwOq+>aLx{~teM$xG5?T4LP5v^}@}|C*KIR%c^Z{HfUdT$?{^O~gf? z>F0jkJoR_qF8gQg#ijbTZkFwaNfV9xWiA-nSC^fry?<`zVP)Ny|DM|NReZO#`G48^ zSHV@y_}#Z2Z%$i&Ka%Nf;D)2yAG5x;`8{*%|H<=Ze?1o4X}bUAYKyl=-#=aQ^>cki z-Lpq$ZTV(a_b=1C++Wmxrq%FjrgEn2@$H4vpZc*T|LI=$VpH|HPm@11{SGhtwCeuX zEuSAB6;^l#gZ_Y036c+-4w@lyAH?$7TX znw-0ZJ-F<}DfP9>o<4cXf9iTN&x7SU^%1+|^mq16O)#C=bgAp-qnURPu-{~|Te`XB z_?(;8`4t)eM-@CZSOK=lRY(&F(~4*1P! zkG;`&F6~V1+v&T%NoEH2R z|MA26lE(ku95L@Lf;;!>+5G7*{2$-+m!EO2op_n#>#t|m&s5uLRjX9UttnKv_;BIc z<3dK|p9MDCgK; zY|-f-E~u;DJGgardNkX_tDc=HCSmJ(Rz*erHMTCjbd+0e^X{6<+4}p-e*L$6`gcp& z%X3CMx0nCBb*}L1rgZUM`--Ib?|AD}W9u6v_CG%@QTpU*^S_x|D-7#9>-PV6zU8d? zzl-m8tT(=0Y5Q>hjE?VpKfi2#eWC2yo?X||R3B!rzc<*r`+NDmjqhIkpQkL&Cacrb zag>8A*t-6tsNHvI@qg;eFLoFl+fnh;@8`|n#c_L0zE{WJj?8}}W48I-gCjwAy4Umk z``T=()(~O(+v&JD-}G(wt6rSHHzCjY;a0Yf-|uw4m*L$!&tP(#{h!76i|&7mJG3%9 zbhfb?=dmrOH%oT^d%@oK<8-)Q<)8iicjDuA-T3gYBr5XCzF*wp|IC+X`|w=YyKe85 zlIp*ImX|-wuX$K!eN9x-|9+{v!6}Y46SQYuSeKi{z0XxW(BNCvzVhSA-&qbTSWV$S z@>bydWr_XYJ^!~^yncLL`rW=6Kek@)biQEz@Y-49TgSqF6)-sk@YH-fD&Ft(*3hFQ zdHwvq8_#~9wUhsS<eHXi^cQ#xxf1!uf{S()!{!HBayKZmou^XTB z=A7I6{_id3{Fk1t_6%hOpLg5U{=QweFO+A|m1omtmTyk>w`MdfJuttf;B4_;C&ia{ z-hR)^y7Mv9n_a*xYR1lrANSS&Kf2W_{%`r`=HqS`rPK{+XX+f7uP!c zd{Fpf)-?UodLKgnUfVtYl<^UcJw-ov?_YfMlj!zSud?o&SJuCee|^G@qe)S3*W2@x zw(elM?l*5;_jI=3CvS_tQT%$h+Wym#OrFA7@wN57#d#%XB-NcNDtGhG{yy{HLN@<9 zJ0;&fIn+QEm-*Srl!m z8_QtFC-2oBblO_2Z!&4gF+F`wYg=}_ReEG(yJx$mcJlOXS10b77*+o8=le%%c%Oei z^Y8zA$4r|q`?=3YRdBHAY+}&JY?-MoCL6$e@Z7tL?Q&MSyV_G8yN0i`dvVV=SpVL> z%j)(uTf4*3%rm4!uX4*Sv-!}&7S*v-d+^-V%z?TZ)=Y^^nA0e`~7*z#tnaGzxa?_I)DF>v;Y2lTjsyD`2WM( zr#G8zyzckEF(hw;)`^$jY$T)A%@uBlTPa_&+w&<+I)o$t`^~Jh+1~x;d*>^y{n|cf zkHur1fk2?xu2~g@ptyrKJML(PtREve>E*n|Ml)&ZpEsYi^UeyVFm$jKXzwZyYVnDxYT^=;KJWi>g^uRQ}l~2 zSrVGO`PK7IMz*$^Crb|J&fmTB;mhP`dm-=Q?T7xp>iya@!G!s7;$eO-yZ^p_zu3S1 zw*TFnvdtmt|4zNJ|GK-?pNqZl*Sf) z>*H^UFV2@Uy)s$)%z~4h(H-G_JQ1nY&vu=2e>eBB^v9Xcj=!s#yxni_*A(u3Wv-$} z_~zd%OHEGr-8=ERT$YIa=AWl>S8ZhZ*U7o^B33f`e681fI zZJg89aY{PKtER#JX5aMZ`?u{pZNttnW8z)M+x^RXzjMvmS8Mcbr*>tyRs*NHrJ2pW z{lDBl^B#EpCpiBS|JBRt+1F!El-W+ryLIoqjfLH_qRRWmt8E`22~D3Z`+wzXtCGE{ zmw&9hw}AIkZJ2ky`x&oq7q?2>k^A;x;pE35oA2+x_R^=tuo%!e+;Vun*Im`M=S@mNve#dW-m|Cp zX#3e$_X?g*XZm>imx@(A0kybT5VEms|9H)cNG{>H?%`tB?H zSM|x;^k)A%y7og{i+ZTJ?RC59n<~;@3Ak`FHNX6OH}JaNo!nPq=B4j9G&}tNb9COI7w#WQDWhY?y{qG->ThH`stL~nBe3aY1`c?1!vPa_n6JNah@;Y(zKV$3j*UleE zJ-=1G<@EmI>B@_h-S&RH_I$T($#0(RGylI7FV9s?UiOZ6_aFD_|2yCFUwrFWoxRN3 ze$!>FpN#pwNi>E-A3hUuxvlid671qw42EIJVJ z*goRGM=q(Id}e;H%0Iliy}s}$bNcN?`6aLIHqT?e^}hM|Z`tbg-g?*BzU{BrcC&~pjX^NJ_V>RZ z_8ThSpH28vJAZRo$+4}m+wRSud{({hdjr3LTF5`+BBL|sx3!rm?#q-}{Ho3B)y`ds z(QapJ8`oI-zhkrgv9jp;bwP$@ac@%cV{1}8Z)vH?`7Ze`{{ElLtm8Ks-@lbLx37=< zUG@2C6yKAJ@6Bp%$o;pAur-U9Xa1`Hv*+0V3g@3Gimz8|^Z(9!T>8$^&Lr<~)^c|K z*uQ?8{wrIb<=Uu}vA}!BzAFaDR6Ke4BpDf)BSKj{4@5XFy2^WNs`(!keZn8E z==uK@QaW|v^J|%)$agExU7l+rx0KIbdix*m$yL4$XBU=F+vPKTgR8`24XN2WzUg;% zN4?r-{P~u=)ytRF%cgG1&EEN(`TxcTYxlEfDSXPlt(+^r<3=Q3?sxX`vZ(*M5etv< zM$fr4^R?A>*$e4rc3WJ}FU=LRpOu}Q7$djub8q$cdkdp`w*}sR&L4lPK3mk#=uq)% zn;XnC-`6Cmt}j|?F~#D(Y|%G;nLqx2?YEXz{*KRFQ~GUo_WC9d8?%L}s=6unuN6pr zjy){Fl%soNUDn6Ux|G`ArEx{)`JeL-b6G)EP`{CZnhZoA~|EwuHfA(Ix{29CJyF7m%mE0Z7zV^LFf9sKBjfd+R zH(ED*J-#?s&NDoxD!203 zwX^g5SBsuM)b#7biRRl(w`~i9+sprkeR=(F*WnEpzb3BPZfgF*&ERP1x0;0iw^M=KXc&Y;c{rc%4nfu?y&03LfI%|*_gAj=5hLa|3%N9zo*mi7|*e_M+K@KmTk(? z5c>1)$geBTiX03pZm1k)QHnF-?a2(WoS!spNhi~(+27k!S4>b0?|ORcqu>O|;@h_a z*V&$X)s!#az~iKqs97iW?^M$t@&1+f*4(k&mHU(3YF&hJpXF+Pnf(s*$NA4~EX-nS;Wo=z)!;2wRv zO#HWhZ2rEe`R?t^iqE1{(*%oyEsvcx;4=yMwVm(R)rVb`KcAZIsm*wFceeTN7aj}@ zYGLog_J-tdwb9@+Klb*U_Ns8c|38>DnN}u5-YF>DBlhf38tct1TT*V=%w4dH?f#c7 zEA*bM-)B~^s-b{pKd$PYB#@k?t#oR&h2L3ENd&OgPzYZ77qJVT-BXj z_d)x+Van&F_au|&n*R`yQ@`oMj#;}m-G6cNn^^rf=gfZ!VS#a9!(MMN z=HKT1ZTFPr>aoWPv$LZsDxcgfTWw#@d|kzQTTY_sx!w7@L;a5i=pNf~t@m@T|6cov zS-t1x^Oxvoak4AaZ7F=TxP5)SHVd2163_jXn|j2|ZrR1X@0eZjHGcei>tL|lczrloxeKo=i7-@SFWxINvme9FDco+Kj7YC?eDL)_s#vcWUGDQuXDe) z$?p38?$3>n?dE3ROE?~i{dp8;U%le`yZbrcJa*l!RnG~2&Tp@~qm_sG&h7W7_WFj| z&Hek}@3ZuKGq(M#o%`vNXRt^I9&PN;u-+>h3k^KGtY|4UwaTk`VnMqBIq zv-^FU7U$b-v<3<<{)4{BVZ(-un}8=g8ds_T2Bzs(Ic&8H@SV{v32f~+h3qOCIboJuKvp3b|$C%xDFZb@)=WVhE#+jvN1*>1pyD5+_;~OO*rgKM{VL|RL z&PAM+8k#rc<3AXFstS*{SbhHERX#a}_58EvGFMwV6h2J07O$yW^wUY-YBt~Oqq}aO zUHqzUx^l$Edv}io`u;zk72A9E-+ue#%15)jGUsm(@7njdf3t=D4)*eP+i9Q07Vdk0c1L__b@{H?a2}@vkM8)jr}O>R*q8tN z`^JoyC)dSf_L%l8NahYx~pvCdKIwJy#vikNEj?rLB0d?H)OM zA?wgtMgFEYU)4TyytTeIb-mxa7|-`dB-HPRa`GQ}yKn!b53YA-`yF6re9iy=Y;$P1 zh}fmC2btN~#NzF%YY&7rv+{f>{2wVg|GWEV?p?KeO4I{36khbtec1oZz+wIW^t-R? z(?9ahC{eN6c6CR_Y_~0^19lZDpitu5>^ zY_r&~F#eE4(!%A@$G#OTyWX_r{QHM*en|YYnZEszx}kvUqMN;H2FDt9RDQGk^Y-zx zm+2q2^ItsHU1oR4Z}VpVPiy^cHvcx>UcUKoi6YzT7s}fn?|$C@|L275`HKvBDwgDY zT=;vBoZGxRv#P|B`lnxGIMBB-*DP-Cr$Y(BaL?wJe=FGnR_JLDJ~-gYbz6 zVIiMa=cc@=ek{A1Bj10u^- zzUiew*cxw}%I;b@n~xp4j=h+1N_$I0f4+}hCik1qE&O}#UOjf~y`8aidciHLn&m&d z>MJj-U%U6f*ZH zaW(R$dzWp?@h&_seUbn7;eQ(>6l6u$Yn|F)O^V%~R^)%SN-@z>w`HCz4RJheAx!otoxcoLP(ZZ;$TKxn67tbE4d)m4W& zcXzkPuh?Guj`_~R%j)0bE6&%Z74u}R^Ul3|=!2ikX50G-b)~27&ESjM_v)C&vyOH9 z8qdUDiQO~v&y)i{DogMEstNy7@XeO-*p7qOcG^8JGmih6!1H@&`Ln2Nix=68_}sg0 zuYSxqyN6@-i+vxn8d4jkSvlB+I=w!5a8J8^*`9K}#|L?m*PQ-U+1~y5)?9D>nsqN1 zuy>`+ZhreYE^hA&zrR|3{gG2t=YMQ-!l?i*sX3B<8cQZm29udVlkKwSD>H6Y*zw_BMN~&0T!0-?r%d-2Wev z|J48P`|o$>|B=V?Lj6A;ul?O~THBtZPBXss($PNdzXwYm?>fEt?J`pjj^v)1X`AM) ziMhY7sW50pPw74hOaCu%V?r^8L`!OmPFIyJoMu+b$olDEnP=U;9_hzl>M*-`;H%=dbtsJ1=79 z&%NvCmpSI`FPj|iBfepAZW-(DRi|GpzxqF*_R3Gbwi$1)oZ*k&6)|gXVBtHL%{#>! zJWPTOTr=hy#2LxTH89@U^8DFX?h|j%TA!;C+WF(fs_)Mv!gXVIJvZFndoH^EE&F%> z^%JziN~@3C*A)ML`0>g8%6B(DZ2Wm8!S1w8>zCeazB+@1mpe9b&Z&ECyzY2j=5)U; zpZI;_@4ndbQ6=V6`GpVLbtV6Ams~z8UH-@&yBn2EI Y*Q*o6e(axcWOcatqi@qD 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/images/3d-scene-add-texture.webp b/doc/qtdesignstudio/examples/doc/images/3d-scene-add-texture.webp new file mode 100644 index 0000000000000000000000000000000000000000..3624fa941839ef869ed4cb31e0aa01b8436c3b78 GIT binary patch literal 11658 zcmWIYbaQLcWnc(*bqWXzu!!JdU|#+~5fNzVZEk5S+#w7GR<9NQZ%8!%l{|j9Ld6KQY+lnoM(7QC8AW z`*Q0b18-+?-oE^Wol7*1uCMq%f9v1-+tRv!^}pD!Q@d+tyIkwlxu(`UyZ=O0L*4PJYya*OC8E-%S5g z?!o^5f6l#$|4!F8zf=DG|H=2c`;zv~UT`nqt^Lpa59IIEmw(&;=lkFJJasYk&aVXD z^nbm7yF%`J{r9*=xreoz|Gr&h$a&4r&A?^TSgxx4+-2lX=#f1NN~{dR4L6UUE_jkn{1 zR@+o;yY>1*;`Zc+eH?5nuP!vbFk#ju*3++}B*Lx)O$^{WbGozrD6{>Zs@D7;)>`^s zelDJ}qhi&HMVfx{sb8!#3@siOyvVUpY@|={*aoOxA*PO z(^@9$*c*3LD7h?p`)K-2wr6flrYQ@OwHN|rMmdh9Jp4Khmd$xCWYwR@-ae*oaKc&jkPnQIomR_lunrAU5U{{Ld z{upQFS zZD((va<%MN*8f*A%Bkj!PxR(=Bz^gzJ}>kvPw;-g$IaDmT@OT>k^@a|0md|>1*ZQBFFxaOTv}oso`Oc;n4@!9y6=hbZ zKU;Lmeg6v?M$IyJ-jX1vT+#Z)Z?2!y<czjD$uRqY?wmi_@fH)l zGkLMBJQiKL;MTXV#)dmy_H5sgHaqrG*CF5QX%lllbIiL{wdjFvQoeg9YiC3HT!;HM z`G;=Vh^*kceD{z1qfXUHd+bXUP1@f|6v}J~l2uw=ESMp%d&AeD_Wxzd`9Vo@JlWSg zKlEL^NY7eBvSInNZ~8kes-NmL#Bim`oz`1SEg;= zr*!T6zR!+7&#@n4eYfUTSZ~J8cDCF+ok^n0#G5Deq={Xg$Rl#JD~4&QTxYTIwf$FI zV{a&EnYCm{?q6e3x;<{*GZy}NHwtuFKX*?}v0eT><7MUN{krY4=M`MjE8^~>)i}d=+R@q|whg5d znK`Zo%(x^YUB8iU{S(IYLqRugD@BF)2ngMHerUqP?Yh5b?Eaf}Fe!K2@?RT_{wGdj z`TD#3p>^s@<=lz;4(~A3zxm=L=aub(7tfSSOf6qx8*n*U-bv!rk&YX_#+BSV=JkDK z>2c$%{GHhQ`awGx!h@iAXcOIRYS)gt(EM!(_I=$<-m_v;&{`YbDp5$W9;U3lM` zz4I&Qk-kGlp6fT?zv05P>S}FCz|zO_p6$+CRj_jY6Ls%)*AKa=Vf=N|n$)|QPo7Er z@#w^r|GJVl%?ho4m5USHG2J98?zx4C^3;OrfcZ}GKZOdfuQ@(7?f2J<9S`D< zZ|jnurXtQHdtmZ;4#S$vLyK%D$lTB7Z_qPxK0dSc*Rw+?|7q(6v_wRXM`M2guaHYcy zMh*t)J?bX^b=#V0(pP8KZWRACN#Xn2SC{&v z=dU*1WvA+SbU}TfP1=psc5G5Y({fHGmU9<##mvmxHEJ@1US8fbZ{4#zpSQ73`D<@<)u>y4 zntJJi)|&aEhA&sVsfe+vSfd|Y-FA6%*M!=G8)mPRDEzbgP}bqa8rJ7jc8c@9pOY=C zWk31-nrHc(hgb~fyE$5)mykGCQ~kWE{@B7(Ke%kV4IJAa&!|3Z?cV&G^NRjj!H*0M z2b(@Uekv60Q8W46x!_M5+nBf*-|u!b*f+U7q|RpF^iAv57MbjOxOT6H`MtJV^A#dE z-ap-b$~xxRsVJL#-_2Diab?D(6>mzepRGK6&%W+xPGb^#?8>a&O+xz1%3~u}cvuT;xg(upT zaofH!xdrTUE2ud3ZBLY&(sqO2kIY)G_tspzYAESGFFSnMyBCkT-B&0UOUVS?{W@8N zY2)7&SFaarUiNYGE*X#Wn*MhuvFulQ^TF{EtH=Z91H13{20W-eQ^$Z}PwF}EXI-Ois zee76~*$>9o!2zbvcS_`+ZhtX>yYdxJ$kM%cBr96`ifvSv{&zW+R^jdaue0aOhiTLQ z3QNv>sH^|WNb8dIYu=*r)yu1`?4I0HxWDY^?gu+x{@?jPNN;@%-x-6op2oYbOiNgB z=)*FlTXVK4UJE>VZU*CD*(KS!-1T#^1E;OKo*B6A<45mnY{KR%qAjc+UECllckuY+ zHG6NVo+~k2f7Fpnz$7n6%li8LdYOp(^1QyK+~-|PK8StVq$a*s^B+^9#V;;#`KPEbyAau){U^n_HXZVO8g0b0J9L%Y?f`{KC6(WI zubf(GR~HtjHmBfWuJ-KJlf>L}<(YqdPtEeUQr2X_X0Z3{qzNb9XLIsjm~!y`Eya5x z>uc2yp$3kP@Ech6c^4w+C4XY*p=kPc?OKh39aNak` z&F7`{o5VgneD~pWz+VR$rK%eO$B!LpmpSlyqld0l%rnE)C7fYyzFV(qbItu9QZ8EC zrm3v8Z`0;2J7<3A^HP_Z88=aEH6JMObg*|KHj>46<7m|8Qw}wALm;_jg7|58rK#z^GQ!%Y0}4e|z(NbxB*% z{N&uc+r{%VEa#ly3VXaxCyW1#b&UMOxV5(3^QJPax0s*#kN-r3=Fg|gFTUhS-l6(p ztKQCJqsbeL;%7WmHEwWpndE)_lA4**o|GLoZcP=LvGW2C*CFSP7JVT_FRQyBKDoB3 zJZsw21-A0h;Y*~;k6XTYz3BOKo#n}XU(RwyJ8M5##&=Gt=Kt<{%l+i^xw5A0)vEZX ze9rpt-h~DF(ragS?0ypRp~Li@uWCjtTlGud2Qw0Gd@s9cytMqb?v^f&Cvt0hPnrF> zpZeqeY39}MeXIVw5LCKh>v@2ES1h-t^0S*?n%;+)?$SDR&F1au-R{Z(whWi{ALtRE zXuUsbO~C6_E#LR9%TtoNE7*BQsnYtj!`~}*HCOBAFRxV(*gwm-;=HEg?XrwTecl$9 zc@CRTMcuNh`#ZhkCy%7{E*D1k!1cHNe|WCE|1jFu>bvb#DprSXa_fKcZ{e@1<9{aU&37_(c#?N>+9rz=^SVy&TWWJ*dMAU? zuHCP$S?}K{`u~nng>Xpq)!Kh?{%03ucl!3Nzr@7Tae1dls>Ciaos74Kgb(){Z~nH^ zIOyzG)$P8jVo}QLpCml~`hTOB!-j1MlJ76YF{JdW`UmMgl6P7np}z38;*MF?LH@Ul znT2G_-gI4gv}x+=1^;Gz73hiUoO^s{qixc*jaR=5t@l%3v1GB=`E7QaE%pU&V4T}^ zH?=dUduQW@s~*gu1)tnkYj1WsvYyE_?5%*DbZ8!P>87aJCNJzt)S16MF#q7+%Drhr zK&jH@6$XzC^{kiX`x<*L{2v$l=X&9*qUdDCwO*QCY)Szk*;lXLh+pR~Cm+4}^3ex1 z%b(nOoffoYYQTjl6>|Jsll4Wys@hB5A5ggVH0M#w^n_JD&$kOmFx@M#-I}$a$}m8G zzGr{`RrWO+tM9xzskPN?^?&Bf)#a{tTSbr820S=0^?JstFLEZbt-GSO=pL_M>N?rf z;KQH4WxdlrJ1^@qSiyYQyKeQ(r0SD@U-0(l87f&HS*mp6=7YcYW%ujOVKt0oE%Vx1 z#@8!$%>84z*1l=MobhioKR$HmP7b^z9qYU)cLj(3r7wChjVe*+#h5m=t?FODXkW_4 z2Z_!uCqq3y*YbsV=}z}vY4~~Lo4D0E3uLu2!xXN_Tv+}mRw?0ehi1f|!;CZT&pa|a zNv}v~QTo|s+H$!wTP@8pmpK13pOSLD)TeHvz)rqci%(s9muzoic_9{HKBe~6sYTbi zx8^2fT`z6OT;Vh8vV!i%yDO$k9e9#&S~FL=)<02hKbvu)V##(h9(|(%`F5KJmh9}s zr8oX8zj^NbOOLzpwe@X}Uq)DGeOT0oo2;UqyU@g@zC#h)zSitB?h0P=U7SyH z#%9vrHc^e=~!Xx6WyKe|=bVp-+MG>Qhl3KQ;^Lm)ZZ`YuUlle_nuF z`)mWaT4C4}_06Q_Rm^0DcFDz8D%S1vuJsc(5Is2|I_s-wiN5^heYJC6IF?bpQo;+uM|!Q2U3c=dUCkIyq`dG+qsUfq}t_S1If zsR2*Oiy# zjE#!#G)}6J|G40U>GY%iK7|H}nx1(x_DuZxATC@^q*(0A%xAaXtiCAB8PL2kxRx)1 zp>*}Bzf+DMeYB>eYVnoji{}e(U?_0+*2>sph!z*W#cw3S4e!56;hFxcNa9LC-a@-Pnc|cii)YHL z-NN4af9~!2@{N0^UR)I7+-J0+;8VGLW5Dh?vsJZTYrkXC3zPJYzI3kSjdRt?Lm$?% z*qW5{O0U`aN#FQWhv+iz2bb@x7xNJNXWcf>K4EH4&@zD_&Bj7+@vmFEQzJI75r2JK z$L8z7PhU0!Z29}a%h<7+?{X&36c5J}wY??x40pfC+Q#`geizS%X)#HQw%iiFX~~!_ z>@7d3XzO#M8P)e1asvWY95Wix%* z%lRcYH%on2$QRSvS^70J-Tro4fq>_UU-u>ITbg?GHT2Trzvt)nYKox|5Xv%A@F+B9@Z&O z&n>eM*1Xj)```oRV^7y^H(qye%8`gCt4yb#F5a!{eDT<)V;_z`X*W^J?Cx9E>0i9@ zmZ+4HUG;@4I?YFful<|y;=88R@8Af>RdwvEHvF!XE?eztSQfy&V_Ww;YqfmyWD9#K z*GQMDe!DlH?XvAm3e_%ttiEujR9tZ4VmXD^49cY*CaGn1pICU~+gKBmLW4ef>nAQw zUmY?pXL0Lksa;k#maONSemLl7^&$4&-@jV^O*1?`y~?(R#Mc4(i|QrXIO zWrv?ZM2fulhnfwG{2wj)(f>E>&-b%m)mOxq)H}RBbi3Df(cb1A{{d zunXHB{MFWY&=7j`M&`sDem{)wC5qguT_X1VN$x3+FTW#VH@OvL&N8q~eqa2=So8Xa z-vReT+k}7c2rLqBS>18K<7M!#Wn2F$=1FvSn%3_7vT2Itf$WnL^I5l~e995y-1z0y z*7eLY%U!A}jvRMuK9TA?>Au(UGpe(?u6=#A!l>3xCS_&BaT$&c%6t-2FKeHfB^3C* z-m<(>{MZ3LkNdZ`F1yG4d}1~XN${vq+=sX|5&Yhah$DcO-QAAe8Pc8Y`xNpnSbqb4(hQ`GXPjnzUcOzsE&MtM_mz!a_DAbyGVmK8SNa?f%zL`9 z|5dZV*GYRSU+&w)AoSQ`|E~M-%#%cfw{5-uGR4C*`!$CP%kuXvdjG^&!qz6(oqMT# zgIQow=b94H_7B@G#k>?@-DO^+c2;tK8&~3HlcQZnFYno*&vWHf3|nEHOM?Q^MXhK_9wDpx|jzdF~xc6X1PXg>dbHkBPSs_*eN?ePlH`S&p7P){p+ zYt!?N#z`UKE!q*uM-J`$w(Ou8!}8mfE*f4j?K30O`j*yxcPm^dCA>Ds^!e#8S0&TE z-=CRhTxE1~@)wDXxrrhAe4oOipMH4Zpug|ek@M|;+Jgn=Kh2rO@n1P;?q`Kt_jkyd zNm-xj*0`R3{oRS9ZQuSI)-jz>>`k}p%wDeW$HJld{72!!4W0reCc4!HXA5K^%EgOA ztuvicdgB(Sb-jI&QMGF-SChuvz8&%^|CLmXH2xp@Bh{z4IODANY^%IooA>3}2tWH( z?D{wVy-UvGLro`+-Q2ER$ni7$evpb();Z~EUybHH+57bH-c4uHwWnPTP+OB25MsT> zYs;s~ReAyar2+2gDj7}rl1sI=Z=SX2oRLlXGi#o*y)*7<8l71b@V|7$`WTZ&=erLz zWdS z#g``b?|Hu;`M|qJyl~~~(;GiH2iZNo#Km0Cnmp0ZbAimY9n}weBL$i~XNReJJ&$tbUy^&E#>_-EM77nV;o9o&*aC?hZ{#^O~#nBd2ci-zz@_MVymG z6g;G79VxxAd#l=$#P(a-3$%KkMOEa^(|wh1@N1Pp-PAls+oGVDPAj&yWwKVw!zNu0 z{+L?X`17LcMi*~p&a*d?Xg&(?R02+lnbbe~`6}Q zf$~X{Z%+EWqSASpCd;wf)ZmA+6uzz(y_4x5q`H3QyGIK+v(oIpX1RCj_!MnjQm(Y& zk6pRxrv}G3V=>eHjuo6oq?8PQ|NO>wLc#R{XVoKZ(-M)kFFmE7kN>JlTs1$iMK|rE z7w^qORU7QZum4!V;Fk*Z_XLo`fYqKcx`9Te;=nQdsmpnF8J%aeV-mmxNWqX>a37)^2LV@+E)s`&e`z3 zs?otlQQ=ed%#R1v5B#uqe|hM$)A27-S%0SdNLsscvuuLpkrvh%x82J2br%=7zuFn% zx$E1ih{=D>#2(z){lsBZQhgP1+R!p$ZoPlF-_jN)m+RJ({yr2sm^a0A!y)$PEx#Xhy$G475dKf9 zB0%Vw#@1Y$bp>}8yPoN+JG*ghA^#Z>t){zn^(WJHBlwe3xN{7j{$e$Je%*tk?BU@u zONQf(hi>#PHgHP45azk1_M|hP=H+uIUe76ge}VC#!NsOaJ2t%erM^L7k;dP5ZieS} z7r&Vu>ExNNS1i47Z%6C%ytWIL%4RQW%!AgymE_v$to2*;$*cMs$KuSRS1p>L5P#s= z{2ScWuBpy{jov-{c~&p0;GWZL0i8bqY@HVZ9DZF`v}Vtm0?VH@_w$zB(Bjar55L3I z)i5)7O67r*5{h9ty0W{DbWV`z^PN!6aLC3~=>JUvw(h>z-_zU=)#Wd(G`zVZYs$CF zi!RLQTVq}qpMD~H-TKCZEh`=hg(PSg$jwkuX4_I-8uta;Y{!N!7Ek@omuH~J3QphLvO1pFa^(TUxIRiqR_4~cw zIo^=exOQ^0UHb3sDi*#{&#TpUrmy+>EBM1CwZi<#OVh*Nu3xdWrA2B<{m!4eBE1=} zMK$L<`Eq#YZp#3X4eGyzEF9Z1B(65c^lb=PCE~+m940VTt#SL$S02+%6XyRmvyrX5 z?=A86@vGMz-#)H+Y$m)Rx6o5iP0oJDoSySSUcIkQm8W=rF3kS$BSVW*w_UZE>qqX( z@H-J@d|VqRpJSSOblRsA1|MI{EPe0D6MxM{Z2pIv(Rm@+xg`s43q0Q+P&b1@xqpV`B2(S{ zqX%}#{@#9ao=k$nO&7OMV#g<1MqR(H8N4u8YefmC`NBE3*~R{!6)Qfqn4-QdFjVFJ-8SFfd;I3!^2(odyHSnHzB;<&soJSW4^Mww zUD>a%>ZiX|weDTg&-^Hkyxkv~KTkM3FSthJRl+jMHHFFLJNdWVnQXLh_o<$A@AY0A zn5(Z$f4;afwDq;>gy@wLInQ^9hP1yg{GImZl+E9t49}S~t4@4(il45fb^P)Z0ryEi zPw1*oQLUQUUK7o6Jx9gmqZCIEAofBsq8ZTpxSe=BZgqmrOw!t)B|>!DBW z9xt(;+tny^{HOo^2^AC07H)XI;8*Nkf#?99mDi1gw>4~dxan)&$3HJRB|A6#ZP1VS z(aj|1G^dHZkN^70c}IVK+%e;P@YL^fp0`>trBD5Q>1)Z_T8^A^ysLO5jrX?S7x>xS zyI#~+X42I2%6YTTPm(k{AHCgoYyW*maekp+>*hC@JFVLBBS_M#Y4$G36Y5KLI~O}Jn!i&%2f}0giOg$y33to+2b_HmgnyMXGe}EX|>rejG46T;ej_D^HgG<*0e5jUsnI+ z@D!K4qdK;Klso57f9c0!doxlm!7_f+8sUrIymtTh6!*>E#G6%q!>eaW$aE3Wv)^mj zru!F}Y0Q}$<0X8sI!S85Zn53ce?GBWdp2chC4c08s=I9S;qz(9Uu-TVwTIQN`yZ3m zxmfaFU0|^Eva|Oj?#@Y5%2)Lh(4BZ(|9PTONUY2=)3C1{i>GI*G**OeU*anLV}sQE z+o>fs_x4B0GWARsw94ps##I?-y}M1!Y@x^N{MP$LT{lb)D%(9`*DZtmcK zHtBfLL)s6|{r)J_al5*zVz;5~W82%*ni*eXOS>x$?E3rRT!F&qoohwC0EnRz#t zJr>$_%gf%*K>O(tw>>{9Wt~L&w7vUHR9L6@i7sy3wrZ{)>o@a?R~k$_U$=Us+iRVk zd*YUxPwfF?OW*pFnK#baH|W1xP`-+1LS6L9%6uo&<*tvb-_^A2EWdH{?@6gCo0_^; zo{E-@?>oUd(cgH9jAN!p@~+IRovKb2Iu<>jiw|f7s64s7wDQU2HIjCw)AJWM7;i4p z-?}pX?E4$<1O3iDi{@JL`k`WhR_KAskRDT^_kyazryVY=Gfd}KW6M6b?&bUf50MG6 zi%;uLh*SD?Meo7l6W^jY-Pw~9=V7h)tWeCo|K?LMz6T-au9{byGe6>n*&FOmpVLGF;q0My5Oj-j=k^h^rIcy zxEY&;5iO9^5dop2N8=a>4(Zdn%5uVEEZ-e|fJ;pxY)H zhNrSdQ#fM1*E~4)`0tNuwkN(HY6Q*vv*gY@`u|pwpU;+%#^ZIU@|i=7h=t_#l`JX8 zL>K-!ZxXRKr9&%qOXSHeX5GUTNjiy-`PvFp_?Y|EYJFwO)QjgXKe;{gtih5q;)Rd+ zCtZ5KVt-lh&jtTnmS!!?N;5xqa{9cPZ3#!Wc9$>To}gU+>_~9^)Sy$FC+_%Xtsnin zF3tU7sn(Yd=X*V(I)y(@;fj@2)n{FQHFOKh-FU^PTSS)K|NTONiQ}ZsX^vk@wyTJq zEAiVJu`<+JJS9r4e`C*%=yth1tNTj*ud=RquKhS|3Jd4@hPcCAcQ?D;dcAEzH@8w# zYT69@yM~v~Zv44v-;<3pH}9-9xuaiw>Gu{J6@hQIg%!*Hg&yTsG|ql|P37Q8;ilJo zC5yP66VsDKBnhYh~Zny*DNpnDaC*Xs?ek+IP;fx~uZ2i_YRJ1x(L>`pzrv zW|}PZHQSu&+w%nzng3)uoVIH>i|+D#8v4^c{YsIP%*5iudl^(r@}KXWP^Rhq)F$Ej z))&TsA)k`hoq2A0@oD`|Cr5L6j^dp&e+&OqFKpkkS^tlg*7AP+cXj%#ir$|$|3CG0 z{*QnKAEwW$+jmd9vLO4D|6GSN6Z>q!Vx(j3PWdQ3vhCfq{6%rg=Li?JY|Z3dbEO{C zaj%d!dz|y~=APLMulbI?s&EgL*P6L?!aT!;a@{*3ZwcmX?x-lX4y?TV-^o*J>#d_j zwTmAea{elNU`1lSzV*u|hq52La^iC^bjVG<&=&$aP?a#1VxO(zVpBZYV?&}Isfd3Dkyg7fcZ4vKR_fWFLbD{R|&rK7On1DBWf)u=fsiyJ047P_C|J^tmv z{)a5z>jUq-=b!QD3)2}sm5-Z!SpSR2s&cKDEVNYdewLV&v**>RNiXk+$H^=S{Z=OR zQgcnZA9wD9mNW9flO(I3ADq7TgD&%m_ig&87%Lw7R~j<9bUSVH`n<#SKl9g^la@R0 z#bt}lan3BP*=5S1zM^iomi_hbb7oJIEIqk6X)dfGcWEBxLA?R~FL z&sK_Eb%VX-(#Md1GbNqrPh~k4IA(n=X_R;8TIketefC?!qhF@Ts!Y27Bl&vH&fEX) z$gVjav3OcvYv&K2NLOj`meg{!gBBV2?w`*#H!#KYzg4^aeC5%motn?Je#Qq`*In@1 zP!Y0?^{+3pqQs|Px@TWx1UT+8)|hqo!QDT67n{v{Z(B5fF#Wzw#A}u0>(IUVGuNx= zdkFtbocylp(DAiPyUq91JX@{bT)Z*CREuqG`=>n-k8e73ddP3hsZ#CUw;`HGFig+r z5PP@Z;Xa#v^BLm*u?ZI)7BgLM*j}o}9$KZZ?R8!75~p>E4PgW}t=S3=Lpo3C=Po*OK8#CKtjpy~RQnA3S8#;=-wE}iho;i2ye z(dSQ}?KseVt!s6VpWYspD>HpHRPGpa?YRhWV5Ta%ES+` zpMLIKE9b*L``n|toy#)+Y<(uV|Lm54dbJPk%&c$P_M7KCSzpTL>(b>^#Xmt>RNn6T zR>cdGUxfy*boV=;d~Btcq{+Fa{~=-N!B4Y_|nx=YDPqZZvsaruy;q=i_Go zpDGDhKCNfll=Db)`x0G$UxxpOPdhZ-K05!~f@kK5l4`s5{hL^Dd8ykbD_QyNo)=!t zUlqP{etCGuqN(!H?Pph9EPiR^TmIC${g+ z6JttnRa_K&AP}QmoBUCB)mrr|4NvFj$$ejM7WF7ziVD@)`e4KN z%y%uO|I?}_mT_z;4Q6VXcED)soo|Xwa{CvyKK}E6V#4O8H0c`Y6Lrd3$8th%{Jim0 zHSsZ*RE$8z>!#bUn{Q+v;@Mlr-z4-bo>8jrV`aF3#9?;1IgQVGG*?b$d|aurJ=ks2 ziql2Q=E+R9OFUek*v$2F<%Fcap*-4dN=iT9sYdSYGdpH|>1l8;-?z#2rV&y-rv&}^ z=C!H*Ghep;`Dr;bl^X^BHf?^z!l$;_`PA!7gJd?2DBiWULKzB`P9_Ie&lmC8ee2Je z8HY6N-m0Gox$nKI{HWEP7{6m;&K7I^AFll4>$P%;(uK|)+KV{$`_6i%AZK}CW{ykX z)oE;pV~NL(aU$pUe9y+k=QKpl6k(aRP*XdwZ(oKDgTxP z`^?n{-v7uskLT!xy>anpe7ny_-{4zv|L0!0t3m!O=iWTGeH8FFSm5}Ei78eK=4k~! zi>jF7$!qw$VvCV#eK^yPduO&6EM9kN_f<9JFI}CB{92i(USD&%^sgUh-huPx;kG9W zvz~t2e(J6In+f)-CODh)Er2XVVPIeg2zK=JV_;ygaPstJehZ#S6kzZGEt6(ogwY^5 j77ef*4+8@Oll=!U8?1-L8O-JjNJwN_BLxl&dv`6m{Bqs8 zb&Ka)c&oH>Fv>9Sr7iMM5o&dk{Cni?j@gP%4D1ce2N)kP6fjscR589{1+iHy7?@=m z7Q}(bV?sIROneON3M<49z{vxQ5)T+yzA}MG3x?{K77Ko=ie4-Kq9MYy^UbOIeJ&e3 zga0-!`>8H^ZHt%6+N-P|Z9csSxlv!ATb#%7^yKmddE#+-f^C=8uP*J^&fHt@MD~)& z;e#r#S@#*-y>TTdf1_#E>9E;G+#aIek6HeB&MPDScmZEr=-i)|%-{C?J9gUNaM$~8 z=bA{TPdoPcZ+fNHovOFZa=Y5A6Tlrpv?bE+>?e(?1=yz+Im_@_Z z#5ZEb#$Lmj(uv2W#qFPE|F*#3d z;o1VQ=4nyxDt-`j`JwzE~X}8-BQvLCGrZ$I&IvJ6kO?tt&)K zqJ%H8T0ai%<(M8)N zX7+q>W4>>@Z_V>p8v|4eGaep|-86|KrT01Ks;A6zpZkTD+xIcAs?UkaT4L@wHA3OB z>^+rL@g=XSKQ?Y@=ToU}dv{W(YZGhqVI|f~!+#=G34f|jPE5QVTy*r2^6sV?D*YGs z-dvO%xw~oRk(WKqC$Dg8@NMZlxAay2oi!dj=hAaqiyr=6ak$ib($e%bu_eZv(_~~` z1jL+r_gn5(-$C{@*6aU7T-|S1vt6}%ee$vAF<-Z~*%qB&^Qm*wlO7OqrHSOdPDokPQ(t0WLVwLT@si9YH zT)w`=zCp5bRq&<4t*f6tUM5_4FHm)obgXHsd!NWP57Atwl9_HcD$Lhkb@io)Un}F? z(mm1gR^KE(&+6#cI}iO?B=z#a@^oR_&iwSPG4|WN&&vPXr*^c}C!fXn;m3t?Dk=`u za>p5MH!TtNRGPw&=rVuOwx_L=R^Ik6DV=-6PKrJ5eVxkdT+8Ag4)1Pi%U)l%{dxO@ z7lNunneMOEQx7FC)#Y-%tvRG0Id@`-`wQKdQ1;dieYhE_h^qosjKj+-vbfdOx z=fc*~clmF=B&=E4I?wX_sq*%fEBp9%-dg>0UbT|9_w9RU{@c#p`b}c7>aRU!ai8D6 zv+SMHmDqoG&c=cdTVMY=8fCVS?>0+!ctj%4o7~oNi2Ny2Xw|l)aV$PH9Cro>;?7HXO{%2}Qf;z|P zBc6^Im+uk{J(-iz^rOc=VtXDlEnIzbt&#o-eL236Yk#Lacr#5drElBg zl=Aqea@&kd-8VJ$H3?)zIPP9!GHoT_!zZuyosRr>g#G33&5s&heE+9f`PfcAHSY1; zdl%|O4>Ia5a#^FiT)Q&QHvOAU?Q>D< z>WNEdPo0_h^IN4@)tOlT#`W87>J=T1u$WBn>!LZgYx+0lu5Ej(xXWnEjzc0g zefxebUT@y!dYh|lium7qZ*`6TZcnXYVQ>4<+IfFP6}y&9!KLOcg?CKT1LM!z#+Y1r zz5ceYdDMgtqE!)>7ffEhiyN_WUnVt*`fg{CRfu&)SLVsm{&JuTK7JbWG7}X=IrfvgV6p^M+`x zdp_Lfa^LFtC#>{4<-2|gi*jG6q^@4Ecdl&nQP=U=m^SW;_n@J+*uF9&7oF2~kAUN6^Pe)jUF4K{z|-yh5G3>4(f348V6 z%d>) zBuUJenVI!ED`7*Gose7?bMfjq_uU>h^gc)^6xzwS*ZkbRgp!!JeG=P+ESo>I)hqw9 zcu?VgfYI7E;IzrC1zIMrZm$u$bG$K=M{w?*ttU@M_18-3M!dSE<9qhZ{r~z85_lvQ zy#CYbGk>B~TOtXq_$d_>9JpFd6)U(g}!&gG$u|}FMR3q zCBAIq-=?NNH|1`3?W)qARC{M?vCRGl3i19@e+y*-Zk)V2KhEaG>OD%9D*ONb@>unu zzCdBG)~!`G-M`Nn-JD^uAV+h`w>h1O_uQwyvE#eKQN6UlVQG+g-W`iyFDDDRp1)@O zVV&zCW^4PZj(tZ<*Kt1o+LPV$Nq(lM&05yN#}5;hls|~QoRqjITdKTR_;yfwvgGPt z>g&7Y_ngWLaH(DM`BSKw#hYKwuesUwX6=vNT{v;xdM96xznBP6*=t+FhrWGo_IB(`cDRwLF$DUssnwLLsy#J4zxy$>}lJW{U9san8 zSM8JjO z!bTn@OOyS3w<{i=@3iRm@_D=MZp^diV(;0WJULj%`3~ooj-)Sr%r9BG`WHO9yf9pn z-9!7Mpp4IksU8)7SIp6RwNNHI_VMO8=ffA{z8E(qFMS*Ks<9=q_s~z@$=9E`3%)w` zQufKpn)PcQ?#|5EWg&7eQMqyX-g9>E+3P;*Z}C{QEb+lEqZSdj?t6c`?$`7e?@3^M zryp_d{(LcZUi;jH$X6C=dA~kbKdWmL{H7nV{@TXEf_>?C&ppoOuKThsD=sl9MXE8x zcDuwzowJb*&FODs1#Gv;u6*-C`VZ69hBcldr$gB|Y@awx-Qs^y{r&EHL30i$8!qzm zy4^ba>U$OgC;qU~MfFp^d%Z3`d^fb1{harczg(5`V{F^E2<@J5$+@@rck-m~>n?rU zCvE;q^scyTpd5eh-?@(0{t0Zd`l~9nL-~^L|9EY?9O|Dtq%Mz9e82Zv$i*wYj~ezZj<}^5_V~e#r`McJ`TDkc`@0$5 zNj_h)_1W1yy~jlMn3d_VwM$*|NS8dTmdo+-_UG>IGh&ii51wU9@873laZY0Y$(LXD zn{UW@{&TTKMBbiDYWXwbH-!IJj6ZhjOZ|tb*%q1H!mC%WUzoli(`$?M7v@c-4*idl zNDe)*8ykAo7T2XNZ%>%^HtgYpgFANJ&b+LZYwIj~ z+M(O@*{`~}f7mTP9F5plF3&#I`=eUg$@_~nPFB}9u54_ZCzv*M`Nl>ecFEZr(>k+c z3c?>&X30e8nr*lEA-{eKLr*2wgM=In0ZkLBUZ0whSx!qQbv(A3xblj7Y)6VzuTxDI zcTmRv=Vy|w0yO>06qIbui~?t-K54i4?{NLXjOTA2{ko*x>i(<4KVH*j!!pBo`CX@1 z?>(AbWfq@OHzV5mOnu6-cju10_kDPVW5elyGMU-!bM8kZ?0Nj`vgN&JS9z<$=fpR; z7c%6lHpz*|2DdQ(+2g7|onvyQjF0ecSFQ?Y=Jz`$2xX;hFM0RJVf&}f9rM{`82IE? zt^K)BaN_%dWi0IVe?A^Rt;+OifqW(V%g`G8|J#Ggt24oex>EM^p1>?qBySTfb(RzkPn8~;Y; z3nAXYmlIl8H>bb8el6DJSeu)7OxW(d4XY1}DL;6SS;$buILlgmebT`-krvs~*15UL zp}h?}GV|LXNVEBdG&E1|Y!(z#xY&I;{>H6aodS%KGosh9$TTpp8++`k`s^Ojz#*BD zDXC=f;=O!@9w$@HVTA(+w_JS8*z<&ygIhr9#R~~$K8J>8$zEpm_UjW_4j#C0=GZa0 w0tP0TGZ`{A@dwR$m}D6E7}yu2U-{1vI7#=lz!q&k1_lNOPgg&ebxsLQ0KME4x&QzG literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/images/3d-scene-drag-material.png b/doc/qtdesignstudio/examples/doc/images/3d-scene-drag-material.png new file mode 100644 index 0000000000000000000000000000000000000000..5d346e761f7dacd6b6f2bd727d72978e0ca7b9f9 GIT binary patch literal 23027 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 IIVCg!07`ZQ?*IS* literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/images/3d-scene-tutorial.webp b/doc/qtdesignstudio/examples/doc/images/3d-scene-tutorial.webp new file mode 100644 index 0000000000000000000000000000000000000000..6aeb929608d4e0618b6d0d4e74d7858f8329c6f1 GIT binary patch literal 40854 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 SX7dFkrG_&KFt9NMfcOA$$XU|> literal 0 HcmV?d00001 From ffb1bb11d17216332f4406830acd850908225252 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 Jun 2023 13:31:03 +0300 Subject: [PATCH 140/149] QmlDesigner: Require explicitly enabling qsb generation for shaders Attempting qsb (Qt Shader Baker) file generation for some reason fails the lights baking process. Since autogeneration of qsb files for shaders is only necessary to be done once, disabled it by default in NodeInstanceView, so only the main instance of NodeInstanceView will attempt to do it. Fixes: QDS-10206 Change-Id: Ie2b273929c9dde4ab857f6ab47f7daef47808f19 Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Patch Build Bot --- .../qmldesigner/components/componentcore/viewmanager.cpp | 3 ++- .../qmldesigner/designercore/include/nodeinstanceview.h | 4 +++- .../designercore/instances/nodeinstanceview.cpp | 9 ++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp b/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp index 9e254244b42..29bee73620a 100644 --- a/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp @@ -48,7 +48,8 @@ public: , nodeInstanceView(QCoreApplication::arguments().contains("-capture-puppet-stream") ? capturingConnectionManager : connectionManager, - externalDependencies) + externalDependencies, + true) , contentLibraryView{externalDependencies} , componentView{externalDependencies} , edit3DView{externalDependencies} diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 93b4e82a2a2..fd7f21d090b 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -67,7 +67,8 @@ public: using Pointer = QWeakPointer; explicit NodeInstanceView(ConnectionManagerInterface &connectionManager, - ExternalDependenciesInterface &externalDependencies); + ExternalDependenciesInterface &externalDependencies, + bool qsbEnabled = false); ~NodeInstanceView() override; void modelAttached(Model *model) override; @@ -289,6 +290,7 @@ private: QTimer m_rotBlockTimer; QSize m_captureImageMinimumSize{150, 150}; QSize m_captureImageMaximumSize{1000, 1000}; + bool m_qsbEnabled = false; }; } // namespace ProxyNodeInstanceView diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index e5775228ef7..fee28a9dd3a 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -124,13 +124,15 @@ namespace QmlDesigner { \sa ~NodeInstanceView, setRenderOffScreen() */ NodeInstanceView::NodeInstanceView(ConnectionManagerInterface &connectionManager, - ExternalDependenciesInterface &externalDependencies) + ExternalDependenciesInterface &externalDependencies, + bool qsbEnabled) : AbstractView{externalDependencies} , m_connectionManager(connectionManager) , m_externalDependencies(externalDependencies) , m_baseStatePreviewImage(QSize(100, 100), QImage::Format_ARGB32) , m_restartProcessTimerId(0) , m_fileSystemWatcher(new QFileSystemWatcher(this)) + , m_qsbEnabled(qsbEnabled) { m_baseStatePreviewImage.fill(0xFFFFFF); @@ -256,10 +258,7 @@ void NodeInstanceView::modelAttached(Model *model) activateState(newStateInstance); } - // If model gets attached on non-main thread of the application, do not attempt to monitor - // file changes. Such models are typically short lived for specific purpose, and timers - // will not work at all, if the thread is not based on QThread. - if (Utils::isMainThread()) { + if (m_qsbEnabled) { m_generateQsbFilesTimer.stop(); m_qsbTargets.clear(); updateQsbPathToFilterMap(); From d2425f6e125590f04b504d09f0eda4e30b27e1d7 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 3 Jul 2023 14:13:22 +0200 Subject: [PATCH 141/149] QmlDesigner: Fix states editor object name Fix setting the states editor object name on the QQuickWidget instead of its QWidget. Change-Id: I90cfa5d312c04eafa95eef6ab49cc52572928db7 Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/stateseditor/stateseditorwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp index 14629417f5c..d0d5e88f5c4 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp @@ -81,7 +81,7 @@ StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, m_qmlSourceUpdateShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F10), this); connect(m_qmlSourceUpdateShortcut, &QShortcut::activated, this, &StatesEditorWidget::reloadQmlSource); - setObjectName(Constants::OBJECT_NAME_STATES_EDITOR); + quickWidget()->setObjectName(Constants::OBJECT_NAME_STATES_EDITOR); setResizeMode(QQuickWidget::SizeRootObjectToView); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); From c572855b95069a5a11184dd1ce862ba8499c5be2 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 30 Jun 2023 11:18:53 +0200 Subject: [PATCH 142/149] Utils: Use _cpp_lib_constexpr_string to test for constexpr std::string Seems not all compiler already implemented constexpr std::string. Change-Id: I588ef56767125a38fd80d0798ea954c11c8f6237 Reviewed-by: Qt CI Patch Build Bot Reviewed-by: hjk --- src/libs/utils/smallstringview.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libs/utils/smallstringview.h b/src/libs/utils/smallstringview.h index fd7f1edfd24..982192c7a44 100644 --- a/src/libs/utils/smallstringview.h +++ b/src/libs/utils/smallstringview.h @@ -12,6 +12,12 @@ #include #include +#if __cpp_lib_constexpr_string >= 201907L +#define constexpr_string constexpr +#else +#define constexpr_string +#endif + namespace Utils { template @@ -63,7 +69,7 @@ public: return SmallStringView(data() + position, length); } - constexpr20 operator std::string() const { return std::string(data(), size()); } + constexpr_string operator std::string() const { return std::string(data(), size()); } explicit operator QString() const { From 95074bf2a34c6e8faf5886fd8120b046df3ce774 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 4 Jul 2023 10:55:22 +0200 Subject: [PATCH 143/149] Doc: Update screenshots of output views The Next and Previous icons were changed. Task-number: QTCREATORBUG-28996 Change-Id: Ic90a458fdc500f8978ff1d51e293928c322c3091 Reviewed-by: Eike Ziller --- .../images/qtcreator-application-output.png | Bin 6180 -> 0 bytes .../images/qtcreator-application-output.webp | Bin 0 -> 10118 bytes .../images/qtcreator-compile-output.png | Bin 10137 -> 0 bytes .../images/qtcreator-compile-output.webp | Bin 0 -> 6714 bytes .../images/qtcreator-general-messages.png | Bin 6380 -> 0 bytes .../images/qtcreator-general-messages.webp | Bin 0 -> 5590 bytes doc/qtcreator/images/qtcreator-issues.webp | Bin 3940 -> 2082 bytes .../qtcreator-search-results-matches.webp | Bin 0 -> 6534 bytes .../images/qtcreator-search-results.png | Bin 12896 -> 0 bytes .../images/qtcreator-search-results.webp | Bin 0 -> 7250 bytes .../images/qtcreator-searchresults.png | Bin 19626 -> 0 bytes .../images/qtcreator-to-do-entries.webp | Bin 0 -> 8424 bytes doc/qtcreator/images/qtcreator-todo-pane.png | Bin 32343 -> 0 bytes doc/qtcreator/src/editors/creator-search.qdoc | 2 +- .../projects/creator-projects-running.qdoc | 2 +- .../src/user-interface/creator-ui.qdoc | 18 +++++++++--------- 16 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 doc/qtcreator/images/qtcreator-application-output.png create mode 100644 doc/qtcreator/images/qtcreator-application-output.webp delete mode 100644 doc/qtcreator/images/qtcreator-compile-output.png create mode 100644 doc/qtcreator/images/qtcreator-compile-output.webp delete mode 100644 doc/qtcreator/images/qtcreator-general-messages.png create mode 100644 doc/qtcreator/images/qtcreator-general-messages.webp create mode 100644 doc/qtcreator/images/qtcreator-search-results-matches.webp delete mode 100644 doc/qtcreator/images/qtcreator-search-results.png create mode 100644 doc/qtcreator/images/qtcreator-search-results.webp delete mode 100644 doc/qtcreator/images/qtcreator-searchresults.png create mode 100644 doc/qtcreator/images/qtcreator-to-do-entries.webp delete mode 100644 doc/qtcreator/images/qtcreator-todo-pane.png diff --git a/doc/qtcreator/images/qtcreator-application-output.png b/doc/qtcreator/images/qtcreator-application-output.png deleted file mode 100644 index 064e8d9e0d311df6d555fa066208f9a7513492ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6180 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 ChaNHj diff --git a/doc/qtcreator/images/qtcreator-application-output.webp b/doc/qtcreator/images/qtcreator-application-output.webp new file mode 100644 index 0000000000000000000000000000000000000000..4a6277c7ba4cefa379e0736d3512f82181db550a GIT binary patch literal 10118 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-compile-output.png b/doc/qtcreator/images/qtcreator-compile-output.png deleted file mode 100644 index 3ecc83c25ec6d33d9c5fcb94d7bc9b72f792a0d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10137 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 Qj}sh-p00i_>zopr0P{}l_y7O^ diff --git a/doc/qtcreator/images/qtcreator-compile-output.webp b/doc/qtcreator/images/qtcreator-compile-output.webp new file mode 100644 index 0000000000000000000000000000000000000000..ef7d16003b85ffd9370509225f2ca9dc27735a6a GIT binary patch literal 6714 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-general-messages.png b/doc/qtcreator/images/qtcreator-general-messages.png deleted file mode 100644 index 89d80a260cd5d50acdca2071699afa6cae39a260..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6380 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Ϳ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 literal 3940 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-search-results.png b/doc/qtcreator/images/qtcreator-search-results.png deleted file mode 100644 index 363207038a7190d770439a0682ab02f5cb6256e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12896 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 diff --git a/doc/qtcreator/images/qtcreator-search-results.webp b/doc/qtcreator/images/qtcreator-search-results.webp new file mode 100644 index 0000000000000000000000000000000000000000..d36ec5e2851f7b72dce81254c1b953c1c7c53e56 GIT binary patch literal 7250 zcmWIYbaV5PVPFV%bqWXzu<)^!VPMeTf5?O3YuBS~xiXpmHx`>dl@}B~kpA;E>%WsP z65C$J+I^n3*Z*GjviHlFf}fg&Iz2u&rD0)y&gcKT^BzB28Skzi{UC1p&fB-E-|wDM z{a!Th%<(FEiXTD?AX>gyJL6X_Iqz^o|Bt@n@xJjMClV| z2Y=o%`ydy&V9uu2)ecXuSXcNlzEHP+a;r>P^Vk069B;fBy;D3xnI^FQw(PzbB*?TW za#Pa9dh;A<%Som4%k)>={B)RSUsb@VKhx4re3_OlQ_#AuX=#*!>@Dpx!KE|g(&TbF zHhnUY7JKb*3!V%5)( zHG5*^kLdb|Mb^lvop~w}SYZ>q{AE(?x>GB!sVN^0KBJyo*J{^OED?TW8TX`9p3i<- zX=?r7x>DnFYsmJQ;s0+`9jWX|k9qWoXZyXs7b~Y9k7z8He|~4RK707AbvA*YKi@WW zipuc2l-d-NcK7U~+f&muyB2Nv#B0g;i}T*QJx{Mi%dQPScICtGb!@A@U&#?Xs6W3m z|F7lo&a;7wx_X-LWxeU;+xIJhr6DBXvqbgGAKE2PZvOiE!=*;)YxYF8hn5GQRUWE$ zkiA&Ew%e&-<4)bAz@K?4r;=PPpFESDll#{vSq5zA?YckL`is}p8Jyi)qh}|*Lq^AY z#aH>hbeWDt9-NETb9F5K>V9o`(EN^>{>R@5+I3&oEzHLsj+c*NnXnBX6!x{jZZa=!n3`R?-O*gxg}1C~fst~5K}@9<>t z4at~i;T|)j{@q-C{ek1LXjdEeeedgD-)Xw9{yzDWMD_fKasU55xijPbO8yVTOm+ebtnYW^1`uffF`>OBqKX`j3CeXZN$I?w4 zAxmGa|D$?Qc>TVf7eW`q^L)N6JHGtiRTH&uZQ=UcuPV;^y4joQ#?sBn0f&F{wJ*|D z;*dPxbXt7bZvS)N?En3|8DCTXb$Wb!-Mhn=^?kl~3rEK}o&7)M+4r6gKT=*TtYAs7 zESTGq@qbbC+|X#JxpsS=bTcZo{pLR|AhXt|QJ3N5YTbbIEHAh`E_S}V`Eh4?`Ol~4 z@7cP}=lG;Fo!`=(Z(~f5aCA=4m zje4!_eewLg{OKXNf(Naq96h`FZP(AL`@h~^{Pthsa~kWA6G^Q%C24z0S`7BRmYZ5&B^j-Dc z>h8_@S#hWG`I-Eq$zM;3R4n59azpNkrQ(Gqt9eVgAHRFf^)56qrtzF(tj0I73;y^1 z-mt#9U&?tB>yHJGU%SNKIxkUm|F6mSz3DPSoL^&~uxVLcetg>L|62Q}>~Fh2g^%%qrAol5 zOY@d`^!*RG*U0Z3xW(S?ebKA<-rB$4k3W~q*>AoitD9pJL)d4rb@SHq*ZsHs@VWfw z+tvO{tHWwu-CcU6eA(icZ>^u7@6zjcUVr4z>lMc(+1CFv?5vAsO13fFWcOliUrmFE z<%>??ug@?2JGybjv%;2!Ad{qDqF4URZQ`E1n00o~|9fr?-(9ABeiyM<{&7*`sp%QP z9S!pwxRa9EW!^mBQ9t$T#2QDNJ^2S>ce$^rmY;SdSJ1KUK$XOXS+wZrqol}k3p-4zpjlkR-v@wS)W4zuly`1{JW+DW*NEu#UcCh z@76y3v{pM@=-Y1b)%R{~D= zzL$L;|D|2swPVuD9sTW{i=r+ZuN6`D+Vc3_w9hf7@z>Yx{`>0TvzynJ&z`;f_3`j? z*QL{L=U!gxKC3ZXQlmcKZWo)GIF+zXCeckkrz=;|*5(Y;|Ib$< zmW8jnG41ztS-!;w5F&IIsM~G-r@tzXHS>z>&m}rlP6(uUTfb`lMhA3^SbgQ zvn48Ko(uh`tIf--f7McJU+O-SW%>8!e10)=qSd4f0}kWzWqTu}uLSyhHkLTHe(R!` zn2!stTbZOS@KF0=`}BwF=c@NN)8b!dX)tgq@CavgcTW~YcwDD*;t40I^?N>bffVOgWE#2IG$f_VOuerxZ?Z^5 zbV1S{6}9BgQJcOxOemb3zu7(J{*AXEyPtjSxV?4Hwl7mF=Xs`~TN3Rc+29S(#q0Y5|sYSAI7i` z-NiN^3SWi#mCpa9m0q77U(Lt;Kua&GXGJ<=NBK9)H)0}P(LGx??Gjy(vr%?ik)-nd zbP4u+7yE=vb7TeD^d*63yLSlpF9QA9He)kBrtzBxxCuW(>lGWf zfByd}c}?}kpOur8&zkBVvr0Z4x$Nh0mMPC>9=q_#e6mYqitwhRsjIIoyK?qw^TkzL ze@<%6p0F@s?*IGw$K)rSJn5BQv}tEww^8@$28GX@t7VvrOkc&ndATAa>e~NG!5tc# zcZ4{s&0X|^)yVSY|Jy5{l_dKglusxs;uQ}Sn||WlrDsvXWtwYm#g>0>c&hqoR|}gK zr^x}9O}}!AXErf;<~YYr=?gOr-(Q-vF*(hvdDgpkPouhZFHD!-rRi{I*(d#L^OD+* z`0iLeH8RG@+WSYv-BoHWPoKst^LYR6V0+;y2IGyIo{O8mD8)t`|EOH=d#iO??hU=o z*_UlRbGB_gvSh)jM?$wFmz}HBNs!L3+ACb`y_Q#z*We|qm(r!y(kC;8v!ml)?+x4c z-REI;)7PwLFTcjj{+}GWEa#JMZt#Kg!m8Y_boHc#Zv~v4ylzF{CS^sFo5zlPd_3p< zU+bUSZQA^${lU+~v)?%;JYC9@(xBNoiKArVBfG6@p$g_= zIdU1=s@J1>_|koMuZ@cCO`YZw&ERTv&zTO?oQ`L z)~8+`t1?1&o9*4rK2<BP0AyW#pRDAhcTV&<9 za|E+>gIaDiuGk&QusSySDvPQ18kydufBH9U^GeH^D%Zt6DTpVlX}9w=jm&a~T2^0< zgC}NiluZm_+^(^(n@x)M&;yC)$z_-IOv;=~7xX;r=t^4d6g2t9#!ji|Y)#ii|6J~d zI&RkvX?8hqYGS~=o@oNJ4y9{eRG5+!GWp1@fkzwWxrOV4k=@WSL>3lu&7La%jMX6jG@9PX+c1fo4Q+9 z;r)hp6C6xJ`G0J<(m2~u*eUzq0><3-2v)``u8loxt2>3HWFInx@7>+Lu!nbH!KIZG z%xqhnxgwIYH!4kfmaCk*I^oKb{xijEpJu5?O=2*US~sUcz;id#gOeQ&w=Ot2nR+z+ zW-D)B6WFjsuHeAu_c5}w1eWpb>u5UvdI=Xx08?C;qh_z4xCZ~O1~dKtM`dr6UG#I8 zlomR~x!lQ1c*S4)MN-k-qJbT|SZ-&(G{63Gnu~+rilRsJib8!IDvX3;i(}O{T0h&? zSfSu~bb;Cq>lbd0zE>BY{j{L&g`w@W#n+O4EPbK7SLji-^On5}w0GUV8sRNi^A&^_*iTmRNsPg-+6MXdCUJE7LBG_&Q?o^0Z z;#>=tUG$&q`JRWmzxNj|HQ;=@-?qAGuH&XnPbQ`FFgHH_8{BqFWy;>|{OP_drxbS1 znlyda1YYLEQ)K_13B1P&e}hDw7eBjho_eAF zP>STu$f)VtrWxP2sHzY#v(C+oEi+2n7btu=cyb#^)NbqTB@3UQG0&4T&wOF|xi^j1 zHho{=+Cb;?GxK9IuUsg8CjETtg3!`^nxY)D11w7}bm^`y6=4zF6vpTkur}d?b5_p% zCBIakL>0?Pc=;o_qJ$nP6rk@Vr&Q`}-1jz4c_l-;tZV=MpZ{z;YeWEZL7Yz8(##db*DcoZYKRya@f~(MzH^^p=<{76EFE(BpKI9!<-Y0Oijj4E zoA)wC)+KFP*+b{zZU2P3YE@m<3Mum5$Yq**_J;g4l>jE5=02{66Bf%~(+Ll~8?$Ty z>l=@jeT){;`AfM=xast_rxQe0Ei}c-5vn>!VxQ%@vXBFoDOlzvDwd zl`F4CkkE=Hq1lfgyxMSAP4>%7l@CXr?Q2;ozf-pSVjL4I&y$@$c|5ratiNtse&NfN z+jSO?C5m^hIQ*|qWjoWUr9HQ^TeZ4#oNIGkjPIS$Gtb^C)l|l+rf|slUsm?(jWv5> z`aKuiT_*CSMVa&A2D!~)-jXNQ@B3fkdFrLzj_5NiN~X2F-Ejgdf>ch2Uej}$I_c(u zNx$@0tnW=YCfz*4t&QK(!qK7FJFAgrseoIBhptCc*p_WO*?z<{M*LGaYs#^K;f-15 z3JJcG0(_Of5`_<3XKP`&A+eP4#Lbf97Yt_2`cYc_EhA}Wirl+w<%ca?a|6FF(P|S; zIKAYNK}+!hjYZxn$_^}oa+3lawV48LELb4sWLWcHoz?SAU(Gpg8U&ji$_p-XJyPJ& zR&e5SzZOTCvX{fFm>l*8Umo5LaTLD!qL52{b>NJ7dKc4~&IVS=eBU~;z^PUEfy9k3 zUmRB+>iSTyJSKG31K&HznaQdL-F+6ZT#j$5dAB`uvuCD`K|)TORc+qdv>Sm<1xvro zyK-2TRq)}$#6v4;^F7Yb%-?fv#loj&%=6+bQZDuFetf28vD~udYHxSc>Zb48Xqi=4 z8_ZU|WbfrIBGcYKO$?T!{$qZ|Jnenz!sedf5Ap``8=Btn zNM~$yTf*4;c)iHKDM<;FS5Lq3{nNX71xL>G@Vdlne)i4$nR)CROmSr?kK(0CrgvAK z6x(0Dz5iq+NJ~TUxdjJ5@m_g+N+EfzX$+FLzhC+yxBY(27Sk8|-#=aOf8X@$F`xFT zJeoU2cFK`?D#t$5>btI(GDquY)&_mGrTwl9ov%!$t+{fcZsDT`RlGI&#cPk+T>L8W zJ89Cd8LirZ3*Ew&dTZQ2&D74Jp=(|uch(Eey_ile(@h$GYxGk;`k7hv&3j|_ zPQ|e8RW&Em+f8EXTz$))UJP%pF_iq}a`yKz(R0%ums_1X>eE@&dOKmOrPSJ1-`29P zu_0S#6g-n|T)}4RIze^9dsW%@D!=S+J06^?ax9=m|7l~Hr_kT0EN@*k7 z?U8g#RbXxJ$z?UC={2vf z3)>D9f17b5LFl{Sf9v>;RqIz9Gx)kT|6ji9jrRnNlOm4Og!WB;2+}v9R{ymjv(YK5 zD0xP~qfhzzk1(n@MNYc8>`CU91uG*MZaRpVx=v7S%TGv9;jRdi+&TG(#IpCQf(c7Y z8Y@1kUuTzgI&)L`m$st{Q>24p+hW1k zbpr*~%W6*Lkf|zMel4+`&uyHRtq*Pe`Z`MS>$^CCP6x4oj)@sZ8kQY;>*dzXnZg`6 zNwdjBaNqPyr(Ok#tXGC>`}G=C*{(-){fb*PGsdkqV46n71pbdY{)>Woj~)L$$-1() z`OWV*KDqOW^6iV?>AQawZ=PXORl2s|oYDM?hYw2_6kd33`Pk-q!Me*5|MIVQ{$D4% zd5_o!ozE9_-scA&2>kwhi*dfq!3+U=nfhzzU$YiZ``P3F){M2s_IBl-iyC25xu5HN zzG;)kXK{|-&2iy>&xgqZ7PkxLT-5ltF~%Z&=J}}N1Cec0E^25!J!E;hCTtdS*SRH^ zHR@vY=4?KbeotY7$)$|Drq9YJ%l=oGWWp+W^x}K@5{(a?j}|9c8Ct)W`utPVW-3$N z@%?}IKV0y@N5WGiUOGd?YTd8pUrXX$RT8bX-#8muvMn)Asb3qpudL zWS*p#%9x85)MY(*{H!6y`bM2X;_gNd_gi0Qe#+<4`m@f~s%PaJ>EhPpGieh7f9k)l zOa86&`_P*u@6Q&`{cP14-m7@&XpW0|*ZH*u)%iA^GvvRDSzWF@8DVyovfvp+Hfp$&xiWNykqKJ{Acb-`zWbRePmub?Z*zUe|hH(AHO{= zFEi!w>jlpgf>oINmMaKrEZW4l|EA1@Oc6h$x7N97_j#@yoslT9>T!$yCxx3QMe_d2 zx7=`+Tu>;rJ#iZ6d<{E;>U@LF8EbwX?NPcq@1)1n|94e_R>u9!R+n!v^Nf2CU>e9g z!+fh{!d8Px8o60zHs3j;pX}RG%&~c`@>J){WTRaciQld|6#vzF5xhEsALQOQN)GB> z{HN|o`zfj25#Fbt82OiVDXWUZ-)MGRCz#b?zumk%xE-NM?t|JWBsh+~t43>VJXKCedMoRIvR zuf95q*3Q`f?{q3#qFL4m}BPzbSFOia!k>0 zamEx-j@o%nqTtA3)vFarj}w+V_VnD1Hb|d&{>>r9-~$KeFHep?e^S{$+v2T9a)j;o zIY+-PzIMH7UaDQy^S^hqpFiloEXbce`QG;bi>ErCH=4g%?9)HFFY_J$OMaQZdSL=1 F0{}CnBxnEt literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-searchresults.png b/doc/qtcreator/images/qtcreator-searchresults.png deleted file mode 100644 index 3e2bc2f53096cd8ad1d99cbae3ff55a4ae37ecd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19626 zcmeAS@N?(olHy`uVBq!ia0y~yU|P$-z{tR`U$D- zrE>KaC+{mNC@ONQa2KRxZsp+qrl_&d@SdZ;)1@qv!l{lH&-O~Tr1q30m^cZXP0_xz z?x>ej!={syZ9Jq-Mf>-+i3 zf8XtWzieg1d-y56tn#?M11Ok8I9bFoKq_H)KHmi#s!4!r;O?tNVO-O})wLe}5Y=f1zc zzg|0-v13l6?0NhDHga5jzbX!_?VlTPJbC-IV*Rj3$Cj@<_b03WUf#_87pF-i&b%{q z(Zsn|oS5=%RsQ>LQFHO}_qp}oZl;Gui(CADv)TIpr#<_B_4~{Xn8mfB^WW;YudC`O z*+#S}{c700|L@zkW!7m7#l^+%D~?;Q%4C}HAYJ6io#OMh@ArIuvR~(^dEH}kHgDEP z*W;GQ{9W05uukwv^snsxn$NTQ|IC{I;m#%NyTbbG?V9FaI&M9Ep7y+**Ok{5@BOJg ziJ`KAJ?H7-L%%Yc*grHnpMJF3{_D!B4u^2L1@%v-ED%>q=$hr=6!0Xu?y&T|4=4TW zf<86ue!p+_-)|H!n z_4(Yd?f<_u{r~oqd;P9YTbIU_e6I7J7=P2wK~6lbLQ(kMB$hqj_rBlzVo~?1tsN^F zXZRkN8XlK<>(K0qdzIqxH6Jhg+s7_0JhtOAgCFy>dz$}sk23#Kb5!qQxAB*Kz?f_` z`~KGK>zmKpo&LAh;GS5dQ}6MmS9USXpVY3*5-wDc^*iHb1HX2^?Y4#g`Sb*u&#l$c zm8z?$ZTM-qM>F)<)g?d5#iS~(t@t+iG;`eFSK<3VOu5__TJF3BHWbmLx)48 z+yVa?UXE+^3S1klzGO8QPyKsU$90G2xn0cv@1FPVezU;kQ{1~V4|JrC#XnsuNn ziFH#_^A>?JhuP;*-Ax!d-#vW#k;V8Rv(fa) zrk+oqzbq|oxYfodbJ+GqOw&uXnROHYo>t4h9#^evz5nO4+1|Z5MJuLHvb%TY&A+G# z>=8x}{FloH=DN@Gc(+T8&2pyf-&eEMTFgZ?&rNNubf|ck@`>Tw9{YbE``MN1&(E{X zDGE5aCGONtZ9VJmwcIlQ4!zdjx1#OlTUYUY-|TI^Rc+JzaP4jSRH4aV*KuDt$~@!8 z|2OIO*2c!0Ykz;c&iUErB=b4J<0o#g?~o6F^!cNGgzlH-_ulp2?%FL`5FY#Ry~m-Z zvL?4Yw%`J7|E)6DCFgMN(rTEn|6z;W@~!7%{I01?{J(SGO~a(vgh?I@(pEPDj{Tb& z(vZp8rN26 z{Fm$Ix!w;7U$J}9-UquJyo#PzHt4r~wmC4V@kq*EIXQ(6hx#pyJulc*7+y0yF5UAs zH$R!1aT1HiO8xE8n?vyVNuYKdct-N#Y^yiG*>rTbazpmw4KjY&y zna2;?V#GC$Fbi?>DvEM!WjD(|=eOa6hS@Tk2HR)xf3L>(rk{LY_kDM4=9DVYPw&G% z$EI(tZD#+zd3VSXrZaVUZ_DG3f8)LPQzjn$2wiNCij3iSW$5ob|o(~!B){`=1J zM{OSX=2uProfrCmvF7ysozMSm&W=C)hokmid`y7jqfOp&dtNg=bAR#Id|#VrXzt~N zx38JrB&eMH8@%d!cLoy=XTsg=E4n_{m5%P;a(U%~MKARE7wA-LS|5B;{z~$j$YaKh zPcA>&Brf+r>;KBRtnV&0#I|u<6@1nIKs+jJxv`+>$tUl3aa`0ERq$k}IPgM#<;F!# zwGARA%-{Q7=9yf@ zGu!9Wzp9@A*Zrq|DV0Qr|K8=WwfXA*Z@2T)YfqGM?fKZ7U((CaGxtG4ITz16jf^~N zm5IVPe&-%lc4a!iysa;8;j!9gi(~!lPnKW2`i3Q0>x1@t4cmp&U$K-WrV1GZ9cO*? z=!dp}^De4hE$Tr2*6hc5oP zvE-TV;w>{QxC$2iXq)ZWEwgkcJ2wOWfxxE>{0ENrfZI+7m_cnS5c2^exOv6Q&i8=< z($Zo+KJ6i+`Q0y|79s<~HmL*53?N{`P|L_8c0J}Z|GHhT9!})nss7IY8AqMhV`q8GD4Wke z6yGha`s~ldzvJJp*Y%oqdGVLuU%K^nf5_>BUN(EaFMBt0)twK^_O^42=<#2R`@p~; zVe+o>$C1wV_aBArzntJ!@2h*_yjYd>#H{%%cF!wWt08xw<;%tP`BtxKt9?FKWy6f! z*A!NLdR*4O*lPWg;O{&hW`Z^iou3!??{WMW-NpXJcU~iV4zFB5#;Z7c{s$%r?|nbT ze_&vkVexj&apoBr)vpB2uFKZS8CWDreP%ee&}AS0PTSCF>>nmCpI7Cmnes!c!OG-d z;kr%xXDwH)m~-m=8tV^BxxT9}w0ya{YPrG3Exanx&nN8;sk<1F@0ylWd7$)q?DuIO zcKkgltj>48eDU65ib{U1HC`)XV|efx%QP3#N@CR8#=Pq@kOd*KZB4#yvIrZJlnXRh9UH1XNt z?>0}p7C9KGx|PN*m>bgmNpFW%Om4XNv(yZQ1@e_YTplfRm;dQuD3@UEA>5?(nrV;Z zE}_1B3)aVPQL4|kKMAXVGnl&0|U=|_6eKsWNdWMIkQ@E zmVv&)Qbo&EyID^;DOHMlYA#t0Kodt`7|5mJRWXS4CX#yYMC4KylmO z6B<*^naeWzl)~!jf+`=Bf8Q{1rNPZ_F8>z0yRV6@ea3h;?Q_?aLgwjv{r@eq+Q{y| z>rvNzlg*zFf4{5nf10|{{xd0j&%@u}xpzwC=IXm4-&Z|ZyZcV7?3%p~7#R#)Da%IT&YlSqGMt|$YGRDir`B<^RCOChi*Mj|N~!zSu)V{p z!ShJ=`n})I9{l*Q`u$$Vd3Ou+gWrF)w>wk%&nomuWzgT;O*d5ZO?N3+s0;si>R%V} zPr=`1(n{}7*KY3aXx=Jr!@$s%ryda~pOC`4cINr+wLN>3O+Fq?S+TkAjHqa=826%5 zM*me+HVV_6t1=gW3U22WePyAlWs-+BcLuOYy$N4EQ?S-htE|bf_2f0y-v%fD97;=3 zi8A4lQ&_To-n9A~f@kv<{hK|T?U>OGZ5Qt^OIrF=w<$6$n{oL2z1OGyA6a{lnIU0O zWrN|1VzaB!2d7MDk_5%LkkOUM7n7rm<N} zp1^P|=vv&hESoBDLH9uPebx2zv6WA?*YA3@YOZy;pZ~9ew@yU;y0(4ar&-x`eEo6| zQ$iZf_Rm~ZqusDoL^bn&fl%u@6@t@wAX}xN0YX2A5>t+ zA}RhIkA&T2YyN(||NFQ6f1d}{`sZ(av9Euae*gcB>64Sw9=mH9AO2{+U+IiM{L!F) z_hLRB67P4LeucGcv3%{ng-SQIwsapm-gnyj(C=4Y_W%EO?E2x=`+n3uSKno1B3JeE zwhJ@&wp~fvd#Ze2RjR(yRXJgwc=jdtkL%0rt-jArdVWNlg`uIF%jUt^Gn*a=OYzVB zvw8m9$p4G}elCvRvR_Z8yiRCG<>N2?b!AxxPkvbZc=n^3;=k$3?Y|3DPW`*`yhhdH zthY+1e{SwgKH|Sk`tj+=u00cfX|D5`A9dICKg-o6_sZ8_FY}Eke#I``y083G+OOGG z-*&#|P5Z*ou+jAlvt7ac>Hoe4yEAQYIn8WWnDRST=(yeQyT<3&&$L&zsrcl-f8)!) zKQ9OG-fOd_(Z$ERoBD) z|Gy0HcfEUcdsz8ddrQ-m-|xQO87q8k&aQ=aEmzE+))+A`9H}tQRF?=~oX%p9^Z&@i z)9-~UK0Mi8SM{oI_m}x>*~{yG+?{Ox@pCeN{r4}2`K?~wzrka4|6{N5{a>%@>)$O; zuhTea{3HDC)}MF$@7mv7|7KG1yWR-Jb5DOwG7Ynx_v6m3iL>`rMWqFZ|B~Eugx&XY z%FIoTf0o%_SsI!fe#QH~#Zsdc@461Idh*pEyJOwjo$JFT%i;qMuduXHzjz?O_G`*P zmy4paFHZI!iGR+Y$?xavDfIlG`Qgb*`59l- z{r{enmz(_3{NKZu@-?-_C(a1Dww<;AvHSA;$^+99)(P3q{n>bEW&bLXGNu2e-o~vR z-YK#XssG;fX!XvYEmXpGjjKAeU{UrVJ)W$%wXu%+FX!9+`fBV~t^24Xc8#9nz3XrF z%s*Od6^BUP`(s}b6u!@U(S6Z6uVvA0E7Vq+yM(`I-zl!SX43ydN50y8oB5u_UpL-E z%iceHruuqIu9UP-hkJzYdY4qc%-53BU|`sAW8O{k6A}(SOcwk*UY|%U=XzuR^X&XN zzusDZoo`|`zxL-7-cNrzgX^nvj87CC4)?47tbM#<+x$6o8TO^2KPKzFQcs^(d+2wt z!?O~7#q)cO>VMDB@lyX(Huq;Vb6EOBrB^qdcjs(ebotKe4xv8VFGU6J+iyJ3T5j}4 z@6n&_{d4PHa8{n{`V_tPb4BeWFP>dWS%I6P-Il8zy+0wu?0;yuzR#w42i-5O70~)` z9zXBRvn6a3-n73|-8KD%(~JC5drBD?1QLw)ZkemF``IOH)jr!FpJt}dGpN7x$Iw*RBYT=q@>#n6_wJVrqq||Ej7@pO?p5Eq(pQG{DYu+Qa-^s=s0# zw`g3|T^uyIDc?hH_S#ARIUZGgT0V1ydZdSuef7#cUruKBeShW-$_aiZ39U!ucl=y- zMD<+(3qwQy>D3<_yv1Z|em%KfU-N9es^7dleM@cXyyj}i+^+xh<)8m*`}My+z1(m1 zvp(l?e!b_CJzFGWxBgU}{r}AM{eRy6Rlm9acu3$MH=X5sey`NO>Fsm!iKYF|OWv#0 z;;U>kwD`b69=PAJ~u>m}~v9bbO?@B6aY`2TPBQRZ#2`}UUox$Iq6m~yfI8xzlW{dg;h z1*;hu7_t~Ez}*`VAqVc$Ff_0?uf*e|73q_cGxr^74X(cC{q#M* zR+!ys=5O2MLQ?hCg--gF{d%tRTqT=^uMhXx`qtcFU|@*uWPdXwHp1}up*MUp@6Fh^ zbnAxd)TO4e4eVQ{@A!~$ZmpjG)dS2TX<@(5GyCv9x1M|UoKJ24`kbfTFPO_@rG)rj zMC&txdRRSd{0gmq``nV#R}1iG=yA(kh>Ob2m!GGxb_sumej|Iyb@nf-r-M6NZVl{9 zT56xEZ=V-qW-#^ZFS~{O;w=r{jw_G9v-riJxP0ran!{a_SN=S=&v)((pRSspPqtRe8v4iNRWj^PDa`%9)KV{XcZu3{Z;-2wd|=qD zbzxTCl&6eNFNzY^Z(%x^wDUOgmL=(*-tU-IeoAxMnaern&rE;JIHzFEw&h2*`gojn zFmR!d zH@8lE!uZBt?e6+(Y%JCD@78C&Dmuz+!g=Bqb4S{wy`UzP&z!jl$z|V99n$U9vPsx? zQsv#H8gaRV(sNEM&%Qoqt#F9g=V$ZIXVc9++rEgDWz|(?I{SZdoqO`sWXqMOs=q#& zep;(@@=UeYR@)fXS2(!+eEnT{f=QS?8pInqAS! z`yCX1aDQOf$g*Ky{?@}s9tzEFHD^D`{AE|^3FcMO>Z_`}KEAm!bB)c+$*cB+`=4fx zuzD;YBl|U*Q|?0K9i79>KjN6z@dsove*m=rKQJt1&e*!_sa&J%Wgqzq_adue6VlFq zni46iv67$T8tb!~z+L^ng3ru*yQ?9J>A|Yf@b>*V*QLCQnDh?y-l|t#&aY6sOiO+} zcfli}HA`H&{!SCQJ&XO#*Z*&J>0L1DJY~0Fv&L4ASqlp8cCL~D_2mzQ-PONvZ|xc8 zTUCJz3cEK?FHpT@E5T8nsARrbDteOm1IA2i$BnUP4c8R^o3k;RdB>0G*Utr(H6_kG zY9@Tj=%z_++tkUC;tPr{O;vx(QYyE*uCV@`--k=g?BA=x8b#l*xGMS-gT@s=8Lz&{ zxpjZt!LO28`x*XlGJ#Tl1A7jmglor@bd!hS5)7cR3!4OOaATao1_~jf3_-%60ODr= zK~S1wKEMoVPk(6ee8hN-y`c8u&mF53J=@v&nn8FIy*K zTeRk)vpEw3gWQGeJBhCiG7`($KN{~yXyPw@%;@{FZ&^`tb=Rfp2M-=~pUU-neZXPy zmomY<&F=+tW7g&`O_NQ1R^jmA=*=D8LF7W^Cwf~N{OxL^#E1qAw+{D08aX{k(gH=aE zkM#usb?r(yh1N#xv=E7ETkW}pYTdVPuQTUxQ|kJ3=(WlzN%hbB!Y#D?P4)L!1+1TU zm^H2z>@f+7(|@Qc*-Tx#P1i9j zbMfYsy)MFM@4Va5cP&=@=*%~(`X34!)k^L;zA9+bd5F5c&rbZFbS{qp5BwP_E&xrE3??&H%`S^VYK z#`4WJ3p_&R#b)dAUr>4Q@989)gbLY7b92RYFLVAjF@FE4p@HRyllRGr|KT%FXfONc zvzk3;YL8W8-m;XaRp%`W3!TkGCM^CVBqmqf%-)uuUYuC5YS|jkUy>W$3KQSAty5U- zV*fqH_OBfa1A|S%hKvmr&D=^?E|ho|HXS>6vn;#J>M--0jP5O*Rb~%j}n$rHak>KYer0N3zQ+8Di5Wv43de;QcwT$4=p>?zQJG z25xabvJ$c$#61elJjJakX=3bK-u0QmE;at#(ZeQ9b1K|a_!U-#%wuAS96#D{u|2=#^8E+rBT{vz<WJYn4sHF-2L?OU@+3CY+0GFi^S~eeS#Z z`j)v1l-#lwwsaS-KlgA~L(tmple>1>&%p4ZVc{F`3(FX|b5(yg*EVPVZdew0wW|Ko;raK@A5$wcPHKAL zt$#hC*C_FF<(hk@yYmAASgvbrXqvk~qa~BC>vO}yGLN$R2@8#O-{5R((h5kfNPSgu zklAH^2N%n>u74)GaIV zM+Sx?9MB?=fgdCYDgZ&4fq{WvLR~Il@5XD}b9X&ADo!k8-@v=R{nX{8*}r`!rG8Uo zNZ!ou{QcKszJC1;@t^^Wwxi4ucOHsLXJ(YSzj4plCC#7V6>l|FI@(s{-L@sS=hU^_ z)Kx#neqS;2xYu9KBQihu4eDB^2s=CuoR}B&*CrumiDsz(4@gveY>2qjJ%fq&W%!P* z6Z)-n9-S?jR@KoT6r1)tujKi&*~$l*+pa23T%1~Z$y`q0%}(_{T(>hgRPsF*De-Hl zdOe@s{=B4dojRx*&*OTJ& z*MzkgL4nH0Z?Kxli~WGX+Gf5rYu@-B7cX$HH=m;?SvHsNsb9z56plFte6=49cDEjS zb>_@&8wCZ%qm>6fSS@i;c;?hNy=?7H8;8jZi}^WP#U#rk)IQk-)-Sutyltl645e2) zy_YS0%>400XYI2i`+V4y;^|V*MrlI$yc?VnJ)ECe9@qT1u zWUxtadCL;HP=Cav2LTe9~=qX#V>XIL~Tx5PV*(it# znG2>(cVDvhl~{R)Y)}*X56j(bNp>aRmWv$!hi7+G_$N$_7jvwe>2jt;D~~O(L6=`) z-fsJ)Wl1`sbNx@>tkFuF6wLRv=fsY~E>lk(m*sP|0HtJuh!v(xZX8jUXSOoOv%ll3 zR}0Ir`J?Kz^LWzvZs+$p2FD9u9FEwPDd#YK<`c#}icX3#_a6Q+uvY2XHV3u%vd}#f zl#*TR=kn@tZxnBi{vGcN)02;ryoCm_u|8D*15}m+m&#&Sf#Xa%<_Jjp054Ar09{P;H6n>g8JAe zd~K-(HEMWL_cxfaMr3H;lz$`bbDQ0ych$AuljZ)s2zd9*={iTBQMdPzh5m1)bwbj_ ztq&%|=pA5gyRCS$wz)}Z2fWcV;fDT$tHH~;)`FD_R3Y)}HM&_3x<5fj= zw)g%MF14=~{cBkL?r@(qPb$c*4eTYc7i2wTer7(q+FXw{zH!fK9nc;rw z4y&0SaskhbRlKE5j?Q6_yRhSEi_nWn79MgAJAN;%c^&le?#m-@Lnxy}6W;ot&? z=T9~=m@%(a=AWS*GEwP~pIK6^*0x$nxeN0?*)4I|;gt2`b@bEjwzL<{^+M}=t;Jq{ zK2xl}{A;Ox`1(a_8tN)nh;<5uX;-=U*(4d+gg%&GSQ)=G+)yZO$>lu3mD*J@%gm>R z{XH0E(QUGE_SL5?$)^@Q+<)@nq8rP7>)gLp7tWq9k$Ym>^w(C)SKSHCaJ%7dA6g)} zZgJQ2mnpBTCowv%S^s_Jo#Os#&7YE!7MDv-Ww@#Ifq_>nD5GroW|j$lGBW%h4*x%M z=JmzNU0a2Zm;0*<3BFz_JvG?;DbtCziC92H!I)&;=_i| z!q;wT#}~X=x8MHc^){LPzn1WK#JdJnd_HwM zG0BU=bm8`<%g?@q2G>lvufU}LG2ycG>wQTJR&*$>nsSL<;Jod>zB$=TX-JoAEwMA360+`g?NPT!x1}lGzb6SvBMw zRQRT{Pw+YyWYZww<@LGY)h~viyormW`4@$Rx1C=XcH8(>nd&vxw#c9RzNr7b)uX~c zL3IObk)6@B7%6r6!cRN3O%LqhoFDNk^OwBeuiH}&ov9AutPF6H511e^^$Fv<=EeIL z7eqD+RKF7t*|yi^x@ORch0Iwlg@-TOEZDpwvW@-2UbYzd1zhW=vj=#GJlm;W-T8n~ zQYj)po%%xoi=3IL^={3{Q3J0Ym+frrg$}F)5Gfp;q zk9``p$m^tegqGIlpi_1ENwtC5rrx(Xuf_c|dd;-;TY6Tk!(RK(bsA5e6zhu_Ywp@( z!9U~Cw?e-qY56aA{l0s-tm#UzxLd(Nk+o+o^Z34-+^z5C`R?nUixu+k=hr&yEN%R7 zS#AH~W&0;=oF|!kVw?DTtBptQow?1ar*(G!BSt+}jZH|sXjN;=e|>MF#p?U>ZZtz56HB`WDPhaFp9%E4Xpqu8HYEA}#IxOVgAd z)Rym@x*}*Adx`SSWtKIO;Vsvo|;B+&88qk-K{X z&QG2`{Q~=jg%@VD2|im9``*v)(UpCUNuQ%e{I2Tb*KXWmoI|9)dsNz4EBjo<$q zc-QA{vu^&kr;<%4B2P4K{HShmVeN^f*Ru{XA7EyC>A!)0@nN6y@-rS?=_t1UFi-x* z-H#o|KU`M(G3P3~hj8QXgUnT5)Nh<$FJZ$VF~?>`{v!EpapxcJWbV*6xOHC;G(5q; zAh)5k@V4ysCUypfV=fE~+ceHuKKBBRmGCn#B&`0_5Z`DAYS}U{+*q~a)3e(Ln2()O z*%7nh`mD!crTeRwDm=BlW!YbJ2ws+bc ze&__#;uFk!K3@NR^q8Pk-&<{d4w;6WU-Ps(c3(cU*r(u9#r{98|z-L046JQXv+>->khJ5vmHc$9pPIq*9oOYKlT zyWFOr)MZR3kMnKYq8+KF^HAW>I`d39g98z7O4_Fca(*#>pb7H-*Th|Wcbm$#DoAnh zD{y!8xpVV|^o zap8*vTjXLTf^L*X$s3%Ac$3opW6nx%r3wZH9}~6X{Q}$u5*o~HEBQN;H!gP$xa_Ev z>SC(4qDWC^x0}Yb;2NWr)hQA_HXYJGnHGe}O~|d@lji@K!E4Q=>CeUV+2qRhhRa>J z9`Qz501_g*4m5FZFOM@avT^8=Hy5j}nrSao?X%rReNlMf&CRp;ze#Z$8-O&L zJtDVX(7rG=>#og$jN9Iy8Xl3oyPvtnl>Zhuc@)Ox7?KKE0#b;dWwM ztbUsMjpq?>QgdwBWgw2c)x#WSBX=N&ZROdP=1c4X9lT*HxGcXtk+B8%O#Vm|rGfj&=HT8nio1lUWn+2NA+d}qLAAPaCnWw_O zMoyqp@}1tvUEf#cbH@}dp8NjNfeM*T_ta%k@(od(c zKbZLM+ibH*yxLxsd6~x&-#6QLR&{+Uoug=2#&7bVmQ!v)Grwu7^QYYYWNm@i>9d5R zce);tH9H@xvP#O&@OguoL&!#H!OprAmcOfu%ipcdce*7f951NR9cU}IK2e@O@8xd^D=Iq~qtoX3o1FSaNrCeJ5(Nc zRC{q&p5DCmE0x^*j`e?CZ=jZZ8 zhRkADxj*g5u7>Kx8}q7@0viNnR~5WqW?-;c;4jwHB_;5EC=KbJMt@>RrF#5(x4<~}vf z)mP*;-+SShXY|e&JFUG%_b`20a-?@fW?s0pWB-%h^4lw~*M$~eeo)&0?(1F2k=gL* zBSZcDgmZQZ8|U_K*{@vQy0v%d?U-YJ0quMF|1CLwbJ?bO$-=*8+RFONz2NvRS?xCY zxK;(b?1z0D<~~?u=yUny%x&URTKitPioSk7_jB$qCu8$u?d8{xp1zYIt@(Iv`ja<; z3fn&P*57`8Cx)4Up@QKLXP8q0@44$7&-i*4*&kfl*_-D5^2XGQY;3X`puk|TS#W>G z`!~fkR|*?;m5Je7Hv=6-gY;(yp!6C3XlaZrB_H12eOnSp_!!SN%A52;H*EPfCH z8juIk4V@1e`*z3VpEr?Jyk1=BTp`-KzUa|f+4tToq0il1w`~l~7UzBYSar|(kAIzV z)+gPIc%yphf4Ojx0%(4bOdfY zMci`i^|t;x@wTAiu2p&;18y^fuZ>Ny{1TD2+i>3<57w{2=Py3ZmcFLGLT$0Ch58yx z)h@2PhMk&?UNcjk3o{s`$QhWM->>{~kwM3BDd&mafI@|D1!>84Y3VK;cQ^OT@UOVB z?njwR#Pl8Qe^1Z7pmRz&dcEWASJKzim#ZnOfedWz=BnXqV-yrv#=-DwIX}k=hbEQ@ zpZx3RtE4aA7j3Bi?`x?4VmbF4#s8;V3|MwYI+Fj@JDojiAFVK2mNeyCRm4Z5ica6v z&p#|?+Qlt=^_J+@p!CeC5&kDv?$|pq@UHn&M!RKUF3jfBo^z>nt((y~F9baEe>*7u z#HXMQKb+FJ-^=ZK!T(w^Y+1D8$v=yFkBA$-JNwc8?FVC@2?;-+sW{g$GX#9!)v%Ds zQ)t3ZzPkxK`j{^!tUNECvv0%qJAJ#pF}kVhsXFF(KIpO7#Fu1x_Y+%m)42z(ySmjr zZc^L0Wc{^u1vBsKwNBt>DYQDu{O4Vf@b%DVD~yc17Diq?q5doO;qsJSsV!NPs+>!{ znicB@MX3I7?R@?6L&&RTfr=~t?Aw%kXqNEnpD(j^f3$S{nYhB=MT@DS?iRZN+XQ7s z$yx`m-@a#O3xB$Fb!PCQ5RdZmDOX$+uN|BGJZ`4nmU!E17SlRs7l{?wNZmcPP5Xl3 zj&MQMBabs@vG16Aky*80`~I}&7nNLP%q=HNl(=451YT;;wO?^%&cD^`;%21S3MW~F za!jpHuH7_y@=r5PxrF%NB^O*77}}E5Z=AJLxWGR>(tY{XQ!4x!#|-a!e`L7ab>>ET zIm?W1VcFt4FUfyw_`)E5o4w_(>iVfk&MjqIozqQU&Yl%h_IldIm7WL9RVL?NXxe<( zM1#?E&W2}G9x~qRQ%slT{l&l_(fXI^;GP(%UAtd1?VBnbzv0V^np^Ac#Z8q`_@a@J z=brJy*k(a;y2L)#ec!Xwtm4+j9#N1G6m+r`;NMqw(l50_Ro3=TR=TE9gT~Tc|COz~ z%TKSkvgCpEq|;(A4y>(t}Yb}TAj~(XA75F*6bGK}g|INyf5K`e_xYaRh@gKIQuFFq{F5c9* zDr+~}os*(FWBH}7cdqe_f4$RmcJLCZlals5%nS*8Dh`}TOt9lTCiKsUJha<$2U=hxnpVPJ4;V28}$H?qfbAtvzQ1r@l(0_p&O zW_3Dj4ji%MJ-co95mt_AvD|C6P16j~1;JoyLB~qWz}dzb`MFx%=RpXIqO| zpY2|@vhqM`R`!)5%-+p6lq(f3fX-9Y*~+cDwH{bDtjn_szt;R?PPH zS9Y4*wO_aT=dMQ|Koi814>5Zr?q7WI#!amw%(G5=Ut*0eXAHj89myycu*2u+)bm}% zYDd5423(X~Jm;ha+v?nhQw{d2-Ma?_cgPj^-xWag8(v%7N1R<$GF8vCpkRxnI{ zG1qzS>eOxG{o0=Xv3ZpTZvDC^&L21T8arsIHbVpZl8Hj!X3oD;rM11pXF->2@Iv9k z2NE|te(B%7Lv-HfuWxR4lv$p?mvFH4x~$}~XE%RudDN(5?5x>xyiQwW=l8m>G?5(h zbDr!^i?_<2`mFub`PsjxvF&~O>yFO)GlPA@6y>Ps1FSXf92K96jxtNQRs@PO$${z! zxqw#o8KI5WN*3$z3p|?H?Yva<#Q7_SMIHvko|`wj@pY;3`LaWMw=C~@bhrC=oQr&d z@{gVSCiwo5yT34hhVen>IU-Ltw?^6RsIPzR>b|S|A)_BxIP(Vkm#10z1-e;-Bquy& zJbF`zfq`K|>RT4+&AY?J@-jmnGJf_|n?2KK?E&UR0>=_dLJl%Fo!FUoWloaKfnCw% z%6#0D6eC&tKiu|ts&k&Xq&4zn?PJC@e~xbb8y3w_3vzaa!`y5Z){2H1+3UKmmZWK4 zpO^LR9J5XB?!(MMhxQ5ZbA$=_^jJjynAaztp!R`R{4>M_3$5M~ZjoZ~w+vlgaQ6)WUwic(sIK?X@j;ls6>LddYmt+Iv0snKutNr*E|iXtr~> z^?!9~qpH2i>Mi?|UmBkcvN<4pK5s?RR1KX!j}Lt4yW(?`Q;+?%c$0vJwd2yv4xYba zOH~st`F&WhQ8+}n_Ek~&{stv3a8v#Pqv$v8E#=yu8@9!XWZZf5Mm46hjGs-ZEcDnn z)ooWpA2VK)Kj4<$w@G+Q(>4Wu4yJW4>}45OGXGX9$}4aBY_(dbv$lELyw_R#9g6NR z2woQTZ2hMEfVB$Hq;z2ZgAszt3}VSKfFM}Im6Oa}EPUJenD3mh4Y`p7o#y(`uX6v5$2U(xSWTY>a z2IW)#n$<`2wkp{iaFO^FV9zgL_g_}u%4osFmCJ+M4b)%y8@zPSxc9w$%4cPfU&3pi zxp&N$e|2EK0t2Wot|}*B$v-b|YueHu&vh1>&VA0Pbt$2`Q^;qiu8b@AN`} zH5TbXHS_mvJueJ8R1kXe&M$@ol=#i#W@`doOeX`x?Jzo^=$sa(u_%>za-S z6lIT`pLn5g=1fs8wN#O9w`qW^Nu5>S9yM=RA?146xH*)zC`iw>5*Htj^ z8!h2x1UJC=R~%wKv&tcRmtZz`*?F^F$7J)Q);3(-&dylTQjqH}d3NViH_ciHiH3-F z(TrK8EhRHwUdj<+)>H`Hb(pzh&eO+yyKNT47q)-5(-z|nNobPc?>H$2_JDx@Ur-Jz z31pi9S}AkHVDic(f39t;4c5!={?wqM6u8VME70L@mh0A88s1EX>mTt=wmkirA=X?j ze?z=Y!_@sdw%yO-UI2Aves9BM27MmGqs&KQieuL-GmhT*EyOrvhP91CD$50KevPaM z0UZaAohw+EXr%ieeYQ6K!b2dgMtVuxm>gtz~%?m94Ov)%!frCs88a>O}g?o4G* zIi*s@b!5{8E|0{A`~BZl-B4JXcFM27GUA^=i$lBXv{`K@F60MBF{!;};g_;@G`+Z7 zulzf=#v%_HZ}Trj|sF!-b2sS6xb)ZOIan8r0az)$mgwMX;s)2=ku@r&+63{=0F3b4h-P$_7(##xQ%g zp;SU;G3S&|%2Qh8*RMbSXb<~+3(?mzzwj-Q`QyvQf8twEshq&Bgf3Z`%JMby*$u+O zZ-j6%FjO==VcdH}R?dq5f!&|Tl4gxl_Zcc0-oFcZ!pGzs9mN$sN#7e8{rd zW`S<0V(jjW%=4cn-B-+8eb#d3AKF4c2#Fa;VeEB=g{!X0O!^e4WxS%~KX{ zPLU0FKfgj#`s&B|)gsG;`lc~5+<0YkU=7!nWzzT7>)Z;+w#t`3!1nQMU+)*=`P0_t zJX_8zyu0c6iCZgwemk=*B}u&Vk*iF^b*B|8Te)h#FKG#$6v{4pW7(o4BZRRsFJ*8|t9GEd#%YKI58-&Hv}>I!Ou~mG#R^ zeLR2Jvzsx&{->t?+j%xPZ2I$Ov59VK&$jLk+oGZ@Bv{`6+S5%qOx^gbnzoCpoYq0+ zNf%oe!^II?vc%c54RXkGN%Nd{OWi7+ zW>^Y#1($z+ebPnbD6@*`!wV0m`fj=Z&Zgn0D14z?>-E#jCEdF|Gt?j47bfR0S$Emh z`N>u_J5O!C_3`T0cdGY{i{3CVN}pnA1YYf6;{YxIGTC;3>QR}4{*fGI(c&{cKh4(2 z>+Onref#FEwPDwzy9TD@af&ks$;L2k{<4vxm`F0+azyRq0N^C-&|K^st3zAB+rnYw%zyCC$KqJ>ao~fW$de%!*!HppoOUxBg zbU=&Lwq2@g+;&TK$AxcUjLU9ovsO49GwI>q+P5_}SaQL}m$!OmeACQK%-P+OC^ggL zz2^6;ryu!O#Ww7*j`Y9e7w~-JtEX@FIXVi)tUkb1*0e}qndOS3eg#)=oZ7m4QP}wx znp;ntR68}LHSLD?mzLc#<}SE@vRdYxx_rjvpvgyiZylRac{Q>4zlOoF2X-=R2 zo}GWi(TNQ&ZbVIc^*FsnkPEbHxY=VIOqL*x-j>${I-TSo$OOq+I+DBtp$uX$%|aj%$2r?=ga=|r6ncqp@vdf zZ&yEMule@IeY$_|i7DG3SS0-gmqx1|=ti)MY;(H%)GCBQPTgri0*_XNe1CJos<$hI zr+7c>JvXUvhqU=-&D~obm&c0CUBB8cZJ%(i8*gAF6{G^BEE2U27DpyCR;DVw7yg=!D^Hl)|ASVZ#O;{J z7tQt9_qdJ1zQFf34KF6NWb|9N)MY z%-&g0X>%*bDhXzt0Wl9;Hdj z9r!L)P}`t2XBxXnd}7sCOF`v{=2=@Wd%FGkJnQ8eZTGWhBqT+qudg|^PsV`%y`-e0 zpN;Y)c7f1W6WOO+V*fIoeMgzx(+Y=Y>L52%9X~hi+8^^7c@DR^e6|OxEO>9TAXD^K z-`1L<8D`up(hKbrei+AzD=1xaFKg=d`nTmC9QJ5!KszB zM9gc4#rIb->$o+p?wYaYcE+KJe~Lq{*=!DVKmFnCS*HHX&|=NC3${%yx3c`$!*SCs zO!GK1*VWD8wGCCF&khHiILPg$Hc58Uikhe!!b==q_-*J1x$l*+=#^@g=*zrIIU_#u zf+J&0lr+aN5`YH-#u zX@5hw|6IL_h8L65GPLg#cZ*>;C@Ff<0Ec{#|uu)n#s-y)&?n}5|S!GEhx}nG?<2TR6xs- zLEHl#pBr}W{CUXL!mea*?A;QE;PZ++8>=n$o%*~w$~|J6h{yM=+uT<+cZC%+iZaWsn z1e*$n=NH|%0~?p|NTvP1bNO3Kq{24l_@bCwH(#vCW7u2Q(SGaLYtX(o&!6EJ?@Gky zEou6tx$aED(vWr0$F`{{A7#$UIk!OI*Hod9do5jUw;32D#N`4SxFpX1eECqJ!$T2I#egVF2-RwPc@9#a(xS-4U zW!t1CX-AMb7h1UlKKa)_SNXntUp;Jav;8hN^ZXkV_C?)%q5ULvjg%TQS|rd-ahjFTbO2dpEq=r}_P>;Z`N79UE=J4FXG!`g~b3 z>8_EL>CI_X&eNth9Tm5Vt|<3sbh~1_#%H_Jq@S+R!SOEdzMeB_$+OsbCSBXPPBSs7 zY0oM3c|5wj3>L-#(rzPiOOF?GijmW`^7#to;eIcoZCG*{*MFUniz zPkK2`aFypP-iudnpV{k?IQ5UX+PdY3gICUWYhCi`_o;0^x=-xA7b`U>&mvOtlXs`E z=ciScjuJte^qBb=7+yVK-2QIOF1-nt*q3a%e`SxQqJHdLOI5FuMV!!4&?WY#M_aXvlgk4@B)j>mt}gqqiN zL```!?cz$$kLD^<&(>eP$~}2ax|76mu7#iS*QC$7{PpX(E#{@Uue#6GX-;3xQ3MAES}HN*1pYIwwa%!t<&iBi!EU@pD_BGpQvS(ONg2%dFpK+!{vKf zZwQm>Y`#<+feKRE~xpKPXsxQk@a&K2ebnw1>pmYZ-@k%yqnO{0paQMOdN-?1Z+B6g*C;&`V_Vg4wM8v+ z7t|(SE^BJMD?c;-N_)Wa^4h(|yf0VDDQh{`X$B@0?RU`ly)mAFL9LfvBv^Wh*{S@1 zxRPBlrdq!buG*G;U~bIB+g}&#oO@!{m#y;_Uz?*B@3sBBy7}YwLI#GO1+@px>AncB zKp7|%;P=Q`bo1HH8%zudAqBV3hBvV@+&lL1tm5p#UO!*8#q*p&oywlQ|3Re~sHlg~ n;O;nV)&^1lk|denQhDG%JNLGTF2|rk@QjeBtDnm{r-UW|4`*;A diff --git a/doc/qtcreator/images/qtcreator-to-do-entries.webp b/doc/qtcreator/images/qtcreator-to-do-entries.webp new file mode 100644 index 0000000000000000000000000000000000000000..0662993be134a482d081386d67e7eeebeb554855 GIT binary patch literal 8424 zcmWIYbaQ*4z`zjh>J$(bVBvE`fq_B)Y?Bs)-23a__6Oh2xqbVO?B4Vghjm(E6M|U1 zChP80+UZg->7GkfxutdI>6@3i)8AWFAGEu@x^n7&_xtBR{`|A=b8?;W;Uy8q3LkbB zI4^imB&Ew8)8cpJQiF7ty68De?o$$zAF4|nN!qFCw)oMS^-Vc*JKk;ipZ(Y))NQWU z^zLW#>n<5drf{6xb0)!SiH^o(R!d8@*C+T^Sw&1qU$(SP?w#XT`xkF)MFxp8Vw&tLOkPKheZ zgO-y&xMLQk^YYp4?f>$>C?(A%#_gPdY^m2xak*rhS96Ty#FCFWo@se<=BvlbgwulT zAJ-gQ7%=C`^r_GHEwOpM<#x^dIkSwFcdc~HRS%z98TW!&{dcfZsD+rz+z_WizZpHT zm46R@*s=fNt}J_PE7`<(?s~rWDkIC@mVeuyxn9%vUSVy}`5&d1uFQ^?4@}L>yms}y z=1(8Hr_O8k-`A?W&dXo$r=`I4_21a$e`Wt?KR;V`JvaU6)_wc0%>RG2=0CsuKc1)I z#eY|q=Do}Ao}6D-%W~@V{yBxFGvCW<->dks_mB0_*ZjFx?IPz)^{xMU_F(CK@3t#7 zQ4Vn}D`FzdUBwLC_blgdS>t=JYE{IhIhJqNmQVBUsyD8l5`B7!ze?>l&sQIq#JAor z{ce9;u4U8xSv!pEv?JHpRG)NvMVo=H_SG9 zzMK1&Ta!vBe_nKM$={h(~yel-3Ln2FdOL_7Jl{)La z%H=IT^=j9tl&xO+QQ^<;B>|t76bSvx{Mq=#`|#xavwJp8m}#S0R&?~yQQ_m<+G6Wu z=h�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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-todo-pane.png b/doc/qtcreator/images/qtcreator-todo-pane.png deleted file mode 100644 index 21122b96a224425a0dc0454d3234219c46e40415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32343 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 diff --git a/doc/qtcreator/src/editors/creator-search.qdoc b/doc/qtcreator/src/editors/creator-search.qdoc index 13dc963896e..502a87367aa 100644 --- a/doc/qtcreator/src/editors/creator-search.qdoc +++ b/doc/qtcreator/src/editors/creator-search.qdoc @@ -176,7 +176,7 @@ \li Enter the text you are looking for and click \uicontrol Search. - \image qtcreator-searchresults.png + \image qtcreator-search-results-matches.webp {Found matches in Search Results} \l {Search Results} shows a list of files that have the searched text. diff --git a/doc/qtcreator/src/projects/creator-projects-running.qdoc b/doc/qtcreator/src/projects/creator-projects-running.qdoc index 2393c4d2bb1..a6311d58d0a 100644 --- a/doc/qtcreator/src/projects/creator-projects-running.qdoc +++ b/doc/qtcreator/src/projects/creator-projects-running.qdoc @@ -64,7 +64,7 @@ the application has large image files that would need to be bundled into the resource file before running the application. - \image qtcreator-application-output.png + \image qtcreator-application-output.webp {Application Output view} \if defined(qtcreator) For more information on the options you have, see diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index f2261381d55..0ac81844cf3 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -236,9 +236,9 @@ \title Viewing Output - \image qtcreator-general-messages.png "General Messages" + \image qtcreator-general-messages.webp {General Messages} - The taskbar in \QC can display following types of output: + You can view the following types of output: \list @@ -441,7 +441,7 @@ In \uicontrol{Search Results}, you can search through projects, files on a file system or the currently open files: - \image qtcreator-search-results.png "Search Results" + \image qtcreator-search-results.webp {Search Results - criteria} The search history (1) stores the search results. You can select earlier searches from the history. @@ -449,7 +449,7 @@ The figure below shows an example search result for all occurrences of the search string in the specified directory. - \image qtcreator-searchresults.png + \image qtcreator-search-results-matches.webp {Search Results - matches found} For more information about the different search options, see \l {Finding and Replacing}. @@ -459,7 +459,7 @@ \uicontrol{Application Output} displays the status of a program when you execute it, and the debug output. - \image qtcreator-application-output.png + \image qtcreator-application-output.webp {Application Output} \if defined(qtcreator) If you specify command line arguments in the run settings that are passed @@ -485,7 +485,7 @@ The \uicontrol{Compile Output} is a more detailed version of information displayed in \l Issues. - \image qtcreator-compile-output.png "Compile Output" + \image qtcreator-compile-output.webp {Compile Output} Double-click on a file name in an error message to open the file in the code editor. @@ -636,13 +636,13 @@ subproject. Click the icons on the toolbar to show only the selected keywords. - \image qtcreator-todo-pane.png + \image qtcreator-to-do-entries.webp {To-Do Entries} To add keywords, select \uicontrol Edit > \uicontrol Preferences > \uicontrol {To-Do} > \uicontrol Add. Set an icon and a line background color for the keyword. - \image qtcreator-todo-options.png "To-Do preferences" + \image qtcreator-todo-options.png {To-Do preferences} To change the icon and line background color of the selected keyword, select \uicontrol Edit. @@ -659,7 +659,7 @@ To exclude files from scanning, select \uicontrol {Project Settings} > \uicontrol {To-Do} in the \uicontrol Projects mode. - \image qtcreator-todo-excluded-files.png "Excluded Files in To-Do preferences" + \image qtcreator-todo-excluded-files.png {Excluded Files in To-Do preferences} Select \uicontrol Add and double-click the placeholder text in \uicontrol {Exclude Files} to enter a regular expression that From 0f409b7ae812f563c74f046bd5d47570a5dfc972 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 4 Jul 2023 11:58:38 +0200 Subject: [PATCH 144/149] Doc: Move details of managing plugins into How-to topics ...from Configuring Qt Creator Create "Enable and disable plugins" and "Install plugins" topics. Task-number: QTCREATORBUG-29361 Change-Id: I51fdfad1cd7d210a72cf08ef3e82f08ae8c6ecac Reviewed-by: Eike Ziller --- .../images/qtcreator-installed-plugins.png | Bin 44616 -> 0 bytes .../images/qtcreator-installed-plugins.webp | Bin 0 -> 9196 bytes .../creator-how-to-enable-plugins.qdoc | 35 ++++++++++++ .../creator-how-to-install-plugins.qdoc | 43 +++++++++++++++ .../howto/creator-only/creator-how-tos.qdoc | 2 + .../src/meson/creator-projects-meson.qdoc | 2 +- .../creator-only/creator-configuring.qdoc | 51 +++--------------- 7 files changed, 87 insertions(+), 46 deletions(-) delete mode 100644 doc/qtcreator/images/qtcreator-installed-plugins.png create mode 100644 doc/qtcreator/images/qtcreator-installed-plugins.webp create mode 100644 doc/qtcreator/src/howto/creator-only/creator-how-to-enable-plugins.qdoc create mode 100644 doc/qtcreator/src/howto/creator-only/creator-how-to-install-plugins.qdoc diff --git a/doc/qtcreator/images/qtcreator-installed-plugins.png b/doc/qtcreator/images/qtcreator-installed-plugins.png deleted file mode 100644 index 2d9e9da951ddba25eb9ccb4fbab05a7b78a9c445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44616 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%0D(GG*+L2)=|Kh6BSC%aTPO`^- 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 diff --git a/doc/qtcreator/images/qtcreator-installed-plugins.webp b/doc/qtcreator/images/qtcreator-installed-plugins.webp new file mode 100644 index 0000000000000000000000000000000000000000..b6aa4253b2b7ac594b85fc78a62afa4af0b1a5f5 GIT binary patch literal 9196 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-enable-plugins.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-enable-plugins.qdoc new file mode 100644 index 00000000000..72592cdca5a --- /dev/null +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-enable-plugins.qdoc @@ -0,0 +1,35 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-how-to-enable-plugins.html + \previouspage creator-how-tos.html + \nextpage creator-known-issues.html + \ingroup creator-how-to-use + + \title Enable and disable plugins + + New \QC plugins are often introduced as \e {experimental plugins} to let you + try them out before they are fully supported. Experimental plugins are + disabled by default and you must enable them for them to become visible + after you restart \QC. By default, all the plugins that the plugin depends + on are also enabled. + + You can also disable plugins that you do not use, to streamline \QC. + By default, all the plugins that depend on the plugin are also disabled. + + To enable and disable plugins: + + \list 1 + \li Select \uicontrol Help > \uicontrol {About Plugins}. + \li Start typing in the \uicontrol Filter field to find a plugin. + \image qtcreator-installed-plugins.webp {Installed Plugins dialog} + \li Select the \uicontrol Load check box to enable a plugin, or deselect + it to disable a plugin. + \li Select \uicontrol OK. + \li Select \uicontrol {Restart Now} to restart \QC and have the changes + take effect. + \endlist + + \sa {Install plugins}{How-to: Install plugins} +*/ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-install-plugins.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-install-plugins.qdoc new file mode 100644 index 00000000000..10eb5e36c45 --- /dev/null +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-install-plugins.qdoc @@ -0,0 +1,43 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-how-to-install-plugins.html + \previouspage creator-how-tos.html + \nextpage creator-known-issues.html + \ingroup creator-how-to-use + + \title Install plugins + + \l{https://marketplace.qt.io/}{Qt Marketplace} has links to \QC plugins that + you can download and install either for free or for a price set by their + publisher. Browse the available plugins in the \uicontrol Marketplace tab + in the \uicontrol Welcome mode. + + You can also install plugins from other sources, such as + \l{https://github.com/}{GitHub}. + + \note You can install only plugins that your \QC version supports. + + To install plugins: + + \list 1 + \li Select \uicontrol Help > \uicontrol {About Plugins} > + \uicontrol {Install Plugins}. + \li In the \uicontrol Source dialog, enter the path to the archive + or library that has the plugin. + \image qtcreator-install-plugin-source.png + \li In the \uicontrol {Install Location} dialog, select + \uicontrol {User plugins} to make the plugin available for the + current user in all compatible \QC instances or + \uicontrol {\QC installation} to make the plugin available for + all users of a particular \QC instance. + \image qtcreator-install-plugin-location.png + \li In the \uicontrol Summary dialog, select \uicontrol Finish to + install the plugin. + \image qtcreator-install-plugin-summary.png + \li Select \uicontrol {Restart Now} to restart \QC and load the plugin. + \endlist + + \sa {Enable and disable plugins}{How-to: Enable and disable plugins} +*/ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index e4fb87f7c10..fc5d0f3fb7d 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -64,7 +64,9 @@ \section1 Use \QC \list + \li \l {Enable and disable plugins} \li \l {Find settings files} + \li \l {Install plugins} \li \l {Run \QC from the command line} \endlist */ diff --git a/doc/qtcreator/src/meson/creator-projects-meson.qdoc b/doc/qtcreator/src/meson/creator-projects-meson.qdoc index ac15cd4ed83..ffc9a0d4c7b 100644 --- a/doc/qtcreator/src/meson/creator-projects-meson.qdoc +++ b/doc/qtcreator/src/meson/creator-projects-meson.qdoc @@ -22,7 +22,7 @@ in different build and run \l{glossary-buildandrun-kit}{kits}. \note Meson build plugin is disabled by default, see - \l{Enabling and Disabling Plugins}. + \l{Enable and disable plugins}{How-to: Enable and disable plugins}. \section1 Adding Meson Tools diff --git a/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc b/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc index 631e7e879c7..2e9330159f5 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -142,55 +142,16 @@ \section1 Managing Plugins \QC comes with a set of plugins, some of which are disabled by default. - You can enable disabled plugins if you need them and disable plugins you - don't need. + You can \l{Enable and disable plugins}{enable} disabled plugins if you + need them and disable plugins you don't need. - You can download and install additional plugins from + You can \l{Install plugins}{download and install} more plugins from \l{https://marketplace.qt.io/}{Qt Marketplace} or some other source, such as \l{https://github.com/}{GitHub}. - \section2 Enabling and Disabling Plugins - - New \QC plugins are often introduced as \e {experimental plugins} to let you - try them out before they are fully supported. Experimental plugins are - disabled by default and you must enable them for them to become visible - after you restart \QC. By default, all the plugins that the plugin depends - on are also enabled. - - You can also disable plugins that you do not use, to streamline \QC. - By default, all the plugins that depend on the plugin are also disabled. - To enable and disable plugins, select \uicontrol Help > \uicontrol {About Plugins}. - \image qtcreator-installed-plugins.png "Installed Plugins dialog" - - \section2 Installing Plugins - - Qt Marketplace has links to \QC plugins that you can download and - install either for free or for a price set by their publisher. You can - browse the available plugins in the \uicontrol Marketplace tab in the - Welcome mode. - - \note You can install only plugins that your \QC version supports. - - To install plugins: - - \list 1 - \li Select \uicontrol Help > \uicontrol {About Plugins} > - \uicontrol {Install Plugins}. - \li In the \uicontrol Source dialog, enter the path to the archive - or library that has the plugin. - \image qtcreator-install-plugin-source.png - \li In the \uicontrol {Install Location} dialog, select - \uicontrol {User plugins} to make the plugin available for the - current user in all compatible \QC instances or - \uicontrol {\QC installation} to make the plugin available for - all users of a particular \QC instance. - \image qtcreator-install-plugin-location.png - \li In the \uicontrol Summary dialog, select \uicontrol Finish to - install the plugin. - \image qtcreator-install-plugin-summary.png - \li Select \uicontrol {Restart Now} to restart \QC and load the plugin. - \endlist + To install plugins, select \uicontrol Help > \uicontrol {About Plugins} > + \uicontrol {Install Plugins}. */ From 1956b0f69860ad9915c87c5cc5240dcda00abd08 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 30 Jun 2023 14:47:34 +0200 Subject: [PATCH 145/149] Doc: Combine two topics about selecting modes into one Move information from "Selecting Modes" to "Switch between modes". Hide it from the QDS Manual because modes are hidden by default in QDS. Task-number: QTCREATORBUG-28996 Change-Id: I6d281fe9364e191616af3a8ac484dd0a7d6a3156 Reviewed-by: Mats Honkamaa --- .../howto/creator-only/creator-how-tos.qdoc | 25 ----- doc/qtcreator/src/qtcreator-toc.qdoc | 1 - .../creator-how-to-switch-between-modes.qdoc | 75 ++++++++++++++ .../user-interface/creator-projects-view.qdoc | 7 +- .../src/user-interface/creator-sidebars.qdoc | 39 -------- .../src/user-interface/creator-ui.qdoc | 99 +++---------------- .../src/user-interface/creator-views.qdoc | 8 +- .../config/qtdesignstudio.qdocconf | 1 + .../src/qtdesignstudio-terms.qdoc | 9 +- .../src/qtdesignstudio-toc.qdoc | 1 - .../src/views/qtquick-designer.qdoc | 2 +- 11 files changed, 101 insertions(+), 166 deletions(-) create mode 100644 doc/qtcreator/src/user-interface/creator-only/creator-how-to-switch-between-modes.qdoc delete mode 100644 doc/qtcreator/src/user-interface/creator-sidebars.qdoc diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index fc5d0f3fb7d..c90ba786bc5 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -71,31 +71,6 @@ \endlist */ -/*! - \page creator-how-to-switch-between-modes.html - \previouspage creator-how-tos.html - \nextpage creator-known-issues.html - \ingroup creator-how-to-ui - - \title Switch between modes - - \QC uses different modes for different purposes. You can quickly - switch between these modes with the following keyboard shortcuts: - - \list - - \li \uicontrol Welcome mode \key Ctrl+1 - \li \uicontrol Edit mode \key Ctrl+2 - \li \uicontrol Design mode \key Ctrl+3 - \li \uicontrol Debug mode \key Ctrl+4 - \li \uicontrol Projects mode \key Ctrl+5 - \li \uicontrol Help mode \key Ctrl+6 - - \endlist - - For more information about \QC modes, see \l {Selecting Modes}. -*/ - /*! \page creator-how-to-move-between-open-files.html \previouspage creator-how-tos.html diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index acf3ca83a7c..3c9e696fdb2 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -19,7 +19,6 @@ \li \l{IDE Overview} \li \l{User Interface} \list - \li \l{Selecting Modes} \li \l{Working with Sidebars} \li \l{Browsing Project Contents} \list diff --git a/doc/qtcreator/src/user-interface/creator-only/creator-how-to-switch-between-modes.qdoc b/doc/qtcreator/src/user-interface/creator-only/creator-how-to-switch-between-modes.qdoc new file mode 100644 index 00000000000..a43cffc4f04 --- /dev/null +++ b/doc/qtcreator/src/user-interface/creator-only/creator-how-to-switch-between-modes.qdoc @@ -0,0 +1,75 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-how-to-switch-between-modes.html + \previouspage creator-how-tos.html + \nextpage creator-known-issues.html + \ingroup creator-how-to-ui + + \title Switch between modes + + \e Modes let you quickly switch between tasks such as editing + project and source files, designing application UIs, configuring projects + for building and running, and debugging or analyzing source code. + + To switch between modes: + + \list + \li Click the icons on the mode selector. + \li Use the \l{keyboard-shortcuts}{corresponding keyboard shortcut}. + \endlist + + \table + \header + \li {2,1} Mode + \li Keyboard Shortcut + \li Purpose + \li Read More + \row + \li {1,7} \inlineimage qtcreator-mode-selector.png + \row + \li \uicontrol Welcome + \li \key Ctrl+1 + \li Open projects, tutorials, and examples. + \li \l{User Interface} + \row + \li \uicontrol Edit + \li \key Ctrl+2 + \li Edit project and source files. + \li \l{Working in Edit Mode} + \row + \li \uicontrol Design + \li \key Ctrl+3 + \li Design and develop application user interfaces. + This mode is available for UI files. + \li \l{Designing User Interfaces} + \row + \li \uicontrol Debug + \li \key Ctrl+4 + \li Inspect the state of your application while debugging or use code + analysis tools to detect memory leaks and profile code. + \li \l{Debugging} + \row + \li \uicontrol Projects + \li \key Ctrl+5 + \li Configure how to build and run projects. + This mode is available when a project is open. + \li \l{Specifying Build Settings} + \row + \li \uicontrol Help + \li \key Ctrl+6 + \li Read documentation. + \li \l{Using the Help Mode} + \endtable + + Some actions in \QC trigger a mode change. For example, + selecting \uicontrol {Debug} > \uicontrol {Start Debugging} > + \uicontrol {Start Debugging of Startup Project} automatically + switches to \uicontrol {Debug} mode. + + To hide the mode selector and to save space on the display, select + \uicontrol View > \uicontrol {Mode Selector Style} > \uicontrol Hidden. + To only show icons on the mode selector, select the \uicontrol {Icons Only} + style. +*/ diff --git a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc index cd8fd9a62a6..431227e4fc5 100644 --- a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc @@ -37,8 +37,11 @@ \li To open files that belong to a \l{Creating Projects}{project}, double-click them in the project tree. Files open in the appropriate editor, according to the file type. For example, code - source files open in the code editor. Use the \l{Selecting Modes} - {mode selector} to open the current file in another editor. + source files open in the code editor. + \if defined(qtcreator) + Use the \l{Switch between modes} {mode selector} to open the current + file in another editor. + \endif \li To bring up a \l{Projects View Context Menu}{context menu} that has the actions most commonly needed, right-click an item in the project tree. For example, through the menu of diff --git a/doc/qtcreator/src/user-interface/creator-sidebars.qdoc b/doc/qtcreator/src/user-interface/creator-sidebars.qdoc deleted file mode 100644 index aecb42aa76c..00000000000 --- a/doc/qtcreator/src/user-interface/creator-sidebars.qdoc +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2020 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \page creator-sidebars.html - \if defined(qtdesignstudio) - \previouspage creator-coding-navigating.html - \else - \previouspage creator-modes.html - \endif - \nextpage creator-views.html - - - \title Working with Sidebars - - In the \uicontrol Edit mode, you can use a left and right sidebar to - organize different views into project contents. Only views that are - relevant to the \l{Selecting Modes}{mode} you are working in are - available in it. - - You can select views in the sidebar menu (1): - - \image qtcreator-sidebar.png - - You can change the view of the sidebars in the following ways: - - \list - \li To toggle the left sidebar, click \inlineimage icons/leftsidebaricon.png - (\uicontrol {Hide Left Sidebar/Show Left Sidebar}) or press - \key Alt+0 (\key Cmd+0 on \macos). To toggle the right - sidebar, click \inlineimage icons/rightsidebaricon.png - (\uicontrol {Hide Right Sidebar/Show Right Sidebar}) or press - \key Alt+Shift+0 (\key Cmd+Shift+0 on \macos). - \li To split a sidebar, click \inlineimage icons/splitbutton_horizontal.png - (\uicontrol {Split}). Select new content to view in the split view. - \li To close a sidebar view, click \inlineimage icons/splitbutton_closetop.png - (\uicontrol {Close}). - \endlist -*/ diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index 0ac81844cf3..5afdb8986d0 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -11,10 +11,11 @@ \page creator-quick-tour.html \if defined(qtdesignstudio) \previouspage {Tutorials} + \nextpage creator-using-qt-quick-designer.html \else \previouspage creator-overview.html + \nextpage creator-sidebars.html \endif - \nextpage creator-modes.html \title User Interface @@ -34,7 +35,7 @@ \li Mode selector \li Perform a particular task, such as designing the UI, writing code, or debugging the application. - \li \l{Selecting Modes} + \li \l{Switch between modes} \row \li \inlineimage numbers/02.png \li Kit selector @@ -83,7 +84,9 @@ \sa {Working with Sidebars}, {Browsing Project Contents} \sa {Use the UI}{How-to: Use the UI} + \else + When you start \QC, it opens to the \uicontrol Welcome mode, where you can: \list @@ -139,91 +142,6 @@ \endif */ -/*! - \page creator-modes.html - \previouspage creator-quick-tour.html - \if defined(qtdesignstudio) - \nextpage creator-using-qt-quick-designer.html - \else - \nextpage creator-sidebars.html - \endif - - \title Selecting Modes - - \image qtcreator-mode-selector.png - - \if defined(qtcreator) - The mode selector allows you to quickly switch between tasks such as editing - project and source files, designing application UIs, configuring projects for - building and running, and debugging your applications. To change - modes, click the icons, or use the \l{keyboard-shortcuts} - {corresponding keyboard shortcut}. - - To hide the mode selector and to save space on the display, select - \uicontrol View > \uicontrol {Mode Selector Style} > \uicontrol Hidden. - To only show icons on the mode selector, select the \uicontrol {Icons Only} - style. - \endif - - \if defined(qtdesignstudio) - The mode selector is hidden by default. - - To show the mode selector, go to \uicontrol Views > - \uicontrol {Mode Selector Style} and select \uicontrol {Icons and Text} - or \uicontrol {Icons Only}. - \endif - - - You can use \QC in the following modes: - - \list - - \li \uicontrol {\l{User Interface}{Welcome}} mode for opening projects, - tutorials, and examples. - - \li \uicontrol{\l{Coding}{Edit}} mode for editing project and source - files. - - \if defined(qtcreator) - \li \uicontrol{\l{Designing User Interfaces}{Design}} - mode for designing and developing application user interfaces. - This mode is available for UI files. - \else - \li \uicontrol{\l{Design Views}{Design}} - mode for designing and developing application user interfaces. - As a designer, you'll do most of your work in this mode. - \endif - - \if defined(qtcreator) - \li \uicontrol{\l{Debugging}{Debug}} - \else - \li \uicontrol {\l{Debugging and Profiling}{Debug}} - \endif - mode for inspecting the state of your - application while debugging and for using code analysis tools - to detect memory leaks and profile code. - - \if defined(qtcreator) - \li \uicontrol{\l{Specifying Build Settings}{Projects}} mode - for configuring project building and execution. - \else - \li \uicontrol{\l{Selecting the Preview Tool}{Projects}} mode - for selecting the tool to use for live preview. - \endif - This mode is available when a project is open. - - \li \uicontrol{\l{Using the Help Mode}{Help}} mode for viewing - documentation. - - \endlist - - \if defined(qtcreator) - Certain actions in \QC trigger a mode change. Clicking on \uicontrol {Debug} > - \uicontrol {Start Debugging} > \uicontrol {Start Debugging} automatically switches to - \uicontrol {Debug} mode. - \endif -*/ - /*! \page creator-output-panes.html \if defined(qtdesignstudio) @@ -276,7 +194,12 @@ \endlist - Output is available on the taskbar in all \l{Selecting Modes}{modes}. + Output is available on the taskbar in all + \if defined(qtcreator) + \l{Switch between modes}{modes}. + \else + \l{Mode}{modes}. + \endif \image qtcreator-output-panes-taskbar.webp "Output on the taskbar" diff --git a/doc/qtcreator/src/user-interface/creator-views.qdoc b/doc/qtcreator/src/user-interface/creator-views.qdoc index e676ed18907..1add46b099f 100644 --- a/doc/qtcreator/src/user-interface/creator-views.qdoc +++ b/doc/qtcreator/src/user-interface/creator-views.qdoc @@ -14,13 +14,13 @@ You can organize \QC views in \l {Working with Sidebars}{sidebars} or as \if defined(qtdesignstudio) - \l {Managing Workspaces}{workspaces}, + \l {Managing Workspaces}{workspaces}, depending on the \l{Mode}{mode} you + are working in. \else - workspaces - \endif - depending on the \l{Selecting Modes} + workspaces, depending on the \l{Switch between modes} {mode} you are working in. Only views that are relevant to a mode are available in it. + \endif \note Usually, \l{Searching with the Locator}{searching with the locator} is the fastest way to find a particular project, file, class, or function, diff --git a/doc/qtdesignstudio/config/qtdesignstudio.qdocconf b/doc/qtdesignstudio/config/qtdesignstudio.qdocconf index 5bcfe70d400..86a948bd889 100644 --- a/doc/qtdesignstudio/config/qtdesignstudio.qdocconf +++ b/doc/qtdesignstudio/config/qtdesignstudio.qdocconf @@ -54,6 +54,7 @@ excludedirs += ../../qtcreator/examples/accelbubble \ ../../qtcreator/src/python \ ../../qtcreator/src/qnx \ ../../qtcreator/src/qtquick/creator-only \ + ../../qtcreator/src/user-interface/creator-only \ ../../qtcreator/src/vcs/creator-only \ ../../qtcreator/src/widgets \ ../../qtcreator/src/webassembly diff --git a/doc/qtdesignstudio/src/qtdesignstudio-terms.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-terms.qdoc index 4859c20488c..d4dcb9a75ee 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-terms.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-terms.qdoc @@ -151,12 +151,11 @@ \image studio-design-mode.webp "Design mode" - Read more about modes: + The mode selector is hidden by default. - \list - \li \l{Selecting Modes} - \li \l{Design Views} - \endlist + To show the mode selector, go to \uicontrol Views > + \uicontrol {Mode Selector Style} and select \uicontrol {Icons and Text} + or \uicontrol {Icons Only}. \section1 Project \target glossary-project diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 6fc2014020f..f8f48a27f10 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -12,7 +12,6 @@ \li \l{Tutorials} \li \l{User Interface} \list - \li \l{Selecting Modes} \li \l{Design Views} \list \li \l{2D} diff --git a/doc/qtdesignstudio/src/views/qtquick-designer.qdoc b/doc/qtdesignstudio/src/views/qtquick-designer.qdoc index cc18d924417..7750e2e4792 100644 --- a/doc/qtdesignstudio/src/views/qtquick-designer.qdoc +++ b/doc/qtdesignstudio/src/views/qtquick-designer.qdoc @@ -10,7 +10,7 @@ /*! \page creator-using-qt-quick-designer.html - \previouspage creator-modes.html + \previouspage creator-quick-tour.html \nextpage qtquick-form-editor.html \title Design Views From a23b9333080dec3ed9b9b8c1548a97a81b0ffaa6 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 3 Jul 2023 14:44:17 +0200 Subject: [PATCH 146/149] Doc: Combine "Working with Sidebars" and "Show and hide sidebars" - Sidebars are hidden in QDS and the views can be added to workspaces, so hide references to sidebars on the QDS side. Task-number: QTCREATORBUG-29361 Change-Id: Ic468f6f818bddb391bd9514d273ecf8b6b412187 Reviewed-by: Mats Honkamaa --- .../src/editors/creator-coding-edit-mode.qdoc | 15 ++++---- .../howto/creator-only/creator-how-tos.qdoc | 22 ------------ .../howto/creator-only/creator-squish.qdoc | 2 +- doc/qtcreator/src/qtcreator-toc.qdoc | 1 - .../creator-file-system-view.qdoc | 23 ++++--------- ...creator-how-to-show-and-hide-sidebars.qdoc | 34 +++++++++++++++++++ .../user-interface/creator-projects-view.qdoc | 31 ++++++----------- .../src/user-interface/creator-ui.qdoc | 4 +-- .../src/user-interface/creator-views.qdoc | 15 ++++---- .../src/qtdesignstudio-toc.qdoc | 1 - 10 files changed, 70 insertions(+), 78 deletions(-) create mode 100644 doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc diff --git a/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc b/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc index fb7cc429f43..c5042fd7553 100644 --- a/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc +++ b/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -11,7 +11,7 @@ \previouspage creator-editor-functions.html \page creator-coding-navigating.html \if defined(qtdesignstudio) - \nextpage creator-sidebars.html + \nextpage creator-views.html \else \nextpage creator-highlighting.html \endif @@ -246,7 +246,12 @@ \endlist To view the note, move the mouse pointer over the bookmark or open the - \uicontrol Bookmarks view in the \l{Working with Sidebars}{sidebar}. + \uicontrol Bookmarks view + \if defined(qtcreator) + in the \l{Show and hide sidebars}{sidebar}. + \else + in the \l{Managing Workspaces}{workspace}. + \endif \section2 Navigating Bookmarks @@ -358,13 +363,11 @@ \QC underlines semantic errors in olive in the C++ code editor. To check the correct paths for includes that are not resolved or that are resolved to the wrong file, select \uicontrol {Project Parts} > \uicontrol {Header Paths}. - \endif - \if defined(qtdesignstudio) + \else \section1 Related Topics \list - \li \l{Working with Sidebars} \li \l{Browsing Project Contents} \li \l{Viewing Output} \endlist diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index c90ba786bc5..ae2b15c2509 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -193,28 +193,6 @@ For more information, see \l{Using Command Line Options}. */ -/*! - \page creator-how-to-show-and-hide-sidebars.html - \previouspage creator-how-tos.html - \nextpage creator-known-issues.html - \ingroup creator-how-to-ui - - \title Show and hide sidebars - - You can toggle the left and right sidebar in some \QC modes. - - To toggle the left sidebar, click \inlineimage icons/leftsidebaricon.png - (\uicontrol {Hide Left Sidebar/Show Left Sidebar}) or press \key Alt+0 - (\key Cmd+0 on \macos). - - To toggle the right sidebar, click \inlineimage icons/rightsidebaricon.png - (\uicontrol {Hide Right Sidebar/Show Right Sidebar}) or press - \key Alt+Shift+0 (\key Cmd+Shift+0 on \macos). - - For more information on using the sidebars, see - \l {Browsing Project Contents}. -*/ - /*! \page creator-how-to-move-to-symbols.html \previouspage creator-how-tos.html diff --git a/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc b/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc index 27918da3e48..874b4b389e4 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc @@ -130,7 +130,7 @@ \section1 Managing Test Suites and Cases You can manage Squish test suites and cases in the \uicontrol Squish - \l {Working with Sidebars}{view}. + \l {Show and hide sidebars}{view}. \image qtcreator-squish-view.png "Squish sidebar view" diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 3c9e696fdb2..eb8ced88e3b 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -19,7 +19,6 @@ \li \l{IDE Overview} \li \l{User Interface} \list - \li \l{Working with Sidebars} \li \l{Browsing Project Contents} \list \li \l{Projects} diff --git a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc index da554a3ab08..b7eddea19a0 100644 --- a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! @@ -8,8 +8,7 @@ \title File System - If you cannot see a file in the \l Projects view, switch to the - \uicontrol {File System} view, which shows all the files in the file system. + The \uicontrol {File System} view shows all the files in the file system. \note Usually, \l{Searching with the Locator}{searching with the locator} is the fastest way to find a particular project, file, class, or function, @@ -17,12 +16,9 @@ to open files from anywhere in the file system. \if defined(qtdesignstudio) - The following image displays the \uicontrol {File System} view in the - \uicontrol Design mode: - - \image qtcreator-filesystem-view-design.png "File System view in the Design mode" + \image qtcreator-filesystem-view-design.png {File System view} \else - \image qtcreator-filesystem-view.webp "File System view in the sidebar" + \image qtcreator-filesystem-view.webp {File System view in the sidebar} \endif To move to the root directory of the file system, select \uicontrol Computer @@ -87,19 +83,11 @@ \li Collapse all open folders. \endlist + \if defined(qtcreator) \section1 File System View Toolbar - \if defined(qtdesignstudio) - In the \uicontrol Edit and \uicontrol Debug mode, the - \uicontrol {File System} view is displayed in the \l{Working with Sidebars} - {sidebar}. It has a toolbar with additional options. - - \image qtcreator-filesystem-view.webp "File System view in the sidebar" - \else The toolbar in the \uicontrol {File System} view has additional options. - \endif - To manage view contents, select \inlineimage icons/filtericon.png (\uicontrol Options): @@ -116,4 +104,5 @@ To stop the synchronization with the file currently open in the editor, deselect \inlineimage icons/linkicon.png (\uicontrol {Synchronize with Editor}). + \endif */ diff --git a/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc b/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc new file mode 100644 index 00000000000..d1a07de2cef --- /dev/null +++ b/doc/qtcreator/src/user-interface/creator-only/creator-how-to-show-and-hide-sidebars.qdoc @@ -0,0 +1,34 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-how-to-show-and-hide-sidebars.html + \previouspage creator-how-tos.html + \nextpage creator-known-issues.html + \ingroup creator-how-to-ui + + \title Show and hide sidebars + + In some \l{Switch between modes}{modes}, you can use a left and right + sidebar to organize different views into project contents. Only views + that are relevant to the mode you are working in are available in it. + + Select views in the sidebar menu (1): + + \image qtcreator-sidebar.png + + You can change the view of the sidebars in the following ways: + + \list + \li To toggle the left sidebar, click \inlineimage icons/leftsidebaricon.png + (\uicontrol {Hide Left Sidebar/Show Left Sidebar}) or press + \key Alt+0 (\key Cmd+0 on \macos). + \li To toggle the right sidebar, click \inlineimage icons/rightsidebaricon.png + (\uicontrol {Hide Right Sidebar/Show Right Sidebar}) or press + \key Alt+Shift+0 (\key Cmd+Shift+0 on \macos). + \li To split a sidebar, click \inlineimage icons/splitbutton_horizontal.png + (\uicontrol {Split}). Select new content to view in the split view. + \li To close a sidebar view, click \inlineimage icons/splitbutton_closetop.png + (\uicontrol {Close}). + \endlist +*/ diff --git a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc index 431227e4fc5..ef356c81cf4 100644 --- a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! @@ -13,6 +13,7 @@ \title Projects The \uicontrol Projects view displays projects in a project tree. + The project tree has a list of all projects open in the current \l{Managing Sessions}{session}. For each project, the tree visualizes the build system structure of the project and lists all files that @@ -23,12 +24,9 @@ or almost anything else in your project. \if defined(qtdesignstudio) - The following image displays the \uicontrol Projects view in the - \uicontrol Design mode: - - \image qtcreator-projects-view-design.png "Projects view in the Design mode" + \image qtcreator-projects-view-design.png {Projects view} \else - \image qtcreator-projects-view-edit.png "Projects view in the sidebar" + \image qtcreator-projects-view-edit.png {Projects view in the sidebar} \endif You can use the project tree in the following ways: @@ -54,6 +52,9 @@ configuration files. \endlist + \note If you cannot see a file in the \l Projects view, switch to the + \uicontrol {File System} view, which shows all the files in the file system. + \section1 Projects View Context Menu The \uicontrol Projects view has context menus for managing projects, @@ -61,8 +62,10 @@ projects and subprojects: \list + \if defined(qtcreator) \li Set a project as the active project. - \li Execute the \uicontrol Build menu commands. + \endif + \li Execute \uicontrol Build menu commands. \li Create new files. For more information, see \if defined(qtdesignstudio) \l{Adding Files to Projects}. @@ -109,18 +112,10 @@ the \l {File System} view. To view a project in it, select \uicontrol {Show in File System View}. + \if defined(qtcreator) \section1 Projects View Toolbar - \if defined(qtdesignstudio) - In the \uicontrol Edit and \uicontrol Debug mode, the - \l{Working with Sidebars}{sidebar} has the \uicontrol Projects - view. It has a toolbar with additional options. - - \image qtcreator-projects-view-edit.png "Projects view in the sidebar" - \else The toolbar in the \uicontrol Projects view has additional options. - \endif - To filter view contents, select \inlineimage icons/filtericon.png (\uicontrol {Filter Tree}): @@ -143,7 +138,6 @@ currently opened in the editor, deselect \inlineimage icons/linkicon.png (\uicontrol {Synchronize with Editor}). - \if defined(qtcreator) Some build systems support adding and removing files to a project in \QC (currently qmake and Qbs). The faithful display of the project structure enables you to specify exactly where to place a new file in the build system. @@ -155,8 +149,5 @@ from the version control system in brackets after the project name. \QC currently implements this for Git (the view displays the branch name or a tag) and ClearCase (the view displays the branch name). - \else - If the project is under Git version control, you can see the currently - checked out branch or tag in brackets after the project name. \endif */ diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index 5afdb8986d0..29fe61bb26b 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -14,7 +14,7 @@ \nextpage creator-using-qt-quick-designer.html \else \previouspage creator-overview.html - \nextpage creator-sidebars.html + \nextpage creator-views.html \endif \title User Interface @@ -82,7 +82,7 @@ For information about new features and bug fixes in each \QC release, select \uicontrol Help > \uicontrol {Change Log}. - \sa {Working with Sidebars}, {Browsing Project Contents} + \sa {Show and hide sidebars}, {Browsing Project Contents} \sa {Use the UI}{How-to: Use the UI} \else diff --git a/doc/qtcreator/src/user-interface/creator-views.qdoc b/doc/qtcreator/src/user-interface/creator-views.qdoc index 1add46b099f..673e902736d 100644 --- a/doc/qtcreator/src/user-interface/creator-views.qdoc +++ b/doc/qtcreator/src/user-interface/creator-views.qdoc @@ -1,25 +1,24 @@ -// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! \page creator-views.html - \previouspage creator-sidebars.html \if defined(qtdesignstudio) + \previouspage creator-coding-navigating.html \nextpage creator-output-panes.html \else + \previouspage creator-quick-tour.html \nextpage creator-projects-view.html \endif \title Browsing Project Contents - You can organize \QC views in \l {Working with Sidebars}{sidebars} or as \if defined(qtdesignstudio) - \l {Managing Workspaces}{workspaces}, depending on the \l{Mode}{mode} you - are working in. + You can organize \QDS views as \l {Managing Workspaces}{workspaces}. \else - workspaces, depending on the \l{Switch between modes} - {mode} you are working in. Only views that are relevant to a mode are - available in it. + You can organize \QC views in \l {Show and hide sidebars}{sidebars} or as + workspaces, depending on the \l{Switch between modes}{mode} you are working + in. Only views that are relevant to a mode are available in it. \endif \note Usually, \l{Searching with the Locator}{searching with the locator} diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index f8f48a27f10..41dffb76f25 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -202,7 +202,6 @@ \list \li \l{Working in Edit Mode} \list - \li \l{Working with Sidebars} \li \l{Browsing Project Contents} \li \l{Viewing Output} \endlist From 5c7cbe802a295bbc22cb2b1a9c9198396ef03733 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 4 Jul 2023 12:42:19 +0200 Subject: [PATCH 147/149] Python: reduce the timeout of version check commands Task-number: QTCREATORBUG-29363 Change-Id: Id7583c876dc2a8c92eae4dd68bda47dffafd6e3d Reviewed-by: Christian Stenger --- src/plugins/python/pythonlanguageclient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/python/pythonlanguageclient.cpp b/src/plugins/python/pythonlanguageclient.cpp index 9f347d8e486..eecfb35c97f 100644 --- a/src/plugins/python/pythonlanguageclient.cpp +++ b/src/plugins/python/pythonlanguageclient.cpp @@ -115,6 +115,7 @@ static PythonLanguageServerState checkPythonLanguageServer(const FilePath &pytho const FilePath &modulePath = getPylsModulePath(pythonLShelpCommand); Process pythonProcess; + pythonProcess.setTimeoutS(2); pythonProcess.setCommand(pythonLShelpCommand); pythonProcess.runBlocking(); if (pythonProcess.allOutput().contains("Python Language Server")) From 1487f1a0c00a1310bdd49f7a744f431a429e4657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Fri, 30 Jun 2023 20:09:43 +0200 Subject: [PATCH 148/149] SquishTests: Make sure tst_git_local cleans up properly Creator still writes gitProject.pro.user after cleanup() ran. Change-Id: I78c8247090a7032b21ee3a763fd390bb16f3d24b Reviewed-by: Christian Stenger --- tests/system/suite_tools/tst_git_local/test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system/suite_tools/tst_git_local/test.py b/tests/system/suite_tools/tst_git_local/test.py index ab36b86b251..9ce9a0b3164 100644 --- a/tests/system/suite_tools/tst_git_local/test.py +++ b/tests/system/suite_tools/tst_git_local/test.py @@ -206,6 +206,7 @@ def main(): test.compare(str(changed.plainText), "Retrieving data failed.", "Showing an invalid commit can't succeed but Creator survived.") invokeMenuItem("File", "Exit") + waitForCleanShutdown() def deleteProject(): path = os.path.join(srcPath, projectName) From 7fada70e8f77fdccf7efc931421cf456561e097a Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 4 Jul 2023 18:40:38 +0200 Subject: [PATCH 149/149] unittest: fix linking problem on windows Task-number: QDS-10245 Change-Id: Ie6baee6c9e5c8351fe67b2dd49ad4e80147ec48a Reviewed-by: Marco Bubke Reviewed-by: Qt CI Patch Build Bot --- tests/unit/tests/printers/gtest-creator-printing.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/unit/tests/printers/gtest-creator-printing.cpp b/tests/unit/tests/printers/gtest-creator-printing.cpp index 61922895c04..9a5c000c390 100644 --- a/tests/unit/tests/printers/gtest-creator-printing.cpp +++ b/tests/unit/tests/printers/gtest-creator-printing.cpp @@ -236,6 +236,7 @@ Utils::SmallStringView operationText(int operation) std::ostream &operator<<(std::ostream &out, sqlite3_changeset_iter *iter) { +#if 0 out << "("; const char *tableName = nullptr; @@ -278,7 +279,7 @@ std::ostream &operator<<(std::ostream &out, sqlite3_changeset_iter *iter) } out << "})"; - +#endif return out; } @@ -315,6 +316,7 @@ const char *toText(LockingMode lockingMode) std::ostream &operator<<(std::ostream &out, const SessionChangeSet &changeset) { +#if 0 sqlite3_changeset_iter *iter = nullptr; sqlite3changeset_start(&iter, changeset.size(), const_cast(changeset.data())); @@ -329,7 +331,7 @@ std::ostream &operator<<(std::ostream &out, const SessionChangeSet &changeset) sqlite3changeset_finalize(iter); out << "])"; - +#endif return out; }