Compare commits
No commits in common. "8f68ae45ceeaf95c9341612c3d05f99627f7cd96" and "ba97c7c57443bdd053e5bb7420563175b73f9892" have entirely different histories.
8f68ae45ce
...
ba97c7c574
20 changed files with 54 additions and 181 deletions
Binary file not shown.
|
Before Width: | Height: | Size: 413 B |
|
|
@ -3,10 +3,10 @@
|
||||||
// I/O
|
// I/O
|
||||||
|
|
||||||
out vec4 fColor;
|
out vec4 fColor;
|
||||||
uniform vec4 aColor;
|
uniform vec3 aColor;
|
||||||
|
|
||||||
// Main
|
// Main
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
fColor = aColor;
|
fColor = vec4(aColor, 1.0);
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
#include "hint.h"
|
|
||||||
|
|
||||||
Hint::Hint(): Message(&TYPE) {}
|
|
||||||
Hint::~Hint() = default;
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "objects/annotation.h"
|
|
||||||
#include "objects/base/instance.h"
|
|
||||||
#include "objects/message.h"
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
// Dims the player's screen and displays some centered text
|
|
||||||
class DEF_INST_(explorer_icon="message") Hint : public Message {
|
|
||||||
AUTOGEN_PREAMBLE
|
|
||||||
|
|
||||||
public:
|
|
||||||
Hint();
|
|
||||||
~Hint();
|
|
||||||
|
|
||||||
static inline std::shared_ptr<Hint> New() { return std::make_shared<Hint>(); };
|
|
||||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<Hint>(); };
|
|
||||||
};
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
#include "message.h"
|
|
||||||
|
|
||||||
Message::Message(const InstanceType* type) : Instance(type) {}
|
|
||||||
Message::Message(): Instance(&TYPE) {}
|
|
||||||
Message::~Message() = default;
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "objects/annotation.h"
|
|
||||||
#include "objects/base/instance.h"
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
// Dims the player's screen and displays some centered text
|
|
||||||
class DEF_INST_(explorer_icon="message") Message : public Instance {
|
|
||||||
AUTOGEN_PREAMBLE
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Message(const InstanceType* type);
|
|
||||||
public:
|
|
||||||
Message();
|
|
||||||
~Message();
|
|
||||||
|
|
||||||
DEF_PROP std::string text;
|
|
||||||
|
|
||||||
static inline std::shared_ptr<Message> New() { return std::make_shared<Message>(); };
|
|
||||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<Message>(); };
|
|
||||||
};
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
#include "meta.h"
|
#include "meta.h"
|
||||||
#include "objects/folder.h"
|
#include "objects/folder.h"
|
||||||
#include "objects/hint.h"
|
|
||||||
#include "objects/joint/jointinstance.h"
|
#include "objects/joint/jointinstance.h"
|
||||||
#include "objects/joint/rotate.h"
|
#include "objects/joint/rotate.h"
|
||||||
#include "objects/joint/rotatev.h"
|
#include "objects/joint/rotatev.h"
|
||||||
#include "objects/joint/weld.h"
|
#include "objects/joint/weld.h"
|
||||||
#include "objects/message.h"
|
|
||||||
#include "objects/service/jointsservice.h"
|
#include "objects/service/jointsservice.h"
|
||||||
#include "objects/model.h"
|
#include "objects/model.h"
|
||||||
#include "objects/part.h"
|
#include "objects/part.h"
|
||||||
|
|
@ -29,8 +27,6 @@ std::map<std::string, const InstanceType*> INSTANCE_MAP = {
|
||||||
{ "JointInstance", &JointInstance::TYPE },
|
{ "JointInstance", &JointInstance::TYPE },
|
||||||
{ "Script", &Script::TYPE },
|
{ "Script", &Script::TYPE },
|
||||||
{ "Model", &Model::TYPE },
|
{ "Model", &Model::TYPE },
|
||||||
{ "Message", &Message::TYPE },
|
|
||||||
{ "Hint", &Hint::TYPE },
|
|
||||||
// { "Folder", &Folder::TYPE },
|
// { "Folder", &Folder::TYPE },
|
||||||
|
|
||||||
// Services
|
// Services
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
#include "script.h"
|
#include "script.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "datatypes/variant.h"
|
|
||||||
#include "lauxlib.h"
|
#include "lauxlib.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "objects/base/instance.h"
|
#include "objects/base/instance.h"
|
||||||
|
|
@ -32,6 +31,23 @@ void Script::Run() {
|
||||||
this->thread = lua_newthread(L);
|
this->thread = lua_newthread(L);
|
||||||
lua_State* Lt = thread;
|
lua_State* Lt = thread;
|
||||||
|
|
||||||
|
lua_pushthread(Lt); // Push thread for later*
|
||||||
|
|
||||||
|
// Initialize script globals
|
||||||
|
scriptContext->NewEnvironment(Lt); // Pushes envtable, metatable
|
||||||
|
|
||||||
|
// Set script in metatable source
|
||||||
|
InstanceRef(shared_from_this()).PushLuaValue(Lt);
|
||||||
|
lua_setfield(Lt, -2, "source");
|
||||||
|
|
||||||
|
lua_pop(Lt, 1); // Pop metatable
|
||||||
|
|
||||||
|
InstanceRef(shared_from_this()).PushLuaValue(Lt);
|
||||||
|
lua_setfield(Lt, -2, "script");
|
||||||
|
|
||||||
|
lua_setfenv(Lt, -2); // *Set env of current thread
|
||||||
|
lua_pop(Lt, 1); // Pop thread
|
||||||
|
|
||||||
// Push wrapper as thread function
|
// Push wrapper as thread function
|
||||||
lua_getfield(Lt, LUA_REGISTRYINDEX, "LuaPCallWrapper");
|
lua_getfield(Lt, LUA_REGISTRYINDEX, "LuaPCallWrapper");
|
||||||
|
|
||||||
|
|
@ -45,21 +61,6 @@ void Script::Run() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize script globals
|
|
||||||
scriptContext->NewEnvironment(Lt); // Pushes envtable, metatable
|
|
||||||
|
|
||||||
// Set script in metatable source
|
|
||||||
InstanceRef(shared_from_this()).PushLuaValue(Lt);
|
|
||||||
lua_setfield(Lt, -2, "source");
|
|
||||||
|
|
||||||
lua_pop(Lt, 1); // Pop metatable
|
|
||||||
|
|
||||||
// Set script in environment
|
|
||||||
InstanceRef(shared_from_this()).PushLuaValue(Lt);
|
|
||||||
lua_setfield(Lt, -2, "script");
|
|
||||||
|
|
||||||
lua_setfenv(Lt, -2); // Set env of loaded function
|
|
||||||
|
|
||||||
// Push our error handler and then generate the wrapped function
|
// Push our error handler and then generate the wrapped function
|
||||||
lua_pushcfunction(Lt, script_errhandler);
|
lua_pushcfunction(Lt, script_errhandler);
|
||||||
lua_call(Lt, 2, 1);
|
lua_call(Lt, 2, 1);
|
||||||
|
|
@ -75,34 +76,6 @@ void Script::Stop() {
|
||||||
// TODO:
|
// TODO:
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::shared_ptr<Script> getfsource(lua_State* L, lua_Debug* dbg) {
|
|
||||||
int top = lua_gettop(L);
|
|
||||||
|
|
||||||
lua_getinfo(L, "f", dbg);
|
|
||||||
lua_getfenv(L, -1); // Get fenv of stack pos
|
|
||||||
if (lua_isnil(L, -1)) { // No env could be found
|
|
||||||
lua_settop(L, top);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get source from metatable
|
|
||||||
lua_getmetatable(L, -1);
|
|
||||||
lua_getfield(L, -1, "source");
|
|
||||||
|
|
||||||
auto result = InstanceRef::FromLuaValue(L, -1);
|
|
||||||
if (!result) {
|
|
||||||
lua_settop(L, top);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
lua_settop(L, top);
|
|
||||||
|
|
||||||
std::shared_ptr<Instance> ref = result.expect().get<InstanceRef>();
|
|
||||||
if (!ref->IsA<Script>()) return nullptr;
|
|
||||||
|
|
||||||
return ref->CastTo<Script>().expect();
|
|
||||||
}
|
|
||||||
|
|
||||||
int script_errhandler(lua_State* L) {
|
int script_errhandler(lua_State* L) {
|
||||||
std::string errorMessage = lua_tostring(L, -1);
|
std::string errorMessage = lua_tostring(L, -1);
|
||||||
Logger::error(errorMessage);
|
Logger::error(errorMessage);
|
||||||
|
|
@ -119,10 +92,7 @@ int script_errhandler(lua_State* L) {
|
||||||
if (strcmp(dbg.what, "C") == 0 || strcmp(dbg.source, "=PCALL_WRAPPER") == 0)
|
if (strcmp(dbg.what, "C") == 0 || strcmp(dbg.source, "=PCALL_WRAPPER") == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Find script source
|
Logger::scriptLogf("'%s', Line %d", Logger::LogLevel::TRACE, {}, dbg.source, dbg.currentline);
|
||||||
std::shared_ptr<Script> source = getfsource(L, &dbg);
|
|
||||||
|
|
||||||
Logger::scriptLogf("'%s', Line %d", Logger::LogLevel::TRACE, {source, dbg.currentline}, dbg.source, dbg.currentline);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger::trace("Stack end");
|
Logger::trace("Stack end");
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,6 @@ extern Texture* debugFontTexture;
|
||||||
extern Shader* debugFontShader;
|
extern Shader* debugFontShader;
|
||||||
extern Shader* identityShader;
|
extern Shader* identityShader;
|
||||||
|
|
||||||
void drawRect(int x, int y, int width, int height, glm::vec4 color);
|
|
||||||
|
|
||||||
void drawChar(char c, int x, int y, float scale=1.f) {
|
void drawChar(char c, int x, int y, float scale=1.f) {
|
||||||
debugFontShader->use();
|
debugFontShader->use();
|
||||||
debugFontTexture->activate(1);
|
debugFontTexture->activate(1);
|
||||||
|
|
@ -43,6 +41,22 @@ void drawString(std::string str, int x, int y, float scale=1.f) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawRect(int x, int y, int w, int h, glm::vec4 color) {
|
||||||
|
identityShader->use();
|
||||||
|
identityShader->set("aColor", color);
|
||||||
|
|
||||||
|
float x0 = 2*float(x)/viewportWidth-1, y0 = 2*float(y)/viewportHeight-1, x1 = 2*float(x + w)/viewportWidth-1, y1 = 2*float(y + h)/viewportHeight-1;
|
||||||
|
float tmp;
|
||||||
|
tmp = -y0, y0 = -y1, y1 = tmp;
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertex3f(x0, y0, 0);
|
||||||
|
glVertex3f(x1, y0, 0);
|
||||||
|
glVertex3f(x1, y1, 0);
|
||||||
|
glVertex3f(x0, y1, 0);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
static tu_time_t lastTime;
|
static tu_time_t lastTime;
|
||||||
extern tu_time_t renderTime;
|
extern tu_time_t renderTime;
|
||||||
extern tu_time_t physTime;
|
extern tu_time_t physTime;
|
||||||
|
|
|
||||||
|
|
@ -63,8 +63,7 @@ std::shared_ptr<Font> loadFont(std::string fontName) {
|
||||||
|
|
||||||
std::shared_ptr<Font> font = std::make_shared<Font>();
|
std::shared_ptr<Font> font = std::make_shared<Font>();
|
||||||
|
|
||||||
FT_Set_Pixel_Sizes(face, 0, 16);
|
FT_Set_Pixel_Sizes(face, 0, 48);
|
||||||
font->height = face->size->metrics.y_ppem;
|
|
||||||
|
|
||||||
// Load each glyph
|
// Load each glyph
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
|
@ -132,7 +131,7 @@ void drawText(std::shared_ptr<Font> font, std::string text, float x, float y, fl
|
||||||
Character ch = font->characters[c];
|
Character ch = font->characters[c];
|
||||||
|
|
||||||
float xpos = x + ch.bearing.x * scale;
|
float xpos = x + ch.bearing.x * scale;
|
||||||
float ypos = viewportHeight - y - font->height - (ch.size.y - ch.bearing.y) * scale;
|
float ypos = y - (ch.size.y - ch.bearing.y) * scale;
|
||||||
|
|
||||||
float w = ch.size.x * scale;
|
float w = ch.size.x * scale;
|
||||||
float h = ch.size.y * scale;
|
float h = ch.size.y * scale;
|
||||||
|
|
@ -161,16 +160,3 @@ void drawText(std::shared_ptr<Font> font, std::string text, float x, float y, fl
|
||||||
}
|
}
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
float calcTextWidth(std::shared_ptr<Font> font, std::string text, float scale) {
|
|
||||||
float x = 0;
|
|
||||||
// iterate through all characters
|
|
||||||
for (size_t i = 0; i < text.size(); i++) {
|
|
||||||
unsigned char c = text[i];
|
|
||||||
Character ch = font->characters[c];
|
|
||||||
|
|
||||||
x += (ch.advance >> 6) * scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
@ -14,7 +14,6 @@ struct Character {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Font {
|
struct Font {
|
||||||
unsigned int height;
|
|
||||||
Character characters[128];
|
Character characters[128];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -22,4 +21,3 @@ void fontInit();
|
||||||
void fontFinish();
|
void fontFinish();
|
||||||
std::shared_ptr<Font> loadFont(std::string fontName);
|
std::shared_ptr<Font> loadFont(std::string fontName);
|
||||||
void drawText(std::shared_ptr<Font> font, std::string text, float x, float y, float scale=1.f, glm::vec3 color = glm::vec3(1,1,1));
|
void drawText(std::shared_ptr<Font> font, std::string text, float x, float y, float scale=1.f, glm::vec3 color = glm::vec3(1,1,1));
|
||||||
float calcTextWidth(std::shared_ptr<Font> font, std::string text, float scale = 1.f);
|
|
||||||
|
|
@ -20,8 +20,6 @@
|
||||||
#include "datatypes/vector.h"
|
#include "datatypes/vector.h"
|
||||||
#include "handles.h"
|
#include "handles.h"
|
||||||
#include "math_helper.h"
|
#include "math_helper.h"
|
||||||
#include "objects/hint.h"
|
|
||||||
#include "objects/message.h"
|
|
||||||
#include "objects/service/selection.h"
|
#include "objects/service/selection.h"
|
||||||
#include "partassembly.h"
|
#include "partassembly.h"
|
||||||
#include "rendering/font.h"
|
#include "rendering/font.h"
|
||||||
|
|
@ -64,8 +62,7 @@ bool wireframeRendering = false;
|
||||||
int viewportWidth, viewportHeight;
|
int viewportWidth, viewportHeight;
|
||||||
|
|
||||||
void renderDebugInfo();
|
void renderDebugInfo();
|
||||||
void drawRect(int x, int y, int width, int height, glm::vec4 color);
|
void drawRect(int x, int y, int width, int height, glm::vec3 color);
|
||||||
inline void drawRect(int x, int y, int width, int height, glm::vec3 color) { return drawRect(x, y, width, height, glm::vec4(color, 1)); };
|
|
||||||
|
|
||||||
void renderInit(int width, int height) {
|
void renderInit(int width, int height) {
|
||||||
viewportWidth = width, viewportHeight = height;
|
viewportWidth = width, viewportHeight = height;
|
||||||
|
|
@ -652,33 +649,6 @@ void addDebugRenderCFrame(CFrame frame, Color3 color) {
|
||||||
DEBUG_CFRAMES.push_back(std::make_pair(frame, color));
|
DEBUG_CFRAMES.push_back(std::make_pair(frame, color));
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderMessages() {
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
// glEnable(GL_DEPTH_TEST);
|
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
// glEnable(GL_BLEND);
|
|
||||||
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
for (auto it = gWorkspace()->GetDescendantsStart(); it != gWorkspace()->GetDescendantsEnd(); it++) {
|
|
||||||
if (!it->IsA<Message>()) continue;
|
|
||||||
std::shared_ptr<Message> message = it->CastTo<Message>().expect();
|
|
||||||
|
|
||||||
float textWidth = calcTextWidth(sansSerif, message->text);
|
|
||||||
|
|
||||||
// Render hint
|
|
||||||
if (message->GetClass() == &Hint::TYPE) {
|
|
||||||
drawRect(0, 0, viewportWidth, 20, glm::vec4(0,0,0,1));
|
|
||||||
drawText(sansSerif, message->text, (viewportWidth - textWidth) / 2, 0);
|
|
||||||
} else {
|
|
||||||
// Don't draw if text is empty
|
|
||||||
if (message->text == "") continue;
|
|
||||||
|
|
||||||
drawRect(0, 0, viewportWidth, viewportHeight, glm::vec4(0.5));
|
|
||||||
drawText(sansSerif, message->text, ((float)viewportWidth - textWidth) / 2, ((float)viewportHeight - sansSerif->height) / 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tu_time_t renderTime;
|
tu_time_t renderTime;
|
||||||
void render() {
|
void render() {
|
||||||
tu_time_t startTime = tu_clock_micros();
|
tu_time_t startTime = tu_clock_micros();
|
||||||
|
|
@ -698,14 +668,13 @@ void render() {
|
||||||
renderWireframe();
|
renderWireframe();
|
||||||
if (debugRendererEnabled)
|
if (debugRendererEnabled)
|
||||||
renderDebugInfo();
|
renderDebugInfo();
|
||||||
renderMessages();
|
|
||||||
// TODO: Make this a debug flag
|
// TODO: Make this a debug flag
|
||||||
// renderAABB();
|
// renderAABB();
|
||||||
|
|
||||||
renderTime = tu_clock_micros() - startTime;
|
renderTime = tu_clock_micros() - startTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawRect(int x, int y, int width, int height, glm::vec4 color) {
|
void drawRect(int x, int y, int width, int height, glm::vec3 color) {
|
||||||
// GL_CULL_FACE has to be disabled as we are flipping the order of the vertices here, besides we don't really care about it
|
// GL_CULL_FACE has to be disabled as we are flipping the order of the vertices here, besides we don't really care about it
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
glm::mat4 model(1.0f); // Same applies to this VV
|
glm::mat4 model(1.0f); // Same applies to this VV
|
||||||
|
|
|
||||||
|
|
@ -610,23 +610,19 @@ ScriptDocument* MainWindow::findScriptWindow(std::shared_ptr<Script> script) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::openScriptDocument(std::shared_ptr<Script> script, int line) {
|
void MainWindow::openScriptDocument(std::shared_ptr<Script> script) {
|
||||||
// Document already exists, don't open it
|
// Document already exists, don't open it
|
||||||
ScriptDocument* doc = findScriptWindow(script);
|
ScriptDocument* doc = findScriptWindow(script);
|
||||||
if (doc != nullptr) {
|
if (doc != nullptr) {
|
||||||
ui->mdiArea->setActiveSubWindow(doc);
|
ui->mdiArea->setActiveSubWindow(doc);
|
||||||
doc->setFocus();
|
|
||||||
if (line > -1) doc->moveCursor(line);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
doc = new ScriptDocument(script);
|
doc = new ScriptDocument(script);
|
||||||
doc->setAttribute(Qt::WA_DeleteOnClose, true);
|
doc->setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
if (line > -1) doc->moveCursor(line);
|
|
||||||
ui->mdiArea->addSubWindow(doc);
|
ui->mdiArea->addSubWindow(doc);
|
||||||
ui->mdiArea->setActiveSubWindow(doc);
|
ui->mdiArea->setActiveSubWindow(doc);
|
||||||
doc->showMaximized();
|
doc->showMaximized();
|
||||||
doc->setFocus();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::closeScriptDocument(std::shared_ptr<Script> script) {
|
void MainWindow::closeScriptDocument(std::shared_ptr<Script> script) {
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ public:
|
||||||
GridSnappingMode snappingMode;
|
GridSnappingMode snappingMode;
|
||||||
bool editSoundEffects = true;
|
bool editSoundEffects = true;
|
||||||
|
|
||||||
void openScriptDocument(std::shared_ptr<Script>, int line = -1);
|
void openScriptDocument(std::shared_ptr<Script>);
|
||||||
void closeScriptDocument(std::shared_ptr<Script>);
|
void closeScriptDocument(std::shared_ptr<Script>);
|
||||||
|
|
||||||
void openFile(std::string path);
|
void openFile(std::string path);
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Openblocks Editor</string>
|
<string>MainWindow</string>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralwidget">
|
<widget class="QWidget" name="centralwidget">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#include "outputtextview.h"
|
#include "outputtextview.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
#include "objects/script.h"
|
||||||
#include "panes/outputtextview.h"
|
#include "panes/outputtextview.h"
|
||||||
#include <QEvent>
|
#include <QEvent>
|
||||||
#include <QTextEdit>
|
#include <QTextEdit>
|
||||||
|
|
@ -59,7 +60,7 @@ void OutputTextView::handleLog(Logger::LogLevel logLevel, std::string message, L
|
||||||
stackTraceScripts[id] = source.script;
|
stackTraceScripts[id] = source.script;
|
||||||
|
|
||||||
format.setAnchor(true);
|
format.setAnchor(true);
|
||||||
format.setAnchorHref(QString::number(id) + ":" + QString::number(source.line));
|
format.setAnchorHref(QString::number(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
cursor.insertText(message.c_str(), format);
|
cursor.insertText(message.c_str(), format);
|
||||||
|
|
@ -71,13 +72,11 @@ void OutputTextView::mousePressEvent(QMouseEvent *e) {
|
||||||
QString anchor = anchorAt(e->pos());
|
QString anchor = anchorAt(e->pos());
|
||||||
if (anchor == "" || e->modifiers() & Qt::AltModifier) return QTextEdit::mousePressEvent(e);
|
if (anchor == "" || e->modifiers() & Qt::AltModifier) return QTextEdit::mousePressEvent(e);
|
||||||
|
|
||||||
int idx = anchor.indexOf(":");
|
auto script = stackTraceScripts[anchor.toInt()];
|
||||||
int id = anchor.mid(0, idx).toInt(), line = anchor.mid(idx+1).toInt();
|
|
||||||
auto script = stackTraceScripts[id];
|
|
||||||
if (script.expired()) return QTextEdit::mousePressEvent(e);
|
if (script.expired()) return QTextEdit::mousePressEvent(e);
|
||||||
|
|
||||||
MainWindow* mainWnd = dynamic_cast<MainWindow*>(window());
|
MainWindow* mainWnd = dynamic_cast<MainWindow*>(window());
|
||||||
mainWnd->openScriptDocument(script.lock(), line);
|
mainWnd->openScriptDocument(script.lock());
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputTextView::mouseReleaseEvent(QMouseEvent *e) {
|
void OutputTextView::mouseReleaseEvent(QMouseEvent *e) {
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,11 @@ void CommandEdit::executeCommand() {
|
||||||
int top = lua_gettop(L);
|
int top = lua_gettop(L);
|
||||||
lua_State* Lt = lua_newthread(L);
|
lua_State* Lt = lua_newthread(L);
|
||||||
|
|
||||||
|
lua_pushthread(Lt); // Push thread
|
||||||
|
getOrCreateEnvironment(Lt);
|
||||||
|
lua_setfenv(Lt, -2); // Set env of current thread
|
||||||
|
lua_pop(Lt, 1); // Pop thread
|
||||||
|
|
||||||
// Push wrapper as thread function
|
// Push wrapper as thread function
|
||||||
lua_getfield(Lt, LUA_REGISTRYINDEX, "LuaPCallWrapper");
|
lua_getfield(Lt, LUA_REGISTRYINDEX, "LuaPCallWrapper");
|
||||||
|
|
||||||
|
|
@ -45,14 +50,10 @@ void CommandEdit::executeCommand() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
getOrCreateEnvironment(Lt);
|
|
||||||
lua_setfenv(Lt, -2); // Set env of loaded function
|
|
||||||
|
|
||||||
// Push our error handler and then generate the wrapped function
|
// Push our error handler and then generate the wrapped function
|
||||||
lua_pushcfunction(Lt, script_errhandler);
|
lua_pushcfunction(Lt, script_errhandler);
|
||||||
lua_call(Lt, 2, 1);
|
lua_call(Lt, 2, 1);
|
||||||
|
|
||||||
|
|
||||||
// Resume the thread
|
// Resume the thread
|
||||||
lua_resume(Lt, 0);
|
lua_resume(Lt, 0);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -179,13 +179,6 @@ ScriptDocument::ScriptDocument(std::shared_ptr<Script> script, QWidget* parent):
|
||||||
ScriptDocument::~ScriptDocument() {
|
ScriptDocument::~ScriptDocument() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptDocument::moveCursor(int line) {
|
|
||||||
if (line == -1) return;
|
|
||||||
|
|
||||||
int lineLength = scintilla->lineLength(line-1);
|
|
||||||
scintilla->setCursorPosition(line-1, lineLength-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
QsciAPIs* makeApis(QsciLexer* lexer) {
|
QsciAPIs* makeApis(QsciLexer* lexer) {
|
||||||
QsciAPIs* apis = new QsciAPIs(lexer);
|
QsciAPIs* apis = new QsciAPIs(lexer);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,5 +17,4 @@ public:
|
||||||
~ScriptDocument() override;
|
~ScriptDocument() override;
|
||||||
|
|
||||||
inline std::shared_ptr<Script> getScript() { return script; }
|
inline std::shared_ptr<Script> getScript() { return script; }
|
||||||
void moveCursor(int line);
|
|
||||||
};
|
};
|
||||||
Loading…
Add table
Reference in a new issue