creative: Add missing tooltips.
[oweals/minetest_game.git] / mods / creative / inventory.lua
1 local player_inventory = {}
2 local inventory_cache = {}
3
4 local function init_creative_cache(items)
5         inventory_cache[items] = {}
6         local i_cache = inventory_cache[items]
7
8         for name, def in pairs(items) do
9                 if def.groups.not_in_creative_inventory ~= 1 and
10                                 def.description and def.description ~= "" then
11                         i_cache[name] = def
12                 end
13         end
14         table.sort(i_cache)
15         return i_cache
16 end
17
18 function creative.init_creative_inventory(player)
19         local player_name = player:get_player_name()
20         player_inventory[player_name] = {
21                 size = 0,
22                 filter = "",
23                 start_i = 0
24         }
25
26         minetest.create_detached_inventory("creative_" .. player_name, {
27                 allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2)
28                         local name = player2 and player2:get_player_name() or ""
29                         if not creative.is_enabled_for(name) or
30                                         to_list == "main" then
31                                 return 0
32                         end
33                         return count
34                 end,
35                 allow_put = function(inv, listname, index, stack, player2)
36                         return 0
37                 end,
38                 allow_take = function(inv, listname, index, stack, player2)
39                         local name = player2 and player2:get_player_name() or ""
40                         if not creative.is_enabled_for(name) then
41                                 return 0
42                         end
43                         return -1
44                 end,
45                 on_move = function(inv, from_list, from_index, to_list, to_index, count, player2)
46                 end,
47                 on_take = function(inv, listname, index, stack, player2)
48                         if stack and stack:get_count() > 0 then
49                                 minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory")
50                         end
51                 end,
52         }, player_name)
53
54         return player_inventory[player_name]
55 end
56
57 function creative.update_creative_inventory(player_name, tab_content)
58         local creative_list = {}
59         local inv = player_inventory[player_name] or
60                         creative.init_creative_inventory(minetest.get_player_by_name(player_name))
61         local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name})
62
63         local items = inventory_cache[tab_content] or init_creative_cache(tab_content)
64
65         for name, def in pairs(items) do
66                 if def.name:find(inv.filter, 1, true) or
67                                 def.description:lower():find(inv.filter, 1, true) then
68                         creative_list[#creative_list+1] = name
69                 end
70         end
71
72         table.sort(creative_list)
73         player_inv:set_size("main", #creative_list)
74         player_inv:set_list("main", creative_list)
75         inv.size = #creative_list
76 end
77
78 -- Create the trash field
79 local trash = minetest.create_detached_inventory("creative_trash", {
80         -- Allow the stack to be placed and remove it in on_put()
81         -- This allows the creative inventory to restore the stack
82         allow_put = function(inv, listname, index, stack, player)
83                 return stack:get_count()
84         end,
85         on_put = function(inv, listname)
86                 inv:set_list(listname, {})
87         end,
88 })
89 trash:set_size("main", 1)
90
91 creative.formspec_add = ""
92
93 function creative.register_tab(name, title, items)
94         sfinv.register_page("creative:" .. name, {
95                 title = title,
96                 is_in_nav = function(self, player, context)
97                         return creative.is_enabled_for(player:get_player_name())
98                 end,
99                 get = function(self, player, context)
100                         local player_name = player:get_player_name()
101                         creative.update_creative_inventory(player_name, items)
102                         local inv = player_inventory[player_name]
103                         local start_i = inv.start_i or 0
104                         local pagenum = math.floor(start_i / (3*8) + 1)
105                         local pagemax = math.ceil(inv.size / (3*8))
106                         return sfinv.make_formspec(player, context,
107                                 "label[6.2,3.35;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" ..
108                                 [[
109                                         image[4.06,3.4;0.8,0.8;creative_trash_icon.png]
110                                         listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
111                                         list[current_player;main;0,4.7;8,1;]
112                                         list[current_player;main;0,5.85;8,3;8]
113                                         list[detached:creative_trash;main;4,3.3;1,1;]
114                                         listring[]
115                                         image_button[5.4,3.25;0.8,0.8;creative_prev_icon.png;creative_prev;]
116                                         image_button[7.2,3.25;0.8,0.8;creative_next_icon.png;creative_next;]
117                                         image_button[2.1,3.25;0.8,0.8;creative_search_icon.png;creative_search;]
118                                         image_button[2.75,3.25;0.8,0.8;creative_clear_icon.png;creative_clear;]
119                                         tooltip[creative_search;Search]
120                                         tooltip[creative_clear;Reset]
121                                         tooltip[creative_prev;Previous page]
122                                         tooltip[creative_next;Next page]
123                                         listring[current_player;main]
124                                         field_close_on_enter[creative_filter;false]
125                                 ]] ..
126                                 "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" ..
127                                 "listring[detached:creative_" .. player_name .. ";main]" ..
128                                 "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" ..
129                                 default.get_hotbar_bg(0,4.7) ..
130                                 default.gui_bg .. default.gui_bg_img .. default.gui_slots
131                                 .. creative.formspec_add, false)
132                 end,
133                 on_enter = function(self, player, context)
134                         local player_name = player:get_player_name()
135                         local inv = player_inventory[player_name]
136                         if inv then
137                                 inv.start_i = 0
138                         end
139                 end,
140                 on_player_receive_fields = function(self, player, context, fields)
141                         local player_name = player:get_player_name()
142                         local inv = player_inventory[player_name]
143                         assert(inv)
144
145                         if fields.creative_clear then
146                                 inv.start_i = 0
147                                 inv.filter = ""
148                                 creative.update_creative_inventory(player_name, items)
149                                 sfinv.set_player_inventory_formspec(player, context)
150                         elseif fields.creative_search or
151                                         fields.key_enter_field == "creative_filter" then
152                                 inv.start_i = 0
153                                 inv.filter = fields.creative_filter:lower()
154                                 creative.update_creative_inventory(player_name, items)
155                                 sfinv.set_player_inventory_formspec(player, context)
156                         elseif not fields.quit then
157                                 local start_i = inv.start_i or 0
158
159                                 if fields.creative_prev then
160                                         start_i = start_i - 3*8
161                                         if start_i < 0 then
162                                                 start_i = inv.size - (inv.size % (3*8))
163                                                 if inv.size == start_i then
164                                                         start_i = math.max(0, inv.size - (3*8))
165                                                 end
166                                         end
167                                 elseif fields.creative_next then
168                                         start_i = start_i + 3*8
169                                         if start_i >= inv.size then
170                                                 start_i = 0
171                                         end
172                                 end
173
174                                 inv.start_i = start_i
175                                 sfinv.set_player_inventory_formspec(player, context)
176                         end
177                 end
178         })
179 end
180
181 creative.register_tab("all", "All", minetest.registered_items)
182 creative.register_tab("nodes", "Nodes", minetest.registered_nodes)
183 creative.register_tab("tools", "Tools", minetest.registered_tools)
184 creative.register_tab("craftitems", "Items", minetest.registered_craftitems)
185
186 local old_homepage_name = sfinv.get_homepage_name
187 function sfinv.get_homepage_name(player)
188         if creative.is_enabled_for(player:get_player_name()) then
189                 return "creative:all"
190         else
191                 return old_homepage_name(player)
192         end
193 end