File indexing completed on 2024-05-19 05:49:14
0001 /* 0002 SPDX-FileCopyrightText: 2007 Nicolas Ternisien <nicolas.ternisien@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "logLevelFileList.h" 0008 0009 #include <QListWidgetItem> 0010 #include <QString> 0011 #include <QStringList> 0012 0013 #include <QPushButton> 0014 0015 // KDE includes 0016 #include <KLocalizedString> 0017 #include <QFileInfo> 0018 #include <QIcon> 0019 0020 #include "defaults.h" 0021 0022 #include "globals.h" 0023 #include "ksystemlog_debug.h" 0024 0025 #include "logLevel.h" 0026 #include "logLevelSelectionDialog.h" 0027 0028 int LogLevelFileList::LogLevelRole = 33; 0029 0030 LogLevelFileList::LogLevelFileList(QWidget *parent, const QString &description) 0031 : FileList(parent, description) 0032 { 0033 qCDebug(KSYSTEMLOG) << "Initializing specific file list..."; 0034 0035 changeItem = new QPushButton(i18n("&Change Status...")); 0036 changeItem->setToolTip(i18n("Change the level of the current file(s)")); 0037 changeItem->setWhatsThis( 0038 i18n("Changes the level of the current file(s). See KSystemLog documentation for more information about " 0039 "each log level.")); 0040 0041 // Insert the button just after the "Modify File" button 0042 buttonsLayout()->insertWidget(2, changeItem); 0043 0044 QAction *action = mFileListHelper.prepareButtonAndAction(changeItem, QIcon::fromTheme(QStringLiteral("favorites")), this, SLOT(changeItemType())); 0045 0046 // Insert the action just after the "Modify File" action 0047 fileList->insertAction(fileList->actions().at(2), action); 0048 0049 changeItem->setEnabled(false); 0050 0051 connect(fileList, &QListWidget::itemSelectionChanged, this, &LogLevelFileList::updateSpecificButtons); 0052 connect(this, &FileList::fileListChanged, this, &LogLevelFileList::updateSpecificButtons); 0053 0054 disconnect(fileList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(modifyItem(QListWidgetItem *))); 0055 connect(fileList, &QListWidget::itemDoubleClicked, this, &LogLevelFileList::changeItemType); 0056 0057 updateSpecificButtons(); 0058 0059 qCDebug(KSYSTEMLOG) << "Specific file list initialized"; 0060 } 0061 0062 LogLevelFileList::~LogLevelFileList() 0063 { 0064 // changeItem is managed automatically 0065 } 0066 0067 void LogLevelFileList::insertItem(LogLevel *level, const QString &itemText, bool missing) 0068 { 0069 auto item = new QListWidgetItem(level->icon(), itemText, fileList); 0070 if (missing) { 0071 item->setForeground(Qt::red); 0072 } 0073 item->setData(LogLevelFileList::LogLevelRole, level->id()); 0074 } 0075 0076 void LogLevelFileList::addItem() 0077 { 0078 // Open a standard Filedialog 0079 const QList<QUrl> urls = mFileListHelper.openUrls(); 0080 0081 const QStringList paths = mFileListHelper.findPaths(urls); 0082 for (const QString &path : paths) { 0083 insertItem(Globals::instance().informationLogLevel(), path); 0084 } 0085 0086 Q_EMIT fileListChanged(); 0087 } 0088 0089 void LogLevelFileList::updateSpecificButtons() 0090 { 0091 if (!fileList->selectedItems().isEmpty()) { 0092 changeItem->setEnabled(true); 0093 } else { 0094 changeItem->setEnabled(false); 0095 } 0096 } 0097 0098 void LogLevelFileList::changeItemType() 0099 { 0100 qCDebug(KSYSTEMLOG) << "Changing item type..."; 0101 0102 LogLevelSelectionDialog logLevelSelectionDialog(this); 0103 QListWidget *logLevels = logLevelSelectionDialog.logLevels(); 0104 0105 const auto logLevelsItems{Globals::instance().logLevels()}; 0106 for (LogLevel *level : logLevelsItems) { 0107 logLevels->addItem(new QListWidgetItem(level->icon(), level->name())); 0108 } 0109 0110 int const choice = logLevelSelectionDialog.exec(); 0111 0112 if (choice == QDialog::Accepted) { 0113 const QList<QListWidgetItem *> selectedLogLevels = logLevels->selectedItems(); 0114 if (!selectedLogLevels.isEmpty()) { 0115 QListWidgetItem *logLevel = selectedLogLevels.at(0); 0116 int const selectedLogLevel = logLevels->row(logLevel); 0117 0118 const QList<QListWidgetItem *> selectedItems = fileList->selectedItems(); 0119 for (QListWidgetItem *item : selectedItems) { 0120 item->setIcon(logLevel->icon()); 0121 item->setData(LogLevelFileList::LogLevelRole, selectedLogLevel); 0122 } 0123 0124 Q_EMIT fileListChanged(); 0125 } 0126 } 0127 } 0128 0129 LogLevel *LogLevelFileList::level(int i) const 0130 { 0131 return Globals::instance().logLevels().value(Globals::LogLevelIds(fileList->item(i)->data(LogLevelFileList::LogLevelRole).toInt())); 0132 } 0133 0134 QList<int> LogLevelFileList::levels() const 0135 { 0136 QList<int> levels; 0137 const int count = fileList->count(); 0138 levels.reserve(count); 0139 for (int i = 0; i < count; i++) { 0140 levels.append(this->level(i)->id()); 0141 } 0142 0143 return levels; 0144 } 0145 0146 void LogLevelFileList::addPaths(const QStringList &stringList, const QList<int> &valueList) 0147 { 0148 // A little security test 0149 if (stringList.size() != valueList.size()) { 0150 qCDebug(KSYSTEMLOG) << i18n("The two arrays size are different, skipping the reading of generic paths."); 0151 return; 0152 } 0153 0154 QListIterator<QString> itString(stringList); 0155 QListIterator<int> itInt = (valueList); 0156 0157 bool missingFiles = false; 0158 0159 while (itString.hasNext()) { 0160 int const valueInt = itInt.next(); 0161 const QString valueString = itString.next(); 0162 bool missingFile = false; 0163 0164 QFileInfo const checkFile(valueString); 0165 if (!checkFile.exists()) { 0166 missingFiles = true; 0167 missingFile = true; 0168 } 0169 0170 LogLevel *level = Globals::instance().logLevels().value(Globals::LogLevelIds(valueInt), Globals::instance().informationLogLevel()); 0171 insertItem(level, valueString, missingFile); 0172 } 0173 0174 mWarningBox->setVisible(missingFiles); 0175 0176 Q_EMIT fileListChanged(); 0177 } 0178 0179 #include "moc_logLevelFileList.cpp"