File: clientnetworkreplymodel.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 (124 lines) | stat: -rw-r--r-- 4,669 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
124
/*
  clientnetworkreplymodel.cpp

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

  SPDX-FileCopyrightText: 2019 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 "clientnetworkreplymodel.h"
#include "networkreplymodeldefs.h"

#include <ui/uiresources.h>

#include <QApplication>
#include <QIcon>
#include <QNetworkAccessManager>
#include <QPalette>
#include <QStyle>

using namespace GammaRay;

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

ClientNetworkReplyModel::~ClientNetworkReplyModel() = default;

QVariant ClientNetworkReplyModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole && index.column() == NetworkReplyModelColumn::OpColumn) {
        const auto op = QIdentityProxyModel::data(index, role).toInt();
        switch (op) {
        case QNetworkAccessManager::HeadOperation:
            return QStringLiteral("HEAD");
        case QNetworkAccessManager::GetOperation:
            return QStringLiteral("GET");
        case QNetworkAccessManager::PutOperation:
            return QStringLiteral("PUT");
        case QNetworkAccessManager::PostOperation:
            return QStringLiteral("POST");
        case QNetworkAccessManager::DeleteOperation:
            return QStringLiteral("DELETE");
        case QNetworkAccessManager::CustomOperation:
            return tr("Custom");
        }
    }

    if (role == Qt::ForegroundRole) {
        const auto state = QIdentityProxyModel::data(index.sibling(index.row(), NetworkReplyModelColumn::ObjectColumn), NetworkReplyModelRole::ReplyStateRole).toInt();
        if (state & NetworkReply::Deleted) {
            return QGuiApplication::palette().color(QPalette::Disabled, QPalette::Text);
        }
        if (state & NetworkReply::Error) {
            return QColor(Qt::red);
        }
    }

    if (role == Qt::DecorationRole && index.parent().isValid()) {
        const auto state = QIdentityProxyModel::data(index.sibling(index.row(), NetworkReplyModelColumn::ObjectColumn), NetworkReplyModelRole::ReplyStateRole).toInt();
        switch (index.column()) {
        case NetworkReplyModelColumn::ObjectColumn:
            if (state & NetworkReply::Error) {
                return QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton);
            } else if (state & NetworkReply::Finished) {
                return QApplication::style()->standardIcon(QStyle::SP_DialogOkButton);
            }
            return QApplication::style()->standardIcon(QStyle::SP_BrowserReload);
        case NetworkReplyModelColumn::UrlColumn: {
            const auto url = QIdentityProxyModel::data(index, Qt::DisplayRole).toString();
            if ((state & NetworkReply::Encrypted) || ((state & NetworkReply::Unencrypted) == 0 && url.startsWith(QLatin1String("https")))) {
                return UIResources::themedIcon(QLatin1String("lock.png"));
            }
            return UIResources::themedIcon(QLatin1String("lock-open.png"));
        }
        }
    }

    if (role == Qt::ToolTipRole) {
        if (index.column() == NetworkReplyModelColumn::UrlColumn) {
            return index.data(Qt::DisplayRole);
        }

        const auto errMsgs = QIdentityProxyModel::data(index.sibling(index.row(), NetworkReplyModelColumn::ObjectColumn), NetworkReplyModelRole::ReplyErrorRole).toStringList();
        if (errMsgs.isEmpty()) {
            return {};
        }
        if (errMsgs.size() == 1) {
            return errMsgs.at(0);
        }
        QString tt;
        for (const auto &msg : errMsgs) {
            tt += QLatin1String("<li>") + msg + QLatin1String("</li>");
        }
        return tt;
    }

    return QIdentityProxyModel::data(index, role);
}

QVariant ClientNetworkReplyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
        switch (section) {
        case NetworkReplyModelColumn::ObjectColumn:
            return tr("Reply");
        case NetworkReplyModelColumn::OpColumn:
            return tr("Operation");
        case NetworkReplyModelColumn::TimeColumn:
            return tr("Duration");
        case NetworkReplyModelColumn::SizeColumn:
            return tr("Size");
        case NetworkReplyModelColumn::UrlColumn:
            return tr("URL");
        }
    }

    return QIdentityProxyModel::headerData(section, orientation, role);
}