Pimcommon

customlogwidget.cpp
1/*
2 SPDX-FileCopyrightText: 2012-2024 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6#include "customlogwidget.h"
7#include <KColorScheme>
8#include <QAbstractTextDocumentLayout>
9#include <QApplication>
10#include <QPainter>
11#include <QTextDocument>
12
13using namespace PimCommon;
14
15LogItemDelegate::LogItemDelegate(QObject *parent)
16 : QStyledItemDelegate(parent)
17{
18}
19
20LogItemDelegate::~LogItemDelegate() = default;
21
22QTextDocument *LogItemDelegate::document(const QStyleOptionViewItem &option, const QModelIndex &index) const
23{
24 if (!index.isValid()) {
25 return nullptr;
26 }
27 auto document = new QTextDocument(nullptr);
28 document->setDocumentMargin(1);
29 const auto textColor = index.data(Qt::ForegroundRole).value<QColor>();
30 QStyleOptionViewItem option4 = option;
32
33 QString text = option4.text;
34
35 const QString content = QStringLiteral(
36 "<html style=\"color:%1\">"
37 "<body> %2")
38 .arg(textColor.name().toUpper(), text)
39 + QLatin1StringView("</table></body></html>");
40
41 document->setHtml(content);
42
43 return document;
44}
45
46void LogItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
47{
48 if (!index.isValid()) {
49 return;
50 }
51 QTextDocument *doc = document(option, index);
52 if (!doc) {
53 return;
54 }
55 doc->setTextWidth(option.rect.width());
57
58 QPen pen = painter->pen();
59
60 QStyleOptionViewItem opt(option);
61 opt.showDecorationSelected = true;
63 painter->save();
64 painter->translate(option.rect.topLeft());
65
66 doc->drawContents(painter);
67
68 painter->restore();
69 painter->setPen(pen);
70
71 delete doc;
72}
73
74QSize LogItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
75{
76 if (!index.isValid()) {
77 return {0, 0};
78 }
79
80 QTextDocument *doc = document(option, index);
81 if (!doc) {
82 return {0, 0};
83 }
84
85 const QSize size = doc->documentLayout()->documentSize().toSize();
86 delete doc;
87
88 return size;
89}
90
91QWidget *LogItemDelegate::createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const
92{
93 return nullptr;
94}
95
96CustomLogWidget::CustomLogWidget(QWidget *parent)
97 : QListWidget(parent)
98{
99 auto itemDelegate = new LogItemDelegate(this);
100 setItemDelegate(itemDelegate);
101}
102
103CustomLogWidget::~CustomLogWidget() = default;
104
105void CustomLogWidget::addTitleLogEntry(const QString &log)
106{
107 auto item = new QListWidgetItem(log);
109 QFont font = item->font();
110 font.setBold(true);
111 item->setFont(font);
112 item->setData(ItemLogType, Title);
113 addItem(item);
115}
116
117void CustomLogWidget::addInfoLogEntry(const QString &log)
118{
119 auto item = new QListWidgetItem(log);
121 item->setData(ItemLogType, Info);
122 addItem(item);
124}
125
126void CustomLogWidget::addErrorLogEntry(const QString &log)
127{
128 auto item = new QListWidgetItem(log);
130 item->setData(ItemLogType, Error);
131 addItem(item);
133}
134
135void CustomLogWidget::addEndLineLogEntry()
136{
137 auto item = new QListWidgetItem;
138 item->setData(ItemLogType, EndLine);
139 addItem(item);
141}
142
143QString CustomLogWidget::toHtml() const
144{
145 QString result = QStringLiteral("<html>\n<body>\n");
146 result += QLatin1StringView("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n");
147 for (int i = 0; i < count(); ++i) {
149 const QString itemText(itemWidget->text());
151 LogType type = static_cast<LogType>(itemWidget->data(CustomLogWidget::ItemLogType).toInt());
152 switch (type) {
153 case Title:
154 logText = QStringLiteral("<font color=%1>%2</font>").arg(QColor(Qt::black).name(), itemText);
155 break;
156 case Error:
157 logText = QStringLiteral("<font color=%1>%2</font>").arg(QColor(Qt::red).name(), itemText);
158 break;
159 case Info:
160 logText = QStringLiteral("<font color=%1>%2</font>").arg(QColor(Qt::darkGreen).name(), itemText);
161 break;
162 case EndLine:
163 logText = QStringLiteral("<br/>");
164 break;
165 }
166 result += QLatin1StringView("<p>") + logText + QLatin1StringView("</p>") + QLatin1Char('\n');
167 }
168 result += QLatin1StringView("</body>\n</html>\n");
169 return result;
170}
171
172QString CustomLogWidget::toPlainText() const
173{
174 QString result;
175 for (int i = 0; i < count(); ++i) {
176 result += item(i)->text() + QLatin1Char('\n');
177 }
178 return result;
179}
180
181bool CustomLogWidget::isEmpty() const
182{
183 return count() == 0;
184}
185
186#include "moc_customlogwidget.cpp"
Q_SCRIPTABLE QStringList logText()
Type type(const QSqlDatabase &db)
QString name(StandardShortcut id)
folderdialogacltab.h
virtual QSizeF documentSize() const const=0
QStyle * style()
void setBold(bool enable)
void addItem(QListWidgetItem *item)
QListWidgetItem * item(int row) const const
QWidget * itemWidget(QListWidgetItem *item) const const
void scrollToItem(const QListWidgetItem *item, QAbstractItemView::ScrollHint hint)
QFont font() const const
virtual void setData(int role, const QVariant &value)
void setFont(const QFont &font)
void setForeground(const QBrush &brush)
QString text() const const
QVariant data(int role) const const
bool isValid() const const
const QPen & pen() const const
void restore()
void save()
void setPen(Qt::PenStyle style)
void setRenderHint(RenderHint hint, bool on)
void translate(const QPoint &offset)
QSize toSize() const const
QString arg(Args &&... args) const const
PE_PanelItemViewItem
virtual void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const const=0
virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const const
ForegroundRole
QAbstractTextDocumentLayout * documentLayout() const const
void setDocumentMargin(qreal margin)
void drawContents(QPainter *p, const QRectF &rect)
void setHtml(const QString &html)
void setTextWidth(qreal width)
T value() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:17:23 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.