Fix pages, implement filters (partially...)
parent
7f70bd567c
commit
ad9f6c7ec3
79
init.lua
79
init.lua
|
@ -1,32 +1,62 @@
|
|||
select_item = {}
|
||||
local get_items = function()
|
||||
local it = {}
|
||||
for itemstring, itemdef in pairs(minetest.registered_items) do
|
||||
table.insert(it, {itemstring=itemstring, itemdef=itemdef})
|
||||
end
|
||||
return it
|
||||
end
|
||||
|
||||
local check_item = function(itemstring, filter)
|
||||
select_item.predef_filters = {}
|
||||
|
||||
-- Creative Inventory items
|
||||
select_item.predef_filters.creative = function(itemstring)
|
||||
local itemdef = minetest.registered_items[itemstring]
|
||||
if itemstring == "air" or itemstring == "ignore" or itemstring == "unknown" then
|
||||
if itemstring == "air" then
|
||||
return false
|
||||
end
|
||||
if itemdef.description == nil or itemdef.description == "" then
|
||||
return false
|
||||
end
|
||||
if itemdef.groups ~= nil and itemdef.groups.not_in_creative_inventory ~= nil then
|
||||
if minetest.get_item_group(itemstring, "not_in_creative_inventory") == 1 then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
local xsize = 18
|
||||
-- No filtering
|
||||
select_item.predef_filters.all = function()
|
||||
return true
|
||||
end
|
||||
|
||||
local check_item = function(itemstring, filter)
|
||||
local itemdef = minetest.registered_items[itemstring]
|
||||
if itemstring == "" or itemstring == "unknown" or itemstring == "ignore" or itemdef == nil then
|
||||
return
|
||||
end
|
||||
if type(filter) == "function" then
|
||||
if filter(itemstring) == false then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local get_items = function(filter)
|
||||
local it = {}
|
||||
for itemstring, itemdef in pairs(minetest.registered_items) do
|
||||
if check_item(itemstring, filter) then
|
||||
table.insert(it, {itemstring=itemstring, itemdef=itemdef})
|
||||
end
|
||||
end
|
||||
-- Sort alphabetically by itemstring
|
||||
local compare = function(t1, t2)
|
||||
return t1.itemstring < t2.itemstring
|
||||
end
|
||||
table.sort(it, compare)
|
||||
return it
|
||||
end
|
||||
|
||||
local xsize = 12
|
||||
local ysize = 9
|
||||
|
||||
select_item.select_item = function(playername, filter, page)
|
||||
local form = "size["..xsize..","..(ysize+1).."]"
|
||||
local items = get_items()
|
||||
local items = get_items(filter)
|
||||
local x = 0
|
||||
local y = 0.5
|
||||
if page == nil then page = 1 end
|
||||
|
@ -35,23 +65,25 @@ select_item.select_item = function(playername, filter, page)
|
|||
for i=start, #items do
|
||||
local itemstring = items[i].itemstring
|
||||
local itemdef = items[i].itemdef
|
||||
if check_item(itemstring, filter) then
|
||||
local name = "item_"..itemstring
|
||||
form = form .. "item_image_button["..x..","..y..";1,1;"..itemstring..";"..name..";]"
|
||||
local name = "item_"..itemstring
|
||||
form = form .. "item_image_button["..x..","..y..";1,1;"..itemstring..";"..name..";]"
|
||||
if itemdef.description == nil or itemdef.description == "" then
|
||||
form = form .. "tooltip["..name..";"..itemstring.."]"
|
||||
end
|
||||
|
||||
x = x + 1
|
||||
if x >= xsize then
|
||||
x = 0
|
||||
y = y + 1
|
||||
if y >= ysize then
|
||||
break
|
||||
end
|
||||
x = x + 1
|
||||
if x >= xsize then
|
||||
x = 0
|
||||
y = y + 1
|
||||
if y >= ysize then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
local ynav = (ysize + 0.5)
|
||||
form = form .. "button[0,"..ynav..";1,1;previous;<]"
|
||||
form = form .. "button[1,"..ynav..";1,1;next;>]"
|
||||
form = form .. "label[2,"..ynav..";"..minetest.formspec_escape(string.format("Page %d", page)).."]"
|
||||
form = form .. "button_exit["..(xsize-2)..","..ynav..";2,1;cancel;Cancel]"
|
||||
minetest.show_formspec(playername, "select_item:page"..page, form)
|
||||
end
|
||||
|
@ -82,7 +114,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
select_item.select_item(player:get_player_name(), nil, page - 1)
|
||||
elseif fields.next then
|
||||
local items = get_items()
|
||||
local maxpage = (#items / (xsize*ysize))
|
||||
local maxpage = (#items / (xsize*ysize)) + 1
|
||||
if page + 1 < maxpage then
|
||||
select_item.select_item(playername, nil, page + 1)
|
||||
end
|
||||
|
@ -90,3 +122,4 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
end
|
||||
end
|
||||
end)
|
||||
|
||||
|
|
Loading…
Reference in New Issue