Difference between revisions of "Dear ImGui API"

From GiderosMobile
(Created page with "__TOC__ (copied from @'''rrraptor''''s GitHub '''https://github.com/MultiPain/Gideros_ImGui''') = Dear ImGui LUA binding for Gideros Mobile = == Constructor == <syntaxhighli...")
 
 
(50 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
__TOC__
 
__TOC__
(copied from @'''rrraptor''''s GitHub '''https://github.com/MultiPain/Gideros_ImGui''')
+
'''Dear ImGui LUA binding for Gideros Mobile'''
  
= Dear ImGui LUA binding for Gideros Mobile =
+
GitHub '''https://github.com/MultiPain/Gideros_ImGui'''
  
 
== Constructor ==
 
== Constructor ==
Line 13: Line 13:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== EXPERIMENTAL ==
+
== IO Functions ==
 +
'''GetIO'''() access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags)
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
p_open = ImGui:showLog(title, p_open [, ImGui.WindowFlags = 0]) -- draw log window
+
local IO = ImGui:getIO()
ImGui:writeLog(text)
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Gestures (touch only, turned OFF by default) ''WIP'':
+
'''Functions''':
* tap gesture (Left Mouse Button)
+
Settings/.Ini Utilities
* hold gesture (Right Mouse Button)
+
* The disk functions are automatically called if io.IniFilename != NULL (default is "imgui.ini").
<syntaxhighlight lang="lua">
+
* Set io.IniFilename to NULL to load/save manually. Read io.WantSaveIniSettings description about handling .ini saving manually.
ImGui:setTouchGesturesEnabled(bool)
 
bool = ImGui:isTouchGesturesEnabled()
 
</syntaxhighlight>
 
  
== FONTS ==
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
IO = imgui:getIO()
+
IO:setFontDefault(font)
FontAtlas = IO:getFonts()
+
ImGuiConfigFlag = IO:getConfigFlags()
 
+
IO:setConfigFlags(ImGui.ConfigFlag)
Font = FontAtlas:addFont(ttf_font_path, font_size [, options])
+
IO:addConfigFlags(ImGui.ConfigFlag)
 
+
ImGuiBackendFlag = IO:getBackendFlags()
-- options (table): all parameters are optional
+
IO:setBackendFlags(ImGui.BackendFlag)
--     fontDataOwnedByAtlas - bool
+
number = IO:getIniSavingRate()
--     pixelSnapH - bool
+
IO:setIniSavingRate(number)
--     mergeMode - bool
+
string = IO:getIniFilename()
--     fontNo - number
+
IO:setIniFilename(string)
--     oversampleH - number
+
IO:saveIniSettings([path]) -- if path is not defined the it uses default path, which is set by IO:setIniFilename()
--     oversampleV - number
+
IO:loadIniSettings([path])
--     glyphExtraSpacingX - number
+
string = IO:getLogFilename()
--     glyphExtraSpacingY - number
+
IO:setLogFilename(string)
--     glyphOffsetX - number
+
number = IO:getMouseDoubleClickTime()
--     glyphOffsetY - number
+
IO:setMouseDoubleClickTime(number)
--     glyphMinAdvanceX - number
+
number = IO:getMouseDragThreshold()
--     glyphMaxAdvanceX - number
+
IO:setMouseDragThreshold(number)
--     rasterizerFlags - number
+
flag = IO:getMouseDrawCursor()
--     rasterizerMultiply - number
+
IO:setMouseDrawCursor(flag)
--
+
number = IO:getMouseDoubleClickMaxDist()
--     glyphs - table:
+
IO:setMouseDoubleClickMaxDist(number)
--     text(string): represents available chars
+
number = IO:getKeyRepeatDelay()
--     chars(table): list of specific char code (example: {0x7262, ...})
+
IO:setKeyRepeatDelay(number)
--     ranges(table): predefined glyph ranges (example: {ImGui.GlyphRanges_Default, ImGui.GlyphRanges_Japanese, ...})
+
number = IO:getKeyRepeatRate()
FontAtlas:addFonts(fontsDescription)
+
IO:setKeyRepeatRate(number)
-- fontsDescriptions(table):
+
number = IO:getFontGlobalScale()
--      description(table):
+
IO:setFontGlobalScale(number)
--          ttf_font_path(string): path to a font
+
bool = IO:getFontAllowUserScaling()
--          font_size(number): font size
+
IO:setFontAllowUserScaling(bool)
--          options(table): see description above
+
number, number = IO:getDisplayFramebufferScale()
-- example:
+
IO:setDisplayFramebufferScale(number, number)
-- FontAtlas:addFonts{ {"fonts/DroidSans.ttf", 16}, {"fonts/ProggyTiny.ttf", 16} }
+
bool = IO:getConfigMacOSXBehaviors()
 
+
IO:setConfigMacOSXBehaviors(bool)
Font = FontAtlas:getFont([index]) -- get font by index (if index is 0 or nil you will get default font instance)
+
bool = IO:getConfigInputTextCursorBlink()
FontAtlas:build() -- call after multiple FontAtlas:addFont(...) calls to update ImGui font atlas
+
IO:setConfigInputTextCursorBlink(bool)
FontAtlas:clearInputData()
+
bool = IO:getConfigWindowsResizeFromEdges()
FontAtlas:clearTexData()
+
IO:setConfigWindowsResizeFromEdges(bool)
FontAtlas:clearFonts()
+
bool = IO:getConfigWindowsMoveFromTitleBarOnly()
FontAtlas:clear()
+
IO:setConfigWindowsMoveFromTitleBarOnly(bool)
table = FontAtlas:getFonts() -- returns a table with all fonts (included default)
+
number = IO:getConfigWindowsMemoryCompactTimer()
flag = FontAtlas:isBuilt()
+
IO:setConfigWindowsMemoryCompactTimer(number)
number = FontAtlas:addCustomRectRegular(width, height)
+
string = IO:getBackendPlatformName()
number = FontAtlas:addCustomRectFontGlyph(font, id, width, height, advance_x [, offset_x, offset_y])
+
string = IO:getBackendRendererName()
w, h, x, y, glyph_id, offset_x, offset_y, font, is_packed_flag = FontAtlas:getCustomRectByIndex(index)
+
bool = IO:IsMouseDown(button)
 
+
number = IO:getMouseWheel()
ImGui:pushFont(font) -- font (table): object returned by FontAtlas:addFont(...) or FontAtlas:getFont([index])
+
number = IO:getMouseWheelH()
ImGui:popFont()
+
flag = IO:wantCaptureMouse()
</syntaxhighlight>
+
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
  
'''Minimal example''':
+
-- "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>
 +
 
 +
== Style setters/getters ==
 +
'''GetStyle'''() instance access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame!
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
local UI = ImGui.new()
+
local Style = ImGui:getStyle()
local IO = UI:getIO()
+
</syntaxhighlight>
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
+
'''Setters/getters''':
function enterFrame(e)
+
<syntaxhighlight lang="lua">
UI:newFrame(e.deltaTime)
+
Style:setColor(ImGui.Col, color, alpha)
+
color, alpha = Style:getColor(ImGui.Col)
UI:pushFont(font1)
+
Style:setAlpha(value)
UI:text("Font1")
+
value = Style:getAlpha()
UI:popFont()
 
 
UI:pushFont(font2)
 
UI:text("Font2")
 
UI:popFont()
 
 
UI:render()
 
UI:endFrame()
 
end
 
</syntaxhighlight>
 
  
'''Glyphs example''':
+
Style:setWindowRounding(value)
<syntaxhighlight lang="lua">
+
value = Style:getWindowRounding()
local fonts = io:getFonts()
+
Style:setWindowBorderSize(value)
fonts:addFont(font_path, font_size, {
+
value = Style:getWindowBorderSize()
glyphs = {
+
Style:setChildRounding(value)
ranges = {
+
value = Style:getChildRounding()
{
+
Style:setChildBorderSize(value)
0x2590,0x2593, -- range1
+
value = Style:getChildBorderSize()
0x2660,0x266B  -- range2
+
Style:setPopupRounding(value)
-- ...
+
value = Style:getPopupRounding()
},
+
Style:setPopupBorderSize(value)
ImGui.GlyphRanges_Cyrillic,
+
value = Style:getPopupBorderSize()
{
+
Style:setFrameRounding(value)
0x01C0, 0x01C3 -- range3
+
value = Style:getFrameRounding()
},
+
Style:setFrameBorderSize(value)
ImGui.GlyphRanges_Korean
+
value = Style:getFrameBorderSize()
},
+
Style:setIndentSpacing(value)
+
value = Style:getIndentSpacing()
-- same structure:
+
Style:setColumnsMinSpacing(value)
ranges = {
+
value = Style:getColumnsMinSpacing()
{
+
Style:setScrollbarSize(value)
0x2590,0x2593, -- range1
+
value = Style:getScrollbarSize()
0x2660,0x266B, -- range2
+
Style:setScrollbarRounding(value)
0x01C0,0x01C3  -- range3
+
value = Style:getScrollbarRounding()
-- ...
+
Style:setGrabMinSize(value)
},
+
value = Style:getGrabMinSize()
ImGui.GlyphRanges_Cyrillic,
+
Style:setGrabRounding(value)
ImGui.GlyphRanges_Korean
+
value = Style:getGrabRounding()
}
+
Style:setLogSliderDeadzone(value)
},
+
value = Style:getLogSliderDeadzone()
mergeMode = true, -- merge into previous font
+
Style:setTabRounding(value)
})
+
value = Style:getTabRounding()
fonts:build()
+
Style:setTabBorderSize(value)
</syntaxhighlight>
+
value = Style:getTabBorderSize()
 
+
Style:setTabMinWidthForCloseButton(value)
'''Icons example''':
+
value = Style:getTabMinWidthForCloseButton()
<syntaxhighlight lang="lua">
+
Style:setMouseCursorScale(value)
local icon = utf8.char(0x2590)
+
value = Style:getMouseCursorScale()
ImGui:text("My icon >>" .. icon .. " << !!!")
+
Style:setCurveTessellationTol(value)
 
+
value = Style:getCurveTessellationTol()
-- or with new Luau support:
+
Style:setCircleSegmentMaxError(value)
ImGui:text("My icon >> \u{2590} << !!!")
+
value = Style:getCircleSegmentMaxError()
-- can be also stored in memory:
+
Style:setWindowPadding(x, y)
local icon = "\u{2590}"
+
x, y = Style:getWindowPadding()
</syntaxhighlight>
+
Style:setWindowMinSize(x, y)
 
+
x, y = Style:getWindowMinSize()
== Font ==
+
Style:setWindowTitleAlign(x, y)
<syntaxhighlight lang="lua">
+
x, y = Style:getWindowTitleAlign()
number = Font:getSize()
+
Style:setFramePadding(x, y)
FontAtlas = Font:getContainerAtlas()
+
x, y = Style:getFramePadding()
Font:setScale(number)
+
Style:setCellPadding(x, y)
number = Font:getScale()
+
x, y = Style:getCellPadding()
number = Font:getAscent()
+
Style:setItemSpacing(x, y)
number = Font:getDescent()
+
x, y = Style:getItemSpacing()
boo = Font:isLoaded()
+
Style:setItemInnerSpacing(x, y)
string = Font:getDebugName()
+
x, y = Style:getItemInnerSpacing()
w, h = Font:calcTextSizeA(size, max_width, wrap_width, string)
+
Style:setTouchExtraPadding(x, y)
Font:calcWordWrapPositionA(scale, string, wrap_width) -- not tested
+
x, y = Style:getTouchExtraPadding()
</syntaxhighlight>
+
Style:setButtonTextAlign(x, y)
 
+
x, y = Style:getButtonTextAlign()
== INPUTS ==
+
Style:setSelectableTextAlign(x, y)
<syntaxhighlight lang="lua">
+
x, y = Style:getSelectableTextAlign()
ImGui:onMouseHover(event)
+
Style:setDisplayWindowPadding(x, y)
ImGui:onMouseMove(event)
+
x, y = Style:getDisplayWindowPadding()
ImGui:onMouseDown(event)
+
Style:setDisplaySafeAreaPadding(x, y)
ImGui:onMouseUp(event)
+
x, y = Style:getDisplaySafeAreaPadding()
ImGui:onMouseWheel(event)
+
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>
  
ImGui:onTouchMove(event)
+
=== DEFAULT STYLES ===
ImGui:onTouchBegin(event)
+
<syntaxhighlight lang="lua">
ImGui:onTouchEnd(event)
+
ImGui:setDarkStyle()
ImGui:onTouchCancel(event)
+
ImGui:setLightStyle()
 +
ImGui:setClassicStyle()
 +
</syntaxhighlight>
 +
 
 +
== Render ==
 +
'''NewFrame'''() start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame().
  
ImGui:onKeyUp(event)
+
'''EndFrame'''() ends the Dear ImGui frame. Automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all!
ImGui:onKeyDown(event)
 
ImGui:onKeyChar(event)
 
</syntaxhighlight>
 
  
'''Usage examples''':
+
'''Render'''() ends the Dear ImGui frame, finalize the draw data.
<syntaxhighlight lang="lua">
 
local UI = ImGui.new(nil, false, false, false)
 
</syntaxhighlight>
 
  
'''Mouse'''
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
stage:addEventListener("mouseHover", function(e) UI:onMouseHover(e) end)
+
ImGui:newFrame(deltaTime)
stage:addEventListener("mouseMove", function(e) UI:onMouseMove(e) end)
+
ImGui:render()
stage:addEventListener("mouseDown", function(e) UI:onMouseDown(e) end)
+
ImGui:endFrame()
stage:addEventListener("mouseUp", function(e) UI:onMouseUp(e) end)
 
stage:addEventListener("mouseWheel", function(e) UI:onMouseWheel(e) end)
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Touch'''
+
=== Demos ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
stage:addEventListener("touchesCancel", function(e) ui:onTouchCancel(e) end)
+
is_openFlag = ImGui:showUserGuide()
stage:addEventListener("touchesMove", function(e) ui:onTouchMove(e) end)
+
is_openFlag = ImGui:showDemoWindow([p_open])
stage:addEventListener("touchesBegin", function(e) ui:onTouchBegin(e) end)
+
is_openFlag = ImGui:showAboutWindow([p_open])
stage:addEventListener("touchesEnd", function(e) ui:onTouchEnd(e) end)
+
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>
 
</syntaxhighlight>
  
'''Keyboard'''
+
== Windows ==
 +
* Begin() = push window to the stack and start appending to it. End() = pop window from the stack.
 +
* You may append multiple times to the same window during the same frame.
 +
* Passing bool* p_open != NULL shows a window-closing widget in the upper-right corner of the window, which clicking will set the boolean to false when clicked.
 +
* Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. Always call a matching End() for each Begin() call, regardless of its return value! [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu / EndMenu, BeginPopup / EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
 +
* Note that the bottom of window stack always contains a window called "Debug".
 +
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
stage:addEventListener("keyUp", function(e) UI:onKeyUp(e) end)
+
p_open, draw = ImGui:beginWindow(label, p_open [, ImGui.WindowFlags = 0])
stage:addEventListener("keyDown", function(e) UI:onKeyDown(e) end)
+
-- do not show "X" button
stage:addEventListener("keyChar", function(e) UI:onKeyChar(e) end)
+
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>
 
</syntaxhighlight>
  
== Style setters/getters ==
+
=== Child Windows ===
Get style settings instance:
+
Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child. For each independent axis of size:
 +
* == 0.0f -> use remaining host window size
 +
* > 0.0f -> fixed size
 +
* < 0.0f -> use remaining window size minus abs(size) Each axis can use a different mode, e.g. ImVec2(0,400). BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window.
 +
 
 +
'''Tip'''
 +
Always call a matching EndChild() for each BeginChild() call, regardless of its return value [as with Begin: this is due to legacy reason and inconsistent with most BeginXXX functions apart from the regular Begin() which behaves like BeginChild().]
 +
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
local Style = ImGui:getStyle()
+
ImGui:beginChild(id [, w = 0, h = 0, borderFlag = false, ImGui.WindowFlags = 0])
 +
ImGui:endChild()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Setters/getters''':
+
=== Windows Utilities ===
 +
* Current window = the window we are appending into while inside a Begin() / End() block.
 +
* Next window = next window we will Begin() into.
 +
 
 +
* Prefer using SetNextXXX functions (before Begin) rather than SetXXX functions (after Begin()).
 +
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
Style:setColor(ImGui.Col, color, alpha)
+
flag = ImGui:isWindowAppearing()
color, alpha = Style:getColor(ImGui.Col)
+
flag = ImGui:isWindowCollapsed()
Style:setAlpha(value)
+
flag = ImGui:isWindowFocused([ImGui.FocusedFlags = 0])
value = Style:getAlpha()
+
flag = ImGui:isWindowHovered([ImGui.HoveredFlags = 0])
Style:setWindowRounding(value)
+
x, y = ImGui:getWindowPos()
value = Style:getWindowRounding()
+
w, h = ImGui:getWindowSize()
Style:setWindowBorderSize(value)
+
w = ImGui:getWindowWidth()
value = Style:getWindowBorderSize()
+
h = ImGui:getWindowHeight()
Style:setChildRounding(value)
+
x1,y1, x2,y2 = ImGui:getWindowBounds() -- returns window region rectangle in global coordinates
value = Style:getChildRounding()
+
 
Style:setChildBorderSize(value)
+
ImGui:setNextWindowPos(x, y [, ImGui.Cond = 0, pivotX = 0, pivotY = 0])
value = Style:getChildBorderSize()
+
ImGui:setNextWindowSize(w, h [, ImGui.Cond = 0])
Style:setPopupRounding(value)
+
ImGui:setNextWindowContentSize(w, h)
value = Style:getPopupRounding()
+
ImGui:setNextWindowCollapsed(flag [, ImGui.Cond = 0])
Style:setPopupBorderSize(value)
+
ImGui:setNextWindowFocus()
value = Style:getPopupBorderSize()
+
ImGui:setNextWindowBgAlpha(alpha)
Style:setFrameRounding(value)
+
ImGui:setNextWindowScroll(x, y)
value = Style:getFrameRounding()
+
ImGui:setWindowPos(name, x, y [, ImGui.Cond = 0]) OR ImGui:setWindowPos(x, y [, ImGui.Cond = 0])
Style:setFrameBorderSize(value)
+
ImGui:setWindowSize(name, w, h [, ImGui.Cond = 0]) OR ImGui:setWindowSize(w, h [, ImGui.Cond = 0])
value = Style:getFrameBorderSize()
+
ImGui:setWindowCollapsed(name, flag [, ImGui.Cond = 0]) OR ImGui:setWindowCollapsed(flag [, ImGui.Cond = 0])
Style:setIndentSpacing(value)
+
ImGui:setWindowFocus(name) OR ImGui:setWindowFocus()
value = Style:getIndentSpacing()
+
ImGui:setWindowFontScale(scale)
Style:setColumnsMinSpacing(value)
+
-- scroll window when touching void
value = Style:getColumnsMinSpacing()
+
ImGui:scrollWhenDragging(x, y)
Style:setScrollbarSize(value)
+
</syntaxhighlight>
value = Style:getScrollbarSize()
+
 
Style:setScrollbarRounding(value)
+
=== Window size constraints ===
value = Style:getScrollbarRounding()
+
Can be used to set minimum and maximum window size, plus contraint the size if needed.
Style:setGrabMinSize(value)
+
<syntaxhighlight lang="lua">
value = Style:getGrabMinSize()
+
-- call this function before ImGui:beginWindow()
Style:setGrabRounding(value)
+
ImGui:setNextWindowSizeConstraints(min_w, min_h, max_w, max_h [, resize_callback, user_data]))
value = Style:getGrabRounding()
+
-- resizeCallback is a function:
Style:setLogSliderDeadzone(value)
+
function (callbackData [, user_data])
value = Style:getLogSliderDeadzone()
+
-- do some math, and return desired size
Style:setTabRounding(value)
+
-- ...
value = Style:getTabRounding()
+
return desired_width, desired_height
Style:setTabBorderSize(value)
+
end
value = Style:getTabBorderSize()
+
</syntaxhighlight>
Style:setTabMinWidthForCloseButton(value)
+
 
