mirror of
https://github.com/monero-project/monero-gui.git
synced 2024-12-12 19:36:32 +02:00
parent
2e925b530b
commit
ef1d7f92f7
148
components/DaemonConsole.qml
Normal file
148
components/DaemonConsole.qml
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
// 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.Controls 1.4
|
||||||
|
import QtQuick.Dialogs 1.2
|
||||||
|
import QtQuick.Layouts 1.1
|
||||||
|
import QtQuick.Controls.Styles 1.4
|
||||||
|
import QtQuick.Window 2.0
|
||||||
|
|
||||||
|
import "../components" as MoneroComponents
|
||||||
|
|
||||||
|
Window {
|
||||||
|
id: root
|
||||||
|
modality: Qt.ApplicationModal
|
||||||
|
flags: Qt.Window | Qt.FramelessWindowHint
|
||||||
|
property alias title: dialogTitle.text
|
||||||
|
property alias text: dialogContent.text
|
||||||
|
property alias content: root.text
|
||||||
|
property alias okVisible: okButton.visible
|
||||||
|
property alias textArea: dialogContent
|
||||||
|
property var icon
|
||||||
|
|
||||||
|
// same signals as Dialog has
|
||||||
|
signal accepted()
|
||||||
|
signal rejected()
|
||||||
|
|
||||||
|
|
||||||
|
function open() {
|
||||||
|
show()
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: implement without hardcoding sizes
|
||||||
|
width: 480
|
||||||
|
height: 280
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: mainLayout
|
||||||
|
spacing: 10
|
||||||
|
anchors { fill: parent; margins: 35 }
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: column
|
||||||
|
//anchors {fill: parent; margins: 16 }
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: dialogTitle
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.family: "Arial"
|
||||||
|
color: "#555555"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
TextArea {
|
||||||
|
id : dialogContent
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
font.family: "Arial"
|
||||||
|
textFormat: TextEdit.AutoText
|
||||||
|
readOnly: true
|
||||||
|
font.pixelSize: 12
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ok/Cancel buttons
|
||||||
|
RowLayout {
|
||||||
|
id: buttons
|
||||||
|
spacing: 60
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
|
||||||
|
MoneroComponents.StandardButton {
|
||||||
|
id: okButton
|
||||||
|
width: 120
|
||||||
|
fontSize: 14
|
||||||
|
shadowReleasedColor: "#FF4304"
|
||||||
|
shadowPressedColor: "#B32D00"
|
||||||
|
releasedColor: "#FF6C3C"
|
||||||
|
pressedColor: "#FF4304"
|
||||||
|
text: qsTr("Close")
|
||||||
|
KeyNavigation.tab: cancelButton
|
||||||
|
onClicked: {
|
||||||
|
root.close()
|
||||||
|
root.accepted()
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MoneroComponents.LineEdit {
|
||||||
|
id: sendCommandText
|
||||||
|
width: 300
|
||||||
|
placeholderText: qsTr("command + enter (e.g help)")
|
||||||
|
onAccepted: {
|
||||||
|
if(text.length > 0)
|
||||||
|
daemonManager.sendCommand(text,currentWallet.testnet);
|
||||||
|
text = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status button
|
||||||
|
// MoneroComponents.StandardButton {
|
||||||
|
// id: sendCommandButton
|
||||||
|
// enabled: sendCommandText.text.length > 0
|
||||||
|
// fontSize: 14
|
||||||
|
// shadowReleasedColor: "#FF4304"
|
||||||
|
// shadowPressedColor: "#B32D00"
|
||||||
|
// releasedColor: "#FF6C3C"
|
||||||
|
// pressedColor: "#FF4304"
|
||||||
|
// text: qsTr("Send command")
|
||||||
|
// onClicked: {
|
||||||
|
// daemonManager.sendCommand(sendCommandText.text,currentWallet.testnet);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -38,6 +38,7 @@ Item {
|
|||||||
property int fontSize: 18
|
property int fontSize: 18
|
||||||
property bool error: false
|
property bool error: false
|
||||||
signal editingFinished()
|
signal editingFinished()
|
||||||
|
signal accepted();
|
||||||
|
|
||||||
height: 37
|
height: 37
|
||||||
|
|
||||||
@ -69,5 +70,6 @@ Item {
|
|||||||
anchors.rightMargin: 30
|
anchors.rightMargin: 30
|
||||||
font.pixelSize: parent.fontSize
|
font.pixelSize: parent.fontSize
|
||||||
onEditingFinished: item.editingFinished()
|
onEditingFinished: item.editingFinished()
|
||||||
|
onAccepted: item.accepted();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,6 +241,23 @@ Rectangle {
|
|||||||
daemonConsolePopup.open();
|
daemonConsolePopup.open();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StandardButton {
|
||||||
|
visible: true
|
||||||
|
id: daemonStatusButton
|
||||||
|
text: qsTr("Status") + translationManager.emptyString
|
||||||
|
shadowReleasedColor: "#FF4304"
|
||||||
|
shadowPressedColor: "#B32D00"
|
||||||
|
releasedColor: "#FF6C3C"
|
||||||
|
pressedColor: "#FF4304"
|
||||||
|
onClicked: {
|
||||||
|
daemonManager.sendCommand("status",currentWallet.testnet);
|
||||||
|
daemonConsolePopup.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
@ -416,11 +433,10 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Daemon console
|
// Daemon console
|
||||||
StandardDialog {
|
DaemonConsole {
|
||||||
id: daemonConsolePopup
|
id: daemonConsolePopup
|
||||||
height:500
|
height:500
|
||||||
width:800
|
width:800
|
||||||
cancelVisible: false
|
|
||||||
title: qsTr("Daemon log")
|
title: qsTr("Daemon log")
|
||||||
onAccepted: {
|
onAccepted: {
|
||||||
close();
|
close();
|
||||||
|
1
qml.qrc
1
qml.qrc
@ -124,5 +124,6 @@
|
|||||||
<file>version.js</file>
|
<file>version.js</file>
|
||||||
<file>wizard/WizardPasswordUI.qml</file>
|
<file>wizard/WizardPasswordUI.qml</file>
|
||||||
<file>wizard/WizardCreateViewOnlyWallet.qml</file>
|
<file>wizard/WizardCreateViewOnlyWallet.qml</file>
|
||||||
|
<file>components/DaemonConsole.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@ -25,20 +25,6 @@ DaemonManager *DaemonManager::instance(const QStringList *args)
|
|||||||
|
|
||||||
bool DaemonManager::start(const QString &flags)
|
bool DaemonManager::start(const QString &flags)
|
||||||
{
|
{
|
||||||
//
|
|
||||||
QString process;
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
process = QApplication::applicationDirPath() + "/monerod.exe";
|
|
||||||
#elif defined(Q_OS_UNIX)
|
|
||||||
process = QApplication::applicationDirPath() + "/monerod";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (process.length() == 0) {
|
|
||||||
qDebug() << "no daemon binary defined for current platform";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// prepare command line arguments and pass to monerod
|
// prepare command line arguments and pass to monerod
|
||||||
QStringList arguments;
|
QStringList arguments;
|
||||||
foreach (const QString &str, m_clArgs) {
|
foreach (const QString &str, m_clArgs) {
|
||||||
@ -55,8 +41,8 @@ bool DaemonManager::start(const QString &flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
qDebug() << "starting monerod " + process;
|
qDebug() << "starting monerod " + m_monerod;
|
||||||
qDebug() << "With command line arguments " << arguments;
|
qDebug() << "With command line arguments " << m_monerod;
|
||||||
|
|
||||||
m_daemon = new QProcess();
|
m_daemon = new QProcess();
|
||||||
initialized = true;
|
initialized = true;
|
||||||
@ -66,7 +52,7 @@ bool DaemonManager::start(const QString &flags)
|
|||||||
connect (m_daemon, SIGNAL(readyReadStandardError()), this, SLOT(printError()));
|
connect (m_daemon, SIGNAL(readyReadStandardError()), this, SLOT(printError()));
|
||||||
|
|
||||||
// Start monerod
|
// Start monerod
|
||||||
m_daemon->start(process,arguments);
|
m_daemon->start(m_monerod, arguments);
|
||||||
bool started = m_daemon->waitForStarted();
|
bool started = m_daemon->waitForStarted();
|
||||||
|
|
||||||
// add state changed listener
|
// add state changed listener
|
||||||
@ -134,10 +120,47 @@ bool DaemonManager::running() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DaemonManager::sendCommand(const QString &cmd,bool testnet)
|
||||||
|
{
|
||||||
|
// If daemon is started by GUI - interactive mode
|
||||||
|
if (initialized && running()) {
|
||||||
|
m_daemon->write(cmd.toUtf8() +"\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// else send external command
|
||||||
|
QProcess p;
|
||||||
|
QString external_cmd = m_monerod + " " + cmd;
|
||||||
|
|
||||||
|
// Add nestnet flag if needed
|
||||||
|
if (testnet)
|
||||||
|
external_cmd += " --testnet";
|
||||||
|
external_cmd += "\n";
|
||||||
|
|
||||||
|
p.start(external_cmd);
|
||||||
|
bool started = p.waitForFinished(-1);
|
||||||
|
QString p_stdout = p.readAllStandardOutput();
|
||||||
|
qDebug() << p_stdout;
|
||||||
|
emit daemonConsoleUpdated(p_stdout);
|
||||||
|
|
||||||
|
return started;
|
||||||
|
}
|
||||||
|
|
||||||
DaemonManager::DaemonManager(QObject *parent)
|
DaemonManager::DaemonManager(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Platform depetent path to monerod
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
m_monerod = QApplication::applicationDirPath() + "/monerod.exe";
|
||||||
|
#elif defined(Q_OS_UNIX)
|
||||||
|
m_monerod = QApplication::applicationDirPath() + "/monerod";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (m_monerod.length() == 0) {
|
||||||
|
qCritical() << "no daemon binary defined for current platform";
|
||||||
|
m_has_daemon = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonManager::closing()
|
void DaemonManager::closing()
|
||||||
|
@ -18,6 +18,7 @@ public:
|
|||||||
|
|
||||||
// return true if daemon process is started
|
// return true if daemon process is started
|
||||||
Q_INVOKABLE bool running() const;
|
Q_INVOKABLE bool running() const;
|
||||||
|
Q_INVOKABLE bool sendCommand(const QString &cmd, bool testnet);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void daemonStarted();
|
void daemonStarted();
|
||||||
@ -37,6 +38,8 @@ private:
|
|||||||
static QStringList m_clArgs;
|
static QStringList m_clArgs;
|
||||||
QProcess *m_daemon;
|
QProcess *m_daemon;
|
||||||
bool initialized = false;
|
bool initialized = false;
|
||||||
|
QString m_monerod;
|
||||||
|
bool m_has_daemon = true;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,6 +98,11 @@ Wallet::Status Wallet::status() const
|
|||||||
return static_cast<Status>(m_walletImpl->status());
|
return static_cast<Status>(m_walletImpl->status());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Wallet::testnet() const
|
||||||
|
{
|
||||||
|
return m_walletImpl->testnet();
|
||||||
|
}
|
||||||
|
|
||||||
Wallet::ConnectionStatus Wallet::connected() const
|
Wallet::ConnectionStatus Wallet::connected() const
|
||||||
{
|
{
|
||||||
// cache connection status
|
// cache connection status
|
||||||
|
@ -25,6 +25,7 @@ class Wallet : public QObject
|
|||||||
Q_PROPERTY(QString seed READ getSeed)
|
Q_PROPERTY(QString seed READ getSeed)
|
||||||
Q_PROPERTY(QString seedLanguage READ getSeedLanguage)
|
Q_PROPERTY(QString seedLanguage READ getSeedLanguage)
|
||||||
Q_PROPERTY(Status status READ status)
|
Q_PROPERTY(Status status READ status)
|
||||||
|
Q_PROPERTY(bool testnet READ testnet)
|
||||||
Q_PROPERTY(ConnectionStatus connected READ connected)
|
Q_PROPERTY(ConnectionStatus connected READ connected)
|
||||||
Q_PROPERTY(bool synchronized READ synchronized)
|
Q_PROPERTY(bool synchronized READ synchronized)
|
||||||
Q_PROPERTY(QString errorString READ errorString)
|
Q_PROPERTY(QString errorString READ errorString)
|
||||||
@ -70,6 +71,9 @@ public:
|
|||||||
//! returns last operation's status
|
//! returns last operation's status
|
||||||
Status status() const;
|
Status status() const;
|
||||||
|
|
||||||
|
//! returns true testnet wallet.
|
||||||
|
bool testnet() const;
|
||||||
|
|
||||||
//! returns whether the wallet is connected, and version status
|
//! returns whether the wallet is connected, and version status
|
||||||
ConnectionStatus connected() const;
|
ConnectionStatus connected() const;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user