mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-04 16:01:14 -05:00
319 lines
11 KiB
C++
319 lines
11 KiB
C++
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
// Copyright (C) 2022 F4EXB //
|
||
|
// written by Edouard Griffiths //
|
||
|
// //
|
||
|
// 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 as version 3 of the License, or //
|
||
|
// (at your option) any later version. //
|
||
|
// //
|
||
|
// 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 V3 for more details. //
|
||
|
// //
|
||
|
// You should have received a copy of the GNU General Public License //
|
||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include <QMessageBox>
|
||
|
|
||
|
#include "commands/command.h"
|
||
|
#include "commands/commandkeyreceiver.h"
|
||
|
#include "editcommanddialog.h"
|
||
|
#include "addpresetdialog.h"
|
||
|
#include "commandoutputdialog.h"
|
||
|
#include "commanditem.h"
|
||
|
#include "maincore.h"
|
||
|
#include "mainwindow.h"
|
||
|
|
||
|
#include "commandsdialog.h"
|
||
|
#include "ui_commandsdialog.h"
|
||
|
|
||
|
CommandsDialog::CommandsDialog(QWidget* parent) :
|
||
|
QDialog(parent),
|
||
|
ui(new Ui::CommandsDialog),
|
||
|
m_apiHost("127.0.0.1"),
|
||
|
m_apiPort(8091),
|
||
|
m_commandKeyReceiver(nullptr)
|
||
|
{
|
||
|
ui->setupUi(this);
|
||
|
ui->commandKeyboardConnect->hide(); // FIXME
|
||
|
}
|
||
|
|
||
|
CommandsDialog::~CommandsDialog()
|
||
|
{
|
||
|
delete ui;
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::populateTree()
|
||
|
{
|
||
|
MainCore::instance()->m_settings.sortCommands();
|
||
|
ui->commandTree->clear();
|
||
|
QTreeWidgetItem *treeItem;
|
||
|
|
||
|
for (int i = 0; i < MainCore::instance()->m_settings.getCommandCount(); ++i) {
|
||
|
treeItem = addCommandToTree(MainCore::instance()->m_settings.getCommand(i));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::on_commandNew_clicked()
|
||
|
{
|
||
|
QStringList groups;
|
||
|
QString group = "";
|
||
|
QString description = "";
|
||
|
|
||
|
for(int i = 0; i < ui->commandTree->topLevelItemCount(); i++) {
|
||
|
groups.append(ui->commandTree->topLevelItem(i)->text(0));
|
||
|
}
|
||
|
|
||
|
QTreeWidgetItem* item = ui->commandTree->currentItem();
|
||
|
|
||
|
if(item != 0)
|
||
|
{
|
||
|
if(item->type() == PGroup) {
|
||
|
group = item->text(0);
|
||
|
} else if(item->type() == PItem) {
|
||
|
group = item->parent()->text(0);
|
||
|
description = item->text(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Command *command = new Command();
|
||
|
command->setGroup(group);
|
||
|
command->setDescription(description);
|
||
|
EditCommandDialog editCommandDialog(groups, group, this);
|
||
|
editCommandDialog.fromCommand(*command);
|
||
|
|
||
|
if (editCommandDialog.exec() == QDialog::Accepted)
|
||
|
{
|
||
|
editCommandDialog.toCommand(*command);
|
||
|
MainCore::instance()->m_settings.addCommand(command);
|
||
|
ui->commandTree->setCurrentItem(addCommandToTree(command));
|
||
|
MainCore::instance()->m_settings.sortCommands();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::on_commandDuplicate_clicked()
|
||
|
{
|
||
|
QTreeWidgetItem* item = ui->commandTree->currentItem();
|
||
|
const Command* command = qvariant_cast<const Command*>(item->data(0, Qt::UserRole));
|
||
|
Command *commandCopy = new Command(*command);
|
||
|
MainCore::instance()->m_settings.addCommand(commandCopy);
|
||
|
ui->commandTree->setCurrentItem(addCommandToTree(commandCopy));
|
||
|
MainCore::instance()->m_settings.sortCommands();
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::on_commandEdit_clicked()
|
||
|
{
|
||
|
QTreeWidgetItem* item = ui->commandTree->currentItem();
|
||
|
bool change = false;
|
||
|
const Command *changedCommand = 0;
|
||
|
QString newGroupName;
|
||
|
|
||
|
QStringList groups;
|
||
|
|
||
|
for(int i = 0; i < ui->commandTree->topLevelItemCount(); i++) {
|
||
|
groups.append(ui->commandTree->topLevelItem(i)->text(0));
|
||
|
}
|
||
|
|
||
|
if(item != 0)
|
||
|
{
|
||
|
if (item->type() == PItem)
|
||
|
{
|
||
|
const Command* command = qvariant_cast<const Command*>(item->data(0, Qt::UserRole));
|
||
|
|
||
|
if (command != 0)
|
||
|
{
|
||
|
EditCommandDialog editCommandDialog(groups, command->getGroup(), this);
|
||
|
editCommandDialog.fromCommand(*command);
|
||
|
|
||
|
if (editCommandDialog.exec() == QDialog::Accepted)
|
||
|
{
|
||
|
Command* command_mod = const_cast<Command*>(command);
|
||
|
editCommandDialog.toCommand(*command_mod);
|
||
|
change = true;
|
||
|
changedCommand = command;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (item->type() == PGroup)
|
||
|
{
|
||
|
AddPresetDialog dlg(groups, item->text(0), this);
|
||
|
dlg.showGroupOnly();
|
||
|
dlg.setDialogTitle("Edit command group");
|
||
|
dlg.setDescriptionBoxTitle("Command details");
|
||
|
|
||
|
if (dlg.exec() == QDialog::Accepted)
|
||
|
{
|
||
|
MainCore::instance()->m_settings.renameCommandGroup(item->text(0), dlg.group());
|
||
|
newGroupName = dlg.group();
|
||
|
change = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (change)
|
||
|
{
|
||
|
MainCore::instance()->m_settings.sortCommands();
|
||
|
ui->commandTree->clear();
|
||
|
|
||
|
for (int i = 0; i < MainCore::instance()->m_settings.getCommandCount(); ++i)
|
||
|
{
|
||
|
QTreeWidgetItem *item_x = addCommandToTree(MainCore::instance()->m_settings.getCommand(i));
|
||
|
const Command* command_x = qvariant_cast<const Command*>(item_x->data(0, Qt::UserRole));
|
||
|
if (changedCommand && (command_x == changedCommand)) { // set cursor on changed command
|
||
|
ui->commandTree->setCurrentItem(item_x);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!changedCommand) // on group name change set cursor on the group that has been changed
|
||
|
{
|
||
|
for(int i = 0; i < ui->commandTree->topLevelItemCount(); i++)
|
||
|
{
|
||
|
QTreeWidgetItem* item = ui->commandTree->topLevelItem(i);
|
||
|
|
||
|
if (item->text(0) == newGroupName) {
|
||
|
ui->commandTree->setCurrentItem(item);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::on_commandRun_clicked()
|
||
|
{
|
||
|
QTreeWidgetItem* item = ui->commandTree->currentItem();
|
||
|
|
||
|
if (item)
|
||
|
{
|
||
|
if (item->type() == PItem) // run individual command
|
||
|
{
|
||
|
const Command* command = qvariant_cast<const Command*>(item->data(0, Qt::UserRole));
|
||
|
Command* command_mod = const_cast<Command*>(command);
|
||
|
command_mod->run(m_apiHost, m_apiPort);
|
||
|
}
|
||
|
else if (item->type() == PGroup) // run all commands in this group
|
||
|
{
|
||
|
QString group = item->text(0);
|
||
|
|
||
|
for (int i = 0; i < MainCore::instance()->m_settings.getCommandCount(); ++i)
|
||
|
{
|
||
|
Command *command_mod = const_cast<Command*>(MainCore::instance()->m_settings.getCommand(i));
|
||
|
|
||
|
if (command_mod->getGroup() == group) {
|
||
|
command_mod->run(m_apiHost, m_apiPort);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::on_commandOutput_clicked()
|
||
|
{
|
||
|
QTreeWidgetItem* item = ui->commandTree->currentItem();
|
||
|
|
||
|
if ((item != 0) && (item->type() == PItem))
|
||
|
{
|
||
|
const Command* command = qvariant_cast<const Command*>(item->data(0, Qt::UserRole));
|
||
|
Command* command_mod = const_cast<Command*>(command);
|
||
|
CommandOutputDialog commandOutputDialog(*command_mod);
|
||
|
commandOutputDialog.exec();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::on_commandsSave_clicked()
|
||
|
{
|
||
|
MainCore::instance()->m_settings.save();
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::on_commandDelete_clicked()
|
||
|
{
|
||
|
QTreeWidgetItem* item = ui->commandTree->currentItem();
|
||
|
|
||
|
if (item != 0)
|
||
|
{
|
||
|
if (item->type() == PItem) // delete individual command
|
||
|
{
|
||
|
const Command* command = qvariant_cast<const Command*>(item->data(0, Qt::UserRole));
|
||
|
|
||
|
if(command)
|
||
|
{
|
||
|
if (QMessageBox::question(this,
|
||
|
tr("Delete command"),
|
||
|
tr("Do you want to delete command '%1'?")
|
||
|
.arg(command->getDescription()), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes)
|
||
|
{
|
||
|
delete item;
|
||
|
MainCore::instance()->m_settings.deleteCommand(command);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (item->type() == PGroup) // delete all commands in this group
|
||
|
{
|
||
|
if (QMessageBox::question(this,
|
||
|
tr("Delete command group"),
|
||
|
tr("Do you want to delete command group '%1'?")
|
||
|
.arg(item->text(0)), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes)
|
||
|
{
|
||
|
MainCore::instance()->m_settings.deleteCommandGroup(item->text(0));
|
||
|
|
||
|
ui->commandTree->clear();
|
||
|
|
||
|
for (int i = 0; i < MainCore::instance()->m_settings.getCommandCount(); ++i) {
|
||
|
addCommandToTree(MainCore::instance()->m_settings.getCommand(i));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CommandsDialog::on_commandKeyboardConnect_toggled(bool checked)
|
||
|
{
|
||
|
qDebug("CommandsDialog::on_commandKeyboardConnect_toggled: %s", checked ? "true" : "false");
|
||
|
|
||
|
if (checked) {
|
||
|
MainWindow::getInstance()->commandKeysConnect(MainWindow::getInstance(), SLOT(commandKeyPressed(Qt::Key, Qt::KeyboardModifiers, bool)));
|
||
|
} else {
|
||
|
MainWindow::getInstance()->commandKeysDisconnect(MainWindow::getInstance(), SLOT(commandKeyPressed(Qt::Key, Qt::KeyboardModifiers, bool)));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
QTreeWidgetItem* CommandsDialog::addCommandToTree(const Command* command)
|
||
|
{
|
||
|
QTreeWidgetItem* group = 0;
|
||
|
|
||
|
for(int i = 0; i < ui->commandTree->topLevelItemCount(); i++)
|
||
|
{
|
||
|
if(ui->commandTree->topLevelItem(i)->text(0) == command->getGroup())
|
||
|
{
|
||
|
group = ui->commandTree->topLevelItem(i);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(group == 0)
|
||
|
{
|
||
|
QStringList sl;
|
||
|
sl.append(command->getGroup());
|
||
|
group = new QTreeWidgetItem(ui->commandTree, sl, PGroup);
|
||
|
group->setFirstColumnSpanned(true);
|
||
|
group->setExpanded(true);
|
||
|
ui->commandTree->sortByColumn(0, Qt::AscendingOrder);
|
||
|
}
|
||
|
|
||
|
QStringList sl;
|
||
|
sl.append(QString("%1").arg(command->getDescription())); // Descriptions column
|
||
|
sl.append(QString("%1").arg(command->getAssociateKey() ? command->getRelease() ? "R" : "P" : "-")); // key press/release column
|
||
|
sl.append(QString("%1").arg(command->getKeyLabel())); // key column
|
||
|
CommandItem* item = new CommandItem(group, sl, command->getDescription(), PItem);
|
||
|
item->setData(0, Qt::UserRole, QVariant::fromValue(command));
|
||
|
item->setTextAlignment(0, Qt::AlignLeft);
|
||
|
ui->commandTree->resizeColumnToContents(0); // Resize description column to minimum
|
||
|
ui->commandTree->resizeColumnToContents(1); // Resize key column to minimum
|
||
|
ui->commandTree->resizeColumnToContents(2); // Resize key press/release column to minimum
|
||
|
|
||
|
//updatePresetControls();
|
||
|
return item;
|
||
|
}
|