File: messagedisplaymodel.cpp

package info (click to toggle)
gammaray 3.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 21,612 kB
  • sloc: cpp: 94,643; ansic: 2,227; sh: 336; python: 164; yacc: 90; lex: 82; xml: 61; makefile: 26
file content (123 lines) | stat: -rw-r--r-- 4,360 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
  messagedisplaymodel.cpp

  This file is part of GammaRay, the Qt application inspection and manipulation tool.

  SPDX-FileCopyrightText: 2015 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
  Author: Volker Krause <volker.krause@kdab.com>

  SPDX-License-Identifier: GPL-2.0-or-later

  Contact KDAB at <info@kdab.com> for commercial licensing options.
*/

#include "messagedisplaymodel.h"

#include <common/tools/messagehandler/messagemodelroles.h>

#include <QApplication>
#include <QStyle>

using namespace GammaRay;

QString typeToString(int type)
{
    switch (type) {
    case QtDebugMsg:
        return MessageDisplayModel::tr("Debug");
    case QtWarningMsg:
        return MessageDisplayModel::tr("Warning");
    case QtCriticalMsg:
        return MessageDisplayModel::tr("Critical");
    case QtFatalMsg:
        return MessageDisplayModel::tr("Fatal");
    case QtInfoMsg:
        return MessageDisplayModel::tr("Info");
    default:
        return MessageDisplayModel::tr("Unknown"); // never reached in theory
    }
}

MessageDisplayModel::MessageDisplayModel(QObject *parent)
    : QIdentityProxyModel(parent)
{
}

MessageDisplayModel::~MessageDisplayModel() = default;

QVariant MessageDisplayModel::data(const QModelIndex &proxyIndex, int role) const
{
    if (!proxyIndex.isValid())
        return QVariant();

    switch (role) {
    case Qt::DisplayRole:
        if (proxyIndex.column() == MessageModelColumn::File) {
            const auto srcIdx = mapToSource(proxyIndex);
            Q_ASSERT(srcIdx.isValid());

            const auto fileName = srcIdx.data().toString();
            const auto line = srcIdx.data(MessageModelRole::Line).toInt();
            if (line <= 0)
                return fileName;
            return static_cast<QString>(fileName + ':' + QString::number(line));
        }
        break;
    case Qt::ToolTipRole: {
        const auto srcIdx = mapToSource(proxyIndex);
        Q_ASSERT(srcIdx.isValid());

        const auto msgType = typeToString(srcIdx.sibling(srcIdx.row(), 0).data(MessageModelRole::Type).toInt());
        const auto msgTime = srcIdx.sibling(srcIdx.row(), MessageModelColumn::Time).data().toString();
        const auto msgText = srcIdx.sibling(srcIdx.row(), MessageModelColumn::Message).data().toString();
        const auto backtrace = srcIdx.sibling(srcIdx.row(), 0).data(MessageModelRole::Backtrace).toStringList();
        if (!backtrace.isEmpty()) {
            QString bt;
            int i = 0;
            for (const auto &frame : backtrace) {
                bt += QStringLiteral("#%1: %2\n").arg(i, 2).arg(frame.trimmed());
                ++i;
            }
            return tr("<qt><dl>"
                      "<dt><b>Type:</b></dt><dd>%1</dd>"
                      "<dt><b>Time:</b></dt><dd>%2</dd>"
                      "<dt><b>Message:</b></dt><dd>%3</dd>"
                      "<dt><b>Backtrace:</b></dt><dd><pre>%4</pre></dd>"
                      "</dl></qt>")
                .arg(msgType, msgTime, msgText, bt);
        } else {
            return tr("<qt><dl>"
                      "<dt><b>Type:</b></dt><dd>%1</dd>"
                      "<dt><b>Time:</b></dt><dd>%2</dd>"
                      "<dt><b>Message:</b></dt><dd>%3</dd>"
                      "</dl></qt>")
                .arg(msgType, msgTime, msgText);
        }
    }
    case Qt::DecorationRole:
        if (proxyIndex.column() == 0) {
            const auto srcIdx = mapToSource(proxyIndex);
            Q_ASSERT(srcIdx.isValid());

            const auto msgType = srcIdx.sibling(srcIdx.row(), 0).data(MessageModelRole::Type).toInt();
            auto style = qApp->style();
            switch (msgType) {
            case QtDebugMsg:
                return style->standardIcon(QStyle::SP_MessageBoxInformation);
            case QtWarningMsg:
                return style->standardIcon(QStyle::SP_MessageBoxWarning);
            case QtCriticalMsg:
            case QtFatalMsg:
                return style->standardIcon(QStyle::SP_MessageBoxCritical);
            }
        }
        break;
    case MessageModelRole::File: {
        const auto srcIdx = mapToSource(proxyIndex);
        Q_ASSERT(srcIdx.isValid());
        return srcIdx.sibling(srcIdx.row(), MessageModelColumn::File).data();
    }
    }

    return QAbstractProxyModel::data(proxyIndex, role);
}