Fix pages, implement filters (partially...)

master
Wuzzy 2018-05-14 16:44:13 +02:00
parent 7f70bd567c
commit ad9f6c7ec3
1 changed files with 56 additions and 23 deletions

View File

@ -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)