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
  titlebar.add{
    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,
  }
  filler.style.height = 24
  filler.style.horizontally_stretchable = true
  titlebar.add{
    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"},
  }
end
sample-gui.jpg
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

/c
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(defines.events.on_gui_click, function(event)
  if event.element.name == "my-mod-x-button" then
    event.element.parent.parent.destroy()
  end
end)
script.on_event(defines.events.on_gui_closed, function(event)
  if event.element and event.element.valid and event.element.name == "my-mod-gui" then
    event.element.destroy()
  end
end)

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.