menu page queries

This commit is contained in:
MihailRis 2024-05-05 22:40:24 +03:00
parent 7f8a86b740
commit 4dc2c4701d
8 changed files with 55 additions and 11 deletions

View File

@ -1,4 +1,7 @@
function on_open()
function on_open(params)
if params then
mode = params.mode
end
refresh()
end
@ -6,7 +9,8 @@ add_packs = {}
rem_packs = {}
function apply()
if not core.reconfig_packs(add_packs, rem_packs) then
core.reconfig_packs(add_packs, rem_packs)
if mode ~= "world" then
menu:back()
end
end

View File

@ -1,6 +1,6 @@
<panel size='400' color='0' interval='1' context='menu'>
<button onclick='menu:reset()'>@Continue</button>
<button onclick='menu.page="content"'>@Content</button>
<button onclick='menu.page="content?mode=world"'>@Content</button>
<button onclick='menu.page="settings"'>@Settings</button>
<button onclick='core.close_world(true)'>
@Save and Quit to Menu

View File

@ -164,6 +164,14 @@ char BasicParser::peek() {
return source[pos];
}
std::string BasicParser::readUntil(char c) {
int start = pos;
while (hasNext() && source[pos] != c) {
pos++;
}
return source.substr(start, pos-start);
}
std::string BasicParser::parseName() {
char c = peek();
if (!is_identifier_start(c)) {

View File

@ -82,20 +82,23 @@ protected:
bool skipTo(const std::string& substring);
void expect(char expected);
void expect(const std::string& substring);
char peek();
char nextChar();
bool hasNext();
bool isNext(const std::string& substring);
void expectNewLine();
void goBack();
std::string parseName();
int64_t parseSimpleInt(int base);
bool parseNumber(int sign, number_u& out);
std::string parseString(char chr, bool closeRequired=true);
parsing_error error(std::string message);
public:
std::string readUntil(char c);
std::string parseName();
bool hasNext();
char peek();
char nextChar();
BasicParser(const std::string& file, const std::string& source);
};

View File

@ -386,3 +386,7 @@ std::unique_ptr<Value> Value::of(number_u value) {
std::unique_ptr<Value> Value::of(const std::string& value) {
return std::make_unique<Value>(valtype::string, value);
}
std::unique_ptr<Value> Value::of(std::unique_ptr<Map> value) {
return std::make_unique<Value>(valtype::map, value.release());
}

View File

@ -36,6 +36,7 @@ namespace dynamic {
static std::unique_ptr<Value> boolean(bool value);
static std::unique_ptr<Value> of(number_u value);
static std::unique_ptr<Value> of(const std::string& value);
static std::unique_ptr<Value> of(std::unique_ptr<Map> value);
};
class List {

View File

@ -13,6 +13,7 @@
#include "../graphics/ui/GUI.hpp"
#include "../logic/scripting/scripting.h"
#include "../settings.h"
#include "../coders/commons.h"
#include "../util/stringutil.h"
#include "../window/Window.hpp"
#include "locale/langs.h"
@ -32,13 +33,37 @@ void menus::create_version_label(Engine* engine) {
}
gui::page_loader_func menus::create_page_loader(Engine* engine) {
return [=](auto name) {
return [=](const std::string& query) {
using namespace dynamic;
std::vector<std::unique_ptr<Value>> args;
std::string name;
size_t index = query.find('?');
if (index != std::string::npos) {
auto argstr = query.substr(index+1);
name = query.substr(0, index);
auto map = std::make_unique<Map>();
BasicParser parser("query for "+name, argstr);
while (parser.hasNext()) {
auto key = parser.readUntil('=');
parser.nextChar();
auto value = parser.readUntil('&');
map->put(key, value);
}
args.push_back(Value::of(std::move(map)));
} else {
name = query;
}
auto file = engine->getResPaths()->find("layouts/pages/"+name+".xml");
auto fullname = "core:pages/"+name;
auto document = UiDocument::read(scripting::get_root_environment(), fullname, file).release();
engine->getAssets()->store(document, fullname);
scripting::on_ui_open(document, {});
scripting::on_ui_open(document, std::move(args));
return document->getRoot();
};
}

View File

@ -91,8 +91,7 @@ static int l_reconfig_packs(lua_State* L) {
}
auto controller = scripting::engine->getController();
controller->reconfigPacks(scripting::controller, addPacks, remPacks);
lua_pushboolean(L, scripting::controller != nullptr);
return 1;
return 0;
}
static int l_get_bindings(lua_State* L) {