Difference between revisions of "Dear ImGui API"

From GiderosMobile
(wip)
 
(25 intermediate revisions by the same user not shown)
Line 4: Line 4:
 
GitHub '''https://github.com/MultiPain/Gideros_ImGui'''
 
GitHub '''https://github.com/MultiPain/Gideros_ImGui'''
  
= Main =
 
 
== Constructor ==
 
== Constructor ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
Line 21: Line 20:
  
 
'''Functions''':
 
'''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.
 +
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
IO:setFontDefault(font)
 
IO:setFontDefault(font)
Line 28: Line 31:
 
ImGuiBackendFlag = IO:getBackendFlags()
 
ImGuiBackendFlag = IO:getBackendFlags()
 
IO:setBackendFlags(ImGui.BackendFlag)
 
IO:setBackendFlags(ImGui.BackendFlag)
 
 
number = IO:getIniSavingRate()
 
number = IO:getIniSavingRate()
 
IO:setIniSavingRate(number)
 
IO:setIniSavingRate(number)
 
string = IO:getIniFilename()
 
string = IO:getIniFilename()
 
IO:setIniFilename(string)
 
IO:setIniFilename(string)
IO:saveIniSettings([path]) -- if path is not defined it uses default path, which is set by IO:setIniFilename()
+
IO:saveIniSettings([path]) -- if path is not defined the it uses default path, which is set by IO:setIniFilename()
 
IO:loadIniSettings([path])
 
IO:loadIniSettings([path])
 
string = IO:getLogFilename()
 
string = IO:getLogFilename()
 
IO:setLogFilename(string)
 
IO:setLogFilename(string)
 
 
number = IO:getMouseDoubleClickTime()
 
number = IO:getMouseDoubleClickTime()
 
IO:setMouseDoubleClickTime(number)
 
IO:setMouseDoubleClickTime(number)
Line 50: Line 51:
 
number = IO:getKeyRepeatRate()
 
number = IO:getKeyRepeatRate()
 
IO:setKeyRepeatRate(number)
 
IO:setKeyRepeatRate(number)
 
 
number = IO:getFontGlobalScale()
 
number = IO:getFontGlobalScale()
 
IO:setFontGlobalScale(number)
 
IO:setFontGlobalScale(number)
Line 85: Line 85:
 
x, y = IO:getMouseDelta()
 
x, y = IO:getMouseDelta()
 
number = IO:getMouseDownSec(mouse_button)
 
number = IO:getMouseDownSec(mouse_button)
 
 
IO:setDisplaySize(w, h)
 
IO:setDisplaySize(w, h)
 
w, h = IO:getDisplaySize()
 
w, h = IO:getDisplaySize()
 
number = IO:getDeltaTime()
 
number = IO:getDeltaTime()
IO:resetMouseDown() -- reset mouse buttons state
+
-- reset mouse buttons state
IO:resetKeysDown() -- reset key states (including ALT/SHIFT/CTRL/SUPER (META))
+
IO:resetMouseDown()
IO:setModKeyDown(key_code, bool) -- set ALT/SHIFT/CTRL/SUPER (META) key state ("key_code" is a gideros MOD key)
+
-- reset key states (including ALT/SHIFT/CTRL/SUPER (META))
IO:setKeysDown(key_code, bool) -- set any key state ("key_code" is a Gideros regular "keyCode")
+
IO:resetKeysDown()
IO:addInputCharactersUTF8(text) -- adds text to active text input widget
+
-- set ALT/SHIFT/CTRL/SUPER (META) key state
IO:setMouseWheel(number) -- emulate wheel scrolling
+
IO:setModKeyDown(key_code, bool) -- "key_code" is a gideros MOD key
IO:setMousePos(x, y) -- sets mouse position (data only, no visual changes)
+
-- set any key state
IO:setMouseDown(mouse_button, state) -- set mouse state, where index: 0 - left mouse, 1 - right, 2 - middle, 3 - unused, 4 - unused ("mouse_button" is a Gideros mouse button code)
+
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
  
IO:addKeyEvent(key, down) -- "key" is any ImGui KeyCode (check keyboard-keys), "down" is a boolean
+
-- "key" is any ImGui KeyCode (check [here](#keyboard-keys))
IO:addKeyAnalogEvent(key, down, number) -- "key" is any ImGui KeyCode (check keyboard-keys), "down" is a boolean
+
-- "down" is a boolean
IO:addMousePosEvent(x, y)
+
IO:addKeyEvent(key, down)
IO:addMouseButtonEvent(button, down) -- "button" is any ImGui button (check MouseButton), "down" is a boolean
+
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:addMouseWheelEvent(x, y)
  
Line 206: Line 216:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== DEFAULT STYLES ==
+
=== DEFAULT STYLES ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
ImGui:setDarkStyle()
 
ImGui:setDarkStyle()
Line 226: Line 236:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Demos ==
+
=== Demos ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
is_openFlag = ImGui:showUserGuide()
 
is_openFlag = ImGui:showUserGuide()
Line 248: Line 258:
 
<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])
draw = ImGui:beginWindow(label, nil [, ImGui.WindowFlags = 0]) -- do not show "X" button
+
-- do not show "X" button
p_open, draw = ImGui:beginFullScreenWindow(label, p_open [, ImGui.WindowFlags = 0]) -- start a window with no borders, no paddings, no rounding and ImGui.WindowFlags_Fullscreen flag
+
draw = ImGui:beginWindow(label, nil [, ImGui.WindowFlags = 0])
draw = ImGui:beginFullScreenWindow(label, nil [, ImGui.WindowFlags = 0]) -- do not show "X" button
+
-- 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()
 
ImGui:endWindow()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Child Windows ==
+
=== 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:
 
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 -> use remaining host window size
Line 297: Line 310:
 
ImGui:setWindowFocus(name) OR ImGui:setWindowFocus()
 
ImGui:setWindowFocus(name) OR ImGui:setWindowFocus()
 
ImGui:setWindowFontScale(scale)
 
ImGui:setWindowFontScale(scale)
ImGui:scrollWhenDragging(x, y) -- scroll window when touching void
+
-- scroll window when touching void
 +
ImGui:scrollWhenDragging(x, y)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Line 303: Line 317:
 
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">
ImGui:setNextWindowSizeConstraints(min_w, min_h, max_w, max_h [, resize_callback, user_data])) -- call this function before ImGui:beginWindow()
+
-- call this function before ImGui:beginWindow()
 +
ImGui:setNextWindowSizeConstraints(min_w, min_h, max_w, max_h [, resize_callback, user_data]))
 
-- resizeCallback is a function:
 
-- resizeCallback is a function:
 
function (callbackData [, user_data])
 
function (callbackData [, user_data])
Line 314: Line 329:
 
'''Resize callback''':
 
'''Resize callback''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
x, y = callbackData:getPos() -- get window position
+
-- get window position
 +
x, y = callbackData:getPos()
 
x = callbackData:getX()
 
x = callbackData:getX()
 
y = callbackData:getY()
 
y = callbackData:getY()
  
current_width, current_height = callbackData:getCurrentSize() -- get currrent size
+
-- get currrent size
 +
current_width, current_height = callbackData:getCurrentSize()
 
current_width = callbackData:getCurrentWidth()
 
current_width = callbackData:getCurrentWidth()
 
current_height = callbackData:getCurrentHeight()
 
current_height = callbackData:getCurrentHeight()
  
desired_width, desired_height = callbackData:getDesiredSize() -- get desired size
+
-- get desired size
 +
desired_width, desired_height = callbackData:getDesiredSize()
 
desired_width = callbackData:getDesiredWidth()
 
desired_width = callbackData:getDesiredWidth()
 
desired_height = callbackData:getDesiredHeight()
 
desired_height = callbackData:getDesiredHeight()
Line 383: Line 401:
 
</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 407: Line 425:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Cursor / Layout ===
+
== Cursor / Layout ==
 
* By "cursor" we mean the current output position.
 
* 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.
 
* The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down.
Line 440: Line 458:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== ID stack/scopes ===
+
== 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.
+
* 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.
 
* 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.
 
* You can also use the "Label##foobar" syntax within widget label to distinguish them from each others.
Line 450: Line 468:
 
ImGui:pushID(str)
 
ImGui:pushID(str)
 
ImGui:popID()
 
ImGui:popID()
number = ImGui:getID(any_value)
+
number = ImGui:getID(anyValue)
number = ImGui:getID(string)
+
number = ImGui:getID(str)
 
number = ImGui:getItemID()
 
number = ImGui:getItemID()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
== WIDGETS ==
 +
=== Widgets: Text ===
 +
<syntaxhighlight lang="lua">
 +
ImGui:textUnformatted(text [, textEnd])
 +
ImGui:text(text)
 +
ImGui:textColored(text, color, alpha)
 +
ImGui:textDisabled(text)
 +
ImGui:textWrapped(text)
 +
ImGui:labelText(text, label)
 +
ImGui:bulletText(text)
 +
ImGui:separatorText(label)
 +
</syntaxhighlight>
  
 +
=== Widgets: Main ===
 +
<syntaxhighlight lang="lua">
 +
flag = ImGui:button(text [, w = 0, h = 0])
 +
flag = ImGui:smallButton(text)
 +
flag = ImGui:invisibleButton(string_ID [, w = 0, h = 0])
 +
flag = ImGui:arrowButton(string_ID [, ImGui.Dir = 0])
 +
flag = ImGui:checkbox(text, flag)
 +
flags, is_changed = ImGui:checkboxFlags(label [, flags = 0, flags_value = 0])
 +
