2019-03-12 23:32:11 +00:00
// Copyright (c) 2014-2019, The Monero Project
2015-04-01 08:56:05 +00:00
//
// 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.
2014-07-07 17:08:30 +00:00
import QtQuick 2.0
2016-12-28 21:20:05 +00:00
import QtQuick . Layouts 1.1
import QtQuick . Dialogs 1.2
2018-12-18 05:04:16 +00:00
import "../components" as MoneroComponents
2016-12-28 21:20:05 +00:00
import moneroComponents . Wallet 1.0
2014-07-07 17:08:30 +00:00
Rectangle {
2016-12-28 21:20:05 +00:00
id: root
2018-01-27 23:14:42 +00:00
color: "transparent"
2018-12-18 05:04:16 +00:00
property double currentHashRate: 0
2016-12-28 21:20:05 +00:00
ColumnLayout {
id: mainLayout
2019-02-01 21:20:38 +00:00
Layout.fillWidth: true
2018-12-08 15:55:29 +00:00
anchors.margins: ( isMobile ) ? 17 * scaleRatio : 20 * scaleRatio
2019-01-22 14:10:27 +00:00
anchors.topMargin: 40 * scaleRatio
2016-12-28 21:20:05 +00:00
anchors.left: parent . left
anchors.top: parent . top
anchors.right: parent . right
2018-12-18 05:04:16 +00:00
spacing: 20 * scaleRatio
2016-12-28 21:20:05 +00:00
2018-12-18 05:04:16 +00:00
MoneroComponents . Label {
id: soloTitleLabel
fontSize: 24 * scaleRatio
text: qsTr ( "Solo mining" ) + translationManager . emptyString
}
2019-02-01 21:20:38 +00:00
MoneroComponents . WarningBox {
Layout.bottomMargin: 8 * scaleRatio
text: qsTr ( "Mining is only available on local daemons." ) + translationManager . emptyString
2018-12-18 05:04:16 +00:00
visible: ! walletManager . isDaemonLocal ( appWindow . currentDaemonAddress )
}
2019-03-12 23:32:11 +00:00
MoneroComponents . WarningBox {
Layout.bottomMargin: 8 * scaleRatio
2018-12-18 05:04:16 +00:00
text: qsTr ( "Your daemon must be synchronized before you can start mining" ) + translationManager . emptyString
visible: walletManager . isDaemonLocal ( appWindow . currentDaemonAddress ) && ! appWindow . daemonSynced
}
Text {
id: soloMainLabel
text: qsTr ( "Mining with your computer helps strengthen the Monero network. The more that people mine, the harder it is for the network to be attacked, and every little bit helps.<br> <br>Mining also gives you a small chance to earn some Monero. Your computer will create hashes looking for block solutions. If you find a block, you will get the associated reward. Good luck!" ) + translationManager . emptyString
wrapMode: Text . Wrap
Layout.fillWidth: true
font.family: MoneroComponents . Style . fontRegular . name
font.pixelSize: 14 * scaleRatio
color: MoneroComponents . Style . defaultFontColor
}
MoneroComponents . WarningBox {
id: warningLabel
Layout.topMargin: 8 * scaleRatio
Layout.bottomMargin: 8 * scaleRatio
text: qsTr ( "Mining may reduce the performance of other running applications and processes." ) + translationManager . emptyString
}
2019-03-12 23:32:11 +00:00
GridLayout {
columns: 2
Layout.fillWidth: true
columnSpacing: 20 * scaleRatio
rowSpacing: 16 * scaleRatio
2018-12-18 05:04:16 +00:00
2019-03-12 23:32:11 +00:00
ColumnLayout {
Layout.fillWidth: true
Layout.alignment : Qt . AlignTop | Qt . AlignLeft
2016-12-28 21:20:05 +00:00
2019-03-12 23:32:11 +00:00
MoneroComponents . Label {
id: soloMinerThreadsLabel
color: MoneroComponents . Style . defaultFontColor
text: qsTr ( "CPU threads" ) + translationManager . emptyString
fontSize: 16 * scaleRatio
wrapMode: Text . WordWrap
}
2016-12-28 21:20:05 +00:00
}
2019-03-12 23:32:11 +00:00
ColumnLayout {
Layout.fillWidth: true
spacing: 16 * scaleRatio
2018-12-18 05:04:16 +00:00
2019-03-12 23:32:11 +00:00
MoneroComponents . LineEdit {
id: soloMinerThreadsLine
Layout.minimumWidth: 200 * scaleRatio
text: "1"
validator: IntValidator { bottom: 1 ; top: idealThreadCount }
2016-12-28 21:20:05 +00:00
}
2019-03-12 23:32:11 +00:00
Text {
id: numAvailableThreadsText
text: qsTr ( "Max # of CPU threads available for mining: " ) + idealThreadCount + translationManager . emptyString
wrapMode: Text . WordWrap
font.family: MoneroComponents . Style . fontRegular . name
font.pixelSize: 14 * scaleRatio
color: MoneroComponents . Style . defaultFontColor
2017-03-02 14:44:37 +00:00
}
2019-03-12 23:32:11 +00:00
RowLayout {
MoneroComponents . StandardButton {
id: autoRecommendedThreadsButton
small: true
text: qsTr ( "Use recommended # of threads" ) + translationManager . emptyString
enabled: startSoloMinerButton . enabled
onClicked: {
soloMinerThreadsLine . text = Math . floor ( idealThreadCount / 2 ) ;
appWindow . showStatusMessage ( qsTr ( "Set to use recommended # of threads" ) , 3 )
}
}
2017-03-02 14:44:37 +00:00
2019-03-12 23:32:11 +00:00
MoneroComponents . StandardButton {
id: autoSetMaxThreadsButton
small: true
text: qsTr ( "Use all threads" ) + translationManager . emptyString
enabled: startSoloMinerButton . enabled
onClicked: {
soloMinerThreadsLine . text = idealThreadCount
2019-04-16 14:35:30 +00:00
appWindow . showStatusMessage ( qsTr ( "Set to use all threads" ) + translationManager . emptyString , 3 )
2019-03-12 23:32:11 +00:00
}
}
}
2017-03-02 14:44:37 +00:00
2019-03-12 23:32:11 +00:00
RowLayout {
MoneroComponents . CheckBox {
id: backgroundMining
enabled: startSoloMinerButton . enabled
checked: persistentSettings . allow_background_mining
onClicked: { persistentSettings . allow_background_mining = checked }
text: qsTr ( "Background mining (experimental)" ) + translationManager . emptyString
}
}
2016-12-28 21:20:05 +00:00
2019-03-12 23:32:11 +00:00
RowLayout {
// Disable this option until stable
visible: false
MoneroComponents . CheckBox {
id: ignoreBattery
enabled: startSoloMinerButton . enabled
checked: ! persistentSettings . miningIgnoreBattery
onClicked: { persistentSettings . miningIgnoreBattery = ! checked }
text: qsTr ( "Enable mining when running on battery" ) + translationManager . emptyString
2016-12-28 21:20:05 +00:00
}
}
2018-12-18 05:04:16 +00:00
}
2016-12-28 21:20:05 +00:00
2019-03-12 23:32:11 +00:00
ColumnLayout {
Layout.alignment : Qt . AlignTop | Qt . AlignLeft
MoneroComponents . Label {
id: manageSoloMinerLabel
color: MoneroComponents . Style . defaultFontColor
text: qsTr ( "Manage miner" ) + translationManager . emptyString
fontSize: 16 * scaleRatio
wrapMode: Text . Wrap
Layout.preferredWidth: manageSoloMinerLabel . textWidth
2016-12-28 21:20:05 +00:00
}
}
2019-03-12 23:32:11 +00:00
ColumnLayout {
Layout.fillWidth: true
spacing: 16 * scaleRatio
RowLayout {
MoneroComponents . StandardButton {
visible: true
id: startSoloMinerButton
small: true
text: qsTr ( "Start mining" ) + translationManager . emptyString
onClicked: {
var success = walletManager . startMining ( appWindow . currentWallet . address ( 0 , 0 ) , soloMinerThreadsLine . text , persistentSettings . allow_background_mining , persistentSettings . miningIgnoreBattery )
if ( success ) {
update ( )
} else {
errorPopup . title = qsTr ( "Error starting mining" ) + translationManager . emptyString ;
2019-04-16 14:35:30 +00:00
errorPopup . text = qsTr ( "Couldn't start mining.<br>" ) + translationManager . emptyString
2019-03-12 23:32:11 +00:00
if ( ! walletManager . isDaemonLocal ( appWindow . currentDaemonAddress ) )
2019-04-16 14:35:30 +00:00
errorPopup . text += qsTr ( "Mining is only available on local daemons. Run a local daemon to be able to mine.<br>" ) + translationManager . emptyString
2019-03-12 23:32:11 +00:00
errorPopup . icon = StandardIcon . Critical
errorPopup . open ( )
}
}
}
2018-12-18 05:04:16 +00:00
2019-03-12 23:32:11 +00:00
MoneroComponents . StandardButton {
visible: true
id: stopSoloMinerButton
small: true
text: qsTr ( "Stop mining" ) + translationManager . emptyString
onClicked: {
walletManager . stopMining ( )
update ( )
}
}
}
2018-12-18 05:04:16 +00:00
}
2019-03-12 23:32:11 +00:00
ColumnLayout {
Layout.fillWidth: true
Layout.alignment : Qt . AlignTop | Qt . AlignLeft
MoneroComponents . Label {
id: statusLabel
color: MoneroComponents . Style . defaultFontColor
text: qsTr ( "Status" ) + translationManager . emptyString
fontSize: 16 * scaleRatio
}
}
ColumnLayout {
Layout.fillWidth: true
spacing: 16 * scaleRatio
MoneroComponents . LineEditMulti {
id: statusText
Layout.minimumWidth: 300 * scaleRatio
text: qsTr ( "Not mining" ) + translationManager . emptyString
borderDisabled: true
readOnly: true
wrapMode: Text . Wrap
inputPaddingLeft: 0
}
2018-12-18 05:04:16 +00:00
}
2016-12-28 21:20:05 +00:00
}
}
function updateStatusText ( ) {
2018-12-28 04:42:37 +00:00
if ( appWindow . isMining ) {
2018-12-18 05:04:16 +00:00
statusText . text = qsTr ( "Mining at %1 H/s" ) . arg ( walletManager . miningHashRate ( ) ) + translationManager . emptyString ;
2016-12-28 21:20:05 +00:00
}
2018-12-18 05:04:16 +00:00
else {
statusText . text = qsTr ( "Not mining" ) + translationManager . emptyString ;
2016-12-28 21:20:05 +00:00
}
}
function update ( ) {
2019-03-12 23:32:11 +00:00
var daemonReady = walletManager . isDaemonLocal ( appWindow . currentDaemonAddress ) && appWindow . daemonSynced
2018-12-28 04:42:37 +00:00
appWindow . isMining = walletManager . isMining ( )
2016-12-28 21:20:05 +00:00
updateStatusText ( )
2019-03-12 23:32:11 +00:00
startSoloMinerButton . enabled = ! appWindow . isMining && daemonReady
stopSoloMinerButton . enabled = ! startSoloMinerButton . enabled && daemonReady
2016-12-28 21:20:05 +00:00
}
2018-12-18 05:04:16 +00:00
MoneroComponents . StandardDialog {
2016-12-28 21:20:05 +00:00
id: errorPopup
cancelVisible: false
}
Timer {
id: timer
interval: 2000 ; running: false ; repeat: true
onTriggered: update ( )
}
function onPageCompleted ( ) {
console . log ( "Mining page loaded" ) ;
update ( )
2017-12-11 21:44:01 +00:00
timer . running = walletManager . isDaemonLocal ( appWindow . currentDaemonAddress )
2016-12-28 21:20:05 +00:00
}
2018-12-18 05:04:16 +00:00
2016-12-28 21:20:05 +00:00
function onPageClosed ( ) {
timer . running = false
}
2014-07-07 17:08:30 +00:00
}