Difference between revisions of "Dear ImGui"

From GiderosMobile
(WIP)
Line 47: Line 47:
 
-- touch_listeners: adds internal touch event listeners
 
-- touch_listeners: adds internal touch event listeners
 
ImGui.new([font_atlas = nil, mouse_listeners = true, keyboard_listeners = true, touch_listeners = false])
 
ImGui.new([font_atlas = nil, mouse_listeners = true, keyboard_listeners = true, touch_listeners = false])
<syntaxhighlight lang="lua">
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Line 56: Line 55:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Gestures (touch only, turned OFF by default) _**WIP**_ ==
+
Gestures (touch only, turned OFF by default) ''WIP'':
 
+
* tap gesture (Left Mouse Button)
*   Tap gesture (Left Mouse Button)
+
* hold gesture (Right Mouse Button)
*   Hold gesture (Right Mouse Button)
 
 
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:setTouchGesturesEnabled(bool)
 
ImGui:setTouchGesturesEnabled(bool)
Line 118: Line 115:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
### Minimal example:
+
'''Minimal example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
local UI = ImGui.new()
 
local UI = ImGui.new()
Line 150: Line 147:
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
### Glyphs example:
+
 
 +
'''Glyphs example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
local fonts = io:getFonts()
 
local fonts = io:getFonts()
Line 184: Line 182:
 
fonts:build()
 
fonts:build()
 
</syntaxhighlight>
 
</syntaxhighlight>
### Icons
+
 
 +
'''Icons example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
local icon = utf8.char(0x2590)
 
local icon = utf8.char(0x2590)
Line 210: Line 209:
  
 
== INPUTS ==
 
== INPUTS ==
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:onMouseHover(event)
 
ImGui:onMouseHover(event)
Line 227: Line 225:
 
ImGui:onKeyChar(event)
 
ImGui:onKeyChar(event)
 
</syntaxhighlight>
 
</syntaxhighlight>
### Usage example
+
 
 +
'''Usage examples''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
local UI = ImGui.new(nil, false, false, false)
 
local UI = ImGui.new(nil, false, false, false)
 
</syntaxhighlight>
 
</syntaxhighlight>
**Mouse**
+
 
 +
'''Mouse'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
stage:addEventListener("mouseHover", function(e) UI:onMouseHover(e) end)
 
stage:addEventListener("mouseHover", function(e) UI:onMouseHover(e) end)
Line 239: Line 239:
 
stage:addEventListener("mouseWheel", function(e) UI:onMouseWheel(e) end)
 
stage:addEventListener("mouseWheel", function(e) UI:onMouseWheel(e) end)
 
</syntaxhighlight>
 
</syntaxhighlight>
**Touch**
+
 
 +
'''Touch'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
stage:addEventListener("touchesCancel", function(e) ui:onTouchCancel(e) end)
 
stage:addEventListener("touchesCancel", function(e) ui:onTouchCancel(e) end)
Line 246: Line 247:
 
stage:addEventListener("touchesEnd", function(e) ui:onTouchEnd(e) end)
 
stage:addEventListener("touchesEnd", function(e) ui:onTouchEnd(e) end)
 
</syntaxhighlight>
 
</syntaxhighlight>
**Keyboard**
+
 
 +
'''Keyboard'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
stage:addEventListener("keyUp", function(e) UI:onKeyUp(e) end)
 
stage:addEventListener("keyUp", function(e) UI:onKeyUp(e) end)
Line 254: Line 256:
  
 
== Style setters/getters ==
 
== Style setters/getters ==
### Get style settings instance
+
Get style settings instance:
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
local Style = ImGui:getStyle()
 
local Style = ImGui:getStyle()
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
'''Setters/getters''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
Style:setColor(ImGui.Col, color, alpha)
 
Style:setColor(ImGui.Col, color, alpha)
Line 349: Line 353:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## DEFAULT STYLES  
+
== DEFAULT STYLES ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:setDarkStyle()
 
ImGui:setDarkStyle()
Line 357: Line 361:
  
 
== Color convert ==
 
== Color convert ==
**Note**: use ***DOT*** instead of ***COLON***, so you can use it without creating an ImGui object
+
'''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])
 
r, g, b, a = ImGui.colorConvertHEXtoRGB(color [, alpha = 1])
Line 368: Line 372:
  
 
== IO Functions ==
 
== IO Functions ==
### Get IO instance
+
Get IO instance:
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
local IO = ImGui:getIO()
 
local IO = ImGui:getIO()
 
</syntaxhighlight>
 
</syntaxhighlight>
### Functions
+
 
 +
'''Functions''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
IO:setFontDefault(font)
 
