monero-gui/pages/Receive.qml

351 lines
15 KiB
QML
Raw Normal View History

2018-01-07 05:20:45 +00:00
// Copyright (c) 2014-2018, The Monero Project
2016-10-04 10:15:29 +00:00
//
// All rights reserved.
2016-10-04 10:15:29 +00:00
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
2016-10-04 10:15:29 +00:00
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
2016-10-04 10:15:29 +00:00
//
// 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.
2016-10-04 10:15:29 +00:00
//
// 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.
2016-10-04 10:15:29 +00:00
//
// 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.
2019-04-11 01:17:29 +00:00
import QtQuick 2.9
import QtQuick.Controls 2.0
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2
2018-12-08 15:55:29 +00:00
import "../components" as MoneroComponents
2019-04-11 01:17:29 +00:00
import "../components/effects/" as MoneroEffects
import moneroComponents.Clipboard 1.0
import moneroComponents.Wallet 1.0
import moneroComponents.WalletManager 1.0
import moneroComponents.TransactionHistory 1.0
import moneroComponents.TransactionHistoryModel 1.0
import moneroComponents.Subaddress 1.0
import moneroComponents.SubaddressModel 1.0
import "../js/TxUtils.js" as TxUtils
Rectangle {
id: pageReceive
2017-12-08 23:01:10 +00:00
color: "transparent"
property var model
property alias receiveHeight: mainLayout.height
function renameSubaddressLabel(_index){
inputDialog.labelText = qsTr("Set the label of the selected address:") + translationManager.emptyString;
inputDialog.inputText = appWindow.currentWallet.getSubaddressLabel(appWindow.currentWallet.currentSubaddressAccount, _index);
inputDialog.onAcceptedCallback = function() {
appWindow.currentWallet.subaddress.setLabel(appWindow.currentWallet.currentSubaddressAccount, _index, inputDialog.inputText);
}
inputDialog.onRejectedCallback = null;
inputDialog.open()
}
Clipboard { id: clipboard }
/* main layout */
ColumnLayout {
id: mainLayout
2018-12-08 15:55:29 +00:00
anchors.margins: (isMobile)? 17 * scaleRatio : 20 * scaleRatio
2017-08-07 14:05:54 +00:00
anchors.topMargin: 40 * scaleRatio
2017-04-03 16:51:55 +00:00
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
spacing: 20 * scaleRatio
2017-08-07 14:05:54 +00:00
property int labelWidth: 120 * scaleRatio
property int editWidth: 400 * scaleRatio
property int lineEditFontSize: 12 * scaleRatio
property int qrCodeSize: 220 * scaleRatio
2017-04-03 16:51:55 +00:00
ColumnLayout {
id: addressRow
spacing: 0
2018-12-08 15:55:29 +00:00
MoneroComponents.LabelSubheader {
Layout.fillWidth: true
textFormat: Text.RichText
text: qsTr("Addresses") + translationManager.emptyString
}
ColumnLayout {
id: subaddressListRow
property int subaddressListItemHeight: 50 * scaleRatio
Layout.topMargin: 6 * scaleRatio
Layout.fillWidth: true
Layout.minimumWidth: 240
Layout.preferredHeight: subaddressListItemHeight * subaddressListView.count
visible: subaddressListView.count >= 1
ListView {
id: subaddressListView
Layout.fillWidth: true
anchors.fill: parent
clip: true
boundsBehavior: ListView.StopAtBounds
delegate: Rectangle {
id: tableItem2
height: subaddressListRow.subaddressListItemHeight
width: parent.width
Layout.fillWidth: true
color: "transparent"
Rectangle{
anchors.right: parent.right
anchors.left: parent.left
anchors.top: parent.top
height: 1
2019-04-11 01:17:29 +00:00
color: MoneroComponents.Style.appWindowBorderColor
visible: index !== 0
2019-04-11 01:17:29 +00:00
MoneroEffects.ColorTransition {
targetObj: parent
blackColor: MoneroComponents.Style._b_appWindowBorderColor
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
}
}
Rectangle {
anchors.fill: parent
2018-12-19 23:06:23 +00:00
anchors.topMargin: 5
anchors.rightMargin: 80
color: "transparent"
2018-12-08 15:55:29 +00:00
MoneroComponents.Label {
id: idLabel
2019-04-11 01:17:29 +00:00
color: index === appWindow.current_subaddress_table_index ? MoneroComponents.Style.defaultFontColor : "#757575"
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 6 * scaleRatio
fontSize: 14 * scaleRatio
fontBold: true
text: "#" + index
2019-04-11 01:17:29 +00:00
themeTransition: false
}
2018-12-08 15:55:29 +00:00
MoneroComponents.Label {
id: nameLabel
2019-04-11 01:17:29 +00:00
color: MoneroComponents.Style.dimmedFontColor
anchors.verticalCenter: parent.verticalCenter
anchors.left: idLabel.right
anchors.leftMargin: 6 * scaleRatio
fontSize: 14 * scaleRatio
fontBold: true
text: label
elide: Text.ElideRight
textWidth: addressLabel.x - nameLabel.x - 1
2019-04-11 01:17:29 +00:00
themeTransition: false
}
2018-12-08 15:55:29 +00:00
MoneroComponents.Label {
id: addressLabel
2019-04-11 01:17:29 +00:00
color: MoneroComponents.Style.defaultFontColor
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.right
anchors.leftMargin: (mainLayout.width < 510 ? -130 : -190) * scaleRatio
fontSize: 14 * scaleRatio
fontBold: true
text: TxUtils.addressTruncate(address, mainLayout.width < 510 ? 6 : 10)
2019-04-11 01:17:29 +00:00
themeTransition: false
}
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
hoverEnabled: true
2019-04-11 01:17:29 +00:00
onEntered: tableItem2.color = MoneroComponents.Style.titleBarButtonHoverColor
onExited: tableItem2.color = "transparent"
onClicked: subaddressListView.currentIndex = index;
}
}
2018-12-08 15:55:29 +00:00
MoneroComponents.IconButton {
id: renameButton
2019-04-11 01:17:29 +00:00
image: "qrc:///images/edit.svg"
color: MoneroComponents.Style.defaultFontColor
opacity: 0.5
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 30 * scaleRatio
anchors.topMargin: 1 * scaleRatio
2019-04-11 01:17:29 +00:00
width: 23
height: 21
visible: index !== 0
onClicked: {
renameSubaddressLabel(index);
}
}
2018-12-08 15:55:29 +00:00
MoneroComponents.IconButton {
id: copyButton
2019-04-11 01:17:29 +00:00
image: "qrc:///images/copy.svg"
color: MoneroComponents.Style.defaultFontColor
opacity: 0.5
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
2019-04-11 01:17:29 +00:00
width: 16
height: 21
onClicked: {
console.log("Address copied to clipboard");
clipboard.setText(address);
appWindow.showStatusMessage(qsTr("Address copied to clipboard"),3);
}
}
}
onCurrentItemChanged: {
// reset global vars
2018-12-08 15:55:29 +00:00
appWindow.current_subaddress_table_index = subaddressListView.currentIndex;
appWindow.current_address = appWindow.currentWallet.address(
appWindow.currentWallet.currentSubaddressAccount,
subaddressListView.currentIndex
);
}
}
}
Rectangle {
2019-04-11 01:17:29 +00:00
color: MoneroComponents.Style.appWindowBorderColor
Layout.fillWidth: true
height: 1
2019-04-11 01:17:29 +00:00
MoneroEffects.ColorTransition {
targetObj: parent
blackColor: MoneroComponents.Style._b_appWindowBorderColor
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
}
}
MoneroComponents.CheckBox {
id: addNewAddressCheckbox
border: false
checkedIcon: "qrc:///images/plus-in-circle-medium-white.png"
uncheckedIcon: "qrc:///images/plus-in-circle-medium-white.png"
fontSize: 14 * scaleRatio
iconOnTheLeft: true
Layout.fillWidth: true
Layout.topMargin: 10 * scaleRatio
text: qsTr("Create new address") + translationManager.emptyString;
onClicked: {
inputDialog.labelText = qsTr("Set the label of the new address:") + translationManager.emptyString
inputDialog.inputText = qsTr("(Untitled)") + translationManager.emptyString
inputDialog.onAcceptedCallback = function() {
appWindow.currentWallet.subaddress.addRow(appWindow.currentWallet.currentSubaddressAccount, inputDialog.inputText)
current_subaddress_table_index = appWindow.currentWallet.numSubaddresses(appWindow.currentWallet.currentSubaddressAccount) - 1
}
inputDialog.onRejectedCallback = null;
inputDialog.open()
}
}
}
ColumnLayout {
Layout.alignment: Qt.AlignHCenter
spacing: 11 * scaleRatio
property int qrSize: 220 * scaleRatio
Rectangle {
id: qrContainer
2019-04-11 01:17:29 +00:00
color: MoneroComponents.Style.blackTheme ? "white" : "transparent"
Layout.fillWidth: true
Layout.maximumWidth: parent.qrSize
Layout.preferredHeight: width
radius: 4 * scaleRatio
2018-10-27 12:42:25 +00:00
Image {
id: qrCode
anchors.fill: parent
anchors.margins: 1 * scaleRatio
2018-04-27 17:49:45 +00:00
smooth: false
fillMode: Image.PreserveAspectFit
source: "image://qrcode/" + TxUtils.makeQRCodeString(appWindow.current_address)
MouseArea {
2018-04-27 17:49:45 +00:00
anchors.fill: parent
acceptedButtons: Qt.RightButton
onPressAndHold: qrFileDialog.open()
}
}
}
RowLayout {
spacing: parent.spacing
MoneroComponents.StandardButton {
2019-04-11 01:17:29 +00:00
rightIcon: "qrc:///images/download-white.png"
onClicked: qrFileDialog.open()
}
MoneroComponents.StandardButton {
2019-04-11 01:17:29 +00:00
rightIcon: "qrc:///images/external-link-white.png"
onClicked: {
clipboard.setText(TxUtils.makeQRCodeString(appWindow.current_address));
appWindow.showStatusMessage(qsTr("Copied to clipboard") + translationManager.emptyString, 3);
}
}
}
}
MessageDialog {
id: receivePageDialog
standardButtons: StandardButton.Ok
}
2017-01-23 04:15:49 +00:00
FileDialog {
id: qrFileDialog
title: qsTr("Please choose a name") + translationManager.emptyString
2017-01-23 04:15:49 +00:00
folder: shortcuts.pictures
selectExisting: false
nameFilters: ["Image (*.png)"]
2017-01-23 04:15:49 +00:00
onAccepted: {
2018-12-08 15:55:29 +00:00
if(!walletManager.saveQrCode(TxUtils.makeQRCodeString(appWindow.current_address), walletManager.urlToLocalPath(fileUrl))) {
2017-01-23 04:15:49 +00:00
console.log("Failed to save QrCode to file " + walletManager.urlToLocalPath(fileUrl) )
receivePageDialog.title = qsTr("Save QrCode") + translationManager.emptyString;
receivePageDialog.text = qsTr("Failed to save QrCode to ") + walletManager.urlToLocalPath(fileUrl) + translationManager.emptyString;
receivePageDialog.icon = StandardIcon.Error
receivePageDialog.open()
2017-01-23 04:15:49 +00:00
}
}
}
}
2016-10-04 10:15:29 +00:00
function onPageCompleted() {
console.log("Receive page loaded");
subaddressListView.model = appWindow.currentWallet.subaddressModel;
2016-10-04 10:15:29 +00:00
if (appWindow.currentWallet) {
2018-12-08 15:55:29 +00:00
appWindow.current_address = appWindow.currentWallet.address(appWindow.currentWallet.currentSubaddressAccount, 0)
appWindow.currentWallet.subaddress.refresh(appWindow.currentWallet.currentSubaddressAccount)
2016-10-04 10:15:29 +00:00
}
}
2018-12-18 19:06:29 +00:00
function clearFields() {
2019-01-14 00:02:44 +00:00
// @TODO: add fields
2018-12-18 19:06:29 +00:00
}
function onPageClosed() {
}
}