diff --git a/libs/ui/include/psemek/ui/selector.hpp b/libs/ui/include/psemek/ui/selector.hpp index cf78429a..c2b55037 100644 --- a/libs/ui/include/psemek/ui/selector.hpp +++ b/libs/ui/include/psemek/ui/selector.hpp @@ -33,9 +33,13 @@ namespace psemek::ui virtual geom::interval y_range(std::size_t index) const; + using callback_type = std::function; + virtual std::optional selected() const { return selected_; } - virtual void on_selected(std::function callback); - virtual void on_submenu(std::function callback); + virtual void on_selected(callback_type callback); + virtual void on_submenu(callback_type callback); + + virtual callback_type on_selected() const; protected: @@ -54,10 +58,10 @@ namespace psemek::ui std::optional selected_; - std::function callback_; - std::function submenu_callback_; + callback_type callback_; + callback_type submenu_callback_; }; - bool spawn(element * root, std::shared_ptr selector, geom::point const & position, std::function on_selected); + bool spawn(element * root, std::shared_ptr selector, geom::point const & position); } diff --git a/libs/ui/source/selector.cpp b/libs/ui/source/selector.cpp index e41de2f0..3d71a9bf 100644 --- a/libs/ui/source/selector.cpp +++ b/libs/ui/source/selector.cpp @@ -161,17 +161,22 @@ namespace psemek::ui return child_boxes_[index][1]; } - void selector::on_selected(std::function callback) + void selector::on_selected(callback_type callback) { callback_ = std::move(callback); } - void selector::on_submenu(std::function callback) + void selector::on_submenu(callback_type callback) { submenu_callback_ = std::move(callback); } - bool spawn(element * root, std::shared_ptr selector, geom::point const & position, std::function on_selected) + selector::callback_type selector::on_selected() const + { + return callback_; + } + + bool spawn(element * root, std::shared_ptr selector, geom::point const & position) { ui::screen * screen = find_last_parent_of_type(root); if (!screen) @@ -191,9 +196,10 @@ namespace psemek::ui p->remove_child(event_interceptor); }; - selector->on_selected([close, cb = std::move(on_selected)](std::size_t index){ + selector->on_selected([close, cb = selector->on_selected()](std::size_t index){ close(); - cb(index); + if (cb) + cb(index); }); event_interceptor->on_mouse_click([close](ui::mouse_click const & e) -> bool {