1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
#include "double_list.h"
#include "common/rimgui.h"
#include "common/dsp_source_sink/format_notated.h"
namespace widgets
{
DoubleList::DoubleList(std::string name)
{
d_id = name + "##id" + std::to_string(rand());
current_value = new NotatedNum<double>("Manual " + name + "##id" + std::to_string(rand()), 0, "sps");
}
DoubleList::~DoubleList()
{
delete current_value;
}
bool DoubleList::render()
{
if(available_values.size() == 0)
return current_value->draw();
bool v = RImGui::Combo(d_id.c_str(), &selected_value, values_option_str.c_str());
if (allow_manual && selected_value == (int)available_values.size() - 1)
v = v || current_value->draw();
else if(v)
current_value->set(available_values[selected_value]);
return v;
}
void DoubleList::set_list(std::vector<double> list, bool allow_manual, std::string units)
{
this->allow_manual = allow_manual;
available_values.clear();
values_option_str = "";
selected_value = 0;
available_values = list;
for (double &v : available_values)
values_option_str += format_notated(v, units) + '\0';
if (allow_manual)
{
available_values.push_back(-1);
values_option_str += "Manual";
values_option_str += '\0';
}
current_value->set(available_values[selected_value]);
}
double DoubleList::get_value()
{
if (!available_values.empty() &&
(!allow_manual || selected_value != (int)available_values.size() - 1))
current_value->set(available_values[selected_value]);
return current_value->get();
}
bool DoubleList::set_value(double v, double manual_max)
{
for (int i = 0; i < (int)available_values.size(); i++)
{
if (v == available_values[i])
{
selected_value = i;
current_value->set(v);
return true;
}
}
if (allow_manual && manual_max != 0 && v <= manual_max)
{
selected_value = (int)available_values.size() - 1;
current_value->set(v);
return true;
}
return false;
}
}
|