number, is_changed = ImGui:radioButton(text, number, number)
 +
is_changed = ImGui:radioButton(text, flag)
 +
ImGui:progressBar(fraction [, anchor_x = -1, anchor_y = 0, overlay_string = nil])
 +
ImGui:bullet()
 +
</syntaxhighlight>
  
 +
=== Widgets: Images ===
 +
<syntaxhighlight lang="lua">
 +
-- Images are streched (ImGui default functions)
 +
ImGui:image(texture, w, h
 +
[, tint_color = 0xffffff, tint_alpha = 1,
 +
border_color = 0xffffff, border_alpha = 0])
  
 +
ImGui:imageUV(texture,
 +
w, h,
 +
uv0x, uv0y,
 +
uv1x, uv1y,
 +
[, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0])
  
 +
pressFlag = ImGui:imageButton(str_id, texture, w, h
 +
[, tint_color = 0xffffff, tint_alpha = 1,
 +
border_color = 0xffffff, border_alpha = 0])
  
 +
pressFlag = ImGui:imageButtonUV(str_id, texture, w, h,
 +
uv0x, uv0y, uv1x, uv1y
 +
[, tint_color = 0xffffff, tint_alpha = 1,
 +
border_color = 0xffffff, border_alpha = 0])
  
 +
-- Images are scaled (extended by @MultiPain)
 +
-- padding deprecated
 +
-- (use "ImGui:pushStyleVar(ImGui.StyleVar_FramePadding, x, y)/ImGui:popStyleVar()")
 +
ImGui:scaledImage(str_id, texture, w, h
 +
[, fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false,
 +
anchor_x = 0.5, anchor_y = 0.5,
 +
tint_col = 0xffffff, tint_alpha = 1,
 +
border_col = 0, border_alpha = 0,
 +
bg_col = 0, bg_alpha = 0])
  
 +
pressFlag = ImGui:scaledImageButton(str_id, texture, w, h
 +
[, fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false,
 +
ImGui.ButtonFlags = 0, anchor_x = 0.5, anchor_y = 0.5,
 +
clip_offset_x = 0, clip_offset_y = 0,
 +
tint_col = 0xffffff, tint_alpha = 1,
 +
border_col = 0, border_alpha = 0,
 +
bg_col = 0, bg_alpha = 0])
  
 +
pressFlag = ImGui:scaledImageButtonWithText(texture, label, image_w, image_h
 +
[, button_w = 0, button_h = 0, ImGui.ButtonFlags = 0,
 +
fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false,
 +
anchor_x = 0.5, anchor_y = 0.5, image_side = ImGui.Dir_Left,
 +
clip_offset_x = 0, clip_offset_y = 0,
 +
tint_col = 0xffffff, tint_alpha = 1,
 +
border_col = 0, border_alpha = 0,
 +
bg_col = 0, bg_alpha = 0])
 +
</syntaxhighlight>
  
 +
=== Widgets: Combo Box ===
 +
<syntaxhighlight lang="lua">
 +
openFlag = ImGui:beginCombo(text, preview_text [, ImGui.ComboFlags = 0])
 +
ImGui:endCombo()
 +
current_item, is_open = ImGui:combo(label, current_item, items) -- items (table): {"item1", "item2", ...}
 +
</syntaxhighlight>
  
 +
=== Widgets: Drags ===
 +
<syntaxhighlight lang="lua">
 +
value, is_changed = ImGui:dragFloat(label, value
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%.3f", ImGui.SliderFlags = 0])
  
 +
value1, value2, is_changed = ImGui:dragFloat2(label, value1, value2
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%.3f", ImGui.SliderFlags = 0])
  
 +
value1, value2, value3, is_changed = ImGui:dragFloat3(label, value1, value2, value3
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%.3f", ImGui.SliderFlags = 0])
  
 +
value1, value2, value3, value4, is_changed = ImGui:dragFloat4(label, value1, value2, value3, value4
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%.3f", ImGui.SliderFlags = 0])
  
 +
value_min, value_max, is_changed = ImGui:dragFloatRange2(label, value_min, value_max
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_min_string = "%.3f", ImGui.SliderFlags = 0])
 +
-- table must be an array of any size > 0
 +
is_changed = ImGui:dragFloatT(label, table
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%.3f", ImGui.SliderFlags = 0])
  
 +
value, is_changed = ImGui:dragInt(label, value
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%d", ImGui.SliderFlags = 0])
  
 +
value1, value2, is_changed = ImGui:dragInt2(label, value1, value2
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%d", ImGui.SliderFlags = 0])
  
 +
value1, value2, value3, is_changed = ImGui:dragInt3(label, value1, value2, value3
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%d", ImGui.SliderFlags = 0])
  
 +
value1, value2, value3, value4, is_changed = ImGui:dragInt4(label, value1, value2, value3, value4
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%d", ImGui.SliderFlags = 0])
  
 +
v_current_min, v_current_max, flag = ImGui:dragIntRange2(label, v_current_min, v_current_max
 +
[, v_speed = 1, v_min = 0, v_max = 0,
 +
format = "%d", format_max = nil, ImGui.SliderFlags = 0])
  
 +
-- table must be an array of any size > 0
 +
is_changed = ImGui:dragIntT(label, table
 +
[, inc_step = 1, min = 0, max = 0,
 +
format_string = "%d", ImGui.SliderFlags = 0])
 +
</syntaxhighlight>
  
 
+
=== Widgets: Sliders ===
 
 
 
 
 
 
 
 
 
 
== EXPERIMENTAL ==
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
p_open = ImGui:showLog(title, p_open [, ImGui.WindowFlags = 0]) -- draw log window
+
value, is_changed = ImGui:sliderFloat(label, value
ImGui:writeLog(text)
+
[, min = 0, max = 0,
</syntaxhighlight>
+
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])
  
Gestures (touch only, turned OFF by default) ''WIP'':
+
value1, value2, value3, value4, is_changed = ImGui:sliderFloat4(label, value1, value2, value3, value4
* tap gesture (Left Mouse Button)
+
[, min = 0, max = 0,
* hold gesture (Right Mouse Button)
+
format_string = "%.3f", ImGui.SliderFlags = 0])
<syntaxhighlight lang="lua">
 
ImGui:setTouchGesturesEnabled(bool)
 
bool = ImGui:isTouchGesturesEnabled()
 
</syntaxhighlight>
 
  
 +
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])
  
== FONTS ==
+
value, is_changed = ImGui:vFilledSliderFloat(label, mirror_flag, w, h, value, min, max
<syntaxhighlight lang="lua">
+
[, format_string = "%.3f", ImGui.SliderFlags = 0])
IO = imgui:getIO()
 
FontAtlas = IO:getFonts()
 
  
Font = FontAtlas:addFont(ttf_font_path, font_size [, options])
+
value, is_changed = ImGui:vFilledSliderInt(label, mirror_flag, w, h, value, min, max
 +
[, format_string = "%d", ImGui.SliderFlags = 0])
 +
</syntaxhighlight>
  
-- options (table): all parameters are optional
+
=== Widgets: Input with Keyboard ===
--     fontDataOwnedByAtlas - bool
+
<syntaxhighlight lang="lua">
--     pixelSnapH - bool
+
text, flag = ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0])
--     mergeMode - bool
+
text, flag = ImGui:inputTextMultiline(label, text, buffer_size [, w = 0, h = 0, ImGui.InputTextFlags = 0])
--     fontNo - number
+
text, flag = ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0])
--     oversampleH - number
+
value,  flag = ImGui:inputFloat(label, value [, step = 0, step_fast = 0, format = "%.3f", ImGui.InputTextFlags = 0])
--     oversampleV - number
+
value1, value2, flag = ImGui:inputFloat2(label, value1, value2 [, format = "%.3f", ImGui.InputTextFlags = 0])
--     glyphExtraSpacingX - number
+
value1, value2, value3, flag = ImGui:inputFloat3(label, value1, value2, value3 [, format = "%.3f", ImGui.InputTextFlags = 0])
--     glyphExtraSpacingY - number
+
value1, value2, value3, value4, flag = ImGui:inputFloat4(label, value1, value2, value3, value4 [, format = "%.3f", ImGui.InputTextFlags = 0])
--     glyphOffsetX - number
+
-- table must be an array of any size > 0
--     glyphOffsetY - number
+
flag = ImGui:inputFloatT(label, table [, format = "%.3f", ImGui.InputTextFlags = 0])
--     glyphMinAdvanceX - number
+
value,  flag = ImGui:inputInt(label, value [, step = 0, step_fast = 0, ImGui.InputTextFlags = 0])
--     glyphMaxAdvanceX - number
+
value1, value2, flag = ImGui:inputInt2(label, value1, value2 [, ImGui.InputTextFlags = 0])
--     rasterizerFlags - number
+
value1, value2, value3, flag = ImGui:inputInt3(label, value1, value2, value3 [, ImGui.InputTextFlags = 0])
--     rasterizerMultiply - number
+
value1, value2, value3, value4, flag = ImGui:inputInt4(label, value1, value2, value3, value4 [, ImGui.InputTextFlags = 0])
--
+
-- table must be an array of any size > 0
--     glyphs - table:
+
flag = ImGui:inputIntT(label, table [, format = "%d", ImGui.InputTextFlags = 0])
--     text(string): represents available chars
+
value, flag = ImGui:inputDouble(label, value [, step = 0, step_fast = 0, format = "%.6f", ImGui.InputTextFlags = 0])
--     chars(table): list of specific char code (example: {0x7262, ...})
+
</syntaxhighlight>
--     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)
+
'''Input text callbacks''':
FontAtlas:build() -- call after multiple FontAtlas:addFont(...) calls to update ImGui font atlas
+
<syntaxhighlight lang="lua">
FontAtlas:clearInputData()
+
ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
FontAtlas:clearTexData()
+
ImGui:inputTextMultiline(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
FontAtlas:clearFonts()
+
ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
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])
+
callback_function = function(callback_data, user_data)
ImGui:popFont()
+
-- do something with data
 +
