// Copyright (c) 2014-2015, The Monero Project // // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import QtQuick 2.0 import QtQuick.Layouts 1.1 import QtQuick.Dialogs 1.2 import "../components" import moneroComponents.Wallet 1.0 Rectangle { id: root 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: 10 anchors.left: parent.left anchors.top: parent.top anchors.right: parent.right anchors.bottom: parent.bottom spacing: 20 // solo ColumnLayout { id: soloBox anchors.margins: 40 anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top spacing: 20 Label { id: soloTitleLabel fontSize: 24 text: qsTr("Solo mining") + translationManager.emptyString } Label { id: soloLocalDaemonsLabel fontSize: 18 color: "#D02020" text: qsTr("(only available for local daemons)") visible: !isDaemonLocal() } Text { id: soloMainLabel text: qsTr("Mining helps the Monero network build resilience.
") + qsTr("The more mining is done, the harder it is to attack the network.
") + qsTr("Mining also gives you a small chance to earn some Monero.
") + qsTr("Your computer will search for Monero block solutions.
") + qsTr("If you find a block, you will get the associated reward.
") + translationManager.emptyString wrapMode: Text.Wrap } RowLayout { id: soloMinerThreadsRow Label { id: soloMinerThreadsLabel color: "#4A4949" text: qsTr("CPU threads") + translationManager.emptyString fontSize: 16 Layout.preferredWidth: 120 } LineEdit { id: soloMinerThreadsLine Layout.preferredWidth: 200 text: "1" placeholderText: qsTr("(optional)") + translationManager.emptyString validator: IntValidator { bottom: 1 } } } RowLayout { // Disable this option until stable visible: false Layout.leftMargin: 125 CheckBox { id: backgroundMining enabled: startSoloMinerButton.enabled checked: persistentSettings.allow_background_mining onClicked: {persistentSettings.allow_background_mining = checked} text: qsTr("Background mining (experimental)") + translationManager.emptyString checkedIcon: "../images/checkedVioletIcon.png" uncheckedIcon: "../images/uncheckedIcon.png" } } RowLayout { // Disable this option until stable visible: false Layout.leftMargin: 125 CheckBox { id: ignoreBattery enabled: startSoloMinerButton.enabled checked: !persistentSettings.miningIgnoreBattery onClicked: {persistentSettings.miningIgnoreBattery = !checked} text: qsTr("Enable mining when running on battery") + translationManager.emptyString checkedIcon: "../images/checkedVioletIcon.png" uncheckedIcon: "../images/uncheckedIcon.png" } } RowLayout { Label { id: manageSoloMinerLabel color: "#4A4949" text: qsTr("Manage miner") + translationManager.emptyString fontSize: 16 } StandardButton { visible: true //enabled: !walletManager.isMining() id: startSoloMinerButton width: 110 text: qsTr("Start mining") + translationManager.emptyString shadowReleasedColor: "#FF4304" shadowPressedColor: "#B32D00" releasedColor: "#FF6C3C" pressedColor: "#FF4304" onClicked: { var success = walletManager.startMining(appWindow.currentWallet.address, soloMinerThreadsLine.text, persistentSettings.allow_background_mining, persistentSettings.miningIgnoreBattery) if (success) { update() } else { errorPopup.title = qsTr("Error starting mining") + translationManager.emptyString; errorPopup.text = qsTr("Couldn't start mining.
") if (!isDaemonLocal()) errorPopup.text += qsTr("Mining is only available on local daemons. Run a local daemon to be able to mine.
") errorPopup.icon = StandardIcon.Critical errorPopup.open() } } } StandardButton { visible: true //enabled: walletManager.isMining() id: stopSoloMinerButton width: 110 text: qsTr("Stop mining") + translationManager.emptyString shadowReleasedColor: "#FF4304" shadowPressedColor: "#B32D00" releasedColor: "#FF6C3C" pressedColor: "#FF4304" onClicked: { walletManager.stopMining() update() } } } } Text { id: statusText anchors.leftMargin: 40 anchors.topMargin: 17 text: qsTr("Status: not mining") textFormat: Text.RichText wrapMode: Text.Wrap } } function updateStatusText() { var text = "" if (walletManager.isMining()) { if (text !== "") text += "
"; text += qsTr("Mining at %1 H/s").arg(walletManager.miningHashRate()) } if (text === "") { text += qsTr("Not mining") + translationManager.emptyString; } statusText.text = qsTr("Status: ") + text } function update() { updateStatusText() startSoloMinerButton.enabled = !walletManager.isMining() stopSoloMinerButton.enabled = !startSoloMinerButton.enabled } StandardDialog { id: errorPopup cancelVisible: false } Timer { id: timer interval: 2000; running: false; repeat: true onTriggered: update() } function onPageCompleted() { console.log("Mining page loaded"); update() timer.running = isDaemonLocal() } function onPageClosed() { timer.running = false } }