Merge pull request #672 from MihailRis/make-cursor-slot-public

Make cursor slot public & add 'exists' ui property
This commit is contained in:
MihailRis 2025-11-12 19:06:45 +03:00 committed by GitHub
commit f137481990
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 23 additions and 4 deletions

View File

@ -37,6 +37,7 @@ Properties that apply to all elements:
| Name | Type | Read | Write | Description | | Name | Type | Read | Write | Description |
| ------------- | ------- | ---- | ----- | ------------------------------------------- | | ------------- | ------- | ---- | ----- | ------------------------------------------- |
| id | string | yes | *no* | element id | | id | string | yes | *no* | element id |
| exists | bool | yes | *no* | checks if element exists |
| pos | vec2 | yes | yes | element position inside a container | | pos | vec2 | yes | yes | element position inside a container |
| wpos | vec2 | yes | yes | element position inside the window | | wpos | vec2 | yes | yes | element position inside the window |
| size | vec2 | yes | yes | element size | | size | vec2 | yes | yes | element size |

View File

@ -37,6 +37,7 @@ document["worlds-panel"]:clear()
| Название | Тип | Чтение | Запись | Описание | | Название | Тип | Чтение | Запись | Описание |
| ------------- | ------- | ------ | ------ | ----------------------------------------- | | ------------- | ------- | ------ | ------ | ----------------------------------------- |
| id | string | да | *нет* | идентификатор элемента | | id | string | да | *нет* | идентификатор элемента |
| exists | bool | да | *нет* | проверяет, существует ли элемент |
| pos | vec2 | да | да | позиция элемента внутри контейнера | | pos | vec2 | да | да | позиция элемента внутри контейнера |
| wpos | vec2 | да | да | позиция элемента в окне | | wpos | vec2 | да | да | позиция элемента в окне |
| size | vec2 | да | да | размер элемента | | size | vec2 | да | да | размер элемента |

View File

@ -469,6 +469,7 @@ void Hud::showExchangeSlot() {
gui, gui,
SlotLayout(-1, glm::vec2(), false, false, nullptr, nullptr, nullptr) SlotLayout(-1, glm::vec2(), false, false, nullptr, nullptr, nullptr)
); );
exchangeSlot->setId("hud.exchange-slot");
exchangeSlot->bind(exchangeSlotInv->getId(), exchangeSlotInv->getSlot(0), &content); exchangeSlot->bind(exchangeSlotInv->getId(), exchangeSlotInv->getSlot(0), &content);
exchangeSlot->setColor(glm::vec4()); exchangeSlot->setColor(glm::vec4());
exchangeSlot->setInteractive(false); exchangeSlot->setInteractive(false);

View File

@ -30,14 +30,17 @@ using namespace gui;
using namespace scripting; using namespace scripting;
static DocumentNode get_document_node_impl( static DocumentNode get_document_node_impl(
lua::State*, const std::string& name, const std::string& nodeName lua::State*, const std::string& name, const std::string& nodeName, bool throwable=true
) { ) {
auto doc = engine->getAssets()->get<UiDocument>(name); auto doc = engine->getAssets()->get<UiDocument>(name);
if (doc == nullptr) { if (doc == nullptr) {
throw std::runtime_error("document '" + name + "' not found"); if (throwable) {
throw std::runtime_error("document '" + name + "' not found");
}
return {nullptr, nullptr};
} }
auto node = doc->get(nodeName); auto node = doc->get(nodeName);
if (node == nullptr) { if (node == nullptr && throwable) {
throw std::runtime_error( throw std::runtime_error(
"document '" + name + "' has no element with id '" + nodeName + "'" "document '" + name + "' has no element with id '" + nodeName + "'"
); );
@ -459,6 +462,9 @@ static int p_get_content_offset(UINode* node, lua::State* L) {
return lua::pushvec(L, node->getContentOffset()); return lua::pushvec(L, node->getContentOffset());
} }
static int p_get_id(UINode* node, lua::State* L) { static int p_get_id(UINode* node, lua::State* L) {
if (node == nullptr) {
return 0;
}
return lua::pushstring(L, node->getId()); return lua::pushstring(L, node->getId());
} }
static int p_get_color(UINode* node, lua::State* L) { static int p_get_color(UINode* node, lua::State* L) {
@ -540,6 +546,14 @@ static int p_get_options(UINode* node, lua::State* L) {
return 0; return 0;
} }
static int p_is_exists(UINode* node, lua::State* L) {
return lua::pushboolean(L, node != nullptr);
}
static bool is_node_required(std::string_view attr) {
return attr != "exists";
}
static int l_gui_getattr(lua::State* L) { static int l_gui_getattr(lua::State* L) {
if (!lua::isstring(L, 1)) { if (!lua::isstring(L, 1)) {
throw std::runtime_error("document name is not a string"); throw std::runtime_error("document name is not a string");
@ -568,12 +582,14 @@ static int l_gui_getattr(lua::State* L) {
throw std::runtime_error("attribute name is not a string"); throw std::runtime_error("attribute name is not a string");
} }
auto attr = lua::require_string(L, 3); auto attr = lua::require_string(L, 3);
bool required = is_node_required(attr);
static const std::unordered_map< static const std::unordered_map<
std::string_view, std::string_view,
std::function<int(UINode*, lua::State*)>> std::function<int(UINode*, lua::State*)>>
getters { getters {
{"id", p_get_id}, {"id", p_get_id},
{"exists", p_is_exists},
{"color", p_get_color}, {"color", p_get_color},
{"hoverColor", p_get_hover_color}, {"hoverColor", p_get_hover_color},
{"pressedColor", p_get_pressed_color}, {"pressedColor", p_get_pressed_color},
@ -630,7 +646,7 @@ static int l_gui_getattr(lua::State* L) {
}; };
auto func = getters.find(attr); auto func = getters.find(attr);
if (func != getters.end()) { if (func != getters.end()) {
auto docnode = get_document_node_impl(L, docname, element); auto docnode = get_document_node_impl(L, docname, element, required);
auto node = docnode.node; auto node = docnode.node;
return func->second(node.get(), L); return func->second(node.get(), L);
} }