@ -2578,7 +2578,11 @@ static void ShowDemoWindowMisc()
void ImGui : : ShowAboutWindow ( bool * p_open )
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 : : Text ( " Dear ImGui %s " , ImGui : : GetVersion ( ) ) ;
ImGui : : Separator ( ) ;
ImGui : : Separator ( ) ;
ImGui : : Text ( " By Omar Cornut and all dear imgui contributors. " ) ;
ImGui : : Text ( " By Omar Cornut and all dear imgui contributors. " ) ;
@ -2792,188 +2796,198 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
ImGui : : SameLine ( ) ;
ImGui : : SameLine ( ) ;
ShowHelpMarker ( " Save/Revert in local non-persistent storage. Default Colors definition are not affected. Use \" Export Colors \" below to save them somewhere. " ) ;
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 : : Separator ( ) ;
{
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 ( ) ;
}
if ( ImGui : : TreeNode( " Settings " ) )
if ( ImGui : : BeginTabBar ( " ##tabs " , ImGuiTabBarFlags_None ) )
{
{
ImGui : : SliderFloat2 ( " WindowPadding " , ( float * ) & style . WindowPadding , 0.0f , 20.0f , " %.0f " ) ;
if ( ImGui : : BeginTabItem ( " Sizes " ) )
ImGui : : SliderFloat ( " PopupRounding " , & style . PopupRounding , 0.0f , 16.0f , " %.0f " ) ;
{
ImGui : : SliderFloat2 ( " FramePadding " , ( float * ) & style . FramePadding , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : Text ( " Main " ) ;
ImGui : : SliderFloat2 ( " ItemSpacing " , ( float * ) & style . ItemSpacing , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " WindowPadding " , ( float * ) & style . WindowPadding , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " ItemInnerSpacing " , ( float * ) & style . ItemInnerSpacing , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " PopupRounding " , & style . PopupRounding , 0.0f , 16.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " TouchExtraPadding " , ( float * ) & style . TouchExtraPadding , 0.0f , 10.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " FramePadding " , ( float * ) & style . FramePadding , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " IndentSpacing " , & style . IndentSpacing , 0.0f , 30.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " ItemSpacing " , ( float * ) & style . ItemSpacing , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ScrollbarSize " , & style . ScrollbarSize , 1.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " ItemInnerSpacing " , ( float * ) & style . ItemInnerSpacing , 0.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " GrabMinSize " , & style . GrabMinSize , 1.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " TouchExtraPadding " , ( float * ) & style . TouchExtraPadding , 0.0f , 10.0f , " %.0f " ) ;
ImGui : : Text ( " BorderSize " ) ;
ImGui : : SliderFloat ( " IndentSpacing " , & style . IndentSpacing , 0.0f , 30.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " WindowBorderSize " , & style . WindowBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ScrollbarSize " , & style . ScrollbarSize , 1.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ChildBorderSize " , & style . ChildBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " GrabMinSize " , & style . GrabMinSize , 1.0f , 20.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " PopupBorderSize " , & style . PopupBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : Text ( " Borders " ) ;
ImGui : : SliderFloat ( " FrameBorderSize " , & style . FrameBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " WindowBorderSize " , & style . WindowBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " TabBorderSize " , & style . TabBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ChildBorderSize " , & style . ChildBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : Text ( " Rounding " ) ;
ImGui : : SliderFloat ( " PopupBorderSize " , & style . PopupBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " WindowRounding " , & style . WindowRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " FrameBorderSize " , & style . FrameBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ChildRounding " , & style . ChildRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " TabBorderSize " , & style . TabBorderSize , 0.0f , 1.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " FrameRounding " , & style . FrameRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : Text ( " Rounding " ) ;
ImGui : : SliderFloat ( " ScrollbarRounding " , & style . ScrollbarRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " WindowRounding " , & style . WindowRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " GrabRounding " , & style . GrabRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " ChildRounding " , & style . ChildRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " TabRounding " , & style . TabRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat ( " FrameRounding " , & style . FrameRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : Text ( " Alignment " ) ;
ImGui : : SliderFloat ( " ScrollbarRounding " , & style . ScrollbarRounding , 0.0f , 12.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " WindowTitleAlign " , ( float * ) & style . WindowTitleAlign , 0.0f , 1.0f , " %.2f " ) ;
ImGui : : SliderFloat ( " GrabRounding " , & style . GrabRounding , 0.0f , 12.0f , " %.0f " ) ;
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 : : SliderFloat ( " TabRounding " , & style . TabRounding , 0.0f , 12.0f , " %.0f " ) ;
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 : : Text ( " Alignment " ) ;
ImGui : : SliderFloat2 ( " DisplaySafeAreaPadding " , ( float * ) & style . DisplaySafeAreaPadding , 0.0f , 30.0f , " %.0f " ) ;
ImGui : : SliderFloat2 ( " WindowTitleAlign " , ( float * ) & style . WindowTitleAlign , 0.0f , 1.0f , " %.2f " ) ;
ImGui : : TreePop ( ) ;
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 " ) )
if ( ImGui : : BeginTabItem ( " Colors " ) )
{
static int output_dest = 0 ;
static bool output_only_modified = true ;
if ( ImGui : : Button ( " Export Unsaved " ) )
{
{
if ( output_dest = = 0 )
static int output_dest = 0 ;
ImGui : : LogToClipboard ( ) ;
static bool output_only_modified = true ;
else
if ( ImGui : : Button ( " Export Unsaved " ) )
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 ] ;
if ( output_dest = = 0 )
const char * name = ImGui : : GetStyleColorName ( i ) ;
ImGui : : LogToClipboard ( ) ;
if ( ! output_only_modified | | memcmp ( & col , & ref - > Colors [ i ] , sizeof ( ImVec4 ) ) ! = 0 )
else
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 : : 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 ;
static ImGuiColorEditFlags alpha_flags = 0 ;
filter . Draw ( " Filter colors " , 200 ) ;
ImGui : : RadioButton ( " Opaque " , & alpha_flags , 0 ) ; ImGui : : SameLine ( ) ;
ImGui : : RadioButton ( " Alpha " , & alpha_flags , ImGuiColorEditFlags_AlphaPreview ) ; ImGui : : SameLine ( ) ;
static ImGuiColorEditFlags alpha_flags = 0 ;
ImGui : : RadioButton ( " Both " , & alpha_flags , ImGuiColorEditFlags_AlphaPreviewHalf ) ; ImGui : : SameLine ( ) ;
ImGui : : RadioButton ( " Opaque " , & alpha_flags , 0 ) ; 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 : : RadioButton ( " Alpha " , & alpha_flags , ImGuiColorEditFlags_AlphaPreview ) ; ImGui : : SameLine ( ) ;
ImGui : : RadioButton ( " Both " , & alpha_flags , ImGuiColorEditFlags_AlphaPreviewHalf ) ;
ImGui : : BeginChild ( " #colors " , ImVec2 ( 0 , 300 ) , true , ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened ) ;
ImGui : : BeginChild ( " ##colors " , ImVec2 ( 0 , 0 ) , true , ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened ) ;
ImGui : : PushItemWidth ( - 160 ) ;
ImGui : : PushItemWidth ( - 160 ) ;
for ( int i = 0 ; i < ImGuiCol_COUNT ; i + + )
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 )
{
{
// 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.
const char * name = ImGui : : GetStyleColorName ( i ) ;
// Read the FAQ and misc/fonts/README.txt about using icon fonts. It's really easy and super convenient!
if ( ! filter . PassFilter ( name ) )
ImGui : : SameLine ( 0.0f , style . ItemInnerSpacing . x ) ; if ( ImGui : : Button ( " Save " ) ) ref - > Colors [ i ] = style . Colors [ i ] ;
continue ;
ImGui : : SameLine ( 0.0f , style . ItemInnerSpacing . x ) ; if ( ImGui : : Button ( " Revert " ) ) style . Colors [ i ] = ref - > Colors [ i ] ;
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 : : PopItemWidth ( ) ;
ImGui : : TextUnformatted ( name ) ;
ImGui : : EndChild ( ) ;
ImGui : : PopID ( ) ;
}
ImGui : : PopItemWidth ( ) ;
ImGui : : EndChild ( ) ;
ImGui : : TreePop ( ) ;
}
bool fonts_opened = ImGui : : TreeNode ( " Fonts " , " Fonts (%d) " , ImGui : : GetIO ( ) . Fonts - > Fonts . Size ) ;
ImGui : : EndTabItem ( ) ;
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 : : PushItemWidth ( 100 ) ;
for ( int i = 0 ; i < atlas - > Fonts . Size ; i + + )
if ( ImGui : : BeginTabItem ( " Fonts " ) )
{
{
ImFont * font = atlas - > Fonts [ i ] ;
ImFontAtlas * atlas = ImGui : : GetIO ( ) . Fonts ;
ImGui : : PushID ( font ) ;
ShowHelpMarker ( " Read FAQ and misc/fonts/README.txt for details on font loading. " ) ;
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 : : PushItemWidth ( 120 ) ;
ImGui : : SameLine ( ) ; if ( ImGui : : SmallButton ( " Set as default " ) ) ImGui : : GetIO ( ) . FontDefault = font ;
for ( int i = 0 ; i < atlas - > Fonts . Size ; i + + )
if ( font_details_opened )
{
{
ImGui : : PushFont ( font ) ;
ImFont * font = atlas - > Fonts [ i ] ;
ImGui : : Text ( " The quick brown fox jumps over the lazy dog " ) ;
ImGui : : PushID ( font ) ;
ImGui : : PopFont ( ) ;
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 : : DragFloat ( " Font scale " , & font - > Scale , 0.005f , 0.3f , 2.0f , " %.1f " ) ; // Scale only this font
ImGui : : SameLine ( ) ; if ( ImGui : : SmallButton ( " Set as default " ) ) ImGui : : GetIO ( ) . FontDefault = 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.) " ) ;
if ( font_details_opened )
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 ) )
{
{
// Display all glyphs of the fonts in separate pages of 256 characters
ImGui : : PushFont ( font ) ;
for ( int base = 0 ; base < 0x10000 ; base + = 256 )
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 ;
// Display all glyphs of the fonts in separate pages of 256 characters
for ( int n = 0 ; n < 256 ; n + + )
for ( int base = 0 ; base < 0x10000 ; base + = 256 )
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 " ) )
{
{
float cell_size = font - > FontSize * 1 ;
int count = 0 ;
float cell_spacing = style . ItemSpacing . y ;
ImVec2 base_pos = ImGui : : GetCursorScreenPos ( ) ;
ImDrawList * draw_list = ImGui : : GetWindowDrawList ( ) ;
for ( int n = 0 ; n < 256 ; n + + )
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 ) ) ;
float cell_size = font - > FontSize * 1 ;
ImVec2 cell_p2 ( cell_p1 . x + cell_size , cell_p1 . y + cell_size ) ;
float cell_spacing = style . ItemSpacing . y ;
const ImFontGlyph * glyph = font - > FindGlyphNoFallback ( ( ImWchar ) ( base + n ) ) ;
ImVec2 base_pos = ImGui : : GetCursorScreenPos ( ) ;
draw_list - > AddRect ( cell_p1 , cell_p2 , glyph ? IM_COL32 ( 255 , 255 , 255 , 100 ) : IM_COL32 ( 255 , 255 , 255 , 50 ) ) ;
ImDrawList * draw_list = ImGui : : GetWindowDrawList ( ) ;
if ( glyph )
for ( int n = 0 ; n < 256 ; n + + )
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 ( ) ;
ImVec2 cell_p1 ( base_pos . x + ( n % 16 ) * ( cell_size + cell_spacing ) , base_pos . y + ( n / 16 ) * ( cell_size + cell_spacing ) ) ;
ImGui : : Text ( " Codepoint: U+%04X " , base + n ) ;
ImVec2 cell_p2 ( cell_p1 . x + cell_size , cell_p1 . y + cell_size ) ;
ImGui : : Separator ( ) ;
const ImFontGlyph * glyph = font - > FindGlyphNoFallback ( ( ImWchar ) ( base + n ) ) ;
ImGui : : Text ( " AdvanceX: %.1f " , glyph - > AdvanceX ) ;
draw_list - > AddRect ( cell_p1 , cell_p2 , glyph ? IM_COL32 ( 255 , 255 , 255 , 100 ) : IM_COL32 ( 255 , 255 , 255 , 50 ) ) ;
ImGui : : Text ( " Pos: (%.2f,%.2f)->(%.2f,%.2f) " , glyph - > X0 , glyph - > Y0 , glyph - > X1 , glyph - > Y1 ) ;
if ( glyph )
ImGui : : Text ( " UV: (%.3f,%.3f)->(%.3f,%.3f) " , glyph - > U0 , glyph - > V0 , glyph - > U1 , glyph - > V1 ) ;
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.
ImGui : : EndTooltip ( ) ;
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 : : 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 : : 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
if ( ImGui : : BeginTabItem ( " Rendering " ) )
ImGui : : DragFloat ( " global scale " , & ImGui : : GetIO ( ) . FontGlobalScale , 0.005f , 0.3f , 2.0f , " %.1f " ) ; // scale everything
{
ImGui : : PopItemWidth ( ) ;
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 : : SetWindowFontScale ( window_scale ) ;
ImGui : : Checkbox ( " Anti-aliased fill " , & style . AntiAliasedFill ) ;
ImGui : : TreePop ( ) ;
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 ( ) ;
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 : : BeginChild ( " item view " , ImVec2 ( 0 , - ImGui : : GetFrameHeightWithSpacing ( ) ) ) ; // Leave room for 1 line below us
ImGui : : Text ( " MyObject: %d " , selected ) ;
ImGui : : Text ( " MyObject: %d " , selected ) ;
ImGui : : Separator ( ) ;
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 ( ) ;
ImGui : : EndChild ( ) ;
if ( ImGui : : Button ( " Revert " ) ) { }
if ( ImGui : : Button ( " Revert " ) ) { }
ImGui : : SameLine ( ) ;
ImGui : : SameLine ( ) ;
@ -4090,7 +4117,11 @@ void ShowExampleAppDocuments(bool* p_open)
{
{
static ExampleAppDocuments app ;
static ExampleAppDocuments app ;
ImGui : : Begin ( " Examples: Documents " , p_open , ImGuiWindowFlags_MenuBar ) ;
if ( ! ImGui : : Begin ( " Examples: Documents " , p_open , ImGuiWindowFlags_MenuBar ) )
{
ImGui : : End ( ) ;
return ;
}
// Options
// Options
enum Target
enum Target