-- see below
 +
end
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Minimal example''':
+
'''callback_data''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
local UI = ImGui.new()
+
ImGuiInputTextFlags = callback_data:getEventFlag()
local IO = UI:getIO()
+
ImGuiInputTextFlags = callback_data:getFlags()
local FontAtlas = IO:getFonts()
+
 
local VDS_font = FontAtlas:addFont("fonts/VDS.ttf", 16, {
+
number = callback_data:getEventChar()
    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
+
callback_data:setEventChar(number)
function enterFrame(e)
 
UI:newFrame(e.deltaTime)
 
 
UI:pushFont(font1)
 
UI:text("Font1")
 
UI:popFont()
 
 
UI:pushFont(font2)
 
UI:text("Font2")
 
UI:popFont()
 
 
UI:render()
 
UI:endFrame()
 
end
 
</syntaxhighlight>
 
  
'''Glyphs example''':
+
keyCode = callback_data:getEventKey()
<syntaxhighlight lang="lua">
+
 
local fonts = io:getFonts()
+
string = callback_data:getBuf()
fonts:addFont(font_path, font_size, {
+
 
glyphs = {
+
callback_data:setBuf(string)
ranges = {
+
 
{
+
number = callback_data:getBufTextLen()
0x2590,0x2593, -- range1
+
 
0x2660,0x266B  -- range2
+
callback_data:setBufTextLen(number)
-- ...
+
 
},
+
number = callback_data:getBufSize()
ImGui.GlyphRanges_Cyrillic,
+
 
{
+
callback_data:setBufDirty(bool)
0x01C0, 0x01C3 -- range3
+
bool = callback_data:isBufDirty()
},
 
ImGui.GlyphRanges_Korean
 
},
 
 
-- same structure:
 
ranges = {
 
{
 
0x2590,0x2593, -- range1
 
0x2660,0x266B, -- range2
 
0x01C0,0x01C3  -- range3
 
-- ...
 
},
 
ImGui.GlyphRanges_Cyrillic,
 
ImGui.GlyphRanges_Korean
 
}
 
},
 
mergeMode = true, -- merge into previous font
 
})
 
fonts:build()
 
</syntaxhighlight>
 
  
'''Icons example''':
+
callback_data:setCursorPos(number)
<syntaxhighlight lang="lua">
+
number = callback_data:getCursorPos()
local icon = utf8.char(0x2590)
 
ImGui:text("My icon >>" .. icon .. " << !!!")
 
  
-- or with new Luau support:
+
callback_data:setSelectionStart(s_start)
ImGui:text("My icon >> \u{2590} << !!!")
+
number = callback_data:getSelectionStart()
-- can be also stored in memory:
+
 
local icon = "\u{2590}"
+
callback_data:setSelectionEnd(s_end)
 +
s_end = callback_data:getSelectionEnd()
 +
 
 +
callback_data:setSelection(s_start, s_end)
 +
s_start, s_end = callback_data:getSelection()
 +
 
 +
callback_data:selectAll()
 +
callback_data:clearSelection()
 +
bool = callback_data:hasSelection()
 +
 
 +
callback_data:deleteChars(position, bytesCount)
 +
callback_data:insertChars(position, text)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Font ==
+
'''Example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
number = Font:getSize()
+
require "ImGui"
FontAtlas = Font:getContainerAtlas()
+
 
Font:setScale(number)
+
ui = ImGui.new()
number = Font:getScale()
+
stage:addChild(ui)
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
 
</syntaxhighlight>
 
  
== INPUTS ==
+
local testMessage1 = ""
<syntaxhighlight lang="lua">
+
local testMessage2 = ""
ImGui:onMouseHover(event)
+
local testMessage3 = ""
ImGui:onMouseMove(event)
 
ImGui:onMouseDown(event)
 
ImGui:onMouseUp(event)
 
ImGui:onMouseWheel(event)
 
  
ImGui:onTouchMove(event)
+
-- Add ".." at the end of current input string
ImGui:onTouchBegin(event)
+
function myCallback1(data)
ImGui:onTouchEnd(event)
+
data:insertChars(data:getCursorPos(), "..")
ImGui:onTouchCancel(event)
+
end
  
ImGui:onKeyUp(event)
+
-- Replace all chars if UP/DOWN arrow is pressed
ImGui:onKeyDown(event)
+
function myCallback2(data)
ImGui:onKeyChar(event)
+
local key = data:getEventKey()
</syntaxhighlight>
+
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
  
'''Usage examples''':
+
-- Switch case of the first char
<syntaxhighlight lang="lua">
+
function myCallback3(data)
local UI = ImGui.new(nil, false, false, false)
+
local buf = data:getBuf()
</syntaxhighlight>
+
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
  
'''Mouse'''
+
function enterFrame(e)
<syntaxhighlight lang="lua">
+
ui:newFrame(e.deltaTime)
stage:addEventListener("mouseHover", function(e) UI:onMouseHover(e) end)
+
stage:addEventListener("mouseMove", function(e) UI:onMouseMove(e) end)
+
testMessage1 = ui:inputText(
stage:addEventListener("mouseDown", function(e) UI:onMouseDown(e) end)
+
"Label1",  
stage:addEventListener("mouseUp", function(e) UI:onMouseUp(e) end)
+
testMessage1,
stage:addEventListener("mouseWheel", function(e) UI:onMouseWheel(e) end)
+
64,  
</syntaxhighlight>
+
ImGui.InputTextFlags_CallbackCompletion,  
 
+
myCallback1
'''Touch'''
+
)
<syntaxhighlight lang="lua">
+
testMessage2 = ui:inputText(
stage:addEventListener("touchesCancel", function(e) ui:onTouchCancel(e) end)
+
"Label2",  
stage:addEventListener("touchesMove", function(e) ui:onTouchMove(e) end)
+
testMessage2,
stage:addEventListener("touchesBegin", function(e) ui:onTouchBegin(e) end)
+
64,
stage:addEventListener("touchesEnd", function(e) ui:onTouchEnd(e) end)
+
ImGui.InputTextFlags_CallbackHistory,
 +
myCallback2
 +
)
 +
testMessage3 = ui:inputText(
 +
"Label3",  
 +
testMessage3,
 +
64,
 +
ImGui.InputTextFlags_CallbackEdit,
 +
myCallback3
 +
)
 +
 +
ui:render()
 +
ui:endFrame()
 +
end
 +
 
 +
stage:addEventListener("enterFrame", enterFrame)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Keyboard'''
+
=== Widgets: Color Editor/Picker ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
stage:addEventListener("keyUp", function(e) UI:onKeyUp(e) end)
+
hexColor, is_touching = ImGui:colorEdit3(label, color [, ImGui.ColorEditFlags = 0]) -- alpha ignored, no need to pass it!
stage:addEventListener("keyDown", function(e) UI:onKeyDown(e) end)
+
hexColor, alpha, is_touching = ImGui:colorEdit4(label, color [, alpha = 1, ImGui.ColorEditFlags = 0])
stage:addEventListener("keyChar", function(e) UI:onKeyChar(e) end)
+
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 ===
== Color convert ==
 
'''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])
+
is_openFlag = ImGui:treeNode(label [, format_string])
hex = ImGui.colorConvertRGBtoHEX(r, g, b)
+
ImGui:treeNodeEx(label, ImGui.TreeNodeFlags [, format_string])
h, s, v = ImGui.colorConvertRGBtoHSV(r, g, b)
+
ImGui:treePush(str_id)
r, g, b = ImGui.colorConvertHSVtoRGB(h, s, v)
+
ImGui:treePop()
h, s, v = ImGui.colorConvertHEXtoHSV(hex)
+
number = ImGui:getTreeNodeToLabelSpacing()
hex = ImGui.colorConvertHSVtoHEX(h, s, v)
+
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 ===
 +
<syntaxhighlight lang="lua">
 +
result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])
 +
</syntaxhighlight>
  
== Context ==
+
=== Widgets: List Boxes ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
string OR nil = ImGui:getHoveredWindow()
+
-- item_table: {"Item0", "Item1", ...}
string OR nil = ImGui:getHoveredWindowRoot()
+
current_item, is_openFlag = ImGui:listBox(label, current_item, item_table [, max_visible_items = -1])
string OR nil = ImGui:getHoveredWindowUnderMovingWindow()
+
result? = ImGui:listBoxHeader(label [, w = 0, h = 0])
string OR nil = ImGui:getMovingWindow()
+
result? = ImGui:listBoxHeader2(label, items_count)
string OR nil = ImGui:getActiveIdWindow()
+
ImGui:listBoxFooter()
id = ImGui:getActiveId()
+
</syntaxhighlight>
id = ImGui:getActiveIdPreviousFrame()
+
 
number = ImGui:getActiveIdTimer()
+
=== Widgets: Data Plotting ===
id = ImGui:getActiveIdAllowOverlap()
+
'''Caching''':
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 ==
+
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).
=== Disabled groups ===
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:beginDisabled(disabledFlag)
+
-- store points in memory
ImGui:endDisabled()
+
-- points_table: {0.01, 0.5, 10, -50, ...}
 +
-- ptr: c++ pointer to a given vector
 +
ptr = ImGui.cachePoints(points_table)
 +
 
 +
-- delete points from memory
 +
ImGui.freePoints(ptr)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
+
'''Plot functions''':
=== Widgets: Text ===
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:textUnformatted(text [, textEnd])
+
-- len (number): points array length
ImGui:text(text)
+
ImGui:plotCachedLines(label, ptr, len,
ImGui:textColored(text, color, alpha)
+
[, values_offset = 0, overlay_text = nil,
ImGui:textDisabled(text)
+
scale_min = math.huge, scale_max = math.huge,
ImGui:textWrapped(text)
+
w = 0, h = 0])
ImGui:labelText(text, label)
 
ImGui:bulletText(text)
 
ImGui:separatorText(label)
 
</syntaxhighlight>
 
  
=== Widgets: Main ===
+
ImGui:plotCachedHistogram(label, ptr, len,
<syntaxhighlight lang="lua">
+
[, values_offset = 0, overlay_text = nil,
flag = ImGui:button(text [, w = 0, h = 0])
+
scale_min = math.huge, scale_max = math.huge,
flag = ImGui:smallButton(text)
+
w = 0, h = 0])
flag = ImGui:invisibleButton(string_ID [, w = 0, h = 0])
 
flag = ImGui:arrowButton(string_ID [, ImGui.Dir = 0])
 
flag = ImGui:checkbox(text, flag)
 
flags, is_changed = ImGui:checkboxFlags(label [, flags = 0, flags_value = 0])
 
number, is_changed = ImGui:radioButton(text, number, number)
 
is_changed = ImGui:radioButton(text, flag)
 
ImGui:progressBar(fraction [, anchor_x = -1, anchor_y = 0, overlay_string = nil])
 
ImGui:bullet()
 
</syntaxhighlight>
 
  
=== Widgets: Images ===
+
ImGui:plotLines(label, points_table
<syntaxhighlight lang="lua">
+
[, values_offset = 0, overlay_text = nil,
ImGui:image(texture, w, h [, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0]) -- images are streched (ImGui default functions)
+
scale_min = math.huge, scale_max = math.huge,
ImGui:imageUV(texture, w, h, uv0x, uv0y, uv1x, uv1y [, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0]) -- images are streched (ImGui default functions)
+
w = 0, h = 0])
pressFlag = ImGui:imageButton(str_id, texture, w, h [, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0]) -- images are streched (ImGui default functions)
 
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 streched (ImGui default functions)
 
  
-- padding deprecated (use "ImGui:pushStyleVar(ImGui.StyleVar_FramePadding, x, y)/ImGui:popStyleVar()")
+
ImGui:plotHistogram(label, points_table
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]) -- images are scaled
+
[, values_offset = 0, overlay_text = nil,
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]) -- images are scaled
+
scale_min = math.huge, scale_max = math.huge,
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]) -- images are scaled
+
w = 0, h = 0])
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Widgets: Combo Box ===
+
'''Example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
openFlag = ImGui:beginCombo(text, preview_text [, ImGui.ComboFlags = 0])
+
-- delete ptr if it exist
ImGui:endCombo()
+
function deletePtr()
current_item, is_open = ImGui:combo(label, current_item, items) -- items (table): {"item1", "item2", ...}
+
if pointsPtr then
</syntaxhighlight>
+
ImGui.freePoints(pointsPtr)
 +
end
 +
end
  
=== Widgets: Drags ===
+
function onEnterFrame()
<syntaxhighlight lang="lua">
+
ui:newFrame(e.deltaTime)
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])
+
if ui:button("Generate") then
value1, value2, value3, is_changed = ImGui:dragFloat3(label, value1, value2, value3 [, inc_step = 1, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
+
deletePtr()
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])
+
points = generatePoints() -- returns big array
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])
+
pointsPtr = ImGui.cachePoints(points)
is_changed = ImGui:dragFloatT(label, table [, inc_step = 1, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
+
end
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])
+
if pointsPtr then
value1, value2, value3, is_changed = ImGui:dragInt3(label, value1, value2, value3 [, inc_step = 1, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
+
ui:plotCachedLines("Big data", pointsPtr, #points)
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])
+
end
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])
+
is_changed = ImGui:dragIntT(label, table [, inc_step = 1, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
+
ui:render()
</syntaxhighlight>
+
ui:endFrame()
 
+
end
=== Widgets: Sliders ===
+
 
<syntaxhighlight lang="lua">
+
-- do not forget to clear memory when app is closing
value, is_changed = ImGui:sliderFloat(label, value [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
+
function onAppExit()
value1, value2, is_changed = ImGui:sliderFloat2(label, value1, value2 [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
+
deletePtr()
value1, value2, value3, is_changed = ImGui:sliderFloat3(label, value1, value2, value3 [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
+
end
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])
 
is_changed = ImGui:sliderFloatT(label, table [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0]) -- table must be an array of any size > 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])
 
is_changed = ImGui:sliderIntT(label, table [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0]) -- table must be an array of any size > 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])
 
is_changed = ImGui:filledSliderFloatT(label, mirror_flag, table [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0]) -- table must be an array of any size > 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])
 
