diff --git a/libs/ui/include/psemek/ui/event_interceptor.hpp b/libs/ui/include/psemek/ui/event_interceptor.hpp new file mode 100644 index 00000000..a39dce5b --- /dev/null +++ b/libs/ui/include/psemek/ui/event_interceptor.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include + +#include + +namespace psemek::ui +{ + + struct event_interceptor + : element + { + children_range children() const override { return children_; } + + virtual std::shared_ptr set_child(std::shared_ptr c); + + geom::box size_constraints() const override; + + struct shape const & shape() const override; + void reshape(geom::box const & bbox) override; + + void on_mouse_move(std::function callback); + void on_mouse_click(std::function callback); + void on_mouse_wheel(std::function callback); + void on_key_press(std::function callback); + + bool on_event(mouse_move const & event) override; + bool on_event(mouse_click const & event) override; + bool on_event(mouse_wheel const & event) override; + bool on_event(key_press const & event) override; + + void draw(painter &) const override {} + + private: + std::shared_ptr child_; + element * children_[1]{nullptr}; + + std::function mouse_move_callback_; + std::function mouse_click_callback_; + std::function mouse_wheel_callback_; + std::function key_press_callback_; + }; + +} diff --git a/libs/ui/include/psemek/ui/key_interceptor.hpp b/libs/ui/include/psemek/ui/key_interceptor.hpp deleted file mode 100644 index 8dd06ddc..00000000 --- a/libs/ui/include/psemek/ui/key_interceptor.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include - -#include - -namespace psemek::ui -{ - - struct key_interceptor - : element - { - children_range children() const override { return children_; } - - virtual std::shared_ptr set_child(std::shared_ptr c); - - geom::box size_constraints() const override; - - struct shape const & shape() const override; - void reshape(geom::box const & bbox) override; - - void on_key_down(std::function callback); - - bool on_event(key_press const & event) override; - - void draw(painter &) const override {} - - private: - std::shared_ptr child_; - element * children_[1]{nullptr}; - - std::function callback_; - }; - -} diff --git a/libs/ui/source/event_interceptor.cpp b/libs/ui/source/event_interceptor.cpp new file mode 100644 index 00000000..fa6d41f8 --- /dev/null +++ b/libs/ui/source/event_interceptor.cpp @@ -0,0 +1,88 @@ +#include +#include + +namespace psemek::ui +{ + + std::shared_ptr event_interceptor::set_child(std::shared_ptr c) + { + auto old = std::move(child_); + if (old) old->set_parent(nullptr); + + child_ = std::move(c); + if (child_) child_->set_parent(this); + children_[0] = child_.get(); + + return old; + } + + geom::box event_interceptor::size_constraints() const + { + if (child_) + return child_->size_constraints(); + return element::size_constraints(); + } + + shape const & event_interceptor::shape() const + { + static const null_shape fallback_shape; + if (child_) + return child_->shape(); + return fallback_shape; + } + + void event_interceptor::reshape(geom::box const & bbox) + { + if (child_) + child_->reshape(bbox); + } + + void event_interceptor::on_mouse_move(std::function callback) + { + mouse_move_callback_ = std::move(callback); + } + + void event_interceptor::on_mouse_click(std::function callback) + { + mouse_click_callback_ = std::move(callback); + } + + void event_interceptor::on_mouse_wheel(std::function callback) + { + mouse_wheel_callback_ = std::move(callback); + } + + void event_interceptor::on_key_press(std::function callback) + { + key_press_callback_ = std::move(callback); + } + + bool event_interceptor::on_event(mouse_move const & event) + { + if (mouse_move_callback_) + return mouse_move_callback_(event); + return false; + } + + bool event_interceptor::on_event(mouse_click const & event) + { + if (mouse_click_callback_) + return mouse_click_callback_(event); + return false; + } + + bool event_interceptor::on_event(mouse_wheel const & event) + { + if (mouse_wheel_callback_) + return mouse_wheel_callback_(event); + return false; + } + + bool event_interceptor::on_event(key_press const & event) + { + if (key_press_callback_) + return key_press_callback_(event); + return false; + } + +} diff --git a/libs/ui/source/key_interceptor.cpp b/libs/ui/source/key_interceptor.cpp deleted file mode 100644 index 9db47eb8..00000000 --- a/libs/ui/source/key_interceptor.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include - -namespace psemek::ui -{ - - std::shared_ptr key_interceptor::set_child(std::shared_ptr c) - { - auto old = std::move(child_); - if (old) old->set_parent(nullptr); - - child_ = std::move(c); - if (child_) child_->set_parent(this); - children_[0] = child_.get(); - - return old; - } - - geom::box key_interceptor::size_constraints() const - { - if (child_) - return child_->size_constraints(); - return element::size_constraints(); - } - - shape const & key_interceptor::shape() const - { - static const null_shape fallback_shape; - if (child_) - return child_->shape(); - return fallback_shape; - } - - void key_interceptor::reshape(geom::box const & bbox) - { - if (child_) - child_->reshape(bbox); - } - - void key_interceptor::on_key_down(std::function callback) - { - callback_ = std::move(callback); - } - - bool key_interceptor::on_event(key_press const & event) - { - if (callback_ && event.down) - { - return callback_(event.key); - } - - return false; - } - -}