Highlight the option that owns the active submenu in ui::selector

This commit is contained in:
Nikita Lisitsa 2022-12-23 10:01:24 +03:00
parent d6f53ed76f
commit e1d4608e3f
2 changed files with 23 additions and 12 deletions

View file

@ -39,7 +39,7 @@ namespace psemek::ui
using callback_type = std::function<void(std::size_t)>;
virtual std::optional<std::size_t> selected() const { return selected_; }
virtual std::optional<std::size_t> selected() const;
virtual void on_selected(callback_type callback);
virtual void on_mouseover(std::function<void(std::optional<std::size_t>)> callback);
@ -65,7 +65,7 @@ namespace psemek::ui
box_shape shape_;
std::vector<std::shared_ptr<selector>> submenu_;
selector * active_submenu_ = nullptr;
std::optional<std::size_t> active_submenu_;
float active_submenu_y_ = 0.f;
std::vector<geom::box<float, 2>> child_boxes_;

View file

@ -62,13 +62,14 @@ namespace psemek::ui
if (active_submenu_)
{
auto sc = active_submenu_->size_constraints();
auto submenu = submenu_[*active_submenu_];
auto sc = submenu->size_constraints();
geom::box<float, 2> box{{{0.f, sc[0].min}, {0.f, sc[1].min}}};
box[0] += shape_.box[0].max;
box[1] += active_submenu_y_;
active_submenu_->reshape(box);
submenu->reshape(box);
}
}
@ -199,6 +200,15 @@ namespace psemek::ui
return child_boxes_[index][1];
}
std::optional<std::size_t> selector::selected() const
{
if (active_submenu_)
return active_submenu_;
if (selected_)
return selected_;
return std::nullopt;
}
void selector::on_selected(callback_type callback)
{
callback_ = std::move(callback);
@ -218,12 +228,12 @@ namespace psemek::ui
{
release_submenu();
auto new_submenu = submenu_[index].get();
if (new_submenu)
auto submenu = submenu_[index].get();
if (submenu)
{
children_range_[0] = new_submenu;
active_submenu_ = new_submenu;
new_submenu->set_parent(this);
children_range_[0] = submenu;
active_submenu_ = index;
submenu->set_parent(this);
active_submenu_y_ = child_boxes_[index][1].min;
post_reshape();
}
@ -233,9 +243,10 @@ namespace psemek::ui
{
if (active_submenu_)
{
active_submenu_->release_submenu();
active_submenu_->set_parent(nullptr);
active_submenu_ = nullptr;
auto submenu = submenu_[*active_submenu_].get();
submenu->release_submenu();
submenu->set_parent(nullptr);
active_submenu_ = std::nullopt;
children_range_[0] = nullptr;
}
}