InventoryView::readXML
This commit is contained in:
@@ -89,13 +89,13 @@ void InventoryBuilder::addGrid(
|
|||||||
auto builtSlot = slotLayout;
|
auto builtSlot = slotLayout;
|
||||||
builtSlot.index = row * cols + col;
|
builtSlot.index = row * cols + col;
|
||||||
builtSlot.position = position;
|
builtSlot.position = position;
|
||||||
view->addSlot(builtSlot);
|
add(builtSlot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InventoryBuilder::add(SlotLayout layout) {
|
void InventoryBuilder::add(SlotLayout layout) {
|
||||||
view->addSlot(layout);
|
view->add(view->addSlot(layout), layout.position);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<InventoryView> InventoryBuilder::build() {
|
std::shared_ptr<InventoryView> InventoryBuilder::build() {
|
||||||
@@ -285,7 +285,7 @@ InventoryView::InventoryView(
|
|||||||
InventoryView::~InventoryView() {}
|
InventoryView::~InventoryView() {}
|
||||||
|
|
||||||
|
|
||||||
void InventoryView::addSlot(SlotLayout layout) {
|
std::shared_ptr<SlotView> InventoryView::addSlot(SlotLayout layout) {
|
||||||
uint width = InventoryView::SLOT_SIZE;
|
uint width = InventoryView::SLOT_SIZE;
|
||||||
uint height = InventoryView::SLOT_SIZE;
|
uint height = InventoryView::SLOT_SIZE;
|
||||||
|
|
||||||
@@ -297,6 +297,7 @@ void InventoryView::addSlot(SlotLayout layout) {
|
|||||||
if (coord.y + height > vsize.y) {
|
if (coord.y + height > vsize.y) {
|
||||||
vsize.y = coord.y + height;
|
vsize.y = coord.y + height;
|
||||||
}
|
}
|
||||||
|
setSize(vsize);
|
||||||
|
|
||||||
auto slot = std::make_shared<SlotView>(
|
auto slot = std::make_shared<SlotView>(
|
||||||
frontend, interaction, layout
|
frontend, interaction, layout
|
||||||
@@ -304,8 +305,8 @@ void InventoryView::addSlot(SlotLayout layout) {
|
|||||||
if (!layout.background) {
|
if (!layout.background) {
|
||||||
slot->setColor(glm::vec4());
|
slot->setColor(glm::vec4());
|
||||||
}
|
}
|
||||||
add(slot, layout.position);
|
|
||||||
slots.push_back(slot.get());
|
slots.push_back(slot.get());
|
||||||
|
return slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InventoryView::bind(std::shared_ptr<Inventory> inventory) {
|
void InventoryView::bind(std::shared_ptr<Inventory> inventory) {
|
||||||
@@ -337,3 +338,41 @@ glm::vec2 InventoryView::getOrigin() const {
|
|||||||
void InventoryView::setInventory(std::shared_ptr<Inventory> inventory) {
|
void InventoryView::setInventory(std::shared_ptr<Inventory> inventory) {
|
||||||
this->inventory = inventory;
|
this->inventory = inventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "../coders/xml.h"
|
||||||
|
#include "gui/gui_xml.h"
|
||||||
|
|
||||||
|
std::shared_ptr<InventoryView> InventoryView::readXML(
|
||||||
|
LevelFrontend* frontend,
|
||||||
|
InventoryInteraction& interaction,
|
||||||
|
const std::string& src,
|
||||||
|
const std::string& file
|
||||||
|
) {
|
||||||
|
auto view = std::make_shared<InventoryView>(frontend, interaction);
|
||||||
|
|
||||||
|
gui::UiXmlReader reader;
|
||||||
|
reader.add("inventory", [=](gui::UiXmlReader& reader, xml::xmlelement element) {
|
||||||
|
reader.readUINode(reader, element, *view);
|
||||||
|
return view;
|
||||||
|
});
|
||||||
|
|
||||||
|
reader.add("slot", [=](gui::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);
|
||||||
|
if (element->has("coord")) {
|
||||||
|
layout.position = element->attr("coord").asVec2();
|
||||||
|
}
|
||||||
|
auto slot = view->addSlot(layout);
|
||||||
|
reader.readUINode(reader, element, *slot);
|
||||||
|
return slot;
|
||||||
|
});
|
||||||
|
|
||||||
|
auto document = xml::parse(file, src);
|
||||||
|
auto root = document->getRoot();
|
||||||
|
if (root->getTag() != "inventory") {
|
||||||
|
throw std::runtime_error("'inventory' element expected");
|
||||||
|
}
|
||||||
|
reader.readXML(file, root);
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|||||||
@@ -98,7 +98,14 @@ public:
|
|||||||
|
|
||||||
void bind(std::shared_ptr<Inventory> inventory);
|
void bind(std::shared_ptr<Inventory> inventory);
|
||||||
|
|
||||||
void addSlot(SlotLayout layout);
|
std::shared_ptr<SlotView> addSlot(SlotLayout layout);
|
||||||
|
|
||||||
|
static std::shared_ptr<InventoryView> readXML(
|
||||||
|
LevelFrontend* frontend,
|
||||||
|
InventoryInteraction& interaction,
|
||||||
|
const std::string& src,
|
||||||
|
const std::string& file
|
||||||
|
);
|
||||||
|
|
||||||
static const int SLOT_INTERVAL = 4;
|
static const int SLOT_INTERVAL = 4;
|
||||||
static const int SLOT_SIZE = ITEM_ICON_SIZE;
|
static const int SLOT_SIZE = ITEM_ICON_SIZE;
|
||||||
@@ -116,7 +123,8 @@ public:
|
|||||||
glm::vec2 coord,
|
glm::vec2 coord,
|
||||||
int padding,
|
int padding,
|
||||||
bool addpanel,
|
bool addpanel,
|
||||||
SlotLayout slotLayout);
|
SlotLayout slotLayout
|
||||||
|
);
|
||||||
|
|
||||||
void add(SlotLayout slotLayout);
|
void add(SlotLayout slotLayout);
|
||||||
std::shared_ptr<InventoryView> build();
|
std::shared_ptr<InventoryView> build();
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ static Align align_from_string(const std::string& str, Align def) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read basic UINode properties */
|
/* Read basic UINode properties */
|
||||||
static void readUINode(xml::xmlelement element, UINode& node) {
|
static void _readUINode(xml::xmlelement element, UINode& node) {
|
||||||
if (element->has("coord")) {
|
if (element->has("coord")) {
|
||||||
node.setCoord(element->attr("coord").asVec2());
|
node.setCoord(element->attr("coord").asVec2());
|
||||||
}
|
}
|
||||||
@@ -37,8 +37,9 @@ static void readUINode(xml::xmlelement element, UINode& node) {
|
|||||||
node.setAlign(align_from_string(alignName, node.getAlign()));
|
node.setAlign(align_from_string(alignName, node.getAlign()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void _readContainer(UiXmlReader& reader, xml::xmlelement element, Container& container) {
|
static void _readContainer(UiXmlReader& reader, xml::xmlelement element, Container& container) {
|
||||||
readUINode(element, container);
|
_readUINode(element, container);
|
||||||
|
|
||||||
if (element->has("scrollable")) {
|
if (element->has("scrollable")) {
|
||||||
container.setScrollable(element->attr("scrollable").asBool());
|
container.setScrollable(element->attr("scrollable").asBool());
|
||||||
@@ -50,8 +51,16 @@ static void _readContainer(UiXmlReader& reader, xml::xmlelement element, Contain
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UiXmlReader::readUINode(UiXmlReader& reader, xml::xmlelement element, Container& container) {
|
||||||
|
_readContainer(reader, element, container);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UiXmlReader::readUINode(UiXmlReader& reader, xml::xmlelement element, UINode& node) {
|
||||||
|
_readUINode(element, node);
|
||||||
|
}
|
||||||
|
|
||||||
static void _readPanel(UiXmlReader& reader, xml::xmlelement element, Panel& panel) {
|
static void _readPanel(UiXmlReader& reader, xml::xmlelement element, Panel& panel) {
|
||||||
readUINode(element, panel);
|
_readUINode(element, panel);
|
||||||
|
|
||||||
if (element->has("padding")) {
|
if (element->has("padding")) {
|
||||||
panel.setPadding(element->attr("padding").asVec4());
|
panel.setPadding(element->attr("padding").asVec4());
|
||||||
@@ -86,7 +95,7 @@ static std::wstring readAndProcessInnerText(xml::xmlelement element) {
|
|||||||
static std::shared_ptr<UINode> readLabel(UiXmlReader& reader, xml::xmlelement element) {
|
static std::shared_ptr<UINode> readLabel(UiXmlReader& reader, xml::xmlelement element) {
|
||||||
std::wstring text = readAndProcessInnerText(element);
|
std::wstring text = readAndProcessInnerText(element);
|
||||||
auto label = std::make_shared<Label>(text);
|
auto label = std::make_shared<Label>(text);
|
||||||
readUINode(element, *label);
|
_readUINode(element, *label);
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,6 +170,14 @@ std::shared_ptr<UINode> UiXmlReader::readXML(
|
|||||||
return readUINode(root);
|
return readUINode(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<UINode> UiXmlReader::readXML(
|
||||||
|
const std::string& filename,
|
||||||
|
xml::xmlelement root
|
||||||
|
) {
|
||||||
|
this->filename = filename;
|
||||||
|
return readUINode(root);
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& UiXmlReader::getFilename() const {
|
const std::string& UiXmlReader::getFilename() const {
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,11 +22,28 @@ namespace gui {
|
|||||||
|
|
||||||
std::shared_ptr<UINode> readUINode(xml::xmlelement element);
|
std::shared_ptr<UINode> readUINode(xml::xmlelement element);
|
||||||
|
|
||||||
|
void readUINode(
|
||||||
|
UiXmlReader& reader,
|
||||||
|
xml::xmlelement element,
|
||||||
|
UINode& node
|
||||||
|
);
|
||||||
|
|
||||||
|
void readUINode(
|
||||||
|
UiXmlReader& reader,
|
||||||
|
xml::xmlelement element,
|
||||||
|
Container& container
|
||||||
|
);
|
||||||
|
|
||||||
std::shared_ptr<UINode> readXML(
|
std::shared_ptr<UINode> readXML(
|
||||||
const std::string& filename,
|
const std::string& filename,
|
||||||
const std::string& source
|
const std::string& source
|
||||||
);
|
);
|
||||||
|
|
||||||
|
std::shared_ptr<UINode> readXML(
|
||||||
|
const std::string& filename,
|
||||||
|
xml::xmlelement root
|
||||||
|
);
|
||||||
|
|
||||||
const std::string& getFilename() const;
|
const std::string& getFilename() const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user