File indexing completed on 2023-05-30 12:28:54

0001 /*
0002     SPDX-FileCopyrightText: 2020-2023 Laurent Montel <montel@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 
0006 */
0007 
0008 #include "groupmanagementwidget.h"
0009 #include "kdebugsettingsutil.h"
0010 #include "loadgroupmenu.h"
0011 
0012 #include <KLocalizedString>
0013 #include <KMessageBox>
0014 
0015 #include <QDir>
0016 #include <QInputDialog>
0017 #include <QListWidget>
0018 #include <QVBoxLayout>
0019 
0020 GroupManagementWidget::GroupManagementWidget(QWidget *parent)
0021     : QWidget(parent)
0022     , mListWidget(new QListWidget(this))
0023 {
0024     auto mainLayout = new QVBoxLayout(this);
0025     mainLayout->setContentsMargins({});
0026     mainLayout->setObjectName(QStringLiteral("mainLayout"));
0027 
0028     mListWidget->setObjectName(QStringLiteral("mListWidget"));
0029     mainLayout->addWidget(mListWidget);
0030     mListWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
0031     mListWidget->setContextMenuPolicy(Qt::CustomContextMenu);
0032     connect(mListWidget, &QListWidget::itemDoubleClicked, this, &GroupManagementWidget::renameGroup);
0033     connect(mListWidget, &QListWidget::customContextMenuRequested, this, &GroupManagementWidget::slotCustomContextMenu);
0034     init();
0035 }
0036 
0037 GroupManagementWidget::~GroupManagementWidget() = default;
0038 
0039 void GroupManagementWidget::renameGroup(QListWidgetItem *item)
0040 {
0041     if (!item) {
0042         return;
0043     }
0044     const QString fullPath = item->data(FullPathRole).toString();
0045     QFile f(fullPath);
0046     const QString newName = QInputDialog::getText(this, i18n("Rename Group"), i18n("New Name:"));
0047     const QString newNameTrimmed = newName.trimmed();
0048     if (!newNameTrimmed.isEmpty()) {
0049         const QString newFullPath{LoadGroupMenu::defaultWritableGroupPath() + QLatin1Char('/') + newNameTrimmed};
0050         if (!f.rename(newFullPath)) {
0051             KMessageBox::error(this, i18n("Impossible to rename group as \'%1\'", newNameTrimmed), i18n("Rename Group"));
0052         } else {
0053             item->setText(newNameTrimmed);
0054             item->setData(FullPathRole, newFullPath);
0055             Q_EMIT groupsChanged();
0056         }
0057     }
0058 }
0059 
0060 void GroupManagementWidget::slotCustomContextMenu()
0061 {
0062     const auto items = mListWidget->selectedItems();
0063     if (!items.isEmpty()) {
0064         QMenu menu(this);
0065         if (mListWidget->selectedItems().count() == 1) {
0066             const auto item = items.at(0);
0067             menu.addAction(QIcon::fromTheme(QStringLiteral("edit")), i18n("Rename Groups"), this, [this, item]() {
0068                 renameGroup(item);
0069             });
0070             menu.addSeparator();
0071         }
0072         menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Remove Groups"), this, [this, items]() {
0073             for (auto item : items) {
0074                 const QString fullPath = item->data(FullPathRole).toString();
0075                 QFile f(fullPath);
0076                 if (!f.remove()) {
0077                     KMessageBox::error(this, i18n("Impossible to remove \'%1\'", fullPath), i18n("Remove Group"));
0078                 }
0079                 delete item;
0080             }
0081             Q_EMIT groupsChanged();
0082         });
0083         menu.exec(QCursor::pos());
0084     }
0085 }
0086 
0087 void GroupManagementWidget::init()
0088 {
0089     const QStringList groups = KDebugSettingsUtil::groupFileList();
0090     if (!groups.isEmpty()) {
0091         const QString groupPath = LoadGroupMenu::defaultWritableGroupPath();
0092         for (const QString &file : groups) {
0093             auto item = new QListWidgetItem(file, mListWidget);
0094             const QString fullPath = groupPath + QLatin1Char('/') + file;
0095             item->setData(FullPathRole, fullPath);
0096         }
0097     }
0098 }