value = Style:getTabMinWidthForCloseButton()
+
'''Resize callback''':
Style:setMouseCursorScale(value)
+
<syntaxhighlight lang="lua">
value = Style:getMouseCursorScale()
+
-- get window position
Style:setCurveTessellationTol(value)
+
x, y = callbackData:getPos()
value = Style:getCurveTessellationTol()
+
x = callbackData:getX()
Style:setCircleSegmentMaxError(value)
+
y = callbackData:getY()
value = Style:getCircleSegmentMaxError()
+
 
Style:setWindowPadding(x, y)
+
-- get currrent size
x, y = Style:getWindowPadding()
+
current_width, current_height = callbackData:getCurrentSize()
Style:setWindowMinSize(x, y)
+
current_width = callbackData:getCurrentWidth()
x, y = Style:getWindowMinSize()
+
current_height = callbackData:getCurrentHeight()
Style:setWindowTitleAlign(x, y)
+
 
x, y = Style:getWindowTitleAlign()
+
-- get desired size
Style:setFramePadding(x, y)
+
desired_width, desired_height = callbackData:getDesiredSize()
x, y = Style:getFramePadding()
+
desired_width = callbackData:getDesiredWidth()
Style:setCellPadding(x, y)
+
desired_height = callbackData:getDesiredHeight()
x, y = Style:getCellPadding()
+
</syntaxhighlight>
Style:setItemSpacing(x, y)
+
 
x, y = Style:getItemSpacing()
+
'''Example''':
Style:setItemInnerSpacing(x, y)
+
<syntaxhighlight lang="lua">
x, y = Style:getItemInnerSpacing()
+
require "ImGui"
Style:setTouchExtraPadding(x, y)
+
 
x, y = Style:getTouchExtraPadding()
+
local function stepSize(callback_data, step)
Style:setButtonTextAlign(x, y)
+
local w, h = callback_data:getDesiredSize()
x, y = Style:getButtonTextAlign()
+
w = (w // step) * step
Style:setSelectableTextAlign(x, y)
+
h = (h // step) * step
x, y = Style:getSelectableTextAlign()
+
return w, h
Style:setDisplayWindowPadding(x, y)
+
end
x, y = Style:getDisplayWindowPadding()
+
 
Style:setDisplaySafeAreaPadding(x, y)
+
local ui = ImGui.new()
x, y = Style:getDisplaySafeAreaPadding()
+
stage:addChild(ui)
Style:setWindowMenuButtonPosition(ImGui.Dir)
+
 
dir = Style:getWindowMenuButtonPosition()
+
stage:addEventListener("enterFrame", function(e)
Style:setColorButtonPosition(ImGui.Dir)
+
ui:newFrame(e.deltaTime)
dir = Style:getColorButtonPosition()
+
Style:setAntiAliasedLines(flag)
+
-- window size step is 32 (last argument, that is passed to the callback as second argument)
flag = Style:getAntiAliasedLines()
+
ui:setNextWindowSizeConstraints(200, 200, 400, 400, stepSize, 32)
Style:setAntiAliasedLinesUseTex(flag)
+
if (ui:beginWindow("My window")) then
flag = Style:getAntiAliasedLinesUseTex()
+
Style:setAntiAliasedFill(flag)
+
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.")
flag = Style:getAntiAliasedFill()
+
end
Style:setDisabledAlpha(number)
+
ui:endWindow()
alpha = Style:getDisabledAlpha()
+
Style:setSeparatorTextBorderSize(number)
+
ui:showDemoWindow()
number = Style:getSeparatorTextBorderSize()
+
Style:setSeparatorTextAlign(x, y)
+
ui:render()
x, y = Style:getSeparatorTextAlign()
+
ui:endFrame()
Style:setSeparatorTextPadding(x, y)
+
end)
x, y = Style:getSeparatorTextPadding()
+
</syntaxhighlight>
 +
 
 +
=== Content region ===
 +
* Those functions are bound to be redesigned soon (they are confusing, incomplete and return values in local window coordinates which increases confusion)
 +
 
 +
<syntaxhighlight lang="lua">
 +
scaleX, scaleY = ImGui:getContentRegionMax()
 +
w, h = ImGui:getContentRegionAvail()
 +
x, y = ImGui:getWindowContentRegionMin()
 +
x, y = ImGui:getWindowContentRegionMax()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== DEFAULT STYLES ==
+
=== Windows Scrolling ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:setDarkStyle()
+
x = ImGui:getScrollX()
ImGui:setLightStyle()
+
y = ImGui:getScrollY()
ImGui:setClassicStyle()
+
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>
 
</syntaxhighlight>
  
== Color convert ==
+
== Parameters stacks (shared) ==
'''Note''': use ''DOT'' instead of ''COLON'', so you can use it without creating an ImGui object
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
r, g, b, a = ImGui.colorConvertHEXtoRGB(color [, alpha = 1])
+
ImGui:pushStyleColor(ImGui.Col, color, alpha)
hex = ImGui.colorConvertRGBtoHEX(r, g, b)
+
ImGui:popStyleColor([count = 1])
h, s, v = ImGui.colorConvertRGBtoHSV(r, g, b)
+
ImGui:pushStyleVar(ImGui.StyleVar, value) OR ImGui:pushStyleVar(ImGui.StyleVar, value1, value2)
r, g, b = ImGui.colorConvertHSVtoRGB(h, s, v)
+
ImGui:popStyleVar([count = 1])
h, s, v = ImGui.colorConvertHEXtoHSV(hex)
+
color, alpha = ImGui:getStyleColor(ImGui.Col)
hex = ImGui.colorConvertHSVtoHEX(h, s, v)
+
fontSize = ImGui:getFontSize()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== IO Functions ==
+
=== Parameters stacks (current window) ===
Get IO instance:
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
local IO = ImGui:getIO()
+
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>
 
</syntaxhighlight>
  
'''Functions''':
+
== Cursor / Layout ==
 +
* By "cursor" we mean the current output position.
 +
* The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down.
 +
* You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceeding widget.
 +
* '''Attention'''! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API: Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions.
 +
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
IO:setFontDefault(font)
+
ImGui:separator()
ImGuiConfigFlag = IO:getConfigFlags()
+
ImGui:sameLine([offset_x = 0, spacing = -1])
IO:setConfigFlags(ImGui.ConfigFlag)
+
ImGui:newLine()
IO:addConfigFlags(ImGui.ConfigFlag)
+
ImGui:spacing()
ImGuiBackendFlag = IO:getBackendFlags()
+
ImGui:dummy(w, h)
IO:setBackendFlags(ImGui.BackendFlag)
+
ImGui:indent([indent = 0])
number = IO:getIniSavingRate()
+
ImGui:unindent([indent = 0])
IO:setIniSavingRate(number)
+
ImGui:beginGroup()
string = IO:getIniFilename()
+
ImGui:endGroup()
IO:setIniFilename(string)
+
IO:saveIniSettings([path]) -- if path is not defined the it uses default path, which is set by IO:setIniFilename()
+
x, y = ImGui:getCursorPos()
IO:loadIniSettings([path])
+
x = ImGui:getCursorPosX()
string = IO:getLogFilename()
+
y = ImGui:getCursorPosY()
IO:setLogFilename(string)
+
ImGui:setCursorPos(local_x, local_y)
number = IO:getMouseDoubleClickTime()
+
ImGui:setCursorPosX(local_x)
IO:setMouseDoubleClickTime(number)
+
ImGui:setCursorPosY(local_y)
number = IO:getMouseDragThreshold()
+
x, y = ImGui:getCursorStartPos()
IO:setMouseDragThreshold(number)
+
x, y = ImGui:getCursorScreenPos()
flag = IO:getMouseDrawCursor()
+
ImGui:setCursorScreenPos(x, y)
IO:setMouseDrawCursor(flag)
+
ImGui:alignTextToFramePadding()
number = IO:getMouseDoubleClickMaxDist()
+
lineH = ImGui:getTextLineHeight()
IO:setMouseDoubleClickMaxDist(number)
+
lineH = ImGui:getTextLineHeightWithSpacing()
number = IO:getKeyRepeatDelay()
+
frameH = ImGui:getFrameHeight()
IO:setKeyRepeatDelay(number)
+
frameH = ImGui:getFrameHeightWithSpacing()
number = IO:getKeyRepeatRate()
+
</syntaxhighlight>
IO:setKeyRepeatRate(number)
+
 
number = IO:getFontGlobalScale()
+
== ID stack/scopes ==
IO:setFontGlobalScale(number)
+
* Read the FAQ for more details about how ID are handled in Dear Imgui. If you are creating widgets in a loop you most likely want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them.
bool = IO:getFontAllowUserScaling()
+
* The resulting ID are hashes of the entire stack.
IO:setFontAllowUserScaling(bool)
+
* You can also use the "Label##foobar" syntax within widget label to distinguish them from each others.
number, number = IO:getDisplayFramebufferScale()
+
* In this header file we use the "label"/"name" terminology to denote a string that will be displayed and used as an ID, whereas "str_id" denote a string that is only used as an ID and not normally displayed.
IO:setDisplayFramebufferScale(number, number)
+
 
bool = IO:getConfigMacOSXBehaviors()
+
<syntaxhighlight lang="lua">
IO:setConfigMacOSXBehaviors(bool)
+
ImGui:pushID(anyValue)  
bool = IO:getConfigInputTextCursorBlink()
+
ImGui:pushID(str)
IO:setConfigInputTextCursorBlink(bool)
+
ImGui:popID()
bool = IO:getConfigWindowsResizeFromEdges()
+
number = ImGui:getID(anyValue)
IO:setConfigWindowsResizeFromEdges(bool)
+
number = ImGui:getID(str)
bool = IO:getConfigWindowsMoveFromTitleBarOnly()
+
number = ImGui:getItemID()
IO:setConfigWindowsMoveFromTitleBarOnly(bool)
+
</syntaxhighlight>
number = IO:getConfigWindowsMemoryCompactTimer()
+
 
IO:setConfigWindowsMemoryCompactTimer(number)
+
== WIDGETS ==
string = IO:getBackendPlatformName()
+
=== Widgets: Text ===
string = IO:getBackendRendererName()
+
<syntaxhighlight lang="lua">
bool = IO:IsMouseDown(button)
+
ImGui:textUnformatted(text [, textEnd])
number = IO:getMouseWheel()
+
ImGui:text(text)
number = IO:getMouseWheelH()
+
ImGui:textColored(text, color, alpha)
flag = IO:wantCaptureMouse()
+
ImGui:textDisabled(text)
flag = IO:wantCaptureKeyboard()
+
ImGui:textWrapped(text)
flag = IO:wantTextInput()
+
ImGui:labelText(text, label)
flag = IO:wantSetMousePos()
+
ImGui:bulletText(text)
flag = IO:wantSaveIniSettings()
+
ImGui:separatorText(label)
number = IO:getFramerate()
+
</syntaxhighlight>
number = IO:getMetricsRenderVertices()
+
 
number = IO:getMetricsRenderIndices()
+
=== Widgets: Main ===
number = IO:getMetricsRenderWindows()
+
<syntaxhighlight lang="lua">
number = IO:getMetricsActiveWindows()
+
flag = ImGui:button(text [, w = 0, h = 0])
number = IO:getMetricsActiveAllocations()
+
flag = ImGui:smallButton(text)
x, y = IO:getMouseDelta()
+
flag = ImGui:invisibleButton(string_ID [, w = 0, h = 0])
number = IO:getMouseDownSec(mouse_button)
+
flag = ImGui:arrowButton(string_ID [, ImGui.Dir = 0])
IO:setDisplaySize(w, h)
+
flag = ImGui:checkbox(text, flag)
w, h = IO:getDisplaySize()
+
flags, is_changed = ImGui:checkboxFlags(label [, flags = 0, flags_value = 0])
number = IO:getDeltaTime()
+
number, is_changed = ImGui:radioButton(text, number, number)
-- reset mouse buttons state
+
is_changed = ImGui:radioButton(text, flag)
IO:resetMouseDown()
+
ImGui:progressBar(fraction [, anchor_x = -1, anchor_y = 0, overlay_string = nil])
-- reset key states (including ALT/SHIFT/CTRL/SUPER (META))
+
ImGui:bullet()
IO:resetKeysDown()
+
</syntaxhighlight>
-- set ALT/SHIFT/CTRL/SUPER (META) key state
+
 
IO:setModKeyDown(key_code, bool) -- "key_code" is a gideros MOD key
+
=== Widgets: Images ===
-- set any key state
+
<syntaxhighlight lang="lua">
IO:setKeysDown(key_code, bool) -- "key_code" is a gideros regular "keyCode"
+
-- Images are streched (ImGui default functions)
-- adds text to active text input widget
+
ImGui:image(texture, w, h
IO:addInputCharactersUTF8(text)
+
[, tint_color = 0xffffff, tint_alpha = 1,
-- emulate wheel scrolling
+
border_color = 0xffffff, border_alpha = 0])
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))
+
ImGui:imageUV(texture,
-- "down" is a boolean
+
w, h,
IO:addKeyEvent(key, down)
+
uv0x, uv0y,
IO:addKeyAnalogEvent(key, down, number)
+
uv1x, uv1y,
IO:AddMousePosEvent(x, y)
+
[, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0])
-- "button" is any ImGui button (check [here](#MouseButton))
+
 
IO:addMouseButtonEvent(button, down)
+
pressFlag = ImGui:imageButton(str_id, texture, w, h
IO:addMouseWheelEvent(x, y)
+
[, 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])
  
IO:setAppAcceptingEvents([accepting_events = true])
+
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>
 
</syntaxhighlight>
  
== Context ==
+
=== Widgets: Combo Box ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
string OR nil = ImGui:getHoveredWindow()
+
openFlag = ImGui:beginCombo(text, preview_text [, ImGui.ComboFlags = 0])
string OR nil = ImGui:getHoveredWindowRoot()
+
ImGui:endCombo()
string OR nil = ImGui:getHoveredWindowUnderMovingWindow()
+
current_item, is_open = ImGui:combo(label, current_item, items) -- items (table): {"item1", "item2", ...}
string OR nil = ImGui:getMovingWindow()
+
</syntaxhighlight>
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 ==
+
=== Widgets: Drags ===
=== Windows ===
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
p_open, draw = ImGui:beginWindow(label, p_open [, ImGui.WindowFlags = 0])
+
value, is_changed = ImGui:dragFloat(label, value
-- do not show "X" button
+
[, inc_step = 1, min = 0, max = 0,
draw = ImGui:beginWindow(label, nil [, ImGui.WindowFlags = 0])
+
format_string = "%.3f", ImGui.SliderFlags = 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])
+
value1, value2, is_changed = ImGui:dragFloat2(label, value1, value2
-- do not show "X" button
+
[, inc_step = 1, min = 0, max = 0,
draw = ImGui:beginFullScreenWindow(label, nil [, ImGui.WindowFlags = 0])  
+
format_string = "%.3f", ImGui.SliderFlags = 0])
ImGui:endWindow()
 
</syntaxhighlight>
 
  
=== Disabled groups ===
+
value1, value2, value3, is_changed = ImGui:dragFloat3(label, value1, value2, value3
<syntaxhighlight lang="lua">
+
[, inc_step = 1, min = 0, max = 0,
ImGui:beginDisabled(disabledFlag)
+
format_string = "%.3f", ImGui.SliderFlags = 0])
ImGui:endDisabled()
+
 
</syntaxhighlight>
+
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])
  