IO:setFontDefault(font)
Line 488: Line 493:
  
 
== WIDGETS & STUFF ==
 
== WIDGETS & STUFF ==
## Windows
+
=== Windows ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
p_open, draw = ImGui:beginWindow(label, p_open [, ImGui.WindowFlags = 0])
 
p_open, draw = ImGui:beginWindow(label, p_open [, ImGui.WindowFlags = 0])
Line 500: Line 505:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Disabled groups
+
=== Disabled groups ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:beginDisabled(disabledFlag)
 
ImGui:beginDisabled(disabledFlag)
Line 506: Line 511:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Child Windows
+
=== Child Windows ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:beginChild(id [, w = 0, h = 0, borderFlag = false, ImGui.WindowFlags = 0])
 
ImGui:beginChild(id [, w = 0, h = 0, borderFlag = false, ImGui.WindowFlags = 0])
Line 512: Line 517:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Windows Utilities
+
=== Windows Utilities ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
flag = ImGui:isWindowAppearing()
 
flag = ImGui:isWindowAppearing()
Line 540: Line 545:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
### Window size constraints
+
=== Window size constraints ===
Can be used to set minimum and maximum window size, plus contraint the size if needed
+
Can be used to set minimum and maximum window size, plus contraint the size if needed.
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
-- call this function before ImGui:beginWindow()
 
-- call this function before ImGui:beginWindow()
Line 553: Line 558:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
### Resize callback
+
'''Resize callback''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
-- get window position
 
-- get window position
Line 569: Line 574:
 
deserid_width = callbackData:getDesiredWidth()
 
deserid_width = callbackData:getDesiredWidth()
 
deserid_height = callbackData:getDesiredHeight()
 
deserid_height = callbackData:getDesiredHeight()
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
### Example
+
'''Example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
require "ImGui"
 
require "ImGui"
Line 604: Line 608:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Content region  
+
=== Content region ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
scaleX, scaleY = ImGui:getContentRegionMax()
 
scaleX, scaleY = ImGui:getContentRegionMax()
Line 612: Line 616:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Windows Scrolling
+
=== Windows Scrolling ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
x = ImGui:getScrollX()
 
x = ImGui:getScrollX()
Line 626: Line 630:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Parameters stacks (shared)
+
=== Parameters stacks (shared) ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:pushStyleColor(ImGui.Col, color, alpha)
 
ImGui:pushStyleColor(ImGui.Col, color, alpha)
Line 636: Line 640:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Parameters stacks (current window)  
+
=== Parameters stacks (current window) ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:pushItemWidth(w)
 
ImGui:pushItemWidth(w)
Line 650: Line 654:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Cursor / Layout
+
=== Cursor / Layout ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:separator()
 
ImGui:separator()
Line 678: Line 682:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## ID stack/scopes
+
=== ID stack/scopes ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:pushID(anyValue)  
 
ImGui:pushID(anyValue)  
Line 688: Line 692:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Text
+
=== Widgets: Text ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:textUnformatted(text [, textEnd])
 
ImGui:textUnformatted(text [, textEnd])
Line 700: Line 704:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Main
+
=== Widgets: Main ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
flag = ImGui:button(text [, w = 0, h = 0])
 
flag = ImGui:button(text [, w = 0, h = 0])
Line 714: Line 718:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Images
+
=== Widgets: Images ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
-- Images are streched (ImGui default functions)
 
-- Images are streched (ImGui default functions)
Line 762: Line 766:
 
border_col = 0, border_alpha = 0,  
 
border_col = 0, border_alpha = 0,  
 
bg_col = 0, bg_alpha = 0])
 
bg_col = 0, bg_alpha = 0])
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Combo Box
+
=== Widgets: Combo Box ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
openFlag = ImGui:beginCombo(text, preview_text [, ImGui.ComboFlags = 0])
 
openFlag = ImGui:beginCombo(text, preview_text [, ImGui.ComboFlags = 0])
Line 772: Line 775:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Drags  
+
=== Widgets: Drags ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
value, is_changed = ImGui:dragFloat(label, value  
 
value, is_changed = ImGui:dragFloat(label, value  
Line 824: Line 827:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Sliders
+
=== Widgets: Sliders ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
value, is_changed = ImGui:sliderFloat(label, value  
 
value, is_changed = ImGui:sliderFloat(label, value  
Line 929: Line 932:
 
value, is_changed = ImGui:vFilledSliderInt(label, mirror_flag, w, h, value, min, max  
 
value, is_changed = ImGui:vFilledSliderInt(label, mirror_flag, w, h, value, min, max  
 
[, format_string = "%d", ImGui.SliderFlags = 0])
 
[, format_string = "%d", ImGui.SliderFlags = 0])
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Input with Keyboard
+
=== Widgets: Input with Keyboard ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
text, flag = ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0])
 
text, flag = ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0])
Line 952: Line 954:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
### Input text callbacks
+
'''Input text callbacks''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
 
ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
Line 963: Line 965:
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
### callback_data
+
 
 +
'''callback_data''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGuiInputTextFlags = callback_data:getEventFlag()
 
