Merge pull request #1206

Look at the PR, I'm not listing the commits here
This commit is contained in:
luigi1111 2018-03-30 14:29:06 -05:00
commit 79c946367f
No known key found for this signature in database
GPG key ID: F4ACA0183641E010
91 changed files with 3713 additions and 2906 deletions

View file

@ -27,6 +27,7 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Layouts 1.1
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
import moneroComponents.Wallet 1.0 import moneroComponents.Wallet 1.0
import moneroComponents.NetworkType 1.0 import moneroComponents.NetworkType 1.0
@ -36,12 +37,15 @@ Rectangle {
id: panel id: panel
property alias unlockedBalanceText: unlockedBalanceText.text property alias unlockedBalanceText: unlockedBalanceText.text
property alias unlockedBalanceVisible: unlockedBalanceText.visible
property alias unlockedBalanceLabelVisible: unlockedBalanceLabel.visible
property alias balanceLabelText: balanceLabel.text property alias balanceLabelText: balanceLabel.text
property alias balanceText: balanceText.text property alias balanceText: balanceText.text
property alias networkStatus : networkStatus property alias networkStatus : networkStatus
property alias progressBar : progressBar property alias progressBar : progressBar
property alias daemonProgressBar : daemonProgressBar property alias daemonProgressBar : daemonProgressBar
property alias minutesToUnlockTxt: unlockedBalanceLabel.text property alias minutesToUnlockTxt: unlockedBalanceLabel.text
property int titleBarHeight: 50
signal dashboardClicked() signal dashboardClicked()
signal historyClicked() signal historyClicked()
@ -72,52 +76,151 @@ Rectangle {
menuColumn.previousButton.checked = true menuColumn.previousButton.checked = true
} }
width: (isMobile)? appWindow.width : 260 width: (isMobile)? appWindow.width : 300
color: "#FFFFFF" color: "transparent"
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.top: parent.top anchors.top: parent.top
// Item with monero logo Image {
Item {
visible: !isMobile
id: logoItem
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
anchors.topMargin: (persistentSettings.customDecorations)? 66 : 36 height: panel.height
height: logo.implicitHeight source: "images/leftPanelBg.jpg"
z: 1
}
// card with monero logo
Column {
visible: true
z: 2
id: column1
height: 200
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: (persistentSettings.customDecorations)? 50 : 0
RowLayout {
visible: true
Item {
anchors.left: parent.left
anchors.top: parent.top
anchors.topMargin: 20
anchors.leftMargin: 20
anchors.verticalCenter: parent.verticalCenter
height: 490 * scaleRatio
width: 259 * scaleRatio
Image { Image {
id: logo width: 259; height: 170
fillMode: Image.PreserveAspectFit
source: "images/card-background.png"
}
Text {
id: testnetLabel
visible: persistentSettings.nettype != NetworkType.MAINNET
text: (persistentSettings.nettype == NetworkType.TESTNET ? qsTr("Testnet") : qsTr("Stagenet")) + translationManager.emptyString
anchors.top: parent.top
anchors.topMargin: 8
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 50 anchors.leftMargin: 192
source: "images/moneroLogo.png" font.bold: true
font.pixelSize: 12
color: "#f33434"
} }
Text { Text {
id: viewOnlyLabel id: viewOnlyLabel
visible: viewOnly visible: viewOnly
text: qsTr("View Only") + translationManager.emptyString text: qsTr("View Only") + translationManager.emptyString
anchors.top: logo.bottom anchors.top: parent.top
anchors.topMargin: 5 anchors.topMargin: 8
anchors.left: parent.left anchors.right: testnetLabel.visible ? testnetLabel.left : parent.right
anchors.leftMargin: 50 anchors.rightMargin: 8
font.pixelSize: 12
font.bold: true font.bold: true
color: "blue" color: "#ff9323"
}
}
Item {
anchors.left: parent.left
anchors.top: parent.top
anchors.topMargin: 20
anchors.leftMargin: 20
anchors.verticalCenter: parent.verticalCenter
height: 490 * scaleRatio
width: 50 * scaleRatio
Text {
visible: !isMobile
id: balanceText
anchors.left: parent.left
anchors.leftMargin: 20
anchors.top: parent.top
anchors.topMargin: 76
font.family: "Arial"
color: "#FFFFFF"
text: "N/A"
// dynamically adjust text size
font.pixelSize: {
var digits = text.split('.')[0].length
var defaultSize = 22;
if(digits > 2) {
return defaultSize - 1.1*digits
}
return defaultSize;
}
} }
Text { Text {
id: testnetLabel id: unlockedBalanceText
visible: persistentSettings.nettype !== NetworkType.MAINNET visible: false
text: (persistentSettings.nettype === NetworkType.TESTNET ? qsTr("Testnet") : qsTr("Stagenet")) + translationManager.emptyString anchors.left: parent.left
anchors.top: logo.bottom anchors.leftMargin: 20
anchors.topMargin: 5 anchors.top: parent.top
anchors.left: viewOnly ? viewOnlyLabel.right : parent.left anchors.topMargin: 126
anchors.leftMargin: viewOnly ? 10 : 50 font.family: "Arial"
font.bold: true color: "#FFFFFF"
color: "red" text: "N/A"
// dynamically adjust text size
font.pixelSize: {
var digits = text.split('.')[0].length
var defaultSize = 20;
if(digits > 3) {
return defaultSize - 0.6*digits
}
return defaultSize;
}
} }
Label {
id: unlockedBalanceLabel
visible: false
text: qsTr("Unlocked balance") + translationManager.emptyString
anchors.left: parent.left
anchors.leftMargin: 20
anchors.top: parent.top
anchors.topMargin: 110
}
Label {
visible: !isMobile
id: balanceLabel
text: qsTr("Balance") + translationManager.emptyString
fontSize: 14
anchors.left: parent.left
anchors.leftMargin: 20
anchors.top: parent.top
anchors.topMargin: 60
}
Item { //separator
anchors.left: parent.left
anchors.right: parent.right
height: 1
}
/* Disable twitter/news panel /* Disable twitter/news panel
Image { Image {
anchors.left: parent.left anchors.left: parent.left
@ -133,117 +236,18 @@ Rectangle {
} }
*/ */
} }
Column {
visible: !isMobile
id: column1
anchors.left: parent.left
anchors.right: parent.right
anchors.top: logoItem.bottom
anchors.topMargin: 26
spacing: 5
Label {
visible: !isMobile
id: balanceLabel
text: qsTr("Balance") + translationManager.emptyString
anchors.left: parent.left
anchors.leftMargin: 50
}
Row {
visible: !isMobile
Item {
anchors.verticalCenter: parent.verticalCenter
height: 26 * scaleRatio
width: 50 * scaleRatio
Image {
anchors.centerIn: parent
source: "images/lockIcon.png"
} }
} }
Text {
visible: !isMobile
id: balanceText
anchors.verticalCenter: parent.verticalCenter
font.family: "Arial"
color: "#000000"
text: "N/A"
// dynamically adjust text size
font.pixelSize: {
var digits = text.split('.')[0].length
var defaultSize = 25;
if(digits > 2) {
return defaultSize - 1.1*digits
}
return defaultSize;
}
}
}
Item { //separator
anchors.left: parent.left
anchors.right: parent.right
height: 1
}
Label {
id: unlockedBalanceLabel
text: qsTr("Unlocked balance") + translationManager.emptyString
anchors.left: parent.left
anchors.leftMargin: 50
}
Text {
id: unlockedBalanceText
anchors.left: parent.left
anchors.leftMargin: 50
font.family: "Arial"
color: "#000000"
text: "N/A"
// dynamically adjust text size
font.pixelSize: {
var digits = text.split('.')[0].length
var defaultSize = 18;
if(digits > 3) {
return defaultSize - 0.6*digits
}
return defaultSize;
}
}
}
Rectangle {
anchors.top: parent.top
anchors.left: parent.left
anchors.bottom: menuRect.top
width: 1
color: "#DBDBDB"
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
height: 1
color: "#DBDBDB"
}
Rectangle { Rectangle {
id: menuRect id: menuRect
z: 2
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.top: (isMobile)? parent.top : column1.bottom anchors.top: (isMobile)? parent.top : column1.bottom
anchors.topMargin: (isMobile)? 0 : 25 anchors.topMargin: (isMobile)? 0 : 32
color: "#1C1C1C" color: "transparent"
Flickable { Flickable {
@ -285,11 +289,19 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: dashboardButton.checked || transferButton.checked ? "#1C1C1C" : "#505050" color: dashboardButton.checked || transferButton.checked ? "#1C1C1C" : "#313131"
height: 1 height: 1
} }
*/ */
// top border
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 16
color: "#313131"
height: 1
}
// ------------- Transfer tab --------------- // ------------- Transfer tab ---------------
MenuButton { MenuButton {
@ -311,7 +323,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
@ -337,7 +349,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
@ -360,7 +372,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
@ -384,7 +396,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
@ -406,7 +418,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
@ -432,7 +444,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#505050" color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#313131"
height: 1 height: 1
} }
// ------------- TxKey tab --------------- // ------------- TxKey tab ---------------
@ -455,7 +467,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
// ------------- Shared RingDB tab --------------- // ------------- Shared RingDB tab ---------------
@ -478,7 +490,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
@ -503,7 +515,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
// ------------- Settings tab --------------- // ------------- Settings tab ---------------
@ -525,7 +537,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
// ------------- Sign/verify tab --------------- // ------------- Sign/verify tab ---------------
@ -548,7 +560,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 16 anchors.leftMargin: 16
color: "#505050" color: "#313131"
height: 1 height: 1
} }
@ -560,6 +572,8 @@ Rectangle {
id: networkStatus id: networkStatus
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 4
anchors.rightMargin: 4
anchors.bottom: (progressBar.visible)? progressBar.top : parent.bottom; anchors.bottom: (progressBar.visible)? progressBar.top : parent.bottom;
connected: Wallet.ConnectionStatus_Disconnected connected: Wallet.ConnectionStatus_Disconnected
height: 58 * scaleRatio height: 58 * scaleRatio
@ -580,9 +594,9 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: 35 * scaleRatio
syncType: qsTr("Daemon") syncType: qsTr("Daemon")
visible: networkStatus.connected visible: networkStatus.connected
height: 62 * scaleRatio
} }
} // menuRect } // menuRect

View file

