33 constexpr static auto prefix = Name /
"audio-device";
41 observer<audio_direction>
direction = audio_direction::bidirectional;
46 _grid_widget = std::make_unique<grid_widget<prefix>>(
this);
49 _sync_device_list_task = sync_device_list();
53 [[nodiscard]] generator<widget const&> children(
bool include_invisible)
const noexcept override
55 co_yield *_grid_widget;
60 _grid_constraints = _grid_widget->update_constraints();
61 return _grid_constraints;
64 void set_layout(widget_layout
const& context)
noexcept override
67 hilet grid_rectangle = context.rectangle();
68 _grid_shape = {_grid_constraints, grid_rectangle, theme<prefix>.cap_height(
this)};
71 _grid_widget->set_layout(context.transform(_grid_shape));
74 void draw(widget_draw_context
const& context)
noexcept override
77 _grid_widget->draw(context);
81 hitbox hitbox_test(point2i position)
const noexcept override
85 r = _grid_widget->hitbox_test_from_parent(position, r);
92 [[nodiscard]]
bool accepts_keyboard_focus(keyboard_focus_group group)
const noexcept override
95 return _grid_widget->accepts_keyboard_focus(group);
103 hi::audio_system *_audio_system;
108 box_constraints _grid_constraints;
109 box_shape _grid_shape;
113 selection_widget<prefix> *_device_selection_widget =
nullptr;
115 observer<std::vector<std::pair<std::string, label>>> _device_list;
117 hi::scoped_task<> _sync_device_list_task;
119 [[nodiscard]] hi::scoped_task<> sync_device_list() noexcept
123 auto proxy = _device_list.copy();
125 for (
auto& device : _audio_system->devices()) {
126 if (device.state() == hi::audio_device_state::active and to_bool(device.direction() & *
direction)) {
127 proxy->emplace_back(device.id(), device.label());
132 co_await when_any(*_audio_system,
direction);
bool compare_store(T &lhs, U &&rhs) noexcept
Compare then store if there was a change.
Definition utility.hpp:212