=== Child Windows ===
+
-- table must be an array of any size > 0
<syntaxhighlight lang="lua">
+
is_changed = ImGui:dragIntT(label, table
ImGui:beginChild(id [, w = 0, h = 0, borderFlag = false, ImGui.WindowFlags = 0])
+
[, inc_step = 1, min = 0, max = 0,
ImGui:endChild()
+
format_string = "%d", ImGui.SliderFlags = 0])
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Windows Utilities ===
+
=== Widgets: Sliders ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
flag = ImGui:isWindowAppearing()
+
value, is_changed = ImGui:sliderFloat(label, value
flag = ImGui:isWindowCollapsed()
+
[, min = 0, max = 0,
flag = ImGui:isWindowFocused([ImGui.FocusedFlags = 0])
+
format_string = "%.3f", ImGui.SliderFlags = 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
+
value1, value2, is_changed = ImGui:sliderFloat2(label, value1, value2
ImGui:setNextWindowPos(x, y [, ImGui.Cond = 0, pivotX = 0, pivotY = 0])
+
[, min = 0, max = 0,
ImGui:setNextWindowSize(w, h [, ImGui.Cond = 0])
+
format_string = "%.3f", ImGui.SliderFlags = 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 ===
+
value1, value2, value3, is_changed = ImGui:sliderFloat3(label, value1, value2, value3
Can be used to set minimum and maximum window size, plus contraint the size if needed.
+
[, min = 0, max = 0,
<syntaxhighlight lang="lua">
+
format_string = "%.3f", ImGui.SliderFlags = 0])
-- 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''':
+
value1, value2, value3, value4, is_changed = ImGui:sliderFloat4(label, value1, value2, value3, value4
<syntaxhighlight lang="lua">
+
[, min = 0, max = 0,
-- get window position
+
format_string = "%.3f", ImGui.SliderFlags = 0])
x, y = callbackData:getPos()
 
x = callbackData:getX()
 
y = callbackData:getY()
 
  
-- get currrent size
+
value_in_rad, is_changed = ImGui:sliderAngle(label, value_in_rad
current_width, current_height = callbackData:getCurrentSize()
+
[, min_degrees = -360, max_degrees = 360,
current_width = callbackData:getCurrentWidth()
+
format_string = "%.0f deg", ImGui.SliderFlags = 0])
current_height = callbackData:getCurrentHeight()
 
  
-- get desired size
+
-- table must be an array of any size > 0
deserid_width, deserid_height = callbackData:getDesiredSize()
+
is_changed = ImGui:sliderFloatT(label, table
deserid_width = callbackData:getDesiredWidth()
+
[, min = 0, max = 0,
deserid_height = callbackData:getDesiredHeight()
+
format_string = "%.3f", ImGui.SliderFlags = 0])
</syntaxhighlight>
+
 
 +
value, is_changed = ImGui:sliderInt(label, value
 +
[, min = 0, max = 0,
 +
format_string = "%d, ImGui.SliderFlags = 0"])
  
'''Example''':
+
value1, value2, is_changed = ImGui:sliderInt2(label, value1, value2
<syntaxhighlight lang="lua">
+
[, min = 0, max = 0,
require "ImGui"
+
format_string = "%d, ImGui.SliderFlags = 0"])
  
local function stepSize(callback_data, step)
+
value1, value2, value3, is_changed = ImGui:sliderInt3(label, value1, value2, value3
local w, h = callback_data:getDesiredSize()
+
[, min = 0, max = 0,
w = (w // step) * step
+
format_string = "%d, ImGui.SliderFlags = 0"])
h = (h // step) * step
 
return w, h
 
end
 
  
local ui = ImGui.new()
+
value1, value2, value3, value4, is_changed = ImGui:sliderInt4(label, value1, value2, value3, value4
stage:addChild(ui)
+
[, min = 0, max = 0,
 +
format_string = "%d, ImGui.SliderFlags = 0"])
  
stage:addEventListener("enterFrame", function(e)
+
-- table must be an array of any size > 0
ui:newFrame(e.deltaTime)
+
is_changed = ImGui:sliderIntT(label, table
+
[, min = 0, max = 0,
-- window size step is 32 (last argument, that is passed to the callback as second argument)
+
format_string = "%d", ImGui.SliderFlags = 0])
ui:setNextWindowSizeConstraints(200, 200, 400, 400, stepSize, 32)
+
 
if (ui:beginWindow("My window")) then
+
value, is_changed = ImGui:vSliderFloat(label, w, h, value, min, max
+
[, format_string = "%.3f", ImGui.SliderFlags = 0])
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 ===
+
value, is_changed = ImGui:vSliderInt(label, w, h, value, min, max
<syntaxhighlight lang="lua">
+
[, format_string = "%d", ImGui.SliderFlags = 0])
scaleX, scaleY = ImGui:getContentRegionMax()
 
w, h = ImGui:getContentRegionAvail()
 
x, y = ImGui:getWindowContentRegionMin()
 
x, y = ImGui:getWindowContentRegionMax()
 
</syntaxhighlight>
 
  
=== Windows Scrolling ===
+
value, is_changed = ImGui:filledSliderFloat(label, mirror_flag, value
<syntaxhighlight lang="lua">
+
[, min = 0, max = 0,
x = ImGui:getScrollX()
+
format_string = "%.3f", ImGui.SliderFlags = 0])
y = ImGui:getScrollY()
+
 
maxX = ImGui:getScrollMaxX()
+
value1, value2, is_changed = ImGui:filledSliderFloat2(label, mirror_flag, value1, value2
maxY = ImGui:getScrollMaxY()
+
[, min = 0, max = 0,
ImGui:setScrollX(value)
+
format_string = "%.3f", ImGui.SliderFlags = 0])
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) ===
+
value1, value2, value3, is_changed = ImGui:filledSliderFloat3(label, mirror_flag, value1, value2, value3
<syntaxhighlight lang="lua">
+
[, min = 0, max = 0,
ImGui:pushStyleColor(ImGui.Col, color, alpha)
+
format_string = "%.3f", ImGui.SliderFlags = 0])
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) ===
+
value1, value2, value3, value4, is_changed = ImGui:filledSliderFloat4(label, mirror_flag, value1, value2, value3, value4
<syntaxhighlight lang="lua">
+
[, min = 0, max = 0,
ImGui:pushItemWidth(w)
+
format_string = "%.3f", ImGui.SliderFlags = 0])
ImGui:popItemWidth()
+
 
ImGui:setNextItemWidth(w)
+
-- table must be an array of any size > 0
w = ImGui:calcItemWidth()
+
is_changed = ImGui:filledSliderFloatT(label, mirror_flag, table
ImGui:pushTextWrapPos([localX = 0])
+
[, min = 0, max = 0,
ImGui:popTextWrapPos()
+
format_string = "%.3f", ImGui.SliderFlags = 0])
ImGui:pushTabStop(flag)
+
 
ImGui:popTabStop()
+
value_in_rad, is_changed = ImGui:filledSliderAngle(label, mirror_flag, value_in_rad
ImGui:pushButtonRepeat(flag)
+
[, min_degrees = -360, max_degrees = 360,
ImGui:popButtonRepeat()
+
format_string = "%.0f deg", ImGui.SliderFlags = 0])
</syntaxhighlight>
 
  
=== Cursor / Layout ===
+
value, is_changed = ImGui:filledSliderInt(label, mirror_flag, value
<syntaxhighlight lang="lua">
+
[, min = 0, max = 0,
ImGui:separator()
+
format_string = "%d", ImGui.SliderFlags = 0])
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 ===
+
value1, value2, is_changed = ImGui:filledSliderInt2(label, mirror_flag, value1, value2
<syntaxhighlight lang="lua">
+
[, min = 0, max = 0,
ImGui:pushID(anyValue)
+
format_string = "%d", ImGui.SliderFlags = 0])
ImGui:pushID(str)
 
ImGui:popID()
 
number = ImGui:getID(any_value)
 
number = ImGui:getID(string)
 
number = ImGui:getItemID()
 
</syntaxhighlight>
 
  
=== Widgets: Text ===
+
value1, value2, value3, is_changed = ImGui:filledSliderInt3(label, mirror_flag, value1, value2, value3
<syntaxhighlight lang="lua">
+
[, min = 0, max = 0,
ImGui:textUnformatted(text [, textEnd])
+
format_string = "%d", ImGui.SliderFlags = 0])
ImGui:text(text)
+
 
ImGui:textColored(text, color, alpha)
+
value1, value2, value3, value4, is_changed = ImGui:filledSliderInt4(label, mirror_flag, value1, value2, value3, value4
ImGui:textDisabled(text)
+
[, min = 0, max = 0,
ImGui:textWrapped(text)
+
format_string = "%d", ImGui.SliderFlags = 0])
ImGui:labelText(text, label)
+
 
ImGui:bulletText(text)
+
-- table must be an array of any size > 0
ImGui:separatorText(label)
+
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>
 
</syntaxhighlight>
  
=== Widgets: Main ===
+
=== Widgets: Input with Keyboard ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
flag = ImGui:button(text [, w = 0, h = 0])
+
text, flag = ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0])
flag = ImGui:smallButton(text)
+
text, flag = ImGui:inputTextMultiline(label, text, buffer_size [, w = 0, h = 0, ImGui.InputTextFlags = 0])
flag = ImGui:invisibleButton(string_ID [, w = 0, h = 0])
+
text, flag = ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0])
flag = ImGui:arrowButton(string_ID [, ImGui.Dir = 0])
+
value,  flag = ImGui:inputFloat(label, value [, step = 0, step_fast = 0, format = "%.3f", ImGui.InputTextFlags = 0])
flag = ImGui:checkbox(text, flag)
+
value1, value2, flag = ImGui:inputFloat2(label, value1, value2 [, format = "%.3f", ImGui.InputTextFlags = 0])
flags, is_changed = ImGui:checkboxFlags(label [, flags = 0, flags_value = 0])
+
value1, value2, value3, flag = ImGui:inputFloat3(label, value1, value2, value3 [, format = "%.3f", ImGui.InputTextFlags = 0])
number, is_changed = ImGui:radioButton(text, number, number)
+
value1, value2, value3, value4, flag = ImGui:inputFloat4(label, value1, value2, value3, value4 [, format = "%.3f", ImGui.InputTextFlags = 0])
is_changed = ImGui:radioButton(text, flag)
+
-- table must be an array of any size > 0
ImGui:progressBar(fraction [, anchor_x = -1, anchor_y = 0, overlay_string = nil])
+
flag = ImGui:inputFloatT(label, table [, format = "%.3f", ImGui.InputTextFlags = 0])
ImGui:bullet()
+
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>
 
</syntaxhighlight>
  
=== Widgets: Images ===
+
'''Input text callbacks''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- Images are streched (ImGui default functions)
+
ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
ImGui:image(texture, w, h
+
ImGui:inputTextMultiline(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
[, tint_color = 0xffffff, tint_alpha = 1,  
+
ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
border_color = 0xffffff, border_alpha = 0])
 
  
ImGui:imageUV(texture,  
+
callback_function = function(callback_data, user_data)
w, h,
+
-- do something with data
uv0x, uv0y,
+
-- see below
uv1x, uv1y,
+
end
[, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0])
+
</syntaxhighlight>
  
pressFlag = ImGui:imageButton(str_id, texture, w, h
+
'''callback_data''':
[, tint_color = 0xffffff, tint_alpha = 1,
+
<syntaxhighlight lang="lua">
border_color = 0xffffff, border_alpha = 0])
+
ImGuiInputTextFlags = callback_data:getEventFlag()
 +
ImGuiInputTextFlags = callback_data:getFlags()
  
pressFlag = ImGui:imageButtonUV(str_id, texture, w, h,
+
number = callback_data:getEventChar()
uv0x, uv0y, uv1x, uv1y
 
[, tint_color = 0xffffff, tint_alpha = 1,
 
border_color = 0xffffff, border_alpha = 0])
 
  
-- Images are scaled (extended by @MultiPain)
+
callback_data:setEventChar(number)
-- 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 ===
+
keyCode = callback_data:getEventKey()
<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 ===
+
string = callback_data:getBuf()
<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
+
callback_data:setBuf(string)
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
  
value1, value2, value3, is_changed = ImGui:dragFloat3(label, value1, value2, value3
+
number = callback_data:getBufTextLen()
[, 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
+
callback_data:setBufTextLen(number)
[, 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
+
number = callback_data:getBufSize()
[, 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
+
callback_data:setBufDirty(bool)
[, inc_step = 1, min = 0, max = 0,
+
bool = callback_data:isBufDirty()
format_string = "%d", ImGui.SliderFlags = 0])
 
  
value1, value2, is_changed = ImGui:dragInt2(label, value1, value2
+
callback_data:setCursorPos(number)
[, inc_step = 1, min = 0, max = 0,
+
number = callback_data:getCursorPos()
format_string = "%d", ImGui.SliderFlags = 0])
 
  
value1, value2, value3, is_changed = ImGui:dragInt3(label, value1, value2, value3
+
callback_data:setSelectionStart(s_start)
[, inc_step = 1, min = 0, max = 0,
+
number = callback_data:getSelectionStart()
format_string = "%d", ImGui.SliderFlags = 0])
 
  
value1, value2, value3, value4, is_changed = ImGui:dragInt4(label, value1, value2, value3, value4
+
callback_data:setSelectionEnd(s_end)
[, inc_step = 1, min = 0, max = 0,  
+
s_end = callback_data:getSelectionEnd()
format_string = "%d", ImGui.SliderFlags = 0])
+
 
 +
callback_data:setSelection(s_start, s_end)
 +
s_start, s_end = callback_data:getSelection()
  
v_current_min, v_current_max, flag = ImGui:dragIntRange2(label, v_current_min, v_current_max
+
callback_data:selectAll()
[, v_speed = 1, v_min = 0, v_max = 0,
+
callback_data:clearSelection()
format = "%d", format_max = nil, ImGui.SliderFlags = 0])
+
bool = callback_data:hasSelection()
  
-- table must be an array of any size > 0
+
callback_data:deleteChars(position, bytesCount)
is_changed = ImGui:dragIntT(label, table
+
callback_data:insertChars(position, text)
[, inc_step = 1, min = 0, max = 0,
 
format_string = "%d", ImGui.SliderFlags = 0])
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Widgets: Sliders ===
+
'''Example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
value, is_changed = ImGui:sliderFloat(label, value
+
require "ImGui"
[, min = 0, max = 0,
 
format_string = "%.3f", ImGui.SliderFlags = 0])
 
  
value1, value2, is_changed = ImGui:sliderFloat2(label, value1, value2
+
ui = ImGui.new()
[, min = 0, max = 0,
+
stage:addChild(ui)
format_string = "%.3f", ImGui.SliderFlags = 0])
 
  
value1, value2, value3, is_changed = ImGui:sliderFloat3(label, value1, value2, value3
+
local testMessage1 = ""
[, min = 0, max = 0,
+
local testMessage2 = ""
format_string = "%.3f", ImGui.SliderFlags = 0])
+
local testMessage3 = ""
  
value1, value2, value3, value4, is_changed = ImGui:sliderFloat4(label, value1, value2, value3, value4
+
-- Add ".." at the end of current input string
[, min = 0, max = 0,
+
function myCallback1(data)
format_string = "%.3f", ImGui.SliderFlags = 0])
+
data:insertChars(data:getCursorPos(), "..")
 
+
end
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
+
-- Replace all chars if UP/DOWN arrow is pressed
is_changed = ImGui:sliderFloatT(label, table
+
function myCallback2(data)
[, min = 0, max = 0,  
+
local key = data:getEventKey()
format_string = "%.3f", ImGui.SliderFlags = 0])
+
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
  
value, is_changed = ImGui:sliderInt(label, value
+
-- Switch case of the first char
[, min = 0, max = 0,
+
function myCallback3(data)
format_string = "%d, ImGui.SliderFlags = 0"])
+
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
  
value1, value2, is_changed = ImGui:sliderInt2(label, value1, value2
+
function enterFrame(e)
[, min = 0, max = 0,  
+
ui:newFrame(e.deltaTime)
format_string = "%d, ImGui.SliderFlags = 0"])
+
 +
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
  
value1, value2, value3, is_changed = ImGui:sliderInt3(label, value1, value2, value3
+
stage:addEventListener("enterFrame", enterFrame)
[, min = 0, max = 0,
+
</syntaxhighlight>
format_string = "%d, ImGui.SliderFlags = 0"])
 
  
value1, value2, value3, value4, is_changed = ImGui:sliderInt4(label, value1, value2, value3, value4
+
=== Widgets: Color Editor/Picker ===
[, min = 0, max = 0,  
+
<syntaxhighlight lang="lua">
format_string = "%d, ImGui.SliderFlags = 0"])
+
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>
  
-- table must be an array of any size > 0
+
=== Widgets: Trees ===
is_changed = ImGui:sliderIntT(label, table
+
<syntaxhighlight lang="lua">
[, min = 0, max = 0,
+
is_openFlag = ImGui:treeNode(label [, format_string])
format_string = "%d", ImGui.SliderFlags = 0])
+
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>
  
value, is_changed = ImGui:vSliderFloat(label, w, h, value, min, max
+
=== Widgets: Selectables ===
[, format_string = "%.3f", ImGui.SliderFlags = 0])
+
<syntaxhighlight lang="lua">
 +
result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])
 +
</syntaxhighlight>
  
value, is_changed = ImGui:vSliderInt(label, w, h, value, min, max
+
=== Widgets: List Boxes ===
[, format_string = "%d", ImGui.SliderFlags = 0])
+
<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>
  
value, is_changed = ImGui:filledSliderFloat(label, mirror_flag, value
+
=== Widgets: Data Plotting ===
[, min = 0, max = 0,
+
'''Caching''':
format_string = "%.3f", ImGui.SliderFlags = 0])
 
  
value1, value2, is_changed = ImGui:filledSliderFloat2(label, mirror_flag, value1, value2
+
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).
[, min = 0, max = 0,  
+
<syntaxhighlight lang="lua">
format_string = "%.3f", ImGui.SliderFlags = 0])
+
-- store points in memory
 +
-- points_table: {0.01, 0.5, 10, -50, ...}
 +
-- ptr: c++ pointer to a given vector
 +
ptr = ImGui.cachePoints(points_table)
  
value1, value2, value3, is_changed = ImGui:filledSliderFloat3(label, mirror_flag, value1, value2, value3
+
-- delete points from memory
[, min = 0, max = 0,
+
ImGui.freePoints(ptr)
format_string = "%.3f", ImGui.SliderFlags = 0])
+
</syntaxhighlight>
  
value1, value2, value3, value4, is_changed = ImGui:filledSliderFloat4(label, mirror_flag, value1, value2, value3, value4
+
'''Plot functions''':
[, min = 0, max = 0,  
+
<syntaxhighlight lang="lua">
format_string = "%.3f", ImGui.SliderFlags = 0])
+
-- len (number): points array length
 +
ImGui:plotCachedLines(label, ptr, len,
 +
[, values_offset = 0, overlay_text = nil,
 +
scale_min = math.huge, scale_max = math.huge,
 +
w = 0, h = 0])
  
-- table must be an array of any size > 0
+
ImGui:plotCachedHistogram(label, ptr, len,
is_changed = ImGui:filledSliderFloatT(label, mirror_flag, table
+
[, values_offset = 0, overlay_text = nil,
[, min = 0, max = 0,  
+
scale_min = math.huge, scale_max = math.huge,
format_string = "%.3f", ImGui.SliderFlags = 0])
+
w = 0, h = 0])
  
value_in_rad, is_changed = ImGui:filledSliderAngle(label, mirror_flag, value_in_rad
+
ImGui:plotLines(label, points_table
[, min_degrees = -360, max_degrees = 360,
+
[, values_offset = 0, overlay_text = nil,
format_string = "%.0f deg", ImGui.SliderFlags = 0])
+
scale_min = math.huge, scale_max = math.huge,
 +
w = 0, h = 0])
  
value, is_changed = ImGui:filledSliderInt(label, mirror_flag, value
+
ImGui:plotHistogram(label, points_table
[, min = 0, max = 0,
+
[, values_offset = 0, overlay_text = nil,
format_string = "%d", ImGui.SliderFlags = 0])
+
scale_min = math.huge, scale_max = math.huge,
 
+
w = 0, h = 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>
 
</syntaxhighlight>
  
=== Widgets: Input with Keyboard ===
+
'''Example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
text, flag = ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0])
+
-- delete ptr if it exist
text, flag = ImGui:inputTextMultiline(label, text, buffer_size [, w = 0, h = 0, ImGui.InputTextFlags = 0])
+
function deletePtr()
text, flag = ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0])
+
if pointsPtr then
value,  flag = ImGui:inputFloat(label, value [, step = 0, step_fast = 0, format = "%.3f", ImGui.InputTextFlags = 0])
+
ImGui.freePoints(pointsPtr)
value1, value2, flag = ImGui:inputFloat2(label, value1, value2 [, format = "%.3f", ImGui.InputTextFlags = 0])
+
end
value1, value2, value3, flag = ImGui:inputFloat3(label, value1, value2, value3 [, format = "%.3f", ImGui.InputTextFlags = 0])
+
end
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''':
+
function onEnterFrame()
<syntaxhighlight lang="lua">
+
ui:newFrame(e.deltaTime)
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])
+
if ui:button("Generate") then
ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
+
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
  
callback_function = function(callback_data, user_data)
+
-- do not forget to clear memory when app is closing
-- do something with data
+
function onAppExit()
-- see below
+
deletePtr()
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''callback_data''':
+
=== Widgets: Value() Helpers ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGuiInputTextFlags = callback_data:getEventFlag()
+
ImGui:value(prefix, bool)
ImGuiInputTextFlags = callback_data:getFlags()
+
ImGui:value(prefix, number)
 +
ImGui:value(prefix, float, format_string)
 +
</syntaxhighlight>
  
number = callback_data:getEventChar()
+
=== 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])
 +
</syntaxhighlight>
  
callback_data:setEventChar(number)
+
=== Widgets: Tooltips ===
 +
Tooltip are windows following the mouse which do not take focus away.
 +
<syntaxhighlight lang="lua">
 +
ImGui:beginTooltip()
 +
ImGui:endTooltip()
 +
ImGui:setTooltip(text)
 +
</syntaxhighlight>
  
keyCode = callback_data:getEventKey()
+
=== Disabled groups ===
 +
<syntaxhighlight lang="lua">
 +
ImGui:beginDisabled(disabledFlag)
 +
ImGui:endDisabled()
 +
</syntaxhighlight>
  
string = callback_data:getBuf()
+
== Popups, Modals ==
 +
The properties of popups windows are: - They block normal mouse hovering detection outside them. (*1) - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE. Because hovering detection is disabled outside the popup, when clicking outside the click will not be seen by underlying widgets! (*'''1''')
  
callback_data:setBuf(string)
+
* Their visibility state (~bool) is held internally by Dear ImGui instead of being held by the programmer as we are used to with regular Begin() calls. User can manipulate the visibility state by calling OpenPopup(), CloseCurrentPopup() etc.
 +
* We default to use the right mouse (ImGuiMouseButton_Right=1) for the Popup Context functions.
 +
* Those three properties are connected: we need to retain popup visibility state in the library because popups may be closed as any time.
  
number = callback_data:getBufTextLen()
+
('''1'''.) You can bypass that restriction and detect hovering even when normally blocked by a popup. To do this use the ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered(). This is what BeginPopupContextItem() and BeginPopupContextWindow() are doing already, allowing a right-click to reopen another popups without losing the click.
  
callback_data:setBufTextLen(number)
+
<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>
  
number = callback_data:getBufSize()
+
== Columns ==
 +
* You can also use SameLine(pos_x) to mimic simplified columns.
 +
* The columns API is work-in-progress and rather lacking (columns are arguably the worst part of dear imgui at the moment!)
 +
* There is a maximum of 64 columns.
 +
* Currently working on new 'Tables' api which will replace columns around Q2 2020 (see GitHub #2957).
  
callback_data:setBufDirty(bool)
+
<syntaxhighlight lang="lua">
bool = callback_data:isBufDirty()
+
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>
  
callback_data:setCursorPos(number)
+
== Tab Bars, Tabs ==
number = callback_data:getCursorPos()
+
<syntaxhighlight lang="lua">
 
+
bool = ImGui:beginTabBar(str_id [, ImGui.TabBarFlags = 0])
callback_data:setSelectionStart(s_start)
+
ImGui:endTabBar()
number = callback_data:getSelectionStart()
+
p_open, bool = ImGui:beginTabItem(label, p_open [, ImGui.TabItemFlags = 0])
 
+
ImGui:endTabItem()
callback_data:setSelectionEnd(s_end)
+
ImGui:setTabItemClosed(tab_or_docked_window_label)
s_end = callback_data:getSelectionEnd()
+
ImGui:tabItemButton(label [, ImGui.TabItemFlags = 0])
 
 
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>
 
</syntaxhighlight>
  
'''Example''':
+
== Logging/Capture ==
 +
All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging.
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
require "ImGui"
+
ImGui:logToTTY(auto_open_depth = -1)
 
+
ImGui:logToFile(auto_open_depth = -1, filename = nil)
ui = ImGui.new()
+
ImGui:logToClipboard(auto_open_depth = -1)
stage:addChild(ui)
+
ImGui:logFinish()  
 +
ImGui:logButtons()  
 +
ImGui:logText(text)
 +
</syntaxhighlight>
  
local testMessage1 = ""
+
== Drag and drop ==
local testMessage2 = ""
+
<syntaxhighlight lang="lua">
local testMessage3 = ""
+
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>
  
-- Add ".." at the end of current input string
+
'''Payload''':
function myCallback1(data)
+
<syntaxhighlight lang="lua">
data:insertChars(data:getCursorPos(), "..")
+
number = ImGuiPayload:getNumData()
end
+
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>
  
-- Replace all chars if UP/DOWN arrow is pressed
+
'''Usage example''':
function myCallback2(data)
+
<syntaxhighlight lang="lua">
local key = data:getEventKey()
+
require "ImGui"
if (key == key_code.UP) then
+
 
data:deleteChars(0, data:getBufTextLen())
+
local imgui = ImGui.new()
data:insertChars(0, "Pressed Up!")
+
stage:addChild(imgui)
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
+
local names = {
function myCallback3(data)
+
"Bobby", "Beatrice", "Betty",
local buf = data:getBuf()
+
"Brianna", "Barry", "Bernard",
local s = buf:sub(1,1)
+
"Bibi", "Blaine", "Bryn"
if ((s >= 'a' and s <= 'z') or (s >= 'A' and s <= 'Z')) then
+
}
local first = string.char(string.byte(s) ~ 32)
+
-- modes:
data:setBuf(first .. buf:sub(2))
+
local Mode_Copy = 0
data:setBufDirty(true)
+
local Mode_Move = 1
end
+
local Mode_Swap = 2
end
+
 +
local mode = 0 -- current mode
  
function enterFrame(e)
+
function onEnterFrame(e)
ui:newFrame(e.deltaTime)
+
imgui:newFrame(e.deltaTime)
+
testMessage1 = ui:inputText(
+
if (imgui:radioButton("Copy", mode == Mode_Copy)) then mode = Mode_Copy end imgui:sameLine()
"Label1",  
+
if (imgui:radioButton("Move", mode == Mode_Move)) then mode = Mode_Move end imgui:sameLine()
testMessage1,
+
if (imgui:radioButton("Swap", mode == Mode_Swap)) then mode = Mode_Swap end
64,  
+
ImGui.InputTextFlags_CallbackCompletion,  
+
for i,v in ipairs(names) do
myCallback1
+
imgui:pushID(i)
)
+
if (((i-1) % 3) ~= 0) then imgui:sameLine() end
testMessage2 = ui:inputText(
+
"Label2",
+
imgui:button(v, 60, 60)
testMessage2,
+
64,
+
if (imgui:beginDragDropSource(ImGui.DragDropFlags_None)) then
ImGui.InputTextFlags_CallbackHistory,
+
--imgui:setStrDragDropPayload("DND_DEMO_CELL", "ID_"..i) -- used for strings
myCallback2
+
imgui:setNumDragDropPayload("DND_DEMO_CELL", i) -- used for numbers
)
+
testMessage3 = ui:inputText(
+
if (mode == Mode_Copy) then imgui:text(("Copy %s"):format(v)) end
"Label3",  
+
if (mode == Mode_Move) then imgui:text(("Move %s"):format(v)) end
testMessage3,
+
if (mode == Mode_Swap) then imgui:text(("Swap %s"):format(v)) end
64,
+
imgui:endDragDropSource()
ImGui.InputTextFlags_CallbackEdit,
+
end
myCallback3
+
)
+
if (imgui:beginDragDropTarget()) then
+
local payload = imgui:acceptDragDropPayload("DND_DEMO_CELL")
ui:render()
+
if (payload) then
ui:endFrame()
+
--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
 +
imgui:endDragDropTarget()
 +
end
 +
imgui:popID()
 +
end
 +
imgui:render()
 +
imgui:endFrame()
 
end
 
end
  
stage:addEventListener("enterFrame", enterFrame)
+
stage:addEventListener("enterFrame", onEnterFrame)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Widgets: Color Editor/Picker ===
+
== Clipping ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
hexColor, is_touching = ImGui:colorEdit3(label, color [, ImGui.ColorEditFlags = 0]) -- alpha ignored, no need to pass it!
+
ImGui:pushClipRect(min_x, min_y, max_x, max_y, intersect_with_current_clip_rect)
hexColor, alpha, is_touching = ImGui:colorEdit4(label, color [, alpha = 1, ImGui.ColorEditFlags = 0])
+
ImGui:popClipRect()
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>
 
</syntaxhighlight>
  
=== Widgets: Trees ===
+
== ImGuiListClipper ==
 +
Try to avoid creating new instances in "enterFrame" event.
 +
 
 +
'''Constructor''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
is_openFlag = ImGui:treeNode(label [, format_string])
+
instance = ImGuiListClipper.new()
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>
 
</syntaxhighlight>
  
=== Widgets: Selectables ===
+
'''Methods''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])
+
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>
 
</syntaxhighlight>
  
=== Widgets: List Boxes ===
+
'''Usage example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- item_table: {"Item0", "Item1", ...}
+
require "ImGui"
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 ===
+
local imgui = ImGui.new()
'''Caching''':
+
stage:addChild(imgui)
  
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).
+
clipper = ImGuiListClipper.new()
<syntaxhighlight lang="lua">
+
 
-- store points in memory
+
function onEnterFrame(e)
-- points_table: {0.01, 0.5, 10, -50, ...}
+
imgui:newFrame(e.deltaTime)
-- ptr: c++ pointer to a given vector
+
 
ptr = ImGui.cachePoints(points_table)
+
if (imgui:beginWindow("Clipper demo")) then
 +
if (imgui:beginTable("table", 3)) then
 +
imgui:tableSetupScrollFreeze(0, 1) -- cols, rows
 +
imgui:tableSetupColumn("One")
 +
imgui:tableSetupColumn("Two")
 +
imgui:tableSetupColumn("Three")
 +
imgui:tableHeadersRow()
  
-- delete points from memory
+
clipper:beginClip(100)
ImGui.freePoints(ptr)
+
while (clipper:step()) do
</syntaxhighlight>
+
for row = clipper:getDisplayStart(), clipper:getDisplayEnd() do
 +
imgui:tableNextRow()
 +
for column = 1, 3 do
 +
imgui:tableSetColumnIndex(column - 1)
 +
imgui:text(("col: %d; row: %d"):format(column, row))
 +
end
 +
end
 +
end
 +
clipper:endClip()
  
'''Plot functions''':
+
imgui:endTable()
<syntaxhighlight lang="lua">
+
end
-- len (number): points array lenght
+
end
ImGui:plotCachedLines(label, ptr, len,
+
imgui:endWindow()
[, 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
+
imgui:endFrame()
[, values_offset = 0, overlay_text = nil,
+
imgui:render()
scale_min = math.huge, scale_max = math.huge,
+
end
w = 0, h = 0])
 
  
ImGui:plotHistogram(label, points_table
+
stage:addEventListener("enterFrame", onEnterFrame)
[, values_offset = 0, overlay_text = nil,
 
scale_min = math.huge, scale_max = math.huge,
 
w = 0, h = 0])
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Example''':
+
== Context ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- delete ptr if it exist
+
string OR nil = ImGui:getHoveredWindow()
function deletePtr()
+
string OR nil = ImGui:getHoveredWindowRoot()
if pointsPtr then
+
string OR nil = ImGui:getHoveredWindowUnderMovingWindow()
ImGui.freePoints(pointsPtr)
+
string OR nil = ImGui:getMovingWindow()
end
+
string OR nil = ImGui:getActiveIdWindow()
end
+
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>
 +
 
 +
== Focus, Activation ==
 +
* Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item"
 +
* Most of the functions are referring to the last/previous item we submitted.
 +
* See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions.
  
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">
 
<syntaxhighlight lang="lua">
ImGui:value(prefix, bool)
+
ImGui:setItemDefaultFocus()
ImGui:value(prefix, number)
+
ImGui:setKeyboardFocusHere([offset = 0])
ImGui:value(prefix, float, format_string)
+
flag = ImGui:isItemHovered([ImGui.HoveredFlags = 0])
</syntaxhighlight>
+
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>
  
== Widgets: Menus ==
+
== INPUTS ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
result? = ImGui:beginMenuBar()
+
ImGui:onMouseHover(event)
ImGui:endMenuBar()
+
ImGui:onMouseMove(event)
result? = ImGui:beginMainMenuBar()
+
ImGui:onMouseDown(event)
ImGui:endMainMenuBar()
+
ImGui:onMouseUp(event)
result = ImGui:beginMenu(label [, enabled = true])
+
ImGui:onMouseWheel(event)
result = ImGui:beginMenuEx(label, [icon = "", enabled = true])
+
 
ImGui:endMenu()
+
ImGui:onTouchMove(event)
result = ImGui:menuItem(label [, shortcut = "", selected = false, enabled = true])
+
ImGui:onTouchBegin(event)
result = ImGui:menuItemEx(label, [icon = "", shortcut = "", selected = false, enabled = true])
+
ImGui:onTouchEnd(event)
ImGui:beginTooltip()
+
ImGui:onTouchCancel(event)
ImGui:endTooltip()
+
 
ImGui:setTooltip(text)
+
ImGui:onKeyUp(event)
 +
ImGui:onKeyDown(event)
 +
ImGui:onKeyChar(event)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Popups, Modals ==
+
'''Usage examples''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
result? = ImGui:beginPopup(str_id [, ImGui.WindowFlags = 0])
+
local UI = ImGui.new(nil, false, false, false)
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>
 
</syntaxhighlight>
  
== Tables ==
+
'''Mouse'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
flag = ImGui:beginTable(str_id, column [, ImGui.TableFlags = 0, outer_w = 0, outer_h = 0, inner_width = 0])
+
stage:addEventListener("mouseHover", function(e) UI:onMouseHover(e) end)
ImGui:endTable()
+
stage:addEventListener("mouseMove", function(e) UI:onMouseMove(e) end)
ImGui:tableNextRow([ImGui.TableRowFlags = 0, min_row_height = 0])
+
stage:addEventListener("mouseDown", function(e) UI:onMouseDown(e) end)
flag = ImGui:tableNextColumn()
+
stage:addEventListener("mouseUp", function(e) UI:onMouseUp(e) end)
flag = ImGui:tableSetColumnIndex(column_n)
+
stage:addEventListener("mouseWheel", function(e) UI:onMouseWheel(e) end)
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>
 
</syntaxhighlight>
  
== Table sort specs ==
+
'''Touch'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- TableSortSpecs = ImGui:tableGetSortSpecs()
+
stage:addEventListener("touchesCancel", function(e) ui:onTouchCancel(e) end)
number = TableSortSpecs:getSpecsCount()
+
stage:addEventListener("touchesMove", function(e) ui:onTouchMove(e) end)
flag = TableSortSpecs:isSpecsDirty()
+
stage:addEventListener("touchesBegin", function(e) ui:onTouchBegin(e) end)
TableSortSpecs:setSpecsDirty(flag)
+
stage:addEventListener("touchesEnd", function(e) ui:onTouchEnd(e) end)
table = TableSortSpecs:getColumnSortSpecs() -- see below
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Table column sort specs ==
+
'''Keyboard'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- table = TableSortSpecs:getColumnSortSpecs()
+
stage:addEventListener("keyUp", function(e) UI:onKeyUp(e) end)
-- each value of this table is an object that have this functions:
+
stage:addEventListener("keyDown", function(e) UI:onKeyDown(e) end)
number = item:getColumnUserID()  
+
stage:addEventListener("keyChar", function(e) UI:onKeyChar(e) end)
number = item:getColumnIndex() -- 0 based
 
number = item:getSortOrder() -- used in multi sorted tables
 
number = item:getSortDirection() -- ImGui.SortDirection_Ascending OR ImGui.SortDirection_Descending
 
 
</syntaxhighlight>
 
</syntaxhighlight>
Example: https://github.com/MultiPain/Gideros_examples/blob/master/ImGuiTablesDemo/assets/TablesDemo.lua</br>
 
  
== Columns ==
+
== Miscellaneous Utilities ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:columns([count = 1, id = nil, border = true])
+
flag = ImGui:isRectVisible(w, h [, max_x, max_y])
ImGui:nextColumn()
+
number = ImGui:getTime()
index = ImGui:getColumnIndex()
+
number = ImGui:getFrameCount()
width = ImGui:getColumnWidth([column_index = -1])
+
str = ImGui:getStyleColorName(idx)
ImGui:setColumnWidth(column_index, width)
+
flag = ImGui:beginChildFrame(id, w, h [, ImGui.WindowFlags = 0]) -- id (number)
offset = ImGui:getColumnOffset([column_index = -1])
+
ImGui:endChildFrame()
ImGui:setColumnOffset(column_index, offset)
 
number = ImGui:getColumnsCount()
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Tab Bars, Tabs ==
+
=== Text Utilities ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
bool = ImGui:beginTabBar(str_id [, ImGui.TabBarFlags = 0])
+
w, h = ImGui:calcTextSize(text [, hide_text_after_double_hash = false, wrap_width = -1])
ImGui:endTabBar()
+
</syntaxhighlight>
p_open, bool = ImGui:beginTabItem(label, p_open [, ImGui.TabItemFlags = 0])
+
 
ImGui:endTabItem()
+
=== Color convert ===
ImGui:setTabItemClosed(tab_or_docked_window_label)
+
'''Note''': use ''DOT'' instead of ''COLON'', so you can use it without creating an ImGui object
ImGui:tabItemButton(label [, ImGui.TabItemFlags = 0])
+
<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>
 
</syntaxhighlight>
  
== Logging/Capture ==
+
=== Inputs Utilities: Keyboard ===
 +
* For 'int user_key_index' you can use your own indices/enums according to how your backend/engine stored them in io.KeysDown[].
 +
* We don't know the meaning of those value. You can use GetKeyIndex() to map a ImGuiKey_ value into the user index.
 +
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:logToTTY(auto_open_depth = -1)  
+
string = ImGui:getKeyName(keyCode)
ImGui:logToFile(auto_open_depth = -1, filename = nil)  
+
flag = ImGui:isKeyDown(keyCode)
ImGui:logToClipboard(auto_open_depth = -1)  
+
flag = ImGui:isKeyPressed(keyCode [, repeat = true])
ImGui:logFinish()  
+
flag = ImGui:isKeyReleased(keyCode)
ImGui:logButtons()  
+
number = ImGui:getKeyPressedAmount(keyCode, repeat_delay, rate)
ImGui:logText(text)  
+
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Drag and drop ==
+
=== Shortcut system ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
flag = ImGui:beginDragDropSource([ImGui.DragDropFlags flags = 0])
+
-- (keyChord: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values (ImGuiKey | ImGuiMod_XXX))
flag = ImGui:setNumDragDropPayload(str_type, number [, ImGui.Cond cond = 0])
+
ImGui:shortcut(keyChord [, owner_id = 0, ImGui.InputFlags = 0])
flag = ImGui:setStrDragDropPayload(str_type, string [, ImGui.Cond cond = 0])
+
 
ImGui:endDragDropSource()
+
-- (useful to disable CTRL + TAB combo: ImGui:setShortcutRouting(ImGui.Mod_Ctrl | ImGui.Key_Tab, ImGui.KeyOwner_None))
flag = ImGui:beginDragDropTarget()
+
ImGui:setShortcutRouting(keyChord [, owner_id = 0, ImGui.InputFlags = 0])
ImGuiPayload = ImGui:acceptDragDropPayload(type [, ImGui.DragDropFlags flags = 0])
+
 
ImGui:endDragDropTarget()
+
ImGui:setItemKeyOwner(keyCode [, ImGui.InputFlags = 0])
ImGuiPayload = ImGui:getDragDropPayload()
+
 
 +
ImGui:setKeyOwner(keyCode, owner_id, [, ImGui.InputFlags = 0])
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Payload''':
+
=== Inputs Utilities: Mouse ===
<syntaxhighlight lang="lua">
+
* To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right.
number = ImGuiPayload:getNumData()
+
* You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle.
string = ImGuiPayload:getStrData()
+
* Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold')
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">
 
<syntaxhighlight lang="lua">
local names = {
+
-- "mouse_button" is any gideros mouse button code
"Bobby", "Beatrice", "Betty",
+
flag = ImGui:isMouseDown(mouse_button)
"Brianna", "Barry", "Bernard",
+
flag = ImGui:isMouseClicked(mouse_button [, repeat = false]) -- "mouse_button" is any gideros mouse button code
"Bibi", "Blaine", "Bryn"
+
flag = ImGui:isMouseReleased(mouse_button) -- "mouse_button" is any gideros mouse button code
}
+
flag = ImGui:isMouseDoubleClicked(mouse_button) -- "mouse_button" is any gideros mouse button code
-- modes:
+
flag = ImGui:isMouseHoveringRect(min_x, min_y, max_x, max_y [, clip = true])
local Mode_Copy = 0
+
flag = ImGui:isMousePosValid([x = inf, y = inf])
local Mode_Move = 1
+
flag = ImGui:isAnyMouseDown()
local Mode_Swap = 2
+
x, y = ImGui:getMousePos()
+
x, y = ImGui:getMousePosOnOpeningCurrentPopup()
local mode = 0 -- current mode
+
flag = ImGui:isMouseDragging(mouse_button [, lock_threshold = -1]) -- "mouse_button" is any gideros mouse button code
 +
x, y = ImGui:getMouseDragDelta(mouse_button [, lock_threshold = -1]) -- "mouse_button" is any gideros mouse button code
 +
ImGui:resetMouseDragDelta(mouse_button) -- "mouse_button" is any gideros mouse button code
 +
ImGuiMouseCursor = ImGui:getMouseCursor()
 +
ImGui:setMouseCursor(ImGui.MouseCursor)
 +
ImGui:setNextFrameWantCaptureMouse([want_capture_mouse_value = true])
 +
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
 +
ImGui:updateCursor()
 +
</syntaxhighlight>
  
function onEnterFrame(e)
+
== FONTS ==
UI:newFrame(e.deltaTime)
+
<syntaxhighlight lang="lua">
+
IO = imgui:getIO()
if (UI:radioButton("Copy", mode == Mode_Copy)) then mode = Mode_Copy end UI:sameLine()
+
FontAtlas = IO:getFonts()
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)
+
Font = FontAtlas:addFont(ttf_font_path, font_size [, options])
</syntaxhighlight>
 
  
== Clipping ==
+
-- options (table): all parameters are optional
<syntaxhighlight lang="lua">
+
--     fontDataOwnedByAtlas - bool
ImGui:pushClipRect(min_x, min_y, max_x, max_y, intersect_with_current_clip_rect)
+
--     pixelSnapH - bool
ImGui:popClipRect()
+
--     mergeMode - bool
</syntaxhighlight>
+
--     fontNo - number
 
+
--     oversampleH - number
== ImGuiListClipper ==
+
--     oversampleV - number
Try to avoid creating new instances in "enterFrame" event.
+
--     glyphExtraSpacingX - number
 
+
--     glyphExtraSpacingY - number
'''Constructor''':
+
--     glyphOffsetX - number
<syntaxhighlight lang="lua">
+
--     glyphOffsetY - number
instance = ImGuiListClipper.new()
+
--     glyphMinAdvanceX - number
</syntaxhighlight>
+
--     glyphMaxAdvanceX - number
 
+
--     rasterizerFlags - number
'''Methods''':
+
--     rasterizerMultiply - number
<syntaxhighlight lang="lua">
+
--
ImGuiListClipper:beginClip(number_of_items [, item_height = -1]) -- if item_height <= 0 then it is calculated automatically
+
--     glyphs - table:
ImGuiListClipper:endClip()
+
--     text(string): represents available chars
bool = ImGuiListClipper:step()
+
--     chars(table): list of specific char code (example: {0x7262, ...})
number = ImGuiListClipper:getDisplayStart()
+
--     ranges(table): predefined glyph ranges (example: {ImGui.GlyphRanges_Default, ImGui.GlyphRanges_Japanese, ...})
number = ImGuiListClipper:getDisplayEnd()
+
FontAtlas:addFonts(fontsDescription)
number = ImGuiListClipper:getStartPosY()
+
-- fontsDescriptions(table):
number = ImGuiListClipper:getItemsCount()
+
--      description(table):
ImGuiListClipper:forceDisplayRangeByIndices(number_min, number_max)
+
--          ttf_font_path(string): path to a font
</syntaxhighlight>
+
--          font_size(number): font size
 +
--          options(table): see description above
 +
-- example:
 +
-- FontAtlas:addFonts{ {"fonts/DroidSans.ttf", 16}, {"fonts/ProggyTiny.ttf", 16} }
  
'''Usage example''':
+
Font = FontAtlas:getFont([index]) -- get font by index (if index is 0 or nil you will get default font instance)
<syntaxhighlight lang="lua">
+
FontAtlas:build() -- call after multiple FontAtlas:addFont(...) calls to update ImGui font atlas
ui = ImGui.new()
+
FontAtlas:clearInputData()
stage:addChild(ui)
+
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)
  
clipper = ImGuiListClipper.new()
+
ImGui:pushFont(font) -- font (table): object returned by FontAtlas:addFont(...) or FontAtlas:getFont([index])
 +
ImGui:popFont()
 +
</syntaxhighlight>
  
function onEnterFrame(e)
+
'''Minimal example''':
ui:newFrame(e.deltaTime)
+
<syntaxhighlight lang="lua">
+
local UI = ImGui.new()
if (ui:beginWindow("Clipper demo")) then
+
local IO = UI:getIO()
if (ui:beginTable("table", 3)) then
+
local FontAtlas = IO:getFonts()
ui:tableSetupScrollFreeze(0, 1)
+
local VDS_font = FontAtlas:addFont("fonts/VDS.ttf", 16, {
ui:tableSetupColumn("One")
+
    oversampleH = 2,
ui:tableSetupColumn("Two")
+
    oversampleV = 2,
ui:tableSetupColumn("Three")
+
glyphs = {
ui:tableHeadersRow()
+
ranges = {ImGui.GlyphRanges_Cyrillic}
+
}
clipper:beginClip(1000)
+
})
while (clipper:step()) do
+
IO:setFontDefault(VDS_font)
for row = clipper:getDisplayStart(), clipper:getDisplayEnd() do
+
FontAtlas:build()
ui:tableNextRow()
+
stage:addChild(UI)
for column = 1, 3 do
+
 
ui:tableSetColumnIndex(column - 1)
+
-- you can use multiple fonts at the same time
ui:text(("col: %d; row: %d"):format(column, row))
+
function enterFrame(e)
end
+
UI:newFrame(e.deltaTime)
end
+
end
+
UI:pushFont(font1)
clipper:endClip()
+
UI:text("Font1")
+
UI:popFont()
ui:endTable()
+
end
+
UI:pushFont(font2)
end
+
UI:text("Font2")
ui:endWindow()
+
UI:popFont()
 
 
ui:endFrame()
+
UI:render()
ui:render()
+
UI:endFrame()
 
end
 
end
 
stage:addEventListener("enterFrame", onEnterFrame)
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== ImGuiTextFilter ==
+
'''Glyphs example''':
Try to avoid creating new instaces in "enterFrame" event.
 
 
 
'''Constructor''':
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
filter = ImGuiTextFilter.new()
+
local fonts = io:getFonts()
</syntaxhighlight>
+
fonts:addFont(font_path, font_size, {
 
+
glyphs = {
'''Methods''':
+
ranges = {
<syntaxhighlight lang="lua">
+
{
-- draws the input field
+
0x2590,0x2593, -- range1
isValueChanged = filter:draw(label [, width = 0])
+
0x2660,0x266B  -- range2
-- draws the input field (using ImGui:inutTextWithHint())
+
-- ...
isValueChanged = filter:drawWithHint(label, hint [, width = 0])
+
},
 
+
ImGui.GlyphRanges_Cyrillic,
filter:setBuffer(text) -- set filter text
+
{
filter:build() -- update filter internals (see example below)
+
0x01C0, 0x01C3 -- range3
bool = filter:passFilter(text) -- returns true if filter input matches with "text"
+
},
 +
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>
 
</syntaxhighlight>
  
'''Usage example 1''':</br>
+
'''Icons example''':
https://github.com/MultiPain/Gideros_ImGui/blob/28d2cdd4f393d6f2048792e51f695d56d7e0ae9a/imgui_src/imgui_demo.cpp#L5657
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ui = ImGui.new()
+
local icon = utf8.char(0x2590)
stage:addChild(ui)
+
ImGui:text("My icon >>" .. icon .. " << !!!")
  
filter = ImGuiTextFilter.new()
+
-- or with new Luau support:
items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
+
ImGui:text("My icon >> \u{2590} << !!!")
 
+
-- can be also stored in memory:
function onEnterFrame(e)
+
local icon = "\u{2590}"
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>
 
</syntaxhighlight>
  
'''Usage example 2''':
+
=== Font ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ui = ImGui.new()
+
number = Font:getSize()
stage:addChild(ui)
+
FontAtlas = Font:getContainerAtlas()
filter = ImGuiTextFilter.new()
+
Font:setScale(number)
 
+
number = Font:getScale()
searchText = ""
+
number = Font:getAscent()
items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
+
number = Font:getDescent()
function onEnterFrame(e)
+
bool = Font:isLoaded()
ui:newFrame(e.deltaTime)
+
string = Font:getDebugName()
+
w, h = Font:calcTextSizeA(size, max_width, wrap_width, string)
-- Draw standart text input control
+
Font:calcWordWrapPositionA(scale, string, wrap_width) -- not tested
-- 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>
 
</syntaxhighlight>
  
== Focus, Activation ==
+
== Tables ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:setItemDefaultFocus()
+
flag = ImGui:beginTable(str_id, column [, ImGui.TableFlags = 0, outer_w = 0, outer_h = 0, inner_width = 0])
ImGui:setKeyboardFocusHere([offset = 0])
+
ImGui:endTable()
flag = ImGui:isItemHovered([ImGui.HoveredFlags = 0])
+
ImGui:tableNextRow([ImGui.TableRowFlags = 0, min_row_height = 0])
flag = ImGui:isItemActive()
+
flag = ImGui:tableNextColumn()
flag = ImGui:isItemFocused()
+
flag = ImGui:tableSetColumnIndex(column_n)
flag = ImGui:isItemClicked(mouse_button)
+
ImGui:tableSetupColumn(label [, ImGui.TableColumnFlags = 0, init_width_or_weight = 0, user_id = 0])
flag = ImGui:isItemVisible()
+
ImGui:tableSetupScrollFreeze(cols, rows)
flag = ImGui:isItemEdited()
+
ImGui:tableHeadersRow()
flag = ImGui:isItemActivated()
+
TableSortSpecs = ImGui:tableGetSortSpecs() -- see below
flag = ImGui:isItemDeactivated()
+
number = ImGui:tableGetColumnCount()
flag = ImGui:isItemDeactivatedAfterEdit()
+
number = ImGui:tableGetColumnIndex()
flag = ImGui:isItemToggledOpen()
+
number = ImGui:tableGetRowIndex()
flag = ImGui:isAnyItemHovered()
+
string = ImGui:tableGetColumnName([column_n = -1])
flag = ImGui:isAnyItemActive()
+
ImGuiTableColumnFlags = ImGui:tableGetColumnFlags([column_n = -1])
flag = ImGui:isAnyItemFocused()
+
ImGui:tableSetBgColor(ImGui.TableBgTarget, color [, alpha = 1, column_n = -1])
minX, minY, maxX, maxY = ImGui:getItemRect()
+
</syntaxhighlight>
x, y = ImGui:getItemRectMin()
+
 
x, y = ImGui:getItemRectMax()
+
=== Table sort specs ===
w, h = ImGui:getItemRectSize()
+
<syntaxhighlight lang="lua">
ImGui:setItemAllowOverlap()
+
number = TableSortSpecs:getSpecsCount() -- TableSortSpecs = ImGui:tableGetSortSpecs()
 +
flag = TableSortSpecs:isSpecsDirty() -- TableSortSpecs = ImGui:tableGetSortSpecs()
 +
TableSortSpecs:setSpecsDirty(flag) -- TableSortSpecs = ImGui:tableGetSortSpecs()
 +
table = TableSortSpecs:getColumnSortSpecs() -- TableSortSpecs = ImGui:tableGetSortSpecs(), see below
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Miscellaneous Utilities ==
+
=== Table column sort specs ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
flag = ImGui:isRectVisible(w, h [, max_x, max_y])
+
-- table = TableSortSpecs:getColumnSortSpecs()
number = ImGui:getTime()
+
-- each value of this table is an object that have these functions:
number = ImGui:getFrameCount()
+
number = item:getColumnUserID()  
str = ImGui:getStyleColorName(idx)
+
number = item:getColumnIndex() -- 0 based
flag = ImGui:beginChildFrame(id, w, h [, ImGui.WindowFlags = 0]) -- id (number)
+
number = item:getSortOrder() -- used in multi sorted tables
ImGui:endChildFrame()
+
number = item:getSortDirection() -- ImGui.SortDirection_Ascending OR ImGui.SortDirection_Descending
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Example: https://github.com/MultiPain/Gideros_examples/blob/master/ImGuiTablesDemo/assets/TablesDemo.lua</br>
 +
 +
== ImGuiTextFilter ==
 +
Try to avoid creating new instaces in "enterFrame" event.
  
== Text Utilities ==
+
'''Constructor''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
w, h = ImGui:calcTextSize(text [, hide_text_after_double_hash = false, wrap_width = -1])
+
filter = ImGuiTextFilter.new()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Inputs Utilities: Keyboard ==
+
'''Methods''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
string = ImGui:getKeyName(keyCode)
+
-- draws the input field
flag = ImGui:isKeyDown(keyCode)
+
isValueChanged = filter:draw(label [, width = 0])
flag = ImGui:isKeyPressed(keyCode [, repeat = true])
+
-- draws the input field (using ImGui:inutTextWithHint())
flag = ImGui:isKeyReleased(keyCode)
+
isValueChanged = filter:drawWithHint(label, hint [, width = 0])
number = ImGui:getKeyPressedAmount(keyCode, repeat_delay, rate)
+
 
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
+
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>
 
</syntaxhighlight>
  
== Shortcut system ==
+
'''Usage example 1''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- (keyChord: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values (ImGuiKey | ImGuiMod_XXX))
+
require "ImGui"
ImGui:shortcut(keyChord [, owner_id = 0, ImGui.InputFlags = 0])
+
 
 +
local imgui = ImGui.new()
 +
stage:addChild(imgui)
  
-- (useful to disable CTRL + TAB combo: ImGui:setShortcutRouting(ImGui.Mod_Ctrl | ImGui.Key_Tab, ImGui.KeyOwner_None))
+
local filter = ImGuiTextFilter.new()
ImGui:setShortcutRouting(keyChord [, owner_id = 0, ImGui.InputFlags = 0])
+
local items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
  
ImGui:setItemKeyOwner(keyCode [, ImGui.InputFlags = 0])
+
function onEnterFrame(e)
 +
imgui:newFrame(e.deltaTime)
  
ImGui:setKeyOwner(keyCode, owner_id, [, ImGui.InputFlags = 0])
+
if (imgui:beginWindow("Filter demo")) then
</syntaxhighlight>
+
imgui:text([[
 +
Filter usage:
 +
""        display all lines
 +
"xxx"      display lines containing "xxx"
 +
"xxx,yyy"  display lines containing "xxx" or "yyy"
 +
"-xxx"    hide lines containing "xxx"
 +
]])
  
== Inputs Utilities: Mouse ==
+
filter:draw("Filter")
<syntaxhighlight lang="lua">
+
 
-- "mouse_button" is any gideros mouse button code
+
for i, text in ipairs(items) do
flag = ImGui:isMouseDown(mouse_button)
+
if filter:passFilter(text) then
flag = ImGui:isMouseClicked(mouse_button [, repeat = false])
+
imgui:bulletText(text)
flag = ImGui:isMouseReleased(mouse_button)
+
end
flag = ImGui:isMouseDoubleClicked(mouse_button)
+
end
flag = ImGui:isMouseHoveringRect(min_x, min_y, max_x, max_y [, clip = true])
+
end
flag = ImGui:isMousePosValid([x = inf, y = inf])
+
imgui:endWindow()
flag = ImGui:isAnyMouseDown()
+
 
x, y = ImGui:getMousePos()
+
imgui:endFrame()
x, y = ImGui:getMousePosOnOpeningCurrentPopup()
+
imgui:render()
flag = ImGui:isMouseDragging(mouse_button [, lock_threshold = -1])
+
end
x, y = ImGui:getMouseDragDelta(mouse_button [, lock_threshold = -1])
+
 
ImGui:resetMouseDragDelta(mouse_button)
+
stage:addEventListener("enterFrame", onEnterFrame)
ImGuiMouseCursor = ImGui:getMouseCursor()
 
ImGui:setMouseCursor(ImGui.MouseCursor)
 
ImGui:setNextFrameWantCaptureMouse([want_capture_mouse_value = true])
 
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
 
ImGui:updateCursor()
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Render ==
+
'''Usage example 2''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:newFrame(deltaTime)
+
require "ImGui"
ImGui:render()
+
 
ImGui:endFrame()
+
local imgui = ImGui.new()
</syntaxhighlight>
+
stage:addChild(imgui)
  
== Demos ==
+
local filter = ImGuiTextFilter.new()
<syntaxhighlight lang="lua">
+
local searchText = ""
is_openFlag = ImGui:showUserGuide()
+
local items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
is_openFlag = ImGui:showDemoWindow([p_open])
+
 
is_openFlag = ImGui:showAboutWindow([p_open])
+
function onEnterFrame(e)
is_openFlag = ImGui:showStyleEditor()
+
imgui:newFrame(e.deltaTime)
is_openFlag = ImGui:showFontSelector()
+
 
is_openFlag = ImGui:showMetricsWindow([p_open])
+
-- draw standart text input control
is_openFlag = ImGui:showStyleSelector(label)
+
-- filter:drawWithHint("Filter", "Search")
is_openFlag = ImGui:ShowStackToolWindow([p_open])
+
-- draw custom control
ImGui:showLuaStyleEditor()
+
local ischanged = false
 +
searchText, ischanged = imgui:inputText("Filter", searchText, 256, ImGui.InputTextFlags_EnterReturnsTrue)
 +
if ischanged 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
 +
imgui:bulletText(item)
 +
end
 +
 
 +
imgui:endFrame()
 +
imgui:render()
 +
end
 +
 
 +
stage:addEventListener("enterFrame", onEnterFrame)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== TextEditor ==
 
== TextEditor ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- otherTextEditor: another "ImGuiTextEditor" instance to copy setting  
+
-- otherTextEditor: another "ImGuiTextEditor" instance to copy setting
 
TextEditor = ImGuiTextEditor.new([other_text_editor])
 
TextEditor = ImGuiTextEditor.new([other_text_editor])
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 1,770: Line 1,839:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== ENUMS ==
+
== DRAW LISTS ==
 
+
'''Window draw list''':
=== Keyboard keys ===
 
==== Keys ====
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui.Key_None
+
local list = ImGui:getWindowDrawList()
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>
 
</syntaxhighlight>
  
==== Gamepad ====
+
'''Background draw list''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui.Key_GamepadStart
+
local list = ImGui:getBackgroundDrawList()
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>
 
</syntaxhighlight>
  
==== Modifiers ====
+
'''Foreground draw list''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui.Key_ModCtrl
+
local list = ImGui:getForegroundDrawList()
ImGui.Key_ModShift
 
ImGui.Key_ModAlt
 
ImGui.Key_ModSuper
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== FocusedFlags ===
+
'''Draw lists commands''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui.FocusedFlags_ChildWindows
+
DrawList:pushClipRect(clip_rect_min_x, clip_rect_min_y, clip_rect_max_x, clip_rect_max_y [, intersect_with_current_clip_rect = false])
ImGui.FocusedFlags_AnyWindow
+
DrawList:pushClipRectFullScreen()
ImGui.FocusedFlags_RootWindow
+
DrawList:popClipRect()
ImGui.FocusedFlags_RootAndChildWindows
+
DrawList:pushTextureID(texture)
ImGui.FocusedFlags_None
+
DrawList:popTextureID()
ImGui.FocusedFlags_NoPopupHierarchy
+
x, y = DrawList:getClipRectMin()
</syntaxhighlight>
+
x, y = DrawList:getClipRectMax()
 
+
DrawList:addLine(p1_x, p1_y, p2_x, p2_y, color [, alpha = 1, thickness = 1])
=== PopupFlags ===
+
DrawList:addRect(
<syntaxhighlight lang="lua">
+
p_min_x, p_min_y,
ImGui.PopupFlags_NoOpenOverExistingPopup
+
p_max_x, p_max_y,
ImGui.PopupFlags_MouseButtonLeft
+
color
ImGui.PopupFlags_MouseButtonMask
+
[, alpha = 1,
ImGui.PopupFlags_MouseButtonRight
+
rounding = 0, rounding_corners = ImGui.DrawFlags_RoundCornersAll,
ImGui.PopupFlags_AnyPopupId
+
thickness = 1])
ImGui.PopupFlags_MouseButtonDefault
+
DrawList:addRectFilled(p_min_x, p_min_y, p_max_x, p_max_y, color [, alpha = 1, rounding = 0, rounding_corners = ImGui.DrawFlags_RoundCornersAll])
ImGui.PopupFlags_MouseButtonMiddle
+
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)
ImGui.PopupFlags_None
+
DrawList:addQuad(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y, color [, alpha = 1, thickness = 1])
ImGui.PopupFlags_AnyPopup
+
DrawList:addQuadFilled(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y, color)
ImGui.PopupFlags_AnyPopupLevel
+
DrawList:addTriangle(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, color [, alpha = 1, thickness = 1])
ImGui.PopupFlags_NoOpenOverItems
+
DrawList:addTriangleFilled(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, color)
</syntaxhighlight>
+
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])
=== HoveredFlags ===
+
DrawList:addNgon(center_x, center_y, radius, color [, alpha = 1, num_segments = 12, thickness = 1])
<syntaxhighlight lang="lua">
+
DrawList:addNgonFilled(center_x, center_y, radius, color [, alpha = 1, num_segments = 12])
ImGui.HoveredFlags_None
+
DrawList:addText(x, y, color, alpha, text) -- x, y (number), text_begin (string), text_end (string)
ImGui.HoveredFlags_RootAndChildWindows
+
DrawList:addFontText(font, font_size,
ImGui.HoveredFlags_AllowWhenBlockedByPopup
+
pos_x, pos_y,
ImGui.HoveredFlags_AllowWhenBlockedByActiveItem
+
color, alpha,
ImGui.HoveredFlags_ChildWindows
+
text
ImGui.HoveredFlags_RectOnly
+
[, wrap_with = 0,
ImGui.HoveredFlags_AllowWhenDisabled
+
cpu_fine_clip_rect_x, cpu_fine_clip_rect_y,
ImGui.HoveredFlags_AllowWhenOverlapped
+
cpu_fine_clip_rect_w, cpu_fine_clip_rect_h])
ImGui.HoveredFlags_AnyWindow
+
DrawList:addPolyline(points_table, color, alpha, closed, thickness) -- points_table (table), color (number), closed (bool), thickness (number)
ImGui.HoveredFlags_RootWindow
+
DrawList:addConvexPolyFilled(points_table, color) -- points_table (table), color (number)
ImGui.HoveredFlags_NoNavOverride
+
DrawList:addBezierCubic(
ImGui.HoveredFlags_DelayNormal
+
p1_x, p1_y,
ImGui.HoveredFlags_DelayShort
+
p2_x, p2_y,
ImGui.HoveredFlags_NoSharedDelay
+
p3_x, p3_y,
</syntaxhighlight>
+
p4_x, p4_y,
 
+
color, alpha, thickness [, num_segments = 0])
=== InputTextFlags ===
+
DrawList:addBezierQuadratic(
<syntaxhighlight lang="lua">
+
p1_x, p1_y,
ImGui.InputTextFlags_None
+
p2_x, p2_y,
ImGui.InputTextFlags_EnterReturnsTrue
+
p3_x, p3_y,
ImGui.InputTextFlags_ReadOnly
+
color, alpha, thickness [, num_segments = 0])
ImGui.InputTextFlags_AutoSelectAll
+
DrawList:addImage(texture,
ImGui.InputTextFlags_AllowTabInput
+
x, y,
ImGui.InputTextFlags_CharsScientific
+
x + w, y + h
ImGui.InputTextFlags_CharsDecimal
+
[, tint_color = 0xffffff, tint_alpha = 1])
ImGui.InputTextFlags_NoUndoRedo
+
DrawList:addImageUV(texture,
ImGui.InputTextFlags_CtrlEnterForNewLine
+
x, y,
ImGui.InputTextFlags_CharsHexadecimal
+
x + w, y + h,
ImGui.InputTextFlags_CharsNoBlank
+
uv0x, uv0y,
ImGui.InputTextFlags_Password
+
uv1x, uv1y
ImGui.InputTextFlags_NoHorizontalScroll
+
[, tint_color = 0xffffff, tint_alpha = 1])
ImGui.InputTextFlags_AlwaysInsertMode
+
DrawList:addImageQuad(texture,
ImGui.InputTextFlags_CharsUppercase
+
x, y,
ImGui.InputTextFlags_NoBackground -- custom constant, used to disable background
+
x + w, y,
ImGui.InputTextFlags_EscapeClearsAll
+
x + w, y + h,
ImGui.InputTextFlags_CallbackCompletion
+
x, y + h
ImGui.InputTextFlags_CallbackResize
+
[, tint_color = 0xffffff, tint_alpha = 1,
ImGui.InputTextFlags_CallbackAlways
+
uv0x = 0, uv0y = 0,
ImGui.InputTextFlags_CallbackHistory
+
uv1x = 1, uv1y = 0,
ImGui.InputTextFlags_CallbackCharFilter
+
uv2x = 1, uv2y = 1,
ImGui.InputTextFlags_CallbackEdit
+
uv3x = 0, uv3y = 1])
</syntaxhighlight>
+
DrawList:addImageRounded(texture,
 
+
x, y,
=== NavInput ===
+
x + w,
<syntaxhighlight lang="lua">
+
y + h,
ImGui.NavInput_FocusNext
+
tint_color, tint_alpha, round_radius
ImGui.NavInput_TweakFast
+
[, corner_flags = ImGui.CorenerFlags_All])
ImGui.NavInput_Input
+
DrawList:addImageRoundedUV(texture,
ImGui.NavInput_DpadRight
+
x, y,
ImGui.NavInput_FocusPrev
+
x + w, y + h,
ImGui.NavInput_LStickDown
+
uv0x, uv0y,
ImGui.NavInput_LStickUp
+
uv1x, uv1y,
ImGui.NavInput_Activate
+
tint_color, tint_alpha, round_radius
ImGui.NavInput_LStickLeft
+
[, corner_flags = ImGui.CorenerFlags_All])
ImGui.NavInput_LStickRight
+
DrawList:pathClear()
ImGui.NavInput_DpadLeft
+
DrawList:pathLineTo(x, y)
ImGui.NavInput_DpadDown
+
DrawList:pathLineToMergeDuplicate(x, y)
ImGui.NavInput_TweakSlow
+
DrawList:pathFillConvex(color)
ImGui.NavInput_DpadUp
+
DrawList:pathStroke(color, alpha, closed [, thickness = 1])
ImGui.NavInput_Menu
+
DrawList:pathArcTo(center_x, center_y, radius, a_min, a_max [, num_segments = 10])
ImGui.NavInput_Cancel
+
DrawList:pathArcToFast(center_x, center_y, radius, a_min, a_max)
</syntaxhighlight>
+
DrawList:pathBezierCubicCurveTo(p2x, p2y, p3x, p3y, p4x, p4y [, num_segments = 0])
 
