HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
default_tab_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 "tab_delegate.hpp"
8#include "../observable.hpp"
9#include "../cast.hpp"
10#include <type_traits>
11#include <memory>
12#include <unordered_map>
13
14namespace tt {
15
16template<typename T>
18public:
19 using value_type = T;
20
23
24 template<typename Value>
25 default_tab_delegate(Value &&value) noexcept :
26 value(std::forward<Value>(value)) {
27 }
28
29 callback_ptr_type subscribe(tab_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
30 {
31 value.subscribe(callback_ptr);
32 return callback_ptr;
33 }
34
35 void unsubscribe(tab_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
36 {
37 value.unsubscribe(callback_ptr);
38 }
39
40 void add_tab(tab_widget &sender, size_t key, size_t index) noexcept override
41 {
42 tt_axiom(not tab_indices.contains(key));
43 tab_indices[key] = index;
44 }
45
46 [[nodiscard]] ssize_t index(tab_widget &sender) noexcept override
47 {
48 auto i = tab_indices.find(*value);
49 if (i == tab_indices.end()) {
50 return -1;
51 } else {
52 return static_cast<ssize_t>(i->second);
53 }
54 }
55};
56
57template<typename Value>
59
60template<typename Value>
61std::unique_ptr<tab_delegate> make_unique_default_tab_delegate(Value &&value) noexcept
62{
63 using value_type = observable_argument_t<std::remove_cvref_t<Value>>;
64 return std::make_unique<default_tab_delegate<value_type>>(std::forward<Value>(value));
65}
66
67} // namespace tt
A value which can be observed for modifications.
Definition observable.hpp:464
Definition default_tab_delegate.hpp:17
Definition tab_delegate.hpp:13
A graphical element that shows only one of a predefined set of mutually exclusive child widgets.
Definition tab_widget.hpp:32
T end(T... args)
T find(T... args)