131 lines
3.6 KiB
Lua
131 lines
3.6 KiB
Lua
local smartfs = smart_inventory.smartfs
|
|
local maininv = smart_inventory.maininv
|
|
local modpath = smart_inventory.modpath
|
|
|
|
-- smartfs callback
|
|
local inventory_form = smartfs.create("smart_inventory:main", function(state)
|
|
|
|
-- enhanced object to the main inventory functions
|
|
state.param.invobj = maininv.get(state.location.player)
|
|
-- tabbed view controller
|
|
local tab_controller = {
|
|
_tabs = {},
|
|
active_name = nil,
|
|
set_active = function(self, tabname)
|
|
for name, def in pairs(self._tabs) do
|
|
if name == tabname then
|
|
def.button:setBackground("halo.png")
|
|
def.view:setVisible(true)
|
|
else
|
|
def.button:setBackground(nil)
|
|
def.view:setVisible(false)
|
|
end
|
|
end
|
|
self.active_name = tabname
|
|
end,
|
|
tab_add = function(self, name, def)
|
|
def.viewstate:size(20,10) --size of tab view
|
|
self._tabs[name] = def
|
|
end,
|
|
get_active_name = function(self)
|
|
return self.active_name
|
|
end,
|
|
}
|
|
|
|
--set screen size
|
|
state:size(20,12)
|
|
state:label(1,0.2,"header","Smart Inventory")
|
|
state:image(0,0,1,1,"header_logo", "logo.png")
|
|
state:image_button(19,0,1,1,"exit", "","smart_inventory_exit_button.png", true):setTooltip("Close the inventory")
|
|
local button_x = 0.1
|
|
table.sort(smart_inventory.registered_pages, function(a,b)
|
|
if not a.sequence then
|
|
return false
|
|
elseif not b.sequence then
|
|
return true
|
|
elseif a.sequence > b.sequence then
|
|
return false
|
|
else
|
|
return true
|
|
end
|
|
end)
|
|
for _, def in ipairs(smart_inventory.registered_pages) do
|
|
assert(def.smartfs_callback, "Callback function needed")
|
|
assert(def.name, "Name is needed")
|
|
local tabdef = {}
|
|
local label
|
|
if not def.label then
|
|
label = ""
|
|
else
|
|
label = def.label
|
|
end
|
|
tabdef.button = state:button(button_x,11.2,1,1,def.name.."_button",label)
|
|
if def.icon then
|
|
tabdef.button:setImage(def.icon)
|
|
end
|
|
tabdef.button:setTooltip(def.tooltip)
|
|
tabdef.button:onClick(function(self)
|
|
tab_controller:set_active(def.name)
|
|
if def.on_button_click then
|
|
def.on_button_click(tabdef.viewstate)
|
|
end
|
|
end)
|
|
tabdef.view = state:container(0,1,def.name.."_container")
|
|
tabdef.viewstate = tabdef.view:getContainerState()
|
|
def.smartfs_callback(tabdef.viewstate)
|
|
tab_controller:tab_add(def.name, tabdef)
|
|
button_x = button_x + 1
|
|
end
|
|
tab_controller:set_active(smart_inventory.registered_pages[1].name)
|
|
end)
|
|
|
|
if minetest.settings:get_bool("smart_inventory_workbench_mode") then
|
|
dofile(modpath.."/workbench.lua")
|
|
smart_inventory.get_player_state = function(playername)
|
|
-- check the inventory is shown
|
|
local state = smartfs.opened[playername]
|
|
if state and (not state.obsolete) and
|
|
state.location.type == "player" and
|
|
state.def.name == "smart_inventory:main" then
|
|
return state
|
|
end
|
|
end
|
|
else
|
|
smartfs.set_player_inventory(inventory_form)
|
|
smart_inventory.get_player_state = function(playername)
|
|
return smartfs.inv[playername]
|
|
end
|
|
end
|
|
|
|
-- pages list
|
|
smart_inventory.registered_pages = {}
|
|
|
|
-- add new page
|
|
function smart_inventory.register_page(def)
|
|
table.insert(smart_inventory.registered_pages, def)
|
|
end
|
|
|
|
-- smart_inventory.get_player_state(playername) defined above
|
|
|
|
-- get state of active page
|
|
function smart_inventory.get_page_state(pagename, playername)
|
|
local rootstate = smart_inventory.get_player_state(playername)
|
|
if not rootstate then
|
|
return
|
|
end
|
|
local view = rootstate:get(pagename.."_container")
|
|
if not view then
|
|
return
|
|
end
|
|
return view:getContainerState()
|
|
end
|
|
|
|
-- get definition of registered page
|
|
function smart_inventory.get_registered_page(pagename)
|
|
for _, registred_page in ipairs(smart_inventory.registered_pages) do
|
|
if registred_page.name == pagename then
|
|
return registred_page
|
|
end
|
|
end
|
|
end
|