ChangeLog for the recent update 18.4.2018: http://wiki.mmominion.com/doku.php?id=gui_api_changelog ====GUI API Documentation==== You can easily build your own ingame GUI or draw custom shapes / icons / pictures through LUA. Each rendered frame the "Gameloop.Draw" - LUA-Event is called. You need to register your LUA function for this event and then you can build your GUI in there. Simple demo code {{ ::firstaddon.zip |}} you can download and extract into your addon folder: MINIONAPP\Bots\xxxx\LuaMods\ Example: To get you started, let's draw a simple window with a slider, create a new .lua file, add it to your addon's module.def and put the following code into that new lua file: -- Draws a Window with a Slider: my_gui = {} my_gui.open = true my_gui.visible = true my_gui.hue = 125 function my_gui.Draw( event, ticks ) if ( my_gui.open ) then GUI:SetNextWindowSize(250,400,GUI.SetCond_FirstUseEver) -- set the next window size, only on first ever, GUI.SetCond_FirstUseEver is one of many possible enums. --GUI:Begin takes in two arguments, the name of the window and the current "is open" bool. It returns "is visible/is not collapsed" and the "is open" bool again. --If the user would close our Window, "is open" would return "false", else it will keep returning "true" as long as the window is open. my_gui.visible, my_gui.open = GUI:Begin("My Fancy GUI", my_gui.open) if ( my_gui.visible ) then -- visible is true/false depending if the window is collapsed or not, we don't have to render anything in it when it is collapsed -- Again the typical syntax, passing the current value "hue" to the function as argument and receiving back the (un-)changed value. my_gui.hue = GUI:SliderInt("Master HUE",my_gui.hue,0,255) d(my_gui.hue) -- spam print out the current value end GUI:End() -- THIS IS IMPORTANT! For EVERY BEGIN() you NEED to ALWAYS call END(), it does not matter if the window is visible/open or not! Same goes with BeginChild() & EndChild() and others ! end end RegisterEventHandler("Gameloop.Draw", my_gui.Draw, "My_GUI-AnyNameHereToIdentYourCode") \\ ===Important Information=== * To get an overview what is possible with the GUI, open the ingame console (CTRL + C) and execute this command: ''ml_gui.showtestwindow = true''\\ * **AUTOMATIC TRANSLATIONS** - Wrap all your static text like: GUI:Button("I am a Label") to GUI:Button(GetString("I am a Label")), this will allow automatic translation to all languages later on. * If you find something in that Testwindow but you are not sure how to code the same in LUA, have a look in the c++ source of it: [[https://github.com/ocornut/imgui/blob/master/imgui_demo.cpp]], the used function names and syntax are 99% the same, just the arguments might be slightly different due to LUA not supporting references.\\ * Underlined function arguments in the following API documentation are __optional__. Example: ''GUI:Begin(//string// name, //bool// open, __[[gui_api#WindowFlags|windowflags]] flags__)'' * Most UI Element "names" or "labels" are at the same time their internal identifier which has to be unique. You can use the following to make that happen: Example: Same name in UI, different internal identifier: GUI:Button("Banana") GUI:Button("Banana##1") Example: Different name in UI, same internal identifier: GUI:Button("Banana###123hohoho") GUI:Button("Pineapple###123hohoho") Example: Different name in UI, same internal identifier with auto **Translations**: GUI:Button(GetString("Banana").."###123hohoho") GUI:Button(GetString("Pineapple").."###123hohoho") ===Window Functions=== ***''GUI:ShowTestWindow(//bool// isopen)''** *Returns: //bool// isopen *Test window, demonstrates GUI features ***''GUI:ShowMetricsWindow(//bool// isopen)''** *Returns: //bool// isopen *Metrics window for debuggings ***''GUI:Begin(//string// name, //bool// open, __[[gui_api#WindowFlags|windowflags]] flags__)''** *Returns //bool// visible, //bool// open *//visible// means "not collapsed", so can opt out early when window is collapsed. For WindowFlags, check the Enums & Flags further below on this page. ***''GUI:End()''** *For every GUI:Begin(..) call, you need to call GUI:End(), independent if the the window is opened/shown or not. ***''GUI:BeginChild(//string// name, __//int// sizeX__, __//int// sizeY__, __//bool// border__, __[[gui_api#WindowFlags|windowflags]] flags__''** *Begin a scrolling region. size==0.0f: use remaining window size, size<0.0f: use remaining window size minus abs(size). size>0.0f: fixed size. each axis can use a different mode, e.g. sizeX=0 & sizeY=400. ***''GUI:EndChild()''** *For every GUI:BeginChild(..) call, you need to call GUI:EndChild(). ***''GUI:IsWindowAppearing()''** *Returns: //bool// ***''GUI:IsWindowCollapsed()''** *Returns: //bool// ***''GUI:IsWindowFocused(__[[gui_api#FocusedFlags|FocusedFlags]] flags__)''** *Returns: //bool// *is current window focused? or its root/child, depending on flags. see flags for options. ***''GUI:IsWindowHovered(__[[gui_api#HoveredFlags|HoveredFlags]] flags__)''** *Returns: //bool// *is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. ***''GUI:GetWindowPos()''** *Returns: //number// x, //number// y *get current window position in screen space ***''GUI:GetWindowSize()''** *Returns: //number// x, //number// y *get current window size ***''GUI:GetWindowWidth()''** *Returns: //number// width ***''GUI:GetWindowHeight()''** *Returns: //number// height ***''GUI:GetContentRegionMax()''** *Returns: //number// x, //number// y *current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates ***''GUI:GetContentRegionAvail()''** *Returns: //number// x, //number// y *== GetContentRegionMax() - GetCursorPos() ***''GUI:GetContentRegionAvailWidth()''** *Returns: //number// width ***''GUI:GetWindowContentRegionMin()''** *Returns: //number// x, //number// y *content boundaries min (roughly (0,0)-Scroll), in window coordinates ***''GUI:GetWindowContentRegionMax()''** *Returns: //number// x, //number// y *content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates ***''GUI:GetWindowContentRegionWidth()''** *Returns: //number// witdth ***''GUI:SetNextWindowPos( //number// X, //number// Y, __[[gui_api#SetCondflags|SetCondflags]] flags__, __//number// pivotX__, __//number// pivotY__)''** *set next window position. call before Begin() ***''GUI:SetNextWindowSize( //number// X, //number// Y, __[[gui_api#SetCondflags|SetCondflags]] flags__)''** *set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin() ***''GUI:SetNextWindowContentSize( //number// X, //number// Y)''** *set next window content size (enforce the range of scrollbars). set axis to 0.0f to leave it automatic. call before Begin() ***''GUI:SetNextWindowCollapsed( //bool// collapsed, __[[gui_api#SetCondflags|SetCondflags]] flags__)''** *set next window collapsed state. call before Begin() ***''GUI:SetNextWindowFocus()''** *set next window to be focused / front-most. call before Begin() ***''GUI:SetWindowPos( //number// X, //number// Y, __[[gui_api#SetCondflags|SetCondflags]] flags__)''** *set current window position - call within Begin()/End(). ***''GUI:SetWindowPos( //string// name, //number// X, //number// Y, __[[gui_api#SetCondflags|SetCondflags]] flags__)''** *set current window position - call within Begin()/End(). may incur tearing ***''GUI:SetWindowSize( //number// X, //number// Y, __[[gui_api#SetCondflags|SetCondflags]] flags__)''** *set current window size. set X,Y to 0 to force an auto-fit. ***''GUI:SetWindowSize( //string// name, //number// X, //number// Y, __[[gui_api#SetCondflags|SetCondflags]] flags__)''** *set named window size. set X,Y to 0 to force an auto-fit on this axis. ***''GUI:SetWindowCollapsed( //bool// collapsed, __[[gui_api#SetCondflags|SetCondflags]] flags__)''** *set current window collapsed state ***''GUI:SetWindowCollapsed( //string// name, //bool// collapsed, __[[gui_api#SetCondflags|SetCondflags]] flags__)''** *set named window collapsed state ***''GUI:SetWindowFocus( __//string// name__)''** *set current/named window to be focused / front-most ***''GUI:GetScrollX()''** *Returns: get scrolling amount [0..GetScrollMaxX()] ***''GUI:GetScrollY()''** *Returns: get scrolling amount [0..GetScrollMaxY()] ***''GUI:GetScrollMaxX()''** *Returns: get maximum scrolling amount ~~ ContentSize.X - WindowSize.X ***''GUI:GetScrollMaxY()''** *Returns: get maximum scrolling amount ~~ ContentSize.Y - WindowSize.Y ***''GUI:SetScrollX( //number// scrollX)''** *set scrolling amount [0..GetScrollMaxX()] ***''GUI:SetScrollY( //number// scrollX)''** *set scrolling amount [0..GetScrollMaxY()] ***''GUI:SetScrollHere( __//number// center_y_ratio__)''** *adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. ***''GUI:SetScrollFromPosY( //number// pos_y, __//number// center_y_ratio__)''** *adjust scrolling amount to make given position valid. use GetCursorPos() or GetCursorStartPos()+offset to get valid positions. ***''GUI:SetKeyboardFocusHere(__//number// offset__)''** *focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget ===Style=== ***''GUI:PushStyleColor([[gui_api#PushStyleColor|PushStyleColor]] flags, //number// R, //number// G, //number// B, //number// A)''** *sets the color for the following elements ***''GUI:PopStyleColor( __//number// count__ )''** *removes the last pushed color style(s) ***''GUI:PushStyleVar([[gui_api#PushStyleVar|PushStyleVar]] flags, //number// val, __//number// val2__)''** *sets the style for the following elements ***''GUI:PopStyleVar( __//number// count__ )''** *removes the last pushed style var(s) ***''GUI:GetColorU32( //number// r, //number// g, //number// b, //number// a )''** *Returns: //number// color ***''GUI:PushItemWidth( //number// item_width )''** *width of items for the common item+label case, pixels. 0.0f = default to ~2/3 of windows width, >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)) ***''GUI:PopItemWidth( )''** *removes the last pushed item width ***''GUI:CalcItemWidth( )''** *width of item given pushed settings and current cursor position ***''GUI:PushTextWrapPos( __//number// wrap_pos_x__ )''** *word-wrapping for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space ***''GUI:PopTextWrapPos( )''** *removes the last pushed wrap pos ***''GUI:PushAllowKeyboardFocus( //bool// val )''** *allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets ***''GUI:PopAllowKeyboardFocus( )''** *removes the last pushed keyboard focus setting ***''GUI:PushButtonRepeat( //bool// repeat)''** *in 'repeat' mode, Button functions return repeated true in a typematic manner. ***''GUI:PopButtonRepeat( )''** *removes the last pushed button repeat setting ***''GUI:GetWindowFontSize()''** *Returns: //number// size *size (also height in pixels) of current font with current scale applied ***''GUI:SetWindowFontSize( //number// scale)''** *per-window font scale. Adjust IO.FontGlobalScale if you want to scale all windows ***''GUI:GetGlobalFontSize()''** *Returns: //number// size of global font scale ***''GUI:SetGlobalFontSize( //number// scale)''** *sets global font scale ===Layout=== ***''GUI:AlignFirstTextHeightToWidgets( )''** * If a line does not start with text but with an Icon or other GUI Element, call this before drawing the text to align the height correctly. ***''GUI:Separator( )''** *horizontal line ***''GUI:SameLine( __//number// local_pos_x__, __//number// spacing_w__ )''** *call between widgets or groups to layout them horizontally ***''GUI:NewLine()''** * undo a SameLine() ***''GUI:Spacing( )''** *add spacing ***''GUI:Dummy( //number// sizeX, //number// sizeY )''** *add a dummy item of given size ***''GUI:Indent( )''** *move content position toward the right by style.IndentSpacing pixels ***''GUI:Unindent( )''** *move content position back to the left (cancel Indent) ***''GUI:BeginGroup( )''** *lock horizontal starting position. once closing a group it is seen as a single item (so you can use GUI:IsItemHovered() on a group, GUI:SameLine() between groups, etc. ***''GUI:EndGroup( )''** *Needs to be called for each GUI:BeginGroup() ***''GUI:Columns( //number// count, __//string// name__, __//bool// border__ )''** *setup number of columns. use an identifier to distinguish multiple column sets. **close with Columns(1)**. ***''GUI:NextColumn( )''** *next column ***''GUI:GetColumnIndex( )''** *Returns: //number// current column index ***''GUI:GetColumnOffset( __//number// column_index__ )''** *Returns: //number// get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GUI:GetcolumnsCount() inclusive. column 0 is usually 0.0f and not resizable unless you call this ***''GUI:SetColumnOffset( //number// column_index, //number// offset_x )''** *set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column ***''GUI:GetColumnWidth( __//number// column_index__ )''** *Returns: //number// column width (== GUI:GetColumnOffset(GetColumnIndex()+1) - GUI:GetColumnOffset(GetColumnOffset()) ***''GUI:SetColumnWidth( //number// column_index, //number// width )''** *set column width (in pixels). pass -1 to use current column ***''GUI:GetColumnsCount( )''** *Returns: //number// number of columns (what was passed to Columns()) ***''GUI:GetTextLineHeight( )''** *Returns: //number// FontSize ***''GUI:GetTextLineHeightWithSpacing( )''** *Returns: //number// FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text) ***''GUI:GetFrameHeight( )''** *Returns: //number// FontSize + style.FramePadding.y * 2 ***''GUI:GetFrameHeightWithSpacing( )''** *Returns: //number// FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets) ===Cursor=== ***''GUI:GetCursorPos( )''** *Returns: //number// x, //number// y *cursor position is relative to window position ***''GUI:GetCursorPosX( )''** *Returns: //number// x ***''GUI:GetCursorPosY( )''** *Returns: //number// y ***''GUI:SetCursorPos( //number// x, //number// y )''** *sets cursor position is relative to window position ***''GUI:SetCursorPosX( //number// x )''** *sets cursor position x ***''GUI:SetCursorPosY( //number// y )''** *sets cursor position y ***''GUI:GetCursorStartPos( )''** *Returns: //number// x, //number// y *initial cursor position ***''GUI:GetCursorScreenPos( )''** *Returns: //number// x, //number// y *cursor position in absolute screen coordinates [0..io.DisplaySize] ***''GUI:SetCursorScreenPos( //number// x, //number// y )''** *cursor position in absolute screen coordinates [0..io.DisplaySize] ===ID Scopes=== If you are creating multiple GUI Elements you want to push a unique identifier so ImGui can differentiate them. You can also use "##extra" within your widget name to distinguish them from each others. ***''GUI:PushID( //string// id)''** *push identifier into the ID stack. ***''GUI:PopID( )''** *pops the last pushed identifier from the ID stack. ***''GUI:GetID( //string// id)''** *calculate unique ID ===Widgets Main=== ***''GUI:Text( //string// text)''** *creates a text element ***''GUI:TextColored( //number// R, //number// G, //number// B, //number// A, //string// text)''** *creates a colored text element, number range is 0.0 - 1.0 ***''GUI:TextDisabled( //string// text)''** *creates a disabled text element ***''GUI:TextWrapped( //string// text)''** *creates a text element which wraps ***''GUI:TextUnformatted( //string// text)''** *creates an unformatted text element ***''GUI:LabelText( //string// label, //string// text)''** *display text+label aligned the same way as value+label widgets ***''GUI:Bullet( )''** *creates a bullet element ***''GUI:BulletText( //string// text)''** *creates a bullet text element ***''GUI:Button( //string// label, __//number// sizeX__, __//number// sizeY__)''** *creates a buttom element ***''GUI:SmallButton( //string// label)''** *creates a smaller button element ***''GUI:ArrowButton( //string// label, [[gui_api#Directions|Direction]] direction )''** *creates an arrowbutton ***''GUI:InvisibleButton( //string// label, //number// sizeX, //number// sizeY)''** *creates an invisible button element ***''GUI:ColorButton( //string// id, //number// R, //number// G, //number// B, //number// A, __//[[gui_api#ColorEditMode|ColorEditMode]]// flags__, __//number// sizeX__, __//number// sizeY__)''** *Returns: //bool// pressed ***''GUI:FreeButton( //string// label, //number// posX, //number// posY, //number// sizeX, //number// sizeY)''** *creates a freely placable buttom element ***''GUI:FreeImageButton( ///string// internalid, //string// filepath, //number// posX, //number// posY, //number// sizeX, //number// sizeY)''** *creates a freely placable image buttom element ***''GUI:ImageButton(//string// internalid, //string// filepath, //number// sizeX, //number// sizeY, __//number// UV0_x__, __//number// UV0_y__, __//number// UV1_x__, __//number// UV1_y__, __//number// framepadding__,__//number// bg_col_R__, __//number// bg_col_G__, __//number// bg_col_B__, __//number// bg_col_A__, __//number// tint_col_R__, __//number// tint_col_G__, __//number// tint_col_B__, __//number// tint_col_A__ )''** *creates an image button, scary eh ;) ? Simple usage: GUI:ImageButton( //string// internalid, //string// filepath, //number// sizeX, //number// sizeY). * < 0 frame_padding uses default frame padding settings. 0 for no padding ***''GUI:Image(//string// filepath, //number// sizeX, //number// sizeY, __//number// UV0_x__, __//number// UV0_y__, __//number// UV1_x__, __//number// UV1_y__, __//number// bg_col_R__, __//number// bg_col_G__, __//number// bg_col_B__, __//number// bg_col_A__, __//number// tint_col_R__, __//number// tint_col_G__, __//number// tint_col_B__, __//number// tint_col_A__ )''** *Simple Usage: GUI:Image(//string// filepath, //number// sizeX, //number// sizeY) ***''GUI:Checkbox( //string// label, //bool// checked)''** *Returns: //bool// checked, //bool// pressed ***''GUI:CheckboxFlags( //string// label, //number// flags, //number// flags_value)''** *Returns: //number// flags, //bool// pressed ***''GUI:RadioButton( //string// label, //bool// active)''** *Returns: //bool// active ***''GUI:RadioButton( //string// label, //bool// active, //number// val)''** *Returns: //number// val, //bool// pressed ***''GUI:BeginCombo( //string// label, //string// preview_value, [[gui_api#ComboFlags|ComboFlag]])''** *Returns: //bool// val, BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it. Refer to https://github.com/ocornut/imgui/blob/master/imgui_demo.cpp to see how it has to be used. ***''GUI:EndCombo()''** *only call EndCombo() if BeginCombo() returns true! ***''GUI:Combo( //string// label, //number// current_item_listindex, //table// itemlist, __//number// height_in_items__)''** *Returns: //number// current_item_listindex, //bool// changed ***''GUI:ProgressBar( //number// fraction, //number// SizeX, //number// SizeY, __//string// overlay__ )''** *Guess what it draws ;) ===Widgets Drags=== (Tip: ctrl+click on a drag box to input text) ***''GUI:DragFloat( //string// label, //number// val, __//number// v_speed__, __//number// v_min__, __//number// v_max__, __//string// display_format__, __//number// power__)''** *Returns: //number// val, //bool// changed *display_format example "%.3f", *If v_min >= v_max we have no bound ***''GUI:DragFloatRange2( //string// label, //number// v_current_min, //number// v_current_max, __//number// v_speed__, __//number// v_min__, __//number// v_max__, __//string// display_format__, __//string// display_format_max__, __//number// power__)''** *Returns: //number// val_min, //number// val_max, //bool// changed *display_format example "%.3f", *If v_min >= v_max we have no bound ***''GUI:DragInt( //string// label, //number// val, __//number// v_speed__, __//number// v_min__, __//number// v_max__, __//string// display_format__)''** *Returns: //number// val, //bool// changed *display_format example "%.3f", *If v_min >= v_max we have no bound ***''GUI:DragIntRange2( //string// label, //number// v_current_min, //number// v_current_max, __//number// v_speed__, __//number// v_min__, __//number// v_max__, __//string// display_format__, __//string// display_format_max__)''** *Returns: //number// val_min, //number// val_max, //bool// changed *display_format example "%.3f", *If v_min >= v_max we have no bound ===Widgets Input=== ***''GUI:InputText( //string// label, //string// text, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //string// text, //bool// changed ***''GUI:InputTextMultiline( //string// label, //string// text, __//number// sizeX__, __//number// sizeY__ , __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //string// text, //bool// changed ***''GUI:InputTextEditor( //string// label, //string// text, __//number// sizeX__, __//number// sizeY__ , __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //string// text, //bool// changed *Lua syntax highlighting version of GUI:InputTextMultiline ***''GUI:InputFloat( //string// label, //number// val, __//number// step__, __//number// step_fast__, __//number// decimal_precision__, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //number// val, //bool// changed ***''GUI:InputFloat2( //string// label, //number// val, //number// val2, __//number// decimal_precision__, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //number// val, //number// val2, //bool// changed *Draws 2 Input fields behind each other in the same line ***''GUI:InputFloat3( //string// label, //number// val, //number// val2, //number// val3, __//number// decimal_precision__, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //number// val, //number// val2, //number// val3, //bool// changed *Draws 3 Input fields behind each other in the same line ***''GUI:InputFloat4( //string// label, //number// val, //number// val2, //number// val3, //number// val4, __//number// decimal_precision__, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //number// val, //number// val2, //number// val3, //number// val4, //bool// changed *Draws 4 Input fields behind each other in the same line ***''GUI:InputInt( //string// label, //number// val, __//number// step__, __//number// step_fast__, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //number// val, //bool// changed ***''GUI:InputInt2( //string// label, //number// val, //number// val2, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //number// val, //number// val2, //bool// changed *Draws 2 Input fields behind each other in the same line ***''GUI:InputInt3( //string// label, //number// val, //number// val2, //number// val3, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //number// val, //number// val2, //number// val3, //bool// changed *Draws 3 Input fields behind each other in the same line ***''GUI:InputInt4( //string// label, //number// val, //number// val2, //number// val3, //number// val4, __//[[gui_api#InputTextFlags|InputTextFlags]]// flags__)''** *Returns: //number// val, //number// val2, //number// val3, //number// val4, //bool// changed *Draws 4 Input fields behind each other in the same line ===Widgets Sliders=== ***''GUI:SliderFloat( //string// label, //number// val, //number// v_min, //number// v_max, __//string// display_format__, __//number// power__)''** *Returns: //number// val, //bool// changed ***''GUI:SliderFloat2( //string// label, //number// val, //number// val2, //number// v_min, //number// v_max, __//string// display_format__, __//number// power__)''** *Returns: //number// val, //number// val2, //bool// changed *Draws 2 Input fields behind each other in the same line ***''GUI:SliderFloat3( //string// label, //number// val, //number// val2, //number// val3, //number// v_min, //number// v_max, __//string// display_format__, __//number// power__)''** *Returns: //number// val, //number// val2, //number// val3, //bool// changed *Draws 3 Input fields behind each other in the same line ***''GUI:SliderFloat4( //string// label, //number// val, //number// val2, //number// val3, //number// val4, //number// v_min, //number// v_max, __//string// display_format__, __//number// power__)''** *Returns: //number// val, //number// val2, //number// val3, //number// val4, //bool// changed *Draws 4 Input fields behind each other in the same line ***''GUI:SliderAngle( //string// label, //number// v_rad, __//number// v_degrees_min__, __//number// v_degrees_max__)''** *Returns: //number// val, //bool// changed ***''GUI:SliderInt( //string// label, //number// val, //number// v_min, //number// v_max, __//string// display_format__)''** *Returns: //number// val, //bool// changed ***''GUI:SliderInt2( //string// label, //number// val, //number// val2, //number// v_min, //number// v_max, __//string// display_format__)''** *Returns: //number// val, //number// val2, //bool// changed ***''GUI:SliderInt3( //string// label, //number// val, //number// val2, //number// val3, //number// v_min, //number// v_max, __//string// display_format__)''** *Returns: //number// val, //number// val2, //number// val3, //bool// changed ***''GUI:SliderInt4( //string// label, //number// val, //number// val2, //number// val3, //number// val4, //number// v_min, //number// v_max, __//string// display_format__)''** *Returns: //number// val, //number// val2, //number// val3, //number// val4, //bool// changed ***''GUI:VSliderFloat( //string// label, //number// sizeX, //number// sizeY, //number// val, //number// v_min, //number// v_max, __//string// display_format__, __//number// power__)''** *Returns: //number// val, //bool// changed ***''GUI:VSliderInt( //string// label, //number// sizeX, //number// sizeY, //number// val, //number// v_min, //number// v_max, __//string// display_format__)''** *Returns: //number// val, //bool// changed ===Color Editor/Picker=== ***''GUI:ColorEdit3( //string// label, //number// R, //number// G, //number// B, __//[[gui_api#ColorEditMode|ColorEditMode]]// flags__)''** *Returns: //number// R, //number// G, //number// B, //bool// changed ***''GUI:ColorEdit4( //string// label, //number// R, //number// G, //number// B, //number// A, __//[[gui_api#ColorEditMode|ColorEditMode]]// flags__)''** *Returns: //number// R, //number// G, //number// B, //number// A, //bool// changed ***''GUI:ColorPicker3( //string// label, //number// R, //number// G, //number// B, __//[[gui_api#ColorEditMode|ColorEditMode]]// flags__)''** *Returns: //number// R, //number// G, //number// B, //bool// changed ***''GUI:ColorPicker4( //string// label, //number// R, //number// G, //number// B, //number// A, __//[[gui_api#ColorEditMode|ColorEditMode]]// flags__)''** *Returns: //number// R, //number// G, //number// B, //number// A, //bool// changed ***''GUI:ColorEditMode( [[gui_api#ColorEditMode|ColorEditMode]] mode)''** *sets ColorEditMode ===Widgets Trees=== ***''GUI:TreeNode( //string// label)''** *Returns: //bool// changed , if returning 'true' the node is open and the user is responsible for calling TreePop() ***''GUI:TreeNode( //string// label, //string// args)''** *Returns: //bool// changed , if returning 'true' the node is open and the user is responsible for calling TreePop() ***''GUI:TreeNode( //string// label, __//[[gui_api#TreeNodeFlags|TreeNodeFlag]]// flags__, //string// args)''** *Returns: //bool// changed , if returning 'true' the node is open and the user is responsible for calling TreePop() ***''GUI:TreePush( //string// id)''** *already called by TreeNode(), but you can call Push/Pop yourself for layouting purpose ***''GUI:TreePop( )''** *needs to be callled at the end of TreePush() ***''GUI:SetNextTreeNodeOpened( //bool// opened, __//[[gui_api#SetCond|SetCond]]// flags__)''** *set next tree node to be opened. ***''GUI:CollapsingHeader( //string// label, __//[[gui_api#TreeNodeFlags|TreeNodeFlag]]// flags__)''** *Returns: //bool// collapsed, if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). ***''GUI:CollapsingHeader( //string// label, //bool// p_open, __//[[gui_api#TreeNodeFlags|TreeNodeFlag]]// flag__)''** *Returns: //bool// collapsed, when 'p_open' isn't NULL, display an additional small close button on upper right of the header ===Widgets Lists=== ***''GUI:Selectable( //string// label, //bool// selected, __//[[gui_api#SelectableFlags|SelectableFlag]]// flags__, __//number// sizeX__, __//number// sizeY__ )''** *Returns: //bool// selected, //bool// changed *size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height ***''GUI:ListBox( //string// label, //number// current_listitem_index, //table// itemlist, __//number// height_in_items__ )''** *Returns: //number// current_item_index, //bool// changed ***''GUI:ListBoxHeader( //string// label, //number// items_count, __//number// height_in_items__ )''** *Returns: //bool// *use if you want to reimplement ListBox() will custom data or interactions. make sure to call ListBoxFooter() afterwards. ***''GUI:ListBoxFooter( )''** *terminate the scrolling region ===Widgets Tooltip=== ***''GUI:SetTooltip( //string// label )''** *set tooltip under mouse-cursor, typically use with GUI:IsItemHovered. last call wins ***''GUI:BeginTooltip( )''** *use to create full-featured tooltip windows that aren't just text ***''GUI:EndTooltip( )''** *use to create full-featured tooltip windows that aren't just text ===Widgets Menus=== ***''GUI:BeginMainMenuBar( )''** *Returns: //bool// opened *create and append to a full screen menu-bar. only call EndMainMenuBar() if this returns true! ***''GUI:EndMainMenuBar( )''** *End Menubar drawing ***''GUI:BeginMenuBar( )''** *Returns: //bool// opened *append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set). only call EndMenuBar() if this returns true! ***''GUI:EndMenuBar( )''** *End Menubar drawing ***''GUI:BeginMenu( //string// label, __//bool// enabled__ )''** *Returns: //bool// opened *create a sub-menu entry. only call EndMenu() if this returns true! ***''GUI:EndMenu( )''** *End Menubar drawing ***''GUI:MenuItem( //string// label, __//string// shortcut__, __//bool// selected__, __//bool// enabled__)''** *Returns: //bool// activated, //bool// selected *Shortcuts are currently only visual, aka not working, you need to add that yourself ===Widgets Popup=== ***''GUI:OpenPopup( //string// id)''** *mark popup as open. popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). ***''GUI:BeginPopup( //string// id, __//[[gui_api#WindowFlags|WindowFlags]]// flags__)''** *Returns: //bool// open *return true if popup if opened and start outputting to it. only call EndPopup() if BeginPopup() returned true! ***''GUI:BeginPopupModal( //string// name, __//bool// opened__, __//[[gui_api#WindowFlags|WindowFlags]]// flags__)''** *Returns //bool// visible, //bool// open *modal dialog (can't close them by clicking outside) ***''GUI:BeginPopupContextItem( //string// id, __//number// mouse_button__)''** *Returns //bool// open *helper to open and begin popup when clicked on last item ***''GUI:BeginPopupContextWindow( //string// id, __//number// mouse_button__, __//bool// also_over_items__)''** *Returns //bool// open *helper to open and begin popup when clicked on current window ***''GUI:BeginPopupContextVoid( __//string// id__, __//number// mouse_button__)''** *Returns //bool// open *helper to open and begin popup when clicked in void (no window) ***''GUI:EndPopup( )''** *needs to be called on opened popups ***''GUI:IsPopupOpen( //string// id)''** *Returns //bool// open ***''GUI:CloseCurrentPopup( )''** *close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup. ===Widgets Utilities=== ***''GUI:IsItemHovered( __//[[gui_api#HoveredFlags|HoveredFlags]]// flags__ )''** *Results: //bool// *is the last item hovered? (and usable, aka not blocked by a popup, etc.). ***''GUI:IsItemActive( )''** *Results: //bool// *is the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false) ***''GUI:IsItemFocused( )''** *Results: //bool// *is the last item focused for keyboard/gamepad navigation? ***''GUI:IsItemClicked( __//int// mousebutton == 0__)''** *Results: //bool// *was the last item clicked? (e.g. button/node just clicked on) ***''GUI:IsItemVisible( )''** *Results: //bool// *was the last item visible? (aka not out of sight due to clipping/scrolling.) ***''GUI:IsAnyItemHovered( )''** *Results: //bool// ***''GUI:IsAnyItemActive( )''** *Results: //bool// ***''GUI:IsAnyItemFocused( )''** *Results: //bool// *is the any item focused for keyboard/gamepad navigation? ***''GUI:GetItemRectMin( )''** *Results: //number// x, //number// y *get bounding rect of last item in screen space ***''GUI:GetItemRectMax( )''** *Results: //number// x, //number// y *get bounding rect of last item in screen space ***''GUI:GetItemRectSize( )''** *Results: //number// x, //number// y ***''GUI:SetItemAllowOverlap( )''** *Allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area. ***''GUI:IsRectVisible( //number// x, //number// y)''** *Results: //bool// *test if rectangle of given size starting from cursor pos is visible (not clipped). to perform coarse clipping on user's side ***''GUI:GetTime( )''** *Results: //number// ***''GUI:GetFrameCount( )''** *Results: //number// ***''GUI:CalcTextSize( //string// text)''** *Results: //number// sizex, //number// sizey ***''GUI:CalcListClipping( //number// items_count, //number// items_height, //number// out_items_display_start, //number// out_items_display_end)''** *Results: //number// out1, //number// out2 *calculate coarse clipping for large list of evenly sized items. Prefer using the ImGuiListClipper higher-level helper if you can. ***''GUI:BeginChildFrame( //number// guiID, //number// sizex, //number// sizey, __//[[gui_api#WindowFlags|WindowFlags]]// flags__)''** *Results: //bool// *helper to create a child window / scrolling region that looks like a normal widget frame ***''GUI:EndChildFrame( )''** *needs to be called at the end of BeginChildFrame. ***''GUI:ColorConvertU32ToFloat4( //number// U32val)''** *Returns: //number// val1,//number// val2,//number// val3,//number// val4 ***''GUI:ColorConvertFloat4ToU32( //number// val1,//number// val2,//number// val3,//number// val4 )''** *Returns: //number// U32val ***''GUI:ColorConvertRGBtoHSV( //number// r, //number// g, //number// b)''** *Returns: //number// h, //number// s, //number// v ***''GUI:ColorConvertHSVtoRGB( //number// h, //number// s, //number// v)''** *Returns: //number// r, //number// g, //number// b ***''GUI:GetScreenSize()''** *Returns: //number// x, //number// y ***''GUI:IsKeyDown( //number// virtualkey)''** *Returns: //bool// *https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx for all values, convert the hex to decimal values ***''GUI:IsKeyPressed( //number// virtualkey, __//bool// repeat__)''** *Returns: //bool// *https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx for all values, convert the hex to decimal values ***''GUI:IsKeyReleased( //number// virtualkey)''** *Returns: //bool// *https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx to for values, convert the hex to decimal values ***''GUI:IsMouseDown( //number// button)''** *Returns: //bool// ***''GUI:IsMouseClicked( //number// button, __//bool// repeat__)''** *Returns: //bool// ***''GUI:IsMouseDoubleClicked( //number// button)''** *Returns: //bool// ***''GUI:IsMouseReleased( //number// button)''** *Returns: //bool// ***''GUI:IsMouseHoveringWindow( //number// button)''** *Returns: //bool// *is mouse hovering current window ("window" in API names always refer to current window). disregarding of any consideration of being blocked by a popup. (unlike IsWindowHovered() this will return true even if the window is blocked because of a popup) ***''GUI:IsMouseHoveringAnyWindow( //number// button)''** *Returns: //bool// ***''GUI:IsMouseHoveringAnyWindow( //number// pos_minX, //number// pos_minY, //number// pos_maxX, //number// pos_maxY, __//bool// clip__)''** *Returns: //bool// *is mouse hovering given bounding rect (in screen space). clipped by current clipping settings. disregarding of consideration of focus/window ordering/blocked by a popup. ***''GUI:IsMouseDragging( __//number// button__, __//number// lock_threshold__)''** *Returns: //bool// ***''GUI:GetMousePos( )''** *Returns: //number// x, //number// y ***''GUI:GetMousePosOnOpeningCurrentPopup( )''** *Returns: //number// x, //number// y *retrieve backup of mouse positioning at the time of opening popup we have BeginPopup() into ***''GUI:GetMouseDragDelta( __//number// button__, __//number// lock_threshold__)''** *Returns: //number// x, //number// y *dragging amount since clicking. ***''GUI:ResetMouseDragDelta( __//number// button__)''** *Banana ;) ***''GUI:GetClipboardText()''** *get text data from the clipboard ***''GUI:SetClipboardText( //string// input)''** *set text data to the clipboard ===Custom Widgets=== ***''GUI:Keybind( //string// label, //number// virtualKey, __//number// width__)''** *Returns: //number// virtualKey, //string// keyName, //boolean// changed *Clicking the widget will start a listener for the next key press event ===Custom Drawing=== Usage: GUI:AddCircleFilled( 300, 300, 475,GUI:ColorConvertFloat4ToU32(0.9,0.1,0.12,0.5)) IMPORTANT: Use GUI:ColorConvertFloat4ToU32() to calculatethe required //number//color argument!! ***''GUI:AddLine( //number// X1, //number// Y1, //number// X2, //number// Y2, //number// color, __//number// thickness = 1.0__,)''** ***''GUI:AddRect( //number// X1, //number// Y1, //number// X2, //number// Y2, //number// color, __//number// rounding= 0.0__, __//number// rounding_corners = 0.0__)''** ***''GUI:AddRectFilled( //number// X1, //number// Y1, //number// X2, //number// Y2, //number// color, __//number// rounding= 0.0__, __//number// rounding_corners = 0.0__)''** ***''GUI:AddQuadFilled( //number// X1, //number// Y1, //number// X2, //number// Y2, //number// X3, //number// Y3, //number// X4, //number// Y4, //number// color)''** ***''GUI:AddTriangleFilled( //number// X1, //number// Y1, //number// X2, //number// Y2, //number// X3, //number// Y3, //number// color)''** ***''GUI:AddCircle( //number// X1, //number// Y1, //number// radius, //number// color, __//number// num_segments= 12__)''** ***''GUI:AddCircleFilled( //number// X1, //number// Y1, //number// radius, //number// color, __//number// num_segments= 12__)''** ***''GUI:AddText( //number// X1, //number// Y1, //number// color, //string// text)''** ***''GUI:AddImage( //string// texturepath, //number// X1, //number// Y1, //number// X2, //number// Y2)''** ***''RenderManager:WorldToScreen(//table// worldpos, //bool// true)''** *Returns: //number// X1, //number// Y1, screenpos *USE THIS ONE IF POSSIBLE, it is A LOT FASTER than the one below! Converts a worldposition x,y,z to a screenposition x,y , IF that point is currently visible on the screen ***''RenderManager:WorldToScreen(//table// worldpos)''** *Returns: //table// screenpos *Converts a worldposition x,y,z to a screenposition x,y , IF that point is currently visible on the screen ===Enums & Flags=== These are registered values in the GUI metatable. //Usage: d(GUI.WindowFlags_NoMove)// will print "2" into the console. ==WindowFlags== * GUI.WindowFlags_NoTitleBar * GUI.WindowFlags_NoResize * GUI.WindowFlags_NoMove * GUI.WindowFlags_NoScrollbar * GUI.WindowFlags_NoScrollWithMouse * GUI.WindowFlags_NoCollapse * GUI.WindowFlags_AlwaysAutoResize * GUI.WindowFlags_NoSavedSettings * GUI.WindowFlags_NoInputs * GUI.WindowFlags_MenuBar * GUI.WindowFlags_HorizontalScrollbar * GUI.WindowFlags_NoFocusOnAppearing * GUI.WindowFlags_NoBringToFrontOnFocus * GUI.WindowFlags_ForceVerticalScrollbar * GUI.WindowFlags_ForceHorizontalScrollbar * GUI.WindowFlags_AlwaysUseWindowPadding ==InputTextFlags== * GUI.InputTextFlags_CharsDecimal * GUI.InputTextFlags_CharsHexadecimal * GUI.InputTextFlags_CharsUppercase * GUI.InputTextFlags_CharsNoBlank * GUI.InputTextFlags_AutoSelectAll * GUI.InputTextFlags_EnterReturnsTrue * GUI.InputTextFlags_CallbackCompletion * GUI.InputTextFlags_CallbackHistory * GUI.InputTextFlags_CallbackAlways * GUI.InputTextFlags_CallbackCharFilter * GUI.InputTextFlags_AllowTabInput * GUI.InputTextFlags_CtrlEnterForNewLine * GUI.InputTextFlags_NoHorizontalScroll * GUI.InputTextFlags_AlwaysInsertMode * GUI.InputTextFlags_ReadOnly * GUI.InputTextFlags_NoUndoRedo * GUI.InputTextFlags_CharsScientific * GUI.InputTextFlags_Password ==SelectableFlags== * GUI.SelectableFlags_DontClosePopups * GUI.SelectableFlags_SpanAllColumns * GUI.SelectableFlags_AllowDoubleClick ==ComboFlags== * GUI.ComboFlags_PopupAlignLeft * GUI.ComboFlags_HeightSmall * GUI.ComboFlags_HeightRegular * GUI.ComboFlags_HeightLarge * GUI.ComboFlags_HeightLargest * GUI.ComboFlags_NoArrowButton * GUI.ComboFlags_NoPreview ==PushStyleColor== * GUI.Col_Text * GUI.Col_TextDisabled * GUI.Col_WindowBg * GUI.Col_ChildWindowBg * GUI.Col_Border * GUI.Col_BorderShadow * GUI.Col_FrameBg * GUI.Col_FrameBgHovered * GUI.Col_FrameBgActive * GUI.Col_TitleBg * GUI.Col_TitleBgCollapsed * GUI.Col_TitleBgActive * GUI.Col_MenuBarBg * GUI.Col_ScrollbarBg * GUI.Col_ScrollbarGrab * GUI.Col_ScrollbarGrabHovered * GUI.Col_ScrollbarGrabActive * GUI.Col_CheckMark * GUI.Col_SliderGrab * GUI.Col_SliderGrabActive * GUI.Col_Button * GUI.Col_ButtonHovered * GUI.Col_ButtonActive * GUI.Col_Header * GUI.Col_HeaderHovered * GUI.Col_HeaderActive * GUI.Col_Column * GUI.Col_ColumnHovered * GUI.Col_ColumnActive * GUI.Col_ResizeGrip * GUI.Col_ResizeGripHovered * GUI.Col_ResizeGripActive * GUI.Col_PlotLines * GUI.Col_PlotLinesHovered * GUI.Col_PlotHistogram * GUI.Col_PlotHistogramHovered * GUI.Col_TextSelectedBg * GUI.Col_TooltipBg * GUI.Col_ModalWindowDarkening * GUI.Col_DragDropTarget * GUI.Col_NavHighlight * GUI.Col_NavWindowingHighlight ==PushStyleVar== * GUI.StyleVar_Alpha * GUI.StyleVar_WindowPadding * GUI.StyleVar_WindowRounding * GUI.StyleVar_WindowBorderSize * GUI.StyleVar_WindowMinSize * GUI.StyleVar_ChildWindowRounding * GUI.StyleVar_ChildBorderSize * GUI.StyleVar_PopupRounding * GUI.StyleVar_PopupBorderSize * GUI.StyleVar_FramePadding * GUI.StyleVar_FrameRounding * GUI.StyleVar_FrameBorderSize * GUI.StyleVar_ItemSpacing * GUI.StyleVar_ItemInnerSpacing * GUI.StyleVar_IndentSpacing * GUI.StyleVar_ScrollbarSize * GUI.StyleVar_ScrollbarRounding * GUI.StyleVar_GrabMinSize * GUI.StyleVar_GrabRounding * GUI.StyleVar_ButtonTextAlign ==ColorEditMode== * for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton() * GUI.ColorEditMode_NoAlpha * GUI.ColorEditMode_NoOptions * GUI.ColorEditMode_NoSmallPreview * GUI.ColorEditMode_NoInputs * GUI.ColorEditMode_NoTooltip * GUI.ColorEditMode_NoLabel * GUI.ColorEditMode_NoSidePreview * GUI.ColorEditMode_AlphaBar * GUI.ColorEditMode_AlphaPreview * GUI.ColorEditMode_AlphaPreviewHalf * GUI.ColorEditMode_HDR * GUI.ColorEditMode_Uint8 * GUI.ColorEditMode_Float * GUI.ColorEditMode_PickerHueBar * GUI.ColorEditMode_PickerHueWheel * GUI.ColorEditMode_RGB * GUI.ColorEditMode_HSV * GUI.ColorEditMode_HEX ==SetCondFlags== * GUI.SetCond_Always * GUI.SetCond_Once * GUI.SetCond_FirstUseEver * GUI.SetCond_Appearing ==DrawCornerFlags== * GUI.DrawCornerFlag_TopLeft * GUI.DrawCornerFlag_TopRight * GUI.DrawCornerFlag_BottomLeft * GUI.DrawCornerFlag_BottomRight ==FocusedFlags== * GUI.FocusedFlags_ChildWindows * GUI.FocusedFlags_RootWindow * GUI.FocusedFlags_AnyWindow ==HoveredFlags== * GUI.HoveredFlags_Default * GUI.HoveredFlags_ChildWindows * GUI.HoveredFlags_RootWindow * GUI.HoveredFlags_AnyWindow * GUI.HoveredFlags_AllowWhenBlockedByPopup * GUI.HoveredFlags_AllowWhenBlockedByActiveItem * GUI.HoveredFlags_AllowWhenOverlapped ==Directions== * GUI.Dir_Left * GUI.Dir_Right * GUI.Dir_Up * GUI.Dir_Down ==TreeNodeFlags== * GUI.TreeNodeFlags_Selected * GUI.TreeNodeFlags_Framed * GUI.TreeNodeFlags_AllowItemOverlap * GUI.TreeNodeFlags_NoTreePushOnOpen * GUI.TreeNodeFlags_NoAutoOpenOnLog * GUI.TreeNodeFlags_SDefaultOpen * GUI.TreeNodeFlags_OpenOnDoubleClick * GUI.TreeNodeFlags_OpenOnArrow * GUI.TreeNodeFlags_Leaf * GUI.TreeNodeFlags_Bullet * GUI.TreeNodeFlags_FramePadding * GUI.TreeNodeFlags_NavLeftJumpsBackHere * GUI.TreeNodeFlags_CollapsingHeader