mirror of
https://github.com/monero-project/monero-gui.git
synced 2024-12-23 03:59:38 +00:00
Add mining screen
We want to make it easy for people to mine
This commit is contained in:
parent
1cd7dd622f
commit
94e8f3ac4c
6 changed files with 233 additions and 29 deletions
|
@ -316,29 +316,6 @@ Rectangle {
|
||||||
height: 1
|
height: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
/* // ------------- Mining tab ---------------
|
|
||||||
MenuButton {
|
|
||||||
id: miningButton
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
text: qsTr("Mining") + translationManager.emptyString
|
|
||||||
symbol: qsTr("M") + translationManager.emptyString
|
|
||||||
dotColor: "#FFD781"
|
|
||||||
onClicked: {
|
|
||||||
parent.previousButton.checked = false
|
|
||||||
parent.previousButton = miningButton
|
|
||||||
panel.miningClicked()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.leftMargin: 16
|
|
||||||
color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#505050"
|
|
||||||
height: 1
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// ------------- Advanced tab ---------------
|
// ------------- Advanced tab ---------------
|
||||||
MenuButton {
|
MenuButton {
|
||||||
id: advancedButton
|
id: advancedButton
|
||||||
|
@ -360,6 +337,29 @@ Rectangle {
|
||||||
height: 1
|
height: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------- Mining tab ---------------
|
||||||
|
MenuButton {
|
||||||
|
id: miningButton
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
text: qsTr("Mining") + translationManager.emptyString
|
||||||
|
symbol: qsTr("M") + translationManager.emptyString
|
||||||
|
dotColor: "#FFD781"
|
||||||
|
under: advancedButton
|
||||||
|
onClicked: {
|
||||||
|
parent.previousButton.checked = false
|
||||||
|
parent.previousButton = miningButton
|
||||||
|
panel.miningClicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.leftMargin: 16
|
||||||
|
color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#505050"
|
||||||
|
height: 1
|
||||||
|
}
|
||||||
// ------------- TxKey tab ---------------
|
// ------------- TxKey tab ---------------
|
||||||
MenuButton {
|
MenuButton {
|
||||||
id: txkeyButton
|
id: txkeyButton
|
||||||
|
|
|
@ -51,6 +51,7 @@ Rectangle {
|
||||||
property History historyView: History { }
|
property History historyView: History { }
|
||||||
property Sign signView: Sign { }
|
property Sign signView: Sign { }
|
||||||
property Settings settingsView: Settings { }
|
property Settings settingsView: Settings { }
|
||||||
|
property Mining miningView: Mining { }
|
||||||
property AddressBook addressBookView: AddressBook { }
|
property AddressBook addressBookView: AddressBook { }
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,7 +144,7 @@ Rectangle {
|
||||||
PropertyChanges { target: root; currentView: settingsView }
|
PropertyChanges { target: root; currentView: settingsView }
|
||||||
}, State {
|
}, State {
|
||||||
name: "Mining"
|
name: "Mining"
|
||||||
PropertyChanges { /*TODO*/ }
|
PropertyChanges { target: root; currentView: miningView }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
5
main.qml
5
main.qml
|
@ -362,7 +362,6 @@ ApplicationWindow {
|
||||||
daemonRunning = false;
|
daemonRunning = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function onWalletNewBlock(blockHeight) {
|
function onWalletNewBlock(blockHeight) {
|
||||||
|
|
||||||
// Update progress bar
|
// Update progress bar
|
||||||
|
@ -838,7 +837,7 @@ ApplicationWindow {
|
||||||
onTxkeyClicked: middlePanel.state = "TxKey"
|
onTxkeyClicked: middlePanel.state = "TxKey"
|
||||||
onHistoryClicked: middlePanel.state = "History"
|
onHistoryClicked: middlePanel.state = "History"
|
||||||
onAddressBookClicked: middlePanel.state = "AddressBook"
|
onAddressBookClicked: middlePanel.state = "AddressBook"
|
||||||
onMiningClicked: middlePanel.state = "Minning"
|
onMiningClicked: middlePanel.state = "Mining"
|
||||||
onSignClicked: middlePanel.state = "Sign"
|
onSignClicked: middlePanel.state = "Sign"
|
||||||
onSettingsClicked: middlePanel.state = "Settings"
|
onSettingsClicked: middlePanel.state = "Settings"
|
||||||
}
|
}
|
||||||
|
@ -1120,7 +1119,7 @@ ApplicationWindow {
|
||||||
onClosing: {
|
onClosing: {
|
||||||
// Close wallet non async on exit
|
// Close wallet non async on exit
|
||||||
walletManager.closeWallet();
|
walletManager.closeWallet();
|
||||||
// Stop daemon
|
// Stop daemon and pool miner
|
||||||
daemonManager.stop();
|
daemonManager.stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
189
pages/Mining.qml
189
pages/Mining.qml
|
@ -27,8 +27,193 @@
|
||||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
|
import QtQuick.Layouts 1.1
|
||||||
|
import QtQuick.Dialogs 1.2
|
||||||
|
import "../components"
|
||||||
|
import moneroComponents.Wallet 1.0
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: 100
|
id: root
|
||||||
height: 62
|
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.<br>")
|
||||||
|
+ qsTr("The more mining is done, the harder it is to attack the network.<br>")
|
||||||
|
+ qsTr("Moreover, mining gives you a small chance to earn some Monero.<br>")
|
||||||
|
+ qsTr("Your computer will search for Monero block solutions.<br>")
|
||||||
|
+ qsTr("If you find one, you will get the associated block reward.<br>")
|
||||||
|
+ 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.<br>")
|
||||||
|
if (!isDaemonLocal())
|
||||||
|
errorPopup.text += qsTr("Mining is only available on local daemons. Run a local daemon to be able to mine.<br>")
|
||||||
|
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 += "<br>";
|
||||||
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -227,6 +227,21 @@ double WalletManager::miningHashRate() const
|
||||||
return m_pimpl->miningHashRate();
|
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
|
QString WalletManager::resolveOpenAlias(const QString &address) const
|
||||||
{
|
{
|
||||||
bool dnssec_valid = false;
|
bool dnssec_valid = false;
|
||||||
|
|
|
@ -103,6 +103,10 @@ public:
|
||||||
Q_INVOKABLE quint64 blockchainTargetHeight() const;
|
Q_INVOKABLE quint64 blockchainTargetHeight() const;
|
||||||
Q_INVOKABLE double miningHashRate() 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
|
// QML missing such functionality, implementing these helpers here
|
||||||
Q_INVOKABLE QString urlToLocalPath(const QUrl &url) const;
|
Q_INVOKABLE QString urlToLocalPath(const QUrl &url) const;
|
||||||
Q_INVOKABLE QUrl localPathToUrl(const QString &path) const;
|
Q_INVOKABLE QUrl localPathToUrl(const QString &path) const;
|
||||||
|
|
Loading…
Reference in a new issue