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 }