satdump/src-core/core/params.cpp

294 lines
11 KiB
C++
Raw Normal View History

2023-09-06 22:28:55 -04:00
#include "imgui/imgui.h"
#include "imgui/imgui_stdlib.h"
#include "logger.h"
#include "params.h"
namespace satdump
{
namespace params
{
EditableParameter::EditableParameter(nlohmann::json p_json)
{
d_imgui_id = rand();
std::string type_str = p_json["type"].get<std::string>();
bool hasValue = p_json.count("value") > 0;
d_name = p_json["name"].get<std::string>();
d_id = /*d_name +*/ "##" + std::to_string(d_imgui_id);
if (p_json.count("description") > 0)
d_description = p_json["description"].get<std::string>();
if (type_str == "string")
{
d_type = PARAM_STRING;
if (hasValue)
p_string = p_json["value"].get<std::string>();
else
p_string = "";
}
2024-05-24 23:28:01 -04:00
else if (type_str == "password")
{
d_type = PARAM_PASSWORD;
if (hasValue)
p_string = p_json["value"].get<std::string>();
else
p_string = "";
}
2023-09-06 22:28:55 -04:00
else if (type_str == "int")
{
d_type = PARAM_INT;
if (hasValue)
p_int = p_json["value"].get<int>();
else
p_int = 0;
}
else if (type_str == "float")
{
d_type = PARAM_FLOAT;
if (hasValue)
p_float = p_json["value"].get<double>();
else
p_float = 0;
}
else if (type_str == "bool")
{
d_type = PARAM_BOOL;
if (hasValue)
p_bool = p_json["value"].get<bool>();
else
p_bool = false;
}
else if (type_str == "options")
{
d_type = PARAM_OPTIONS;
d_options = p_json["options"].get<std::vector<std::string>>();
d_options_str = "";
2024-10-27 16:31:14 -04:00
for (std::string &opt : d_options)
2023-09-06 22:28:55 -04:00
d_options_str += opt + '\0';
if (hasValue)
{
int i = 0;
2024-10-27 16:31:14 -04:00
for (std::string &opt : d_options)
2023-09-06 22:28:55 -04:00
{
if (p_json["value"].get<std::string>() == opt)
d_option = i;
i++;
}
}
else
d_option = 0;
}
else if (type_str == "path")
{
d_type = PARAM_PATH;
file_select = std::make_shared<FileSelectWidget>(p_json["name"], p_json["name"], p_json["is_directory"]);
file_select->setPath(p_json["value"]);
2023-09-06 22:28:55 -04:00
}
else if (type_str == "timestamp")
{
d_type = PARAM_TIMESTAMP;
date_time_picker = std::make_shared<widgets::DateTimePicker>(d_id, hasValue ? p_json["value"].get<double>() : -1);
}
else if (type_str == "notated_int")
{
d_type = PARAM_NOTATED_INT;
std::string units;
if (p_json.count("units") > 0)
units = p_json["units"].get<std::string>();
else
units = "";
notated_int = std::make_shared<widgets::NotatedNum<int64_t>>(d_id, hasValue ? p_json["value"].get<int64_t>() : 0, units);
2023-09-06 22:28:55 -04:00
}
2023-11-10 18:48:13 +01:00
else if (type_str == "color")
{
d_type = PARAM_COLOR;
std::vector<float> color = p_json["value"].get<std::vector<float>>();
p_color[0] = color[0];
p_color[1] = color[1];
p_color[2] = color[2];
}
else if (type_str == "baseband_type")
{
d_type = PARAM_BASEBAND_TYPE;
baseband_type = p_json["value"].get<std::string>();
}
else if (type_str == "labeled_options")
2024-10-27 16:31:14 -04:00
{
d_type = PARAM_LABELED_OPTIONS;
2024-10-27 16:31:14 -04:00
d_labeled_opts = p_json["options"];
p_bool = p_json.contains("manual") ? p_json["manual"].get<bool>() : false;
2024-10-27 16:31:14 -04:00
d_options_str = "";
for (std::pair<std::string, std::string> &opt : d_labeled_opts)
2024-10-27 16:31:14 -04:00
d_options_str += opt.second + '\0';
if (p_bool) // Allow manual
d_options_str += std::string("Custom") + '\0';
2024-10-27 16:31:14 -04:00
if (hasValue)
{
2024-10-27 22:56:15 -04:00
size_t i = 0;
2024-10-27 16:31:14 -04:00
p_string = p_json["value"].get<std::string>();
for (std::pair<std::string, std::string> &opt : d_labeled_opts)
2024-10-27 16:31:14 -04:00
{
if (p_json["value"].get<std::string>() == opt.first)
{
d_option = i;
break;
}
i++;
}
if (i == d_labeled_opts.size())
{
if (p_bool) // Allow Manual
d_option = i;
else
d_option = 0;
}
2024-10-27 16:31:14 -04:00
}
else
{
d_option = 0;
p_string = d_labeled_opts[0].first;
2024-10-27 16:31:14 -04:00
}
}
2023-09-06 22:28:55 -04:00
else
{
logger->error("Invalid options on EditableParameter!");
}
}
void EditableParameter::draw()
{
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::Text("%s", d_name.c_str());
if (ImGui::IsItemHovered() && d_description.size() > 0)
ImGui::SetTooltip("%s", d_description.c_str());
ImGui::TableSetColumnIndex(1);
if (d_type == PARAM_STRING)
ImGui::InputText(d_id.c_str(), &p_string);
2024-05-24 23:28:01 -04:00
else if (d_type == PARAM_PASSWORD)
ImGui::InputText(d_id.c_str(), &p_string, ImGuiInputTextFlags_Password);
2023-09-06 22:28:55 -04:00
else if (d_type == PARAM_INT)
ImGui::InputInt(d_id.c_str(), &p_int, 0);
else if (d_type == PARAM_FLOAT)
ImGui::InputDouble(d_id.c_str(), &p_float);
else if (d_type == PARAM_BOOL)
ImGui::Checkbox(d_id.c_str(), &p_bool);
else if (d_type == PARAM_OPTIONS)
ImGui::Combo(d_id.c_str(), &d_option, d_options_str.c_str());
else if (d_type == PARAM_PATH)
file_select->draw();
else if (d_type == PARAM_TIMESTAMP)
date_time_picker->draw();
else if (d_type == PARAM_NOTATED_INT)
notated_int->draw();
2023-11-10 18:48:13 +01:00
else if (d_type == PARAM_COLOR)
ImGui::ColorEdit3(d_id.c_str(), (float *)p_color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel);
else if (d_type == PARAM_BASEBAND_TYPE)
baseband_type.draw_playback_combo(d_id.c_str());
else if (d_type == PARAM_LABELED_OPTIONS)
2024-10-27 16:31:14 -04:00
{
2024-10-27 22:56:15 -04:00
if (ImGui::Combo(d_id.c_str(), &d_option, d_options_str.c_str()) && d_option != (int)d_labeled_opts.size())
p_string = d_labeled_opts[d_option].first;
if (p_bool) // Allow Manual
{
2024-10-27 22:56:15 -04:00
if (d_option != (int)d_labeled_opts.size())
ImGui::BeginDisabled();
ImGui::InputText(std::string(d_id + "_custom").c_str(), &p_string);
2024-10-27 22:56:15 -04:00
if (d_option != (int)d_labeled_opts.size())
ImGui::EndDisabled();
}
2024-10-27 16:31:14 -04:00
}
2023-09-06 22:28:55 -04:00
}
2025-02-01 14:08:53 +01:00
nlohmann::json EditableParameter::getValue() const
2023-09-06 22:28:55 -04:00
{
nlohmann::json v;
if (d_type == PARAM_STRING || d_type == PARAM_PASSWORD || d_type == PARAM_LABELED_OPTIONS)
2023-09-06 22:28:55 -04:00
v = std::string(p_string);
else if (d_type == PARAM_INT)
v = p_int;
else if (d_type == PARAM_FLOAT)
v = p_float;
else if (d_type == PARAM_BOOL)
v = p_bool;
else if (d_type == PARAM_OPTIONS)
v = d_options[d_option];
else if (d_type == PARAM_PATH)
return file_select->getPath();
else if (d_type == PARAM_TIMESTAMP)
v = date_time_picker->get();
else if (d_type == PARAM_NOTATED_INT)
v = notated_int->get();
2023-11-10 18:48:13 +01:00
else if (d_type == PARAM_COLOR)
v = {p_color[0], p_color[1], p_color[2]};
else if (d_type == PARAM_BASEBAND_TYPE)
v = (std::string)baseband_type;
2023-09-06 22:28:55 -04:00
return v;
}
nlohmann::json EditableParameter::setValue(nlohmann::json v)
{
2024-05-24 23:28:01 -04:00
if (d_type == PARAM_STRING || d_type == PARAM_PASSWORD)
2023-09-06 22:28:55 -04:00
p_string = v.get<std::string>();
else if (d_type == PARAM_INT)
p_int = v.get<int>();
else if (d_type == PARAM_FLOAT)
p_float = v.get<double>();
else if (d_type == PARAM_BOOL)
p_bool = v.get<bool>();
else if (d_type == PARAM_OPTIONS)
{
for (int i = 0; i < (int)d_options.size(); i++)
{
if (d_options[i] == v.get<std::string>())
d_option = i;
}
}
else if (d_type == PARAM_PATH)
file_select->setPath(v.get<std::string>());
2023-09-06 22:28:55 -04:00
else if (d_type == PARAM_TIMESTAMP)
date_time_picker->set(v.get<double>());
else if (d_type == PARAM_NOTATED_INT)
notated_int->set(v.get<uint64_t>());
else if (d_type == PARAM_COLOR)
2023-11-10 18:48:13 +01:00
{
std::vector<float> color = v.get<std::vector<float>>();
p_color[0] = color[0];
p_color[1] = color[1];
p_color[2] = color[2];
}
else if (d_type == PARAM_BASEBAND_TYPE)
baseband_type = v.get<std::string>();
else if (d_type == PARAM_LABELED_OPTIONS)
2024-10-27 16:31:14 -04:00
{
2024-10-27 22:56:15 -04:00
size_t i = 0;
2024-10-27 16:31:14 -04:00
p_string = v.get<std::string>();
for (std::pair<std::string, std::string> &opt : d_labeled_opts)
2024-10-27 16:31:14 -04:00
{
if (p_string == opt.first)
{
d_option = i;
break;
}
i++;
}
if (i == d_labeled_opts.size() && p_bool) // Allow manual
2024-10-27 16:31:14 -04:00
d_option = i;
}
2023-09-06 22:28:55 -04:00
return v;
}
}
}