← Back to file list Raw

src/CConsole.cpp

#include "CConsole.h"
#include "CEngine.h"
#include "CCommandProcessor.h"
#include "CTerminal.h"
template<typename Ret>
static std::function<Ret(const sol::function&, CConsole*)> GetOutTransformer()
{
return [](const sol::function& func, CConsole* comp) -> Ret
{
sol::table comp_table = comp->GetScriptTable(func.lua_state());
if constexpr (std::is_void_v<Ret>)
{
SafeCallLua(func, comp_table);
//func(comp_table);
}
else
{
sol::object ret = SafeCallLuaReturn(func, comp_table);
return ret.valid() ? ret.as<bool>() : false;
}
};
}
template<typename Ret>
static std::function<sol::object(CFunctionBase<Ret, CConsole*>*, sol::variadic_args)> GetInTransformer()
{
return [](CFunctionBase<Ret, CConsole*>* func, sol::variadic_args va) -> sol::object
{
if(va.size() < 1) { return sol::make_object<int>(va.lua_state(), 1); }
auto arg = va.get<sol::table>(0);
if(!arg.valid()) { return sol::make_object<int>(va.lua_state(), 2); }
sol::state_view state(va.lua_state());
CConsole* console = nullptr;
auto terminal = CEngine::GetInstance()->Components.GetComponentTyped<CTerminal>();
if(terminal->Console && terminal->Console->GetScriptTable(state) == arg)
{
console = terminal->Console.get();
}
if(!console) { return sol::make_object<int>(va.lua_state(), 3); }
sol::object ret = sol::lua_nil;
if constexpr (!std::is_void_v<Ret>)
{
ret = sol::make_object<Ret>(va.lua_state(), func->Call(console));
}
else
{
func->Call(console);
}
return ret;
};
}
CConsole::CConsole()
{
OnInit.SetupLuaTransformers(GetOutTransformer<void>(), GetInTransformer<void>());
OnUpdate.SetupLuaTransformers(GetOutTransformer<void>(), GetInTransformer<void>());
OnDestruct.SetupLuaTransformers(GetOutTransformer<void>(), GetInTransformer<void>());
OnScriptInit += [this](std::shared_ptr<sol::state> _state, sol::table _table) -> bool
{
_table.set_function("init", [this]() { Init(); });
_table.set_function("update", [this]() { Update(); });
auto fieldsMan_pair = CScriptFieldsManager::ValidateFieldsManager(_table);
auto fieldsMan = fieldsMan_pair.first;
fieldsMan->AddField("type", std::make_unique<CFunctionalScriptField>([this](sol::state_view ts) -> sol::object { return sol::make_object(ts, this->GetType()); }));
fieldsMan->AddField("oninit", std::make_unique<CFunctionalScriptField>([this](sol::state_view ts) -> sol::object { return OnInit.GetScriptTable(ts); }));
fieldsMan->AddField("onupdate", std::make_unique<CFunctionalScriptField>([this](sol::state_view ts) -> sol::object { return OnUpdate.GetScriptTable(ts); }));
fieldsMan->AddField("ondestruct", std::make_unique<CFunctionalScriptField>([this](sol::state_view ts) -> sol::object { return OnDestruct.GetScriptTable(ts); }));
fieldsMan->FieldCreationAbility = true;
if(!fieldsMan_pair.second) { fieldsMan->CreateMetaTable(_table); }
return true;
};
}
bool CConsole::IsInitted() const { return m_Initted; }
void CConsole::Init()
{
V_Init();
OnInit(this);
m_Initted = true;
}
void CConsole::DeInit()
{
V_DeInit();
OnDeInit(this);
m_Initted = false;
}
void CConsole::Update()
{
V_Update();
OnUpdate(this);
}
CConsole::~CConsole()
{
OnDestruct(this);
}
void CConsole::V_Init() {}
void CConsole::V_DeInit() {}
void CConsole::V_Update() {}
void CConsole::Print(const std::wstring& text) {}
void CConsole::Error(const std::wstring& err) {}
void CConsole::SetColor(const CColor& text, const CColor& bg) {}
std::pair<CColor, CColor> CConsole::GetColor() const { return { CColor::White, CColor::Black }; }
void CConsole::SendCommand(const std::wstring& cmdline)
{
COMPONENT_CALL(CCommandProcessor, AddCommandToQueue(cmdline));
}