gui: more xml and lua support

This commit is contained in:
MihailRis
2024-02-14 00:31:45 +03:00
parent ef0d4d69e4
commit c6bd52eed2
10 changed files with 110 additions and 30 deletions
+24 -8
View File
@@ -1,10 +1,26 @@
<inventory color="#1F1F1FE0" size="0,400"> <inventory color="#1F1F1FE0" size="0,600">
<slots-grid rows="4" count="40" sharefunc="inventory_share_func"/> <slots-grid rows="4" count="40" sharefunc="inventory_share_func"/>
<button id="btn" <panel coord="10,230" padding="4,4,4,4" size="300,100">
coord="8,300" <label>fps: 62 / 59</label>
size="140,30" <label>meshes: 4143</label>
z-index="1" <label>frustum-culling: on</label>
onclick="document.btn.text = tostring(time.uptime())"> <label>chunks: 3206 visible: 1153</label>
----- <label>block: 0 0 (core:air)</label>
</button> <label>seed: 42</label>
<container size="200,30">
<label size="100,30">x:</label>
<textbox coord="40,0">4321.40</textbox>
</container>
<container size="200,30">
<label size="100,30">y:</label>
<textbox coord="40,0">120.0</textbox>
</container>
<container size="200,30">
<label size="100,30">z:</label>
<textbox coord="40,0">-424.10</textbox>
</container>
<label>time: 19:50</label>
<trackbar min="0.0" max="1.0" step="0.005f" track-width="8" consumer="time_change"/>
<trackbar min="0.0" max="1.0" step="0.005f" value="0.5" track-width="8"/>
</panel>
</inventory> </inventory>
+4
View File
@@ -9,3 +9,7 @@ end
function inventory_share_func(invid, slotid) function inventory_share_func(invid, slotid)
inventory.set(invid, slotid, 0, 0) inventory.set(invid, slotid, 0, 0)
end end
function time_change(x)
world.set_day_time(x)
end
+2
View File
@@ -8,5 +8,7 @@ using runnable = std::function<void()>;
using stringconsumer = std::function<void(const std::string&)>; using stringconsumer = std::function<void(const std::string&)>;
using wstringsupplier = std::function<std::wstring()>; using wstringsupplier = std::function<std::wstring()>;
using wstringconsumer = std::function<void(const std::wstring&)>; using wstringconsumer = std::function<void(const std::wstring&)>;
using doublesupplier = std::function<double()>;
using doubleconsumer = std::function<void(double)>;
#endif // DELEGATES_H_ #endif // DELEGATES_H_
+4
View File
@@ -208,6 +208,10 @@ void Engine::loadAllPacks() {
ContentPack::scan(paths, contentPacks); ContentPack::scan(paths, contentPacks);
} }
double Engine::getDelta() const {
return delta;
}
void Engine::setScreen(std::shared_ptr<Screen> screen) { void Engine::setScreen(std::shared_ptr<Screen> screen) {
this->screen = screen; this->screen = screen;
} }
+1
View File
@@ -63,6 +63,7 @@ public:
void loadContent(); void loadContent();
void loadWorldContent(const fs::path& folder); void loadWorldContent(const fs::path& folder);
void loadAllPacks(); void loadAllPacks();
double getDelta() const;
std::shared_ptr<Screen> getScreen(); std::shared_ptr<Screen> getScreen();
}; };
-3
View File
@@ -17,9 +17,6 @@ class Batch2D;
class Assets; class Assets;
namespace gui { namespace gui {
using doublesupplier = std::function<double()>;
using doubleconsumer = std::function<void(double)>;
using boolsupplier = std::function<bool()>; using boolsupplier = std::function<bool()>;
using boolconsumer = std::function<void(bool)>; using boolconsumer = std::function<void(bool)>;
+29 -1
View File
@@ -124,6 +124,13 @@ static std::shared_ptr<UINode> readContainer(UiXmlReader& reader, xml::xmlelemen
return container; return container;
} }
static std::shared_ptr<UINode> readPanel(UiXmlReader& reader, xml::xmlelement element) {
float interval = element->attr("interval", "2").asFloat();
auto panel = std::make_shared<Panel>(glm::vec2(), glm::vec4(), interval);
_readPanel(reader, element, *panel);
return panel;
}
static std::shared_ptr<UINode> readButton(UiXmlReader& reader, xml::xmlelement element) { static std::shared_ptr<UINode> readButton(UiXmlReader& reader, xml::xmlelement element) {
std::wstring text = readAndProcessInnerText(element); std::wstring text = readAndProcessInnerText(element);
auto button = std::make_shared<Button>(text, glm::vec4(0.0f), nullptr); auto button = std::make_shared<Button>(text, glm::vec4(0.0f), nullptr);
@@ -156,7 +163,7 @@ static std::shared_ptr<UINode> readTextBox(UiXmlReader& reader, xml::xmlelement
auto consumer = scripting::create_wstring_consumer( auto consumer = scripting::create_wstring_consumer(
reader.getEnvironment().getId(), reader.getEnvironment().getId(),
element->attr("consumer").getText(), element->attr("consumer").getText(),
reader.getFilename()+"lua" reader.getFilename()+".lua"
); );
textbox->textConsumer(consumer); textbox->textConsumer(consumer);
} }
@@ -171,13 +178,34 @@ static std::shared_ptr<UINode> readImage(UiXmlReader& reader, xml::xmlelement el
return image; return image;
} }
static std::shared_ptr<UINode> readTrackBar(UiXmlReader& reader, xml::xmlelement element) {
float min = element->attr("min", "0.0").asFloat();
float max = element->attr("max", "1.0").asFloat();
float def = element->attr("value", "0.0").asFloat();
float step = element->attr("step", "1.0").asFloat();
int trackWidth = element->attr("track-width", "1.0").asInt();
auto bar = std::make_shared<TrackBar>(min, max, def, step, trackWidth);
_readUINode(element, *bar);
if (element->has("consumer")) {
auto consumer = scripting::create_number_consumer(
reader.getEnvironment().getId(),
element->attr("consumer").getText(),
reader.getFilename()+".lua"
);
bar->consumer(consumer);
}
return bar;
}
UiXmlReader::UiXmlReader(const scripting::Environment& env, AssetsLoader& assetsLoader) UiXmlReader::UiXmlReader(const scripting::Environment& env, AssetsLoader& assetsLoader)
: env(env), assetsLoader(assetsLoader) : env(env), assetsLoader(assetsLoader)
{ {
add("image", readImage); add("image", readImage);
add("label", readLabel); add("label", readLabel);
add("panel", readPanel);
add("button", readButton); add("button", readButton);
add("textbox", readTextBox); add("textbox", readTextBox);
add("trackbar", readTrackBar);
add("container", readContainer); add("container", readContainer);
} }
+6
View File
@@ -108,8 +108,14 @@ static int l_time_uptime(lua_State* L) {
return 1; return 1;
} }
static int l_time_delta(lua_State* L) {
lua_pushnumber(L, scripting::engine->getDelta());
return 1;
}
static const luaL_Reg timelib [] = { static const luaL_Reg timelib [] = {
{"uptime", l_time_uptime}, {"uptime", l_time_uptime},
{"delta", l_time_delta},
{NULL, NULL} {NULL, NULL}
}; };
+34 -18
View File
@@ -70,21 +70,42 @@ runnable scripting::create_runnable(
}; };
} }
static bool processCallback(
int env,
const std::string& src,
const std::string& file
) {
try {
return state->eval(env, src, file) != 0;
} catch (lua::luaerror err) {
std::cerr << err.what() << std::endl;
return false;
}
}
wstringconsumer scripting::create_wstring_consumer( wstringconsumer scripting::create_wstring_consumer(
int env, int env,
const std::string& src, const std::string& src,
const std::string& file const std::string& file
) { ) {
return [=](const std::wstring& x){ return [=](const std::wstring& x){
try { if (processCallback(env, src, file)) {
if (state->eval(env, src, file) == 0) state->pushstring(util::wstr2str_utf8(x));
return; state->callNoThrow(1);
} catch (lua::luaerror err) { }
std::cerr << err.what() << std::endl; };
return; }
doubleconsumer scripting::create_number_consumer(
int env,
const std::string& src,
const std::string& file
) {
return [=](double x){
if (processCallback(env, src, file)) {
state->pushnumber(x);
state->callNoThrow(1);
} }
state->pushstring(util::wstr2str_utf8(x));
state->callNoThrow(1);
}; };
} }
@@ -94,17 +115,12 @@ int_array_consumer scripting::create_int_array_consumer(
const std::string& file const std::string& file
) { ) {
return [=](const int arr[], size_t len){ return [=](const int arr[], size_t len){
try { if (processCallback(env, src, file)) {
if (state->eval(env, src, file) == 0) for (uint i = 0; i < len; i++) {
return; state->pushinteger(arr[i]);
} catch (lua::luaerror err) { }
std::cerr << err.what() << std::endl; state->callNoThrow(len);
return;
} }
for (uint i = 0; i < len; i++) {
state->pushinteger(arr[i]);
}
state->callNoThrow(len);
}; };
} }
+6
View File
@@ -55,6 +55,12 @@ namespace scripting {
const std::string& file="<string>" const std::string& file="<string>"
); );
doubleconsumer create_number_consumer(
int env,
const std::string& src,
const std::string& file="<string>"
);
int_array_consumer create_int_array_consumer( int_array_consumer create_int_array_consumer(
int env, int env,
const std::string& src, const std::string& src,