You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lxqt-globalkeys-packaging/config/edit_action_dialog.cpp

259 lines
7.5 KiB

/* 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 <kuzma.shapran@gmail.com>
*
* 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<QString, qulonglong> 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<bool, GeneralActionInfo> 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<bool, CommandActionInfo> 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<bool, MethodActionInfo> 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);
}
}