libui: Add Actions

This allows components like Buttons to take in capturing lambdas
This commit is contained in:
apio 2023-09-27 18:51:38 +02:00
parent 54afd7c2b0
commit d4e834f734
Signed by: apio
GPG Key ID: B8A7D06E42258954

68
libui/include/ui/Action.h Normal file
View File

@ -0,0 +1,68 @@
#pragma once
#include <luna/Heap.h>
namespace ui
{
class Action
{
public:
Action()
{
m_action = nullptr;
}
Action(Action&& other) : m_action(other.m_action)
{
other.m_action = nullptr;
}
template <typename T> Action(T&& function)
{
m_action = new (std::nothrow) ActionImpl<T>(move(function));
}
template <typename T> Action& operator=(T&& function)
{
if (m_action) delete m_action;
m_action = new (std::nothrow) ActionImpl<T>(move(function));
return *this;
}
void operator()()
{
check(m_action);
return m_action->call();
}
~Action()
{
if (m_action) delete m_action;
}
private:
class ActionBase
{
public:
virtual void call() = 0;
virtual ~ActionBase() = default;
};
template <typename T> class ActionImpl final : public ActionBase
{
public:
ActionImpl(T&& function) : m_function(move(function))
{
}
void call()
{
return m_function();
}
private:
T m_function;
};
ActionBase* m_action;
};
}