diff --git a/libs/ui/include/psemek/ui/window.hpp b/libs/ui/include/psemek/ui/window.hpp index 148b44b9..e5d87ace 100644 --- a/libs/ui/include/psemek/ui/window.hpp +++ b/libs/ui/include/psemek/ui/window.hpp @@ -15,7 +15,9 @@ namespace psemek::ui virtual label * caption() = 0; virtual std::shared_ptr set_child(std::shared_ptr c) = 0; + virtual on_close_callback on_close() const = 0; virtual void on_close(on_close_callback callback) = 0; + virtual void close() = 0; }; } diff --git a/libs/ui/source/default_element_factory.cpp b/libs/ui/source/default_element_factory.cpp index de132fe9..e685f4f5 100644 --- a/libs/ui/source/default_element_factory.cpp +++ b/libs/ui/source/default_element_factory.cpp @@ -291,6 +291,8 @@ namespace psemek::ui on_close_ = [this] { + if (!parent()) return; + if (auto p = dynamic_cast(parent())) p->remove_child(this); else @@ -329,11 +331,22 @@ namespace psemek::ui return children_range{children_}; } + on_close_callback on_close() const override + { + return on_close_; + } + void on_close(on_close_callback callback) override { on_close_ = std::move(callback); } + void close() override + { + if (on_close_) + on_close_(); + } + bool on_event(mouse_move const & e) override { mouse_ = e.position;