mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-12 14:31:50 +00:00
Merge branch 'main' into sdl-try-2
This commit is contained in:
commit
1edb13b30a
7 changed files with 53 additions and 37 deletions
|
|
@ -1,5 +1,4 @@
|
||||||
<panel size='400' color='0' interval='1' context='menu'>
|
<panel size='400' color='0' interval='1' context='menu'>
|
||||||
|
|
||||||
<button onclick='menu.page="new_world"'>@New World</button>
|
<button onclick='menu.page="new_world"'>@New World</button>
|
||||||
|
|
||||||
<panel id='worlds' size='390,1' padding='5' color='#FFFFFF11' max-length='400'>
|
<panel id='worlds' size='390,1' padding='5' color='#FFFFFF11' max-length='400'>
|
||||||
|
|
|
||||||
|
|
@ -558,7 +558,7 @@ local internal_locked = false
|
||||||
-- Example `base:scripts/tests.lua`
|
-- Example `base:scripts/tests.lua`
|
||||||
--
|
--
|
||||||
-- nocache - ignore cached script, load anyway
|
-- nocache - ignore cached script, load anyway
|
||||||
function __load_script(path, nocache)
|
local function __load_script(path, nocache, env)
|
||||||
local packname, filename = parse_path(path)
|
local packname, filename = parse_path(path)
|
||||||
|
|
||||||
if internal_locked and (packname == "res" or packname == "core")
|
if internal_locked and (packname == "res" or packname == "core")
|
||||||
|
|
@ -578,6 +578,9 @@ function __load_script(path, nocache)
|
||||||
if script == nil then
|
if script == nil then
|
||||||
error(err)
|
error(err)
|
||||||
end
|
end
|
||||||
|
if env then
|
||||||
|
script = setfenv(script, env)
|
||||||
|
end
|
||||||
local result = script()
|
local result = script()
|
||||||
if not nocache then
|
if not nocache then
|
||||||
__cached_scripts[path] = script
|
__cached_scripts[path] = script
|
||||||
|
|
@ -593,10 +596,11 @@ end
|
||||||
function require(path)
|
function require(path)
|
||||||
if not string.find(path, ':') then
|
if not string.find(path, ':') then
|
||||||
local prefix, _ = parse_path(_debug_getinfo(2).source)
|
local prefix, _ = parse_path(_debug_getinfo(2).source)
|
||||||
return require(prefix..':'..path)
|
return require(prefix .. ':' .. path)
|
||||||
end
|
end
|
||||||
local prefix, file = parse_path(path)
|
local prefix, file = parse_path(path)
|
||||||
return __load_script(prefix..":modules/"..file..".lua")
|
local env = __vc__pack_envs[prefix]
|
||||||
|
return __load_script(prefix .. ":modules/" .. file .. ".lua", nil, env)
|
||||||
end
|
end
|
||||||
|
|
||||||
function __scripts_cleanup()
|
function __scripts_cleanup()
|
||||||
|
|
|
||||||
|
|
@ -1211,13 +1211,12 @@ void TextBox::setCaret(size_t position) {
|
||||||
}
|
}
|
||||||
int lcaret = caret - rawTextCache.getTextLineOffset(line);
|
int lcaret = caret - rawTextCache.getTextLineOffset(line);
|
||||||
int realoffset =
|
int realoffset =
|
||||||
rawTextCache.metrics.calcWidth(labelText, lcaret) - static_cast<int>(textOffset) + 2;
|
rawTextCache.metrics.calcWidth(labelText, 0, lcaret) - static_cast<int>(textOffset) + 2;
|
||||||
|
|
||||||
if (realoffset - width > 0) {
|
if (realoffset - width > 0) {
|
||||||
setTextOffset(textOffset + realoffset - width);
|
setTextOffset(textOffset + realoffset - width);
|
||||||
} else if (realoffset < 0) {
|
} else if (realoffset < 0) {
|
||||||
setTextOffset(std::max(textOffset + realoffset, static_cast<size_t>(0))
|
setTextOffset(std::max(textOffset + realoffset, static_cast<size_t>(0)));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,19 +8,17 @@
|
||||||
#include "elements/Button.hpp"
|
#include "elements/Button.hpp"
|
||||||
#include "elements/Canvas.hpp"
|
#include "elements/Canvas.hpp"
|
||||||
#include "elements/CheckBox.hpp"
|
#include "elements/CheckBox.hpp"
|
||||||
#include "elements/TextBox.hpp"
|
|
||||||
#include "elements/SplitBox.hpp"
|
|
||||||
#include "elements/TrackBar.hpp"
|
|
||||||
#include "elements/SelectBox.hpp"
|
|
||||||
#include "elements/Image.hpp"
|
#include "elements/Image.hpp"
|
||||||
#include "elements/InlineFrame.hpp"
|
#include "elements/InlineFrame.hpp"
|
||||||
#include "elements/InputBindBox.hpp"
|
#include "elements/InputBindBox.hpp"
|
||||||
#include "elements/InventoryView.hpp"
|
#include "elements/InventoryView.hpp"
|
||||||
#include "elements/Menu.hpp"
|
#include "elements/Menu.hpp"
|
||||||
|
#include "elements/ModelViewer.hpp"
|
||||||
#include "elements/Panel.hpp"
|
#include "elements/Panel.hpp"
|
||||||
|
#include "elements/SelectBox.hpp"
|
||||||
|
#include "elements/SplitBox.hpp"
|
||||||
#include "elements/TextBox.hpp"
|
#include "elements/TextBox.hpp"
|
||||||
#include "elements/TrackBar.hpp"
|
#include "elements/TrackBar.hpp"
|
||||||
#include "elements/ModelViewer.hpp"
|
|
||||||
#include "engine/Engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "frontend/locale.hpp"
|
#include "frontend/locale.hpp"
|
||||||
#include "frontend/menu.hpp"
|
#include "frontend/menu.hpp"
|
||||||
|
|
@ -197,7 +195,10 @@ static void read_uinode(
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_container_impl(
|
static void read_container_impl(
|
||||||
UiXmlReader& reader, const xml::xmlelement& element, Container& container
|
UiXmlReader& reader,
|
||||||
|
const xml::xmlelement& element,
|
||||||
|
Container& container,
|
||||||
|
bool subnodes
|
||||||
) {
|
) {
|
||||||
read_uinode(reader, element, container);
|
read_uinode(reader, element, container);
|
||||||
|
|
||||||
|
|
@ -207,6 +208,9 @@ static void read_container_impl(
|
||||||
if (element.has("scroll-step")) {
|
if (element.has("scroll-step")) {
|
||||||
container.setScrollStep(element.attr("scroll-step").asInt());
|
container.setScrollStep(element.attr("scroll-step").asInt());
|
||||||
}
|
}
|
||||||
|
if (!subnodes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (auto& sub : element.getElements()) {
|
for (auto& sub : element.getElements()) {
|
||||||
if (sub->isText()) continue;
|
if (sub->isText()) continue;
|
||||||
auto subnode = reader.readUINode(*sub);
|
auto subnode = reader.readUINode(*sub);
|
||||||
|
|
@ -219,7 +223,7 @@ static void read_container_impl(
|
||||||
void UiXmlReader::readUINode(
|
void UiXmlReader::readUINode(
|
||||||
UiXmlReader& reader, const xml::xmlelement& element, Container& container
|
UiXmlReader& reader, const xml::xmlelement& element, Container& container
|
||||||
) {
|
) {
|
||||||
read_container_impl(reader, element, container);
|
read_container_impl(reader, element, container, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UiXmlReader::readUINode(
|
void UiXmlReader::readUINode(
|
||||||
|
|
@ -229,11 +233,9 @@ void UiXmlReader::readUINode(
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_base_panel_impl(
|
static void read_base_panel_impl(
|
||||||
UiXmlReader& reader,
|
UiXmlReader& reader, const xml::xmlelement& element, BasePanel& panel
|
||||||
const xml::xmlelement& element,
|
|
||||||
BasePanel& panel
|
|
||||||
) {
|
) {
|
||||||
read_uinode(reader, element, panel);
|
read_container_impl(reader, element, panel, false);
|
||||||
|
|
||||||
if (element.has("padding")) {
|
if (element.has("padding")) {
|
||||||
glm::vec4 padding = element.attr("padding").asVec4();
|
glm::vec4 padding = element.attr("padding").asVec4();
|
||||||
|
|
@ -244,7 +246,7 @@ static void read_base_panel_impl(
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if (element.has("orientation")) {
|
if (element.has("orientation")) {
|
||||||
auto &oname = element.attr("orientation").getText();
|
auto& oname = element.attr("orientation").getText();
|
||||||
if (oname == "horizontal") {
|
if (oname == "horizontal") {
|
||||||
panel.setOrientation(Orientation::horizontal);
|
panel.setOrientation(Orientation::horizontal);
|
||||||
}
|
}
|
||||||
|
|
@ -348,7 +350,7 @@ static std::shared_ptr<UINode> read_container(
|
||||||
UiXmlReader& reader, const xml::xmlelement& element
|
UiXmlReader& reader, const xml::xmlelement& element
|
||||||
) {
|
) {
|
||||||
auto container = std::make_shared<Container>(reader.getGUI(), glm::vec2());
|
auto container = std::make_shared<Container>(reader.getGUI(), glm::vec2());
|
||||||
read_container_impl(reader, element, *container);
|
read_container_impl(reader, element, *container, true);
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -365,8 +367,7 @@ static std::shared_ptr<UINode> read_split_box(
|
||||||
);
|
);
|
||||||
read_base_panel_impl(reader, element, *splitBox);
|
read_base_panel_impl(reader, element, *splitBox);
|
||||||
for (auto& sub : element.getElements()) {
|
for (auto& sub : element.getElements()) {
|
||||||
if (sub->isText())
|
if (sub->isText()) continue;
|
||||||
continue;
|
|
||||||
auto subnode = reader.readUINode(*sub);
|
auto subnode = reader.readUINode(*sub);
|
||||||
if (subnode) {
|
if (subnode) {
|
||||||
splitBox->add(subnode);
|
splitBox->add(subnode);
|
||||||
|
|
@ -379,15 +380,15 @@ static std::shared_ptr<UINode> read_model_viewer(
|
||||||
UiXmlReader& reader, const xml::xmlelement& element
|
UiXmlReader& reader, const xml::xmlelement& element
|
||||||
) {
|
) {
|
||||||
auto model = element.attr("src", "").getText();
|
auto model = element.attr("src", "").getText();
|
||||||
auto viewer = std::make_shared<ModelViewer>(
|
auto viewer =
|
||||||
reader.getGUI(), glm::vec2(), model
|
std::make_shared<ModelViewer>(reader.getGUI(), glm::vec2(), model);
|
||||||
);
|
read_container_impl(reader, element, *viewer, true);
|
||||||
read_container_impl(reader, element, *viewer);
|
|
||||||
if (element.has("center")) {
|
if (element.has("center")) {
|
||||||
viewer->setCenter(element.attr("center").asVec3());
|
viewer->setCenter(element.attr("center").asVec3());
|
||||||
}
|
}
|
||||||
if (element.has("cam-rotation")) {
|
if (element.has("cam-rotation")) {
|
||||||
viewer->setRotation(glm::radians(element.attr("cam-rotation").asVec3()));
|
viewer->setRotation(glm::radians(element.attr("cam-rotation").asVec3())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return viewer;
|
return viewer;
|
||||||
}
|
}
|
||||||
|
|
@ -450,7 +451,8 @@ static std::shared_ptr<UINode> read_select(
|
||||||
}
|
}
|
||||||
auto value = elem->attr("value").getText();
|
auto value = elem->attr("value").getText();
|
||||||
auto text = parse_inner_text(*elem, reader.getContext());
|
auto text = parse_inner_text(*elem, reader.getContext());
|
||||||
options.push_back(SelectBox::Option {std::move(value), std::move(text)});
|
options.push_back(SelectBox::Option {std::move(value), std::move(text)}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (element.has("selected")) {
|
if (element.has("selected")) {
|
||||||
|
|
@ -485,10 +487,9 @@ static std::shared_ptr<UINode> read_select(
|
||||||
element.attr("onselect").getText(),
|
element.attr("onselect").getText(),
|
||||||
reader.getFilename()
|
reader.getFilename()
|
||||||
);
|
);
|
||||||
selectBox->listenChange(
|
selectBox->listenChange([callback = std::move(callback)](
|
||||||
[callback=std::move(callback)](GUI&, const std::string& value) {
|
GUI&, const std::string& value
|
||||||
callback(value);
|
) { callback(value); });
|
||||||
});
|
|
||||||
}
|
}
|
||||||
read_panel_impl(reader, element, *selectBox, false);
|
read_panel_impl(reader, element, *selectBox, false);
|
||||||
return selectBox;
|
return selectBox;
|
||||||
|
|
@ -539,7 +540,7 @@ static std::shared_ptr<UINode> read_text_box(
|
||||||
);
|
);
|
||||||
textbox->setHint(hint);
|
textbox->setHint(hint);
|
||||||
|
|
||||||
read_container_impl(reader, element, *textbox);
|
read_container_impl(reader, element, *textbox, true);
|
||||||
if (element.has("padding")) {
|
if (element.has("padding")) {
|
||||||
glm::vec4 padding = element.attr("padding").asVec4();
|
glm::vec4 padding = element.attr("padding").asVec4();
|
||||||
textbox->setPadding(padding);
|
textbox->setPadding(padding);
|
||||||
|
|
@ -839,7 +840,7 @@ static std::shared_ptr<UINode> read_page_box(
|
||||||
auto& gui = reader.getGUI();
|
auto& gui = reader.getGUI();
|
||||||
auto menu = std::make_shared<Menu>(gui);
|
auto menu = std::make_shared<Menu>(gui);
|
||||||
menu->setPageLoader(gui.getMenu()->getPageLoader());
|
menu->setPageLoader(gui.getMenu()->getPageLoader());
|
||||||
read_container_impl(reader, element, *menu);
|
read_container_impl(reader, element, *menu, true);
|
||||||
|
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
@ -849,14 +850,15 @@ static std::shared_ptr<UINode> read_iframe(
|
||||||
) {
|
) {
|
||||||
auto& gui = reader.getGUI();
|
auto& gui = reader.getGUI();
|
||||||
auto iframe = std::make_shared<InlineFrame>(gui);
|
auto iframe = std::make_shared<InlineFrame>(gui);
|
||||||
read_container_impl(reader, element, *iframe);
|
read_container_impl(reader, element, *iframe, true);
|
||||||
|
|
||||||
std::string src = element.attr("src", "").getText();
|
std::string src = element.attr("src", "").getText();
|
||||||
iframe->setSrc(src);
|
iframe->setSrc(src);
|
||||||
return iframe;
|
return iframe;
|
||||||
}
|
}
|
||||||
|
|
||||||
UiXmlReader::UiXmlReader(gui::GUI& gui, scriptenv&& env) : gui(gui), env(std::move(env)) {
|
UiXmlReader::UiXmlReader(gui::GUI& gui, scriptenv&& env)
|
||||||
|
: gui(gui), env(std::move(env)) {
|
||||||
contextStack.emplace("");
|
contextStack.emplace("");
|
||||||
add("image", read_image);
|
add("image", read_image);
|
||||||
add("canvas", read_canvas);
|
add("canvas", read_canvas);
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ static int l_create_fragment(lua::State* L) {
|
||||||
|
|
||||||
static int l_load_fragment(lua::State* L) {
|
static int l_load_fragment(lua::State* L) {
|
||||||
dv::value map;
|
dv::value map;
|
||||||
if (!lua::isstring(L, 1)) {
|
if (lua::isstring(L, 1)) {
|
||||||
io::path path = lua::require_string(L, 1);
|
io::path path = lua::require_string(L, 1);
|
||||||
if (!io::exists(path)) {
|
if (!io::exists(path)) {
|
||||||
throw std::runtime_error("file "+path.string()+" does not exist");
|
throw std::runtime_error("file "+path.string()+" does not exist");
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,9 @@ void lua::init_state(State* L, StateType stateType) {
|
||||||
pushnil(L);
|
pushnil(L);
|
||||||
setglobal(L, "io");
|
setglobal(L, "io");
|
||||||
|
|
||||||
|
createtable(L, 0, 0);
|
||||||
|
setglobal(L, "__vc__pack_envs");
|
||||||
|
|
||||||
const char* removed_os[] {
|
const char* removed_os[] {
|
||||||
"execute", "exit", "remove", "rename", "setlocale", "tmpname", nullptr};
|
"execute", "exit", "remove", "rename", "setlocale", "tmpname", nullptr};
|
||||||
remove_lib_funcs(L, "os", removed_os);
|
remove_lib_funcs(L, "os", removed_os);
|
||||||
|
|
|
||||||
|
|
@ -181,7 +181,16 @@ std::unique_ptr<Process> scripting::start_coroutine(const io::path& script) {
|
||||||
lua::setfield(L, "PACK_ENV");
|
lua::setfield(L, "PACK_ENV");
|
||||||
lua::pushstring(L, pack.id);
|
lua::pushstring(L, pack.id);
|
||||||
lua::setfield(L, "PACK_ID");
|
lua::setfield(L, "PACK_ID");
|
||||||
|
|
||||||
|
if(!lua::getglobal(L, "__vc__pack_envs")) {
|
||||||
|
lua::createtable(L, 0, 0);
|
||||||
|
lua::setglobal(L, "__vc__pack_envs");
|
||||||
|
lua::pushvalue(L, -1);
|
||||||
|
}
|
||||||
|
lua::pushenv(L, id);
|
||||||
|
lua::setfield(L, pack.id);
|
||||||
lua::pop(L);
|
lua::pop(L);
|
||||||
|
|
||||||
return std::shared_ptr<int>(new int(id), [=](int* id) { //-V508
|
return std::shared_ptr<int>(new int(id), [=](int* id) { //-V508
|
||||||
lua::remove_environment(L, *id);
|
lua::remove_environment(L, *id);
|
||||||
delete id;
|
delete id;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue