8 function sfinv
.register_page(name
, def
)
9 assert(name
, "Invalid sfinv page. Requires a name")
10 assert(def
, "Invalid sfinv page. Requires a def[inition] table")
11 assert(def
.get
, "Invalid sfinv page. Def requires a get function.")
12 assert(not sfinv
.pages
[name
], "Attempt to register already registered sfinv page " .. dump(name
))
14 sfinv
.pages
[name
] = def
16 table.insert(sfinv
.pages_unordered
, def
)
19 function sfinv
.override_page(name
, def
)
20 assert(name
, "Invalid sfinv page override. Requires a name")
21 assert(def
, "Invalid sfinv page override. Requires a def[inition] table")
22 local page
= sfinv
.pages
[name
]
23 assert(page
, "Attempt to override sfinv page " .. dump(name
) .. " which does not exist.")
24 for key
, value
in pairs(def
) do
29 function sfinv
.get_nav_fs(player
, context
, nav
, current_idx
)
30 -- Only show tabs if there is more than one page
32 return "tabheader[0,0;tabs;" .. table.concat(nav
, ",") .. ";" .. current_idx
.. ";true;false]"
38 local theme_main
= "bgcolor[#080808BB;true]" ..
39 hades_gui
.gui_inventory_bg_img
42 list[current_player;main;0,4.7;8,1;]
43 list[current_player;main;0,5.85;8,3;8]
46 function sfinv
.make_formspec(player
, context
, content
, show_inv
, size
)
48 size
or "size[8,8.6]",
50 sfinv
.get_nav_fs(player
, context
, context
.nav_titles
, context
.nav_idx
),
54 tmp
[#tmp
+ 1] = theme_inv
56 return table.concat(tmp
, "")
59 function sfinv
.get_homepage_name(player
)
60 return "sfinv:crafting"
63 function sfinv
.get_formspec(player
, context
)
64 -- Generate navigation tabs
68 for i
, pdef
in pairs(sfinv
.pages_unordered
) do
69 if not pdef
.is_in_nav
or pdef
:is_in_nav(player
, context
) then
70 nav
[#nav
+ 1] = pdef
.title
71 nav_ids
[#nav_ids
+ 1] = pdef
.name
72 if pdef
.name
== context
.page
then
73 current_idx
= #nav_ids
78 context
.nav_titles
= nav
79 context
.nav_idx
= current_idx
82 local page
= sfinv
.pages
[context
.page
] or sfinv
.pages
["404"]
84 return page
:get(player
, context
)
86 local old_page
= context
.page
87 context
.page
= sfinv
.get_homepage_name(player
)
88 assert(sfinv
.pages
[context
.page
], "[sfinv] Invalid homepage")
89 minetest
.log("warning", "[sfinv] Couldn't find " .. dump(old_page
) .. " so using switching to homepage")
90 return sfinv
.get_formspec(player
, context
)
94 function sfinv
.get_or_create_context(player
)
95 local name
= player
:get_player_name()
96 local context
= sfinv
.contexts
[name
]
99 page
= sfinv
.get_homepage_name(player
)
101 sfinv
.contexts
[name
] = context
106 function sfinv
.set_context(player
, context
)
107 sfinv
.contexts
[player
:get_player_name()] = context
110 function sfinv
.set_player_inventory_formspec(player
, context
)
111 local fs
= sfinv
.get_formspec(player
,
112 context
or sfinv
.get_or_create_context(player
))
113 player
:set_inventory_formspec(fs
)
116 function sfinv
.set_page(player
, pagename
)
117 local context
= sfinv
.get_or_create_context(player
)
118 local oldpage
= sfinv
.pages
[context
.page
]
119 if oldpage
and oldpage
.on_leave
then
120 oldpage
:on_leave(player
, context
)
122 context
.page
= pagename
123 local page
= sfinv
.pages
[pagename
]
124 if page
.on_enter
then
125 page
:on_enter(player
, context
)
127 sfinv
.set_player_inventory_formspec(player
, context
)
130 minetest
.register_on_joinplayer(function(player
)
131 if sfinv
.enabled
then
132 sfinv
.set_player_inventory_formspec(player
)
136 minetest
.register_on_leaveplayer(function(player
)
137 sfinv
.contexts
[player
:get_player_name()] = nil
140 minetest
.register_on_player_receive_fields(function(player
, formname
, fields
)
141 if formname
~= "" or not sfinv
.enabled
then
146 local name
= player
:get_player_name()
147 local context
= sfinv
.contexts
[name
]
149 sfinv
.set_player_inventory_formspec(player
)
153 -- Was a tab selected?
154 if fields
.tabs
and context
.nav
then
155 local tid
= tonumber(fields
.tabs
)
156 if tid
and tid
> 0 then
157 local id
= context
.nav
[tid
]
158 local page
= sfinv
.pages
[id
]
160 sfinv
.set_page(player
, id
)
164 -- Pass event to page
165 local page
= sfinv
.pages
[context
.page
]
166 if page
and page
.on_player_receive_fields
then
167 return page
:on_player_receive_fields(player
, context
, fields
)