+
DrawList:pathBezierQuadraticCurveTo(p2x, p2y, p3x, p3y [, num_segments = 0])
=== TabBarFlags ===
+
DrawList:pathRect(min_x, min_y, max_x, max_y [, rounding = 0, ImGui.DrawFlags = 0])
<syntaxhighlight lang="lua">
+
-- CUSTOM
ImGui.TabBarFlags_AutoSelectNewTabs
+
-- rotate any draw list item around its center point
ImGui.TabBarFlags_NoCloseWithMiddleMouseButton
+
DrawList:rotateBegin()
ImGui.TabBarFlags_TabListPopupButton
+
DrawList:rotateEnd(radians)
ImGui.TabBarFlags_NoTooltip
+
-- example:
ImGui.TabBarFlags_FittingPolicyMask
+
...
ImGui.TabBarFlags_Reorderable
+
local list = ImGui:getWindowDrawList()
ImGui.TabBarFlags_FittingPolicyDefault
+
list:rotateBegin()
ImGui.TabBarFlags_FittingPolicyScroll
+
list:addLine(100, 100, 100, 250, 0xff0000, 1, 10)
ImGui.TabBarFlags_FittingPolicyResizeDown
+
list:rotateEnd(math.pi/2.2)
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>
 
</syntaxhighlight>
  
