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 {
17
23public:
24 using notifier_type = notifier<>;
25 using callback_token = notifier_type::callback_token;
26 using callback_proto = notifier_type::callback_proto;
27
28 virtual ~selection_delegate() = default;
29
30 virtual void init(widget& sender) noexcept {}
31
32 virtual void deinit(widget& sender) noexcept {}
33
39 virtual void set_selected(widget& sender, ssize_t index) noexcept {};
40
45 virtual std::pair<std::vector<label>, ssize_t> options_and_selected(widget const& sender) const noexcept
46 {
47 return {{}, -1};
48 }
49
52 callback_token
53 subscribe(forward_of<callback_proto> auto&& callback, callback_flags flags = callback_flags::synchronous) noexcept
54 {
55 return _notifier.subscribe(hi_forward(callback), flags);
56 }
57
58protected:
59 notifier_type _notifier;
60};
61
67template<typename T>
69public:
70 using value_type = T;
71 using option_type = std::pair<value_type, label>;
72 using options_type = std::vector<option_type>;
73
74 observer<value_type> value;
75 observer<options_type> options;
76 observer<value_type> off_value;
77
85 forward_of<observer<value_type>> auto&& value,
86 forward_of<observer<options_type>> auto&& options,
87 forward_of<observer<value_type>> auto&& off_value) noexcept :
88 value(hi_forward(value)), options(hi_forward(options)), off_value(hi_forward(off_value))
89 {
90 // clang-format off
91 _value_cbt = this->value.subscribe([&](auto...){ this->_notifier(); });
92 _options_cbt = this->options.subscribe([&](auto...){ this->_notifier(); });
93 _off_value_cbt = this->off_value.subscribe([&](auto...){ this->_notifier(); });
94 // clang-format on
95 }
96
103 forward_of<observer<value_type>> auto&& value,
104 forward_of<observer<options_type>> auto&& options) noexcept :
105 default_selection_delegate(hi_forward(value), hi_forward(options), value_type{})
106 {
107 }
108
109 void set_selected(widget& sender, ptrdiff_t index) noexcept override
110 {
111 if (index == -1 || index >= std::ssize(*options)) {
112 value = *off_value;
113 } else {
114 value = (*options)[index].first;
115 }
116 }
117
118 std::pair<std::vector<label>, ptrdiff_t> options_and_selected(widget const& sender) const noexcept override
119 {
120 auto labels = std::vector<label>{};
121 labels.reserve(options->size());
122
123 auto index = 0_z;
124 auto selected_index = -1_z;
125 for (auto&& option : *options) {
126 if (*value == option.first) {
127 selected_index = index;
128 }
129 labels.push_back(option.second);
130 ++index;
131 }
132
133 return {std::move(labels), selected_index};
134 }
135
136private:
137 typename decltype(value)::callback_token _value_cbt;
138 typename decltype(options)::callback_token _options_cbt;
139 typename decltype(off_value)::callback_token _off_value_cbt;
140};
141
152 make_default_selection_delegate(auto&& value, auto&& options, auto&&...off_value) noexcept
153 requires(sizeof...(off_value) <= 1) and
154 requires
155{
156 default_selection_delegate<observer_decay_t<decltype(value)>>{
157 hi_forward(value), hi_forward(options), hi_forward(off_value)...};
158}
159{
160 return std::make_shared<default_selection_delegate<observer_decay_t<decltype(value)>>>(
161 hi_forward(value), hi_forward(options), hi_forward(off_value)...);
162}
163
164}} // namespace hi::v1
Functionality for labels, text and icons.
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
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:152
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
Definition widget.hpp:26
A delegate that controls the state of a selection_widget.
Definition selection_delegate.hpp:22
virtual std::pair< std::vector< label >, ssize_t > options_and_selected(widget const &sender) const noexcept
Retrieve the label of an option.
Definition selection_delegate.hpp:45
virtual void set_selected(widget &sender, ssize_t index) noexcept
Called when an option is selected by the user.
Definition selection_delegate.hpp:39
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:53
A delegate that control the state of a selection_widget.
Definition selection_delegate.hpp:68
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:84
std::pair< std::vector< label >, ptrdiff_t > options_and_selected(widget const &sender) const noexcept override
Retrieve the label of an option.
Definition selection_delegate.hpp:118
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:102
T make_shared(T... args)
T move(T... args)
T reserve(T... args)