File indexing completed on 2024-05-19 05:54:12

0001 // This file was part of the KDE libraries
0002 // SPDX-FileCopyrightText: 2022 Tao Guo <guotao945@gmail.com>
0003 // SPDX-License-Identifier: GPL-2.0-or-later
0004 
0005 #include "quickcommandsmodel.h"
0006 #include "quickcommanddata.h"
0007 
0008 #include <KConfig>
0009 #include <KConfigGroup>
0010 
0011 QuickCommandsModel::QuickCommandsModel(QObject *parent)
0012     : QStandardItemModel(parent)
0013 {
0014     load();
0015 }
0016 
0017 QuickCommandsModel::~QuickCommandsModel() noexcept
0018 {
0019     save();
0020 }
0021 
0022 void QuickCommandsModel::load()
0023 {
0024     auto config = KConfig(QStringLiteral("konsolequickcommandsconfig"), KConfig::OpenFlag::SimpleConfig);
0025     for (const QString &groupName : config.groupList()) {
0026         KConfigGroup group = config.group(groupName);
0027         addTopLevelItem(groupName);
0028         for (const QString &commandGroup : group.groupList()) {
0029             QuickCommandData data;
0030             KConfigGroup element = group.group(commandGroup);
0031             data.name = element.readEntry("name");
0032             data.tooltip = element.readEntry("tooltip");
0033             data.command = element.readEntry("command");
0034             addChildItem(data, groupName);
0035         }
0036     }
0037 }
0038 
0039 void QuickCommandsModel::save()
0040 {
0041     auto config = KConfig(QStringLiteral("konsolequickcommandsconfig"), KConfig::OpenFlag::SimpleConfig);
0042     for (const QString &groupName : config.groupList()) {
0043         config.deleteGroup(groupName);
0044     }
0045     for (int i = 0, end = invisibleRootItem()->rowCount(); i < end; i++) {
0046         QStandardItem *groupItem = invisibleRootItem()->child(i);
0047         const QString groupName = groupItem->text();
0048         KConfigGroup baseGroup = config.group(groupName);
0049         for (int j = 0, end2 = groupItem->rowCount(); j < end2; j++) {
0050             QStandardItem *item = groupItem->child(j);
0051             const auto data = item->data(QuickCommandRole).value<QuickCommandData>();
0052             KConfigGroup element = baseGroup.group(data.name);
0053             element.writeEntry("name", data.name);
0054             element.writeEntry("tooltip", data.tooltip);
0055             element.writeEntry("command", data.command);
0056         }
0057     }
0058 
0059     config.sync();
0060 }
0061 
0062 QStringList QuickCommandsModel::groups() const
0063 {
0064     QStringList retList;
0065     for (int i = 0, end = invisibleRootItem()->rowCount(); i < end; i++) {
0066         retList.push_back(invisibleRootItem()->child(i)->text());
0067     }
0068     return retList;
0069 }
0070 
0071 QStandardItem *QuickCommandsModel::addTopLevelItem(const QString &groupName)
0072 {
0073     for (int i = 0, end = invisibleRootItem()->rowCount(); i < end; i++) {
0074         if (invisibleRootItem()->child(i)->text() == groupName) {
0075             return nullptr;
0076         }
0077     }
0078     auto *newItem = new QStandardItem();
0079     newItem->setText(groupName);
0080     invisibleRootItem()->appendRow(newItem);
0081     invisibleRootItem()->sortChildren(0);
0082 
0083     return newItem;
0084 }
0085 
0086 bool QuickCommandsModel::addChildItem(const QuickCommandData &data, const QString &groupName)
0087 {
0088     QStandardItem *parentItem = nullptr;
0089     for (int i = 0, end = invisibleRootItem()->rowCount(); i < end; i++) {
0090         if (invisibleRootItem()->child(i)->text() == groupName) {
0091             parentItem = invisibleRootItem()->child(i);
0092             break;
0093         }
0094     }
0095 
0096     if (!parentItem)
0097         parentItem = addTopLevelItem(groupName);
0098     for (int i = 0, end = parentItem->rowCount(); i < end; i++) {
0099         if (parentItem->child(i)->text() == data.name)
0100             return false;
0101     }
0102 
0103     auto item = new QStandardItem();
0104     updateItem(item, data);
0105     parentItem->appendRow(item);
0106     parentItem->sortChildren(0);
0107     return true;
0108 }
0109 
0110 bool QuickCommandsModel::editChildItem(const QuickCommandData &data, const QModelIndex &idx, const QString &groupName)
0111 {
0112     QStandardItem *item = itemFromIndex(idx);
0113     QStandardItem *parentItem = item->parent();
0114     for (int i = 0, end = parentItem->rowCount(); i < end; i++) {
0115         if (parentItem->child(i)->text() == data.name && parentItem->child(i) != item)
0116             return false;
0117     }
0118     if (groupName != parentItem->text()) {
0119         if (!addChildItem(data, groupName))
0120             return false;
0121         parentItem->removeRow(item->row());
0122     } else {
0123         updateItem(item, data);
0124         item->parent()->sortChildren(0);
0125     }
0126 
0127     return true;
0128 }
0129 
0130 void QuickCommandsModel::updateItem(QStandardItem *item, const QuickCommandData &data)
0131 {
0132     item->setData(QVariant::fromValue(data), QuickCommandRole);
0133     item->setText(data.name);
0134     if (data.tooltip.trimmed().isEmpty())
0135         item->setToolTip(data.command);
0136     else
0137         item->setToolTip(data.tooltip);
0138 }
0139 
0140 #include "moc_quickcommandsmodel.cpp"