* implemente Container class * restore module containers * add lua bindings for std::map * improve grid layout * fixes in UIItem rendering * changes in miniwindow designmaster
parent
231ba17ba1
commit
90d3acce2a
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 626 B After Width: | Height: | Size: 758 B |
@ -1,5 +1,6 @@
|
||||
Item < UIItem
|
||||
size: 34 34
|
||||
padding: 1
|
||||
image-source: /core_styles/styles/images/item.png
|
||||
font: verdana-11px-rounded
|
||||
border-color: white
|
||||
|
@ -1,11 +1,35 @@
|
||||
MiniWindow
|
||||
size: 200 221
|
||||
ContainerWindow < MiniWindow
|
||||
height: 150
|
||||
|
||||
layout:
|
||||
type: grid
|
||||
cell-size: 34 34
|
||||
cell-spacing: 5
|
||||
num-columns: 4
|
||||
num-lines: 5
|
||||
UIItem
|
||||
id: containerItemWidget
|
||||
virtual: true
|
||||
item-id: 3253
|
||||
size: 32 32
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
margin-top: -6
|
||||
margin-left: -6
|
||||
|
||||
UIButton
|
||||
id: upButton
|
||||
anchors.top: minimizeButton.top
|
||||
anchors.right: minimizeButton.left
|
||||
margin-right: 3
|
||||
size: 14 14
|
||||
image-source: /game/images/miniwindowbuttons.png
|
||||
image-clip: 42 0 14 14
|
||||
|
||||
$hover:
|
||||
image-clip: 42 14 14 14
|
||||
|
||||
$pressed:
|
||||
image-clip: 42 28 14 14
|
||||
|
||||
MiniWindowContents
|
||||
padding: 27 6 6 8
|
||||
layout:
|
||||
type: grid
|
||||
cell-size: 34 34
|
||||
flow: true
|
||||
auto-spacing: true
|
||||
|
@ -1,138 +1,90 @@
|
||||
Containers = {}
|
||||
|
||||
-- private variables
|
||||
local containers = {}
|
||||
|
||||
-- public functions
|
||||
function Containers.clean()
|
||||
containers = {}
|
||||
end
|
||||
|
||||
function Containers.getFreeContainerId()
|
||||
for i=0,15 do
|
||||
if not containers[i] then
|
||||
return i
|
||||
end
|
||||
local function refreshContainerItems(container)
|
||||
for slot=0,container:getCapacity()-1 do
|
||||
local itemWidget = container.itemsPanel:getChildById('item' .. slot)
|
||||
itemWidget:setItem(container:getItem(slot))
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
-- hooked events
|
||||
function Containers.onOpenContainer(containerId, itemId, name, capacity, hasParent, items)
|
||||
local container = containers[containerId]
|
||||
if container then
|
||||
GameInterface.getRightPanel():removeChild(container)
|
||||
local function onContainerOpen(container, previousContainer)
|
||||
local containerWindow
|
||||
if previousContainer then
|
||||
containerWindow = previousContainer.window
|
||||
previousContainer.window = nil
|
||||
previousContainer.itemsPanel = nil
|
||||
else
|
||||
containerWindow = createWidget('ContainerWindow', GameInterface.getRightPanel())
|
||||
end
|
||||
containerWindow:setId('container' .. container:getId())
|
||||
local containerPanel = containerWindow:getChildById('contentsPanel')
|
||||
local containerItemWidget = containerWindow:getChildById('containerItemWidget')
|
||||
containerWindow.onClose = function()
|
||||
g_game.close(container)
|
||||
containerWindow:hide()
|
||||
end
|
||||
|
||||
container = displayUI('container.otui', GameInterface.getRightPanel())
|
||||
name = name:sub(1,1):upper() .. name:sub(2)
|
||||
container:setText(name)
|
||||
|
||||
-- set icon, itemid
|
||||
-- closebutton
|
||||
-- resize
|
||||
if hasParent then
|
||||
-- parent button
|
||||
local upButton = containerWindow:getChildById('upButton')
|
||||
upButton.onClick = function()
|
||||
g_game.openParent(container)
|
||||
end
|
||||
upButton:setVisible(container:hasParent())
|
||||
|
||||
container.itemCount = #items
|
||||
container.capacity = capacity
|
||||
local name = container:getName()
|
||||
name = name:sub(1,1):upper() .. name:sub(2)
|
||||
containerWindow:setText(name)
|
||||
|
||||
for i=1,capacity do
|
||||
local itemWidget = UIItem.create()
|
||||
itemWidget:setStyle('Item')
|
||||
container:addChild(itemWidget)
|
||||
itemWidget.position = {x=65535, y=containerId+64, z=i-1}
|
||||
containerItemWidget:setItemId(container:getItemId())
|
||||
|
||||
if i <= #items then
|
||||
local item = items[i]
|
||||
item:setPosition(itemWidget.position)
|
||||
itemWidget:setItem(item)
|
||||
end
|
||||
containerPanel:destroyChildren()
|
||||
for slot=0,container:getCapacity()-1 do
|
||||
local itemWidget = createWidget('Item', containerPanel)
|
||||
itemWidget:setId('item' .. slot)
|
||||
itemWidget:setItem(container:getItem(slot))
|
||||
itemWidget.position = container:getSlotPosition(slot)
|
||||
end
|
||||
|
||||
containers[containerId] = container
|
||||
container.window = containerWindow
|
||||
container.itemsPanel = containerPanel
|
||||
end
|
||||
|
||||
function Containers.onCloseContainer(containerId)
|
||||
local container = containers[containerId]
|
||||
if container then
|
||||
GameInterface.getRightPanel():removeChild(container)
|
||||
local function onContainerClose(container)
|
||||
local containerWindow = container.window
|
||||
if containerWindow then
|
||||
containerWindow:destroy()
|
||||
end
|
||||
containers[containerId] = nil
|
||||
end
|
||||
|
||||
function Containers.onContainerAddItem(containerId, item)
|
||||
local container = containers[containerId]
|
||||
if not container or not item or container.itemCount >= container.capacity then return end
|
||||
|
||||
local i = container.itemCount
|
||||
while i >= 1 do
|
||||
local itemWidget = container:getChildByIndex(i)
|
||||
if not itemWidget then return end
|
||||
|
||||
local nextItemWidget = container:getChildByIndex(i+1)
|
||||
if not nextItemWidget then return end
|
||||
|
||||
local swapItem = itemWidget:getItem()
|
||||
if swapItem then
|
||||
swapItem:setPosition(nextItemWidget.position)
|
||||
nextItemWidget:setItem(swapItem)
|
||||
end
|
||||
|
||||
i = i - 1
|
||||
end
|
||||
|
||||
local itemWidget = container:getChildByIndex(1)
|
||||
if not itemWidget then return end
|
||||
item:setPosition(itemWidget.position)
|
||||
itemWidget:setItem(item)
|
||||
|
||||
container.itemCount = container.itemCount + 1
|
||||
local function onContainerAddItem(container, slot, item)
|
||||
refreshContainerItems(container)
|
||||
end
|
||||
|
||||
function Containers.onContainerUpdateItem(containerId, slot, item)
|
||||
local container = containers[containerId]
|
||||
if not container then return end
|
||||
|
||||
local itemWidget = container:getChildByIndex(slot + 1)
|
||||
if not itemWidget then return end
|
||||
local function onContainerUpdateItem(container, slot, item, oldItem)
|
||||
local itemWidget = container.itemsPanel:getChildById('item' .. slot)
|
||||
itemWidget:setItem(item)
|
||||
item:setPosition(itemWidget.position)
|
||||
end
|
||||
|
||||
function Containers.onContainerRemoveItem(containerId, slot)
|
||||
local container = containers[containerId]
|
||||
if not container then return end
|
||||
|
||||
local itemWidget = container:getChildByIndex(slot+1)
|
||||
if not itemWidget then return end
|
||||
itemWidget:setItem(nil)
|
||||
|
||||
for i=slot,container.itemCount-2 do
|
||||
local itemWidget = container:getChildByIndex(i+1)
|
||||
if not itemWidget then return end
|
||||
|
||||
local nextItemWidget = container:getChildByIndex(i+2)
|
||||
if not nextItemWidget then return end
|
||||
local function onContainerRemoveItem(container, slot, item)
|
||||
refreshContainerItems(container)
|
||||
end
|
||||
|
||||
local item = nextItemWidget:getItem()
|
||||
local pos = item:getPosition()
|
||||
pos.z = pos.z - 1
|
||||
item:setPosition(pos)
|
||||
function Containers.init()
|
||||
importStyle 'container.otui'
|
||||
|
||||
itemWidget:setItem(item)
|
||||
nextItemWidget:setItem(nil)
|
||||
end
|
||||
connect(Container, { onOpen = onContainerOpen,
|
||||
onClose = onContainerClose,
|
||||
onAddItem = onContainerAddItem,
|
||||
onUpdateItem = onContainerUpdateItem,
|
||||
onRemoveItem = onContainerRemoveItem })
|
||||
end
|
||||
|
||||
container.itemCount = container.itemCount - 1
|
||||
function Containers.terminate()
|
||||
disconnect(Container, { onOpen = onContainerOpen,
|
||||
onClose = onContainerClose,
|
||||
onAddItem = onContainerAddItem,
|
||||
onUpdateItem = onContainerUpdateItem,
|
||||
onRemoveItem = onContainerRemoveItem })
|
||||
end
|
||||
|
||||
connect(g_game, { onGameStart = Containers.clean,
|
||||
onGameEnd = Containers.clean,
|
||||
onOpenContainer = Containers.onOpenContainer,
|
||||
onCloseContainer = Containers.onCloseContainer,
|
||||
onContainerAddItem = Containers.onContainerAddItem,
|
||||
onContainerUpdateItem = Containers.onContainerUpdateItem,
|
||||
onContainerRemoveItem = Containers.onContainerRemoveItem })
|
||||
function Containers.clean()
|
||||
|
||||
end
|
||||
|
Loading…
Reference in new issue