ImGuiInputTextFlags = callback_data:getEventFlag()
Line 1,007: Line 1,010:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
### Example
+
'''Example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
require "ImGui"
 
require "ImGui"
Line 1,080: Line 1,083:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Color Editor/Picker
+
=== Widgets: Color Editor/Picker ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
hexColor, is_touching = ImGui:colorEdit3(label, color [, ImGui.ColorEditFlags = 0]) -- alpha ignored, no need to pass it!
 
hexColor, is_touching = ImGui:colorEdit3(label, color [, ImGui.ColorEditFlags = 0]) -- alpha ignored, no need to pass it!
Line 1,091: Line 1,094:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Trees
+
=== Widgets: Trees ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
is_openFlag = ImGui:treeNode(label [, format_string])
 
is_openFlag = ImGui:treeNode(label [, format_string])
Line 1,103: Line 1,106:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Selectables
+
=== Widgets: Selectables ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])
 
result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: List Boxes
+
=== Widgets: List Boxes ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
-- item_table: {"Item0", "Item1", ...}
 
-- item_table: {"Item0", "Item1", ...}
Line 1,117: Line 1,120:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
## Widgets: Data Plotting
+
=== Widgets: Data Plotting ===
 +
'''Caching''':
  
### 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).
 
If you have big array of points it is better to cache it instead of translating lua table to C++ vector every time you call `ImGui:plotLines()`. But in this case you need to manage memory by yourself (free points pointer when you dont need it).
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
Line 1,131: Line 1,134:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
#### Example
+
'''Example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
-- delete ptr if it exist
 
-- delete ptr if it exist

Revision as of 16:19, 1 October 2024

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

Description

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

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

require "ImGui"

The current Dear ImGui version implemented in Gideros is version 1.89.6.


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


You can find some Dear ImGui examples implemented in Gideros Studio here: ImGui_Examples.






WIP

(copied from @rrraptor's GitHub https://github.com/MultiPain/Gideros_ImGui)


Dear ImGui LUA binding for Gideros Mobile

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

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

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 avaliable 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(talbe):
--      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()
boo = Font:isLoaded()
string = Font:getDebugName()
w, h = Font:calcTextSizeA(size, max_width, wrap_width, string)
Font:calcWordWrapPositionA(scale, string, wrap_width) -- not tested

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)

Style setters/getters

Get style settings instance:

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

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)

IO Functions

Get IO instance:

local IO = ImGui:getIO()

Functions:

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

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

WIDGETS & STUFF

Windows

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

Disabled groups

ImGui:beginDisabled(disabledFlag)
ImGui:endDisabled()

Child Windows

ImGui:beginChild(id [, w = 0, h = 0, borderFlag = false, ImGui.WindowFlags = 0])
ImGui:endChild()

Windows Utilities

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
deserid_width, deserid_height = callbackData:getDesiredSize()
deserid_width = callbackData:getDesiredWidth()
deserid_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

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

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

ImGui:pushID(anyValue) 
ImGui:pushID(str)
ImGui:popID()
number = ImGui:getID(any_value)
number = ImGui:getID(string)
number = ImGui:getItemID()

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)

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
      1. Plot functions
-- len (number): points array lenght
ImGui:plotCachedLines(label, ptr, len, 
	[, values_offset = 0, overlay_text = nil, 
	scale_min = math.huge, scale_max = math.huge, 
	w = 0, h = 0])
	
ImGui:plotCachedHistogram(label, ptr, len, 
	[, values_offset = 0, overlay_text = nil, 
	scale_min = math.huge, scale_max = math.huge, 
	w = 0, h = 0])

ImGui:plotLines(label, points_table 
	[, values_offset = 0, overlay_text = nil, 
	scale_min = math.huge, scale_max = math.huge, 
	w = 0, h = 0])

ImGui:plotHistogram(label, points_table 
	[, values_offset = 0, overlay_text = nil, 
	scale_min = math.huge, scale_max = math.huge, 
	w = 0, h = 0])
    1. Widgets: Value() Helpers
