1 /*
2     SPDX-FileCopyrightText: 2015-2021 Laurent Montel <montel@kde.org>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 
6 */
7 
8 #include "kdeapplicationtreelistwidget.h"
9 #include "categorytypecombobox.h"
10 #include "kdebugsettingsutil.h"
11 #include <KLocalizedString>
12 #include <QHeaderView>
13 
KDEApplicationTreeListWidgetItem(const QString & category,QTreeWidget * parent)14 KDEApplicationTreeListWidgetItem::KDEApplicationTreeListWidgetItem(const QString &category, QTreeWidget *parent)
15     : QTreeWidgetItem(parent)
16     , mCategory(category)
17     , mCategoryTypeCombobox(new CategoryTypeComboBox(false))
18 {
19     treeWidget()->setItemWidget(this, CategoryType, mCategoryTypeCombobox);
20 }
21 
~KDEApplicationTreeListWidgetItem()22 KDEApplicationTreeListWidgetItem::~KDEApplicationTreeListWidgetItem()
23 {
24 }
25 
restoreToDefault()26 void KDEApplicationTreeListWidgetItem::restoreToDefault()
27 {
28     mCategoryTypeCombobox->restoreToDefault();
29 }
30 
setType(LoggingCategory::LoggingType type)31 void KDEApplicationTreeListWidgetItem::setType(LoggingCategory::LoggingType type)
32 {
33     mCategoryTypeCombobox->setType(type);
34 }
35 
setDefaultCategory(LoggingCategory::LoggingType type)36 void KDEApplicationTreeListWidgetItem::setDefaultCategory(LoggingCategory::LoggingType type)
37 {
38     mCategoryTypeCombobox->setDefaultCategories(type);
39 }
40 
logName() const41 QString KDEApplicationTreeListWidgetItem::logName() const
42 {
43     return mCategory;
44 }
45 
setLogName(const QString & category)46 void KDEApplicationTreeListWidgetItem::setLogName(const QString &category)
47 {
48     mCategory = category;
49 }
50 
rule(bool forceSavingAllRules) const51 LoggingCategory KDEApplicationTreeListWidgetItem::rule(bool forceSavingAllRules) const
52 {
53     LoggingCategory cat;
54     if (mCategoryTypeCombobox->loggingCategoryIsNotDefault() || forceSavingAllRules) {
55         cat.enabled = false;
56         cat.categoryName = mCategory;
57         cat.loggingType = mCategoryTypeCombobox->type();
58     }
59     return cat;
60 }
61 
KDEApplicationTreeListWidget(QWidget * parent)62 KDEApplicationTreeListWidget::KDEApplicationTreeListWidget(QWidget *parent)
63     : QTreeWidget(parent)
64 {
65     setColumnCount(4);
66     setRootIsDecorated(false);
67     setColumnHidden(KDEApplicationTreeListWidgetItem::LogName, true);
68     setColumnHidden(KDEApplicationTreeListWidgetItem::IdentifierName, true);
69     header()->hide();
70 }
71 
~KDEApplicationTreeListWidget()72 KDEApplicationTreeListWidget::~KDEApplicationTreeListWidget()
73 {
74 }
75 
searchColumns() const76 QList<int> KDEApplicationTreeListWidget::searchColumns() const
77 {
78     return {KDEApplicationTreeListWidgetItem::Description, KDEApplicationTreeListWidgetItem::LogName, KDEApplicationTreeListWidgetItem::IdentifierName};
79 }
80 
selectAllDebugCategories()81 void KDEApplicationTreeListWidget::selectAllDebugCategories()
82 {
83     for (int i = 0; i < topLevelItemCount(); ++i) {
84         auto itemWidget = static_cast<KDEApplicationTreeListWidgetItem *>(topLevelItem(i));
85         if (!itemWidget->isHidden()) {
86             itemWidget->setType(LoggingCategory::Debug);
87         }
88     }
89 }
90 
deSelectAllDebugCategories()91 void KDEApplicationTreeListWidget::deSelectAllDebugCategories()
92 {
93     for (int i = 0; i < topLevelItemCount(); ++i) {
94         auto itemWidget = static_cast<KDEApplicationTreeListWidgetItem *>(topLevelItem(i));
95         if (!itemWidget->isHidden()) {
96             itemWidget->setType(LoggingCategory::Info);
97         }
98     }
99 }
100 
deSelectAllMessagesCategories()101 void KDEApplicationTreeListWidget::deSelectAllMessagesCategories()
102 {
103     for (int i = 0; i < topLevelItemCount(); ++i) {
104         auto itemWidget = static_cast<KDEApplicationTreeListWidgetItem *>(topLevelItem(i));
105         if (!itemWidget->isHidden()) {
106             itemWidget->setType(LoggingCategory::Off);
107         }
108     }
109 }
110 
fillList(const LoggingCategory::List & list)111 void KDEApplicationTreeListWidget::fillList(const LoggingCategory::List &list)
112 {
113     addListItems(list, true);
114 }
115 
generateToolTip(const LoggingCategory & cat)116 QString KDEApplicationTreeListWidget::generateToolTip(const LoggingCategory &cat)
117 {
118     QString toopTip = i18n("Category name: %1", cat.categoryName);
119     if (!cat.identifierName.isEmpty()) {
120         toopTip += QLatin1Char('\n') + i18n("Identifier: %1", cat.identifierName);
121     }
122     toopTip += QLatin1Char('\n') + i18n("Default Severity: %1", KDebugSettingsUtil::convertCategoryTypeToString(cat.defaultSeverityType));
123     return toopTip;
124 }
125 
addListItems(const LoggingCategory::List & list,bool clearList)126 void KDEApplicationTreeListWidget::addListItems(const LoggingCategory::List &list, bool clearList)
127 {
128     if (clearList) {
129         clear();
130     }
131     for (const LoggingCategory &cat : list) {
132         auto item = new KDEApplicationTreeListWidgetItem(cat.categoryName, this);
133         item->setToolTip(0, generateToolTip(cat));
134         item->setText(KDEApplicationTreeListWidgetItem::Description, cat.description);
135         item->setType(cat.loggingType);
136         item->setDefaultCategory(cat.defaultSeverityType);
137         item->setText(KDEApplicationTreeListWidgetItem::LogName, cat.categoryName);
138         item->setText(KDEApplicationTreeListWidgetItem::IdentifierName, cat.identifierName);
139     }
140     resizeColumnToContents(KDEApplicationTreeListWidgetItem::Description);
141 }
142 
insertCategories(const LoggingCategory::List & list)143 void KDEApplicationTreeListWidget::insertCategories(const LoggingCategory::List &list)
144 {
145     addListItems(list, false);
146 }
147 
rules(bool forceSavingAllRules) const148 LoggingCategory::List KDEApplicationTreeListWidget::rules(bool forceSavingAllRules) const
149 {
150     LoggingCategory::List lst;
151     for (int i = 0; i < topLevelItemCount(); ++i) {
152         auto listWidgetItem = static_cast<KDEApplicationTreeListWidgetItem *>(topLevelItem(i));
153         const LoggingCategory cat = listWidgetItem->rule(forceSavingAllRules);
154         if (cat.isValid()) {
155             lst.append(cat);
156         }
157     }
158     return lst;
159 }
160 
restoreToDefault()161 void KDEApplicationTreeListWidget::restoreToDefault()
162 {
163     for (int i = 0; i < topLevelItemCount(); ++i) {
164         auto itemWidget = static_cast<KDEApplicationTreeListWidgetItem *>(topLevelItem(i));
165         itemWidget->restoreToDefault();
166     }
167 }
168