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"