=== GlyphRanges ===
+
'''Usage example''':
 +
 
 +
[[File:Dear_Imgui_DrawList_capture_1.png]]
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui.GlyphRanges_Default,
+
-- reference: https://github.com/ocornut/imgui/issues/3606#issuecomment-731726406
ImGui.GlyphRanges_Korean,
+
require "ImGui"
ImGui.GlyphRanges_ChineseFull,
 
ImGui.GlyphRanges_ChineseSimplifiedCommon,
 
ImGui.GlyphRanges_Japanese,
 
ImGui.GlyphRanges_Cyrillic,
 
ImGui.GlyphRanges_Thai,
 
ImGui.GlyphRanges_Vietnamese
 
</syntaxhighlight>
 
  
=== ItemFlags ===
+
local imgui = ImGui.new()
<syntaxhighlight lang="lua">
+
local IO = imgui:getIO()
ImGui.ItemFlags_Disabled
+
local w = 320
ImGui.ItemFlags_ButtonRepeat
+
local h = 180
ImGui.ItemFlags_NoTabStop
+
IO:setDisplaySize(w*2, h*2)
</syntaxhighlight>
+
stage:addChild(imgui)
  
=== TableBgTarget ===
+
local cos,sin,sqrt = math.cos, math.sin, math.sqrt
<syntaxhighlight lang="lua">
+
local HSV2RGB = ImGui.colorConvertHSVtoRGB
ImGui.TableBgTarget_None
+
local RGB2HEX = ImGui.colorConvertRGBtoHEX
ImGui.TableBgTarget_RowBg0
+
local p = { -1,-1, 1,-1, 1,1, -1,1 }
ImGui.TableBgTarget_RowBg1
+
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
ImGui.TableBgTarget_CellBg
+
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
</syntaxhighlight>
+
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 m, 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[m-1]*s[n*2+1]+of[n*2+1], p[m-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)
 +
