a-planet-alive/mods/gui/smart_inventory/pages/creative.lua

311 lines
12 KiB
Lua

local cache = smart_inventory.cache
local ui_tools = smart_inventory.ui_tools
-----------------------------------------------------
-- Update on group selection change
-----------------------------------------------------
local function update_group_selection(state, changed_group)
local grouped = state.param.creative_grouped_items
local groups_sel1 = state:get("groups_sel1")
local groups_sel2 = state:get("groups_sel2")
local groups_sel3 = state:get("groups_sel3")
local grid = state:get("buttons_grid")
local outlist
if state.param.creative_grouped_shape_items and
next(state.param.creative_grouped_shape_items) then
local group_info = {}
group_info.name = "shape"
group_info.cgroup = cache.cgroups["shape"]
group_info.group_desc = "#01DF74> "..group_info.cgroup.group_desc
group_info.items = state.param.creative_grouped_shape_items
grouped["shape"] = group_info
end
-- update group 1
if changed_group < 1 or not state.param.creative_group_list1 then
state.param.creative_group_list1 = ui_tools.update_group_selection(grouped, groups_sel1, state.param.creative_group_list1)
end
local sel_id = groups_sel1:getSelected()
if state.param.creative_group_list1[sel_id] == "all"
or not state.param.creative_group_list1[sel_id]
or not grouped[state.param.creative_group_list1[sel_id]] then
outlist = grouped["all"].items
groups_sel2:clearItems()
groups_sel3:clearItems()
else
-- update group 2
grouped = ui_tools.get_list_grouped(grouped[state.param.creative_group_list1[sel_id]].items)
if changed_group < 2 or not state.param.creative_group_list2 then
state.param.creative_group_list2 = ui_tools.update_group_selection(grouped, groups_sel2, state.param.creative_group_list2)
end
sel_id = groups_sel2:getSelected()
if state.param.creative_group_list2[sel_id] == "all"
or not state.param.creative_group_list2[sel_id]
or not grouped[state.param.creative_group_list2[sel_id]] then
outlist = grouped["all"].items
groups_sel3:clearItems()
else
-- update group 3
grouped = ui_tools.get_list_grouped(grouped[state.param.creative_group_list2[sel_id]].items)
if changed_group < 3 or not state.param.creative_group_list3 then
state.param.creative_group_list3 = ui_tools.update_group_selection(grouped, groups_sel3, state.param.creative_group_list3)
end
sel_id = groups_sel3:getSelected()
outlist = grouped[state.param.creative_group_list3[sel_id]].items
end
end
-- update grid list
if outlist then
table.sort(outlist, function(a,b)
return a.sort_value < b.sort_value
end)
grid:setList(outlist)
state.param.creative_outlist = outlist
else
grid:setList({})
end
end
-----------------------------------------------------
-- Page layout definition
-----------------------------------------------------
local function creative_callback(state)
local player = state.location.rootState.location.player
-- build up UI controller
local ui_controller = {}
ui_controller.state = state
state.param.creative_ui_controller = ui_controller
ui_controller.player = minetest.get_player_by_name(state.location.rootState.location.player)
function ui_controller:set_ui_variant(new_ui)
-- check if change needed
if new_ui == self.ui_toggle then
return
end
-- toggle show/hide elements
if new_ui == 'list_small' then
self.ui_toggle = new_ui
self.state:get("groups_sel1"):setSize(5.6, 3)
self.state:get("groups_sel2"):setVisible(true)
self.state:get("groups_sel3"):setVisible(true)
self.state:get("buttons_grid"):reset(9.55, 3.75, 9.0 , 6.5)
self.state:get("buttons_grid_bg"):setPosition(9.2, 3.5)
self.state:get("buttons_grid_bg"):setSize(9.5, 6.5)
self.state:get("btn_tog"):setId(1)
elseif new_ui == 'list_big' then
self.ui_toggle = new_ui
self.state:get("groups_sel1"):setSize(7.8, 3)
self.state:get("groups_sel2"):setVisible(false)
self.state:get("groups_sel3"):setVisible(false)
self.state:get("buttons_grid"):reset(9.55, 0.25, 9.0 , 10)
self.state:get("buttons_grid_bg"):setPosition(9.2, 0)
self.state:get("buttons_grid_bg"):setSize(9.5, 10)
self.state:get("btn_tog"):setId(2)
end
self:save()
end
function ui_controller:save()
local savedata = minetest.deserialize(self.player:get_attribute("smart_inventory_settings")) or {}
savedata.creative_ui_toggle = self.ui_toggle
self.player:set_attribute("smart_inventory_settings", minetest.serialize(savedata))
end
function ui_controller:restore()
local savedata = minetest.deserialize(self.player:get_attribute("smart_inventory_settings")) or {}
if savedata.creative_ui_toggle then
ui_controller:set_ui_variant(savedata.creative_ui_toggle)
end
end
-- groups 1-3
local group_sel1 = state:listbox(1, 0.15, 5.6, 3, "groups_sel1",nil, false)
group_sel1:onClick(function(self, state, player)
local selected = self:getSelectedItem()
if selected then
state:get("groups_sel2"):setSelected(1)
state:get("groups_sel3"):setSelected(1)
update_group_selection(state, 1)
end
end)
local group_sel2 = state:listbox(7, 0.15, 5.6, 3, "groups_sel2",nil, false)
group_sel2:onClick(function(self, state, player)
local selected = self:getSelectedItem()
if selected then
state:get("groups_sel3"):setSelected(1)
update_group_selection(state, 2)
end
end)
local group_sel3 = state:listbox(13, 0.15, 5.6, 3, "groups_sel3",nil, false)
group_sel3:onClick(function(self, state, player)
local selected = self:getSelectedItem()
if selected then
update_group_selection(state, 3)
end
end)
-- functions
local searchfield = state:field(1.3, 4.1, 4.2, 0.5, "search")
searchfield:setCloseOnEnter(false)
searchfield:onKeyEnter(function(self, state, player)
local search_string = self:getText()
local lang_code = state.location.rootState.lang_code
local filtered_list = ui_tools.filter_by_searchstring(ui_tools.root_list, search_string, lang_code)
state.param.creative_grouped_items = ui_tools.get_list_grouped(filtered_list)
filtered_list = ui_tools.filter_by_searchstring(ui_tools.root_list_shape, search_string, lang_code)
state.param.creative_grouped_shape_items = filtered_list
update_group_selection(state, 0)
end)
local search_button = state:button(5.0, 3.8, 1, 0.5, "search_btn", "Go")
search_button:setTooltip("Perform search action")
search_button:onClick(function(self, state, player)
state:get("search"):submit_key_enter("", player)
end)
-- action mode toggle
state:toggle(6, 3.8,1.5,0.5, "btn_tog_mode", {"Give 1", "Give stack"})
-- groups toggle
local btn_toggle = state:toggle(7.5, 3.8,1.5,0.5, "btn_tog", {"Groups", "Hide"})
btn_toggle:onToggle(function(self, state, player)
local id = self:getId()
if id == 1 then
state.param.creative_ui_controller:set_ui_variant("list_small")
elseif id == 2 then
state.param.creative_ui_controller:set_ui_variant("list_big")
end
end)
-- craftable items grid
state:background(9.2, 3.5, 9.5, 6.5, "buttons_grid_bg", "minimap_overlay_square.png")
local grid = smart_inventory.smartfs_elements.buttons_grid(state, 9.55, 3.75, 9.0 , 6.5, "buttons_grid", 0.75,0.75)
grid:onClick(function(self, state, index, player)
local mode = state:get("btn_tog_mode"):getId() or 1
local selected = ItemStack(state.param.creative_outlist[index].item)
if mode == 1 then -- give 1 item
state.param.invobj:add_item(selected)
elseif mode == 2 then --give full stack
selected:set_count(selected:get_stack_max())
state.param.invobj:add_sepearate_stack(selected)
end
end)
-- inventory
state:inventory(1, 5, 8, 4,"main")
ui_tools.create_trash_inv(state, player)
state:image(8,9,1,1,"trash_icon","smart_inventory_trash.png")
state:element("code", {name = "trash_bg_code", code = "listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"})
state:inventory(8,9,1,1, "trash"):useDetached(player.."_trash_inv")
-- swap slots buttons
state:image_button(0, 6, 1, 1, "swap1", "", "smart_inventory_swapline_button.png"):onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "swap1")
state.param.invobj:swap_row_to_top(2)
end)
state:image_button(0, 7, 1, 1, "swap2", "", "smart_inventory_swapline_button.png"):onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "swap2")
state.param.invobj:swap_row_to_top(3)
end)
state:image_button(0, 8, 1, 1, "swap3", "", "smart_inventory_swapline_button.png"):onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "swap3")
state.param.invobj:swap_row_to_top(4)
end)
-- trash button
local trash_all = state:image_button(7,9,1,1, "trash_all", "", "smart_inventory_trash_all_button.png")
trash_all:setTooltip("Trash all inventory content")
trash_all:onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "trash_all")
state.param.invobj:remove_all()
end)
-- save/restore buttons
local btn_save1 = state:image_button(1,9,1,1, "save1", "", "smart_inventory_save1_button.png")
btn_save1:setTooltip("Save inventory content to slot 1")
btn_save1:onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "save1")
state.param.invobj:save_to_slot(1)
end)
local btn_save2 = state:image_button(1.9,9,1,1, "save2", "", "smart_inventory_save2_button.png")
btn_save2:setTooltip("Save inventory content to slot 2")
btn_save2:onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "save2")
state.param.invobj:save_to_slot(2)
end)
local btn_save3 = state:image_button(2.8,9,1,1, "save3", "", "smart_inventory_save3_button.png")
btn_save3:setTooltip("Save inventory content to slot 3")
btn_save3:onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "save3")
state.param.invobj:save_to_slot(3)
end)
local btn_restore1 = state:image_button(4,9,1,1, "restore1", "", "smart_inventory_get1_button.png")
btn_restore1:setTooltip("Restore inventory content from slot 1")
btn_restore1:onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "restore1")
state.param.invobj:restore_from_slot(1)
end)
local btn_restore2 = state:image_button(4.9,9,1,1, "restore2", "", "smart_inventory_get2_button.png")
btn_restore2:setTooltip("Restore inventory content from slot 2")
btn_restore2:onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "restore2")
state.param.invobj:restore_from_slot(2)
end)
local btn_restore3 = state:image_button(5.8,9,1,1, "restore3", "", "smart_inventory_get3_button.png")
btn_restore3:setTooltip("Restore inventory content from slot 3")
btn_restore3:onClick(function(self, state, player)
ui_tools.image_button_feedback(player, "creative", "restore3")
state.param.invobj:restore_from_slot(3)
end)
-- fill with data
state.param.creative_grouped_items = ui_tools.get_list_grouped(ui_tools.root_list)
state.param.creative_grouped_shape_items = ui_tools.root_list_shape
update_group_selection(state, 0)
ui_controller:restore()
end
local function player_has_creative(state)
return state.param.invobj:get_has_creative()
end
-----------------------------------------------------
-- Register page in smart_inventory
-----------------------------------------------------
smart_inventory.register_page({
name = "creative",
tooltip = "The creative way to get items",
icon = "smart_inventory_creative_button.png",
smartfs_callback = creative_callback,
is_visible_func = player_has_creative,
sequence = 15
})
-- Redefinition for sfinv method maybe called from other mods
if minetest.global_exists("sfinv") then
function sfinv.set_player_inventory_formspec(player, context)
local playername = player:get_player_name()
local page_state = smart_inventory.get_page_state("creative", playername)
if page_state then
local state = page_state.location.parentState
local has_creative = player_has_creative(state)
state:get("creative_button"):setVisible(has_creative)
if not has_creative then
state:get("crafting_button"):submit(nil, playername)
end
state:show()
end
end
end