File indexing completed on 2024-05-12 05:12:45
0001 /* 0002 This file is part of Akonadi. 0003 0004 SPDX-FileCopyrightText: 2006 Tobias Koenig <tokoe@kde.org> 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "debugwidget.h" 0010 0011 #include "connectionpage.h" 0012 #include "tracernotificationinterface.h" 0013 0014 #include <Akonadi/ControlGui> 0015 0016 #include <Akonadi/ServerManager> 0017 #include <KLocalizedString> 0018 #include <KTextEdit> 0019 0020 #include <QCheckBox> 0021 #include <QFileDialog> 0022 #include <QPushButton> 0023 #include <QSplitter> 0024 #include <QVBoxLayout> 0025 0026 using org::freedesktop::Akonadi::DebugInterface; 0027 0028 DebugWidget::DebugWidget(QWidget *parent) 0029 : QWidget(parent) 0030 { 0031 auto layout = new QVBoxLayout(this); 0032 layout->setContentsMargins({}); 0033 0034 QString service = QStringLiteral("org.freedesktop.Akonadi"); 0035 if (Akonadi::ServerManager::hasInstanceIdentifier()) { 0036 service += QLatin1Char('.') + Akonadi::ServerManager::instanceIdentifier(); 0037 } 0038 mDebugInterface = new DebugInterface(service, QStringLiteral("/debug"), QDBusConnection::sessionBus(), this); 0039 auto cb = new QCheckBox(i18n("Enable debugger"), this); 0040 cb->setChecked(mDebugInterface->isValid() && mDebugInterface->tracer().value() == QLatin1StringView("dbus")); 0041 connect(cb, &QCheckBox::toggled, this, &DebugWidget::enableDebugger); 0042 layout->addWidget(cb); 0043 0044 auto splitter = new QSplitter(Qt::Vertical, this); 0045 splitter->setObjectName(QLatin1StringView("debugSplitter")); 0046 layout->addWidget(splitter); 0047 0048 mConnectionPage = new ConnectionPage(i18n("All"), splitter); 0049 mConnectionPage->showAllConnections(true); 0050 0051 mGeneralView = new KTextEdit(splitter); 0052 mGeneralView->setReadOnly(true); 0053 0054 auto iface = new org::freedesktop::Akonadi::TracerNotification(QString(), QStringLiteral("/tracing/notifications"), QDBusConnection::sessionBus(), this); 0055 0056 connect(iface, &org::freedesktop::Akonadi::TracerNotification::signalEmitted, this, &DebugWidget::signalEmitted); 0057 connect(iface, &org::freedesktop::Akonadi::TracerNotification::warningEmitted, this, &DebugWidget::warningEmitted); 0058 connect(iface, &org::freedesktop::Akonadi::TracerNotification::errorEmitted, this, &DebugWidget::errorEmitted); 0059 0060 auto buttonLayout = new QHBoxLayout; 0061 layout->addLayout(buttonLayout); 0062 0063 auto clearGeneralButton = new QPushButton(i18n("Clear Information View"), this); 0064 auto clearFilteredButton = new QPushButton(i18n("Clear Filtered Messages"), this); 0065 auto clearAllButton = new QPushButton(i18n("Clear All Messages"), this); 0066 auto saveRichtextButton = new QPushButton(i18n("Save Filtered Messages ..."), this); 0067 auto saveRichtextEverythingButton = new QPushButton(i18n("Save All Messages ..."), this); 0068 0069 buttonLayout->addWidget(clearFilteredButton); 0070 buttonLayout->addWidget(clearAllButton); 0071 buttonLayout->addWidget(clearGeneralButton); 0072 buttonLayout->addWidget(saveRichtextButton); 0073 buttonLayout->addWidget(saveRichtextEverythingButton); 0074 0075 connect(clearFilteredButton, &QPushButton::clicked, mConnectionPage, &ConnectionPage::clearFiltered); 0076 connect(clearAllButton, &QPushButton::clicked, mConnectionPage, &ConnectionPage::clear); 0077 connect(clearGeneralButton, &QPushButton::clicked, mGeneralView, &KTextEdit::clear); 0078 connect(saveRichtextButton, &QPushButton::clicked, this, &DebugWidget::saveRichText); 0079 connect(saveRichtextEverythingButton, &QPushButton::clicked, this, &DebugWidget::saveEverythingRichText); 0080 0081 Akonadi::ControlGui::widgetNeedsAkonadi(this); 0082 } 0083 0084 void DebugWidget::signalEmitted(const QString &signalName, const QString &msg) 0085 { 0086 mGeneralView->append(QStringLiteral("<font color=\"green\">%1 ( %2 )</font>").arg(signalName, msg)); 0087 } 0088 0089 void DebugWidget::warningEmitted(const QString &componentName, const QString &msg) 0090 { 0091 mGeneralView->append(QStringLiteral("<font color=\"blue\">%1: %2</font>").arg(componentName, msg)); 0092 } 0093 0094 void DebugWidget::errorEmitted(const QString &componentName, const QString &msg) 0095 { 0096 mGeneralView->append(QStringLiteral("<font color=\"red\">%1: %2</font>").arg(componentName, msg)); 0097 } 0098 0099 void DebugWidget::enableDebugger(bool enable) 0100 { 0101 mDebugInterface->setTracer(enable ? QStringLiteral("dbus") : QStringLiteral("null")); 0102 } 0103 0104 void DebugWidget::saveRichText() 0105 { 0106 const QString fileName = QFileDialog::getSaveFileName(this); 0107 if (fileName.isEmpty()) { 0108 return; 0109 } 0110 0111 QFile file(fileName); 0112 if (!file.open(QIODevice::WriteOnly)) { 0113 return; 0114 } 0115 0116 file.write(mConnectionPage->toHtmlFiltered().toUtf8()); 0117 file.close(); 0118 } 0119 0120 void DebugWidget::saveEverythingRichText() 0121 { 0122 const QString fileName = QFileDialog::getSaveFileName(this); 0123 if (fileName.isEmpty()) { 0124 return; 0125 } 0126 0127 QFile file(fileName); 0128 if (!file.open(QIODevice::WriteOnly)) { 0129 return; 0130 } 0131 0132 file.write(mConnectionPage->toHtml().toUtf8()); 0133 file.close(); 0134 } 0135 0136 #include "moc_debugwidget.cpp"