imgui:newFrame(e.deltaTime)
 +
if imgui:beginWindow("FX", nil, ImGui.WindowFlags_AlwaysAutoResize) then
 +
imgui:invisibleButton("canvas", w, h)
 +
local min_x, min_y = imgui:getItemRectMin()
 +
local max_x, max_y = imgui:getItemRectMax()
 +
local draw_list = imgui: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, imgui:getTime())
 +
draw_list:popClipRect()
 +
end
 +
imgui:endWindow()
 +
imgui:render()
 +
imgui:endFrame()
 +
end
  
=== TableColumnFlags ===
+
stage:addEventListener("enterFrame", onEnterFrame)
<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>
 
</syntaxhighlight>
  
=== TableFlags ===
+
== EXPERIMENTAL ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui.TableFlags_None
+
p_open = ImGui:showLog(title, p_open [, ImGui.WindowFlags = 0]) -- draw log window
ImGui.TableFlags_Resizable
+
ImGui:writeLog(text)
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>
 
</syntaxhighlight>
  
=== TableColumnFlags ===
+
Gestures (touch only, turned OFF by default) ''WIP'':
<syntaxhighlight lang="lua">
+
* tap gesture (Left Mouse Button)
ImGui.TableColumnFlags_None
+
* hold gesture (Right Mouse Button)
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">
 
