diff --git a/libs/ui/include/psemek/ui/selector.hpp b/libs/ui/include/psemek/ui/selector.hpp index ef386a3b..2a7b9c26 100644 --- a/libs/ui/include/psemek/ui/selector.hpp +++ b/libs/ui/include/psemek/ui/selector.hpp @@ -39,7 +39,7 @@ namespace psemek::ui using callback_type = std::function; - virtual std::optional selected() const { return selected_; } + virtual std::optional selected() const; virtual void on_selected(callback_type callback); virtual void on_mouseover(std::function)> callback); @@ -65,7 +65,7 @@ namespace psemek::ui box_shape shape_; std::vector> submenu_; - selector * active_submenu_ = nullptr; + std::optional active_submenu_; float active_submenu_y_ = 0.f; std::vector> child_boxes_; diff --git a/libs/ui/source/selector.cpp b/libs/ui/source/selector.cpp index 3bda9d96..d51c363c 100644 --- a/libs/ui/source/selector.cpp +++ b/libs/ui/source/selector.cpp @@ -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 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 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; } }