-- PickupInventory.lua local P = createMenuSheet("PickupInventory") P.wrapper = nil P.detailsWindows = {} P.detailPickups = {} P.pickupsList = {} P.showing = false -- Design parameters P.imageHeight = 50 P.detailImageSize = 100 P.textHeight = 30 P.buttonWidth = 85 function P.onLoad() P.wrapper = nil P.detailsWindows = {} P.detailPickups = {} P.pickupsList = {} end function P.onShow() P.createInventory() P.showing = true end function P.onHide() P.showing = false P.cleanup(true) end function P.update() if P.showing == false then return end -- Update opened detail windows. for k,v in pairs(P.detailsWindows) do if v ~= nil then local pickup = P.detailPickups[k] if pickup ~= nil and pickup ~= 0 then local useButton = P.window:getChild("Details" .. k .. "/Wrapper/UseButton") local dropButton = P.window:getChild("Details" .. k .. "/Wrapper/DropButton") if orxonox.PickupManager:getInstance():isValidPickup(pickup.pickup) == false then useButton:setEnabled(false) dropButton:setEnabled(false) P.detailPickups[k] = nil else useButton:setEnabled(true) if pickup.inUse == false then useButton:setText("use") if pickup.usable == false then useButton:setEnabled(false) end else useButton:setText("unuse") if pickup.unusable == false then useButton:setEnabled(false) end end if pickup.pickedUp == false then useButton:setEnabled(false) dropButton:setEnabled(false) P.detailPickups[k] = nil end end end end end -- Update main inventory. P.cleanup(false) P.createInventory() -- TODO: Recover scrolling position end function P.createInventory() local pickupManager = orxonox.PickupManager:getInstance() local root = P.window:getChild("PickupInventory/Wrapper/Inventory") P.wrapper = winMgr:createWindow("MenuWidgets/ScrollablePane", "Wrapper") P.wrapper:setSize(CEGUI.USize(CEGUI.UDim(1,0),CEGUI.UDim(1,0))) root:addChild(P.wrapper) P.pickupsList = {} local numPickups = pickupManager:getNumPickups() local counter = 1 local offset = 0 while counter <= numPickups do local pickup = pickupManager:popPickup() table.insert(P.pickupsList, pickup) local window = P.createPickupEntry(counter, pickup) window:setYPosition(CEGUI.UDim(0,offset)) offset = offset + P.imageHeight P.wrapper:addChild(window) counter = counter + 1 end end function P.createPickupEntry(index, pickup) local representation = orxonox.PickupManager:getInstance():getRepresentation(pickup.representationName) local name = "Pickup" .. index local item = winMgr:createWindow("MenuWidgets/StaticText", name) item:setSize(CEGUI.USize(CEGUI.UDim(1, 0), CEGUI.UDim(0, P.imageHeight))) item:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, 0))) local image = winMgr:createWindow("MenuWidgets/StaticImage", "Image") image:setProperty("Image", "PickupInventory/" .. representation:getInventoryRepresentation()) image:setProperty("BackgroundEnabled", "set:False") image:setProperty("FrameEnabled", "set:True") image:setSize(CEGUI.USize(CEGUI.UDim(0, P.imageHeight), CEGUI.UDim(0, P.imageHeight))) item:addChild(image) local title = winMgr:createWindow("MenuWidgets/StaticText", "Title") title:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.imageHeight+5), CEGUI.UDim(0, (P.imageHeight-P.textHeight)/2))) title:setSize(CEGUI.USize(CEGUI.UDim(0.3, 0), CEGUI.UDim(0, P.textHeight))) title:setText(representation:getPickupName()) title:setProperty("FrameEnabled", "set:False") item:addChild(title) local useButton = winMgr:createWindow("MenuWidgets/Button", "UseButton") useButton:setPosition(CEGUI.UVector2(CEGUI.UDim(0.3, P.imageHeight+10),CEGUI.UDim(0, (P.imageHeight-P.textHeight)/2))) useButton:setSize(CEGUI.USize(CEGUI.UDim(0, P.buttonWidth), CEGUI.UDim(0, P.textHeight))) if pickup.inUse == false then useButton:setText("use") if pickup.usable == false then useButton:setEnabled(false) end else useButton:setText("unuse") if pickup.unusable == false then useButton:setEnabled(false) end end orxonox.GUIManager:subscribeEventHelper(useButton, "Clicked", P.name .. ".InventoryUseUnuseButton_clicked") item:addChild(useButton) local dropButton = winMgr:createWindow("MenuWidgets/Button", "DropButton") dropButton:setPosition(CEGUI.UVector2(CEGUI.UDim(0.3, P.imageHeight+15+P.buttonWidth),CEGUI.UDim(0, (P.imageHeight-P.textHeight)/2))) dropButton:setSize(CEGUI.USize(CEGUI.UDim(0, P.buttonWidth), CEGUI.UDim(0, P.textHeight))) dropButton:setText("drop") orxonox.GUIManager:subscribeEventHelper(dropButton, "Clicked", P.name .. ".InventoryDropButton_clicked") item:addChild(dropButton) local detailsButton = winMgr:createWindow("MenuWidgets/Button", "DetailsButton") detailsButton:setPosition(CEGUI.UVector2(CEGUI.UDim(0.3, P.imageHeight+20+2*P.buttonWidth),CEGUI.UDim(0, (P.imageHeight-P.textHeight)/2))) detailsButton:setSize(CEGUI.USize(CEGUI.UDim(0, P.buttonWidth), CEGUI.UDim(0, P.textHeight))) detailsButton:setText("details") orxonox.GUIManager:subscribeEventHelper(detailsButton, "Clicked", P.name .. ".InventoryDetailsButton_clicked") item:addChild(detailsButton) return item end function P.cleanup(destroyDetails) if P.wrapper ~= nil then winMgr:destroyWindow(P.wrapper) end --Destroy details windows. if destroyDetails == false then return end for k,v in pairs(P.detailsWindows) do if v ~= nil then P.destroyDetailWindow(k) end end end function P.windowToPickupHelper(e) local we = CEGUI.toWindowEventArgs(e) local name = we.window:getNamePath() local match = string.gmatch(name, "%d+") local pickupIndex = tonumber(match()) return pickupIndex end function P.createDetailsWindow(pickupIndex) local pickup = P.pickupsList[pickupIndex] local representation = orxonox.PickupManager:getInstance():getRepresentation(pickup.representationName) local index = P.getNewDetailNumber() local name = "Details" .. index local window = winMgr:createWindow("MenuWidgets/FrameWindow", name) window:setSize(CEGUI.USize(CEGUI.UDim(0.5,0),CEGUI.UDim(0.4,0))) orxonox.GUIManager:subscribeEventHelper(window, "CloseClicked", P.name .. ".closeDetailWindow") P.window:addChild(window) local wrapper = winMgr:createWindow("DefaultWindow", "Wrapper") wrapper:setSize(CEGUI.USize(CEGUI.UDim(1, -20),CEGUI.UDim(1, -50))) wrapper:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 10),CEGUI.UDim(0, 40))) window:addChild(wrapper) local title = winMgr:createWindow("MenuWidgets/StaticText", "Title") title:setText(representation:getPickupName()) title:setHeight(CEGUI.UDim(0, P.textHeight)) title:setProperty("FrameEnabled", "set:False") title:setProperty("BackgroundEnabled", "set:False") wrapper:addChild(title) local image = winMgr:createWindow("MenuWidgets/StaticImage", "Image") image:setProperty("Image", "PickupInventory/" .. representation:getInventoryRepresentation()) image:setProperty("BackgroundEnabled", "set:False") image:setProperty("FrameEnabled", "set:True") image:setSize(CEGUI.USize(CEGUI.UDim(0, P.detailImageSize), CEGUI.UDim(0, P.detailImageSize))) image:setYPosition(CEGUI.UDim(0, P.textHeight + 5)) wrapper:addChild(image) local box = winMgr:createWindow("MenuWidgets/ScrollablePane", "Description") box:setSize(CEGUI.USize(CEGUI.UDim(1.0, -1*(P.detailImageSize + 10)),CEGUI.UDim(1, -(P.textHeight + 5 + P.textHeight + 20)))) box:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.detailImageSize + 10),CEGUI.UDim(0, P.textHeight + 5))) local description = winMgr:createWindow("MenuWidgets/StaticText", "Text") description:setText(representation:getPickupDescription()) description:setProperty("HorzFormatting", "WordWrapLeftAligned") description:setProperty("VertFormatting", "TopAligned") box:addChild(description) wrapper:addChild(box) local useButton = winMgr:createWindow("MenuWidgets/Button", "UseButton") useButton:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.detailImageSize+10),CEGUI.UDim(1, -40))) useButton:setSize(CEGUI.USize(CEGUI.UDim(0, P.buttonWidth), CEGUI.UDim(0, P.textHeight))) if pickup.inUse == false then useButton:setText("use") if pickup.usable == false then useButton:setEnabled(false) end else useButton:setText("unuse") if pickup.unusable == false then useButton:setEnabled(false) end end orxonox.GUIManager:subscribeEventHelper(useButton, "Clicked", P.name .. ".InventoryUseUnuseDetailButton_clicked") wrapper:addChild(useButton) local dropButton = winMgr:createWindow("MenuWidgets/Button", "DropButton") dropButton:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.detailImageSize+10+P.buttonWidth+10),CEGUI.UDim(1, -40))) dropButton:setSize(CEGUI.USize(CEGUI.UDim(0, P.buttonWidth), CEGUI.UDim(0, P.textHeight))) dropButton:setText("drop") orxonox.GUIManager:subscribeEventHelper(dropButton, "Clicked", P.name .. ".InventoryDropDetailButton_clicked") wrapper:addChild(dropButton) P.detailsWindows[index] = window P.detailPickups[index] = pickup end function P.getNewDetailNumber() local number = table.getn(P.detailsWindows) for k,v in pairs(P.detailsWindows) do if v == nil then number = k-1 end end return number+1 end function P.InventoryUseUnuseButton_clicked(e) local pickupIndex = P.windowToPickupHelper(e) local pickup = P.pickupsList[pickupIndex] if pickup.inUse == false then orxonox.PickupManager:getInstance():usePickup(pickup.pickup, true) else orxonox.PickupManager:getInstance():usePickup(pickup.pickup, false) end end function P.InventoryDropButton_clicked(e) local pickupIndex = P.windowToPickupHelper(e) local pickup = P.pickupsList[pickupIndex] orxonox.PickupManager:getInstance():dropPickup(pickup.pickup) end function P.InventoryDetailsButton_clicked(e) local pickupIndex = P.windowToPickupHelper(e) P.createDetailsWindow(pickupIndex) end function P.InventoryUseUnuseDetailButton_clicked(e) local pickupIndex = P.windowToPickupHelper(e) local pickup = P.detailPickups[pickupIndex] if pickup.inUse == false then orxonox.PickupManager:getInstance():usePickup(pickup.pickup, true) else orxonox.PickupManager:getInstance():usePickup(pickup.pickup, false) end end function P.InventoryDropDetailButton_clicked(e) local pickupIndex = P.windowToPickupHelper(e) local pickup = P.detailPickups[pickupIndex] orxonox.PickupManager:getInstance():dropPickup(pickup.pickup) end function P.closeDetailWindow(e) --Get some numbers from the window local we = CEGUI.toWindowEventArgs(e) local name = we.window:getNamePath() local match = string.gmatch(name, "%d+") local detailNr = tonumber(match()) P.destroyDetailWindow(detailNr) end function P.destroyDetailWindow(detailNr) local window = P.detailsWindows[detailNr] winMgr:destroyWindow(window) P.detailsWindows[detailNr] = nil P.detailPickups[detailNr] = nil end function P.InventoryBackButton_clicked(e) orxonox.CommandExecutor:execute("OrxonoxOverlay toggleVisibility PickupInventory") end return P