mirror of
https://github.com/Artikash/Textractor.git
synced 2024-12-23 08:54:12 +08:00
more lua features
This commit is contained in:
parent
48ea8f531b
commit
e826801c87
@ -2,6 +2,7 @@
|
||||
#include "util.h"
|
||||
#include "text.h"
|
||||
#include "defs.h"
|
||||
#include <fstream>
|
||||
#include <QMainWindow>
|
||||
#include <QLayout>
|
||||
#include <QPlainTextEdit>
|
||||
@ -37,32 +38,38 @@ bool luaL_dostring(lua_State* L, const char* str)
|
||||
}
|
||||
|
||||
bool logErrors = true;
|
||||
|
||||
std::mutex m;
|
||||
std::string script;
|
||||
int revCount = 0;
|
||||
ThreadSafe<std::string> script;
|
||||
std::atomic<int> revCount = 0;
|
||||
|
||||
struct : QMainWindow
|
||||
{
|
||||
void launch()
|
||||
{
|
||||
auto centralWidget = new QWidget(this);
|
||||
auto layout = new QVBoxLayout(centralWidget);
|
||||
auto scriptEditor = new QPlainTextEdit(centralWidget);
|
||||
auto loadButton = new QPushButton("Load Script", centralWidget);
|
||||
auto layout = new QHBoxLayout(centralWidget);
|
||||
auto scriptEditor = new QPlainTextEdit(std::string(std::istreambuf_iterator<char>(std::ifstream(LUA_SAVE_FILE, std::ios::in)), {}).c_str(), centralWidget);
|
||||
auto loadButton = new QPushButton(LOAD_LUA_SCRIPT, centralWidget);
|
||||
if (scriptEditor->toPlainText().isEmpty()) scriptEditor->setPlainText(LUA_INTRO);
|
||||
layout->addWidget(scriptEditor);
|
||||
layout->addWidget(loadButton);
|
||||
save = [=]
|
||||
{
|
||||
auto script = scriptEditor->toPlainText().toUtf8();
|
||||
std::ofstream(LUA_SAVE_FILE, std::ios::out | std::ios::trunc).write(script, strlen(script));
|
||||
};
|
||||
connect(loadButton, &QPushButton::clicked, [=](bool)
|
||||
{
|
||||
std::lock_guard l(m);
|
||||
++revCount;
|
||||
script = scriptEditor->toPlainText().toUtf8();
|
||||
script->assign(scriptEditor->toPlainText().toUtf8());
|
||||
save();
|
||||
});
|
||||
resize(800, 600);
|
||||
setCentralWidget(centralWidget);
|
||||
setWindowTitle("Lua");
|
||||
show();
|
||||
}
|
||||
|
||||
std::function<void()> save;
|
||||
}*window = nullptr;
|
||||
|
||||
BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||||
@ -73,18 +80,16 @@ BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved
|
||||
{
|
||||
QTimer::singleShot(0, []
|
||||
{
|
||||
std::lock_guard l(m);
|
||||
(window = new std::remove_pointer_t<decltype(window)>)->launch();
|
||||
});
|
||||
}
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
{
|
||||
window->save();
|
||||
if (lpReserved == NULL) // https://blogs.msdn.microsoft.com/oldnewthing/20120105-00/?p=8683
|
||||
{
|
||||
std::lock_guard l(m);
|
||||
delete window;
|
||||
window = nullptr;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -101,12 +106,11 @@ bool ProcessSentence(std::wstring& sentence, SentenceInfo sentenceInfo)
|
||||
|
||||
if (::revCount > revCount)
|
||||
{
|
||||
std::lock_guard l(m);
|
||||
revCount = ::revCount;
|
||||
luaL_dostring(L, "ProcessSentence = nil");
|
||||
if (luaL_dostring(L, script.c_str()) != LUA_OK)
|
||||
if (luaL_dostring(L, script->c_str()) != LUA_OK)
|
||||
{
|
||||
sentence += NEWLINE + LUA_ERROR + StringToWideString(lua_tolstring(L, -1, nullptr));
|
||||
sentence += NEWLINE + LUA_ERROR + StringToWideString(lua_tolstring(L, 1, nullptr));
|
||||
lua_settop(L, 0);
|
||||
return logErrors;
|
||||
}
|
||||
@ -128,11 +132,11 @@ bool ProcessSentence(std::wstring& sentence, SentenceInfo sentenceInfo)
|
||||
}
|
||||
if (lua_pcallk(L, 2, 1, 0, NULL, NULL) != LUA_OK)
|
||||
{
|
||||
sentence += NEWLINE + LUA_ERROR + StringToWideString(lua_tolstring(L, -1, nullptr));
|
||||
sentence += NEWLINE + LUA_ERROR + StringToWideString(lua_tolstring(L, 1, nullptr));
|
||||
lua_settop(L, 0);
|
||||
return logErrors;
|
||||
}
|
||||
if (const char* newSentence = lua_tolstring(L, -1, nullptr))
|
||||
if (const char* newSentence = lua_tolstring(L, 1, nullptr))
|
||||
{
|
||||
sentence = StringToWideString(newSentence);
|
||||
lua_settop(L, 0);
|
||||
|
@ -31,6 +31,7 @@ constexpr auto HOOK_SAVE_FILE = u8"SavedHooks.txt";
|
||||
constexpr auto GAME_SAVE_FILE = u8"SavedGames.txt";
|
||||
constexpr auto EXTEN_SAVE_FILE = u8"SavedExtensions.txt";
|
||||
constexpr auto REPLACE_SAVE_FILE = u8"SavedReplacements.txt";
|
||||
constexpr auto LUA_SAVE_FILE = u8"Textractor.lua";
|
||||
|
||||
// Misc
|
||||
|
||||
|
@ -55,6 +55,8 @@ extern const char* BG_COLOR;
|
||||
extern const char* TEXT_COLOR;
|
||||
extern const char* FONT_SIZE;
|
||||
extern const char* TOPMOST;
|
||||
extern const char* LUA_INTRO;
|
||||
extern const char* LOAD_LUA_SCRIPT;
|
||||
extern const wchar_t* LUA_ERROR;
|
||||
extern const char* REGEX_FILTER;
|
||||
extern const char* INVALID_REGEX;
|
||||
|
21
text.cpp
21
text.cpp
@ -84,6 +84,27 @@ const char* BG_COLOR = u8"Background Color";
|
||||
const char* TEXT_COLOR = u8"Text Color";
|
||||
const char* FONT_SIZE = u8"Font Size";
|
||||
const char* TOPMOST = u8"Always on Top";
|
||||
const char* LUA_INTRO = u8R"(--[[
|
||||
ProcessSentence is called each time Textractor receives a sentence of text.
|
||||
|
||||
Param sentence: sentence received by Textractor (UTF-8).
|
||||
Param sentenceInfo: table of miscellaneous info about the sentence.
|
||||
|
||||
If you return a string, the sentence will be turned into that string.
|
||||
If you return nil, the sentence will be unmodified.
|
||||
|
||||
This extension uses several copies of the Lua interpreter for thread safety.
|
||||
Modifications to global variables from ProcessSentence are not guaranteed to persist.
|
||||
|
||||
Properties in sentenceInfo:
|
||||
"current select": 0 unless sentence is in the text thread currently selected by the user.
|
||||
"process id": process id that the sentence is coming from. 0 for console and clipboard.
|
||||
"text number": number of the current text thread. Counts up one by one as text threads are created. 0 for console, 1 for clipboard.
|
||||
--]]
|
||||
function ProcessSentence(sentence, sentenceInfo)
|
||||
--Your code here...
|
||||
end)";
|
||||
const char* LOAD_LUA_SCRIPT = u8"Load Script";
|
||||
const wchar_t* LUA_ERROR = L"Lua error: ";
|
||||
const char* REGEX_FILTER = u8"Regex Filter";
|
||||
const char* INVALID_REGEX = u8"Invalid regex";
|
||||
|
Loading…
x
Reference in New Issue
Block a user