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"