@ -49,6 +49,7 @@ Rectangle {
property string unlockedBalanceLabelText: qsTr("Unlocked Balance") + translationManager.emptyString property string unlockedBalanceLabelText: qsTr("Unlocked Balance") + translationManager.emptyString
property string unlockedBalanceText property string unlockedBalanceText
property int minHeight: (appWindow.height > 800) ? appWindow.height : 800 * scaleRatio property int minHeight: (appWindow.height > 800) ? appWindow.height : 800 * scaleRatio
property alias contentHeight: mainFlickable.contentHeight
// property int headerHeight: header.height // property int headerHeight: header.height
property Transfer transferView: Transfer { } property Transfer transferView: Transfer { }
@ -69,7 +70,13 @@ Rectangle {
signal getProofClicked(string txid, string address, string message); signal getProofClicked(string txid, string address, string message);
signal checkProofClicked(string txid, string address, string message, string signature); signal checkProofClicked(string txid, string address, string message, string signature);
color: "#F0EEEE" Image {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom
source: "../images/middlePanelBg.jpg"
}
onCurrentViewChanged: { onCurrentViewChanged: {
if (previousView) { if (previousView) {
@ -105,7 +112,7 @@ Rectangle {
name: "History" name: "History"
PropertyChanges { target: root; currentView: historyView } PropertyChanges { target: root; currentView: historyView }
PropertyChanges { target: historyView; model: appWindow.currentWallet ? appWindow.currentWallet.historyModel : null } PropertyChanges { target: historyView; model: appWindow.currentWallet ? appWindow.currentWallet.historyModel : null }
PropertyChanges { target: mainFlickable; contentHeight: minHeight } PropertyChanges { target: mainFlickable; contentHeight: historyView.tableHeight + 220 * scaleRatio }
}, State { }, State {
name: "Transfer" name: "Transfer"
PropertyChanges { target: root; currentView: transferView } PropertyChanges { target: root; currentView: transferView }
@ -117,7 +124,7 @@ Rectangle {
}, State { }, State {
name: "TxKey" name: "TxKey"
PropertyChanges { target: root; currentView: txkeyView } PropertyChanges { target: root; currentView: txkeyView }
PropertyChanges { target: mainFlickable; contentHeight: minHeight } PropertyChanges { target: mainFlickable; contentHeight: 1200 * scaleRatio }
}, State { }, State {
name: "SharedRingDB" name: "SharedRingDB"
PropertyChanges { target: root; currentView: sharedringdbView } PropertyChanges { target: root; currentView: sharedringdbView }
@ -129,11 +136,11 @@ Rectangle {
}, State { }, State {
name: "Sign" name: "Sign"
PropertyChanges { target: root; currentView: signView } PropertyChanges { target: root; currentView: signView }
PropertyChanges { target: mainFlickable; contentHeight: minHeight } PropertyChanges { target: mainFlickable; contentHeight: 1200 * scaleRatio }
}, State { }, State {
name: "Settings" name: "Settings"
PropertyChanges { target: root; currentView: settingsView } PropertyChanges { target: root; currentView: settingsView }
PropertyChanges { target: mainFlickable; contentHeight: 1200 * scaleRatio } PropertyChanges { target: mainFlickable; contentHeight: 1400 * scaleRatio }
}, State { }, State {
name: "Mining" name: "Mining"
PropertyChanges { target: root; currentView: miningView } PropertyChanges { target: root; currentView: miningView }
@ -163,8 +170,8 @@ Rectangle {
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
anchors.margins: 2 anchors.margins: 18
anchors.topMargin: appWindow.persistentSettings.customDecorations ? 30 : 0 anchors.topMargin: appWindow.persistentSettings.customDecorations ? 50 : 0
spacing: 0 spacing: 0
Flickable { Flickable {
@ -212,30 +219,14 @@ Rectangle {
}// flickable }// flickable
} }
// border // border
Rectangle {
anchors.top: styledRow.bottom
anchors.bottom: parent.bottom
anchors.right: parent.right
width: 1
color: "#DBDBDB"
}
Rectangle { Rectangle {
anchors.top: styledRow.bottom anchors.top: styledRow.bottom
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
width: 1 width: 1
color: "#DBDBDB" color: "#313131"
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: 1
color: "#DBDBDB"
} }
/* connect "payment" click */ /* connect "payment" click */

View file

@ -37,13 +37,13 @@ ListView {
footer: Rectangle { footer: Rectangle {
height: 127 height: 127
width: listView.width width: listView.width
color: "#FFFFFF" color: "transparent"
Text { Text {
anchors.centerIn: parent anchors.centerIn: parent
font.family: "Arial" font.family: "Arial"
font.pixelSize: 14 font.pixelSize: 14
color: "#545454" color: "#808080"
text: qsTr("No more results") + translationManager.emptyString text: qsTr("No more results") + translationManager.emptyString
} }
} }
@ -53,7 +53,7 @@ ListView {
id: delegate id: delegate
height: 64 height: 64
width: listView.width width: listView.width
color: index % 2 ? "#F8F8F8" : "#FFFFFF" color: "transparent"
z: listView.count - index z: listView.count - index
function collapseDropdown() { dropdown.expanded = false } function collapseDropdown() { dropdown.expanded = false }
@ -62,11 +62,11 @@ ListView {
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top anchors.top: parent.top
anchors.topMargin: 12 anchors.topMargin: 12
width: text.length ? (descriptionArea.containsMouse ? dropdown.x - x - 12 : 139) : 0 width: text.length ? (descriptionArea.containsMouse ? 139 : 139) : 0
font.family: "Arial" font.family: "Arial"
font.bold: true font.bold: true
font.pixelSize: 19 font.pixelSize: 19
color: "#444444" color: "#ffffff"
elide: Text.ElideRight elide: Text.ElideRight
text: description text: description
@ -87,8 +87,9 @@ ListView {
anchors.rightMargin: 40 anchors.rightMargin: 40
font.family: "Arial" font.family: "Arial"
font.pixelSize: 16 font.pixelSize: 16
color: "#545454" color: "#ffffff"
text: address text: address
readOnly: true
} }
Text { Text {
@ -100,7 +101,7 @@ ListView {
width: 139 width: 139
font.family: "Arial" font.family: "Arial"
font.pixelSize: 12 font.pixelSize: 12
color: "#535353" color: "#ffffff"
text: qsTr("Payment ID:") + translationManager.emptyString text: qsTr("Payment ID:") + translationManager.emptyString
} }
@ -111,7 +112,7 @@ ListView {
anchors.leftMargin: 12 anchors.leftMargin: 12
anchors.rightMargin: 12 anchors.rightMargin: 12
anchors.right: dropdown.left anchors.right: dropdown.left
readOnly: true
font.family: "Arial" font.family: "Arial"
font.pixelSize: 13 font.pixelSize: 13
@ -164,7 +165,7 @@ ListView {
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: 1 height: 1
color: "#DBDBDB" color: "#404040"
} }
} }
} }

View file

@ -28,11 +28,12 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import "." 1.0
RowLayout { RowLayout {
id: checkBox id: checkBox
property alias text: label.text property alias text: label.text
property string checkedIcon property string checkedIcon: "../images/checkedIcon-black.png"
property string uncheckedIcon property string uncheckedIcon
property bool checked: false property bool checked: false
property alias background: backgroundRect.color property alias background: backgroundRect.color
@ -52,9 +53,10 @@ RowLayout {
anchors.left: parent.left anchors.left: parent.left
width: 25 * scaleRatio width: 25 * scaleRatio
height: checkBox.height - 1 height: checkBox.height - 1
//radius: 4 radius: 3
y: 0 y: 0
color: "#DBDBDB" color: "transparent"
border.color: checkBox.checked ? Qt.rgba(1, 1, 1, 0.35) : Qt.rgba(1, 1, 1, 0.25)
} }
Rectangle { Rectangle {
@ -64,16 +66,17 @@ RowLayout {
height: checkBox.height - 1 height: checkBox.height - 1
//radius: 4 //radius: 4
y: 1 y: 1
color: "#FFFFFF" color: "transparent"
Image { Image {
anchors.centerIn: parent anchors.centerIn: parent
source: checkBox.checked ? checkBox.checkedIcon : source: checkBox.checkedIcon
checkBox.uncheckedIcon visible: checkBox.checked
} }
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
toggle() toggle()
} }
@ -82,13 +85,16 @@ RowLayout {
Text { Text {
id: label id: label
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: checkBox.fontSize font.pixelSize: checkBox.fontSize
color: "#525252" color: Style.defaultFontColor
wrapMode: Text.Wrap wrapMode: Text.Wrap
Layout.fillWidth: true Layout.fillWidth: true
anchors.left: backgroundRect.right
anchors.leftMargin: !isMobile ? 10 : 8
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
toggle() toggle()
} }

98
components/CheckBox2.qml Normal file
View file

@ -0,0 +1,98 @@
// Copyright (c) 2014-2015, 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.0
import QtQuick.Layouts 1.1
import "." 1.0
RowLayout {
id: checkBox
property alias text: label.text
property string checkedIcon: "../images/checkedIcon-black.png"
property string uncheckedIcon
property bool checked: false
property string background: "backgroundRect.color"
property int fontSize: 14 * scaleRatio
property alias fontColor: label.color
property int textMargin: 8 * scaleRatio
signal clicked()
height: 25 * scaleRatio
function toggle(){
checkBox.checked = !checkBox.checked
checkBox.clicked()
}
RowLayout {
Layout.fillWidth: true
Rectangle{
height: label.height
width: (label.width + indicatorRect.width + checkBox.textMargin)
color: "transparent"
anchors.left: parent.left
Text {
id: label
font.family: Style.fontLight.name
font.pixelSize: checkBox.fontSize
color: Style.defaultFontColor
wrapMode: Text.Wrap
Layout.fillWidth: true
anchors.left: parent.left
}
Rectangle {
id: indicatorRect
width: indicatorImage.width
height: label.height
anchors.left: label.right
anchors.leftMargin: textMargin
color: "transparent"
Image {
id: indicatorImage
anchors.centerIn: parent
source: "../images/whiteDropIndicator.png"
rotation: checkBox.checked ? 180 * scaleRatio : 0
}
}
MouseArea{
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
toggle();
}
}
}
}
}

View file

@ -110,10 +110,6 @@ Window {
id: okButton id: okButton
width: 120 width: 120
fontSize: 14 fontSize: 14
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Close") + translationManager.emptyString text: qsTr("Close") + translationManager.emptyString
onClicked: { onClicked: {
root.close() root.close()
@ -138,10 +134,6 @@ Window {
// id: sendCommandButton // id: sendCommandButton
// enabled: sendCommandText.text.length > 0 // enabled: sendCommandText.text.length > 0
// fontSize: 14 // fontSize: 14
// shadowReleasedColor: "#FF4304"
// shadowPressedColor: "#B32D00"
// releasedColor: "#FF6C3C"
// pressedColor: "#FF4304"
// text: qsTr("Send command") // text: qsTr("Send command")
// onClicked: { // onClicked: {
// daemonManager.sendCommand(sendCommandText.text,currentWallet.testnet); // daemonManager.sendCommand(sendCommandText.text,currentWallet.testnet);

View file

@ -108,10 +108,6 @@ Window {
id: okButton id: okButton
visible:false visible:false
fontSize: 14 fontSize: 14
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Start daemon (%1)").arg(countDown) text: qsTr("Start daemon (%1)").arg(countDown)
KeyNavigation.tab: cancelButton KeyNavigation.tab: cancelButton
onClicked: { onClicked: {
@ -125,10 +121,6 @@ Window {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: cancelButton id: cancelButton
fontSize: 14 fontSize: 14
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Use custom settings") text: qsTr("Use custom settings")
onClicked: { onClicked: {

View file

@ -29,18 +29,23 @@
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
import "../components"
import "." 1.0
Item { Item {
id: datePicker id: datePicker
property bool expanded: false property bool expanded: false
property date currentDate property date currentDate
property bool showCurrentDate: true property bool showCurrentDate: true
property color backgroundColor : "#FFFFFF" property color backgroundColor : "#404040"
property color errorColor : "#FFDDDD" property color errorColor : "red"
property bool error: false property bool error: false
property alias inputLabel: inputLabel
height: 37 signal dateChanged();
width: 156
height: 50
onExpandedChanged: if(expanded) appWindow.currentItem = datePicker onExpandedChanged: if(expanded) appWindow.currentItem = datePicker
@ -57,28 +62,49 @@ Item {
return true return true
} }
Item {
id: head
anchors.fill: parent
Rectangle { Rectangle {
anchors.left: parent.left id: inputLabelRect
anchors.right: parent.right color: "transparent"
height: parent.height height: 22
//radius: 4 width: parent.width
y: 0
color: "#DBDBDB"
Text {
id: inputLabel
anchors.top: parent.top
anchors.topMargin: 2
anchors.left: parent.left
font.family: Style.fontLight.name
font.pixelSize: 14
font.bold: false
textFormat: Text.RichText
color: Style.defaultFontColor
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.NoButton
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
}
} }
Item {
id: head
anchors.top: inputLabelRect.bottom
anchors.topMargin: 6 * scaleRatio
anchors.left: parent.left
anchors.right: parent.right
height: 28
Rectangle { Rectangle {
anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
height: parent.height - 1 height: parent.height - 1
anchors.leftMargin: datePicker.expanded ? 1 : 0 anchors.leftMargin: datePicker.expanded ? 1 : 0
anchors.rightMargin: datePicker.expanded ? 1 : 0 anchors.rightMargin: datePicker.expanded ? 1 : 0
//radius: 4 radius: 4
y: 1 y: 1
color: datePicker.error ? datePicker.errorColor : datePicker.backgroundColor color: datePicker.backgroundColor
} }
Item { Item {
@ -89,28 +115,18 @@ Item {
anchors.margins: 4 anchors.margins: 4
width: height width: height
StandardButton {
id: button
anchors.fill: parent
shadowReleasedColor: "#DBDBDB"
shadowPressedColor: "#888888"
releasedColor: "#F0EEEE"
pressedColor: "#DBDBDB"
icon: "../images/datePicker.png"
visible: !datePicker.expanded
onClicked: datePicker.expanded = true
}
Image { Image {
id: button
anchors.centerIn: parent anchors.centerIn: parent
source: "../images/datePicker.png" source: "../images/whiteDropIndicator.png"
visible: datePicker.expanded rotation: datePicker.expanded ? 180 : 0
} }
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
enabled: datePicker.expanded onClicked: datePicker.expanded = !datePicker.expanded
onClicked: datePicker.expanded = false hoverEnabled: true
cursorShape: Qt.PointingHandCursor
} }
} }
@ -121,7 +137,7 @@ Item {
anchors.rightMargin: 4 anchors.rightMargin: 4
height: 16 height: 16
width: 1 width: 1
color: "#DBDBDB" color: "#808080"
visible: datePicker.expanded visible: datePicker.expanded
} }
@ -150,9 +166,9 @@ Item {
id: dayInput id: dayInput
readOnly: true readOnly: true
width: 22 width: 22
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 18 font.pixelSize: 14
// color: "#525252" color: datePicker.error ? errorColor : Style.defaultFontColor
maximumLength: 2 maximumLength: 2
horizontalAlignment: TextInput.AlignHCenter horizontalAlignment: TextInput.AlignHCenter
validator: IntValidator{bottom: 01; top: 31;} validator: IntValidator{bottom: 01; top: 31;}
@ -173,19 +189,19 @@ Item {
} }
Text { Text {
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 18 font.pixelSize: 14
// color: "#525252" color: datePicker.error ? errorColor : Style.defaultFontColor
text: "." text: "-"
} }
TextInput { TextInput {
id: monthInput id: monthInput
readOnly: true readOnly: true
width: 22 width: 22
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 18 font.pixelSize: 14
// color: "#525252" color: datePicker.error ? errorColor : Style.defaultFontColor
maximumLength: 2 maximumLength: 2
horizontalAlignment: TextInput.AlignHCenter horizontalAlignment: TextInput.AlignHCenter
validator: IntValidator{bottom: 01; top: 12;} validator: IntValidator{bottom: 01; top: 12;}
@ -205,18 +221,18 @@ Item {
} }
Text { Text {
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 18 font.pixelSize: 14
// color: "#525252" color: datePicker.error ? errorColor : Style.defaultFontColor
text: "." text: "-"
} }
TextInput { TextInput {
id: yearInput id: yearInput
width: 44 width: 44
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 18 font.pixelSize: 14
/// color: "#525252" color: datePicker.error ? errorColor : Style.defaultFontColor
maximumLength: 4 maximumLength: 4
horizontalAlignment: TextInput.AlignHCenter horizontalAlignment: TextInput.AlignHCenter
validator: IntValidator{bottom: 1000; top: 9999;} validator: IntValidator{bottom: 1000; top: 9999;}
@ -272,6 +288,7 @@ Item {
gridVisible: false gridVisible: false
background: Rectangle { color: "transparent" } background: Rectangle { color: "transparent" }
dayDelegate: Item { dayDelegate: Item {
z: parent.z + 1
implicitHeight: implicitWidth implicitHeight: implicitWidth
implicitWidth: calendar.width / 7 implicitWidth: calendar.width / 7
@ -308,6 +325,8 @@ Item {
calendar.showNextMonth() calendar.showNextMonth()
else calendar.showPreviousMonth() else calendar.showPreviousMonth()
} }
dateChanged();
} }
} }
} }

View file

@ -30,6 +30,8 @@ import QtQuick 2.0
import moneroComponents.Clipboard 1.0 import moneroComponents.Clipboard 1.0
import moneroComponents.AddressBookModel 1.0 import moneroComponents.AddressBookModel 1.0
import "../components" as MoneroComponents import "../components" as MoneroComponents
import "../js/TxUtils.js" as TxUtils
import "." 1.0
ListView { ListView {
id: listView id: listView
@ -65,11 +67,10 @@ ListView {
return addressBookModel.data(idx, AddressBookModel.AddressBookDescriptionRole) return addressBookModel.data(idx, AddressBookModel.AddressBookDescriptionRole)
} }
footer: Rectangle { footer: Rectangle {
height: 127 height: 127 * scaleRatio
width: listView.width width: listView.width
color: "#FFFFFF" color: "transparent"
Text { Text {
anchors.centerIn: parent anchors.centerIn: parent
@ -82,25 +83,371 @@ ListView {
delegate: Rectangle { delegate: Rectangle {
id: delegate id: delegate
height: 144 property bool collapsed: index ? false : true
height: collapsed ? 180 * scaleRatio : 70 * scaleRatio
width: listView.width width: listView.width
color: index % 2 ? "#F8F8F8" : "#FFFFFF" color: "transparent"
z: listView.count - index
function collapseDropdown() { dropdown.expanded = false }
StandardButton { function collapse(){
id: detailsButton delegate.height = 180 * scaleRatio;
}
// borders
Rectangle{
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 15
anchors.top: parent.top anchors.top: parent.top
anchors.topMargin: parent.height/2 - this.height/2 anchors.bottom: parent.bottom
width: 80 width: 1
fontSize: 14 color: "#404040"
shadowReleasedColor: "#FF4304" }
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C" Rectangle{
pressedColor: "#FF4304" anchors.left: parent.left
text: qsTr("Details") anchors.top: parent.top
anchors.bottom: parent.bottom
width: collapsed ? 2 : 1
color: collapsed ? "#BBBBBB" : "#404040"
}
Rectangle{
anchors.right: parent.right
anchors.bottom: parent.top
anchors.left: parent.left
height: 1
color: "#404040"
}
Rectangle{
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.left: parent.left
height: 1
color: "#404040"
}
Rectangle {
id: row1
anchors.left: parent.left
anchors.leftMargin: 20 * scaleRatio
anchors.right: parent.right
anchors.rightMargin: 20 * scaleRatio
anchors.top: parent.top
anchors.topMargin: 15 * scaleRatio
height: 40 * scaleRatio
color: "transparent"
Image {
id: arrowImage
source: isOut ? "../images/downArrow.png" : "../images/upArrow-green.png"
height: 18 * scaleRatio
width: 12 * scaleRatio
anchors.top: parent.top
anchors.topMargin: 12 * scaleRatio
}
Text {
id: txrxLabel
anchors.left: arrowImage.right
anchors.leftMargin: 18 * scaleRatio
font.family: Style.fontLight.name
font.pixelSize: 14 * scaleRatio
text: isOut ? "Sent" : "Received"
color: "#808080"
}
Text {
id: amountLabel
anchors.left: arrowImage.right
anchors.leftMargin: 18 * scaleRatio
anchors.top: txrxLabel.bottom
anchors.topMargin: 0 * scaleRatio
font.family: Style.fontBold.name
font.pixelSize: 18 * scaleRatio
font.bold: true
text: {
var _amount = amount;
if(_amount === 0){
// *sometimes* amount is 0, while the 'destinations string'
// has the correct amount, so we try to fetch it from that instead.
_amount = TxUtils.destinationsToAmount(destinations);
_amount = (_amount *1);
}
return _amount + " XMR";
}
color: isOut ? "white" : "#2eb358"
}
Rectangle {
anchors.right: parent.right
width: 300 * scaleRatio
height: parent.height
color: "transparent"
Text {
id: dateLabel
anchors.left: parent.left
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
text: date
color: "#808080"
}
Text {
id: timeLabel
anchors.left: dateLabel.right
anchors.leftMargin: 7 * scaleRatio
anchors.top: parent.top
anchors.topMargin: 3 * scaleRatio
font.pixelSize: 12 * scaleRatio
text: time
color: "#808080"
}
Text {
id: toLabel
property string address: ""
color: "#BBBBBB"
anchors.left: parent.left
anchors.top: dateLabel.bottom
anchors.topMargin: 0
font.family: Style.fontRegular.name
font.pixelSize: 16 * scaleRatio
text: {
if(isOut){
address = TxUtils.destinationsToAddress(destinations);
if(address){
var truncated = TxUtils.addressTruncate(address);
return "To " + truncated;
} else {
return "Unknown recipient";
}
}
return "";
}
MouseArea{
visible: parent.address !== undefined
hoverEnabled: true
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onEntered: {
toLabel.color = "white";
}
onExited: {
toLabel.color = "#BBBBBB";
}
onClicked: {
if(parent.address){
console.log("Address copied to clipboard");
clipboard.setText(parent.address);
appWindow.showStatusMessage(qsTr("Address copied to clipboard"),3)
}
}
}
}
Rectangle {
height: 24 * scaleRatio
width: 24 * scaleRatio
color: "transparent"
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
Image {
id: dropdownImage
height: 8 * scaleRatio
width: 12 * scaleRatio
source: "../images/whiteDropIndicator.png"
rotation: delegate.collapsed ? 180 : 0
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
MouseArea{
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
delegate.collapsed = !delegate.collapsed;
}
}
}
}
}
Rectangle {
id: row2
anchors.left: parent.left
anchors.leftMargin: 20 * scaleRatio
anchors.right: parent.right
anchors.rightMargin: 20 * scaleRatio
anchors.top: row1.bottom
anchors.topMargin: 15 * scaleRatio
height: 40 * scaleRatio
color: "transparent"
visible: delegate.collapsed
// left column
HistoryTableInnerColumn{
anchors.left: parent.left
anchors.leftMargin: 30 * scaleRatio
labelHeader: "Transaction ID"
labelValue: hash.substring(0, 18) + "..."
copyValue: hash
}
// right column
HistoryTableInnerColumn{
anchors.right: parent.right
anchors.rightMargin: 100 * scaleRatio
width: 200 * scaleRatio
height: parent.height
color: "transparent"
labelHeader: qsTr("Fee")
labelValue: {
if(!isOut && !fee){
return "-";
} else if(isOut && fee){
return fee + " XMR";
} else {
return "Unknown"
}
}
copyValue: {
if(isOut && fee){ return fee }
else { return "" }
}
}
}
Rectangle {
id: row3
anchors.left: parent.left
anchors.leftMargin: 20 * scaleRatio
anchors.right: parent.right
anchors.rightMargin: 20 * scaleRatio
anchors.top: row2.bottom
anchors.topMargin: 15 * scaleRatio
height: 40 * scaleRatio
color: "transparent"
visible: delegate.collapsed
// left column
HistoryTableInnerColumn{
anchors.left: parent.left
anchors.leftMargin: 30 * scaleRatio
labelHeader: qsTr("Blockheight")
labelValue: {
if (!isPending)
if(confirmations < confirmationsRequired)
return blockHeight + " " + qsTr("(%1/%2 confirmations)").arg(confirmations).arg(confirmationsRequired);
else
return blockHeight;
if (!isOut)
return qsTr("UNCONFIRMED") + translationManager.emptyString
if (isFailed)
return qsTr("FAILED") + translationManager.emptyString
return qsTr("PENDING") + translationManager.emptyString
}
copyValue: labelValue
}
// right column
HistoryTableInnerColumn {
visible: currentWallet.getUserNote(hash)
anchors.right: parent.right
anchors.rightMargin: 80 * scaleRatio
width: 220 * scaleRatio
height: parent.height
color: "transparent"
labelHeader: qsTr("Description")
labelValue: {
var note = currentWallet.getUserNote(hash);
if(note){
if(note.length > 28) {
return note.substring(0, 28) + "...";
} else {
return note;
}
} else {
return "";
}
}
copyValue: {
return currentWallet.getUserNote(hash);
}
}
Rectangle {
id: proofButton
visible: isOut
color: "#404040"
height: 24 * scaleRatio
width: 24 * scaleRatio
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.bottomMargin: 36
radius: 20 * scaleRatio
MouseArea {
id: proofButtonMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
var address = TxUtils.destinationsToAddress(destinations);
if(address === undefined){
console.log('getProof: Error fetching address')
return;
}
var checked = (TxUtils.checkTxID(hash) && TxUtils.checkAddress(address, appWindow.persistentSettings.nettype));
if(!checked){
console.log('getProof: Error checking TxId and/or address');
}
console.log("getProof: Generate clicked: txid " + hash + ", address " + address);
root.getProofClicked(hash, address, '');
}
onEntered: {
proofButton.color = "#656565";
}
onExited: {
proofButton.color = "#404040";
}
}
Text {
color: Style.defaultFontColor
text: "P"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
font.pixelSize: 14 * scaleRatio
}
}
Rectangle {
id: detailsButton
color: "#404040"
height: 24 * scaleRatio
width: 24 * scaleRatio
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.bottomMargin: 6
radius: 20 * scaleRatio
MouseArea {
id: detailsButtonMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
var tx_key = currentWallet.getTxKey(hash) var tx_key = currentWallet.getTxKey(hash)
var tx_note = currentWallet.getUserNote(hash) var tx_note = currentWallet.getUserNote(hash)
@ -112,368 +459,25 @@ ListView {
informationPopup.onCloseCallback = null informationPopup.onCloseCallback = null
informationPopup.open(); informationPopup.open();
} }
onEntered: {
detailsButton.color = "#656565";
} }
onExited: {
detailsButton.color = "#404040";
Row {
id: row1
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 14
// -- direction indicator
Rectangle {
id: dot
width: 14
height: width
radius: width / 2
color: isOut ? "#FF4F41" : "#36B05B"
} }
Item { //separator
width: 12
height: 14
}
// -- description aka recepient name from address book (TODO)
/*
Text {
id: descriptionText
width: text.length ? (descriptionArea.containsMouse ? parent.width - x - 12 : 120) : 0
anchors.verticalCenter: dot.verticalCenter
font.family: "Arial"
font.bold: true
font.pixelSize: 19
color: "#444444"
elide: Text.ElideRight
text: description
MouseArea {
id: descriptionArea
anchors.fill: parent
hoverEnabled: true
}
}
*/
/*
Item { //separator
width: descriptionText.width ? 12 : 0
height: 14
visible: !descriptionArea.containsMouse
}
*/
// -- address (in case outgoing transaction) - N/A in case of incoming
MoneroComponents.TextBlock {
id: addressText
anchors.verticalCenter: dot.verticalCenter
width: parent.width - x - 12
//elide: Text.ElideRight
font.family: "Arial"
font.pixelSize: 14
color: "#545454"
text: hash
// visible: !descriptionArea.containsMouse
}
}
Row {
// - Payment ID
id: row2
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 40
anchors.leftMargin: 26
// -- "PaymentID" title
Text {
id: paymentLabel
width: 86
anchors.bottom: parent.bottom
font.family: "Arial"
font.pixelSize: 12
color: "#535353"
text: paymentId !== "" ? qsTr("Payment ID:") + translationManager.emptyString : ""
}
// -- "PaymentID" value
MoneroComponents.TextBlock {
id: paymentIdValue
width: 136
anchors.bottom: parent.bottom
//elide: Text.ElideRight
font.family: "Arial"
font.pixelSize:13
color: "#545454"
text: paymentId
}
// Address book lookup
MoneroComponents.TextBlock {
id: addressBookLookupValue
width: 136
anchors.bottom: parent.bottom
//elide: Text.ElideRight
font.family: "Arial"
font.pixelSize:13
color: "#545454"
text: "(" + lookupPaymentID(paymentId) + ")"
visible: text !== "()"
}
}
Row {
// block height row
id: row3
anchors.left: parent.left
anchors.right: parent.right
anchors.top: row2.bottom
anchors.topMargin: rowSpacing
anchors.leftMargin: 26
// -- "BlockHeight" title
Text {
id: blockHeghtTitle
anchors.bottom: parent.bottom
width: 86
font.family: "Arial"
font.pixelSize: 12
color: "#535353"
text: qsTr("BlockHeight:") + translationManager.emptyString
}
// -- "BlockHeight" value
MoneroComponents.TextBlock {
width: 200
anchors.bottom: parent.bottom
//elide: Text.ElideRight
font.family: "Arial"
font.pixelSize: 13
color: (confirmations < confirmationsRequired)? "#FF6C3C" : "#545454"
text: {
if (!isPending)
if(confirmations < confirmationsRequired)
return blockHeight + " " + qsTr("(%1/%2 confirmations)").arg(confirmations).arg(confirmationsRequired)
else
return blockHeight
if (!isOut)
return qsTr("UNCONFIRMED") + translationManager.emptyString
if (isFailed)
return qsTr("FAILED") + translationManager.emptyString
return qsTr("PENDING") + translationManager.emptyString
}
}
Item { //separator
width: 100
height: 14
}
// -- "Received by" title
Text {
anchors.bottom: parent.bottom
font.family: "Arial"
font.pixelSize: 12
color: "#535353"
text: (isOut ? qsTr("Spent from:") : qsTr("Received by:")) + translationManager.emptyString
}
Item { //separator
width: 5
height: 14
}
// -- "Index" value
Text {
anchors.bottom: parent.bottom
font.family: "Arial"
font.pixelSize: 13
font.bold: true
color: "#545454"
text: "#" + subaddrIndex
}
Item { //separator
width: 5
height: 14
}
// -- "Label" value
Text {
anchors.bottom: parent.bottom
font.family: "Arial"
font.pixelSize: 13
color: "#545454"
text: label
elide: Text.ElideRight
width: detailsButton.x - x - 30
}
}
// -- "Date", "Balance" and "Amound" section
Row {
id: row4
anchors.top: row3.bottom
anchors.left: parent.left
spacing: 12
anchors.topMargin: rowSpacing
Item { //separator
width: 14
height: 14
}
// -- "Date" column
Column {
anchors.top: parent.top
width: 215
Text {
anchors.left: parent.left
font.family: "Arial"
font.pixelSize: 12
color: "#545454"
text: qsTr("Date") + translationManager.emptyString
}
Row {
anchors.left: parent.left
anchors.right: parent.right
spacing: 33
Text {
font.family: "Arial"
font.pixelSize: 18
color: "#000000"
text: date
} }
Text { Text {
font.family: "Arial" color: Style.defaultFontColor
font.pixelSize: 18 text: "?"
color: "#000000" anchors.horizontalCenter: parent.horizontalCenter
text: time anchors.verticalCenter: parent.verticalCenter
font.pixelSize: 14 * scaleRatio
} }
} }
} }
// -- "Balance" column
// XXX: we don't have a balance
/*
Column {
anchors.top: parent.top
width: 148
visible: false
Text {
anchors.left: parent.left
font.family: "Arial"
font.pixelSize: 12
color: "#545454"
text: qsTr("Balance") + translationManager.emptyString
}
Text {
font.family: "Arial"
font.pixelSize: 18
color: "#000000"
text: balance
}
}
*/
// -- "Amount column
Column {
anchors.top: parent.top
Text {
anchors.left: parent.left
font.family: "Arial"
font.pixelSize: 12
color: "#545454"
text: qsTr("Amount") + translationManager.emptyString
}
Row {
spacing: 2
Text {
anchors.bottom: parent.bottom
anchors.bottomMargin: 3
font.family: "Arial"
font.pixelSize: 16
color: isOut ? "#FF4F41" : "#36B05B"
text: isOut ? "↓" : "↑"
}
Text {
id: amountText
anchors.bottom: parent.bottom
font.family: "Arial"
font.pixelSize: 18
color: isOut ? "#FF4F41" : "#36B05B"
text: displayAmount
}
}
}
// -- "Fee column
Column {
anchors.top: parent.top
width: 148
visible: isOut && fee != ""
Text {
anchors.left: parent.left
font.family: "Arial"
font.pixelSize: 12
color: "#545454"
text: qsTr("Fee") + translationManager.emptyString
}
Row {
spacing: 2
Text {
anchors.bottom: parent.bottom
font.family: "Arial"
font.pixelSize: 18
color: "#FF4F41"
text: fee
}
}
}
}
/*
// Transaction dropdown menu.
// Disable for now until AddressBook implemented
TableDropdown {
id: dropdown
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.bottomMargin: 11
anchors.rightMargin: 5
dataModel: dropModel
z: 1
onExpandedChanged: {
if(expanded) {
listView.previousItem = delegate
listView.currentIndex = index
}
}
onOptionClicked: {
if(option === 0)
clipboard.setText(address)
}
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: 1
color: "#DBDBDB"
}
*/
}
ListModel {
id: dropModel
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
ListElement { name: "<b>Add to address book</b>"; icon: "../images/dropdownAdd.png" }
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
} }
Clipboard { id: clipboard } Clipboard { id: clipboard }

View file

@ -0,0 +1,91 @@
// Copyright (c) 2014-2015, 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.0
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2
import moneroComponents.Clipboard 1.0
import moneroComponents.PendingTransaction 1.0
import moneroComponents.Wallet 1.0
import "../components"
import "." 1.0
Rectangle{
Clipboard { id: clipboard }
width: label1.width > label2.width ? label1.width : label2.width
height: label1.height + label2.height
color: "transparent"
property string copyValue: ""
property alias labelHeader: label1.text
property alias labelValue: label2.text
Text {
id: label1
anchors.left: parent.left
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
text: labelHeader
color: Style.greyFontColor
}
Text {
id: label2
anchors.left: parent.left
anchors.top: label1.bottom
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
text: labelValue
color: Style.dimmedFontColor
}
// hover effect / copy value
MouseArea {
visible: copyValue !== ""
hoverEnabled: true
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onEntered: {
label1.color = Style.defaultFontColor;
label2.color = Style.defaultFontColor;
}
onExited: {
label1.color = Style.greyFontColor;
label2.color = Style.dimmedFontColor;
}
onClicked: {
if(copyValue){
console.log("Copied to clipboard");
clipboard.setText(copyValue);
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
}
}
}
}

View file

@ -68,7 +68,7 @@ ListView {
footer: Rectangle { footer: Rectangle {
height: 127 * scaleRatio height: 127 * scaleRatio
width: listView.width width: listView.width
color: "#FFFFFF" color: "transparent"
Text { Text {
anchors.centerIn: parent anchors.centerIn: parent
@ -83,10 +83,35 @@ ListView {
id: delegate id: delegate
height: tableContent.height + 20 * scaleRatio height: tableContent.height + 20 * scaleRatio
width: listView.width width: listView.width
color: index % 2 ? "#F8F8F8" : "#FFFFFF" color: "transparent"
Layout.leftMargin: 10 * scaleRatio Layout.leftMargin: 10 * scaleRatio
z: listView.count - index z: listView.count - index
function collapseDropdown() { dropdown.expanded = false } function collapseDropdown() { dropdown.expanded = false }
Rectangle{
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
width: 1
color: "#404040"
}
Rectangle{
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.top: parent.top
width: 1
color: "#404040"
}
Rectangle{
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.left: parent.left
height: 1
color: "#404040"
}
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
@ -109,7 +134,7 @@ ListView {
anchors.topMargin: parent.height/2 - this.height/2 anchors.topMargin: parent.height/2 - this.height/2
width: 30 * scaleRatio; height: 30 * scaleRatio width: 30 * scaleRatio; height: 30 * scaleRatio
radius: 25 radius: 25
color: "#FF4304" color: "#404040"
Image { Image {
width: 20 * scaleRatio width: 20 * scaleRatio
@ -127,16 +152,16 @@ ListView {
Layout.topMargin: 20 * scaleRatio Layout.topMargin: 20 * scaleRatio
Layout.leftMargin: 10 * scaleRatio Layout.leftMargin: 10 * scaleRatio
Text { Text {
font.family: "Arial" font.family: Style.fontMedium.name
font.pixelSize: 14 * scaleRatio font.pixelSize: 14 * scaleRatio
color: "#555555" color: Style.defaultFontColor
text: date text: date
} }
Text { Text {
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio font.pixelSize: 14 * scaleRatio
color: "#555555" color: Style.dimmedFontColor
text: time text: time
} }
@ -144,7 +169,7 @@ ListView {
Text { Text {
visible: confirmations < confirmationsRequired || isPending visible: confirmations < confirmationsRequired || isPending
Layout.leftMargin: 5 * scaleRatio Layout.leftMargin: 5 * scaleRatio
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio font.pixelSize: 14 * scaleRatio
color: (confirmations < confirmationsRequired)? "#FF6C3C" : "#545454" color: (confirmations < confirmationsRequired)? "#FF6C3C" : "#545454"
text: { text: {
@ -161,7 +186,6 @@ ListView {
} }
} }
// Amount & confirmations // Amount & confirmations
RowLayout { RowLayout {
Layout.leftMargin: 10 * scaleRatio Layout.leftMargin: 10 * scaleRatio
@ -169,7 +193,7 @@ ListView {
Text { Text {
font.family: "Arial" font.family: "Arial"
font.pixelSize: 14 * scaleRatio font.pixelSize: 14 * scaleRatio
color: isOut ? "#FF4F41" : "#36B05B" color: isOut ? Style.defaultFontColor : "#2eb358"
text: isOut ? "↓" : "↑" text: isOut ? "↓" : "↑"
} }
@ -177,7 +201,7 @@ ListView {
id: amountText id: amountText
font.family: "Arial" font.family: "Arial"
font.pixelSize: 18 * scaleRatio font.pixelSize: 18 * scaleRatio
color: isOut ? "#FF4F41" : "#36B05B" color: isOut ? Style.defaultFontColor : "#2eb358"
text: displayAmount text: displayAmount
} }
} }

View file

@ -0,0 +1,92 @@
// Copyright (c) 2014-2015, 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.0
import QtQuick.Layouts 1.1
import "." 1.0
Item {
id: inlineButton
height: rect.height * scaleRatio
property string shadowPressedColor: "#B32D00"
property string shadowReleasedColor: "#FF4304"
property string pressedColor: "#FF4304"
property string releasedColor: "#FF6C3C"
property string icon: ""
property string textColor: "#FFFFFF"
property int fontSize: 12 * scaleRatio
property alias text: inlineText.text
signal clicked()
function doClick() {
// Android workaround
releaseFocus();
clicked();
}
Rectangle{
id: rect
color: Style.buttonBackgroundColorDisabled
border.color: "black"
height: 28 * scaleRatio
width: inlineText.width + 22 * scaleRatio
radius: 4
anchors.top: parent.top
anchors.right: parent.right
Text {
id: inlineText
font.family: Style.fontBold.name
font.bold: true
font.pixelSize: 16 * scaleRatio
color: "black"
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
}
MouseArea {
id: buttonArea
cursorShape: rect.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
hoverEnabled: true
anchors.fill: parent
onClicked: doClick()
onEntered: {
rect.color = "#707070";
rect.opacity = 0.8;
}
onExited: {
rect.opacity = 1.0;
rect.color = "#808080";
}
}
}
Keys.onSpacePressed: doClick()
Keys.onReturnPressed: doClick()
}

View file

@ -26,21 +26,20 @@
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // 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. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick.Controls 1.2 import QtQuick.Controls 2.2
import QtQuick.Controls.Styles 1.2 import QtQuick 2.7
import QtQuick 2.2 import "." 1.0
TextField { TextField {
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 18 * scaleRatio
font.bold: true
horizontalAlignment: TextInput.AlignLeft horizontalAlignment: TextInput.AlignLeft
selectByMouse: true selectByMouse: true
style: TextFieldStyle { color: Style.defaultFontColor
textColor: "#3F3F3F"
placeholderTextColor: "#BABABA"
background: Rectangle { background: Rectangle {
border.width: 0
color: "transparent" color: "transparent"
} }
} }
}

View file

@ -26,8 +26,8 @@
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // 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. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.7
import QtQuick.Controls 1.4 import QtQuick.Controls 2.0
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Styles 1.4
@ -38,14 +38,6 @@ import "../components" as MoneroComponents
Item { Item {
id: root id: root
visible: false visible: false
Rectangle {
id: bg
z: parent.z + 1
anchors.fill: parent
color: "white"
opacity: 0.9
}
property alias labelText: label.text property alias labelText: label.text
property alias inputText: input.text property alias inputText: input.text
@ -78,42 +70,45 @@ Item {
ColumnLayout { ColumnLayout {
id: column id: column
//anchors {fill: parent; margins: 16 }
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: 400 * scaleRatio
Label { Label {
id: label id: label
Layout.alignment: Qt.AlignHCenter anchors.left: parent.left
// Layout.columnSpan: 2
Layout.fillWidth: true Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
font.pixelSize: 18 * scaleRatio font.pixelSize: 16 * scaleRatio
font.family: "Arial" font.family: Style.fontLight.name
color: "#555555"
color: Style.defaultFontColor
} }
TextField { TextField {
id : input id : input
focus: true focus: true
Layout.topMargin: 6
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter anchors.left: parent.left
horizontalAlignment: TextInput.AlignHCenter horizontalAlignment: TextInput.AlignLeft
verticalAlignment: TextInput.AlignVCenter verticalAlignment: TextInput.AlignVCenter
font.family: "Arial" font.family: Style.fontLight.name
font.pixelSize: 32 * scaleRatio font.pixelSize: 24 * scaleRatio
// echoMode: TextInput.Password
KeyNavigation.tab: okButton KeyNavigation.tab: okButton
bottomPadding: 10
leftPadding: 10
topPadding: 10
color: Style.defaultFontColor
style: TextFieldStyle {
renderType: Text.NativeRendering
textColor: "#35B05A"
// passwordCharacter: ""
// no background
background: Rectangle { background: Rectangle {
radius: 0 radius: 2
border.width: 0 border.color: Qt.rgba(255, 255, 255, 0.35)
} border.width: 1
color: "black"
} }
Keys.onReturnPressed: { Keys.onReturnPressed: {
root.close() root.close()
root.accepted() root.accepted()
@ -123,37 +118,19 @@ Item {
root.rejected() root.rejected()
} }
} }
// underline
Rectangle {
height: 1
color: "#DBDBDB"
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
anchors.bottomMargin: 3
}
// padding
Rectangle {
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
height: 10
opacity: 0
color: "black"
}
}
// Ok/Cancel buttons // Ok/Cancel buttons
RowLayout { RowLayout {
id: buttons id: buttons
spacing: 60 spacing: 16 * scaleRatio
Layout.alignment: Qt.AlignHCenter Layout.topMargin: 16
Layout.alignment: Qt.AlignRight
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: cancelButton id: cancelButton
small: true
width: 120 width: 120
fontSize: 14 fontSize: 14
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Cancel") + translationManager.emptyString text: qsTr("Cancel") + translationManager.emptyString
KeyNavigation.tab: input KeyNavigation.tab: input
onClicked: { onClicked: {
@ -163,12 +140,9 @@ Item {
} }
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: okButton id: okButton
small: true
width: 120 width: 120
fontSize: 14 fontSize: 14
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Ok") text: qsTr("Ok")
KeyNavigation.tab: cancelButton KeyNavigation.tab: cancelButton
onClicked: { onClicked: {
@ -179,3 +153,12 @@ Item {
} }
} }
} }
Rectangle {
id: bg
z: parent.z + 1
anchors.fill: parent
color: "black"
opacity: 0.8
}
}

68
components/InputMulti.qml Normal file
View file

@ -0,0 +1,68 @@
// Copyright (c) 2014-2015, 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.Controls 2.2
import QtQuick 2.7
import "../js/TxUtils.js" as TxUtils
import "." 1.0
TextArea {
property bool error: false
property bool addressValidation: false
property bool wrapAnywhere: true
property int fontSize: 18 * scaleRatio
property bool fontBold: false
id: textArea
font.family: Style.fontRegular.name
font.pixelSize: fontSize
font.bold: fontBold
horizontalAlignment: TextInput.AlignLeft
selectByMouse: true
color: Style.defaultFontColor
wrapMode: {
if(wrapAnywhere){
return Text.WrapAnywhere;
} else {
return Text.WordWrap;
}
}
onTextChanged: {
if(addressValidation){
// js replacement for `RegExpValidator { regExp: /[0-9A-Fa-f]{95}/g }`
textArea.text = textArea.text.replace(/[^a-z0-9]/gi,'');
var address_ok = TxUtils.checkAddress(textArea.text, appWindow.persistentSettings.nettype);
if(!address_ok) error = true;
else error = false;
TextArea.cursorPosition = textArea.text.length;
}
}
}

View file

@ -29,6 +29,8 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import "." 1.0
Item { Item {
id: item id: item
property alias text: label.text property alias text: label.text
@ -36,11 +38,14 @@ Item {
property alias textFormat: label.textFormat property alias textFormat: label.textFormat
property string tipText: "" property string tipText: ""
property int fontSize: 16 * scaleRatio property int fontSize: 16 * scaleRatio
property bool fontBold: false
property string fontColor: Style.defaultFontColor
property string fontFamily: ""
property alias wrapMode: label.wrapMode property alias wrapMode: label.wrapMode
property alias horizontalAlignment: label.horizontalAlignment property alias horizontalAlignment: label.horizontalAlignment
signal linkActivated() signal linkActivated()
width: icon.x + icon.width * scaleRatio height: label.height * scaleRatio
height: icon.height * scaleRatio width: label.width * scaleRatio
Layout.topMargin: 10 * scaleRatio Layout.topMargin: 10 * scaleRatio
Text { Text {
@ -48,38 +53,16 @@ Item {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.bottomMargin: 2 * scaleRatio anchors.bottomMargin: 2 * scaleRatio
anchors.left: parent.left anchors.left: parent.left
font.family: "Arial" font.family: {
if(fontFamily){
return fontFamily;
} else {
return Style.fontRegular.name;
}
}
font.pixelSize: fontSize font.pixelSize: fontSize
color: "#555555" font.bold: fontBold
color: fontColor
onLinkActivated: item.linkActivated() onLinkActivated: item.linkActivated()
} }
Image {
id: icon
anchors.verticalCenter: parent.verticalCenter
anchors.left: label.right
anchors.leftMargin: 5 * scaleRatio
source: "../images/whatIsIcon.png"
visible: appWindow.whatIsEnable
}
// MouseArea {
// anchors.fill: icon
// enabled: appWindow.whatIsEnable
// hoverEnabled: true
// onEntered: {
// icon.visible = false
// var pos = appWindow.mapFromItem(icon, 0, -15)
// tipItem.text = item.tipText
// tipItem.x = pos.x
// if(tipItem.height > 30)
// pos.y -= tipItem.height - 28
// tipItem.y = pos.y
// tipItem.visible = true
// }
// onExited: {
// icon.visible = Qt.binding(function(){ return appWindow.whatIsEnable; })
// tipItem.visible = false
// }
// }
} }

View file

@ -0,0 +1,73 @@
// Copyright (c) 2014-2015, 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.0
import QtQuick.Layouts 1.1
import "." 1.0
Rectangle {
signal clicked();
property alias text: labelButtonText.text
id: labelButton
color: "#808080"
radius: 3
height: 20
width: labelButtonText.width + 14
anchors.right: copyButton.left
anchors.rightMargin: 6
visible: isValidOpenAliasAddress(addressLine.text)
Text {
id: labelButtonText
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
font.family: Style.fontRegular.name
font.pixelSize: 12
font.bold: true
text: ""
color: "black"
}
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
hoverEnabled: true
onClicked: labelButton.clicked()
onEntered: {
labelButton.color = "#707070";
labelButtonText.opacity = 0.8;
}
onExited: {
labelButton.color = "#808080";
labelButtonText.opacity = 1.0;
}
}
}

View file

@ -0,0 +1,45 @@
// Copyright (c) 2014-2015, 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.0
import "." 1.0
Label {
id: item
fontSize: 17 * scaleRatio
Rectangle {
anchors.top: item.bottom
anchors.topMargin: 4
anchors.left: parent.left
anchors.right: parent.right
height: 2
color: Style.dividerColor
opacity: Style.dividerOpacity
}
}

View file

@ -27,54 +27,187 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.0
import "." 1.0
Item { Item {
id: item id: item
property alias placeholderText: input.placeholderText
property alias text: input.text property alias text: input.text
property alias placeholderText: placeholderLabel.text
property bool placeholderCenter: false
property string placeholderFontFamily: Style.fontRegular.name
property bool placeholderFontBold: false
property int placeholderFontSize: 18 * scaleRatio
property string placeholderColor: Style.defaultFontColor
property real placeholderOpacity: 0.25
property alias validator: input.validator property alias validator: input.validator
property alias readOnly : input.readOnly property alias readOnly : input.readOnly
property alias cursorPosition: input.cursorPosition property alias cursorPosition: input.cursorPosition
property alias echoMode: input.echoMode property alias echoMode: input.echoMode
property alias inlineButton: inlineButtonId
property alias inlineButtonText: inlineButtonId.text
property alias inlineIcon: inlineIcon.visible
property bool copyButton: false
property string borderColor: {
if(input.activeFocus){
return Qt.rgba(255, 255, 255, 0.35);
} else {
return Qt.rgba(255, 255, 255, 0.25);
}
}
property bool borderDisabled: false
property int fontSize: 18 * scaleRatio property int fontSize: 18 * scaleRatio
property bool showBorder: true property bool showBorder: true
property bool fontBold: false
property alias fontColor: input.color
property bool error: false property bool error: false
signal editingFinished() property alias labelText: inputLabel.text
property alias labelColor: inputLabel.color
property alias labelTextFormat: inputLabel.textFormat
property string backgroundColor: "transparent"
property string tipText: ""
property int labelFontSize: 16 * scaleRatio
property bool labelFontBold: false
property alias labelWrapMode: inputLabel.wrapMode
property alias labelHorizontalAlignment: inputLabel.horizontalAlignment
property bool showingHeader: inputLabel.text !== "" || copyButton
property int inputHeight: 42 * scaleRatio
signal labelLinkActivated(); // input label, rich text <a> signal
signal editingFinished();
signal accepted(); signal accepted();
signal textUpdated(); signal textUpdated();
height: 37 * scaleRatio height: showingHeader ? (inputLabel.height + inputItem.height + 2) * scaleRatio : 42 * scaleRatio
function getColor(error) { onTextUpdated: {
if (error) // check to remove placeholder text when there is content
return "#FFDDDD" if(item.isEmpty()){
else placeholderLabel.visible = true;
return "#FFFFFF" } else {
placeholderLabel.visible = false;
}
} }
Rectangle { function isEmpty(){
visible: showBorder var val = input.text;
if(val === "") {
return true;
}
else {
return false;
}
}
Text {
id: inputLabel
anchors.top: parent.top
anchors.left: parent.left
anchors.topMargin: 2 * scaleRatio
font.family: Style.fontLight.name
font.pixelSize: labelFontSize
font.bold: labelFontBold
textFormat: Text.RichText
color: Style.defaultFontColor
onLinkActivated: item.labelLinkActivated()
MouseArea {
anchors.fill: parent anchors.fill: parent
anchors.bottomMargin: 1 * scaleRatio acceptedButtons: Qt.NoButton
color: "#DBDBDB" cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
//radius: 4 }
}
LabelButton {
id: copyButtonId
text: qsTr("Copy")
anchors.right: parent.right
onClicked: {
if (input.text.length > 0) {
console.log("Copied to clipboard");
clipboard.setText(input.text);
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3);
}
}
visible: copyButton && input.text !== ""
}
Item{
id: inputItem
height: inputHeight * scaleRatio
anchors.top: showingHeader ? inputLabel.bottom : parent.top
anchors.topMargin: showingHeader ? 12 * scaleRatio : 2 * scaleRatio
width: parent.width
Text {
id: placeholderLabel
visible: input.text ? false : true
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: placeholderCenter ? parent.horizontalCenter : undefined
anchors.left: placeholderCenter ? undefined : parent.left
anchors.leftMargin: {
if(placeholderCenter){
return undefined;
}
else if(inlineIcon.visible){ return 50 * scaleRatio; }
else { return 10 * scaleRatio; }
}
opacity: item.placeholderOpacity
color: item.placeholderColor
font.family: item.placeholderFontFamily
font.pixelSize: placeholderFontSize * scaleRatio
font.bold: item.placeholderFontBold
text: ""
z: 3
} }
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.topMargin: 1 * scaleRatio anchors.topMargin: 1 * scaleRatio
color: getColor(error) color: "transparent"
//radius: 4 }
Rectangle {
id: inputFill
color: backgroundColor
anchors.fill: parent
border.width: borderDisabled ? 0 : 1
border.color: borderColor
radius: 4
}
Image {
id: inlineIcon
width: 26 * scaleRatio
height: 26 * scaleRatio
anchors.top: parent.top
anchors.topMargin: 8 * scaleRatio
anchors.left: parent.left
anchors.leftMargin: 12 * scaleRatio
source: "../images/moneroIcon-28x28.png"
visible: false
} }
Input { Input {
id: input id: input
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: 4 * scaleRatio anchors.leftMargin: inlineIcon.visible ? 38 : 0
anchors.rightMargin: 30 * scaleRatio font.pixelSize: item.fontSize
font.pixelSize: parent.fontSize font.bold: item.fontBold
onEditingFinished: item.editingFinished() onEditingFinished: item.editingFinished()
onAccepted: item.accepted(); onAccepted: item.accepted();
onTextChanged: item.textUpdated() onTextChanged: item.textUpdated()
} }
InlineButton {
id: inlineButtonId
visible: item.inlineButtonText ? true : false
anchors.right: parent.right
anchors.rightMargin: 8 * scaleRatio
anchors.top: parent.top
anchors.topMargin: 6 * scaleRatio
}
}
} }

View file

@ -0,0 +1,140 @@
// Copyright (c) 2014-2015, 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.0
import QtQuick.Layouts 1.1
import "." 1.0
ColumnLayout {
id: lineditmulti
property alias text: multiLine.text
property alias placeholderText: placeholderLabel.text
property alias labelText: inputLabel.text
property alias error: multiLine.error
property alias readOnly: multiLine.readOnly
property alias addressValidation: multiLine.addressValidation
property alias labelButtonText: labelButton.text
property bool labelFontBold: false
property bool labelButtonVisible: false
property bool copyButton: false
property bool wrapAnywhere: true
property bool showingHeader: true
property bool showBorder: true
property bool fontBold: false
property int fontSize: 16 * scaleRatio
signal labelButtonClicked();
signal inputLabelLinkActivated();
spacing: 0
Rectangle {
id: inputLabelRect
color: "transparent"
Layout.fillWidth: true
height: (inputLabel.height + 10) * scaleRatio
visible: showingHeader ? true : false
Text {
id: inputLabel
anchors.top: parent.top
anchors.left: parent.left
font.family: Style.fontRegular.name
font.pixelSize: 16 * scaleRatio
font.bold: labelFontBold
textFormat: Text.RichText
color: Style.defaultFontColor
onLinkActivated: inputLabelLinkActivated()
}
LabelButton {
id: labelButton
onClicked: labelButtonClicked()
visible: labelButtonVisible
}
LabelButton {
id: copyButtonId
visible: copyButton && multiLine.text !== ""
text: qsTr("Copy")
anchors.right: labelButton.visible ? inputLabel.right : parent.right
anchors.rightMargin: labelButton.visible? 4 : 0
onClicked: {
if (multiLine.text.length > 0) {
console.log("Copied to clipboard");
clipboard.setText(multiLine.text);
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3);
}
}
}
}
InputMulti {
id: multiLine
readOnly: false
addressValidation: true
anchors.top: parent.showingHeader ? inputLabelRect.bottom : parent.top
Layout.fillWidth: true
topPadding: parent.showingHeader ? 10 * scaleRatio : 0
bottomPadding: 10 * scaleRatio
wrapAnywhere: parent.wrapAnywhere
fontSize: parent.fontSize
fontBold: parent.fontBold
Text {
id: placeholderLabel
visible: multiLine.text ? false : true
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 10 * scaleRatio
opacity: 0.25
color: Style.defaultFontColor
font.family: Style.fontRegular.name
font.pixelSize: 18 * scaleRatio
text: ""
z: 3
}
Rectangle {
color: "transparent"
border.width: 1
border.color: {
if(multiLine.error && multiLine.text !== ""){
return Qt.rgba(255, 0, 0, 0.45);
} else if(multiLine.activeFocus){
return Qt.rgba(255, 255, 255, 0.35);
} else {
return Qt.rgba(255, 255, 255, 0.25);
}
}
radius: 4
anchors.fill: parent
visible: lineditmulti.showBorder
}
}
}

View file

@ -26,7 +26,8 @@
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // 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. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.5
import "." 1.0
Rectangle { Rectangle {
id: button id: button
@ -55,9 +56,91 @@ Rectangle {
return offset return offset
} }
color: checked ? "#FFFFFF" : "#1C1C1C" color: "transparent"
property bool present: !under || under.checked || checked || under.numSelectedChildren > 0 property bool present: !under || under.checked || checked || under.numSelectedChildren > 0
height: present ? ((appWindow.height >= 800) ? 48 * scaleRatio : 36 * scaleRatio ) : 0 height: present ? ((appWindow.height >= 800) ? 44 * scaleRatio : 38 * scaleRatio ) : 0
// button gradient while checked
Image {
height: parent.height
width: 260
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: -20
anchors.leftMargin: parent.getOffset()
source: "../images/menuButtonGradient.png"
visible: button.checked
}
// button decorations that are subject to leftMargin offsets
Rectangle {
anchors.left: parent.left
anchors.leftMargin: parent.getOffset() + 20 * scaleRatio
height: parent.height
width: button.checked ? 20: 10
color: "#00000000"
// dot if unchecked
Rectangle {
id: dot
anchors.centerIn: parent
width: button.checked ? 20 * scaleRatio : 8 * scaleRatio
height: button.checked ? 20 * scaleRatio : 8 * scaleRatio
radius: button.checked ? 20 * scaleRatio : 4 * scaleRatio
color: button.dotColor
// arrow if checked
Image {
anchors.centerIn: parent
anchors.left: parent.left
source: "../images/arrow-right-medium-white.png"
visible: button.checked
}
}
// button text
Text {
id: label
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.right
anchors.leftMargin: 8 * scaleRatio
font.family: Style.fontMedium.name
font.bold: true
font.pixelSize: 16 * scaleRatio
color: "#FFFFFF"
}
}
// menu button right arrow
Image {
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 20 * scaleRatio
anchors.leftMargin: parent.getOffset()
source: "../images/right.png"
opacity: button.checked ? 1.0 : 0.4
}
Text {
id: symbolText
anchors.centerIn: parent
font.pixelSize: 11 * scaleRatio
font.bold: true
color: button.checked || buttonArea.containsMouse ? "#FFFFFF" : dot.color
visible: appWindow.ctrlPressed
}
MouseArea {
id: buttonArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
if(parent.checked)
return
button.doClick()
parent.checked = true
}
}
transform: Scale { transform: Scale {
yScale: button.present ? 1 : 0 yScale: button.present ? 1 : 0
@ -77,77 +160,4 @@ Rectangle {
// we get the value of checked before the change // we get the value of checked before the change
ScriptAction { script: if (under) under.numSelectedChildren += checked > 0 ? -1 : 1 } ScriptAction { script: if (under) under.numSelectedChildren += checked > 0 ? -1 : 1 }
} }
Item {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.leftMargin: parent.getOffset()
width: 50 * scaleRatio
Rectangle {
id: dot
anchors.centerIn: parent
width: 14 * scaleRatio
height: width
radius: height / 2
Rectangle {
anchors.centerIn: parent
width: 10 * scaleRatio
height: width
radius: height / 2
color: "#1C1C1C"
visible: !button.checked && !buttonArea.containsMouse
}
}
Text {
id: symbolText
anchors.centerIn: parent
font.pixelSize: 11 * scaleRatio
font.bold: true
color: button.checked || buttonArea.containsMouse ? "#FFFFFF" : dot.color
visible: appWindow.ctrlPressed
}
}
Rectangle {
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
width: 1
color: "#DBDBDB"
visible: parent.checked
}
Image {
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 20 * scaleRatio
anchors.leftMargin: parent.getOffset()
source: "../images/menuIndicator.png"
}
Text {
id: label
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: parent.getOffset() + 50 * scaleRatio
font.family: "Arial"
font.pixelSize: 16 * scaleRatio
color: parent.checked ? "#000000" : "#FFFFFF"
}
MouseArea {
id: buttonArea
anchors.fill: parent
hoverEnabled: true
onClicked: {
if(parent.checked)
return
button.doClick()
parent.checked = true
}
}
} }

View file

@ -27,26 +27,15 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Layouts 1.1
import moneroComponents.Wallet 1.0 import moneroComponents.Wallet 1.0
import "." 1.0
Rectangle { Rectangle {
id: item id: item
color: "transparent"
property var connected: Wallet.ConnectionStatus_Disconnected property var connected: Wallet.ConnectionStatus_Disconnected
function getConnectionStatusImage(status) {
if (status == Wallet.ConnectionStatus_Connected)
return "../images/statusConnected.png"
else
return "../images/statusDisconnected.png"
}
function getConnectionStatusColor(status) {
if (status == Wallet.ConnectionStatus_Connected)
return "#FF6C3B"
else
return "#AAAAAA"
}
function getConnectionStatusString(status) { function getConnectionStatusString(status) {
if (status == Wallet.ConnectionStatus_Connected) { if (status == Wallet.ConnectionStatus_Connected) {
if(!appWindow.daemonSynced) if(!appWindow.daemonSynced)
@ -62,40 +51,64 @@ Rectangle {
return qsTr("Invalid connection status") return qsTr("Invalid connection status")
} }
RowLayout {
Layout.preferredHeight: 40 * scaleRatio
color: "#1C1C1C"
Row {
height: 60 * scaleRatio
Item { Item {
id: iconItem id: iconItem
anchors.bottom: parent.bottom anchors.top: parent.top
width: 50 * scaleRatio width: 40 * scaleRatio
height: 50 * scaleRatio height: 40 * scaleRatio
opacity: {
if(item.connected == Wallet.ConnectionStatus_Connected){
return 1
} else {
return 0.5
}
}
Image { Image {
anchors.centerIn: parent anchors.top: parent.top
source: getConnectionStatusImage(item.connected) anchors.topMargin: 6
anchors.right: parent.right
anchors.rightMargin: 11
source: {
if(item.connected == Wallet.ConnectionStatus_Connected){
return "../images/lightning.png"
} else {
return "../images/lightning-white.png"
}
}
} }
} }
Column { Item {
anchors.bottom: parent.bottom anchors.top: parent.top
height: 53 * scaleRatio anchors.left: iconItem.right
spacing: 3 * scaleRatio height: 40 * scaleRatio
width: 260 * scaleRatio
Text { Text {
id: statusText
anchors.left: parent.left anchors.left: parent.left
font.family: "Arial" anchors.top: parent.top
font.pixelSize: 12 * scaleRatio anchors.topMargin: 0
color: "#545454" font.family: Style.fontMedium.name
font.bold: true
font.pixelSize: 13 * scaleRatio
color: "white"
opacity: 0.5
text: qsTr("Network status") + translationManager.emptyString text: qsTr("Network status") + translationManager.emptyString
} }
Text { Text {
id: statusTextVal
anchors.left: parent.left anchors.left: parent.left
font.family: "Arial" anchors.top: parent.top
font.pixelSize: 18 * scaleRatio anchors.topMargin: 14
color: getConnectionStatusColor(item.connected) font.family: Style.fontMedium.name
font.pixelSize: 20 * scaleRatio
color: "white"
text: getConnectionStatusString(item.connected) + translationManager.emptyString text: getConnectionStatusString(item.connected) + translationManager.emptyString
} }
} }

View file

@ -26,8 +26,8 @@
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // 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. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.7
import QtQuick.Controls 1.4 import QtQuick.Controls 2.0
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Styles 1.4
@ -42,8 +42,8 @@ Item {
id: bg id: bg
z: parent.z + 1 z: parent.z + 1
anchors.fill: parent anchors.fill: parent
color: "white" color: "black"
opacity: 0.9 opacity: 0.8
} }
property alias password: passwordInput1.text property alias password: passwordInput1.text
@ -93,57 +93,60 @@ Item {
ColumnLayout { ColumnLayout {
id: column id: column
//anchors {fill: parent; margins: 16 }
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: 400 * scaleRatio
Label { Label {
text: qsTr("Please enter new password") text: qsTr("Please enter new password")
Layout.alignment: Qt.AlignHCenter anchors.left: parent.left
Layout.columnSpan: 2
Layout.fillWidth: true Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
font.pixelSize: 18 * scaleRatio font.pixelSize: 16 * scaleRatio
font.family: "Arial" font.family: Style.fontLight.name
color: "#555555"
color: Style.defaultFontColor
} }
TextField { TextField {
id : passwordInput1 id : passwordInput1
Layout.topMargin: 6
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter anchors.left: parent.left
Layout.maximumWidth: 400 * scaleRatio horizontalAlignment: TextInput.AlignLeft
horizontalAlignment: TextInput.AlignHCenter
verticalAlignment: TextInput.AlignVCenter verticalAlignment: TextInput.AlignVCenter
font.family: "Arial" font.family: Style.fontLight.name
font.pixelSize: 32 * scaleRatio font.pixelSize: 24 * scaleRatio
echoMode: TextInput.Password echoMode: TextInput.Password
bottomPadding: 10
leftPadding: 10
topPadding: 10
color: Style.defaultFontColor
KeyNavigation.tab: passwordInput2 KeyNavigation.tab: passwordInput2
style: TextFieldStyle {
renderType: Text.NativeRendering
textColor: "#35B05A"
passwordCharacter: "•"
// no background
background: Rectangle { background: Rectangle {
radius: 0 radius: 2
border.width: 0 border.color: Qt.rgba(255, 255, 255, 0.35)
border.width: 1
color: "black"
Image {
width: 12
height: 16
source: "../images/lockIcon.png"
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 20
} }
} }
Keys.onEscapePressed: { Keys.onEscapePressed: {
root.close() root.close()
root.rejected() root.rejected()
} }
} }
// underline
Rectangle {
height: 1
color: "#DBDBDB"
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
anchors.bottomMargin: 3
Layout.maximumWidth: passwordInput1.width
}
// padding // padding
Rectangle { Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
@ -155,37 +158,47 @@ Item {
Label { Label {
text: qsTr("Please confirm new password") text: qsTr("Please confirm new password")
Layout.alignment: Qt.AlignHCenter anchors.left: parent.left
Layout.columnSpan: 2
Layout.fillWidth: true Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
font.pixelSize: 18 * scaleRatio font.pixelSize: 16 * scaleRatio
font.family: "Arial" font.family: Style.fontLight.name
color: "#555555"
color: Style.defaultFontColor
} }
TextField { TextField {
id : passwordInput2 id : passwordInput2
Layout.topMargin: 6
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter anchors.left: parent.left
Layout.maximumWidth: 400 * scaleRatio horizontalAlignment: TextInput.AlignLeft
horizontalAlignment: TextInput.AlignHCenter
verticalAlignment: TextInput.AlignVCenter verticalAlignment: TextInput.AlignVCenter
font.family: "Arial" font.family: Style.fontLight.name
font.pixelSize: 32 * scaleRatio font.pixelSize: 24 * scaleRatio
echoMode: TextInput.Password echoMode: TextInput.Password
KeyNavigation.tab: okButton KeyNavigation.tab: okButton
bottomPadding: 10
leftPadding: 10
topPadding: 10
color: Style.defaultFontColor
style: TextFieldStyle {
renderType: Text.NativeRendering
textColor: "#35B05A"
passwordCharacter: "•"
// no background
background: Rectangle { background: Rectangle {
radius: 0 radius: 2
border.width: 0 border.color: Qt.rgba(255, 255, 255, 0.35)
border.width: 1
color: "black"
Image {
width: 12
height: 16
source: "../images/lockIcon.png"
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 20
} }
} }
Keys.onReturnPressed: { Keys.onReturnPressed: {
if (passwordInput1.text === passwordInput2.text) { if (passwordInput1.text === passwordInput2.text) {
root.close() root.close()
@ -198,15 +211,6 @@ Item {
} }
} }
// underline
Rectangle {
height: 1
color: "#DBDBDB"
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
anchors.bottomMargin: 3
Layout.maximumWidth: passwordInput1.width
}
// padding // padding
Rectangle { Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
@ -215,19 +219,16 @@ Item {
opacity: 0 opacity: 0
color: "black" color: "black"
} }
}
// Ok/Cancel buttons // Ok/Cancel buttons
RowLayout { RowLayout {
id: buttons id: buttons
spacing: 60 * scaleRatio spacing: 16 * scaleRatio
Layout.alignment: Qt.AlignHCenter Layout.topMargin: 16
Layout.alignment: Qt.AlignRight
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: cancelButton id: cancelButton
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Cancel") + translationManager.emptyString text: qsTr("Cancel") + translationManager.emptyString
KeyNavigation.tab: passwordInput1 KeyNavigation.tab: passwordInput1
onClicked: { onClicked: {
@ -237,10 +238,6 @@ Item {
} }
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: okButton id: okButton
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Continue") text: qsTr("Continue")
KeyNavigation.tab: cancelButton KeyNavigation.tab: cancelButton
enabled: passwordInput1.text === passwordInput2.text enabled: passwordInput1.text === passwordInput2.text
@ -252,3 +249,4 @@ Item {
} }
} }
} }
}

View file

@ -26,8 +26,8 @@
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // 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. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.7
import QtQuick.Controls 1.4 import QtQuick.Controls 2.0
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Styles 1.4
@ -38,13 +38,6 @@ import "../components" as MoneroComponents
Item { Item {
id: root id: root
visible: false visible: false
Rectangle {
id: bg
z: parent.z + 1
anchors.fill: parent
color: "white"
opacity: 0.9
}
property alias password: passwordInput.text property alias password: passwordInput.text
property string walletName property string walletName
@ -61,7 +54,7 @@ Item {
titleBar.enabled = false titleBar.enabled = false
show() show()
root.visible = true; root.visible = true;
passwordInput.focus = true passwordInput.forceActiveFocus();
passwordInput.text = "" passwordInput.text = ""
} }
@ -81,42 +74,54 @@ Item {
ColumnLayout { ColumnLayout {
id: column id: column
//anchors {fill: parent; margins: 16 }
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: 400 * scaleRatio
Label { Label {
text: root.walletName.length > 0 ? qsTr("Please enter wallet password for:<br>") + root.walletName : qsTr("Please enter wallet password") text: qsTr("Please enter wallet password")
Layout.alignment: Qt.AlignHCenter anchors.left: parent.left
Layout.columnSpan: 2
Layout.fillWidth: true Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
font.pixelSize: 18 * scaleRatio font.pixelSize: 16 * scaleRatio
font.family: "Arial" font.family: Style.fontLight.name
color: "#555555"
color: Style.defaultFontColor
} }
TextField { TextField {
id : passwordInput id : passwordInput
Layout.topMargin: 6
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter anchors.left: parent.left
Layout.maximumWidth: 400 * scaleRatio horizontalAlignment: TextInput.AlignLeft
horizontalAlignment: TextInput.AlignHCenter
verticalAlignment: TextInput.AlignVCenter verticalAlignment: TextInput.AlignVCenter
font.family: "Arial" font.family: Style.fontLight.name
font.pixelSize: 32 * scaleRatio font.pixelSize: 24 * scaleRatio
echoMode: TextInput.Password echoMode: TextInput.Password
KeyNavigation.tab: okButton KeyNavigation.tab: okButton
bottomPadding: 10
leftPadding: 10
topPadding: 10
color: Style.defaultFontColor
style: TextFieldStyle {
renderType: Text.NativeRendering
textColor: "#35B05A"
passwordCharacter: "•"
// no background
background: Rectangle { background: Rectangle {
radius: 0 radius: 2
border.width: 0 border.color: Qt.rgba(255, 255, 255, 0.35)
border.width: 1
color: "black"
Image {
width: 12
height: 16
source: "../images/lockIcon.png"
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 20
} }
} }
Keys.onReturnPressed: { Keys.onReturnPressed: {
root.close() root.close()
root.accepted() root.accepted()
@ -127,32 +132,18 @@ Item {
root.rejected() root.rejected()
} }
} }
// underline
Rectangle {
height: 1
color: "#DBDBDB"
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
anchors.bottomMargin: 3
Layout.maximumWidth: passwordInput.width
}
}
// Ok/Cancel buttons // Ok/Cancel buttons
RowLayout { RowLayout {
id: buttons id: buttons
spacing: 60 * scaleRatio spacing: 16 * scaleRatio
Layout.alignment: Qt.AlignHCenter Layout.topMargin: 16
Layout.alignment: Qt.AlignRight
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: cancelButton id: cancelButton
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Cancel") + translationManager.emptyString text: qsTr("Cancel") + translationManager.emptyString
KeyNavigation.tab: passwordInput KeyNavigation.tab: passwordInput
onClicked: { onClicked: {
@ -160,12 +151,10 @@ Item {
root.rejected() root.rejected()
} }
} }
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: okButton id: okButton
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Continue") text: qsTr("Continue")
KeyNavigation.tab: cancelButton KeyNavigation.tab: cancelButton
onClicked: { onClicked: {
@ -174,5 +163,14 @@ Item {
} }
} }
} }
}
}
Rectangle {
id: bg
anchors.fill: parent
color: "black"
opacity: 0.8
} }
} }

View file

@ -28,13 +28,15 @@
import QtQuick 2.0 import QtQuick 2.0
import moneroComponents.Wallet 1.0 import moneroComponents.Wallet 1.0
import "." 1.0
Rectangle { Rectangle {
id: item id: item
property int fillLevel: 0 property int fillLevel: 0
property string syncType // Wallet or Daemon property string syncType // Wallet or Daemon
property string syncText: qsTr("%1 blocks remaining: ").arg(syncType) property string syncText: qsTr("%1 blocks remaining: ").arg(syncType)
color: "#1C1C1C" visible: false
color: "transparent"
function updateProgress(currentBlock,targetBlock, blocksToSync, statusTxt){ function updateProgress(currentBlock,targetBlock, blocksToSync, statusTxt){
if(targetBlock > 0) { if(targetBlock > 0) {
@ -50,33 +52,58 @@ Rectangle {
} }
Item { Item {
anchors.top: item.top
anchors.topMargin: 10 * scaleRatio
anchors.leftMargin: 15 * scaleRatio anchors.leftMargin: 15 * scaleRatio
anchors.rightMargin: 15 * scaleRatio anchors.rightMargin: 15 * scaleRatio
anchors.fill: parent anchors.fill: parent
Text {
id: progressText
anchors.top: parent.top
anchors.topMargin: 6
font.family: Style.fontMedium.name
font.pixelSize: 13 * scaleRatio
font.bold: true
color: "white"
text: qsTr("Synchronizing %1").arg(syncType)
height: 18 * scaleRatio
}
Text {
id: progressTextValue
anchors.top: parent.top
anchors.topMargin: 6
anchors.right: parent.right
font.family: Style.fontMedium.name
font.pixelSize: 13 * scaleRatio
font.bold: true
color: "white"
height:18 * scaleRatio
}
Rectangle { Rectangle {
id: bar id: bar
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: progressText.bottom
height: 22 * scaleRatio anchors.topMargin: 4
radius: 2 * scaleRatio height: 8 * scaleRatio
color: "#FFFFFF" radius: 8 * scaleRatio
color: "#333333" // progressbar bg
Rectangle { Rectangle {
id: fillRect id: fillRect
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.margins: 2 * scaleRatio
height: bar.height height: bar.height
property int maxWidth: parent.width - 4 * scaleRatio property int maxWidth: bar.width - 4 * scaleRatio
width: (maxWidth * fillLevel) / 100 width: (maxWidth * fillLevel) / 100
color: { radius: 8
if(item.fillLevel < 99 ) return "#FF6C3C" // could change color based on progressbar status; if(item.fillLevel < 99 )
//if(item.fillLevel < 99) return "#FFE00A" color: "#FA6800"
return "#36B25C"
}
} }
Rectangle { Rectangle {
@ -84,16 +111,6 @@ Rectangle {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 8 * scaleRatio anchors.leftMargin: 8 * scaleRatio
Text {
id:progressText
anchors.bottom: parent.bottom
font.family: "Arial"
font.pixelSize: 12 * scaleRatio
color: "#000"
text: qsTr("Synchronizing %1").arg(syncType)
height:18 * scaleRatio
}
} }
} }

View file

@ -33,9 +33,25 @@ import QtQuick.Layouts 1.1
GridLayout { GridLayout {
columns: (isMobile) ? 1 : 2 columns: (isMobile) ? 1 : 2
columnSpacing: 32
id: root id: root
property alias daemonAddrText: daemonAddr.text property alias daemonAddrText: daemonAddr.text
property alias daemonPortText: daemonPort.text property alias daemonPortText: daemonPort.text
property alias daemonAddrLabelText: daemonAddr.labelText
property alias daemonPortLabelText: daemonPort.labelText
// TODO: LEGACY; remove these placeHolder variables when
// the wizards get redesigned to the black-theme
property string placeholderFontFamily: Style.fontRegular.name
property bool placeholderFontBold: false
property int placeholderFontSize: 18 * scaleRatio
property string placeholderColor: Style.defaultFontColor
property real placeholderOpacity: 0.25
property string lineEditBorderColor: Qt.rgba(0, 0, 0, 0.15)
property string lineEditBackgroundColor: "white"
property string lineEditFontColor: "black"
property bool lineEditFontBold: true
signal editingFinished() signal editingFinished()
@ -47,14 +63,31 @@ GridLayout {
id: daemonAddr id: daemonAddr
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: qsTr("Remote Node Hostname / IP") + translationManager.emptyString placeholderText: qsTr("Remote Node Hostname / IP") + translationManager.emptyString
placeholderFontFamily: root.placeholderFontFamily
placeholderFontBold: root.placeholderFontBold
placeholderFontSize: root.placeholderFontSize
placeholderColor: root.placeholderColor
placeholderOpacity: root.placeholderOpacity
onEditingFinished: root.editingFinished() onEditingFinished: root.editingFinished()
borderColor: lineEditBorderColor
backgroundColor: lineEditBackgroundColor
fontColor: lineEditFontColor
fontBold: lineEditFontBold
} }
LineEdit { LineEdit {
id: daemonPort id: daemonPort
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: qsTr("Port") + translationManager.emptyString placeholderText: qsTr("Port") + translationManager.emptyString
placeholderFontFamily: root.placeholderFontFamily
placeholderFontBold: root.placeholderFontBold
placeholderFontSize: root.placeholderFontSize
placeholderColor: root.placeholderColor
placeholderOpacity: root.placeholderOpacity
onEditingFinished: root.editingFinished() onEditingFinished: root.editingFinished()
borderColor: lineEditBorderColor
backgroundColor: lineEditBackgroundColor
fontColor: lineEditFontColor
fontBold: lineEditFontBold
} }
} }

View file

@ -51,7 +51,7 @@ Item {
Rectangle { Rectangle {
id: scroll id: scroll
width: 15 width: 4
height: { height: {
var t = (flickable.height * flickable.height) / flickable.contentHeight var t = (flickable.height * flickable.height) / flickable.contentHeight
return t < 20 ? 20 : t return t < 20 ? 20 : t
@ -62,7 +62,7 @@ Item {
visible: flickable.contentHeight > flickable.height visible: flickable.contentHeight > flickable.height
Behavior on opacity { Behavior on opacity {
NumberAnimation { duration: 100; easing.type: Easing.InQuad } NumberAnimation { duration: 200; easing.type: Easing.InQuad }
} }
MouseArea { MouseArea {

View file

@ -28,22 +28,25 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import "." 1.0
Item { Item {
id: button id: button
height: 37 * scaleRatio property string rightIcon: ""
property string shadowPressedColor: "#B32D00"
property string shadowReleasedColor: "#FF4304"
property string pressedColor: "#FF4304"
property string releasedColor: "#FF6C3C"
property string icon: "" property string icon: ""
property string textColor: "#FFFFFF" property string textColor: button.enabled? Style.buttonTextColor: Style.buttonTextColorDisabled
property int fontSize: 12 * scaleRatio property bool small: false
property alias text: label.text property alias text: label.text
property int fontSize: {
if(small) return 14 * scaleRatio;
else return 16 * scaleRatio;
}
signal clicked() signal clicked()
// Dynamic label width // Dynamic height/width
Layout.minimumWidth: (label.contentWidth > 50)? label.contentWidth + 10 : 60 Layout.minimumWidth: (label.contentWidth > 50)? label.contentWidth + 22 : 60
height: small ? 30 * scaleRatio : 36 * scaleRatio
function doClick() { function doClick() {
// Android workaround // Android workaround
@ -55,30 +58,27 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
height: parent.height - 1 height: parent.height - 1
y: buttonArea.pressed ? 0 : 1 radius: 3
//radius: 4 color: parent.enabled ? Style.buttonBackgroundColor : Style.buttonBackgroundColorDisabled
color: {
parent.enabled ? (buttonArea.pressed ? parent.shadowPressedColor : parent.shadowReleasedColor)
: Qt.lighter(parent.shadowReleasedColor)
}
border.color: Qt.darker(parent.releasedColor)
border.width: parent.focus ? 1 : 0 border.width: parent.focus ? 1 : 0
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
propagateComposedEvents: true
// possibly do some hover effects here
onEntered: {
// if(button.enabled) parent.color = Style.buttonBackgroundColorHover;
// else parent.color = Style.buttonBackgroundColorDisabledHover;
}
onExited: {
// if(button.enabled) parent.color = Style.buttonBackgroundColor;
// else parent.color = Style.buttonBackgroundColorDisabled;
} }
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
height: parent.height - 1
y: buttonArea.pressed ? 1 : 0
color: {
parent.enabled ? (buttonArea.pressed ? parent.pressedColor : parent.releasedColor)
: Qt.lighter(parent.releasedColor)
} }
//radius: 4
} }
Text { Text {
@ -87,12 +87,11 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
font.family: "Arial" font.family: Style.fontBold.name
font.bold: true font.bold: true
font.pixelSize: button.fontSize font.pixelSize: buttonArea.pressed ? button.fontSize - 1 : button.fontSize
color: parent.textColor color: parent.textColor
visible: parent.icon === "" visible: parent.icon === ""
// font.capitalization : Font.Capitalize
} }
Image { Image {
@ -105,6 +104,7 @@ Item {
id: buttonArea id: buttonArea
anchors.fill: parent anchors.fill: parent
onClicked: doClick() onClicked: doClick()
cursorShape: Qt.PointingHandCursor
} }
Keys.onSpacePressed: doClick() Keys.onSpacePressed: doClick()

View file

@ -27,17 +27,19 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.4 import QtQuick.Controls 2.0
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Styles 1.4
import QtQuick.Window 2.0 import QtQuick.Window 2.0
import "../components" as MoneroComponents import "../components" as MoneroComponents
import "." 1.0
Rectangle { Rectangle {
id: root id: root
color: "white" color: "transparent"
visible: false visible: false
property alias title: dialogTitle.text property alias title: dialogTitle.text
property alias text: dialogContent.text property alias text: dialogContent.text
@ -55,6 +57,14 @@ Rectangle {
signal rejected() signal rejected()
signal closeCallback(); signal closeCallback();
Image {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom
source: "../images/middlePanelBg.jpg"
}
// Make window draggable // Make window draggable
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
@ -68,7 +78,7 @@ Rectangle {
// Center // Center
if(!isMobile) { if(!isMobile) {
root.x = parent.width/2 - root.width/2 root.x = parent.width/2 - root.width/2
root.y = screenHeight/2 - root.height/2 root.y = 100
} }
show() show()
root.z = 11 root.z = 11
@ -81,13 +91,13 @@ Rectangle {
} }
// TODO: implement without hardcoding sizes // TODO: implement without hardcoding sizes
width: isMobile ? screenWidth : 480 width: isMobile ? screenWidth : 520
height: isMobile ? screenHeight : 280 height: isMobile ? screenHeight : 380
ColumnLayout { ColumnLayout {
id: mainLayout id: mainLayout
spacing: 10 spacing: 10
anchors { fill: parent; margins: 35 } anchors { fill: parent; margins: 15 }
RowLayout { RowLayout {
id: column id: column
@ -97,9 +107,9 @@ Rectangle {
Label { Label {
id: dialogTitle id: dialogTitle
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
font.pixelSize: 18 * scaleRatio fontSize: 18 * scaleRatio
font.family: "Arial" fontFamily: "Arial"
color: "#555555" color: Style.defaultFontColor
} }
} }
@ -109,12 +119,14 @@ Rectangle {
id : dialogContent id : dialogContent
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
font.family: "Arial" renderType: Text.QtRendering
font.family: Style.fontLight.name
textFormat: TextEdit.AutoText textFormat: TextEdit.AutoText
readOnly: true readOnly: true
font.pixelSize: 12 * scaleRatio font.pixelSize: 14 * scaleRatio
selectByMouse: false selectByMouse: false
wrapMode: TextEdit.Wrap wrapMode: TextEdit.Wrap
color: Style.defaultFontColor
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
@ -140,10 +152,6 @@ Rectangle {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: cancelButton id: cancelButton
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Cancel") + translationManager.emptyString text: qsTr("Cancel") + translationManager.emptyString
onClicked: { onClicked: {
root.close() root.close()
@ -153,10 +161,6 @@ Rectangle {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: okButton id: okButton
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("OK") text: qsTr("OK")
KeyNavigation.tab: cancelButton KeyNavigation.tab: cancelButton
onClicked: { onClicked: {
@ -168,6 +172,38 @@ Rectangle {
} }
} }
// window borders
Rectangle{
width: 1
color: Style.grey
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
}
Rectangle{
width: 1
color: Style.grey
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom
}
Rectangle{
height: 1
color: Style.grey
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
}
Rectangle{
height: 1
color: Style.grey
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.right: parent.right
}
} }

View file

@ -27,6 +27,7 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.0
import "." 1.0
Item { Item {
id: dropdown id: dropdown
@ -38,11 +39,17 @@ Item {
property string textColor: "#FFFFFF" property string textColor: "#FFFFFF"
property alias currentIndex: column.currentIndex property alias currentIndex: column.currentIndex
property bool expanded: false property bool expanded: false
property int dropdownHeight: 42
property int fontHeaderSize: 16 * scaleRatio
property int fontItemSize: 14 * scaleRatio
property string colorHeaderBackground: "transparent"
property bool headerBorder: true
property bool headerFontBold: false
height: dropdownHeight
signal changed(); signal changed();
height: 37 * scaleRatio
onExpandedChanged: if(expanded) appWindow.currentItem = dropdown onExpandedChanged: if(expanded) appWindow.currentItem = dropdown
function hide() { dropdown.expanded = false } function hide() { dropdown.expanded = false }
function containsPoint(px, py) { function containsPoint(px, py) {
@ -60,7 +67,6 @@ Item {
// Workaroud for suspected memory leak in 5.8 causing malloc crash on app exit // Workaroud for suspected memory leak in 5.8 causing malloc crash on app exit
function update() { function update() {
firstColText.text = column.currentIndex < repeater.model.rowCount() ? qsTr(repeater.model.get(column.currentIndex).column1) + translationManager.emptyString : "" firstColText.text = column.currentIndex < repeater.model.rowCount() ? qsTr(repeater.model.get(column.currentIndex).column1) + translationManager.emptyString : ""
secondColText.text = column.currentIndex < repeater.model.rowCount() ? qsTr(repeater.model.get(column.currentIndex).column2) + translationManager.emptyString : ""
} }
Item { Item {
@ -68,42 +74,14 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
height: 37 * scaleRatio height: dropdown.dropdownHeight
Rectangle { Rectangle {
anchors.left: parent.left color: dropdown.colorHeaderBackground
anchors.right: parent.right border.width: dropdown.headerBorder ? 1 : 0
height: parent.height - 1 border.color: Qt.rgba(1, 1, 1, 0.25)
y: dropdown.expanded || droplist.height > 0 ? 0 : 1 radius: 4
color: dropdown.expanded || droplist.height > 0 ? dropdown.shadowPressedColor : dropdown.shadowReleasedColor anchors.fill: parent
//radius: 4
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
height: parent.height - 1
y: dropdown.expanded || droplist.height > 0 ? 1 : 0
color: dropdown.expanded || droplist.height > 0 ? dropdown.pressedColor : dropdown.releasedColor
//radius: 4
}
Rectangle {
anchors.left: parent.left
anchors.bottom: parent.bottom
height: 3 * scaleRatio
width: 3 * scaleRatio
color: dropdown.pressedColor
visible: dropdown.expanded || droplist.height > 0
}
Rectangle {
anchors.right: parent.right
anchors.bottom: parent.bottom
height: 3 * scaleRatio
width: 3 * scaleRatio
color: dropdown.pressedColor
visible: dropdown.expanded || droplist.height > 0
} }
Text { Text {
@ -112,31 +90,9 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 12 * scaleRatio anchors.leftMargin: 12 * scaleRatio
elide: Text.ElideRight elide: Text.ElideRight
font.family: "Arial" font.family: Style.fontRegular.name
font.bold: true font.bold: dropdown.headerFontBold
font.pixelSize: 12 * scaleRatio font.pixelSize: dropdown.fontHeaderSize
color: "#FFFFFF"
}
Text {
id: secondColText
anchors.verticalCenter: parent.verticalCenter
anchors.right: separator.left
anchors.rightMargin: 12 * scaleRatio
width: dropdown.expanded ? w : (separator.x - 12) - (firstColText.x + firstColText.width + 5)
font.family: "Arial"
font.pixelSize: 12 * scaleRatio
color: "#FFFFFF"
property int w: 0
Component.onCompleted: w = implicitWidth
}
Rectangle {
id: separator
anchors.right: dropIndicator.left
anchors.verticalCenter: parent.verticalCenter
height: 18 * scaleRatio
width: 1
color: "#FFFFFF" color: "#FFFFFF"
} }
@ -158,6 +114,8 @@ Item {
id: dropArea id: dropArea
anchors.fill: parent anchors.fill: parent
onClicked: dropdown.expanded = !dropdown.expanded onClicked: dropdown.expanded = !dropdown.expanded
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
} }
} }
@ -211,24 +169,24 @@ Item {
property string stringSent: qsTr("Sent") + translationManager.emptyString property string stringSent: qsTr("Sent") + translationManager.emptyString
property string stringReceived: qsTr("Received") + translationManager.emptyString property string stringReceived: qsTr("Received") + translationManager.emptyString
delegate: Rectangle { delegate: Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
height: 30 * scaleRatio height: (dropdown.dropdownHeight * 0.75) * scaleRatio
//radius: index === repeater.count - 1 ? 4 : 0 //radius: index === repeater.count - 1 ? 4 : 0
color: itemArea.containsMouse || index === column.currentIndex || itemArea.containsMouse ? dropdown.releasedColor : dropdown.pressedColor color: itemArea.containsMouse || index === column.currentIndex || itemArea.containsMouse ? dropdown.releasedColor : dropdown.pressedColor
Text { Text {
id: col1Text
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left anchors.left: parent.left
anchors.right: col2Text.left anchors.right: col2Text.left
anchors.leftMargin: 12 * scaleRatio anchors.leftMargin: 12 * scaleRatio
anchors.rightMargin: column2.length > 0 ? 12 * scaleRatio: 0 anchors.rightMargin: 0
font.family: "Arial" font.family: Style.fontRegular.name
font.bold: true font.bold: true
font.pixelSize: 12 * scaleRatio font.pixelSize: fontItemSize
color: "#FFFFFF" color: itemArea.containsMouse || index === column.currentIndex || itemArea.containsMouse ? "#FA6800" : "#FFFFFF"
text: qsTr(column1) + translationManager.emptyString text: qsTr(column1) + translationManager.emptyString
} }
@ -237,10 +195,10 @@ Item {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 45 * scaleRatio anchors.rightMargin: 45 * scaleRatio
font.family: "Arial" font.family: Style.fontRegular.name
font.pixelSize: 12 * scaleRatio font.pixelSize: 14 * scaleRatio
color: "#FFFFFF" color: "#FFFFFF"
text: column2 text: ""
} }
Rectangle { Rectangle {
@ -261,6 +219,8 @@ Item {
id: itemArea id: itemArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
dropdown.expanded = false dropdown.expanded = false
column.currentIndex = index column.currentIndex = index

29
components/Style.qml Normal file
View file

@ -0,0 +1,29 @@
pragma Singleton
import QtQuick 2.5
QtObject {
property QtObject fontMedium: FontLoader { id: _fontMedium; source: "qrc:/fonts/SFUIDisplay-Medium.otf"; }
property QtObject fontBold: FontLoader { id: _fontBold; source: "qrc:/fonts/SFUIDisplay-Bold.otf"; }
property QtObject fontLight: FontLoader { id: _fontLight; source: "qrc:/fonts/SFUIDisplay-Light.otf"; }
property QtObject fontRegular: FontLoader { id: _fontRegular; source: "qrc:/fonts/SFUIDisplay-Regular.otf"; }
property string grey: "#404040"
property string defaultFontColor: "white"
property string greyFontColor: "#808080"
property string dimmedFontColor: "#BBBBBB"
property string inputBoxBackground: "black"
property string inputBoxBackgroundError: "#FFDDDD"
property string inputBoxColor: "white"
property string legacy_placeholderFontColor: "#BABABA"
property string buttonBackgroundColor: "#FA6800"
property string buttonBackgroundColorHover: "#E65E00"
property string buttonBackgroundColorDisabled: "#707070"
property string buttonBackgroundColorDisabledHover: "#808080"
property string buttonTextColor: "white"
property string buttonTextColorDisabled: "black"
property string dividerColor: "white"
property real dividerOpacity: 0.25
}

View file

@ -28,40 +28,59 @@
import QtQuick 2.0 import QtQuick 2.0
import moneroComponents.Clipboard 1.0 import moneroComponents.Clipboard 1.0
import "../components"
import "." 1.0
ListView { ListView {
id: listView id: listView
clip: true clip: true
boundsBehavior: ListView.StopAtBounds boundsBehavior: ListView.StopAtBounds
highlightMoveDuration: 0 highlightMoveDuration: 0
highlightFollowsCurrentItem: true
anchors.topMargin: 0
spacing: 0
delegate: Rectangle { delegate: Rectangle {
id: delegate id: delegate
height: 64 height: 80
color: 'transparent';
anchors.topMargin: 0
width: listView.width width: listView.width
clip: true
LineEdit { LineEditMulti {
id: addressLine id: addressLine
fontSize: 12
fontSize: 14
readOnly: true readOnly: true
width: parent.width width: parent.width
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.margins: 5 anchors.leftMargin: 10
onTextChanged: cursorPosition = 0 anchors.topMargin: 12
anchors.rightMargin: 54
anchors.bottomMargin: 0
text: address text: address
showingHeader: false
showBorder: false showBorder: false
addressValidation: false
}
IconButton { IconButton {
id: clipboardButton id: clipboardButton
imageSource: "../images/copyToClipboard.png" imageSource: "../images/copyToClipboard.png"
onClicked: { onClicked: {
console.log(addressLine.text + " copied to clipboard"); console.log(addressLine.text + " copied to clipboard");
clipboard.setText(addressLine.text); clipboard.setText(addressLine.text);
appWindow.showStatusMessage(qsTr("Address copied to clipboard"),3); appWindow.showStatusMessage(qsTr("Address copied to clipboard"),3);
} }
}
anchors.right: parent.right
anchors.rightMargin: 0
anchors.verticalCenter: parent.verticalCenter
} }
Text { Text {
@ -85,7 +104,7 @@ ListView {
font.family: "Arial" font.family: "Arial"
font.bold: true font.bold: true
font.pixelSize: 12 font.pixelSize: 12
color: "#444444" color: Style.greyFontColor
text: label text: label
} }
@ -96,14 +115,46 @@ ListView {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: clipboardButton.width anchors.rightMargin: clipboardButton.width
onClicked: listView.currentIndex = index cursorShape: Qt.PointingHandCursor
onClicked: {
listView.currentIndex = index;
} }
} }
highlight: Rectangle { Rectangle {
height: 64 anchors.left: parent.left
color: '#FF4304' anchors.top: parent.top
opacity: 0.2 anchors.bottom: parent.bottom
z: 2 width: 1
color: Style.grey
z: 6
}
Rectangle {
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom
width: 1
color: Style.grey
z: 6
}
Rectangle {
anchors.right: parent.right
anchors.left: parent.left
anchors.bottom: parent.bottom
color: Style.grey
height: 1
z: 6
}
Rectangle {
width: 3
color: 'white'
visible: listView.currentIndex == index
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
}
} }
} }

View file

@ -36,26 +36,40 @@ Rectangle {
property int offset: 0 property int offset: 0
height: 31 height: 31
color: "#FFFFFF" color: "transparent"
Rectangle{
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom
width: 1
color: "#808080"
}
Rectangle{
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
width: 1
color: "#808080"
}
Rectangle { Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: 1 height: 1
color: "#DBDBDB" color: "#808080"
} }
Row { Row {
id: row id: row
anchors.horizontalCenter: header.offset !== 0 ? undefined: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.left: header.offset !== 0 ? parent.left : undefined
anchors.leftMargin: header.offset
Rectangle { Rectangle {
height: 31 height: 31
width: 1 width: 1
color: "#DBDBDB" color: "#808080"
} }
Repeater { Repeater {
@ -70,6 +84,7 @@ Rectangle {
delegate: Rectangle { delegate: Rectangle {
id: delegate id: delegate
property bool desc: false property bool desc: false
color: "transparent"
height: 31 height: 31
width: columnWidth width: columnWidth
@ -86,7 +101,7 @@ Rectangle {
color: { color: {
if(delegateArea.pressed) if(delegateArea.pressed)
return "#FF4304" return "#FF4304"
return index === header.activeSortColumn || delegateArea.containsMouse ? "#FF6C3C" : "#4A4949" return index === header.activeSortColumn || delegateArea.containsMouse ? "white" : "#808080"
} }
text: qsTr(columnName) + translationManager.emptyString text: qsTr(columnName) + translationManager.emptyString
} }
@ -95,6 +110,7 @@ Rectangle {
id: delegateArea id: delegateArea
hoverEnabled: true hoverEnabled: true
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
delegate.desc = !delegate.desc delegate.desc = !delegate.desc
header.activeSortColumn = index header.activeSortColumn = index
@ -170,7 +186,7 @@ Rectangle {
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: 1 height: 1
color: index === header.activeSortColumn ? "#FFFFFF" : "#DBDBDB" color: "transparent"
} }
Rectangle { Rectangle {
@ -178,7 +194,7 @@ Rectangle {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
width: 1 width: 1
color: "#DBDBDB" color: "#808080"
} }
} }
} }

View file

@ -1,6 +1,10 @@
import QtQuick 2.0 import QtQuick 2.0
import "." 1.0
TextEdit { TextEdit {
color: Style.defaultFontColor
font.family: Style.fontRegular.name
wrapMode: Text.Wrap wrapMode: Text.Wrap
readOnly: true readOnly: true
selectByMouse: true selectByMouse: true

View file

@ -27,6 +27,8 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.0
import "." 1.0
Item { Item {
id: delegateItem id: delegateItem
@ -50,7 +52,7 @@ Item {
font.family: "Arial" font.family: "Arial"
font.bold: true font.bold: true
font.pixelSize: 12 * scaleRatio font.pixelSize: 12 * scaleRatio
color: "#4A4949" color: Style.defaultFontColor
text: { text: {
if(currentIndex === 0) return qsTr("Default") + translationManager.emptyString if(currentIndex === 0) return qsTr("Default") + translationManager.emptyString
if(currentIndex === 13) return qsTr("High") + translationManager.emptyString if(currentIndex === 13) return qsTr("High") + translationManager.emptyString

View file

@ -32,50 +32,78 @@ import QtQuick.Layouts 1.1
Rectangle { Rectangle {
id: titleBar id: titleBar
color: "#000000"
property int mouseX: 0 property int mouseX: 0
property bool containsMouse: false property bool containsMouse: false
property alias basicButtonVisible: goToBasicVersionButton.visible property alias basicButtonVisible: goToBasicVersionButton.visible
property bool customDecorations: true property bool customDecorations: true
signal goToBasicVersion(bool yes) signal goToBasicVersion(bool yes)
height: customDecorations && !isMobile ? 30 : 0 height: customDecorations && !isMobile ? 50 : 0
y: -height y: -height
property string title property string title
property alias maximizeButtonVisible: maximizeButton.visible property alias maximizeButtonVisible: maximizeButton.visible
z: 1 z: 1
Text { Item {
anchors.centerIn: parent id: test
font.family: "Arial" width: parent.width
font.pixelSize: 15 height: 50
color: "#FFFFFF" z: 1
text: titleBar.title
visible: customDecorations // use jpg for gradiency
Image {
anchors.fill: parent
height: parent.height
width: parent.width
source: "../images/titlebarGradient.jpg"
}
} }
Rectangle { Item{
id: titlebarlogo
width: 125
height: 50
anchors.centerIn: parent
visible: customDecorations
z: 1
Image {
anchors.left: parent.left
anchors.top: parent.top
anchors.topMargin: 11
width: 125
height: 28
source: "../images/titlebarLogo.png"
}
}
// collapse left panel
Rectangle {
id: goToBasicVersionButton id: goToBasicVersionButton
property bool containsMouse: titleBar.mouseX >= x && titleBar.mouseX <= x + width property bool containsMouse: titleBar.mouseX >= x && titleBar.mouseX <= x + width
property bool checked: false property bool checked: false
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
color: "#FFE00A" color: "transparent"
height: 30 * scaleRatio height: 50 * scaleRatio
width: height width: height
visible: isMobile visible: isMobile
z: 2
Image { Image {
width: parent.width * 2/3; width: 14
height: width; height: 14
anchors.centerIn: parent anchors.centerIn: parent
source: "../images/menu.png" source: "../images/expand.png"
} }
MouseArea { MouseArea {
id: basicMouseArea id: basicMouseArea
hoverEnabled: true hoverEnabled: true
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onEntered: goToBasicVersionButton.color = "#262626";
onExited: goToBasicVersionButton.color = "transparent";
onClicked: { onClicked: {
releaseFocus() releaseFocus()
parent.checked = !parent.checked parent.checked = !parent.checked
@ -90,22 +118,28 @@ Rectangle {
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
visible: parent.customDecorations visible: parent.customDecorations
z: 2
Rectangle { Rectangle {
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse id: whatIsAreaButton
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: height width: 42
color: containsMouse ? "#6B0072" : "#000000" color: containsMouse ? "#6B0072" : "#00000000"
Image { Image {
anchors.centerIn: parent anchors.centerIn: parent
source: "../images/helpIcon.png" width: 9
height: 16
source: "../images/question.png"
} }
MouseArea { MouseArea {
id: whatIsArea id: whatIsArea
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onEntered: whatIsAreaButton.color = "#262626";
onExited: whatIsAreaButton.color = "transparent";
onClicked: { onClicked: {
} }
@ -113,20 +147,24 @@ Rectangle {
} }
Rectangle { Rectangle {
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse id: minimizeButton
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: height width: 42
color: containsMouse ? "#3665B3" : "#000000" color: "transparent"
Image { Image {
anchors.centerIn: parent anchors.centerIn: parent
source: "../images/minimizeIcon.png" source: "../images/minimize.png"
} }
MouseArea { MouseArea {
id: minimizeArea id: minimizeArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onEntered: minimizeButton.color = "#262626";
onExited: minimizeButton.color = "transparent";
onClicked: { onClicked: {
appWindow.visibility = Window.Minimized appWindow.visibility = Window.Minimized
} }
@ -135,22 +173,26 @@ Rectangle {
Rectangle { Rectangle {
id: maximizeButton id: maximizeButton
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: height width: 42
color: containsMouse ? "#FF6C3C" : "#000000" color: "transparent";
Image { Image {
anchors.centerIn: parent anchors.centerIn: parent
height: 16
width: 16
source: appWindow.visibility === Window.FullScreen ? "../images/backToWindowIcon.png" : source: appWindow.visibility === Window.FullScreen ? "../images/backToWindowIcon.png" :
"../images/maximizeIcon.png" "../images/fullscreen.png"
} }
MouseArea { MouseArea {
id: maximizeArea id: maximizeArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onEntered: maximizeButton.color = "#262626";
onExited: maximizeButton.color = "transparent";
onClicked: { onClicked: {
appWindow.visibility = appWindow.visibility !== Window.FullScreen ? Window.FullScreen : appWindow.visibility = appWindow.visibility !== Window.FullScreen ? Window.FullScreen :
Window.Windowed Window.Windowed
@ -159,20 +201,26 @@ Rectangle {
} }
Rectangle { Rectangle {
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse id: closeButton
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: height width: 42
color: containsMouse ? "#E04343" : "#000000" color: containsMouse ? "#E04343" : "#00000000"
Image { Image {
anchors.centerIn: parent anchors.centerIn: parent
source: "../images/closeIcon.png" width: 16
height: 16
source: "../images/close.png"
} }
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: appWindow.close(); onClicked: appWindow.close();
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onEntered: closeButton.color = "#262626";
onExited: closeButton.color = "transparent";
} }
} }
} }

1
components/qmldir Normal file
View file

@ -0,0 +1 @@
singleton Style 1.0 Style.qml

BIN
fonts/SFUIDisplay-Bold.otf Normal file

Binary file not shown.

BIN
fonts/SFUIDisplay-Light.otf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

BIN
images/card-background.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
images/checkedBlackIcon.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
images/checkedIcon-black.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
images/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

BIN
images/downArrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

BIN
images/expand.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

BIN
images/fullscreen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 B

BIN
images/historyBorderRadius.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
images/leftPanelBg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
images/lightning-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

BIN
images/lightning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

BIN
images/menuArrow.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
images/middlePanelBg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
images/minimize.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 B

BIN
images/moneroIcon-28x28.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
images/moneroLogo_white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
images/question.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

BIN
images/right.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

BIN
images/rightArrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 B

BIN
images/titlebarGradient.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 760 B

BIN
images/titlebarLogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
images/upArrow-green.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

BIN
images/warning.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

57
js/TxUtils.js Normal file
View file

@ -0,0 +1,57 @@
function destinationsToAmount(destinations){
// Gets amount from destinations line
// input: "20.000000000000: 9tLGyK277MnYrDc7Vzi6TB1pJvstFoviziFwsqQNFbwA9rvg5RxYVYjEezFKDjvDHgAzTELJhJHVx6JAaWZKeVqSUZkXeKk"
// returns: 20.000000000000
return destinations.split(" ")[0].split(":")[0];
}
function destinationsToAddress(destinations){
var address = destinations.split(" ")[1];
if(address === undefined) return ""
return address;
}
function addressTruncate(address){
return address.substring(0, 6) + "..." + address.substring(address.length-6);
}
function check256(str, length) {
if (str.length != length)
return false;
for (var i = 0; i < length; ++i) {
if (str[i] >= '0' && str[i] <= '9')
continue;
if (str[i] >= 'a' && str[i] <= 'z')
continue;
if (str[i] >= 'A' && str[i] <= 'Z')
continue;
return false;
}
return true;
}
function checkAddress(address, testnet) {
return walletManager.addressValid(address, testnet)
}
function checkTxID(txid) {
return check256(txid, 64)
}
function checkSignature(signature) {
if (signature.indexOf("OutProofV") === 0) {
if ((signature.length - 10) % 132 != 0)
return false;
return check256(signature, signature.length);
} else if (signature.indexOf("InProofV") === 0) {
if ((signature.length - 9) % 132 != 0)
return false;
return check256(signature, signature.length);
} else if (signature.indexOf("SpendProofV") === 0) {
if ((signature.length - 12) % 88 != 0)
return false;
return check256(signature, signature.length);
}
return false;
}

View file

@ -73,7 +73,7 @@ ApplicationWindow {
property bool remoteNodeConnected: false property bool remoteNodeConnected: false
property bool androidCloseTapped: false; property bool androidCloseTapped: false;
// Default daemon addresses // Default daemon addresses
readonly property string localDaemonAddress : persistentSettings.nettype === NetworkType.MAINNET ? "localhost:18081" : persistentSettings.nettype === NetworkType.TESTNET ? "localhost:28081" : "localhost:38081" readonly property string localDaemonAddress : persistentSettings.nettype == NetworkType.MAINNET ? "localhost:18081" : persistentSettings.nettype == NetworkType.TESTNET ? "localhost:28081" : "localhost:38081"
property string currentDaemonAddress; property string currentDaemonAddress;
property bool startLocalNodeCancelled: false property bool startLocalNodeCancelled: false
@ -232,12 +232,15 @@ ApplicationWindow {
if(isIOS) if(isIOS)
wallet_path = moneroAccountsDir + wallet_path; wallet_path = moneroAccountsDir + wallet_path;
// console.log("opening wallet at: ", wallet_path, "with password: ", appWindow.walletPassword); // console.log("opening wallet at: ", wallet_path, "with password: ", appWindow.walletPassword);
console.log("opening wallet at: ", wallet_path, ", network type: ", persistentSettings.nettype === NetworkType.MAINNET ? "mainnet" : persistentSettings.nettype === NetworkType.TESTNET ? "testnet" : "stagenet"); console.log("opening wallet at: ", wallet_path, ", network type: ", persistentSettings.nettype == NetworkType.MAINNET ? "mainnet" : persistentSettings.nettype == NetworkType.TESTNET ? "testnet" : "stagenet");
walletManager.openWalletAsync(wallet_path, walletPassword, walletManager.openWalletAsync(wallet_path, walletPassword,
persistentSettings.nettype); persistentSettings.nettype);
} }
// Hide titlebar based on persistentSettings.customDecorations
titleBar.visible = persistentSettings.customDecorations;
} }
function closeWallet() { function closeWallet() {
// Disconnect all listeners // Disconnect all listeners
@ -263,6 +266,28 @@ ApplicationWindow {
function connectWallet(wallet) { function connectWallet(wallet) {
currentWallet = wallet currentWallet = wallet
// TODO:
// When the wallet variable is undefined, it yields a zero balance.
// This can scare users, restart the GUI (as a quick fix).
//
// To reproduce, follow these steps:
// 1) Open the GUI, load up a wallet that has a balance
// 2) Settings -> close wallet
// 3) Create a new wallet
// 4) Settings -> close wallet
// 5) Open the wallet from step 1
if(!wallet || wallet === undefined || wallet.path === undefined){
informationPopup.title = qsTr("Error") + translationManager.emptyString;
informationPopup.text = qsTr("Couldn't open wallet: ") + 'please restart GUI.';
informationPopup.icon = StandardIcon.Critical
informationPopup.open()
informationPopup.onCloseCallback = function() {
appWindow.close();
}
}
walletName = usefulName(wallet.path) walletName = usefulName(wallet.path)
updateSyncing(false) updateSyncing(false)
@ -539,7 +564,7 @@ ApplicationWindow {
function onWalletMoneySent(txId, amount) { function onWalletMoneySent(txId, amount) {
// refresh transaction history here // refresh transaction history here
console.log("money sent found") console.log("monero sent found")
currentWallet.refresh() currentWallet.refresh()
currentWallet.history.refresh(currentWallet.currentSubaddressAccount) // this will refresh model currentWallet.history.refresh(currentWallet.currentSubaddressAccount) // this will refresh model
} }
@ -585,11 +610,8 @@ ApplicationWindow {
+ ", fee: " + walletManager.displayAmount(transaction.fee)); + ", fee: " + walletManager.displayAmount(transaction.fee));
// here we show confirmation popup; // here we show confirmation popup;
transactionConfirmationPopup.title = qsTr("Please confirm transaction:\n") + translationManager.emptyString;
transactionConfirmationPopup.title = qsTr("Confirmation") + translationManager.emptyString transactionConfirmationPopup.text = "";
transactionConfirmationPopup.text = qsTr("Please confirm transaction:\n");
for (var i = 0; i < transaction.subaddrIndices.length; ++i)
transactionConfirmationPopup.text += qsTr("\nSpending address index: ") + transaction.subaddrIndices[i]
transactionConfirmationPopup.text += transactionConfirmationPopup.text +=
(address === "" ? "" : (qsTr("\n\nAddress: ") + address)) (address === "" ? "" : (qsTr("\n\nAddress: ") + address))
+ (paymentId === "" ? "" : (qsTr("\nPayment ID: ") + paymentId)) + (paymentId === "" ? "" : (qsTr("\nPayment ID: ") + paymentId))
@ -598,7 +620,12 @@ ApplicationWindow {
+ qsTr("\n\nRingsize: ") + (mixinCount + 1) + qsTr("\n\nRingsize: ") + (mixinCount + 1)
+ qsTr("\n\Number of transactions: ") + transaction.txCount + qsTr("\n\Number of transactions: ") + transaction.txCount
+ (transactionDescription === "" ? "" : (qsTr("\n\nDescription: ") + transactionDescription)) + (transactionDescription === "" ? "" : (qsTr("\n\nDescription: ") + transactionDescription))
+ translationManager.emptyString
for (var i = 0; i < transaction.subaddrIndices.length; ++i){
transactionConfirmationPopup.text += qsTr("\nSpending address index: ") + transaction.subaddrIndices[i];
}
transactionConfirmationPopup.text += translationManager.emptyString;
transactionConfirmationPopup.icon = StandardIcon.Question transactionConfirmationPopup.icon = StandardIcon.Question
transactionConfirmationPopup.open() transactionConfirmationPopup.open()
} }
@ -751,7 +778,7 @@ ApplicationWindow {
txid_text += ", " txid_text += ", "
txid_text += txid[i] txid_text += txid[i]
} }
informationPopup.text = (viewOnly)? qsTr("Transaction saved to file: %1").arg(path) : qsTr("Money sent successfully: %1 transaction(s) ").arg(txid.length) + txid_text + translationManager.emptyString informationPopup.text = (viewOnly)? qsTr("Transaction saved to file: %1").arg(path) : qsTr("Monero sent successfully: %1 transaction(s) ").arg(txid.length) + txid_text + translationManager.emptyString
informationPopup.icon = StandardIcon.Information informationPopup.icon = StandardIcon.Information
if (transactionDescription.length > 0) { if (transactionDescription.length > 0) {
for (var i = 0; i < txid.length; ++i) for (var i = 0; i < txid.length; ++i)
@ -911,11 +938,14 @@ ApplicationWindow {
x = 0 x = 0
if (y < 0) if (y < 0)
y = 0 y = 0
persistentSettings.customDecorations = custom persistentSettings.customDecorations = custom;
titleBar.visible = custom; // hides custom titlebar based on customDecorations
if (custom) if (custom)
appWindow.flags = Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint appWindow.flags = Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint;
else else
appWindow.flags = Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint | Qt.WindowMaximizeButtonHint appWindow.flags = Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint | Qt.WindowMaximizeButtonHint;
appWindow.hide() appWindow.hide()
appWindow.x = x appWindow.x = x
appWindow.y = y appWindow.y = y
@ -988,7 +1018,7 @@ ApplicationWindow {
property bool allow_background_mining : false property bool allow_background_mining : false
property bool miningIgnoreBattery : true property bool miningIgnoreBattery : true
property var nettype: NetworkType.MAINNET property var nettype: NetworkType.MAINNET
property string daemon_address: nettype === NetworkType.TESTNET ? "localhost:28081" : nettype === NetworkType.STAGENET ? "localhost:38081" : "localhost:18081" property string daemon_address: nettype == NetworkType.TESTNET ? "localhost:28081" : nettype == NetworkType.STAGENET ? "localhost:38081" : "localhost:18081"
property string payment_id property string payment_id
property int restore_height : 0 property int restore_height : 0
property bool is_recovering : false property bool is_recovering : false
@ -1533,6 +1563,15 @@ ApplicationWindow {
} }
} }
} }
Rectangle {
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.left: parent.left
height:1
color: "#2F2F2F"
z: 2
}
} }
// new ToolTip // new ToolTip

View file

@ -276,6 +276,7 @@ linux {
-lboost_chrono \ -lboost_chrono \
-lboost_program_options \ -lboost_program_options \
-lssl \ -lssl \
-llmdb \
-lcrypto -lcrypto
if(!android) { if(!android) {

View file

@ -34,30 +34,21 @@ import moneroComponents.AddressBookModel 1.0
Rectangle { Rectangle {
id: root id: root
color: "#F0EEEE" color: "transparent"
property var model property var model
ColumnLayout { ColumnLayout {
anchors.margins: 17 * scaleRatio id: columnLayout
anchors.margins: (isMobile)? 17 : 40
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
spacing: 10 * scaleRatio spacing: 26 * scaleRatio
Label {
id: addressLabel
anchors.left: parent.left
text: qsTr("Address") + translationManager.emptyString
}
RowLayout { RowLayout {
StandardButton { StandardButton {
id: qrfinderButton id: qrfinderButton
text: qsTr("Qr Code") + translationManager.emptyString text: qsTr("Qr Code") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible : appWindow.qrScannerEnabled visible : appWindow.qrScannerEnabled
enabled : visible enabled : visible
width: visible ? 60 * scaleRatio : 0 width: visible ? 60 * scaleRatio : 0
@ -70,32 +61,25 @@ Rectangle {
LineEdit { LineEdit {
Layout.fillWidth: true; Layout.fillWidth: true;
id: addressLine id: addressLine
labelText: qsTr("Address") + translationManager.emptyString
error: true; error: true;
placeholderText: qsTr("4...") + translationManager.emptyString placeholderText: qsTr("4...") + translationManager.emptyString
} }
} }
Label {
id: paymentIdLabel
text: qsTr("Payment ID <font size='2'>(Optional)</font>") + translationManager.emptyString
tipText: qsTr("<b>Payment ID</b><br/><br/>A unique user name used in<br/>the address book. It is not a<br/>transfer of information sent<br/>during the transfer")
+ translationManager.emptyString
}
LineEdit { LineEdit {
id: paymentIdLine id: paymentIdLine
Layout.fillWidth: true; Layout.fillWidth: true;
labelText: qsTr("Payment ID <font size='2'>(Optional)</font>") + translationManager.emptyString
placeholderText: qsTr("Paste 64 hexadecimal characters") + translationManager.emptyString placeholderText: qsTr("Paste 64 hexadecimal characters") + translationManager.emptyString
} // tipText: qsTr("<b>Payment ID</b><br/><br/>A unique user name used in<br/>the address book. It is not a<br/>transfer of information sent<br/>during the transfer")
// + translationManager.emptyString
Label {
id: descriptionLabel
text: qsTr("Description <font size='2'>(Optional)</font>") + translationManager.emptyString
} }
LineEdit { LineEdit {
id: descriptionLine id: descriptionLine
Layout.fillWidth: true; Layout.fillWidth: true;
labelText: qsTr("Description <font size='2'>(Optional)</font>") + translationManager.emptyString
placeholderText: qsTr("Give this entry a name or description") + translationManager.emptyString placeholderText: qsTr("Give this entry a name or description") + translationManager.emptyString
} }
@ -104,10 +88,6 @@ Rectangle {
id: addButton id: addButton
Layout.bottomMargin: 17 * scaleRatio Layout.bottomMargin: 17 * scaleRatio
StandardButton { StandardButton {
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Add") + translationManager.emptyString text: qsTr("Add") + translationManager.emptyString
enabled: checkInformation(addressLine.text, paymentIdLine.text, appWindow.persistentSettings.nettype) enabled: checkInformation(addressLine.text, paymentIdLine.text, appWindow.persistentSettings.nettype)
@ -132,29 +112,23 @@ Rectangle {
} }
} }
} }
} }
Rectangle { Rectangle {
id: tableRect id: tableRect
anchors.top: columnLayout.bottom
anchors.leftMargin: (isMobile)? 17 : 40
anchors.rightMargin: (isMobile)? 17 : 40
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: parent.height - addButton.y - addButton.height - 36 * scaleRatio height: parent.height - addButton.y - addButton.height - 36 * scaleRatio
color: "#FFFFFF" color: "transparent"
Behavior on height { Behavior on height {
NumberAnimation { duration: 200; easing.type: Easing.InQuad } NumberAnimation { duration: 200; easing.type: Easing.InQuad }
} }
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
height: 1
color: "#DBDBDB"
}
Scroll { Scroll {
id: flickableScroll id: flickableScroll
anchors.right: table.right anchors.right: table.right
@ -170,8 +144,6 @@ Rectangle {
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.leftMargin: 14
anchors.rightMargin: 14
onContentYChanged: flickableScroll.flickableContentYChanged() onContentYChanged: flickableScroll.flickableContentYChanged()
model: root.model model: root.model
} }

View file

@ -27,7 +27,8 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2
import moneroComponents.Wallet 1.0 import moneroComponents.Wallet 1.0
import moneroComponents.WalletManager 1.0 import moneroComponents.WalletManager 1.0
import moneroComponents.TransactionHistory 1.0 import moneroComponents.TransactionHistory 1.0
@ -37,15 +38,16 @@ import moneroComponents.TransactionHistoryModel 1.0
import "../components" import "../components"
Rectangle { Rectangle {
id: root id: mainLayout
property var model property var model
property int tableHeight: !isMobile ? table.contentHeight : tableMobile.contentHeight
QtObject { QtObject {
id: d id: d
property bool initialized: false property bool initialized: false
} }
color: "#F0EEEE" color: "transparent"
function getSelectedAmount() { function getSelectedAmount() {
if (typeof model === 'undefined' || model == null) if (typeof model === 'undefined' || model == null)
@ -81,182 +83,25 @@ Rectangle {
onModelChanged: { onModelChanged: {
if (typeof model !== 'undefined' && model != null) { if (typeof model !== 'undefined' && model != null) {
selectedAmount.text = getSelectedAmount()
if (!d.initialized) { if (!d.initialized) {
// setup date filter scope according to real transactions // setup date filter scope according to real transactions
fromDatePicker.currentDate = model.transactionHistory.firstDateTime fromDatePicker.currentDate = model.transactionHistory.firstDateTime
toDatePicker.currentDate = model.transactionHistory.lastDateTime toDatePicker.currentDate = model.transactionHistory.lastDateTime
/* Default sorting by timestamp desc */
/* Sort indicator on table header */
/* index of 'sort by blockheight' column */
header.activeSortColumn = 2
/* Sorting model */
model.sortRole = TransactionHistoryModel.TransactionBlockHeightRole model.sortRole = TransactionHistoryModel.TransactionBlockHeightRole
model.sort(0, Qt.DescendingOrder); model.sort(0, Qt.DescendingOrder);
d.initialized = true d.initialized = true
// TODO: public interface for 'Header' item that will cause 'sortRequest' signal
} }
} }
} }
function onFilterChanged() { function onFilterChanged() {
// set datepicker error states
var datesValid = fromDatePicker.currentDate <= toDatePicker.currentDate var datesValid = fromDatePicker.currentDate <= toDatePicker.currentDate
var amountsValid = amountFromLine.text === "" ? true : fromDatePicker.error = !datesValid;
amountToLine.text === "" ? true: toDatePicker.error = !datesValid;
parseFloat(amountFromLine.text) <= parseFloat(amountToLine.text)
// reset error state if amount filter valid
if (amountsValid) {
amountFromLine.error = amountToLine.error = false
}
filterButton.enabled = datesValid && amountsValid
}
Text {
visible: !isMobile
id: filterHeaderText
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.leftMargin: 17
anchors.topMargin: 17
elide: Text.ElideRight
font.family: "Arial"
font.pixelSize: 18
color: "#4A4949"
text: qsTr("Filter transaction history") + translationManager.emptyString
}
Label {
visible: !isMobile
id: selectedAmount
anchors.right: parent.right
anchors.top: parent.top
anchors.rightMargin: 17
anchors.topMargin: 17
text: getSelectedAmount()
fontSize: 14
}
// Filter by string
LineEdit {
visible: !isMobile
id: searchLine
anchors.left: parent.left
anchors.right: parent.right
anchors.top: filterHeaderText.bottom
anchors.leftMargin: 17
anchors.rightMargin: 17
anchors.topMargin: 5
placeholderText: qsTr("Type for incremental search...") + translationManager.emptyString
onTextChanged: {
model.searchFilter = searchLine.text
selectedAmount.text = getSelectedAmount()
}
}
// Filter by description input (not implemented yet)
/*
Label {
id: descriptionLabel
anchors.left: parent.left
anchors.top: searchLine.bottom
anchors.leftMargin: 17
anchors.topMargin: 17
text: qsTr("Description <font size='2'>(Local database)</font>") + translationManager.emptyString
fontSize: 14
}
LineEdit {
id: descriptionLine
anchors.left: parent.left
anchors.right: parent.right
anchors.top: descriptionLabel.bottom
anchors.leftMargin: 17
anchors.rightMargin: 17
anchors.topMargin: 5
}
*/
// DateFrom picker
Label {
visible: !isMobile
id: dateFromText
anchors.left: parent.left
anchors.top: searchLine.bottom // descriptionLine.bottom
anchors.leftMargin: 17
anchors.topMargin: 17
width: 156
text: qsTr("Date from") + translationManager.emptyString
fontSize: 14
}
DatePicker {
visible: !isMobile
id: fromDatePicker
anchors.left: parent.left
anchors.top: dateFromText.bottom
anchors.leftMargin: 17
anchors.topMargin: 5
z: 2
onCurrentDateChanged: {
error = currentDate > toDatePicker.currentDate
onFilterChanged()
}
}
// DateTo picker
Label {
visible: !isMobile
id: dateToText
anchors.left: dateFromText.right
anchors.top: searchLine.bottom //descriptionLine.bottom
anchors.leftMargin: 17
anchors.topMargin: 17
text: qsTr("To") + translationManager.emptyString
fontSize: 14
}
DatePicker {
visible: !isMobile
id: toDatePicker
anchors.left: fromDatePicker.right
anchors.top: dateToText.bottom
anchors.leftMargin: 17
anchors.topMargin: 5
z: 2
onCurrentDateChanged: {
error = currentDate < fromDatePicker.currentDate
onFilterChanged()
}
}
StandardButton {
visible: !isMobile
id: filterButton
anchors.bottom: toDatePicker.bottom
anchors.left: toDatePicker.right
anchors.leftMargin: 17
width: 60
text: qsTr("Filter") + translationManager.emptyString
shadowReleasedColor: "#4D0051"
shadowPressedColor: "#2D002F"
releasedColor: "#6B0072"
pressedColor: "#4D0051"
onClicked: {
// Apply filter here;
if(datesValid){
resetFilter(model) resetFilter(model)
if (fromDatePicker.currentDate > toDatePicker.currentDate) { if (fromDatePicker.currentDate > toDatePicker.currentDate) {
@ -266,281 +111,254 @@ Rectangle {
model.dateToFilter = toDatePicker.currentDate model.dateToFilter = toDatePicker.currentDate
} }
if (advancedFilteringCheckBox.checked) { model.searchFilter = searchLine.text;
if (amountFromLine.text.length) { tableHeader.visible = model.rowCount() > 0;
model.amountFromFilter = parseFloat(amountFromLine.text)
}
if (amountToLine.text.length) {
model.amountToFilter = parseFloat(amountToLine.text)
}
var directionFilter = transactionsModel.get(transactionTypeDropdown.currentIndex).value
console.log("Direction filter: " + directionFilter)
model.directionFilter = directionFilter
}
selectedAmount.text = getSelectedAmount()
} }
} }
CheckBox { Rectangle{
id: rootLayout
visible: false
}
ColumnLayout {
id: pageRoot
anchors.margins: isMobile ? 17 : 20 * scaleRatio
anchors.topMargin: isMobile ? 0 : 40 * scaleRatio
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
spacing: 0
GridLayout {
property int column_width: {
if(!isMobile){
return (parent.width / 2) - 20;
} else {
return parent.width - 20;
}
}
columns: 2
Layout.fillWidth: true
RowLayout {
visible: !isMobile visible: !isMobile
id: advancedFilteringCheckBox Layout.preferredWidth: parent.column_width
text: qsTr("Advanced filtering") + translationManager.emptyString }
anchors.left: filterButton.right
anchors.bottom: filterButton.bottom RowLayout {
anchors.leftMargin: 17 Layout.preferredWidth: parent.column_width
checkedIcon: "../images/checkedVioletIcon.png" LineEdit {
uncheckedIcon: "../images/uncheckedIcon.png" id: searchLine
onClicked: { fontSize: 14 * scaleRatio
if(checked) tableRect.height = Qt.binding(function(){ return tableRect.collapsedHeight }) inputHeight: 28 * scaleRatio
else tableRect.height = Qt.binding(function(){ return tableRect.middleHeight }) borderDisabled: true
Layout.fillWidth: true
backgroundColor: "#404040"
placeholderText: qsTr("Search") + translationManager.emptyString
placeholderCenter: true
onTextChanged: {
onFilterChanged();
} }
} }
}
}
GridLayout {
z: 6
columns: (isMobile)? 1 : 3
Layout.fillWidth: true
columnSpacing: 22 * scaleRatio
visible: !isMobile
ColumnLayout {
Layout.fillWidth: true
RowLayout {
Layout.fillWidth: true
id: fromDateRow
Layout.minimumWidth: 150 * scaleRatio
DatePicker {
visible: !isMobile
id: fromDatePicker
Layout.fillWidth: true
width: 100 * scaleRatio
inputLabel.text: "Date from"
onCurrentDateChanged: {
onFilterChanged()
}
}
}
}
ColumnLayout {
Layout.fillWidth: true
RowLayout {
Layout.fillWidth: true
id: toDateRow
Layout.minimumWidth: 150 * scaleRatio
DatePicker {
visible: !isMobile
id: toDatePicker
Layout.fillWidth: true
width: 100 * scaleRatio
inputLabel.text: "Date to"
onCurrentDateChanged: {
onFilterChanged()
}
}
}
}
ColumnLayout {
Layout.fillWidth: true
Label { Label {
visible: !isMobile id: transactionPriority
id: transactionTypeText Layout.minimumWidth: 120 * scaleRatio
anchors.left: parent.left text: qsTr("Sort") + translationManager.emptyString
anchors.top: fromDatePicker.bottom
anchors.leftMargin: 17
anchors.topMargin: 17
width: 156
text: qsTr("Type of transaction") + translationManager.emptyString
fontSize: 14 fontSize: 14
} }
ListModel { ListModel {
id: transactionsModel id: priorityModelV5
ListElement { column1: "All"; column2: ""; value: TransactionInfo.Direction_Both }
ListElement { column1: "Sent"; column2: ""; value: TransactionInfo.Direction_Out }
ListElement { column1: "Received"; column2: ""; value: TransactionInfo.Direction_In }
ListElement { column1: qsTr("Block height") ; column2: "";}
ListElement { column1: qsTr("Date") ; column2: ""; }
} }
StandardDropdown { StandardDropdown {
visible: !isMobile id: priorityDropdown
id: transactionTypeDropdown anchors.topMargin: 2 * scaleRatio
anchors.left: parent.left fontHeaderSize: 14 * scaleRatio
anchors.top: transactionTypeText.bottom dropdownHeight: 28 * scaleRatio
anchors.leftMargin: 17
anchors.topMargin: 5
width: 156
shadowReleasedColor: "#4D0051"
shadowPressedColor: "#2D002F"
releasedColor: "#6B0072"
pressedColor: "#4D0051"
dataModel: transactionsModel
z: 1
}
Label { Layout.fillWidth: true
visible: !isMobile shadowReleasedColor: "#FF4304"
id: amountFromText shadowPressedColor: "#B32D00"
anchors.left: transactionTypeText.right releasedColor: "#404040"
anchors.top: fromDatePicker.bottom pressedColor: "#202020"
anchors.leftMargin: 17 colorHeaderBackground: "#404040"
anchors.topMargin: 17
width: 156
text: qsTr("Amount from") + translationManager.emptyString
fontSize: 14
}
LineEdit { onChanged: {
visible: !isMobile switch(priorityDropdown.currentIndex){
id: amountFromLine
anchors.left: transactionTypeDropdown.right
anchors.top: amountFromText.bottom
anchors.leftMargin: 17
anchors.topMargin: 5
width: 156
validator: DoubleValidator {
locale: "C"
notation: DoubleValidator.StandardNotation
bottom: 0
}
onTextChanged: {
// indicating error
amountFromLine.error = amountFromLine.text === "" ? false : parseFloat(amountFromLine.text) > parseFloat(amountToLine.text)
onFilterChanged()
}
}
Label {
visible: !isMobile
id: amountToText
anchors.left: amountFromText.right
anchors.top: fromDatePicker.bottom
anchors.leftMargin: 17
anchors.topMargin: 17
width: 156
text: qsTr("To") + translationManager.emptyString
fontSize: 14
}
LineEdit {
visible: !isMobile
id: amountToLine
anchors.left: amountFromLine.right
anchors.top: amountToText.bottom
anchors.leftMargin: 17
anchors.topMargin: 5
width: 156
validator: DoubleValidator {
locale: "C"
notation: DoubleValidator.StandardNotation
bottom: 0.0
}
onTextChanged: {
// indicating error
amountToLine.error = amountToLine.text === "" ? false : parseFloat(amountFromLine.text) > parseFloat(amountToLine.text)
onFilterChanged()
}
}
Item {
visible: !isMobile
id: expandItem
property bool expanded: false
anchors.right: parent.right
anchors.bottom: tableRect.top
width: 34
height: 34
Image {
anchors.centerIn: parent
source: "../images/expandTable.png"
rotation: parent.expanded ? 180 : 0
}
MouseArea {
anchors.fill: parent
onClicked: {
parent.expanded = !parent.expanded
if (advancedFilteringCheckBox.checked) {
tableRect.height = Qt.binding(function() { return parent.expanded ? tableRect.expandedHeight : tableRect.collapsedHeight })
} else {
tableRect.height = Qt.binding(function() { return parent.expanded ? tableRect.expandedHeight : tableRect.middleHeight })
}
}
}
}
Rectangle {
id: tableRect
property int expandedHeight: parent.height - filterHeaderText.y - filterHeaderText.height - 5
property int middleHeight: parent.height - fromDatePicker.y - fromDatePicker.height - 17
property int collapsedHeight: parent.height - transactionTypeDropdown.y - transactionTypeDropdown.height - 17
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
// anchors.top: parent.top
color: "#FFFFFF"
z: 1
height: (isMobile)? parent.height : middleHeight
onHeightChanged: {
if(height === middleHeight) z = 1
else if(height === collapsedHeight) z = 0
else z = 3
}
Behavior on height {
NumberAnimation { duration: 200; easing.type: Easing.InQuad }
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
height: 1
color: "#DBDBDB"
}
ListModel {
id: columnsModel
property int pidWidth: 127 * scaleRatio
ListElement { columnName: "Payment ID"; columnWidth: 127 }
ListElement { columnName: "Date"; columnWidth: 100 }
ListElement { columnName: "Block height"; columnWidth: 150 }
ListElement { columnName: "Amount"; columnWidth: 148 }
// ListElement { columnName: "Description"; columnWidth: 148 }
}
TableHeader {
id: header
visible: !isMobile
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 17 * scaleRatio
anchors.leftMargin: 14 * scaleRatio
anchors.rightMargin: 14 * scaleRatio
dataModel: columnsModel
offset: 20
onSortRequest: {
console.log("column: " + column + " desc: " + desc)
switch (column) {
case 0: case 0:
// Payment ID // block sort
model.sortRole = TransactionHistoryModel.TransactionPaymentIdRole model.sortRole = TransactionHistoryModel.TransactionBlockHeightRole;
break; break;
case 1: case 1:
// Date (actually sort by timestamp as we want to have transactions sorted within one day as well); // amount sort
model.sortRole = TransactionHistoryModel.TransactionTimeStampRole model.sortRole = TransactionHistoryModel.TransactionDateRole;
break;
case 2:
// BlockHeight;
model.sortRole = TransactionHistoryModel.TransactionBlockHeightRole
break;
case 3:
// Amount;
model.sortRole = TransactionHistoryModel.TransactionAmountRole
break; break;
} }
model.sort(0, desc ? Qt.DescendingOrder : Qt.AscendingOrder) model.sort(0, Qt.DescendingOrder);
}
}
} }
} }
Scroll { GridLayout {
id: flickableScroll Layout.topMargin: 20
visible: !isMobile visible: table.count === 0
anchors.right: table.right
anchors.rightMargin: !isMobile ? -14 * scaleRatio : 0 Label {
anchors.top: table.top fontSize: 16 * scaleRatio
anchors.bottom: table.bottom text: qsTr("No history...") + translationManager.emptyString
flickable: table
} }
}
GridLayout {
id: tableHeader
columns: 1
columnSpacing: 0
rowSpacing: 0
Layout.topMargin: 20
Layout.fillWidth: true
RowLayout{
Layout.preferredHeight: 10
Layout.fillWidth: true
Rectangle {
id: header
Layout.fillWidth: true
visible: table.count > 0
height: 10
color: "transparent"
Rectangle {
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.rightMargin: 10
anchors.leftMargin: 10
height: 1
color: "#404040"
}
Image {
anchors.top: parent.top
anchors.left: parent.left
width: 10
height: 10
source: "../images/historyBorderRadius.png"
}
Image {
anchors.top: parent.top
anchors.right: parent.right
width: 10
height: 10
source: "../images/historyBorderRadius.png"
rotation: 90
}
}
}
RowLayout {
Layout.preferredHeight: isMobile ? tableMobile.contentHeight : table.contentHeight
Layout.fillWidth: true
Layout.fillHeight: true
HistoryTable { HistoryTable {
id: table id: table
visible: !isMobile visible: !isMobile
anchors.left: parent.left
anchors.right: parent.right
anchors.top: header.bottom
anchors.bottom: parent.bottom
anchors.leftMargin: 14 * scaleRatio
anchors.rightMargin: 14 * scaleRatio
onContentYChanged: flickableScroll.flickableContentYChanged() onContentYChanged: flickableScroll.flickableContentYChanged()
model: !isMobile ? root.model : null model: !isMobile ? mainLayout.model : null
addressBookModel: null addressBookModel: null
Layout.fillWidth: true
Layout.fillHeight: true
} }
HistoryTableMobile { HistoryTableMobile {
id: tableMobile id: tableMobile
visible: isMobile visible: isMobile
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom
onContentYChanged: flickableScroll.flickableContentYChanged() onContentYChanged: flickableScroll.flickableContentYChanged()
model: isMobile ? root.model : null model: isMobile ? mainLayout.model : null
addressBookModel: null addressBookModel: null
Layout.fillWidth: true
Layout.fillHeight: true
}
}
} }
} }
@ -548,8 +366,11 @@ Rectangle {
if(currentWallet != null && typeof currentWallet.history !== "undefined" ) { if(currentWallet != null && typeof currentWallet.history !== "undefined" ) {
currentWallet.history.refresh(currentWallet.currentSubaddressAccount) currentWallet.history.refresh(currentWallet.currentSubaddressAccount)
table.addressBookModel = currentWallet ? currentWallet.addressBookModel : null table.addressBookModel = currentWallet ? currentWallet.addressBookModel : null
transactionTypeDropdown.update() //transactionTypeDropdown.update()
} }
priorityDropdown.dataModel = priorityModelV5;
priorityDropdown.currentIndex = 0;
priorityDropdown.update();
} }
} }

View file

@ -31,73 +31,76 @@ import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import "../version.js" as Version
import "../components"
import moneroComponents.Clipboard 1.0 import moneroComponents.Clipboard 1.0
import "../version.js" as Version
import "../components"
import "." 1.0
Rectangle { Rectangle {
property bool viewOnly: false property bool viewOnly: false
id: page id: page
color: "#F0EEEE" color: "transparent"
Clipboard { id: clipboard } Clipboard { id: clipboard }
ColumnLayout { ColumnLayout {
id: mainLayout id: mainLayout
anchors.margins: 17 * scaleRatio
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
spacing: 20 * scaleRatio
anchors.margins: (isMobile)? 17 : 20
anchors.topMargin: 40 * scaleRatio
spacing: 30 * scaleRatio
Layout.fillWidth: true Layout.fillWidth: true
//! Manage wallet //! Manage wallet
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
fontSize: 22 * scaleRatio
Layout.topMargin: 10 * scaleRatio
text: qsTr("Mnemonic seed") + translationManager.emptyString text: qsTr("Mnemonic seed") + translationManager.emptyString
} }
Rectangle { Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 2
color: "#DEDEDE" color: Style.dividerColor
opacity: Style.dividerOpacity
Layout.bottomMargin: 10 * scaleRatio
} }
TextEdit {
LineEditMulti{
id: seedText id: seedText
wrapMode: TextEdit.Wrap spacing: 0
Layout.fillWidth: true; copyButton: true
font.pixelSize: 14 * scaleRatio addressValidation: false
readOnly: true readOnly: true
MouseArea { wrapAnywhere: false
anchors.fill: parent
onClicked: {
appWindow.showStatusMessage(qsTr("Double tap to copy"),3)
}
onDoubleClicked: {
parent.selectAll()
parent.copy()
parent.deselect()
console.log("copied to clipboard");
appWindow.showStatusMessage(qsTr("Seed copied to clipboard"),3)
}
}
} }
} }
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
fontSize: 22 * scaleRatio
Layout.topMargin: 10 * scaleRatio
text: qsTr("Keys") + translationManager.emptyString text: qsTr("Keys") + translationManager.emptyString
} }
Rectangle { Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 2
color: "#DEDEDE" color: Style.dividerColor
opacity: Style.dividerOpacity
Layout.bottomMargin: 10 * scaleRatio
} }
TextEdit { TextEdit {
id: keysText id: keysText
@ -106,6 +109,7 @@ Rectangle {
font.pixelSize: 14 * scaleRatio font.pixelSize: 14 * scaleRatio
textFormat: TextEdit.RichText textFormat: TextEdit.RichText
readOnly: true readOnly: true
color: Style.defaultFontColor
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
@ -124,21 +128,26 @@ Rectangle {
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
fontSize: 22 * scaleRatio
Layout.topMargin: 10 * scaleRatio
text: qsTr("Export wallet") + translationManager.emptyString text: qsTr("Export wallet") + translationManager.emptyString
} }
Rectangle { Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 2
color: "#DEDEDE" color: Style.dividerColor
opacity: Style.dividerOpacity
Layout.bottomMargin: 10 * scaleRatio
} }
RowLayout { RowLayout {
StandardButton { StandardButton {
enabled: !fullWalletQRCode.visible enabled: !fullWalletQRCode.visible
id: showFullQr id: showFullQr
small: true
text: qsTr("Spendable Wallet") + translationManager.emptyString text: qsTr("Spendable Wallet") + translationManager.emptyString
onClicked: { onClicked: {
viewOnlyQRCode.visible = false viewOnlyQRCode.visible = false
@ -147,6 +156,7 @@ Rectangle {
StandardButton { StandardButton {
enabled: fullWalletQRCode.visible enabled: fullWalletQRCode.visible
id: showViewOnlyQr id: showViewOnlyQr
small: true
text: qsTr("View Only Wallet") + translationManager.emptyString text: qsTr("View Only Wallet") + translationManager.emptyString
onClicked: { onClicked: {
viewOnlyQRCode.visible = true viewOnlyQRCode.visible = true
@ -155,7 +165,6 @@ Rectangle {
Layout.bottomMargin: 30 * scaleRatio Layout.bottomMargin: 30 * scaleRatio
} }
Image { Image {
visible: !viewOnlyQRCode.visible visible: !viewOnlyQRCode.visible
id: fullWalletQRCode id: fullWalletQRCode
@ -178,6 +187,7 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
font.bold: true font.bold: true
font.pixelSize: 16 * scaleRatio font.pixelSize: 16 * scaleRatio
color: Style.defaultFontColor
text: (viewOnlyQRCode.visible) ? qsTr("View Only Wallet") + translationManager.emptyString : qsTr("Spendable Wallet") + translationManager.emptyString text: (viewOnlyQRCode.visible) ? qsTr("View Only Wallet") + translationManager.emptyString : qsTr("Spendable Wallet") + translationManager.emptyString
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
} }

View file

@ -34,7 +34,7 @@ import moneroComponents.Wallet 1.0
Rectangle { Rectangle {
id: root id: root
color: "#F0EEEE" color: "transparent"
property var currentHashRate: 0 property var currentHashRate: 0
/* main layout */ /* main layout */
@ -74,13 +74,16 @@ Rectangle {
text: qsTr("Mining with your computer helps strengthen the Monero network. The more that people mine, the harder it is for the network to be attacked, and every little bit helps.<br> <br>Mining also gives you a small chance to earn some Monero. Your computer will create hashes looking for block solutions. If you find a block, you will get the associated reward. Good luck!") + translationManager.emptyString text: qsTr("Mining with your computer helps strengthen the Monero network. The more that people mine, the harder it is for the network to be attacked, and every little bit helps.<br> <br>Mining also gives you a small chance to earn some Monero. Your computer will create hashes looking for block solutions. If you find a block, you will get the associated reward. Good luck!") + translationManager.emptyString
wrapMode: Text.Wrap wrapMode: Text.Wrap
Layout.fillWidth: true Layout.fillWidth: true
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
color: Style.defaultFontColor
} }
RowLayout { RowLayout {
id: soloMinerThreadsRow id: soloMinerThreadsRow
Label { Label {
id: soloMinerThreadsLabel id: soloMinerThreadsLabel
color: "#4A4949" color: Style.defaultFontColor
text: qsTr("CPU threads") + translationManager.emptyString text: qsTr("CPU threads") + translationManager.emptyString
fontSize: 16 fontSize: 16
Layout.preferredWidth: 120 Layout.preferredWidth: 120
@ -102,8 +105,6 @@ Rectangle {
checked: persistentSettings.allow_background_mining checked: persistentSettings.allow_background_mining
onClicked: {persistentSettings.allow_background_mining = checked} onClicked: {persistentSettings.allow_background_mining = checked}
text: qsTr("Background mining (experimental)") + translationManager.emptyString text: qsTr("Background mining (experimental)") + translationManager.emptyString
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
} }
} }
@ -118,15 +119,13 @@ Rectangle {
checked: !persistentSettings.miningIgnoreBattery checked: !persistentSettings.miningIgnoreBattery
onClicked: {persistentSettings.miningIgnoreBattery = !checked} onClicked: {persistentSettings.miningIgnoreBattery = !checked}
text: qsTr("Enable mining when running on battery") + translationManager.emptyString text: qsTr("Enable mining when running on battery") + translationManager.emptyString
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
} }
} }
RowLayout { RowLayout {
Label { Label {
id: manageSoloMinerLabel id: manageSoloMinerLabel
color: "#4A4949" color: Style.defaultFontColor
text: qsTr("Manage miner") + translationManager.emptyString text: qsTr("Manage miner") + translationManager.emptyString
fontSize: 16 fontSize: 16
} }
@ -136,11 +135,8 @@ Rectangle {
//enabled: !walletManager.isMining() //enabled: !walletManager.isMining()
id: startSoloMinerButton id: startSoloMinerButton
width: 110 width: 110
small: true
text: qsTr("Start mining") + translationManager.emptyString text: qsTr("Start mining") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: { onClicked: {
var success = walletManager.startMining(appWindow.currentWallet.address(0, 0), soloMinerThreadsLine.text, persistentSettings.allow_background_mining, persistentSettings.miningIgnoreBattery) var success = walletManager.startMining(appWindow.currentWallet.address(0, 0), soloMinerThreadsLine.text, persistentSettings.allow_background_mining, persistentSettings.miningIgnoreBattery)
if (success) { if (success) {
@ -161,11 +157,8 @@ Rectangle {
//enabled: walletManager.isMining() //enabled: walletManager.isMining()
id: stopSoloMinerButton id: stopSoloMinerButton
width: 110 width: 110
small: true
text: qsTr("Stop mining") + translationManager.emptyString text: qsTr("Stop mining") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: { onClicked: {
walletManager.stopMining() walletManager.stopMining()
update() update()
@ -177,6 +170,7 @@ Rectangle {
Text { Text {
id: statusText id: statusText
text: qsTr("Status: not mining") text: qsTr("Status: not mining")
color: Style.defaultFontColor
textFormat: Text.RichText textFormat: Text.RichText
wrapMode: Text.Wrap wrapMode: Text.Wrap
} }

View file

@ -27,7 +27,7 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Controls 1.4 import QtQuick.Controls 2.2
import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
@ -43,7 +43,7 @@ import moneroComponents.SubaddressModel 1.0
Rectangle { Rectangle {
id: pageReceive id: pageReceive
color: "#F0EEEE" color: "transparent"
property var model property var model
property var current_address property var current_address
property alias addressText : pageReceive.current_address property alias addressText : pageReceive.current_address
@ -142,7 +142,6 @@ Rectangle {
Clipboard { id: clipboard } Clipboard { id: clipboard }
/* main layout */ /* main layout */
ColumnLayout { ColumnLayout {
id: mainLayout id: mainLayout
@ -159,9 +158,9 @@ Rectangle {
property int lineEditFontSize: 12 * scaleRatio property int lineEditFontSize: 12 * scaleRatio
property int qrCodeSize: 240 * scaleRatio property int qrCodeSize: 240 * scaleRatio
ColumnLayout { ColumnLayout {
id: addressRow id: addressRow
spacing: 0
Label { Label {
id: addressLabel id: addressLabel
text: qsTr("Addresses") + translationManager.emptyString text: qsTr("Addresses") + translationManager.emptyString
@ -169,10 +168,54 @@ Rectangle {
} }
Rectangle { Rectangle {
id: tableRect id: header
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 200 Layout.topMargin: 10
color: "#FFFFFF" visible: table.count > 0
height: 10
color: "transparent"
Rectangle {
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.rightMargin: 10
anchors.leftMargin: 10
height: 1
color: "#404040"
}
Image {
anchors.top: parent.top
anchors.left: parent.left
width: 10
height: 10
source: "../images/historyBorderRadius.png"
}
Image {
anchors.top: parent.top
anchors.right: parent.right
width: 10
height: 10
source: "../images/historyBorderRadius.png"
rotation: 90
}
}
Rectangle {
id: tableRect
property int table_max_height: 260
Layout.fillWidth: true
Layout.preferredHeight: table.contentHeight < table_max_height ? table.contentHeight : table_max_height
color: "transparent"
Scroll { Scroll {
id: flickableScroll id: flickableScroll
anchors.right: table.right anchors.right: table.right
@ -180,6 +223,7 @@ Rectangle {
anchors.bottom: table.bottom anchors.bottom: table.bottom
flickable: table flickable: table
} }
SubaddressTable { SubaddressTable {
id: table id: table
anchors.fill: parent anchors.fill: parent
@ -192,11 +236,10 @@ Rectangle {
RowLayout { RowLayout {
spacing: 20 spacing: 20
Layout.topMargin: 20
StandardButton { StandardButton {
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Create new address") + translationManager.emptyString; text: qsTr("Create new address") + translationManager.emptyString;
onClicked: { onClicked: {
inputDialog.labelText = qsTr("Set the label of the new address:") + translationManager.emptyString inputDialog.labelText = qsTr("Set the label of the new address:") + translationManager.emptyString
@ -210,10 +253,7 @@ Rectangle {
} }
} }
StandardButton { StandardButton {
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: table.currentIndex > 0 enabled: table.currentIndex > 0
text: qsTr("Rename") + translationManager.emptyString; text: qsTr("Rename") + translationManager.emptyString;
onClicked: { onClicked: {
@ -240,7 +280,6 @@ Rectangle {
LineEdit { LineEdit {
id: amountLine id: amountLine
fontSize: mainLayout.lineEditFontSize
placeholderText: qsTr("Amount to receive") + translationManager.emptyString placeholderText: qsTr("Amount to receive") + translationManager.emptyString
readOnly: false readOnly: false
width: mainLayout.editWidth width: mainLayout.editWidth
@ -255,7 +294,7 @@ Rectangle {
} }
} }
RowLayout { ColumnLayout {
id: trackingRow id: trackingRow
visible: !isAndroid && !isIOS visible: !isAndroid && !isIOS
Label { Label {
@ -288,15 +327,14 @@ Rectangle {
TextEdit { TextEdit {
id: trackingLine id: trackingLine
anchors.top: trackingRow.top
textFormat: Text.RichText
text: ""
readOnly: true readOnly: true
width: mainLayout.editWidth width: mainLayout.editWidth
Layout.fillWidth: true Layout.fillWidth: true
textFormat: Text.RichText
text: ""
selectByMouse: true selectByMouse: true
color: 'white'
} }
} }
MessageDialog { MessageDialog {

View file

@ -41,48 +41,58 @@ Rectangle {
property bool viewOnly: false property bool viewOnly: false
id: page id: page
color: "#F0EEEE" color: "transparent"
// fires on every page load
function onPageCompleted() {
console.log("Settings page loaded");
if(typeof daemonManager != "undefined"){
appWindow.daemonRunning = daemonManager.running(persistentSettings.testnet);
}
logLevelDropdown.update()
}
Clipboard { id: clipboard } Clipboard { id: clipboard }
function initSettings() {
//runs on every page load
}
ColumnLayout { ColumnLayout {
id: mainLayout id: mainLayout
anchors.margins: 17 * scaleRatio anchors.margins: (isMobile)? 17 : 40
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
spacing: 10 * scaleRatio spacing: 26 * scaleRatio
//! Manage wallet //! Manage wallet
RowLayout { RowLayout {
Layout.fillWidth: true
Label { Label {
id: manageWalletLabel id: manageWalletLabel
fontSize: 22 * scaleRatio
Layout.fillWidth: true Layout.fillWidth: true
color: "#4A4949"
text: qsTr("Manage wallet") + translationManager.emptyString text: qsTr("Manage wallet") + translationManager.emptyString
Layout.topMargin: 10 * scaleRatio Layout.topMargin: 10 * scaleRatio
} }
}
Rectangle { Rectangle {
anchors.top: manageWalletLabel.bottom
anchors.topMargin: 4
anchors.left: parent.left
anchors.right: parent.right
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 2
color: "#DEDEDE" color: Style.dividerColor
opacity: Style.dividerOpacity
}
} }
GridLayout { GridLayout {
columns: (isMobile)? 1 : 4 columns: (isMobile)? 1 : 4
StandardButton { StandardButton {
id: closeWalletButton id: closeWalletButton
small: true
text: qsTr("Close wallet") + translationManager.emptyString text: qsTr("Close wallet") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: true visible: true
onClicked: { onClicked: {
console.log("closing wallet button clicked") console.log("closing wallet button clicked")
@ -91,13 +101,10 @@ Rectangle {
} }
StandardButton { StandardButton {
enabled: !viewOnly
id: createViewOnlyWalletButton id: createViewOnlyWalletButton
enabled: !viewOnly
small: true
text: qsTr("Create view only wallet") + translationManager.emptyString text: qsTr("Create view only wallet") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: true visible: true
onClicked: { onClicked: {
wizard.openCreateViewOnlyWalletPage(); wizard.openCreateViewOnlyWalletPage();
@ -141,12 +148,9 @@ Rectangle {
*/ */
StandardButton { StandardButton {
id: rescanSpentButton id: rescanSpentButton
small: true
enabled: !persistentSettings.useRemoteNode enabled: !persistentSettings.useRemoteNode
text: qsTr("Rescan wallet balance") + translationManager.emptyString text: qsTr("Rescan wallet balance") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: { onClicked: {
if (!currentWallet.rescanSpent()) { if (!currentWallet.rescanSpent()) {
console.error("Error: ", currentWallet.errorString); console.error("Error: ", currentWallet.errorString);
@ -164,14 +168,15 @@ Rectangle {
} }
} }
} }
}
RowLayout{
Layout.fillWidth: true
StandardButton { StandardButton {
id: changePasswordButton id: changePasswordButton
small: true
text: qsTr("Change password") + translationManager.emptyString text: qsTr("Change password") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: { onClicked: {
passwordDialog.onAcceptedCallback = function() { passwordDialog.onAcceptedCallback = function() {
if(appWindow.walletPassword === passwordDialog.password){ if(appWindow.walletPassword === passwordDialog.password){
@ -193,16 +198,20 @@ Rectangle {
} }
RowLayout { RowLayout {
Layout.fillWidth: true
LabelSubheader {
text: qsTr("Wallet mode") + translationManager.emptyString
}
}
RowLayout {
StandardButton { StandardButton {
id: remoteDisconnect id: remoteDisconnect
small: true
enabled: persistentSettings.useRemoteNode enabled: persistentSettings.useRemoteNode
Layout.fillWidth: false Layout.fillWidth: false
text: qsTr("Local Node") + translationManager.emptyString text: qsTr("Local Node") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: { onClicked: {
appWindow.disconnectRemoteNode(); appWindow.disconnectRemoteNode();
} }
@ -210,185 +219,51 @@ Rectangle {
StandardButton { StandardButton {
id: remoteConnect id: remoteConnect
small: true
enabled: !persistentSettings.useRemoteNode enabled: !persistentSettings.useRemoteNode
Layout.fillWidth: false Layout.fillWidth: false
text: qsTr("Remote Node") + translationManager.emptyString text: qsTr("Remote Node") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: { onClicked: {
appWindow.connectRemoteNode(); appWindow.connectRemoteNode();
} }
} }
} }
//! Manage daemon
RowLayout { RowLayout {
visible: !isMobile
Layout.topMargin: 20
Label {
id: manageDaemonLabel
color: "#4A4949"
text: qsTr("Manage Daemon") + translationManager.emptyString
}
CheckBox {
id: daemonAdvanced
Layout.leftMargin: 15
text: qsTr("Show advanced") + translationManager.emptyString
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
}
}
Rectangle {
Layout.fillWidth: true
height: 1
color: "#DEDEDE"
}
GridLayout {
visible: !isMobile && !persistentSettings.useRemoteNode visible: !isMobile && !persistentSettings.useRemoteNode
id: daemonStatusRow
columns: (isMobile) ? 2 : 4
StandardButton {
visible: !appWindow.daemonRunning
id: startDaemonButton
text: qsTr("Start Local Node") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: {
// Update bootstrap daemon address
persistentSettings.bootstrapNodeAddress = bootstrapNodeEdit.daemonAddrText ? bootstrapNodeEdit.getAddress() : "";
// Set current daemon address to local
appWindow.currentDaemonAddress = appWindow.localDaemonAddress
appWindow.startDaemon(daemonFlags.text)
}
}
StandardButton {
visible: appWindow.daemonRunning
id: stopDaemonButton
text: qsTr("Stop Local Node") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: {
appWindow.stopDaemon()
}
}
StandardButton {
visible: true
id: daemonStatusButton
text: qsTr("Show status") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: {
daemonManager.sendCommand("status",currentWallet.nettype);
daemonConsolePopup.open();
}
}
}
ColumnLayout {
id: blockchainFolderRow
visible: !isMobile && !persistentSettings.useRemoteNode
Label {
id: blockchainFolderLabel
color: "#4A4949"
text: qsTr("Blockchain location") + translationManager.emptyString
}
LineEdit {
id: blockchainFolder
Layout.preferredWidth: 200
Layout.fillWidth: true Layout.fillWidth: true
text: persistentSettings.blockchainDataDir
placeholderText: qsTr("(optional)") + translationManager.emptyString
MouseArea { LabelSubheader {
anchors.fill: parent text: qsTr("Bootstrap node") + translationManager.emptyString
onClicked: {
mouse.accepted = false
if(persistentSettings.blockchainDataDir != "")
blockchainFileDialog.folder = "file://" + persistentSettings.blockchainDataDir
blockchainFileDialog.open()
blockchainFolder.focus = true
}
}
}
}
RowLayout {
visible: daemonAdvanced.checked && !isMobile && !persistentSettings.useRemoteNode
id: daemonFlagsRow
Label {
id: daemonFlagsLabel
color: "#4A4949"
text: qsTr("Local daemon startup flags") + translationManager.emptyString
}
LineEdit {
id: daemonFlags
Layout.preferredWidth: 200
Layout.fillWidth: true
text: appWindow.persistentSettings.daemonFlags;
placeholderText: qsTr("(optional)") + translationManager.emptyString
}
}
RowLayout {
Layout.fillWidth: true
visible: (daemonAdvanced.checked || isMobile) && persistentSettings.useRemoteNode
Label {
id: daemonLoginLabel
Layout.fillWidth: true
color: "#4A4949"
text: qsTr("Node login (optional)") + translationManager.emptyString
}
}
ColumnLayout {
visible: (daemonAdvanced.checked || isMobile) && persistentSettings.useRemoteNode
LineEdit {
id: daemonUsername
Layout.preferredWidth: 100 * scaleRatio
Layout.fillWidth: true
text: persistentSettings.daemonUsername
placeholderText: qsTr("Username") + translationManager.emptyString
}
LineEdit {
id: daemonPassword
Layout.preferredWidth: 100 * scaleRatio
Layout.fillWidth: true
text: persistentSettings.daemonPassword
placeholderText: qsTr("Password") + translationManager.emptyString
echoMode: TextInput.Password
} }
} }
RowLayout { RowLayout {
visible: !isMobile && !persistentSettings.useRemoteNode visible: !isMobile && !persistentSettings.useRemoteNode
ColumnLayout { ColumnLayout {
Label { Layout.fillWidth: true
color: "#4A4949"
text: qsTr("Bootstrap node (leave blank if not wanted)") + translationManager.emptyString
}
RemoteNodeEdit { RemoteNodeEdit {
id: bootstrapNodeEdit id: bootstrapNodeEdit
Layout.minimumWidth: 100 * scaleRatio Layout.minimumWidth: 100 * scaleRatio
Layout.bottomMargin: 20 * scaleRatio
lineEditBackgroundColor: "transparent"
lineEditFontColor: "white"
lineEditBorderColor: Qt.rgba(255, 255, 255, 0.35)
daemonAddrLabelText: qsTr("Address")
daemonPortLabelText: qsTr("Port")
daemonAddrText: persistentSettings.bootstrapNodeAddress.split(":")[0].trim() daemonAddrText: persistentSettings.bootstrapNodeAddress.split(":")[0].trim()
daemonPortText: (persistentSettings.bootstrapNodeAddress.split(":")[1].trim() == "") ? "18081" : persistentSettings.bootstrapNodeAddress.split(":")[1] daemonPortText: {
var node_split = persistentSettings.bootstrapNodeAddress.split(":");
if(node_split.length == 2){
(node_split[1].trim() == "") ? "18081" : node_split[1];
} else {
return ""
}
}
onEditingFinished: { onEditingFinished: {
persistentSettings.bootstrapNodeAddress = daemonAddrText ? bootstrapNodeEdit.getAddress() : ""; persistentSettings.bootstrapNodeAddress = daemonAddrText ? bootstrapNodeEdit.getAddress() : "";
console.log("setting bootstrap node to " + persistentSettings.bootstrapNodeAddress) console.log("setting bootstrap node to " + persistentSettings.bootstrapNodeAddress)
@ -400,13 +275,19 @@ Rectangle {
RowLayout { RowLayout {
visible: persistentSettings.useRemoteNode visible: persistentSettings.useRemoteNode
ColumnLayout { ColumnLayout {
Label { Layout.fillWidth: true
color: "#4A4949"
text: qsTr("Remote node") + translationManager.emptyString
}
RemoteNodeEdit { RemoteNodeEdit {
id: remoteNodeEdit id: remoteNodeEdit
Layout.minimumWidth: 100 * scaleRatio Layout.minimumWidth: 100 * scaleRatio
lineEditBackgroundColor: "transparent"
lineEditFontColor: "white"
lineEditBorderColor: Qt.rgba(255, 255, 255, 0.35)
daemonAddrLabelText: qsTr("Address")
daemonPortLabelText: qsTr("Port")
property var rna: persistentSettings.remoteNodeAddress property var rna: persistentSettings.remoteNodeAddress
daemonAddrText: rna.search(":") != -1 ? rna.split(":")[0].trim() : "" daemonAddrText: rna.search(":") != -1 ? rna.split(":")[0].trim() : ""
daemonPortText: rna.search(":") != -1 ? (rna.split(":")[1].trim() == "") ? "18081" : rna.split(":")[1] : "" daemonPortText: rna.search(":") != -1 ? (rna.split(":")[1].trim() == "") ? "18081" : rna.split(":")[1] : ""
@ -415,14 +296,17 @@ Rectangle {
console.log("setting remote node to " + persistentSettings.remoteNodeAddress) console.log("setting remote node to " + persistentSettings.remoteNodeAddress)
} }
} }
}
}
RowLayout{
visible: persistentSettings.useRemoteNode
Layout.fillWidth: true
StandardButton { StandardButton {
id: remoteNodeSave id: remoteNodeSave
small: true
text: qsTr("Connect") + translationManager.emptyString text: qsTr("Connect") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: { onClicked: {
// Update daemon login // Update daemon login
persistentSettings.remoteNodeAddress = remoteNodeEdit.getAddress(); persistentSettings.remoteNodeAddress = remoteNodeEdit.getAddress();
@ -436,22 +320,179 @@ Rectangle {
} }
} }
} }
//! Manage daemon
RowLayout {
visible: !isMobile
Label {
id: manageDaemonLabel
fontSize: 22 * scaleRatio
text: qsTr("Manage Daemon") + translationManager.emptyString
}
Rectangle {
anchors.top: manageDaemonLabel.bottom
anchors.topMargin: 4
anchors.left: parent.left
anchors.right: parent.right
Layout.fillWidth: true
height: 2
color: Style.dividerColor
opacity: Style.dividerOpacity
}
}
GridLayout {
visible: !isMobile && !persistentSettings.useRemoteNode
id: daemonStatusRow
columns: (isMobile) ? 2 : 4
StandardButton {
id: startDaemonButton
small: true
visible: !appWindow.daemonRunning
text: qsTr("Start Local Node") + translationManager.emptyString
onClicked: {
// Update bootstrap daemon address
persistentSettings.bootstrapNodeAddress = bootstrapNodeEdit.daemonAddrText ? bootstrapNodeEdit.getAddress() : "";
// Set current daemon address to local
appWindow.currentDaemonAddress = appWindow.localDaemonAddress;
appWindow.startDaemon(daemonFlags.text);
}
}
StandardButton {
id: stopDaemonButton
small: true
visible: appWindow.daemonRunning
text: qsTr("Stop Local Node") + translationManager.emptyString
onClicked: {
appWindow.stopDaemon()
}
}
StandardButton {
id: daemonStatusButton
small: true
visible: true
text: qsTr("Show status") + translationManager.emptyString
onClicked: {
daemonManager.sendCommand("status",currentWallet.nettype);
daemonConsolePopup.open();
}
}
}
ColumnLayout {
id: blockchainFolderRow
visible: !isMobile && !persistentSettings.useRemoteNode
RowLayout {
Layout.fillWidth: true
Layout.bottomMargin: 14 * scaleRatio
LabelSubheader {
text: qsTr("Blockchain location") + translationManager.emptyString
}
}
RowLayout {
visible: persistentSettings.blockchainDataDir.length > 0
LineEdit {
id: blockchainFolder
Layout.preferredWidth: 200
Layout.fillWidth: true
text: persistentSettings.blockchainDataDir;
placeholderText: qsTr("(optional)") + translationManager.emptyString
}
}
RowLayout {
Layout.fillWidth: true
Layout.topMargin: 8
StandardButton {
id: blockchainFolderButton
small: true
visible: true
text: qsTr("Change location") + translationManager.emptyString
onClicked: {
//mouse.accepted = false
if(persistentSettings.blockchainDataDir != "")
blockchainFileDialog.folder = "file://" + persistentSettings.blockchainDataDir
blockchainFileDialog.open()
blockchainFolder.focus = true
}
}
}
}
RowLayout{
CheckBox {
id: daemonAdvanced
text: qsTr("Show advanced") + translationManager.emptyString
}
}
RowLayout {
visible: daemonAdvanced.checked && !isMobile && !persistentSettings.useRemoteNode
id: daemonFlagsRow
LineEdit {
id: daemonFlags
Layout.preferredWidth: 200
Layout.fillWidth: true
labelText: qsTr("Local daemon startup flags") + translationManager.emptyString
text: appWindow.persistentSettings.daemonFlags;
placeholderText: qsTr("(optional)") + translationManager.emptyString
}
}
ColumnLayout {
visible: (daemonAdvanced.checked || isMobile) && persistentSettings.useRemoteNode
GridLayout {
columns: (isMobile) ? 1 : 2
columnSpacing: 32
LineEdit {
id: daemonUsername
Layout.fillWidth: true
labelText: "Daemon username"
text: persistentSettings.daemonUsername
placeholderText: qsTr("Username") + translationManager.emptyString
}
LineEdit {
id: daemonPassword
Layout.fillWidth: true
labelText: "Daemon password"
text: persistentSettings.daemonPassword
placeholderText: qsTr("Password") + translationManager.emptyString
echoMode: TextInput.Password
}
}
} }
RowLayout { RowLayout {
visible: !isMobile visible: !isMobile
Label { Label {
color: "#4A4949" id: layoutSettingsLabel
fontSize: 22 * scaleRatio
text: qsTr("Layout settings") + translationManager.emptyString text: qsTr("Layout settings") + translationManager.emptyString
anchors.topMargin: 30 * scaleRatio
Layout.topMargin: 30 * scaleRatio
}
} }
Rectangle { Rectangle {
visible: !isMobile anchors.top: layoutSettingsLabel.bottom
anchors.topMargin: 4
anchors.left: parent.left
anchors.right: parent.right
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 2
color: "#DEDEDE" color: Style.dividerColor
opacity: Style.dividerOpacity
}
} }
RowLayout { RowLayout {
@ -461,8 +502,6 @@ Rectangle {
checked: persistentSettings.customDecorations checked: persistentSettings.customDecorations
onClicked: appWindow.setCustomWindowDecorations(checked) onClicked: appWindow.setCustomWindowDecorations(checked)
text: qsTr("Custom decorations") + translationManager.emptyString text: qsTr("Custom decorations") + translationManager.emptyString
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
} }
} }
@ -470,23 +509,47 @@ Rectangle {
RowLayout { RowLayout {
Label { Label {
color: "#4A4949" id: logLevelLabel
fontSize: 22 * scaleRatio
text: qsTr("Log level") + translationManager.emptyString text: qsTr("Log level") + translationManager.emptyString
anchors.topMargin: 30 * scaleRatio
Layout.topMargin: 30 * scaleRatio
}
} }
Rectangle { Rectangle {
anchors.top: logLevelLabel.bottom
anchors.topMargin: 4
anchors.left: parent.left
anchors.right: parent.right
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 2
color: "#DEDEDE" color: Style.dividerColor
opacity: Style.dividerOpacity
} }
}
GridLayout {
columns: (isMobile)? 1 : 3
Layout.fillWidth: true
columnSpacing: 32
ColumnLayout { ColumnLayout {
ComboBox { spacing: 0
Layout.fillWidth: true
ListModel {
id: logLevel id: logLevel
model: [0,1,2,3,4,"custom"] ListElement { name: "wow"; column1: "0"; }
ListElement { column1: "1"; }
ListElement { column1: "2"; }
ListElement { column1: "3"; }
ListElement { column1: "4"; }
ListElement { column1: "custom"; }
}
StandardDropdown {
id: logLevelDropdown
dataModel: logLevel
currentIndex: appWindow.persistentSettings.logLevel; currentIndex: appWindow.persistentSettings.logLevel;
onCurrentIndexChanged: { onChanged: {
if (currentIndex == 5) { if (currentIndex == 5) {
console.log("log categories changed: ", logCategories.text); console.log("log categories changed: ", logCategories.text);
walletManager.setLogCategories(logCategories.text); walletManager.setLogCategories(logCategories.text);
@ -497,14 +560,33 @@ Rectangle {
} }
appWindow.persistentSettings.logLevel = currentIndex; appWindow.persistentSettings.logLevel = currentIndex;
} }
Layout.fillWidth: true
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#363636"
pressedColor: "#202020"
}
// Make sure dropdown is on top
z: parent.z + 30
} }
ColumnLayout {
Layout.fillWidth: true
}
ColumnLayout {
Layout.fillWidth: true
}
}
ColumnLayout {
LineEdit { LineEdit {
id: logCategories id: logCategories
Layout.fillWidth: true Layout.fillWidth: true
text: appWindow.persistentSettings.logCategories text: appWindow.persistentSettings.logCategories
labelText: "Log Categories"
placeholderText: qsTr("(e.g. *:WARNING,net.p2p:DEBUG)") + translationManager.emptyString placeholderText: qsTr("(e.g. *:WARNING,net.p2p:DEBUG)") + translationManager.emptyString
enabled: logLevel.currentIndex == 5 enabled: logLevelDropdown.currentIndex === 5
onEditingFinished: { onEditingFinished: {
if(enabled) { if(enabled) {
console.log("log categories changed: ", text); console.log("log categories changed: ", text);
@ -518,31 +600,41 @@ Rectangle {
// Version // Version
RowLayout { RowLayout {
Label { Label {
color: "#4A4949" id: debugLabel
text: qsTr("Debug info") + translationManager.emptyString text: qsTr("Debug info") + translationManager.emptyString
fontSize: 16 fontSize: 22
anchors.topMargin: 30 * scaleRatio anchors.topMargin: 30 * scaleRatio
Layout.topMargin: 30 * scaleRatio Layout.topMargin: 30 * scaleRatio
} }
}
Rectangle { Rectangle {
anchors.top: debugLabel.bottom
anchors.topMargin: 4
anchors.left: parent.left
anchors.right: parent.right
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 2
color: "#DEDEDE" color: Style.dividerColor
opacity: Style.dividerOpacity
} }
}
TextBlock { TextBlock {
Layout.topMargin: 8 Layout.topMargin: 8
font.pixelSize: 14
Layout.fillWidth: true Layout.fillWidth: true
text: qsTr("GUI version: ") + Version.GUI_VERSION + translationManager.emptyString text: qsTr("GUI version: ") + Version.GUI_VERSION + translationManager.emptyString
} }
TextBlock { TextBlock {
id: guiMoneroVersion id: guiMoneroVersion
Layout.fillWidth: true Layout.fillWidth: true
font.pixelSize: 14
text: qsTr("Embedded Monero version: ") + Version.GUI_MONERO_VERSION + translationManager.emptyString text: qsTr("Embedded Monero version: ") + Version.GUI_MONERO_VERSION + translationManager.emptyString
} }
TextBlock { TextBlock {
id: restoreHeightText id: restoreHeightText
Layout.fillWidth: true Layout.fillWidth: true
font.pixelSize: 14
textFormat: Text.RichText textFormat: Text.RichText
property var txt: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C}</style>" + qsTr("Wallet creation height: ") + (currentWallet ? currentWallet.walletCreationHeight : "") + translationManager.emptyString property var txt: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C}</style>" + qsTr("Wallet creation height: ") + (currentWallet ? currentWallet.walletCreationHeight : "") + translationManager.emptyString
property var linkTxt: qsTr(" <a href='#'>(Click to change)</a>") + translationManager.emptyString property var linkTxt: qsTr(" <a href='#'>(Click to change)</a>") + translationManager.emptyString
@ -569,13 +661,10 @@ Rectangle {
StandardButton { StandardButton {
id: restoreHeightSave id: restoreHeightSave
small: true
Layout.fillWidth: false Layout.fillWidth: false
Layout.leftMargin: 30 Layout.leftMargin: 30
text: qsTr("Save") + translationManager.emptyString text: qsTr("Save") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: { onClicked: {
currentWallet.walletCreationHeight = restoreHeight.text currentWallet.walletCreationHeight = restoreHeight.text
@ -613,14 +702,17 @@ Rectangle {
TextBlock { TextBlock {
Layout.fillWidth: true Layout.fillWidth: true
font.pixelSize: 14
text: (!currentWallet) ? "" : qsTr("Wallet log path: ") + currentWallet.walletLogPath + translationManager.emptyString text: (!currentWallet) ? "" : qsTr("Wallet log path: ") + currentWallet.walletLogPath + translationManager.emptyString
} }
TextBlock { TextBlock {
Layout.fillWidth: true Layout.fillWidth: true
font.pixelSize: 14
text: qsTr("Wallet Name: ") + walletName + translationManager.emptyString text: qsTr("Wallet Name: ") + walletName + translationManager.emptyString
} }
TextBlock { TextBlock {
Layout.fillWidth: true Layout.fillWidth: true
font.pixelSize: 14
text: (!currentWallet) ? "" : qsTr("Daemon log path: ") + currentWallet.daemonLogPath + translationManager.emptyString text: (!currentWallet) ? "" : qsTr("Daemon log path: ") + currentWallet.daemonLogPath + translationManager.emptyString
} }
} }
@ -644,7 +736,8 @@ Rectangle {
folder: "file://" + persistentSettings.blockchainDataDir folder: "file://" + persistentSettings.blockchainDataDir
onAccepted: { onAccepted: {
var dataDir = walletManager.urlToLocalPath(blockchainFileDialog.fileUrl) var dataDir = walletManager.urlToLocalPath(blockchainFileDialog.fileUrl);
console.log(dataDir);
var validator = daemonManager.validateDataDir(dataDir); var validator = daemonManager.validateDataDir(dataDir);
if(!validator.valid) { if(!validator.valid) {
@ -691,16 +784,6 @@ Rectangle {
} }
// fires on every page load
function onPageCompleted() {
console.log("Settings page loaded");
initSettings();
if(typeof daemonManager != "undefined")
appWindow.daemonRunning = daemonManager.running(persistentSettings.nettype)
}
// fires only once // fires only once
Component.onCompleted: { Component.onCompleted: {
if(typeof daemonManager != "undefined") if(typeof daemonManager != "undefined")

View file

@ -37,7 +37,7 @@ import moneroComponents.Clipboard 1.0
Rectangle { Rectangle {
color: "#F0EEEE" color: "transparent"
Clipboard { id: clipboard } Clipboard { id: clipboard }
@ -90,6 +90,7 @@ Rectangle {
"This database is meant for use by Monero wallets as well as wallets from Monero clones which reuse the Monero keys.") + translationManager.emptyString "This database is meant for use by Monero wallets as well as wallets from Monero clones which reuse the Monero keys.") + translationManager.emptyString
wrapMode: Text.Wrap wrapMode: Text.Wrap
Layout.fillWidth: true; Layout.fillWidth: true;
color: Style.defaultFontColor
} }
Text { Text {
@ -117,6 +118,7 @@ Rectangle {
sharedRingDBDialog.icon = StandardIcon.Information sharedRingDBDialog.icon = StandardIcon.Information
sharedRingDBDialog.open() sharedRingDBDialog.open()
} }
color: Style.defaultFontColor
} }
RowLayout { RowLayout {
@ -140,11 +142,8 @@ Rectangle {
id: selectBlackballFileButton id: selectBlackballFileButton
anchors.rightMargin: 17 * scaleRatio anchors.rightMargin: 17 * scaleRatio
text: qsTr("Select") + translationManager.emptyString text: qsTr("Select") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: true enabled: true
small: true
onClicked: { onClicked: {
loadBlackballFileDialog.open() loadBlackballFileDialog.open()
} }
@ -172,10 +171,7 @@ Rectangle {
id: loadBlackballFileButton id: loadBlackballFileButton
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Load") + translationManager.emptyString text: qsTr("Load") + translationManager.emptyString
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: !!appWindow.currentWallet enabled: !!appWindow.currentWallet
onClicked: appWindow.currentWallet.blackballOutputs(walletManager.urlToLocalPath(loadBlackballFileDialog.fileUrl), true) onClicked: appWindow.currentWallet.blackballOutputs(walletManager.urlToLocalPath(loadBlackballFileDialog.fileUrl), true)
} }
@ -209,10 +205,7 @@ Rectangle {
StandardButton { StandardButton {
id: blackballButton id: blackballButton
text: qsTr("Blackball") + translationManager.emptyString text: qsTr("Blackball") + translationManager.emptyString
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: !!appWindow.currentWallet && validHex32(blackballOutputLine.text) enabled: !!appWindow.currentWallet && validHex32(blackballOutputLine.text)
onClicked: appWindow.currentWallet.blackballOutput(blackballOutputLine.text) onClicked: appWindow.currentWallet.blackballOutput(blackballOutputLine.text)
} }
@ -221,10 +214,7 @@ Rectangle {
id: unblackballButton id: unblackballButton
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Unblackball") + translationManager.emptyString text: qsTr("Unblackball") + translationManager.emptyString
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: !!appWindow.currentWallet && validHex32(blackballOutputLine.text) enabled: !!appWindow.currentWallet && validHex32(blackballOutputLine.text)
onClicked: appWindow.currentWallet.unblackballOutput(blackballOutputLine.text) onClicked: appWindow.currentWallet.unblackballOutput(blackballOutputLine.text)
} }
@ -255,6 +245,7 @@ Rectangle {
sharedRingDBDialog.icon = StandardIcon.Information sharedRingDBDialog.icon = StandardIcon.Information
sharedRingDBDialog.open() sharedRingDBDialog.open()
} }
color: Style.defaultFontColor
} }
RowLayout { RowLayout {
@ -281,10 +272,7 @@ Rectangle {
StandardButton { StandardButton {
id: getRingButton id: getRingButton
text: qsTr("Get Ring") + translationManager.emptyString text: qsTr("Get Ring") + translationManager.emptyString
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: !!appWindow.currentWallet && validHex32(keyImageLine.text) enabled: !!appWindow.currentWallet && validHex32(keyImageLine.text)
onClicked: { onClicked: {
var ring = appWindow.currentWallet.getRing(keyImageLine.text) var ring = appWindow.currentWallet.getRing(keyImageLine.text)
@ -322,7 +310,7 @@ Rectangle {
id: setRingRelative id: setRingRelative
checked: true checked: true
text: qsTr("Relative") + translationManager.emptyString text: qsTr("Relative") + translationManager.emptyString
checkedIcon: "../images/checkedVioletIcon.png" checkedIcon: "../images/checkedBlackIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png" uncheckedIcon: "../images/uncheckedIcon.png"
} }
LineEdit { LineEdit {
@ -344,10 +332,6 @@ Rectangle {
StandardButton { StandardButton {
id: setRingButton id: setRingButton
text: qsTr("Set Ring") + translationManager.emptyString text: qsTr("Set Ring") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: !!appWindow.currentWallet && validHex32(keyImageLine.text) && validRing(setRingLine.text.trim(), setRingRelative.checked) enabled: !!appWindow.currentWallet && validHex32(keyImageLine.text) && validRing(setRingLine.text.trim(), setRingRelative.checked)
onClicked: { onClicked: {
var outs = setRingLine.text.trim() var outs = setRingLine.text.trim()
@ -360,7 +344,7 @@ Rectangle {
id: segregatePreForkOutputs id: segregatePreForkOutputs
checked: persistentSettings.segregatePreForkOutputs checked: persistentSettings.segregatePreForkOutputs
text: qsTr("I intend to spend on key-reusing fork(s)") + translationManager.emptyString text: qsTr("I intend to spend on key-reusing fork(s)") + translationManager.emptyString
checkedIcon: "../images/checkedVioletIcon.png" checkedIcon: "../images/checkedBlackIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png" uncheckedIcon: "../images/uncheckedIcon.png"
onClicked: { onClicked: {
persistentSettings.segregatePreForkOutputs = segregatePreForkOutputs.checked persistentSettings.segregatePreForkOutputs = segregatePreForkOutputs.checked
@ -373,7 +357,7 @@ Rectangle {
id: keyReuseMitigation2 id: keyReuseMitigation2
checked: persistentSettings.keyReuseMitigation2 checked: persistentSettings.keyReuseMitigation2
text: qsTr("I might want to spend on key-reusing fork(s)") + translationManager.emptyString text: qsTr("I might want to spend on key-reusing fork(s)") + translationManager.emptyString
checkedIcon: "../images/checkedVioletIcon.png" checkedIcon: "../images/checkedBlackIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png" uncheckedIcon: "../images/uncheckedIcon.png"
onClicked: { onClicked: {
persistentSettings.keyReuseMitigation2 = keyReuseMitigation2.checked persistentSettings.keyReuseMitigation2 = keyReuseMitigation2.checked

View file

@ -39,14 +39,10 @@ import moneroComponents.WalletManager 1.0
Rectangle { Rectangle {
id: mainLayout id: mainLayout
color: "#F0EEEE" color: "transparent"
Clipboard { id: clipboard } Clipboard { id: clipboard }
function checkAddress(address, nettype) {
return walletManager.addressValid(address, nettype)
}
MessageDialog { MessageDialog {
// dynamically change onclose handler // dynamically change onclose handler
property var onCloseCallback property var onCloseCallback
@ -88,222 +84,154 @@ Rectangle {
// sign / verify // sign / verify
ColumnLayout { ColumnLayout {
anchors.margins: 17 * scaleRatio anchors.top: parent.top
anchors.margins: 40 * scaleRatio
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom
spacing: 20 * scaleRatio spacing: 20 * scaleRatio
// sign // sign
ColumnLayout { ColumnLayout {
id: signBox id: signBox
RowLayout {
Text {
text: qsTr("Sign a message or file contents with your address:") + translationManager.emptyString
wrapMode: Text.Wrap
font.pixelSize: 14 * scaleRatio
Layout.fillWidth: true
}
}
Label {
id: signMessageLabel
text: qsTr("Either message:") + translationManager.emptyString
}
RowLayout {
id: signMessageRow
anchors.topMargin: 17
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
spacing: 20 * scaleRatio
Label {
id: signTitleLabel
fontSize: 24 * scaleRatio
text: qsTr("Sign") + translationManager.emptyString
}
Text {
text: qsTr("This page lets you sign/verify a message (or file contents) with your address.") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.fillWidth: true
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
color: Style.defaultFontColor
}
ColumnLayout{
id: signMessageRow
RowLayout {
Layout.fillWidth: true
LineEdit { LineEdit {
id: signMessageLine id: signMessageLine
anchors.left: parent.left Layout.fillWidth: true
anchors.right: signMessageButton.left
placeholderText: qsTr("Message to sign") + translationManager.emptyString; placeholderText: qsTr("Message to sign") + translationManager.emptyString;
labelText: qsTr("Message") + translationManager.emptyString;
readOnly: false readOnly: false
onTextChanged: signSignatureLine.text = "" onTextChanged: signSignatureLine.text = ""
}
}
IconButton { RowLayout{
imageSource: "../images/copyToClipboard.png" Layout.fillWidth: true
onClicked: { Layout.topMargin: 18
if (signMessageLine.text.length > 0) {
clipboard.setText(signMessageLine.text)
}
}
}
}
StandardButton { StandardButton {
id: signMessageButton id: signMessageButton
anchors.right: parent.right
text: qsTr("Sign") + translationManager.emptyString text: qsTr("Sign") + translationManager.emptyString
shadowReleasedColor: "#FF4304" enabled: signMessageLine.text !== ''
shadowPressedColor: "#B32D00" small: true
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: true
onClicked: { onClicked: {
var signature = appWindow.currentWallet.signMessage(signMessageLine.text, false) var signature = appWindow.currentWallet.signMessage(signMessageLine.text, false)
signSignatureLine.text = signature signSignatureLine.text = signature
} }
} }
} }
Label {
id: signMessageFileLabel
text: qsTr("Or file:") + translationManager.emptyString
} }
ColumnLayout {
id: signFileRow
RowLayout { RowLayout {
id: signFileRow
anchors.topMargin: 17
anchors.left: parent.left
anchors.right: parent.right
FileDialog {
id: signFileDialog
title: qsTr("Please choose a file to sign") + translationManager.emptyString;
folder: "file://"
nameFilters: [ "*"]
onAccepted: {
signFileLine.text = walletManager.urlToLocalPath(signFileDialog.fileUrl)
}
}
StandardButton {
id: loadFileToSignButton
anchors.rightMargin: 17 * scaleRatio
text: qsTr("Select") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: true
onClicked: {
signFileDialog.open()
}
}
LineEdit { LineEdit {
id: signFileLine id: signFileLine
anchors.left: loadFileToSignButton.right labelText: "Message from file"
anchors.right: signFileButton.left placeholderText: qsTr("Path to file") + translationManager.emptyString;
placeholderText: qsTr("Filename with message to sign") + translationManager.emptyString;
readOnly: false readOnly: false
Layout.fillWidth: true Layout.fillWidth: true
onTextChanged: signSignatureLine.text = "" onTextChanged: signSignatureLine.text = ""
}
}
IconButton { RowLayout {
imageSource: "../images/copyToClipboard.png" Layout.fillWidth: true
Layout.topMargin: 18
StandardButton {
id: loadFileToSignButton
small: true
text: qsTr("Browse") + translationManager.emptyString
enabled: true
onClicked: { onClicked: {
if (signFileLine.text.length > 0) { signFileDialog.open();
clipboard.setText(signFileLine.text)
}
}
} }
} }
StandardButton { StandardButton {
id: signFileButton id: signFileButton
anchors.right: parent.right small: true
anchors.left: loadFileToSignButton.right
anchors.leftMargin: 20
text: qsTr("Sign") + translationManager.emptyString text: qsTr("Sign") + translationManager.emptyString
shadowReleasedColor: "#FF4304" enabled: signFileLine.text !== ''
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: true
onClicked: { onClicked: {
var signature = appWindow.currentWallet.signMessage(signFileLine.text, true) var signature = appWindow.currentWallet.signMessage(signFileLine.text, true);
signSignatureLine.text = signature signSignatureLine.text = signature;
} }
} }
} }
}
ColumnLayout { ColumnLayout {
id: signSignatureRow id: signSignatureRow
anchors.topMargin: 17 * scaleRatio
Label {
id: signSignatureLabel
text: qsTr("Signature") + translationManager.emptyString
}
RowLayout {
LineEdit { LineEdit {
id: signSignatureLine id: signSignatureLine
labelText: qsTr("Signature")
placeholderText: qsTr("Signature") + translationManager.emptyString; placeholderText: qsTr("Signature") + translationManager.emptyString;
readOnly: true readOnly: true
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (signSignatureLine.text.length > 0) {
clipboard.setText(signSignatureLine.text)
} }
} }
} }
}
}
}
// verify
ColumnLayout {
id: verifyBox
RowLayout {
Text {
text: qsTr("Verify a message or file signature from an address:") + translationManager.emptyString
wrapMode: Text.Wrap
font.pixelSize: 14 * scaleRatio
Layout.fillWidth: true
}
}
Label { Label {
id: verifyMessageLabel id: verifyTitleLabel
text: qsTr("Either message:") + translationManager.emptyString fontSize: 24 * scaleRatio
Layout.topMargin: 40
text: qsTr("Verify") + translationManager.emptyString
} }
ColumnLayout {
RowLayout { RowLayout {
id: verifyMessageRow id: verifyMessageRow
anchors.topMargin: 17 * scaleRatio
anchors.left: parent.left
anchors.right: parent.right
LineEdit { LineEdit {
id: verifyMessageLine id: verifyMessageLine
anchors.left: parent.left Layout.fillWidth: true
anchors.right: verifyMessageButton.left labelText: qsTr("Verify message")
placeholderText: qsTr("Message to verify") + translationManager.emptyString; placeholderText: qsTr("Message to verify") + translationManager.emptyString;
readOnly: false readOnly: false
Layout.fillWidth: true }
}
IconButton { RowLayout{
imageSource: "../images/copyToClipboard.png" Layout.fillWidth: true
onClicked: { Layout.topMargin: 18
if (verifyMessageLine.text.length > 0) {
clipboard.setText(verifyMessageLine.text)
}
}
}
}
StandardButton { StandardButton {
id: verifyMessageButton id: verifyMessageButton
anchors.right: parent.right small: true
text: qsTr("Verify") + translationManager.emptyString text: qsTr("Verify") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: true enabled: true
onClicked: { onClicked: {
var verified = appWindow.currentWallet.verifySignedMessage(verifyMessageLine.text, verifyAddressLine.text, verifySignatureLine.text, false) var verified = appWindow.currentWallet.verifySignedMessage(verifyMessageLine.text, verifyAddressLine.text, verifySignatureLine.text, false)
@ -311,68 +239,39 @@ Rectangle {
} }
} }
} }
}
Label { ColumnLayout {
id: verifyMessageFileLabel RowLayout {
text: qsTr("Or file:") + translationManager.emptyString LineEdit {
id: verifyFileLine
labelText: qsTr("Verify file")
placeholderText: qsTr("Filename with message to verify") + translationManager.emptyString;
readOnly: false
Layout.fillWidth: true
}
} }
RowLayout{ RowLayout{
id: verifyFileRow Layout.fillWidth: true
anchors.topMargin: 17 * scaleRatio Layout.topMargin: 18
anchors.left: parent.left
anchors.right: parent.right
FileDialog {
id: verifyFileDialog
title: qsTr("Please choose a file to verify") + translationManager.emptyString;
folder: "file://"
nameFilters: [ "*"]
onAccepted: {
verifyFileLine.text = walletManager.urlToLocalPath(verifyFileDialog.fileUrl)
}
}
StandardButton { StandardButton {
id: loadFileToVerifyButton id: loadFileToVerifyButton
anchors.rightMargin: 17 * scaleRatio small: true
text: qsTr("Select") + translationManager.emptyString text: qsTr("Browse") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: true enabled: true
onClicked: { onClicked: {
verifyFileDialog.open() verifyFileDialog.open()
} }
} }
LineEdit {
id: verifyFileLine
anchors.left: loadFileToVerifyButton.right
anchors.right: verifyFileButton.left
placeholderText: qsTr("Filename with message to verify") + translationManager.emptyString;
readOnly: false
Layout.fillWidth: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (verifyFileLine.text.length > 0) {
clipboard.setText(verifyFileLine.text)
}
}
}
}
StandardButton { StandardButton {
id: verifyFileButton id: verifyFileButton
anchors.right: parent.right small: true
anchors.left: loadFileToVerifyButton.right
anchors.leftMargin: 20
text: qsTr("Verify") + translationManager.emptyString text: qsTr("Verify") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: true enabled: true
onClicked: { onClicked: {
var verified = appWindow.currentWallet.verifySignedMessage(verifyFileLine.text, verifyAddressLine.text, verifySignatureLine.text, true) var verified = appWindow.currentWallet.verifySignedMessage(verifyFileLine.text, verifyAddressLine.text, verifySignatureLine.text, true)
@ -380,30 +279,20 @@ Rectangle {
} }
} }
} }
Text {
id: verifyAddressLabel
text: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: " + (14 * scaleRatio) + "px;}</style>" +
qsTr("Signing address") +
"<font size='" + (2 * scaleRatio) + "'> ( " +
qsTr("Paste in or select from <a href='#'>Address book</a>") +
" )</font>" +
translationManager.emptyString
wrapMode: Text.Wrap
font.pixelSize: 14 * scaleRatio
Layout.fillWidth: true
textFormat: Text.RichText
onLinkActivated: appWindow.showPageRequest("AddressBook")
} }
LineEdit { ColumnLayout {
RowLayout{
LineEditMulti {
id: verifyAddressLine id: verifyAddressLine
anchors.left: parent.left Layout.fillWidth: true
anchors.right: parent.right labelText: qsTr("Address")
anchors.top: verifyAddressLabel.bottom addressValidation: true
anchors.topMargin: 5 * scaleRatio anchors.topMargin: 5 * scaleRatio
placeholderText: "4..." placeholderText: "4..."
// validator: RegExpValidator { regExp: /[0-9A-Fa-f]{95}/g } }
}
} }
ColumnLayout { ColumnLayout {
@ -419,16 +308,31 @@ Rectangle {
id: verifySignatureLine id: verifySignatureLine
placeholderText: qsTr("Signature") + translationManager.emptyString; placeholderText: qsTr("Signature") + translationManager.emptyString;
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
}
}
}
IconButton {
imageSource: "../images/copyToClipboard.png" FileDialog {
onClicked: { id: signFileDialog
if (verifySignatureLine.text.length > 0) { title: qsTr("Please choose a file to sign") + translationManager.emptyString;
clipboard.setText(verifySignatureLine.text) folder: "file://"
} nameFilters: [ "*"]
}
onAccepted: {
signFileLine.text = walletManager.urlToLocalPath(signFileDialog.fileUrl)
} }
} }
FileDialog {
id: verifyFileDialog
title: qsTr("Please choose a file to verify") + translationManager.emptyString;
folder: "file://"
nameFilters: [ "*"]
onAccepted: {
verifyFileLine.text = walletManager.urlToLocalPath(verifyFileDialog.fileUrl)
} }
} }
} }

View file

@ -29,9 +29,11 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import moneroComponents.Clipboard 1.0
import moneroComponents.PendingTransaction 1.0 import moneroComponents.PendingTransaction 1.0
import "../components"
import moneroComponents.Wallet 1.0 import moneroComponents.Wallet 1.0
import "../components"
import "." 1.0
Rectangle { Rectangle {
@ -40,13 +42,12 @@ Rectangle {
int priority, string description) int priority, string description)
signal sweepUnmixableClicked() signal sweepUnmixableClicked()
color: "#F0EEEE" color: "transparent"
property string startLinkText: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style><font size='2'> (</font><a href='#'>" + property string startLinkText: qsTr("<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style><font size='2'> (</font><a href='#'>Start daemon</a><font size='2'>)</font>") + translationManager.emptyString
qsTr("Start daemon") +
"</a><font size='2'>)</font>" +
translationManager.emptyString
property bool showAdvanced: false property bool showAdvanced: false
Clipboard { id: clipboard }
function scaleValueToMixinCount(scaleValue) { function scaleValueToMixinCount(scaleValue) {
var scaleToMixinCount = [6,7,8,9,10,11,12,13,14,16,18,20,22,25]; var scaleToMixinCount = [6,7,8,9,10,11,12,13,14,16,18,20,22,25];
if (scaleValue < scaleToMixinCount.length) { if (scaleValue < scaleToMixinCount.length) {
@ -112,43 +113,86 @@ Rectangle {
ColumnLayout { ColumnLayout {
id: pageRoot id: pageRoot
anchors.top: parent.top anchors.margins: (isMobile)? 17 : 20
anchors.topMargin: 40 * scaleRatio
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
anchors.margins: 17 * scaleRatio
spacing: 0 spacing: 30 * scaleRatio
RowLayout{
visible: warningText.text !== ""
Rectangle {
id: statusRect
Layout.preferredHeight: warningText.height + 40
Layout.fillWidth: true
radius: 2
border.color: Qt.rgba(255, 255, 255, 0.25)
border.width: 1
color: "transparent"
GridLayout{
Layout.fillWidth: true
Layout.preferredHeight: warningText.height + 40
Image {
Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: 33
Layout.preferredWidth: 33
Layout.leftMargin: 10
Layout.topMargin: 10
source: "../images/warning.png"
}
Text {
id: warningText
Layout.topMargin: 12 * scaleRatio
Layout.preferredWidth: statusRect.width - 80
Layout.leftMargin: 6
text: qsTr("This page lets you sign/verify a message (or file contents) with your address.") + translationManager.emptyString
wrapMode: Text.Wrap
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
color: Style.defaultFontColor
textFormat: Text.RichText
onLinkActivated: {
appWindow.startDaemon(appWindow.persistentSettings.daemonFlags);
}
}
}
}
}
GridLayout { GridLayout {
columns: (isMobile)? 1 : 2 columns: (isMobile)? 1 : 2
Layout.fillWidth: true Layout.fillWidth: true
columnSpacing: 32
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Label {
id: amountLabel
text: qsTr("Amount") + translationManager.emptyString
}
RowLayout { RowLayout {
Layout.fillWidth: true
id: amountRow id: amountRow
Layout.minimumWidth: 200
Item {
visible: !isMobile
width: 37 * scaleRatio
height: 37 * scaleRatio
Image { Layout.fillWidth: true
anchors.centerIn: parent Layout.minimumWidth: 200
source: "../images/moneroIcon.png"
}
}
// Amount input // Amount input
LineEdit { LineEdit {
Layout.fillWidth: true
id: amountLine id: amountLine
Layout.fillWidth: true
inlineIcon: true
labelText: qsTr("Amount") + translationManager.emptyString
placeholderText: qsTr("") + translationManager.emptyString placeholderText: qsTr("") + translationManager.emptyString
width: 100 width: 100
fontBold: true
inlineButtonText: qsTr("All") + translationManager.emptyString
inlineButton.onClicked: amountLine.text = "(all)"
validator: DoubleValidator { validator: DoubleValidator {
bottom: 0.0 bottom: 0.0
top: 18446744.073709551615 top: 18446744.073709551615
@ -157,28 +201,17 @@ Rectangle {
locale: "C" locale: "C"
} }
} }
StandardButton {
id: amountAllButton
width: 60 * scaleRatio
text: qsTr("All") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled : true
onClicked: amountLine.text = "(all)"
} }
} }
}
ColumnLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Label { Label {
id: transactionPriority id: transactionPriority
Layout.topMargin: 14
text: qsTr("Transaction priority") + translationManager.emptyString text: qsTr("Transaction priority") + translationManager.emptyString
fontBold: false
fontSize: 16
} }
// Note: workaround for translations in listElements // Note: workaround for translations in listElements
// ListElement: cannot use script for property value, so // ListElement: cannot use script for property value, so
@ -196,74 +229,38 @@ Rectangle {
ListElement { column1: qsTr("Normal (x1 fee)") ; column2: ""; priority: 2 } ListElement { column1: qsTr("Normal (x1 fee)") ; column2: ""; priority: 2 }
ListElement { column1: qsTr("Fast (x5 fee)") ; column2: ""; priority: 3 } ListElement { column1: qsTr("Fast (x5 fee)") ; column2: ""; priority: 3 }
ListElement { column1: qsTr("Fastest (x41.5 fee)") ; column2: ""; priority: 4 } ListElement { column1: qsTr("Fastest (x41.5 fee)") ; column2: ""; priority: 4 }
} }
StandardDropdown { StandardDropdown {
Layout.fillWidth: true Layout.fillWidth: true
id: priorityDropdown id: priorityDropdown
Layout.topMargin: 6
shadowReleasedColor: "#FF4304" shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00" shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C" releasedColor: "#363636"
pressedColor: "#FF4304" pressedColor: "#202020"
} }
} }
// Make sure dropdown is on top // Make sure dropdown is on top
z: parent.z + 1 z: parent.z + 1
} }
ColumnLayout {
Layout.fillWidth: true
Label {
id: addressLabel
textFormat: Text.RichText
text: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>" +
qsTr("Address") +
"<font size='2'> ( " +
qsTr("Paste in or select from <a href='#'>Address book</a>") +
" )</font>" +
translationManager.emptyString
onLinkActivated: appWindow.showPageRequest("AddressBook")
Layout.fillWidth: true
}
// recipient address input // recipient address input
RowLayout { RowLayout {
id: addressLineRow id: addressLineRow
Layout.fillWidth: true Layout.fillWidth: true
StandardButton { LineEditMulti {
id: qrfinderButton
text: qsTr("QR Code") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible : appWindow.qrScannerEnabled
enabled : visible
width: visible ? 60 * scaleRatio : 0
onClicked: {
cameraUi.state = "Capture"
cameraUi.qrcode_decoded.connect(updateFromQrCode)
}
}
LineEdit {
id: addressLine id: addressLine
Layout.fillWidth: true spacing: 0
anchors.topMargin: 5 * scaleRatio fontBold: true
placeholderText: "4..." labelText: qsTr("<style type='text/css'>a {text-decoration: none; color: #858585; font-size: 14px;}</style>\
// validator: RegExpValidator { regExp: /[0-9A-Fa-f]{95}/g } Address <font size='2'> ( </font> <a href='#'>Address book</a><font size='2'> )</font>")
} + translationManager.emptyString
labelButtonText: qsTr("Resolve") + translationManager.emptyString
StandardButton { placeholderText: "4.."
id: resolveButton onInputLabelLinkActivated: { appWindow.showPageRequest("AddressBook") }
width: 60 * scaleRatio onLabelButtonClicked: {
text: qsTr("Resolve") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled : isValidOpenAliasAddress(addressLine.text)
onClicked: {
var result = walletManager.resolveOpenAlias(addressLine.text) var result = walletManager.resolveOpenAlias(addressLine.text)
if (result) { if (result) {
var parts = result.split("|") var parts = result.split("|")
@ -295,41 +292,53 @@ Rectangle {
} }
} }
} }
StandardButton {
id: qrfinderButton
text: qsTr("QR Code") + translationManager.emptyString
visible : appWindow.qrScannerEnabled
enabled : visible
width: visible ? 60 * scaleRatio : 0
onClicked: {
cameraUi.state = "Capture"
cameraUi.qrcode_decoded.connect(updateFromQrCode)
}
}
} }
Label { RowLayout {
id: paymentIdLabel
text: qsTr("Payment ID <font size='2'>( Optional )</font>") + translationManager.emptyString
}
// payment id input // payment id input
LineEdit { LineEdit {
id: paymentIdLine id: paymentIdLine
fontBold: true
labelText: qsTr("Payment ID <font size='2'>( Optional )</font>") + translationManager.emptyString
placeholderText: qsTr("16 or 64 hexadecimal characters") + translationManager.emptyString placeholderText: qsTr("16 or 64 hexadecimal characters") + translationManager.emptyString
Layout.fillWidth: true Layout.fillWidth: true
} }
Label {
text: qsTr("Description <font size='2'>( Optional )</font>")
+ translationManager.emptyString
} }
RowLayout {
LineEdit { LineEdit {
id: descriptionLine id: descriptionLine
labelText: qsTr("Description <font size='2'>( Optional )</font>") + translationManager.emptyString
placeholderText: qsTr("Saved to local wallet history") + translationManager.emptyString placeholderText: qsTr("Saved to local wallet history") + translationManager.emptyString
Layout.fillWidth: true Layout.fillWidth: true
} }
}
RowLayout {
StandardButton { StandardButton {
id: sendButton id: sendButton
Layout.bottomMargin: 17 * scaleRatio rightIcon: "../images/rightIcon.png"
Layout.topMargin: 17 * scaleRatio Layout.topMargin: 4 * scaleRatio
text: qsTr("Send") + translationManager.emptyString text: qsTr("Send") + translationManager.emptyString
shadowReleasedColor: "#FF4304" enabled : {
shadowPressedColor: "#B32D00" // Send button is enabled when:
releasedColor: "#FF6C3C" // 1) Currently opened wallet is not view-only
pressedColor: "#FF4304" // 2) There is no warning box displayed
enabled : !appWindow.viewOnly && pageRoot.checkInformation(amountLine.text, addressLine.text, paymentIdLine.text, appWindow.persistentSettings.nettype) // 3) The transactional information is correct
return !appWindow.viewOnly && warningText.text === '' && pageRoot.checkInformation(amountLine.text, addressLine.text, paymentIdLine.text, appWindow.persistentSettings.nettype);
}
onClicked: { onClicked: {
console.log("Transfer: paymentClicked") console.log("Transfer: paymentClicked")
var priority = priorityModelV5.get(priorityDropdown.currentIndex).priority var priority = priorityModelV5.get(priorityDropdown.currentIndex).priority
@ -376,22 +385,19 @@ Rectangle {
anchors.top: pageRoot.bottom anchors.top: pageRoot.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.leftMargin: 17 * scaleRatio anchors.margins: (isMobile)? 17 : 20
anchors.topMargin: 17 * scaleRatio anchors.topMargin: 32 * scaleRatio
anchors.bottomMargin: 17 * scaleRatio spacing: 26 * scaleRatio
spacing: 10 * scaleRatio
enabled: !viewOnly || pageRoot.enabled enabled: !viewOnly || pageRoot.enabled
RowLayout { RowLayout {
CheckBox { CheckBox2 {
id: showAdvancedCheckbox id: showAdvancedCheckbox
checked: persistentSettings.transferShowAdvanced checked: persistentSettings.transferShowAdvanced
onClicked: { onClicked: {
persistentSettings.transferShowAdvanced = !persistentSettings.transferShowAdvanced persistentSettings.transferShowAdvanced = !persistentSettings.transferShowAdvanced
} }
text: qsTr("Show advanced options") + translationManager.emptyString text: qsTr("Advanced options") + translationManager.emptyString
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
} }
} }
@ -399,7 +405,8 @@ Rectangle {
visible: persistentSettings.transferShowAdvanced visible: persistentSettings.transferShowAdvanced
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 1
color: "#DEDEDE" color: Style.dividerColor
opacity: Style.dividerOpacity
Layout.bottomMargin: 30 * scaleRatio Layout.bottomMargin: 30 * scaleRatio
} }
@ -410,7 +417,7 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
Label { Label {
id: privacyLabel id: privacyLabel
fontSize: 14 fontSize: 15
text: "" text: ""
} }
@ -422,8 +429,6 @@ Rectangle {
} }
} }
PrivacyLevel { PrivacyLevel {
visible: persistentSettings.transferShowAdvanced && !isMobile visible: persistentSettings.transferShowAdvanced && !isMobile
id: privacyLevelItem id: privacyLevelItem
@ -442,7 +447,6 @@ Rectangle {
onFillLevelChanged: updateMixin() onFillLevelChanged: updateMixin()
} }
GridLayout { GridLayout {
visible: persistentSettings.transferShowAdvanced visible: persistentSettings.transferShowAdvanced
Layout.topMargin: 50 * scaleRatio Layout.topMargin: 50 * scaleRatio
@ -453,11 +457,8 @@ Rectangle {
StandardButton { StandardButton {
id: sweepUnmixableButton id: sweepUnmixableButton
text: qsTr("Sweep Unmixable") + translationManager.emptyString text: qsTr("Sweep Unmixable") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled : pageRoot.enabled enabled : pageRoot.enabled
small: true
onClicked: { onClicked: {
console.log("Transfer: sweepUnmixableClicked") console.log("Transfer: sweepUnmixableClicked")
root.sweepUnmixableClicked() root.sweepUnmixableClicked()
@ -467,12 +468,9 @@ Rectangle {
StandardButton { StandardButton {
id: saveTxButton id: saveTxButton
text: qsTr("Create tx file") + translationManager.emptyString text: qsTr("Create tx file") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: appWindow.viewOnly visible: appWindow.viewOnly
enabled: pageRoot.checkInformation(amountLine.text, addressLine.text, paymentIdLine.text, appWindow.persistentSettings.nettype) enabled: pageRoot.checkInformation(amountLine.text, addressLine.text, paymentIdLine.text, appWindow.persistentSettings.nettype)
small: true
onClicked: { onClicked: {
console.log("Transfer: saveTx Clicked") console.log("Transfer: saveTx Clicked")
var priority = priorityModelV5.get(priorityDropdown.currentIndex).priority var priority = priorityModelV5.get(priorityDropdown.currentIndex).priority
@ -489,10 +487,7 @@ Rectangle {
StandardButton { StandardButton {
id: signTxButton id: signTxButton
text: qsTr("Sign tx file") + translationManager.emptyString text: qsTr("Sign tx file") + translationManager.emptyString
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: !appWindow.viewOnly visible: !appWindow.viewOnly
onClicked: { onClicked: {
console.log("Transfer: sign tx clicked") console.log("Transfer: sign tx clicked")
@ -503,10 +498,7 @@ Rectangle {
StandardButton { StandardButton {
id: submitTxButton id: submitTxButton
text: qsTr("Submit tx file") + translationManager.emptyString text: qsTr("Submit tx file") + translationManager.emptyString
shadowReleasedColor: "#FF4304" small: true
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: appWindow.viewOnly visible: appWindow.viewOnly
enabled: pageRoot.enabled enabled: pageRoot.enabled
onClicked: { onClicked: {
@ -515,12 +507,8 @@ Rectangle {
} }
} }
} }
} }
//SignTxDialog //SignTxDialog
FileDialog { FileDialog {
id: signTxDialog id: signTxDialog
@ -598,7 +586,7 @@ Rectangle {
informationPopup.open(); informationPopup.open();
} else { } else {
informationPopup.title = qsTr("Information") + translationManager.emptyString informationPopup.title = qsTr("Information") + translationManager.emptyString
informationPopup.text = qsTr("Money sent successfully") + translationManager.emptyString informationPopup.text = qsTr("Monero sent successfully") + translationManager.emptyString
informationPopup.icon = StandardIcon.Information informationPopup.icon = StandardIcon.Information
informationPopup.onCloseCallback = null informationPopup.onCloseCallback = null
informationPopup.open(); informationPopup.open();
@ -610,23 +598,7 @@ Rectangle {
} }
Rectangle {
x: root.width/2 - width/2
y: root.height/2 - height/2
height:statusText.paintedHeight + 50 * scaleRatio
width:statusText.paintedWidth + 40 * scaleRatio
visible: statusText.text != ""
opacity: 0.9
Text {
id: statusText
anchors.fill:parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
textFormat: Text.RichText
onLinkActivated: { appWindow.startDaemon(appWindow.persistentSettings.daemonFlags); }
}
}
Component.onCompleted: { Component.onCompleted: {
//Disable password page until enabled by updateStatus //Disable password page until enabled by updateStatus
@ -651,35 +623,35 @@ Rectangle {
//TODO: enable send page when we're connected and daemon is synced //TODO: enable send page when we're connected and daemon is synced
function updateStatus() { function updateStatus() {
pageRoot.enabled = true;
if(typeof currentWallet === "undefined") { if(typeof currentWallet === "undefined") {
statusText.text = qsTr("Wallet is not connected to daemon.") + "<br>" + root.startLinkText warningText.text = qsTr("Wallet is not connected to daemon.") + root.startLinkText
return; return;
} }
if (currentWallet.viewOnly) { if (currentWallet.viewOnly) {
// statusText.text = qsTr("Wallet is view only.") // warningText.text = qsTr("Wallet is view only.")
//return; //return;
} }
pageRoot.enabled = false; //pageRoot.enabled = false;
switch (currentWallet.connected()) { switch (currentWallet.connected()) {
case Wallet.ConnectionStatus_Disconnected: case Wallet.ConnectionStatus_Disconnected:
statusText.text = qsTr("Wallet is not connected to daemon.") + "<br>" + root.startLinkText warningText.text = qsTr("Wallet is not connected to daemon.") + root.startLinkText
break break
case Wallet.ConnectionStatus_WrongVersion: case Wallet.ConnectionStatus_WrongVersion:
statusText.text = qsTr("Connected daemon is not compatible with GUI. \n" + warningText.text = qsTr("Connected daemon is not compatible with GUI. \n" +
"Please upgrade or connect to another daemon") "Please upgrade or connect to another daemon")
break break
default: default:
if(!appWindow.daemonSynced){ if(!appWindow.daemonSynced){
statusText.text = qsTr("Waiting on daemon synchronization to finish") warningText.text = qsTr("Waiting on daemon synchronization to finish")
} else { } else {
// everything OK, enable transfer page // everything OK, enable transfer page
// Light wallet is always ready // Light wallet is always ready
pageRoot.enabled = true; pageRoot.enabled = true;
statusText.text = ""; warningText.text = "";
} }
} }
} }

View file

@ -34,161 +34,91 @@ import QtQuick.Layouts 1.1
import "../components" import "../components"
import moneroComponents.Clipboard 1.0 import moneroComponents.Clipboard 1.0
import "../js/TxUtils.js" as TxUtils
Rectangle { Rectangle {
color: "#F0EEEE" color: "transparent"
Clipboard { id: clipboard } Clipboard { id: clipboard }
function checkAddress(address, nettype) {
return walletManager.addressValid(address, nettype)
}
function check256(str, length) {
if (str.length != length)
return false;
for (var i = 0; i < length; ++i) {
if (str[i] >= '0' && str[i] <= '9')
continue;
if (str[i] >= 'a' && str[i] <= 'z')
continue;
if (str[i] >= 'A' && str[i] <= 'Z')
continue;
return false;
}
return true;
}
function checkTxID(txid) {
return check256(txid, 64)
}
function checkSignature(signature) {
if (signature.indexOf("OutProofV") === 0) {
if ((signature.length - 10) % 132 != 0)
return false;
return check256(signature, signature.length);
} else if (signature.indexOf("InProofV") === 0) {
if ((signature.length - 9) % 132 != 0)
return false;
return check256(signature, signature.length);
} else if (signature.indexOf("SpendProofV") === 0) {
if ((signature.length - 12) % 88 != 0)
return false;
return check256(signature, signature.length);
}
return false;
}
/* main layout */ /* main layout */
ColumnLayout { ColumnLayout {
id: mainLayout id: mainLayout
anchors.margins: 40 anchors.margins: 40 * scaleRatio
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom
spacing: 20 * scaleRatio
spacing: 20 // solo
property int labelWidth: 120 ColumnLayout {
property int editWidth: 400 id: soloBox
property int lineEditFontSize: 12 anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
spacing: 20 * scaleRatio
Label {
id: soloTitleLabel
fontSize: 24 * scaleRatio
text: qsTr("Prove Transaction") + translationManager.emptyString
}
Text { Text {
text: qsTr("Generate a proof of your incoming/outgoing payment by supplying the transaction ID, the recipient address and an optional message. \n" + text: qsTr("Generate a proof of your incoming/outgoing payment by supplying the transaction ID, the recipient address and an optional message. \n" +
"For the case of outgoing payments, you can get a 'Spend Proof' that proves the authorship of a transaction. In this case, you don't need to specify the recipient address.") + translationManager.emptyString "For the case of outgoing payments, you can get a 'Spend Proof' that proves the authorship of a transaction. In this case, you don't need to specify the recipient address.") + translationManager.emptyString
wrapMode: Text.Wrap wrapMode: Text.Wrap
Layout.fillWidth: true; Layout.fillWidth: true
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
color: Style.defaultFontColor
} }
RowLayout { RowLayout {
Label {
fontSize: 14
text: qsTr("Transaction ID") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit { LineEdit {
labelText: qsTr("Transaction ID") + translationManager.emptyString
id: getProofTxIdLine id: getProofTxIdLine
fontSize: mainLayout.lineEditFontSize fontSize: 16 * scaleRatio
placeholderText: qsTr("Paste tx ID") + translationManager.emptyString placeholderText: qsTr("Paste tx ID") + translationManager.emptyString
readOnly: false readOnly: false
width: mainLayout.editWidth
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (getProofTxIdLine.text.length > 0) {
clipboard.setText(getProofTxIdLine.text)
}
}
}
} }
} }
RowLayout { RowLayout {
Label {
fontSize: 14
text: qsTr("Address") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit { LineEdit {
id: getProofAddressLine id: getProofAddressLine
fontSize: mainLayout.lineEditFontSize labelText: qsTr("Address") + translationManager.emptyString
fontSize: 16 * scaleRatio
placeholderText: qsTr("Recipient's wallet address") + translationManager.emptyString; placeholderText: qsTr("Recipient's wallet address") + translationManager.emptyString;
readOnly: false readOnly: false
width: mainLayout.editWidth
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (getProofAddressLine.text.length > 0) {
clipboard.setText(getProofAddressLine.text)
}
}
}
} }
} }
RowLayout { RowLayout {
Label {
fontSize: 14
text: qsTr("Message") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit { LineEdit {
id: getProofMessageLine id: getProofMessageLine
fontSize: mainLayout.lineEditFontSize fontSize: 16 * scaleRatio
labelText: qsTr("Message") + translationManager.emptyString
placeholderText: qsTr("Optional message against which the signature is signed") + translationManager.emptyString; placeholderText: qsTr("Optional message against which the signature is signed") + translationManager.emptyString;
readOnly: false readOnly: false
width: mainLayout.editWidth width: mainLayout.editWidth
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (getProofMessageLine.text.length > 0) {
clipboard.setText(getProofMessageLine.text)
}
}
}
} }
} }
StandardButton { StandardButton {
anchors.left: parent.left anchors.left: parent.left
anchors.topMargin: 17 anchors.topMargin: 17 * scaleRatio
width: 60 width: 60 * scaleRatio
text: qsTr("Generate") + translationManager.emptyString text: qsTr("Generate") + translationManager.emptyString
shadowReleasedColor: "#FF4304" enabled: TxUtils.checkTxID(getProofTxIdLine.text) && (getProofAddressLine.text.length == 0 || TxUtils.checkAddress(getProofAddressLine.text, appWindow.persistentSettings.nettype))
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: checkTxID(getProofTxIdLine.text) && (getProofAddressLine.text.length == 0 || checkAddress(getProofAddressLine.text, appWindow.persistentSettings.nettype))
onClicked: { onClicked: {
console.log("getProof: Generate clicked: txid " + getProofTxIdLine.text + ", address " + getProofAddressLine.text + ", message: " + getProofMessageLine.text); console.log("getProof: Generate clicked: txid " + getProofTxIdLine.text + ", address " + getProofAddressLine.text + ", message: " + getProofMessageLine.text);
root.getProofClicked(getProofTxIdLine.text, getProofAddressLine.text, getProofMessageLine.text) root.getProofClicked(getProofTxIdLine.text, getProofAddressLine.text, getProofMessageLine.text)
@ -198,137 +128,86 @@ Rectangle {
// underline // underline
Rectangle { Rectangle {
height: 1 height: 1
color: "#DBDBDB" color: "#404040"
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
anchors.bottomMargin: 3 anchors.bottomMargin: 3 * scaleRatio
}
Label {
id: soloTitleLabel2
fontSize: 24 * scaleRatio
text: qsTr("Check Transaction") + translationManager.emptyString
} }
Text { Text {
text: qsTr("Verify that funds were paid to an address by supplying the transaction ID, the recipient address, the message used for signing and the signature.\n" + text: qsTr("Verify that funds were paid to an address by supplying the transaction ID, the recipient address, the message used for signing and the signature.\n" +
"For the case with Spend Proof, you don't need to specify the recipient address.") + translationManager.emptyString "For the case with Spend Proof, you don't need to specify the recipient address.") + translationManager.emptyString
wrapMode: Text.Wrap wrapMode: Text.Wrap
Layout.fillWidth: true; Layout.fillWidth: true
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
color: Style.defaultFontColor
} }
RowLayout { RowLayout {
Label {
fontSize: 14
text: qsTr("Transaction ID") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit { LineEdit {
id: checkProofTxIdLine id: checkProofTxIdLine
fontSize: mainLayout.lineEditFontSize labelText: qsTr("Transaction ID") + translationManager.emptyString
fontSize: 16 * scaleRatio
placeholderText: qsTr("Paste tx ID") + translationManager.emptyString placeholderText: qsTr("Paste tx ID") + translationManager.emptyString
readOnly: false readOnly: false
width: mainLayout.editWidth width: mainLayout.editWidth
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (checkProofTxIdLine.text.length > 0) {
clipboard.setText(checkProofTxIdLine.text)
}
}
}
} }
} }
RowLayout { RowLayout {
Label {
fontSize: 14
text: qsTr("Address") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit { LineEdit {
id: checkProofAddressLine id: checkProofAddressLine
fontSize: mainLayout.lineEditFontSize labelText: qsTr("Address") + translationManager.emptyString
fontSize: 16 * scaleRatio
placeholderText: qsTr("Recipient's wallet address") + translationManager.emptyString; placeholderText: qsTr("Recipient's wallet address") + translationManager.emptyString;
readOnly: false readOnly: false
width: mainLayout.editWidth width: mainLayout.editWidth
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (checkProofAddressLine.text.length > 0) {
clipboard.setText(checkProofAddressLine.text)
}
}
}
} }
} }
RowLayout { RowLayout {
Label {
fontSize: 14
text: qsTr("Message") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit { LineEdit {
id: checkProofMessageLine id: checkProofMessageLine
fontSize: mainLayout.lineEditFontSize fontSize: 16 * scaleRatio
labelText: qsTr("Message") + translationManager.emptyString
placeholderText: qsTr("Optional message against which the signature is signed") + translationManager.emptyString; placeholderText: qsTr("Optional message against which the signature is signed") + translationManager.emptyString;
readOnly: false readOnly: false
width: mainLayout.editWidth width: mainLayout.editWidth
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (checkProofMessageLine.text.length > 0) {
clipboard.setText(checkProofMessageLine.text)
}
}
}
} }
} }
RowLayout { RowLayout {
Label {
fontSize: 14
text: qsTr("Signature") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit { LineEdit {
id: checkProofSignatureLine id: checkProofSignatureLine
fontSize: mainLayout.lineEditFontSize fontSize: 16 * scaleRatio
labelText: qsTr("Signature") + translationManager.emptyString
placeholderText: qsTr("Paste tx proof") + translationManager.emptyString; placeholderText: qsTr("Paste tx proof") + translationManager.emptyString;
readOnly: false readOnly: false
width: mainLayout.editWidth width: mainLayout.editWidth
Layout.fillWidth: true Layout.fillWidth: true
copyButton: true
IconButton {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (checkProofSignatureLine.text.length > 0) {
clipboard.setText(checkProofSignatureLine.text)
}
}
}
} }
} }
StandardButton { StandardButton {
anchors.left: parent.left anchors.left: parent.left
anchors.topMargin: 17 anchors.topMargin: 17 * scaleRatio
width: 60 width: 60
text: qsTr("Check") + translationManager.emptyString text: qsTr("Check") + translationManager.emptyString
shadowReleasedColor: "#FF4304" enabled: TxUtils.checkTxID(checkProofTxIdLine.text) && TxUtils.checkSignature(checkProofSignatureLine.text) && ((checkProofSignatureLine.text.indexOf("SpendProofV") === 0 && checkProofAddressLine.text.length == 0) || (checkProofSignatureLine.text.indexOf("SpendProofV") !== 0 && TxUtils.checkAddress(checkProofAddressLine.text, appWindow.persistentSettings.nettype)))
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: checkTxID(checkProofTxIdLine.text) && checkSignature(checkProofSignatureLine.text) && ((checkProofSignatureLine.text.indexOf("SpendProofV") === 0 && checkProofAddressLine.text.length == 0) || (checkProofSignatureLine.text.indexOf("SpendProofV") !== 0 && checkAddress(checkProofAddressLine.text, appWindow.persistentSettings.nettype)))
onClicked: { onClicked: {
console.log("checkProof: Check clicked: txid " + checkProofTxIdLine.text + ", address " + checkProofAddressLine.text + ", message " + checkProofMessageLine.text + ", signature " + checkProofSignatureLine.text); console.log("checkProof: Check clicked: txid " + checkProofTxIdLine.text + ", address " + checkProofAddressLine.text + ", message " + checkProofMessageLine.text + ", signature " + checkProofSignatureLine.text);
root.checkProofClicked(checkProofTxIdLine.text, checkProofAddressLine.text, checkProofMessageLine.text, checkProofSignatureLine.text) root.checkProofClicked(checkProofTxIdLine.text, checkProofAddressLine.text, checkProofMessageLine.text, checkProofSignatureLine.text)
@ -338,17 +217,21 @@ Rectangle {
// underline // underline
Rectangle { Rectangle {
height: 1 height: 1
color: "#DBDBDB" color: "#404040"
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
anchors.bottomMargin: 3 anchors.bottomMargin: 3 * scaleRatio
} }
Text { Text {
text: qsTr("If a payment had several transactions then each must be checked and the results combined.") + translationManager.emptyString text: qsTr("If a payment had several transactions then each must be checked and the results combined.") + translationManager.emptyString
wrapMode: Text.Wrap wrapMode: Text.Wrap
Layout.fillWidth: true; Layout.fillWidth: true
font.family: Style.fontRegular.name
font.pixelSize: 14 * scaleRatio
color: Style.defaultFontColor
}
} }
} }
@ -356,5 +239,4 @@ Rectangle {
console.log("TxKey page loaded"); console.log("TxKey page loaded");
} }
} }

42
qml.qrc
View file

@ -163,5 +163,47 @@
<file>pages/Keys.qml</file> <file>pages/Keys.qml</file>
<file>images/menu.png</file> <file>images/menu.png</file>
<file>images/appicon.ico</file> <file>images/appicon.ico</file>
<file>images/right.png</file>
<file>images/card-background.png</file>
<file>images/minimize.png</file>
<file>images/fullscreen.png</file>
<file>images/close.png</file>
<file>images/moneroLogo_white.png</file>
<file>images/moneroIcon-trans28x28.png</file>
<file>images/moneroIcon-trans84x84.png</file>
<file>images/moneroIcon-trans56x56.png</file>
<file>images/question.png</file>
<file>images/expand.png</file>
<file>images/titlebarGradient.jpg</file>
<file>images/titlebarLogo.png</file>
<file>images/menuArrow.png</file>
<file>images/menuButtonGradient.png</file>
<file>fonts/SFUIDisplay-Medium.otf</file>
<file>fonts/SFUIDisplay-Regular.otf</file>
<file>fonts/SFUIDisplay-Light.otf</file>
<file>fonts/SFUIDisplay-Bold.otf</file>
<file>components/Style.qml</file>
<file>components/qmldir</file>
<file>components/InlineButton.qml</file>
<file>images/lightning.png</file>
<file>images/leftPanelBg.jpg</file>
<file>images/moneroIcon-28x28.png</file>
<file>images/lightning-white.png</file>
<file>images/middlePanelBg.jpg</file>
<file>components/InputMulti.qml</file>
<file>images/checkedIcon-black.png</file>
<file>components/LineEditMulti.qml</file>
<file>components/LabelButton.qml</file>
<file>components/LabelSubheader.qml</file>
<file>images/arrow-right-medium-white.png</file>
<file>images/rightArrow.png</file>
<file>images/upArrow-green.png</file>
<file>images/downArrow.png</file>
<file>images/historyBorderRadius.png</file>
<file>components/HistoryTableInnerColumn.qml</file>
<file>components/CheckBox2.qml</file>
<file>js/TxUtils.js</file>
<file>images/warning.png</file>
<file>images/checkedBlackIcon.png</file>
</qresource> </qresource>
</RCC> </RCC>

View file

@ -100,8 +100,6 @@ Item {
background: "#F0EEEE" background: "#F0EEEE"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 18 fontSize: 18
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: true checked: true
} }
@ -129,8 +127,6 @@ Item {
background: "#F0EEEE" background: "#F0EEEE"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 18 fontSize: 18
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: true checked: true
} }
@ -160,8 +156,6 @@ Item {
background: "#F0EEEE" background: "#F0EEEE"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 18 fontSize: 18
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: true checked: true
} }

View file

@ -124,11 +124,10 @@ ColumnLayout {
CheckBox { CheckBox {
id: localNode id: localNode
text: qsTr("Start a node automatically in background (recommended)") + translationManager.emptyString text: qsTr("Start a node automatically in background (recommended)") + translationManager.emptyString
checkedIcon: "../images/checkedBlackIcon.png"
background: "#FFFFFF" background: "#FFFFFF"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 16 * scaleRatio fontSize: 16 * scaleRatio
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: !appWindow.persistentSettings.useRemoteNode && !isAndroid && !isIOS checked: !appWindow.persistentSettings.useRemoteNode && !isAndroid && !isIOS
visible: !isAndroid && !isIOS visible: !isAndroid && !isIOS
onClicked: { onClicked: {
@ -145,6 +144,7 @@ ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 20 * scaleRatio Layout.topMargin: 20 * scaleRatio
fontSize: 14 * scaleRatio fontSize: 14 * scaleRatio
fontColor: "black"
text: qsTr("Blockchain location") + translationManager.emptyString text: qsTr("Blockchain location") + translationManager.emptyString
} }
LineEdit { LineEdit {
@ -152,8 +152,17 @@ ColumnLayout {
Layout.preferredWidth: 200 * scaleRatio Layout.preferredWidth: 200 * scaleRatio
Layout.fillWidth: true Layout.fillWidth: true
text: persistentSettings.blockchainDataDir text: persistentSettings.blockchainDataDir
placeholderFontBold: true
placeholderFontFamily: "Arial"
placeholderColor: Style.legacy_placeholderFontColor
placeholderOpacity: 1.0
placeholderText: qsTr("(optional)") + translationManager.emptyString placeholderText: qsTr("(optional)") + translationManager.emptyString
borderColor: Qt.rgba(0, 0, 0, 0.15)
backgroundColor: "white"
fontColor: "black"
fontBold: false
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
@ -170,14 +179,28 @@ ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 20 * scaleRatio Layout.topMargin: 20 * scaleRatio
fontSize: 14 * scaleRatio fontSize: 14 * scaleRatio
color: 'black'
text: qsTr("Bootstrap node (leave blank if not wanted)") + translationManager.emptyString text: qsTr("Bootstrap node (leave blank if not wanted)") + translationManager.emptyString
} }
RemoteNodeEdit { RemoteNodeEdit {
Layout.minimumWidth: 300 * scaleRatio Layout.minimumWidth: 300 * scaleRatio
opacity: localNode.checked opacity: localNode.checked
id: bootstrapNodeEdit id: bootstrapNodeEdit
placeholderFontBold: true
placeholderFontFamily: "Arial"
placeholderColor: Style.legacy_placeholderFontColor
placeholderOpacity: 1.0
daemonAddrText: persistentSettings.bootstrapNodeAddress.split(":")[0].trim() daemonAddrText: persistentSettings.bootstrapNodeAddress.split(":")[0].trim()
daemonPortText: (persistentSettings.bootstrapNodeAddress.split(":")[1].trim() == "") ? "18081" : persistentSettings.bootstrapNodeAddress.split(":")[1] daemonPortText: {
var node_split = persistentSettings.bootstrapNodeAddress.split(":");
if(node_split.length == 2){
(node_split[1].trim() == "") ? "18081" : node_split[1];
} else {
return ""
}
}
} }
} }
@ -185,19 +208,17 @@ ColumnLayout {
CheckBox { CheckBox {
id: remoteNode id: remoteNode
text: qsTr("Connect to a remote node") + translationManager.emptyString text: qsTr("Connect to a remote node") + translationManager.emptyString
checkedIcon: "../images/checkedBlackIcon.png"
Layout.topMargin: 20 * scaleRatio Layout.topMargin: 20 * scaleRatio
background: "#FFFFFF" background: "#FFFFFF"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 16 * scaleRatio fontSize: 16 * scaleRatio
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: appWindow.persistentSettings.useRemoteNode checked: appWindow.persistentSettings.useRemoteNode
onClicked: { onClicked: {
checked = true checked = true
localNode.checked = false localNode.checked = false
} }
} }
} }
RowLayout { RowLayout {
@ -208,6 +229,16 @@ ColumnLayout {
property var rna: persistentSettings.remoteNodeAddress property var rna: persistentSettings.remoteNodeAddress
daemonAddrText: rna.search(":") != -1 ? rna.split(":")[0].trim() : "" daemonAddrText: rna.search(":") != -1 ? rna.split(":")[0].trim() : ""
daemonPortText: rna.search(":") != -1 ? (rna.split(":")[1].trim() == "") ? "18081" : persistentSettings.remoteNodeAddress.split(":")[1] : "" daemonPortText: rna.search(":") != -1 ? (rna.split(":")[1].trim() == "") ? "18081" : persistentSettings.remoteNodeAddress.split(":")[1] : ""
placeholderFontBold: true
placeholderFontFamily: "Arial"
placeholderColor: Style.legacy_placeholderFontColor
placeholderOpacity: 1.0
lineEditBorderColor: Qt.rgba(0, 0, 0, 0.15)
lineEditBackgroundColor: "white"
lineEditFontColor: "black"
lineEditFontBold: false
} }
} }
} }

View file

@ -114,8 +114,6 @@ Item {
background: "#F0EEEE" background: "#F0EEEE"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 18 fontSize: 18
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: true checked: true
} }
@ -179,8 +177,6 @@ Item {
background: "#F0EEEE" background: "#F0EEEE"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 18 fontSize: 18
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: true checked: true
} }

View file

@ -52,13 +52,15 @@ ColumnLayout {
backgroundMiningEnabled = wizard.settings["allow_background_mining"] === true, backgroundMiningEnabled = wizard.settings["allow_background_mining"] === true,
backgroundMiningText = backgroundMiningEnabled ? qsTr("Enabled") : qsTr("Disabled"), backgroundMiningText = backgroundMiningEnabled ? qsTr("Enabled") : qsTr("Disabled"),
nettype = appWindow.persistentSettings.nettype, nettype = appWindow.persistentSettings.nettype,
networkText = nettype === NetworkType.TESTNET ? qsTr("Testnet") : nettype === NetworkType.STAGENET ? qsTr("Stagenet") : qsTr("Mainnet"), networkText = nettype == NetworkType.TESTNET ? qsTr("Testnet") : nettype == NetworkType.STAGENET ? qsTr("Stagenet") : qsTr("Mainnet"),
restoreHeightEnabled = wizard.settings['restore_height'] !== undefined; restoreHeightEnabled = wizard.settings['restore_height'] !== undefined;
return "<table>" return "<table>"
+ trStart + qsTr("Language") + trMiddle + wizard.settings["language"] + trEnd + trStart + qsTr("Language") + trMiddle + wizard.settings["language"] + trEnd
+ trStart + qsTr("Wallet name") + trMiddle + wizard.settings["account_name"] + trEnd + trStart + qsTr("Wallet name") + trMiddle + wizard.settings["account_name"] + trEnd
+ trStart + qsTr("Backup seed") + trMiddle + wizard.settings["wallet"].seed + trEnd // TODO: wizard.settings['wallet'].seed doesnt work anymore; yields undefined.
// + trStart + qsTr("Backup seed") + trMiddle + wizard.settings["wallet"].seed + trEnd
+ trStart + qsTr("Backup seed") + trMiddle + '****' + trEnd
+ trStart + qsTr("Wallet path") + trMiddle + wizard.settings["wallet_path"] + trEnd + trStart + qsTr("Wallet path") + trMiddle + wizard.settings["wallet_path"] + trEnd
// + trStart + qsTr("Auto donations") + trMiddle + autoDonationText + trEnd // + trStart + qsTr("Auto donations") + trMiddle + autoDonationText + trEnd
// + (autoDonationEnabled // + (autoDonationEnabled

View file

@ -365,10 +365,6 @@ ColumnLayout {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.margins: (isMobile) ? 20 * scaleRatio : 50 * scaleRatio anchors.margins: (isMobile) ? 20 * scaleRatio : 50 * scaleRatio
text: qsTr("USE MONERO") + translationManager.emptyString text: qsTr("USE MONERO") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: parent.paths[currentPath][currentPage] === finishPage visible: parent.paths[currentPath][currentPage] === finishPage
onClicked: { onClicked: {
wizard.applySettings(); wizard.applySettings();
@ -382,10 +378,6 @@ ColumnLayout {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.margins: (isMobile) ? 20 * scaleRatio : 50 anchors.margins: (isMobile) ? 20 * scaleRatio : 50
text: qsTr("Create wallet") + translationManager.emptyString text: qsTr("Create wallet") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: currentPath === "create_view_only_wallet" && parent.paths[currentPath][currentPage] === passwordPage visible: currentPath === "create_view_only_wallet" && parent.paths[currentPath][currentPage] === passwordPage
enabled: passwordPage.passwordsMatch enabled: passwordPage.passwordsMatch
onClicked: { onClicked: {
@ -414,10 +406,6 @@ ColumnLayout {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.margins: (isMobile) ? 20 * scaleRatio : 50 anchors.margins: (isMobile) ? 20 * scaleRatio : 50
text: qsTr("Abort") + translationManager.emptyString text: qsTr("Abort") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: currentPath === "create_view_only_wallet" && parent.paths[currentPath][currentPage] === passwordPage visible: currentPath === "create_view_only_wallet" && parent.paths[currentPath][currentPage] === passwordPage
onClicked: { onClicked: {
wizard.restart(); wizard.restart();

View file

@ -154,6 +154,8 @@ ColumnLayout {
Label { Label {
Layout.topMargin: 20 * scaleRatio Layout.topMargin: 20 * scaleRatio
fontFamily: "Arial"
fontColor: "#555555"
fontSize: 14 * scaleRatio fontSize: 14 * scaleRatio
text: qsTr("Wallet name") text: qsTr("Wallet name")
+ translationManager.emptyString + translationManager.emptyString
@ -166,6 +168,10 @@ ColumnLayout {
Layout.minimumWidth: 200 * scaleRatio Layout.minimumWidth: 200 * scaleRatio
text: defaultAccountName text: defaultAccountName
onTextUpdated: checkNextButton() onTextUpdated: checkNextButton()
borderColor: Qt.rgba(0, 0, 0, 0.15)
backgroundColor: "white"
fontColor: "black"
fontBold: false
} }
} }
@ -176,10 +182,6 @@ ColumnLayout {
StandardButton { StandardButton {
id: recoverFromSeedButton id: recoverFromSeedButton
text: qsTr("Restore from seed") + translationManager.emptyString text: qsTr("Restore from seed") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: recoverFromKeys.visible enabled: recoverFromKeys.visible
onClicked: { onClicked: {
recoverFromSeedMode = true; recoverFromSeedMode = true;
@ -190,10 +192,6 @@ ColumnLayout {
StandardButton { StandardButton {
id: recoverFromKeysButton id: recoverFromKeysButton
text: qsTr("Restore from keys") + translationManager.emptyString text: qsTr("Restore from keys") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: recoverFromSeed.visible enabled: recoverFromSeed.visible
onClicked: { onClicked: {
recoverFromSeedMode = false; recoverFromSeedMode = false;
@ -204,10 +202,6 @@ ColumnLayout {
StandardButton { StandardButton {
id: qrfinderButton id: qrfinderButton
text: qsTr("From QR Code") + translationManager.emptyString text: qsTr("From QR Code") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible : true //appWindow.qrScannerEnabled visible : true //appWindow.qrScannerEnabled
enabled : visible enabled : visible
onClicked: { onClicked: {
@ -242,16 +236,32 @@ ColumnLayout {
id: addressLine id: addressLine
Layout.maximumWidth: 600 * scaleRatio Layout.maximumWidth: 600 * scaleRatio
Layout.minimumWidth: 200 * scaleRatio Layout.minimumWidth: 200 * scaleRatio
placeholderFontBold: true
placeholderFontFamily: "Arial"
placeholderColor: Style.legacy_placeholderFontColor
placeholderText: qsTr("Account address (public)") + translationManager.emptyString placeholderText: qsTr("Account address (public)") + translationManager.emptyString
placeholderOpacity: 1.0
onTextUpdated: checkNextButton() onTextUpdated: checkNextButton()
borderColor: Qt.rgba(0, 0, 0, 0.15)
backgroundColor: "white"
fontColor: "black"
fontBold: false
} }
LineEdit { LineEdit {
Layout.fillWidth: true Layout.fillWidth: true
id: viewKeyLine id: viewKeyLine
Layout.maximumWidth: 600 * scaleRatio Layout.maximumWidth: 600 * scaleRatio
Layout.minimumWidth: 200 * scaleRatio Layout.minimumWidth: 200 * scaleRatio
placeholderFontBold: true
placeholderFontFamily: "Arial"
placeholderColor: Style.legacy_placeholderFontColor
placeholderText: qsTr("View key (private)") + translationManager.emptyString placeholderText: qsTr("View key (private)") + translationManager.emptyString
placeholderOpacity: 1.0
onTextUpdated: checkNextButton() onTextUpdated: checkNextButton()
borderColor: Qt.rgba(0, 0, 0, 0.15)
backgroundColor: "white"
fontColor: "black"
fontBold: false
} }
LineEdit { LineEdit {
@ -259,8 +269,16 @@ ColumnLayout {
Layout.maximumWidth: 600 * scaleRatio Layout.maximumWidth: 600 * scaleRatio
Layout.minimumWidth: 200 * scaleRatio Layout.minimumWidth: 200 * scaleRatio
id: spendKeyLine id: spendKeyLine
placeholderFontBold: true
placeholderFontFamily: "Arial"
placeholderColor: Style.legacy_placeholderFontColor
placeholderText: qsTr("Spend key (private)") + translationManager.emptyString placeholderText: qsTr("Spend key (private)") + translationManager.emptyString
placeholderOpacity: 1.0
onTextUpdated: checkNextButton() onTextUpdated: checkNextButton()
borderColor: Qt.rgba(0, 0, 0, 0.15)
backgroundColor: "white"
fontColor: "black"
fontBold: false
} }
} }
@ -271,10 +289,18 @@ ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.maximumWidth: 600 * scaleRatio Layout.maximumWidth: 600 * scaleRatio
Layout.minimumWidth: 200 * scaleRatio Layout.minimumWidth: 200 * scaleRatio
placeholderFontBold: true
placeholderFontFamily: "Arial"
placeholderColor: Style.legacy_placeholderFontColor
placeholderText: qsTr("Restore height (optional)") + translationManager.emptyString placeholderText: qsTr("Restore height (optional)") + translationManager.emptyString
placeholderOpacity: 1.0
validator: IntValidator { validator: IntValidator {
bottom:0 bottom:0
} }
borderColor: Qt.rgba(0, 0, 0, 0.15)
backgroundColor: "white"
fontColor: "black"
fontBold: false
} }
} }
@ -284,6 +310,8 @@ ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 20 * scaleRatio Layout.topMargin: 20 * scaleRatio
fontSize: 14 fontSize: 14
fontFamily: "Arial"
fontColor: "#555555"
text: qsTr("Your wallet is stored in") + ": " + fileUrlInput.text; text: qsTr("Your wallet is stored in") + ": " + fileUrlInput.text;
} }
@ -304,6 +332,10 @@ ColumnLayout {
fileUrlInput.focus = true fileUrlInput.focus = true
} }
} }
borderColor: Qt.rgba(0, 0, 0, 0.15)
backgroundColor: "white"
fontColor: "black"
fontBold: false
} }
FileDialog { FileDialog {

View file

@ -41,6 +41,7 @@ Column {
font.pixelSize: 16 * scaleRatio font.pixelSize: 16 * scaleRatio
anchors.margins: 8 * scaleRatio anchors.margins: 8 * scaleRatio
font.bold:true font.bold:true
font.family: "Arial"
text: qsTr("Enter your 25 (or 24) word mnemonic seed") + translationManager.emptyString text: qsTr("Enter your 25 (or 24) word mnemonic seed") + translationManager.emptyString
color: "#BABABA" color: "#BABABA"
visible: !memoTextInput.text/* && !parent.focus*/ visible: !memoTextInput.text/* && !parent.focus*/

View file

@ -248,13 +248,13 @@ ColumnLayout {
background: "#FFFFFF" background: "#FFFFFF"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 16 * scaleRatio fontSize: 16 * scaleRatio
checkedIcon: "../images/checkedVioletIcon.png" checkedIcon: "../images/checkedBlackIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png" uncheckedIcon: "../images/uncheckedIcon.png"
checked: appWindow.persistentSettings.nettype === NetworkType.TESTNET; checked: appWindow.persistentSettings.nettype == NetworkType.TESTNET;
onClicked: { onClicked: {
persistentSettings.nettype = testNet.checked ? NetworkType.TESTNET : NetworkType.MAINNET persistentSettings.nettype = testNet.checked ? NetworkType.TESTNET : NetworkType.MAINNET
stageNet.checked = false; stageNet.checked = false;
console.log("Network type set to ", persistentSettings.nettype === NetworkType.TESTNET ? "Testnet" : "Mainnet") console.log("Network type set to ", persistentSettings.nettype == NetworkType.TESTNET ? "Testnet" : "Mainnet")
} }
} }
} }
@ -267,13 +267,13 @@ ColumnLayout {
background: "#FFFFFF" background: "#FFFFFF"
fontColor: "#4A4646" fontColor: "#4A4646"
fontSize: 16 * scaleRatio fontSize: 16 * scaleRatio
checkedIcon: "../images/checkedVioletIcon.png" checkedIcon: "../images/checkedBlackIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png" uncheckedIcon: "../images/uncheckedIcon.png"
checked: appWindow.persistentSettings.nettype === NetworkType.STAGENET; checked: appWindow.persistentSettings.nettype == NetworkType.STAGENET;
onClicked: { onClicked: {
persistentSettings.nettype = stageNet.checked ? NetworkType.STAGENET : NetworkType.MAINNET persistentSettings.nettype = stageNet.checked ? NetworkType.STAGENET : NetworkType.MAINNET
testNet.checked = false; testNet.checked = false;
console.log("Network type set to ", persistentSettings.nettype === NetworkType.STAGENET ? "Stagenet" : "Mainnet") console.log("Network type set to ", persistentSettings.nettype == NetworkType.STAGENET ? "Stagenet" : "Mainnet")
} }
} }
} }