Page 1 of 1

LuaGuiElement frame with a close [X] button

Posted: Sat Jun 05, 2021 9:49 am
by DaveMcW
If you set the LuaGuiElement.caption property on a frame, it will create a title bar similar to the ingame one, but without a close button.

If you want to have a close button, you need to skip the caption and build your own title bar. I found a couple examples of how to do this, but they did not match the game. Here is my title bar code that creates an exact match to the ingame title bar.

Code: Select all

function add_titlebar(gui, caption, close_button_name)
  local titlebar = gui.add{type = "flow"}
  titlebar.drag_target = gui
    type = "label",
    style = "frame_title",
    caption = caption,
    ignored_by_interaction = true,
  local filler = titlebar.add{
    type = "empty-widget",
    style = "draggable_space",
    ignored_by_interaction = true,
  } = 24 = true
    type = "sprite-button",
    name = close_button_name,
    style = "frame_action_button",
    sprite = "utility/close_white",
    hovered_sprite = "utility/close_black",
    clicked_sprite = "utility/close_black",
    tooltip = {"gui.close-instruction"},
sample-gui.jpg (25.73 KiB) Viewed 217 times

And here is an example script that calls it. Note that you have to handle a click on the X button yourself.

Code: Select all

gui = game.player.gui.screen.add{type = "frame", name = "my-mod-gui", direction = "vertical"}
gui.auto_center = true
add_titlebar(gui, "Sample GUI", "my-mod-x-button")
gui.add{type = "label", caption = "Click the X button to close this gui."}
game.player.opened = gui
script.on_event(, function(event)
  if == "my-mod-x-button" then
script.on_event(, function(event)
  if event.element and event.element.valid and == "my-mod-gui" then

Re: LuaGuiElement frame with a close [X] button

Posted: Sat Jun 05, 2021 10:29 am
by eradicator
I build my title bars according to Raiguards Style Guide and they look very vanilla-like.