File indexing completed on 2024-05-12 17:07:25
0001 /* 0002 SPDX-FileCopyrightText: 2009 Ben Cooksley <ben@eclipse.endoftheinternet.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "ActionItem.h" 0008 #include "SolidActionData.h" 0009 0010 #include <QString> 0011 0012 #include <KConfigGroup> 0013 #include <KDesktopFile> 0014 #include <KDesktopFileActions> 0015 0016 #include <Solid/DeviceInterface> 0017 0018 ActionItem::ActionItem(const QString &pathToDesktop, const QString &action, QObject *parent) 0019 : desktopMasterPath(pathToDesktop) 0020 , actionName(action) 0021 { 0022 Q_UNUSED(parent); 0023 0024 // Create the desktop file 0025 desktopFileMaster = new KDesktopFile(desktopMasterPath); 0026 desktopWritePath = desktopFileMaster->locateLocal(desktopMasterPath); 0027 desktopFileWrite = new KDesktopFile(desktopWritePath); 0028 // Now we can fill the action groups list 0029 configGroups.append(desktopFileMaster->desktopGroup()); 0030 actionGroups.insert(ActionItem::GroupDesktop, &configGroups.last()); 0031 configGroups.append(desktopFileMaster->actionGroup(actionName)); 0032 actionGroups.insert(ActionItem::GroupAction, &configGroups.last()); 0033 configGroups.append(desktopFileWrite->desktopGroup()); 0034 actionGroups.insert(ActionItem::GroupDesktop, &configGroups.last()); 0035 configGroups.append(desktopFileWrite->actionGroup(actionName)); 0036 actionGroups.insert(ActionItem::GroupAction, &configGroups.last()); 0037 0038 const QString predicateString = readKey(ActionItem::GroupDesktop, QStringLiteral("X-KDE-Solid-Predicate"), QString()); 0039 predicateItem = Solid::Predicate::fromString(predicateString); 0040 } 0041 0042 ActionItem::~ActionItem() 0043 { 0044 delete desktopFileWrite; 0045 delete desktopFileMaster; 0046 } 0047 0048 /// Public functions below 0049 0050 bool ActionItem::isUserSupplied() const 0051 { 0052 return hasKey(ActionItem::GroupDesktop, QStringLiteral("X-KDE-Action-Custom")); 0053 } 0054 0055 QString ActionItem::icon() const 0056 { 0057 return readKey(ActionItem::GroupAction, QStringLiteral("Icon"), QString()); 0058 } 0059 0060 QString ActionItem::exec() const 0061 { 0062 return readKey(ActionItem::GroupAction, QStringLiteral("Exec"), QString()); 0063 } 0064 0065 QString ActionItem::name() const 0066 { 0067 return readKey(ActionItem::GroupAction, QStringLiteral("Name"), QString()); 0068 } 0069 0070 Solid::Predicate ActionItem::predicate() const 0071 { 0072 return predicateItem; 0073 } 0074 0075 QString ActionItem::involvedTypes() const 0076 { 0077 SolidActionData *actData = SolidActionData::instance(); 0078 const QSet<Solid::DeviceInterface::Type> devTypeList = predicateItem.usedTypes(); 0079 QStringList deviceTypes; 0080 for (Solid::DeviceInterface::Type devType : devTypeList) { 0081 deviceTypes << actData->nameFromInterface(devType); 0082 } 0083 0084 return deviceTypes.join(QLatin1String(", ")); 0085 } 0086 0087 void ActionItem::setIcon(const QString &nameOfIcon) 0088 { 0089 setKey(ActionItem::GroupAction, QStringLiteral("Icon"), nameOfIcon); 0090 } 0091 0092 void ActionItem::setName(const QString &nameOfAction) 0093 { 0094 setKey(ActionItem::GroupAction, QStringLiteral("Name"), nameOfAction); 0095 } 0096 0097 void ActionItem::setExec(const QString &execUrl) 0098 { 0099 setKey(ActionItem::GroupAction, QStringLiteral("Exec"), execUrl); 0100 } 0101 0102 void ActionItem::setPredicate(const QString &newPredicate) 0103 { 0104 setKey(ActionItem::GroupDesktop, QStringLiteral("X-KDE-Solid-Predicate"), newPredicate); 0105 predicateItem = Solid::Predicate::fromString(newPredicate); 0106 } 0107 0108 /// Private functions below 0109 0110 QString ActionItem::readKey(GroupType keyGroup, const QString &keyName, const QString &defaultValue) const 0111 { 0112 return configItem(ActionItem::DesktopRead, keyGroup, keyName)->readEntry(keyName, defaultValue); 0113 } 0114 0115 void ActionItem::setKey(GroupType keyGroup, const QString &keyName, const QString &keyContents) 0116 { 0117 configItem(ActionItem::DesktopWrite, keyGroup)->writeEntry(keyName, keyContents); 0118 } 0119 0120 bool ActionItem::hasKey(GroupType keyGroup, const QString &keyName) const 0121 { 0122 return configItem(ActionItem::DesktopRead, keyGroup, keyName)->hasKey(keyName); 0123 } 0124 0125 KConfigGroup *ActionItem::configItem(DesktopAction actionType, GroupType keyGroup, const QString &keyName) const 0126 { 0127 int countAccess = 0; 0128 0129 if (actionType == ActionItem::DesktopRead) { 0130 const auto values = actionGroups.values(keyGroup); 0131 for (KConfigGroup *possibleGroup : values) { 0132 if (possibleGroup->hasKey(keyName)) { 0133 return possibleGroup; 0134 } 0135 } 0136 } else if (actionType == ActionItem::DesktopWrite) { 0137 if (isUserSupplied()) { 0138 countAccess = 1; 0139 } 0140 return actionGroups.values(keyGroup).at(countAccess); 0141 } 0142 return actionGroups.values(keyGroup).at(0); // Implement a backstop so a valid value is always returned 0143 }