<syntaxhighlight lang="lua">
ImGui.TableRowFlags_None
+
ImGui:setTouchGesturesEnabled(bool)
ImGui.TableRowFlags_Headers
+
bool = ImGui:isTouchGesturesEnabled()
</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>
 
</syntaxhighlight>
  

Latest revision as of 22:37, 11 October 2024

Dear ImGui LUA binding for Gideros Mobile

GitHub https://github.com/MultiPain/Gideros_ImGui

Constructor

-- 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])

IO Functions

GetIO() access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags)

local IO = ImGui:getIO()

Functions:

Settings/.Ini Utilities
* The disk functions are automatically called if io.IniFilename != NULL (default is "imgui.ini").
* Set io.IniFilename to NULL to load/save manually. Read io.WantSaveIniSettings description about handling .ini saving manually.
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])

Style setters/getters

GetStyle() instance access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame!

local Style = ImGui:getStyle()

Setters/getters:

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()

DEFAULT STYLES

ImGui:setDarkStyle()
ImGui:setLightStyle()
ImGui:setClassicStyle()

Render

NewFrame() start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame().

EndFrame() ends the Dear ImGui frame. Automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all!

Render() ends the Dear ImGui frame, finalize the draw data.

ImGui:newFrame(deltaTime)
ImGui:render()
ImGui:endFrame()

