@ -2578,7 +2578,11 @@ static void ShowDemoWindowMisc()
void ImGui : : ShowAboutWindow ( bool * p_open )
{
ImGui : : Begin ( " About Dear ImGui " , p_open , ImGuiWindowFlags_AlwaysAutoResize ) ;
if ( ! ImGui : : Begin ( " About Dear ImGui " , p_open , ImGuiWindowFlags_AlwaysAutoResize ) )
{
ImGui : : End ( ) ;
return ;
}
ImGui : : Text ( " Dear ImGui %s " , ImGui : : GetVersion ( ) ) ;
ImGui : : Separator ( ) ;
ImGui : : Text ( " By Omar Cornut and all dear imgui contributors. " ) ;
@ -2792,188 +2796,198 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
ImGui : : SameLine ( ) ;
ShowHelpMarker ( " Save/Revert in local non-persistent storage. Default Colors definition are not affected. Use \" Export Colors \" below to save them somewhere. " ) ;
if ( ImGui : : TreeNode ( " Rendering " ) )
{
ImGui : : Checkbox ( " Anti-aliased lines " , & style . AntiAliasedLines ) ; ImGui : : SameLine ( ) ; ShowHelpMarker ( " When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well. " ) ;
ImGui : : Checkbox ( " Anti-aliased fill " , & style . AntiAliasedFill ) ;
ImGui : : PushItemWidth ( 100 ) ;
ImGui : : DragFloat ( " Curve Tessellation Tolerance " , & style . CurveTessellationTol , 0.02f , 0.10f , FLT_MAX , " %.2f " , 2.0f ) ;
if ( style . CurveTessellationTol < 0.10f ) style . CurveTessellationTol = 0.10f ;
ImGui : : DragFloat ( " Global Alpha " , & style . Alpha , 0.005f , 0.20f , 1.0f , " %.2f " ) ; // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
ImGui : : PopItemWidth ( ) ;
ImGui : : TreePop ( ) ;
}
ImGui : : Separator ( ) ;
if ( ImGui : : TreeNode( " Settings " ) )
if ( ImGui : : BeginTabBar ( " ##tabs " , ImGuiTabBarFlags_None ) )
{
ImGui : : SliderFloat2 ( " WindowPadding " , ( float * ) & style . WindowPadding , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " PopupRounding " , & style . PopupRounding , 0.0f , 16.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " FramePadding " , ( float * ) & style . FramePadding , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " ItemSpacing " , ( float * ) & style . ItemSpacing , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " ItemInnerSpacing " , ( float * ) & style . ItemInnerSpacing , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " TouchExtraPadding " , ( float * ) & style . TouchExtraPadding , 0.0f , 10.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " IndentSpacing " , & style . IndentSpacing , 0.0f , 30.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ScrollbarSize " , & style . ScrollbarSize , 1.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " GrabMinSize " , & style . GrabMinSize , 1.0f , 20.0f , " %.0f " ) ;
ImGui : : Text ( " BorderSize " ) ;
ImGui : : SliderFloat ( " WindowBorderSize " , & style . WindowBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ChildBorderSize " , & style . ChildBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " PopupBorderSize " , & style . PopupBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " FrameBorderSize " , & style . FrameBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " TabBorderSize " , & style . TabBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : Text ( " Rounding " ) ;
ImGui : : SliderFloat ( " WindowRounding " , & style . WindowRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ChildRounding " , & style . ChildRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " FrameRounding " , & style . FrameRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ScrollbarRounding " , & style . ScrollbarRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " GrabRounding " , & style . GrabRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " TabRounding " , & style . TabRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : Text ( " Alignment " ) ;
ImGui : : SliderFloat2 ( " WindowTitleAlign " , ( float * ) & style . WindowTitleAlign , 0.0f , 1.0f , " %.2f " ) ;
ImGui : : SliderFloat2 ( " ButtonTextAlign " , ( float * ) & style . ButtonTextAlign , 0.0f , 1.0f , " %.2f " ) ; ImGui : : SameLine ( ) ; ShowHelpMarker ( " Alignment applies when a button is larger than its text content. " ) ;
ImGui : : Text ( " Safe Area Padding " ) ; ImGui : : SameLine ( ) ; ShowHelpMarker ( " Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured). " ) ;
ImGui : : SliderFloat2 ( " DisplaySafeAreaPadding " , ( float * ) & style . DisplaySafeAreaPadding , 0.0f , 30.0f , " %.0f " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : BeginTabItem ( " Sizes " ) )
{
ImGui : : Text ( " Main " ) ;
ImGui : : SliderFloat2 ( " WindowPadding " , ( float * ) & style . WindowPadding , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " PopupRounding " , & style . PopupRounding , 0.0f , 16.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " FramePadding " , ( float * ) & style . FramePadding , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " ItemSpacing " , ( float * ) & style . ItemSpacing , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " ItemInnerSpacing " , ( float * ) & style . ItemInnerSpacing , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " TouchExtraPadding " , ( float * ) & style . TouchExtraPadding , 0.0f , 10.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " IndentSpacing " , & style . IndentSpacing , 0.0f , 30.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ScrollbarSize " , & style . ScrollbarSize , 1.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " GrabMinSize " , & style . GrabMinSize , 1.0f , 20.0f , " %.0f " ) ;
ImGui : : Text ( " Borders " ) ;
ImGui : : SliderFloat ( " WindowBorderSize " , & style . WindowBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ChildBorderSize " , & style . ChildBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " PopupBorderSize " , & style . PopupBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " FrameBorderSize " , & style . FrameBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " TabBorderSize " , & style . TabBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : Text ( " Rounding " ) ;
ImGui : : SliderFloat ( " WindowRounding " , & style . WindowRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ChildRounding " , & style . ChildRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " FrameRounding " , & style . FrameRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ScrollbarRounding " , & style . ScrollbarRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " GrabRounding " , & style . GrabRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " TabRounding " , & style . TabRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : Text ( " Alignment " ) ;
ImGui : : SliderFloat2 ( " WindowTitleAlign " , ( float * ) & style . WindowTitleAlign , 0.0f , 1.0f , " %.2f " ) ;
ImGui : : SliderFloat2 ( " ButtonTextAlign " , ( float * ) & style . ButtonTextAlign , 0.0f , 1.0f , " %.2f " ) ; ImGui : : SameLine ( ) ; ShowHelpMarker ( " Alignment applies when a button is larger than its text content. " ) ;
ImGui : : Text ( " Safe Area Padding " ) ; ImGui : : SameLine ( ) ; ShowHelpMarker ( " Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured). " ) ;
ImGui : : SliderFloat2 ( " DisplaySafeAreaPadding " , ( float * ) & style . DisplaySafeAreaPadding , 0.0f , 30.0f , " %.0f " ) ;
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : TreeNode ( " Colors " ) )
{
static int output_dest = 0 ;
static bool output_only_modified = true ;
if ( ImGui : : Button ( " Export Unsaved " ) )
if ( ImGui : : BeginTabItem ( " Colors " ) )
{
if ( output_dest = = 0 )
ImGui : : LogToClipboard ( ) ;
else
ImGui : : LogToTTY ( ) ;
ImGui : : LogText ( " ImVec4* colors = ImGui::GetStyle().Colors; " IM_NEWLINE ) ;
for ( int i = 0 ; i < ImGuiCol_COUNT ; i + + )
static int output_dest = 0 ;
static bool output_only_modified = true ;
if ( ImGui : : Button ( " Export Unsaved " ) )
{
const ImVec4 & col = style . Colors [ i ] ;
const char * name = ImGui : : GetStyleColorName ( i ) ;
if ( ! output_only_modified | | memcmp ( & col , & ref - > Colors [ i ] , sizeof ( ImVec4 ) ) ! = 0 )
ImGui : : LogText ( " colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff); " IM_NEWLINE , name , 23 - ( int ) strlen ( name ) , " " , col . x , col . y , col . z , col . w ) ;
if ( output_dest = = 0 )
ImGui : : LogToClipboard ( ) ;
else
ImGui : : LogToTTY ( ) ;
ImGui : : LogText ( " ImVec4* colors = ImGui::GetStyle().Colors; " IM_NEWLINE ) ;
for ( int i = 0 ; i < ImGuiCol_COUNT ; i + + )
{
const ImVec4 & col = style . Colors [ i ] ;
const char * name = ImGui : : GetStyleColorName ( i ) ;
if ( ! output_only_modified | | memcmp ( & col , & ref - > Colors [ i ] , sizeof ( ImVec4 ) ) ! = 0 )
ImGui : : LogText ( " colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff); " IM_NEWLINE , name , 23 - ( int ) strlen ( name ) , " " , col . x , col . y , col . z , col . w ) ;
}
ImGui : : LogFinish ( ) ;
}
ImGui : : LogFinish ( ) ;
}
ImGui : : SameLine ( ) ; ImGui : : PushItemWidth ( 120 ) ; ImGui : : Combo ( " ##output_type " , & output_dest , " To Clipboard \0 To TTY \0 " ) ; ImGui : : PopItemWidth ( ) ;
ImGui : : SameLine ( ) ; ImGui : : Checkbox ( " Only Modified Colors " , & output_only_modified ) ;
ImGui : : SameLine ( ) ; ImGui : : PushItemWidth ( 120 ) ; ImGui : : Combo ( " ##output_type " , & output_dest , " To Clipboard \0 To TTY \0 " ) ; ImGui : : PopItemWidth ( ) ;
ImGui : : SameLine ( ) ; ImGui : : Checkbox ( " Only Modified Colors " , & output_only_modified ) ;
ImGui : : Text ( " Tip: Left-click on colored square to open color picker, \n Right-click to open edit options menu. " ) ;
static ImGuiTextFilter filter ;
filter . Draw ( " Filter colors " , ImGui : : GetFontSize ( ) * 16 ) ;
static ImGuiTextFilter filter ;
filter . Draw ( " Filter colors " , 200 ) ;
static ImGuiColorEditFlags alpha_flags = 0 ;
ImGui : : RadioButton ( " Opaque " , & alpha_flags , 0 ) ; ImGui : : SameLine ( ) ;
ImGui : : RadioButton ( " Alpha " , & alpha_flags , ImGuiColorEditFlags_AlphaPreview ) ; ImGui : : SameLine ( ) ;
ImGui : : RadioButton ( " Both " , & alpha_flags , ImGuiColorEditFlags_AlphaPreviewHalf ) ;
static ImGuiColorEditFlags alpha_flags = 0 ;
ImGui : : RadioButton ( " Opaque " , & alpha_flags , 0 ) ; ImGui : : SameLine ( ) ;
ImGui : : RadioButton ( " Alpha " , & alpha_flags , ImGuiColorEditFlags_AlphaPreview ) ; ImGui : : SameLine ( ) ;
ImGui : : RadioButton ( " Both " , & alpha_flags , ImGuiColorEditFlags_AlphaPreviewHalf ) ; ImGui : : SameLine ( ) ;
ShowHelpMarker ( " In the color list: \n Left-click on colored square to open color picker, \n Right-click to open edit options menu. " ) ;
ImGui : : BeginChild ( " #colors " , ImVec2 ( 0 , 300 ) , true , ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened ) ;
ImGui : : PushItemWidth ( - 160 ) ;
for ( int i = 0 ; i < ImGuiCol_COUNT ; i + + )
{
const char * name = ImGui : : GetStyleColorName ( i ) ;
if ( ! filter . PassFilter ( name ) )
continue ;
ImGui : : PushID ( i ) ;
ImGui : : ColorEdit4 ( " ##color " , ( float * ) & style . Colors [ i ] , ImGuiColorEditFlags_AlphaBar | alpha_flags ) ;
if ( memcmp ( & style . Colors [ i ] , & ref - > Colors [ i ] , sizeof ( ImVec4 ) ) ! = 0 )
ImGui : : BeginChild ( " ##colors " , ImVec2 ( 0 , 0 ) , true , ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened ) ;
ImGui : : PushItemWidth ( - 160 ) ;
for ( int i = 0 ; i < ImGuiCol_COUNT ; i + + )
{
// Tips: in a real user application, you may want to merge and use an icon font into the main font, so instead of "Save"/"Revert" you'd use icons.
// Read the FAQ and misc/fonts/README.txt about using icon fonts. It's really easy and super convenient!
ImGui : : SameLine ( 0.0f , style . ItemInnerSpacing . x ) ; if ( ImGui : : Button ( " Save " ) ) ref - > Colors [ i ] = style . Colors [ i ] ;
ImGui : : SameLine ( 0.0f , style . ItemInnerSpacing . x ) ; if ( ImGui : : Button ( " Revert " ) ) style . Colors [ i ] = ref - > Colors [ i ] ;
const char * name = ImGui : : GetStyleColorName ( i ) ;
if ( ! filter . PassFilter ( name ) )
continue ;
ImGui : : PushID ( i ) ;
ImGui : : ColorEdit4 ( " ##color " , ( float * ) & style . Colors [ i ] , ImGuiColorEditFlags_AlphaBar | alpha_flags ) ;
if ( memcmp ( & style . Colors [ i ] , & ref - > Colors [ i ] , sizeof ( ImVec4 ) ) ! = 0 )
{
// Tips: in a real user application, you may want to merge and use an icon font into the main font, so instead of "Save"/"Revert" you'd use icons.
// Read the FAQ and misc/fonts/README.txt about using icon fonts. It's really easy and super convenient!
ImGui : : SameLine ( 0.0f , style . ItemInnerSpacing . x ) ; if ( ImGui : : Button ( " Save " ) ) ref - > Colors [ i ] = style . Colors [ i ] ;
ImGui : : SameLine ( 0.0f , style . ItemInnerSpacing . x ) ; if ( ImGui : : Button ( " Revert " ) ) style . Colors [ i ] = ref - > Colors [ i ] ;
}
ImGui : : SameLine ( 0.0f , style . ItemInnerSpacing . x ) ;
ImGui : : TextUnformatted ( name ) ;
ImGui : : PopID ( ) ;
}
ImGui : : SameLine ( 0.0f , style . ItemInnerSpacing . x ) ;
ImGui : : TextUnformatted ( name ) ;
ImGui : : PopID ( ) ;
}
ImGui : : PopItemWidth ( ) ;
ImGui : : EndChild ( ) ;
ImGui : : TreePop ( ) ;
}
ImGui : : PopItemWidth ( ) ;
ImGui : : EndChild ( ) ;
bool fonts_opened = ImGui : : TreeNode ( " Fonts " , " Fonts (%d) " , ImGui : : GetIO ( ) . Fonts - > Fonts . Size ) ;
if ( fonts_opened )
{
ImFontAtlas * atlas = ImGui : : GetIO ( ) . Fonts ;
if ( ImGui : : TreeNode ( " Atlas texture " , " Atlas texture (%dx%d pixels) " , atlas - > TexWidth , atlas - > TexHeight ) )
{
ImGui : : Image ( atlas - > TexID , ImVec2 ( ( float ) atlas - > TexWidth , ( float ) atlas - > TexHeight ) , ImVec2 ( 0 , 0 ) , ImVec2 ( 1 , 1 ) , ImColor ( 255 , 255 , 255 , 255 ) , ImColor ( 255 , 255 , 255 , 128 ) ) ;
ImGui : : TreePop ( ) ;
ImGui : : EndTabItem ( ) ;
}
ImGui : : PushItemWidth ( 100 ) ;
for ( int i = 0 ; i < atlas - > Fonts . Size ; i + + )
if ( ImGui : : BeginTabItem ( " Fonts " ) )
{
ImFont * font = atlas - > Fonts [ i ] ;
ImGui : : PushID ( font ) ;
bool font_details_opened = ImGui : : TreeNode ( font , " Font %d: \' %s \' , %.2f px, %d glyphs " , i , font - > ConfigData ? font - > ConfigData [ 0 ] . Name : " " , font - > FontSize , font - > Glyphs . Size ) ;
ImGui : : SameLine ( ) ; if ( ImGui : : SmallButton ( " Set as default " ) ) ImGui : : GetIO ( ) . FontDefault = font ;
if ( font_details_opened )
ImFontAtlas * atlas = ImGui : : GetIO ( ) . Fonts ;
ShowHelpMarker ( " Read FAQ and misc/fonts/README.txt for details on font loading. " ) ;
ImGui : : PushItemWidth ( 120 ) ;
for ( int i = 0 ; i < atlas - > Fonts . Size ; i + + )
{
ImGui : : PushFont ( font ) ;
ImGui : : Text ( " The quick brown fox jumps over the lazy dog " ) ;
ImGui : : PopFont ( ) ;
ImGui : : DragFloat ( " Font scale " , & font - > Scale , 0.005f , 0.3f , 2.0f , " %.1f " ) ; // Scale only this font
ImGui : : SameLine ( ) ; ShowHelpMarker ( " Note than the default embedded font is NOT meant to be scaled. \n \n Font are currently rendered into bitmaps at a given size at the time of building the atlas. You may oversample them to get some flexibility with scaling. You can also render at multiple sizes and select which one to use at runtime. \n \n (Glimmer of hope: the atlas system should hopefully be rewritten in the future to make scaling more natural and automatic.) " ) ;
ImGui : : InputFloat ( " Font offset " , & font - > DisplayOffset . y , 1 , 1 , " %.0f " ) ;
ImGui : : Text ( " Ascent: %f, Descent: %f, Height: %f " , font - > Ascent , font - > Descent , font - > Ascent - font - > Descent ) ;
ImGui : : Text ( " Fallback character: '%c' (%d) " , font - > FallbackChar , font - > FallbackChar ) ;
ImGui : : Text ( " Texture surface: %d pixels (approx) ~ %dx%d " , font - > MetricsTotalSurface , ( int ) sqrtf ( ( float ) font - > MetricsTotalSurface ) , ( int ) sqrtf ( ( float ) font - > MetricsTotalSurface ) ) ;
for ( int config_i = 0 ; config_i < font - > ConfigDataCount ; config_i + + )
if ( ImFontConfig * cfg = & font - > ConfigData [ config_i ] )
ImGui : : BulletText ( " Input %d: \' %s \' , Oversample: (%d,%d), PixelSnapH: %d " , config_i , cfg - > Name , cfg - > OversampleH , cfg - > OversampleV , cfg - > PixelSnapH ) ;
if ( ImGui : : TreeNode ( " Glyphs " , " Glyphs (%d) " , font - > Glyphs . Size ) )
ImFont * font = atlas - > Fonts [ i ] ;
ImGui : : PushID ( font ) ;
bool font_details_opened = ImGui : : TreeNode ( font , " Font %d: \" %s \" \n %.2f px, %d glyphs, %d file(s) " , i , font - > ConfigData ? font - > ConfigData [ 0 ] . Name : " " , font - > FontSize , font - > Glyphs . Size , font - > ConfigDataCount ) ;
ImGui : : SameLine ( ) ; if ( ImGui : : SmallButton ( " Set as default " ) ) ImGui : : GetIO ( ) . FontDefault = font ;
if ( font_details_opened )
{
// Display all glyphs of the fonts in separate pages of 256 characters
for ( int base = 0 ; base < 0x10000 ; base + = 256 )
ImGui : : PushFont ( font ) ;
ImGui : : Text ( " The quick brown fox jumps over the lazy dog " ) ;
ImGui : : PopFont ( ) ;
ImGui : : DragFloat ( " Font scale " , & font - > Scale , 0.005f , 0.3f , 2.0f , " %.1f " ) ; // Scale only this font
ImGui : : SameLine ( ) ; ShowHelpMarker ( " Note than the default embedded font is NOT meant to be scaled. \n \n Font are currently rendered into bitmaps at a given size at the time of building the atlas. You may oversample them to get some flexibility with scaling. You can also render at multiple sizes and select which one to use at runtime. \n \n (Glimmer of hope: the atlas system should hopefully be rewritten in the future to make scaling more natural and automatic.) " ) ;
ImGui : : InputFloat ( " Font offset " , & font - > DisplayOffset . y , 1 , 1 , " %.0f " ) ;
ImGui : : Text ( " Ascent: %f, Descent: %f, Height: %f " , font - > Ascent , font - > Descent , font - > Ascent - font - > Descent ) ;
ImGui : : Text ( " Fallback character: '%c' (%d) " , font - > FallbackChar , font - > FallbackChar ) ;
ImGui : : Text ( " Texture surface: %d pixels (approx) ~ %dx%d " , font - > MetricsTotalSurface , ( int ) sqrtf ( ( float ) font - > MetricsTotalSurface ) , ( int ) sqrtf ( ( float ) font - > MetricsTotalSurface ) ) ;
for ( int config_i = 0 ; config_i < font - > ConfigDataCount ; config_i + + )
if ( ImFontConfig * cfg = & font - > ConfigData [ config_i ] )
ImGui : : BulletText ( " Input %d: \' %s \' , Oversample: (%d,%d), PixelSnapH: %d " , config_i , cfg - > Name , cfg - > OversampleH , cfg - > OversampleV , cfg - > PixelSnapH ) ;
if ( ImGui : : TreeNode ( " Glyphs " , " Glyphs (%d) " , font - > Glyphs . Size ) )
{
int count = 0 ;
for ( int n = 0 ; n < 256 ; n + + )
count + = font - > FindGlyphNoFallback ( ( ImWchar ) ( base + n ) ) ? 1 : 0 ;
if ( count > 0 & & ImGui : : TreeNode ( ( void * ) ( intptr_t ) base , " U+%04X..U+%04X (%d %s) " , base , base + 255 , count , count > 1 ? " glyphs " : " glyph " ) )
// Display all glyphs of the fonts in separate pages of 256 characters
for ( int base = 0 ; base < 0x10000 ; base + = 256 )
{
float cell_size = font - > FontSize * 1 ;
float cell_spacing = style . ItemSpacing . y ;
ImVec2 base_pos = ImGui : : GetCursorScreenPos ( ) ;
ImDrawList * draw_list = ImGui : : GetWindowDrawList ( ) ;
int count = 0 ;
for ( int n = 0 ; n < 256 ; n + + )
count + = font - > FindGlyphNoFallback ( ( ImWchar ) ( base + n ) ) ? 1 : 0 ;
if ( count > 0 & & ImGui : : TreeNode ( ( void * ) ( intptr_t ) base , " U+%04X..U+%04X (%d %s) " , base , base + 255 , count , count > 1 ? " glyphs " : " glyph " ) )
{
ImVec2 cell_p1 ( base_pos . x + ( n % 16 ) * ( cell_size + cell_spacing ) , base_pos . y + ( n / 16 ) * ( cell_size + cell_spacing ) ) ;
ImVec2 cell_p2 ( cell_p1 . x + cell_size , cell_p1 . y + cell_size ) ;
const ImFontGlyph * glyph = font - > FindGlyphNoFallback ( ( ImWchar ) ( base + n ) ) ;
draw_list - > AddRect ( cell_p1 , cell_p2 , glyph ? IM_COL32 ( 255 , 255 , 255 , 100 ) : IM_COL32 ( 255 , 255 , 255 , 50 ) ) ;
if ( glyph )
font - > RenderChar ( draw_list , cell_size , cell_p1 , ImGui : : GetColorU32 ( ImGuiCol_Text ) , ( ImWchar ) ( base + n ) ) ; // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions available to generate a string.
if ( glyph & & ImGui : : IsMouseHoveringRect ( cell_p1 , cell_p2 ) )
float cell_size = font - > FontSize * 1 ;
float cell_spacing = style . ItemSpacing . y ;
ImVec2 base_pos = ImGui : : GetCursorScreenPos ( ) ;
ImDrawList * draw_list = ImGui : : GetWindowDrawList ( ) ;
for ( int n = 0 ; n < 256 ; n + + )
{
ImGui : : BeginTooltip ( ) ;
ImGui : : Text ( " Codepoint: U+%04X " , base + n ) ;
ImGui : : Separator ( ) ;
ImGui : : Text ( " AdvanceX: %.1f " , glyph - > AdvanceX ) ;
ImGui : : Text ( " Pos: (%.2f,%.2f)->(%.2f,%.2f) " , glyph - > X0 , glyph - > Y0 , glyph - > X1 , glyph - > Y1 ) ;
ImGui : : Text ( " UV: (%.3f,%.3f)->(%.3f,%.3f) " , glyph - > U0 , glyph - > V0 , glyph - > U1 , glyph - > V1 ) ;
ImGui : : EndTooltip ( ) ;
ImVec2 cell_p1 ( base_pos . x + ( n % 16 ) * ( cell_size + cell_spacing ) , base_pos . y + ( n / 16 ) * ( cell_size + cell_spacing ) ) ;
ImVec2 cell_p2 ( cell_p1 . x + cell_size , cell_p1 . y + cell_size ) ;
const ImFontGlyph * glyph = font - > FindGlyphNoFallback ( ( ImWchar ) ( base + n ) ) ;
draw_list - > AddRect ( cell_p1 , cell_p2 , glyph ? IM_COL32 ( 255 , 255 , 255 , 100 ) : IM_COL32 ( 255 , 255 , 255 , 50 ) ) ;
if ( glyph )
font - > RenderChar ( draw_list , cell_size , cell_p1 , ImGui : : GetColorU32 ( ImGuiCol_Text ) , ( ImWchar ) ( base + n ) ) ; // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions available to generate a string.
if ( glyph & & ImGui : : IsMouseHoveringRect ( cell_p1 , cell_p2 ) )
{
ImGui : : BeginTooltip ( ) ;
ImGui : : Text ( " Codepoint: U+%04X " , base + n ) ;
ImGui : : Separator ( ) ;
ImGui : : Text ( " AdvanceX: %.1f " , glyph - > AdvanceX ) ;
ImGui : : Text ( " Pos: (%.2f,%.2f)->(%.2f,%.2f) " , glyph - > X0 , glyph - > Y0 , glyph - > X1 , glyph - > Y1 ) ;
ImGui : : Text ( " UV: (%.3f,%.3f)->(%.3f,%.3f) " , glyph - > U0 , glyph - > V0 , glyph - > U1 , glyph - > V1 ) ;
ImGui : : EndTooltip ( ) ;
}
}
ImGui : : Dummy ( ImVec2 ( ( cell_size + cell_spacing ) * 16 , ( cell_size + cell_spacing ) * 16 ) ) ;
ImGui : : TreePop ( ) ;
}
ImGui : : Dummy ( ImVec2 ( ( cell_size + cell_spacing ) * 16 , ( cell_size + cell_spacing ) * 16 ) ) ;
ImGui : : TreePop ( ) ;
}
ImGui : : TreePop ( ) ;
}
ImGui : : TreePop ( ) ;
}
ImGui : : PopID ( ) ;
}
if ( ImGui : : TreeNode ( " Atlas texture " , " Atlas texture (%dx%d pixels) " , atlas - > TexWidth , atlas - > TexHeight ) )
{
ImGui : : Image ( atlas - > TexID , ImVec2 ( ( float ) atlas - > TexWidth , ( float ) atlas - > TexHeight ) , ImVec2 ( 0 , 0 ) , ImVec2 ( 1 , 1 ) , ImColor ( 255 , 255 , 255 , 255 ) , ImColor ( 255 , 255 , 255 , 128 ) ) ;
ImGui : : TreePop ( ) ;
}
ImGui : : PopID ( ) ;
static float window_scale = 1.0f ;
if ( ImGui : : DragFloat ( " this window scale " , & window_scale , 0.005f , 0.3f , 2.0f , " %.1f " ) ) // scale only this window
ImGui : : SetWindowFontScale ( window_scale ) ;
ImGui : : DragFloat ( " global scale " , & ImGui : : GetIO ( ) . FontGlobalScale , 0.005f , 0.3f , 2.0f , " %.1f " ) ; // scale everything
ImGui : : PopItemWidth ( ) ;
ImGui : : EndTabItem ( ) ;
}
static float window_scale = 1.0f ;
ImGui : : DragFloat ( " this window scale " , & window_scale , 0.005f , 0.3f , 2.0f , " %.1f " ) ; // scale only this window
ImGui : : DragFloat ( " global scale " , & ImGui : : GetIO ( ) . FontGlobalScale , 0.005f , 0.3f , 2.0f , " %.1f " ) ; // scale everything
ImGui : : PopItemWidth ( ) ;
ImGui : : SetWindowFontScale ( window_scale ) ;
ImGui : : TreePop ( ) ;
if ( ImGui : : BeginTabItem ( " Rendering " ) )
{
ImGui : : Checkbox ( " Anti-aliased lines " , & style . AntiAliasedLines ) ; ImGui : : SameLine ( ) ; ShowHelpMarker ( " When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well. " ) ;
ImGui : : Checkbox ( " Anti-aliased fill " , & style . AntiAliasedFill ) ;
ImGui : : PushItemWidth ( 100 ) ;
ImGui : : DragFloat ( " Curve Tessellation Tolerance " , & style . CurveTessellationTol , 0.02f , 0.10f , FLT_MAX , " %.2f " , 2.0f ) ;
if ( style . CurveTessellationTol < 0.10f ) style . CurveTessellationTol = 0.10f ;
ImGui : : DragFloat ( " Global Alpha " , & style . Alpha , 0.005f , 0.20f , 1.0f , " %.2f " ) ; // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
ImGui : : PopItemWidth ( ) ;
ImGui : : EndTabItem ( ) ;
}
ImGui : : EndTabBar ( ) ;
}
ImGui : : PopItemWidth ( ) ;
@ -3513,7 +3527,20 @@ static void ShowExampleAppLayout(bool* p_open)
ImGui : : BeginChild ( " item view " , ImVec2 ( 0 , - ImGui : : GetFrameHeightWithSpacing ( ) ) ) ; // Leave room for 1 line below us
ImGui : : Text ( " MyObject: %d " , selected ) ;
ImGui : : Separator ( ) ;
ImGui : : TextWrapped ( " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " ) ;
if ( ImGui : : BeginTabBar ( " ##Tabs " , ImGuiTabBarFlags_None ) )
{
if ( ImGui : : BeginTabItem ( " Description " ) )
{
ImGui : : TextWrapped ( " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " ) ;
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : BeginTabItem ( " Details " ) )
{
ImGui : : Text ( " ID: 0123456789 " ) ;
ImGui : : EndTabItem ( ) ;
}
ImGui : : EndTabBar ( ) ;
}
ImGui : : EndChild ( ) ;
if ( ImGui : : Button ( " Revert " ) ) { }
ImGui : : SameLine ( ) ;
@ -4090,7 +4117,11 @@ void ShowExampleAppDocuments(bool* p_open)
{
static ExampleAppDocuments app ;
ImGui : : Begin ( " Examples: Documents " , p_open , ImGuiWindowFlags_MenuBar ) ;
if ( ! ImGui : : Begin ( " Examples: Documents " , p_open , ImGuiWindowFlags_MenuBar ) )
{
ImGui : : End ( ) ;
return ;
}
// Options
enum Target