ImGui:value(prefix, bool)
ImGui:value(prefix, number)
ImGui:value(prefix, float, format_string)
    1. 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])
ImGui:beginTooltip()
ImGui:endTooltip()
ImGui:setTooltip(text)
    1. Popups, Modals
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])
    1. 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])
    1. Table sort specs
-- TableSortSpecs = ImGui:tableGetSortSpecs()
number = TableSortSpecs:getSpecsCount()
flag = TableSortSpecs:isSpecsDirty()
TableSortSpecs:setSpecsDirty(flag)
table = TableSortSpecs:getColumnSortSpecs() -- see below
    1. Table column sort specs
-- table = TableSortSpecs:getColumnSortSpecs()
-- each value of this table is an object that have this functions:
number = item:getColumnUserID() 
number = item:getColumnIndex() -- 0 based
number = item:getSortOrder() -- used in multi sorted tables
number = item:getSortDirection() -- ImGui.SortDirection_Ascending OR ImGui.SortDirection_Descending

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

    1. Columns
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()
    1. 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])
    1. Logging/Capture
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)
    1. 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()
      1. Usage example
local names = {
	"Bobby", "Beatrice", "Betty",
	"Brianna", "Barry", "Bernard",
	"Bibi", "Blaine", "Bryn"
}
-- modes:
local Mode_Copy = 0
local Mode_Move = 1
local Mode_Swap = 2
 
local mode = 0 -- current mode

function onEnterFrame(e)
	UI:newFrame(e.deltaTime)
 
	if (UI:radioButton("Copy", mode == Mode_Copy)) then mode = Mode_Copy end UI:sameLine()
	if (UI:radioButton("Move", mode == Mode_Move)) then mode = Mode_Move end UI:sameLine()
	if (UI:radioButton("Swap", mode == Mode_Swap)) then mode = Mode_Swap end
 
	for i,v in ipairs(names) do
		UI:pushID(i)
		if (((i-1) % 3) ~= 0) then UI:sameLine() end
 
		UI:button(v, 60, 60)
 
		if (UI:beginDragDropSource(ImGui.DragDropFlags_None)) then
			--UI:setStrDragDropPayload("DND_DEMO_CELL", "ID_"..i) -- used for strings
			UI:setNumDragDropPayload("DND_DEMO_CELL", i) -- used for numbers
 
			if (mode == Mode_Copy) then UI:text(("Copy %s"):format(v)) end
			if (mode == Mode_Move) then UI:text(("Move %s"):format(v)) end
			if (mode == Mode_Swap) then UI:text(("Swap %s"):format(v)) end
			UI:endDragDropSource()
		end
 
		if (UI:beginDragDropTarget()) then
			local payload = UI:acceptDragDropPayload("DND_DEMO_CELL")
			if (payload) then
				--local payload_n = tonumber(payload:getStrData():sub(4))  -- if "setStrDragDropPayload" was used
				local payload_n = payload:getNumData() -- if "setNumDragDropPayload" was used
 
				if (mode == Mode_Copy) then
					names[i] = names[payload_n];
				end
				if (mode == Mode_Move) then
					names[i] = names[payload_n];
					names[payload_n] = "";
				end
 
				if (mode == Mode_Swap) then
					names[i], names[payload_n] = names[payload_n], names[i]
				end
			end
			UI:endDragDropTarget()
		end
		UI:popID()
	end
	UI:render()
	UI:endFrame()
end

stage:addEventListener("enterFrame", onEnterFrame)
      1. 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()
    1. Clipping
ImGui:pushClipRect(min_x, min_y, max_x, max_y, intersect_with_current_clip_rect)
ImGui:popClipRect()
    1. ImGuiListClipper

Try to avoid creating new instaces in "enterFrame" event

      1. Constructor
instance = ImGuiListClipper.new()
      1. 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)
      1. Usage example
ui = ImGui.new()
stage:addChild(ui)

clipper = ImGuiListClipper.new()

function onEnterFrame(e)
	ui:newFrame(e.deltaTime)
	
	if (ui:beginWindow("Clipper demo")) then
		if (ui:beginTable("table", 3)) then
			ui:tableSetupScrollFreeze(0, 1)
			ui:tableSetupColumn("One")
			ui:tableSetupColumn("Two")
			ui:tableSetupColumn("Three")
			ui:tableHeadersRow()
			
			clipper:beginClip(1000)
			while (clipper:step()) do 
				for row = clipper:getDisplayStart(), clipper:getDisplayEnd() do 
					ui:tableNextRow()
					for column = 1, 3 do 
						ui:tableSetColumnIndex(column - 1)
						ui:text(("col: %d; row: %d"):format(column, row))
					end
				end
			end
			clipper:endClip()
			
			ui:endTable()
		end
	end
	ui:endWindow()
	
	ui:endFrame()
	ui:render()
