From 69df0eba1b1ac5ee3ead3bf9d3025c2afb7bfefd Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 25 Nov 2024 07:12:40 +0300 Subject: [PATCH] add 'taking' and 'placing' xml properties to slot and slots-grid --- src/graphics/ui/elements/InventoryView.cpp | 15 +++++++++++---- src/graphics/ui/elements/InventoryView.hpp | 3 +++ src/graphics/ui/gui_xml.cpp | 8 ++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index f3687799..78751cea 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -209,7 +209,7 @@ bool SlotView::isHighlighted() const { } void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { - if (Events::pressed(keycode::LEFT_SHIFT)) { + if (layout.taking && Events::pressed(keycode::LEFT_SHIFT)) { if (layout.shareFunc) { layout.shareFunc(layout.index, stack); } @@ -218,7 +218,7 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { } return; } - if (!layout.itemSource && stack.accepts(grabbed)) { + if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) { stack.move(grabbed, content->getIndices()); } else { if (layout.itemSource) { @@ -227,7 +227,11 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { } else { grabbed.clear(); } - } else { + } else if (grabbed.isEmpty()) { + if (layout.taking) { + std::swap(grabbed, stack); + } + } else if (layout.taking && layout.placing) { std::swap(grabbed, stack); } } @@ -244,7 +248,7 @@ void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { if (layout.itemSource) return; if (grabbed.isEmpty()) { - if (!stack.isEmpty()) { + if (!stack.isEmpty() && layout.taking) { grabbed.set(stack); int halfremain = stack.getCount() / 2; grabbed.setCount(stack.getCount() - halfremain); @@ -253,6 +257,9 @@ void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { return; } auto& stackDef = content->getIndices()->items.require(stack.getItemId()); + if (!layout.placing) { + return; + } if (stack.isEmpty()) { stack.set(grabbed); stack.setCount(1); diff --git a/src/graphics/ui/elements/InventoryView.hpp b/src/graphics/ui/elements/InventoryView.hpp index 9f53e231..e37e6681 100644 --- a/src/graphics/ui/elements/InventoryView.hpp +++ b/src/graphics/ui/elements/InventoryView.hpp @@ -34,6 +34,9 @@ namespace gui { slotcallback rightClick; int padding = 0; + bool taking = true; + bool placing = true; + SlotLayout( int index, glm::vec2 position, diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index ffdf0e16..c25b65b2 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -483,6 +483,8 @@ static slotcallback readSlotFunc(InventoryView* view, UiXmlReader& reader, xml:: 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(); + bool taking = element->attr("taking", "true").asBool(); + bool placing = element->attr("placing", "true").asBool(); SlotLayout layout(index, glm::vec2(), true, itemSource, nullptr, nullptr, nullptr); if (element->has("pos")) { layout.position = element->attr("pos").asVec2(); @@ -496,6 +498,8 @@ static void readSlot(InventoryView* view, UiXmlReader& reader, xml::xmlelement e if (element->has("onrightclick")) { layout.rightClick = readSlotFunc(view, reader, element, "onrightclick"); } + layout.taking = taking; + layout.placing = placing; auto slot = view->addSlot(layout); reader.readUINode(reader, element, *slot); view->add(slot); @@ -507,6 +511,8 @@ static void readSlotsGrid(InventoryView* view, UiXmlReader& reader, xml::xmlelem int cols = element->attr("cols", "0").asInt(); int count = element->attr("count", "0").asInt(); const int slotSize = InventoryView::SLOT_SIZE; + bool taking = element->attr("taking", "true").asBool(); + bool placing = element->attr("placing", "true").asBool(); int interval = element->attr("interval", "-1").asInt(); if (interval < 0) { interval = InventoryView::SLOT_INTERVAL; @@ -537,6 +543,8 @@ static void readSlotsGrid(InventoryView* view, UiXmlReader& reader, xml::xmlelem layout.rightClick = readSlotFunc(view, reader, element, "onrightclick"); } layout.padding = padding; + layout.taking = taking; + layout.placing = placing; int idx = 0; for (int row = 0; row < rows; row++) {