diff --git a/.gitignore b/.gitignore index 5236e1e..f166652 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ *~ - +.idea diff --git a/callbacks.lua b/callbacks.lua index a277737..d1308f0 100644 --- a/callbacks.lua +++ b/callbacks.lua @@ -25,6 +25,7 @@ core.register_on_joinplayer(function(player) unified_inventory.alternate[player_name] = 1 unified_inventory.current_item[player_name] = nil unified_inventory.current_craft_direction[player_name] = "recipe" + unified_inventory.current_craft_type_toggles[player_name] = {} -- values are reversed, false means true (so that nil means true) -- Refill slot local refill = core.create_detached_inventory(player_name.."refill", { @@ -88,6 +89,21 @@ local function receive_fields_searchbox(player, formname, fields) end end +local function craftguide_toggle_recipe_type_visibility(player, field_name) + local player_name = player:get_player_name() + local toggled_recipe_type = field_name:match("craftguide_toggle_recipe_type_visibility_(.*)") + + local toggles = ui.current_craft_type_toggles[player_name] + if toggled_recipe_type == "all" then + local all_state = toggles.all + for recipe_type in pairs(ui.current_visible_craft_type_toggles[player_name]) do + toggles[recipe_type] = not all_state + end + else + toggles[toggled_recipe_type] = not toggles[toggled_recipe_type] + end +end + core.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "" then return @@ -99,6 +115,16 @@ core.register_on_player_receive_fields(function(player, formname, fields) local ui_peruser, _ = unified_inventory.get_per_player_formspec(player_name) + for name in pairs(fields) do + if name:match("craftguide_toggle_recipe_type_visibility_") then + craftguide_toggle_recipe_type_visibility(player, name) + unified_inventory.alternate[player_name] = 1 + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + return + end + end + local clicked_category for _, cat in ipairs(ui.category_list) do if fields["category_" .. cat.name] then @@ -252,6 +278,14 @@ core.register_on_player_receive_fields(function(player, formname, fields) end local crafts = ui.crafts_for[ui.current_craft_direction[ player_name]][selected_item:get_name()] or {} + local toggles = ui.current_craft_type_toggles[player_name] + local filtered_crafts = {} + for _, craft in ipairs(crafts) do + if not toggles[craft.type] then + table.insert(filtered_crafts, craft) + end + end + crafts = filtered_crafts if #crafts <= 1 then return end diff --git a/init.lua b/init.lua index 067bc82..4daaee4 100644 --- a/init.lua +++ b/init.lua @@ -20,6 +20,8 @@ unified_inventory = { current_index = {}, current_item = {}, current_craft_direction = {}, + current_visible_craft_type_toggles = {}, + current_craft_type_toggles = {}, -- values are reversed, so false means true (so that nil means true) registered_craft_types = {}, crafts_for = {usage = {}, recipe = {} }, players = {}, diff --git a/locale/template.pot b/locale/template.pot index 105fd64..38d7234 100644 --- a/locale/template.pot +++ b/locale/template.pot @@ -263,6 +263,10 @@ msgstr "" msgid "All" msgstr "" +#: register.lua +msgid "Show recipe types:" +msgstr "" + #: waypoints.lua msgid "White" msgstr "" diff --git a/locale/template.txt b/locale/template.txt index 4b4926f..c1ccb5b 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -91,3 +91,4 @@ Finish editing= World position= Name= HUD text color= +Show recipe types: diff --git a/register.lua b/register.lua index 63b7011..5517f47 100644 --- a/register.lua +++ b/register.lua @@ -272,12 +272,6 @@ ui.register_page("craftguide", { local dir = ui.current_craft_direction[player_name] local crafts = ui.crafts_for[dir][item_name] - local alternate = ui.alternate[player_name] - local alternates, craft - if crafts and #crafts > 0 then - alternates = #crafts - craft = crafts[alternate] - end local has_give = player_privs.give or ui.is_creative(player_name) local n = #formspec + 1 @@ -298,6 +292,68 @@ ui.register_page("craftguide", { "button[" .. (give_x + 1.6) .. "," .. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" end + if crafts then + local found_recipe_types = {} + for _, craft in ipairs(crafts) do + found_recipe_types[craft.type] = true + end + + ui.current_visible_craft_type_toggles[player_name] = found_recipe_types + + local buttonx = give_x + local buttony = craftguidey + 3.9 + local button_size = 0.5 + local button_spacing = 0.25 + local button_interval = button_size + button_spacing + local allbuttonx = buttonx + local allbutton_width = button_size * 3/2 + buttonx = buttonx + allbutton_width + button_spacing + + formspec[n] = ("label[%f,%f;%s]"):format(allbuttonx + 0.1, buttony - 0.2, F(S("Show recipe types:"))) + n = n + 1 + + local has_any = true + + local toggles = ui.current_craft_type_toggles[player_name] + local type_i = 0 + for recipe_type in pairs(found_recipe_types) do + local inactive = toggles[recipe_type] + if inactive then has_any = false end + local def = ui.registered_craft_types[recipe_type] + formspec[n] = ("style[craftguide_toggle_recipe_type_visibility_%s;bgcolor=#%s;bgimg=%s]") + :format(recipe_type, inactive and "808080" or "ffffff", def.icon) + formspec[n+1] = ("button[%f,%f;%f,%f;craftguide_toggle_recipe_type_visibility_%s;]") + :format(buttonx, buttony, button_size, button_size, recipe_type) + formspec[n+2] = ("tooltip[craftguide_toggle_recipe_type_visibility_%s;%s]") + :format(recipe_type, def.description) + n = n + 3 + type_i = type_i + 1 + buttonx = buttonx + button_interval + end + toggles.all = not has_any + + formspec[n] = ("style[craftguide_toggle_recipe_type_visibility_%s;bgcolor=#%s;textcolor=#%s]") + :format("all", has_any and "3e3e3e" or "000000", has_any and "ffffff" or "808080") + formspec[n+1] = ("button[%f,%f;%f,%f;craftguide_toggle_recipe_type_visibility_%s;%s]") + :format(allbuttonx, buttony, allbutton_width, button_size, "all", F(S("All"))) + n = n + 2 + + local filtered_crafts = {} + for _, craft in ipairs(crafts) do + if not toggles[craft.type] then + table.insert(filtered_crafts, craft) + end + end + crafts = filtered_crafts + end + + local alternate = ui.alternate[player_name] + local alternates, craft + if crafts and #crafts > 0 then + alternates = #crafts + craft = crafts[alternate] + end + if not craft then -- No craft recipes available for this item. formspec[n] = string.format("label[%f,%f;%s]", craftguidex+2.5, craftguidey+1.5, F(no_recipe_text[dir]))