end

stage:addEventListener("enterFrame", onEnterFrame)
    1. ImGuiTextFilter

Try to avoid creating new instaces in "enterFrame" event

      1. Constructor
filter = ImGuiTextFilter.new()
      1. 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"
      1. Usage example №1

https://github.com/MultiPain/Gideros_ImGui/blob/28d2cdd4f393d6f2048792e51f695d56d7e0ae9a/imgui_src/imgui_demo.cpp#L5657

ui = ImGui.new()
stage:addChild(ui)

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

function onEnterFrame(e)
	ui:newFrame(e.deltaTime)
	
	if (ui:beginWindow("Filter demo")) then
		ui:text(
[[Filter usage:
	""         display all lines
	"xxx"      display lines containing "xxx"
	"xxx,yyy"  display lines containing "xxx" or "yyy"
	"-xxx"     hide lines containing "xxx"]])
		
		filter:draw("Filter")
		
		for i, text in ipairs(items) do 
			if filter:passFilter(text) then 
				ui:bulletText(text)
			end
		end
	end
	ui:endWindow()
	
	ui:endFrame()
	ui:render()
end

stage:addEventListener("enterFrame", onEnterFrame)
      1. Usage example №2
ui = ImGui.new()
stage:addChild(ui)
filter = ImGuiTextFilter.new()

searchText = ""
items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
function onEnterFrame(e)
	ui:newFrame(e.deltaTime)
	
	-- Draw standart text input control
	-- filter:drawWithHint("Filter", "Search")
	
	-- Draw custom control
	local valueChanged = false
	searchText, valueChanged = ui:inputText("Filter", searchText, 256, ImGui.InputTextFlags_EnterReturnsTrue)
	if valueChanged then
		filter:setBuffer(searchText)
		-- try to avoid calling "build" function every frame
		filter:build()
	end
	
	for i, item in ipairs(items) do
		if not filter:passFilter(item) then
			continue
		end
		
		ui:bulletText(item)
	end
	
	ui:endFrame()
	ui:render()
end
    1. Focus, Activation
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()
    1. 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()
    1. Text Utilities
w, h = ImGui:calcTextSize(text [, hide_text_after_double_hash = false, wrap_width = -1])
    1. Inputs Utilities: Keyboard
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])
    1. 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])
    1. Inputs Utilities: Mouse
-- "mouse_button" is any gideros mouse button code
flag = ImGui:isMouseDown(mouse_button)
flag = ImGui:isMouseClicked(mouse_button [, repeat = false])
flag = ImGui:isMouseReleased(mouse_button)
flag = ImGui:isMouseDoubleClicked(mouse_button)
flag = ImGui:isMouseHoveringRect(min_x, min_y, max_x, max_y [, clip = true])
flag = ImGui:isMousePosValid([x = inf, y = inf])
flag = ImGui:isAnyMouseDown()
x, y = ImGui:getMousePos()
x, y = ImGui:getMousePosOnOpeningCurrentPopup()
flag = ImGui:isMouseDragging(mouse_button [, lock_threshold = -1])
x, y = ImGui:getMouseDragDelta(mouse_button [, lock_threshold = -1])
ImGui:resetMouseDragDelta(mouse_button)
ImGuiMouseCursor = ImGui:getMouseCursor()
ImGui:setMouseCursor(ImGui.MouseCursor)
ImGui:setNextFrameWantCaptureMouse([want_capture_mouse_value = true])
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
ImGui:updateCursor()
    1. Render
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()

TextEditor

-- otherTextEditor: another "ImGuiTextEditor" instance to copy setting 
TextEditor = ImGuiTextEditor.new([other_text_editor])
    1. 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()


      1. LanguageDefinition
string = LanguageDefinition:getName()
      1. ErrorMarkers
ErrorMarkers = ImGuiErrorMarkers.new()

ErrorMarkers:add(line, message)
ErrorMarkers:remove(line)
message = ErrorMarkers:get(line)
number = ErrorMarkers:getSize()
      1. Breakpoints
Breakpoints = ImGuiBreakpoints.new()

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


ENUMS

      1. Keyboard keys
        1. Keys
