# ImGui in GTA: San Andreas – interfaces for Lua scripts

> How windowed interfaces in MoonLoader scripts work: what Dear ImGui and mimgui are, what window code looks like, and why a visual editor like ImGUI Editor helps.

- URL: https://pakulichev.com/en/wiki/imgui-for-gta-sa
- Author: Pakulichev (https://pakulichev.com/)
- Language: en
- Updated: 2026-10-15
- Whole site for LLMs: https://pakulichev.com/llms.txt (index), https://pakulichev.com/llms-full.txt (full text)

**Dear ImGui** is a popular immediate-mode GUI library. Unlike classic GUI frameworks, here a window is described by code that runs every frame: "draw a button; if it was clicked, do X". That suits game mods very well, because the interface lives right inside the game loop.

## ImGui in MoonLoader

MoonLoader has Lua bindings for Dear ImGui: `imgui` came first, then **mimgui**, built on LuaJIT FFI. With them SA:MP scripts got real windows with settings, menus, tables, tabs and search.

A simple mimgui window:

```lua
local imgui = require("mimgui")
local show = imgui.new.bool(true)

imgui.OnFrame(function() return show[0] end, function()
  imgui.SetNextWindowSize(imgui.ImVec2(320, 160), imgui.Cond.FirstUseEver)
  imgui.Begin("Pakulichev", show)
  imgui.Text("Hello from ImGui!")
  if imgui.Button("Close") then show[0] = false end
  imgui.End()
end)
```

## Common widgets

| Widget | ImGui function | Used for |
| --- | --- | --- |
| Window | `Begin` / `End` | Any script menu |
| Button | `Button` | Actions, binds |
| Checkbox | `Checkbox` | Toggling features |
| Text input | `InputText` | Nicknames, commands, RP text |
| Tabs | `BeginTabBar` / `BeginTabItem` | Settings sections |
| Child region | `BeginChild` | Lists, scrolling |

## The manual layout problem

Sizes, paddings, positions and styles of every window are tuned by hand. On a large interface that takes a long time. That's why I built [ImGUI Editor](https://pakulichev.com/en/projects/imgui-editor): you assemble the UI with the mouse and get ready code as output.

## Tips

- Keep state (checkboxes, input buffers) outside the render function.
- Put styles and colours into a separate theme function.
- Use `imgui.Cond.FirstUseEver` so users can move the window.
- Don't run heavy logic inside the frame – rendering only.

## FAQ

### What is Dear ImGui?

Dear ImGui is an immediate-mode GUI library for C++ used to build interfaces: windows, buttons, inputs, tabs. It is widely used in games, tools and debug panels.

### What is mimgui?

mimgui is a Dear ImGui binding for MoonLoader built on LuaJIT FFI. It lets a Lua script draw ImGui interfaces on top of GTA: San Andreas.

### Why use a visual ImGui editor?

Laying out windows in code is slow: you restart the script again and again to tune sizes and positions. A visual editor such as ImGUI Editor lets you assemble the interface with the mouse and get ready-to-use Lua code.
