/* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXDE-Qt - a lightweight, Qt based, desktop toolset * http://razor-qt.org * * Copyright: 2013 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "edit_action_dialog.h" #include "actions.h" EditActionDialog::EditActionDialog(Actions *actions, QWidget *parent) : QDialog(parent) , mActions(actions) { setupUi(this); shortcut_SS->setActions(mActions); connect(this, SIGNAL(accepted()), SLOT(when_accepted())); } void EditActionDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } static QString joinCommandLine(const QString &command, QStringList arguments) { arguments.prepend(command); int m = arguments.length(); for (int i = 0; i < m; ++i) { QString &item = arguments[i]; if (item.contains(QRegExp("[ \r\n\t\"']"))) { item.prepend("'").append("'"); } else if (item.isEmpty()) { item = QString("''"); } } return arguments.join(" "); } static QStringList splitCommandLine(QString commandLine) { commandLine.prepend(" ").append(" "); QStringList result; QRegExp spacePattern("\\s+"); QRegExp itemPattern("([^ \r\n\t\"']+)|((\"([^\"]|\\\")*\")|('([^']|\\')*'))(?=\\s)"); for (int pos = 0; ;) { if (commandLine.indexOf(spacePattern, pos) != pos) { return QStringList(); } pos += spacePattern.matchedLength(); if (pos == commandLine.length()) { break; } if (commandLine.indexOf(itemPattern, pos) != pos) { return QStringList(); } pos += itemPattern.matchedLength(); QString item = itemPattern.cap(2); if (item.length()) { result << item.mid(1, item.length() - 2); } else { result << itemPattern.cap(1); } } return result; } void EditActionDialog::when_accepted() { if (mId) { if (command_RB->isChecked()) { QStringList commandLine = splitCommandLine(command_PTE->toPlainText()); if (!commandLine.length()) { return; } mActions->modifyCommandAction(mId, commandLine[0], commandLine.mid(1), description_LE->text()); } else if (dbus_method_RB->isChecked()) { mActions->modifyMethodAction(mId, service_LE->text(), QDBusObjectPath(path_LE->text()), interface_LE->text(), method_LE->text(), description_LE->text()); } mActions->changeShortcut(mId, mShortcut); mActions->enableAction(mId, enabled_CB->isChecked()); } else { QPair result = qMakePair(QString(), 0ull); if (command_RB->isChecked()) { QStringList commandLine = splitCommandLine(command_PTE->toPlainText()); if (!commandLine.length()) { return; } result = mActions->addCommandAction(mShortcut, commandLine[0], commandLine.mid(1), description_LE->text()); } else if (dbus_method_RB->isChecked()) { result = mActions->addMethodAction(mShortcut, service_LE->text(), QDBusObjectPath(path_LE->text()), interface_LE->text(), method_LE->text(), description_LE->text()); } if (result.second && !enabled_CB->isChecked()) { mActions->enableAction(result.second, false); } } } bool EditActionDialog::load(qulonglong id) { mId = id; if (mId) { QPair info = mActions->actionById(id); if (!info.first) { return false; } bool canEdit = ((info.second.type == "command") || (info.second.type == "method")); mShortcut = info.second.shortcut; shortcut_SS->setText(mShortcut); description_LE->setText(info.second.description); enabled_CB->setChecked(info.second.enabled); command_RB->setChecked(info.second.type == "command"); dbus_method_RB->setChecked(info.second.type == "method"); action_SW->setCurrentWidget((info.second.type == "method") ? dbus_method_P : command_P); if (info.second.type == "command") { QPair commandInfo = mActions->commandActionInfoById(id); if (!commandInfo.first) { return false; } command_PTE->setPlainText(joinCommandLine(commandInfo.second.command, commandInfo.second.arguments)); } else if (info.second.type == "method") { QPair methodInfo = mActions->methodActionInfoById(id); if (!methodInfo.first) { return false; } service_LE->setText(methodInfo.second.service); path_LE->setText(methodInfo.second.path.path()); interface_LE->setText(methodInfo.second.interface); method_LE->setText(methodInfo.second.method); } else { command_PTE->clear(); } description_LE->setEnabled(canEdit); command_RB->setEnabled(false); dbus_method_RB->setEnabled(false); action_SW->setEnabled(canEdit); } else { shortcut_SS->setText(QString()); description_LE->clear(); enabled_CB->setChecked(true); action_SW->setCurrentWidget(command_P); command_PTE->clear(); service_LE->clear(); path_LE->clear(); interface_LE->clear(); method_LE->clear(); // To disable all radio boxes, once one has been selected, we need to turn exclusivity off temporarily command_RB->setAutoExclusive(false); dbus_method_RB->setAutoExclusive(false); command_RB->setChecked(false); dbus_method_RB->setChecked(false); command_RB->setAutoExclusive(true); dbus_method_RB->setAutoExclusive(true); description_LE->setEnabled(true); command_RB->setEnabled(true); dbus_method_RB->setEnabled(true); action_SW->setEnabled(false); } return true; } void EditActionDialog::on_shortcut_SS_shortcutGrabbed(const QString &shortcut) { mShortcut = shortcut; shortcut_SS->setText(shortcut); } void EditActionDialog::on_command_RB_clicked(bool checked) { if (checked) { action_SW->setCurrentWidget(command_P); action_SW->setEnabled(true); } } void EditActionDialog::on_dbus_method_RB_clicked(bool checked) { if (checked) { action_SW->setCurrentWidget(dbus_method_P); action_SW->setEnabled(true); } }