is_changed = ImGui:filledSliderIntT(label, mirror_flag, table [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
 
value, is_changed = ImGui:vFilledSliderFloat(label, mirror_flag, w, h, value, min, max [, format_string = "%.3f", ImGui.SliderFlags = 0])
 
value, is_changed = ImGui:vFilledSliderInt(label, mirror_flag, w, h, value, min, max [, format_string = "%d", ImGui.SliderFlags = 0])
 
</syntaxhighlight>
 
 
 
=== Widgets: Input with Keyboard ===
 
<syntaxhighlight lang="lua">
 
text, flag = ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0])
 
text, flag = ImGui:inputTextMultiline(label, text, buffer_size [, w = 0, h = 0, ImGui.InputTextFlags = 0])
 
text, flag = ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0])
 
value,  flag = ImGui:inputFloat(label, value [, step = 0, step_fast = 0, format = "%.3f", ImGui.InputTextFlags = 0])
 
value1, value2, flag = ImGui:inputFloat2(label, value1, value2 [, format = "%.3f", ImGui.InputTextFlags = 0])
 
value1, value2, value3, flag = ImGui:inputFloat3(label, value1, value2, value3 [, format = "%.3f", ImGui.InputTextFlags = 0])
 
value1, value2, value3, value4, flag = ImGui:inputFloat4(label, value1, value2, value3, value4 [, format = "%.3f", ImGui.InputTextFlags = 0])
 
flag = ImGui:inputFloatT(label, table [, format = "%.3f", ImGui.InputTextFlags = 0]) -- table must be an array of any size > 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])
 
flag = ImGui:inputIntT(label, table [, format = "%d", ImGui.InputTextFlags = 0]) -- table must be an array of any size > 0
 
value, flag = ImGui:inputDouble(label, value [, step = 0, step_fast = 0, format = "%.6f", ImGui.InputTextFlags = 0])
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Input text callbacks''':
+
=== Widgets: Value() Helpers ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
+
ImGui:value(prefix, bool)
ImGui:inputTextMultiline(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
+
ImGui:value(prefix, number)
ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
+
ImGui:value(prefix, float, format_string)
 +
</syntaxhighlight>
  
callback_function = function(callback_data, user_data)
+
=== Widgets: Menus ===
-- do something with data
+
<syntaxhighlight lang="lua">
-- see below
+
result? = ImGui:beginMenuBar()
end
+
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>
 
</syntaxhighlight>
  
'''callback_data''':
+
=== Widgets: Tooltips ===
 +
Tooltip are windows following the mouse which do not take focus away.
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGuiInputTextFlags = callback_data:getEventFlag()
+
ImGui:beginTooltip()
ImGuiInputTextFlags = callback_data:getFlags()
+
ImGui:endTooltip()
 +
ImGui:setTooltip(text)
 +
</syntaxhighlight>
  
number = callback_data:getEventChar()
+
=== Disabled groups ===
 +
<syntaxhighlight lang="lua">
 +
ImGui:beginDisabled(disabledFlag)
 +
ImGui:endDisabled()
 +
</syntaxhighlight>
  
callback_data:setEventChar(number)
+
== 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''')
  
keyCode = callback_data:getEventKey()
+
* 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.
  
