Compare commits
211 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f14fde89c | ||
|
|
d8ebafaec0 | ||
|
|
7340371cc9 | ||
|
|
cc17b75a54 | ||
|
|
8f73bac95c | ||
|
|
e4177bb365 | ||
|
|
80a058c954 | ||
|
|
ff1780aeaa | ||
|
|
f1b70d08c6 | ||
|
|
0ae04fde4b | ||
|
|
c64321ebe9 | ||
|
|
34e7eb4e6b | ||
|
|
b888396ab4 | ||
|
|
508546c7c8 | ||
|
|
80618c83fd | ||
|
|
0d991b3792 | ||
|
|
61e8ac5b95 | ||
|
|
aac7fc613a | ||
|
|
e0d99cb1bb | ||
|
|
188eb064f4 | ||
|
|
84d09c85de | ||
|
|
b853380db6 | ||
|
|
ea49e84215 | ||
|
|
23d1d4a958 | ||
|
|
f52990c8e4 | ||
|
|
d69519f0aa | ||
|
|
605f81314a | ||
|
|
8ba9b0e7c7 | ||
|
|
8b94bd80c9 | ||
|
|
1f1d51d8e1 | ||
|
|
11df558f8e | ||
|
|
3c46d6d1bd | ||
|
|
7941f88e53 | ||
|
|
8750cc2c13 | ||
|
|
f932d7a245 | ||
|
|
6d0847c39f | ||
|
|
ba9a99a4c6 | ||
|
|
b1675ab1cd | ||
|
|
327cbd086f | ||
|
|
a681878344 | ||
|
|
9b835599b8 | ||
|
|
5767ad9cd5 | ||
|
|
4c75fe47f9 | ||
|
|
56868c06b5 | ||
|
|
3df70ff98c | ||
|
|
83ea363932 | ||
|
|
6d09555cd4 | ||
|
|
4d9d10013b | ||
|
|
ece743e22a | ||
|
|
86e9f3811b | ||
|
|
2bc86d1d9f | ||
|
|
fc576a8680 | ||
|
|
b8da85d0a4 | ||
|
|
3d0a571cc7 | ||
|
|
7c366ddf04 | ||
|
|
d0f3194574 | ||
|
|
98f768d2a6 | ||
|
|
77cd5a7a62 | ||
|
|
0d1b709def | ||
|
|
5f052964a9 | ||
|
|
39facceee6 | ||
|
|
c84abc7224 | ||
|
|
649f81954e | ||
|
|
1a156b8840 | ||
|
|
f7c883a6c3 | ||
|
|
31f318aaea | ||
|
|
94c92ba73c | ||
|
|
8480c70571 | ||
|
|
ee2b0fa713 | ||
|
|
9f4f2b582b | ||
|
|
d670f6d321 | ||
|
|
4ca5e82fca | ||
|
|
c29ccc13ae | ||
|
|
c04417d37b | ||
|
|
7521472325 | ||
|
|
73ba192a58 | ||
|
|
0fdc21e7fd | ||
|
|
ba0796b9ca | ||
|
|
1ce573afe2 | ||
|
|
234fd1bcda | ||
|
|
3adb29bc16 | ||
|
|
3f7e3ba3c4 | ||
|
|
a7f52db613 | ||
|
|
7f4fec7777 | ||
|
|
995a5e0046 | ||
|
|
13a65505a5 | ||
|
|
105336ba08 | ||
|
|
c39875de44 | ||
|
|
5339fbde8b | ||
|
|
47927e4822 | ||
|
|
c68c317776 | ||
|
|
b2cd48ceaf | ||
|
|
0eaebb01c4 | ||
|
|
c321147e36 | ||
|
|
27349d111d | ||
|
|
602a393d59 | ||
|
|
e9b6c510f4 | ||
|
|
5d78941712 | ||
|
|
fa27982650 | ||
|
|
f3eca6eadb | ||
|
|
009994b212 | ||
|
|
57a282c72a | ||
|
|
96808441cd | ||
|
|
6730b63018 | ||
|
|
7cc924d478 | ||
|
|
8a14e367d8 | ||
|
|
a0e38aafb2 | ||
|
|
4bac8fdb57 | ||
|
|
b41c981454 | ||
|
|
c65ee4e71c | ||
|
|
7d66cc5b25 | ||
|
|
e43b719b19 | ||
|
|
03af06718c | ||
|
|
b4ce56a994 | ||
|
|
92c0e00b12 | ||
|
|
e8bd548219 | ||
|
|
ed17399b74 | ||
|
|
04869f0aac | ||
|
|
16122d6e17 | ||
|
|
73895f5a7b | ||
|
|
535f1fc446 | ||
|
|
5d4f519a40 | ||
|
|
ff9d79da7a | ||
|
|
b8a4dab9b2 | ||
|
|
a492cb9f7e | ||
|
|
5043250a2a | ||
|
|
fe78f20c7c | ||
|
|
ecaa1a8e23 | ||
|
|
9e121fb676 | ||
|
|
62e1dc490f | ||
|
|
9037eed805 | ||
|
|
443eb47824 | ||
|
|
13753052bc | ||
|
|
08b54f69a5 | ||
|
|
037fa32c41 | ||
|
|
8e986b3a2d | ||
|
|
0cb6900295 | ||
|
|
affbb454fa | ||
|
|
a6f13f7ba2 | ||
|
|
8e14b8bc3e | ||
|
|
5cd05a51d4 | ||
|
|
c2c5f0c13d | ||
|
|
f11d2bc702 | ||
|
|
77448a6b73 | ||
|
|
a3e0589a5e | ||
|
|
41b2c282bd | ||
|
|
127790e4a1 | ||
|
|
9dc8879e2c | ||
|
|
72a7f1348f | ||
|
|
cfa2f816a5 | ||
|
|
de4ff2992e | ||
|
|
6beadba9cc | ||
|
|
6a0ed3ceae | ||
|
|
a046163477 | ||
|
|
5ec575b376 | ||
|
|
009362451d | ||
|
|
f6e7b79e81 | ||
|
|
d744d393f9 | ||
|
|
25852b4676 | ||
|
|
336726e82f | ||
|
|
afac71383b | ||
|
|
2ac9e8eabb | ||
|
|
fff5c716c8 | ||
|
|
2e53c524a1 | ||
|
|
da6aad33a4 | ||
|
|
f5450f9205 | ||
|
|
1f23df7e66 | ||
|
|
27e37f153f | ||
|
|
58f24efd39 | ||
|
|
24bd3010bf | ||
|
|
87ea145047 | ||
|
|
310df0befa | ||
|
|
a4a44d7c99 | ||
|
|
f00a181843 | ||
|
|
98b040670c | ||
|
|
f31b27d3fd | ||
|
|
8cd6f3f5b6 | ||
|
|
af1edc0c95 | ||
|
|
45106e5150 | ||
|
|
3a51c4b963 | ||
|
|
8da7c972db | ||
|
|
1c1d15821e | ||
|
|
ef4c2927b4 | ||
|
|
dd7732ce0c | ||
|
|
c750ca9507 | ||
|
|
feabe6713c | ||
|
|
a550c03a0b | ||
|
|
1336055e80 | ||
|
|
115102624e | ||
|
|
5a0adb18d3 | ||
|
|
a055293b52 | ||
|
|
a00c083ece | ||
|
|
22a769341a | ||
|
|
91757b8039 | ||
|
|
74da45766e | ||
|
|
949d85288d | ||
|
|
798b273888 | ||
|
|
e2bfe25b9d | ||
|
|
7f12d4869e | ||
|
|
b2f7058fcf | ||
|
|
06e01e3771 | ||
|
|
cbc9dd07c8 | ||
|
|
6633d309b5 | ||
|
|
1e7fbe5cb0 | ||
|
|
05084422a5 | ||
|
|
57ab7daa03 | ||
|
|
fc0a44cabc | ||
|
|
30e403fe58 | ||
|
|
5297b23248 | ||
|
|
96c8df23a4 | ||
|
|
06b12d167b |
2
.gitmodules
vendored
@@ -1,4 +1,4 @@
|
||||
[submodule "monero"]
|
||||
path = monero
|
||||
url = https://github.com/monero-project/monero
|
||||
ignore = dirty
|
||||
ignore = all
|
||||
|
||||
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2014-2015, The Monero Project
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@@ -67,11 +67,12 @@ Rectangle {
|
||||
menuColumn.previousButton.checked = true
|
||||
}
|
||||
|
||||
width: 260
|
||||
width: (isMobile)? appWindow.width : 260
|
||||
color: "#FFFFFF"
|
||||
|
||||
// Item with monero logo
|
||||
Item {
|
||||
visible: !isMobile
|
||||
id: logoItem
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
@@ -115,7 +116,9 @@ Rectangle {
|
||||
}
|
||||
|
||||
|
||||
|
||||
Column {
|
||||
visible: !isMobile
|
||||
id: column1
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
@@ -124,14 +127,15 @@ Rectangle {
|
||||
spacing: 5
|
||||
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: balanceLabel
|
||||
text: qsTr("Balance") + translationManager.emptyString
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 50
|
||||
tipText: qsTr("Test tip 1<br/><br/>line 2") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Row {
|
||||
visible: !isMobile
|
||||
Item {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
height: 26
|
||||
@@ -144,6 +148,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
Text {
|
||||
visible: !isMobile
|
||||
id: balanceText
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.family: "Arial"
|
||||
@@ -172,7 +177,6 @@ Rectangle {
|
||||
text: qsTr("Unlocked balance") + translationManager.emptyString
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 50
|
||||
tipText: qsTr("Test tip 2<br/><br/>line 2") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Text {
|
||||
@@ -194,6 +198,7 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
@@ -210,16 +215,26 @@ Rectangle {
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
|
||||
|
||||
Rectangle {
|
||||
id: menuRect
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.top: column1.bottom
|
||||
anchors.topMargin: 25
|
||||
anchors.top: (isMobile)? parent.top : column1.bottom
|
||||
anchors.topMargin: (isMobile)? 0 : 25
|
||||
color: "#1C1C1C"
|
||||
|
||||
|
||||
Flickable {
|
||||
contentHeight: 500
|
||||
anchors.fill: parent
|
||||
clip: true
|
||||
|
||||
|
||||
Column {
|
||||
|
||||
id: menuColumn
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
@@ -460,6 +475,16 @@ Rectangle {
|
||||
panel.settingsClicked()
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
visible: settingsButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
height: 1
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -478,6 +503,9 @@ Rectangle {
|
||||
anchors.bottom: parent.bottom
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// indicate disabled state
|
||||
// Desaturate {
|
||||
// anchors.fill: parent
|
||||
|
||||
173
MiddlePanel.qml
@@ -29,6 +29,7 @@
|
||||
|
||||
import QtQml 2.0
|
||||
import QtQuick 2.2
|
||||
//import QtQuick.Controls 2.0
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtGraphicalEffects 1.0
|
||||
@@ -41,11 +42,13 @@ Rectangle {
|
||||
|
||||
property Item currentView
|
||||
property Item previousView
|
||||
property bool basicMode : false
|
||||
property bool basicMode : isMobile
|
||||
property string balanceLabelText: qsTr("Balance") + translationManager.emptyString
|
||||
property string balanceText
|
||||
property string unlockedBalanceLabelText: qsTr("Unlocked Balance") + translationManager.emptyString
|
||||
property string unlockedBalanceText
|
||||
property int minHeight: (appWindow.height > 800) ? appWindow.height : 800
|
||||
// property int headerHeight: header.height
|
||||
|
||||
property Transfer transferView: Transfer { }
|
||||
property Receive receiveView: Receive { }
|
||||
@@ -73,7 +76,6 @@ Rectangle {
|
||||
previousView = currentView
|
||||
if (currentView) {
|
||||
stackView.replace(currentView)
|
||||
|
||||
// Component.onCompleted is called before wallet is initilized
|
||||
if (typeof currentView.onPageCompleted === "function") {
|
||||
currentView.onPageCompleted();
|
||||
@@ -126,27 +128,35 @@ Rectangle {
|
||||
name: "History"
|
||||
PropertyChanges { target: root; currentView: historyView }
|
||||
PropertyChanges { target: historyView; model: appWindow.currentWallet ? appWindow.currentWallet.historyModel : null }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}, State {
|
||||
name: "Transfer"
|
||||
PropertyChanges { target: root; currentView: transferView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1000 }
|
||||
}, State {
|
||||
name: "Receive"
|
||||
PropertyChanges { target: root; currentView: receiveView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}, State {
|
||||
name: "TxKey"
|
||||
PropertyChanges { target: root; currentView: txkeyView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}, State {
|
||||
name: "AddressBook"
|
||||
PropertyChanges { target: root; currentView: addressBookView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}, State {
|
||||
name: "Sign"
|
||||
PropertyChanges { target: root; currentView: signView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}, State {
|
||||
name: "Settings"
|
||||
PropertyChanges { target: root; currentView: settingsView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1200 }
|
||||
}, State {
|
||||
name: "Mining"
|
||||
PropertyChanges { target: root; currentView: miningView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}
|
||||
]
|
||||
|
||||
@@ -172,136 +182,47 @@ Rectangle {
|
||||
anchors.topMargin: appWindow.persistentSettings.customDecorations ? 30 : 0
|
||||
spacing: 0
|
||||
|
||||
|
||||
// BasicPanel header
|
||||
Rectangle {
|
||||
id: header
|
||||
anchors.leftMargin: 1
|
||||
anchors.rightMargin: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 64
|
||||
color: "#FFFFFF"
|
||||
visible: basicMode
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: -5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
|
||||
source: "images/moneroLogo2.png"
|
||||
}
|
||||
|
||||
Grid {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
anchors.topMargin: 10
|
||||
width: 256
|
||||
columns: 3
|
||||
|
||||
Text {
|
||||
id: balanceLabel
|
||||
width: 116
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#535353"
|
||||
text: root.balanceLabelText + ":"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: balanceText
|
||||
width: 110
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#000000"
|
||||
text: root.balanceText
|
||||
}
|
||||
|
||||
Item {
|
||||
height: 20
|
||||
width: 20
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
source: "images/lockIcon.png"
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: availableBalanceLabel
|
||||
width: 116
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#535353"
|
||||
text: root.unlockedBalanceLabelText + ":"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: availableBalanceText
|
||||
width: 110
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#000000"
|
||||
text: root.unlockedBalanceText
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
}
|
||||
|
||||
// Views container
|
||||
StackView {
|
||||
id: stackView
|
||||
initialItem: transferView
|
||||
anchors.topMargin: 30
|
||||
Flickable {
|
||||
id: mainFlickable
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
anchors.margins: 4
|
||||
clip: true // otherwise animation will affect left panel
|
||||
clip: true
|
||||
// Disabled scrollbars, gives crash on startup on windows
|
||||
// ScrollIndicator.vertical: ScrollIndicator { }
|
||||
// ScrollBar.vertical: ScrollBar { } // uncomment to test
|
||||
|
||||
delegate: StackViewDelegate {
|
||||
pushTransition: StackViewTransition {
|
||||
PropertyAnimation {
|
||||
target: enterItem
|
||||
property: "x"
|
||||
from: 0 - target.width
|
||||
to: 0
|
||||
duration: 300
|
||||
}
|
||||
PropertyAnimation {
|
||||
target: exitItem
|
||||
property: "x"
|
||||
from: 0
|
||||
to: target.width
|
||||
duration: 300
|
||||
// Views container
|
||||
StackView {
|
||||
id: stackView
|
||||
initialItem: transferView
|
||||
// anchors.topMargin: 30
|
||||
// Layout.fillWidth: true
|
||||
// Layout.fillHeight: true
|
||||
anchors.fill:parent
|
||||
// anchors.margins: 4
|
||||
clip: true // otherwise animation will affect left panel
|
||||
|
||||
delegate: StackViewDelegate {
|
||||
pushTransition: StackViewTransition {
|
||||
PropertyAnimation {
|
||||
target: enterItem
|
||||
property: "x"
|
||||
from: 0 - target.width
|
||||
to: 0
|
||||
duration: 300
|
||||
}
|
||||
PropertyAnimation {
|
||||
target: exitItem
|
||||
property: "x"
|
||||
from: 0
|
||||
to: target.width
|
||||
duration: 300
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}// flickable
|
||||
}
|
||||
// border
|
||||
Rectangle {
|
||||
|
||||
97
README.md
@@ -10,6 +10,11 @@ Copyright (c) 2014-2017, The Monero Project
|
||||
- Github: [https://github.com/monero-project/monero-core](https://github.com/monero-project/monero-core)
|
||||
- IRC: [#monero-dev on Freenode](irc://chat.freenode.net/#monero-dev)
|
||||
|
||||
## Vulnerability Response
|
||||
|
||||
- Our [Vulnerability Response Process](https://github.com/monero-project/meta/blob/master/VULNERABILITY_RESPONSE_PROCESS.md) encourages responsible disclosure
|
||||
- We are also available via [HackerOne](https://hackerone.com/monero)
|
||||
|
||||
## Introduction
|
||||
|
||||
Monero is a private, secure, untraceable, decentralised digital currency. You are your bank, you control your funds, and nobody can trace your transfers unless you allow them to do so.
|
||||
@@ -56,7 +61,8 @@ See [LICENSE](LICENSE).
|
||||
|
||||
Packages are available for
|
||||
|
||||
* Arch Linux via AUR: [monero-core-git](https://aur.archlinux.org/packages/monero-core-git/)
|
||||
* Arch Linux via AUR: [monero-wallet-qt](https://aur.archlinux.org/packages/monero-wallet-qt/)
|
||||
* Void Linux: xbps-install -S monero-core
|
||||
|
||||
Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
@@ -64,26 +70,27 @@ Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
### On Linux:
|
||||
|
||||
(Tested on Ubuntu 16.04 x86, 16.10 x64 and Linux Mint 18 "Sarah" - Cinnamon x64)
|
||||
(Tested on Ubuntu 16.04 x86, 16.10 x64, Gentoo x64 and Linux Mint 18 "Sarah" - Cinnamon x64)
|
||||
|
||||
1. Install Monero dependencies.
|
||||
1. Install Monero dependencies
|
||||
|
||||
- For Ubuntu and Mint
|
||||
|
||||
`sudo apt install build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev`
|
||||
|
||||
2. Grab an up-to-date copy of the monero-core repository.
|
||||
- For Gentoo
|
||||
|
||||
`sudo emerge app-arch/xz-utils app-doc/doxygen dev-cpp/gtest dev-libs/boost dev-libs/expat dev-libs/openssl dev-util/cmake media-gfx/graphviz net-dns/unbound net-libs/ldns net-libs/miniupnpc sys-libs/libunwind`
|
||||
|
||||
2. Grab an up-to-date copy of the monero-core repository
|
||||
|
||||
`git clone https://github.com/monero-project/monero-core.git`
|
||||
|
||||
3. Go into the repository.
|
||||
3. Go into the repository
|
||||
|
||||
`cd monero-core`
|
||||
|
||||
4. Use the script to compile the Monero libs necessary to run the GUI.
|
||||
|
||||
`./get_libwallet_api.sh`
|
||||
|
||||
|
||||
5. Install the GUI dependencies.
|
||||
4. Install the GUI dependencies
|
||||
|
||||
- For Ubuntu 16.04 x86
|
||||
|
||||
@@ -91,23 +98,39 @@ Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
- For Ubuntu 16.04+ x64
|
||||
|
||||
`sudo apt-get install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-xmllistmodel qttools5-dev-tools qml-module-qtquick-dialogs qml-module-qt-labs-settings libqt5qml-graphicaleffects`
|
||||
`sudo apt-get install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-xmllistmodel qttools5-dev-tools qml-module-qtquick-dialogs qml-module-qt-labs-settings libqt5qml-graphicaleffects`
|
||||
|
||||
- For Linux Mint 18 "Sarah" - Cinnamon x64
|
||||
|
||||
`sudo apt install qml-module-qt-labs-settings qml-module-qtgraphicaleffects`
|
||||
`sudo apt install qml-module-qt-labs-settings qml-module-qtgraphicaleffects`
|
||||
|
||||
- For Gentoo
|
||||
|
||||
`sudo emerge dev-qt/qtcore:5 dev-qt/qtdeclarative:5 dev-qt/qtquickcontrols:5 dev-qt/qtquickcontrols2:5 dev-qt/qtgraphicaleffects:5`
|
||||
|
||||
- Optional : To build the flag `WITH_SCANNER`
|
||||
|
||||
`sudo apt install qtmultimedia5-dev qml-module-qtmultimedia libzbar-dev`
|
||||
- For Ubuntu and Mint
|
||||
|
||||
6. Build the GUI.
|
||||
`sudo apt install qtmultimedia5-dev qml-module-qtmultimedia libzbar-dev`
|
||||
|
||||
- For Gentoo
|
||||
|
||||
The *qml* USE flag must be enabled.
|
||||
|
||||
`emerge dev-qt/qtmultimedia:5 media-gfx/zbar`
|
||||
|
||||
5. Build the GUI
|
||||
|
||||
- For Ubuntu and Mint
|
||||
|
||||
`./build.sh`
|
||||
|
||||
7. Run the GUI client.
|
||||
- For Gentoo
|
||||
|
||||
`./build/release/bin/monero-wallet-gui`
|
||||
`QT_SELECT=5 ./build.sh`
|
||||
|
||||
The executable can be found in the build/release/bin folder.
|
||||
|
||||
### On OS X:
|
||||
|
||||
@@ -129,30 +152,21 @@ Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
`brew link --force --overwrite qt5`
|
||||
|
||||
4. Install latest Qt using official installer from [qt.io](https://www.qt.io/download-open-source/) (homebrew version might be outdated).
|
||||
5. Add Qt bin dir to your path (check first if directory exists; 5.8 is the current version)
|
||||
5. Add the Qt bin directory to your path
|
||||
|
||||
`export PATH=$PATH:$HOME/Qt/5.8/clang_64/bin`
|
||||
Example: `export PATH=$PATH:$HOME/Qt/5.8/clang_64/bin`
|
||||
|
||||
5. Add Qt bin dir to your path. Example:
|
||||
This is the directory where Qt 5.x is installed on **your** system
|
||||
|
||||
`export PATH=$PATH:/usr/local/opt/qt5/bin`
|
||||
|
||||
make sure this is where Qt 5.x is installed on **your** system eg `$HOME/Qt/5.8/clang_64/bin` if you downloaded from qt.io.
|
||||
|
||||
6. Grab an up-to-date copy of the monero-core repository.
|
||||
6. Grab an up-to-date copy of the monero-core repository
|
||||
|
||||
`git clone https://github.com/monero-project/monero-core.git`
|
||||
|
||||
7. Go into the repository.
|
||||
7. Go into the repository
|
||||
|
||||
`cd monero-core`
|
||||
|
||||
8. Build libwallet
|
||||
|
||||
`./get_libwallet_api.sh`
|
||||
|
||||
9. Start the build:
|
||||
8. Start the build
|
||||
|
||||
`./build.sh`
|
||||
|
||||
@@ -160,7 +174,7 @@ The executable can be found in the `build/release/bin` folder.
|
||||
|
||||
**Note:** Workaround for "ERROR: Xcode not set up properly"
|
||||
|
||||
Edit `$HOME/Qt/5.7/clang_64/mkspecs/features/mac/default_pre.prf`
|
||||
Edit `$HOME/Qt/5.8/clang_64/mkspecs/features/mac/default_pre.prf`
|
||||
|
||||
replace
|
||||
`isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null")))`
|
||||
@@ -175,33 +189,33 @@ More info: http://stackoverflow.com/a/35098040/1683164
|
||||
|
||||
1. Install [msys2](http://msys2.github.io/), follow the instructions on that page on how to update packages to the latest versions
|
||||
|
||||
2. Install monero dependencies as described in [monero documentation](https://github.com/monero-project/monero) into msys2 environment.
|
||||
2. Install monero dependencies as described in [monero documentation](https://github.com/monero-project/monero) into msys2 environment
|
||||
**As we only build application for x86, install only dependencies for x86 architecture (i686 in package name)**
|
||||
```
|
||||
pacman -S mingw-w64-i686-toolchain make mingw-w64-i686-cmake mingw-w64-i686-boost
|
||||
|
||||
```
|
||||
|
||||
3. Install git into msys2 environment:
|
||||
3. Install git into msys2 environment
|
||||
|
||||
```
|
||||
pacman -S git
|
||||
```
|
||||
|
||||
4. Install Qt5 from [official site](https://www.qt.io/download-open-source/).
|
||||
4. Install Qt5 from [official site](https://www.qt.io/download-open-source/)
|
||||
- download unified installer, run and select following options:
|
||||
- Qt > Qt 5.7 > MinGW 5.3.0 32 bit
|
||||
- Tools > MinGW 5.3.0
|
||||
- continue with installation
|
||||
|
||||
5. Open ```MinGW-w64 Win32 Shell``` shell:
|
||||
5. Open ```MinGW-w64 Win32 Shell``` shell
|
||||
|
||||
```%MSYS_ROOT%\msys2_shell.cmd -mingw32```
|
||||
|
||||
Where ```%MSYS_ROOT%``` will be ```c:\msys32``` if your host OS is x86-based or ```c:\msys64``` if your host OS
|
||||
is x64-based
|
||||
|
||||
6. Install the latest version of boost, specificly the required static libraries:
|
||||
6. Install the latest version of boost, specificly the required static libraries
|
||||
```
|
||||
cd
|
||||
wget http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2
|
||||
@@ -211,13 +225,13 @@ More info: http://stackoverflow.com/a/35098040/1683164
|
||||
./b2 --prefix=/mingw32/boost --layout=tagged --without-mpi --without-python toolset=gcc address-model=32 variant=debug,release link=static threading=multi runtime-link=static -j$(nproc) install
|
||||
```
|
||||
|
||||
7. Clone repository:
|
||||
7. Clone repository
|
||||
```
|
||||
cd
|
||||
git clone https://github.com/monero-project/monero-core.git
|
||||
```
|
||||
|
||||
8. Build the GUI:
|
||||
8. Build the GUI
|
||||
```
|
||||
cd monero-core
|
||||
export PATH=$(ls -rd /c/Qt/5.[6,7,8]/mingw53_32/bin | head -1):$PATH
|
||||
@@ -225,4 +239,5 @@ More info: http://stackoverflow.com/a/35098040/1683164
|
||||
cd build
|
||||
make deploy
|
||||
```
|
||||
The resulting executable can be found in ```.\release\bin```
|
||||
|
||||
The executable can be found in the ```.\release\bin``` directory.
|
||||
|
||||
53
android/README.md
Normal file
@@ -0,0 +1,53 @@
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
|
||||
|
||||
## Current status : ALPHA
|
||||
|
||||
- Minimum Android 5.0 (api level 21)
|
||||
- Modal dialogs can appear in background giving the feeling that the application is frozen (Work around : turn screen off/on or switch to another app and back)
|
||||
|
||||
## Build using Docker
|
||||
|
||||
# Base environnement
|
||||
|
||||
cd monero/utils/build_scripts
|
||||
docker build -f android32.Dockerfile -t monero-android .
|
||||
cd ..
|
||||
|
||||
# Build GUI
|
||||
|
||||
cd android/docker
|
||||
docker build -t monero-gui-android .
|
||||
docker create -it --name monero-gui-android monero-gui-android bash
|
||||
|
||||
# Get the apk
|
||||
|
||||
docker cp monero-gui-android:/opt/android/monero-core/build/release/bin/bin/QtApp-debug.apk .
|
||||
|
||||
## Deployment
|
||||
|
||||
- Using ADB (Android debugger bridge) :
|
||||
|
||||
First, see section [Enable adb debugging on your device](https://developer.android.com/studio/command-line/adb.html#Enabling)
|
||||
The only place where we are allowed to play is `/data/local/tmp`. So :
|
||||
|
||||
adb push /opt/android/monero-core/build/release/bin/bin/QtApp-debug.apk /data/local/tmp
|
||||
adb shell pm install -r /data/local/tmp/QtApp-debug.apk
|
||||
|
||||
- Troubleshooting:
|
||||
|
||||
adb devices -l
|
||||
adb logcat
|
||||
|
||||
if using adb inside docker, make sure you did "docker run -v /dev/bus/usb:/dev/bus/usb --privileged"
|
||||
|
||||
- Using a web server
|
||||
|
||||
mkdir /usr/tmp
|
||||
cp QtApp-debug.apk /usr/tmp
|
||||
docker run -d -v /usr/tmp:/usr/share/nginx/html:ro -p 8080:80 nginx
|
||||
|
||||
Now it should be accessible through a web browser at
|
||||
|
||||
http://<your.local.ip>:8080/QtApp-debug.apk
|
||||
|
||||
108
android/docker/Dockerfile
Normal file
@@ -0,0 +1,108 @@
|
||||
FROM monero-android
|
||||
|
||||
#INSTALL JAVA
|
||||
RUN echo "deb http://ftp.fr.debian.org/debian/ jessie-backports main contrib non-free" >> /etc/apt/sources.list
|
||||
RUN dpkg --add-architecture i386 \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y libc6:i386 libncurses5:i386 libstdc++6:i386 libz1:i386 \
|
||||
&& apt-get install -y -t jessie-backports ca-certificates-java openjdk-8-jdk-headless openjdk-8-jre-headless ant
|
||||
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
|
||||
ENV PATH $JAVA_HOME/bin:$PATH
|
||||
|
||||
#Get Qt
|
||||
ENV QT_VERSION 5.8
|
||||
|
||||
RUN git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} \
|
||||
&& cd qt5 \
|
||||
&& perl init-repository
|
||||
|
||||
## Note: Need to use libc++ but Qt does not provide mkspec for libc++.
|
||||
## Their support of it is quite recent and they claim they don't use it by default
|
||||
## [only because it produces bigger binary objects](https://bugreports.qt.io/browse/QTBUG-50724).
|
||||
|
||||
#Create new mkspec for clang + libc++
|
||||
RUN cp -r qt5/qtbase/mkspecs/android-clang qt5/qtbase/mkspecs/android-clang-libc \
|
||||
&& cd qt5/qtbase/mkspecs/android-clang-libc \
|
||||
&& sed -i '16i ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/llvm-libc++/libs/$$ANDROID_TARGET_ARCH' qmake.conf \
|
||||
&& sed -i '17i ANDROID_SOURCES_CXX_STL_INCDIR = $$NDK_ROOT/sources/cxx-stl/llvm-libc++/include' qmake.conf \
|
||||
&& echo "QMAKE_LIBS_PRIVATE = -lc++_shared -llog -lz -lm -ldl -lc -lgcc " >> qmake.conf \
|
||||
&& echo "QMAKE_CFLAGS -= -mfpu=vfp " >> qmake.conf \
|
||||
&& echo "QMAKE_CXXFLAGS -= -mfpu=vfp " >> qmake.conf \
|
||||
&& echo "QMAKE_CFLAGS += -mfpu=vfp4 " >> qmake.conf \
|
||||
&& echo "QMAKE_CXXFLAGS += -mfpu=vfp4 " >> qmake.conf
|
||||
|
||||
ENV ANDROID_API android-21
|
||||
|
||||
#ANDROID SDK TOOLS
|
||||
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter platform-tools
|
||||
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter ${ANDROID_API}
|
||||
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter build-tools-25.0.1
|
||||
|
||||
ENV CLEAN_PATH $JAVA_HOME/bin:/usr/cmake-3.6.3-Linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
#build Qt
|
||||
RUN cd qt5 && PATH=${CLEAN_PATH} ./configure -developer-build -release \
|
||||
-xplatform android-clang-libc \
|
||||
-android-ndk-platform ${ANDROID_API} \
|
||||
-android-ndk $ANDROID_NDK_ROOT \
|
||||
-android-sdk $ANDROID_SDK_ROOT \
|
||||
-opensource -confirm-license \
|
||||
-prefix ${WORKDIR}/Qt-${QT_VERSION} \
|
||||
-nomake tests -nomake examples \
|
||||
-skip qtserialport \
|
||||
-skip qtconnectivity \
|
||||
-skip qttranslations \
|
||||
-skip qtgamepad -skip qtscript -skip qtdoc
|
||||
|
||||
# build Qt tools : gnustl_shared.so is hard-coded in androiddeployqt
|
||||
# replace it with libc++_shared.so
|
||||
COPY androiddeployqt.patch qt5/qttools/androiddeployqt.patch
|
||||
RUN cd qt5/qttools \
|
||||
&& git apply androiddeployqt.patch \
|
||||
&& cd .. \
|
||||
&& PATH=${CLEAN_PATH} make -j4 \
|
||||
&& PATH=${CLEAN_PATH} make install
|
||||
|
||||
# Get iconv and ZBar
|
||||
ENV ICONV_VERSION 1.14
|
||||
RUN git clone https://github.com/ZBar/ZBar.git \
|
||||
&& curl -s -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
|
||||
&& tar -xzf libiconv-${ICONV_VERSION}.tar.gz \
|
||||
&& cd libiconv-${ICONV_VERSION} \
|
||||
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ ./configure --build=x86_64-linux-gnu --host=arm-eabi --prefix=${WORKDIR}/libiconv --disable-rpath
|
||||
|
||||
ENV PATH $ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:${WORKDIR}/Qt-${QT_VERSION}/bin:$PATH
|
||||
|
||||
#Build libiconv.a and libzbarjni.a
|
||||
COPY android.mk.patch ZBar/android.mk.patch
|
||||
RUN cd ZBar \
|
||||
&& git apply android.mk.patch \
|
||||
&& echo \
|
||||
"APP_ABI := armeabi-v7a \n\
|
||||
APP_STL := c++_shared \n\
|
||||
TARGET_PLATFORM := ${ANDROID_API} \n\
|
||||
TARGET_ARCH_ABI := armeabi-v7a \n\
|
||||
APP_CFLAGS += -target armv7-none-linux-androideabi -fexceptions -fstack-protector-strong -fno-limit-debug-info -mfloat-abi=softfp -mfpu=vfp -fno-builtin-memmove -fno-omit-frame-pointer -fno-stack-protector\n"\
|
||||
>> android/jni/Application.mk \
|
||||
&& cd android \
|
||||
&& android update project --path . -t "${ANDROID_API}" \
|
||||
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ ant -Dndk.dir=${ANDROID_NDK_ROOT} -Diconv.src=${WORKDIR}/libiconv-${ICONV_VERSION} zbar-clean zbar-ndk-build
|
||||
|
||||
#Can't directly call build.sh because of env variables
|
||||
RUN git clone https://github.com/monero-project/monero-core.git \
|
||||
&& cd monero-core \
|
||||
&& git submodule update \
|
||||
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ BOOST_ROOT=/opt/android/boost_1_62_0 BOOST_LIBRARYDIR=${WORKDIR}/boost_${BOOST_VERSION}/android32/lib/ OPENSSL_ROOT_DIR=${WORKDIR}/openssl/ ./get_libwallet_api.sh release-android
|
||||
|
||||
RUN cp openssl/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
|
||||
RUN cp boost_${BOOST_VERSION}/android32/lib/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
|
||||
RUN cp ZBar/android/obj/local/armeabi-v7a/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
|
||||
|
||||
ENV PATH $ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:${WORKDIR}/Qt-${QT_VERSION}/bin:$CLEAN_PATH
|
||||
|
||||
# NB : zxcvbn-c needs to build a local binary and Qt don't care about these environnement variable
|
||||
RUN cd monero-core \
|
||||
&& CC="gcc" CXX="g++" ./build.sh release-android \
|
||||
&& cd build \
|
||||
&& make deploy
|
||||
|
||||
61
android/docker/android.mk.patch
Normal file
@@ -0,0 +1,61 @@
|
||||
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
|
||||
index e442b07..158afd5 100644
|
||||
--- a/android/jni/Android.mk
|
||||
+++ b/android/jni/Android.mk
|
||||
@@ -12,14 +12,18 @@ LOCAL_PATH := $(ICONV_SRC)
|
||||
|
||||
LOCAL_MODULE := libiconv
|
||||
|
||||
+LOCAL_ARM_MODE := arm
|
||||
+LOCAL_CPP_FEATURES := exceptions rtti features
|
||||
LOCAL_CFLAGS := \
|
||||
-Wno-multichar \
|
||||
-D_ANDROID \
|
||||
- -DLIBDIR="c" \
|
||||
+ -DLIBDIR="\".\"" \
|
||||
-DBUILDING_LIBICONV \
|
||||
-DBUILDING_LIBCHARSET \
|
||||
-DIN_LIBRARY
|
||||
|
||||
+LOCAL_CFLAGS += -fno-stack-protector
|
||||
+
|
||||
LOCAL_SRC_FILES := \
|
||||
lib/iconv.c \
|
||||
libcharset/lib/localcharset.c \
|
||||
@@ -30,13 +34,14 @@ LOCAL_C_INCLUDES := \
|
||||
$(ICONV_SRC)/libcharset \
|
||||
$(ICONV_SRC)/libcharset/include
|
||||
|
||||
-include $(BUILD_SHARED_LIBRARY)
|
||||
+include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
LOCAL_LDLIBS := -llog -lcharset
|
||||
|
||||
# libzbarjni
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
+
|
||||
LOCAL_PATH := $(MY_LOCAL_PATH)
|
||||
LOCAL_MODULE := zbarjni
|
||||
LOCAL_SRC_FILES := ../../java/zbarjni.c \
|
||||
@@ -71,6 +76,17 @@ LOCAL_C_INCLUDES := ../include \
|
||||
../zbar \
|
||||
$(ICONV_SRC)/include
|
||||
|
||||
-LOCAL_SHARED_LIBRARIES := libiconv
|
||||
+LOCAL_STATIC_LIBRARIES := libiconv
|
||||
+LOCAL_ARM_MODE := arm
|
||||
+LOCAL_CPP_FEATURES := exceptions rtti features
|
||||
+
|
||||
+LOCAL_CFLAGS := \
|
||||
+ -Wno-multichar \
|
||||
+ -D_ANDROID \
|
||||
+ -DLIBDIR="\".\"" \
|
||||
+ -DBUILDING_LIBICONV \
|
||||
+ -DBUILDING_LIBCHARSET \
|
||||
+ -DIN_LIBRARY
|
||||
+
|
||||
|
||||
-include $(BUILD_SHARED_LIBRARY)
|
||||
\ No newline at end of file
|
||||
+include $(BUILD_STATIC_LIBRARY)
|
||||
62
android/docker/androiddeployqt.patch
Normal file
@@ -0,0 +1,62 @@
|
||||
diff --git a/src/androiddeployqt/main.cpp b/src/androiddeployqt/main.cpp
|
||||
index 8a8e591..71d693e 100644
|
||||
--- a/src/androiddeployqt/main.cpp
|
||||
+++ b/src/androiddeployqt/main.cpp
|
||||
@@ -1122,7 +1122,7 @@ bool updateLibsXml(const Options &options)
|
||||
|
||||
QString libsPath = QLatin1String("libs/") + options.architecture + QLatin1Char('/');
|
||||
|
||||
- QString qtLibs = QLatin1String("<item>gnustl_shared</item>\n");
|
||||
+ QString qtLibs = QLatin1String("<item>c++_shared</item>\n");
|
||||
QString bundledInLibs;
|
||||
QString bundledInAssets;
|
||||
foreach (Options::BundledFile bundledFile, options.bundledFiles) {
|
||||
@@ -2519,6 +2519,39 @@ bool installApk(const Options &options)
|
||||
return true;
|
||||
}
|
||||
|
||||
+bool copyStl(Options *options)
|
||||
+{
|
||||
+ if (options->deploymentMechanism == Options::Debug && !options->installApk)
|
||||
+ return true;
|
||||
+
|
||||
+ if (options->verbose)
|
||||
+ fprintf(stdout, "Copying LIBC++ STL library\n");
|
||||
+
|
||||
+ QString filePath = options->ndkPath
|
||||
+ + QLatin1String("/sources/cxx-stl/llvm-libc++")
|
||||
+ + QLatin1String("/libs/")
|
||||
+ + options->architecture
|
||||
+ + QLatin1String("/libc++_shared.so");
|
||||
+ if (!QFile::exists(filePath)) {
|
||||
+ fprintf(stderr, "LIBC STL library does not exist at %s\n", qPrintable(filePath));
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ QString destinationDirectory =
|
||||
+ options->deploymentMechanism == Options::Debug
|
||||
+ ? options->temporaryDirectoryName + QLatin1String("/lib")
|
||||
+ : options->outputDirectory + QLatin1String("/libs/") + options->architecture;
|
||||
+
|
||||
+ if (!copyFileIfNewer(filePath, destinationDirectory
|
||||
+ + QLatin1String("/libc++_shared.so"), options->verbose)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if (options->deploymentMechanism == Options::Debug && !deployToLocalTmp(options, QLatin1String("/lib/libc++_shared.so")))
|
||||
+ return false;
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
bool copyGnuStl(Options *options)
|
||||
{
|
||||
if (options->deploymentMechanism == Options::Debug && !options->installApk)
|
||||
@@ -2870,7 +2903,7 @@ int main(int argc, char *argv[])
|
||||
if (Q_UNLIKELY(options.timing))
|
||||
fprintf(stdout, "[TIMING] %d ms: Read dependencies\n", options.timer.elapsed());
|
||||
|
||||
- if (options.deploymentMechanism != Options::Ministro && !copyGnuStl(&options))
|
||||
+ if (options.deploymentMechanism != Options::Ministro && !copyStl(&options))
|
||||
return CannotCopyGnuStl;
|
||||
|
||||
if (Q_UNLIKELY(options.timing))
|
||||
6
build.sh
@@ -54,7 +54,7 @@ if [[ $platform == *bsd* ]]; then
|
||||
fi
|
||||
|
||||
# build libwallet
|
||||
$SHELL get_libwallet_api.sh $BUILD_TYPE
|
||||
./get_libwallet_api.sh $BUILD_TYPE
|
||||
|
||||
# build zxcvbn
|
||||
$MAKE -C src/zxcvbn-c || exit
|
||||
@@ -78,11 +78,11 @@ fi
|
||||
|
||||
# force version update
|
||||
get_tag
|
||||
echo "var GUI_VERSION = \"$VERSIONTAG\"" > version.js
|
||||
echo "var GUI_VERSION = \"$TAGNAME\"" > version.js
|
||||
pushd "$MONERO_DIR"
|
||||
get_tag
|
||||
popd
|
||||
echo "var GUI_MONERO_VERSION = \"$VERSIONTAG\"" >> version.js
|
||||
echo "var GUI_MONERO_VERSION = \"$TAGNAME\"" >> version.js
|
||||
|
||||
cd build
|
||||
qmake ../monero-wallet-gui.pro "$CONFIG" || exit
|
||||
|
||||
@@ -122,7 +122,7 @@ ListView {
|
||||
ListModel {
|
||||
id: dropModel
|
||||
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
|
||||
ListElement { name: "<b>Send to same destination</b>"; icon: "../images/dropdownSend.png" }
|
||||
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
|
||||
// ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
|
||||
ListElement { name: "<b>Remove from address book</b>"; icon: "../images/dropdownDel.png" }
|
||||
}
|
||||
|
||||
@@ -59,6 +59,15 @@ Window {
|
||||
width: 480
|
||||
height: 280
|
||||
|
||||
// Make window draggable
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
property point lastMousePos: Qt.point(0, 0)
|
||||
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
|
||||
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
|
||||
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
|
||||
@@ -53,6 +53,15 @@ Window {
|
||||
width: 480
|
||||
height: 200
|
||||
|
||||
// Make window draggable
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
property point lastMousePos: Qt.point(0, 0)
|
||||
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
|
||||
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
|
||||
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
|
||||
@@ -216,7 +216,7 @@ ListView {
|
||||
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 same destination</b>"; icon: "../images/dropdownSend.png" }
|
||||
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
|
||||
ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
|
||||
}
|
||||
|
||||
|
||||
@@ -259,11 +259,11 @@ ListView {
|
||||
//elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 13
|
||||
color: (confirmations < 10)? "#FF6C3C" : "#545454"
|
||||
color: (confirmations < confirmationsRequired)? "#FF6C3C" : "#545454"
|
||||
text: {
|
||||
if (!isPending)
|
||||
if(confirmations < 10)
|
||||
return blockHeight + " " + qsTr("(%1/10 confirmations)").arg(confirmations)
|
||||
if(confirmations < confirmationsRequired)
|
||||
return blockHeight + " " + qsTr("(%1/%2 confirmations)").arg(confirmations).arg(confirmationsRequired)
|
||||
else
|
||||
return blockHeight
|
||||
if (!isOut)
|
||||
@@ -443,7 +443,7 @@ ListView {
|
||||
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 same destination</b>"; icon: "../images/dropdownSend.png" }
|
||||
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
|
||||
ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
Item {
|
||||
id: item
|
||||
@@ -35,6 +36,7 @@ Item {
|
||||
property alias textFormat: label.textFormat
|
||||
property string tipText: ""
|
||||
property int fontSize: 12
|
||||
property alias wrapMode: label.wrapMode
|
||||
signal linkActivated()
|
||||
width: icon.x + icon.width
|
||||
height: icon.height
|
||||
@@ -59,23 +61,23 @@ Item {
|
||||
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
|
||||
}
|
||||
}
|
||||
// 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
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
119
components/MobileHeader.qml
Normal file
@@ -0,0 +1,119 @@
|
||||
import QtQuick 2.2
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Layouts 1.1
|
||||
import moneroComponents.Wallet 1.0
|
||||
|
||||
|
||||
// BasicPanel header
|
||||
Rectangle {
|
||||
id: header
|
||||
anchors.leftMargin: 1
|
||||
anchors.rightMargin: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 64
|
||||
color: "#FFFFFF"
|
||||
// visible: basicMode
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
visible: appWindow.width > 460
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: -5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
|
||||
source: "../images/moneroLogo2.png"
|
||||
}
|
||||
|
||||
Image {
|
||||
id: icon
|
||||
visible: !logo.visible
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
// anchors.verticalCenterOffset: -5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
|
||||
source: "../images/moneroIcon.png"
|
||||
}
|
||||
|
||||
Grid {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
anchors.topMargin: 10
|
||||
width: 256
|
||||
columns: 3
|
||||
|
||||
Text {
|
||||
id: balanceLabel
|
||||
width: 116
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#535353"
|
||||
text: leftPanel.balanceLabelText + ":"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: balanceText
|
||||
width: 110
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#000000"
|
||||
text: leftPanel.balanceText
|
||||
}
|
||||
|
||||
Item {
|
||||
height: 20
|
||||
width: 20
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
source: "../images/lockIcon.png"
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
width: 116
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#535353"
|
||||
text: qsTr("Unlocked Balance:")
|
||||
}
|
||||
|
||||
Text {
|
||||
id: availableBalanceText
|
||||
width: 110
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#000000"
|
||||
text: leftPanel.unlockedBalanceText
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
}
|
||||
@@ -75,6 +75,7 @@ Item {
|
||||
}
|
||||
|
||||
function show(message) {
|
||||
item.visible = true
|
||||
item.message = message
|
||||
item.active = true
|
||||
hider.running = true
|
||||
|
||||
@@ -56,6 +56,15 @@ Window {
|
||||
width: 480
|
||||
height: walletName ? 240 : 200
|
||||
|
||||
// Make window draggable
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
property point lastMousePos: Qt.point(0, 0)
|
||||
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
|
||||
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
|
||||
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
|
||||
@@ -116,7 +116,7 @@ Item {
|
||||
|
||||
Row {
|
||||
id: row2
|
||||
spacing: ((bar.width - 8) / 2) / 4
|
||||
spacing: bar.width / 14
|
||||
|
||||
Repeater {
|
||||
model: 4
|
||||
@@ -125,7 +125,7 @@ Item {
|
||||
id: delegateItem2
|
||||
currentX: x + row2.x
|
||||
currentIndex: index
|
||||
mainTick: currentIndex === 0 || currentIndex === 3 || currentIndex === 13
|
||||
mainTick: currentIndex === 0
|
||||
Component.onCompleted: {
|
||||
row.positions[currentIndex] = delegateItem2
|
||||
}
|
||||
@@ -135,7 +135,7 @@ Item {
|
||||
|
||||
Row {
|
||||
id: row1
|
||||
spacing: ((bar.width - 8) / 2) / 10
|
||||
spacing: bar.width / 14
|
||||
|
||||
Repeater {
|
||||
model: 10
|
||||
@@ -144,7 +144,7 @@ Item {
|
||||
id: delegateItem1
|
||||
currentX: x + row1.x
|
||||
currentIndex: index + 4
|
||||
mainTick: currentIndex === 0 || currentIndex === 3 || currentIndex === 13
|
||||
mainTick: currentIndex === 13
|
||||
Component.onCompleted: {
|
||||
row.positions[currentIndex] = delegateItem1
|
||||
}
|
||||
|
||||
@@ -45,8 +45,6 @@ Item {
|
||||
// Dynamic label width
|
||||
Layout.minimumWidth: (label.contentWidth > 80)? label.contentWidth + 20 : 100
|
||||
|
||||
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
@@ -54,6 +54,14 @@ Window {
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
|
||||
// Make window draggable
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
property point lastMousePos: Qt.point(0, 0)
|
||||
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
|
||||
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
|
||||
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
|
||||
}
|
||||
|
||||
function open() {
|
||||
show()
|
||||
|
||||
@@ -197,6 +197,10 @@ Item {
|
||||
property string stringLow: qsTr("Low (x1 fee)") + translationManager.emptyString
|
||||
property string stringMedium: qsTr("Medium (x20 fee)") + translationManager.emptyString
|
||||
property string stringHigh: qsTr("High (x166 fee)") + translationManager.emptyString
|
||||
property string stringSlow: qsTr("Slow (x0.25 fee)") + translationManager.emptyString
|
||||
property string stringDefault: qsTr("Default (x1 fee)") + translationManager.emptyString
|
||||
property string stringFast: qsTr("Fast (x5 fee)") + translationManager.emptyString
|
||||
property string stringFastest: qsTr("Fastest (x41.5 fee)") + translationManager.emptyString
|
||||
property string stringAll: qsTr("All") + translationManager.emptyString
|
||||
property string stringSent: qsTr("Sent") + translationManager.emptyString
|
||||
property string stringReceived: qsTr("Received") + translationManager.emptyString
|
||||
|
||||
@@ -180,7 +180,7 @@ Item {
|
||||
|
||||
// Workaround for translations in listElements. All translated strings needs to be listed in this file.
|
||||
property string stringCopy: qsTr("<b>Copy address to clipboard</b>") + translationManager.emptyString
|
||||
property string stringSend: qsTr("<b>Send to same destination</b>") + translationManager.emptyString
|
||||
property string stringSend: qsTr("<b>Send to this address</b>") + translationManager.emptyString
|
||||
property string stringFind: qsTr("<b>Find similar transactions</b>") + translationManager.emptyString
|
||||
property string stringRemove: qsTr("<b>Remove from address book</b>") + translationManager.emptyString
|
||||
|
||||
|
||||
7
components/TextBlock.qml
Normal file
@@ -0,0 +1,7 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
TextEdit {
|
||||
wrapMode: Text.Wrap
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
}
|
||||
@@ -53,7 +53,6 @@ Item {
|
||||
color: "#4A4949"
|
||||
text: {
|
||||
if(currentIndex === 0) return qsTr("Normal") + translationManager.emptyString
|
||||
if(currentIndex === 3) return qsTr("Medium") + translationManager.emptyString
|
||||
if(currentIndex === 13) return qsTr("High") + translationManager.emptyString
|
||||
return ""
|
||||
}
|
||||
@@ -65,7 +64,7 @@ Item {
|
||||
anchors.topMargin: 14
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
height: currentIndex === 8 ? 16 : 8
|
||||
height: 8
|
||||
visible: !parent.mainTick
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,14 +58,15 @@ Rectangle {
|
||||
property bool checked: false
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
color: basicMouseArea.containsMouse || checked ? "#FFE00A" : "#000000"
|
||||
color: basicMouseArea.containsMouse || !leftPanel.visible ? "#FFE00A" : "#000000"
|
||||
height: 30
|
||||
width: height
|
||||
visible: isMobile
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
rotation: parent.checked ? 180 : 0
|
||||
source: parent.customDecorations || parent.checked ? "../images/goToBasicVersionHovered.png" :
|
||||
rotation: !leftPanel.visible ? 180 : 0
|
||||
source: parent.customDecorations || !leftPanel.visible ? "../images/goToBasicVersionHovered.png" :
|
||||
"../images/gotoBasicVersion.png"
|
||||
}
|
||||
|
||||
@@ -75,7 +76,7 @@ Rectangle {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
parent.checked = !parent.checked
|
||||
titleBar.goToBasicVersion(parent.checked)
|
||||
titleBar.goToBasicVersion(leftPanel.visible)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@ BUILD_LIBWALLET=false
|
||||
if [ ! -d $MONERO_DIR/src ]; then
|
||||
git submodule init monero
|
||||
fi
|
||||
git submodule update
|
||||
git -C $MONERO_DIR fetch --tags
|
||||
git -C $MONERO_DIR checkout v0.10.3.1
|
||||
git submodule update --remote
|
||||
git -C $MONERO_DIR fetch
|
||||
git -C $MONERO_DIR checkout release-v0.11.0.0
|
||||
|
||||
# get monero core tag
|
||||
get_tag
|
||||
@@ -226,6 +226,8 @@ fi
|
||||
# build install epee
|
||||
eval make -C $MONERO_DIR/build/release/contrib/epee all install
|
||||
|
||||
# install easylogging
|
||||
eval make -C $MONERO_DIR/build/release/external/easylogging++ all install
|
||||
|
||||
# Install libunwind
|
||||
echo "Installing libunbound..."
|
||||
|
||||
5
installers/windows/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# The subdirectory with the individual GUI Wallet files
|
||||
bin/
|
||||
|
||||
# The subdirectory with the generated installer "mysetup.exe"
|
||||
Output/
|
||||
BIN
installers/windows/FinishImage.bmp
Normal file
|
After Width: | Height: | Size: 151 KiB |
31
installers/windows/LICENSE
Normal file
@@ -0,0 +1,31 @@
|
||||
Copyright (c) 2014-2017, 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.
|
||||
|
||||
Parts of the project are originally copyright (c) 2012-2013 The Cryptonote
|
||||
developers
|
||||
371
installers/windows/Monero.iss
Normal file
@@ -0,0 +1,371 @@
|
||||
; Monero Helium Hydra GUI Wallet Installer for Windows
|
||||
; Copyright (c) 2014-2017, The Monero Project
|
||||
; See LICENSE
|
||||
|
||||
[Setup]
|
||||
AppName=Monero GUI Wallet
|
||||
; For InnoSetup this is the property that uniquely identifies the application as such
|
||||
; Thus it's important to keep this stable over releases
|
||||
; With a different "AppName" InnoSetup would treat a mere update as a completely new application and thus mess up
|
||||
|
||||
AppVersion=0.11.1.0
|
||||
DefaultDirName={pf}\Monero GUI Wallet
|
||||
DefaultGroupName=Monero GUI Wallet
|
||||
UninstallDisplayIcon={app}\monero-wallet-gui.exe
|
||||
PrivilegesRequired=admin
|
||||
ArchitecturesInstallIn64BitMode=x64
|
||||
ArchitecturesAllowed=x64
|
||||
WizardSmallImageFile=WizardSmallImage.bmp
|
||||
WizardImageFile=WelcomeImage.bmp
|
||||
DisableWelcomePage=no
|
||||
LicenseFile=LICENSE
|
||||
|
||||
|
||||
[Languages]
|
||||
Name: "en"; MessagesFile: "compiler:Default.isl"
|
||||
; Without localized versions of special forms, messages etc. of the installer, and without translated ReadMe's
|
||||
; it probably does not make much sense to offer other install-time languages beside English
|
||||
; Name: "fr"; MessagesFile: "compiler:Languages\French.isl"
|
||||
; Name: "it"; MessagesFile: "compiler:Languages\Italian.isl"
|
||||
; Name: "jp"; MessagesFile: "compiler:Languages\Japanese.isl"
|
||||
; Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl"
|
||||
; Name: "pt"; MessagesFile: "compiler:Languages\Portuguese.isl"
|
||||
|
||||
|
||||
[Files]
|
||||
Source: "ReadMe.htm"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "FinishImage.bmp"; Flags: dontcopy
|
||||
|
||||
; Monero GUI wallet
|
||||
Source: "bin\monero-wallet-gui.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Monero GUI wallet log file
|
||||
; The GUI wallet does not have the "--log-file" command-line option of the CLI wallet and insists to put the .log beside the .exe
|
||||
; so pre-create the file and give the necessary permissions to the wallet to write into it
|
||||
Source: "monero-wallet-gui.log"; DestDir: "{app}"; Flags: comparetimestamp; Permissions: users-modify
|
||||
|
||||
; Monero CLI wallet
|
||||
Source: "bin\monero-wallet-cli.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Monero wallet RPC interface implementation
|
||||
Source: "bin\monero-wallet-rpc.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Monero daemon
|
||||
Source: "bin\monerod.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Monero daemon wrapped in a batch file that stops before the text window closes, to see any error messages
|
||||
Source: "monero-daemon.bat"; DestDir: "{app}"; Flags: comparetimestamp;
|
||||
|
||||
; Monero blockchain utilities
|
||||
Source: "bin\monero-blockchain-export.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\monero-blockchain-import.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; was present in 0.10.3.1, not present anymore in 0.11.1.0
|
||||
; Source: "bin\monero-utils-deserialize.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Various .qm files for translating the wallet UI "on the fly" into all supported languages
|
||||
Source: "bin\translations\*"; DestDir: "{app}\translations"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Core Qt runtime
|
||||
Source: "bin\Qt5Core.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Gui.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Multimedia.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5MultimediaQuick_p.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Network.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Qml.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Quick.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Svg.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Widgets.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5XmlPatterns.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Qt QML elements like the local files selector "FolderListModel" and "Settings"
|
||||
Source: "bin\Qt\*"; DestDir: "{app}\Qt"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt audio support
|
||||
Source: "bin\audio\*"; DestDir: "{app}\audio"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt bearer / network connection management
|
||||
Source: "bin\bearer\*"; DestDir: "{app}\bearer"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt Windows platform plugin
|
||||
Source: "bin\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: comparetimestamp
|
||||
|
||||
; Qt support for SVG icons
|
||||
Source: "bin\iconengines\*"; DestDir: "{app}\iconengines"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt support for various image formats (JPEG, BMP, SVG etc)
|
||||
Source: "bin\imageformats\*"; DestDir: "{app}\imageformats"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt multimedia support
|
||||
Source: "bin\QtMultimedia\*"; DestDir: "{app}\QtMultimedia"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\mediaservice\*"; DestDir: "{app}\mediaservice"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt support for "m3u" playlists
|
||||
; candidate for elimination? Don't think the GUI wallet needs such playlists
|
||||
Source: "bin\playlistformats\*"; DestDir: "{app}\playlistformats"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt graphical effects as part of the core runtime, effects like blurring and blending
|
||||
Source: "bin\QtGraphicalEffects\*"; DestDir: "{app}\QtGraphicalEffects"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Some more Qt graphical effects
|
||||
; "private" as a name for this directory looks a little strange. Historical reasons?
|
||||
Source: "bin\private\*"; DestDir: "{app}\private"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt QML files
|
||||
Source: "bin\QtQml\*"; DestDir: "{app}\QtQml"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt Quick files
|
||||
Source: "bin\QtQuick\*"; DestDir: "{app}\QtQuick"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\QtQuick.2\*"; DestDir: "{app}\QtQuick.2"; Flags: recursesubdirs comparetimestamp
|
||||
|
||||
; Qt Quick 2D Renderer fallback for systems / environments with "low-level graphics" i.e. without 3D support
|
||||
Source: "bin\scenegraph\*"; DestDir: "{app}\scenegraph"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\start-low-graphics-mode.bat"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Mesa, open-source OpenGL implementation; part of "low-level graphics" support
|
||||
Source: "bin\opengl32sw.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Left out subdirectory "qmltooling" with the Qt QML debugger: Probably not relevant in an end-user package
|
||||
|
||||
; Microsoft Direct3D runtime
|
||||
Source: "bin\D3Dcompiler_47.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; bzip2 support
|
||||
Source: "bin\libbz2-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; ANGLE ("Almost Native Graphics Layer Engine") support, as used by Qt
|
||||
Source: "bin\libEGL.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libGLESV2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; FreeType font engine, as used by Qt
|
||||
Source: "bin\libfreetype-6.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; GCC runtime, x64 version
|
||||
Source: "bin\libgcc_s_seh-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; GLib, low level core library e.g. for GNOME and GTK+
|
||||
; Really needed under Windows?
|
||||
Source: "bin\libglib-2.0-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Graphite font support
|
||||
; Really needed?
|
||||
Source: "bin\libgraphite2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; HarfBuzz OpenType text shaping engine
|
||||
; Really needed?
|
||||
Source: "bin\libharfbuzz-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; LibIconv, conversions between character encodings
|
||||
Source: "bin\libiconv-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Part of cygwin? Needed by Qt somehow?
|
||||
Source: "bin\libicudt57.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libicuin57.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libicuuc57.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Library for native language support, part of GNU gettext
|
||||
Source: "bin\libintl-8.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; JasPer, support for JPEG-2000
|
||||
; was present in 0.10.3.1, not present anymore in 0.11.1.0
|
||||
; Source: "bin\libjasper-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; libjpeg, C library for reading and writing JPEG image files
|
||||
Source: "bin\libjpeg-8.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; Little CMS, color management system
|
||||
Source: "bin\liblcms2-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; XZ Utils, LZMA compression library
|
||||
Source: "bin\liblzma-5.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; MNG / Portable Network Graphics ("animated PNG")
|
||||
Source: "bin\libmng-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; PCRE, Perl Compatible Regular Expressions
|
||||
Source: "bin\libpcre-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libpcre16-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; libpng, the official PNG reference library
|
||||
Source: "bin\libpng16-16.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; libstdc++, GNU Standard C++ Library
|
||||
Source: "bin\libstdc++-6.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; LibTIFF, TIFF Library and Utilities
|
||||
Source: "bin\libtiff-5.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; C++ threading support
|
||||
Source: "bin\libwinpthread-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
; zlib compression library
|
||||
Source: "bin\zlib1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
|
||||
|
||||
[Tasks]
|
||||
Name: desktopicon; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:";
|
||||
|
||||
|
||||
[Run]
|
||||
Filename: "{app}\ReadMe.htm"; Description: "Show ReadMe"; Flags: postinstall shellexec skipifsilent
|
||||
|
||||
; DON'T offer to run the wallet right away, let the people read about initial blockchain download first in the ReadMe
|
||||
; Filename: "{app}\monero-wallet-gui.exe"; Description: "Run GUI Wallet now"; Flags: postinstall nowait skipifsilent
|
||||
|
||||
|
||||
[Code]
|
||||
var
|
||||
BlockChainDirPage: TInputDirWizardPage;
|
||||
blockChainDefaultDir: String;
|
||||
|
||||
procedure InitializeWizard;
|
||||
var s: String;
|
||||
width: Integer;
|
||||
begin
|
||||
// Large image for the "Welcome" page, with page reconfigured
|
||||
WizardForm.WelcomeLabel1.Visible := false;
|
||||
WizardForm.WelcomeLabel2.Visible := false;
|
||||
WizardForm.WizardBitmapImage.Height := 300;
|
||||
WizardForm.WizardBitmapImage.Width := 500;
|
||||
|
||||
// Image for the "Finnish" screen, in standard WizardBitmapImage size of 164 x 314
|
||||
ExtractTemporaryFile('FinishImage.bmp');
|
||||
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\FinishImage.bmp'));
|
||||
|
||||
// Additional wizard page for entering a special blockchain location
|
||||
blockChainDefaultDir := ExpandConstant('{commonappdata}\bitmonero');
|
||||
s := 'The default folder to store the Monero blockchain is ' + blockChainDefaultDir;
|
||||
s := s + '. As this will need more than 30 GB of free space, you may want to use a folder on a different drive.';
|
||||
s := s + ' If yes, specify that folder here.';
|
||||
|
||||
BlockChainDirPage := CreateInputDirPage(wpSelectDir,
|
||||
'Select Blockchain Directory', 'Where should the blockchain be installed?',
|
||||
s,
|
||||
False, '');
|
||||
BlockChainDirPage.Add('');
|
||||
|
||||
BlockChainDirPage.Values[0] := GetPreviousData('BlockChainDir', '');
|
||||
if BlockChainDirPage.Values[0] = '' then begin
|
||||
// Unfortunately 'TInputDirWizardDirPage' does not allow empty field
|
||||
BlockChainDirPage.Values[0] := blockChainDefaultDir;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure RegisterPreviousData(PreviousDataKey: Integer);
|
||||
begin
|
||||
// Store the selected folder for further reinstall/upgrade
|
||||
SetPreviousData(PreviousDataKey, 'BlockChainDir', BlockChainDirPage.Values[0]);
|
||||
end;
|
||||
|
||||
function BlockChainDir(Param: String) : String;
|
||||
// Directory of the blockchain
|
||||
var s: String;
|
||||
begin
|
||||
s := BlockChainDirPage.Values[0];
|
||||
Result := s;
|
||||
// No quotes for folder name with blanks as this is never used as part of a command line
|
||||
end;
|
||||
|
||||
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
|
||||
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
|
||||
var s: String;
|
||||
begin
|
||||
// Fill the 'Ready Memo' with the normal settings and the custom settings
|
||||
s := '';
|
||||
s := s + MemoDirInfo + NewLine + NewLine;
|
||||
|
||||
s := s + 'Blockchain folder' + NewLine;
|
||||
s := s + Space + BlockChainDir('') + NewLine;
|
||||
|
||||
Result := s;
|
||||
end;
|
||||
|
||||
function DaemonLog(Param: String) : String;
|
||||
// Full filename of the log of the daemon
|
||||
begin
|
||||
Result := BlockChainDir('') + '\bitmonero.log';
|
||||
// No quotes for filename with blanks as this is never used as part of a command line
|
||||
end;
|
||||
|
||||
function DaemonFlags(Param: String): String;
|
||||
// Flags to add to the shortcut to the daemon
|
||||
var s: String;
|
||||
begin
|
||||
s := BlockChainDir('');
|
||||
if s = blockChainDefaultDir then begin
|
||||
// No need to add the default dir as flags for the daemon
|
||||
s := '';
|
||||
end;
|
||||
if Pos(' ', s) > 0 then begin
|
||||
// Quotes needed for filename with blanks
|
||||
s := '"' + s + '"';
|
||||
end;
|
||||
if s <> '' then begin
|
||||
s := '--data-dir ' + s;
|
||||
end;
|
||||
Result := s;
|
||||
end;
|
||||
|
||||
procedure CurStepChanged(CurStep: TSetupStep);
|
||||
var s: TArrayOfString;
|
||||
begin
|
||||
if CurStep = ssPostInstall then begin
|
||||
// Re-build "monero-daemon.bat" according to actual install and blockchain directory used
|
||||
SetArrayLength(s, 3);
|
||||
s[0] := 'REM Execute the Monero daemon and then stay with window open after it exits';
|
||||
s[1] := '"' + ExpandConstant('{app}\monerod.exe') + '" ' + DaemonFlags('');
|
||||
s[2] := 'PAUSE';
|
||||
SaveStringsToFile(ExpandConstant('{app}\monero-daemon.bat'), s, false);
|
||||
end;
|
||||
end;
|
||||
|
||||
function InitializeUninstall(): Boolean;
|
||||
var s: String;
|
||||
begin
|
||||
s := 'Please note: Uninstall will not delete any downloaded blockchain. ';
|
||||
s := s + 'If you do not need it anymore you have to delete it manually.';
|
||||
s := s + #13#10#13#10 + 'Uninstall will not delete any wallets that you created either.';
|
||||
MsgBox(s, mbInformation, MB_OK);
|
||||
Result := true;
|
||||
end;
|
||||
|
||||
|
||||
[Icons]
|
||||
; Icons in the "Monero GUI Wallet" program group
|
||||
; Windows will almost always display icons in alphabetical order, per level, so specify the text accordingly
|
||||
Name: "{group}\GUI Wallet"; Filename: "{app}\monero-wallet-gui.exe"
|
||||
Name: "{group}\Uninstall GUI Wallet"; Filename: "{uninstallexe}"
|
||||
|
||||
; Sub-folder "Utilities";
|
||||
; Note that Windows 10, unlike Windows 7, ignores such sub-folders completely
|
||||
; and insists on displaying ALL icons on one single level
|
||||
Name: "{group}\Utilities\Monero Daemon"; Filename: "{app}\monerod.exe"; Parameters: {code:DaemonFlags}
|
||||
Name: "{group}\Utilities\Read Me"; Filename: "{app}\ReadMe.htm"
|
||||
|
||||
; CLI wallet: Needs a working directory ("Start in:") set in the icon, because with no such directory set
|
||||
; it tries to create new wallets without a path given in the probably non-writable program folder and will abort with an error
|
||||
Name: "{group}\Utilities\Textual (CLI) Wallet"; Filename: "{app}\monero-wallet-cli.exe"; WorkingDir: "{userdocs}\Monero\wallets"
|
||||
|
||||
; Icons for troubleshooting problems / testing / debugging
|
||||
; To show that they are in some way different (not for everyday use), make them visually different
|
||||
; from the others by text, and make them sort at the end by the help of "x" in front
|
||||
Name: "{group}\Utilities\x (Check Blockchain Folder)"; Filename: "{win}\Explorer.exe"; Parameters: {code:BlockChainDir}
|
||||
Name: "{group}\Utilities\x (Check Daemon Log)"; Filename: "Notepad"; Parameters: {code:DaemonLog}
|
||||
Name: "{group}\Utilities\x (Check Default Wallet Folder)"; Filename: "{win}\Explorer.exe"; Parameters: "{userdocs}\Monero\wallets"
|
||||
Name: "{group}\Utilities\x (Check GUI Wallet Log)"; Filename: "Notepad"; Parameters: "{app}\monero-wallet-gui.log"
|
||||
Name: "{group}\Utilities\x (Try Daemon, Exit Confirm)"; Filename: "{app}\monero-daemon.bat"
|
||||
Name: "{group}\Utilities\x (Try GUI Wallet Low Graphics Mode)"; Filename: "{app}\start-low-graphics-mode.bat"
|
||||
Name: "{group}\Utilities\x (Try Kill Daemon)"; Filename: "Taskkill.exe"; Parameters: "/IM monerod.exe /T /F"
|
||||
|
||||
; Desktop icons, optional with the help of the "Task" section
|
||||
Name: "{userdesktop}\GUI Wallet"; Filename: "{app}\monero-wallet-gui.exe"; Tasks: desktopicon
|
||||
|
||||
|
||||
[Registry]
|
||||
; Store any special flags for the daemon in the registry location where the GUI wallet will take it from
|
||||
; So if the wallet is used to start the daemon instead of the separate icon the wallet will pass the correct flags
|
||||
; Side effect, mostly positive: The uninstaller will clean the registry
|
||||
Root: HKCU; Subkey: "Software\monero-project"; Flags: uninsdeletekeyifempty
|
||||
Root: HKCU; Subkey: "Software\monero-project\monero-core"; Flags: uninsdeletekey
|
||||
Root: HKCU; Subkey: "Software\monero-project\monero-core"; ValueType: string; ValueName: "daemonFlags"; ValueData: {code:DaemonFlags};
|
||||
|
||||
44
installers/windows/README.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# Monero GUI Wallet Windows Installer #
|
||||
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
|
||||
## Introduction ##
|
||||
|
||||
This is a *Inno Setup* script `Monero.iss` plus some related files
|
||||
that allows you to build a standalone Windows installer (.exe) for
|
||||
the GUI wallet that comes with the Helium Hydra release of Monero.
|
||||
|
||||
This turns the GUI wallet into a more or less standard Windows program,
|
||||
by default installed into a subdirectory of `C:\Program Files`, a
|
||||
program group with some icons in the *Start* menu, and automatic
|
||||
uninstall support. It helps lowering the "barrier to entry"
|
||||
somewhat, especially for less technically experienced users of
|
||||
Monero.
|
||||
|
||||
As the setup script in file [Monero.iss](Monero.iss) has to list every
|
||||
single file of the GUI wallet package to install by name,
|
||||
this version of the script only works with exactly the GUI wallet
|
||||
for Monero release *Helium Hydra* that you find on
|
||||
[the official download page](https://getmonero.org/downloads/).
|
||||
|
||||
But of course it will be easy to modify the script for future
|
||||
versions of the GUI wallet.
|
||||
|
||||
## License ##
|
||||
|
||||
See [LICENSE](LICENSE).
|
||||
|
||||
## Building ##
|
||||
|
||||
You can only build on Windows, and the result is always a
|
||||
Windows .exe file that can act as a standalone installer for the
|
||||
Helium Hydra GUI wallet.
|
||||
|
||||
The build steps in detail:
|
||||
|
||||
1. Install *Inno Setup*. You can get it from [here](http://www.jrsoftware.org/isdl.php)
|
||||
2. Get the Inno Setup script plus related files by cloning the whole [monero-core GitHub repository](https://github.com/monero-project/monero-core); you will only need the files in the installer directory `installers\windows` however
|
||||
3. The setup script is written to take the GUI wallet files from a subdirectory named `bin`; so create `installers\windows\bin`, get the zip file of the GUI wallet from [here](https://getmonero.org/downloads/), unpack it somewhere, and copy all the files and subdirectories in the `monero-gui-0.11.1.0` directory to this `bin` subdirectory
|
||||
4. Start Inno Setup, load `Monero.iss` and compile it
|
||||
5. The result i.e. the finished installer will be the file `mysetup.exe` in the `installers\windows\Output` subdirectory
|
||||
|
||||
181
installers/windows/ReadMe.htm
Normal file
@@ -0,0 +1,181 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Monero Helium Hydra GUI Wallet</title>
|
||||
</head>
|
||||
|
||||
<body style="font-family: Arial, Helvetica, sans-serif">
|
||||
<h1>Monero Helium Hydra GUI Wallet</h1>
|
||||
|
||||
<p>Copyright (c) 2014-2017, The Monero Project<br>
|
||||
Date: September 19, 2017</p>
|
||||
|
||||
<h2>Preface</h2>
|
||||
|
||||
<p>This ReadMe does not aim to be a complete introduction to Monero. If you are new to Monero or even to
|
||||
cryptocurrencies in general you find a good introduction on reddit at
|
||||
<a href="https://www.reddit.com/r/Monero/comments/5zgail/rmonero_newcomers_please_read_everything_you_need/">Newcomers Please Read. Everything You Need To Know</a>.
|
||||
You also find a lot of good tutorials on <a href="https://www.monero.how/">Monero.How</a>.
|
||||
</p>
|
||||
|
||||
<p>Please note that Monero and its software are constantly evolving and progressing; it probably won't take
|
||||
long for some of the information here to become outdated.
|
||||
</p>
|
||||
|
||||
<h2>Content of the Package</h2>
|
||||
|
||||
<p>You just installed the <i>Monero GUI wallet</i> for Windows, release Helium Hydra, more exact version 0.11.1.0.
|
||||
The wallet enables you to send and receive Moneroj in a secure and very private way.
|
||||
</p>
|
||||
|
||||
<p>Also included is the <i>Monero daemon</i>, so you have everything now to run a so-called <i>full node</i>
|
||||
and become part of the network of nodes that manages the Monero blockchain; you don't need to install additional
|
||||
packages in order to start.</p>
|
||||
|
||||
<p>For checking whether there are already newer versions of this package you can go to the
|
||||
<a href="https://getmonero.org/downloads/">Downloads</a> page on <a href="https://getmonero.org/home">getmonero.org</a>,
|
||||
the official Monero site.</p>
|
||||
|
||||
<h2>Upgrading</h2>
|
||||
|
||||
<p>If you have already a release of the GUI wallet software on your computer that was installed with the help
|
||||
of this installer (in an earlier version), upgrading is easy: Just run the new installer; there is no need to
|
||||
uninstall the old Monero release first.</p>
|
||||
|
||||
<p>But if you run a release of the GUI wallet software that you downloaded as a .zip file and unzipped into a
|
||||
folder, if you "installed it manually" so to say, don't try to upgrade by pointing the installer to that folder,
|
||||
because this might lead to problems e.g. if you try to uninstall everything later.</p>
|
||||
|
||||
<p>It's better to let the installer put the software into another folder and then delete the old folder, either
|
||||
outright or after moving away any additional files that you may have stored there. (If you did not change
|
||||
default locations for wallets and the blockchain, you don't have to worry about them, they won't be in that
|
||||
particular folder, but elsewhere "in safety".)</p>
|
||||
|
||||
<h2>Access to the Blockchain</h2>
|
||||
|
||||
<p>Any Monero wallet needs access to the <i>blockchain</i>, the ongoing ledger of all Monero transactions. For the
|
||||
GUI wallet there are two principal ways to get that access: You can let Monero sync with the network
|
||||
i.e. let it download the blockchain and store it locally on your computer, or you can configure your wallet to
|
||||
access a remote <i>open node</i> to get indirect access to the blockchain.</p>
|
||||
|
||||
<p>Working with your own copy of the blockchain is <b>preferred</b>: It strengthens the Monero network, and it
|
||||
provides the most security and privacy possible for you.</p>
|
||||
|
||||
<p>However if your Internet access makes it difficult to run a full node, or if you have simply no room to store
|
||||
the blockchain locally (over 30 GB in fall 2017, and of course growing), you can compromise and try to connect
|
||||
to a remote node. One way of finding such a node is checking
|
||||
<a href="https://moneroworld.com/pages/nodes.html">this page</a>.
|
||||
</p>
|
||||
|
||||
<h2>Initial Blockchain Download</h2>
|
||||
|
||||
<p>Please do read the following <b>before</b> jumping right in and starting the GUI wallet:</p>
|
||||
|
||||
<p>If you decide to work with your own copy of the blockchain, which you should whenever possible, you have to
|
||||
download it first; it's not part of the installed package.
|
||||
Beside the GUI wallet there is second program, the so-called <i>Monero daemon</i>, which will carry out that download.
|
||||
You find it in the <i>Utilities</i> sub-folder of the program group.</p>
|
||||
|
||||
<p>Depending on your Internet access and the speed of your computer this can take
|
||||
<b>several hours</b>, in some cases <b>more than a day</b>. Furthermore there are unfortunate cases where the
|
||||
download gets stuck somehow or doesn't work at all, e.g. because a firewall prevents access to other nodes of the
|
||||
Monero network.</p>
|
||||
|
||||
<p>The GUI wallet can start the daemon for you, but that way you will not see much during initial blockchain
|
||||
download, especially you probably won't see any error messages in case something goes wrong. By starting the
|
||||
daemon yourself "by hand" using the <i>Monero Daemon</i> icon in the <i>Utilities</i> sub-folder of the
|
||||
Monero program group you will see it running and displaying messages in a separate window.</p>
|
||||
|
||||
<p>If all goes well the daemon will finally display a message like this:
|
||||
<i>You are now synchronized with the network.</i></p>
|
||||
|
||||
<p><b>Then</b> you are ready for sure to start your Monero adventures by starting the GUI wallet.</p>
|
||||
|
||||
<h2>Allowing Other Nodes to Connect to Your Node</h2>
|
||||
|
||||
<p>When the Monero daemon downloads the blockchain it does so by connecting to other nodes of the network.</p>
|
||||
|
||||
<p>If you allow incoming TCP/IP connections to port 18080 on your computer and let your daemon run for extended
|
||||
periods of time you can "return the favor" and help others in turn to get access to Monero. However, depending on
|
||||
your Internet connection, firewall, modem, router, ISP etc. this might not be possible, and opening a port in such
|
||||
a way usually requires some technical knowledge.</p>
|
||||
|
||||
<p>If you want to try you may start e.g. with
|
||||
<a href="https://monero.stackexchange.com/questions/2479/how-do-i-enable-incoming-connections-eli5">this Monero Stack Exchange</a>
|
||||
question.</p>
|
||||
|
||||
<h2>Troubleshooting</h2>
|
||||
|
||||
<p>The Monero software and especially the GUI wallet are "work in progress", and sometimes things go wrong.</p>
|
||||
|
||||
<p>Please note that despite any technical problems that you may encounter your moneroj are almost always safe: You may
|
||||
not be able to move them or you even may not see how many you currently have, but you most probably won't loose any.
|
||||
But do remember that the seed needed to re-create the wallet <b>is</b> critical, however: <b>Never loose your
|
||||
seed!</b></p>
|
||||
|
||||
<p>In the <i>Utilities</i> sub-folder there are several more icons that may help you to solve problems.
|
||||
These are the icons with a <i>x</i> in front and the name <i>(in parenthesis)</i> to make them visually stand
|
||||
apart from the "normal" ones because you will probably only need them in case of trouble, but not during normal
|
||||
usage of Monero.</p>
|
||||
|
||||
<p>Here an overview and short info what each icon does:</p>
|
||||
|
||||
<table cellpadding="3" border="1">
|
||||
<tr>
|
||||
<td><i>x (Try GUI Wallet Low Graphics Mode)</i></td>
|
||||
<td>Run the GUI wallet in a mode that allows for low-graphics
|
||||
environments, e.g. systems with very simple non-hardware-accelerated or emulated / virtualized video cards;
|
||||
also try if the display is simply slow or lags
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><i>x (Try Daemon, Exit Confirm)</i></td>
|
||||
<td>
|
||||
Run the Monero daemon in a window that does not automatically close if
|
||||
the daemon should exit because of a fatal error; useful in cases where the normal daemon icon
|
||||
just leads to a window that closes right away
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><i>x (Try Kill Daemon)</i></td>
|
||||
<td>
|
||||
Kill any running daemon (technically, any process called <i>monerod.exe</i>), whether
|
||||
with or without any visible window, for starting "with a clean slate"; easier than
|
||||
killing such tasks with the help of the Windows Task Manager
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><i>x (Check GUI Wallet Log)</i></td>
|
||||
<td>Open the log with status and error messages of the GUI wallet program in Notepad;
|
||||
experienced people have a chance to diagnose technical problems with the wallet,
|
||||
usually by looking at the last few lines of this log</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><i>x (Check Daemon Log)</i></td>
|
||||
<td>
|
||||
Open the log with status and error messages of the daemon in Notepad; again, the last few
|
||||
lines of this (possible very long) log are usually the most important for troubleshooting
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><i>x (Check Default Wallet Folder)</i></td>
|
||||
<td>
|
||||
Open the standard wallet folder in Windows Explorer; useful e.g. if you want to backup
|
||||
your wallets
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><i>x (Check Blockchain Folder)</i></td>
|
||||
<td>
|
||||
Open the folder containing the blockchain in Windows Explorer
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
BIN
installers/windows/WelcomeImage.bmp
Normal file
|
After Width: | Height: | Size: 440 KiB |
BIN
installers/windows/WizardSmallImage.bmp
Normal file
|
After Width: | Height: | Size: 9.6 KiB |
3
installers/windows/monero-daemon.bat
Normal file
@@ -0,0 +1,3 @@
|
||||
REM Execute the Monero daemon and then stay with window open after it exits
|
||||
"C:\Program Files\Monero Core\monerod.exe"
|
||||
PAUSE
|
||||
1
installers/windows/monero-wallet-gui.log
Normal file
@@ -0,0 +1 @@
|
||||
-----
|
||||
41
ios_get_libwallet.api.sh
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash -e
|
||||
if [ -z $BUILD_TYPE ]; then
|
||||
BUILD_TYPE=release
|
||||
fi
|
||||
|
||||
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
if [ -z $BOOST_LIBRARYDIR ]; then
|
||||
BOOST_LIBRARYDIR=${ROOT_DIR}/../ofxiOSBoost/build/ios/prefix/lib
|
||||
fi
|
||||
if [ -z $BOOST_INCLUDEDIR ]; then
|
||||
BOOST_INCLUDEDIR=${ROOT_DIR}/../ofxiOSBoost/build/ios/prefix/include
|
||||
fi
|
||||
if [ -z $OPENSSL_INCLUDE_DIR ]; then
|
||||
OPENSSL_INCLUDE_DIR=${ROOT_DIR}/../openssl/1.0.2j/include
|
||||
fi
|
||||
if [ -z $OPENSSL_ROOT_DIR ]; then
|
||||
OPENSSL_ROOT_DIR=${ROOT_DIR}/../openssl/1.0.2j
|
||||
fi
|
||||
|
||||
echo "Building IOS armv7"
|
||||
rm -r monero/build
|
||||
mkdir -p monero/build/release
|
||||
pushd monero/build/release
|
||||
cmake -D IOS=ON -D ARCH=armv7 -D BOOST_LIBRARYDIR=${BOOST_INCLUDEDIR} -D BOOST_INCLUDEDIR=${BOOST_INCLUDEDIR} -D OPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR} -D OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -D CMAKE_BUILD_TYPE=debug -D STATIC=ON -D BUILD_GUI_DEPS=ON -D INSTALL_VENDORED_LIBUNBOUND=ON -D CMAKE_INSTALL_PREFIX="/Users/jacob/crypto/monero-core/monero" ../..
|
||||
make -j4 && make install
|
||||
popd
|
||||
echo "Building IOS arm64"
|
||||
rm -r monero/build
|
||||
mkdir -p monero/build/release
|
||||
pushd monero/build/release
|
||||
cmake -D IOS=ON -D ARCH=arm64 -D BOOST_LIBRARYDIR=${BOOST_INCLUDEDIR} -D BOOST_INCLUDEDIR=${BOOST_INCLUDEDIR} -D OPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR} -D OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -D CMAKE_BUILD_TYPE=debug -D STATIC=ON -D BUILD_GUI_DEPS=ON -D INSTALL_VENDORED_LIBUNBOUND=ON -D CMAKE_INSTALL_PREFIX="/Users/jacob/crypto/monero-core/monero" ../..
|
||||
make -j4 && make install
|
||||
popd
|
||||
|
||||
echo "Creating fat library for armv7 and arm64"
|
||||
pushd monero
|
||||
mkdir -p lib-ios
|
||||
lipo -create lib-armv7/libwallet_merged.a lib-arm64/libwallet_merged.a -output lib-ios/libwallet_merged.a
|
||||
lipo -create lib-armv7/libunbound.a lib-arm64/libunbound.a -output lib-ios/libunbound.a
|
||||
lipo -create lib-armv7/libepee.a lib-arm64/libepee.a -output lib-ios/libepee.a
|
||||
popd
|
||||
BIN
lang/flags/israel.png
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
lang/flags/romania.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
lang/flags/south_korea.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
lang/flags/sweden.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
@@ -1,34 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<languages>
|
||||
|
||||
<!--
|
||||
List of available languages for your wallet's seed:
|
||||
0 : English
|
||||
1 : Spanish
|
||||
2 : German
|
||||
3 : Italian
|
||||
4 : Portuguese
|
||||
5 : Russian
|
||||
6 : Japanese
|
||||
0 : Deutsch (German)
|
||||
1 : English
|
||||
2 : Español (Spanish)
|
||||
3 : Français (French)
|
||||
4 : Italiano (Italian)
|
||||
5 : Nederlands (Dutch)
|
||||
6 : Português (Portuguese)
|
||||
7 : русский язык (Russian)
|
||||
8 : 日本語 (Japanese)
|
||||
9 : 简体中文 (中国) (Simplified Chinese (Mainland))
|
||||
-->
|
||||
<language display_name="English (US)" locale="en_US" wallet_language="English" flag="/lang/flags/usa.png" qs="none"/>
|
||||
<!-- <language display_name="English (GB)" locale="en_GB" wallet_language="English" flag="/lang/flags/uk.png" qs="none"/> -->
|
||||
<!-- <language display_name="English (ZA)" locale="en_SA" wallet_language="English" flag="/lang/flags/rpa.png" qs="none"/> -->
|
||||
<!-- <language display_name="العربية (PS)" locale="ar_PS" wallet_language="English" flag="/lang/flags/palestine.png" qs="none"/> -->
|
||||
<!-- <language display_name="Deutsch" locale="de_DE" wallet_language="German" flag="/lang/flags/german.png" qs="none"/> -->
|
||||
<language display_name="Deutsch" locale="de_DE" wallet_language="Deutsch" flag="/lang/flags/german.png" qs="none"/>
|
||||
<language display_name="Esperanto" locale="eo" wallet_language="English" flag="/lang/flags/esperanto.png" qs="none"/>
|
||||
<!-- <language display_name="Español" locale="es_ES" wallet_language="Spanish" flag="/lang/flags/spain.png" qs="none"/> -->
|
||||
<language display_name="Español" locale="es_ES" wallet_language="Español" flag="/lang/flags/spain.png" qs="none"/>
|
||||
<!-- <language display_name="Suomen kieli" locale="fi" wallet_language="English" flag="/lang/flags/finland.png" qs="none"/> -->
|
||||
<language display_name="Français" locale="fr_FR" wallet_language="French" flag="/lang/flags/france.png" qs="none"/>
|
||||
<language display_name="Français" locale="fr_FR" wallet_language="Français" flag="/lang/flags/france.png" qs="none"/>
|
||||
<language display_name="Swedish" locale="sv_SE" wallet_language="English" flag="/lang/flags/sweden.png" qs="none"/>
|
||||
<!-- <language display_name="Hrvatski" locale="hr_HR" wallet_language="English" flag="/lang/flags/croatia.png" qs="none"/> -->
|
||||
<!-- <language display_name="हिन्दी" locale="hi_IN" wallet_language="English" flag="/lang/flags/india.png" qs="none"/> -->
|
||||
<language display_name="Bahasa Indonesia" locale="id_ID" wallet_language="English" flag="/lang/flags/indonesia.png" qs="none"/>
|
||||
<language display_name="Italiano" locale="it_IT" wallet_language="Italian" flag="/lang/flags/italy.png" qs="none"/>
|
||||
<language display_name="日本語" locale="ja_JP" wallet_language="Japanese" flag="/lang/flags/japan.png" qs="none"/>
|
||||
<language display_name="Nederlands" locale="nl_NL" wallet_language="Dutch" flag="/lang/flags/netherlands.png" qs="none"/>
|
||||
<language display_name="Italiano" locale="it_IT" wallet_language="Italiano" flag="/lang/flags/italy.png" qs="none"/>
|
||||
<language display_name="日本語" locale="ja_JP" wallet_language="日本語" flag="/lang/flags/japan.png" qs="none"/>
|
||||
<language display_name="Nederlands" locale="nl_NL" wallet_language="Nederlands" flag="/lang/flags/netherlands.png" qs="none"/>
|
||||
<!-- <language display_name="Polski" locale="pl_PL" wallet_language="English" flag="/lang/flags/poland.png" qs="none"/> -->
|
||||
<language display_name="Português (BR)" locale="pt-br_BR" wallet_language="Portuguese" flag="/lang/flags/brazil.png" qs="none"/>
|
||||
<!-- <language display_name="русский язык" locale="ru_RU" wallet_language="Russian" flag="/lang/flags/russia.png" qs="none"/> -->
|
||||
<language display_name="简体中文 (中国)" locale="zh-cn_CN" wallet_language="English" flag="/lang/flags/china.png" qs="none"/>
|
||||
<language display_name="Português (BR)" locale="pt-br_BR" wallet_language="Português" flag="/lang/flags/brazil.png" qs="none"/>
|
||||
<language display_name="Русский язык" locale="ru_RU" wallet_language="русский язык" flag="/lang/flags/russia.png" qs="none"/>
|
||||
<language display_name="简体中文 (中国)" locale="zh-cn_CN" wallet_language="简体中文 (中国)" flag="/lang/flags/china.png" qs="none"/>
|
||||
<language display_name="繁體中文 (台灣)" locale="zh-tw_CN" wallet_language="English" flag="/lang/flags/taiwan.png" qs="none"/>
|
||||
<language display_name="עברית" locale="he_HE" wallet_language="English" flag="/lang/flags/israel.png" qs="none"/>
|
||||
<language display_name="한국어" locale="ko_KO" wallet_language="English" flag="/lang/flags/south_korea.png" qs="none"/>
|
||||
<language display_name="Română" locale="ro_RO" wallet_language="English" flag="/lang/flags/romania.png" qs="none"/>
|
||||
</languages>
|
||||
|
||||
@@ -46,7 +46,9 @@ cat > $TARGET/start-gui.sh <<EOL
|
||||
export LD_LIBRARY_PATH=\`pwd\`/libs
|
||||
export QT_PLUGIN_PATH=\`pwd\`/plugins
|
||||
export QML2_IMPORT_PATH=\`pwd\`/qml
|
||||
./$GUI_EXEC
|
||||
# make it so that it can be called from anywhere and also through soft links
|
||||
SCRIPT_DIR="\$(dirname "\$(test -L "\${BASH_SOURCE[0]}" && readlink "\${BASH_SOURCE[0]}" || echo "\${BASH_SOURCE[0]}")")"
|
||||
"\$SCRIPT_DIR"/$GUI_EXEC
|
||||
EOL
|
||||
|
||||
chmod +x $TARGET/start-gui.sh
|
||||
chmod +x $TARGET/start-gui.sh
|
||||
|
||||
12
main.cpp
@@ -68,15 +68,15 @@ void messageHandler(QtMsgType type, const QMessageLogContext &context, const QSt
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// Enable high DPI scaling on windows & linux
|
||||
#if !defined(Q_OS_ANDROID) && QT_VERSION >= 0x050600
|
||||
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
qDebug() << "High DPI auto scaling - enabled";
|
||||
#endif
|
||||
// // Enable high DPI scaling on windows & linux
|
||||
//#if !defined(Q_OS_ANDROID) && QT_VERSION >= 0x050600
|
||||
// QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
// qDebug() << "High DPI auto scaling - enabled";
|
||||
//#endif
|
||||
|
||||
// Log settings
|
||||
Monero::Wallet::init(argv[0], "monero-wallet-gui");
|
||||
qInstallMessageHandler(messageHandler);
|
||||
// qInstallMessageHandler(messageHandler);
|
||||
|
||||
MainApp app(argc, argv);
|
||||
|
||||
|
||||
304
main.qml
@@ -42,7 +42,7 @@ import "wizard"
|
||||
|
||||
ApplicationWindow {
|
||||
id: appWindow
|
||||
|
||||
title: "Monero"
|
||||
|
||||
property var currentItem
|
||||
property bool whatIsEnable: false
|
||||
@@ -211,6 +211,8 @@ ApplicationWindow {
|
||||
delete wizard.settings['wallet']
|
||||
} else {
|
||||
var wallet_path = walletPath();
|
||||
if(isIOS)
|
||||
wallet_path = moneroAccountsDir + wallet_path;
|
||||
// console.log("opening wallet at: ", wallet_path, "with password: ", appWindow.password);
|
||||
console.log("opening wallet at: ", wallet_path, ", testnet: ", persistentSettings.testnet);
|
||||
walletManager.openWalletAsync(wallet_path, appWindow.password,
|
||||
@@ -235,7 +237,11 @@ ApplicationWindow {
|
||||
middlePanel.checkPaymentClicked.disconnect(handleCheckPayment);
|
||||
}
|
||||
currentWallet = undefined;
|
||||
walletManager.closeWalletAsync();
|
||||
if (isIOS) {
|
||||
console.log("closing sync - ios")
|
||||
walletManager.closeWallet();
|
||||
} else
|
||||
walletManager.closeWalletAsync();
|
||||
}
|
||||
|
||||
function connectWallet(wallet) {
|
||||
@@ -245,6 +251,12 @@ ApplicationWindow {
|
||||
|
||||
viewOnly = currentWallet.viewOnly;
|
||||
|
||||
// New wallets saves the testnet flag in keys file.
|
||||
if(persistentSettings.testnet != currentWallet.testnet) {
|
||||
console.log("Using testnet flag from keys file")
|
||||
persistentSettings.testnet = currentWallet.testnet;
|
||||
}
|
||||
|
||||
// connect handlers
|
||||
currentWallet.refreshed.connect(onWalletRefresh)
|
||||
currentWallet.updated.connect(onWalletUpdate)
|
||||
@@ -290,7 +302,7 @@ ApplicationWindow {
|
||||
middlePanel.transferView.updatePriorityDropdown();
|
||||
|
||||
// If wallet isnt connected and no daemon is running - Ask
|
||||
if(!walletInitialized && status === Wallet.ConnectionStatus_Disconnected && !daemonManager.running(persistentSettings.testnet)){
|
||||
if(isDaemonLocal() && !walletInitialized && status === Wallet.ConnectionStatus_Disconnected && !daemonManager.running(persistentSettings.testnet)){
|
||||
daemonManagerDialog.open();
|
||||
}
|
||||
// initialize transaction history once wallet is initialized first time;
|
||||
@@ -399,7 +411,7 @@ ApplicationWindow {
|
||||
currentWallet.pauseRefresh();
|
||||
|
||||
appWindow.showProcessingSplash(qsTr("Waiting for daemon to start..."))
|
||||
daemonManager.start(flags, persistentSettings.testnet);
|
||||
daemonManager.start(flags, persistentSettings.testnet, persistentSettings.blockchainDataDir);
|
||||
persistentSettings.daemonFlags = flags
|
||||
}
|
||||
|
||||
@@ -467,7 +479,10 @@ ApplicationWindow {
|
||||
|
||||
function walletsFound() {
|
||||
if (persistentSettings.wallet_path.length > 0) {
|
||||
return walletManager.walletExists(persistentSettings.wallet_path);
|
||||
if(isIOS)
|
||||
return walletManager.walletExists(moneroAccountsDir + persistentSettings.wallet_path);
|
||||
else
|
||||
return walletManager.walletExists(persistentSettings.wallet_path);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -491,7 +506,7 @@ ApplicationWindow {
|
||||
currentWallet.disposeTransaction(transaction);
|
||||
|
||||
} else if (transaction.txCount == 0) {
|
||||
informationPopup.title = qsTr("No unmixable outputs to sweep") + translationManager.emptyString
|
||||
informationPopup.title = qsTr("Error") + translationManager.emptyString
|
||||
informationPopup.text = qsTr("No unmixable outputs to sweep") + translationManager.emptyString
|
||||
informationPopup.icon = StandardIcon.Information
|
||||
informationPopup.onCloseCallback = null
|
||||
@@ -604,7 +619,7 @@ ApplicationWindow {
|
||||
currentWallet.disposeTransaction(transaction);
|
||||
|
||||
} else if (transaction.txCount == 0) {
|
||||
informationPopup.title = qsTr("No unmixable outputs to sweep") + translationManager.emptyString
|
||||
informationPopup.title = qsTr("Error") + translationManager.emptyString
|
||||
informationPopup.text = qsTr("No unmixable outputs to sweep") + translationManager.emptyString
|
||||
informationPopup.icon = StandardIcon.Information
|
||||
informationPopup.onCloseCallback = null
|
||||
@@ -769,10 +784,21 @@ ApplicationWindow {
|
||||
leftPanel.balanceText = leftPanel.unlockedBalanceText = walletManager.displayAmount(0);
|
||||
}
|
||||
|
||||
function hideMenu() {
|
||||
goToBasicAnimation.start();
|
||||
console.log(appWindow.width)
|
||||
}
|
||||
|
||||
function showMenu() {
|
||||
goToProAnimation.start();
|
||||
console.log(appWindow.width)
|
||||
}
|
||||
|
||||
|
||||
objectName: "appWindow"
|
||||
visible: true
|
||||
width: rightPanelExpanded ? 1269 : 1269 - 300
|
||||
height: maxWindowHeight;
|
||||
// width: Screen.width //rightPanelExpanded ? 1269 : 1269 - 300
|
||||
// height: 900 //300//maxWindowHeight;
|
||||
color: "#FFFFFF"
|
||||
flags: persistentSettings.customDecorations ? (Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint) : (Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint | Qt.WindowMaximizeButtonHint)
|
||||
onWidthChanged: x -= 0
|
||||
@@ -801,10 +827,15 @@ ApplicationWindow {
|
||||
//
|
||||
walletManager.walletOpened.connect(onWalletOpened);
|
||||
walletManager.walletClosed.connect(onWalletClosed);
|
||||
walletManager.checkUpdatesComplete.connect(onWalletCheckUpdatesComplete);
|
||||
|
||||
if(typeof daemonManager != "undefined") {
|
||||
daemonManager.daemonStarted.connect(onDaemonStarted);
|
||||
daemonManager.daemonStartFailure.connect(onDaemonStartFailure);
|
||||
daemonManager.daemonStopped.connect(onDaemonStopped);
|
||||
}
|
||||
|
||||
|
||||
daemonManager.daemonStarted.connect(onDaemonStarted);
|
||||
daemonManager.daemonStartFailure.connect(onDaemonStartFailure);
|
||||
daemonManager.daemonStopped.connect(onDaemonStopped);
|
||||
|
||||
// Connect app exit to qml window exit handling
|
||||
mainApp.closing.connect(appWindow.close);
|
||||
@@ -849,7 +880,7 @@ ApplicationWindow {
|
||||
property bool allow_background_mining : false
|
||||
property bool miningIgnoreBattery : true
|
||||
property bool testnet: false
|
||||
property string daemon_address: "localhost:18081"
|
||||
property string daemon_address: testnet ? "localhost:28081" : "localhost:18081"
|
||||
property string payment_id
|
||||
property int restore_height : 0
|
||||
property bool is_recovering : false
|
||||
@@ -860,6 +891,7 @@ ApplicationWindow {
|
||||
property string daemonUsername: ""
|
||||
property string daemonPassword: ""
|
||||
property bool transferShowAdvanced: false
|
||||
property string blockchainDataDir: ""
|
||||
}
|
||||
|
||||
// Information dialog
|
||||
@@ -880,13 +912,25 @@ ApplicationWindow {
|
||||
id: transactionConfirmationPopup
|
||||
onAccepted: {
|
||||
close();
|
||||
|
||||
// Save transaction to file if view only wallet
|
||||
if(viewOnly) {
|
||||
saveTxDialog.open();
|
||||
return;
|
||||
} else
|
||||
handleTransactionConfirmed()
|
||||
transactionConfirmationPasswordDialog.onAcceptedCallback = function() {
|
||||
if(appWindow.password === transactionConfirmationPasswordDialog.password){
|
||||
// Save transaction to file if view only wallet
|
||||
if(viewOnly) {
|
||||
saveTxDialog.open();
|
||||
} else {
|
||||
handleTransactionConfirmed()
|
||||
}
|
||||
} else {
|
||||
informationPopup.title = qsTr("Error") + translationManager.emptyString;
|
||||
informationPopup.text = qsTr("Wrong password");
|
||||
informationPopup.open()
|
||||
informationPopup.onCloseCallback = function() {
|
||||
transactionConfirmationPasswordDialog.open()
|
||||
}
|
||||
}
|
||||
transactionConfirmationPasswordDialog.password = ""
|
||||
}
|
||||
transactionConfirmationPasswordDialog.open()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -936,6 +980,15 @@ ApplicationWindow {
|
||||
|
||||
}
|
||||
|
||||
PasswordDialog {
|
||||
id: transactionConfirmationPasswordDialog
|
||||
property var onAcceptedCallback
|
||||
onAccepted: {
|
||||
if (onAcceptedCallback())
|
||||
onAcceptedCallback();
|
||||
}
|
||||
}
|
||||
|
||||
DaemonManagerDialog {
|
||||
id: daemonManagerDialog
|
||||
onRejected: {
|
||||
@@ -967,53 +1020,60 @@ ApplicationWindow {
|
||||
PropertyChanges { target: middlePanel; visible: false }
|
||||
PropertyChanges { target: titleBar; basicButtonVisible: false }
|
||||
PropertyChanges { target: wizard; visible: true }
|
||||
PropertyChanges { target: appWindow; width: 930; }
|
||||
PropertyChanges { target: appWindow; height: 650; }
|
||||
PropertyChanges { target: appWindow; width: (Screen.width < 930)? Screen.width : 930; }
|
||||
PropertyChanges { target: appWindow; height: maxWindowHeight; }
|
||||
PropertyChanges { target: resizeArea; visible: false }
|
||||
PropertyChanges { target: titleBar; maximizeButtonVisible: false }
|
||||
PropertyChanges { target: frameArea; blocked: true }
|
||||
// PropertyChanges { target: frameArea; blocked: true }
|
||||
PropertyChanges { target: titleBar; visible: false }
|
||||
PropertyChanges { target: titleBar; y: 0 }
|
||||
PropertyChanges { target: titleBar; title: qsTr("Program setup wizard") + translationManager.emptyString }
|
||||
}, State {
|
||||
name: "normal"
|
||||
PropertyChanges { target: leftPanel; visible: true }
|
||||
PropertyChanges { target: leftPanel; visible: (isMobile)? false : true }
|
||||
PropertyChanges { target: rightPanel; visible: true }
|
||||
PropertyChanges { target: middlePanel; visible: true }
|
||||
PropertyChanges { target: titleBar; basicButtonVisible: true }
|
||||
PropertyChanges { target: wizard; visible: false }
|
||||
PropertyChanges { target: appWindow; width: rightPanelExpanded ? 1269 : 1269 - 300; }
|
||||
PropertyChanges { target: appWindow; width: (Screen.width < 969)? Screen.width : 969 } //rightPanelExpanded ? 1269 : 1269 - 300;
|
||||
PropertyChanges { target: appWindow; height: maxWindowHeight; }
|
||||
PropertyChanges { target: resizeArea; visible: true }
|
||||
PropertyChanges { target: titleBar; maximizeButtonVisible: true }
|
||||
PropertyChanges { target: frameArea; blocked: false }
|
||||
// PropertyChanges { target: frameArea; blocked: true }
|
||||
PropertyChanges { target: titleBar; visible: true }
|
||||
PropertyChanges { target: titleBar; y: 0 }
|
||||
// PropertyChanges { target: titleBar; y: 0 }
|
||||
PropertyChanges { target: titleBar; title: qsTr("Monero") + translationManager.emptyString }
|
||||
}
|
||||
]
|
||||
|
||||
MobileHeader {
|
||||
id: mobileHeader
|
||||
visible: isMobile
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: visible? 65 : 0
|
||||
}
|
||||
|
||||
LeftPanel {
|
||||
id: leftPanel
|
||||
anchors.top: mobileHeader.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
height: parent.height
|
||||
onDashboardClicked: middlePanel.state = "Dashboard"
|
||||
onTransferClicked: middlePanel.state = "Transfer"
|
||||
onReceiveClicked: middlePanel.state = "Receive"
|
||||
onTxkeyClicked: middlePanel.state = "TxKey"
|
||||
onHistoryClicked: middlePanel.state = "History"
|
||||
onAddressBookClicked: middlePanel.state = "AddressBook"
|
||||
onMiningClicked: middlePanel.state = "Mining"
|
||||
onSignClicked: middlePanel.state = "Sign"
|
||||
onSettingsClicked: middlePanel.state = "Settings"
|
||||
onDashboardClicked: {middlePanel.state = "Dashboard"; if(isMobile) hideMenu()}
|
||||
onTransferClicked: {middlePanel.state = "Transfer"; if(isMobile) hideMenu()}
|
||||
onReceiveClicked: {middlePanel.state = "Receive"; if(isMobile) hideMenu()}
|
||||
onTxkeyClicked: {middlePanel.state = "TxKey"; if(isMobile) hideMenu()}
|
||||
onHistoryClicked: {middlePanel.state = "History"; if(isMobile) hideMenu()}
|
||||
onAddressBookClicked: {middlePanel.state = "AddressBook"; if(isMobile) hideMenu()}
|
||||
onMiningClicked: {middlePanel.state = "Mining"; if(isMobile) hideMenu()}
|
||||
onSignClicked: {middlePanel.state = "Sign"; if(isMobile) hideMenu()}
|
||||
onSettingsClicked: {middlePanel.state = "Settings"; if(isMobile) hideMenu()}
|
||||
}
|
||||
|
||||
RightPanel {
|
||||
id: rightPanel
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: parent.height
|
||||
width: appWindow.rightPanelExpanded ? 300 : 0
|
||||
visible: appWindow.rightPanelExpanded
|
||||
}
|
||||
@@ -1021,10 +1081,10 @@ ApplicationWindow {
|
||||
|
||||
MiddlePanel {
|
||||
id: middlePanel
|
||||
anchors.top: mobileHeader.bottom
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: leftPanel.visible ? leftPanel.right : parent.left
|
||||
anchors.right: rightPanel.left
|
||||
height: parent.height
|
||||
anchors.right: parent.right
|
||||
state: "Transfer"
|
||||
}
|
||||
|
||||
@@ -1034,54 +1094,54 @@ ApplicationWindow {
|
||||
visible: false
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: frameArea
|
||||
property bool blocked: false
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 30
|
||||
z: 1
|
||||
hoverEnabled: true
|
||||
propagateComposedEvents: true
|
||||
onPressed: mouse.accepted = false
|
||||
onReleased: mouse.accepted = false
|
||||
onMouseXChanged: titleBar.mouseX = mouseX
|
||||
onContainsMouseChanged: titleBar.containsMouse = containsMouse
|
||||
}
|
||||
// MouseArea {
|
||||
// id: frameArea
|
||||
// property bool blocked: false
|
||||
// anchors.top: parent.top
|
||||
// anchors.left: parent.left
|
||||
// anchors.right: parent.right
|
||||
// height: 30
|
||||
// z: 1
|
||||
// hoverEnabled: true
|
||||
// propagateComposedEvents: true
|
||||
// onPressed: mouse.accepted = false
|
||||
// onReleased: mouse.accepted = false
|
||||
// onMouseXChanged: titleBar.mouseX = mouseX
|
||||
// onContainsMouseChanged: titleBar.containsMouse = containsMouse
|
||||
// }
|
||||
|
||||
SequentialAnimation {
|
||||
id: goToBasicAnimation
|
||||
PropertyAction {
|
||||
target: appWindow
|
||||
properties: "visibility"
|
||||
value: Window.Windowed
|
||||
}
|
||||
PropertyAction {
|
||||
target: titleBar
|
||||
properties: "maximizeButtonVisible"
|
||||
value: false
|
||||
}
|
||||
PropertyAction {
|
||||
target: frameArea
|
||||
properties: "blocked"
|
||||
value: true
|
||||
}
|
||||
// PropertyAction {
|
||||
// target: appWindow
|
||||
// properties: "visibility"
|
||||
// value: Window.Windowed
|
||||
// }
|
||||
// PropertyAction {
|
||||
// target: titleBar
|
||||
// properties: "maximizeButtonVisible"
|
||||
// value: false
|
||||
// }
|
||||
// PropertyAction {
|
||||
// target: frameArea
|
||||
// properties: "blocked"
|
||||
// value: true
|
||||
// }
|
||||
PropertyAction {
|
||||
target: resizeArea
|
||||
properties: "visible"
|
||||
value: false
|
||||
}
|
||||
PropertyAction {
|
||||
target: appWindow
|
||||
properties: "height"
|
||||
value: 30
|
||||
}
|
||||
PropertyAction {
|
||||
target: appWindow
|
||||
properties: "width"
|
||||
value: 470
|
||||
value: true
|
||||
}
|
||||
// PropertyAction {
|
||||
// target: appWindow
|
||||
// properties: "height"
|
||||
// value: 30
|
||||
// }
|
||||
// PropertyAction {
|
||||
// target: appWindow
|
||||
// properties: "width"
|
||||
// value: 326
|
||||
// }
|
||||
PropertyAction {
|
||||
targets: [leftPanel, rightPanel]
|
||||
properties: "visible"
|
||||
@@ -1093,11 +1153,11 @@ ApplicationWindow {
|
||||
value: true
|
||||
}
|
||||
|
||||
PropertyAction {
|
||||
target: appWindow
|
||||
properties: "height"
|
||||
value: middlePanel.height
|
||||
}
|
||||
// PropertyAction {
|
||||
// target: appWindow
|
||||
// properties: "height"
|
||||
// value: middlePanel.height
|
||||
// }
|
||||
|
||||
onStopped: {
|
||||
// middlePanel.visible = false
|
||||
@@ -1108,11 +1168,11 @@ ApplicationWindow {
|
||||
|
||||
SequentialAnimation {
|
||||
id: goToProAnimation
|
||||
PropertyAction {
|
||||
target: appWindow
|
||||
properties: "height"
|
||||
value: 30
|
||||
}
|
||||
// PropertyAction {
|
||||
// target: appWindow
|
||||
// properties: "height"
|
||||
// value: 30
|
||||
// }
|
||||
PropertyAction {
|
||||
target: middlePanel
|
||||
properties: "basicMode"
|
||||
@@ -1123,26 +1183,26 @@ ApplicationWindow {
|
||||
properties: "visible"
|
||||
value: true
|
||||
}
|
||||
PropertyAction {
|
||||
target: appWindow
|
||||
properties: "width"
|
||||
value: rightPanelExpanded ? 1269 : 1269 - 300
|
||||
}
|
||||
PropertyAction {
|
||||
target: appWindow
|
||||
properties: "height"
|
||||
value: maxWindowHeight
|
||||
}
|
||||
PropertyAction {
|
||||
target: frameArea
|
||||
properties: "blocked"
|
||||
value: false
|
||||
}
|
||||
PropertyAction {
|
||||
target: titleBar
|
||||
properties: "maximizeButtonVisible"
|
||||
value: true
|
||||
}
|
||||
// PropertyAction {
|
||||
// target: appWindow
|
||||
// properties: "width"
|
||||
// value: rightPanelExpanded ? 1269 : 1269 - 300
|
||||
// }
|
||||
// PropertyAction {
|
||||
// target: appWindow
|
||||
// properties: "height"
|
||||
// value: maxWindowHeight
|
||||
// }
|
||||
// PropertyAction {
|
||||
// target: frameArea
|
||||
// properties: "blocked"
|
||||
// value: false
|
||||
// }
|
||||
// PropertyAction {
|
||||
// target: titleBar
|
||||
// properties: "maximizeButtonVisible"
|
||||
// value: true
|
||||
// }
|
||||
}
|
||||
|
||||
WizardMain {
|
||||
@@ -1159,7 +1219,7 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
property int minWidth: 326
|
||||
property int minHeight: 720
|
||||
property int minHeight: 400
|
||||
MouseArea {
|
||||
id: resizeArea
|
||||
hoverEnabled: true
|
||||
@@ -1270,6 +1330,7 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
Notifier {
|
||||
visible:false
|
||||
id: notifier
|
||||
}
|
||||
}
|
||||
@@ -1277,7 +1338,7 @@ ApplicationWindow {
|
||||
onClosing: {
|
||||
|
||||
// If daemon is running - prompt user before exiting
|
||||
if(typeof daemonManager != undefined && daemonManager.running(persistentSettings.testnet)) {
|
||||
if(typeof daemonManager != "undefined" && daemonManager.running(persistentSettings.testnet)) {
|
||||
close.accepted = false;
|
||||
|
||||
// Show confirmation dialog
|
||||
@@ -1308,8 +1369,7 @@ ApplicationWindow {
|
||||
Qt.quit();
|
||||
}
|
||||
|
||||
function checkUpdates() {
|
||||
var update = walletManager.checkUpdates("monero-gui", "gui")
|
||||
function onWalletCheckUpdatesComplete(update) {
|
||||
if (update === "")
|
||||
return
|
||||
print("Update found: " + update)
|
||||
@@ -1327,10 +1387,24 @@ ApplicationWindow {
|
||||
}
|
||||
}
|
||||
|
||||
function checkUpdates() {
|
||||
walletManager.checkUpdatesAsync("monero-gui", "gui")
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: updatesTimer
|
||||
interval: 3600*1000; running: true; repeat: true
|
||||
onTriggered: checkUpdates()
|
||||
}
|
||||
|
||||
function isDaemonLocal() {
|
||||
var daemonAddress = appWindow.persistentSettings.daemon_address
|
||||
if (daemonAddress === "")
|
||||
return false
|
||||
var daemonHost = daemonAddress.split(":")[0]
|
||||
if (daemonHost === "127.0.0.1" || daemonHost === "localhost")
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
2
monero
@@ -79,20 +79,23 @@ SOURCES = *.qml \
|
||||
ios:armv7 {
|
||||
message("target is armv7")
|
||||
LIBS += \
|
||||
-L$$PWD/ofxiOSBoost/build/libs/boost/lib/armv7 \
|
||||
-L$$PWD/../ofxiOSBoost/build/libs/boost/lib/armv7 \
|
||||
}
|
||||
ios:arm64 {
|
||||
message("target is arm64")
|
||||
LIBS += \
|
||||
-L$$PWD/ofxiOSBoost/build/libs/boost/lib/arm64 \
|
||||
-L$$PWD/../ofxiOSBoost/build/libs/boost/lib/arm64 \
|
||||
}
|
||||
!ios {
|
||||
LIBS += -L$$WALLET_ROOT/lib \
|
||||
-lwallet_merged \
|
||||
-lepee \
|
||||
-lunbound
|
||||
-lunbound \
|
||||
-leasylogging \
|
||||
-lreadline \
|
||||
}
|
||||
|
||||
|
||||
ios {
|
||||
message("Host is IOS")
|
||||
|
||||
@@ -105,7 +108,8 @@ ios {
|
||||
-lunbound
|
||||
|
||||
LIBS+= \
|
||||
-L$$PWD/OpenSSL-for-iPhone/lib \
|
||||
-L$$PWD/../OpenSSL-for-iPhone/lib \
|
||||
-L$$PWD/../ofxiOSBoost/build/libs/boost/lib/arm64 \
|
||||
-lboost_serialization \
|
||||
-lboost_thread \
|
||||
-lboost_system \
|
||||
@@ -279,6 +283,7 @@ macx {
|
||||
|
||||
# translation stuff
|
||||
TRANSLATIONS = \ # English is default language, no explicit translation file
|
||||
$$PWD/translations/monero-core.ts \ # translation source (copy this file when creating a new translation)
|
||||
$$PWD/translations/monero-core_ar.ts \ # Arabic
|
||||
$$PWD/translations/monero-core_pt-br.ts \ # Portuguese (Brazil)
|
||||
$$PWD/translations/monero-core_de.ts \ # German
|
||||
@@ -294,8 +299,12 @@ TRANSLATIONS = \ # English is default language, no explicit translation file
|
||||
$$PWD/translations/monero-core_nl.ts \ # Dutch
|
||||
$$PWD/translations/monero-core_pl.ts \ # Polish
|
||||
$$PWD/translations/monero-core_ru.ts \ # Russian
|
||||
$$PWD/translations/monero-core_sv.ts \ # Swedish
|
||||
$$PWD/translations/monero-core_zh-cn.ts \ # Chinese (Simplified-China)
|
||||
$$PWD/translations/monero-core_zh-tw.ts \ # Chinese (Traditional-Taiwan)
|
||||
$$PWD/translations/monero-core_he.ts \ # Hebrew
|
||||
$$PWD/translations/monero-core_ko.ts \ # Korean
|
||||
$$PWD/translations/monero-core_ro.ts \ # Romanian
|
||||
|
||||
CONFIG(release, debug|release) {
|
||||
DESTDIR = release/bin
|
||||
@@ -357,6 +366,7 @@ macx {
|
||||
PRE_TARGETDEPS += langupd compiler_langrel_make_all
|
||||
|
||||
RESOURCES += qml.qrc
|
||||
CONFIG += qtquickcompiler
|
||||
|
||||
# Additional import path used to resolve QML modules in Qt Creator's code model
|
||||
QML_IMPORT_PATH =
|
||||
@@ -390,7 +400,8 @@ OTHER_FILES += \
|
||||
|
||||
DISTFILES += \
|
||||
notes.txt \
|
||||
monero/src/wallet/CMakeLists.txt
|
||||
monero/src/wallet/CMakeLists.txt \
|
||||
components/MobileHeader.qml
|
||||
|
||||
|
||||
# windows application icon
|
||||
|
||||
@@ -60,7 +60,6 @@ Rectangle {
|
||||
anchors.topMargin: 17
|
||||
text: qsTr("Address") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
|
||||
}
|
||||
|
||||
StandardButton {
|
||||
@@ -102,8 +101,6 @@ Rectangle {
|
||||
anchors.topMargin: 17
|
||||
text: qsTr("Payment ID <font size='2'>(Optional)</font>") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
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 {
|
||||
@@ -125,7 +122,6 @@ Rectangle {
|
||||
anchors.topMargin: 17
|
||||
text: qsTr("Description <font size='2'>(Optional)</font>") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip test test</b><br/><br/>test line 2") + translationManager.emptyString
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
|
||||
@@ -120,6 +120,7 @@ Rectangle {
|
||||
|
||||
|
||||
Text {
|
||||
visible: !isMobile
|
||||
id: filterHeaderText
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
@@ -135,6 +136,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: selectedAmount
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
@@ -142,7 +144,6 @@ Rectangle {
|
||||
anchors.topMargin: 17
|
||||
text: getSelectedAmount()
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Total amount of selected payments</b>") + translationManager.emptyString
|
||||
}
|
||||
|
||||
|
||||
@@ -156,7 +157,6 @@ Rectangle {
|
||||
anchors.topMargin: 17
|
||||
text: qsTr("Address")
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
@@ -172,6 +172,7 @@ Rectangle {
|
||||
|
||||
// Filter by string
|
||||
LineEdit {
|
||||
visible: !isMobile
|
||||
id: searchLine
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
@@ -196,7 +197,6 @@ Rectangle {
|
||||
anchors.topMargin: 17
|
||||
text: qsTr("Description <font size='2'>(Local database)</font>") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip tekst test</b><br/><br/>test line 2") + translationManager.emptyString
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
@@ -213,6 +213,7 @@ Rectangle {
|
||||
|
||||
// DateFrom picker
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: dateFromText
|
||||
anchors.left: parent.left
|
||||
anchors.top: searchLine.bottom // descriptionLine.bottom
|
||||
@@ -221,10 +222,10 @@ Rectangle {
|
||||
width: 156
|
||||
text: qsTr("Date from") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
|
||||
}
|
||||
|
||||
DatePicker {
|
||||
visible: !isMobile
|
||||
id: fromDatePicker
|
||||
anchors.left: parent.left
|
||||
anchors.top: dateFromText.bottom
|
||||
@@ -239,6 +240,7 @@ Rectangle {
|
||||
|
||||
// DateTo picker
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: dateToText
|
||||
anchors.left: dateFromText.right
|
||||
anchors.top: searchLine.bottom //descriptionLine.bottom
|
||||
@@ -246,10 +248,10 @@ Rectangle {
|
||||
anchors.topMargin: 17
|
||||
text: qsTr("To") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
|
||||
}
|
||||
|
||||
DatePicker {
|
||||
visible: !isMobile
|
||||
id: toDatePicker
|
||||
anchors.left: fromDatePicker.right
|
||||
anchors.top: dateToText.bottom
|
||||
@@ -265,6 +267,7 @@ Rectangle {
|
||||
|
||||
|
||||
StandardButton {
|
||||
visible: !isMobile
|
||||
id: filterButton
|
||||
anchors.bottom: toDatePicker.bottom
|
||||
anchors.left: toDatePicker.right
|
||||
@@ -306,6 +309,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
visible: !isMobile
|
||||
id: advancedFilteringCheckBox
|
||||
text: qsTr("Advanced filtering") + translationManager.emptyString
|
||||
anchors.left: filterButton.right
|
||||
@@ -320,6 +324,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: transactionTypeText
|
||||
anchors.left: parent.left
|
||||
anchors.top: fromDatePicker.bottom
|
||||
@@ -328,7 +333,6 @@ Rectangle {
|
||||
width: 156
|
||||
text: qsTr("Type of transaction") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
|
||||
}
|
||||
|
||||
ListModel {
|
||||
@@ -340,6 +344,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
StandardDropdown {
|
||||
visible: !isMobile
|
||||
id: transactionTypeDropdown
|
||||
anchors.left: parent.left
|
||||
anchors.top: transactionTypeText.bottom
|
||||
@@ -355,6 +360,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: amountFromText
|
||||
anchors.left: transactionTypeText.right
|
||||
anchors.top: fromDatePicker.bottom
|
||||
@@ -363,10 +369,10 @@ Rectangle {
|
||||
width: 156
|
||||
text: qsTr("Amount from") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
visible: !isMobile
|
||||
id: amountFromLine
|
||||
anchors.left: transactionTypeDropdown.right
|
||||
anchors.top: amountFromText.bottom
|
||||
@@ -387,6 +393,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: amountToText
|
||||
anchors.left: amountFromText.right
|
||||
anchors.top: fromDatePicker.bottom
|
||||
@@ -395,10 +402,10 @@ Rectangle {
|
||||
width: 156
|
||||
text: qsTr("To") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
visible: !isMobile
|
||||
id: amountToLine
|
||||
anchors.left: amountFromLine.right
|
||||
anchors.top: amountToText.bottom
|
||||
@@ -420,6 +427,7 @@ Rectangle {
|
||||
}
|
||||
|
||||
Item {
|
||||
visible: !isMobile
|
||||
id: expandItem
|
||||
property bool expanded: false
|
||||
|
||||
@@ -449,16 +457,17 @@ Rectangle {
|
||||
|
||||
Rectangle {
|
||||
id: tableRect
|
||||
property int expandedHeight: parent.height - filterHeaderText.y - filterHeaderText.height - 17
|
||||
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: middleHeight
|
||||
height: (isMobile)? parent.height : middleHeight
|
||||
onHeightChanged: {
|
||||
if(height === middleHeight) z = 1
|
||||
else if(height === collapsedHeight) z = 0
|
||||
|
||||
@@ -37,22 +37,10 @@ Rectangle {
|
||||
color: "#F0EEEE"
|
||||
property var currentHashRate: 0
|
||||
|
||||
function isDaemonLocal() {
|
||||
var daemonAddress = appWindow.persistentSettings.daemon_address
|
||||
if (daemonAddress === "")
|
||||
return false
|
||||
var daemonHost = daemonAddress.split(":")[0]
|
||||
if (daemonHost === "127.0.0.1" || daemonHost === "localhost")
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
/* main layout */
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
anchors.margins: 40
|
||||
anchors.bottomMargin: 10
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
@@ -107,8 +95,6 @@ Rectangle {
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
// Disable this option until stable
|
||||
visible: false
|
||||
Layout.leftMargin: 125
|
||||
CheckBox {
|
||||
id: backgroundMining
|
||||
@@ -190,7 +176,6 @@ Rectangle {
|
||||
|
||||
Text {
|
||||
id: statusText
|
||||
anchors.topMargin: 17
|
||||
text: qsTr("Status: not mining")
|
||||
textFormat: Text.RichText
|
||||
wrapMode: Text.Wrap
|
||||
|
||||
@@ -168,8 +168,9 @@ Rectangle {
|
||||
/* main layout */
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
anchors.margins: 17
|
||||
anchors.margins: (isMobile)? 17 : 40
|
||||
anchors.topMargin: 40
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
@@ -181,9 +182,8 @@ Rectangle {
|
||||
property int qrCodeSize: 240
|
||||
|
||||
|
||||
RowLayout {
|
||||
ColumnLayout {
|
||||
id: addressRow
|
||||
|
||||
Label {
|
||||
id: addressLabel
|
||||
fontSize: 14
|
||||
@@ -204,6 +204,7 @@ Rectangle {
|
||||
imageSource: "../images/copyToClipboard.png"
|
||||
onClicked: {
|
||||
if (addressLine.text.length > 0) {
|
||||
console.log(addressLine.text + " copied to clipboard")
|
||||
clipboard.setText(addressLine.text)
|
||||
}
|
||||
}
|
||||
@@ -211,9 +212,11 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
GridLayout {
|
||||
id: paymentIdRow
|
||||
columns:2
|
||||
Label {
|
||||
Layout.columnSpan: 2
|
||||
id: paymentIdLabel
|
||||
fontSize: 14
|
||||
text: qsTr("Payment ID") + translationManager.emptyString
|
||||
@@ -264,8 +267,8 @@ Rectangle {
|
||||
onClicked: updatePaymentId("")
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
|
||||
ColumnLayout {
|
||||
id: integratedAddressRow
|
||||
Label {
|
||||
id: integratedAddressLabel
|
||||
@@ -298,7 +301,7 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
ColumnLayout {
|
||||
id: amountRow
|
||||
Label {
|
||||
id: amountLabel
|
||||
|
||||
@@ -40,6 +40,7 @@ import moneroComponents.Clipboard 1.0
|
||||
Rectangle {
|
||||
property var daemonAddress
|
||||
property bool viewOnly: false
|
||||
id: page
|
||||
|
||||
color: "#F0EEEE"
|
||||
|
||||
@@ -54,10 +55,9 @@ Rectangle {
|
||||
// try connecting to daemon
|
||||
}
|
||||
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
anchors.margins: 40
|
||||
anchors.margins: 17
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
@@ -81,7 +81,8 @@ Rectangle {
|
||||
color: "#DEDEDE"
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
GridLayout {
|
||||
columns: (isMobile)? 2 : 4
|
||||
StandardButton {
|
||||
id: closeWalletButton
|
||||
text: qsTr("Close wallet") + translationManager.emptyString
|
||||
@@ -116,11 +117,71 @@ Rectangle {
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Show seed") + translationManager.emptyString
|
||||
text: qsTr("Show seed & keys") + translationManager.emptyString
|
||||
onClicked: {
|
||||
settingsPasswordDialog.open();
|
||||
}
|
||||
}
|
||||
|
||||
/* Rescan cache - Disabled until we know it's needed
|
||||
|
||||
StandardButton {
|
||||
id: rescanWalletbutton
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Rescan wallet cache") + translationManager.emptyString
|
||||
onClicked: {
|
||||
// Show confirmation dialog
|
||||
confirmationDialog.title = qsTr("Rescan wallet cache") + translationManager.emptyString;
|
||||
confirmationDialog.text = qsTr("Are you sure you want to rebuild the wallet cache?\n"
|
||||
+ "The following information will be deleted\n"
|
||||
+ "- Recipient addresses\n"
|
||||
+ "- Tx keys\n"
|
||||
+ "- Tx descriptions\n\n"
|
||||
+ "The old wallet cache file will be renamed and can be restored later.\n"
|
||||
);
|
||||
confirmationDialog.icon = StandardIcon.Question
|
||||
confirmationDialog.cancelText = qsTr("Cancel")
|
||||
confirmationDialog.onAcceptedCallback = function() {
|
||||
walletManager.closeWallet();
|
||||
walletManager.clearWalletCache(persistentSettings.wallet_path);
|
||||
walletManager.openWalletAsync(persistentSettings.wallet_path, appWindow.password,
|
||||
persistentSettings.testnet);
|
||||
}
|
||||
|
||||
confirmationDialog.onRejectedCallback = null;
|
||||
|
||||
confirmationDialog.open()
|
||||
|
||||
}
|
||||
}
|
||||
*/
|
||||
StandardButton {
|
||||
id: rescanSpentButton
|
||||
text: qsTr("Rescan wallet balance") + translationManager.emptyString
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
onClicked: {
|
||||
if (!currentWallet.rescanSpent()) {
|
||||
console.error("Error: ", currentWallet.errorString);
|
||||
informationPopup.title = qsTr("Error") + translationManager.emptyString;
|
||||
informationPopup.text = qsTr("Error: ") + currentWallet.errorString
|
||||
informationPopup.icon = StandardIcon.Critical
|
||||
informationPopup.onCloseCallback = null
|
||||
informationPopup.open();
|
||||
} else {
|
||||
informationPopup.title = qsTr("Information") + translationManager.emptyString
|
||||
informationPopup.text = qsTr("Sucessfully rescanned spent outputs") + translationManager.emptyString
|
||||
informationPopup.icon = StandardIcon.Information
|
||||
informationPopup.onCloseCallback = null
|
||||
informationPopup.open();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//! Manage daemon
|
||||
@@ -141,10 +202,9 @@ Rectangle {
|
||||
color: "#DEDEDE"
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
GridLayout {
|
||||
id: daemonStatusRow
|
||||
Layout.fillWidth: true
|
||||
|
||||
columns: (isMobile) ? 2 : 4
|
||||
StandardButton {
|
||||
visible: true
|
||||
enabled: !appWindow.daemonRunning
|
||||
@@ -187,8 +247,35 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: blockchainFolderRow
|
||||
Label {
|
||||
id: blockchainFolderLabel
|
||||
color: "#4A4949"
|
||||
text: qsTr("Blockchain location") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
}
|
||||
LineEdit {
|
||||
id: blockchainFolder
|
||||
Layout.preferredWidth: 200
|
||||
Layout.fillWidth: true
|
||||
text: persistentSettings.blockchainDataDir
|
||||
placeholderText: qsTr("(optional)") + translationManager.emptyString
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
mouse.accepted = false
|
||||
if(persistentSettings.blockchainDataDir != "")
|
||||
blockchainFileDialog.folder = "file://" + persistentSettings.blockchainDataDir
|
||||
blockchainFileDialog.open()
|
||||
blockchainFolder.focus = true
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
@@ -209,22 +296,27 @@ Rectangle {
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: daemonAddrRow
|
||||
Layout.fillWidth: true
|
||||
spacing: 10
|
||||
|
||||
Label {
|
||||
id: daemonAddrLabel
|
||||
|
||||
Layout.fillWidth: true
|
||||
color: "#4A4949"
|
||||
text: qsTr("Daemon address") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
}
|
||||
}
|
||||
|
||||
GridLayout {
|
||||
id: daemonAddrRow
|
||||
Layout.fillWidth: true
|
||||
columnSpacing: 10
|
||||
columns: (isMobile) ? 2 : 3
|
||||
|
||||
LineEdit {
|
||||
id: daemonAddr
|
||||
Layout.preferredWidth: 200
|
||||
Layout.preferredWidth: 100
|
||||
Layout.fillWidth: true
|
||||
text: (daemonAddress !== undefined) ? daemonAddress[0] : ""
|
||||
placeholderText: qsTr("Hostname / IP") + translationManager.emptyString
|
||||
@@ -241,7 +333,8 @@ Rectangle {
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
|
||||
Layout.fillWidth: true
|
||||
spacing: 10
|
||||
Label {
|
||||
id: daemonLoginLabel
|
||||
Layout.fillWidth: true
|
||||
@@ -250,6 +343,10 @@ Rectangle {
|
||||
fontSize: 16
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
|
||||
LineEdit {
|
||||
id: daemonUsername
|
||||
Layout.preferredWidth: 100
|
||||
@@ -277,7 +374,6 @@ Rectangle {
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
visible: true
|
||||
onClicked: {
|
||||
console.log("saving daemon adress settings")
|
||||
var newDaemon = daemonAddr.text.trim() + ":" + daemonPort.text.trim()
|
||||
@@ -323,14 +419,22 @@ Rectangle {
|
||||
}
|
||||
|
||||
// Log level
|
||||
|
||||
RowLayout {
|
||||
Label {
|
||||
id: logLevelLabel
|
||||
color: "#4A4949"
|
||||
text: qsTr("Log level") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
anchors.topMargin: 30
|
||||
Layout.topMargin: 30
|
||||
}
|
||||
|
||||
}
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
height: 1
|
||||
color: "#DEDEDE"
|
||||
}
|
||||
ColumnLayout {
|
||||
ComboBox {
|
||||
id: logLevel
|
||||
model: [0,1,2,3,4,"custom"]
|
||||
@@ -369,7 +473,7 @@ Rectangle {
|
||||
RowLayout {
|
||||
Label {
|
||||
color: "#4A4949"
|
||||
text: qsTr("Version") + translationManager.emptyString
|
||||
text: qsTr("Debug info") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
anchors.topMargin: 30
|
||||
Layout.topMargin: 30
|
||||
@@ -381,19 +485,95 @@ Rectangle {
|
||||
color: "#DEDEDE"
|
||||
}
|
||||
|
||||
Label {
|
||||
id: guiVersion
|
||||
TextBlock {
|
||||
Layout.topMargin: 8
|
||||
color: "#4A4949"
|
||||
Layout.fillWidth: true
|
||||
text: qsTr("GUI version: ") + Version.GUI_VERSION + translationManager.emptyString
|
||||
fontSize: 16
|
||||
}
|
||||
|
||||
Label {
|
||||
TextBlock {
|
||||
id: guiMoneroVersion
|
||||
color: "#4A4949"
|
||||
Layout.fillWidth: true
|
||||
text: qsTr("Embedded Monero version: ") + Version.GUI_MONERO_VERSION + translationManager.emptyString
|
||||
fontSize: 16
|
||||
}
|
||||
TextBlock {
|
||||
id: restoreHeightText
|
||||
Layout.fillWidth: true
|
||||
textFormat: Text.RichText
|
||||
property var txt: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C}</style>" + qsTr("Wallet creation height: ") + currentWallet.walletCreationHeight + translationManager.emptyString
|
||||
property var linkTxt: qsTr(" <a href='#'>(Click to change)</a>") + translationManager.emptyString
|
||||
text: (typeof currentWallet == "undefined") ? "" : txt + linkTxt
|
||||
|
||||
onLinkActivated: {
|
||||
restoreHeightRow.visible = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: restoreHeightRow
|
||||
visible: false
|
||||
LineEdit {
|
||||
id: restoreHeight
|
||||
Layout.preferredWidth: 80
|
||||
Layout.fillWidth: true
|
||||
text: currentWallet.walletCreationHeight
|
||||
validator: IntValidator {
|
||||
bottom:0
|
||||
}
|
||||
}
|
||||
|
||||
StandardButton {
|
||||
id: restoreHeightSave
|
||||
Layout.fillWidth: false
|
||||
Layout.leftMargin: 30
|
||||
text: qsTr("Save") + translationManager.emptyString
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
|
||||
onClicked: {
|
||||
currentWallet.walletCreationHeight = restoreHeight.text
|
||||
// Restore height is saved in .keys file. Set password to trigger rewrite.
|
||||
currentWallet.setPassword(appWindow.password)
|
||||
restoreHeightRow.visible = false
|
||||
|
||||
// Show confirmation dialog
|
||||
confirmationDialog.title = qsTr("Rescan wallet cache") + translationManager.emptyString;
|
||||
confirmationDialog.text = qsTr("Are you sure you want to rebuild the wallet cache?\n"
|
||||
+ "The following information will be deleted\n"
|
||||
+ "- Recipient addresses\n"
|
||||
+ "- Tx keys\n"
|
||||
+ "- Tx descriptions\n\n"
|
||||
+ "The old wallet cache file will be renamed and can be restored later.\n"
|
||||
);
|
||||
confirmationDialog.icon = StandardIcon.Question
|
||||
confirmationDialog.cancelText = qsTr("Cancel")
|
||||
confirmationDialog.onAcceptedCallback = function() {
|
||||
walletManager.closeWallet();
|
||||
walletManager.clearWalletCache(persistentSettings.wallet_path);
|
||||
walletManager.openWalletAsync(persistentSettings.wallet_path, appWindow.password,
|
||||
persistentSettings.testnet);
|
||||
}
|
||||
|
||||
confirmationDialog.onRejectedCallback = null;
|
||||
|
||||
confirmationDialog.open()
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
TextBlock {
|
||||
Layout.fillWidth: true
|
||||
text: (typeof currentWallet == "undefined") ? "" : qsTr("Wallet log path: ") + currentWallet.walletLogPath + translationManager.emptyString
|
||||
}
|
||||
TextBlock {
|
||||
Layout.fillWidth: true
|
||||
text: (typeof currentWallet == "undefined") ? "" : qsTr("Daemon log path: ") + currentWallet.daemonLogPath + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
@@ -413,11 +593,22 @@ Rectangle {
|
||||
|
||||
onAccepted: {
|
||||
if(appWindow.password === settingsPasswordDialog.password){
|
||||
informationPopup.title = qsTr("Wallet mnemonic seed") + translationManager.emptyString;
|
||||
informationPopup.text = currentWallet.seed
|
||||
informationPopup.open()
|
||||
informationPopup.onCloseCallback = function() {
|
||||
informationPopup.text = ""
|
||||
if(currentWallet.seedLanguage == "") {
|
||||
console.log("No seed language set. Using English as default");
|
||||
currentWallet.setSeedLanguage("English");
|
||||
}
|
||||
|
||||
seedPopup.title = qsTr("Wallet seed & keys") + translationManager.emptyString;
|
||||
seedPopup.text = "<b>Wallet Mnemonic seed</b> <br>" + currentWallet.seed
|
||||
+ "<br><br> <b>" + qsTr("Secret view key") + ":</b> " + currentWallet.secretViewKey
|
||||
+ "<br><b>" + qsTr("Public view key") + ":</b> " + currentWallet.publicViewKey
|
||||
+ "<br><b>" + qsTr("Secret spend key") + ":</b> " + currentWallet.secretSpendKey
|
||||
+ "<br><b>" + qsTr("Public spend key") + ":</b> " + currentWallet.publicSpendKey
|
||||
seedPopup.open()
|
||||
seedPopup.width = 600
|
||||
seedPopup.height = 300
|
||||
seedPopup.onCloseCallback = function() {
|
||||
seedPopup.text = ""
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -437,17 +628,93 @@ Rectangle {
|
||||
|
||||
}
|
||||
|
||||
StandardDialog {
|
||||
id: seedPopup
|
||||
cancelVisible: false
|
||||
okVisible: true
|
||||
width:600
|
||||
height:400
|
||||
|
||||
property var onCloseCallback
|
||||
onAccepted: {
|
||||
if (onCloseCallback) {
|
||||
onCloseCallback()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Choose blockchain folder
|
||||
FileDialog {
|
||||
id: blockchainFileDialog
|
||||
title: qsTr("Please choose a folder") + translationManager.emptyString;
|
||||
selectFolder: true
|
||||
folder: "file://" + persistentSettings.blockchainDataDir
|
||||
|
||||
onAccepted: {
|
||||
var dataDir = walletManager.urlToLocalPath(blockchainFileDialog.fileUrl)
|
||||
var validator = daemonManager.validateDataDir(dataDir);
|
||||
if(!validator.valid) {
|
||||
|
||||
confirmationDialog.title = qsTr("Warning") + translationManager.emptyString;
|
||||
confirmationDialog.text = "";
|
||||
if(validator.readOnly) {
|
||||
confirmationDialog.text += qsTr("Error: Filesystem is read only") + "\n\n"
|
||||
}
|
||||
|
||||
if(validator.storageAvailable < 20) {
|
||||
confirmationDialog.text += qsTr("Warning: There's only %1 GB available on the device. Blockchain requires ~%2 GB of data.").arg(validator.storageAvailable).arg(15) + "\n\n"
|
||||
} else {
|
||||
confirmationDialog.text += qsTr("Note: There's %1 GB available on the device. Blockchain requires ~%2 GB of data.").arg(validator.storageAvailable).arg(15) + "\n\n"
|
||||
}
|
||||
|
||||
if(!validator.lmdbExists) {
|
||||
confirmationDialog.text += qsTr("Note: lmdb folder not found. A new folder will be created.") + "\n\n"
|
||||
}
|
||||
|
||||
|
||||
confirmationDialog.icon = StandardIcon.Question
|
||||
confirmationDialog.cancelText = qsTr("Cancel")
|
||||
|
||||
// Continue
|
||||
confirmationDialog.onAcceptedCallback = function() {
|
||||
persistentSettings.blockchainDataDir = dataDir
|
||||
}
|
||||
|
||||
// Cancel
|
||||
confirmationDialog.onRejectedCallback = function() {
|
||||
};
|
||||
|
||||
confirmationDialog.open()
|
||||
} else {
|
||||
persistentSettings.blockchainDataDir = dataDir
|
||||
}
|
||||
|
||||
delete validator;
|
||||
|
||||
|
||||
}
|
||||
onRejected: {
|
||||
console.log("data dir selection canceled")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// fires on every page load
|
||||
function onPageCompleted() {
|
||||
console.log("Settings page loaded");
|
||||
initSettings();
|
||||
viewOnly = currentWallet.viewOnly;
|
||||
appWindow.daemonRunning = daemonManager.running(persistentSettings.testnet)
|
||||
|
||||
if(typeof daemonManager != "undefined")
|
||||
appWindow.daemonRunning = daemonManager.running(persistentSettings.testnet)
|
||||
}
|
||||
|
||||
// fires only once
|
||||
Component.onCompleted: {
|
||||
daemonManager.daemonConsoleUpdated.connect(onDaemonConsoleUpdated)
|
||||
if(typeof daemonManager != "undefined")
|
||||
daemonManager.daemonConsoleUpdated.connect(onDaemonConsoleUpdated)
|
||||
|
||||
|
||||
}
|
||||
|
||||
function onDaemonConsoleUpdated(message){
|
||||
|
||||
@@ -40,7 +40,7 @@ Rectangle {
|
||||
id: mainLayout
|
||||
|
||||
property int labelWidth: 120
|
||||
property int editWidth: 400
|
||||
// property int editWidth: 400
|
||||
property int lineEditFontSize: 12
|
||||
|
||||
color: "#F0EEEE"
|
||||
@@ -92,7 +92,7 @@ Rectangle {
|
||||
|
||||
// sign / verify
|
||||
ColumnLayout {
|
||||
anchors.margins: 10
|
||||
anchors.margins: 17
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
@@ -100,21 +100,9 @@ Rectangle {
|
||||
|
||||
spacing: 20
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: signBox
|
||||
color: "#00000000"
|
||||
border.width: 2
|
||||
border.color: "#CCCCCC"
|
||||
anchors.margins: -15
|
||||
}
|
||||
|
||||
// sign
|
||||
ColumnLayout {
|
||||
id: signBox
|
||||
anchors.margins: 40
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
|
||||
RowLayout {
|
||||
ColumnLayout {
|
||||
@@ -122,6 +110,7 @@ Rectangle {
|
||||
Label {
|
||||
text: qsTr("Sign a message or file contents with your address:") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
Label {}
|
||||
}
|
||||
@@ -147,7 +136,7 @@ Rectangle {
|
||||
fontSize: mainLayout.lineEditFontSize
|
||||
placeholderText: qsTr("Message to sign") + translationManager.emptyString;
|
||||
readOnly: false
|
||||
Layout.fillWidth: true
|
||||
// Layout.fillWidth: true
|
||||
onTextChanged: signSignatureLine.text = ""
|
||||
|
||||
IconButton {
|
||||
@@ -254,21 +243,16 @@ Rectangle {
|
||||
|
||||
RowLayout {
|
||||
id: signSignatureRow
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.topMargin: 17
|
||||
|
||||
Label {
|
||||
id: signSignatureLabel
|
||||
fontSize: 14
|
||||
text: qsTr("Signature") + translationManager.emptyString
|
||||
width: mainLayout.labelWidth
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
id: signSignatureLine
|
||||
anchors.left: signSignatureLabel.right
|
||||
anchors.right: parent.right
|
||||
fontSize: mainLayout.lineEditFontSize
|
||||
placeholderText: qsTr("Signature") + translationManager.emptyString;
|
||||
readOnly: true
|
||||
@@ -286,21 +270,10 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: verifyBox
|
||||
color: "#00000000"
|
||||
border.width: 2
|
||||
border.color: "#CCCCCC"
|
||||
anchors.margins: -15
|
||||
}
|
||||
|
||||
// verify
|
||||
ColumnLayout {
|
||||
id: verifyBox
|
||||
anchors.margins: 40
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: signBox.bottom
|
||||
|
||||
RowLayout {
|
||||
ColumnLayout {
|
||||
@@ -308,6 +281,8 @@ Rectangle {
|
||||
Label {
|
||||
text: qsTr("Verify a message or file signature from an address:") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
// Layout.fillWidth: true
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
Label {}
|
||||
}
|
||||
@@ -444,6 +419,8 @@ Rectangle {
|
||||
text: qsTr("<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>\
|
||||
Signing address <font size='2'> ( Paste in or select from </font> <a href='#'>Address book</a><font size='2'> )</font>")
|
||||
+ translationManager.emptyString
|
||||
// Layout.fillWidth: true
|
||||
wrapMode: Text.Wrap
|
||||
|
||||
onLinkActivated: appWindow.showPageRequest("AddressBook")
|
||||
}
|
||||
@@ -460,21 +437,16 @@ Rectangle {
|
||||
|
||||
RowLayout {
|
||||
id: verifySignatureRow
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.topMargin: 17
|
||||
|
||||
Label {
|
||||
id: verifySignatureLabel
|
||||
fontSize: 14
|
||||
text: qsTr("Signature") + translationManager.emptyString
|
||||
width: mainLayout.labelWidth
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
id: verifySignatureLine
|
||||
anchors.left: verifySignatureLabel.right
|
||||
anchors.right: parent.right
|
||||
fontSize: mainLayout.lineEditFontSize
|
||||
placeholderText: qsTr("Signature") + translationManager.emptyString;
|
||||
Layout.fillWidth: true
|
||||
|
||||
@@ -45,7 +45,7 @@ Rectangle {
|
||||
property bool showAdvanced: false
|
||||
|
||||
function scaleValueToMixinCount(scaleValue) {
|
||||
var scaleToMixinCount = [4,5,6,7,8,9,10,11,12,13,14,15,20,25];
|
||||
var scaleToMixinCount = [4,5,6,7,8,9,10,11,12,14,16,18,21,25];
|
||||
if (scaleValue < scaleToMixinCount.length) {
|
||||
return scaleToMixinCount[scaleValue];
|
||||
} else {
|
||||
@@ -183,12 +183,16 @@ Rectangle {
|
||||
}
|
||||
|
||||
|
||||
// Note: workaround for translations in listElements
|
||||
// ListElement: cannot use script for property value, so
|
||||
// code like this wont work:
|
||||
// ListElement { column1: qsTr("LOW") + translationManager.emptyString ; column2: ""; priority: PendingTransaction.Priority_Low }
|
||||
// For translations to work, the strings need to be listed in
|
||||
// the file components/StandardDropdown.qml too.
|
||||
|
||||
// Priorities before v5
|
||||
ListModel {
|
||||
id: priorityModel
|
||||
// ListElement: cannot use script for property value, so
|
||||
// code like this wont work:
|
||||
// ListElement { column1: qsTr("LOW") + translationManager.emptyString ; column2: ""; priority: PendingTransaction.Priority_Low }
|
||||
|
||||
ListElement { column1: qsTr("Low (x1 fee)") ; column2: ""; priority: PendingTransaction.Priority_Low }
|
||||
ListElement { column1: qsTr("Medium (x20 fee)") ; column2: ""; priority: PendingTransaction.Priority_Medium }
|
||||
@@ -199,10 +203,10 @@ Rectangle {
|
||||
ListModel {
|
||||
id: priorityModelV5
|
||||
|
||||
ListElement { column1: qsTr("Low (x1 fee)") ; column2: ""; priority: 1}
|
||||
ListElement { column1: qsTr("Default (x4 fee)") ; column2: ""; priority: 2 }
|
||||
ListElement { column1: qsTr("Medium (x20 fee)") ; column2: ""; priority: 3 }
|
||||
ListElement { column1: qsTr("High (x166 fee)") ; column2: ""; priority: 4 }
|
||||
ListElement { column1: qsTr("Slow (x0.25 fee)") ; column2: ""; priority: 1}
|
||||
ListElement { column1: qsTr("Default (x1 fee)") ; column2: ""; priority: 2 }
|
||||
ListElement { column1: qsTr("Fast (x5 fee)") ; column2: ""; priority: 3 }
|
||||
ListElement { column1: qsTr("Fastest (x41.5 fee)") ; column2: ""; priority: 4 }
|
||||
|
||||
}
|
||||
|
||||
@@ -434,15 +438,6 @@ Rectangle {
|
||||
enabled: !viewOnly || pageRoot.enabled
|
||||
|
||||
RowLayout {
|
||||
// Label {
|
||||
// id: manageWalletLabel
|
||||
// Layout.fillWidth: true
|
||||
// color: "#4A4949"
|
||||
// text: qsTr("Advanced options") + translationManager.emptyString
|
||||
// fontSize: 16
|
||||
// Layout.topMargin: 20
|
||||
// }
|
||||
|
||||
CheckBox {
|
||||
id: showAdvancedCheckbox
|
||||
checked: persistentSettings.transferShowAdvanced
|
||||
@@ -463,7 +458,6 @@ Rectangle {
|
||||
Layout.bottomMargin: 30
|
||||
}
|
||||
|
||||
|
||||
RowLayout {
|
||||
visible: persistentSettings.transferShowAdvanced
|
||||
anchors.left: parent.left
|
||||
@@ -493,9 +487,13 @@ Rectangle {
|
||||
}
|
||||
|
||||
|
||||
RowLayout {
|
||||
GridLayout {
|
||||
visible: persistentSettings.transferShowAdvanced
|
||||
Layout.topMargin: 50
|
||||
|
||||
|
||||
columns: (isMobile) ? 2 : 6
|
||||
|
||||
StandardButton {
|
||||
id: sweepUnmixableButton
|
||||
text: qsTr("Sweep Unmixable") + translationManager.emptyString
|
||||
@@ -512,7 +510,7 @@ Rectangle {
|
||||
|
||||
StandardButton {
|
||||
id: saveTxButton
|
||||
text: qsTr("create tx file") + translationManager.emptyString
|
||||
text: qsTr("Create tx file") + translationManager.emptyString
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
@@ -560,32 +558,6 @@ Rectangle {
|
||||
submitTxDialog.open();
|
||||
}
|
||||
}
|
||||
|
||||
StandardButton {
|
||||
id: rescanSpentButton
|
||||
text: qsTr("Rescan spent") + translationManager.emptyString
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
enabled: pageRoot.enabled
|
||||
onClicked: {
|
||||
if (!currentWallet.rescanSpent()) {
|
||||
console.error("Error: ", currentWallet.errorString);
|
||||
informationPopup.title = qsTr("Error") + translationManager.emptyString;
|
||||
informationPopup.text = qsTr("Error: ") + currentWallet.errorString
|
||||
informationPopup.icon = StandardIcon.Critical
|
||||
informationPopup.onCloseCallback = null
|
||||
informationPopup.open();
|
||||
} else {
|
||||
informationPopup.title = qsTr("Information") + translationManager.emptyString
|
||||
informationPopup.text = qsTr("Sucessfully rescanned spent outputs") + translationManager.emptyString
|
||||
informationPopup.icon = StandardIcon.Information
|
||||
informationPopup.onCloseCallback = null
|
||||
informationPopup.open();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -714,15 +686,9 @@ Rectangle {
|
||||
}
|
||||
|
||||
function updatePriorityDropdown() {
|
||||
// Use new fee multipliers after v5 fork
|
||||
if (typeof currentWallet != "undefined" && currentWallet.useForkRules(5)) {
|
||||
priorityDropdown.dataModel = priorityModelV5;
|
||||
priorityDropdown.currentIndex = 1
|
||||
} else {
|
||||
priorityDropdown.dataModel = priorityModel;
|
||||
priorityDropdown.currentIndex = 0
|
||||
}
|
||||
|
||||
priorityDropdown.dataModel = priorityModelV5;
|
||||
priorityDropdown.currentIndex = 1
|
||||
priorityDropdown.update()
|
||||
}
|
||||
|
||||
//TODO: Add daemon sync status
|
||||
|
||||
@@ -89,18 +89,22 @@ Rectangle {
|
||||
Text {
|
||||
text: qsTr("Verify that a third party made a payment by supplying:") + translationManager.emptyString
|
||||
wrapMode: Text.Wrap
|
||||
Layout.fillWidth: true;
|
||||
}
|
||||
Text {
|
||||
text: qsTr(" - the recipient address") + translationManager.emptyString
|
||||
wrapMode: Text.Wrap
|
||||
Layout.fillWidth: true;
|
||||
}
|
||||
Text {
|
||||
text: qsTr(" - the transaction ID") + translationManager.emptyString
|
||||
wrapMode: Text.Wrap
|
||||
Layout.fillWidth: true;
|
||||
}
|
||||
Text {
|
||||
text: qsTr(" - the secret transaction key supplied by the sender") + translationManager.emptyString
|
||||
wrapMode: Text.Wrap
|
||||
Layout.fillWidth: true;
|
||||
}
|
||||
Text {
|
||||
text: qsTr("If a payment had several transactions then each must be checked and the results combined.") + translationManager.emptyString
|
||||
|
||||
9
qml.qrc
@@ -106,6 +106,7 @@
|
||||
<file>lang/flags/france.png</file>
|
||||
<file>lang/flags/german.png</file>
|
||||
<file>lang/flags/india.png</file>
|
||||
<file>lang/flags/indonesia.png</file>
|
||||
<file>lang/flags/italy.png</file>
|
||||
<file>lang/flags/japan.png</file>
|
||||
<file>lang/flags/netherlands.png</file>
|
||||
@@ -114,10 +115,13 @@
|
||||
<file>lang/flags/rpa.png</file>
|
||||
<file>lang/flags/russia.png</file>
|
||||
<file>lang/flags/spain.png</file>
|
||||
<file>lang/flags/sweden.png</file>
|
||||
<file>lang/flags/taiwan.png</file>
|
||||
<file>lang/flags/uk.png</file>
|
||||
<file>lang/flags/usa.png</file>
|
||||
<file>lang/flags/indonesia.png</file>
|
||||
<file>lang/flags/israel.png</file>
|
||||
<file>lang/flags/south_korea.png</file>
|
||||
<file>lang/flags/romania.png</file>
|
||||
<file>wizard/WizardManageWalletUI.qml</file>
|
||||
<file>wizard/WizardRecoveryWallet.qml</file>
|
||||
<file>wizard/WizardMemoTextInput.qml</file>
|
||||
@@ -125,7 +129,6 @@
|
||||
<file>pages/Receive.qml</file>
|
||||
<file>pages/TxKey.qml</file>
|
||||
<file>components/IconButton.qml</file>
|
||||
<file>lang/flags/italy.png</file>
|
||||
<file>components/PasswordDialog.qml</file>
|
||||
<file>components/ProcessingSplash.qml</file>
|
||||
<file>components/ProgressBar.qml</file>
|
||||
@@ -138,5 +141,7 @@
|
||||
<file>components/DaemonConsole.qml</file>
|
||||
<file>components/QRCodeScanner.qml</file>
|
||||
<file>components/Notifier.qml</file>
|
||||
<file>components/MobileHeader.qml</file>
|
||||
<file>components/TextBlock.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
#include <QApplication>
|
||||
#include <QProcess>
|
||||
#include <QTime>
|
||||
#include <QStorageInfo>
|
||||
#include <QVariantMap>
|
||||
#include <QVariant>
|
||||
#include <QMap>
|
||||
|
||||
namespace {
|
||||
static const int DAEMON_START_TIMEOUT_SECONDS = 30;
|
||||
@@ -28,7 +32,7 @@ DaemonManager *DaemonManager::instance(const QStringList *args)
|
||||
return m_instance;
|
||||
}
|
||||
|
||||
bool DaemonManager::start(const QString &flags, bool testnet)
|
||||
bool DaemonManager::start(const QString &flags, bool testnet, const QString &dataDir)
|
||||
{
|
||||
// prepare command line arguments and pass to monerod
|
||||
QStringList arguments;
|
||||
@@ -54,8 +58,19 @@ bool DaemonManager::start(const QString &flags, bool testnet)
|
||||
arguments << str;
|
||||
}
|
||||
|
||||
// Custom data-dir
|
||||
if(!dataDir.isEmpty()) {
|
||||
if(testnet)
|
||||
arguments << "--testnet-data-dir";
|
||||
else
|
||||
arguments << "--data-dir";
|
||||
arguments << dataDir;
|
||||
}
|
||||
|
||||
arguments << "--check-updates" << "disabled";
|
||||
|
||||
|
||||
|
||||
qDebug() << "starting monerod " + m_monerod;
|
||||
qDebug() << "With command line arguments " << arguments;
|
||||
|
||||
@@ -212,15 +227,17 @@ bool DaemonManager::sendCommand(const QString &cmd,bool testnet) const
|
||||
bool DaemonManager::sendCommand(const QString &cmd,bool testnet, QString &message) const
|
||||
{
|
||||
QProcess p;
|
||||
QString external_cmd = m_monerod + " " + cmd;
|
||||
qDebug() << "sending external cmd: " << external_cmd;
|
||||
QStringList external_cmd;
|
||||
external_cmd << cmd;
|
||||
|
||||
// Add testnet flag if needed
|
||||
if (testnet)
|
||||
external_cmd += " --testnet";
|
||||
external_cmd += "\n";
|
||||
external_cmd << "--testnet";
|
||||
|
||||
p.start(external_cmd);
|
||||
qDebug() << "sending external cmd: " << external_cmd;
|
||||
|
||||
|
||||
p.start(m_monerod, external_cmd);
|
||||
|
||||
bool started = p.waitForFinished(-1);
|
||||
message = p.readAllStandardOutput();
|
||||
@@ -234,6 +251,44 @@ void DaemonManager::exit()
|
||||
m_app_exit = true;
|
||||
}
|
||||
|
||||
QVariantMap DaemonManager::validateDataDir(const QString &dataDir) const
|
||||
{
|
||||
QVariantMap result;
|
||||
bool valid = true;
|
||||
bool readOnly = false;
|
||||
int storageAvailable = 0;
|
||||
bool lmdbExists = true;
|
||||
|
||||
QStorageInfo storage(dataDir);
|
||||
if (storage.isValid() && storage.isReady()) {
|
||||
if (storage.isReadOnly()) {
|
||||
readOnly = true;
|
||||
valid = false;
|
||||
}
|
||||
|
||||
// Make sure there is 20GB storage available
|
||||
storageAvailable = storage.bytesAvailable()/1000/1000/1000;
|
||||
if (storageAvailable < 20) {
|
||||
valid = false;
|
||||
}
|
||||
} else {
|
||||
valid = false;
|
||||
}
|
||||
|
||||
|
||||
if (!QDir(dataDir+"/lmdb").exists()) {
|
||||
lmdbExists = false;
|
||||
valid = false;
|
||||
}
|
||||
|
||||
result.insert("valid", valid);
|
||||
result.insert("lmdbExists", lmdbExists);
|
||||
result.insert("readOnly", readOnly);
|
||||
result.insert("storageAvailable", storageAvailable);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
DaemonManager::DaemonManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <QObject>
|
||||
#include <QUrl>
|
||||
#include <QProcess>
|
||||
#include <QVariantMap>
|
||||
|
||||
class DaemonManager : public QObject
|
||||
{
|
||||
@@ -13,7 +14,7 @@ public:
|
||||
|
||||
static DaemonManager * instance(const QStringList *args);
|
||||
|
||||
Q_INVOKABLE bool start(const QString &flags, bool testnet);
|
||||
Q_INVOKABLE bool start(const QString &flags, bool testnet, const QString &dataDir = "");
|
||||
Q_INVOKABLE bool stop(bool testnet);
|
||||
|
||||
// return true if daemon process is started
|
||||
@@ -21,6 +22,7 @@ public:
|
||||
// Send daemon command from qml and prints output in console window.
|
||||
Q_INVOKABLE bool sendCommand(const QString &cmd, bool testnet) const;
|
||||
Q_INVOKABLE void exit();
|
||||
Q_INVOKABLE QVariantMap validateDataDir(const QString &dataDir) const;
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -45,11 +45,12 @@ QList<TransactionInfo *> TransactionHistory::getAll() const
|
||||
if (ti->timestamp() <= firstDateTime) {
|
||||
firstDateTime = ti->timestamp();
|
||||
}
|
||||
quint64 requiredConfirmations = (ti->blockHeight() < ti->unlockTime()) ? ti->unlockTime() - ti->blockHeight() : 10;
|
||||
// store last tx height
|
||||
if (ti->confirmations() < 10 && ti->blockHeight() >= lastTxHeight ){
|
||||
if (ti->confirmations() < requiredConfirmations && ti->blockHeight() >= lastTxHeight) {
|
||||
lastTxHeight = ti->blockHeight();
|
||||
// TODO: Fetch block time and confirmations needed from wallet2?
|
||||
m_minutesToUnlock = (10 - ti->confirmations()) * 2;
|
||||
m_minutesToUnlock = (requiredConfirmations - ti->confirmations()) * 2;
|
||||
m_locked = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,11 @@ quint64 TransactionInfo::confirmations() const
|
||||
return m_pimpl->confirmations();
|
||||
}
|
||||
|
||||
quint64 TransactionInfo::unlockTime() const
|
||||
{
|
||||
return m_pimpl->unlockTime();
|
||||
}
|
||||
|
||||
QString TransactionInfo::hash() const
|
||||
{
|
||||
return QString::fromStdString(m_pimpl->hash());
|
||||
|
||||
@@ -19,6 +19,7 @@ class TransactionInfo : public QObject
|
||||
Q_PROPERTY(QString fee READ fee)
|
||||
Q_PROPERTY(quint64 blockHeight READ blockHeight)
|
||||
Q_PROPERTY(quint64 confirmations READ confirmations)
|
||||
Q_PROPERTY(quint64 unlockTime READ unlockTime)
|
||||
Q_PROPERTY(QString hash READ hash)
|
||||
Q_PROPERTY(QDateTime timestamp READ timestamp)
|
||||
Q_PROPERTY(QString date READ date)
|
||||
@@ -44,6 +45,7 @@ public:
|
||||
QString fee() const;
|
||||
quint64 blockHeight() const;
|
||||
quint64 confirmations() const;
|
||||
quint64 unlockTime() const;
|
||||
//! transaction_id
|
||||
QString hash() const;
|
||||
QDateTime timestamp() const;
|
||||
|
||||
@@ -207,6 +207,7 @@ void Wallet::initAsync(const QString &daemonAddress, quint64 upperTransactionLim
|
||||
QFuture<bool> future = watcher->future();
|
||||
watcher->deleteLater();
|
||||
if(future.result()){
|
||||
emit walletCreationHeightChanged();
|
||||
qDebug() << "init async finished - starting refresh";
|
||||
connected(true);
|
||||
m_walletImpl->startRefresh();
|
||||
@@ -599,6 +600,22 @@ bool Wallet::useForkRules(quint8 required_version, quint64 earlyBlocks) const
|
||||
}
|
||||
}
|
||||
|
||||
void Wallet::setWalletCreationHeight(quint64 height)
|
||||
{
|
||||
m_walletImpl->setRefreshFromBlockHeight(height);
|
||||
emit walletCreationHeightChanged();
|
||||
}
|
||||
|
||||
QString Wallet::getDaemonLogPath() const
|
||||
{
|
||||
return QString::fromStdString(m_walletImpl->getDefaultDataDir()) + "/bitmonero.log";
|
||||
}
|
||||
|
||||
QString Wallet::getWalletLogPath() const
|
||||
{
|
||||
return QCoreApplication::applicationDirPath() + "/monero-wallet-gui.log";
|
||||
}
|
||||
|
||||
Wallet::Wallet(Monero::Wallet *w, QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_walletImpl(w)
|
||||
|
||||
@@ -41,6 +41,13 @@ class Wallet : public QObject
|
||||
Q_PROPERTY(AddressBookModel * addressBookModel READ addressBookModel)
|
||||
Q_PROPERTY(AddressBook * addressBook READ addressBook)
|
||||
Q_PROPERTY(bool viewOnly READ viewOnly)
|
||||
Q_PROPERTY(QString secretViewKey READ getSecretViewKey)
|
||||
Q_PROPERTY(QString publicViewKey READ getPublicViewKey)
|
||||
Q_PROPERTY(QString secretSpendKey READ getSecretSpendKey)
|
||||
Q_PROPERTY(QString publicSpendKey READ getPublicSpendKey)
|
||||
Q_PROPERTY(QString daemonLogPath READ getDaemonLogPath CONSTANT)
|
||||
Q_PROPERTY(QString walletLogPath READ getWalletLogPath CONSTANT)
|
||||
Q_PROPERTY(quint64 walletCreationHeight READ getWalletCreationHeight WRITE setWalletCreationHeight NOTIFY walletCreationHeightChanged)
|
||||
|
||||
public:
|
||||
|
||||
@@ -231,6 +238,18 @@ public:
|
||||
// check if fork rules should be used
|
||||
Q_INVOKABLE bool useForkRules(quint8 version, quint64 earlyBlocks = 0) const;
|
||||
|
||||
//! Get wallet keys
|
||||
QString getSecretViewKey() const {return QString::fromStdString(m_walletImpl->secretViewKey());}
|
||||
QString getPublicViewKey() const {return QString::fromStdString(m_walletImpl->publicViewKey());}
|
||||
QString getSecretSpendKey() const {return QString::fromStdString(m_walletImpl->secretSpendKey());}
|
||||
QString getPublicSpendKey() const {return QString::fromStdString(m_walletImpl->publicSpendKey());}
|
||||
|
||||
quint64 getWalletCreationHeight() const {return m_walletImpl->getRefreshFromBlockHeight();}
|
||||
void setWalletCreationHeight(quint64 height);
|
||||
|
||||
QString getDaemonLogPath() const;
|
||||
QString getWalletLogPath() const;
|
||||
|
||||
// TODO: setListenter() when it implemented in API
|
||||
signals:
|
||||
// emitted on every event happened with wallet
|
||||
@@ -246,6 +265,7 @@ signals:
|
||||
void unconfirmedMoneyReceived(const QString &txId, quint64 amount);
|
||||
void newBlock(quint64 height, quint64 targetHeight);
|
||||
void historyModelChanged() const;
|
||||
void walletCreationHeightChanged();
|
||||
|
||||
// emitted when transaction is created async
|
||||
void transactionCreated(PendingTransaction * transaction, QString address, QString paymentId, quint32 mixinCount);
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
#include <QMutex>
|
||||
#include <QMutexLocker>
|
||||
#include <QString>
|
||||
|
||||
WalletManager * WalletManager::m_instance = nullptr;
|
||||
|
||||
@@ -330,14 +331,50 @@ bool WalletManager::saveQrCode(const QString &code, const QString &path) const
|
||||
return QRCodeImageProvider::genQrImage(code, &size).scaled(size.expandedTo(QSize(240, 240)), Qt::KeepAspectRatio).save(path, "PNG", 100);
|
||||
}
|
||||
|
||||
void WalletManager::checkUpdatesAsync(const QString &software, const QString &subdir) const
|
||||
{
|
||||
QFuture<QString> future = QtConcurrent::run(this, &WalletManager::checkUpdates,
|
||||
software, subdir);
|
||||
QFutureWatcher<QString> * watcher = new QFutureWatcher<QString>();
|
||||
connect(watcher, &QFutureWatcher<Wallet*>::finished,
|
||||
this, [this, watcher]() {
|
||||
QFuture<QString> future = watcher->future();
|
||||
watcher->deleteLater();
|
||||
qDebug() << "Checking for updates - done";
|
||||
emit checkUpdatesComplete(future.result());
|
||||
});
|
||||
watcher->setFuture(future);
|
||||
}
|
||||
|
||||
|
||||
|
||||
QString WalletManager::checkUpdates(const QString &software, const QString &subdir) const
|
||||
{
|
||||
qDebug() << "Checking for updates";
|
||||
const std::tuple<bool, std::string, std::string, std::string, std::string> result = Monero::WalletManager::checkUpdates(software.toStdString(), subdir.toStdString());
|
||||
if (!std::get<0>(result))
|
||||
return QString("");
|
||||
return QString::fromStdString(std::get<1>(result) + "|" + std::get<2>(result) + "|" + std::get<3>(result) + "|" + std::get<4>(result));
|
||||
}
|
||||
|
||||
bool WalletManager::clearWalletCache(const QString &wallet_path) const
|
||||
{
|
||||
|
||||
QString fileName = wallet_path;
|
||||
// Make sure wallet file is not .keys
|
||||
fileName.replace(".keys","");
|
||||
QFile walletCache(fileName);
|
||||
QString suffix = ".old_cache";
|
||||
QString newFileName = fileName + suffix;
|
||||
|
||||
// create unique file name
|
||||
for (int i = 1; QFile::exists(newFileName); i++) {
|
||||
newFileName = QString("%1%2.%3").arg(fileName).arg(suffix).arg(i);
|
||||
}
|
||||
|
||||
return walletCache.rename(newFileName);
|
||||
}
|
||||
|
||||
WalletManager::WalletManager(QObject *parent) : QObject(parent)
|
||||
{
|
||||
m_pimpl = Monero::WalletManagerFactory::getWalletManager();
|
||||
|
||||
@@ -134,12 +134,17 @@ public:
|
||||
Q_INVOKABLE QString resolveOpenAlias(const QString &address) const;
|
||||
Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error);
|
||||
Q_INVOKABLE bool saveQrCode(const QString &, const QString &) const;
|
||||
Q_INVOKABLE void checkUpdatesAsync(const QString &software, const QString &subdir) const;
|
||||
Q_INVOKABLE QString checkUpdates(const QString &software, const QString &subdir) const;
|
||||
|
||||
// clear/rename wallet cache
|
||||
Q_INVOKABLE bool clearWalletCache(const QString &fileName) const;
|
||||
|
||||
signals:
|
||||
|
||||
void walletOpened(Wallet * wallet);
|
||||
void walletClosed(const QString &walletAddress);
|
||||
void checkUpdatesComplete(const QString &result) const;
|
||||
|
||||
public slots:
|
||||
private:
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "TransactionInfo.h"
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
TransactionHistoryModel::TransactionHistoryModel(QObject *parent)
|
||||
@@ -85,6 +86,9 @@ QVariant TransactionHistoryModel::data(const QModelIndex &index, int role) const
|
||||
case TransactionConfirmationsRole:
|
||||
result = tInfo->confirmations();
|
||||
break;
|
||||
case TransactionConfirmationsRequiredRole:
|
||||
result = (tInfo->blockHeight() < tInfo->unlockTime()) ? tInfo->unlockTime() - tInfo->blockHeight() : 10;
|
||||
break;
|
||||
case TransactionHashRole:
|
||||
result = tInfo->hash();
|
||||
break;
|
||||
@@ -130,6 +134,7 @@ QHash<int, QByteArray> TransactionHistoryModel::roleNames() const
|
||||
roleNames.insert(TransactionFeeRole, "fee");
|
||||
roleNames.insert(TransactionBlockHeightRole, "blockHeight");
|
||||
roleNames.insert(TransactionConfirmationsRole, "confirmations");
|
||||
roleNames.insert(TransactionConfirmationsRequiredRole, "confirmationsRequired");
|
||||
roleNames.insert(TransactionHashRole, "hash");
|
||||
roleNames.insert(TransactionTimeStampRole, "timeStamp");
|
||||
roleNames.insert(TransactionPaymentIdRole, "paymentId");
|
||||
|
||||
@@ -26,6 +26,7 @@ public:
|
||||
TransactionFeeRole,
|
||||
TransactionBlockHeightRole,
|
||||
TransactionConfirmationsRole,
|
||||
TransactionConfirmationsRequiredRole,
|
||||
TransactionHashRole,
|
||||
TransactionTimeStampRole,
|
||||
TransactionPaymentIdRole,
|
||||
|
||||
@@ -1,839 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="en_US">
|
||||
<context>
|
||||
<name>AddressBook</name>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="47"/>
|
||||
<source>Add new entry</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="56"/>
|
||||
<location filename="../pages/AddressBook.qml" line="173"/>
|
||||
<source>Address</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="58"/>
|
||||
<source><b>Tip tekst test</b></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="77"/>
|
||||
<source>Payment ID <font size='2'>(Optional)</font></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="79"/>
|
||||
<source><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 thevtransfer</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="99"/>
|
||||
<source>Description <font size='2'>(Local database)</font></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="101"/>
|
||||
<source><b>Tip tekst test</b><br/><br/>test line 2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="126"/>
|
||||
<source>ADD</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="174"/>
|
||||
<source>Payment ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/AddressBook.qml" line="175"/>
|
||||
<source>Description</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AddressBookTable</name>
|
||||
<message>
|
||||
<location filename="../components/AddressBookTable.qml" line="47"/>
|
||||
<source>No more results</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/AddressBookTable.qml" line="106"/>
|
||||
<source>Payment ID:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>BasicPanel</name>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="78"/>
|
||||
<source>Locked Balance:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="92"/>
|
||||
<source>78.9239845</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="116"/>
|
||||
<source>Available Balance:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="130"/>
|
||||
<source>2324.9239845</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="155"/>
|
||||
<source>amount...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="163"/>
|
||||
<source>SEND</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="179"/>
|
||||
<source>destination...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="191"/>
|
||||
<source>Privacy level</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../BasicPanel.qml" line="212"/>
|
||||
<source>payment ID (optional)...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Dashboard</name>
|
||||
<message>
|
||||
<location filename="../pages/Dashboard.qml" line="57"/>
|
||||
<source>Quick transfer</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Dashboard.qml" line="89"/>
|
||||
<source>SEND</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Dashboard.qml" line="102"/>
|
||||
<source><style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style> lookng for security level and address book? go to <a href='#'>Transfer</a> tab</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DashboardTable</name>
|
||||
<message>
|
||||
<location filename="../components/DashboardTable.qml" line="47"/>
|
||||
<source>No more results</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/DashboardTable.qml" line="137"/>
|
||||
<source>Date</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/DashboardTable.qml" line="172"/>
|
||||
<source>Balance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/DashboardTable.qml" line="193"/>
|
||||
<source>Amount</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>History</name>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="47"/>
|
||||
<source>Filter trasactions history</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="56"/>
|
||||
<source>Address</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="58"/>
|
||||
<location filename="../pages/History.qml" line="123"/>
|
||||
<location filename="../pages/History.qml" line="143"/>
|
||||
<location filename="../pages/History.qml" line="191"/>
|
||||
<location filename="../pages/History.qml" line="225"/>
|
||||
<location filename="../pages/History.qml" line="246"/>
|
||||
<source><b>Tip tekst test</b></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="77"/>
|
||||
<source>Payment ID <font size='2'>(Optional)</font></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="79"/>
|
||||
<source><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 thevtransfer</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="99"/>
|
||||
<source>Description <font size='2'>(Local database)</font></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="101"/>
|
||||
<source><b>Tip tekst test</b><br/><br/>test line 2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="121"/>
|
||||
<source>Date from</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="141"/>
|
||||
<location filename="../pages/History.qml" line="244"/>
|
||||
<source>To</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="161"/>
|
||||
<source>FILTER</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="170"/>
|
||||
<source>Advance filtering</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="189"/>
|
||||
<source>Type of transation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/History.qml" line="223"/>
|
||||
<source>Amount from</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>HistoryTable</name>
|
||||
<message>
|
||||
<location filename="../components/HistoryTable.qml" line="47"/>
|
||||
<source>No more results</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/HistoryTable.qml" line="129"/>
|
||||
<source>Payment ID:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/HistoryTable.qml" line="167"/>
|
||||
<source>Date</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/HistoryTable.qml" line="202"/>
|
||||
<source>Balance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/HistoryTable.qml" line="223"/>
|
||||
<source>Amount</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>LeftPanel</name>
|
||||
<message>
|
||||
<location filename="../LeftPanel.qml" line="103"/>
|
||||
<source>Balance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../LeftPanel.qml" line="106"/>
|
||||
<source>Test tip 1<br/><br/>line 2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../LeftPanel.qml" line="138"/>
|
||||
<source>Unlocked balance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../LeftPanel.qml" line="141"/>
|
||||
<source>Test tip 2<br/><br/>line 2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../LeftPanel.qml" line="222"/>
|
||||
<source>Transfer</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../LeftPanel.qml" line="223"/>
|
||||
<source>T</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../LeftPanel.qml" line="245"/>
|
||||
<source>Receive</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../LeftPanel.qml" line="246"/>
|
||||
<source>R</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>NetworkStatusItem</name>
|
||||
<message>
|
||||
<location filename="../components/NetworkStatusItem.qml" line="58"/>
|
||||
<source>Network status</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/NetworkStatusItem.qml" line="66"/>
|
||||
<source>Connected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/NetworkStatusItem.qml" line="66"/>
|
||||
<source>Disconnected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PrivacyLevelSmall</name>
|
||||
<message>
|
||||
<location filename="../components/PrivacyLevelSmall.qml" line="102"/>
|
||||
<source>LOW</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/PrivacyLevelSmall.qml" line="113"/>
|
||||
<source>MEDIUM</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/PrivacyLevelSmall.qml" line="124"/>
|
||||
<source>HIGH</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Receive</name>
|
||||
<message>
|
||||
<location filename="../pages/Receive.qml" line="79"/>
|
||||
<source>Address</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Receive.qml" line="86"/>
|
||||
<source>ReadOnly wallet address displayed here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Receive.qml" line="106"/>
|
||||
<source>Integrated address</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Receive.qml" line="115"/>
|
||||
<source>ReadOnly wallet integrated address displayed here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Receive.qml" line="136"/>
|
||||
<source>Payment ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Receive.qml" line="144"/>
|
||||
<source>PaymentID here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Receive.qml" line="168"/>
|
||||
<source>Generate</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RightPanel</name>
|
||||
<message>
|
||||
<location filename="../RightPanel.qml" line="58"/>
|
||||
<source>Twitter</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../RightPanel.qml" line="59"/>
|
||||
<source>News</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../RightPanel.qml" line="60"/>
|
||||
<source>Help</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../RightPanel.qml" line="61"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SearchInput</name>
|
||||
<message>
|
||||
<location filename="../components/SearchInput.qml" line="69"/>
|
||||
<source>Search by...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/SearchInput.qml" line="230"/>
|
||||
<source>SEARCH</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TickDelegate</name>
|
||||
<message>
|
||||
<location filename="../components/TickDelegate.qml" line="55"/>
|
||||
<source>LOW</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/TickDelegate.qml" line="56"/>
|
||||
<source>MEDIUM</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../components/TickDelegate.qml" line="57"/>
|
||||
<source>HIGH</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TitleBar</name>
|
||||
<message>
|
||||
<location filename="../components/TitleBar.qml" line="38"/>
|
||||
<source>Monero - Donations</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Transfer</name>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="57"/>
|
||||
<source>Amount</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="67"/>
|
||||
<source>Transaction priority</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="89"/>
|
||||
<source>Amount...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="96"/>
|
||||
<source>LOW</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="97"/>
|
||||
<source>MEDIUM</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="98"/>
|
||||
<source>HIGH</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="127"/>
|
||||
<source>Privacy Level</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="153"/>
|
||||
<source>Cost</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="167"/>
|
||||
<source><style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style> Address <font size='2'> ( Type in or select from </font> <a href='#'>Address</a><font size='2'> book )</font></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="194"/>
|
||||
<source>Payment ID <font size='2'>( Optional )</font></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="218"/>
|
||||
<source>Description <font size='2'>( An optional description that will be saved to the local address book if entered )</font></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../pages/Transfer.qml" line="239"/>
|
||||
<source>SEND</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardConfigure</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardConfigure.qml" line="79"/>
|
||||
<source>We’re almost there - let’s just configure some Monero preferences</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardConfigure.qml" line="97"/>
|
||||
<source>Kickstart the Monero blockchain?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardConfigure.qml" line="115"/>
|
||||
<source>It is very important to write it down as this is the only backup you will need for your wallet. You will be asked to confirm the seed in the next screen to ensure it has copied down correctly.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardConfigure.qml" line="127"/>
|
||||
<source>Enable disk conservation mode?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardConfigure.qml" line="145"/>
|
||||
<source>Disk conservation mode uses substantially less disk-space, but the same amount of bandwidth as a regular Monero instance. However, storing the full blockchain is beneficial to the security of the Monero network. If you are on a device with limited disk space, then this option is appropriate for you.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardConfigure.qml" line="158"/>
|
||||
<source>Allow background mining?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardConfigure.qml" line="176"/>
|
||||
<source>Mining secures the Monero network, and also pays a small reward for the work done. This option will let Monero mine when your computer is on mains power and is idle. It will stop mining when you continue working.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardCreateWallet</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardCreateWallet.qml" line="90"/>
|
||||
<source>A new wallet has been created for you</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardCreateWallet.qml" line="91"/>
|
||||
<source>This is the 25 word mnemonic for your wallet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardDonation</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardDonation.qml" line="93"/>
|
||||
<source>Monero development is solely supported by donations</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardDonation.qml" line="113"/>
|
||||
<source>Enable auto-donations of?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardDonation.qml" line="153"/>
|
||||
<source>% of my fee added to each transaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardDonation.qml" line="164"/>
|
||||
<source>For every transaction, a small transaction fee is charged. This option lets you add an additional amount, as a percentage of that fee, to your transaction to support Monero development. For instance, a 50% autodonation take a transaction fee of 0.005 XMR and add a 0.0025 XMR to support Monero development.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardDonation.qml" line="176"/>
|
||||
<source>Allow background mining?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardDonation.qml" line="194"/>
|
||||
<source>Mining secures the Monero network, and also pays a small reward for the work done. This option will let Monero mine when your computer is on mains power and is idle. It will stop mining when you continue working.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardFinish</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="41"/>
|
||||
<source><b>Language:</b> </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="42"/>
|
||||
<source><b>Account name:</b> </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="43"/>
|
||||
<source><b>Words:</b> </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="44"/>
|
||||
<source><b>Wallet Path: </b></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="45"/>
|
||||
<source><b>Enable auto donation: </b></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="46"/>
|
||||
<source><b>Auto donation amount: </b></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="47"/>
|
||||
<source><b>Allow background mining: </b></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="52"/>
|
||||
<source>An overview of your Monero configuration is below:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardFinish.qml" line="107"/>
|
||||
<source>You’re all setup!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardMain</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardMain.qml" line="308"/>
|
||||
<source>USE MONERO</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardManageWalletUI</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardManageWalletUI.qml" line="103"/>
|
||||
<source>This is the name of your wallet. You can change it to a different name if you’d like:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardManageWalletUI.qml" line="125"/>
|
||||
<source>My account name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardManageWalletUI.qml" line="175"/>
|
||||
<source>Your wallet is stored in</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardManageWalletUI.qml" line="187"/>
|
||||
<source>Please choose a directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardMemoTextInput</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardMemoTextInput.qml" line="76"/>
|
||||
<source>It is very important to write it down as this is the only backup you will need for your wallet. You will be asked to confirm the seed in the next screen to ensure it has copied down correctly.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardOptions</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardOptions.qml" line="62"/>
|
||||
<source>Welcome to Monero!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardOptions.qml" line="74"/>
|
||||
<source>Please select one of the following options:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardOptions.qml" line="110"/>
|
||||
<source>This is my first time, I want to<br/>create a new account</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardOptions.qml" line="141"/>
|
||||
<source>I want to recover my account<br/>from my 24 work seed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardPassword</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardPassword.qml" line="51"/>
|
||||
<source>Now that your wallet has been created, please set a password for the wallet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardPassword.qml" line="53"/>
|
||||
<source>Now that your wallet has been restored, please set a password for the wallet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardPassword.qml" line="135"/>
|
||||
<source>Note that this password cannot be recovered, and if forgotten you will need to restore your wallet from the mnemonic seed you were just given<br/><br/>
|
||||
Your password will be used to protect your wallet and to confirm actions, so make sure that your password is sufficiently secure.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardRecoveryWallet</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardRecoveryWallet.qml" line="78"/>
|
||||
<source>My account name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardRecoveryWallet.qml" line="79"/>
|
||||
<source>We're ready to recover your account</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardRecoveryWallet.qml" line="80"/>
|
||||
<source>Please enter your 25 word private key</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>WizardWelcome</name>
|
||||
<message>
|
||||
<location filename="../wizard/WizardWelcome.qml" line="69"/>
|
||||
<source>Welcome</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../wizard/WizardWelcome.qml" line="82"/>
|
||||
<source>Please choose a language and regional format.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>main</name>
|
||||
<message>
|
||||
<location filename="../main.qml" line="148"/>
|
||||
<location filename="../main.qml" line="203"/>
|
||||
<location filename="../main.qml" line="233"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="149"/>
|
||||
<source>Couldn't open wallet: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="204"/>
|
||||
<source>Can't create transaction: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="216"/>
|
||||
<source>Confirmation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="217"/>
|
||||
<source>Please confirm transaction:
|
||||
|
||||
</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="218"/>
|
||||
<source>
|
||||
Address: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="219"/>
|
||||
<source>
|
||||
Payment ID: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="220"/>
|
||||
<source>
|
||||
Amount: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="221"/>
|
||||
<source>
|
||||
Fee: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="234"/>
|
||||
<source>Couldn't send the money: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="237"/>
|
||||
<source>Information</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="238"/>
|
||||
<source>Money sent successfully</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="310"/>
|
||||
<source>Initializing Wallet...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="336"/>
|
||||
<source>Program setup wizard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="350"/>
|
||||
<source>Monero - Donations</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.qml" line="389"/>
|
||||
<source>send to the same destination</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
2175
translations/monero-core_he.ts
Normal file
2146
translations/monero-core_ko.ts
Normal file
2166
translations/monero-core_ro.ts
Normal file
2174
translations/monero-core_sv.ts
Normal file
6
utils.sh
@@ -53,6 +53,12 @@ function get_tag()
|
||||
echo "You are ahead of or behind a tagged release"
|
||||
VERSIONTAG="$COMMIT"
|
||||
fi
|
||||
# save tag name + commit if availible
|
||||
TAGNAME=$(git describe | sed -e 's/[\t ]*//')
|
||||
if test -z "$TAGNAME"
|
||||
then
|
||||
TAGNAME="$VERSIONTAG"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -17,13 +17,13 @@ fi
|
||||
|
||||
if [[ "$BUILD_TYPE" == "Release" ]]; then
|
||||
echo "Release build"
|
||||
ICU_FILES="libicuuc57.dll libicuin57.dll libicudt57.dll"
|
||||
ICU_FILES=(libicuuc57.dll libicuin57.dll libicudt57.dll)
|
||||
else
|
||||
echo "Debug build"
|
||||
ICU_FILES="libicuucd57.dll libicuind57.dll libicudtd57.dll"
|
||||
ICU_FILES=(libicuucd57.dll libicuind57.dll libicudtd57.dll)
|
||||
fi
|
||||
|
||||
FILES="zlib1.dll libwinpthread-1.dll libtiff-5.dll libstdc++-6.dll libpng16-16.dll libpcre16-0.dll libpcre-1.dll libmng-2.dll liblzma-5.dll liblcms2-2.dll libjpeg-8.dll libjasper-1.dll libintl-8.dll libiconv-2.dll libharfbuzz-0.dll libgraphite2.dll libglib-2.0-0.dll libfreetype-6.dll libbz2-1.dll"
|
||||
FILES=(zlib1.dll libwinpthread-1.dll libtiff-5.dll libstdc++-6.dll libpng16-16.dll libpcre16-0.dll libpcre-1.dll libmng-2.dll liblzma-5.dll liblcms2-2.dll libjpeg-8.dll libintl-8.dll libiconv-2.dll libharfbuzz-0.dll libgraphite2.dll libglib-2.0-0.dll libfreetype-6.dll libbz2-1.dll)
|
||||
|
||||
platform=$(get_platform)
|
||||
|
||||
@@ -33,10 +33,9 @@ elif [[ "$platform" == "mingw32" ]]; then
|
||||
PLATFORM_FILES="libgcc_s_dw2-1.dll"
|
||||
fi
|
||||
|
||||
for f in $FILES; do cp $MSYSTEM_PREFIX/bin/$f $TARGET; done
|
||||
for f in "${FILES[@]}"; do cp $MSYSTEM_PREFIX/bin/$f $TARGET || exit 1; done
|
||||
|
||||
for f in $ICU_FILES; do cp $MSYSTEM_PREFIX/bin/$f $TARGET; done
|
||||
|
||||
for f in $PLATFORM_FILES; do cp $MSYSTEM_PREFIX/bin/$f $TARGET; done
|
||||
for f in "${ICU_FILES[@]}"; do cp $MSYSTEM_PREFIX/bin/$f $TARGET || exit 1; done
|
||||
|
||||
for f in "${PLATFORM_FILES[@]}"; do cp $MSYSTEM_PREFIX/bin/$f $TARGET || exit 1; done
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@ ColumnLayout {
|
||||
settingsObject['account_name'] = uiItem.accountNameText
|
||||
settingsObject['words'] = uiItem.wordsTexttext
|
||||
settingsObject['wallet_path'] = uiItem.walletPath
|
||||
console.log("path " +uiItem.walletPath);
|
||||
var walletFullPath = wizard.createWalletPath(uiItem.walletPath,uiItem.accountNameText);
|
||||
return wizard.walletPathValid(walletFullPath);
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ ColumnLayout {
|
||||
autoDonationAmount = wizard.settings["auto_donations_amount"] + " %",
|
||||
backgroundMiningEnabled = wizard.settings["allow_background_mining"] === true,
|
||||
backgroundMiningText = backgroundMiningEnabled ? qsTr("Enabled") : qsTr("Disabled"),
|
||||
testnetEnabled = wizard.settings['testnet'] === true,
|
||||
testnetEnabled = appWindow.persistentSettings.testnet,
|
||||
testnetText = testnetEnabled ? qsTr("Enabled") : qsTr("Disabled"),
|
||||
restoreHeightEnabled = wizard.settings['restore_height'] !== undefined;
|
||||
|
||||
@@ -64,7 +64,7 @@ ColumnLayout {
|
||||
// ? trStart + qsTr("Donation amount") + trMiddle + autoDonationAmount + trEnd
|
||||
// : "")
|
||||
// + trStart + qsTr("Background mining") + trMiddle + backgroundMiningText + trEnd
|
||||
+ trStart + qsTr("Daemon address") + trMiddle + wizard.settings["daemon_address"] + trEnd
|
||||
+ trStart + qsTr("Daemon address") + trMiddle + persistentSettings.daemon_address + trEnd
|
||||
+ trStart + qsTr("Testnet") + trMiddle + testnetText + trEnd
|
||||
+ (restoreHeightEnabled
|
||||
? trStart + qsTr("Restore height") + trMiddle + wizard.settings['restore_height'] + trEnd
|
||||
|
||||
@@ -115,6 +115,7 @@ ColumnLayout {
|
||||
|
||||
|
||||
function openCreateWalletPage() {
|
||||
wizardRestarted();
|
||||
print ("show create wallet page");
|
||||
currentPath = "create_wallet"
|
||||
pages = paths[currentPath]
|
||||
@@ -125,6 +126,7 @@ ColumnLayout {
|
||||
}
|
||||
|
||||
function openRecoveryWalletPage() {
|
||||
wizardRestarted();
|
||||
print ("show recovery wallet page");
|
||||
currentPath = "recovery_wallet"
|
||||
pages = paths[currentPath]
|
||||
@@ -160,10 +162,16 @@ ColumnLayout {
|
||||
folder_path = folder_path.substring(0,folder_path.length -1)
|
||||
}
|
||||
|
||||
// Store releative path on ios.
|
||||
if(isIOS)
|
||||
folder_path = "";
|
||||
|
||||
return folder_path + "/" + account_name + "/" + account_name
|
||||
}
|
||||
|
||||
function walletPathValid(path){
|
||||
if(isIOS)
|
||||
path = moneroAccountsDir + path;
|
||||
if (walletManager.walletExists(path)) {
|
||||
walletErrorDialog.text = qsTr("A wallet with same name already exists. Please change wallet name") + translationManager.emptyString;
|
||||
walletErrorDialog.open();
|
||||
@@ -193,8 +201,16 @@ ColumnLayout {
|
||||
function applySettings() {
|
||||
// Save wallet files in user specified location
|
||||
var new_wallet_filename = createWalletPath(settings.wallet_path,settings.account_name)
|
||||
console.log("saving in wizard: "+ new_wallet_filename)
|
||||
settings.wallet.store(new_wallet_filename);
|
||||
if(isIOS) {
|
||||
console.log("saving in ios: "+ moneroAccountsDir + new_wallet_filename)
|
||||
settings.wallet.store(moneroAccountsDir + new_wallet_filename);
|
||||
} else {
|
||||
console.log("saving in wizard: "+ new_wallet_filename)
|
||||
settings.wallet.store(new_wallet_filename);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// make sure temporary wallet files are deleted
|
||||
console.log("Removing temporary wallet: "+ settings.tmp_wallet_filename)
|
||||
@@ -217,11 +233,8 @@ ColumnLayout {
|
||||
appWindow.persistentSettings.allow_background_mining = false //settings.allow_background_mining
|
||||
appWindow.persistentSettings.auto_donations_enabled = false //settings.auto_donations_enabled
|
||||
appWindow.persistentSettings.auto_donations_amount = false //settings.auto_donations_amount
|
||||
appWindow.persistentSettings.daemon_address = settings.daemon_address
|
||||
appWindow.persistentSettings.testnet = settings.testnet
|
||||
appWindow.persistentSettings.restore_height = (isNaN(settings.restore_height))? 0 : settings.restore_height
|
||||
appWindow.persistentSettings.is_recovering = (settings.is_recovering === undefined)? false : settings.is_recovering
|
||||
|
||||
}
|
||||
|
||||
// reading settings from persistent storage
|
||||
|
||||
@@ -56,10 +56,10 @@ ColumnLayout {
|
||||
property int rowSpacing: 10
|
||||
|
||||
function checkFields(){
|
||||
var addressOK = walletManager.addressValid(addressLine.text, wizard.settings.testnet)
|
||||
var viewKeyOK = walletManager.keyValid(viewKeyLine.text, addressLine.text, true, wizard.settings.testnet)
|
||||
var addressOK = walletManager.addressValid(addressLine.text, persistentSettings.testnet)
|
||||
var viewKeyOK = walletManager.keyValid(viewKeyLine.text, addressLine.text, true, persistentSettings.testnet)
|
||||
// Spendkey is optional
|
||||
var spendKeyOK = (spendKeyLine.text.length > 0)? walletManager.keyValid(spendKeyLine.text, addressLine.text, false, wizard.settings.testnet) : true
|
||||
var spendKeyOK = (spendKeyLine.text.length > 0)? walletManager.keyValid(spendKeyLine.text, addressLine.text, false, persistentSettings.testnet) : true
|
||||
|
||||
addressLine.error = !addressOK && addressLine.text.length != 0
|
||||
viewKeyLine.error = !viewKeyOK && viewKeyLine.text.length != 0
|
||||
@@ -242,8 +242,7 @@ ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
fontSize: 14
|
||||
text: qsTr("Your wallet is stored in") + translationManager.emptyString
|
||||
+ translationManager.emptyString
|
||||
text: qsTr("Your wallet is stored in") + ": " + fileUrlInput.text;
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
|
||||
@@ -44,25 +44,12 @@ ColumnLayout {
|
||||
function onPageClosed() {
|
||||
// Save settings used in open from file.
|
||||
// other wizard settings are saved on last page in applySettings()
|
||||
appWindow.persistentSettings.testnet = wizard.settings["testnet"]
|
||||
appWindow.persistentSettings.daemon_address = wizard.settings["daemon_address"]
|
||||
appWindow.persistentSettings.language = wizard.settings.language
|
||||
appWindow.persistentSettings.locale = wizard.settings.locale
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function saveDaemonAddress() {
|
||||
wizard.settings["daemon_address"] = daemonAddress.text
|
||||
wizard.settings["testnet"] = testNet.checked
|
||||
}
|
||||
|
||||
QtObject {
|
||||
id: d
|
||||
readonly property string daemonAddressTestnet : "localhost:38081"
|
||||
readonly property string daemonAddressMainnet : "localhost:18081"
|
||||
}
|
||||
|
||||
Behavior on opacity {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
@@ -139,7 +126,6 @@ ColumnLayout {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
page.saveDaemonAddress()
|
||||
page.createWalletClicked()
|
||||
}
|
||||
}
|
||||
@@ -182,7 +168,6 @@ ColumnLayout {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
page.saveDaemonAddress()
|
||||
page.recoveryWalletClicked()
|
||||
}
|
||||
}
|
||||
@@ -226,7 +211,6 @@ ColumnLayout {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
page.saveDaemonAddress()
|
||||
page.openWalletClicked()
|
||||
}
|
||||
}
|
||||
@@ -247,62 +231,30 @@ ColumnLayout {
|
||||
|
||||
}
|
||||
|
||||
// daemon select
|
||||
// TODO: Move to separate page
|
||||
|
||||
ColumnLayout {
|
||||
RowLayout {
|
||||
Layout.leftMargin: wizardLeftMargin
|
||||
Layout.rightMargin: wizardRightMargin
|
||||
Layout.topMargin: 30
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.fillWidth: true
|
||||
|
||||
|
||||
Label {
|
||||
Layout.topMargin: 20
|
||||
fontSize: 14
|
||||
text: qsTr("Custom daemon address (optional)") + translationManager.emptyString
|
||||
+ translationManager.emptyString
|
||||
}
|
||||
|
||||
GridLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
columnSpacing: 20
|
||||
rowSpacing: 20
|
||||
flow: isMobile ? GridLayout.TopToBottom : GridLayout.LeftToRight
|
||||
|
||||
RowLayout {
|
||||
spacing: 20
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
|
||||
LineEdit {
|
||||
id: daemonAddress
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
width: 200
|
||||
fontSize: 14
|
||||
text: {
|
||||
if(appWindow.persistentSettings.daemon_address)
|
||||
return appWindow.persistentSettings.daemon_address;
|
||||
return testNet.checked ? d.daemonAddressTestnet : d.daemonAddressMainnet
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CheckBox {
|
||||
id: testNet
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
text: qsTr("Testnet") + translationManager.emptyString
|
||||
background: "#FFFFFF"
|
||||
fontColor: "#4A4646"
|
||||
fontSize: 16
|
||||
checkedIcon: "../images/checkedVioletIcon.png"
|
||||
uncheckedIcon: "../images/uncheckedIcon.png"
|
||||
checked: appWindow.persistentSettings.testnet;
|
||||
Rectangle {
|
||||
width: 100
|
||||
CheckBox {
|
||||
id: testNet
|
||||
text: qsTr("Testnet") + translationManager.emptyString
|
||||
background: "#FFFFFF"
|
||||
fontColor: "#4A4646"
|
||||
fontSize: 16
|
||||
checkedIcon: "../images/checkedVioletIcon.png"
|
||||
uncheckedIcon: "../images/uncheckedIcon.png"
|
||||
checked: appWindow.persistentSettings.testnet;
|
||||
onClicked: {
|
||||
persistentSettings.testnet = testNet.checked
|
||||
console.log("testnet set to ", persistentSettings.testnet)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||