Loading...
Searching...
No Matches
StringListControl.hpp
1#pragma once
2#include <halp/static_string.hpp>
3
4#include <ossia/network/value/value.hpp>
5
6#include <algorithm>
7#include <limits>
8#include <string>
9#include <string_view>
10#include <vector>
11
12namespace Threedim
13{
14
15struct string_list_values : std::vector<std::string>
16{
17 using std::vector<std::string>::vector;
18 using std::vector<std::string>::operator=;
19};
20
21inline const std::string* string_list_row_text(const ossia::value& row) noexcept
22{
23 if(auto str = row.target<std::string>())
24 return str;
25 if(auto pair = row.target<std::vector<ossia::value>>(); pair && pair->size() == 2)
26 return (*pair)[1].target<std::string>();
27 return nullptr;
28}
29
30inline bool from_ossia_value(const ossia::value& src, string_list_values& dst)
31{
32 dst.clear();
33 if(auto str = src.target<std::string>())
34 {
35 dst.push_back(*str);
36 return true;
37 }
38 if(auto list = src.target<std::vector<ossia::value>>())
39 {
40 dst.reserve(list->size());
41 for(const auto& row : *list)
42 if(auto text = string_list_row_text(row))
43 dst.push_back(*text);
44 return true;
45 }
46 return false;
47}
48
49inline ossia::value keyed_string_list(const ossia::value& src)
50{
51 std::vector<ossia::value> rows;
52 if(auto str = src.target<std::string>())
53 {
54 rows.emplace_back(std::vector<ossia::value>{10000, *str});
55 return rows;
56 }
57
58 auto list = src.target<std::vector<ossia::value>>();
59 if(!list)
60 return src;
61
62 int next_key = 10000;
63 for(const auto& row : *list)
64 if(auto pair = row.target<std::vector<ossia::value>>(); pair && pair->size() == 2)
65 if(auto key = (*pair)[0].target<int>(); key && *key < std::numeric_limits<int>::max())
66 next_key = std::max(next_key, *key + 1);
67
68 rows.reserve(list->size());
69 for(const auto& row : *list)
70 {
71 if(auto pair = row.target<std::vector<ossia::value>>();
72 pair && pair->size() == 2 && (*pair)[0].target<int>()
73 && (*pair)[1].target<std::string>())
74 rows.push_back(row);
75 else if(auto str = row.target<std::string>())
76 rows.emplace_back(std::vector<ossia::value>{next_key++, *str});
77 }
78 return rows;
79}
80
81template <halp::static_string Name>
83{
84 enum class widget
85 {
86 string_list
87 };
88 static constexpr auto name() { return std::string_view{Name.value}; }
89 static ossia::value migrate_value(const ossia::value& v)
90 {
91 return keyed_string_list(v);
92 }
94};
95
96}
STL namespace.
Definition StringListControl.hpp:83
Definition StringListControl.hpp:16