string = callback_data:getBuf()
+
('''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:setBuf(string)
+
<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:getBufTextLen()
+
== 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:setBufTextLen(number)
+
<syntaxhighlight lang="lua">
 
+
ImGui:columns([count = 1, id = nil, border = true])
number = callback_data:getBufSize()
+
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:setBufDirty(bool)
+
== Tab Bars, Tabs ==
bool = callback_data:isBufDirty()
+
<syntaxhighlight lang="lua">
 +
bool = ImGui:beginTabBar(str_id [, ImGui.TabBarFlags = 0])
 +
ImGui:endTabBar()
 +
p_open, bool = ImGui:beginTabItem(label, p_open [, ImGui.TabItemFlags = 0])
 +
ImGui:endTabItem()
 +
ImGui:setTabItemClosed(tab_or_docked_window_label)
 +
ImGui:tabItemButton(label [, ImGui.TabItemFlags = 0])
 +
</syntaxhighlight>
  
callback_data:setCursorPos(number)
+
== Logging/Capture ==
number = callback_data:getCursorPos()
+
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">
callback_data:setSelectionStart(s_start)
+
ImGui:logToTTY(auto_open_depth = -1)  
number = callback_data:getSelectionStart()
+
ImGui:logToFile(auto_open_depth = -1, filename = nil)  
 
+
ImGui:logToClipboard(auto_open_depth = -1)  
callback_data:setSelectionEnd(s_end)
+
ImGui:logFinish()  
s_end = callback_data:getSelectionEnd()
+
ImGui:logButtons()  
 
+
ImGui:logText(text)  
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''':
+
== Drag and drop ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
require "ImGui"
+
flag = ImGui:beginDragDropSource([ImGui.DragDropFlags flags = 0])
 
+
flag = ImGui:setNumDragDropPayload(str_type, number [, ImGui.Cond cond = 0])
ui = ImGui.new()
+
flag = ImGui:setStrDragDropPayload(str_type, string [, ImGui.Cond cond = 0])
stage:addChild(ui)
+
ImGui:endDragDropSource()
 +
flag = ImGui:beginDragDropTarget()
 +
ImGuiPayload = ImGui:acceptDragDropPayload(type [, ImGui.DragDropFlags flags = 0])
 +
ImGui:endDragDropTarget()
 +
ImGuiPayload = ImGui:getDragDropPayload()
 +
</syntaxhighlight>
  
local testMessage1 = ""
+
'''Payload''':
local testMessage2 = ""
+
<syntaxhighlight lang="lua">
local testMessage3 = ""
+
number = ImGuiPayload:getNumData()
 +
string = ImGuiPayload:getStrData()
 +
ImGuiPayload:clear()
 +
number = ImGuiPayload:getDataSize()
 +
flag = ImGuiPayload:isDataType(type) -- type must be the same as in "ImGui:acceptDragDropPayload(type)"
 +
flag = ImGuiPayload:isPreview()
 +
flag = ImGuiPayload:isDelivery()
 +
</syntaxhighlight>
  
-- Add ".." at the end of current input string
+
'''Usage example''':
function myCallback1(data)
+
<syntaxhighlight lang="lua">
data:insertChars(data:getCursorPos(), "..")
+
require "ImGui"
end
 
  
-- Replace all chars if UP/DOWN arrow is pressed
+
local imgui = ImGui.new()
function myCallback2(data)
+
stage:addChild(imgui)
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
+
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 ==
<syntaxhighlight lang="lua">
+
Try to avoid creating new instances in "enterFrame" event.
is_openFlag = ImGui:treeNode(label [, format_string])
 
ImGui:treeNodeEx(label, ImGui.TreeNodeFlags [, format_string])
 
ImGui:treePush(str_id)
 
ImGui:treePop()
 
number = ImGui:getTreeNodeToLabelSpacing()
 
is_openFlag, p_open = ImGui:collapsingHeader(label, p_open [, ImGui.TreeNodeFlags = 0])
 
is_openFlag = ImGui:collapsingHeader(label [, ImGui.TreeNodeFlags = 0])
 
ImGui:setNextItemOpen(is_open, ImGui.Cond)
 
</syntaxhighlight>
 
  
=== Widgets: Selectables ===
+
'''Constructor''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])
+
instance = ImGuiListClipper.new()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Widgets: List Boxes ===
+
'''Methods''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
current_item, is_openFlag = ImGui:listBox(label, current_item, item_table [, max_visible_items = -1]) -- item_table: {"Item0", "Item1", ...}
+
ImGuiListClipper:beginClip(number_of_items [, item_height = -1]) -- if item_height <= 0 then it is calculated automatically
result? = ImGui:listBoxHeader(label [, w = 0, h = 0])
+
ImGuiListClipper:endClip()
result? = ImGui:listBoxHeader2(label, items_count)
+
bool = ImGuiListClipper:step()
ImGui:listBoxFooter()
+
number = ImGuiListClipper:getDisplayStart()
 +
number = ImGuiListClipper:getDisplayEnd()
 +
number = ImGuiListClipper:getStartPosY()
 +
number = ImGuiListClipper:getItemsCount()
 +
ImGuiListClipper:forceDisplayRangeByIndices(number_min, number_max)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Widgets: Data Plotting ===
+
'''Usage example''':
'''Caching''':
 
 
 
If you have big array of points it is better to cache it instead of translating lua table to C++ vector every time you call `ImGui:plotLines()`. But in this case you need to manage memory by yourself (free points pointer when you dont need it).
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- store points in memory
+
require "ImGui"
-- points_table: {0.01, 0.5, 10, -50, ...}
 
-- ptr: c++ pointer to a given vector
 
ptr = ImGui.cachePoints(points_table)
 
  
-- delete points from memory
+
local imgui = ImGui.new()
ImGui.freePoints(ptr)
+
stage:addChild(imgui)
</syntaxhighlight>
 
  
'''Plot functions''':
+
clipper = ImGuiListClipper.new()
<syntaxhighlight lang="lua">
 
ImGui:plotCachedLines(label, ptr, len [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0]) -- len (number): points array lenght
 
ImGui:plotCachedHistogram(label, ptr, len [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0]) -- len (number): points array lenght
 
ImGui:plotLines(label, points_table [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0])
 
ImGui:plotHistogram(label, points_table [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0])
 
</syntaxhighlight>
 
  
'''Example''':
+
function onEnterFrame(e)
<syntaxhighlight lang="lua">
+
imgui:newFrame(e.deltaTime)
-- delete ptr if it exist
+
 
function deletePtr()
+
if (imgui:beginWindow("Clipper demo")) then
if pointsPtr then
+
if (imgui:beginTable("table", 3)) then
ImGui.freePoints(pointsPtr)
+
imgui:tableSetupScrollFreeze(0, 1) -- cols, rows
end
+
imgui:tableSetupColumn("One")
end
+
imgui:tableSetupColumn("Two")
 +
imgui:tableSetupColumn("Three")
 +
imgui:tableHeadersRow()
  
function onEnterFrame()
+
clipper:beginClip(100)
ui:newFrame(e.deltaTime)
+
while (clipper:step()) do
+
for row = clipper:getDisplayStart(), clipper:getDisplayEnd() do
if ui:button("Generate") then
+
imgui:tableNextRow()
deletePtr()
+
for column = 1, 3 do
points = generatePoints() -- returns big array
+
imgui:tableSetColumnIndex(column - 1)
pointsPtr = ImGui.cachePoints(points)
+
imgui:text(("col: %d; row: %d"):format(column, row))
end
+
end
+
end
if pointsPtr then
+
end
ui:plotCachedLines("Big data", pointsPtr, #points)
+
clipper:endClip()
 +
 
 +
imgui:endTable()
 +
end
 
end
 
end
+
imgui:endWindow()
ui:render()
+
 
ui:endFrame()
+
imgui:endFrame()
 +
imgui:render()
 
end
 
end
  
-- do not forget to clear memory when app is closing
+
stage:addEventListener("enterFrame", onEnterFrame)
function onAppExit()
 
deletePtr()
 
end
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Widgets: Value() Helpers ==
+
== Context ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:value(prefix, bool)
+
string OR nil = ImGui:getHoveredWindow()
ImGui:value(prefix, number)
+
string OR nil = ImGui:getHoveredWindowRoot()
ImGui:value(prefix, float, format_string)
+
string OR nil = ImGui:getHoveredWindowUnderMovingWindow()
 +
string OR nil = ImGui:getMovingWindow()
 +
string OR nil = ImGui:getActiveIdWindow()
 +
id = ImGui:getActiveId()
 +
id = ImGui:getActiveIdPreviousFrame()
 +
number = ImGui:getActiveIdTimer()
 +
id = ImGui:getActiveIdAllowOverlap()
 +
id = ImGui:getHoveredId()
 +
id = ImGui:getHoveredIdPreviousFrame()
 +
number = ImGui:getHoveredIdTimer()
 +
id = ImGui:getHoveredIdAllowOverlap()
 +
bool = ImGui:getDragDropActive()
 +
id = ImGui:getDragDropPayloadSourceId()
 +
string = ImGui:getDragDropPayloadDataType()
 +
number = ImGui:getDragDropPayloadDataSize()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Widgets: Menus ==
+
== 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.
 +
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
result? = ImGui:beginMenuBar()
+
ImGui:setItemDefaultFocus()
ImGui:endMenuBar()
+
ImGui:setKeyboardFocusHere([offset = 0])
result? = ImGui:beginMainMenuBar()
+
flag = ImGui:isItemHovered([ImGui.HoveredFlags = 0])
ImGui:endMainMenuBar()
+
flag = ImGui:isItemActive()
result = ImGui:beginMenu(label [, enabled = true])
+
flag = ImGui:isItemFocused()
result = ImGui:beginMenuEx(label, [icon = "", enabled = true])
+
flag = ImGui:isItemClicked(mouse_button)
ImGui:endMenu()
+
flag = ImGui:isItemVisible()
result = ImGui:menuItem(label [, shortcut = "", selected = false, enabled = true])
+
flag = ImGui:isItemEdited()
result = ImGui:menuItemEx(label, [icon = "", shortcut = "", selected = false, enabled = true])
+
flag = ImGui:isItemActivated()
ImGui:beginTooltip()
+
flag = ImGui:isItemDeactivated()
ImGui:endTooltip()
+
flag = ImGui:isItemDeactivatedAfterEdit()
ImGui:setTooltip(text)
+
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>
 
</syntaxhighlight>
  
== Popups, Modals ==
+
== INPUTS ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
result? = ImGui:beginPopup(str_id [, ImGui.WindowFlags = 0])
+
ImGui:onMouseHover(event)
p_open, result? = ImGui:beginPopupModal(str_id, p_open [, ImGui.WindowFlags = 0])
+
ImGui:onMouseMove(event)
ImGui:endPopup()
+
ImGui:onMouseDown(event)
ImGui:openPopup(str_id [, ImGui.PopupFlags = 0])
+
ImGui:onMouseUp(event)
ImGui:openPopupOnItemClick(str_id [, ImGui.PopupFlags = 0])
+
ImGui:onMouseWheel(event)
ImGui:closeCurrentPopup()
+
 
result? = ImGui:beginPopupContextItem(str_id [, ImGui.PopupFlags = 0])
+
ImGui:onTouchMove(event)
result? = ImGui:beginPopupContextWindow(str_id [, ImGui.PopupFlags = 0])
+
ImGui:onTouchBegin(event)
result? = ImGui:beginPopupContextVoid(str_id [, ImGui.PopupFlags = 0])
+
ImGui:onTouchEnd(event)
result? = ImGui:isPopupOpen(str_id [, ImGui.PopupFlags = 0])
+
ImGui:onTouchCancel(event)
 +
 
 +
ImGui:onKeyUp(event)
 +
ImGui:onKeyDown(event)
 +
ImGui:onKeyChar(event)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Tables ==
+
'''Usage examples''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
flag = ImGui:beginTable(str_id, column [, ImGui.TableFlags = 0, outer_w = 0, outer_h = 0, inner_width = 0])
+
local UI = ImGui.new(nil, false, false, false)
ImGui:endTable()
+
</syntaxhighlight>
ImGui:tableNextRow([ImGui.TableRowFlags = 0, min_row_height = 0])
 
flag = ImGui:tableNextColumn()
 
flag = ImGui:tableSetColumnIndex(column_n)
 
ImGui:tableSetupColumn(label [, ImGui.TableColumnFlags = 0, init_width_or_weight = 0, user_id = 0])
 
ImGui:tableSetupScrollFreeze(cols, rows)
 
ImGui:tableHeadersRow()
 
TableSortSpecs = ImGui:tableGetSortSpecs() -- see below
 
number = ImGui:tableGetColumnCount()
 
number = ImGui:tableGetColumnIndex()
 
number = ImGui:tableGetRowIndex()
 
string = ImGui:tableGetColumnName([column_n = -1])
 
ImGuiTableColumnFlags = ImGui:tableGetColumnFlags([column_n = -1])
 
ImGui:tableSetBgColor(ImGui.TableBgTarget, color [, alpha = 1, column_n = -1])
 
</syntaxhighlight>
 
  
== Table sort specs ==
+
'''Mouse'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
number = TableSortSpecs:getSpecsCount() -- TableSortSpecs = ImGui:tableGetSortSpecs()
+
stage:addEventListener("mouseHover", function(e) UI:onMouseHover(e) end)
flag = TableSortSpecs:isSpecsDirty() -- TableSortSpecs = ImGui:tableGetSortSpecs()
+
stage:addEventListener("mouseMove", function(e) UI:onMouseMove(e) end)
TableSortSpecs:setSpecsDirty(flag) -- TableSortSpecs = ImGui:tableGetSortSpecs()
+
stage:addEventListener("mouseDown", function(e) UI:onMouseDown(e) end)
table = TableSortSpecs:getColumnSortSpecs() -- TableSortSpecs = ImGui:tableGetSortSpecs(), see below
+
stage:addEventListener("mouseUp", function(e) UI:onMouseUp(e) end)
 +
stage:addEventListener("mouseWheel", function(e) UI:onMouseWheel(e) end)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Table column sort specs ==
+
'''Touch'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
-- table = TableSortSpecs:getColumnSortSpecs()
+
stage:addEventListener("touchesCancel", function(e) ui:onTouchCancel(e) end)
-- each value of this table is an object that have these functions:
+
stage:addEventListener("touchesMove", function(e) ui:onTouchMove(e) end)
number = item:getColumnUserID()  
+
stage:addEventListener("touchesBegin", function(e) ui:onTouchBegin(e) end)
number = item:getColumnIndex() -- 0 based
+
stage:addEventListener("touchesEnd", function(e) ui:onTouchEnd(e) end)
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 ==
+
'''Keyboard'''
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:columns([count = 1, id = nil, border = true])
+
stage:addEventListener("keyUp", function(e) UI:onKeyUp(e) end)
ImGui:nextColumn()
+
stage:addEventListener("keyDown", function(e) UI:onKeyDown(e) end)
index = ImGui:getColumnIndex()
+
stage:addEventListener("keyChar", function(e) UI:onKeyChar(e) end)
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>
 
</syntaxhighlight>
  
== Tab Bars, Tabs ==
+
== Miscellaneous Utilities ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
bool = ImGui:beginTabBar(str_id [, ImGui.TabBarFlags = 0])
+
flag = ImGui:isRectVisible(w, h [, max_x, max_y])
ImGui:endTabBar()
+
number = ImGui:getTime()
p_open, bool = ImGui:beginTabItem(label, p_open [, ImGui.TabItemFlags = 0])
+
number = ImGui:getFrameCount()
ImGui:endTabItem()
+
str = ImGui:getStyleColorName(idx)
ImGui:setTabItemClosed(tab_or_docked_window_label)
+
flag = ImGui:beginChildFrame(id, w, h [, ImGui.WindowFlags = 0]) -- id (number)
ImGui:tabItemButton(label [, ImGui.TabItemFlags = 0])
+
ImGui:endChildFrame()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Logging/Capture ==
+
=== Text Utilities ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:logToTTY(auto_open_depth = -1)
+
w, h = ImGui:calcTextSize(text [, hide_text_after_double_hash = false, wrap_width = -1])
ImGui:logToFile(auto_open_depth = -1, filename = nil)
 
ImGui:logToClipboard(auto_open_depth = -1)
 
ImGui:logFinish()
 
ImGui:logButtons()
 
ImGui:logText(text)  
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Drag and drop ==
+
=== Color convert ===
 +
'''Note''': use ''DOT'' instead of ''COLON'', so you can use it without creating an ImGui object
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
flag = ImGui:beginDragDropSource([ImGui.DragDropFlags flags = 0])
+
r, g, b, a = ImGui.colorConvertHEXtoRGB(color [, alpha = 1])
flag = ImGui:setNumDragDropPayload(str_type, number [, ImGui.Cond cond = 0])
+
hex = ImGui.colorConvertRGBtoHEX(r, g, b)
flag = ImGui:setStrDragDropPayload(str_type, string [, ImGui.Cond cond = 0])
+
h, s, v = ImGui.colorConvertRGBtoHSV(r, g, b)
ImGui:endDragDropSource()
+
r, g, b = ImGui.colorConvertHSVtoRGB(h, s, v)
flag = ImGui:beginDragDropTarget()
+
h, s, v = ImGui.colorConvertHEXtoHSV(hex)
ImGuiPayload = ImGui:acceptDragDropPayload(type [, ImGui.DragDropFlags flags = 0])
+
hex = ImGui.colorConvertHSVtoHEX(h, s, v)
ImGui:endDragDropTarget()
 
ImGuiPayload = ImGui:getDragDropPayload()
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Payload''':
+
=== 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">
number = ImGuiPayload:getNumData()
+
string = ImGui:getKeyName(keyCode)
string = ImGuiPayload:getStrData()
+
flag = ImGui:isKeyDown(keyCode)
ImGuiPayload:clear()
+
flag = ImGui:isKeyPressed(keyCode [, repeat = true])
number = ImGuiPayload:getDataSize()
+
flag = ImGui:isKeyReleased(keyCode)
flag = ImGuiPayload:isDataType(type) -- type must be the same as in "ImGui:acceptDragDropPayload(type)"
+
number = ImGui:getKeyPressedAmount(keyCode, repeat_delay, rate)
flag = ImGuiPayload:isPreview()
+
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
flag = ImGuiPayload:isDelivery()
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Usage example''':
+
=== Shortcut system ===
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
require "ImGui"
+
-- (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])
  
local imgui = ImGui.new()
+
ImGui:setItemKeyOwner(keyCode [, ImGui.InputFlags = 0])
stage:addChild(imgui)
 
  
local names = {
+
ImGui:setKeyOwner(keyCode, owner_id, [, ImGui.InputFlags = 0])
"Bobby", "Beatrice", "Betty",
+
</syntaxhighlight>
"Brianna", "Barry", "Bernard",
+
 
"Bibi", "Blaine", "Bryn"
+
=== Inputs Utilities: Mouse ===
}
+
* To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right.
-- modes:
+
* You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle.
local Mode_Copy = 0
+
* Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold')
local Mode_Move = 1
 
local Mode_Swap = 2
 
 
local mode = 0 -- current mode
 
  
function onEnterFrame(e)
+
<syntaxhighlight lang="lua">
imgui:newFrame(e.deltaTime)
+
-- "mouse_button" is any gideros mouse button code
+
flag = ImGui:isMouseDown(mouse_button)
if (imgui:radioButton("Copy", mode == Mode_Copy)) then mode = Mode_Copy end imgui:sameLine()
+
flag = ImGui:isMouseClicked(mouse_button [, repeat = false]) -- "mouse_button" is any gideros mouse button code
if (imgui:radioButton("Move", mode == Mode_Move)) then mode = Mode_Move end imgui:sameLine()
+
flag = ImGui:isMouseReleased(mouse_button) -- "mouse_button" is any gideros mouse button code
if (imgui:radioButton("Swap", mode == Mode_Swap)) then mode = Mode_Swap end
+
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])
for i,v in ipairs(names) do
+
flag = ImGui:isMousePosValid([x = inf, y = inf])
imgui:pushID(i)
+
flag = ImGui:isAnyMouseDown()
if (((i-1) % 3) ~= 0) then imgui:sameLine() end
+
x, y = ImGui:getMousePos()
+
x, y = ImGui:getMousePosOnOpeningCurrentPopup()
imgui:button(v, 60, 60)
+
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
if (imgui:beginDragDropSource(ImGui.DragDropFlags_None)) then
+
ImGui:resetMouseDragDelta(mouse_button) -- "mouse_button" is any gideros mouse button code
--imgui:setStrDragDropPayload("DND_DEMO_CELL", "ID_"..i) -- used for strings
+
ImGuiMouseCursor = ImGui:getMouseCursor()
imgui:setNumDragDropPayload("DND_DEMO_CELL", i) -- used for numbers
+
ImGui:setMouseCursor(ImGui.MouseCursor)
+
ImGui:setNextFrameWantCaptureMouse([want_capture_mouse_value = true])
if (mode == Mode_Copy) then imgui:text(("Copy %s"):format(v)) end
+
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
if (mode == Mode_Move) then imgui:text(("Move %s"):format(v)) end
+
ImGui:updateCursor()
if (mode == Mode_Swap) then imgui:text(("Swap %s"):format(v)) end
+
</syntaxhighlight>
imgui:endDragDropSource()
+
 
end
+
== FONTS ==
+
<syntaxhighlight lang="lua">
if (imgui:beginDragDropTarget()) then
+
IO = imgui:getIO()
local payload = imgui:acceptDragDropPayload("DND_DEMO_CELL")
+
FontAtlas = IO:getFonts()
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)
+
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
 +
--     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} }
  
'''Methods''':
+
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
ImGuiListClipper:beginClip(number_of_items [, item_height = -1]) -- if item_height <= 0 then it is calculated automatically
+
FontAtlas:clearInputData()
ImGuiListClipper:endClip()
+
FontAtlas:clearTexData()
bool = ImGuiListClipper:step()
+
FontAtlas:clearFonts()
number = ImGuiListClipper:getDisplayStart()
+
FontAtlas:clear()
number = ImGuiListClipper:getDisplayEnd()
+
table = FontAtlas:getFonts() -- returns a table with all fonts (included default)
number = ImGuiListClipper:getStartPosY()
+
flag = FontAtlas:isBuilt()
number = ImGuiListClipper:getItemsCount()
+
number = FontAtlas:addCustomRectRegular(width, height)
ImGuiListClipper:forceDisplayRangeByIndices(number_min, number_max)
+
number = FontAtlas:addCustomRectFontGlyph(font, id, width, height, advance_x [, offset_x, offset_y])
 +
w, h, x, y, glyph_id, offset_x, offset_y, font, is_packed_flag = FontAtlas:getCustomRectByIndex(index)
 +
 
 +
ImGui:pushFont(font) -- font (table): object returned by FontAtlas:addFont(...) or FontAtlas:getFont([index])
 +
ImGui:popFont()
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Usage example''':
+
'''Minimal example''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
require "ImGui"
+
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)
  
local imgui = ImGui.new()
+
-- you can use multiple fonts at the same time
stage:addChild(imgui)
+
function enterFrame(e)
 +
UI:newFrame(e.deltaTime)
 +
 +
UI:pushFont(font1)
 +
UI:text("Font1")
 +
UI:popFont()
 +
 +
UI:pushFont(font2)
 +
UI:text("Font2")
 +
UI:popFont()
 +
 +
UI:render()
 +
UI:endFrame()
 +
end
 +
</syntaxhighlight>
  
clipper = ImGuiListClipper.new()
+
'''Glyphs example''':
 
+
<syntaxhighlight lang="lua">
function onEnterFrame(e)
+
local fonts = io:getFonts()
imgui:newFrame(e.deltaTime)
+
fonts:addFont(font_path, font_size, {
 
+
glyphs = {
if (imgui:beginWindow("Clipper demo")) then
+
ranges = {
if (imgui:beginTable("table", 3)) then
+
{
imgui:tableSetupScrollFreeze(0, 1) -- cols, rows
+
0x2590,0x2593, -- range1
imgui:tableSetupColumn("One")
+
0x2660,0x266B  -- range2
imgui:tableSetupColumn("Two")
+
-- ...
imgui:tableSetupColumn("Three")
+
},
imgui:tableHeadersRow()
+
ImGui.GlyphRanges_Cyrillic,
 
+
{
clipper:beginClip(100)
+
0x01C0, 0x01C3 -- range3
while (clipper:step()) do
+
},
for row = clipper:getDisplayStart(), clipper:getDisplayEnd() do
+
ImGui.GlyphRanges_Korean
imgui:tableNextRow()
+
},
for column = 1, 3 do
+
imgui:tableSetColumnIndex(column - 1)
+
-- same structure:
imgui:text(("col: %d; row: %d"):format(column, row))
+
ranges = {
end
+
{
end
+
0x2590,0x2593, -- range1
end
+
0x2660,0x266B, -- range2
clipper:endClip()
+
0x01C0,0x01C3  -- range3
 +
-- ...
 +
},
 +
ImGui.GlyphRanges_Cyrillic,
 +
ImGui.GlyphRanges_Korean
 +
}
 +
},
 +
mergeMode = true, -- merge into previous font
 +
})
 +
fonts:build()
 +
</syntaxhighlight>
  
imgui:endTable()
+
'''Icons example''':
end
+
<syntaxhighlight lang="lua">
end
+
local icon = utf8.char(0x2590)
imgui:endWindow()
+
ImGui:text("My icon >>" .. icon .. " << !!!")
  
imgui:endFrame()
+
-- or with new Luau support:
imgui:render()
+
ImGui:text("My icon >> \u{2590} << !!!")
end
+
-- can be also stored in memory:
 
+
local icon = "\u{2590}"
stage:addEventListener("enterFrame", onEnterFrame)
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== ImGuiTextFilter ==
+
=== Font ===
Try to avoid creating new instaces in "enterFrame" event.
 
 
 
'''Constructor''':
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
filter = ImGuiTextFilter.new()
+
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
 
</syntaxhighlight>
 
</syntaxhighlight>
  
'''Methods''':
+
== Tables ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
isValueChanged = filter:draw(label [, width = 0]) -- draws the input field
+
flag = ImGui:beginTable(str_id, column [, ImGui.TableFlags = 0, outer_w = 0, outer_h = 0, inner_width = 0])
isValueChanged = filter:drawWithHint(label, hint [, width = 0]) -- draws the input field (using ImGui:inutTextWithHint())
+
ImGui:endTable()
 
+
ImGui:tableNextRow([ImGui.TableRowFlags = 0, min_row_height = 0])
filter:setBuffer(text) -- set filter text
+
flag = ImGui:tableNextColumn()
filter:build() -- update filter internals (see example below)
+
flag = ImGui:tableSetColumnIndex(column_n)
bool = filter:passFilter(text) -- returns true if filter input matches with "text"
+
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>
  
'''Usage example 1''':</br>
+
=== Table sort specs ===
https://github.com/MultiPain/Gideros_ImGui/blob/master/imgui_src/imgui_demo.cpp#L5657
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
require "ImGui"
+
number = TableSortSpecs:getSpecsCount() -- TableSortSpecs = ImGui:tableGetSortSpecs()
 
+
flag = TableSortSpecs:isSpecsDirty() -- TableSortSpecs = ImGui:tableGetSortSpecs()
local imgui = ImGui.new()
+
TableSortSpecs:setSpecsDirty(flag) -- TableSortSpecs = ImGui:tableGetSortSpecs()
stage:addChild(imgui)
+
table = TableSortSpecs:getColumnSortSpecs() -- TableSortSpecs = ImGui:tableGetSortSpecs(), see below
 +
</syntaxhighlight>
 +
 
 +
=== Table column sort specs ===
 +
<syntaxhighlight lang="lua">
 +
-- 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
 +
</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.
 +
 
 +
'''Constructor''':
 +
<syntaxhighlight lang="lua">
 +
filter = ImGuiTextFilter.new()
 +
</syntaxhighlight>
 +
 
 +
'''Methods''':
 +
<syntaxhighlight lang="lua">
 +
-- draws the input field
 +
isValueChanged = filter:draw(label [, width = 0])
 +
-- draws the input field (using ImGui:inutTextWithHint())
 +
isValueChanged = filter:drawWithHint(label, hint [, width = 0])
 +
 
 +
filter:setBuffer(text) -- set filter text
 +
filter:build() -- update filter internals (see example below)
 +
bool = filter:passFilter(text) -- returns true if filter input matches with "text"
 +
</syntaxhighlight>
 +
 
 +
'''Usage example 1''':
 +
<syntaxhighlight lang="lua">
 +
require "ImGui"
 +
 
 +
local imgui = ImGui.new()
 +
stage:addChild(imgui)
  
 
local filter = ImGuiTextFilter.new()
 
local filter = ImGuiTextFilter.new()
Line 1,446: Line 1,685:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Focus, Activation ==
+
== TextEditor ==
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
ImGui:setItemDefaultFocus()
+
-- otherTextEditor: another "ImGuiTextEditor" instance to copy setting
ImGui:setKeyboardFocusHere([offset = 0])
+
TextEditor = ImGuiTextEditor.new([other_text_editor])
flag = ImGui:isItemHovered([ImGui.HoveredFlags = 0])
 
flag = ImGui:isItemActive()
 
flag = ImGui:isItemFocused()
 
flag = ImGui:isItemClicked(mouse_button)
 
flag = ImGui:isItemVisible()
 
flag = ImGui:isItemEdited()
 
flag = ImGui:isItemActivated()
 
flag = ImGui:isItemDeactivated()
 
flag = ImGui:isItemDeactivatedAfterEdit()
 
flag = ImGui:isItemToggledOpen()
 
flag = ImGui:isAnyItemHovered()
 
flag = ImGui:isAnyItemActive()
 
flag = ImGui:isAnyItemFocused()
 
minX, minY, maxX, maxY = ImGui:getItemRect()
 
x, y = ImGui:getItemRectMin()
 
x, y = ImGui:getItemRectMax()
 
w, h = ImGui:getItemRectSize()
 
ImGui:setItemAllowOverlap()
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Miscellaneous Utilities ==
+
'''Functions''':
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
flag = ImGui:isRectVisible(w, h [, max_x, max_y])
+
LanguageDefinition = TextEditor:getLanguageCPP()
number = ImGui:getTime()
+
LanguageDefinition = TextEditor:getLanguageGLSL()
number = ImGui:getFrameCount()
+
LanguageDefinition = TextEditor:getLanguageHLSL()
str = ImGui:getStyleColorName(idx)
+
LanguageDefinition = TextEditor:getLanguageC()
flag = ImGui:beginChildFrame(id, w, h [, ImGui.WindowFlags = 0]) -- id (number)
+
LanguageDefinition = TextEditor:getLanguageSQL()
ImGui:endChildFrame()
+
LanguageDefinition = TextEditor:getLanguageAngelScript()
</syntaxhighlight>
+
LanguageDefinition = TextEditor:getLanguageLua()
  
== Text Utilities ==
+
TextEditor:setLanguageDefinition(LanguageDefinition)
<syntaxhighlight lang="lua">
+
LanguageDefinition = TextEditor:getLanguageDefinition()
w, h = ImGui:calcTextSize(text [, hide_text_after_double_hash = false, wrap_width = -1])
 
</syntaxhighlight>
 
  
== Inputs Utilities: Keyboard ==
+
Palette = TextEditor:getPaletteDark()
<syntaxhighlight lang="lua">
+
Palette = TextEditor:getPaletteLight()
string = ImGui:getKeyName(keyCode)
+
Palette = TextEditor:getPaletteRetro()
flag = ImGui:isKeyDown(keyCode)
 
flag = ImGui:isKeyPressed(keyCode [, repeat = true])
 
flag = ImGui:isKeyReleased(keyCode)
 
number = ImGui:getKeyPressedAmount(keyCode, repeat_delay, rate)
 
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
 
</syntaxhighlight>
 
  
== Shortcut system ==
+
TextEditor:setPalette(Palette)
<syntaxhighlight lang="lua">
+
Palette = TextEditor:getPalette()
ImGui:shortcut(keyChord [, owner_id = 0, ImGui.InputFlags = 0]) -- keyChord: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values (ImGuiKey | ImGuiMod_XXX))
 
ImGui:setShortcutRouting(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:setItemKeyOwner(keyCode [, ImGui.InputFlags = 0])
+
TextEditor:setPaletteColor(TE_ColorIndex, color [, alpha = 1]) -- see TextEditor enums below
 +
color, alpha = TextEditor:getPaletteColor(TE_ColorIndex)
  
ImGui:setKeyOwner(keyCode, owner_id, [, ImGui.InputFlags = 0])
+
TextEditor:loadPalette(table) -- 42 elements table
</syntaxhighlight>
+
-- example:
 
+
--[[ dark palete:
== Inputs Utilities: Mouse ==
+
TextEditor:loadPalette{
<syntaxhighlight lang="lua">
+
0x7f7f7f, 1, -- Default
flag = ImGui:isMouseDown(mouse_button) -- "mouse_button" is any gideros mouse button code
+
0xd69c56, 1, -- Keyword
flag = ImGui:isMouseClicked(mouse_button [, repeat = false]) -- "mouse_button" is any gideros mouse button code
+
0x00ff00, 1, -- Number
flag = ImGui:isMouseReleased(mouse_button) -- "mouse_button" is any gideros mouse button code
+
0x7070e0, 1, -- String
flag = ImGui:isMouseDoubleClicked(mouse_button) -- "mouse_button" is any gideros mouse button code
+
0x70a0e0, 1, -- Char literal
flag = ImGui:isMouseHoveringRect(min_x, min_y, max_x, max_y [, clip = true])
+
0xffffff, 1, -- Punctuation
flag = ImGui:isMousePosValid([x = inf, y = inf])
+
0x408080, 1, -- Preprocessor
flag = ImGui:isAnyMouseDown()
+
0xaaaaaa, 1, -- Identifier
x, y = ImGui:getMousePos()
+
0x9bc64d, 1, -- Known identifier
x, y = ImGui:getMousePosOnOpeningCurrentPopup()
+
0xc040a0, 1, -- Preproc identifier
flag = ImGui:isMouseDragging(mouse_button [, lock_threshold = -1]) -- "mouse_button" is any gideros mouse button code
+
0x206020, 1, -- Comment (single line)
x, y = ImGui:getMouseDragDelta(mouse_button [, lock_threshold = -1]) -- "mouse_button" is any gideros mouse button code
+
0x406020, 1, -- Comment (multi line)
ImGui:resetMouseDragDelta(mouse_button) -- "mouse_button" is any gideros mouse button code
+
0x101010, 1, -- Background
ImGuiMouseCursor = ImGui:getMouseCursor()
+
0xe0e0e0, 1, -- Cursor
ImGui:setMouseCursor(ImGui.MouseCursor)
+
0xa06020, 0.5, -- Selection
ImGui:setNextFrameWantCaptureMouse([want_capture_mouse_value = true])
+
0x0020ff, 0.5, -- ErrorMarker
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
+
0xf08000, 0.25, -- Breakpoint
ImGui:updateCursor()
+
0x707000, 1, -- Line number
</syntaxhighlight>
+
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 ==
+
TextEditor:render(string_id [, w = 0, h = 0, border = 0])
<syntaxhighlight lang="lua">
 
TextEditor = ImGuiTextEditor.new([other_text_editor]) -- otherTextEditor: another "ImGuiTextEditor" instance to copy setting
 
</syntaxhighlight>
 
  
'''Functions''':
+
TextEditor:setText(string)
<syntaxhighlight lang="lua">
+
TextEditor:getText()
LanguageDefinition = TextEditor:getLanguageCPP()
+
TextEditor:setTextLines(table) -- set editor text using table. Structure: {"line 1", "line 2", "line 3", ...}
LanguageDefinition = TextEditor:getLanguageGLSL()
+
table = TextEditor:getTextLines()
LanguageDefinition = TextEditor:getLanguageHLSL()
 
LanguageDefinition = TextEditor:getLanguageC()
 
LanguageDefinition = TextEditor:getLanguageSQL()
 
LanguageDefinition = TextEditor:getLanguageAngelScript()
 
LanguageDefinition = TextEditor:getLanguageLua()
 
  
TextEditor:setLanguageDefinition(LanguageDefinition)
+
string = TextEditor:getSelectedText()
LanguageDefinition = TextEditor:getLanguageDefinition()
+
string = TextEditor:getCurrentLineText()
  
Palette = TextEditor:getPaletteDark()
+
number = TextEditor:getTotalLines()
Palette = TextEditor:getPaletteLight()
+
bool = TextEditor:isOverwrite()
Palette = TextEditor:getPaletteRetro()
 
  
TextEditor:setPalette(Palette)
+
bool = TextEditor:setReadOnly()
Palette = TextEditor:getPalette()
+
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:setPaletteColor(TE_ColorIndex, color [, alpha = 1]) -- see TextEditor enums below
+
TextEditor:setHandleKeyboardInputs(bool)
color, alpha = TextEditor:getPaletteColor(TE_ColorIndex)
+
bool = TextEditor:isHandleKeyboardInputsEnabled()
  
TextEditor:loadPalette(table) -- 42 elements table
+
TextEditor:setTextEditorChildIgnored(bool)
-- example:
+
bool = TextEditor:isTextEditorChildIgnored()
--[[ dark palete:
+
 
TextEditor:loadPalette{
+
TextEditor:setShowWhitespaces(bool)
0x7f7f7f, 1, -- Default
+
bool = TextEditor:isShowingWhitespaces()
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:setTabSize(size)
TextEditor:setErrorMarkers(error_markers)
+
size = TextEditor:getTabSize()
TextEditor:setBreakpoints(breakpoints)
 
  
TextEditor:render(string_id [, w = 0, h = 0, border = 0])
+
TextEditor:insertText(string)
 
 
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:moveUp([amount = 1, select = false])
Line 1,681: Line 1,840:
  
 
== DRAW LISTS ==
 
== DRAW LISTS ==
 
+
'''Window draw list''':
=== Window draw list ===
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
local list = ImGui:getWindowDrawList()
 
local list = ImGui:getWindowDrawList()
Line 1,867: Line 2,025:
  
 
stage:addEventListener("enterFrame", onEnterFrame)
 
stage:addEventListener("enterFrame", onEnterFrame)
 +
</syntaxhighlight>
 +
 +
== EXPERIMENTAL ==
 +
<syntaxhighlight lang="lua">
 +
p_open = ImGui:showLog(title, p_open [, ImGui.WindowFlags = 0]) -- draw log window
 +
ImGui:writeLog(text)
 +
</syntaxhighlight>
 +
 +
Gestures (touch only, turned OFF by default) ''WIP'':
 +
* tap gesture (Left Mouse Button)
 +
* hold gesture (Right Mouse Button)
 +
<syntaxhighlight lang="lua">
 +
ImGui:setTouchGesturesEnabled(bool)
 +
bool = ImGui:isTouchGesturesEnabled()
 
</syntaxhighlight>
 
</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