From 94e8f3ac4c158f0f022bb18ac5b88ba7279615e8 Mon Sep 17 00:00:00 2001 From: "moneromooo.monero" Date: Wed, 28 Dec 2016 21:20:05 +0000 Subject: [PATCH] Add mining screen We want to make it easy for people to mine --- LeftPanel.qml | 36 +++--- MiddlePanel.qml | 3 +- main.qml | 5 +- pages/Mining.qml | 189 +++++++++++++++++++++++++++++- src/libwalletqt/WalletManager.cpp | 15 +++ src/libwalletqt/WalletManager.h | 4 + 6 files changed, 228 insertions(+), 24 deletions(-) diff --git a/LeftPanel.qml b/LeftPanel.qml index d4871059..ef908cc7 100644 --- a/LeftPanel.qml +++ b/LeftPanel.qml @@ -316,50 +316,50 @@ Rectangle { height: 1 } - /* // ------------- Mining tab --------------- + // ------------- Advanced tab --------------- MenuButton { - id: miningButton + id: advancedButton anchors.left: parent.left anchors.right: parent.right - text: qsTr("Mining") + translationManager.emptyString - symbol: qsTr("M") + translationManager.emptyString - dotColor: "#FFD781" + text: qsTr("Advanced") + translationManager.emptyString + symbol: qsTr("A") + translationManager.emptyString + dotColor: "#AAFFBB" onClicked: { parent.previousButton.checked = false - parent.previousButton = miningButton - panel.miningClicked() + parent.previousButton = advancedButton } } - Rectangle { anchors.left: parent.left anchors.right: parent.right anchors.leftMargin: 16 - color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#505050" + color: "#505050" height: 1 } - */ - // ------------- Advanced tab --------------- + + // ------------- Mining tab --------------- MenuButton { - id: advancedButton + id: miningButton anchors.left: parent.left anchors.right: parent.right - text: qsTr("Advanced") + translationManager.emptyString - symbol: qsTr("A") + translationManager.emptyString - dotColor: "#AAFFBB" + text: qsTr("Mining") + translationManager.emptyString + symbol: qsTr("M") + translationManager.emptyString + dotColor: "#FFD781" + under: advancedButton onClicked: { parent.previousButton.checked = false - parent.previousButton = advancedButton + parent.previousButton = miningButton + panel.miningClicked() } } + Rectangle { anchors.left: parent.left anchors.right: parent.right anchors.leftMargin: 16 - color: "#505050" + color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#505050" height: 1 } - // ------------- TxKey tab --------------- MenuButton { id: txkeyButton diff --git a/MiddlePanel.qml b/MiddlePanel.qml index b21da0c0..f8e7c8ad 100644 --- a/MiddlePanel.qml +++ b/MiddlePanel.qml @@ -51,6 +51,7 @@ Rectangle { property History historyView: History { } property Sign signView: Sign { } property Settings settingsView: Settings { } + property Mining miningView: Mining { } property AddressBook addressBookView: AddressBook { } @@ -143,7 +144,7 @@ Rectangle { PropertyChanges { target: root; currentView: settingsView } }, State { name: "Mining" - PropertyChanges { /*TODO*/ } + PropertyChanges { target: root; currentView: miningView } } ] diff --git a/main.qml b/main.qml index e3bc1871..ca231c40 100644 --- a/main.qml +++ b/main.qml @@ -362,7 +362,6 @@ ApplicationWindow { daemonRunning = false; } - function onWalletNewBlock(blockHeight) { // Update progress bar @@ -838,7 +837,7 @@ ApplicationWindow { onTxkeyClicked: middlePanel.state = "TxKey" onHistoryClicked: middlePanel.state = "History" onAddressBookClicked: middlePanel.state = "AddressBook" - onMiningClicked: middlePanel.state = "Minning" + onMiningClicked: middlePanel.state = "Mining" onSignClicked: middlePanel.state = "Sign" onSettingsClicked: middlePanel.state = "Settings" } @@ -1120,7 +1119,7 @@ ApplicationWindow { onClosing: { // Close wallet non async on exit walletManager.closeWallet(); - // Stop daemon + // Stop daemon and pool miner daemonManager.stop(); } } diff --git a/pages/Mining.qml b/pages/Mining.qml index e9a50476..602ded59 100644 --- a/pages/Mining.qml +++ b/pages/Mining.qml @@ -27,8 +27,193 @@ // 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 { - width: 100 - height: 62 + 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 + + Rectangle { + anchors.fill: soloBox + color: "#00000000" + border.width: 2 + border.color: "#CCCCCC" + anchors.margins: -15 + } + + // solo + ColumnLayout { + id: soloBox + anchors.margins: 40 + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + + Label { + id: soloTitleLabel + fontSize: 24 + text: qsTr("Monero solo mining") + } + + 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("Moreover, mining gives you a small chance to earn some Monero.
") + + qsTr("Your computer will search for Monero block solutions.
") + + qsTr("If you find one, you will get the associated block reward.
") + + translationManager.emptyString + wrapMode: Text.Wrap + } + + RowLayout { + id: soloMinerThreadsRow + Label { + id: soloMinerThreadsLabel + color: "#4A4949" + text: qsTr("Solo miner threads") + translationManager.emptyString + fontSize: 16 + } + LineEdit { + id: soloMinerThreadsLine + Layout.preferredWidth: 200 + text: "1" + placeholderText: qsTr("(optional)") + translationManager.emptyString + validator: IntValidator { bottom: 1 } + } + } + + RowLayout { + Label { + id: manageSoloMinerLabel + color: "#4A4949" + text: qsTr("Manage solo 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) + 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 = true + + } + function onPageClosed() { + timer.running = false + } } diff --git a/src/libwalletqt/WalletManager.cpp b/src/libwalletqt/WalletManager.cpp index 5a090ec3..fafed695 100644 --- a/src/libwalletqt/WalletManager.cpp +++ b/src/libwalletqt/WalletManager.cpp @@ -227,6 +227,21 @@ double WalletManager::miningHashRate() const return m_pimpl->miningHashRate(); } +bool WalletManager::isMining() const +{ + return m_pimpl->isMining(); +} + +bool WalletManager::startMining(const QString &address, quint32 threads) +{ + return m_pimpl->startMining(address.toStdString(), threads); +} + +bool WalletManager::stopMining() +{ + return m_pimpl->stopMining(); +} + QString WalletManager::resolveOpenAlias(const QString &address) const { bool dnssec_valid = false; diff --git a/src/libwalletqt/WalletManager.h b/src/libwalletqt/WalletManager.h index d06b4f6c..9e233b6f 100644 --- a/src/libwalletqt/WalletManager.h +++ b/src/libwalletqt/WalletManager.h @@ -103,6 +103,10 @@ public: Q_INVOKABLE quint64 blockchainTargetHeight() const; Q_INVOKABLE double miningHashRate() const; + Q_INVOKABLE bool isMining() const; + Q_INVOKABLE bool startMining(const QString &address, quint32 threads); + Q_INVOKABLE bool stopMining(); + // QML missing such functionality, implementing these helpers here Q_INVOKABLE QString urlToLocalPath(const QUrl &url) const; Q_INVOKABLE QUrl localPathToUrl(const QString &path) const;