File: double_list.cpp

package info (click to toggle)
satdump 1.2.2%2Bgb79af48-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 81,648 kB
  • sloc: cpp: 276,768; ansic: 164,598; lisp: 1,219; sh: 283; xml: 106; makefile: 7
file content (85 lines) | stat: -rw-r--r-- 2,332 bytes parent folder | download | duplicates (2)
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;
    }
}