feat(script): added code to actually run lua code
This commit is contained in:
parent
c081469a49
commit
99440cc3ee
7 changed files with 61 additions and 13 deletions
|
@ -138,6 +138,7 @@ result<std::shared_ptr<Service>, NoSuchService> DataModel::GetService(std::strin
|
|||
|
||||
services[className] = std::dynamic_pointer_cast<Service>(INSTANCE_MAP[className]->constructor());
|
||||
AddChild(std::dynamic_pointer_cast<Instance>(services[className]));
|
||||
services[className]->InitService();
|
||||
|
||||
return std::dynamic_pointer_cast<Service>(services[className]);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ void JointsService::InitService() {
|
|||
initialized = true;
|
||||
|
||||
// Clear children before any new joints are added
|
||||
for (std::shared_ptr<Instance> inst : dataModel().value()->GetService<JointsService>()->GetChildren()) {
|
||||
for (std::shared_ptr<Instance> inst : GetChildren()) {
|
||||
inst->Destroy();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
#include "script.h"
|
||||
#include "logger.h"
|
||||
#include "objects/base/instance.h"
|
||||
#include "objects/base/member.h"
|
||||
#include "objects/script/scriptcontext.h"
|
||||
#include <luajit-2.1/lauxlib.h>
|
||||
#include <luajit-2.1/lua.h>
|
||||
|
||||
const InstanceType Script::TYPE = {
|
||||
.super = &Instance::TYPE,
|
||||
|
@ -25,13 +29,22 @@ Script::Script(): Instance(&TYPE) {
|
|||
}},
|
||||
}
|
||||
});
|
||||
|
||||
source = "print \"Hello, world!\"";
|
||||
}
|
||||
|
||||
Script::~Script() {
|
||||
}
|
||||
|
||||
void Script::Run() {
|
||||
lua_State* L = dataModel().value()->GetService<ScriptContext>()->state;
|
||||
|
||||
luaL_loadstring(L, source.c_str());
|
||||
int status = lua_pcall(L, 0, LUA_MULTRET, 0);
|
||||
if (status != 0) {
|
||||
Logger::error(lua_tostring(L, -1));
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void Script::Stop() {
|
||||
|
|
|
@ -1,6 +1,14 @@
|
|||
#include "scriptcontext.h"
|
||||
#include "logger.h"
|
||||
#include <luajit-2.1/lauxlib.h>
|
||||
#include <luajit-2.1/lua.h>
|
||||
#include <luajit-2.1/lualib.h>
|
||||
|
||||
static int redirectPrint(lua_State*);
|
||||
static const struct luaL_Reg luaglobals [] = {
|
||||
{"print", redirectPrint},
|
||||
{NULL, NULL} /* end of array */
|
||||
};
|
||||
|
||||
const InstanceType ScriptContext::TYPE = {
|
||||
.super = &Instance::TYPE,
|
||||
|
@ -26,4 +34,28 @@ void ScriptContext::InitService() {
|
|||
initialized = true;
|
||||
|
||||
state = luaL_newstate();
|
||||
luaL_openlibs(state);
|
||||
|
||||
// Override print
|
||||
// https://stackoverflow.com/a/4514193/16255372
|
||||
|
||||
lua_getglobal(state, "_G");
|
||||
luaL_register(state, NULL, luaglobals);
|
||||
lua_pop(state, 1);
|
||||
}
|
||||
|
||||
static int redirectPrint(lua_State* L) {
|
||||
std::string buf;
|
||||
|
||||
int nargs = lua_gettop(L);
|
||||
|
||||
for (int i=1; i <= nargs; i++) {
|
||||
std::string arg(lua_tostring(L, -1));
|
||||
lua_pop(L, 1);
|
||||
buf += arg;
|
||||
}
|
||||
|
||||
Logger::infof(buf);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -23,7 +23,7 @@ void ServerScriptService::InitService() {
|
|||
initialized = true;
|
||||
}
|
||||
|
||||
void Service::OnRun() {
|
||||
void ServerScriptService::OnRun() {
|
||||
auto workspace = dataModel().value()->GetService<Workspace>();
|
||||
for (auto it = workspace->GetDescendantsStart(); it != workspace->GetDescendantsEnd(); it++) {
|
||||
if (!it->IsA<Script>()) continue;
|
||||
|
|
|
@ -39,17 +39,19 @@ inline bool isDarkMode() {
|
|||
|
||||
QtMessageHandler defaultMessageHandler = nullptr;
|
||||
|
||||
std::map<QtMsgType, Logger::LogLevel> QT_MESSAGE_TYPE_TO_LOG_LEVEL = {
|
||||
{ QtMsgType::QtInfoMsg, Logger::LogLevel::INFO },
|
||||
{ QtMsgType::QtSystemMsg, Logger::LogLevel::INFO },
|
||||
{ QtMsgType::QtDebugMsg, Logger::LogLevel::DEBUG },
|
||||
{ QtMsgType::QtWarningMsg, Logger::LogLevel::WARNING },
|
||||
{ QtMsgType::QtCriticalMsg, Logger::LogLevel::ERROR },
|
||||
{ QtMsgType::QtFatalMsg, Logger::LogLevel::FATAL_ERROR },
|
||||
};
|
||||
// std::map<QtMsgType, Logger::LogLevel> QT_MESSAGE_TYPE_TO_LOG_LEVEL = {
|
||||
// { QtMsgType::QtInfoMsg, Logger::LogLevel::INFO },
|
||||
// { QtMsgType::QtSystemMsg, Logger::LogLevel::INFO },
|
||||
// { QtMsgType::QtDebugMsg, Logger::LogLevel::DEBUG },
|
||||
// { QtMsgType::QtWarningMsg, Logger::LogLevel::WARNING },
|
||||
// { QtMsgType::QtCriticalMsg, Logger::LogLevel::ERROR },
|
||||
// { QtMsgType::QtFatalMsg, Logger::LogLevel::FATAL_ERROR },
|
||||
// };
|
||||
|
||||
void logQtMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
|
||||
Logger::log("[Qt] " + msg.toStdString(), QT_MESSAGE_TYPE_TO_LOG_LEVEL[type]);
|
||||
// Logger::log("[Qt] " + msg.toStdString(), QT_MESSAGE_TYPE_TO_LOG_LEVEL[type]);
|
||||
Logger::LogLevel logLevel = type == QtMsgType::QtFatalMsg ? Logger::LogLevel::FATAL_ERROR : Logger::LogLevel::DEBUG;
|
||||
Logger::log("[Qt] " + msg.toStdString(), logLevel);
|
||||
|
||||
// if (defaultMessageHandler) defaultMessageHandler(type, context, msg);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ ScriptDocument::ScriptDocument(std::shared_ptr<Script> script, QWidget* parent):
|
|||
scintilla->setCaretForegroundColor(palette().text().color());
|
||||
scintilla->setFont(font);
|
||||
|
||||
scintilla->setLexer();
|
||||
scintilla->setText(QString::fromStdString(script->source));
|
||||
|
||||
connect(scintilla, &QsciScintilla::textChanged, [this]() {
|
||||
// this-> is important here, as otherwise it will refer to the
|
||||
|
|
Loading…
Add table
Reference in a new issue