Difference between revisions of "Dear ImGui"

From GiderosMobile
(WIP)
(WIP)
Tag: Replaced
Line 13: Line 13:
  
 
Current Gideros Dear ImGui version: '''1.89.6'''.
 
Current Gideros Dear ImGui version: '''1.89.6'''.
 
  
 
  See full introduction documentation here: https://pixtur.github.io/mkdocs-for-imgui/site/
 
  See full introduction documentation here: https://pixtur.github.io/mkdocs-for-imgui/site/
  
 
  and the full Dear ImGui demo here: https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html
 
  and the full Dear ImGui demo here: https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html
 
 
You can find some Dear ImGui examples implemented in Gideros Studio here: '''[[ImGui_Examples]]'''.
 
  
 
= Dear ImGui =
 
= Dear ImGui =
Line 29: Line 25:
 
Dear ImGui is particularly suited to integration in game engines (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on console platforms where operating system features are non-standard.
 
Dear ImGui is particularly suited to integration in game engines (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on console platforms where operating system features are non-standard.
  
Code example:
+
Code sample (Lua):
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
imgui:text("Hello World!")
 
imgui:text("Hello World!")
Line 67: Line 63:
 
  * We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them.
 
  * We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them.
  
== Labels and the ID Stack ==
+
----
Dear ImGui internally need to uniquely identify UI elements. Elements that are typically not clickable (such as calls to the Text functions) don't need an ID. Interactive widgets (such as calls to Button buttons) need a unique ID. Unique ID are used internally to track active widgets and occasionally associate state to widgets. Unique ID are implicitly built from the hash of multiple elements that identify the "path" to the UI element.
+
*'''[[Dear ImGui FAQ]]'''
 
+
*'''[[Dear ImGui API]]'''
Unique ID are often derived from a string label and at minimum scoped within their host window:
+
*'''[[ImGui_Examples|Dear ImGui Gideros Examples]]'''
<syntaxhighlight lang="lua">
 
Begin("MyWindow");
 
Button("OK");          // Label = "OK",    ID = hash of ("MyWindow", "OK")
 
Button("Cancel");      // Label = "Cancel", ID = hash of ("MyWindow", "Cancel")
 
End();
 
</syntaxhighlight>
 
 
 
Other elements such as tree nodes, etc. also pushes to the ID stack:
 
<syntaxhighlight lang="lua">
 
Begin("MyWindow");
 
if (TreeNode("MyTreeNode"))
 
{
 
    Button("OK");      // Label = "OK",    ID = hash of ("MyWindow", "MyTreeNode", "OK")
 
    TreePop();
 
}
 
End();
 
</syntaxhighlight>
 
 
 
Two items labeled "OK" in different windows or different tree locations won't collide:
 
<syntaxhighlight lang="lua">
 
    Begin("MyFirstWindow");
 
    Button("OK");          // Label = "OK",    ID = hash of ("MyFirstWindow", "OK")
 
    End();
 
    Begin("MyOtherWindow");
 
    Button("OK");          // Label = "OK",    ID = hash of ("MyOtherWindow", "OK")
 
    End();
 
</syntaxhighlight>
 
 
 
If you have a same ID twice in the same location, you'll have a conflict:
 
<syntaxhighlight lang="lua">
 
Button("OK");
 
Button("OK");          // ID collision! Interacting with either button will trigger the first one.
 
</syntaxhighlight>
 
 
 
Fear not! this is easy to solve and there are many ways to solve it!
 
 
 
Solving ID conflict in a simple/local context: When passing a label you can optionally specify extra ID information within string itself. Use "##" to pass a complement to the ID that won't be visible to the end-user. This helps solving the simple collision cases when you know e.g. at compilation time which items are going to be created:
 
<syntaxhighlight lang="lua">
 
Begin("MyWindow");
 
Button("Play");        // Label = "Play",  ID = hash of ("MyWindow", "Play")
 
Button("Play##foo1");  // Label = "Play",  ID = hash of ("MyWindow", "Play##foo1")  // Different from above
 
Button("Play##foo2");  // Label = "Play",  ID = hash of ("MyWindow", "Play##foo2")  // Different from above
 
End();
 
</syntaxhighlight>
 
 
 
If you want to completely hide the label, but still need an ID:
 
<syntaxhighlight lang="lua">
 
Checkbox("##On", &b);  // Label = "",      ID = hash of (..., "##On")  // No visible label, just a checkbox!
 
</syntaxhighlight>
 
 
 
Occasionally/rarely you might want change a label while preserving a constant ID. This allows you to animate labels. For example you may want to include varying information in a window title bar, but windows are uniquely identified by their ID. Use "###" to pass a label that isn't part of ID:
 
<syntaxhighlight lang="lua">
 
Button("Hello###ID");  // Label = "Hello",  ID = hash of (..., "###ID")
 
Button("World###ID");  // Label = "World",  ID = hash of (..., "###ID")  // Same as above, even if the label looks different
 
 
 
sprintf(buf, "My game (%f FPS)###MyGame", fps);
 
Begin(buf);            // Variable title,  ID = hash of "MyGame"
 
</syntaxhighlight>
 
 
 
Solving ID conflict in a more general manner: Use PushID() / PopID() to create scopes and manipulate the ID stack, as to avoid ID conflicts within the same window. This is the most convenient way of distinguishing ID when iterating and creating many UI elements programmatically. You can push a pointer, a string or an integer value into the ID stack. Remember that ID are formed from the concatenation of everything pushed into the ID stack. At each level of the stack we store the seed used for items at this level of the ID stack.
 
<syntaxhighlight lang="lua">
 
Begin("Window");
 
for (int i = 0; i < 100; i++)
 
{
 
  PushID(i);          // Push i to the id tack
 
  Button("Click");    // Label = "Click",  ID = hash of ("Window", i, "Click")
 
  PopID();
 
}
 
for (int i = 0; i < 100; i++)
 
{
 
  MyObject* obj = Objects[i];
 
  PushID(obj);
 
  Button("Click");    // Label = "Click",  ID = hash of ("Window", obj pointer, "Click")
 
  PopID();
 
}
 
for (int i = 0; i < 100; i++)
 
{
 
  MyObject* obj = Objects[i];
 
  PushID(obj->Name);
 
  Button("Click");    // Label = "Click",  ID = hash of ("Window", obj->Name, "Click")
 
  PopID();
 
}
 
End();
 
</syntaxhighlight>
 
 
 
You can stack multiple prefixes into the ID stack:
 
<syntaxhighlight lang="lua">
 
Button("Click");      // Label = "Click",  ID = hash of (..., "Click")
 
PushID("node");
 
  Button("Click");    // Label = "Click",  ID = hash of (..., "node", "Click")
 
  PushID(my_ptr);
 
    Button("Click");  // Label = "Click",  ID = hash of (..., "node", my_ptr, "Click")
 
  PopID();
 
PopID();
 
</syntaxhighlight>
 
 
 
Tree nodes implicitly creates a scope for you by calling PushID().
 
<syntaxhighlight lang="lua">
 
Button("Click");      // Label = "Click",  ID = hash of (..., "Click")
 
if (TreeNode("node"))  // <-- this function call will do a PushID() for you (unless instructed not to, with a special flag)
 
{
 
  Button("Click");    // Label = "Click",  ID = hash of (..., "node", "Click")
 
  TreePop();
 
}
 
</syntaxhighlight>
 
 
 
When working with trees, ID are used to preserve the open/close state of each tree node. Depending on your use cases you may want to use strings, indices or pointers as ID. e.g. when following a single pointer that may change over time, using a static string as ID will preserve your node open/closed state when the targeted object change. e.g. when displaying a list of objects, using indices or pointers as ID will preserve the node open/closed state differently. See what makes more sense in your situation!
 
 
 
'''note''': we used "..." above to signify whatever was already pushed to the ID stack previously
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
'''WIP'''
 
 
 
(copied from @'''rrraptor''''s GitHub '''https://github.com/MultiPain/Gideros_ImGui''')
 
 
 
 
 
__TOC__
 
 
 
= Dear ImGui LUA binding for Gideros Mobile =
 
 
 
== Constructor ==
 
<syntaxhighlight lang="lua">
 
-- font_atlas: copy fonts
 
-- mouse_listeners: adds internal mouse event listeners
 
-- keyboard_listeners: adds internal keyboard event listeners
 
-- touch_listeners: adds internal touch event listeners
 
ImGui.new([font_atlas = nil, mouse_listeners = true, keyboard_listeners = true, touch_listeners = false])
 
</syntaxhighlight>
 
 
 
== EXPERIMENTAL ==
 
<syntaxhighlight lang="lua">
 
p_open = ImGui:showLog(title, p_open [, ImGui.WindowFlags = 0]) -- draw log window
 
ImGui:writeLog(text)
 
</syntaxhighlight>
 
 
 
Gestures (touch only, turned OFF by default) ''WIP'':
 
* tap gesture (Left Mouse Button)
 
* hold gesture (Right Mouse Button)
 
<syntaxhighlight lang="lua">
 
ImGui:setTouchGesturesEnabled(bool)
 
bool = ImGui:isTouchGesturesEnabled()
 
</syntaxhighlight>
 
 
 
== FONTS ==
 
<syntaxhighlight lang="lua">
 
IO = imgui:getIO()
 
FontAtlas = IO:getFonts()
 
 
 
Font = FontAtlas:addFont(ttf_font_path, font_size [, options])
 
 
 
-- options (table): all parameters are optional
 
--     fontDataOwnedByAtlas - bool
 
--     pixelSnapH - bool
 
--     mergeMode - bool
 
--     fontNo - number
 
--     oversampleH - number
 
--     oversampleV - number
 
--     glyphExtraSpacingX - number
 
--     glyphExtraSpacingY - number
 
--     glyphOffsetX - number
 
--     glyphOffsetY - number
 
--     glyphMinAdvanceX - number
 
--     glyphMaxAdvanceX - number
 
--     rasterizerFlags - number
 
--     rasterizerMultiply - number
 
--
 
--     glyphs - table:
 
--     text(string): represents available chars
 
--     chars(table): list of specific char code (example: {0x7262, ...})
 
--     ranges(table): predefined glyph ranges (example: {ImGui.GlyphRanges_Default, ImGui.GlyphRanges_Japanese, ...})
 
FontAtlas:addFonts(fontsDescription)
 
-- fontsDescriptions(table):
 
--      description(table):
 
--          ttf_font_path(string): path to a font
 
--          font_size(number): font size
 
--          options(table): see description above
 
-- example:
 
-- FontAtlas:addFonts{ {"fonts/DroidSans.ttf", 16}, {"fonts/ProggyTiny.ttf", 16} }
 
 
 
Font = FontAtlas:getFont([index]) -- get font by index (if index is 0 or nil you will get default font instance)
 
FontAtlas:build() -- call after multiple FontAtlas:addFont(...) calls to update ImGui font atlas
 
FontAtlas:clearInputData()
 
FontAtlas:clearTexData()
 
FontAtlas:clearFonts()
 
FontAtlas:clear()
 
table = FontAtlas:getFonts() -- returns a table with all fonts (included default)
 
flag = FontAtlas:isBuilt()
 
number = FontAtlas:addCustomRectRegular(width, height)
 
number = FontAtlas:addCustomRectFontGlyph(font, id, width, height, advance_x [, offset_x, offset_y])
 
w, h, x, y, glyph_id, offset_x, offset_y, font, is_packed_flag = FontAtlas:getCustomRectByIndex(index)
 
 
 
ImGui:pushFont(font) -- font (table): object returned by FontAtlas:addFont(...) or FontAtlas:getFont([index])
 
ImGui:popFont()
 
</syntaxhighlight>
 
 
 
'''Minimal example''':
 
<syntaxhighlight lang="lua">
 
local UI = ImGui.new()
 
local IO = UI:getIO()
 
local FontAtlas = IO:getFonts()
 
local VDS_font = FontAtlas:addFont("fonts/VDS.ttf", 16, {
 
    oversampleH = 2,
 
    oversampleV = 2,
 
glyphs = {
 
ranges = {ImGui.GlyphRanges_Cyrillic}
 
}
 
})
 
IO:setFontDefault(VDS_font)
 
FontAtlas:build()
 
stage:addChild(UI)
 
 
 
-- you can use multiple fonts at the same time
 
function enterFrame(e)
 
UI:newFrame(e.deltaTime)
 
 
UI:pushFont(font1)
 
UI:text("Font1")
 
UI:popFont()
 
 
UI:pushFont(font2)
 
UI:text("Font2")
 
UI:popFont()
 
 
UI:render()
 
UI:endFrame()
 
end
 
</syntaxhighlight>
 
 
 
'''Glyphs example''':
 
<syntaxhighlight lang="lua">
 
local fonts = io:getFonts()
 
fonts:addFont(font_path, font_size, {
 
glyphs = {
 
ranges = {
 
{
 
0x2590,0x2593, -- range1
 
0x2660,0x266B  -- range2
 
-- ...
 
},
 
ImGui.GlyphRanges_Cyrillic,
 
{
 
0x01C0, 0x01C3 -- range3
 
},
 
ImGui.GlyphRanges_Korean
 
},
 
 
-- same structure:
 
ranges = {
 
{
 
0x2590,0x2593, -- range1
 
0x2660,0x266B, -- range2
 
0x01C0,0x01C3  -- range3
 
-- ...
 
},
 
ImGui.GlyphRanges_Cyrillic,
 
ImGui.GlyphRanges_Korean
 
}
 
},
 
mergeMode = true, -- merge into previous font
 
})
 
fonts:build()
 
</syntaxhighlight>
 
 
 
'''Icons example''':
 
<syntaxhighlight lang="lua">
 
local icon = utf8.char(0x2590)
 
ImGui:text("My icon >>" .. icon .. " << !!!")
 
 
 
-- or with new Luau support:
 
ImGui:text("My icon >> \u{2590} << !!!")
 
-- can be also stored in memory:
 
local icon = "\u{2590}"
 
</syntaxhighlight>
 
 
 
== Font ==
 
<syntaxhighlight lang="lua">
 
number = Font:getSize()
 
FontAtlas = Font:getContainerAtlas()
 
Font:setScale(number)
 
number = Font:getScale()
 
number = Font:getAscent()
 
number = Font:getDescent()
 
boo = Font:isLoaded()
 
string = Font:getDebugName()
 
w, h = Font:calcTextSizeA(size, max_width, wrap_width, string)
 
Font:calcWordWrapPositionA(scale, string, wrap_width) -- not tested
 
</syntaxhighlight>
 
 
 
== INPUTS ==
 
<syntaxhighlight lang="lua">
 
ImGui:onMouseHover(event)
 
ImGui:onMouseMove(event)
 
ImGui:onMouseDown(event)
 
ImGui:onMouseUp(event)
 
ImGui:onMouseWheel(event)
 
 
 
ImGui:onTouchMove(event)
 
ImGui:onTouchBegin(event)
 
ImGui:onTouchEnd(event)
 
ImGui:onTouchCancel(event)
 
 
 
ImGui:onKeyUp(event)
 
ImGui:onKeyDown(event)
 
ImGui:onKeyChar(event)
 
</syntaxhighlight>
 
 
 
'''Usage examples''':
 
<syntaxhighlight lang="lua">
 
local UI = ImGui.new(nil, false, false, false)
 
</syntaxhighlight>
 
 
 
'''Mouse'''
 
<syntaxhighlight lang="lua">
 
stage:addEventListener("mouseHover", function(e) UI:onMouseHover(e) end)
 
stage:addEventListener("mouseMove", function(e) UI:onMouseMove(e) end)
 
stage:addEventListener("mouseDown", function(e) UI:onMouseDown(e) end)
 
stage:addEventListener("mouseUp", function(e) UI:onMouseUp(e) end)
 
stage:addEventListener("mouseWheel", function(e) UI:onMouseWheel(e) end)
 
</syntaxhighlight>
 
 
 
'''Touch'''
 
<syntaxhighlight lang="lua">
 
stage:addEventListener("touchesCancel", function(e) ui:onTouchCancel(e) end)
 
stage:addEventListener("touchesMove", function(e) ui:onTouchMove(e) end)
 
stage:addEventListener("touchesBegin", function(e) ui:onTouchBegin(e) end)
 
stage:addEventListener("touchesEnd", function(e) ui:onTouchEnd(e) end)
 
</syntaxhighlight>
 
 
 
'''Keyboard'''
 
<syntaxhighlight lang="lua">
 
stage:addEventListener("keyUp", function(e) UI:onKeyUp(e) end)
 
stage:addEventListener("keyDown", function(e) UI:onKeyDown(e) end)
 
stage:addEventListener("keyChar", function(e) UI:onKeyChar(e) end)
 
</syntaxhighlight>
 
 
 
== Style setters/getters ==
 
Get style settings instance:
 
<syntaxhighlight lang="lua">
 
local Style = ImGui:getStyle()
 
</syntaxhighlight>
 
 
 
'''Setters/getters''':
 
<syntaxhighlight lang="lua">
 
Style:setColor(ImGui.Col, color, alpha)
 
color, alpha = Style:getColor(ImGui.Col)
 
Style:setAlpha(value)
 
value = Style:getAlpha()
 
Style:setWindowRounding(value)
 
value = Style:getWindowRounding()
 
Style:setWindowBorderSize(value)
 
value = Style:getWindowBorderSize()
 
Style:setChildRounding(value)
 
value = Style:getChildRounding()
 
Style:setChildBorderSize(value)
 
value = Style:getChildBorderSize()
 
Style:setPopupRounding(value)
 
value = Style:getPopupRounding()
 
Style:setPopupBorderSize(value)
 
value = Style:getPopupBorderSize()
 
Style:setFrameRounding(value)
 
value = Style:getFrameRounding()
 
Style:setFrameBorderSize(value)
 
value = Style:getFrameBorderSize()
 
Style:setIndentSpacing(value)
 
value = Style:getIndentSpacing()
 
Style:setColumnsMinSpacing(value)
 
value = Style:getColumnsMinSpacing()
 
Style:setScrollbarSize(value)
 
value = Style:getScrollbarSize()
 
Style:setScrollbarRounding(value)
 
value = Style:getScrollbarRounding()
 
Style:setGrabMinSize(value)
 
value = Style:getGrabMinSize()
 
Style:setGrabRounding(value)
 
value = Style:getGrabRounding()
 
Style:setLogSliderDeadzone(value)
 
value = Style:getLogSliderDeadzone()
 
Style:setTabRounding(value)
 
value = Style:getTabRounding()
 
Style:setTabBorderSize(value)
 
value = Style:getTabBorderSize()
 
Style:setTabMinWidthForCloseButton(value)
 
value = Style:getTabMinWidthForCloseButton()
 
Style:setMouseCursorScale(value)
 
value = Style:getMouseCursorScale()
 
Style:setCurveTessellationTol(value)
 
value = Style:getCurveTessellationTol()
 
Style:setCircleSegmentMaxError(value)
 
value = Style:getCircleSegmentMaxError()
 
Style:setWindowPadding(x, y)
 
x, y = Style:getWindowPadding()
 
Style:setWindowMinSize(x, y)
 
x, y = Style:getWindowMinSize()
 
Style:setWindowTitleAlign(x, y)
 
x, y = Style:getWindowTitleAlign()
 
Style:setFramePadding(x, y)
 
x, y = Style:getFramePadding()
 
Style:setCellPadding(x, y)
 
x, y = Style:getCellPadding()
 
Style:setItemSpacing(x, y)
 
x, y = Style:getItemSpacing()
 
Style:setItemInnerSpacing(x, y)
 
x, y = Style:getItemInnerSpacing()
 
Style:setTouchExtraPadding(x, y)
 
x, y = Style:getTouchExtraPadding()
 
Style:setButtonTextAlign(x, y)
 
x, y = Style:getButtonTextAlign()
 
Style:setSelectableTextAlign(x, y)
 
x, y = Style:getSelectableTextAlign()
 
Style:setDisplayWindowPadding(x, y)
 
x, y = Style:getDisplayWindowPadding()
 
Style:setDisplaySafeAreaPadding(x, y)
 
x, y = Style:getDisplaySafeAreaPadding()
 
Style:setWindowMenuButtonPosition(ImGui.Dir)
 
dir = Style:getWindowMenuButtonPosition()
 
Style:setColorButtonPosition(ImGui.Dir)
 
dir = Style:getColorButtonPosition()
 
Style:setAntiAliasedLines(flag)
 
flag = Style:getAntiAliasedLines()
 
Style:setAntiAliasedLinesUseTex(flag)
 
flag = Style:getAntiAliasedLinesUseTex()
 
Style:setAntiAliasedFill(flag)
 
flag = Style:getAntiAliasedFill()
 
Style:setDisabledAlpha(number)
 
alpha = Style:getDisabledAlpha()
 
Style:setSeparatorTextBorderSize(number)
 
number = Style:getSeparatorTextBorderSize()
 
Style:setSeparatorTextAlign(x, y)
 
x, y = Style:getSeparatorTextAlign()
 
Style:setSeparatorTextPadding(x, y)
 
x, y = Style:getSeparatorTextPadding()
 
</syntaxhighlight>
 
 
 
== DEFAULT STYLES ==
 
<syntaxhighlight lang="lua">
 
ImGui:setDarkStyle()
 
ImGui:setLightStyle()
 
ImGui:setClassicStyle()
 
</syntaxhighlight>
 
 
 
== Color convert ==
 
'''Note''': use ''DOT'' instead of ''COLON'', so you can use it without creating an ImGui object
 
<syntaxhighlight lang="lua">
 
r, g, b, a = ImGui.colorConvertHEXtoRGB(color [, alpha = 1])
 
hex = ImGui.colorConvertRGBtoHEX(r, g, b)
 
h, s, v = ImGui.colorConvertRGBtoHSV(r, g, b)
 
r, g, b = ImGui.colorConvertHSVtoRGB(h, s, v)
 
h, s, v = ImGui.colorConvertHEXtoHSV(hex)
 
hex = ImGui.colorConvertHSVtoHEX(h, s, v)
 
</syntaxhighlight>
 
 
 
== IO Functions ==
 
Get IO instance:
 
<syntaxhighlight lang="lua">
 
local IO = ImGui:getIO()
 
</syntaxhighlight>
 
 
 
'''Functions''':
 
<syntaxhighlight lang="lua">
 
IO:setFontDefault(font)
 
ImGuiConfigFlag = IO:getConfigFlags()
 
IO:setConfigFlags(ImGui.ConfigFlag)
 
IO:addConfigFlags(ImGui.ConfigFlag)
 
ImGuiBackendFlag = IO:getBackendFlags()
 
IO:setBackendFlags(ImGui.BackendFlag)
 
number = IO:getIniSavingRate()
 
IO:setIniSavingRate(number)
 
string = IO:getIniFilename()
 
IO:setIniFilename(string)
 
IO:saveIniSettings([path]) -- if path is not defined the it uses default path, which is set by IO:setIniFilename()
 
IO:loadIniSettings([path])
 
string = IO:getLogFilename()
 
IO:setLogFilename(string)
 
number = IO:getMouseDoubleClickTime()
 
IO:setMouseDoubleClickTime(number)
 
number = IO:getMouseDragThreshold()
 
IO:setMouseDragThreshold(number)
 
flag = IO:getMouseDrawCursor()
 
IO:setMouseDrawCursor(flag)
 
number = IO:getMouseDoubleClickMaxDist()
 
IO:setMouseDoubleClickMaxDist(number)
 
number = IO:getKeyRepeatDelay()
 
IO:setKeyRepeatDelay(number)
 
number = IO:getKeyRepeatRate()
 
IO:setKeyRepeatRate(number)
 
number = IO:getFontGlobalScale()
 
IO:setFontGlobalScale(number)
 
bool = IO:getFontAllowUserScaling()
 
IO:setFontAllowUserScaling(bool)
 
number, number = IO:getDisplayFramebufferScale()
 
IO:setDisplayFramebufferScale(number, number)
 
bool = IO:getConfigMacOSXBehaviors()
 
IO:setConfigMacOSXBehaviors(bool)
 
bool = IO:getConfigInputTextCursorBlink()
 
IO:setConfigInputTextCursorBlink(bool)
 
bool = IO:getConfigWindowsResizeFromEdges()
 
IO:setConfigWindowsResizeFromEdges(bool)
 
bool = IO:getConfigWindowsMoveFromTitleBarOnly()
 
IO:setConfigWindowsMoveFromTitleBarOnly(bool)
 
number = IO:getConfigWindowsMemoryCompactTimer()
 
IO:setConfigWindowsMemoryCompactTimer(number)
 
string = IO:getBackendPlatformName()
 
string = IO:getBackendRendererName()
 
bool = IO:IsMouseDown(button)
 
number = IO:getMouseWheel()
 
number = IO:getMouseWheelH()
 
flag = IO:wantCaptureMouse()
 
flag = IO:wantCaptureKeyboard()
 
flag = IO:wantTextInput()
 
flag = IO:wantSetMousePos()
 
flag = IO:wantSaveIniSettings()
 
number = IO:getFramerate()
 
number = IO:getMetricsRenderVertices()
 
number = IO:getMetricsRenderIndices()
 
number = IO:getMetricsRenderWindows()
 
number = IO:getMetricsActiveWindows()
 
number = IO:getMetricsActiveAllocations()
 
x, y = IO:getMouseDelta()
 
number = IO:getMouseDownSec(mouse_button)
 
IO:setDisplaySize(w, h)
 
w, h = IO:getDisplaySize()
 
number = IO:getDeltaTime()
 
-- reset mouse buttons state
 
IO:resetMouseDown()
 
-- reset key states (including ALT/SHIFT/CTRL/SUPER (META))
 
IO:resetKeysDown()
 
-- set ALT/SHIFT/CTRL/SUPER (META) key state
 
IO:setModKeyDown(key_code, bool) -- "key_code" is a gideros MOD key
 
-- set any key state
 
IO:setKeysDown(key_code, bool) -- "key_code" is a gideros regular "keyCode"
 
-- adds text to active text input widget
 
IO:addInputCharactersUTF8(text)
 
-- emulate wheel scrolling
 
IO:setMouseWheel(number)
 
-- sets mouse position (data only, no visual changes)
 
IO:setMousePos(x, y)
 
-- set mouse state, where index: 0 - left mouse, 1 - right, 2 - middle, 3 - unused, 4 - unused.
 
IO:setMouseDown(mouse_button, state) -- "mouse_button" is a gideros mouse button code
 
 
 
-- "key" is any ImGui KeyCode (check [here](#keyboard-keys))
 
-- "down" is a boolean
 
IO:addKeyEvent(key, down)
 
IO:addKeyAnalogEvent(key, down, number)
 
IO:AddMousePosEvent(x, y)
 
-- "button" is any ImGui button (check [here](#MouseButton))
 
IO:addMouseButtonEvent(button, down)
 
IO:addMouseWheelEvent(x, y)
 
 
 
IO:setAppAcceptingEvents([accepting_events = true])
 
</syntaxhighlight>
 
 
 
== Context ==
 
<syntaxhighlight lang="lua">
 
string OR nil = ImGui:getHoveredWindow()
 
string OR nil = ImGui:getHoveredWindowRoot()
 
string OR nil = ImGui:getHoveredWindowUnderMovingWindow()
 
string OR nil = ImGui:getMovingWindow()
 
string OR nil = ImGui:getActiveIdWindow()
 
id = ImGui:getActiveId()
 
id = ImGui:getActiveIdPreviousFrame()
 
number = ImGui:getActiveIdTimer()
 
id = ImGui:getActiveIdAllowOverlap()
 
id = ImGui:getHoveredId()
 
id = ImGui:getHoveredIdPreviousFrame()
 
number = ImGui:getHoveredIdTimer()
 
id = ImGui:getHoveredIdAllowOverlap()
 
bool = ImGui:getDragDropActive()
 
id = ImGui:getDragDropPayloadSourceId()
 
string = ImGui:getDragDropPayloadDataType()
 
number = ImGui:getDragDropPayloadDataSize()
 
</syntaxhighlight>
 
 
 
== WIDGETS & STUFF ==
 
=== Windows ===
 
<syntaxhighlight lang="lua">
 
p_open, draw = ImGui:beginWindow(label, p_open [, ImGui.WindowFlags = 0])
 
-- do not show "X" button
 
draw = ImGui:beginWindow(label, nil [, ImGui.WindowFlags = 0])
 
-- start a window with no borders, no paddings, no rounding and ImGui.WindowFlags_Fullscreen flag
 
p_open, draw = ImGui:beginFullScreenWindow(label, p_open [, ImGui.WindowFlags = 0])
 
-- do not show "X" button
 
draw = ImGui:beginFullScreenWindow(label, nil [, ImGui.WindowFlags = 0])
 
ImGui:endWindow()
 
</syntaxhighlight>
 
 
 
=== Disabled groups ===
 
<syntaxhighlight lang="lua">
 
ImGui:beginDisabled(disabledFlag)
 
ImGui:endDisabled()
 
</syntaxhighlight>
 
 
 
=== Child Windows ===
 
<syntaxhighlight lang="lua">
 
ImGui:beginChild(id [, w = 0, h = 0, borderFlag = false, ImGui.WindowFlags = 0])
 
ImGui:endChild()
 
</syntaxhighlight>
 
 
 
=== Windows Utilities ===
 
<syntaxhighlight lang="lua">
 
flag = ImGui:isWindowAppearing()
 
flag = ImGui:isWindowCollapsed()
 
flag = ImGui:isWindowFocused([ImGui.FocusedFlags = 0])
 
flag = ImGui:isWindowHovered([ImGui.HoveredFlags = 0])
 
x, y = ImGui:getWindowPos()
 
w, h = ImGui:getWindowSize()
 
w = ImGui:getWindowWidth()
 
h = ImGui:getWindowHeight()
 
 
 
x1,y1, x2,y2 = ImGui:getWindowBounds() -- returns window region rectangle in global coordinates
 
ImGui:setNextWindowPos(x, y [, ImGui.Cond = 0, pivotX = 0, pivotY = 0])
 
ImGui:setNextWindowSize(w, h [, ImGui.Cond = 0])
 
ImGui:setNextWindowContentSize(w, h)
 
ImGui:setNextWindowCollapsed(flag [, ImGui.Cond = 0])
 
ImGui:setNextWindowFocus()
 
ImGui:setNextWindowBgAlpha(alpha)
 
ImGui:setNextWindowScroll(x, y)
 
ImGui:setWindowPos(name, x, y [, ImGui.Cond = 0]) OR ImGui:setWindowPos(x, y [, ImGui.Cond = 0])
 
ImGui:setWindowSize(name, w, h [, ImGui.Cond = 0]) OR ImGui:setWindowSize(w, h [, ImGui.Cond = 0])
 
ImGui:setWindowCollapsed(name, flag [, ImGui.Cond = 0]) OR ImGui:setWindowCollapsed(flag [, ImGui.Cond = 0])
 
ImGui:setWindowFocus(name) OR ImGui:setWindowFocus()
 
ImGui:setWindowFontScale(scale)
 
-- scroll window when touching void
 
ImGui:scrollWhenDragging(x, y)
 
</syntaxhighlight>
 
 
 
=== Window size constraints ===
 
Can be used to set minimum and maximum window size, plus contraint the size if needed.
 
<syntaxhighlight lang="lua">
 
-- call this function before ImGui:beginWindow()
 
ImGui:setNextWindowSizeConstraints(min_w, min_h, max_w, max_h [, resize_callback, user_data]))
 
-- resizeCallback is a function:
 
function (callbackData [, user_data])
 
-- do some math, and return desired size
 
-- ...
 
return desired_width, desired_height
 
end
 
</syntaxhighlight>
 
 
 
'''Resize callback''':
 
<syntaxhighlight lang="lua">
 
-- get window position
 
x, y = callbackData:getPos()
 
x = callbackData:getX()
 
y = callbackData:getY()
 
 
 
-- get currrent size
 
current_width, current_height = callbackData:getCurrentSize()
 
current_width = callbackData:getCurrentWidth()
 
current_height = callbackData:getCurrentHeight()
 
 
 
-- get desired size
 
deserid_width, deserid_height = callbackData:getDesiredSize()
 
deserid_width = callbackData:getDesiredWidth()
 
deserid_height = callbackData:getDesiredHeight()
 
</syntaxhighlight>
 
 
 
'''Example''':
 
<syntaxhighlight lang="lua">
 
require "ImGui"
 
 
 
local function stepSize(callback_data, step)
 
local w, h = callback_data:getDesiredSize()
 
w = (w // step) * step
 
h = (h // step) * step
 
return w, h
 
end
 
 
 
local ui = ImGui.new()
 
stage:addChild(ui)
 
 
 
stage:addEventListener("enterFrame", function(e)
 
ui:newFrame(e.deltaTime)
 
 
-- window size step is 32 (last argument, that is passed to the callback as second argument)
 
ui:setNextWindowSizeConstraints(200, 200, 400, 400, stepSize, 32)
 
if (ui:beginWindow("My window")) then
 
 
ui:textWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
 
end
 
ui:endWindow()
 
 
ui:showDemoWindow()
 
 
ui:render()
 
ui:endFrame()
 
end)
 
</syntaxhighlight>
 
 
 
=== Content region ===
 
<syntaxhighlight lang="lua">
 
scaleX, scaleY = ImGui:getContentRegionMax()
 
w, h = ImGui:getContentRegionAvail()
 
x, y = ImGui:getWindowContentRegionMin()
 
x, y = ImGui:getWindowContentRegionMax()
 
</syntaxhighlight>
 
 
 
=== Windows Scrolling ===
 
<syntaxhighlight lang="lua">
 
x = ImGui:getScrollX()
 
y = ImGui:getScrollY()
 
maxX = ImGui:getScrollMaxX()
 
maxY = ImGui:getScrollMaxY()
 
ImGui:setScrollX(value)
 
ImGui:setScrollY(value)
 
ImGui:setScrollHereX([ratio = 0.5])
 
ImGui:setScrollHereY([ratio = 0.5])
 
ImGui:setScrollFromPosX(x [, ratio = 0.5])
 
ImGui:setScrollFromPosY(y [, ratio = 0.5])
 
</syntaxhighlight>
 
 
 
=== Parameters stacks (shared) ===
 
<syntaxhighlight lang="lua">
 
ImGui:pushStyleColor(ImGui.Col, color, alpha)
 
ImGui:popStyleColor([count = 1])
 
ImGui:pushStyleVar(ImGui.StyleVar, value) OR ImGui:pushStyleVar(ImGui.StyleVar, value1, value2)
 
ImGui:popStyleVar([count = 1])
 
color, alpha = ImGui:getStyleColor(ImGui.Col)
 
fontSize = ImGui:getFontSize()
 
</syntaxhighlight>
 
 
 
=== Parameters stacks (current window) ===
 
<syntaxhighlight lang="lua">
 
ImGui:pushItemWidth(w)
 
ImGui:popItemWidth()
 
ImGui:setNextItemWidth(w)
 
w = ImGui:calcItemWidth()
 
ImGui:pushTextWrapPos([localX = 0])
 
ImGui:popTextWrapPos()
 
ImGui:pushTabStop(flag)
 
ImGui:popTabStop()
 
ImGui:pushButtonRepeat(flag)
 
ImGui:popButtonRepeat()
 
</syntaxhighlight>
 
 
 
=== Cursor / Layout ===
 
<syntaxhighlight lang="lua">
 
ImGui:separator()
 
ImGui:sameLine([offset_x = 0, spacing = -1])
 
ImGui:newLine()
 
ImGui:spacing()
 
ImGui:dummy(w, h)
 
ImGui:indent([indent = 0])
 
ImGui:unindent([indent = 0])
 
ImGui:beginGroup()
 
ImGui:endGroup()
 
 
x, y = ImGui:getCursorPos()
 
x = ImGui:getCursorPosX()
 
y = ImGui:getCursorPosY()
 
ImGui:setCursorPos(local_x, local_y)
 
ImGui:setCursorPosX(local_x)
 
ImGui:setCursorPosY(local_y)
 
x, y = ImGui:getCursorStartPos()
 
x, y = ImGui:getCursorScreenPos()
 
ImGui:setCursorScreenPos(x, y)
 
ImGui:alignTextToFramePadding()
 
lineH = ImGui:getTextLineHeight()
 
lineH = ImGui:getTextLineHeightWithSpacing()
 
frameH = ImGui:getFrameHeight()
 
frameH = ImGui:getFrameHeightWithSpacing()
 
</syntaxhighlight>
 
 
 
=== ID stack/scopes ===
 
<syntaxhighlight lang="lua">
 
ImGui:pushID(anyValue)
 
ImGui:pushID(str)
 
ImGui:popID()
 
number = ImGui:getID(any_value)
 
number = ImGui:getID(string)
 
number = ImGui:getItemID()
 
</syntaxhighlight>
 
 
 
=== Widgets: Text ===
 
<syntaxhighlight lang="lua">
 
ImGui:textUnformatted(text [, textEnd])
 
ImGui:text(text)
 
ImGui:textColored(text, color, alpha)
 
ImGui:textDisabled(text)
 
ImGui:textWrapped(text)
 
ImGui:labelText(text, label)
 
ImGui:bulletText(text)
 
ImGui:separatorText(label)
 
</syntaxhighlight>
 
 
 
=== Widgets: Main ===
 
<syntaxhighlight lang="lua">
 
flag = ImGui:button(text [, w = 0, h = 0])
 
flag = ImGui:smallButton(text)
 
flag = ImGui:invisibleButton(string_ID [, w = 0, h = 0])
 
flag = ImGui:arrowButton(string_ID [, ImGui.Dir = 0])
 
flag = ImGui:checkbox(text, flag)
 
flags, is_changed = ImGui:checkboxFlags(label [, flags = 0, flags_value = 0])
 
number, is_changed = ImGui:radioButton(text, number, number)
 
is_changed = ImGui:radioButton(text, flag)
 
ImGui:progressBar(fraction [, anchor_x = -1, anchor_y = 0, overlay_string = nil])
 
ImGui:bullet()
 
</syntaxhighlight>
 
 
 
=== Widgets: Images ===
 
<syntaxhighlight lang="lua">
 
-- Images are streched (ImGui default functions)
 
ImGui:image(texture, w, h
 
[, tint_color = 0xffffff, tint_alpha = 1,
 
border_color = 0xffffff, border_alpha = 0])
 
 
 
ImGui:imageUV(texture,
 
w, h,
 
uv0x, uv0y,
 
uv1x, uv1y,
 
[, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0])
 
 
 
pressFlag = ImGui:imageButton(str_id, texture, w, h
 
[, tint_color = 0xffffff, tint_alpha = 1,
 
border_color = 0xffffff, border_alpha = 0])
 
 
 
pressFlag = ImGui:imageButtonUV(str_id, texture, w, h,
 
uv0x, uv0y, uv1x, uv1y
 
[, tint_color = 0xffffff, tint_alpha = 1,
 
border_color = 0xffffff, border_alpha = 0])
 
 
 
-- Images are scaled (extended by @MultiPain)
 
-- padding deprecated
 
-- (use "ImGui:pushStyleVar(ImGui.StyleVar_FramePadding, x, y)/ImGui:popStyleVar()")
 
ImGui:scaledImage(str_id, texture, w, h
 
[, fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false,
 
anchor_x = 0.5, anchor_y = 0.5,
 
tint_col = 0xffffff, tint_alpha = 1,
 
border_col = 0, border_alpha = 0,
 
bg_col = 0, bg_alpha = 0])
 
 
 
pressFlag = ImGui:scaledImageButton(str_id, texture, w, h
 
[, fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false,
 
ImGui.ButtonFlags = 0, anchor_x = 0.5, anchor_y = 0.5,
 
clip_offset_x = 0, clip_offset_y = 0,
 
tint_col = 0xffffff, tint_alpha = 1,
 
border_col = 0, border_alpha = 0,
 
bg_col = 0, bg_alpha = 0])
 
 
pressFlag = ImGui:scaledImageButtonWithText(texture, label, image_w, image_h
 
[, button_w = 0, button_h = 0, ImGui.ButtonFlags = 0,
 
fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false,
 
anchor_x = 0.5, anchor_y = 0.5, image_side = ImGui.Dir_Left,
 
clip_offset_x = 0, clip_offset_y = 0,
 
tint_col = 0xffffff, tint_alpha = 1,
 
border_col = 0, border_alpha = 0,
 
bg_col = 0, bg_alpha = 0])
 
</syntaxhighlight>
 
 
 
=== Widgets: Combo Box ===
 
<syntaxhighlight lang="lua">
 
openFlag = ImGui:beginCombo(text, preview_text [, ImGui.ComboFlags = 0])
 
ImGui:endCombo()
 
current_item, is_open = ImGui:combo(label, current_item, items) -- items (table): {"item1", "item2", ...}
 
</syntaxhighlight>
 
 
 
=== Widgets: Drags ===
 
<syntaxhighlight lang="lua">
 
value, is_changed = ImGui:dragFloat(label, value
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, is_changed = ImGui:dragFloat2(label, value1, value2
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, is_changed = ImGui:dragFloat3(label, value1, value2, value3
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, value4, is_changed = ImGui:dragFloat4(label, value1, value2, value3, value4
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value_min, value_max, is_changed = ImGui:dragFloatRange2(label, value_min, value_max
 
[, inc_step = 1, min = 0, max = 0,
 
format_min_string = "%.3f", ImGui.SliderFlags = 0])
 
-- table must be an array of any size > 0
 
is_changed = ImGui:dragFloatT(label, table
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value, is_changed = ImGui:dragInt(label, value
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value1, value2, is_changed = ImGui:dragInt2(label, value1, value2
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, is_changed = ImGui:dragInt3(label, value1, value2, value3
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, value4, is_changed = ImGui:dragInt4(label, value1, value2, value3, value4
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
v_current_min, v_current_max, flag = ImGui:dragIntRange2(label, v_current_min, v_current_max
 
[, v_speed = 1, v_min = 0, v_max = 0,
 
format = "%d", format_max = nil, ImGui.SliderFlags = 0])
 
 
 
-- table must be an array of any size > 0
 
is_changed = ImGui:dragIntT(label, table
 
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
</syntaxhighlight>
 
 
 
=== Widgets: Sliders ===
 
<syntaxhighlight lang="lua">
 
value, is_changed = ImGui:sliderFloat(label, value
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, is_changed = ImGui:sliderFloat2(label, value1, value2
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, is_changed = ImGui:sliderFloat3(label, value1, value2, value3
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, value4, is_changed = ImGui:sliderFloat4(label, value1, value2, value3, value4
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value_in_rad, is_changed = ImGui:sliderAngle(label, value_in_rad
 
[, min_degrees = -360, max_degrees = 360,
 
format_string = "%.0f deg", ImGui.SliderFlags = 0])
 
 
 
-- table must be an array of any size > 0
 
is_changed = ImGui:sliderFloatT(label, table
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value, is_changed = ImGui:sliderInt(label, value
 
[, min = 0, max = 0,
 
format_string = "%d, ImGui.SliderFlags = 0"])
 
 
 
value1, value2, is_changed = ImGui:sliderInt2(label, value1, value2
 
[, min = 0, max = 0,
 
format_string = "%d, ImGui.SliderFlags = 0"])
 
 
 
value1, value2, value3, is_changed = ImGui:sliderInt3(label, value1, value2, value3
 
[, min = 0, max = 0,
 
format_string = "%d, ImGui.SliderFlags = 0"])
 
 
 
value1, value2, value3, value4, is_changed = ImGui:sliderInt4(label, value1, value2, value3, value4
 
[, min = 0, max = 0,
 
format_string = "%d, ImGui.SliderFlags = 0"])
 
 
 
-- table must be an array of any size > 0
 
is_changed = ImGui:sliderIntT(label, table
 
[, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value, is_changed = ImGui:vSliderFloat(label, w, h, value, min, max
 
[, format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value, is_changed = ImGui:vSliderInt(label, w, h, value, min, max
 
[, format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value, is_changed = ImGui:filledSliderFloat(label, mirror_flag, value
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, is_changed = ImGui:filledSliderFloat2(label, mirror_flag, value1, value2
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, is_changed = ImGui:filledSliderFloat3(label, mirror_flag, value1, value2, value3
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, value4, is_changed = ImGui:filledSliderFloat4(label, mirror_flag, value1, value2, value3, value4
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
-- table must be an array of any size > 0
 
is_changed = ImGui:filledSliderFloatT(label, mirror_flag, table
 
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value_in_rad, is_changed = ImGui:filledSliderAngle(label, mirror_flag, value_in_rad
 
[, min_degrees = -360, max_degrees = 360,
 
format_string = "%.0f deg", ImGui.SliderFlags = 0])
 
 
 
value, is_changed = ImGui:filledSliderInt(label, mirror_flag, value
 
[, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value1, value2, is_changed = ImGui:filledSliderInt2(label, mirror_flag, value1, value2
 
[, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, is_changed = ImGui:filledSliderInt3(label, mirror_flag, value1, value2, value3
 
[, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value1, value2, value3, value4, is_changed = ImGui:filledSliderInt4(label, mirror_flag, value1, value2, value3, value4
 
[, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
-- table must be an array of any size > 0
 
is_changed = ImGui:filledSliderIntT(label, mirror_flag, table
 
[, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
 
value, is_changed = ImGui:vFilledSliderFloat(label, mirror_flag, w, h, value, min, max
 
[, format_string = "%.3f", ImGui.SliderFlags = 0])
 
 
 
value, is_changed = ImGui:vFilledSliderInt(label, mirror_flag, w, h, value, min, max
 
[, format_string = "%d", ImGui.SliderFlags = 0])
 
</syntaxhighlight>
 
 
 
=== Widgets: Input with Keyboard ===
 
<syntaxhighlight lang="lua">
 
text, flag = ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0])
 
text, flag = ImGui:inputTextMultiline(label, text, buffer_size [, w = 0, h = 0, ImGui.InputTextFlags = 0])
 
text, flag = ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0])
 
value,  flag = ImGui:inputFloat(label, value [, step = 0, step_fast = 0, format = "%.3f", ImGui.InputTextFlags = 0])
 
value1, value2, flag = ImGui:inputFloat2(label, value1, value2 [, format = "%.3f", ImGui.InputTextFlags = 0])
 
value1, value2, value3, flag = ImGui:inputFloat3(label, value1, value2, value3 [, format = "%.3f", ImGui.InputTextFlags = 0])
 
value1, value2, value3, value4, flag = ImGui:inputFloat4(label, value1, value2, value3, value4 [, format = "%.3f", ImGui.InputTextFlags = 0])
 
-- table must be an array of any size > 0
 
flag = ImGui:inputFloatT(label, table [, format = "%.3f", ImGui.InputTextFlags = 0])
 
value,  flag = ImGui:inputInt(label, value [, step = 0, step_fast = 0, ImGui.InputTextFlags = 0])
 
value1, value2, flag = ImGui:inputInt2(label, value1, value2 [, ImGui.InputTextFlags = 0])
 
value1, value2, value3, flag = ImGui:inputInt3(label, value1, value2, value3 [, ImGui.InputTextFlags = 0])
 
value1, value2, value3, value4, flag = ImGui:inputInt4(label, value1, value2, value3, value4 [, ImGui.InputTextFlags = 0])
 
-- table must be an array of any size > 0
 
flag = ImGui:inputIntT(label, table [, format = "%d", ImGui.InputTextFlags = 0])
 
value, flag = ImGui:inputDouble(label, value [, step = 0, step_fast = 0, format = "%.6f", ImGui.InputTextFlags = 0])
 
</syntaxhighlight>
 
 
 
'''Input text callbacks''':
 
<syntaxhighlight lang="lua">
 
ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
 
ImGui:inputTextMultiline(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
 
ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
 
 
 
callback_function = function(callback_data, user_data)
 
-- do something with data
 
-- see below
 
end
 
</syntaxhighlight>
 
 
 
'''callback_data''':
 
<syntaxhighlight lang="lua">
 
ImGuiInputTextFlags = callback_data:getEventFlag()
 
ImGuiInputTextFlags = callback_data:getFlags()
 
 
 
number = callback_data:getEventChar()
 
 
 
callback_data:setEventChar(number)
 
 
 
keyCode = callback_data:getEventKey()
 
 
 
string = callback_data:getBuf()
 
 
 
callback_data:setBuf(string)
 
 
 
number = callback_data:getBufTextLen()
 
 
 
callback_data:setBufTextLen(number)
 
 
 
number = callback_data:getBufSize()
 
 
 
callback_data:setBufDirty(bool)
 
bool = callback_data:isBufDirty()
 
 
 
callback_data:setCursorPos(number)
 
number = callback_data:getCursorPos()
 
 
 
callback_data:setSelectionStart(s_start)
 
number = callback_data:getSelectionStart()
 
 
 
callback_data:setSelectionEnd(s_end)
 
s_end = callback_data:getSelectionEnd()
 
 
 
callback_data:setSelection(s_start, s_end)
 
s_start, s_end = callback_data:getSelection()
 
 
 
callback_data:selectAll()
 
callback_data:clearSelection()
 
bool = callback_data:hasSelection()
 
 
 
callback_data:deleteChars(position, bytesCount)
 
callback_data:insertChars(position, text)
 
</syntaxhighlight>
 
 
 
'''Example''':
 
<syntaxhighlight lang="lua">
 
require "ImGui"
 
 
 
ui = ImGui.new()
 
stage:addChild(ui)
 
 
 
local testMessage1 = ""
 
local testMessage2 = ""
 
local testMessage3 = ""
 
 
 
-- Add ".." at the end of current input string
 
function myCallback1(data)
 
data:insertChars(data:getCursorPos(), "..")
 
end
 
 
 
-- Replace all chars if UP/DOWN arrow is pressed
 
function myCallback2(data)
 
local key = data:getEventKey()
 
if (key == key_code.UP) then
 
data:deleteChars(0, data:getBufTextLen())
 
data:insertChars(0, "Pressed Up!")
 
data:selectAll()
 
elseif (key == key_code.DOWN) then
 
data:deleteChars(0, data:getBufTextLen())
 
data:insertChars(0, "Pressed Down!")
 
data:selectAll()
 
end
 
end
 
 
 
-- Switch case of the first char
 
function myCallback3(data)
 
local buf = data:getBuf()
 
local s = buf:sub(1,1)
 
if ((s >= 'a' and s <= 'z') or (s >= 'A' and s <= 'Z')) then
 
local first = string.char(string.byte(s) ~ 32)
 
data:setBuf(first .. buf:sub(2))
 
data:setBufDirty(true)
 
end
 
end
 
 
 
function enterFrame(e)
 
ui:newFrame(e.deltaTime)
 
 
testMessage1 = ui:inputText(
 
"Label1",
 
testMessage1,
 
64,
 
ImGui.InputTextFlags_CallbackCompletion,
 
myCallback1
 
)
 
testMessage2 = ui:inputText(
 
"Label2",
 
testMessage2,
 
64,
 
ImGui.InputTextFlags_CallbackHistory,
 
myCallback2
 
)
 
testMessage3 = ui:inputText(
 
"Label3",
 
testMessage3,
 
64,
 
ImGui.InputTextFlags_CallbackEdit,
 
myCallback3
 
)
 
 
ui:render()
 
ui:endFrame()
 
end
 
 
 
stage:addEventListener("enterFrame", enterFrame)
 
</syntaxhighlight>
 
 
 
=== Widgets: Color Editor/Picker ===
 
<syntaxhighlight lang="lua">
 
hexColor, is_touching = ImGui:colorEdit3(label, color [, ImGui.ColorEditFlags = 0]) -- alpha ignored, no need to pass it!
 
hexColor, alpha, is_touching = ImGui:colorEdit4(label, color [, alpha = 1, ImGui.ColorEditFlags = 0])
 
hexColor, is_touching = ImGui:colorPicker3(label, color [, ImGui.ColorEditFlags = 0])
 
hexColor, alpha, originalColor, originalAlpha, is_touching = ImGui:colorPicker4(label, color
 
[, alpha = 1, original_color = 0xffffff, original_alpha = 1, ImGui.ColorEditFlags = 0])
 
isHoveringFlag = ImGui:colorButton(string_ID, color [, alpha = 1, ImGui.ColorEditFlags = 0, w = 0, h = 0])
 
ImGui:setColorEditOptions(ImGui.ColorEditFlags)
 
</syntaxhighlight>
 
 
 
=== Widgets: Trees ===
 
<syntaxhighlight lang="lua">
 
is_openFlag = ImGui:treeNode(label [, format_string])
 
ImGui:treeNodeEx(label, ImGui.TreeNodeFlags [, format_string])
 
ImGui:treePush(str_id)
 
ImGui:treePop()
 
number = ImGui:getTreeNodeToLabelSpacing()
 
is_openFlag, p_open = ImGui:collapsingHeader(label, p_open [, ImGui.TreeNodeFlags = 0])
 
is_openFlag = ImGui:collapsingHeader(label [, ImGui.TreeNodeFlags = 0])
 
ImGui:setNextItemOpen(is_open, ImGui.Cond)
 
</syntaxhighlight>
 
 
 
=== Widgets: Selectables ===
 
<syntaxhighlight lang="lua">
 
result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])
 
</syntaxhighlight>
 
 
 
=== Widgets: List Boxes ===
 
<syntaxhighlight lang="lua">
 
-- item_table: {"Item0", "Item1", ...}
 
current_item, is_openFlag = ImGui:listBox(label, current_item, item_table [, max_visible_items = -1])
 
result? = ImGui:listBoxHeader(label [, w = 0, h = 0])
 
result? = ImGui:listBoxHeader2(label, items_count)
 
ImGui:listBoxFooter()
 
</syntaxhighlight>
 
 
 
=== Widgets: Data Plotting ===
 
'''Caching''':
 
 
 
If you have big array of points it is better to cache it instead of translating lua table to C++ vector every time you call `ImGui:plotLines()`. But in this case you need to manage memory by yourself (free points pointer when you dont need it).
 
<syntaxhighlight lang="lua">
 
-- store points in memory
 
-- points_table: {0.01, 0.5, 10, -50, ...}
 
-- ptr: c++ pointer to a given vector
 
ptr = ImGui.cachePoints(points_table)
 
 
 
-- delete points from memory
 
ImGui.freePoints(ptr)
 
</syntaxhighlight>
 
 
 
'''Plot functions''':
 
<syntaxhighlight lang="lua">
 
-- len (number): points array lenght
 
ImGui:plotCachedLines(label, ptr, len,
 
[, values_offset = 0, overlay_text = nil,
 
scale_min = math.huge, scale_max = math.huge,
 
w = 0, h = 0])
 
 
ImGui:plotCachedHistogram(label, ptr, len,
 
[, values_offset = 0, overlay_text = nil,
 
scale_min = math.huge, scale_max = math.huge,
 
w = 0, h = 0])
 
 
 
ImGui:plotLines(label, points_table
 
[, values_offset = 0, overlay_text = nil,
 
scale_min = math.huge, scale_max = math.huge,
 
w = 0, h = 0])
 
 
 
ImGui:plotHistogram(label, points_table
 
[, values_offset = 0, overlay_text = nil,
 
scale_min = math.huge, scale_max = math.huge,
 
w = 0, h = 0])
 
</syntaxhighlight>
 
 
 
'''Example''':
 
<syntaxhighlight lang="lua">
 
-- delete ptr if it exist
 
function deletePtr()
 
if pointsPtr then
 
ImGui.freePoints(pointsPtr)
 
end
 
end
 
 
 
function onEnterFrame()
 
ui:newFrame(e.deltaTime)
 
 
if ui:button("Generate") then
 
deletePtr()
 
points = generatePoints() -- returns big array
 
pointsPtr = ImGui.cachePoints(points)
 
end
 
 
if pointsPtr then
 
ui:plotCachedLines("Big data", pointsPtr, #points)
 
end
 
 
ui:render()
 
ui:endFrame()
 
end
 
 
 
-- do not forget to clear memory when app is closing
 
function onAppExit()
 
deletePtr()
 
end
 
</syntaxhighlight>
 
 
 
== Widgets: Value() Helpers ==
 
<syntaxhighlight lang="lua">
 
ImGui:value(prefix, bool)
 
ImGui:value(prefix, number)
 
ImGui:value(prefix, float, format_string)
 
</syntaxhighlight>
 
 
 
== Widgets: Menus ==
 
<syntaxhighlight lang="lua">
 
result? = ImGui:beginMenuBar()
 
ImGui:endMenuBar()
 
result? = ImGui:beginMainMenuBar()
 
ImGui:endMainMenuBar()
 
result = ImGui:beginMenu(label [, enabled = true])
 
result = ImGui:beginMenuEx(label, [icon = "", enabled = true])
 
ImGui:endMenu()
 
result = ImGui:menuItem(label [, shortcut = "", selected = false, enabled = true])
 
result = ImGui:menuItemEx(label, [icon = "", shortcut = "", selected = false, enabled = true])
 
ImGui:beginTooltip()
 
ImGui:endTooltip()
 
ImGui:setTooltip(text)
 
</syntaxhighlight>
 
 
 
== Popups, Modals ==
 
<syntaxhighlight lang="lua">
 
result? = ImGui:beginPopup(str_id [, ImGui.WindowFlags = 0])
 
p_open, result? = ImGui:beginPopupModal(str_id, p_open [, ImGui.WindowFlags = 0])
 
ImGui:endPopup()
 
ImGui:openPopup(str_id [, ImGui.PopupFlags = 0])
 
ImGui:openPopupOnItemClick(str_id [, ImGui.PopupFlags = 0])
 
ImGui:closeCurrentPopup()
 
result? = ImGui:beginPopupContextItem(str_id [, ImGui.PopupFlags = 0])
 
result? = ImGui:beginPopupContextWindow(str_id [, ImGui.PopupFlags = 0])
 
result? = ImGui:beginPopupContextVoid(str_id [, ImGui.PopupFlags = 0])
 
result? = ImGui:isPopupOpen(str_id [, ImGui.PopupFlags = 0])
 
</syntaxhighlight>
 
 
 
== Tables ==
 
<syntaxhighlight lang="lua">
 
flag = ImGui:beginTable(str_id, column [, ImGui.TableFlags = 0, outer_w = 0, outer_h = 0, inner_width = 0])
 
ImGui:endTable()
 
ImGui:tableNextRow([ImGui.TableRowFlags = 0, min_row_height = 0])
 
flag = ImGui:tableNextColumn()
 
flag = ImGui:tableSetColumnIndex(column_n)
 
ImGui:tableSetupColumn(label [, ImGui.TableColumnFlags = 0, init_width_or_weight = 0, user_id = 0])
 
ImGui:tableSetupScrollFreeze(cols, rows)
 
ImGui:tableHeadersRow()
 
TableSortSpecs = ImGui:tableGetSortSpecs() -- see below
 
number = ImGui:tableGetColumnCount()
 
number = ImGui:tableGetColumnIndex()
 
number = ImGui:tableGetRowIndex()
 
string = ImGui:tableGetColumnName([column_n = -1])
 
ImGuiTableColumnFlags = ImGui:tableGetColumnFlags([column_n = -1])
 
ImGui:tableSetBgColor(ImGui.TableBgTarget, color [, alpha = 1, column_n = -1])
 
</syntaxhighlight>
 
 
 
== Table sort specs ==
 
<syntaxhighlight lang="lua">
 
-- TableSortSpecs = ImGui:tableGetSortSpecs()
 
number = TableSortSpecs:getSpecsCount()
 
flag = TableSortSpecs:isSpecsDirty()
 
TableSortSpecs:setSpecsDirty(flag)
 
table = TableSortSpecs:getColumnSortSpecs() -- see below
 
</syntaxhighlight>
 
 
 
== Table column sort specs ==
 
<syntaxhighlight lang="lua">
 
-- table = TableSortSpecs:getColumnSortSpecs()
 
-- each value of this table is an object that have this functions:
 
number = item:getColumnUserID()
 
number = item:getColumnIndex() -- 0 based
 
number = item:getSortOrder() -- used in multi sorted tables
 
number = item:getSortDirection() -- ImGui.SortDirection_Ascending OR ImGui.SortDirection_Descending
 
</syntaxhighlight>
 
Example: https://github.com/MultiPain/Gideros_examples/blob/master/ImGuiTablesDemo/assets/TablesDemo.lua</br>
 
 
 
== Columns ==
 
<syntaxhighlight lang="lua">
 
ImGui:columns([count = 1, id = nil, border = true])
 
ImGui:nextColumn()
 
index = ImGui:getColumnIndex()
 
width = ImGui:getColumnWidth([column_index = -1])
 
ImGui:setColumnWidth(column_index, width)
 
offset = ImGui:getColumnOffset([column_index = -1])
 
ImGui:setColumnOffset(column_index, offset)
 
number = ImGui:getColumnsCount()
 
</syntaxhighlight>
 
 
 
== Tab Bars, Tabs ==
 
<syntaxhighlight lang="lua">
 
bool = ImGui:beginTabBar(str_id [, ImGui.TabBarFlags = 0])
 
ImGui:endTabBar()
 
p_open, bool = ImGui:beginTabItem(label, p_open [, ImGui.TabItemFlags = 0])
 
ImGui:endTabItem()
 
ImGui:setTabItemClosed(tab_or_docked_window_label)
 
ImGui:tabItemButton(label [, ImGui.TabItemFlags = 0])
 
</syntaxhighlight>
 
 
 
== Logging/Capture ==
 
<syntaxhighlight lang="lua">
 
ImGui:logToTTY(auto_open_depth = -1)
 
ImGui:logToFile(auto_open_depth = -1, filename = nil)
 
ImGui:logToClipboard(auto_open_depth = -1)
 
ImGui:logFinish()
 
ImGui:logButtons()
 
ImGui:logText(text)
 
</syntaxhighlight>
 
 
 
== Drag and drop ==
 
<syntaxhighlight lang="lua">
 
flag = ImGui:beginDragDropSource([ImGui.DragDropFlags flags = 0])
 
flag = ImGui:setNumDragDropPayload(str_type, number [, ImGui.Cond cond = 0])
 
flag = ImGui:setStrDragDropPayload(str_type, string [, ImGui.Cond cond = 0])
 
ImGui:endDragDropSource()
 
flag = ImGui:beginDragDropTarget()
 
ImGuiPayload = ImGui:acceptDragDropPayload(type [, ImGui.DragDropFlags flags = 0])
 
ImGui:endDragDropTarget()
 
ImGuiPayload = ImGui:getDragDropPayload()
 
</syntaxhighlight>
 
 
 
'''Payload''':
 
<syntaxhighlight lang="lua">
 
number = ImGuiPayload:getNumData()
 
string = ImGuiPayload:getStrData()
 
ImGuiPayload:clear()
 
number = ImGuiPayload:getDataSize()
 
flag = ImGuiPayload:isDataType(type) -- type must be the same as in "ImGui:acceptDragDropPayload(type)"
 
flag = ImGuiPayload:isPreview()
 
flag = ImGuiPayload:isDelivery()
 
</syntaxhighlight>
 
 
 
'''Usage example''':
 
<syntaxhighlight lang="lua">
 
local names = {
 
"Bobby", "Beatrice", "Betty",
 
"Brianna", "Barry", "Bernard",
 
"Bibi", "Blaine", "Bryn"
 
}
 
-- modes:
 
local Mode_Copy = 0
 
local Mode_Move = 1
 
local Mode_Swap = 2
 
 
local mode = 0 -- current mode
 
 
 
function onEnterFrame(e)
 
UI:newFrame(e.deltaTime)
 
 
if (UI:radioButton("Copy", mode == Mode_Copy)) then mode = Mode_Copy end UI:sameLine()
 
if (UI:radioButton("Move", mode == Mode_Move)) then mode = Mode_Move end UI:sameLine()
 
if (UI:radioButton("Swap", mode == Mode_Swap)) then mode = Mode_Swap end
 
 
for i,v in ipairs(names) do
 
UI:pushID(i)
 
if (((i-1) % 3) ~= 0) then UI:sameLine() end
 
 
UI:button(v, 60, 60)
 
 
if (UI:beginDragDropSource(ImGui.DragDropFlags_None)) then
 
--UI:setStrDragDropPayload("DND_DEMO_CELL", "ID_"..i) -- used for strings
 
UI:setNumDragDropPayload("DND_DEMO_CELL", i) -- used for numbers
 
 
if (mode == Mode_Copy) then UI:text(("Copy %s"):format(v)) end
 
if (mode == Mode_Move) then UI:text(("Move %s"):format(v)) end
 
if (mode == Mode_Swap) then UI:text(("Swap %s"):format(v)) end
 
UI:endDragDropSource()
 
end
 
 
if (UI:beginDragDropTarget()) then
 
local payload = UI:acceptDragDropPayload("DND_DEMO_CELL")
 
if (payload) then
 
--local payload_n = tonumber(payload:getStrData():sub(4))  -- if "setStrDragDropPayload" was used
 
local payload_n = payload:getNumData() -- if "setNumDragDropPayload" was used
 
 
if (mode == Mode_Copy) then
 
names[i] = names[payload_n];
 
end
 
if (mode == Mode_Move) then
 
names[i] = names[payload_n];
 
names[payload_n] = "";
 
end
 
 
if (mode == Mode_Swap) then
 
names[i], names[payload_n] = names[payload_n], names[i]
 
end
 
end
 
UI:endDragDropTarget()
 
end
 
UI:popID()
 
end
 
UI:render()
 
UI:endFrame()
 
end
 
 
 
stage:addEventListener("enterFrame", onEnterFrame)
 
</syntaxhighlight>
 
 
 
== Clipping ==
 
<syntaxhighlight lang="lua">
 
ImGui:pushClipRect(min_x, min_y, max_x, max_y, intersect_with_current_clip_rect)
 
ImGui:popClipRect()
 
</syntaxhighlight>
 
 
 
== ImGuiListClipper ==
 
Try to avoid creating new instances in "enterFrame" event.
 
 
 
'''Constructor''':
 
<syntaxhighlight lang="lua">
 
instance = ImGuiListClipper.new()
 
</syntaxhighlight>
 
 
 
'''Methods''':
 
<syntaxhighlight lang="lua">
 
ImGuiListClipper:beginClip(number_of_items [, item_height = -1]) -- if item_height <= 0 then it is calculated automatically
 
ImGuiListClipper:endClip()
 
bool = ImGuiListClipper:step()
 
number = ImGuiListClipper:getDisplayStart()
 
number = ImGuiListClipper:getDisplayEnd()
 
number = ImGuiListClipper:getStartPosY()
 
number = ImGuiListClipper:getItemsCount()
 
ImGuiListClipper:forceDisplayRangeByIndices(number_min, number_max)
 
</syntaxhighlight>
 
 
 
'''Usage example''':
 
<syntaxhighlight lang="lua">
 
ui = ImGui.new()
 
stage:addChild(ui)
 
 
 
clipper = ImGuiListClipper.new()
 
 
 
function onEnterFrame(e)
 
ui:newFrame(e.deltaTime)
 
 
if (ui:beginWindow("Clipper demo")) then
 
if (ui:beginTable("table", 3)) then
 
ui:tableSetupScrollFreeze(0, 1)
 
ui:tableSetupColumn("One")
 
ui:tableSetupColumn("Two")
 
ui:tableSetupColumn("Three")
 
ui:tableHeadersRow()
 
 
clipper:beginClip(1000)
 
while (clipper:step()) do
 
for row = clipper:getDisplayStart(), clipper:getDisplayEnd() do
 
ui:tableNextRow()
 
for column = 1, 3 do
 
ui:tableSetColumnIndex(column - 1)
 
ui:text(("col: %d; row: %d"):format(column, row))
 
end
 
end
 
end
 
clipper:endClip()
 
 
ui:endTable()
 
end
 
end
 
ui:endWindow()
 
 
ui:endFrame()
 
ui:render()
 
end
 
 
 
stage:addEventListener("enterFrame", onEnterFrame)
 
</syntaxhighlight>
 
 
 
== ImGuiTextFilter ==
 
Try to avoid creating new instaces in "enterFrame" event.
 
 
 
'''Constructor''':
 
<syntaxhighlight lang="lua">
 
filter = ImGuiTextFilter.new()
 
</syntaxhighlight>
 
 
 
'''Methods''':
 
<syntaxhighlight lang="lua">
 
-- draws the input field
 
isValueChanged = filter:draw(label [, width = 0])
 
-- draws the input field (using ImGui:inutTextWithHint())
 
isValueChanged = filter:drawWithHint(label, hint [, width = 0])
 
 
 
filter:setBuffer(text) -- set filter text
 
filter:build() -- update filter internals (see example below)
 
bool = filter:passFilter(text) -- returns true if filter input matches with "text"
 
</syntaxhighlight>
 
 
 
'''Usage example 1''':</br>
 
https://github.com/MultiPain/Gideros_ImGui/blob/28d2cdd4f393d6f2048792e51f695d56d7e0ae9a/imgui_src/imgui_demo.cpp#L5657
 
<syntaxhighlight lang="lua">
 
ui = ImGui.new()
 
stage:addChild(ui)
 
 
 
filter = ImGuiTextFilter.new()
 
items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
 
 
 
function onEnterFrame(e)
 
ui:newFrame(e.deltaTime)
 
 
if (ui:beginWindow("Filter demo")) then
 
ui:text(
 
[[Filter usage:
 
""        display all lines
 
"xxx"      display lines containing "xxx"
 
"xxx,yyy"  display lines containing "xxx" or "yyy"
 
"-xxx"    hide lines containing "xxx"]])
 
 
filter:draw("Filter")
 
 
for i, text in ipairs(items) do
 
if filter:passFilter(text) then
 
ui:bulletText(text)
 
end
 
end
 
end
 
ui:endWindow()
 
 
ui:endFrame()
 
ui:render()
 
end
 
 
 
stage:addEventListener("enterFrame", onEnterFrame)
 
</syntaxhighlight>
 
 
 
'''Usage example 2''':
 
<syntaxhighlight lang="lua">
 
ui = ImGui.new()
 
stage:addChild(ui)
 
filter = ImGuiTextFilter.new()
 
 
 
searchText = ""
 
items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
 
function onEnterFrame(e)
 
ui:newFrame(e.deltaTime)
 
 
-- Draw standart text input control
 
-- filter:drawWithHint("Filter", "Search")
 
 
-- Draw custom control
 
local valueChanged = false
 
searchText, valueChanged = ui:inputText("Filter", searchText, 256, ImGui.InputTextFlags_EnterReturnsTrue)
 
if valueChanged then
 
filter:setBuffer(searchText)
 
-- try to avoid calling "build" function every frame
 
filter:build()
 
end
 
 
for i, item in ipairs(items) do
 
if not filter:passFilter(item) then
 
continue
 
end
 
 
ui:bulletText(item)
 
end
 
 
ui:endFrame()
 
ui:render()
 
end
 
</syntaxhighlight>
 
 
 
== Focus, Activation ==
 
<syntaxhighlight lang="lua">
 
ImGui:setItemDefaultFocus()
 
ImGui:setKeyboardFocusHere([offset = 0])
 
flag = ImGui:isItemHovered([ImGui.HoveredFlags = 0])
 
flag = ImGui:isItemActive()
 
flag = ImGui:isItemFocused()
 
flag = ImGui:isItemClicked(mouse_button)
 
flag = ImGui:isItemVisible()
 
flag = ImGui:isItemEdited()
 
flag = ImGui:isItemActivated()
 
flag = ImGui:isItemDeactivated()
 
flag = ImGui:isItemDeactivatedAfterEdit()
 
flag = ImGui:isItemToggledOpen()
 
flag = ImGui:isAnyItemHovered()
 
flag = ImGui:isAnyItemActive()
 
flag = ImGui:isAnyItemFocused()
 
minX, minY, maxX, maxY = ImGui:getItemRect()
 
x, y = ImGui:getItemRectMin()
 
x, y = ImGui:getItemRectMax()
 
w, h = ImGui:getItemRectSize()
 
ImGui:setItemAllowOverlap()
 
</syntaxhighlight>
 
 
 
== Miscellaneous Utilities ==
 
<syntaxhighlight lang="lua">
 
flag = ImGui:isRectVisible(w, h [, max_x, max_y])
 
number = ImGui:getTime()
 
number = ImGui:getFrameCount()
 
str = ImGui:getStyleColorName(idx)
 
flag = ImGui:beginChildFrame(id, w, h [, ImGui.WindowFlags = 0]) -- id (number)
 
ImGui:endChildFrame()
 
</syntaxhighlight>
 
 
 
== Text Utilities ==
 
<syntaxhighlight lang="lua">
 
w, h = ImGui:calcTextSize(text [, hide_text_after_double_hash = false, wrap_width = -1])
 
</syntaxhighlight>
 
 
 
== Inputs Utilities: Keyboard ==
 
<syntaxhighlight lang="lua">
 
string = ImGui:getKeyName(keyCode)
 
flag = ImGui:isKeyDown(keyCode)
 
flag = ImGui:isKeyPressed(keyCode [, repeat = true])
 
flag = ImGui:isKeyReleased(keyCode)
 
number = ImGui:getKeyPressedAmount(keyCode, repeat_delay, rate)
 
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
 
</syntaxhighlight>
 
 
 
== Shortcut system ==
 
<syntaxhighlight lang="lua">
 
-- (keyChord: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values (ImGuiKey | ImGuiMod_XXX))
 
ImGui:shortcut(keyChord [, owner_id = 0, ImGui.InputFlags = 0])
 
 
 
-- (useful to disable CTRL + TAB combo: ImGui:setShortcutRouting(ImGui.Mod_Ctrl | ImGui.Key_Tab, ImGui.KeyOwner_None))
 
ImGui:setShortcutRouting(keyChord [, owner_id = 0, ImGui.InputFlags = 0])
 
 
 
ImGui:setItemKeyOwner(keyCode [, ImGui.InputFlags = 0])
 
 
 
ImGui:setKeyOwner(keyCode, owner_id, [, ImGui.InputFlags = 0])
 
</syntaxhighlight>
 
 
 
== Inputs Utilities: Mouse ==
 
<syntaxhighlight lang="lua">
 
-- "mouse_button" is any gideros mouse button code
 
flag = ImGui:isMouseDown(mouse_button)
 
flag = ImGui:isMouseClicked(mouse_button [, repeat = false])
 
flag = ImGui:isMouseReleased(mouse_button)
 
flag = ImGui:isMouseDoubleClicked(mouse_button)
 
flag = ImGui:isMouseHoveringRect(min_x, min_y, max_x, max_y [, clip = true])
 
flag = ImGui:isMousePosValid([x = inf, y = inf])
 
flag = ImGui:isAnyMouseDown()
 
x, y = ImGui:getMousePos()
 
x, y = ImGui:getMousePosOnOpeningCurrentPopup()
 
flag = ImGui:isMouseDragging(mouse_button [, lock_threshold = -1])
 
x, y = ImGui:getMouseDragDelta(mouse_button [, lock_threshold = -1])
 
ImGui:resetMouseDragDelta(mouse_button)
 
ImGuiMouseCursor = ImGui:getMouseCursor()
 
ImGui:setMouseCursor(ImGui.MouseCursor)
 
ImGui:setNextFrameWantCaptureMouse([want_capture_mouse_value = true])
 
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
 
ImGui:updateCursor()
 
</syntaxhighlight>
 
 
 
== Render ==
 
<syntaxhighlight lang="lua">
 
ImGui:newFrame(deltaTime)
 
ImGui:render()
 
ImGui:endFrame()
 
</syntaxhighlight>
 
 
 
== Demos ==
 
<syntaxhighlight lang="lua">
 
is_openFlag = ImGui:showUserGuide()
 
is_openFlag = ImGui:showDemoWindow([p_open])
 
is_openFlag = ImGui:showAboutWindow([p_open])
 
is_openFlag = ImGui:showStyleEditor()
 
is_openFlag = ImGui:showFontSelector()
 
is_openFlag = ImGui:showMetricsWindow([p_open])
 
is_openFlag = ImGui:showStyleSelector(label)
 
is_openFlag = ImGui:ShowStackToolWindow([p_open])
 
ImGui:showLuaStyleEditor()
 
</syntaxhighlight>
 
 
 
== TextEditor ==
 
<syntaxhighlight lang="lua">
 
-- otherTextEditor: another "ImGuiTextEditor" instance to copy setting
 
TextEditor = ImGuiTextEditor.new([other_text_editor])
 
</syntaxhighlight>
 
 
 
'''Functions''':
 
<syntaxhighlight lang="lua">
 
LanguageDefinition = TextEditor:getLanguageCPP()
 
LanguageDefinition = TextEditor:getLanguageGLSL()
 
LanguageDefinition = TextEditor:getLanguageHLSL()
 
LanguageDefinition = TextEditor:getLanguageC()
 
LanguageDefinition = TextEditor:getLanguageSQL()
 
LanguageDefinition = TextEditor:getLanguageAngelScript()
 
LanguageDefinition = TextEditor:getLanguageLua()
 
 
 
TextEditor:setLanguageDefinition(LanguageDefinition)
 
LanguageDefinition = TextEditor:getLanguageDefinition()
 
 
 
Palette = TextEditor:getPaletteDark()
 
Palette = TextEditor:getPaletteLight()
 
Palette = TextEditor:getPaletteRetro()
 
 
 
TextEditor:setPalette(Palette)
 
Palette = TextEditor:getPalette()
 
 
 
TextEditor:setPaletteColor(TE_ColorIndex, color [, alpha = 1]) -- see TextEditor enums below
 
color, alpha = TextEditor:getPaletteColor(TE_ColorIndex)
 
 
 
TextEditor:loadPalette(table) -- 42 elements table
 
-- example:
 
--[[ dark palete:
 
TextEditor:loadPalette{
 
0x7f7f7f, 1, -- Default
 
0xd69c56, 1, -- Keyword
 
0x00ff00, 1, -- Number
 
0x7070e0, 1, -- String
 
0x70a0e0, 1, -- Char literal
 
0xffffff, 1, -- Punctuation
 
0x408080, 1, -- Preprocessor
 
0xaaaaaa, 1, -- Identifier
 
0x9bc64d, 1, -- Known identifier
 
0xc040a0, 1, -- Preproc identifier
 
0x206020, 1, -- Comment (single line)
 
0x406020, 1, -- Comment (multi line)
 
0x101010, 1, -- Background
 
0xe0e0e0, 1, -- Cursor
 
0xa06020, 0.5, -- Selection
 
0x0020ff, 0.5, -- ErrorMarker
 
0xf08000, 0.25, -- Breakpoint
 
0x707000, 1, -- Line number
 
0x000000, 0.25, -- Current line fill
 
0x808080, 0.25, -- Current line fill (inactive)
 
0xa0a0a0, 0.25, -- Current line edge
 
}
 
]]
 
 
 
-- see below
 
TextEditor:setErrorMarkers(error_markers)
 
TextEditor:setBreakpoints(breakpoints)
 
 
 
TextEditor:render(string_id [, w = 0, h = 0, border = 0])
 
 
 
TextEditor:setText(string)
 
TextEditor:getText()
 
TextEditor:setTextLines(table) -- set editor text using table. Structure: {"line 1", "line 2", "line 3", ...}
 
table = TextEditor:getTextLines()
 
 
 
string = TextEditor:getSelectedText()
 
string = TextEditor:getCurrentLineText()
 
 
 
number = TextEditor:getTotalLines()
 
bool = TextEditor:isOverwrite()
 
 
 
bool = TextEditor:setReadOnly()
 
bool = TextEditor:isReadOnly()
 
bool = TextEditor:isTextChanged()
 
bool = TextEditor:isCursorPositionChanged()
 
 
 
TextEditor:setColorizerEnable()
 
bool = TextEditor:isColorizerEnabled()
 
 
 
line, column = TextEditor:getCursorPosition() -- 0 based line & column number
 
TextEditor:setCursorPosition(line, column)
 
 
 
TextEditor:setHandleMouseInputs(bool)
 
bool = TextEditor:isHandleMouseInputsEnabled()
 
 
 
TextEditor:setHandleKeyboardInputs(bool)
 
bool = TextEditor:isHandleKeyboardInputsEnabled()
 
 
 
TextEditor:setTextEditorChildIgnored(bool)
 
bool = TextEditor:isTextEditorChildIgnored()
 
 
 
TextEditor:setShowWhitespaces(bool)
 
bool = TextEditor:isShowingWhitespaces()
 
 
 
TextEditor:setTabSize(size)
 
size = TextEditor:getTabSize()
 
 
 
TextEditor:insertText(string)
 
 
 
TextEditor:moveUp([amount = 1, select = false])
 
TextEditor:moveDown([amount = 1, select = false])
 
TextEditor:moveLeft([amount = 1, select = false])
 
TextEditor:moveRight([amount = 1, select = false])
 
TextEditor:moveTop([select = false])
 
TextEditor:moveBottom([select = false])
 
TextEditor:moveHome([select = false])
 
TextEditor:moveEnd([select = false])
 
 
 
TextEditor:setSelectionStart(line, column)
 
TextEditor:setSelectionEnd(line, column)
 
TextEditor:setSelection(start_line, start_column, end_line, end_column)
 
TextEditor:selectWordUnderCursor()
 
TextEditor:selectAll()
 
bool = TextEditor:hasSelection()
 
 
 
TextEditor:copy()
 
TextEditor:cut()
 
TextEditor:paste()
 
TextEditor:delete()
 
 
 
bool = TextEditor:canUndo()
 
bool = TextEditor:canRedo()
 
TextEditor:undo()
 
TextEditor:redo()
 
</syntaxhighlight>
 
 
 
=== LanguageDefinition ===
 
<syntaxhighlight lang="lua">
 
string = LanguageDefinition:getName()
 
</syntaxhighlight>
 
 
 
=== ErrorMarkers ===
 
<syntaxhighlight lang="lua">
 
ErrorMarkers = ImGuiErrorMarkers.new()
 
 
 
ErrorMarkers:add(line, message)
 
ErrorMarkers:remove(line)
 
message = ErrorMarkers:get(line)
 
number = ErrorMarkers:getSize()
 
</syntaxhighlight>
 
 
 
=== Breakpoints ===
 
<syntaxhighlight lang="lua">
 
Breakpoints = ImGuiBreakpoints.new()
 
 
 
Breakpoints:add(line)
 
Breakpoints:remove(line)
 
bool = Breakpoints:get(line)
 
number = Breakpoints:getSize()
 
</syntaxhighlight>
 
 
 
== ENUMS ==
 
 
 
=== Keyboard keys ===
 
==== Keys ====
 
<syntaxhighlight lang="lua">
 
ImGui.Key_None
 
ImGui.Key_Tab
 
ImGui.Key_LeftArrow
 
ImGui.Key_RightArrow
 
ImGui.Key_UpArrow
 
ImGui.Key_DownArrow
 
ImGui.Key_PageUp
 
ImGui.Key_PageDown
 
ImGui.Key_Home
 
ImGui.Key_End
 
ImGui.Key_Insert
 
ImGui.Key_Delete
 
ImGui.Key_Backspace
 
ImGui.Key_Space
 
ImGui.Key_Enter
 
ImGui.Key_Escape
 
ImGui.Key_LeftCtrl
 
ImGui.Key_LeftShift
 
ImGui.Key_LeftAlt
 
ImGui.Key_LeftSuper
 
ImGui.Key_RightCtrl
 
ImGui.Key_RightShift
 
ImGui.Key_RightAlt
 
ImGui.Key_RightSuper
 
ImGui.Key_Menu
 
ImGui.Key_MouseLeft
 
ImGui.Key_MouseRight
 
ImGui.Key_MouseMiddle
 
ImGui.Key_MouseX1
 
ImGui.Key_MouseX2
 
ImGui.Key_MouseWheelX
 
ImGui.Key_MouseWheelY
 
ImGui.Key_0
 
ImGui.Key_1
 
ImGui.Key_2
 
ImGui.Key_3
 
ImGui.Key_4
 
ImGui.Key_5
 
ImGui.Key_6
 
ImGui.Key_7
 
ImGui.Key_8
 
ImGui.Key_9
 
ImGui.Key_A
 
ImGui.Key_B
 
ImGui.Key_C
 
ImGui.Key_D
 
ImGui.Key_E
 
ImGui.Key_F
 
ImGui.Key_G
 
ImGui.Key_H
 
ImGui.Key_I
 
ImGui.Key_J
 
ImGui.Key_K
 
ImGui.Key_L
 
ImGui.Key_M
 
ImGui.Key_N
 
ImGui.Key_O
 
ImGui.Key_P
 
ImGui.Key_Q
 
ImGui.Key_R
 
ImGui.Key_S
 
ImGui.Key_T
 
ImGui.Key_U
 
ImGui.Key_V
 
ImGui.Key_W
 
ImGui.Key_X
 
ImGui.Key_Y
 
ImGui.Key_Z
 
ImGui.Key_F1
 
ImGui.Key_F2
 
ImGui.Key_F3
 
ImGui.Key_F4
 
ImGui.Key_F5
 
ImGui.Key_F6
 
ImGui.Key_F7
 
ImGui.Key_F8
 
ImGui.Key_F9
 
ImGui.Key_F10
 
ImGui.Key_F11
 
ImGui.Key_F12
 
ImGui.Key_Apostrophe
 
ImGui.Key_Comma
 
ImGui.Key_Minus
 
ImGui.Key_Period
 
ImGui.Key_Slash
 
ImGui.Key_Semicolon
 
ImGui.Key_Equal
 
ImGui.Key_LeftBracket
 
ImGui.Key_Backslash
 
ImGui.Key_RightBracket
 
ImGui.Key_GraveAccent
 
ImGui.Key_CapsLock
 
ImGui.Key_ScrollLock
 
ImGui.Key_NumLock
 
ImGui.Key_PrintScreen
 
ImGui.Key_Pause
 
ImGui.Key_Keypad0
 
ImGui.Key_Keypad1
 
ImGui.Key_Keypad2
 
ImGui.Key_Keypad3
 
ImGui.Key_Keypad4
 
ImGui.Key_Keypad5
 
ImGui.Key_Keypad6
 
ImGui.Key_Keypad7
 
ImGui.Key_Keypad8
 
ImGui.Key_Keypad9
 
ImGui.Key_KeypadDecimal
 
ImGui.Key_KeypadDivide
 
ImGui.Key_KeypadMultiply
 
ImGui.Key_KeypadSubtract
 
ImGui.Key_KeypadAdd
 
ImGui.Key_KeypadEnter
 
ImGui.Key_KeypadEqual
 
</syntaxhighlight>
 
 
 
==== Gamepad ====
 
<syntaxhighlight lang="lua">
 
ImGui.Key_GamepadStart
 
ImGui.Key_GamepadBack
 
ImGui.Key_GamepadFaceUp
 
ImGui.Key_GamepadFaceDown
 
ImGui.Key_GamepadFaceLeft
 
ImGui.Key_GamepadFaceRight
 
ImGui.Key_GamepadDpadUp
 
ImGui.Key_GamepadDpadDown
 
ImGui.Key_GamepadDpadLeft
 
ImGui.Key_GamepadDpadRight
 
ImGui.Key_GamepadL1
 
ImGui.Key_GamepadR1
 
ImGui.Key_GamepadL2
 
ImGui.Key_GamepadR2
 
ImGui.Key_GamepadL3
 
ImGui.Key_GamepadR3
 
ImGui.Key_GamepadLStickUp
 
ImGui.Key_GamepadLStickDown
 
ImGui.Key_GamepadLStickLeft
 
ImGui.Key_GamepadLStickRight
 
ImGui.Key_GamepadRStickUp
 
ImGui.Key_GamepadRStickDown
 
ImGui.Key_GamepadRStickLeft
 
ImGui.Key_GamepadRStickRight
 
</syntaxhighlight>
 
 
 
==== Modifiers ====
 
<syntaxhighlight lang="lua">
 
ImGui.Key_ModCtrl
 
ImGui.Key_ModShift
 
ImGui.Key_ModAlt
 
ImGui.Key_ModSuper
 
</syntaxhighlight>
 
 
 
=== FocusedFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.FocusedFlags_ChildWindows
 
ImGui.FocusedFlags_AnyWindow
 
ImGui.FocusedFlags_RootWindow
 
ImGui.FocusedFlags_RootAndChildWindows
 
ImGui.FocusedFlags_None
 
ImGui.FocusedFlags_NoPopupHierarchy
 
</syntaxhighlight>
 
 
 
=== PopupFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.PopupFlags_NoOpenOverExistingPopup
 
ImGui.PopupFlags_MouseButtonLeft
 
ImGui.PopupFlags_MouseButtonMask
 
ImGui.PopupFlags_MouseButtonRight
 
ImGui.PopupFlags_AnyPopupId
 
ImGui.PopupFlags_MouseButtonDefault
 
ImGui.PopupFlags_MouseButtonMiddle
 
ImGui.PopupFlags_None
 
ImGui.PopupFlags_AnyPopup
 
ImGui.PopupFlags_AnyPopupLevel
 
ImGui.PopupFlags_NoOpenOverItems
 
</syntaxhighlight>
 
 
 
=== HoveredFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.HoveredFlags_None
 
ImGui.HoveredFlags_RootAndChildWindows
 
ImGui.HoveredFlags_AllowWhenBlockedByPopup
 
ImGui.HoveredFlags_AllowWhenBlockedByActiveItem
 
ImGui.HoveredFlags_ChildWindows
 
ImGui.HoveredFlags_RectOnly
 
ImGui.HoveredFlags_AllowWhenDisabled
 
ImGui.HoveredFlags_AllowWhenOverlapped
 
ImGui.HoveredFlags_AnyWindow
 
ImGui.HoveredFlags_RootWindow
 
ImGui.HoveredFlags_NoNavOverride
 
ImGui.HoveredFlags_DelayNormal
 
ImGui.HoveredFlags_DelayShort
 
ImGui.HoveredFlags_NoSharedDelay
 
</syntaxhighlight>
 
 
 
=== InputTextFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.InputTextFlags_None
 
ImGui.InputTextFlags_EnterReturnsTrue
 
ImGui.InputTextFlags_ReadOnly
 
ImGui.InputTextFlags_AutoSelectAll
 
ImGui.InputTextFlags_AllowTabInput
 
ImGui.InputTextFlags_CharsScientific
 
ImGui.InputTextFlags_CharsDecimal
 
ImGui.InputTextFlags_NoUndoRedo
 
ImGui.InputTextFlags_CtrlEnterForNewLine
 
ImGui.InputTextFlags_CharsHexadecimal
 
ImGui.InputTextFlags_CharsNoBlank
 
ImGui.InputTextFlags_Password
 
ImGui.InputTextFlags_NoHorizontalScroll
 
ImGui.InputTextFlags_AlwaysInsertMode
 
ImGui.InputTextFlags_CharsUppercase
 
ImGui.InputTextFlags_NoBackground -- custom constant, used to disable background
 
ImGui.InputTextFlags_EscapeClearsAll
 
ImGui.InputTextFlags_CallbackCompletion
 
ImGui.InputTextFlags_CallbackResize
 
ImGui.InputTextFlags_CallbackAlways
 
ImGui.InputTextFlags_CallbackHistory
 
ImGui.InputTextFlags_CallbackCharFilter
 
ImGui.InputTextFlags_CallbackEdit
 
</syntaxhighlight>
 
 
 
=== NavInput ===
 
<syntaxhighlight lang="lua">
 
ImGui.NavInput_FocusNext
 
ImGui.NavInput_TweakFast
 
ImGui.NavInput_Input
 
ImGui.NavInput_DpadRight
 
ImGui.NavInput_FocusPrev
 
ImGui.NavInput_LStickDown
 
ImGui.NavInput_LStickUp
 
ImGui.NavInput_Activate
 
ImGui.NavInput_LStickLeft
 
ImGui.NavInput_LStickRight
 
ImGui.NavInput_DpadLeft
 
ImGui.NavInput_DpadDown
 
ImGui.NavInput_TweakSlow
 
ImGui.NavInput_DpadUp
 
ImGui.NavInput_Menu
 
ImGui.NavInput_Cancel
 
</syntaxhighlight>
 
 
 
=== TabBarFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.TabBarFlags_AutoSelectNewTabs
 
ImGui.TabBarFlags_NoCloseWithMiddleMouseButton
 
ImGui.TabBarFlags_TabListPopupButton
 
ImGui.TabBarFlags_NoTooltip
 
ImGui.TabBarFlags_FittingPolicyMask
 
ImGui.TabBarFlags_Reorderable
 
ImGui.TabBarFlags_FittingPolicyDefault
 
ImGui.TabBarFlags_FittingPolicyScroll
 
ImGui.TabBarFlags_FittingPolicyResizeDown
 
ImGui.TabBarFlags_None
 
ImGui.TabBarFlags_NoTabListScrollingButtons
 
</syntaxhighlight>
 
 
 
=== TreeNodeFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.TreeNodeFlags_Bullet
 
ImGui.TreeNodeFlags_None
 
ImGui.TreeNodeFlags_CollapsingHeader
 
ImGui.TreeNodeFlags_NavLeftJumpsBackHere
 
ImGui.TreeNodeFlags_Framed
 
ImGui.TreeNodeFlags_FramePadding
 
ImGui.TreeNodeFlags_AllowItemOverlap
 
ImGui.TreeNodeFlags_OpenOnArrow
 
ImGui.TreeNodeFlags_SpanFullWidth
 
ImGui.TreeNodeFlags_NoAutoOpenOnLog
 
ImGui.TreeNodeFlags_Leaf
 
ImGui.TreeNodeFlags_NoTreePushOnOpen
 
ImGui.TreeNodeFlags_Selected
 
ImGui.TreeNodeFlags_SpanAvailWidth
 
ImGui.TreeNodeFlags_OpenOnDoubleClick
 
ImGui.TreeNodeFlags_DefaultOpen
 
</syntaxhighlight>
 
 
 
=== StyleVar ===
 
<syntaxhighlight lang="lua">
 
ImGui.StyleVar_GrabRounding
 
ImGui.StyleVar_Alpha
 
ImGui.StyleVar_WindowMinSize
 
ImGui.StyleVar_PopupBorderSize
 
ImGui.StyleVar_WindowBorderSize
 
ImGui.StyleVar_FrameBorderSize
 
ImGui.StyleVar_ItemSpacing
 
ImGui.StyleVar_IndentSpacing
 
ImGui.StyleVar_FramePadding
 
ImGui.StyleVar_WindowPadding
 
ImGui.StyleVar_ChildRounding
 
ImGui.StyleVar_ItemInnerSpacing
 
ImGui.StyleVar_WindowRounding
 
ImGui.StyleVar_FrameRounding
 
ImGui.StyleVar_TabRounding
 
ImGui.StyleVar_ChildBorderSize
 
ImGui.StyleVar_GrabMinSize
 
ImGui.StyleVar_ScrollbarRounding
 
ImGui.StyleVar_ScrollbarSize
 
ImGui.StyleVar_WindowTitleAlign
 
ImGui.StyleVar_SelectableTextAlign
 
ImGui.StyleVar_PopupRounding
 
ImGui.StyleVar_ButtonTextAlign
 
ImGui.StyleVar_CellPadding
 
ImGui.StyleVar_DisabledAlpha
 
ImGui.StyleVar_SeparatorTextBorderSize
 
ImGui.StyleVar_SeparatorTextAlign
 
ImGui.StyleVar_SeparatorTextPadding
 
</syntaxhighlight>
 
 
 
=== Col ===
 
<syntaxhighlight lang="lua">
 
ImGui.Col_PlotHistogram
 
ImGui.Col_TitleBg
 
ImGui.Col_Separator
 
ImGui.Col_HeaderActive
 
ImGui.Col_HeaderHovered
 
ImGui.Col_ButtonHovered
 
ImGui.Col_NavWindowingHighlight
 
ImGui.Col_ScrollbarGrab
 
ImGui.Col_FrameBg
 
ImGui.Col_TextSelectedBg
 
ImGui.Col_ScrollbarGrabActive
 
ImGui.Col_TitleBgCollapsed
 
ImGui.Col_ModalWindowDimBg
 
ImGui.Col_ResizeGripActive
 
ImGui.Col_SeparatorHovered
 
ImGui.Col_ScrollbarGrabHovered
 
ImGui.Col_TabUnfocused
 
ImGui.Col_ScrollbarBg
 
ImGui.Col_ChildBg
 
ImGui.Col_Header
 
ImGui.Col_NavWindowingDimBg
 
ImGui.Col_CheckMark
 
ImGui.Col_Button
 
ImGui.Col_BorderShadow
 
ImGui.Col_DragDropTarget
 
ImGui.Col_MenuBarBg
 
ImGui.Col_TitleBgActive
 
ImGui.Col_SeparatorActive
 
ImGui.Col_Text
 
ImGui.Col_PlotLinesHovered
 
ImGui.Col_Border
 
ImGui.Col_TabUnfocusedActive
 
ImGui.Col_PlotLines
 
ImGui.Col_PlotHistogramHovered
 
ImGui.Col_ResizeGripHovered
 
ImGui.Col_Tab
 
ImGui.Col_TabHovered
 
ImGui.Col_PopupBg
 
ImGui.Col_TabActive
 
ImGui.Col_FrameBgActive
 
ImGui.Col_ButtonActive
 
ImGui.Col_WindowBg
 
ImGui.Col_SliderGrabActive
 
ImGui.Col_SliderGrab
 
ImGui.Col_NavHighlight
 
ImGui.Col_FrameBgHovered
 
ImGui.Col_TextDisabled
 
ImGui.Col_ResizeGrip
 
ImGui.Col_TableHeaderBg
 
ImGui.Col_TableBorderStrong
 
ImGui.Col_TableBorderLight
 
ImGui.Col_TableRowBg
 
ImGui.Col_TableRowBgAlt
 
</syntaxhighlight>
 
 
 
=== DataType ===
 
<syntaxhighlight lang="lua">
 
ImGui.DataType_U8
 
ImGui.DataType_S64
 
ImGui.DataType_Float
 
ImGui.DataType_S16
 
ImGui.DataType_U16
 
ImGui.DataType_Double
 
ImGui.DataType_S8
 
ImGui.DataType_U32
 
ImGui.DataType_S32
 
ImGui.DataType_U64
 
</syntaxhighlight>
 
 
 
=== Dir ===
 
<syntaxhighlight lang="lua">
 
ImGui.Dir_None
 
ImGui.Dir_Left
 
ImGui.Dir_Up
 
ImGui.Dir_Down
 
ImGui.Dir_Right
 
</syntaxhighlight>
 
 
 
=== WindowFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.WindowFlags_NoScrollWithMouse
 
ImGui.WindowFlags_None
 
ImGui.WindowFlags_NoScrollbar
 
ImGui.WindowFlags_HorizontalScrollbar
 
ImGui.WindowFlags_NoFocusOnAppearing
 
ImGui.WindowFlags_NoBringToFrontOnFocus
 
ImGui.WindowFlags_NoDecoration
 
ImGui.WindowFlags_NoCollapse
 
ImGui.WindowFlags_NoTitleBar
 
ImGui.WindowFlags_NoMove
 
ImGui.WindowFlags_NoInputs
 
ImGui.WindowFlags_NoMouseInputs
 
ImGui.WindowFlags_NoSavedSettings
 
ImGui.WindowFlags_NoNav
 
ImGui.WindowFlags_UnsavedDocument
 
ImGui.WindowFlags_NoNavFocus
 
ImGui.WindowFlags_AlwaysHorizontalScrollbar
 
ImGui.WindowFlags_AlwaysUseWindowPadding
 
ImGui.WindowFlags_NoNavInputs
 
ImGui.WindowFlags_NoResize
 
ImGui.WindowFlags_AlwaysVerticalScrollbar
 
ImGui.WindowFlags_MenuBar
 
ImGui.WindowFlags_NoBackground
 
ImGui.WindowFlags_AlwaysAutoResize
 
ImGui.WindowFlags_FullScreen -- custom constant, used to create a fullscreen window
 
</syntaxhighlight>
 
 
 
=== TabItemFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.TabItemFlags_SetSelected
 
ImGui.TabItemFlags_NoCloseWithMiddleMouseButton
 
ImGui.TabItemFlags_NoTooltip
 
ImGui.TabItemFlags_None
 
ImGui.TabItemFlags_NoPushId
 
ImGui.TabItemFlags_UnsavedDocument
 
ImGui.TabItemFlags_Leading
 
ImGui.TabItemFlags_Trailing
 
ImGui.TabItemFlags_NoReorder
 
</syntaxhighlight>
 
 
 
=== ComboFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.ComboFlags_HeightSmall
 
ImGui.ComboFlags_HeightLarge
 
ImGui.ComboFlags_PopupAlignLeft
 
ImGui.ComboFlags_None
 
ImGui.ComboFlags_NoPreview
 
ImGui.ComboFlags_HeightRegular
 
ImGui.ComboFlags_HeightMask
 
ImGui.ComboFlags_NoArrowButton
 
ImGui.ComboFlags_HeightLargest
 
</syntaxhighlight>
 
 
 
=== Cond ===
 
<syntaxhighlight lang="lua">
 
ImGui.Cond_Appearing
 
ImGui.Cond_None
 
ImGui.Cond_Always
 
ImGui.Cond_FirstUseEver
 
ImGui.Cond_Once
 
</syntaxhighlight>
 
 
 
=== SelectableFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.SelectableFlags_None
 
ImGui.SelectableFlags_SpanAllColumns
 
ImGui.SelectableFlags_AllowItemOverlap
 
ImGui.SelectableFlags_DontClosePopups
 
ImGui.SelectableFlags_AllowDoubleClick
 
ImGui.SelectableFlags_Disabled
 
</syntaxhighlight>
 
 
 
=== MouseCursor ===
 
<syntaxhighlight lang="lua">
 
ImGui.MouseCursor_Hand
 
ImGui.MouseCursor_ResizeAll
 
ImGui.MouseCursor_ResizeEW
 
ImGui.MouseCursor_Arrow
 
ImGui.MouseCursor_ResizeNS
 
ImGui.MouseCursor_None
 
ImGui.MouseCursor_NotAllowed
 
ImGui.MouseCursor_ResizeNWSE
 
ImGui.MouseCursor_ResizeNESW
 
ImGui.MouseCursor_TextInput
 
</syntaxhighlight>
 
 
 
=== MouseButton ===
 
<syntaxhighlight lang="lua">
 
ImGui.MouseButton_Right
 
ImGui.MouseButton_Middle
 
ImGui.MouseButton_Left
 
</syntaxhighlight>
 
 
 
=== ColorEditFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.ColorEditFlags_AlphaPreview
 
ImGui.ColorEditFlags_DisplayRGB
 
ImGui.ColorEditFlags_DisplayHex
 
ImGui.ColorEditFlags_InputHSV
 
ImGui.ColorEditFlags_NoSidePreview
 
ImGui.ColorEditFlags_Uint8
 
ImGui.ColorEditFlags_AlphaPreviewHalf
 
ImGui.ColorEditFlags_Float
 
ImGui.ColorEditFlags_PickerHueWheel
 
ImGui.ColorEditFlags_OptionsDefault
 
ImGui.ColorEditFlags_InputRGB
 
ImGui.ColorEditFlags_HDR
 
ImGui.ColorEditFlags_NoPicker
 
ImGui.ColorEditFlags_AlphaBar
 
ImGui.ColorEditFlags_DisplayHSV
 
ImGui.ColorEditFlags_PickerHueBar
 
ImGui.ColorEditFlags_NoAlpha
 
ImGui.ColorEditFlags_NoOptions
 
ImGui.ColorEditFlags_NoDragDrop
 
ImGui.ColorEditFlags_NoInputs
 
ImGui.ColorEditFlags_None
 
ImGui.ColorEditFlags_NoSmallPreview
 
ImGui.ColorEditFlags_NoBorder
 
ImGui.ColorEditFlags_NoLabel
 
ImGui.ColorEditFlags_NoTooltip
 
</syntaxhighlight>
 
 
 
=== DragDropFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.DragDropFlags_SourceNoPreviewTooltip
 
ImGui.DragDropFlags_SourceAllowNullID
 
ImGui.DragDropFlags_AcceptNoDrawDefaultRect
 
ImGui.DragDropFlags_AcceptPeekOnly
 
ImGui.DragDropFlags_AcceptBeforeDelivery
 
ImGui.DragDropFlags_SourceNoHoldToOpenOthers
 
ImGui.DragDropFlags_AcceptNoPreviewTooltip
 
ImGui.DragDropFlags_SourceAutoExpirePayload
 
ImGui.DragDropFlags_SourceExtern
 
ImGui.DragDropFlags_None
 
ImGui.DragDropFlags_SourceNoDisableHover
 
</syntaxhighlight>
 
 
 
=== corner_flags ===
 
<syntaxhighlight lang="lua">
 
ImGui.DrawFlags_None
 
ImGui.DrawFlags_Closed
 
ImGui.DrawFlags_RoundCornersTopLeft
 
ImGui.DrawFlags_RoundCornersTopRight
 
ImGui.DrawFlags_RoundCornersBottomLeft
 
ImGui.DrawFlags_RoundCornersBottomRight
 
ImGui.DrawFlags_RoundCornersTop
 
ImGui.DrawFlags_RoundCornersBottom
 
ImGui.DrawFlags_RoundCornersLeft
 
ImGui.DrawFlags_RoundCornersRight
 
ImGui.DrawFlags_RoundCornersAll
 
</syntaxhighlight>
 
 
 
=== ConfigFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.ConfigFlags_None                 
 
ImGui.ConfigFlags_NavEnableKeyboard     
 
ImGui.ConfigFlags_NavEnableGamepad     
 
ImGui.ConfigFlags_NavEnableSetMousePos 
 
ImGui.ConfigFlags_NavNoCaptureKeyboard 
 
ImGui.ConfigFlags_NoMouse               
 
ImGui.ConfigFlags_NoMouseCursorChange
 
ImGui.ConfigFlags_IsSRGB               
 
ImGui.ConfigFlags_IsTouchScreen
 
</syntaxhighlight>
 
 
 
=== BackendFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.BackendFlags_None
 
ImGui.BackendFlags_HasGamepad
 
ImGui.BackendFlags_HasMouseCursors
 
ImGui.BackendFlags_HasSetMousePos
 
ImGui.BackendFlags_RendererHasVtxOffset
 
</syntaxhighlight>
 
 
 
=== SliderFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.SliderFlags_None         
 
ImGui.SliderFlags_ClampOnInput -- renamed in 1.79 to "SliderFlags_AlwaysClamp" (can be still used until 1.80)
 
ImGui.SliderFlags_AlwaysClamp
 
ImGui.SliderFlags_Logarithmic 
 
ImGui.SliderFlags_NoRoundToFormat
 
ImGui.SliderFlags_NoInput
 
</syntaxhighlight>
 
 
 
=== GlyphRanges ===
 
<syntaxhighlight lang="lua">
 
ImGui.GlyphRanges_Default,
 
ImGui.GlyphRanges_Korean,
 
ImGui.GlyphRanges_ChineseFull,
 
ImGui.GlyphRanges_ChineseSimplifiedCommon,
 
ImGui.GlyphRanges_Japanese,
 
ImGui.GlyphRanges_Cyrillic,
 
ImGui.GlyphRanges_Thai,
 
ImGui.GlyphRanges_Vietnamese
 
</syntaxhighlight>
 
 
 
=== ItemFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.ItemFlags_Disabled
 
ImGui.ItemFlags_ButtonRepeat
 
ImGui.ItemFlags_NoTabStop
 
</syntaxhighlight>
 
 
 
=== TableBgTarget ===
 
<syntaxhighlight lang="lua">
 
ImGui.TableBgTarget_None
 
ImGui.TableBgTarget_RowBg0
 
ImGui.TableBgTarget_RowBg1
 
ImGui.TableBgTarget_CellBg
 
</syntaxhighlight>
 
 
 
 
 
=== TableColumnFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.TableColumnFlags_None
 
ImGui.TableColumnFlags_DefaultHide
 
ImGui.TableColumnFlags_DefaultSort
 
ImGui.TableColumnFlags_WidthStretch
 
ImGui.TableColumnFlags_WidthFixed
 
ImGui.TableColumnFlags_NoResize
 
ImGui.TableColumnFlags_NoReorder
 
ImGui.TableColumnFlags_NoHide
 
ImGui.TableColumnFlags_NoClip
 
ImGui.TableColumnFlags_NoSort
 
ImGui.TableColumnFlags_NoSortAscending
 
ImGui.TableColumnFlags_NoSortDescending
 
ImGui.TableColumnFlags_NoHeaderWidth
 
ImGui.TableColumnFlags_PreferSortAscending
 
ImGui.TableColumnFlags_PreferSortDescending
 
ImGui.TableColumnFlags_IndentEnable
 
ImGui.TableColumnFlags_IndentDisable
 
ImGui.TableColumnFlags_IsEnabled
 
ImGui.TableColumnFlags_IsVisible
 
ImGui.TableColumnFlags_IsSorted
 
ImGui.TableColumnFlags_IsHovered
 
ImGui.TableColumnFlags_Disabled
 
ImGui.TableColumnFlags_NoHeaderLabel
 
</syntaxhighlight>
 
 
 
=== TableFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.TableFlags_None
 
ImGui.TableFlags_Resizable
 
ImGui.TableFlags_Reorderable
 
ImGui.TableFlags_Hideable
 
ImGui.TableFlags_Sortable
 
ImGui.TableFlags_NoSavedSettings
 
ImGui.TableFlags_ContextMenuInBody
 
ImGui.TableFlags_RowBg
 
ImGui.TableFlags_BordersInnerH
 
ImGui.TableFlags_BordersOuterH
 
ImGui.TableFlags_BordersInnerV
 
ImGui.TableFlags_BordersOuterV
 
ImGui.TableFlags_BordersH
 
ImGui.TableFlags_BordersV
 
ImGui.TableFlags_BordersInner
 
ImGui.TableFlags_BordersOuter
 
ImGui.TableFlags_Borders
 
ImGui.TableFlags_NoBordersInBody
 
ImGui.TableFlags_NoBordersInBodyUntilResize
 
ImGui.TableFlags_SizingFixedFit
 
ImGui.TableFlags_SizingFixedSame
 
ImGui.TableFlags_SizingStretchProp
 
ImGui.TableFlags_SizingStretchSame
 
ImGui.TableFlags_NoHostExtendX
 
ImGui.TableFlags_NoHostExtendY
 
ImGui.TableFlags_NoKeepColumnsVisible
 
ImGui.TableFlags_PreciseWidths
 
ImGui.TableFlags_NoClip
 
ImGui.TableFlags_PadOuterX
 
ImGui.TableFlags_NoPadOuterX
 
ImGui.TableFlags_NoPadInnerX
 
ImGui.TableFlags_ScrollX
 
ImGui.TableFlags_ScrollY
 
ImGui.TableFlags_SortMulti
 
ImGui.TableFlags_SortTristate
 
</syntaxhighlight>
 
 
 
=== TableColumnFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.TableColumnFlags_None
 
ImGui.TableColumnFlags_DefaultHide
 
ImGui.TableColumnFlags_DefaultSort
 
ImGui.TableColumnFlags_WidthStretch
 
ImGui.TableColumnFlags_WidthFixed
 
ImGui.TableColumnFlags_NoResize
 
ImGui.TableColumnFlags_NoReorder
 
ImGui.TableColumnFlags_NoHide
 
ImGui.TableColumnFlags_NoClip
 
ImGui.TableColumnFlags_NoSort
 
ImGui.TableColumnFlags_NoSortAscending
 
ImGui.TableColumnFlags_NoSortDescending
 
ImGui.TableColumnFlags_NoHeaderWidth
 
ImGui.TableColumnFlags_PreferSortAscending
 
ImGui.TableColumnFlags_PreferSortDescending
 
ImGui.TableColumnFlags_IndentEnable
 
ImGui.TableColumnFlags_IndentDisable
 
ImGui.TableColumnFlags_IsEnabled
 
ImGui.TableColumnFlags_IsVisible
 
ImGui.TableColumnFlags_IsSorted
 
ImGui.TableColumnFlags_IsHovered
 
</syntaxhighlight>
 
 
 
=== TableRowFlags ===
 
<syntaxhighlight lang="lua">
 
ImGui.TableRowFlags_None
 
ImGui.TableRowFlags_Headers
 
</syntaxhighlight>
 
 
 
=== SortDirection ===
 
<syntaxhighlight lang="lua">
 
ImGui.SortDirection_None
 
ImGui.SortDirection_Ascending
 
ImGui.SortDirection_Descending
 
</syntaxhighlight>
 
 
 
=== TE_ColorIndex ===
 
<syntaxhighlight lang="lua">
 
ImGui.TE_Default
 
ImGui.TE_Keyword
 
ImGui.TE_Number
 
ImGui.TE_String
 
ImGui.TE_CharLiteral
 
ImGui.TE_Punctuation
 
ImGui.TE_Preprocessor
 
ImGui.TE_Identifier
 
ImGui.TE_KnownIdentifier
 
ImGui.TE_PreprocIdentifier
 
ImGui.TE_Comment
 
ImGui.TE_MultiLineComment
 
ImGui.TE_Background
 
ImGui.TE_Cursor
 
ImGui.TE_Selection
 
ImGui.TE_ErrorMarker
 
ImGui.TE_Breakpoint
 
ImGui.TE_LineNumber
 
ImGui.TE_CurrentLineFill
 
ImGui.TE_CurrentLineFillInactive
 
ImGui.TE_CurrentLineEdge
 
</syntaxhighlight>
 
 
 
== ImageScaleMode ==
 
<syntaxhighlight lang="lua">
 
ImGui.ImageScaleMode_LetterBox
 
ImGui.ImageScaleMode_FitWidth
 
ImGui.ImageScaleMode_FitHeight
 
ImGui.ImageScaleMode_Stretch
 
</syntaxhighlight>
 
 
 
== DRAW LISTS ==
 
 
 
=== Window draw list ===
 
<syntaxhighlight lang="lua">
 
local list = ImGui:getWindowDrawList()
 
</syntaxhighlight>
 
 
 
'''Background draw list''':
 
<syntaxhighlight lang="lua">
 
local list = ImGui:getBackgroundDrawList()
 
</syntaxhighlight>
 
 
 
'''Foreground draw list''':
 
<syntaxhighlight lang="lua">
 
local list = ImGui:getForegroundDrawList()
 
</syntaxhighlight>
 
 
 
'''Draw lists commands''':
 
<syntaxhighlight lang="lua">
 
DrawList:pushClipRect(clip_rect_min_x, clip_rect_min_y, clip_rect_max_x, clip_rect_max_y [, intersect_with_current_clip_rect = false])
 
DrawList:pushClipRectFullScreen()
 
DrawList:popClipRect()
 
DrawList:pushTextureID(texture)
 
DrawList:popTextureID()
 
x, y = DrawList:getClipRectMin()
 
x, y = DrawList:getClipRectMax()
 
DrawList:addLine(p1_x, p1_y, p2_x, p2_y, color [, alpha = 1, thickness = 1])
 
DrawList:addRect(
 
p_min_x, p_min_y,
 
p_max_x, p_max_y,
 
color
 
[, alpha = 1,
 
rounding = 0, rounding_corners = ImGui.DrawFlags_RoundCornersAll,
 
thickness = 1])
 
DrawList:addRectFilled(p_min_x, p_min_y, p_max_x, p_max_y, color [, alpha = 1, rounding = 0, rounding_corners = ImGui.DrawFlags_RoundCornersAll])
 
DrawList:addRectFilledMultiColor(p_min_x, p_min_y, p_max_x, p_max_y, color_upr_left, color_upr_right, color_bot_right, color_bot_left)
 
DrawList:addQuad(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y, color [, alpha = 1, thickness = 1])
 
DrawList:addQuadFilled(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y, color)
 
DrawList:addTriangle(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, color [, alpha = 1, thickness = 1])
 
DrawList:addTriangleFilled(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, color)
 
DrawList:addCircle(center_x, center_y, radius, color [, alpha = 1, num_segments = 12, thickness = 1])
 
DrawList:addCircleFilled(center_x, center_y, radius, color [, alpha = 1, num_segments = 12])
 
DrawList:addNgon(center_x, center_y, radius, color [, alpha = 1, num_segments = 12, thickness = 1])
 
DrawList:addNgonFilled(center_x, center_y, radius, color [, alpha = 1, num_segments = 12])
 
DrawList:addText(x, y, color, alpha, text) -- x, y (number), text_begin (string), text_end (string)
 
DrawList:addFontText(font, font_size,
 
pos_x, pos_y,
 
color, alpha,
 
text
 
[, wrap_with = 0,
 
cpu_fine_clip_rect_x, cpu_fine_clip_rect_y,
 
cpu_fine_clip_rect_w, cpu_fine_clip_rect_h])
 
DrawList:addPolyline(points_table, color, alpha, closed, thickness) -- points_table (table), color (number), closed (bool), thickness (number)
 
DrawList:addConvexPolyFilled(points_table, color) -- points_table (table), color (number)
 
DrawList:addBezierCubic(
 
p1_x, p1_y,
 
p2_x, p2_y,
 
p3_x, p3_y,
 
p4_x, p4_y,
 
color, alpha, thickness [, num_segments = 0])
 
DrawList:addBezierQuadratic(
 
p1_x, p1_y,
 
p2_x, p2_y,
 
p3_x, p3_y,
 
color, alpha, thickness [, num_segments = 0])
 
DrawList:addImage(texture,
 
x, y,
 
x + w, y + h
 
[, tint_color = 0xffffff, tint_alpha = 1])
 
DrawList:addImageUV(texture,
 
x, y,
 
x + w, y + h,
 
uv0x, uv0y,
 
uv1x, uv1y
 
[, tint_color = 0xffffff, tint_alpha = 1])
 
DrawList:addImageQuad(texture,
 
x, y,
 
x + w, y,
 
x + w, y + h,
 
x, y + h
 
[, tint_color = 0xffffff, tint_alpha = 1,
 
uv0x = 0, uv0y = 0,
 
uv1x = 1, uv1y = 0,
 
uv2x = 1, uv2y = 1,
 
uv3x = 0, uv3y = 1])
 
DrawList:addImageRounded(texture,
 
x, y,
 
x + w,
 
y + h,
 
tint_color, tint_alpha, round_radius
 
[, corner_flags = ImGui.CorenerFlags_All])
 
DrawList:addImageRoundedUV(texture,
 
x, y,
 
x + w, y + h,
 
uv0x, uv0y,
 
uv1x, uv1y,
 
tint_color, tint_alpha, round_radius
 
[, corner_flags = ImGui.CorenerFlags_All])
 
DrawList:pathClear()
 
DrawList:pathLineTo(x, y)
 
DrawList:pathLineToMergeDuplicate(x, y)
 
DrawList:pathFillConvex(color)
 
DrawList:pathStroke(color, alpha, closed [, thickness = 1])
 
DrawList:pathArcTo(center_x, center_y, radius, a_min, a_max [, num_segments = 10])
 
DrawList:pathArcToFast(center_x, center_y, radius, a_min, a_max)
 
DrawList:pathBezierCubicCurveTo(p2x, p2y, p3x, p3y, p4x, p4y [, num_segments = 0])
 
DrawList:pathBezierQuadraticCurveTo(p2x, p2y, p3x, p3y [, num_segments = 0])
 
DrawList:pathRect(min_x, min_y, max_x, max_y [, rounding = 0, ImGui.DrawFlags = 0])
 
-- CUSTOM
 
-- rotate any draw list item around its center point
 
DrawList:rotateBegin()
 
DrawList:rotateEnd(radians)
 
-- example:
 
...
 
local list = ImGui:getWindowDrawList()
 
list:rotateBegin()
 
list:addLine(100, 100, 100, 250, 0xff0000, 1, 10)
 
list:rotateEnd(math.pi/2.2)
 
...
 
</syntaxhighlight>
 
 
 
'''Usage example''':
 
<img src="https://user-images.githubusercontent.com/1312968/99901217-4697fa80-2cb5-11eb-9e80-c469cc69b848.gif">
 
<syntaxhighlight lang="lua">
 
-- reference: https://github.com/ocornut/imgui/issues/3606#issuecomment-731726406
 
require "ImGui"
 
UI = ImGui.new()
 
IO = UI:getIO()
 
local w = 320
 
local h = 180
 
IO:setDisplaySize(w*2,h*2)
 
 
 
local cos,sin,sqrt=math.cos,math.sin,math.sqrt
 
local HSV2RGB=ImGui.colorConvertHSVtoRGB
 
local RGB2HEX=ImGui.colorConvertRGBtoHEX
 
local p = {-1,-1, 1,-1, 1,1, -1,1}
 
local function conv(z,szx,szy,ox,oy,vx,vy) return ((vx/z)*szx*5+szx*0.5)+ox,((vy/z)*szy*5+szy*0.5)+oy end
 
local function R(vx, vy, ng) ng*=0.1 local cosn = cos(ng) local sinn = sin(ng) return vx*cosn-vy*sinn, vx*sinn+vy*cosn end
 
local function FX(d,ax,ay,bx,by,sw,sh,t)
 
d:addRectFilled(ax,ay,bx,by,0,1,0)
 
t *= 4
 
for i = 0, 19 do
 
local z=21-i-(t-(t//1))*2
 
local ng,ot0,ot1=-t*2.1+z,-t+z*0.2,-t+(z+1)*0.2
 
local s,of,pts={cos((t+z)*0.1)*0.2+1,sin((t+z)*0.1)*0.2+1,cos((t+z+1)*0.1)*0.2+1,sin((t+z+1)*0.1)*0.2+1},{cos(ot0)*0.3,sin(ot0)*0.3,cos(ot1)*0.3,sin(ot1)*0.3},{}
 
for j=0,7 do
 
local i,n = ((j%4)+1)*2,j//4
 
pts[j*2+1],pts[j*2+2]=conv((z+n)*2,sw,sh,ax,ay,R(p[i-1]*s[n*2+1]+of[n*2+1],p[i-0]*s[n*2+2]+of[n*2+2],ng+n))
 
end
 
for j=0,3 do
 
local it=((((i&1) ~= 0) and 0.5 or 0.6)+j*0.05)*((21-z)/21)
 
d:addConvexPolyFilled(
 
{pts[j*2+1],pts[j*2+2],pts[((j+1)%4)*2+1],pts[((j+1)%4)*2+2],pts[(((j+1)%4)+4)*2+1],pts[(((j+1)%4)+4)*2+2],pts[(j+4)*2+1],pts[(j+4)*2+2]},
 
RGB2HEX(HSV2RGB(0.6+sin(t*0.03)*0.5,1,sqrt(it)))
 
)
 
end
 
end
 
end
 
 
 
function onEnterFrame(e)
 
UI:newFrame(e.deltaTime)
 
if (UI:beginWindow("FX", nil, ImGui.WindowFlags_AlwaysAutoResize)) then
 
UI:invisibleButton("canvas", w, h)
 
local min_x, min_y = UI:getItemRectMin()
 
local max_x, max_y = UI:getItemRectMax()
 
local draw_list = UI:getWindowDrawList()
 
draw_list:pushClipRect(min_x, min_y, max_x, max_y)
 
FX(draw_list,min_x,min_y,max_x,max_y,w,h,UI:getTime())
 
draw_list:popClipRect()
 
end
 
UI:endWindow()
 
UI:render()
 
UI:endFrame()
 
end
 
 
 
stage:addChild(UI)
 
stage:addEventListener("enterFrame", onEnterFrame)
 
</syntaxhighlight>
 
 
 
=== Classes ===
 
<div style="column-count:3;-moz-column-count:3;-webkit-column-count:3">
 
'''[[ImGui|ImGui.Core (ImGui)]]'''<br/><!--GIDEROSOBJ:ImGui-->
 
'''[[ImGui.DrawList]]'''<br/><!--GIDEROSOBJ:ImGui.DrawList-->
 
'''[[ImGui.Style]]'''<br/><!--GIDEROSOBJ:ImGui.Style-->
 
</div>
 
  
 
{{GIDEROS IMPORTANT LINKS}}
 
{{GIDEROS IMPORTANT LINKS}}

Revision as of 18:39, 2 October 2024

Supported platforms: Platform android.pngPlatform ios.pngPlatform mac.pngPlatform pc.pngPlatform html5.pngPlatform winrt.pngPlatform win32.png
Available since: Gideros 2020.9

Description

This is an implementation of the Dear ImGui library: https://github.com/ocornut/imgui.

To use Dear ImGui in your project you need to add the ImGui plugin and call require like so:

require "ImGui"

Current Gideros Dear ImGui version: 1.89.6.

See full introduction documentation here: https://pixtur.github.io/mkdocs-for-imgui/site/
and the full Dear ImGui demo here: https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html

Dear ImGui

Dear ImGui is a bloat-free graphical user interface library for C++. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline-enabled application. It is fast, portable, renderer agnostic, and self-contained (no external dependencies).

Dear ImGui is designed to enable fast iterations and to empower programmers to create content creation tools and visualization / debug tools (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal and lacks certain features commonly found in more high-level libraries. Among other things, full internationalization (right-to-left text, bidirectional text, text shaping etc.) and accessibility features are not supported.

Dear ImGui is particularly suited to integration in game engines (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on console platforms where operating system features are non-standard.

Code sample (Lua):

imgui:text("Hello World!")
if imgui:button("button 01", 64, 16) then
	print("button 01 clicked")
end
text, isChanged = imgui:inputText("text", text, 128, 0)
value, isChanged = imgui:sliderFloat("slider", value, 0, 30, "%.3f", 0)

License

Dear ImGui is licensed under the MIT License, see https://github.com/ocornut/imgui/blob/master/LICENSE.txt for more information.

Widgets

Widgets: Color Editor/Picker
* tip: the ColorEdit* functions have a little color square that can be left-clicked to open a picker, and right-clicked to open an option menu
Widgets: Input with Keyboard
* If you want to use InputText() with std::string or any custom dynamic string type, see misc/cpp/imgui_stdlib.h and comments in imgui_demo.cpp.
* Most of the ImGuiInputTextFlags flags are only useful for InputText() and not for InputFloatX, InputIntX, InputDouble etc.
Widgets: Regular Sliders
* CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped and can go off-bounds.
* Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
* Format string may also be set to NULL or use the default format ("%f" or "%d").

If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361
Widgets: Drag Sliders
* CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped and can go off-bounds.
* For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x
* Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
* Format string may also be set to NULL or use the default format ("%f" or "%d").
* Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision).
* Use v_min < v_max to clamp edits to given limits. Note that CTRL+Click manual input can override those limits.
* Use v_max = FLT_MAX / INT_MAX etc to avoid clamping to a maximum, same with v_min = -FLT_MAX / INT_MIN to avoid clamping to a minimum.
* We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them.