2018-01-07 05:20:45 +00:00
// Copyright (c) 2014-2018, The Monero Project
2016-10-08 23:23:57 +00:00
//
2015-04-01 08:56:05 +00:00
// All rights reserved.
2016-10-08 23:23:57 +00:00
//
2015-04-01 08:56:05 +00:00
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
2016-10-08 23:23:57 +00:00
//
2015-04-01 08:56:05 +00:00
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
2016-10-08 23:23:57 +00:00
//
2015-04-01 08:56:05 +00:00
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
2016-10-08 23:23:57 +00:00
//
2015-04-01 08:56:05 +00:00
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
2016-10-08 23:23:57 +00:00
//
2015-04-01 08:56:05 +00:00
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2014-07-07 17:08:30 +00:00
import QtQuick 2.0
2016-10-03 21:52:48 +00:00
import QtQuick . Controls 1.4
import QtQuick . Controls . Styles 1.4
import QtQuick . Layouts 1.1
2016-10-04 22:21:59 +00:00
import QtQuick . Dialogs 1.2
2016-12-20 21:13:42 +00:00
import "../version.js" as Version
2018-04-21 20:21:35 +00:00
import "../js/Windows.js" as Windows
import "../js/Utils.js" as Utils
2016-10-04 22:21:59 +00:00
2016-10-03 21:52:48 +00:00
import "../components"
import moneroComponents . Clipboard 1.0
2014-07-07 17:08:30 +00:00
Rectangle {
2017-01-04 16:25:22 +00:00
property bool viewOnly: false
2018-04-20 20:42:32 +00:00
property alias settingsHeight: mainLayout . height
2017-04-03 16:51:55 +00:00
id: page
2016-10-04 22:21:59 +00:00
2017-12-07 16:34:12 +00:00
color: "transparent"
2016-10-03 21:52:48 +00:00
2017-12-09 01:14:33 +00:00
// fires on every page load
function onPageCompleted ( ) {
console . log ( "Settings page loaded" ) ;
if ( typeof daemonManager != "undefined" ) {
2018-05-02 01:29:47 +00:00
appWindow . daemonRunning = persistentSettings . useRemoteNode ? false : daemonManager . running ( persistentSettings . nettype ) ;
2017-12-09 01:14:33 +00:00
}
2016-10-03 21:52:48 +00:00
2017-12-09 01:14:33 +00:00
logLevelDropdown . update ( )
2016-10-04 22:21:59 +00:00
}
2016-10-03 21:52:48 +00:00
2017-12-09 01:14:33 +00:00
Clipboard { id: clipboard }
2016-10-03 21:52:48 +00:00
ColumnLayout {
id: mainLayout
2017-12-08 23:02:43 +00:00
anchors.margins: ( isMobile ) ? 17 : 40
2016-10-03 21:52:48 +00:00
anchors.left: parent . left
anchors.top: parent . top
anchors.right: parent . right
2017-12-08 23:02:43 +00:00
spacing: 26 * scaleRatio
2016-10-03 21:52:48 +00:00
2017-01-04 16:25:22 +00:00
//! Manage wallet
RowLayout {
2017-12-08 23:02:43 +00:00
Layout.fillWidth: true
2017-01-04 16:25:22 +00:00
Label {
id: manageWalletLabel
2017-12-08 23:02:43 +00:00
fontSize: 22 * scaleRatio
2017-01-04 16:25:22 +00:00
Layout.fillWidth: true
text: qsTr ( "Manage wallet" ) + translationManager . emptyString
2017-08-07 14:05:54 +00:00
Layout.topMargin: 10 * scaleRatio
2017-01-04 16:25:22 +00:00
}
2016-10-03 21:52:48 +00:00
2017-12-08 23:02:43 +00:00
Rectangle {
anchors.top: manageWalletLabel . bottom
anchors.topMargin: 4
anchors.left: parent . left
anchors.right: parent . right
Layout.fillWidth: true
height: 2
color: Style . dividerColor
opacity: Style . dividerOpacity
}
2016-10-08 22:54:15 +00:00
}
2016-10-03 21:52:48 +00:00
2017-04-03 16:51:55 +00:00
GridLayout {
2017-08-07 15:03:34 +00:00
columns: ( isMobile ) ? 1 : 4
2017-01-04 16:25:22 +00:00
StandardButton {
id: closeWalletButton
2017-12-10 18:52:05 +00:00
small: true
2017-01-04 16:25:22 +00:00
text: qsTr ( "Close wallet" ) + translationManager . emptyString
visible: true
onClicked: {
console . log ( "closing wallet button clicked" )
appWindow . showWizard ( ) ;
}
}
StandardButton {
id: createViewOnlyWalletButton
2017-12-10 18:52:05 +00:00
enabled: ! viewOnly
small: true
2017-01-04 16:25:22 +00:00
text: qsTr ( "Create view only wallet" ) + translationManager . emptyString
visible: true
onClicked: {
wizard . openCreateViewOnlyWalletPage ( ) ;
}
}
2017-05-03 13:57:41 +00:00
/ * R e s c a n c a c h e - D i s a b l e d u n t i l w e k n o w i t ' s n e e d e d
2017-05-03 12:37:33 +00:00
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 ) ;
2018-01-16 17:00:53 +00:00
walletManager . openWalletAsync ( persistentSettings . wallet_path , appWindow . walletPassword ,
2018-03-05 16:19:45 +00:00
persistentSettings . nettype ) ;
2017-05-03 12:37:33 +00:00
}
confirmationDialog . onRejectedCallback = null ;
confirmationDialog . open ( )
}
}
2017-05-03 13:57:41 +00:00
* /
2017-05-03 13:32:46 +00:00
StandardButton {
id: rescanSpentButton
2017-12-10 18:52:05 +00:00
small: true
2017-08-07 15:03:34 +00:00
enabled: ! persistentSettings . useRemoteNode
2017-05-03 13:32:46 +00:00
text: qsTr ( "Rescan wallet balance" ) + translationManager . emptyString
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
2017-11-12 21:01:19 +00:00
informationPopup . text = qsTr ( "Successfully rescanned spent outputs." ) + translationManager . emptyString
2017-05-03 13:32:46 +00:00
informationPopup . icon = StandardIcon . Information
informationPopup . onCloseCallback = null
informationPopup . open ( ) ;
}
}
}
2018-01-12 00:17:20 +00:00
}
RowLayout {
Layout.fillWidth: true
2017-09-22 14:25:25 +00:00
StandardButton {
id: changePasswordButton
2018-01-12 00:17:20 +00:00
small: true
2017-09-22 14:25:25 +00:00
text: qsTr ( "Change password" ) + translationManager . emptyString
onClicked: {
passwordDialog . onAcceptedCallback = function ( ) {
if ( appWindow . walletPassword === passwordDialog . password ) {
newPasswordDialog . open ( )
} else {
informationPopup . title = qsTr ( "Error" ) + translationManager . emptyString ;
informationPopup . text = qsTr ( "Wrong password" ) ;
informationPopup . open ( )
informationPopup . onCloseCallback = function ( ) {
changePasswordDialog . open ( )
}
passwordDialog . open ( )
}
}
passwordDialog . onRejectedCallback = null ;
passwordDialog . open ( )
}
}
2016-10-08 22:54:15 +00:00
}
2016-10-04 22:21:59 +00:00
2017-08-07 15:03:34 +00:00
RowLayout {
2017-12-10 18:52:05 +00:00
Layout.fillWidth: true
LabelSubheader {
2018-04-07 05:31:11 +00:00
text: qsTr ( "Daemon mode" ) + translationManager . emptyString
2017-12-10 18:52:05 +00:00
}
}
2017-08-07 15:03:34 +00:00
2018-04-07 05:31:11 +00:00
ColumnLayout {
2018-04-22 23:17:33 +00:00
RadioButton {
2017-08-07 15:03:34 +00:00
id: remoteDisconnect
2018-04-07 05:31:11 +00:00
checked: ! persistentSettings . useRemoteNode
2017-08-07 15:03:34 +00:00
text: qsTr ( "Local Node" ) + translationManager . emptyString
onClicked: {
2018-04-07 05:31:11 +00:00
persistentSettings . useRemoteNode = false ;
remoteConnect . checked = false ;
2017-08-07 15:03:34 +00:00
appWindow . disconnectRemoteNode ( ) ;
}
}
2018-04-22 23:17:33 +00:00
RadioButton {
2017-08-07 15:03:34 +00:00
id: remoteConnect
2018-04-07 05:31:11 +00:00
checked: persistentSettings . useRemoteNode
2017-08-07 15:03:34 +00:00
text: qsTr ( "Remote Node" ) + translationManager . emptyString
onClicked: {
2018-04-07 05:31:11 +00:00
persistentSettings . useRemoteNode = true ;
remoteDisconnect . checked = false ;
2017-08-07 15:03:34 +00:00
appWindow . connectRemoteNode ( ) ;
}
}
}
2017-12-10 18:52:05 +00:00
RowLayout {
2018-03-23 22:50:45 +00:00
visible: ! isMobile && ! persistentSettings . useRemoteNode
Layout.fillWidth: true
LabelSubheader {
text: qsTr ( "Bootstrap node" ) + translationManager . emptyString
}
}
RowLayout {
visible: ! isMobile && ! persistentSettings . useRemoteNode
2017-12-10 18:52:05 +00:00
ColumnLayout {
Layout.fillWidth: true
RemoteNodeEdit {
2018-03-23 22:50:45 +00:00
id: bootstrapNodeEdit
2017-12-10 18:52:05 +00:00
Layout.minimumWidth: 100 * scaleRatio
2018-03-23 22:50:45 +00:00
Layout.bottomMargin: 20 * scaleRatio
lineEditBackgroundColor: "transparent"
lineEditFontColor: "white"
2018-04-29 22:52:48 +00:00
lineEditBorderColor: Style . inputBorderColorActive
2018-03-23 22:50:45 +00:00
2018-06-26 10:28:31 +00:00
daemonAddrLabelText: qsTr ( "Address" ) + translationManager . emptyString
daemonPortLabelText: qsTr ( "Port" ) + translationManager . emptyString
2018-03-23 22:50:45 +00:00
daemonAddrText: persistentSettings . bootstrapNodeAddress . split ( ":" ) [ 0 ] . trim ( )
2018-03-24 19:48:19 +00:00
daemonPortText: {
var node_split = persistentSettings . bootstrapNodeAddress . split ( ":" ) ;
if ( node_split . length == 2 ) {
( node_split [ 1 ] . trim ( ) == "" ) ? "18081" : node_split [ 1 ] ;
} else {
return ""
}
}
2018-03-23 22:50:45 +00:00
onEditingFinished: {
persistentSettings . bootstrapNodeAddress = daemonAddrText ? bootstrapNodeEdit . getAddress ( ) : "" ;
console . log ( "setting bootstrap node to " + persistentSettings . bootstrapNodeAddress )
}
}
}
}
RowLayout {
visible: persistentSettings . useRemoteNode
ColumnLayout {
Layout.fillWidth: true
RemoteNodeEdit {
id: remoteNodeEdit
Layout.minimumWidth: 100 * scaleRatio
2018-01-27 23:14:42 +00:00
lineEditBackgroundColor: "transparent"
lineEditFontColor: "white"
lineEditBorderColor: Qt . rgba ( 255 , 255 , 255 , 0.35 )
2018-03-23 22:50:45 +00:00
daemonAddrLabelText: qsTr ( "Address" )
daemonPortLabelText: qsTr ( "Port" )
property var rna: persistentSettings . remoteNodeAddress
daemonAddrText: rna . search ( ":" ) != - 1 ? rna . split ( ":" ) [ 0 ] . trim ( ) : ""
daemonPortText: rna . search ( ":" ) != - 1 ? ( rna . split ( ":" ) [ 1 ] . trim ( ) == "" ) ? "18081" : rna . split ( ":" ) [ 1 ] : ""
2017-12-10 18:52:05 +00:00
onEditingFinished: {
persistentSettings . remoteNodeAddress = remoteNodeEdit . getAddress ( ) ;
console . log ( "setting remote node to " + persistentSettings . remoteNodeAddress )
}
}
}
}
RowLayout {
visible: persistentSettings . useRemoteNode
Layout.fillWidth: true
StandardButton {
id: remoteNodeSave
small: true
text: qsTr ( "Connect" ) + translationManager . emptyString
onClicked: {
// Update daemon login
persistentSettings . remoteNodeAddress = remoteNodeEdit . getAddress ( ) ;
persistentSettings . daemonUsername = daemonUsername . text ;
persistentSettings . daemonPassword = daemonPassword . text ;
persistentSettings . useRemoteNode = true
currentWallet . setDaemonLogin ( persistentSettings . daemonUsername , persistentSettings . daemonPassword ) ;
appWindow . connectRemoteNode ( )
}
}
}
2017-01-04 16:25:22 +00:00
//! Manage daemon
RowLayout {
2017-08-07 15:03:34 +00:00
visible: ! isMobile
2017-12-10 18:52:05 +00:00
2017-01-04 16:25:22 +00:00
Label {
id: manageDaemonLabel
2017-12-08 23:02:43 +00:00
fontSize: 22 * scaleRatio
2017-08-07 15:03:34 +00:00
text: qsTr ( "Manage Daemon" ) + translationManager . emptyString
}
2017-12-08 23:02:43 +00:00
Rectangle {
anchors.top: manageDaemonLabel . bottom
anchors.topMargin: 4
anchors.left: parent . left
anchors.right: parent . right
Layout.fillWidth: true
height: 2
color: Style . dividerColor
opacity: Style . dividerOpacity
2017-01-04 16:25:22 +00:00
}
}
2016-10-03 21:52:48 +00:00
2017-04-03 16:51:55 +00:00
GridLayout {
2018-01-24 06:16:34 +00:00
visible: ! isMobile && ! persistentSettings . useRemoteNode
2017-03-14 14:05:47 +00:00
id: daemonStatusRow
2017-04-03 16:51:55 +00:00
columns: ( isMobile ) ? 2 : 4
2017-01-04 16:25:22 +00:00
StandardButton {
id: startDaemonButton
2017-12-10 18:52:05 +00:00
small: true
visible: ! appWindow . daemonRunning
2017-08-07 15:03:34 +00:00
text: qsTr ( "Start Local Node" ) + translationManager . emptyString
2017-01-04 16:25:22 +00:00
onClicked: {
2018-01-22 09:43:39 +00:00
// Update bootstrap daemon address
persistentSettings . bootstrapNodeAddress = bootstrapNodeEdit . daemonAddrText ? bootstrapNodeEdit . getAddress ( ) : "" ;
2017-08-07 15:03:34 +00:00
// Set current daemon address to local
2018-03-23 22:50:45 +00:00
appWindow . currentDaemonAddress = appWindow . localDaemonAddress ;
appWindow . startDaemon ( daemonFlags . text ) ;
2017-01-04 16:25:22 +00:00
}
}
StandardButton {
id: stopDaemonButton
2017-12-10 18:52:05 +00:00
small: true
visible: appWindow . daemonRunning
2017-08-07 15:03:34 +00:00
text: qsTr ( "Stop Local Node" ) + translationManager . emptyString
2017-01-04 16:25:22 +00:00
onClicked: {
appWindow . stopDaemon ( )
}
}
2017-01-22 22:04:46 +00:00
StandardButton {
id: daemonStatusButton
2017-12-10 18:52:05 +00:00
small: true
visible: true
2017-02-23 18:47:58 +00:00
text: qsTr ( "Show status" ) + translationManager . emptyString
2017-01-22 22:04:46 +00:00
onClicked: {
2018-03-05 16:19:45 +00:00
daemonManager . sendCommand ( "status" , currentWallet . nettype ) ;
2017-01-22 22:04:46 +00:00
daemonConsolePopup . open ( ) ;
}
}
2017-05-04 12:06:29 +00:00
}
2017-01-22 22:04:46 +00:00
2017-08-07 15:03:34 +00:00
ColumnLayout {
2017-05-04 12:06:29 +00:00
id: blockchainFolderRow
2018-01-24 05:43:24 +00:00
visible: ! isMobile && ! persistentSettings . useRemoteNode
2017-12-10 18:52:05 +00:00
RowLayout {
2017-05-04 12:06:29 +00:00
Layout.fillWidth: true
2017-12-10 18:52:05 +00:00
Layout.bottomMargin: 14 * scaleRatio
LabelSubheader {
text: qsTr ( "Blockchain location" ) + translationManager . emptyString
}
}
2017-01-22 22:04:46 +00:00
2017-12-10 18:52:05 +00:00
RowLayout {
visible: persistentSettings . blockchainDataDir . length > 0
LineEdit {
id: blockchainFolder
Layout.preferredWidth: 200
Layout.fillWidth: true
text: persistentSettings . blockchainDataDir ;
placeholderText: qsTr ( "(optional)" ) + translationManager . emptyString
}
}
RowLayout {
Layout.fillWidth: true
Layout.topMargin: 8
StandardButton {
id: blockchainFolderButton
small: true
visible: true
text: qsTr ( "Change location" ) + translationManager . emptyString
2017-05-04 12:06:29 +00:00
onClicked: {
2017-12-10 18:52:05 +00:00
//mouse.accepted = false
2017-05-04 12:06:29 +00:00
if ( persistentSettings . blockchainDataDir != "" )
blockchainFileDialog . folder = "file://" + persistentSettings . blockchainDataDir
blockchainFileDialog . open ( )
blockchainFolder . focus = true
}
}
2017-12-10 18:52:05 +00:00
}
}
2017-05-04 12:06:29 +00:00
2017-12-08 23:02:43 +00:00
RowLayout {
CheckBox {
id: daemonAdvanced
text: qsTr ( "Show advanced" ) + translationManager . emptyString
}
}
2017-08-07 15:03:34 +00:00
2017-05-04 12:06:29 +00:00
RowLayout {
2018-01-24 06:16:34 +00:00
visible: daemonAdvanced . checked && ! isMobile && ! persistentSettings . useRemoteNode
2017-01-04 16:25:22 +00:00
id: daemonFlagsRow
2017-12-10 18:52:05 +00:00
2017-01-04 16:25:22 +00:00
LineEdit {
id: daemonFlags
Layout.preferredWidth: 200
Layout.fillWidth: true
2017-12-10 18:52:05 +00:00
labelText: qsTr ( "Local daemon startup flags" ) + translationManager . emptyString
2017-01-04 16:25:22 +00:00
text: appWindow . persistentSettings . daemonFlags ;
placeholderText: qsTr ( "(optional)" ) + translationManager . emptyString
}
}
2017-08-07 15:03:34 +00:00
ColumnLayout {
2018-01-24 06:16:34 +00:00
visible: ( daemonAdvanced . checked || isMobile ) && persistentSettings . useRemoteNode
2017-12-10 18:52:05 +00:00
GridLayout {
columns: ( isMobile ) ? 1 : 2
columnSpacing: 32
2018-01-22 09:43:39 +00:00
2017-12-10 18:52:05 +00:00
LineEdit {
id: daemonUsername
2017-12-08 23:02:43 +00:00
Layout.fillWidth: true
2017-12-10 18:52:05 +00:00
labelText: "Daemon username"
text: persistentSettings . daemonUsername
placeholderText: qsTr ( "Username" ) + translationManager . emptyString
2017-08-07 15:03:34 +00:00
}
2017-02-25 21:16:58 +00:00
2017-12-10 18:52:05 +00:00
LineEdit {
id: daemonPassword
Layout.fillWidth: true
labelText: "Daemon password"
text: persistentSettings . daemonPassword
placeholderText: qsTr ( "Password" ) + translationManager . emptyString
echoMode: TextInput . Password
2016-10-04 22:21:59 +00:00
}
}
}
2016-10-29 14:30:41 +00:00
RowLayout {
2017-08-07 15:03:34 +00:00
visible: ! isMobile
2016-10-29 14:30:41 +00:00
Label {
2017-12-08 23:02:43 +00:00
id: layoutSettingsLabel
fontSize: 22 * scaleRatio
2017-01-04 16:25:22 +00:00
text: qsTr ( "Layout settings" ) + translationManager . emptyString
2016-10-29 14:30:41 +00:00
}
2017-12-08 23:02:43 +00:00
Rectangle {
anchors.top: layoutSettingsLabel . bottom
anchors.topMargin: 4
anchors.left: parent . left
anchors.right: parent . right
Layout.fillWidth: true
height: 2
color: Style . dividerColor
opacity: Style . dividerOpacity
}
2016-12-21 13:30:15 +00:00
}
2016-12-09 21:35:08 +00:00
RowLayout {
CheckBox {
2017-08-07 15:03:34 +00:00
visible: ! isMobile
2016-12-09 21:35:08 +00:00
id: customDecorationsCheckBox
checked: persistentSettings . customDecorations
2018-04-21 20:21:35 +00:00
onClicked: Windows . setCustomWindowDecorations ( checked )
2016-12-09 21:35:08 +00:00
text: qsTr ( "Custom decorations" ) + translationManager . emptyString
}
}
2016-12-31 10:56:08 +00:00
// Log level
2017-04-03 16:51:55 +00:00
2016-12-31 10:56:08 +00:00
RowLayout {
Label {
2017-12-08 23:02:43 +00:00
id: logLevelLabel
fontSize: 22 * scaleRatio
2016-12-31 10:56:08 +00:00
text: qsTr ( "Log level" ) + translationManager . emptyString
}
2017-12-08 23:02:43 +00:00
Rectangle {
anchors.top: logLevelLabel . bottom
anchors.topMargin: 4
anchors.left: parent . left
anchors.right: parent . right
Layout.fillWidth: true
height: 2
color: Style . dividerColor
opacity: Style . dividerOpacity
}
2017-04-03 16:51:55 +00:00
}
2017-12-08 23:02:43 +00:00
2017-12-09 01:14:33 +00:00
GridLayout {
columns: ( isMobile ) ? 1 : 3
Layout.fillWidth: true
columnSpacing: 32
ColumnLayout {
spacing: 0
Layout.fillWidth: true
ListModel {
id: logLevel
2018-04-29 22:52:48 +00:00
ListElement { name: "none" ; column1: "0" ; }
2017-12-09 01:14:33 +00:00
ListElement { column1: "1" ; }
ListElement { column1: "2" ; }
ListElement { column1: "3" ; }
ListElement { column1: "4" ; }
ListElement { column1: "custom" ; }
}
StandardDropdown {
id: logLevelDropdown
dataModel: logLevel
currentIndex: appWindow . persistentSettings . logLevel ;
onChanged: {
if ( currentIndex == 5 ) {
console . log ( "log categories changed: " , logCategories . text ) ;
walletManager . setLogCategories ( logCategories . text ) ;
}
else {
console . log ( "log level changed: " , currentIndex ) ;
walletManager . setLogLevel ( currentIndex ) ;
}
appWindow . persistentSettings . logLevel = currentIndex ;
2017-01-16 21:56:37 +00:00
}
2017-12-09 01:14:33 +00:00
Layout.fillWidth: true
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#363636"
pressedColor: "#202020"
2016-12-31 10:56:08 +00:00
}
2017-12-09 01:14:33 +00:00
// Make sure dropdown is on top
}
ColumnLayout {
Layout.fillWidth: true
2016-12-31 10:56:08 +00:00
}
2017-01-16 21:56:37 +00:00
2017-12-09 01:14:33 +00:00
ColumnLayout {
Layout.fillWidth: true
}
2018-04-05 06:20:36 +00:00
z: parent . z + 1
2017-12-09 01:14:33 +00:00
}
ColumnLayout {
2017-01-16 21:56:37 +00:00
LineEdit {
id: logCategories
Layout.fillWidth: true
2017-02-05 12:38:43 +00:00
text: appWindow . persistentSettings . logCategories
2017-12-09 01:14:33 +00:00
labelText: "Log Categories"
2018-05-08 17:12:29 +00:00
placeholderText: "(e.g. *:WARNING,net.p2p:DEBUG)"
2017-12-10 18:52:05 +00:00
enabled: logLevelDropdown . currentIndex === 5
2017-01-16 21:56:37 +00:00
onEditingFinished: {
if ( enabled ) {
console . log ( "log categories changed: " , text ) ;
walletManager . setLogCategories ( text ) ;
2017-02-05 12:38:43 +00:00
appWindow . persistentSettings . logCategories = text ;
2017-01-16 21:56:37 +00:00
}
}
}
2016-12-31 10:56:08 +00:00
}
2017-01-04 16:25:22 +00:00
// Version
RowLayout {
Label {
2017-12-08 23:02:43 +00:00
id: debugLabel
2017-08-24 09:31:56 +00:00
text: qsTr ( "Debug info" ) + translationManager . emptyString
2017-12-08 23:02:43 +00:00
fontSize: 22
2017-08-07 14:05:54 +00:00
anchors.topMargin: 30 * scaleRatio
Layout.topMargin: 30 * scaleRatio
2017-01-04 16:25:22 +00:00
}
2017-12-08 23:02:43 +00:00
Rectangle {
anchors.top: debugLabel . bottom
anchors.topMargin: 4
anchors.left: parent . left
anchors.right: parent . right
Layout.fillWidth: true
height: 2
color: Style . dividerColor
opacity: Style . dividerOpacity
}
2017-01-04 16:25:22 +00:00
}
2017-12-08 23:02:43 +00:00
2018-04-21 11:17:53 +00:00
GridLayout {
id: grid
columns: 2
columnSpacing: 20 * scaleRatio
2017-10-23 16:33:10 +00:00
2018-04-21 11:17:53 +00:00
TextBlock {
font.pixelSize: 14
text: qsTr ( "GUI version: " ) + translationManager . emptyString
2017-10-23 16:33:10 +00:00
}
2018-04-21 11:17:53 +00:00
TextBlock {
font.pixelSize: 14
font.bold: true
text: Version . GUI_VERSION + " (Qt " + qtRuntimeVersion + ")" + translationManager . emptyString
}
2017-10-23 16:33:10 +00:00
2018-04-21 11:17:53 +00:00
TextBlock {
id: guiMoneroVersion
font.pixelSize: 14
text: qsTr ( "Embedded Monero version: " ) + translationManager . emptyString
}
TextBlock {
font.pixelSize: 14
font.bold: true
text: Version . GUI_MONERO_VERSION + translationManager . emptyString
}
TextBlock {
2017-10-23 16:33:10 +00:00
Layout.fillWidth: true
2018-04-21 11:17:53 +00:00
font.pixelSize: 14
text: qsTr ( "Wallet name: " ) + translationManager . emptyString
2017-10-23 16:33:10 +00:00
}
2018-04-21 11:17:53 +00:00
TextBlock {
Layout.fillWidth: true
font.pixelSize: 14
font.bold: true
text: walletName + translationManager . emptyString
}
2017-10-23 16:33:10 +00:00
2018-04-21 11:17:53 +00:00
TextBlock {
id: restoreHeight
font.pixelSize: 14
textFormat: Text . RichText
text: ( typeof currentWallet == "undefined" ) ? "" : qsTr ( "Wallet creation height: " ) + translationManager . emptyString
}
TextBlock {
id: restoreHeightText
textFormat: Text . RichText
font.pixelSize: 14
font.bold: true
property var style: "<style type='text/css'>a {cursor:pointer;text-decoration: none; color: #FF6C3C}</style>"
text: ( currentWallet ? currentWallet.walletCreationHeight : "" ) + style + qsTr ( " <a href='#'> (Click to change)</a>" ) + translationManager . emptyString
onLinkActivated: {
2018-04-28 13:17:36 +00:00
inputDialog . labelText = qsTr ( "Set a new restore height:" ) + translationManager . emptyString ;
inputDialog . inputText = currentWallet ? currentWallet.walletCreationHeight : "0" ;
inputDialog . onAcceptedCallback = function ( ) {
var _restoreHeight = inputDialog . inputText ;
if ( Utils . isNumeric ( _restoreHeight ) ) {
_restoreHeight = parseInt ( _restoreHeight ) ;
if ( _restoreHeight >= 0 ) {
2018-05-22 10:22:29 +00:00
currentWallet . walletCreationHeight = _restoreHeight
2018-04-28 13:17:36 +00:00
// Restore height is saved in .keys file. Set password to trigger rewrite.
currentWallet . setPassword ( appWindow . walletPassword )
// 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 . walletPassword ,
persistentSettings . nettype ) ;
}
confirmationDialog . onRejectedCallback = null ;
confirmationDialog . open ( )
return ;
}
2018-04-21 11:17:53 +00:00
}
2017-10-23 16:33:10 +00:00
2018-04-28 13:17:36 +00:00
appWindow . showStatusMessage ( qsTr ( "Invalid restore height specified. Must be a number." ) , 3 ) ;
2018-04-21 11:17:53 +00:00
}
2018-04-28 13:17:36 +00:00
inputDialog . onRejectedCallback = null ;
inputDialog . open ( )
2017-10-23 16:33:10 +00:00
}
2018-04-28 16:14:13 +00:00
MouseArea {
anchors.fill: parent
acceptedButtons: Qt . NoButton
cursorShape: parent . hoveredLink ? Qt.PointingHandCursor : Qt . ArrowCursor
}
2017-10-23 16:33:10 +00:00
}
2018-04-21 11:17:53 +00:00
TextBlock {
Layout.fillWidth: true
font.pixelSize: 14
2018-05-08 16:13:29 +00:00
text: qsTr ( "Wallet log path: " ) + translationManager . emptyString
2018-04-21 11:17:53 +00:00
}
2017-10-23 16:33:10 +00:00
2018-04-21 11:17:53 +00:00
TextBlock {
Layout.fillWidth: true
font.pixelSize: 14
2018-05-08 16:13:29 +00:00
text: walletLogPath
2018-04-21 11:17:53 +00:00
}
2016-12-20 21:13:42 +00:00
}
2016-10-03 21:52:48 +00:00
}
2016-10-04 22:21:59 +00:00
2017-05-04 12:06:29 +00:00
// Choose blockchain folder
FileDialog {
id: blockchainFileDialog
title: qsTr ( "Please choose a folder" ) + translationManager . emptyString ;
selectFolder: true
folder: "file://" + persistentSettings . blockchainDataDir
onAccepted: {
2017-12-10 18:52:05 +00:00
var dataDir = walletManager . urlToLocalPath ( blockchainFileDialog . fileUrl ) ;
console . log ( dataDir ) ;
2017-05-04 12:06:29 +00:00
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"
}
2018-04-05 07:21:43 +00:00
if ( validator . storageAvailable < estimatedBlockchainSize ) {
confirmationDialog . text += qsTr ( "Warning: There's only %1 GB available on the device. Blockchain requires ~%2 GB of data." ) . arg ( validator . storageAvailable ) . arg ( estimatedBlockchainSize ) + "\n\n"
2017-05-04 12:06:29 +00:00
} else {
2018-04-05 07:21:43 +00:00
confirmationDialog . text += qsTr ( "Note: There's %1 GB available on the device. Blockchain requires ~%2 GB of data." ) . arg ( validator . storageAvailable ) . arg ( estimatedBlockchainSize ) + "\n\n"
2017-05-04 12:06:29 +00:00
}
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" )
}
}
2016-11-07 13:59:00 +00:00
// fires only once
Component.onCompleted: {
2017-04-03 16:51:55 +00:00
if ( typeof daemonManager != "undefined" )
daemonManager . daemonConsoleUpdated . connect ( onDaemonConsoleUpdated )
2016-11-07 13:59:00 +00:00
}
function onDaemonConsoleUpdated ( message ) {
// Update daemon console
2018-04-21 20:21:35 +00:00
daemonConsolePopup . textArea . logMessage ( message )
2016-11-07 13:59:00 +00:00
}
2016-10-03 21:52:48 +00:00
2016-10-08 22:54:15 +00:00
}
2016-10-08 23:23:57 +00:00