Add ui::key_interceptor
This commit is contained in:
parent
ecf69a85e6
commit
4281093b9d
2 changed files with 90 additions and 0 deletions
35
libs/ui/include/psemek/ui/key_interceptor.hpp
Normal file
35
libs/ui/include/psemek/ui/key_interceptor.hpp
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
#pragma once
|
||||
|
||||
#include <psemek/ui/element.hpp>
|
||||
|
||||
#include <functional>
|
||||
|
||||
namespace psemek::ui
|
||||
{
|
||||
|
||||
struct key_interceptor
|
||||
: element
|
||||
{
|
||||
children_range children() const override { return children_; }
|
||||
|
||||
virtual std::shared_ptr<element> set_child(std::shared_ptr<element> c);
|
||||
|
||||
geom::box<float, 2> size_constraints() const override;
|
||||
|
||||
struct shape const & shape() const override;
|
||||
void reshape(geom::box<float, 2> const & bbox) override;
|
||||
|
||||
void on_key_down(std::function<bool(SDL_Keycode)> callback);
|
||||
|
||||
bool on_event(key_press const & event) override;
|
||||
|
||||
void draw(painter &) const override {}
|
||||
|
||||
private:
|
||||
std::shared_ptr<element> child_;
|
||||
element * children_[1]{nullptr};
|
||||
|
||||
std::function<bool(SDL_Keycode)> callback_;
|
||||
};
|
||||
|
||||
}
|
||||
55
libs/ui/source/key_interceptor.cpp
Normal file
55
libs/ui/source/key_interceptor.cpp
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
#include <psemek/ui/key_interceptor.hpp>
|
||||
#include <psemek/ui/null_shape.hpp>
|
||||
|
||||
namespace psemek::ui
|
||||
{
|
||||
|
||||
std::shared_ptr<element> key_interceptor::set_child(std::shared_ptr<element> 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<float, 2> 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<float, 2> const & bbox)
|
||||
{
|
||||
if (child_)
|
||||
child_->reshape(bbox);
|
||||
}
|
||||
|
||||
void key_interceptor::on_key_down(std::function<bool(SDL_Keycode)> callback)
|
||||
{
|
||||
callback_ = std::move(callback);
|
||||
}
|
||||
|
||||
bool key_interceptor::on_event(key_press const & event)
|
||||
{
|
||||
if (callback_ && event.down)
|
||||
{
|
||||
return callback_(event.key);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue