diff --git a/plugins/runcommand/runcommand_config.cpp b/plugins/runcommand/runcommand_config.cpp index 648b474c..eaabb09d 100644 --- a/plugins/runcommand/runcommand_config.cpp +++ b/plugins/runcommand/runcommand_config.cpp @@ -1,146 +1,172 @@ /** * Copyright 2015 David Edmundson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "runcommand_config.h" #include #include #include #include +#include +#include #include #include #include #include #include #include K_PLUGIN_FACTORY(ShareConfigFactory, registerPlugin();) + RunCommandConfig::RunCommandConfig(QWidget* parent, const QVariantList& args) : KdeConnectPluginKcm(parent, args, QStringLiteral("kdeconnect_runcommand_config")) { + QMenu* defaultMenu = new QMenu(this); + addSuggestedCommand(defaultMenu, i18n("Suspend"), QStringLiteral("systemctl suspend")); + addSuggestedCommand(defaultMenu, i18n("Maximum Brightness"), QStringLiteral("qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/BrightnessControl org.kde.Solid.PowerManagement.Actions.BrightnessControl.setBrightness `qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/BrightnessControl org.kde.Solid.PowerManagement.Actions.BrightnessControl.brightnessMax`")); + QTableView* table = new QTableView(this); table->horizontalHeader()->setStretchLastSection(true); table->verticalHeader()->setVisible(false); QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(table); + QPushButton* button = new QPushButton(QIcon::fromTheme(QStringLiteral("list-add")), i18n("Sample commands"), this); + button->setMenu(defaultMenu); + layout->addWidget(button); + setLayout(layout); m_entriesModel = new QStandardItemModel(this); table->setModel(m_entriesModel); m_entriesModel->setHorizontalHeaderLabels(QStringList() << i18n("Name") << i18n("Command")); } RunCommandConfig::~RunCommandConfig() { } +void RunCommandConfig::addSuggestedCommand(QMenu* menu, const QString &name, const QString &command) +{ + auto action = new QAction(name); + connect(action, &QAction::triggered, action, [this, name, command]() { + insertRow(0, name, command); + Q_EMIT changed(true); + }); + menu->addAction(action); +} + void RunCommandConfig::defaults() { KCModule::defaults(); m_entriesModel->clear(); Q_EMIT changed(true); } void RunCommandConfig::load() { KCModule::load(); QJsonDocument jsonDocument = QJsonDocument::fromJson(config()->get(QStringLiteral("commands"), "{}")); QJsonObject jsonConfig = jsonDocument.object(); const QStringList keys = jsonConfig.keys(); for (const QString& key : keys) { const QJsonObject entry = jsonConfig[key].toObject(); const QString name = entry[QStringLiteral("name")].toString(); const QString command = entry[QStringLiteral("command")].toString(); QStandardItem* newName = new QStandardItem(name); newName->setEditable(true); newName->setData(key); QStandardItem* newCommand = new QStandardItem(command); newName->setEditable(true); m_entriesModel->appendRow(QList() << newName << newCommand); } m_entriesModel->sort(0); insertEmptyRow(); connect(m_entriesModel, &QAbstractItemModel::dataChanged, this, &RunCommandConfig::onDataChanged); Q_EMIT changed(false); } void RunCommandConfig::save() { QJsonObject jsonConfig; for (int i=0;i < m_entriesModel->rowCount(); i++) { QString key = m_entriesModel->item(i, 0)->data().toString(); const QString name = m_entriesModel->item(i, 0)->text(); const QString command = m_entriesModel->item(i, 1)->text(); if (name.isEmpty() || command.isEmpty()) { continue; } if (key.isEmpty()) { key = QUuid::createUuid().toString(); } QJsonObject entry; entry[QStringLiteral("name")] = name; entry[QStringLiteral("command")] = command; jsonConfig[key] = entry; } QJsonDocument document; document.setObject(jsonConfig); config()->set(QStringLiteral("commands"), document.toJson(QJsonDocument::Compact)); KCModule::save(); Q_EMIT changed(false); } void RunCommandConfig::insertEmptyRow() { - QStandardItem* newName = new QStandardItem; + insertRow(m_entriesModel->rowCount(), {}, {}); +} + +void RunCommandConfig::insertRow(int i, const QString& name, const QString& command) +{ + QStandardItem* newName = new QStandardItem(name); newName->setEditable(true); - QStandardItem* newCommand = new QStandardItem; + QStandardItem* newCommand = new QStandardItem(command); newName->setEditable(true); - m_entriesModel->appendRow(QList() << newName << newCommand); + m_entriesModel->insertRow(i, QList() << newName << newCommand); } void RunCommandConfig::onDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight) { changed(true); Q_UNUSED(topLeft); if (bottomRight.row() == m_entriesModel->rowCount() - 1) { //TODO check both entries are still empty insertEmptyRow(); } } #include "runcommand_config.moc" diff --git a/plugins/runcommand/runcommand_config.h b/plugins/runcommand/runcommand_config.h index 13639cf7..7efe7b7b 100644 --- a/plugins/runcommand/runcommand_config.h +++ b/plugins/runcommand/runcommand_config.h @@ -1,50 +1,53 @@ /** * Copyright 2015 David Edmundson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SHARE_CONFIG_H #define SHARE_CONFIG_H #include "kcmplugin/kdeconnectpluginkcm.h" +class QMenu; class QStandardItemModel; class RunCommandConfig : public KdeConnectPluginKcm { Q_OBJECT public: RunCommandConfig(QWidget* parent, const QVariantList&); ~RunCommandConfig() override; public Q_SLOTS: void save() override; void load() override; void defaults() override; private Q_SLOTS: void onDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight); private: + void addSuggestedCommand(QMenu* menu, const QString &name, const QString &command); + void insertRow(int i, const QString &name, const QString &command); void insertEmptyRow(); QStandardItemModel* m_entriesModel; }; #endif