summaryrefslogtreecommitdiff
path: root/internal.lua
blob: cbd134f952e4ef2a2916b4700a959ed86902718f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

function unified_inventory.get_formspec(player, page)
	if not player then
		return ""
	end
	local player_name = player:get_player_name()
	unified_inventory.current_page[player_name] = page

	local formspec = "size[14,10]"

	-- Player inventory
	formspec = formspec .. "list[current_player;main;0,4.5;8,4;]"

	-- Background
	formspec = formspec .. "background[-0.19,-0.2;14.38,10.55;ui_form_bg.png]"
	
	-- Current page
	if unified_inventory.pages[page] then
		formspec = unified_inventory.pages[page].get_formspec(player, formspec)
	else
		return "" -- Invalid page name
	end

	-- Main buttons
	for i, def in pairs(unified_inventory.buttons) do
		if def.type == "image" then
			formspec = formspec.."image_button["
					..(0.65 * (i - 1))..",9;0.8,0.8;"
					..minetest.formspec_escape(def.image)..";"
					..minetest.formspec_escape(def.name)..";]"
		end
	end

	-- Controls to flip items pages
	local start_x = 9.2
	formspec = formspec .. "image_button["..(start_x + 0.6 * 0)..",9;.8,.8;ui_skip_backward_icon.png;start_list;]"
	formspec = formspec .. "image_button["..(start_x + 0.6 * 1)..",9;.8,.8;ui_doubleleft_icon.png;rewind3;]"
	formspec = formspec .. "image_button["..(start_x + 0.6 * 2)..",9;.8,.8;ui_left_icon.png;rewind1;]"
	formspec = formspec .. "image_button["..(start_x + 0.6 * 3)..",9;.8,.8;ui_right_icon.png;forward1;]"
	formspec = formspec .. "image_button["..(start_x + 0.6 * 4)..",9;.8,.8;ui_doubleright_icon.png;forward3;]"
	formspec = formspec .. "image_button["..(start_x + 0.6 * 5)..",9;.8,.8;ui_skip_forward_icon.png;end_list;]"

	-- Search box
	formspec = formspec .. "field[9.5,8.325;3,1;searchbox;;]"
	formspec = formspec .. "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]"

	-- Items list
	local list_index = unified_inventory.current_index[player_name]
	local page = math.floor(list_index / (80) + 1)
	local pagemax = math.floor(
		(#unified_inventory.filtered_items_list[player_name] - 1)
			/ (80) + 1)
	local item = {}
	for y = 0, 9 do
	for x = 0, 7 do
		name = unified_inventory.filtered_items_list[player_name][list_index]	
		if minetest.registered_items[name] then
			formspec = formspec.."item_image_button["
					..(8.2 + x * 0.7)..","
					..(1   + y * 0.7)..";.81,.81;"
					..name..";item_button_"
					..name..";]"
			list_index = list_index + 1
		end
	end
	end
	formspec = formspec.."label[8.2,0;Page:]"
	formspec = formspec.."label[9,0;"..page.." of "..pagemax.."]"
	formspec = formspec.."label[8.2,0.4;Filter:]"
	formspec = formspec.."label[9,0.4;"..unified_inventory.activefilter[player_name].."]"
	return formspec
end

function unified_inventory.set_inventory_formspec(player, page)
	if player then
		local formspec = unified_inventory.get_formspec(player, page)
		player:set_inventory_formspec(formspec)
	end
end

--apply filter to the inventory list (create filtered copy of full one)
function unified_inventory.apply_filter(player, filter)
	local player_name = player:get_player_name() 
	local size = 0
	local lfilter = string.lower(filter)
	if lfilter ~= "" then 
		for i=1, lfilter:len() do
			if lfilter:sub(i, i) == '[' then 
				str_temp1 = ""
				break
			end
		end
	end
	unified_inventory.filtered_items_list[player_name]={}
	for name, def in pairs(minetest.registered_items) do
		if (not def.groups.not_in_creative_inventory or
		   def.groups.not_in_creative_inventory == 0)
		   and def.description and def.description ~= "" then
			local lname = string.lower(name)
			local ldesc = string.lower(def.description)
			if string.find(lname, lfilter) or string.find(ldesc, lfilter) then
				table.insert(unified_inventory.filtered_items_list[player_name], name)
				size = size + 1
			end
		end
	
	end
	table.sort(unified_inventory.filtered_items_list[player_name])
	unified_inventory.filtered_items_list_size[player_name] = size
	unified_inventory.current_index[player_name] = 1
	unified_inventory.activefilter[player_name] = filter
	unified_inventory.set_inventory_formspec(player,
			unified_inventory.current_page[player_name])
end

function unified_inventory.items_in_group(groups)
	local items = {}
	for name, item in pairs(minetest.registered_items) do
		for _, group in pairs(groups:split(',')) do
			if item.groups[group] then
				table.insert(items, name)
			end
		end
	end
	return items
end