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 <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2017-06-05 18:16:12 +02:00 committed by Dirk Hohndel
parent e7cd1785c4
commit 0ea6f13891
5 changed files with 101 additions and 7 deletions

View file

@ -4,6 +4,7 @@ import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Window 2.2 import QtQuick.Window 2.2
import QtQuick.Controls 2.1
import org.subsurfacedivelog.mobile 1.0 import org.subsurfacedivelog.mobile 1.0
import org.kde.kirigami 2.0 as Kirigami import org.kde.kirigami 2.0 as Kirigami
@ -21,14 +22,16 @@ Kirigami.ScrollablePage {
Kirigami.Heading { Kirigami.Heading {
text: qsTr("Application Log") text: qsTr("Application Log")
} }
Kirigami.Label {
id: logContent ListView {
width: parent.width width: parent.width;
Layout.preferredWidth: parent.width height: 500
Layout.maximumWidth: parent.width model: logModel
wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere delegate : Text {
text: manager.logText text : message
}
} }
Rectangle { Rectangle {
color: "transparent" color: "transparent"
height: Kirigami.Units.gridUnit * 2 height: Kirigami.Units.gridUnit * 2

View file

@ -23,6 +23,7 @@ set(SUBSURFACE_MODELS_LIB_SRCS
divelistmodel.cpp divelistmodel.cpp
gpslistmodel.cpp gpslistmodel.cpp
diveimportedmodel.cpp diveimportedmodel.cpp
messagehandlermodel.cpp
) )
source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS}) source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS})

View file

@ -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 <iostream>
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<int, QByteArray> MessageHandlerModel::roleNames() const {
static QHash<int, QByteArray> roles = {
{Message, "message"},
{Severity, "severity"}
};
return roles;
};
void MessageHandlerModel::reset()
{
beginRemoveRows(QModelIndex(), 0, m_data.size()-1);
m_data.clear();
endRemoveRows();
}

View file

@ -0,0 +1,29 @@
#ifndef MESSAGEHANDLERMODEL_H
#define MESSAGEHANDLERMODEL_H
#include <QAbstractListModel>
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<int, QByteArray> 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<MessageData> m_data;
};
#endif

View file

@ -23,6 +23,7 @@
#include "mobile-widgets/qmlprofile.h" #include "mobile-widgets/qmlprofile.h"
#include "core/downloadfromdcthread.h" #include "core/downloadfromdcthread.h"
#include "qt-models/diveimportedmodel.h" #include "qt-models/diveimportedmodel.h"
#include "qt-models/messagehandlermodel.h"
#include "mobile-widgets/qml/kirigami/src/kirigamiplugin.h" #include "mobile-widgets/qml/kirigami/src/kirigamiplugin.h"
@ -74,6 +75,7 @@ void run_ui()
ctxt->setContextProperty("diveModel", sortModel); ctxt->setContextProperty("diveModel", sortModel);
ctxt->setContextProperty("gpsModel", gpsSortModel); ctxt->setContextProperty("gpsModel", gpsSortModel);
ctxt->setContextProperty("vendorList", vendorList); ctxt->setContextProperty("vendorList", vendorList);
ctxt->setContextProperty("logModel", MessageHandlerModel::self());
engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml"))); engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml")));
qqWindowObject = engine.rootObjects().value(0); qqWindowObject = engine.rootObjects().value(0);