-
-
Notifications
You must be signed in to change notification settings - Fork 102
/
luainterface.cpp
107 lines (80 loc) · 2.43 KB
/
luainterface.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "luainterface.h"
LuaInterface::LuaInterface() {
}
LuaInterface::~LuaInterface() {
_luaQObjects.clear();
_L.close();
}
void LuaInterface::initLua() {
_L = LuaIntf::LuaState::newState();
luaL_openlibs(_L);
luaOpenQtBridge(_L);
lua_openlckernel(_L);
LuaIntf::Lua::setGlobal(_L, "luaInterface", this);
QString luaFile = QCoreApplication::applicationDirPath() + "/path.lua";
int s = _L.doFile(luaFile.toStdString().c_str());
if (s != 0) {
std::cout << lua_tostring(_L, -1) << std::endl;
lua_pop(_L, 1);
}
}
bool LuaInterface::luaConnect(
QObject* sender,
std::string signalName,
LuaIntf::LuaRef slot)
{
int signalId = sender->metaObject()->indexOfSignal(signalName.c_str());
if(signalId < 0) {
std::cout << "No such signal " << signalName << std::endl;
}
else {
auto lqo = std::make_shared<LuaQObject>(sender);
_luaQObjects.push_back(lqo);
auto connected = lqo->connect(signalId, slot);
cleanInvalidQObject();
return connected;
}
return false;
}
std::shared_ptr<QWidget> LuaInterface::loadUiFile(const char* fileName) {
QUiLoader uiLoader;
QFile file(fileName);
file.open(QFile::ReadOnly);
std::shared_ptr<QWidget> widget(uiLoader.load(&file));
file.close();
return widget;
}
void LuaInterface::cleanInvalidQObject() {
_luaQObjects.erase(std::remove_if(_luaQObjects.begin(),
_luaQObjects.end(),
[](LuaQObject_SPtr lqo){
return !lqo->valid();
}),
_luaQObjects.end());
}
bool LuaInterface::qtConnect(QObject *sender, std::string signalName, QObject *receiver, std::string slotName) {
int signalId = sender->metaObject()->indexOfSignal(signalName.c_str());
if(signalId < 0) {
std::cout << "No such signal " << signalName << std::endl;
}
int slotId = receiver->metaObject()->indexOfSlot(slotName.c_str());
if(slotId < 0) {
std::cout << "No such slot " << signalName << std::endl;
}
return QMetaObject::connect(sender, signalId, receiver, slotId);
}
void LuaInterface::hideUI(bool hidden) {
LuaIntf::Lua::setGlobal(_L, "hideUI", hidden);
}
LuaIntf::LuaState LuaInterface::luaState() {
return _L;
}
std::vector<std::string> LuaInterface::pluginList(const char* path) {
std::vector<std::string> plugins;
QDir dir(path);
auto list = dir.entryList(QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot);
for(auto dir : list) {
plugins.push_back(dir.toStdString());
}
return plugins;
}