forked from Public/monero-gui
Compare commits
169 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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
2
.gitmodules
vendored
@@ -1,4 +1,4 @@
|
||||
[submodule "monero"]
|
||||
path = monero
|
||||
url = https://github.com/monero-project/monero
|
||||
ignore = dirty
|
||||
ignore = all
|
||||
|
||||
2
LICENSE
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
|
||||
@@ -463,6 +478,8 @@ Rectangle {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
NetworkStatusItem {
|
||||
id: networkStatus
|
||||
anchors.left: parent.left
|
||||
@@ -478,6 +495,9 @@ Rectangle {
|
||||
anchors.bottom: parent.bottom
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// indicate disabled state
|
||||
// Desaturate {
|
||||
// anchors.fill: parent
|
||||
|
||||
173
MiddlePanel.qml
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 {
|
||||
|
||||
89
README.md
89
README.md
@@ -64,26 +64,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 +92,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 +146,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 +168,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 +183,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 +219,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 +233,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.
|
||||
|
||||
147
VULNERABILITY_RESPONSE_PROCESS.md
Normal file
147
VULNERABILITY_RESPONSE_PROCESS.md
Normal file
@@ -0,0 +1,147 @@
|
||||
# Monero GUI Vulnerability Response Process
|
||||
|
||||
## Preamble
|
||||
|
||||
Researchers/Hackers: while you research/hack, we ask that you please refrain from committing the following:
|
||||
- Denial of Service / Active exploiting against the network
|
||||
- Social Engineering of Monero staff or contractors
|
||||
- Any physical or electronic attacks against Monero community property and/or data centers
|
||||
|
||||
## I. Points of Contact for Security Issues
|
||||
|
||||
```
|
||||
ric@getmonero.org
|
||||
BDA6 BD70 42B7 21C4 67A9 759D 7455 C5E3 C0CD CEB9
|
||||
|
||||
luigi1111@getmonero.org
|
||||
8777 AB8F 778E E894 87A2 F8E7 F4AC A018 3641 E010
|
||||
|
||||
moneromooo.monero@gmail.com
|
||||
48B0 8161 FBDA DFE3 93AD FC3E 686F 0745 4D6C EFC3
|
||||
|
||||
jaquee.monero@gmail.com
|
||||
D21E 9CC1 2F51 C4FE A9E0 52FF 384E 52B0 9F45 DC39
|
||||
```
|
||||
|
||||
## II. Security Response Team
|
||||
|
||||
- fluffypony
|
||||
- luigi1111
|
||||
- moneromooo
|
||||
- Jaquee
|
||||
|
||||
## III. Incident Response
|
||||
|
||||
1. Researcher submits report via one or both of two methods:
|
||||
- a. Email
|
||||
- b. [HackerOne](https://hackerone.com/monero)
|
||||
|
||||
2. Response Team designates a Response Manager who is in charge of the particular report based on availability and/or knowledge-set
|
||||
|
||||
3. In no more than 3 working days, Response Team should gratefully respond to researcher using only encrypted, secure channels
|
||||
|
||||
4. Response Manager makes inquiries to satisfy any needed information to confirm if submission is indeed a vulnerability
|
||||
- a. If submission proves to be vulnerable, proceed to next step
|
||||
- b. If not vulnerable:
|
||||
- i. Response Manager responds with reasons why submission is not a vulnerability
|
||||
- ii. Response Manager moves discussion to a new or existing ticket on GitHub if necessary
|
||||
|
||||
5. If over email, Response Manager opens a HackerOne issue for new submission
|
||||
|
||||
6. Establish severity of vulnerability:
|
||||
- a. HIGH: impacts network as a whole, has potential to break entire network, results in the loss of monero, or is on a scale of great catastrophe
|
||||
- b. MEDIUM: impacts individual nodes, wallets, or must be carefully exploited
|
||||
- c. LOW: is not easily exploitable
|
||||
|
||||
7. Respond according to the severity of the vulnerability:
|
||||
- a. HIGH severities must be notified on website and reddit /r/Monero within 3 working days of classification
|
||||
- i. The notification should list appropriate steps for users to take, if any
|
||||
- ii. The notification must not include any details that could suggest an exploitation path
|
||||
- iii. The latter takes precedence over the former
|
||||
- b. MEDIUM and HIGH severities will require a Point Release
|
||||
- c. LOW severities will be addressed in the next Regular Release
|
||||
|
||||
8. Response Team applies appropriate patch(es)
|
||||
- a. Response Manager designates a PRIVATE git "hotfix branch" to work in
|
||||
- b. Patches are reviewed with the researcher
|
||||
- c. Any messages associated with PUBLIC commits during the time of review should not make reference to the security nature of the PRIVATE branch or its commits
|
||||
- d. Vulnerability announcement is drafted
|
||||
- i. Include the severity of the vulnerability
|
||||
- ii. Include all vulnerable systems/apps/code
|
||||
- iii. Include solutions (if any) if patch cannot be applied
|
||||
- e. Release date is discussed
|
||||
|
||||
9. At release date, Response Team coordinates with developers to finalize update:
|
||||
- a. Response Manager propagates the "hotfix branch" to trunk
|
||||
- b. Response Manager includes vulnerability announcement draft in release notes
|
||||
- c. Proceed with the Point or Regular Release
|
||||
|
||||
## IV. Post-release Disclosure Process
|
||||
|
||||
1. Response Team has 90 days to fulfill all points within section III
|
||||
|
||||
2. If the Incident Response process in section III is successfully completed:
|
||||
- a. Response Manager contacts researcher and asks if researcher wishes for credit
|
||||
- b. Finalize vulnerability announcement draft and include the following:
|
||||
- i. Project name and URL
|
||||
- ii. Versions known to be affected
|
||||
- iii. Versions known to be not affected (for example, the vulnerable code was introduced in a recent version, and older versions are therefore unaffected)
|
||||
- iv. Versions not checked
|
||||
- v. Type of vulnerability and its impact
|
||||
- vi. If already obtained or applicable, a CVE-ID
|
||||
- vii. The planned, coordinated release date
|
||||
- viii. Mitigating factors (for example, the vulnerability is only exposed in uncommon, non-default configurations)
|
||||
- ix. Workarounds (configuration changes users can make to reduce their exposure to the vulnerability)
|
||||
- x. If applicable, credits to the original reporter
|
||||
- c. Release finalized vulnerability announcement on website and reddit /r/Monero
|
||||
- d. For HIGH severities, release finalized vulnerability announcement on well-known mailing lists:
|
||||
- i. oss-security@lists.openwall.com
|
||||
- ii. bugtraq@securityfocus.com
|
||||
- e. If applicable, developers request a CVE-ID
|
||||
- i. The commit that applied the fix is made reference too in a future commit and includes a CVE-ID
|
||||
|
||||
3. If the Incident Response process in section III is *not* successfully completed:
|
||||
- a. Response Team and developers organize an IRC meeting to discuss why/what points in section III were not resolved and how the team can resolve them in the future
|
||||
- b. Any developer meetings immediately following the incident should include points made in section V
|
||||
- c. If disputes arise about whether or when to disclose information about a vulnerability, the Response Team will publicly discuss the issue via IRC and attempt to reach consensus
|
||||
- d. If consensus on a timely disclosure is not met (no later than 90 days), the researcher (after 90 days) has every right to expose the vulnerability to the public
|
||||
|
||||
## V. Incident Analysis
|
||||
|
||||
1. Isolate codebase
|
||||
- a. Response Team and developers should coordinate to work on the following:
|
||||
- i. Problematic implementation of classes/libraries/functions, etc.
|
||||
- ii. Focus on apps/distro packaging, etc.
|
||||
- iii. Operator/config error, etc.
|
||||
|
||||
2. Auditing
|
||||
- a. Response Team and developers should coordinate to work on the following:
|
||||
- i. Auditing of problem area(s) as discussed in point 1
|
||||
- ii. Generate internal reports and store for future reference
|
||||
- iii. If results are not sensitive, share with the public via IRC or GitHub
|
||||
|
||||
3. Response Team has 45 days following completion of section III to ensure completion of section V
|
||||
|
||||
## VI. Resolutions
|
||||
|
||||
Any further questions or resolutions regarding the incident(s) between the researcher and response + development team after public disclosure can be addressed via the following:
|
||||
|
||||
- [GitHub](https://github.com/monero-project/monero/issues/)
|
||||
- [HackerOne](https://hackerone.com/monero)
|
||||
- [Reddit /r/Monero](https://reddit.com/r/Monero/)
|
||||
- IRC
|
||||
- Email
|
||||
|
||||
## VII. Continuous Improvement
|
||||
|
||||
1. Response Team and developers should hold annual meetings to review the previous year's incidents
|
||||
|
||||
2. Response Team or designated person(s) should give a brief presentation, including:
|
||||
- a. Areas of Monero affected by the incidents
|
||||
- b. Any network downtime or monetary cost (if any) of the incidents
|
||||
- c. Ways in which the incidents could have been avoided (if any)
|
||||
- d. How effective this process was in dealing with the incidents
|
||||
|
||||
3. After the presentation, Response Team and developers should discuss:
|
||||
- a. Potential changes to development processes to reduce future incidents
|
||||
- b. Potential changes to this process to improve future responses
|
||||
53
android/README.md
Normal file
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
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
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
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))
|
||||
4
build.sh
4
build.sh
@@ -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
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
|
||||
|
||||
@@ -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
7
components/TextBlock.qml
Normal file
@@ -0,0 +1,7 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
TextEdit {
|
||||
wrapMode: Text.Wrap
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
}
|
||||
@@ -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
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
BIN
installers/windows/FinishImage.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 151 KiB |
31
installers/windows/LICENSE
Normal file
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
|
||||
361
installers/windows/Monero.iss
Normal file
361
installers/windows/Monero.iss
Normal file
@@ -0,0 +1,361 @@
|
||||
; Monero GUI Wallet Beta 2 Installer for Windows
|
||||
; Copyright (c) 2014-2017, The Monero Project
|
||||
; See LICENSE
|
||||
|
||||
[Setup]
|
||||
AppName=Monero GUI Wallet
|
||||
AppVersion=0.10.3.1
|
||||
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
|
||||
; Beta 2 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
|
||||
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
|
||||
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 up to 20 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"
|
||||
Name: "{group}\Utilities\Textual (CLI) Wallet"; Filename: "{app}\monero-wallet-cli.exe"
|
||||
|
||||
; 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};
|
||||
|
||||
41
installers/windows/README.md
Normal file
41
installers/windows/README.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Monero GUI Wallet Beta 2 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
|
||||
Monero GUI Wallet Beta 2.
|
||||
|
||||
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 lower 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 Beta 2 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 GUI Wallet Beta 2.
|
||||
|
||||
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](https://github.com/monero-project/monero-core) repository; 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 Beta 2 from [here](https://getmonero.org/downloads/), unpack it somewhere, and copy all the files and subdirectories in the `monero-gui-0.10.3.1-beta2` 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
|
||||
|
||||
174
installers/windows/ReadMe.htm
Normal file
174
installers/windows/ReadMe.htm
Normal file
@@ -0,0 +1,174 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Monero GUI Wallet Beta 2</title>
|
||||
</head>
|
||||
|
||||
<body style="font-family: Arial, Helvetica, sans-serif">
|
||||
<h1>Monero GUI Wallet Beta 2</h1>
|
||||
|
||||
<p>Copyright (c) 2014-2017, The Monero Project<br>
|
||||
Date: June 28, 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 Beta 2 of the <i>Monero GUI Wallet</i> for Windows, more exact version 0.10.3.1. 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>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 17 GB in summer 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", as you can expect seeing the word
|
||||
<i>Beta</i> in the name of the package, 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>There is a <b>bug</b> in this beta of the GUI wallet that triggers if it is installed in a path that contains spaces /
|
||||
blank characters, like the default location for Windows programs <i>C:\Program Files</i> unfortunately does.
|
||||
Symptoms are problems in the communication between the wallet and the daemon, e.g. the wallet not "seeing" the
|
||||
daemon and then not knowing whether it is "synchronized" with the network and thus ready to work or not. You can
|
||||
avoid these problems by starting the daemon yourself, with the help of the <i>Monero Daemon</i> icon in the
|
||||
<i>Utilities</i> sub-folder of the Monero program group.</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 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 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
BIN
installers/windows/WelcomeImage.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 440 KiB |
BIN
installers/windows/WizardSmallImage.bmp
Normal file
BIN
installers/windows/WizardSmallImage.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.6 KiB |
3
installers/windows/monero-daemon.bat
Normal file
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
1
installers/windows/monero-wallet-gui.log
Normal file
@@ -0,0 +1 @@
|
||||
-----
|
||||
41
ios_get_libwallet.api.sh
Executable file
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
BIN
lang/flags/israel.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.7 KiB |
BIN
lang/flags/south_korea.png
Normal file
BIN
lang/flags/south_korea.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
BIN
lang/flags/sweden.png
Normal file
BIN
lang/flags/sweden.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
@@ -1,34 +1,40 @@
|
||||
<?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"/>
|
||||
</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
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);
|
||||
|
||||
|
||||
267
main.qml
267
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);
|
||||
@@ -860,6 +891,7 @@ ApplicationWindow {
|
||||
property string daemonUsername: ""
|
||||
property string daemonPassword: ""
|
||||
property bool transferShowAdvanced: false
|
||||
property string blockchainDataDir: ""
|
||||
}
|
||||
|
||||
// Information dialog
|
||||
@@ -967,53 +999,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 +1060,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 +1073,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 +1132,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 +1147,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 +1162,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 +1198,7 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
property int minWidth: 326
|
||||
property int minHeight: 720
|
||||
property int minHeight: 400
|
||||
MouseArea {
|
||||
id: resizeArea
|
||||
hoverEnabled: true
|
||||
@@ -1270,6 +1309,7 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
Notifier {
|
||||
visible:false
|
||||
id: notifier
|
||||
}
|
||||
}
|
||||
@@ -1277,7 +1317,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 +1348,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 +1366,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
2
monero
Submodule monero updated: c9063c0b8f...ab594cfee9
@@ -79,20 +79,22 @@ 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
|
||||
}
|
||||
|
||||
|
||||
ios {
|
||||
message("Host is IOS")
|
||||
|
||||
@@ -105,7 +107,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 +282,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 +298,11 @@ 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
|
||||
|
||||
CONFIG(release, debug|release) {
|
||||
DESTDIR = release/bin
|
||||
@@ -357,6 +364,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 +398,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,28 @@ 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 {
|
||||
Layout.fillWidth: true
|
||||
text: (typeof currentWallet == "undefined") ? "" : qsTr("Wallet creation height: ") + currentWallet.walletCreationHeight + translationManager.emptyString
|
||||
}
|
||||
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 +526,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 +561,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
|
||||
|
||||
@@ -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
|
||||
|
||||
8
qml.qrc
8
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,12 @@
|
||||
<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>wizard/WizardManageWalletUI.qml</file>
|
||||
<file>wizard/WizardRecoveryWallet.qml</file>
|
||||
<file>wizard/WizardMemoTextInput.qml</file>
|
||||
@@ -125,7 +128,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 +140,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() : 0;
|
||||
// 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;
|
||||
|
||||
@@ -599,6 +599,16 @@ bool Wallet::useForkRules(quint8 required_version, quint64 earlyBlocks) const
|
||||
}
|
||||
}
|
||||
|
||||
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 CONSTANT)
|
||||
|
||||
public:
|
||||
|
||||
@@ -231,6 +238,16 @@ 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();}
|
||||
QString getDaemonLogPath() const;
|
||||
QString getWalletLogPath() const;
|
||||
|
||||
// TODO: setListenter() when it implemented in API
|
||||
signals:
|
||||
// emitted on every event happened with wallet
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -85,6 +85,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() : 0;
|
||||
break;
|
||||
case TransactionHashRole:
|
||||
result = tInfo->hash();
|
||||
break;
|
||||
@@ -130,6 +133,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,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
2175
translations/monero-core_he.ts
Normal file
2175
translations/monero-core_he.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
2155
translations/monero-core_ko.ts
Normal file
2155
translations/monero-core_ko.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
2174
translations/monero-core_sv.ts
Normal file
2174
translations/monero-core_sv.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
6
utils.sh
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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -85,7 +85,7 @@ ColumnLayout {
|
||||
if(fromSeed)
|
||||
var wallet = walletManager.recoveryWallet(tmp_wallet_filename, settingsObject.words, testnet, restoreHeight)
|
||||
else
|
||||
var wallet = walletManager.createWalletFromKeys(tmp_wallet_filename, settingsObject.language, testnet,
|
||||
var wallet = walletManager.createWalletFromKeys(tmp_wallet_filename, settingsObject.wallet_language, testnet,
|
||||
settingsObject.recover_address, settingsObject.recover_viewkey,
|
||||
settingsObject.recover_spendkey, restoreHeight)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user