ImGui.Key_None
ImGui.Key_Tab
ImGui.Key_LeftArrow
ImGui.Key_RightArrow
ImGui.Key_UpArrow
ImGui.Key_DownArrow
ImGui.Key_PageUp
ImGui.Key_PageDown
ImGui.Key_Home
ImGui.Key_End
ImGui.Key_Insert
ImGui.Key_Delete
ImGui.Key_Backspace
ImGui.Key_Space
ImGui.Key_Enter
ImGui.Key_Escape
ImGui.Key_LeftCtrl
ImGui.Key_LeftShift
ImGui.Key_LeftAlt
ImGui.Key_LeftSuper
ImGui.Key_RightCtrl
ImGui.Key_RightShift
ImGui.Key_RightAlt
ImGui.Key_RightSuper
ImGui.Key_Menu
ImGui.Key_MouseLeft
ImGui.Key_MouseRight
ImGui.Key_MouseMiddle
ImGui.Key_MouseX1
ImGui.Key_MouseX2
ImGui.Key_MouseWheelX
ImGui.Key_MouseWheelY
ImGui.Key_0
ImGui.Key_1
ImGui.Key_2
ImGui.Key_3
ImGui.Key_4
ImGui.Key_5
ImGui.Key_6
ImGui.Key_7
ImGui.Key_8
ImGui.Key_9
ImGui.Key_A
ImGui.Key_B
ImGui.Key_C
ImGui.Key_D
ImGui.Key_E
ImGui.Key_F
ImGui.Key_G
ImGui.Key_H
ImGui.Key_I
ImGui.Key_J
ImGui.Key_K
ImGui.Key_L
ImGui.Key_M
ImGui.Key_N
ImGui.Key_O
ImGui.Key_P
ImGui.Key_Q
ImGui.Key_R
ImGui.Key_S
ImGui.Key_T
ImGui.Key_U
ImGui.Key_V
ImGui.Key_W
ImGui.Key_X
ImGui.Key_Y
ImGui.Key_Z
ImGui.Key_F1
ImGui.Key_F2
ImGui.Key_F3
ImGui.Key_F4
ImGui.Key_F5
ImGui.Key_F6
ImGui.Key_F7
ImGui.Key_F8
ImGui.Key_F9
ImGui.Key_F10
ImGui.Key_F11
ImGui.Key_F12
ImGui.Key_Apostrophe
ImGui.Key_Comma
ImGui.Key_Minus
ImGui.Key_Period
ImGui.Key_Slash
ImGui.Key_Semicolon
ImGui.Key_Equal
ImGui.Key_LeftBracket
ImGui.Key_Backslash
ImGui.Key_RightBracket
ImGui.Key_GraveAccent
ImGui.Key_CapsLock
ImGui.Key_ScrollLock
ImGui.Key_NumLock
ImGui.Key_PrintScreen
ImGui.Key_Pause
ImGui.Key_Keypad0
ImGui.Key_Keypad1
ImGui.Key_Keypad2
ImGui.Key_Keypad3
ImGui.Key_Keypad4
ImGui.Key_Keypad5
ImGui.Key_Keypad6
ImGui.Key_Keypad7
ImGui.Key_Keypad8
ImGui.Key_Keypad9
ImGui.Key_KeypadDecimal
ImGui.Key_KeypadDivide
ImGui.Key_KeypadMultiply
ImGui.Key_KeypadSubtract
ImGui.Key_KeypadAdd
ImGui.Key_KeypadEnter
ImGui.Key_KeypadEqual
        1. Gamepad
ImGui.Key_GamepadStart
ImGui.Key_GamepadBack
ImGui.Key_GamepadFaceUp
ImGui.Key_GamepadFaceDown
ImGui.Key_GamepadFaceLeft
ImGui.Key_GamepadFaceRight
ImGui.Key_GamepadDpadUp
ImGui.Key_GamepadDpadDown
ImGui.Key_GamepadDpadLeft
ImGui.Key_GamepadDpadRight
ImGui.Key_GamepadL1
ImGui.Key_GamepadR1
ImGui.Key_GamepadL2
ImGui.Key_GamepadR2
ImGui.Key_GamepadL3
ImGui.Key_GamepadR3
ImGui.Key_GamepadLStickUp
ImGui.Key_GamepadLStickDown
ImGui.Key_GamepadLStickLeft
ImGui.Key_GamepadLStickRight
ImGui.Key_GamepadRStickUp
ImGui.Key_GamepadRStickDown
ImGui.Key_GamepadRStickLeft
ImGui.Key_GamepadRStickRight
        1. Modifiers
ImGui.Key_ModCtrl
ImGui.Key_ModShift
ImGui.Key_ModAlt
ImGui.Key_ModSuper
      1. FocusedFlags
