From 41d016cf5bdae46d478559f50a48a86723db80f8 Mon Sep 17 00:00:00 2001 From: peterbell10 Date: Thu, 13 Jul 2017 14:43:48 +0100 Subject: Handle middle mouse drag (#3847) --- src/UI/Window.cpp | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) (limited to 'src/UI/Window.cpp') diff --git a/src/UI/Window.cpp b/src/UI/Window.cpp index 4582d6cf4..8bbc4f482 100644 --- a/src/UI/Window.cpp +++ b/src/UI/Window.cpp @@ -242,12 +242,15 @@ void cWindow::Clicked( // Nothing needed return; } - case caLeftPaintBegin: OnPaintBegin (a_Player); return; - case caRightPaintBegin: OnPaintBegin (a_Player); return; - case caLeftPaintProgress: OnPaintProgress(a_Player, a_SlotNum); return; - case caRightPaintProgress: OnPaintProgress(a_Player, a_SlotNum); return; - case caLeftPaintEnd: OnLeftPaintEnd (a_Player); return; - case caRightPaintEnd: OnRightPaintEnd(a_Player); return; + case caLeftPaintBegin: OnPaintBegin (a_Player); return; + case caRightPaintBegin: OnPaintBegin (a_Player); return; + case caMiddlePaintBegin: OnPaintBegin (a_Player); return; + case caLeftPaintProgress: OnPaintProgress (a_Player, a_SlotNum); return; + case caRightPaintProgress: OnPaintProgress (a_Player, a_SlotNum); return; + case caMiddlePaintProgress: OnPaintProgress (a_Player, a_SlotNum); return; + case caLeftPaintEnd: OnLeftPaintEnd (a_Player); return; + case caRightPaintEnd: OnRightPaintEnd (a_Player); return; + case caMiddlePaintEnd: OnMiddlePaintEnd(a_Player); return; default: { break; @@ -643,9 +646,33 @@ void cWindow::OnRightPaintEnd(cPlayer & a_Player) -int cWindow::DistributeItemToSlots(cPlayer & a_Player, const cItem & a_Item, int a_NumToEachSlot, const cSlotNums & a_SlotNums) +void cWindow::OnMiddlePaintEnd(cPlayer & a_Player) { - if (static_cast(a_Item.m_ItemCount) < a_SlotNums.size()) + if (!a_Player.IsGameModeCreative()) + { + // Midle click paint is only valid for creative mode + return; + } + + // Fill available slots with full stacks of the dragging item + const auto & DraggingItem = a_Player.GetDraggingItem(); + auto StackSize = ItemHandler(DraggingItem.m_ItemType)->GetMaxStackSize(); + if (0 < DistributeItemToSlots(a_Player, DraggingItem, StackSize, a_Player.GetInventoryPaintSlots(), false)) + { + // If any items were distibuted, set dragging item empty + a_Player.GetDraggingItem().Empty(); + } + + SendWholeWindow(*a_Player.GetClientHandle()); +} + + + + + +int cWindow::DistributeItemToSlots(cPlayer & a_Player, const cItem & a_Item, int a_NumToEachSlot, const cSlotNums & a_SlotNums, bool a_LimitItems) +{ + if (a_LimitItems && (static_cast(a_Item.m_ItemCount) < a_SlotNums.size())) { LOGWARNING("%s: Distributing less items (%d) than slots (" SIZE_T_FMT ")", __FUNCTION__, static_cast(a_Item.m_ItemCount), a_SlotNums.size()); // This doesn't seem to happen with the 1.5.1 client, so we don't worry about it for now -- cgit v1.2.3