From 0ea6f13891cff45d1da7cb23a5e07a2080827b78 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Mon, 5 Jun 2017 18:16:12 +0200 Subject: Add a messageHandler to take care of qDebug & friends on QML all qDebug / qCDebug and friends now will be properly logged into developer -> log, on QML. Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- mobile-widgets/qml/Log.qml | 17 ++++++----- qt-models/CMakeLists.txt | 1 + qt-models/messagehandlermodel.cpp | 59 +++++++++++++++++++++++++++++++++++++++ qt-models/messagehandlermodel.h | 29 +++++++++++++++++++ subsurface-mobile-helper.cpp | 2 ++ 5 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 qt-models/messagehandlermodel.cpp create mode 100644 qt-models/messagehandlermodel.h diff --git a/mobile-widgets/qml/Log.qml b/mobile-widgets/qml/Log.qml index 6cd2150d1..ac848961b 100644 --- a/mobile-widgets/qml/Log.qml +++ b/mobile-widgets/qml/Log.qml @@ -4,6 +4,7 @@ import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 import QtQuick.Layouts 1.1 import QtQuick.Window 2.2 +import QtQuick.Controls 2.1 import org.subsurfacedivelog.mobile 1.0 import org.kde.kirigami 2.0 as Kirigami @@ -21,14 +22,16 @@ Kirigami.ScrollablePage { Kirigami.Heading { text: qsTr("Application Log") } - Kirigami.Label { - id: logContent - width: parent.width - Layout.preferredWidth: parent.width - Layout.maximumWidth: parent.width - wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere - text: manager.logText + + ListView { + width: parent.width; + height: 500 + model: logModel + delegate : Text { + text : message + } } + Rectangle { color: "transparent" height: Kirigami.Units.gridUnit * 2 diff --git a/qt-models/CMakeLists.txt b/qt-models/CMakeLists.txt index cbdf47501..90b6da433 100644 --- a/qt-models/CMakeLists.txt +++ b/qt-models/CMakeLists.txt @@ -23,6 +23,7 @@ set(SUBSURFACE_MODELS_LIB_SRCS divelistmodel.cpp gpslistmodel.cpp diveimportedmodel.cpp + messagehandlermodel.cpp ) source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS}) diff --git a/qt-models/messagehandlermodel.cpp b/qt-models/messagehandlermodel.cpp new file mode 100644 index 000000000..daedad897 --- /dev/null +++ b/qt-models/messagehandlermodel.cpp @@ -0,0 +1,59 @@ +#include "messagehandlermodel.h" + +void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) +{ + MessageHandlerModel::self()->addLog(type, msg); +} + +MessageHandlerModel * MessageHandlerModel::self() +{ + static MessageHandlerModel *self = new MessageHandlerModel(); + return self; +} + +MessageHandlerModel::MessageHandlerModel(QObject *parent) +{ + // no more than one message handler. + qInstallMessageHandler(logMessageHandler); +} + +int MessageHandlerModel::rowCount(const QModelIndex& parent) const +{ + Q_UNUSED(parent); + return m_data.size(); +} + +#include + +void MessageHandlerModel::addLog(QtMsgType type, const QString& message) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + m_data.append({message, type}); + endInsertRows(); +} + +QVariant MessageHandlerModel::data(const QModelIndex& idx, int role) const +{ + switch(role) { + case Message: + case Qt::DisplayRole: + return m_data.at(idx.row()).message; + } + return QVariant(QString("Role: %1").arg(role)); +}; + +QHash MessageHandlerModel::roleNames() const { + static QHash roles = { + {Message, "message"}, + {Severity, "severity"} + }; + return roles; +}; + +void MessageHandlerModel::reset() +{ + beginRemoveRows(QModelIndex(), 0, m_data.size()-1); + m_data.clear(); + endRemoveRows(); + +} diff --git a/qt-models/messagehandlermodel.h b/qt-models/messagehandlermodel.h new file mode 100644 index 000000000..7fb5c6515 --- /dev/null +++ b/qt-models/messagehandlermodel.h @@ -0,0 +1,29 @@ +#ifndef MESSAGEHANDLERMODEL_H +#define MESSAGEHANDLERMODEL_H + +#include + + +class MessageHandlerModel : public QAbstractListModel { + Q_OBJECT +public: + static MessageHandlerModel *self(); + enum MsgTypes {Message = Qt::UserRole + 1, Severity}; + int rowCount(const QModelIndex& parent = QModelIndex()) const override; + QVariant data(const QModelIndex& idx, int role) const override; + QHash roleNames() const override; + void addLog(QtMsgType type, const QString& message); + + /* call this to clear the debug data */ + Q_INVOKABLE void reset(); + +private: + MessageHandlerModel(QObject *parent = 0); + struct MessageData { + QString message; + QtMsgType type; + }; + QVector m_data; +}; + +#endif diff --git a/subsurface-mobile-helper.cpp b/subsurface-mobile-helper.cpp index 7d9037775..00c0e2c08 100644 --- a/subsurface-mobile-helper.cpp +++ b/subsurface-mobile-helper.cpp @@ -23,6 +23,7 @@ #include "mobile-widgets/qmlprofile.h" #include "core/downloadfromdcthread.h" #include "qt-models/diveimportedmodel.h" +#include "qt-models/messagehandlermodel.h" #include "mobile-widgets/qml/kirigami/src/kirigamiplugin.h" @@ -74,6 +75,7 @@ void run_ui() ctxt->setContextProperty("diveModel", sortModel); ctxt->setContextProperty("gpsModel", gpsSortModel); ctxt->setContextProperty("vendorList", vendorList); + ctxt->setContextProperty("logModel", MessageHandlerModel::self()); engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml"))); qqWindowObject = engine.rootObjects().value(0); -- cgit v1.2.3-70-g09d2