diff --git a/components/SuccessfulTxDialog.qml b/components/SuccessfulTxDialog.qml
new file mode 100644
index 00000000..61d891fa
--- /dev/null
+++ b/components/SuccessfulTxDialog.qml
@@ -0,0 +1,191 @@
+// Copyright (c) 2014-2020, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import QtQuick 2.9
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.1
+
+import moneroComponents.Clipboard 1.0
+import "../components" as MoneroComponents
+
+Rectangle {
+ id: root
+ x: parent.width/2 - root.width/2
+ y: parent.height/2 - root.height/2
+ // TODO: implement without hardcoding sizes
+ width: 580
+ height: 400
+ color: MoneroComponents.Style.blackTheme ? "black" : "white"
+ visible: false
+ radius: 10
+ border.color: MoneroComponents.Style.blackTheme ? Qt.rgba(255, 255, 255, 0.25) : Qt.rgba(0, 0, 0, 0.25)
+ border.width: 1
+ focus: true
+ Keys.enabled: true
+ Keys.onEscapePressed: {
+ root.close()
+ root.rejected()
+ }
+ Keys.onEnterPressed: {
+ root.close()
+ root.accepted()
+ }
+ Keys.onReturnPressed: {
+ root.close()
+ root.accepted()
+ }
+ KeyNavigation.tab: doneButton
+
+ Clipboard { id: clipboard }
+
+ property var transactionID;
+
+ // same signals as Dialog has
+ signal accepted()
+ signal rejected()
+
+ function open(txid) {
+ root.transactionID = txid;
+ root.visible = true;
+ root.forceActiveFocus();
+ }
+
+ function close() {
+ root.visible = false;
+ }
+
+ ColumnLayout {
+ spacing: 10
+ anchors.fill: parent
+ anchors.margins: 25
+
+ ColumnLayout{
+ Layout.topMargin: 10
+ Layout.leftMargin: 0
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignCenter
+
+ MoneroComponents.Label {
+ fontSize: 18
+ fontFamily: "Arial"
+ horizontalAlignment: Text.AlignHCenter
+ text: {
+ if (appWindow.viewOnly){
+ return qsTr("Transaction file successfully saved!") + translationManager.emptyString;
+ } else {
+ return qsTr("Transaction successfully sent!") + translationManager.emptyString;
+ }
+ }
+ }
+ }
+
+ Image {
+ id: successImage
+ Layout.alignment: Qt.AlignCenter
+ width: 140
+ height: 140
+ source: "qrc:///images/success.png"
+
+ SequentialAnimation{
+ running: successImage.visible
+ ScaleAnimator { target: successImage; from: 0.4; to: 1.3; duration: 125}
+ ScaleAnimator { target: successImage; from: 1.3; to: 1; duration: 80}
+ }
+ }
+
+ MoneroComponents.LineEditMulti {
+ visible: !appWindow.viewOnly
+ Layout.leftMargin: 25
+ Layout.rightMargin: 25
+ borderDisabled: true
+ readOnly: true
+ copyButton: true
+ wrapMode: Text.Wrap
+ labelText: qsTr("Transaction ID:") + translationManager.emptyString
+ text: root.transactionID ? root.transactionID : "";
+ fontSize: 16
+ }
+
+ MoneroComponents.LineEditMulti {
+ visible: appWindow.viewOnly
+ Layout.leftMargin: 25
+ borderDisabled: true
+ readOnly: true
+ wrapMode: Text.Wrap
+ labelText: qsTr("Transaction file location:") + translationManager.emptyString
+ text: walletManager.urlToLocalPath(saveTxDialog.fileUrl)
+ fontSize: 16
+ }
+
+ // open folder / done buttons
+ RowLayout {
+ id: buttons
+ spacing: 70
+ Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter
+ Layout.fillWidth: true
+ Layout.preferredHeight: 50
+
+ MoneroComponents.StandardButton {
+ id: openFolderButton
+ visible: appWindow.viewOnly
+ text: qsTr("Open folder") + translationManager.emptyString;
+ width: 200
+ KeyNavigation.tab: doneButton
+ Keys.enabled: openFolderButton.visible
+ Keys.onReturnPressed: openFolderButton.onClicked
+ Keys.onEnterPressed: openFolderButton.onClicked
+ Keys.onEscapePressed: {
+ root.close()
+ root.rejected()
+ }
+ onClicked: {
+ oshelper.openContainingFolder(walletManager.urlToLocalPath(saveTxDialog.fileUrl))
+ }
+ }
+
+ MoneroComponents.StandardButton {
+ id: doneButton
+ text: qsTr("Done") + translationManager.emptyString;
+ width: 200
+ focus: true
+ KeyNavigation.tab: openFolderButton
+ Keys.enabled: doneButton.visible
+ Keys.onReturnPressed: doneButton.onClicked
+ Keys.onEnterPressed: doneButton.onClicked
+ Keys.onEscapePressed: {
+ root.close()
+ root.rejected()
+ }
+ onClicked: {
+ root.close()
+ root.accepted()
+ }
+ }
+ }
+ }
+}
diff --git a/images/success.png b/images/success.png
new file mode 100644
index 00000000..519543f5
Binary files /dev/null and b/images/success.png differ
diff --git a/images/success@2x.png b/images/success@2x.png
new file mode 100644
index 00000000..6bc071b3
Binary files /dev/null and b/images/success@2x.png differ
diff --git a/main.qml b/main.qml
index 89943610..11aa93f3 100644
--- a/main.qml
+++ b/main.qml
@@ -1014,6 +1014,7 @@ ApplicationWindow {
// Clear tx fields
middlePanel.transferView.clearFields()
+ successfulTxPopup.open(txid)
}
informationPopup.onCloseCallback = null
@@ -1500,6 +1501,12 @@ ApplicationWindow {
}
}
+ // Transaction successfully sent popup
+ SuccessfulTxDialog {
+ id: successfulTxPopup
+ z: parent.z + 1
+ }
+
StandardDialog {
z: parent.z + 1
id: confirmationDialog
@@ -1769,7 +1776,7 @@ ApplicationWindow {
anchors.fill: blurredArea
source: blurredArea
radius: 64
- visible: passwordDialog.visible || inputDialog.visible || splash.visible || updateDialog.visible || devicePassphraseDialog.visible
+ visible: passwordDialog.visible || inputDialog.visible || splash.visible || updateDialog.visible || devicePassphraseDialog.visible || successfulTxPopup.visible
}
diff --git a/qml.qrc b/qml.qrc
index ae25ef4f..4e722891 100644
--- a/qml.qrc
+++ b/qml.qrc
@@ -240,5 +240,8 @@
components/AdvancedOptionsItem.qml
images/busy-indicator.png
images/busy-indicator@2x.png
+ images/success.png
+ images/success@2x.png
+ components/SuccessfulTxDialog.qml