From 3ca75a4e69a984cb58555af98114606c735e98f2 Mon Sep 17 00:00:00 2001 From: D33r-Gee Date: Wed, 2 Oct 2024 14:41:51 -0700 Subject: [PATCH] qml: Introduce UI Flow for Loading Snapshot This introduce the UI flow to load a AssumeUTXO snapshot into the Bitcoin Core App. It modifies the connection seetings and adds a SnapshotSettings file, Icon, and modified profress bar. --- src/Makefile.qt.include | 5 + src/qml/bitcoin_qml.qrc | 6 + src/qml/components/ConnectionSettings.qml | 29 +++ src/qml/components/SnapshotSettings.qml | 204 ++++++++++++++++++ src/qml/controls/GreenCheckIcon.qml | 11 + src/qml/controls/Header.qml | 2 + src/qml/controls/ProgressIndicator.qml | 3 +- src/qml/controls/Theme.qml | 3 + src/qml/imageprovider.cpp | 15 ++ src/qml/pages/settings/SettingsConnection.qml | 14 ++ src/qml/pages/settings/SettingsSnapshot.qml | 37 ++++ src/qml/res/icons/circle-file.png | Bin 0 -> 1391 bytes src/qml/res/icons/circle-green-check.png | Bin 0 -> 1503 bytes src/qml/res/icons/green-check.png | Bin 0 -> 741 bytes src/qml/res/src/circle-file.svg | 18 ++ src/qml/res/src/circle-green-check.svg | 18 ++ src/qml/res/src/green-check.svg | 4 + 17 files changed, 368 insertions(+), 1 deletion(-) create mode 100644 src/qml/components/SnapshotSettings.qml create mode 100644 src/qml/controls/GreenCheckIcon.qml create mode 100644 src/qml/pages/settings/SettingsSnapshot.qml create mode 100644 src/qml/res/icons/circle-file.png create mode 100644 src/qml/res/icons/circle-green-check.png create mode 100644 src/qml/res/icons/green-check.png create mode 100644 src/qml/res/src/circle-file.svg create mode 100644 src/qml/res/src/circle-green-check.svg create mode 100644 src/qml/res/src/green-check.svg diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index a61043608d..7cad78ff37 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -337,11 +337,14 @@ QML_RES_ICONS = \ qml/res/icons/caret-left.png \ qml/res/icons/caret-right.png \ qml/res/icons/check.png \ + qml/res/icons/circle-file.png \ + qml/res/icons/circle-green-check.png \ qml/res/icons/cross.png \ qml/res/icons/error.png \ qml/res/icons/export.png \ qml/res/icons/gear.png \ qml/res/icons/gear-outline.png \ + qml/res/icons/green-check.png \ qml/res/icons/hidden.png \ qml/res/icons/info.png \ qml/res/icons/network-dark.png \ @@ -372,6 +375,7 @@ QML_RES_QML = \ qml/components/NetworkIndicator.qml \ qml/components/ProxySettings.qml \ qml/components/Separator.qml \ + qml/components/SnapshotSettings.qml \ qml/components/StorageLocations.qml \ qml/components/StorageOptions.qml \ qml/components/StorageSettings.qml \ @@ -425,6 +429,7 @@ QML_RES_QML = \ qml/pages/settings/SettingsDeveloper.qml \ qml/pages/settings/SettingsDisplay.qml \ qml/pages/settings/SettingsProxy.qml \ + qml/pages/settings/SettingsSnapshot.qml \ qml/pages/settings/SettingsStorage.qml \ qml/pages/settings/SettingsTheme.qml \ qml/pages/wallet/AddWallet.qml \ diff --git a/src/qml/bitcoin_qml.qrc b/src/qml/bitcoin_qml.qrc index ec48e0c74d..167bfd2f91 100644 --- a/src/qml/bitcoin_qml.qrc +++ b/src/qml/bitcoin_qml.qrc @@ -15,6 +15,7 @@ components/ProxySettings.qml components/StorageLocations.qml components/Separator.qml + components/SnapshotSettings.qml components/StorageOptions.qml components/StorageSettings.qml components/ThemeSettings.qml @@ -25,6 +26,7 @@ controls/CoreTextField.qml controls/ExternalLink.qml controls/FocusBorder.qml + controls/GreenCheckIcon.qml controls/Header.qml controls/Icon.qml controls/InformationPage.qml @@ -66,6 +68,7 @@ pages/settings/SettingsDeveloper.qml pages/settings/SettingsDisplay.qml pages/settings/SettingsProxy.qml + pages/settings/SettingsSnapshot.qml pages/settings/SettingsStorage.qml pages/settings/SettingsTheme.qml pages/wallet/AddWallet.qml @@ -91,11 +94,14 @@ res/icons/caret-left.png res/icons/caret-right.png res/icons/check.png + res/icons/circle-file.png + res/icons/circle-green-check.png res/icons/cross.png res/icons/error.png res/icons/export.png res/icons/gear.png res/icons/gear-outline.png + res/icons/green-check.png res/icons/hidden.png res/icons/info.png res/icons/minus.png diff --git a/src/qml/components/ConnectionSettings.qml b/src/qml/components/ConnectionSettings.qml index 90625a7def..fea589685d 100644 --- a/src/qml/components/ConnectionSettings.qml +++ b/src/qml/components/ConnectionSettings.qml @@ -8,7 +8,36 @@ import QtQuick.Layouts 1.15 import "../controls" ColumnLayout { + property bool snapshotImported: false + function setSnapshotImported(imported) { + snapshotImported = imported + } spacing: 4 + Setting { + id: gotoSnapshot + Layout.fillWidth: true + header: qsTr("Load snapshot") + description: qsTr("Instant use with background sync") + actionItem: Item { + width: 26 + height: 26 + CaretRightIcon { + anchors.centerIn: parent + visible: !snapshotImported + color: gotoSnapshot.stateColor + } + GreenCheckIcon { + anchors.centerIn: parent + visible: snapshotImported + color: Theme.color.transparent + } + } + onClicked: { + connectionSwipe.incrementCurrentIndex() + connectionSwipe.incrementCurrentIndex() + } + } + Separator { Layout.fillWidth: true } Setting { Layout.fillWidth: true header: qsTr("Enable listening") diff --git a/src/qml/components/SnapshotSettings.qml b/src/qml/components/SnapshotSettings.qml new file mode 100644 index 0000000000..ebac415b60 --- /dev/null +++ b/src/qml/components/SnapshotSettings.qml @@ -0,0 +1,204 @@ +// Copyright (c) 2023-present The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 + +import "../controls" + +ColumnLayout { + signal snapshotImportCompleted() + property int snapshotVerificationCycles: 0 + property real snapshotVerificationProgress: 0 + property bool snapshotVerified: false + + id: columnLayout + width: Math.min(parent.width, 450) + anchors.horizontalCenter: parent.horizontalCenter + + + Timer { + id: snapshotSimulationTimer + interval: 50 // Update every 50ms + running: false + repeat: true + onTriggered: { + if (snapshotVerificationProgress < 1) { + snapshotVerificationProgress += 0.01 + } else { + snapshotVerificationCycles++ + if (snapshotVerificationCycles < 1) { + snapshotVerificationProgress = 0 + } else { + running = false + snapshotVerified = true + settingsStack.currentIndex = 2 + } + } + } + } + + StackLayout { + id: settingsStack + currentIndex: 0 + + ColumnLayout { + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: Math.min(parent.width, 450) + + Image { + Layout.alignment: Qt.AlignCenter + source: "image://images/circle-file" + + sourceSize.width: 200 + sourceSize.height: 200 + } + + Header { + Layout.fillWidth: true + Layout.topMargin: 20 + headerBold: true + header: qsTr("Load snapshot") + descriptionBold: false + descriptionColor: Theme.color.neutral6 + descriptionSize: 17 + descriptionLineHeight: 1.1 + description: qsTr("You can start using the application more quickly by loading a recent transaction snapshot." + + " It will be automatically verified in the background.") + } + + ContinueButton { + Layout.preferredWidth: Math.min(300, columnLayout.width - 2 * Layout.leftMargin) + Layout.topMargin: 40 + Layout.leftMargin: 20 + Layout.rightMargin: Layout.leftMargin + Layout.bottomMargin: 20 + Layout.alignment: Qt.AlignCenter + text: qsTr("Choose snapshot file") + onClicked: { + settingsStack.currentIndex = 1 + snapshotSimulationTimer.start() + } + } + } + + ColumnLayout { + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: Math.min(parent.width, 450) + + Image { + Layout.alignment: Qt.AlignCenter + source: "image://images/circle-file" + + sourceSize.width: 200 + sourceSize.height: 200 + } + + Header { + Layout.fillWidth: true + Layout.topMargin: 20 + Layout.leftMargin: 20 + Layout.rightMargin: 20 + header: qsTr("Loading Snapshot") + } + + ProgressIndicator { + id: progressIndicator + Layout.topMargin: 20 + width: 200 + height: 20 + progress: snapshotVerificationProgress + Layout.alignment: Qt.AlignCenter + progressColor: Theme.color.blue + } + } + + ColumnLayout { + id: loadedSnapshotColumn + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: Math.min(parent.width, 450) + + Image { + Layout.alignment: Qt.AlignCenter + source: "image://images/circle-green-check" + + sourceSize.width: 60 + sourceSize.height: 60 + } + + Header { + Layout.fillWidth: true + Layout.topMargin: 20 + headerBold: true + header: qsTr("Snapshot Loaded") + descriptionBold: false + descriptionColor: Theme.color.neutral6 + descriptionSize: 17 + descriptionLineHeight: 1.1 + description: qsTr("It contains transactions up to January 12, 2024. Newer transactions still need to be downloaded." + + " The data will be verified in the background.") + } + + ContinueButton { + Layout.preferredWidth: Math.min(300, columnLayout.width - 2 * Layout.leftMargin) + Layout.topMargin: 40 + Layout.alignment: Qt.AlignCenter + text: qsTr("Done") + onClicked: { + snapshotImportCompleted() + connectionSwipe.decrementCurrentIndex() + connectionSwipe.decrementCurrentIndex() + } + } + + Setting { + id: viewDetails + Layout.alignment: Qt.AlignCenter + header: qsTr("View details") + actionItem: CaretRightIcon { + id: caretIcon + color: viewDetails.stateColor + rotation: viewDetails.expanded ? 90 : 0 + Behavior on rotation { NumberAnimation { duration: 200 } } + } + + property bool expanded: false + + onClicked: { + expanded = !expanded + } + } + + ColumnLayout { + id: detailsContent + visible: viewDetails.expanded + Layout.preferredWidth: Math.min(300, parent.width - 2 * Layout.leftMargin) + Layout.alignment: Qt.AlignCenter + Layout.leftMargin: 80 + Layout.rightMargin: 80 + Layout.topMargin: 10 + spacing: 10 + // TODO: make sure the block height number aligns right + RowLayout { + CoreText { + text: qsTr("Block Height:") + Layout.alignment: Qt.AlignLeft + font.pixelSize: 14 + } + CoreText { + text: qsTr("200,000") + Layout.alignment: Qt.AlignRight + font.pixelSize: 14 + } + } + Separator { Layout.fillWidth: true } + CoreText { + text: qsTr("Hash: 0x1234567890abcdef...") + font.pixelSize: 14 + } + } + } + } +} diff --git a/src/qml/controls/GreenCheckIcon.qml b/src/qml/controls/GreenCheckIcon.qml new file mode 100644 index 0000000000..cf6ccec67c --- /dev/null +++ b/src/qml/controls/GreenCheckIcon.qml @@ -0,0 +1,11 @@ +// Copyright (c) 2023 - present The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +Icon { + source: "image://images/green-check" + size: 26 +} diff --git a/src/qml/controls/Header.qml b/src/qml/controls/Header.qml index f3c4c0c3e3..ece49234d2 100644 --- a/src/qml/controls/Header.qml +++ b/src/qml/controls/Header.qml @@ -25,6 +25,7 @@ ColumnLayout { property int subtextSize: 15 property color subtextColor: Theme.color.neutral9 property bool wrap: true + property real descriptionLineHeight: 1 spacing: 0 Loader { @@ -60,6 +61,7 @@ ColumnLayout { text: root.description horizontalAlignment: root.center ? Text.AlignHCenter : Text.AlignLeft wrapMode: wrap ? Text.WordWrap : Text.NoWrap + lineHeight: root.descriptionLineHeight Behavior on color { ColorAnimation { duration: 150 } diff --git a/src/qml/controls/ProgressIndicator.qml b/src/qml/controls/ProgressIndicator.qml index 117a4baebb..9d6d62d329 100644 --- a/src/qml/controls/ProgressIndicator.qml +++ b/src/qml/controls/ProgressIndicator.qml @@ -7,6 +7,7 @@ import QtQuick.Controls 2.15 Control { property real progress: 0 + property color progressColor: Theme.color.orange Behavior on progress { NumberAnimation { easing.type: Easing.Bezier @@ -26,7 +27,7 @@ Control { width: contentItem.width height: contentItem.height radius: contentItem.radius - color: Theme.color.orange + color: progressColor } } } diff --git a/src/qml/controls/Theme.qml b/src/qml/controls/Theme.qml index f57e152cbd..3c7621c2b5 100644 --- a/src/qml/controls/Theme.qml +++ b/src/qml/controls/Theme.qml @@ -27,6 +27,7 @@ Control { required property color blue required property color amber required property color purple + required property color transparent required property color neutral0 required property color neutral1 required property color neutral2 @@ -59,6 +60,7 @@ Control { blue: "#3CA3DE" amber: "#C9B500" purple: "#C075DC" + transparent: "#00000000" neutral0: "#000000" neutral1: "#1A1A1A" neutral2: "#2D2D2D" @@ -91,6 +93,7 @@ Control { blue: "#2D9CDB" amber: "#C9B500" purple: "#BB6BD9" + transparent: "#00000000" neutral0: "#FFFFFF" neutral1: "#F8F8F8" neutral2: "#F4F4F4" diff --git a/src/qml/imageprovider.cpp b/src/qml/imageprovider.cpp index daf2feeae2..abd387f3b4 100644 --- a/src/qml/imageprovider.cpp +++ b/src/qml/imageprovider.cpp @@ -77,6 +77,16 @@ QPixmap ImageProvider::requestPixmap(const QString& id, QSize* size, const QSize return QIcon(":/icons/check").pixmap(requested_size); } + if (id == "circle-file") { + *size = requested_size; + return QIcon(":/icons/circle-file").pixmap(requested_size); + } + + if (id == "circle-green-check") { + *size = requested_size; + return QIcon(":/icons/circle-green-check").pixmap(requested_size); + } + if (id == "cross") { *size = requested_size; return QIcon(":/icons/cross").pixmap(requested_size); @@ -102,6 +112,11 @@ QPixmap ImageProvider::requestPixmap(const QString& id, QSize* size, const QSize return QIcon(":/icons/gear-outline").pixmap(requested_size); } + if (id == "green-check") { + *size = requested_size; + return QIcon(":/icons/green-check").pixmap(requested_size); + } + if (id == "info") { *size = requested_size; return QIcon(":/icons/info").pixmap(requested_size); diff --git a/src/qml/pages/settings/SettingsConnection.qml b/src/qml/pages/settings/SettingsConnection.qml index 9ff9094f11..2e36dd4a99 100644 --- a/src/qml/pages/settings/SettingsConnection.qml +++ b/src/qml/pages/settings/SettingsConnection.qml @@ -13,6 +13,11 @@ Item { property alias navMiddleDetail: connectionSwipe.navMiddleDetail property alias navLeftDetail: connectionSwipe.navLeftDetail property alias showHeader: connectionSwipe.showHeader + + function setSnapshotImported(imported) { + connection_settings.loadedDetailItem.setSnapshotImported(imported) + } + SwipeView { id: connectionSwipe property alias navRightDetail: connection_settings.navRightDetail @@ -38,5 +43,14 @@ Item { connectionSwipe.decrementCurrentIndex() } } + SettingsSnapshot { + onSnapshotImportCompleted: { + setSnapshotImported(true) + } + onBackClicked: { + connectionSwipe.decrementCurrentIndex() + connectionSwipe.decrementCurrentIndex() + } + } } } diff --git a/src/qml/pages/settings/SettingsSnapshot.qml b/src/qml/pages/settings/SettingsSnapshot.qml new file mode 100644 index 0000000000..e6c557a022 --- /dev/null +++ b/src/qml/pages/settings/SettingsSnapshot.qml @@ -0,0 +1,37 @@ +// Copyright (c) 2024-present The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 +import "../../controls" +import "../../components" + +Page { + signal backClicked + signal snapshotImportCompleted + + id: root + + background: null + implicitWidth: 450 + leftPadding: 20 + rightPadding: 20 + topPadding: 30 + + header: NavigationBar2 { + leftItem: NavButton { + iconSource: "image://images/caret-left" + text: qsTr("Back") + onClicked: root.backClicked() + } + } + SnapshotSettings { + width: Math.min(parent.width, 450) + anchors.horizontalCenter: parent.horizontalCenter + onSnapshotImportCompleted: { + root.snapshotImportCompleted() + } + } +} diff --git a/src/qml/res/icons/circle-file.png b/src/qml/res/icons/circle-file.png new file mode 100644 index 0000000000000000000000000000000000000000..14a776e6d5ba9ff0d34ecd7178169004c6b00147 GIT binary patch literal 1391 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVB7>k44ofvPP)Tsw@I14-?iy0WW zg+Z8+Vb&Z8paQi3pAc7|q|M@cqX>Tp@YL`63=FBHk|4ie21X76DK!HN2VZkeSt}-K zH&+I3T`pleAs#1YJr8$zGiw`DITvMizK*;9Z-nwT-MkjkckwFg?eP1-QI8~Io*Ku! z@J@UknDXv)`Uk&yjY|*JJ^9%zAKdHjy3=T6C?cvanP_TY%D})};_2cTQZZ-i&DY){ zfg%haim%;t-@WVV)}?3Mv+THnG<6nhaB*=}PrSDLMLqW~Ay3DY+71VSCZ!2o9KkN9 z<)*FsaqH_=>$7Lx^?ly){oKsEFKcGaef?+7&As2}Ri9Tl!R*bLl@V=v=rL1dv`pdc z(y+j*JuITlo=12cgL72(y%A2?5v010TUTg?_hrXr3qJ6j@pz=x|D>^W$BUCMH-`Up zWqe)Oc;sc^?l)CJ;t|WwOtx(Z`Lz0*v9|Lo6i z4ByU2{N5>g7fUILv%jg>86T-74qsIGp>&&$UVX3o`Gp+?-au z?7O^|MJ!YQnS%d|B;PU%t3OTpeO&28S#f(z`{!+kEq8WoEMZ)8w&1q)_BrWFKU}q5 z6;EZ`WcqJL_SV|2#IW5;>Y|3p4a@C5&VKvg%0=I+!EdUTH!pI0&ahB--z(K?{#gpE z%a*Y+a@bZC^|l{Bl8|NE`^fJt)5Df|@#U^6NtZ1S?fjl1;P+@x%o|zP9UrFg9mh#b>>0D%T*ONgzqi;6=snu%VcEuMBXU*Z!ig%ov>1~fh|k3Vb+q2 z1@o3TU1V^y?G+NXk>RrlFxY31)yIXa~XB&kLJLU-MTCA@Zt2#cf&|h49 z&VfUBCLQ&CD8%sT@}13{k0wd5JpOr&{oj+@&Hg){pLMPNaJwtP%I6ZR9W5<6w4@IxH z>2$N+evs6<@1-$Y``V-W?uNPZ|MT6m(AQg*S@?gW|ND2$ztgYR2xSQ@k;q$;HutOC zcb2I>Y|%!nRe|BY1^-OvS?|F9Ll+*h~G&19)-=ttob zae5n8<(!JW7#L!DYW=P1Cb!*!Ui&`$dVKFw@cQfW{~2_6dDogo-qQl+b_P#ZKbLh* G2~7YIypH<- literal 0 HcmV?d00001 diff --git a/src/qml/res/icons/circle-green-check.png b/src/qml/res/icons/circle-green-check.png new file mode 100644 index 0000000000000000000000000000000000000000..25bb20e00fb07a7e6e6d80cf2474744f35e14d2a GIT binary patch literal 1503 zcmc&!{WsHl9RJSDmT;$WH{_u(Z1#XqtgvWXY#uHNbN9q1hH2_jx|z6C=a$n=r7T@! zPT7-ZDb=~`94YInRGd!54T(JVgyw$zeE)!Z&inm&zu%wN`}Kak&*z8F$tV`h+|Cu7{Ebu7OvlxT&}VO)6QFhE;OiRXh-KQ*ykT(>&Dzf>r?b_%w;IDiGp= zIoRN);@~v`clCPdr4bP|DOm7EokG$GaVoxd^8t4y*F()EH3_jw4%qLd6?v%m;7qbs zk#S;w=joce0p2L&#dJoF17Vc#}yrOkDu*!yS-5MfRQXU zlndLV-wg=n-f$bg@JBPVzh4^s8uj)iE3(5NuUirQAYZ*^@@?O%oE0%|v~GvDmz6ci zMy6-J1^{RQBQzv7ud21OKLZtQRjOww7|g*JEc0OnGcifI_a-daDkL<-Ka1Ugv@FJr zLeV$_ya-X_j)1{nf2xcv*&UVzo;~Q;@YbQBePUncd!J+D0e=VwDbTK`F$_v^^Ze>KWZ$Senic=Dc!njuchFV$2#Rns49e2y9U)b!lJZZC zMA?n%wZrDHb3fL=%0AGF^MMTb!(X#Z_%jj*O5vf}`gnm6-=!2SVN@n|>a3lP?95*P za5`_j7c^F6^8^tW9&+LmWN7W+edyd75d_MJrxbS9!OA}ECd%UO^q7e;xqZ+EL%NZl zA@>oq;e8+Q47L(MB3>tF0sa>BH;|`?6|$+RRVp!QzZJ*i!Xx@y$fUHwBv!F_cE?Q# z7A9WaauSaGRs&5oktbB#v5hhpDoR$Zub!&itniC{azfJ?xs|+Z!|VS=E0~(UvdB$F z-*|s*JkFWlzL@rxlW71G#YbmSimoh|6ed{){jJN0o|d;fR4oVlmhnf9LVm`NCf(|_ zSUT;}CGVI!lNDVWEt~EpL@)owE7~85A5o@b??3mnD>}-_f%@l#bDG4%#)Vx-4*B=t zhW6WbV|Z3Oe16ADWASp#=L7f#k!}FeqYyg{z7pQ`W*buS7oA20evwkUTLOQYcDA-V zhu-yqw)x&n2)cJ0Uu-$Y6tV34+l z5K`Jb^Uj;qh4Z;OpK9;0uGQ3%D%<%y9A)jvpqVCR$W`y3l|Z?5cCzsuAz0F9t#1S1 ztyImnw#n%@K{yNL-1?y3WN&tJ+6a2#it7N|$9m(12YWK_R>Ei5rJdg@o<$@%e|+=I zYeIOrzTe+Ce?q(eQayKC~1-RZOtA@ zi0}9wV2!3nOgKnX8a(ZkyndTwPB(NI7e=5L&)D0SAUPjZJ5iTxBN+_haYKjI2ktS$ ZS2(F+W_HU!{3!Sz0E{qJsEW!h`WFKci5vg` literal 0 HcmV?d00001 diff --git a/src/qml/res/icons/green-check.png b/src/qml/res/icons/green-check.png new file mode 100644 index 0000000000000000000000000000000000000000..65b179902002d6561bce3f02227bb6577353d97d GIT binary patch literal 741 zcmV&N6UVdMGf8Ossfe_MWUV{tGQ!oY( zDh;XisVY6TD`3-a`IBzg?d*tl0v_;yjBDr&OVm)T+%&9?gj6%18t_n{*E{G2fzoaj zMQ6sSHV^wCFI3lqNrM^0fFfZl0(wO^oMS@lNxz4cxFUYBKR=Oec&0QaI9$CFVc6C{ zigJATT~9oDgZ}^(NR|skdL*kW2Dy=O%#Ge?Ip-zzZ7Ubdd?rE(A7l8$5bj-?#&B{l zXo;3y%4-U_ltT;_uieGBoh>X>o&~OPX|r?ax-I|?7kjkuaaoE5Ap|sq!q$}#3(Tb_ zV18MH`So?!a+N(wp$i^ez8xB}qe3m=O1ec)(A<@wbZE%@u#gipd7r9@E6PvAkV$C! zRQqVlI`#J7M0xWCPW2^a!bekQG5cm7+j~3oJt5~i44H(wf}I$g%Bb|BwOX*gwSn!w zzcF<#i|c2u;&lH>eSeQmp+>#T`)IY@BKAywwcj{6Wa~dFSp57Fk*J|8 zd)-AdzY^9RI5(WLhwq+tTmW^fjY%UbtB%x)VXN8r?A!UMBIJxH@UIl21Ii+gO6W0^ zo6_dwlhp$uCaFlTZ1e~|`1XDsM(RMw){Uyzh29G>d6bha|GlB9GgPJxCn=DP6Gjdf zAK`4vKOT798hJi5mZ*7!DAz4cd?P1E5n=z92cwG|ZMaOm(>I#1!w+2nELR9CNT9(# X37YSQLsvvP00000NkvXXu0mjf?`=m< literal 0 HcmV?d00001 diff --git a/src/qml/res/src/circle-file.svg b/src/qml/res/src/circle-file.svg new file mode 100644 index 0000000000..d8af3949d8 --- /dev/null +++ b/src/qml/res/src/circle-file.svg @@ -0,0 +1,18 @@ + + circle-file-svg + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/qml/res/src/circle-green-check.svg b/src/qml/res/src/circle-green-check.svg new file mode 100644 index 0000000000..d56c175fd4 --- /dev/null +++ b/src/qml/res/src/circle-green-check.svg @@ -0,0 +1,18 @@ + + Circle arrow up-svg + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/qml/res/src/green-check.svg b/src/qml/res/src/green-check.svg new file mode 100644 index 0000000000..fba9cac6b9 --- /dev/null +++ b/src/qml/res/src/green-check.svg @@ -0,0 +1,4 @@ + + + +