diff --git a/src/frontend/InventoryView.cpp b/src/frontend/InventoryView.cpp index 05fb768e..332cab33 100644 --- a/src/frontend/InventoryView.cpp +++ b/src/frontend/InventoryView.cpp @@ -31,6 +31,7 @@ SlotLayout::SlotLayout( glm::vec2 position, bool background, bool itemSource, + slotcallback updateFunc, slotcallback shareFunc, slotcallback rightClick ) @@ -38,6 +39,7 @@ SlotLayout::SlotLayout( position(position), background(background), itemSource(itemSource), + updateFunc(updateFunc), shareFunc(shareFunc), rightClick(rightClick) {} @@ -218,6 +220,9 @@ void SlotView::clicked(gui::GUI* gui, mousecode button) { if (layout.shareFunc) { layout.shareFunc(layout.index, stack); } + if (layout.updateFunc) { + layout.updateFunc(layout.index, stack); + } return; } if (!layout.itemSource && stack.accepts(grabbed)) { @@ -236,6 +241,9 @@ void SlotView::clicked(gui::GUI* gui, mousecode button) { } else if (button == mousecode::BUTTON_2) { if (layout.rightClick) { layout.rightClick(inventoryid, stack); + if (layout.updateFunc) { + layout.updateFunc(layout.index, stack); + } return; } if (layout.itemSource) @@ -258,6 +266,9 @@ void SlotView::clicked(gui::GUI* gui, mousecode button) { } } } + if (layout.updateFunc) { + layout.updateFunc(layout.index, stack); + } } void SlotView::onFocus(gui::GUI* gui) { @@ -384,10 +395,13 @@ static slotcallback readSlotFunc(InventoryView* view, gui::UiXmlReader& reader, static void readSlot(InventoryView* view, 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); + 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"); } @@ -421,10 +435,13 @@ static void readSlotsGrid(InventoryView* view, gui::UiXmlReader& reader, xml::xm count = rows * cols; } bool itemSource = element->attr("item-source", "false").asBool(); - SlotLayout layout(-1, glm::vec2(), true, itemSource, nullptr, nullptr); + 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"); } diff --git a/src/frontend/InventoryView.h b/src/frontend/InventoryView.h index 6124eccf..81e8a4e8 100644 --- a/src/frontend/InventoryView.h +++ b/src/frontend/InventoryView.h @@ -43,6 +43,7 @@ struct SlotLayout { glm::vec2 position; bool background; bool itemSource; + slotcallback updateFunc; slotcallback shareFunc; slotcallback rightClick; int padding = 0; @@ -51,6 +52,7 @@ struct SlotLayout { glm::vec2 position, bool background, bool itemSource, + slotcallback updateFunc, slotcallback shareFunc, slotcallback rightClick); }; diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 3215980f..21800a22 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -145,7 +145,7 @@ std::shared_ptr Hud::createContentAccess() { accessInventory->getSlot(id-1).set(ItemStack(id, 1)); } - SlotLayout slotLayout(-1, glm::vec2(), false, true, + SlotLayout slotLayout(-1, glm::vec2(), false, true, nullptr, [=](uint, ItemStack& item) { auto copy = ItemStack(item); inventory->move(copy, indices); @@ -165,7 +165,7 @@ std::shared_ptr Hud::createContentAccess() { std::shared_ptr Hud::createHotbar() { auto inventory = player->getInventory(); - SlotLayout slotLayout(-1, glm::vec2(), false, false, nullptr, nullptr); + SlotLayout slotLayout(-1, glm::vec2(), false, false, nullptr, nullptr, nullptr); InventoryBuilder builder; builder.addGrid(10, 10, glm::vec2(), 4, true, slotLayout); auto view = builder.build(); @@ -185,7 +185,7 @@ Hud::Hud(Engine* engine, LevelFrontend* frontend, Player* player) { interaction = std::make_unique(); grabbedItemView = std::make_shared( - SlotLayout(-1, glm::vec2(), false, false, nullptr, nullptr) + SlotLayout(-1, glm::vec2(), false, false, nullptr, nullptr, nullptr) ); grabbedItemView->bind( 0,