mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-20 06:45:27 +00:00
a181020b19
on iOS it is practically impossible to copy the App log to e.g. a mail! in iOS 11 the log file is stored within the subsurface container and you first need to copy (actually using the clipboard) out from there to the "normal" document shared space, before it can be used. At least iOS users (and I believe Android users) are not really used to work with files, so the process is not easy to document in an understandable way. The alternative is to provide a button, which simply puts the log on the general clipboard, allowing it to be pasted in a multitud of applications. Signed-off-by: Jan Iversen <jani@apache.org>
87 lines
2.1 KiB
C++
87 lines
2.1 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#include "messagehandlermodel.h"
|
|
|
|
/* based on logging bits from libdivecomputer */
|
|
#if !defined(Q_OS_ANDROID)
|
|
#define INFO(fmt, ...) fprintf(stderr, "INFO: " fmt "\n", ##__VA_ARGS__)
|
|
#else
|
|
#include <android/log.h>
|
|
#define INFO(fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, __FILE__, "INFO: " fmt "\n", ##__VA_ARGS__);
|
|
#endif
|
|
|
|
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
|
|
extern void writeToAppLogFile(QString logText);
|
|
#endif
|
|
|
|
void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
|
|
{
|
|
Q_UNUSED(context)
|
|
MessageHandlerModel::self()->addLog(type, msg);
|
|
}
|
|
|
|
MessageHandlerModel * MessageHandlerModel::self()
|
|
{
|
|
static MessageHandlerModel *self = new MessageHandlerModel();
|
|
return self;
|
|
}
|
|
|
|
MessageHandlerModel::MessageHandlerModel(QObject *parent)
|
|
{
|
|
Q_UNUSED(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();
|
|
INFO("%s", qPrintable(message));
|
|
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
|
|
writeToAppLogFile(message);
|
|
#endif
|
|
}
|
|
|
|
const QString MessageHandlerModel::logAsString()
|
|
{
|
|
QString copyString;
|
|
|
|
// Loop through m_data and build big string to be put on the clipboard
|
|
for(const MessageData &data: m_data)
|
|
copyString += data.message + "\n";
|
|
return copyString;
|
|
}
|
|
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();
|
|
|
|
}
|