@ -54,7 +54,7 @@
// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp.
// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp.
// Navigating this file:
// Navigating this file:
// - In Visual Studio IDE : CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
/*
/*
@ -171,7 +171,8 @@ Index of this file:
# define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B))
# define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B))
# define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V))
# define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V))
// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
// Enforce cdecl calling convention for functions called by the standard library,
// in case compilation settings changed the default to e.g. __vectorcall
# ifndef IMGUI_CDECL
# ifndef IMGUI_CDECL
# ifdef _MSC_VER
# ifdef _MSC_VER
# define IMGUI_CDECL __cdecl
# define IMGUI_CDECL __cdecl
@ -759,7 +760,8 @@ static void ShowDemoWindowWidgets()
static int item_current = 0 ;
static int item_current = 0 ;
ImGui : : Combo ( " combo " , & item_current , items , IM_ARRAYSIZE ( items ) ) ;
ImGui : : Combo ( " combo " , & item_current , items , IM_ARRAYSIZE ( items ) ) ;
ImGui : : SameLine ( ) ; HelpMarker (
ImGui : : SameLine ( ) ; HelpMarker (
" Using the simplified one-liner Combo API here. \n Refer to the \" Combo \" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API. " ) ;
" Using the simplified one-liner Combo API here. \n "
" Refer to the \" Combo \" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API. " ) ;
}
}
{
{
@ -770,7 +772,8 @@ static void ShowDemoWindowWidgets()
static int item_current = 1 ;
static int item_current = 1 ;
ImGui : : ListBox ( " listbox " , & item_current , items , IM_ARRAYSIZE ( items ) , 4 ) ;
ImGui : : ListBox ( " listbox " , & item_current , items , IM_ARRAYSIZE ( items ) , 4 ) ;
ImGui : : SameLine ( ) ; HelpMarker (
ImGui : : SameLine ( ) ; HelpMarker (
" Using the simplified one-liner ListBox API here. \n Refer to the \" List boxes \" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API. " ) ;
" Using the simplified one-liner ListBox API here. \n "
" Refer to the \" List boxes \" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API. " ) ;
}
}
ImGui : : TreePop ( ) ;
ImGui : : TreePop ( ) ;
@ -1088,7 +1091,7 @@ static void ShowDemoWindowWidgets()
" CJK text will only appear if the font was loaded with the appropriate CJK character ranges. "
" CJK text will only appear if the font was loaded with the appropriate CJK character ranges. "
" Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. "
" Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. "
" Read docs/FONTS.md for details. " ) ;
" Read docs/FONTS.md for details. " ) ;
ImGui : : Text ( " Hiragana: \xe3 \x81 \x8b \xe3 \x81 \x8d \xe3 \x81 \x8f \xe3 \x81 \x91 \xe3 \x81 \x93 (kakikukeko) " ) ; // Normally we would use u8"blah blah" with the proper characters directly in the string.
ImGui : : Text ( " Hiragana: \xe3 \x81 \x8b \xe3 \x81 \x8d \xe3 \x81 \x8f \xe3 \x81 \x91 \xe3 \x81 \x93 (kakikukeko) " ) ;
ImGui : : Text ( " Kanjis: \xe6 \x97 \xa5 \xe6 \x9c \xac \xe8 \xaa \x9e (nihongo) " ) ;
ImGui : : Text ( " Kanjis: \xe6 \x97 \xa5 \xe6 \x9c \xac \xe8 \xaa \x9e (nihongo) " ) ;
static char buf [ 32 ] = " \xe6 \x97 \xa5 \xe6 \x9c \xac \xe8 \xaa \x9e " ;
static char buf [ 32 ] = " \xe6 \x97 \xa5 \xe6 \x9c \xac \xe8 \xaa \x9e " ;
//static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis
//static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis
@ -1132,7 +1135,7 @@ static void ShowDemoWindowWidgets()
ImVec2 pos = ImGui : : GetCursorScreenPos ( ) ;
ImVec2 pos = ImGui : : GetCursorScreenPos ( ) ;
ImVec2 uv_min = ImVec2 ( 0.0f , 0.0f ) ; // Top-left
ImVec2 uv_min = ImVec2 ( 0.0f , 0.0f ) ; // Top-left
ImVec2 uv_max = ImVec2 ( 1.0f , 1.0f ) ; // Lower-right
ImVec2 uv_max = ImVec2 ( 1.0f , 1.0f ) ; // Lower-right
ImVec4 tint_col = use_text_color_for_tint ? ImGui : : GetStyleColorVec4 ( ImGuiCol_Text ) : ImVec4 ( 1.0f , 1.0f , 1.0f , 1.0f ) ; // No tint
ImVec4 tint_col = use_text_color_for_tint ? ImGui : : GetStyleColorVec4 ( ImGuiCol_Text ) : ImVec4 ( 1.0f , 1.0f , 1.0f , 1.0f ) ; // No tint
ImVec4 border_col = ImGui : : GetStyleColorVec4 ( ImGuiCol_Border ) ;
ImVec4 border_col = ImGui : : GetStyleColorVec4 ( ImGuiCol_Border ) ;
ImGui : : Image ( my_tex_id , ImVec2 ( my_tex_w , my_tex_h ) , uv_min , uv_max , tint_col , border_col ) ;
ImGui : : Image ( my_tex_id , ImVec2 ( my_tex_w , my_tex_h ) , uv_min , uv_max , tint_col , border_col ) ;
if ( ImGui : : BeginItemTooltip ( ) )
if ( ImGui : : BeginItemTooltip ( ) )
@ -1191,9 +1194,9 @@ static void ShowDemoWindowWidgets()
ImGui : : CheckboxFlags ( " ImGuiComboFlags_PopupAlignLeft " , & flags , ImGuiComboFlags_PopupAlignLeft ) ;
ImGui : : CheckboxFlags ( " ImGuiComboFlags_PopupAlignLeft " , & flags , ImGuiComboFlags_PopupAlignLeft ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Only makes a difference if the popup is larger than the combo " ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Only makes a difference if the popup is larger than the combo " ) ;
if ( ImGui : : CheckboxFlags ( " ImGuiComboFlags_NoArrowButton " , & flags , ImGuiComboFlags_NoArrowButton ) )
if ( ImGui : : CheckboxFlags ( " ImGuiComboFlags_NoArrowButton " , & flags , ImGuiComboFlags_NoArrowButton ) )
flags & = ~ ImGuiComboFlags_NoPreview ; // Clear the other flag, as we cannot combine both
flags & = ~ ImGuiComboFlags_NoPreview ; // Clear incompatible flags
if ( ImGui : : CheckboxFlags ( " ImGuiComboFlags_NoPreview " , & flags , ImGuiComboFlags_NoPreview ) )
if ( ImGui : : CheckboxFlags ( " ImGuiComboFlags_NoPreview " , & flags , ImGuiComboFlags_NoPreview ) )
flags & = ~ ( ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_WidthFitPreview ) ; // Clear the other flag, as we cannot combine both
flags & = ~ ( ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_WidthFitPreview ) ; // Clear incompatible flags
if ( ImGui : : CheckboxFlags ( " ImGuiComboFlags_WidthFitPreview " , & flags , ImGuiComboFlags_WidthFitPreview ) )
if ( ImGui : : CheckboxFlags ( " ImGuiComboFlags_WidthFitPreview " , & flags , ImGuiComboFlags_WidthFitPreview ) )
flags & = ~ ImGuiComboFlags_NoPreview ;
flags & = ~ ImGuiComboFlags_NoPreview ;
@ -1210,7 +1213,10 @@ static void ShowDemoWindowWidgets()
// stored in the object itself, etc.)
// stored in the object itself, etc.)
const char * items [ ] = { " AAAA " , " BBBB " , " CCCC " , " DDDD " , " EEEE " , " FFFF " , " GGGG " , " HHHH " , " IIII " , " JJJJ " , " KKKK " , " LLLLLLL " , " MMMM " , " OOOOOOO " } ;
const char * items [ ] = { " AAAA " , " BBBB " , " CCCC " , " DDDD " , " EEEE " , " FFFF " , " GGGG " , " HHHH " , " IIII " , " JJJJ " , " KKKK " , " LLLLLLL " , " MMMM " , " OOOOOOO " } ;
static int item_current_idx = 0 ; // Here we store our selection data as an index.
static int item_current_idx = 0 ; // Here we store our selection data as an index.
const char * combo_preview_value = items [ item_current_idx ] ; // Pass in the preview value visible before opening the combo (it could be anything)
// Pass in the preview value visible before opening the combo (it could technically be different contents or not pulled from items[])
const char * combo_preview_value = items [ item_current_idx ] ;
if ( ImGui : : BeginCombo ( " combo 1 " , combo_preview_value , flags ) )
if ( ImGui : : BeginCombo ( " combo 1 " , combo_preview_value , flags ) )
{
{
for ( int n = 0 ; n < IM_ARRAYSIZE ( items ) ; n + + )
for ( int n = 0 ; n < IM_ARRAYSIZE ( items ) ; n + + )
@ -1250,8 +1256,10 @@ static void ShowDemoWindowWidgets()
IMGUI_DEMO_MARKER ( " Widgets/List Boxes " ) ;
IMGUI_DEMO_MARKER ( " Widgets/List Boxes " ) ;
if ( ImGui : : TreeNode ( " List boxes " ) )
if ( ImGui : : TreeNode ( " List boxes " ) )
{
{
// BeginListBox() is essentially a thin wrapper to using BeginChild()/EndChild() with the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label.
// BeginListBox() is essentially a thin wrapper to using BeginChild()/EndChild()
// You may be tempted to simply use BeginChild() directly, however note that BeginChild() requires EndChild() to always be called (inconsistent with BeginListBox()/EndListBox()).
// using the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label.
// You may be tempted to simply use BeginChild() directly. However note that BeginChild() requires EndChild()
// to always be called (inconsistent with BeginListBox()/EndListBox()).
// Using the generic BeginListBox() API, you have full control over how to display the combo contents.
// Using the generic BeginListBox() API, you have full control over how to display the combo contents.
// (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively
// (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively
@ -1570,16 +1578,21 @@ static void ShowDemoWindowWidgets()
} ;
} ;
static char buf1 [ 64 ] ;
static char buf1 [ 64 ] ;
ImGui : : InputText ( " Completion " , buf1 , 64 , ImGuiInputTextFlags_CallbackCompletion , Funcs : : MyCallback ) ;
ImGui : : InputText ( " Completion " , buf1 , 64 , ImGuiInputTextFlags_CallbackCompletion , Funcs : : MyCallback ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Here we append \" .. \" each time Tab is pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback. " ) ;
ImGui : : SameLine ( ) ; HelpMarker (
" Here we append \" .. \" each time Tab is pressed. "
" See 'Examples>Console' for a more meaningful demonstration of using this callback. " ) ;
static char buf2 [ 64 ] ;
static char buf2 [ 64 ] ;
ImGui : : InputText ( " History " , buf2 , 64 , ImGuiInputTextFlags_CallbackHistory , Funcs : : MyCallback ) ;
ImGui : : InputText ( " History " , buf2 , 64 , ImGuiInputTextFlags_CallbackHistory , Funcs : : MyCallback ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Here we replace and select text each time Up/Down are pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback. " ) ;
ImGui : : SameLine ( ) ; HelpMarker (
" Here we replace and select text each time Up/Down are pressed. "
" See 'Examples>Console' for a more meaningful demonstration of using this callback. " ) ;
static char buf3 [ 64 ] ;
static char buf3 [ 64 ] ;
static int edit_count = 0 ;
static int edit_count = 0 ;
ImGui : : InputText ( " Edit " , buf3 , 64 , ImGuiInputTextFlags_CallbackEdit , Funcs : : MyCallback , ( void * ) & edit_count ) ;
ImGui : : InputText ( " Edit " , buf3 , 64 , ImGuiInputTextFlags_CallbackEdit , Funcs : : MyCallback , ( void * ) & edit_count ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Here we toggle the casing of the first character on every edit + count edits. " ) ;
ImGui : : SameLine ( ) ; HelpMarker (
" Here we toggle the casing of the first character on every edit + count edits. " ) ;
ImGui : : SameLine ( ) ; ImGui : : Text ( " (%d) " , edit_count ) ;
ImGui : : SameLine ( ) ; ImGui : : Text ( " (%d) " , edit_count ) ;
ImGui : : TreePop ( ) ;
ImGui : : TreePop ( ) ;
@ -1754,8 +1767,9 @@ static void ShowDemoWindowWidgets()
ImGui : : EndPopup ( ) ;
ImGui : : EndPopup ( ) ;
}
}
// Demo Trailing Tabs: click the "+" button to add a new tab (in your app you may want to use a font icon instead of the "+")
// Demo Trailing Tabs: click the "+" button to add a new tab.
// Note that we submit it before the regular tabs, but because of the ImGuiTabItemFlags_Trailing flag it will always appear at the end.
// (In your app you may want to use a font icon instead of the "+")
// We submit it before the regular tabs, but thanks to the ImGuiTabItemFlags_Trailing flag it will always appear at the end.
if ( show_trailing_button )
if ( show_trailing_button )
if ( ImGui : : TabItemButton ( " + " , ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip ) )
if ( ImGui : : TabItemButton ( " + " , ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip ) )
active_tabs . push_back ( next_tab_id + + ) ; // Add new tab
active_tabs . push_back ( next_tab_id + + ) ; // Add new tab
@ -2039,7 +2053,8 @@ static void ShowDemoWindowWidgets()
if ( ImGui : : Button ( " Default: Float + HDR + Hue Wheel " ) )
if ( ImGui : : Button ( " Default: Float + HDR + Hue Wheel " ) )
ImGui : : SetColorEditOptions ( ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel ) ;
ImGui : : SetColorEditOptions ( ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel ) ;
// Always both a small version of both types of pickers (to make it more visible in the demo to people who are skimming quickly through it)
// Always display a small version of both types of pickers
// (that's in order to make it more visible in the demo to people who are skimming quickly through it)
ImGui : : Text ( " Both types: " ) ;
ImGui : : Text ( " Both types: " ) ;
float w = ( ImGui : : GetContentRegionAvail ( ) . x - ImGui : : GetStyle ( ) . ItemSpacing . y ) * 0.40f ;
float w = ( ImGui : : GetContentRegionAvail ( ) . x - ImGui : : GetStyle ( ) . ItemSpacing . y ) * 0.40f ;
ImGui : : SetNextItemWidth ( w ) ;
ImGui : : SetNextItemWidth ( w ) ;
@ -3381,7 +3396,9 @@ static void ShowDemoWindowLayout()
IMGUI_DEMO_MARKER ( " Layout/Scrolling/Horizontal contents size demo window " ) ;
IMGUI_DEMO_MARKER ( " Layout/Scrolling/Horizontal contents size demo window " ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_ItemSpacing , ImVec2 ( 2 , 0 ) ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_ItemSpacing , ImVec2 ( 2 , 0 ) ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_FramePadding , ImVec2 ( 2 , 0 ) ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_FramePadding , ImVec2 ( 2 , 0 ) ) ;
HelpMarker ( " Test of different widgets react and impact the work rectangle growing when horizontal scrolling is enabled. \n \n Use 'Metrics->Tools->Show windows rectangles' to visualize rectangles. " ) ;
HelpMarker (
" Test how different widgets react and impact the work rectangle growing when horizontal scrolling is enabled. \n \n "
" Use 'Metrics->Tools->Show windows rectangles' to visualize rectangles. " ) ;
ImGui : : Checkbox ( " H-scrollbar " , & show_h_scrollbar ) ;
ImGui : : Checkbox ( " H-scrollbar " , & show_h_scrollbar ) ;
ImGui : : Checkbox ( " Button " , & show_button ) ; // Will grow contents size (unless explicitly overwritten)
ImGui : : Checkbox ( " Button " , & show_button ) ; // Will grow contents size (unless explicitly overwritten)
ImGui : : Checkbox ( " Tree nodes " , & show_tree_nodes ) ; // Will grow contents size and display highlight over full width
ImGui : : Checkbox ( " Tree nodes " , & show_tree_nodes ) ; // Will grow contents size and display highlight over full width
@ -3537,7 +3554,8 @@ static void ShowDemoWindowLayout()
HelpMarker (
HelpMarker (
" Hit-testing is by default performed in item submission order, which generally is perceived as 'back-to-front'. \n \n "
" Hit-testing is by default performed in item submission order, which generally is perceived as 'back-to-front'. \n \n "
" By using SetNextItemAllowOverlap() you can notify that an item may be overlapped by another. Doing so alters the hovering logic: items using AllowOverlap mode requires an extra frame to accept hovered state. " ) ;
" By using SetNextItemAllowOverlap() you can notify that an item may be overlapped by another. "
" Doing so alters the hovering logic: items using AllowOverlap mode requires an extra frame to accept hovered state. " ) ;
ImGui : : Checkbox ( " Enable AllowOverlap " , & enable_allow_overlap ) ;
ImGui : : Checkbox ( " Enable AllowOverlap " , & enable_allow_overlap ) ;
ImVec2 button1_pos = ImGui : : GetCursorScreenPos ( ) ;
ImVec2 button1_pos = ImGui : : GetCursorScreenPos ( ) ;
@ -3924,7 +3942,8 @@ struct MyItem
}
}
// qsort() is instable so always return a way to differenciate items.
// qsort() is instable so always return a way to differenciate items.
// Your own compare function may want to avoid fallback on implicit sort specs e.g. a Name compare if it wasn't already part of the sort specs.
// Your own compare function may want to avoid fallback on implicit sort specs.
// e.g. a Name compare if it wasn't already part of the sort specs.
return ( a - > ID - b - > ID ) ;
return ( a - > ID - b - > ID ) ;
}
}
} ;
} ;
@ -4107,8 +4126,9 @@ static void ShowDemoWindowTables()
// as TableNextColumn() will automatically wrap around and create new rows as needed.
// as TableNextColumn() will automatically wrap around and create new rows as needed.
// This is generally more convenient when your cells all contains the same type of data.
// This is generally more convenient when your cells all contains the same type of data.
HelpMarker (
HelpMarker (
" Only using TableNextColumn(), which tends to be convenient for tables where every cell contains the same type of contents. \n "
" Only using TableNextColumn(), which tends to be convenient for tables where every cell contains "
" This is also more similar to the old NextColumn() function of the Columns API, and provided to facilitate the Columns->Tables API transition. " ) ;
" the same type of contents. \n This is also more similar to the old NextColumn() function of the "
" Columns API, and provided to facilitate the Columns->Tables API transition. " ) ;
if ( ImGui : : BeginTable ( " table3 " , 3 ) )
if ( ImGui : : BeginTable ( " table3 " , 3 ) )
{
{
for ( int item = 0 ; item < 14 ; item + + )
for ( int item = 0 ; item < 14 ; item + + )
@ -4164,8 +4184,8 @@ static void ShowDemoWindowTables()
if ( ImGui : : BeginTable ( " table1 " , 3 , flags ) )
if ( ImGui : : BeginTable ( " table1 " , 3 , flags ) )
{
{
// Display headers so we can inspect their interaction with borders.
// Display headers so we can inspect their interaction with borders
// (Headers are not the main purpose of this section of the demo, so we are not elaborating on them too much . See other sections for details)
// (Headers are not the main purpose of this section of the demo, so we are not elaborating on them now . See other sections for details)
if ( display_headers )
if ( display_headers )
{
{
ImGui : : TableSetupColumn ( " One " ) ;
ImGui : : TableSetupColumn ( " One " ) ;
@ -4204,7 +4224,9 @@ static void ShowDemoWindowTables()
PushStyleCompact ( ) ;
PushStyleCompact ( ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_Resizable " , & flags , ImGuiTableFlags_Resizable ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_Resizable " , & flags , ImGuiTableFlags_Resizable ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersV " , & flags , ImGuiTableFlags_BordersV ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_BordersV " , & flags , ImGuiTableFlags_BordersV ) ;
ImGui : : SameLine ( ) ; HelpMarker ( " Using the _Resizable flag automatically enables the _BordersInnerV flag as well, this is why the resize borders are still showing when unchecking this. " ) ;
ImGui : : SameLine ( ) ; HelpMarker (
" Using the _Resizable flag automatically enables the _BordersInnerV flag as well, "
" this is why the resize borders are still showing when unchecking this. " ) ;
PopStyleCompact ( ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " table1 " , 3 , flags ) )
if ( ImGui : : BeginTable ( " table1 " , 3 , flags ) )
@ -4345,7 +4367,8 @@ static void ShowDemoWindowTables()
ImGui : : EndTable ( ) ;
ImGui : : EndTable ( ) ;
}
}
// Use outer_size.x == 0.0f instead of default to make the table as tight as possible (only valid when no scrolling and no stretch column)
// Use outer_size.x == 0.0f instead of default to make the table as tight as possible
// (only valid when no scrolling and no stretch column)
if ( ImGui : : BeginTable ( " table2 " , 3 , flags | ImGuiTableFlags_SizingFixedFit , ImVec2 ( 0.0f , 0.0f ) ) )
if ( ImGui : : BeginTable ( " table2 " , 3 , flags | ImGuiTableFlags_SizingFixedFit , ImVec2 ( 0.0f , 0.0f ) ) )
{
{
ImGui : : TableSetupColumn ( " One " ) ;
ImGui : : TableSetupColumn ( " One " ) ;
@ -4378,7 +4401,8 @@ static void ShowDemoWindowTables()
" e.g.: \n "
" e.g.: \n "
" - BorderOuterV \n "
" - BorderOuterV \n "
" - any form of row selection \n "
" - any form of row selection \n "
" Because of this, activating BorderOuterV sets the default to PadOuterX. Using PadOuterX or NoPadOuterX you can override the default. \n \n "
" Because of this, activating BorderOuterV sets the default to PadOuterX. "
" Using PadOuterX or NoPadOuterX you can override the default. \n \n "
" Actual padding values are using style.CellPadding. \n \n "
" Actual padding values are using style.CellPadding. \n \n "
" In this demo we don't show horizontal borders to emphasize how they don't affect default horizontal padding. " ) ;
" In this demo we don't show horizontal borders to emphasize how they don't affect default horizontal padding. " ) ;
@ -4494,7 +4518,8 @@ static void ShowDemoWindowTables()
EditTableSizingFlags ( & sizing_policy_flags [ table_n ] ) ;
EditTableSizingFlags ( & sizing_policy_flags [ table_n ] ) ;
// To make it easier to understand the different sizing policy,
// To make it easier to understand the different sizing policy,
// For each policy: we display one table where the columns have equal contents width, and one where the columns have different contents width.
// For each policy: we display one table where the columns have equal contents width,
// and one where the columns have different contents width.
if ( ImGui : : BeginTable ( " table1 " , 3 , sizing_policy_flags [ table_n ] | flags1 ) )
if ( ImGui : : BeginTable ( " table1 " , 3 , sizing_policy_flags [ table_n ] | flags1 ) )
{
{
for ( int row = 0 ; row < 3 ; row + + )
for ( int row = 0 ; row < 3 ; row + + )
@ -4523,7 +4548,9 @@ static void ShowDemoWindowTables()
ImGui : : Spacing ( ) ;
ImGui : : Spacing ( ) ;
ImGui : : TextUnformatted ( " Advanced " ) ;
ImGui : : TextUnformatted ( " Advanced " ) ;
ImGui : : SameLine ( ) ;
ImGui : : SameLine ( ) ;
HelpMarker ( " This section allows you to interact and see the effect of various sizing policies depending on whether Scroll is enabled and the contents of your columns. " ) ;
HelpMarker (
" This section allows you to interact and see the effect of various sizing policies "
" depending on whether Scroll is enabled and the contents of your columns. " ) ;
enum ContentsType { CT_ShowWidth , CT_ShortText , CT_LongText , CT_Button , CT_FillButton , CT_InputText } ;
enum ContentsType { CT_ShowWidth , CT_ShortText , CT_LongText , CT_Button , CT_FillButton , CT_InputText } ;
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable ;
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable ;
@ -4538,7 +4565,9 @@ static void ShowDemoWindowTables()
if ( contents_type = = CT_FillButton )
if ( contents_type = = CT_FillButton )
{
{
ImGui : : SameLine ( ) ;
ImGui : : SameLine ( ) ;
HelpMarker ( " Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width. " ) ;
HelpMarker (
" Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop "
" where contents width can feed into auto-column width can feed into contents width. " ) ;
}
}
ImGui : : DragInt ( " Columns " , & column_count , 0.1f , 1 , 64 , " %d " , ImGuiSliderFlags_AlwaysClamp ) ;
ImGui : : DragInt ( " Columns " , & column_count , 0.1f , 1 , 64 , " %d " , ImGuiSliderFlags_AlwaysClamp ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_Resizable " , & flags , ImGuiTableFlags_Resizable ) ;
ImGui : : CheckboxFlags ( " ImGuiTableFlags_Resizable " , & flags , ImGuiTableFlags_Resizable ) ;
@ -4584,7 +4613,9 @@ static void ShowDemoWindowTables()
IMGUI_DEMO_MARKER ( " Tables/Vertical scrolling, with clipping " ) ;
IMGUI_DEMO_MARKER ( " Tables/Vertical scrolling, with clipping " ) ;
if ( ImGui : : TreeNode ( " Vertical scrolling, with clipping " ) )
if ( ImGui : : TreeNode ( " Vertical scrolling, with clipping " ) )
{
{
HelpMarker ( " Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents. \n \n We also demonstrate using ImGuiListClipper to virtualize the submission of many items. " ) ;
HelpMarker (
" Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents. \n \n "
" We also demonstrate using ImGuiListClipper to virtualize the submission of many items. " ) ;
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable ;
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable ;
PushStyleCompact ( ) ;
PushStyleCompact ( ) ;
@ -4630,8 +4661,9 @@ static void ShowDemoWindowTables()
HelpMarker (
HelpMarker (
" When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, "
" When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, "
" as automatically stretching columns doesn't make much sense with horizontal scrolling. \n \n "
" as automatically stretching columns doesn't make much sense with horizontal scrolling. \n \n "
" Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX, "
" Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX, "
" because the container window won't automatically extend vertically to fix contents (this may be improved in future versions). " ) ;
" because the container window won't automatically extend vertically to fix contents "
" (this may be improved in future versions). " ) ;
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable ;
static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable ;
static int freeze_cols = 1 ;
static int freeze_cols = 1 ;
static int freeze_rows = 1 ;
static int freeze_rows = 1 ;
@ -4688,7 +4720,8 @@ static void ShowDemoWindowTables()
HelpMarker (
HelpMarker (
" Showcase using Stretch columns + ScrollX together: "
" Showcase using Stretch columns + ScrollX together: "
" this is rather unusual and only makes sense when specifying an 'inner_width' for the table! \n "
" this is rather unusual and only makes sense when specifying an 'inner_width' for the table! \n "
" Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense. " ) ;
" Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns "
" along with ScrollX doesn't make sense. " ) ;
static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody ;
static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody ;
static float inner_width = 1000.0f ;
static float inner_width = 1000.0f ;
PushStyleCompact ( ) ;
PushStyleCompact ( ) ;
@ -4746,8 +4779,9 @@ static void ShowDemoWindowTables()
}
}
// Create the real table we care about for the example!
// Create the real table we care about for the example!
// We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above, otherwise in
// We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above,
// a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible + resizing the parent window down)
// otherwise in a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible
// + resizing the parent window down).
const ImGuiTableFlags flags
const ImGuiTableFlags flags
= ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY
= ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY
| ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV
| ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV
@ -4769,7 +4803,8 @@ static void ShowDemoWindowTables()
float indent_step = ( float ) ( ( int ) TEXT_BASE_WIDTH / 2 ) ;
float indent_step = ( float ) ( ( int ) TEXT_BASE_WIDTH / 2 ) ;
for ( int row = 0 ; row < 8 ; row + + )
for ( int row = 0 ; row < 8 ; row + + )
{
{
ImGui : : Indent ( indent_step ) ; // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags.
// Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags.
ImGui : : Indent ( indent_step ) ;
ImGui : : TableNextRow ( ) ;
ImGui : : TableNextRow ( ) ;
for ( int column = 0 ; column < column_count ; column + + )
for ( int column = 0 ; column < column_count ; column + + )
{
{
@ -4818,7 +4853,9 @@ static void ShowDemoWindowTables()
ImGui : : EndTable ( ) ;
ImGui : : EndTable ( ) ;
}
}
HelpMarker ( " Using TableSetupColumn() to setup explicit width. \n \n Unless _NoKeepColumnsVisible is set, fixed columns with set width may still be shrunk down if there's not enough space in the host. " ) ;
HelpMarker (
" Using TableSetupColumn() to setup explicit width. \n \n Unless _NoKeepColumnsVisible is set, "
" fixed columns with set width may still be shrunk down if there's not enough space in the host. " ) ;
static ImGuiTableFlags flags2 = ImGuiTableFlags_None ;
static ImGuiTableFlags flags2 = ImGuiTableFlags_None ;
PushStyleCompact ( ) ;
PushStyleCompact ( ) ;
@ -4828,7 +4865,8 @@ static void ShowDemoWindowTables()
PopStyleCompact ( ) ;
PopStyleCompact ( ) ;
if ( ImGui : : BeginTable ( " table2 " , 4 , flags2 ) )
if ( ImGui : : BeginTable ( " table2 " , 4 , flags2 ) )
{
{
// We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed.
// We could also set ImGuiTableFlags_SizingFixedFit on the table and then all columns
// will default to ImGuiTableColumnFlags_WidthFixed.
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , 100.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , 100.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 15.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 15.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 30.0f ) ;
ImGui : : TableSetupColumn ( " " , ImGuiTableColumnFlags_WidthFixed , TEXT_BASE_WIDTH * 30.0f ) ;
@ -4900,7 +4938,10 @@ static void ShowDemoWindowTables()
IMGUI_DEMO_MARKER ( " Tables/Row height " ) ;
IMGUI_DEMO_MARKER ( " Tables/Row height " ) ;
if ( ImGui : : TreeNode ( " Row height " ) )
if ( ImGui : : TreeNode ( " Row height " ) )
{
{
HelpMarker ( " You can pass a 'min_row_height' to TableNextRow(). \n \n Rows are padded with 'style.CellPadding.y' on top and bottom, so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'. \n \n We cannot honor a _maximum_ row height as that would require a unique clipping rectangle per row. " ) ;
HelpMarker (
" You can pass a 'min_row_height' to TableNextRow(). \n \n Rows are padded with 'style.CellPadding.y' on top and bottom, "
" so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'. \n \n "
" We cannot honor a _maximum_ row height as that would require a unique clipping rectangle per row. " ) ;
if ( ImGui : : BeginTable ( " table_row_height " , 1 , ImGuiTableFlags_Borders ) )
if ( ImGui : : BeginTable ( " table_row_height " , 1 , ImGuiTableFlags_Borders ) )
{
{
for ( int row = 0 ; row < 8 ; row + + )
for ( int row = 0 ; row < 8 ; row + + )
@ -4913,7 +4954,10 @@ static void ShowDemoWindowTables()
ImGui : : EndTable ( ) ;
ImGui : : EndTable ( ) ;
}
}
HelpMarker ( " Showcase using SameLine(0,0) to share Current Line Height between cells. \n \n Please note that Tables Row Height is not the same thing as Current Line Height, as a table cell may contains multiple lines. " ) ;
HelpMarker (
" Showcase using SameLine(0,0) to share Current Line Height between cells. \n \n "
" Please note that Tables Row Height is not the same thing as Current Line Height, "
" as a table cell may contains multiple lines. " ) ;
if ( ImGui : : BeginTable ( " table_share_lineheight " , 2 , ImGuiTableFlags_Borders ) )
if ( ImGui : : BeginTable ( " table_share_lineheight " , 2 , ImGuiTableFlags_Borders ) )
{
{
ImGui : : TableNextRow ( ) ;
ImGui : : TableNextRow ( ) ;
@ -5163,7 +5207,8 @@ static void ShowDemoWindowTables()
{
{
HelpMarker (
HelpMarker (
" Showcase using PushItemWidth() and how it is preserved on a per-column basis. \n \n "
" Showcase using PushItemWidth() and how it is preserved on a per-column basis. \n \n "
" Note that on auto-resizing non-resizable fixed columns, querying the content width for e.g. right-alignment doesn't make sense. " ) ;
" Note that on auto-resizing non-resizable fixed columns, querying the content width for "
" e.g. right-alignment doesn't make sense. " ) ;
if ( ImGui : : BeginTable ( " table_item_width " , 3 , ImGuiTableFlags_Borders ) )
if ( ImGui : : BeginTable ( " table_item_width " , 3 , ImGuiTableFlags_Borders ) )
{
{
ImGui : : TableSetupColumn ( " small " ) ;
ImGui : : TableSetupColumn ( " small " ) ;
@ -5302,13 +5347,16 @@ static void ShowDemoWindowTables()
ImGui : : TreePop ( ) ;
ImGui : : TreePop ( ) ;
}
}
// Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeadersRow()/TableHeader()
// Demonstrate creating custom context menus inside columns,
// while playing it nice with context menus provided by TableHeadersRow()/TableHeader()
if ( open_action ! = - 1 )
if ( open_action ! = - 1 )
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
ImGui : : SetNextItemOpen ( open_action ! = 0 ) ;
IMGUI_DEMO_MARKER ( " Tables/Context menus " ) ;
IMGUI_DEMO_MARKER ( " Tables/Context menus " ) ;
if ( ImGui : : TreeNode ( " Context menus " ) )
if ( ImGui : : TreeNode ( " Context menus " ) )
{
{
HelpMarker ( " By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu. \n Using ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body. " ) ;
HelpMarker (
" By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu. \n "
" Using ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body. " ) ;
static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody ;
static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody ;
PushStyleCompact ( ) ;
PushStyleCompact ( ) ;
@ -5345,7 +5393,9 @@ static void ShowDemoWindowTables()
// [2.1] Right-click on the TableHeadersRow() line to open the default table context menu.
// [2.1] Right-click on the TableHeadersRow() line to open the default table context menu.
// [2.2] Right-click on the ".." to open a custom popup
// [2.2] Right-click on the ".." to open a custom popup
// [2.3] Right-click in columns to open another custom popup
// [2.3] Right-click in columns to open another custom popup
HelpMarker ( " Demonstrate mixing table context menu (over header), item context button (over button) and custom per-colum context menu (over column body). " ) ;
HelpMarker (
" Demonstrate mixing table context menu (over header), item context button (over button) "
" and custom per-colunm context menu (over column body). " ) ;
ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders ;
ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders ;
if ( ImGui : : BeginTable ( " table_context_menu_2 " , COLUMNS_COUNT , flags2 ) )
if ( ImGui : : BeginTable ( " table_context_menu_2 " , COLUMNS_COUNT , flags2 ) )
{
{
@ -5804,7 +5854,7 @@ static void ShowDemoWindowTables()
// Here we demonstrate marking our data set as needing to be sorted again if we modified a quantity,
// Here we demonstrate marking our data set as needing to be sorted again if we modified a quantity,
// and we are currently sorting on the column showing the Quantity.
// and we are currently sorting on the column showing the Quantity.
// To avoid triggering a sort while holding the button, we only trigger it when the button has been released.
// To avoid triggering a sort while holding the button, we only trigger it when the button has been released.
// You will probably need a more advanced system in your code if you want to automatically sort when a specific entry changes.
// You will probably need some extra logic if you want to automatically sort when a specific entry changes.
if ( ImGui : : TableSetColumnIndex ( 2 ) )
if ( ImGui : : TableSetColumnIndex ( 2 ) )
{
{
if ( ImGui : : SmallButton ( " Chop " ) ) { item - > Quantity + = 1 ; }
if ( ImGui : : SmallButton ( " Chop " ) ) { item - > Quantity + = 1 ; }
@ -6092,8 +6142,10 @@ static void ShowDemoWindowInputs()
for ( int i = 0 ; i < IM_ARRAYSIZE ( io . MouseDown ) ; i + + ) if ( ImGui : : IsMouseDown ( i ) ) { ImGui : : SameLine ( ) ; ImGui : : Text ( " b%d (%.02f secs) " , i , io . MouseDownDuration [ i ] ) ; }
for ( int i = 0 ; i < IM_ARRAYSIZE ( io . MouseDown ) ; i + + ) if ( ImGui : : IsMouseDown ( i ) ) { ImGui : : SameLine ( ) ; ImGui : : Text ( " b%d (%.02f secs) " , i , io . MouseDownDuration [ i ] ) ; }
ImGui : : Text ( " Mouse wheel: %.1f " , io . MouseWheel ) ;
ImGui : : Text ( " Mouse wheel: %.1f " , io . MouseWheel ) ;
// We iterate both legacy native range and named ImGuiKey ranges, which is a little odd but this allows displaying the data for old/new backends.
// We iterate both legacy native range and named ImGuiKey ranges. This is a little unusual/odd but this allows
// User code should never have to go through such hoops! You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END.
// displaying the data for old/new backends.
// User code should never have to go through such hoops!
// You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END.
# ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
# ifdef IMGUI_DISABLE_OBSOLETE_KEYIO
struct funcs { static bool IsLegacyNativeDupe ( ImGuiKey ) { return false ; } } ;
struct funcs { static bool IsLegacyNativeDupe ( ImGuiKey ) { return false ; } } ;
ImGuiKey start_key = ImGuiKey_NamedKey_BEGIN ;
ImGuiKey start_key = ImGuiKey_NamedKey_BEGIN ;
@ -6132,7 +6184,8 @@ static void ShowDemoWindowInputs()
{
{
HelpMarker (
HelpMarker (
" Hovering the colored canvas will override io.WantCaptureXXX fields. \n "
" Hovering the colored canvas will override io.WantCaptureXXX fields. \n "
" Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering and true when clicking. " ) ;
" Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering "
" and true when clicking. " ) ;
static int capture_override_mouse = - 1 ;
static int capture_override_mouse = - 1 ;
static int capture_override_keyboard = - 1 ;
static int capture_override_keyboard = - 1 ;
const char * capture_override_desc [ ] = { " None " , " Set to false " , " Set to true " } ;
const char * capture_override_desc [ ] = { " None " , " Set to false " , " Set to true " } ;