InventoryView inventory property

This commit is contained in:
MihailRis
2024-04-29 15:18:45 +03:00
parent 1401eca712
commit beaeba43af
10 changed files with 382 additions and 369 deletions
+129 -31
View File
@@ -1,8 +1,5 @@
#include "gui_xml.hpp"
#include <charconv>
#include <stdexcept>
#include "elements/Panel.hpp"
#include "elements/Image.hpp"
#include "elements/Button.hpp"
@@ -10,12 +7,17 @@
#include "elements/TextBox.hpp"
#include "elements/TrackBar.hpp"
#include "elements/InputBindBox.hpp"
#include "elements/InventoryView.hpp"
#include "../../frontend/locale/langs.h"
#include "../../items/Inventory.h"
#include "../../logic/scripting/scripting.h"
#include "../../maths/voxmaths.h"
#include "../../util/stringutil.h"
#include "../../window/Events.h"
#include <stdexcept>
using namespace gui;
static Align align_from_string(const std::string& str, Align def) {
@@ -84,12 +86,11 @@ static void _readUINode(UiXmlReader& reader, xml::xmlelement element, UINode& no
node.setVisible(element->attr("visible").asBool());
}
if (element->has("position-func")) {
auto supplier = scripting::create_vec2_supplier(
node.setPositionFunc(scripting::create_vec2_supplier(
reader.getEnvironment(),
element->attr("position-func").getText(),
reader.getFilename()+".lua"
);
node.setPositionFunc(supplier);
));
}
if (element->has("hover-color")) {
node.setHoverColor(element->attr("hover-color").asColor());
@@ -208,12 +209,11 @@ static std::shared_ptr<UINode> readLabel(UiXmlReader& reader, xml::xmlelement el
);
}
if (element->has("supplier")) {
auto supplier = scripting::create_wstring_supplier(
label->textSupplier(scripting::create_wstring_supplier(
reader.getEnvironment(),
element->attr("supplier").getText(),
reader.getFilename()
);
label->textSupplier(supplier);
));
}
if (element->has("multiline")) {
label->setMultiline(element->attr("multiline").asBool());
@@ -268,21 +268,19 @@ static std::shared_ptr<UINode> readCheckBox(UiXmlReader& reader, xml::xmlelement
_readPanel(reader, element, *checkbox);
if (element->has("consumer")) {
auto consumer = scripting::create_bool_consumer(
checkbox->setConsumer(scripting::create_bool_consumer(
reader.getEnvironment(),
element->attr("consumer").getText(),
reader.getFilename()
);
checkbox->setConsumer(consumer);
));
}
if (element->has("supplier")) {
auto supplier = scripting::create_bool_supplier(
checkbox->setSupplier(scripting::create_bool_supplier(
reader.getEnvironment(),
element->attr("supplier").getText(),
reader.getFilename()
);
checkbox->setSupplier(supplier);
));
}
return checkbox;
}
@@ -306,21 +304,19 @@ static std::shared_ptr<UINode> readTextBox(UiXmlReader& reader, xml::xmlelement
}
if (element->has("consumer")) {
auto consumer = scripting::create_wstring_consumer(
textbox->setTextConsumer(scripting::create_wstring_consumer(
reader.getEnvironment(),
element->attr("consumer").getText(),
reader.getFilename()
);
textbox->setTextConsumer(consumer);
));
}
if (element->has("supplier")) {
auto supplier = scripting::create_wstring_supplier(
textbox->setTextSupplier(scripting::create_wstring_supplier(
reader.getEnvironment(),
element->attr("supplier").getText(),
reader.getFilename()
);
textbox->setTextSupplier(supplier);
));
}
if (element->has("focused-color")) {
textbox->setFocusedColor(element->attr("focused-color").asColor());
@@ -329,12 +325,11 @@ static std::shared_ptr<UINode> readTextBox(UiXmlReader& reader, xml::xmlelement
textbox->setErrorColor(element->attr("error-color").asColor());
}
if (element->has("validator")) {
auto validator = scripting::create_wstring_validator(
textbox->setTextValidator(scripting::create_wstring_validator(
reader.getEnvironment(),
element->attr("validator").getText(),
reader.getFilename()
);
textbox->setTextValidator(validator);
));
}
return textbox;
}
@@ -351,24 +346,22 @@ static std::shared_ptr<UINode> readTrackBar(UiXmlReader& reader, xml::xmlelement
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", "12.0").asInt();
int trackWidth = element->attr("track-width", "12").asInt();
auto bar = std::make_shared<TrackBar>(min, max, def, step, trackWidth);
_readUINode(reader, element, *bar);
if (element->has("consumer")) {
auto consumer = scripting::create_number_consumer(
bar->setConsumer(scripting::create_number_consumer(
reader.getEnvironment(),
element->attr("consumer").getText(),
reader.getFilename()
);
bar->setConsumer(consumer);
));
}
if (element->has("supplier")) {
auto supplier = scripting::create_number_supplier(
bar->setSupplier(scripting::create_number_supplier(
reader.getEnvironment(),
element->attr("supplier").getText(),
reader.getFilename()
);
bar->setSupplier(supplier);
));
}
if (element->has("track-color")) {
bar->setTrackColor(element->attr("track-color").asColor());
@@ -389,6 +382,110 @@ static std::shared_ptr<UINode> readInputBindBox(UiXmlReader& reader, xml::xmlele
return bindbox;
}
static slotcallback readSlotFunc(InventoryView* view, UiXmlReader& reader, xml::xmlelement& element, const std::string& attr) {
auto consumer = scripting::create_int_array_consumer(
reader.getEnvironment(),
element->attr(attr).getText()
);
return [=](uint slot, ItemStack& stack) {
int args[] {int(view->getInventory()->getId()), int(slot)};
consumer(args, 2);
};
}
static void readSlot(InventoryView* view, UiXmlReader& reader, xml::xmlelement element) {
int index = element->attr("index", "0").asInt();
bool itemSource = element->attr("item-source", "false").asBool();
SlotLayout layout(index, glm::vec2(), true, itemSource, nullptr, nullptr, nullptr);
if (element->has("pos")) {
layout.position = element->attr("pos").asVec2();
}
if (element->has("updatefunc")) {
layout.updateFunc = readSlotFunc(view, reader, element, "updatefunc");
}
if (element->has("sharefunc")) {
layout.shareFunc = readSlotFunc(view, reader, element, "sharefunc");
}
if (element->has("onrightclick")) {
layout.rightClick = readSlotFunc(view, reader, element, "onrightclick");
}
auto slot = view->addSlot(layout);
reader.readUINode(reader, element, *slot);
view->add(slot);
}
static void readSlotsGrid(InventoryView* view, UiXmlReader& reader, xml::xmlelement element) {
int startIndex = element->attr("start-index", "0").asInt();
int rows = element->attr("rows", "0").asInt();
int cols = element->attr("cols", "0").asInt();
int count = element->attr("count", "0").asInt();
const int slotSize = InventoryView::SLOT_SIZE;
int interval = element->attr("interval", "-1").asInt();
if (interval < 0) {
interval = InventoryView::SLOT_INTERVAL;
}
int padding = element->attr("padding", "-1").asInt();
if (padding < 0) {
padding = interval;
}
if (rows == 0) {
rows = ceildiv(count, cols);
} else if (cols == 0) {
cols = ceildiv(count, rows);
} else if (count == 0) {
count = rows * cols;
}
bool itemSource = element->attr("item-source", "false").asBool();
SlotLayout layout(-1, glm::vec2(), true, itemSource, nullptr, nullptr, nullptr);
if (element->has("pos")) {
layout.position = element->attr("pos").asVec2();
}
if (element->has("updatefunc")) {
layout.updateFunc = readSlotFunc(view, reader, element, "updatefunc");
}
if (element->has("sharefunc")) {
layout.shareFunc = readSlotFunc(view, reader, element, "sharefunc");
}
if (element->has("onrightclick")) {
layout.rightClick = readSlotFunc(view, reader, element, "onrightclick");
}
layout.padding = padding;
int idx = 0;
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++, idx++) {
if (idx >= count) {
return;
}
SlotLayout slotLayout = layout;
slotLayout.index = startIndex + idx;
slotLayout.position += glm::vec2(
padding + col * (slotSize + interval),
padding + (rows-row-1) * (slotSize + interval)
);
auto slot = view->addSlot(slotLayout);
view->add(slot, slotLayout.position);
}
}
}
static std::shared_ptr<UINode> readInventory(UiXmlReader& reader, xml::xmlelement element) {
auto view = std::make_shared<InventoryView>();
view->setColor(glm::vec4(0.122f, 0.122f, 0.122f, 0.878f)); // todo: fixme
reader.addIgnore("slot");
reader.addIgnore("slots-grid");
reader.readUINode(reader, element, *view);
for (auto& sub : element->getElements()) {
if (sub->getTag() == "slot") {
readSlot(view.get(), reader, sub);
} else if (sub->getTag() == "slots-grid") {
readSlotsGrid(view.get(), reader, sub);
}
}
return view;
}
UiXmlReader::UiXmlReader(const scriptenv& env) : env(env) {
contextStack.push("");
add("image", readImage);
@@ -400,6 +497,7 @@ UiXmlReader::UiXmlReader(const scriptenv& env) : env(env) {
add("trackbar", readTrackBar);
add("container", readContainer);
add("bindbox", readInputBindBox);
add("inventory", readInventory);
}
void UiXmlReader::add(const std::string& tag, uinode_reader reader) {