ImGui.FocusedFlags_ChildWindows
ImGui.FocusedFlags_AnyWindow
ImGui.FocusedFlags_RootWindow
ImGui.FocusedFlags_RootAndChildWindows
ImGui.FocusedFlags_None
ImGui.FocusedFlags_NoPopupHierarchy
      1. PopupFlags
ImGui.PopupFlags_NoOpenOverExistingPopup
ImGui.PopupFlags_MouseButtonLeft
ImGui.PopupFlags_MouseButtonMask
ImGui.PopupFlags_MouseButtonRight
ImGui.PopupFlags_AnyPopupId
ImGui.PopupFlags_MouseButtonDefault
ImGui.PopupFlags_MouseButtonMiddle
ImGui.PopupFlags_None
ImGui.PopupFlags_AnyPopup
ImGui.PopupFlags_AnyPopupLevel
ImGui.PopupFlags_NoOpenOverItems
      1. HoveredFlags
ImGui.HoveredFlags_None
ImGui.HoveredFlags_RootAndChildWindows
ImGui.HoveredFlags_AllowWhenBlockedByPopup
ImGui.HoveredFlags_AllowWhenBlockedByActiveItem
ImGui.HoveredFlags_ChildWindows
ImGui.HoveredFlags_RectOnly
ImGui.HoveredFlags_AllowWhenDisabled
ImGui.HoveredFlags_AllowWhenOverlapped
ImGui.HoveredFlags_AnyWindow
ImGui.HoveredFlags_RootWindow
ImGui.HoveredFlags_NoNavOverride
ImGui.HoveredFlags_DelayNormal
ImGui.HoveredFlags_DelayShort
ImGui.HoveredFlags_NoSharedDelay
      1. InputTextFlags
ImGui.InputTextFlags_None
ImGui.InputTextFlags_EnterReturnsTrue
ImGui.InputTextFlags_ReadOnly
ImGui.InputTextFlags_AutoSelectAll
ImGui.InputTextFlags_AllowTabInput
ImGui.InputTextFlags_CharsScientific
ImGui.InputTextFlags_CharsDecimal
ImGui.InputTextFlags_NoUndoRedo
ImGui.InputTextFlags_CtrlEnterForNewLine
ImGui.InputTextFlags_CharsHexadecimal
ImGui.InputTextFlags_CharsNoBlank
ImGui.InputTextFlags_Password
ImGui.InputTextFlags_NoHorizontalScroll
ImGui.InputTextFlags_AlwaysInsertMode
ImGui.InputTextFlags_CharsUppercase
ImGui.InputTextFlags_NoBackground -- custom constant, used to disable background
ImGui.InputTextFlags_EscapeClearsAll
ImGui.InputTextFlags_CallbackCompletion
ImGui.InputTextFlags_CallbackResize
ImGui.InputTextFlags_CallbackAlways
ImGui.InputTextFlags_CallbackHistory
ImGui.InputTextFlags_CallbackCharFilter
ImGui.InputTextFlags_CallbackEdit
      1. NavInput
ImGui.NavInput_FocusNext
ImGui.NavInput_TweakFast
ImGui.NavInput_Input
ImGui.NavInput_DpadRight
ImGui.NavInput_FocusPrev
ImGui.NavInput_LStickDown
ImGui.NavInput_LStickUp
ImGui.NavInput_Activate
ImGui.NavInput_LStickLeft
ImGui.NavInput_LStickRight
ImGui.NavInput_DpadLeft
ImGui.NavInput_DpadDown
ImGui.NavInput_TweakSlow
ImGui.NavInput_DpadUp
ImGui.NavInput_Menu
ImGui.NavInput_Cancel
      1. TabBarFlags
ImGui.TabBarFlags_AutoSelectNewTabs
ImGui.TabBarFlags_NoCloseWithMiddleMouseButton
ImGui.TabBarFlags_TabListPopupButton
ImGui.TabBarFlags_NoTooltip
ImGui.TabBarFlags_FittingPolicyMask
ImGui.TabBarFlags_Reorderable
ImGui.TabBarFlags_FittingPolicyDefault
ImGui.TabBarFlags_FittingPolicyScroll
ImGui.TabBarFlags_FittingPolicyResizeDown
ImGui.TabBarFlags_None
ImGui.TabBarFlags_NoTabListScrollingButtons
      1. TreeNodeFlags
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
      1. StyleVar
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
      1. Col
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
      1. DataType
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
      1. Dir
ImGui.Dir_None
ImGui.Dir_Left
ImGui.Dir_Up
ImGui.Dir_Down
ImGui.Dir_Right
      1. WindowFlags
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
      1. TabItemFlags
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
      1. ComboFlags
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
      1. Cond
