mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-10-31 15:07:12 -04:00
419 lines
11 KiB
C++
419 lines
11 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2018 Edouard Griffiths, F4EXB //
|
|
// //
|
|
// 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 <math.h>
|
|
#include <QHBoxLayout>
|
|
|
|
#include "ui_arginfogui.h"
|
|
#include "arginfogui.h"
|
|
|
|
ArgInfoGUI::ArgInfoGUI(ArgInfoType type, ArgInfoValueType valueType, QWidget *parent) :
|
|
QWidget(parent),
|
|
ui(new Ui::ArgInfoGUI),
|
|
m_type(type),
|
|
m_valueType(valueType),
|
|
m_boolValue(false),
|
|
m_intValue(0),
|
|
m_floatValue(0.0),
|
|
m_hasRange(false),
|
|
m_minValue(0.0),
|
|
m_maxValue(0.0)
|
|
{
|
|
ui->setupUi(this);
|
|
QHBoxLayout *layout = ui->argLayout;
|
|
|
|
if ((m_valueType == ArgInfoValueInt) || (m_valueType == ArgInfoValueFloat))
|
|
{
|
|
if (m_type == ArgInfoContinuous) {
|
|
ui->argEdit->setAlignment(Qt::AlignRight);
|
|
} else if (m_type == ArgInfoDiscrete) {
|
|
ui->argCombo->setLayoutDirection(Qt::RightToLeft);
|
|
}
|
|
}
|
|
|
|
if (m_type != ArgInfoBinary)
|
|
{
|
|
layout->removeWidget(ui->argCheck);
|
|
delete ui->argCheck;
|
|
}
|
|
|
|
if (m_type != ArgInfoContinuous)
|
|
{
|
|
layout->removeWidget(ui->argEdit);
|
|
delete ui->argEdit;
|
|
}
|
|
|
|
if (m_type != ArgInfoDiscrete)
|
|
{
|
|
layout->removeWidget(ui->argCombo);
|
|
delete ui->argCombo;
|
|
}
|
|
}
|
|
|
|
ArgInfoGUI::~ArgInfoGUI()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void ArgInfoGUI::setRange(double min, double max)
|
|
{
|
|
m_hasRange = true;
|
|
m_minValue = min;
|
|
m_maxValue = max;
|
|
}
|
|
|
|
void ArgInfoGUI::setLabel(const QString& text)
|
|
{
|
|
ui->argLabel->setText(text);
|
|
}
|
|
|
|
void ArgInfoGUI::setToolTip(const QString& text)
|
|
{
|
|
if (m_type == ArgInfoBinary) {
|
|
ui->argCheck->setToolTip(text);
|
|
} else if (m_type == ArgInfoContinuous) {
|
|
ui->argEdit->setToolTip(text);
|
|
} else if (m_type == ArgInfoDiscrete) {
|
|
ui->argCombo->setToolTip(text);
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::setUnits(const QString& units)
|
|
{
|
|
ui->argUnits->setText(units);
|
|
}
|
|
|
|
void ArgInfoGUI::setBoolValue(bool value)
|
|
{
|
|
if (m_valueType == ArgInfoValueBool)
|
|
{
|
|
m_boolValue = value;
|
|
updateUIFromBool();
|
|
}
|
|
else if (m_valueType == ArgInfoValueInt)
|
|
{
|
|
m_intValue = setIntegerValue(value ? 1 : 0);
|
|
updateUIFromInt();
|
|
}
|
|
else if (m_valueType == ArgInfoValueFloat)
|
|
{
|
|
m_floatValue = setDoubleValue(value ? 1.0 : 0.0);
|
|
updateUIFromFloat();
|
|
}
|
|
else if (m_valueType == ArgInfoValueString)
|
|
{
|
|
m_stringValue = QString(value ? "true" : "false");
|
|
updateUIFromString();
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::addBoolValue(const QString& text, bool value)
|
|
{
|
|
if (m_type == ArgInfoDiscrete) {
|
|
ui->argCombo->addItem(text, QVariant(value));
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::setIntValue(int value)
|
|
{
|
|
if (m_valueType == ArgInfoValueBool)
|
|
{
|
|
m_boolValue = (value != 0);
|
|
updateUIFromBool();
|
|
}
|
|
else if (m_valueType == ArgInfoValueInt)
|
|
{
|
|
m_intValue = setIntegerValue(value);
|
|
updateUIFromInt();
|
|
}
|
|
else if (m_valueType == ArgInfoValueFloat)
|
|
{
|
|
m_floatValue = setDoubleValue(value);
|
|
updateUIFromFloat();
|
|
}
|
|
else if (m_valueType == ArgInfoValueString)
|
|
{
|
|
m_stringValue = QString("%1").arg(value);
|
|
updateUIFromString();
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::addIntValue(const QString& text, int value)
|
|
{
|
|
if (m_type == ArgInfoDiscrete) {
|
|
ui->argCombo->addItem(text, QVariant(setIntegerValue(value)));
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::setFloatValue(double value)
|
|
{
|
|
if (m_valueType == ArgInfoValueBool)
|
|
{
|
|
m_boolValue = (value != 0.0);
|
|
updateUIFromBool();
|
|
}
|
|
else if (m_valueType == ArgInfoValueInt)
|
|
{
|
|
m_intValue = setIntegerValue(value);
|
|
updateUIFromInt();
|
|
}
|
|
else if (m_valueType == ArgInfoValueFloat)
|
|
{
|
|
m_floatValue = setDoubleValue(value);
|
|
updateUIFromFloat();
|
|
}
|
|
else if (m_valueType == ArgInfoValueString)
|
|
{
|
|
m_stringValue = QString("%1").arg(value);
|
|
updateUIFromString();
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::addFloatValue(const QString& text, double value)
|
|
{
|
|
if (m_type == ArgInfoDiscrete) {
|
|
ui->argCombo->addItem(text, QVariant(setDoubleValue(value)));
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::setStringValue(const QString& value)
|
|
{
|
|
if (m_valueType == ArgInfoValueBool)
|
|
{
|
|
m_boolValue = (value == "true");
|
|
updateUIFromBool();
|
|
}
|
|
else if (m_valueType == ArgInfoValueInt)
|
|
{
|
|
int intValue = atoi(value.toStdString().c_str());
|
|
m_intValue = setIntegerValue(intValue);
|
|
updateUIFromInt();
|
|
}
|
|
else if (m_valueType == ArgInfoValueFloat)
|
|
{
|
|
double doubleValue = atof(value.toStdString().c_str());
|
|
m_floatValue = setDoubleValue(doubleValue);
|
|
updateUIFromFloat();
|
|
}
|
|
else if (m_valueType == ArgInfoValueString)
|
|
{
|
|
m_stringValue = value;
|
|
updateUIFromString();
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::addStringValue(const QString& text, const QString& value)
|
|
{
|
|
if (m_type == ArgInfoDiscrete) {
|
|
ui->argCombo->addItem(text, QVariant(value));
|
|
}
|
|
}
|
|
|
|
int ArgInfoGUI::setIntegerValue(int value)
|
|
{
|
|
if (m_hasRange) {
|
|
return value < round(m_minValue) ? round(m_minValue) : value > round(m_maxValue) ? round(m_maxValue) : value;
|
|
} else {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
double ArgInfoGUI::setDoubleValue(double value)
|
|
{
|
|
if (m_hasRange) {
|
|
return value < m_minValue ? m_minValue : value > m_maxValue ? m_maxValue : value;
|
|
} else {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::updateUIFromBool()
|
|
{
|
|
if (m_type == ArgInfoBinary)
|
|
{
|
|
ui->argCheck->blockSignals(true);
|
|
ui->argCheck->setChecked(m_boolValue);
|
|
ui->argCheck->blockSignals(false);
|
|
}
|
|
else if (m_type == ArgInfoContinuous)
|
|
{
|
|
ui->argEdit->blockSignals(true);
|
|
ui->argEdit->setText(QString(m_boolValue ? "true" : "false"));
|
|
ui->argEdit->blockSignals(false);
|
|
}
|
|
else if (m_type == ArgInfoDiscrete)
|
|
{
|
|
if (ui->argCombo->count() > 1)
|
|
{
|
|
ui->argCombo->blockSignals(true);
|
|
ui->argCombo->setCurrentIndex(m_boolValue ? 0 : 1);
|
|
ui->argCombo->blockSignals(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::updateUIFromInt()
|
|
{
|
|
if (m_type == ArgInfoBinary)
|
|
{
|
|
ui->argCheck->blockSignals(true);
|
|
ui->argCheck->setChecked(m_intValue == 0 ? false : true);
|
|
ui->argCheck->blockSignals(false);
|
|
}
|
|
else if (m_type == ArgInfoContinuous)
|
|
{
|
|
ui->argEdit->blockSignals(true);
|
|
ui->argEdit->setText(QString("%1").arg(m_intValue));
|
|
ui->argEdit->blockSignals(false);
|
|
}
|
|
else if (m_type == ArgInfoDiscrete)
|
|
{
|
|
for (int i = 0; i < ui->argCombo->count(); i++)
|
|
{
|
|
if (ui->argCombo->itemData(i).type() == QVariant::Int)
|
|
{
|
|
bool ok = false;
|
|
QVariant v = ui->argCombo->itemData(i);
|
|
|
|
if (m_intValue >= v.toInt(&ok) && ok)
|
|
{
|
|
ui->argCombo->blockSignals(true);
|
|
ui->argCombo->setCurrentIndex(i);
|
|
ui->argCombo->blockSignals(false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::updateUIFromFloat()
|
|
{
|
|
if (m_type == ArgInfoBinary)
|
|
{
|
|
ui->argCheck->blockSignals(true);
|
|
ui->argCheck->setChecked(m_floatValue == 0.0 ? false : true);
|
|
ui->argCheck->blockSignals(false);
|
|
}
|
|
else if (m_type == ArgInfoContinuous)
|
|
{
|
|
ui->argEdit->blockSignals(true);
|
|
ui->argEdit->setText(QString("%1").arg(m_floatValue));
|
|
ui->argEdit->blockSignals(false);
|
|
}
|
|
else if (m_type == ArgInfoDiscrete)
|
|
{
|
|
for (int i = 0; i < ui->argCombo->count(); i++)
|
|
{
|
|
if (ui->argCombo->itemData(i).type() == QVariant::Double)
|
|
{
|
|
bool ok = false;
|
|
QVariant v = ui->argCombo->itemData(i);
|
|
|
|
if (m_floatValue >= v.toDouble(&ok) && ok)
|
|
{
|
|
ui->argCombo->blockSignals(true);
|
|
ui->argCombo->setCurrentIndex(i);
|
|
ui->argCombo->blockSignals(false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::updateUIFromString()
|
|
{
|
|
if (m_type == ArgInfoBinary)
|
|
{
|
|
ui->argCheck->blockSignals(true);
|
|
ui->argCheck->setChecked(m_stringValue == "true" ? true : false);
|
|
ui->argCheck->blockSignals(false);
|
|
}
|
|
else if (m_type == ArgInfoContinuous)
|
|
{
|
|
ui->argEdit->blockSignals(true);
|
|
ui->argEdit->setText(m_stringValue);
|
|
ui->argEdit->blockSignals(false);
|
|
}
|
|
else if (m_type == ArgInfoDiscrete)
|
|
{
|
|
for (int i = 0; i < ui->argCombo->count(); i++)
|
|
{
|
|
if (ui->argCombo->itemData(i).type() == QVariant::String)
|
|
{
|
|
QVariant v = ui->argCombo->itemData(i);
|
|
|
|
if (m_stringValue == v.toString())
|
|
{
|
|
ui->argCombo->blockSignals(true);
|
|
ui->argCombo->setCurrentIndex(i);
|
|
ui->argCombo->blockSignals(false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ArgInfoGUI::on_argCheck_toggled(bool checked)
|
|
{
|
|
setBoolValue(checked);
|
|
emit valueChanged();
|
|
}
|
|
|
|
void ArgInfoGUI::on_argEdit_editingFinished()
|
|
{
|
|
setStringValue(ui->argEdit->text());
|
|
emit valueChanged();
|
|
}
|
|
|
|
void ArgInfoGUI::on_argCombo_currentIndexChanged(int index)
|
|
{
|
|
(void) index;
|
|
QVariant v = ui->argCombo->currentData();
|
|
bool ok = false;
|
|
|
|
if (v.type() == QVariant::Bool)
|
|
{
|
|
setBoolValue(v.toBool());
|
|
emit valueChanged();
|
|
}
|
|
else if (v.type() == QVariant::Int)
|
|
{
|
|
setIntValue(v.toInt(&ok));
|
|
|
|
if (ok) {
|
|
emit valueChanged();
|
|
}
|
|
}
|
|
else if (v.type() == QVariant::Double)
|
|
{
|
|
setFloatValue(v.toDouble(&ok));
|
|
|
|
if (ok) {
|
|
emit valueChanged();
|
|
}
|
|
}
|
|
else if (v.type() ==QVariant::String)
|
|
{
|
|
setStringValue(v.toString());
|
|
emit valueChanged();
|
|
}
|
|
}
|
|
|