HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
selection_delegate.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
9#pragma once
10
11#include "../label.hpp"
12#include <memory>
13#include <functional>
14#include <vector>
15
16namespace hi { inline namespace v1 {
17class selection_widget;
18
24public:
25 using notifier_type = notifier<>;
26 using callback_token = notifier_type::callback_token;
27 using callback_proto = notifier_type::callback_proto;
28
29 virtual ~selection_delegate() = default;
30
31 virtual void init(selection_widget& sender) noexcept {}
32
33 virtual void deinit(selection_widget& sender) noexcept {}
34
40 virtual void set_selected(selection_widget& sender, ssize_t index) noexcept {};
41
47 {
48 return {{}, -1};
49 }
50
53 callback_token
54 subscribe(forward_of<callback_proto> auto&& callback, callback_flags flags = callback_flags::synchronous) noexcept
55 {
56 return _notifier.subscribe(hi_forward(callback), flags);
57 }
58
59protected:
60 notifier_type _notifier;
61};
62
68template<typename T>
70public:
71 using value_type = T;
72 using option_type = std::pair<value_type, label>;
73 using options_type = std::vector<option_type>;
74
75 observer<value_type> value;
76 observer<options_type> options;
77 observer<value_type> off_value;
78
86 forward_of<observer<value_type>> auto&& value,
87 forward_of<observer<options_type>> auto&& options,
88 forward_of<observer<value_type>> auto&& off_value) noexcept :
89 value(hi_forward(value)), options(hi_forward(options)), off_value(hi_forward(off_value))
90 {
91 // clang-format off
92 _value_cbt = this->value.subscribe([&](auto...){ this->_notifier(); });
93 _options_cbt = this->options.subscribe([&](auto...){ this->_notifier(); });
94 _off_value_cbt = this->off_value.subscribe([&](auto...){ this->_notifier(); });
95 // clang-format on
96 }
97
104 forward_of<observer<value_type>> auto&& value,
105 forward_of<observer<options_type>> auto&& options) noexcept :
106 default_selection_delegate(hi_forward(value), hi_forward(options), value_type{})
107 {
108 }
109
110 void set_selected(selection_widget& sender, ptrdiff_t index) noexcept override
111 {
112 if (index == -1 || index >= std::ssize(*options)) {
113 value = *off_value;
114 } else {
115 value = (*options)[index].first;
116 }
117 }
118
119 std::pair<std::vector<label>, ptrdiff_t> options_and_selected(selection_widget const& sender) const noexcept override
120 {
121 auto labels = std::vector<label>{};
122 labels.reserve(options->size());
123
124 auto index = 0_z;
125 auto selected_index = -1_z;
126 for (auto&& option : *options) {
127 if (*value == option.first) {
128 selected_index = index;
129 }
130 labels.push_back(option.second);
131 ++index;
132 }
133
134 return {std::move(labels), selected_index};
135 }
136
137private:
138 typename decltype(value)::callback_token _value_cbt;
139 typename decltype(options)::callback_token _options_cbt;
140 typename decltype(off_value)::callback_token _off_value_cbt;
141};
142
153 make_default_selection_delegate(auto&& value, auto&& options, auto&&...off_value) noexcept
154 requires(sizeof...(off_value) <= 1) and
155 requires
156{
157 default_selection_delegate<observer_decay_t<decltype(value)>>{
158 hi_forward(value), hi_forward(options), hi_forward(off_value)...};
159}
160{
161 return std::make_shared<default_selection_delegate<observer_decay_t<decltype(value)>>>(
162 hi_forward(value), hi_forward(options), hi_forward(off_value)...);
163}
164
165}} // namespace hi::v1
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
Functionality for labels, text and icons.
std::shared_ptr< selection_delegate > make_default_selection_delegate(auto &&value, auto &&options, auto &&...off_value) noexcept
Create a shared pointer to a default selection delegate.
Definition selection_delegate.hpp:153
DOXYGEN BUG.
Definition algorithm.hpp:15
geometry/margins.hpp
Definition assert.hpp:18
A delegate that controls the state of a selection_widget.
Definition selection_delegate.hpp:23
virtual std::pair< std::vector< label >, ssize_t > options_and_selected(selection_widget const &sender) const noexcept
Retrieve the label of an option.
Definition selection_delegate.hpp:46
virtual void set_selected(selection_widget &sender, ssize_t index) noexcept
Called when an option is selected by the user.
Definition selection_delegate.hpp:40
callback_token subscribe(forward_of< callback_proto > auto &&callback, callback_flags flags=callback_flags::synchronous) noexcept
Subscribe a callback for notifying the widget of a data change.
Definition selection_delegate.hpp:54
A delegate that control the state of a selection_widget.
Definition selection_delegate.hpp:69
std::pair< std::vector< label >, ptrdiff_t > options_and_selected(selection_widget const &sender) const noexcept override
Retrieve the label of an option.
Definition selection_delegate.hpp:119
default_selection_delegate(forward_of< observer< value_type > > auto &&value, forward_of< observer< options_type > > auto &&options, forward_of< observer< value_type > > auto &&off_value) noexcept
Construct a default selection delegate.
Definition selection_delegate.hpp:85
default_selection_delegate(forward_of< observer< value_type > > auto &&value, forward_of< observer< options_type > > auto &&options) noexcept
Construct a default selection delegate.
Definition selection_delegate.hpp:103
A graphical control element that allows the user to choose only one of a predefined set of mutually e...
Definition selection_widget.hpp:44
T make_shared(T... args)
T move(T... args)
T reserve(T... args)