2019-01-15 12:08:56 +01:00
|
|
|
-- Based on "https://gist.githubusercontent.com/rubenwardy/10074b66bd6e409c72c3ad0f79f5771a/raw/47389bbf0dc6badd79362361d0592053add7ceab/init.lua
|
|
|
|
|
|
|
|
local button_prefix = "sfinv_button_"
|
2020-08-27 10:31:20 +02:00
|
|
|
local last_button = 0
|
2019-01-15 12:08:56 +01:00
|
|
|
|
2020-08-27 10:31:20 +02:00
|
|
|
sfinv_buttons = { registered_buttons = {}, MAX_ROWS = 9 }
|
2019-01-15 12:08:56 +01:00
|
|
|
|
|
|
|
sfinv_buttons.register_button = function(name, def)
|
|
|
|
|
2020-08-27 10:31:20 +02:00
|
|
|
def.button_name = button_prefix .. minetest.get_current_modname() .. '_' .. name
|
|
|
|
|
|
|
|
local idx_start = def.position or 1
|
|
|
|
local idx_end = last_button + 1
|
|
|
|
if idx_start > idx_end then
|
|
|
|
sfinv_buttons.registered_buttons[idx_start] = def
|
|
|
|
if idx_start > last_button then
|
|
|
|
last_button = idx_start
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local bubble = def
|
|
|
|
for idx = idx_start, idx_end do
|
|
|
|
local current = sfinv_buttons.registered_buttons[idx]
|
|
|
|
if not current then
|
|
|
|
-- free slot found
|
|
|
|
sfinv_buttons.registered_buttons[idx] = bubble
|
|
|
|
if idx > last_button then
|
|
|
|
last_button = idx
|
|
|
|
end
|
|
|
|
break
|
|
|
|
elseif bubble.position and (not current.position or current.position < bubble.position ) then
|
|
|
|
-- swap bubble
|
|
|
|
sfinv_buttons.registered_buttons[idx] = bubble
|
|
|
|
bubble = current
|
2019-01-15 12:08:56 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
smart_sfinv_api.register_enhancement({
|
|
|
|
make_formspec = function(handler, player, context, content, show_inv)
|
2020-08-27 10:31:20 +02:00
|
|
|
if last_button == 0 then -- no buttons
|
|
|
|
return
|
|
|
|
end
|
2019-01-15 12:08:56 +01:00
|
|
|
|
2022-01-12 21:16:20 +01:00
|
|
|
handler.formspec_size_add_w = handler.formspec_size_add_w + math.floor((last_button - 1) / sfinv_buttons.MAX_ROWS) + 1
|
2019-01-15 12:08:56 +01:00
|
|
|
|
|
|
|
local retval = ""
|
|
|
|
|
2020-08-27 10:31:20 +02:00
|
|
|
for idx = 1, last_button do
|
2020-08-27 16:59:14 +02:00
|
|
|
local def = sfinv_buttons.registered_buttons[idx]
|
2020-08-27 10:31:20 +02:00
|
|
|
|
2022-01-12 21:16:20 +01:00
|
|
|
local x = 8.1 + math.floor((idx - 1)/ sfinv_buttons.MAX_ROWS)
|
2020-08-27 10:31:20 +02:00
|
|
|
local y = (idx - 1) % sfinv_buttons.MAX_ROWS
|
|
|
|
|
|
|
|
if def and (def.show == nil or def.show == true or def.show(player, context, content, show_inv) == true) then
|
|
|
|
local button_id = minetest.formspec_escape(def.button_name)
|
2019-01-15 12:08:56 +01:00
|
|
|
retval = retval .. table.concat({
|
|
|
|
"image_button[",
|
|
|
|
x, ",", y, ";",
|
|
|
|
1, ",", 1, ";",
|
|
|
|
def.image, ";",
|
|
|
|
button_id, ";]"}, "")
|
|
|
|
|
2020-08-27 10:31:20 +02:00
|
|
|
local tooltip
|
|
|
|
if def.title then
|
|
|
|
if def.tooltip and def.tooltip ~= def.title then
|
|
|
|
tooltip = def.tooltip .. " " .. def.tooltip
|
|
|
|
else
|
|
|
|
tooltip = def.title
|
|
|
|
end
|
|
|
|
else
|
|
|
|
tooltip = def.tooltip
|
2019-01-15 12:08:56 +01:00
|
|
|
end
|
|
|
|
|
2020-08-27 10:31:20 +02:00
|
|
|
if tooltip then
|
2019-01-15 12:08:56 +01:00
|
|
|
retval = retval .. "tooltip["..button_id..";"..
|
|
|
|
minetest.formspec_escape(tooltip).."]"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
handler.formspec_after_navfs = handler.formspec_after_navfs .. retval
|
|
|
|
end,
|
|
|
|
|
|
|
|
receive_fields = function(handler, player, context, fields)
|
|
|
|
local player_name = player:get_player_name()
|
2020-08-27 10:31:20 +02:00
|
|
|
local button_prefix_len = button_prefix:len()
|
|
|
|
for idx = 1, last_button do
|
2020-08-27 16:59:14 +02:00
|
|
|
local def = sfinv_buttons.registered_buttons[idx]
|
2020-08-27 10:31:20 +02:00
|
|
|
if def and fields[def.button_name] and def.action then
|
2020-08-31 08:25:36 +02:00
|
|
|
def.action(player, context, fields)
|
2020-08-27 10:31:20 +02:00
|
|
|
break
|
2019-01-15 12:08:56 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|