ImGui.Cond_Appearing
ImGui.Cond_None
ImGui.Cond_Always
ImGui.Cond_FirstUseEver
ImGui.Cond_Once
      1. SelectableFlags
ImGui.SelectableFlags_None
ImGui.SelectableFlags_SpanAllColumns
ImGui.SelectableFlags_AllowItemOverlap
ImGui.SelectableFlags_DontClosePopups
ImGui.SelectableFlags_AllowDoubleClick
ImGui.SelectableFlags_Disabled
      1. MouseCursor
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
      1. MouseButton
ImGui.MouseButton_Right
ImGui.MouseButton_Middle
ImGui.MouseButton_Left
      1. ColorEditFlags
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
      1. DragDropFlags
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
      1. corner_flags
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
      1. ConfigFlags
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
      1. BackendFlags
ImGui.BackendFlags_None
ImGui.BackendFlags_HasGamepad
ImGui.BackendFlags_HasMouseCursors
ImGui.BackendFlags_HasSetMousePos
ImGui.BackendFlags_RendererHasVtxOffset
      1. SliderFlags
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
      1. GlyphRanges
ImGui.GlyphRanges_Default,
ImGui.GlyphRanges_Korean,
ImGui.GlyphRanges_ChineseFull,
ImGui.GlyphRanges_ChineseSimplifiedCommon,
ImGui.GlyphRanges_Japanese,
ImGui.GlyphRanges_Cyrillic,
ImGui.GlyphRanges_Thai,
ImGui.GlyphRanges_Vietnamese
      1. ItemFlags
ImGui.ItemFlags_Disabled
ImGui.ItemFlags_ButtonRepeat
ImGui.ItemFlags_NoTabStop
      1. TableBgTarget
ImGui.TableBgTarget_None
ImGui.TableBgTarget_RowBg0
ImGui.TableBgTarget_RowBg1
ImGui.TableBgTarget_CellBg


      1. TableColumnFlags
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


      1. TableFlags
ImGui.TableFlags_None
ImGui.TableFlags_Resizable
ImGui.TableFlags_Reorderable
ImGui.TableFlags_Hideable
ImGui.TableFlags_Sortable
ImGui.TableFlags_NoSavedSettings
ImGui.TableFlags_ContextMenuInBody
ImGui.TableFlags_RowBg
ImGui.TableFlags_BordersInnerH 
ImGui.TableFlags_BordersOuterH
ImGui.TableFlags_BordersInnerV
ImGui.TableFlags_BordersOuterV
ImGui.TableFlags_BordersH
ImGui.TableFlags_BordersV
ImGui.TableFlags_BordersInner
ImGui.TableFlags_BordersOuter
ImGui.TableFlags_Borders
ImGui.TableFlags_NoBordersInBody
ImGui.TableFlags_NoBordersInBodyUntilResize
ImGui.TableFlags_SizingFixedFit
ImGui.TableFlags_SizingFixedSame
ImGui.TableFlags_SizingStretchProp
ImGui.TableFlags_SizingStretchSame
ImGui.TableFlags_NoHostExtendX
ImGui.TableFlags_NoHostExtendY
ImGui.TableFlags_NoKeepColumnsVisible
ImGui.TableFlags_PreciseWidths
ImGui.TableFlags_NoClip
ImGui.TableFlags_PadOuterX
ImGui.TableFlags_NoPadOuterX
ImGui.TableFlags_NoPadInnerX
ImGui.TableFlags_ScrollX
ImGui.TableFlags_ScrollY
ImGui.TableFlags_SortMulti
ImGui.TableFlags_SortTristate


      1. TableColumnFlags
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


      1. TableRowFlags
ImGui.TableRowFlags_None
ImGui.TableRowFlags_Headers


      1. SortDirection
ImGui.SortDirection_None
ImGui.SortDirection_Ascending
ImGui.SortDirection_Descending


      1. TE_ColorIndex
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
    1. ImageScaleMode
ImGui.ImageScaleMode_LetterBox
ImGui.ImageScaleMode_FitWidth
ImGui.ImageScaleMode_FitHeight
ImGui.ImageScaleMode_Stretch

DRAW LISTS

      1. Window draw list
local list = ImGui:getWindowDrawList()
      1. Background draw list
local list = ImGui:getBackgroundDrawList()
      1. Foreground draw list
local list = ImGui:getForegroundDrawList()
      1. 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)
...
      1. Usage example

<img src="https://user-images.githubusercontent.com/1312968/99901217-4697fa80-2cb5-11eb-9e80-c469cc69b848.gif">

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








Classes