diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 4fb148412114354b337c0b8b6d50232eb51e35ec..9b924e3cb01aaaa516cec507fb9ad008958da845 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef QGC_ENABLE_BLUETOOTH #include @@ -485,7 +486,7 @@ bool QGCApplication::_initForNormalAppBoot(void) _qmlAppEngine = new QQmlApplicationEngine(this); _qmlAppEngine->addImportPath("qrc:/qml"); _qmlAppEngine->rootContext()->setContextProperty("joystickManager", toolbox()->joystickManager()); - _qmlAppEngine->rootContext()->setContextProperty("debugMessageModel", &AppMessages::getModel()); + _qmlAppEngine->rootContext()->setContextProperty("debugMessageModel", AppMessages::getModel()); _qmlAppEngine->load(QUrl(QStringLiteral("qrc:/qml/MainWindowNative.qml"))); #else // Start the user interface diff --git a/src/QmlControls/AppMessages.cc b/src/QmlControls/AppMessages.cc index 31fac6bc88f15ee238d2be873edc4e3f8fd35b61..1c8ae7ae2510ad354f7f0644a69f86ce9f016b9a 100644 --- a/src/QmlControls/AppMessages.cc +++ b/src/QmlControls/AppMessages.cc @@ -22,11 +22,14 @@ This file is part of the QGROUNDCONTROL project ======================================================================*/ #include "AppMessages.h" +#include #include -#include +#include +#include +AppLogModel AppLogModel::instance; static QtMessageHandler old_handler; -static QStringListModel debug_strings; +static AppLogModel &debug_strings = AppLogModel::getModel(); static void msgHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { @@ -51,7 +54,33 @@ void AppMessages::installHandler() old_handler = qInstallMessageHandler(msgHandler); } -QStringListModel& AppMessages::getModel() +AppLogModel *AppMessages::getModel() { - return debug_strings; + return &AppLogModel::getModel(); +} + +AppLogModel& AppLogModel::getModel() +{ + return instance; +} + +AppLogModel::AppLogModel() : QStringListModel() +{ +} + +void AppLogModel::writeMessages(const QUrl dest_file) +{ + const QString writebuffer(stringList().join('\n').append('\n')); + + QtConcurrent::run([dest_file, writebuffer] { + emit instance.writeStarted(); + bool success = false; + QFile file(dest_file.toLocalFile()); + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&file); + out << writebuffer; + success = out.status() == QTextStream::Ok; + } + emit instance.writeFinished(success); + }); } diff --git a/src/QmlControls/AppMessages.h b/src/QmlControls/AppMessages.h index 71704e664d703063f68e283ce502ecbedab4ae2b..e9b998705ae706af2ade63116a04c7423feaa9f4 100644 --- a/src/QmlControls/AppMessages.h +++ b/src/QmlControls/AppMessages.h @@ -23,11 +23,31 @@ This file is part of the QGROUNDCONTROL project #pragma once -class QStringListModel; +#include +#include +#include + +class AppLogModel : public QStringListModel +{ + Q_OBJECT +public: + static AppLogModel& getModel(); + + Q_INVOKABLE void writeMessages(const QUrl dest_file); + +signals: + void writeStarted(); + void writeFinished(bool success); + +private: + AppLogModel(); + static AppLogModel instance; +}; + class AppMessages { public: static void installHandler(); - static QStringListModel& getModel(); + static AppLogModel* getModel(); }; diff --git a/src/QmlControls/AppMessages.qml b/src/QmlControls/AppMessages.qml index 7de4c64cb0f8626a2bf207da110a4896847902b2..5390eab0bf1a410716366305dfa628854fbfbd92 100644 --- a/src/QmlControls/AppMessages.qml +++ b/src/QmlControls/AppMessages.qml @@ -93,8 +93,44 @@ QGCView { delegate: delegateItem } + FileDialog { + id: writeDialog + folder: shortcuts.home + nameFilters: ["Log files (*.txt)", "All Files (*)"] + selectExisting: false + title: "Select log save file" + onAccepted: { + debugMessageModel.writeMessages(fileUrl); + visible = false; + } + onRejected: visible = false + } + + Connections { + target: debugMessageModel + onWriteStarted: writeButton.enabled = false; + onWriteFinished: writeButton.enabled = true; + } + + QGCButton { + id: writeButton + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.margins: ScreenTools.defaultFontPixelWidth + onClicked: writeDialog.visible = true + text: "Save App Log" + } + + BusyIndicator { + id: writeBusy + anchors.bottom: writeButton.bottom + anchors.left: writeButton.right + height: writeButton.height + visible: !writeButton.enabled + } + QGCButton { - id: followTail + id: followTail anchors.bottom: parent.bottom anchors.right: parent.right anchors.margins: ScreenTools.defaultFontPixelWidth diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index d843ff5fed8092b806603bcf3d6fec4ad0469542..3dae012eda17b46c9cf34b541e4a97b3df743ed9 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -165,7 +165,7 @@ MainWindow::MainWindow() QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); _mainQmlWidgetHolder->setContextPropertyObject("controller", this); - _mainQmlWidgetHolder->setContextPropertyObject("debugMessageModel", &AppMessages::getModel()); + _mainQmlWidgetHolder->setContextPropertyObject("debugMessageModel", AppMessages::getModel()); _mainQmlWidgetHolder->setSource(QUrl::fromUserInput("qrc:qml/MainWindowHybrid.qml")); // Image provider