Demos

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()

Windows

  • Begin() = push window to the stack and start appending to it. End() = pop window from the stack.
  • You may append multiple times to the same window during the same frame.
  • Passing bool* p_open != NULL shows a window-closing widget in the upper-right corner of the window, which clicking will set the boolean to false when clicked.
  • Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. Always call a matching End() for each Begin() call, regardless of its return value! [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu / EndMenu, BeginPopup / EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
  • Note that the bottom of window stack always contains a window called "Debug".
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()

Child Windows

Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child. For each independent axis of size:

  • == 0.0f -> use remaining host window size
  • > 0.0f -> fixed size
  • < 0.0f -> use remaining window size minus abs(size) Each axis can use a different mode, e.g. ImVec2(0,400). BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window.
Tip
Always call a matching EndChild() for each BeginChild() call, regardless of its return value [as with Begin: this is due to legacy reason and inconsistent with most BeginXXX functions apart from the regular Begin() which behaves like BeginChild().]
ImGui:beginChild(id [, w = 0, h = 0, borderFlag = false, ImGui.WindowFlags = 0])
ImGui:endChild()

Windows Utilities

  • Current window = the window we are appending into while inside a Begin() / End() block.
  • Next window = next window we will Begin() into.
  • Prefer using SetNextXXX functions (before Begin) rather than SetXXX functions (after Begin()).
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)

Window size constraints

Can be used to set minimum and maximum window size, plus contraint the size if needed.

-- 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

Resize callback:

-- 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
desired_width, desired_height = callbackData:getDesiredSize()
desired_width = callbackData:getDesiredWidth()
desired_height = callbackData:getDesiredHeight()

Example:

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)

Content region

  • Those functions are bound to be redesigned soon (they are confusing, incomplete and return values in local window coordinates which increases confusion)
scaleX, scaleY = ImGui:getContentRegionMax()
w, h = ImGui:getContentRegionAvail()
x, y = ImGui:getWindowContentRegionMin()
x, y = ImGui:getWindowContentRegionMax()

Windows Scrolling

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])

Parameters stacks (shared)

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()

Parameters stacks (current window)

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()

Cursor / Layout

  • By "cursor" we mean the current output position.
  • The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down.
  • You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceeding widget.
  • Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API: Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions.
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()

ID stack/scopes

  • Read the FAQ for more details about how ID are handled in Dear Imgui. If you are creating widgets in a loop you most likely want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them.
  • The resulting ID are hashes of the entire stack.
  • You can also use the "Label##foobar" syntax within widget label to distinguish them from each others.
  • In this header file we use the "label"/"name" terminology to denote a string that will be displayed and used as an ID, whereas "str_id" denote a string that is only used as an ID and not normally displayed.
ImGui:pushID(anyValue) 
ImGui:pushID(str)
ImGui:popID()
number = ImGui:getID(anyValue)
number = ImGui:getID(str)
number = ImGui:getItemID()

WIDGETS

Widgets: Text

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)

Widgets: Main

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()

Widgets: Images

-- 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])

Widgets: Combo Box

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", ...}

Widgets: Drags

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])

Widgets: Sliders

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])

Widgets: Input with Keyboard

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])

Input text callbacks:

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

callback_data:

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)

Example:

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)

Widgets: Color Editor/Picker

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)

Widgets: Trees

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)

Widgets: Selectables

result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])

Widgets: List Boxes

-- 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()

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).

-- 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)

Plot functions:

-- len (number): points array length
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])

Example:

-- 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

Widgets: Value() Helpers

ImGui:value(prefix, bool)
ImGui:value(prefix, number)
ImGui:value(prefix, float, format_string)

Widgets: Menus

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])

Widgets: Tooltips

Tooltip are windows following the mouse which do not take focus away.

ImGui:beginTooltip()
ImGui:endTooltip()
ImGui:setTooltip(text)

Disabled groups

ImGui:beginDisabled(disabledFlag)
ImGui:endDisabled()

Popups, Modals

The properties of popups windows are: - They block normal mouse hovering detection outside them. (*1) - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE. Because hovering detection is disabled outside the popup, when clicking outside the click will not be seen by underlying widgets! (*1)

  • Their visibility state (~bool) is held internally by Dear ImGui instead of being held by the programmer as we are used to with regular Begin() calls. User can manipulate the visibility state by calling OpenPopup(), CloseCurrentPopup() etc.
  • We default to use the right mouse (ImGuiMouseButton_Right=1) for the Popup Context functions.
  • Those three properties are connected: we need to retain popup visibility state in the library because popups may be closed as any time.

(1.) You can bypass that restriction and detect hovering even when normally blocked by a popup. To do this use the ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered(). This is what BeginPopupContextItem() and BeginPopupContextWindow() are doing already, allowing a right-click to reopen another popups without losing the click.

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])

Columns

  • You can also use SameLine(pos_x) to mimic simplified columns.
  • The columns API is work-in-progress and rather lacking (columns are arguably the worst part of dear imgui at the moment!)
  • There is a maximum of 64 columns.
  • Currently working on new 'Tables' api which will replace columns around Q2 2020 (see GitHub #2957).
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()

Tab Bars, Tabs

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])

Logging/Capture

All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging.

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)

Drag and drop

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()

Payload:

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()

Usage example:

require "ImGui"

local imgui = ImGui.new()
stage:addChild(imgui)

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)
	imgui:newFrame(e.deltaTime)
 
	if (imgui:radioButton("Copy", mode == Mode_Copy)) then mode = Mode_Copy end imgui:sameLine()
	if (imgui:radioButton("Move", mode == Mode_Move)) then mode = Mode_Move end imgui:sameLine()
	if (imgui:radioButton("Swap", mode == Mode_Swap)) then mode = Mode_Swap end
 
	for i,v in ipairs(names) do
		imgui:pushID(i)
		if (((i-1) % 3) ~= 0) then imgui:sameLine() end
 
		imgui:button(v, 60, 60)
 
		if (imgui:beginDragDropSource(ImGui.DragDropFlags_None)) then
			--imgui:setStrDragDropPayload("DND_DEMO_CELL", "ID_"..i) -- used for strings
			imgui:setNumDragDropPayload("DND_DEMO_CELL", i) -- used for numbers
 
			if (mode == Mode_Copy) then imgui:text(("Copy %s"):format(v)) end
			if (mode == Mode_Move) then imgui:text(("Move %s"):format(v)) end
			if (mode == Mode_Swap) then imgui:text(("Swap %s"):format(v)) end
			imgui:endDragDropSource()
		end
 
		if (imgui:beginDragDropTarget()) then
			local payload = imgui: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
			imgui:endDragDropTarget()
		end
		imgui:popID()
	end
	imgui:render()
	imgui:endFrame()
end

stage:addEventListener("enterFrame", onEnterFrame)

Clipping

ImGui:pushClipRect(min_x, min_y, max_x, max_y, intersect_with_current_clip_rect)
ImGui:popClipRect()

ImGuiListClipper

Try to avoid creating new instances in "enterFrame" event.

Constructor:

instance = ImGuiListClipper.new()

Methods:

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)

Usage example:

require "ImGui"

local imgui = ImGui.new()
stage:addChild(imgui)

clipper = ImGuiListClipper.new()

function onEnterFrame(e)
	imgui:newFrame(e.deltaTime)

	if (imgui:beginWindow("Clipper demo")) then
		if (imgui:beginTable("table", 3)) then
			imgui:tableSetupScrollFreeze(0, 1) -- cols, rows
			imgui:tableSetupColumn("One")
			imgui:tableSetupColumn("Two")
			imgui:tableSetupColumn("Three")
			imgui:tableHeadersRow()

			clipper:beginClip(100)
			while (clipper:step()) do
				for row = clipper:getDisplayStart(), clipper:getDisplayEnd() do
					imgui:tableNextRow()
					for column = 1, 3 do
						imgui:tableSetColumnIndex(column - 1)
						imgui:text(("col: %d; row: %d"):format(column, row))
					end
				end
			end
			clipper:endClip()

			imgui:endTable()
		end
	end
	imgui:endWindow()

	imgui:endFrame()
	imgui:render()
end

stage:addEventListener("enterFrame", onEnterFrame)

Context

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()

Focus, Activation

  • Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item"
  • Most of the functions are referring to the last/previous item we submitted.
  • See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions.
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()

INPUTS

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)

Usage examples:

local UI = ImGui.new(nil, false, false, false)

Mouse

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)

Touch

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)

Keyboard

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)

Miscellaneous Utilities

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()

Text Utilities

w, h = ImGui:calcTextSize(text [, hide_text_after_double_hash = false, wrap_width = -1])

Color convert

Note: use DOT instead of COLON, so you can use it without creating an ImGui object

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)

Inputs Utilities: Keyboard

  • For 'int user_key_index' you can use your own indices/enums according to how your backend/engine stored them in io.KeysDown[].
  • We don't know the meaning of those value. You can use GetKeyIndex() to map a ImGuiKey_ value into the user index.
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])

Shortcut system

-- (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])

Inputs Utilities: Mouse

  • To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right.
  • You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle.
  • Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold')
-- "mouse_button" is any gideros mouse button code
flag = ImGui:isMouseDown(mouse_button)
flag = ImGui:isMouseClicked(mouse_button [, repeat = false]) -- "mouse_button" is any gideros mouse button code
flag = ImGui:isMouseReleased(mouse_button) -- "mouse_button" is any gideros mouse button code
flag = ImGui:isMouseDoubleClicked(mouse_button) -- "mouse_button" is any gideros mouse button code
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]) -- "mouse_button" is any gideros mouse button code
x, y = ImGui:getMouseDragDelta(mouse_button [, lock_threshold = -1]) -- "mouse_button" is any gideros mouse button code
ImGui:resetMouseDragDelta(mouse_button) -- "mouse_button" is any gideros mouse button code
ImGuiMouseCursor = ImGui:getMouseCursor()
ImGui:setMouseCursor(ImGui.MouseCursor)
ImGui:setNextFrameWantCaptureMouse([want_capture_mouse_value = true])
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
ImGui:updateCursor()

FONTS

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()

Minimal example:

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

Glyphs example:

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()

Icons example:

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}"

Font

number = Font:getSize()
FontAtlas = Font:getContainerAtlas()
Font:setScale(number)
number = Font:getScale()
number = Font:getAscent()
number = Font:getDescent()
bool = Font:isLoaded()
string = Font:getDebugName()
w, h = Font:calcTextSizeA(size, max_width, wrap_width, string)
Font:calcWordWrapPositionA(scale, string, wrap_width) -- not tested

Tables

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])

Table sort specs

number = TableSortSpecs:getSpecsCount() -- TableSortSpecs = ImGui:tableGetSortSpecs()
flag = TableSortSpecs:isSpecsDirty() -- TableSortSpecs = ImGui:tableGetSortSpecs()
TableSortSpecs:setSpecsDirty(flag) -- TableSortSpecs = ImGui:tableGetSortSpecs()
table = TableSortSpecs:getColumnSortSpecs() -- TableSortSpecs = ImGui:tableGetSortSpecs(), see below

Table column sort specs

-- table = TableSortSpecs:getColumnSortSpecs()
-- each value of this table is an object that have these 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

Example: https://github.com/MultiPain/Gideros_examples/blob/master/ImGuiTablesDemo/assets/TablesDemo.lua

ImGuiTextFilter

Try to avoid creating new instaces in "enterFrame" event.

Constructor:

filter = ImGuiTextFilter.new()

Methods:

-- 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"

Usage example 1:

require "ImGui"

local imgui = ImGui.new()
stage:addChild(imgui)

local filter = ImGuiTextFilter.new()
local items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }

function onEnterFrame(e)
	imgui:newFrame(e.deltaTime)

	if (imgui:beginWindow("Filter demo")) then
		imgui: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
				imgui:bulletText(text)
			end
		end
	end
	imgui:endWindow()

	imgui:endFrame()
	imgui:render()
end

stage:addEventListener("enterFrame", onEnterFrame)

Usage example 2:

require "ImGui"

local imgui = ImGui.new()
stage:addChild(imgui)

local filter = ImGuiTextFilter.new()
local searchText = ""
local items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }

function onEnterFrame(e)
	imgui:newFrame(e.deltaTime)

	-- draw standart text input control
--	filter:drawWithHint("Filter", "Search")
	-- draw custom control
	local ischanged = false
	searchText, ischanged = imgui:inputText("Filter", searchText, 256, ImGui.InputTextFlags_EnterReturnsTrue)
	if ischanged 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
		imgui:bulletText(item)
	end

	imgui:endFrame()
	imgui:render()
end

stage:addEventListener("enterFrame", onEnterFrame)

TextEditor

-- otherTextEditor: another "ImGuiTextEditor" instance to copy setting
TextEditor = ImGuiTextEditor.new([other_text_editor])

Functions:

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()

LanguageDefinition

string = LanguageDefinition:getName()

ErrorMarkers

ErrorMarkers = ImGuiErrorMarkers.new()

ErrorMarkers:add(line, message)
ErrorMarkers:remove(line)
message = ErrorMarkers:get(line)
number = ErrorMarkers:getSize()

Breakpoints

Breakpoints = ImGuiBreakpoints.new()

Breakpoints:add(line)
Breakpoints:remove(line)
bool = Breakpoints:get(line)
number = Breakpoints:getSize()

DRAW LISTS

Window draw list:

local list = ImGui:getWindowDrawList()

Background draw list:

local list = ImGui:getBackgroundDrawList()

Foreground draw list:

local list = ImGui:getForegroundDrawList()

Draw lists commands:

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)
...

Usage example:

Dear Imgui DrawList capture 1.png

-- reference: https://github.com/ocornut/imgui/issues/3606#issuecomment-731726406
require "ImGui"

local imgui = ImGui.new()
local IO = imgui:getIO()
local w = 320
local h = 180
IO:setDisplaySize(w*2, h*2)
stage:addChild(imgui)

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 m, 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[m-1]*s[n*2+1]+of[n*2+1], p[m-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)
	imgui:newFrame(e.deltaTime)
	if imgui:beginWindow("FX", nil, ImGui.WindowFlags_AlwaysAutoResize) then
		imgui:invisibleButton("canvas", w, h)
		local min_x, min_y = imgui:getItemRectMin()
		local max_x, max_y = imgui:getItemRectMax()
		local draw_list = imgui: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, imgui:getTime())
		draw_list:popClipRect()
	end
	imgui:endWindow()
	imgui:render()
	imgui:endFrame()
end

stage:addEventListener("enterFrame", onEnterFrame)

EXPERIMENTAL

p_open = ImGui:showLog(title, p_open [, ImGui.WindowFlags = 0]) -- draw log window
ImGui:writeLog(text)

Gestures (touch only, turned OFF by default) WIP:

  • tap gesture (Left Mouse Button)
  • hold gesture (Right Mouse Button)
ImGui:setTouchGesturesEnabled(bool)
bool = ImGui:isTouchGesturesEnabled()


Dear ImGui