From d06ddd12b605c08f4f0387bc346380b7c79299c6 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Fri, 5 Nov 2021 00:45:34 +0200 Subject: [PATCH] QmlDesigner: Add placeholder controls for when the assets view is empty Change-Id: I8cf864f97aff09f846411e50cec17e7cdf1be2d0 Reviewed-by: Leena Miettinen Reviewed-by: Samuel Ghinet Reviewed-by: Miikka Heikkinen --- .../itemLibraryQmlSources/Assets.qml | 50 ++++++++++++++++++ .../components/itemlibrary/images/browse.png | Bin 0 -> 494 bytes .../itemlibrary/images/browse@2x.png | Bin 0 -> 871 bytes .../components/itemlibrary/itemlibrary.qrc | 2 + .../itemlibraryassetsiconprovider.cpp | 8 +-- .../itemlibrary/itemlibraryassetsmodel.cpp | 2 +- .../itemlibrary/itemlibraryassetsmodel.h | 6 ++- 7 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 src/plugins/qmldesigner/components/itemlibrary/images/browse.png create mode 100644 src/plugins/qmldesigner/components/itemlibrary/images/browse@2x.png diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml index 5ca714051b0..cd07ba29450 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/Assets.qml @@ -32,6 +32,8 @@ import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme Item { + id: rootItem + property var selectedAssets: ({}) property int allExpandedState: 0 property string delFilePath: "" @@ -257,4 +259,52 @@ Item { } } } + + // Placeholder when the assets panel is empty + Column { + id: colNoAssets + visible: assetsModel.isEmpty() + + spacing: 20 + x: 20 + width: rootItem.width - 2 * x + anchors.verticalCenter: parent.verticalCenter + + Text { + text: qsTr("Looks like you don't have any assets yet.") + color: StudioTheme.Values.themeTextColor + font.pixelSize: 18 + width: colNoAssets.width + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + } + + Image { + source: "image://qmldesigner_assets/browse" + anchors.horizontalCenter: parent.horizontalCenter + scale: maBrowse.containsMouse ? 1.2 : 1 + Behavior on scale { + NumberAnimation { + duration: 300 + easing.type: Easing.OutQuad + } + } + + MouseArea { + id: maBrowse + anchors.fill: parent + hoverEnabled: true + onClicked: rootView.handleAddAsset(); + } + } + + Text { + text: qsTr("Drag-and-drop your assets here or click the '+' button to browse assets from the file system.") + color: StudioTheme.Values.themeTextColor + font.pixelSize: 18 + width: colNoAssets.width + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + } + } } diff --git a/src/plugins/qmldesigner/components/itemlibrary/images/browse.png b/src/plugins/qmldesigner/components/itemlibrary/images/browse.png new file mode 100644 index 0000000000000000000000000000000000000000..003b9e5d81b58a5b5dbfe72b387463a0b2b8176d GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0y~yU@!w=7G?$phPv$XcMJ>+x&b~RuK)l4*IfOGNMtS1 zJ%fRPfv+UUFPK3%j^y6{o^j8dqamA*iY$Hld;dkFIk90EC-GVMPkQ3eKEKFhF5~uz zh0U@HZX~?vQV)7*FZ+tg{LK@t4=H~YjutQdrS~aAXxjR)8zEMlCG)f=O+Pp1^nq0| z66u@8mNDNyJ9Ev3t5Kdg+G(xlOuPB3s~Fv{y-i*)&o-tyf_?pxYN6_g71hEU*bJ9B zDP_%mVD&n&|5@x#uGbF&KkDkw4*dD6V~PDht#brP4 zJ3P_H?ISDJyk#kW7MnUR|7Wvj`Gj|RUwvL}{nEdrUi)l|iT5R*Pd8J;&gsprOnZ7} zb8O+a&DxjxOy4|P@TFz0*j9&20-n__XN9(&%X%`)UD-8P)b!@^r}wJ^yx3)1#Gf!Q PFfe$!`njxgN@xNAQ^4i) literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/itemlibrary/images/browse@2x.png b/src/plugins/qmldesigner/components/itemlibrary/images/browse@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b13400f788e782134258808c7c76d102a82ece24 GIT binary patch literal 871 zcmeAS@N?(olHy`uVBq!ia0y~yV8{Vs4rT@hh8;VW|7T!eFb?nuasB`Qzvk*kB%u&# z%{vSX3<4!Ve!&a^3I+}V2?Y%k7Hl|h;lYQH2P;l6Ffd*Aba4#Hxc4^duGA6*j!^H* zpO$~GzqQxnw3M;N)1>m9v+|F9?2r*;JoZ3o$-K4k<%MO}f;N0J^6`%77Mhls(W#QY zKkVrFO}vu~_&o&A*WABwab3d3$LbnS!>3eS4OpGfJ1tpcWiM~<7U9#CQt2xHWsfc` zd|r5(`?l|LSN&B+tpUqRTRB&U?Q4#+*9&`bXP4O0Ij62{a#*}Nr)kEdYG%>BizHEoMzBVIL6ZeI8{ z;^Ae{QXgdon-cl;hY#8oUs{;KZDsfFrB40vQx|;huG8IMv_G;J%p_u}Kf^`)9(MFlmEPDseyVG->1 zl`%Md(eKr~vzz8FpMHCOslLJ9-swBph4&tCc~@F{vfh-XyY71WKku*1!R`0wPT1YS zE_{6JwkwMluq7B~MN1?zemzpjx=r@UhSwU^O(#=U{%HKp^4L>xZpa%BG2f++CvK}f zm}7HI>~z0*f?C#-ce0NYx`mqeed=HKNX~ZkguUTzO&xk~|kW*(}%`#t5wmiVjPID_8y7M-%^Wn&m>=+c6edo>4&YS_RiKkeXBHEIJIXBV_Eg=Nn5|U p{r9@IWsX_MtDC#{-`=Qa@RDDCF?sz57X}6f22WQ%mvv4FO#rgNn6Cf; literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc index 197dd87655b..b1777bbbec6 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.qrc @@ -31,5 +31,7 @@ images/asset_sound_384.png images/x.png images/x@2x.png + images/browse.png + images/browse@2x.png diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsiconprovider.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsiconprovider.cpp index deb8312b8f2..ece6e8abaab 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsiconprovider.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsiconprovider.cpp @@ -42,16 +42,18 @@ QPixmap ItemLibraryAssetsIconProvider::requestPixmap(const QString &id, QSize *s { QPixmap pixmap; const QString suffix = "*." + id.split('.').last().toLower(); - if (ItemLibraryAssetsModel::supportedFontSuffixes().contains(suffix)) + if (id == "browse") + pixmap = Utils::StyleHelper::dpiSpecificImageFile(":/ItemLibrary/images/browse.png"); + else if (ItemLibraryAssetsModel::supportedFontSuffixes().contains(suffix)) pixmap = generateFontIcons(id); else if (ItemLibraryAssetsModel::supportedImageSuffixes().contains(suffix)) pixmap = Utils::StyleHelper::dpiSpecificImageFile(id); else if (ItemLibraryAssetsModel::supportedTexture3DSuffixes().contains(suffix)) pixmap = HdrImage{id}.toPixmap(); else if (ItemLibraryAssetsModel::supportedShaderSuffixes().contains(suffix)) - pixmap = QPixmap(Utils::StyleHelper::dpiSpecificImageFile(":/ItemLibrary/images/asset_shader_48.png")); + pixmap = Utils::StyleHelper::dpiSpecificImageFile(":/ItemLibrary/images/asset_shader_48.png"); else if (ItemLibraryAssetsModel::supportedAudioSuffixes().contains(suffix)) - pixmap = QPixmap(Utils::StyleHelper::dpiSpecificImageFile(":/ItemLibrary/images/asset_sound_48.png")); + pixmap = Utils::StyleHelper::dpiSpecificImageFile(":/ItemLibrary/images/asset_sound_48.png"); if (size) { size->setWidth(pixmap.width()); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.cpp index db3ea452d2b..febaf8a2154 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.cpp @@ -275,7 +275,7 @@ void ItemLibraryAssetsModel::setRootPath(const QString &path) beginResetModel(); m_assetsDir = new ItemLibraryAssetsDir(path, 0, true, this); - parseDirRecursive(m_assetsDir, 1); + m_isEmpty = parseDirRecursive(m_assetsDir, 1); endResetModel(); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.h index 294a760a6b5..d79426d40a8 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetsmodel.h @@ -51,8 +51,8 @@ public: Utils::FileSystemWatcher *fileSystemWatcher, QObject *parent = nullptr); - QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override; - int rowCount(const QModelIndex & parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; QHash roleNames() const override; void refresh(); @@ -81,6 +81,7 @@ public: Q_INVOKABLE void toggleExpandAll(bool expand); Q_INVOKABLE DirExpandState getAllExpandedState() const; Q_INVOKABLE void removeFile(const QString &filePath); + Q_INVOKABLE bool isEmpty() const { return m_isEmpty; }; private: const QSet &supportedSuffixes() const; @@ -91,6 +92,7 @@ private: QString m_searchText; Utils::FileSystemWatcher *m_fileSystemWatcher = nullptr; ItemLibraryAssetsDir *m_assetsDir = nullptr; + bool m_isEmpty = true; QHash m_roleNames; inline static QHash m_expandedStateHash; //