Skip to content

Instantly share code, notes, and snippets.

@rubenwardy
Created December 31, 2016 00:22
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save rubenwardy/c5cc1c89b5f83115b13be5cee49a3ad3 to your computer and use it in GitHub Desktop.
diff --git a/init.lua b/init.lua
index 7ef5ec4..1948dc7 100644
--- a/init.lua
+++ b/init.lua
@@ -40,106 +40,190 @@ local index_to_button_name = function(index, player)
return nil
end
-local MAX_ROWS = 9
-local MAX_COLS = 2
-local MAX_BUTTONS = MAX_ROWS * MAX_COLS
-
-sfinv.register_page("sfinv_buttons:buttons", {
- title = S("More"),
- is_in_nav = function(self, player, context)
- -- Tab is shown only if at least 1 button is visible to player
- for _, def in pairs(buttons) do
- if def.show == nil or def.show(player) == true then
- return true
+local function on_player_receive_fields(player, fields)
+ local player_name = player:get_player_name()
+ -- TODO: Test support case when some buttons are hidden for player
+ if fields.sfinv_buttons_action then
+ local button = buttons[player_selections[player_name]]
+ if button ~= nil and button.action ~= nil then
+ button.action(player)
+ end
+ elseif fields.sfinv_buttons_textlist then
+ local explode = minetest.explode_textlist_event(fields.sfinv_buttons_textlist)
+ if explode.type == "CHG" then
+ player_indexes[player_name] = explode.index
+ player_selections[player_name] = index_to_button_name(explode.index, player)
+ elseif explode.type == "DCL" then
+ local button = buttons[button_names_sorted[explode.index]]
+ if button ~= nil and button.action ~= nil then
+ button.action(player)
end
end
- return false
- end,
- get = function(self, player, context)
- local f = ""
- local y = 0
- local x = 0
- local w
- if buttons_num > MAX_ROWS then
- w = 3
- else
- w = 7
+ else
+ for widget_name, _ in pairs(fields) do
+ local id = string.sub(widget_name, string.len(button_prefix) + 1, -1)
+ if buttons[id] ~= nil and buttons[id].action ~= nil then
+ buttons[id].action(player)
+ end
end
- if buttons_num > MAX_BUTTONS then
- f = f .. "textlist[0,0;7.8,8;sfinv_buttons_textlist;"
+ end
+end
+
+local should_register_separate_page = not minetest.settings_getbool("sfinv_buttons_use_icon_bar")
+
+if should_register_separate_page then
+ local MAX_ROWS = 9
+ local MAX_COLS = 2
+ local MAX_BUTTONS = MAX_ROWS * MAX_COLS
+ sfinv.register_page("sfinv_buttons:buttons", {
+ title = S("More"),
+ is_in_nav = function(self, player, context)
+ -- Tab is shown only if at least 1 button is visible to player
+ for _, def in pairs(buttons) do
+ if def.show == nil or def.show(player) == true then
+ return true
+ end
+ end
+ return false
+ end,
+ get = function(self, player, context)
+ local f = ""
+ local y = 0
+ local x = 0
+ local w
+ if buttons_num > MAX_ROWS then
+ w = 3
+ else
+ w = 7
+ end
+ if buttons_num > MAX_BUTTONS then
+ f = f .. "textlist[0,0;7.8,8;sfinv_buttons_textlist;"
+ end
+ local buttons_added = 0
+ for i=1, #button_names_sorted do
+ local name = button_names_sorted[i]
+ local def = buttons[name]
+ if def.show == nil or def.show(player) == true then
+ if buttons_num > MAX_BUTTONS then
+ if buttons_added >= 1 then
+ f = f .. ","
+ end
+ f = f .. minetest.formspec_escape(def.title)
+ else
+ if def.image ~= nil then
+ f = f .. "image["..(x+0.1)..","..(y+0.1)..";0.8,0.8;"..def.image.."]"
+ end
+ local button_id = minetest.formspec_escape(button_prefix .. name)
+ f = f .. "button["..
+ (x+1)..","..y..";"..w..",1;"..
+ button_id..";"..
+ minetest.formspec_escape(def.title)..
+ "]"
+ if def.tooltip ~= nil then
+ f = f .. "tooltip["..button_id..";"..
+ minetest.formspec_escape(def.tooltip).."]"
+ end
+ y = y + 1
+ if y >= MAX_ROWS then
+ y = 0
+ x = x + 4
+ end
+ end
+ buttons_added = buttons_added + 1
+ end
+ end
+ if buttons_num > MAX_BUTTONS then
+ local index = player_indexes[player:get_player_name()]
+ if index ~= nil then
+ f = f .. ";" .. index
+ end
+ f = f .. "]"
+ f = f .. "button[0,8;8,1;sfinv_buttons_action;"..minetest.formspec_escape(S("Go")).."]"
+ end
+ return sfinv.make_formspec(player, context, f)
+ end,
+ on_player_receive_fields = function(self, player, context, fields)
+ return on_player_receive_fields(player, fields)
+ end,
+ })
+else
+ local old_make_formspec = sfinv.make_formspec
+ function sfinv.make_formspec(player, context, content, show_inv, size)
+ size = size or "size[8,8.6]"
+
+ local b = "false"
+ local w, h = string.match(size, "%[([%d.]+)%,([%d.]+)%]")
+ if not w or not h then
+ w, h, b = string.match(size, "%[([%d.]+)%,([%d.]+)%;(%s+)%]")
end
+
+ w = w + 1
+ local retval = old_make_formspec(player, context, content, show_inv,
+ "size[" .. w .. "," .. h .. ";" .. b .."]")
+
+
+ assert(w and h)
+ w = tonumber(w)
+ h = tonumber(h)
+ assert(w > 0 and h > 0)
+
+ local x = w - 0.9
+ local y = 0
+
local buttons_added = 0
for i=1, #button_names_sorted do
local name = button_names_sorted[i]
local def = buttons[name]
if def.show == nil or def.show(player) == true then
- if buttons_num > MAX_BUTTONS then
- if buttons_added >= 1 then
- f = f .. ","
- end
- f = f .. minetest.formspec_escape(def.title)
- else
- if def.image ~= nil then
- f = f .. "image["..(x+0.1)..","..(y+0.1)..";0.8,0.8;"..def.image.."]"
- end
- local button_id = minetest.formspec_escape(button_prefix .. name)
- f = f .. "button["..
- (x+1)..","..y..";"..w..",1;"..
- button_id..";"..
- minetest.formspec_escape(def.title)..
- "]"
- if def.tooltip ~= nil then
- f = f .. "tooltip["..button_id..";"..
- minetest.formspec_escape(def.tooltip).."]"
- end
- y = y + 1
- if y >= MAX_ROWS then
- y = 0
- x = x + 4
- end
+ local button_id = minetest.formspec_escape(button_prefix .. name)
+ retval = retval .. table.concat({
+ "image_button[",
+ x, ",", y, ";",
+ 1, ",", 1, ";",
+ def.image, ";",
+ button_id, ";]"}, "")
+
+ local tooltip = def.title
+ if def.tooltip and def.tooltip ~= def.title then
+ tooltip = tooltip or ""
+ tooltip = tooltip .. " " .. def.tooltip
end
- buttons_added = buttons_added + 1
- end
- end
- if buttons_num > MAX_BUTTONS then
- local index = player_indexes[player:get_player_name()]
- if index ~= nil then
- f = f .. ";" .. index
+
+ if tooltip ~= nil then
+ retval = retval .. "tooltip["..button_id..";"..
+ minetest.formspec_escape(tooltip).."]"
+ end
+
+ y = y + 1
end
- f = f .. "]"
- f = f .. "button[0,8;8,1;sfinv_buttons_action;"..minetest.formspec_escape(S("Go")).."]"
end
- return sfinv.make_formspec(player, context, f)
- end,
- on_player_receive_fields = function(self, player, context, fields)
- local player_name = player:get_player_name()
- -- TODO: Test support case when some buttons are hidden for player
- if fields.sfinv_buttons_action then
- local button = buttons[player_selections[player_name]]
- if button ~= nil and button.action ~= nil then
- button.action(player)
- end
- elseif fields.sfinv_buttons_textlist then
- local explode = minetest.explode_textlist_event(fields.sfinv_buttons_textlist)
- if explode.type == "CHG" then
- player_indexes[player_name] = explode.index
- player_selections[player_name] = index_to_button_name(explode.index, player)
- elseif explode.type == "DCL" then
- local button = buttons[button_names_sorted[explode.index]]
- if button ~= nil and button.action ~= nil then
- button.action(player)
- end
+
+ return retval
+ end
+
+ local function override_page(def)
+ local old = def.on_player_receive_fields
+ def.on_player_receive_fields = function(self, player, context, fields)
+ if on_player_receive_fields(player, fields) then
+ return true
end
- else
- for widget_name, _ in pairs(fields) do
- local id = string.sub(widget_name, string.len(button_prefix) + 1, -1)
- if buttons[id] ~= nil and buttons[id].action ~= nil then
- buttons[id].action(player)
- end
+
+ if old then
+ return old(self, player, context, fields)
end
end
- end,
-})
+ end
+
+ for _, def in pairs(sfinv.pages) do
+ override_page(def)
+ end
+
+ local old_sfinv_register_page = sfinv.register_page
+ function sfinv.register_page(name, def)
+ override_page(def)
+ return old_sfinv_register_page(name, def)
+ end
+end
minetest.register_on_joinplayer(function(player)
player_indexes[player:get_player_name()] = nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment