diff --git a/.luacheckrc b/.luacheckrc index 8388483..c025088 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -9,5 +9,6 @@ read_globals = { "minetest", "sfinv", "vector", + "unified_inventory", table={fields={"copy"}}, } diff --git a/gui_dash.lua b/gui_dash.lua index d455af3..df2593d 100644 --- a/gui_dash.lua +++ b/gui_dash.lua @@ -30,6 +30,8 @@ local function check_perm(player) return minetest.check_player_privs(player:get_player_name(), { teacher = true }) end +local DASHBOARD_HEADER = "formspec_version[3]size[10.5,10.85]" + local function get_formspec(player, context) if not check_perm(player) then return "label[0,0;" .. FS"Access denied" .. "]" @@ -239,8 +241,7 @@ end local function handle_results(player, context, fields) if not check_perm(player) then - sfinv.set_page(player, sfinv.get_homepage_name(player)) - return true + return false end if fields.students then @@ -248,7 +249,6 @@ local function handle_results(player, context, fields) local i = (evt.row or 0) - 1 if evt.type == "CHG" and i >= 1 and i <= #context.students then context.selected_student = context.students[i] - sfinv.set_player_inventory_formspec(player) return true end end @@ -266,7 +266,6 @@ local function handle_results(player, context, fields) i = i + 1 end end - sfinv.set_player_inventory_formspec(player) return true end @@ -275,11 +274,9 @@ local function handle_results(player, context, fields) return true elseif fields.select_group then context.select_toggle = "group" - sfinv.set_player_inventory_formspec(player) return true elseif fields.select_selected then context.select_toggle = "selected" - sfinv.set_player_inventory_formspec(player) return true end @@ -287,22 +284,21 @@ local function handle_results(player, context, fields) local student = minetest.get_player_by_name(context.selected_student) if student then player:set_pos(student:get_pos()) - return true + return false else context.selected_student = nil - sfinv.set_player_inventory_formspec(player) return true end end if fields.new_group then classroom.show_new_group(player) - return true + return false end if fields.edit_group and context.groupname then classroom.show_edit_group(player, context.groupname) - return true + return false end for _, action in pairs(classroom.get_actions()) do @@ -319,7 +315,6 @@ local function handle_results(player, context, fields) end classroom.run_action(action.name, player, selector) - sfinv.set_player_inventory_formspec(player) return true end end @@ -327,42 +322,107 @@ local function handle_results(player, context, fields) end +-- +-- Show formspec +-- +local _contexts = {} +function classroom.show_dashboard_formspec(player) + if not check_perm(player) then + return nil + end + + local name = player:get_player_name() + local context = _contexts[name] or {} + _contexts[name] = context + + minetest.show_formspec(player:get_player_name(), "classroom:dashboard", + DASHBOARD_HEADER .. get_formspec(player, context)) +end +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "classroom:dashboard" or not check_perm(player) then + return false + end + + local context = _contexts[player:get_player_name()] + if not context then + return false + end + + local ret = handle_results(player, context, fields) + if ret then + classroom.show_dashboard_formspec(player) + end + return ret +end) + + -- -- Sfinv -- +if minetest.get_modpath("sfinv") then + sfinv.register_page("classroom:edu", { + title = S"Classroom", + is_in_nav = function(self, player, context) + return check_perm(player) + end, + get = function(self, player, context) + return sfinv.make_formspec(player, context, get_formspec(player, context), + false, DASHBOARD_HEADER) + end, + on_player_receive_fields = function(self, player, context, fields) + local ret = handle_results(player, context, fields) + if ret then + sfinv.set_player_inventory_formspec(player) + end + return ret + end, + }) -sfinv.register_page("classroom:edu", { - title = S"Classroom", - is_in_nav = function(self, player, context) - return check_perm(player) - end, - get = function(self, player, context) - return sfinv.make_formspec(player, context, get_formspec(player, context), - false, "formspec_version[3]size[10.5,10.85]") - end, - on_player_receive_fields = function(self, player, context, fields) - local ret = handle_results(player, context, fields) - if ret then - sfinv.set_player_inventory_formspec(player) + local function on_grant_revoke(grantee, granter, priv) + if priv ~= "teacher" then + return end - return ret + + local player = minetest.get_player_by_name(grantee) + if not player then + return + end + + minetest.after(0, function() + sfinv.set_player_inventory_formspec(player) + end) + end + + minetest.register_on_priv_grant(on_grant_revoke) + minetest.register_on_priv_revoke(on_grant_revoke) +end + + +-- +-- Chatcommand +-- +minetest.register_chatcommand("classroom", { + privs = { teacher = true }, + func = function(name, params) + local player = minetest.get_player_by_name(name) + if not player then + return false, "You must be online to open the GUI" + end + + classroom.show_dashboard_formspec(player) + return true end, }) -local function on_grant_revoke(grantee, granter, priv) - if priv ~= "teacher" then - return - end - local player = minetest.get_player_by_name(grantee) - if not player then - return - end - - minetest.after(0, function() - sfinv.set_player_inventory_formspec(player) - end) +-- +-- Unified Inventory +-- +if minetest.get_modpath("unified_inventory") ~= nil then + unified_inventory.register_button("classroom", { + type = "image", + image = "classroom_icon.png", + tooltip = S("Classroom"), + action = classroom.show_dashboard_formspec, + }) end - -minetest.register_on_priv_grant(on_grant_revoke) -minetest.register_on_priv_revoke(on_grant_revoke) diff --git a/mod.conf b/mod.conf index 6c6591f..5af6084 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,3 @@ name = classroom description = Classroom Manager -depends = sfinv +optional_depends = sfinv, unified_inventory