gui.lua example
local event = require("__flib__.event")
local gui = require("__flib__.gui")
local migration = require("__flib__.migration")
local mod_gui = require("__core__.lualib.mod-gui")
gui.add_templates{
mouse_filter = {type="button", mouse_button_filter={"left"}},
drag_handle = {type="empty-widget", style="flib_titlebar_drag_handle", elem_mods={ignored_by_interaction=true}},
frame_action_button = {template="mouse_filter", style="frame_action_button"}
}
gui.add_handlers{
inventory = {
titlebar_button = {
on_gui_click = function(e)
game.get_player(e.player_index).print("You clicked one of the titlebar buttons!")
end
},
slot_button = {
on_gui_click = function(e)
local _, _, name = string.find(e.element.sprite, "item/(.*)")
game.get_player(e.player_index).print("You clicked the "..name.." slot button!")
end
},
window = {
on_gui_location_changed = function(e)
local location = e.element.location
global.players[e.player_index].gui.location.caption = location.x..", "..location.y
end
}
},
location = {
on_gui_click = function(e)
global.players[e.player_index].gui.inventory.window.force_auto_center()
end
}
}
local function create_guis(player)
local location_elems = gui.build(mod_gui.get_button_flow(player), {
{type="button", style=mod_gui.button_style, caption="0, 0", handlers="location", save_as="label"}
})
local inventory_elems = gui.build(player.gui.screen, {
{type="frame", direction="vertical", handlers="inventory.window", save_as="window", children={
{type="flow", save_as="titlebar.flow", children={
{type="label", style="frame_title", caption="Demo GUI", elem_mods={ignored_by_interaction=true}},
{template="drag_handle"},
{template="frame_action_button", handlers="inventory.titlebar_button"},
{template="frame_action_button", handlers="inventory.titlebar_button"},
{template="frame_action_button", handlers="inventory.titlebar_button"}
}},
{type="frame", style="inside_shallow_frame_with_padding", style_mods={padding=12}, children={
{type="frame", style="slot_button_deep_frame", children={
{type="scroll-pane", style="flib_naked_scroll_pane_no_padding", style_mods={height=200}, children={
{type="table", style="slot_table", style_mods={width=400}, column_count=10, save_as="slot_table"}
}}
}}
}}
}}
})
inventory_elems.titlebar.flow.drag_target = inventory_elems.window
inventory_elems.window.force_auto_center()
gui.update_filters("inventory.slot_button", player.index, {"demo_slot_button"}, "add")
global.players[player.index].gui = {inventory=inventory_elems, location=location_elems.label}
end
local function destroy_guis(player, player_table)
player_table.gui.inventory.window.destroy()
player_table.gui.location.destroy()
player_table.gui = nil
gui.update_filters("inventory", player.index, nil, "remove")
gui.update_filters("location", player.index, nil, "remove")
end
event.on_init(function()
gui.init()
gui.build_lookup_tables()
global.players = {}
for i, player in pairs(game.players) do
global.players[i] = {}
create_guis(player)
end
end)
event.on_load(function()
gui.build_lookup_tables()
end)
event.on_configuration_changed(function(e)
if migration.on_config_changed(e, {}) then
gui.check_filter_validity()
for i, player in pairs(game.players) do
destroy_guis(player, global.players[i])
create_guis(player)
end
end
end)
gui.register_handlers()
event.on_gui_click(function(e)
if not gui.dispatch_handlers(e) then
game.print("custom logic here")
end
end)
event.on_player_created(function(e)
global.players[e.player_index] = {}
local player = game.get_player(e.player_index)
create_guis(player)
end)
event.on_player_removed(function(e)
global.players[e.player_index] = nil
gui.remove_player_filters(e.player_index)
end)
event.on_player_main_inventory_changed(function(e)
local player = game.get_player(e.player_index)
local table = global.players[e.player_index].gui.inventory.slot_table
local children = table.children
local i = 0
for name, count in pairs(player.get_main_inventory().get_contents()) do
i = i + 1
local child = children[i]
if child then
child.sprite = "item/"..name
child.number = count
else
table.add{
type = "sprite-button",
name = "demo_slot_button__"..i,
style = "slot_button",
sprite = "item/"..name,
number = count
}
end
end
for j = i + 1, #children do
children[j].destroy()
end
end)