Warning, file /utilities/kdebugsettings/src/customdebugsettingspage.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 SPDX-FileCopyrightText: 2015-2023 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 0006 */ 0007 0008 #include "customdebugsettingspage.h" 0009 #include "configurecustomsettingdialog.h" 0010 #include "kdebugsettingsutil.h" 0011 #include <KListWidgetSearchLine> 0012 #include <KLocalizedString> 0013 #include <KMessageBox> 0014 #include <QHBoxLayout> 0015 #include <QKeyEvent> 0016 #include <QLabel> 0017 #include <QListWidget> 0018 #include <QMenu> 0019 #include <QPointer> 0020 #include <QPushButton> 0021 #include <QVBoxLayout> 0022 #include <kwidgetsaddons_version.h> 0023 0024 CustomDebugSettingsPage::CustomDebugSettingsPage(QWidget *parent) 0025 : QWidget(parent) 0026 , mListWidget(new QListWidget(this)) 0027 , mAddRule(new QPushButton(i18n("Add..."), this)) 0028 , mEditRule(new QPushButton(i18n("Edit..."), this)) 0029 , mRemoveRule(new QPushButton(i18n("Remove..."), this)) 0030 { 0031 auto mainLayout = new QVBoxLayout(this); 0032 0033 auto lab = new QLabel(i18n("Rules:"), this); 0034 lab->setObjectName(QStringLiteral("custom_label")); 0035 mainLayout->addWidget(lab); 0036 0037 auto horizontalLayout = new QHBoxLayout; 0038 horizontalLayout->setContentsMargins(0, 0, 0, 0); 0039 mainLayout->addLayout(horizontalLayout); 0040 0041 auto vbox = new QVBoxLayout; 0042 horizontalLayout->addLayout(vbox); 0043 0044 mListWidget->setObjectName(QStringLiteral("custom_listwidget")); 0045 mListWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); 0046 mListWidget->setContextMenuPolicy(Qt::CustomContextMenu); 0047 connect(mListWidget, &QListWidget::itemSelectionChanged, this, &CustomDebugSettingsPage::updateButtons); 0048 connect(mListWidget, &QListWidget::itemDoubleClicked, this, &CustomDebugSettingsPage::slotEditRule); 0049 connect(mListWidget, &QListWidget::customContextMenuRequested, this, &CustomDebugSettingsPage::slotCustomContextMenu); 0050 mTreeListWidgetSearchLine = new KListWidgetSearchLine(this, mListWidget); 0051 mTreeListWidgetSearchLine->setObjectName(QStringLiteral("searchline")); 0052 mTreeListWidgetSearchLine->setPlaceholderText(i18n("Search...")); 0053 vbox->addWidget(mTreeListWidgetSearchLine); 0054 vbox->addWidget(mListWidget); 0055 0056 auto buttonLayout = new QVBoxLayout; 0057 horizontalLayout->addLayout(buttonLayout); 0058 0059 mAddRule->setObjectName(QStringLiteral("add_rule")); 0060 buttonLayout->addWidget(mAddRule); 0061 connect(mAddRule, &QAbstractButton::clicked, this, &CustomDebugSettingsPage::slotAddRule); 0062 0063 mEditRule->setObjectName(QStringLiteral("edit_rule")); 0064 buttonLayout->addWidget(mEditRule); 0065 connect(mEditRule, &QAbstractButton::clicked, this, &CustomDebugSettingsPage::slotEditRule); 0066 0067 mRemoveRule->setObjectName(QStringLiteral("remove_rule")); 0068 buttonLayout->addWidget(mRemoveRule); 0069 buttonLayout->addStretch(); 0070 connect(mRemoveRule, &QAbstractButton::clicked, this, &CustomDebugSettingsPage::slotRemoveRules); 0071 updateButtons(); 0072 mTreeListWidgetSearchLine->installEventFilter(this); 0073 } 0074 0075 CustomDebugSettingsPage::~CustomDebugSettingsPage() = default; 0076 0077 bool CustomDebugSettingsPage::eventFilter(QObject *obj, QEvent *event) 0078 { 0079 if (event->type() == QEvent::KeyPress && obj == mTreeListWidgetSearchLine) { 0080 auto key = static_cast<QKeyEvent *>(event); 0081 if ((key->key() == Qt::Key_Enter) || (key->key() == Qt::Key_Return)) { 0082 event->accept(); 0083 return true; 0084 } 0085 } 0086 return QWidget::eventFilter(obj, event); 0087 } 0088 0089 void CustomDebugSettingsPage::slotCustomContextMenu(const QPoint &pos) 0090 { 0091 QMenu menu(this); 0092 const auto selectedItemCount{mListWidget->selectedItems().count()}; 0093 menu.addAction(QIcon::fromTheme(QStringLiteral("list-add")), i18n("Add Rule..."), this, &CustomDebugSettingsPage::slotAddRule); 0094 if (selectedItemCount == 1) { 0095 menu.addAction(QIcon::fromTheme(QStringLiteral("document-edit")), i18n("Edit Rule"), this, &CustomDebugSettingsPage::slotEditRule); 0096 } 0097 if (selectedItemCount > 0) { 0098 menu.addSeparator(); 0099 menu.addAction(QIcon::fromTheme(QStringLiteral("list-remove")), i18n("Remove Rule"), this, &CustomDebugSettingsPage::slotRemoveRules); 0100 } 0101 menu.exec(mListWidget->viewport()->mapToGlobal(pos)); 0102 } 0103 0104 void CustomDebugSettingsPage::updateButtons() 0105 { 0106 mEditRule->setEnabled(mListWidget->selectedItems().count() == 1); 0107 mRemoveRule->setEnabled(!mListWidget->selectedItems().isEmpty()); 0108 } 0109 0110 void CustomDebugSettingsPage::fillList(const LoggingCategory::List &list) 0111 { 0112 for (const LoggingCategory &cat : list) { 0113 QString ruleStr; 0114 ruleStr = cat.categoryName; 0115 switch (cat.loggingType) { 0116 case LoggingCategory::Undefined: 0117 case LoggingCategory::All: 0118 break; 0119 case LoggingCategory::Info: 0120 ruleStr += QStringLiteral(".info"); 0121 break; 0122 case LoggingCategory::Warning: 0123 ruleStr += QStringLiteral(".warning"); 0124 break; 0125 case LoggingCategory::Debug: 0126 ruleStr += QStringLiteral(".debug"); 0127 break; 0128 case LoggingCategory::Critical: 0129 ruleStr += QStringLiteral(".critical"); 0130 break; 0131 case LoggingCategory::Off: 0132 break; 0133 } 0134 if (cat.enabled) { 0135 ruleStr += QStringLiteral("=true"); 0136 } else { 0137 ruleStr += QStringLiteral("=false"); 0138 } 0139 new QListWidgetItem(ruleStr, mListWidget); 0140 } 0141 } 0142 0143 LoggingCategory::List CustomDebugSettingsPage::rules() const 0144 { 0145 LoggingCategory::List lst; 0146 const int number(mListWidget->count()); 0147 for (int i = 0; i < number; ++i) { 0148 const KDebugSettingsUtil::LineLoggingQtCategory cat = KDebugSettingsUtil::parseLineLoggingQtCategory(mListWidget->item(i)->text()); 0149 if (cat.isValid()) { 0150 LoggingCategory tmp; 0151 tmp.categoryName = cat.logName; 0152 tmp.enabled = cat.enabled; 0153 switch (cat.type) { 0154 case KDebugSettingsUtil::LineLoggingQtCategory::Unknown: 0155 break; 0156 case KDebugSettingsUtil::LineLoggingQtCategory::Info: 0157 tmp.loggingType = LoggingCategory::Info; 0158 break; 0159 case KDebugSettingsUtil::LineLoggingQtCategory::Warning: 0160 tmp.loggingType = LoggingCategory::Warning; 0161 break; 0162 case KDebugSettingsUtil::LineLoggingQtCategory::Debug: 0163 tmp.loggingType = LoggingCategory::Debug; 0164 break; 0165 case KDebugSettingsUtil::LineLoggingQtCategory::Critical: 0166 tmp.loggingType = LoggingCategory::Critical; 0167 break; 0168 case KDebugSettingsUtil::LineLoggingQtCategory::All: 0169 tmp.loggingType = LoggingCategory::All; 0170 break; 0171 } 0172 lst.append(tmp); 0173 } 0174 } 0175 return lst; 0176 } 0177 0178 void CustomDebugSettingsPage::slotRemoveRules() 0179 { 0180 QList<QListWidgetItem *> lst = mListWidget->selectedItems(); 0181 if (lst.isEmpty()) { 0182 return; 0183 } 0184 const QString str = i18np("Do you want to remove this rule?", "Do you want to remove these %1 rules?", lst.count()); 0185 0186 if (KMessageBox::ButtonCode::SecondaryAction 0187 == KMessageBox::warningTwoActions(this, str, i18n("Remove Rule"), KStandardGuiItem::remove(), KStandardGuiItem::cancel())) { 0188 return; 0189 } 0190 for (int i = 0; i < lst.count(); ++i) { 0191 QListWidgetItem *item = lst.at(i); 0192 delete item; 0193 } 0194 } 0195 0196 void CustomDebugSettingsPage::slotEditRule() 0197 { 0198 if (mListWidget->selectedItems().count() == 1) { 0199 QListWidgetItem *item = mListWidget->selectedItems().at(0); 0200 if (item) { 0201 QPointer<ConfigureCustomSettingDialog> dlg = new ConfigureCustomSettingDialog(this); 0202 dlg->setRule(item->text()); 0203 if (dlg->exec()) { 0204 const QString ruleStr = dlg->rule(); 0205 if (!ruleStr.isEmpty()) { 0206 item->setText(dlg->rule()); 0207 } 0208 } 0209 delete dlg; 0210 } 0211 } 0212 } 0213 0214 void CustomDebugSettingsPage::slotAddRule() 0215 { 0216 QPointer<ConfigureCustomSettingDialog> dlg = new ConfigureCustomSettingDialog(this); 0217 if (dlg->exec()) { 0218 const QString ruleStr = dlg->rule(); 0219 if (!ruleStr.isEmpty()) { 0220 bool alreadyAdded = false; 0221 const int number(mListWidget->count()); 0222 for (int i = 0; i < number; ++i) { 0223 if (ruleStr == mListWidget->item(i)->text()) { 0224 alreadyAdded = true; 0225 break; 0226 } 0227 } 0228 if (!alreadyAdded) { 0229 mListWidget->addItem(ruleStr); 0230 } 0231 } 0232 } 0233 delete dlg; 0234 }