HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
default_selection_delegate.hpp
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
5#pragma once
6
7#include "selection_delegate.hpp"
8#include "../observable.hpp"
9#include "../label.hpp"
10#include <type_traits>
11#include <memory>
12#include <vector>
13
14namespace tt {
15
16template<typename T>
18public:
19 using value_type = T;
20
23 observable<value_type> off_value;
24
25 template<typename OptionList, typename Value, typename OffValue>
26 default_selection_delegate(OptionList &&option_list, Value &&value, OffValue &&off_value) noexcept :
27 options(std::forward<OptionList>(option_list)),
28 value(std::forward<Value>(value)),
29 off_value(std::forward<OffValue>(off_value))
30 {
31 }
32
33 template<typename OptionList, typename Value>
34 default_selection_delegate(OptionList &&option_list, Value &&value) noexcept :
35 options(std::forward<OptionList>(option_list)), value(std::forward<Value>(value)), off_value(value_type{})
36 {
37 }
38
39 callback_ptr_type subscribe(selection_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
40 {
41 value.subscribe(callback_ptr);
42 options.subscribe(callback_ptr);
43 return callback_ptr;
44 }
45
46 void unsubscribe(selection_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
47 {
48 value.unsubscribe(callback_ptr);
49 options.unsubscribe(callback_ptr);
50 }
51
52 void set_selected(selection_widget &sender, ssize_t index) noexcept override
53 {
54 auto options_ = options.cget();
55 if (index == -1 || index >= ssize(options_)) {
56 value = *off_value;
57 } else {
58 value = options_[index].first;
59 }
60 }
61
63 {
64 // Make sure that options isn't being modified by another thread.
65 auto options_ = options.cget();
66
67 auto labels = std::vector<label>{};
68 labels.reserve(size(options_));
69
70 auto index = 0_z;
71 auto selected_index = -1_z;
72 for (auto &&option : options_) {
73 if (value == option.first) {
74 selected_index = index;
75 }
76 labels.push_back(option.second);
77 ++index;
78 }
79
80 return {std::move(labels), selected_index};
81 }
82};
83
84template<typename OptionList, typename Value, typename... Args>
85default_selection_delegate(OptionList &&, Value &&, Args &&...)
86 -> default_selection_delegate<observable_argument_t<std::remove_cvref_t<Value>>>;
87
88template<typename OptionList, typename Value, typename... Args>
90make_unique_default_selection_delegate(OptionList &&option_list, Value &&value, Args &&...args) noexcept
91{
92 using value_type = observable_argument_t<std::remove_cvref_t<Value>>;
93 return std::make_unique<default_selection_delegate<value_type>>(
94 std::forward<OptionList>(option_list), std::forward<Value>(value), std::forward<Args>(args)...);
95}
96
97} // namespace tt
A value which can be observed for modifications.
Definition observable.hpp:464
const_reference cget() const noexcept
Get a constant reference to the shared value.
Definition observable.hpp:524
Definition default_selection_delegate.hpp:17
std::pair< std::vector< label >, ssize_t > options_and_selected(selection_widget const &sender) const noexcept override
Retrieve the label of an option.
Definition default_selection_delegate.hpp:62
callback_ptr_type subscribe(selection_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
Subscribe a callback for notifying the widget of a data change.
Definition default_selection_delegate.hpp:39
void unsubscribe(selection_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
Unsubscribe a callback.
Definition default_selection_delegate.hpp:46
void set_selected(selection_widget &sender, ssize_t index) noexcept override
Called when an option is selected by the user.
Definition default_selection_delegate.hpp:52
Definition selection_delegate.hpp:15
A graphical control element that allows the user to choose only one of a predefined set of mutually e...
Definition selection_widget.hpp:37
T move(T... args)
T reserve(T... args)