@ -126,6 +126,7 @@ static void ShowExampleAppCustomRendering(bool* p_open);
static void ShowExampleMenuFile ( ) ;
// Helper to display a little (?) mark which shows a tooltip when hovered.
// In your own code you may want to display an actual icon if you are using a merged icon fonts (see misc/fonts/README.txt)
static void HelpMarker ( const char * desc )
{
ImGui : : TextDisabled ( " (?) " ) ;
@ -142,12 +143,13 @@ static void HelpMarker(const char* desc)
// Helper to display basic user controls.
void ImGui : : ShowUserGuide ( )
{
ImGuiIO & io = ImGui : : GetIO ( ) ;
ImGui : : BulletText ( " Double-click on title bar to collapse window. " ) ;
ImGui : : BulletText ( " Click and drag on lower right corner to resize window \n (double-click to auto fit window to its contents). " ) ;
ImGui : : BulletText ( " Click and drag on any empty space to move window. " ) ;
ImGui : : BulletText ( " TAB/SHIFT+TAB to cycle through keyboard editable fields. " ) ;
ImGui : : BulletText ( " CTRL+Click on a slider or drag box to input value as text. " ) ;
if ( ImGui: : GetIO ( ) . FontAllowUserScaling )
if ( io . FontAllowUserScaling )
ImGui : : BulletText ( " CTRL+Mouse Wheel to zoom window contents. " ) ;
ImGui : : BulletText ( " Mouse Wheel to scroll. " ) ;
ImGui : : BulletText ( " While editing text: \n " ) ;
@ -191,7 +193,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
static bool show_app_window_titles = false ;
static bool show_app_custom_rendering = false ;
if ( show_app_documents ) ShowExampleAppDocuments ( & show_app_documents ) ; // Process the Document app next, as it may also use a DockSpace()
if ( show_app_documents ) ShowExampleAppDocuments ( & show_app_documents ) ;
if ( show_app_main_menu_bar ) ShowExampleAppMainMenuBar ( ) ;
if ( show_app_console ) ShowExampleAppConsole ( & show_app_console ) ;
if ( show_app_log ) ShowExampleAppLog ( & show_app_log ) ;
@ -254,7 +256,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
//ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.65f); // Use 2/3 of the space for widgets and 1/3 for labels (default)
ImGui : : PushItemWidth ( ImGui : : GetFontSize ( ) * - 12 ) ; // Use fixed width for labels (by passing a negative value), the rest goes to widgets. We choose a width proportional to our font size.
// Menu
// Menu Bar
if ( ImGui : : BeginMenuBar ( ) )
{
if ( ImGui : : BeginMenu ( " Menu " ) )
@ -341,7 +343,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
if ( ImGui : : TreeNode ( " Backend Flags " ) )
{
HelpMarker ( " Those flags are set by the back-ends (imgui_impl_xxx files) to specify their capabilities. " ) ;
ImGuiBackendFlags backend_flags = io . BackendFlags ; // Make a local copy to avoid modifying the back-end flags.
ImGuiBackendFlags backend_flags = io . BackendFlags ; // Make a local copy to avoid modifying actual back-end flags.
ImGui : : CheckboxFlags ( " io.BackendFlags: HasGamepad " , ( unsigned int * ) & backend_flags , ImGuiBackendFlags_HasGamepad ) ;
ImGui : : CheckboxFlags ( " io.BackendFlags: HasMouseCursors " , ( unsigned int * ) & backend_flags , ImGuiBackendFlags_HasMouseCursors ) ;
ImGui : : CheckboxFlags ( " io.BackendFlags: HasSetMousePos " , ( unsigned int * ) & backend_flags , ImGuiBackendFlags_HasSetMousePos ) ;
@ -576,7 +578,7 @@ static void ShowDemoWindowWidgets()
if ( ImGui : : TreeNode ( " Advanced, with Selectable nodes " ) )
{
HelpMarker ( " This is a more standard looking tree with selectable nodes.\n Click to select, CTRL+Click to toggle, click on arrows or double-click to open. " ) ;
HelpMarker ( " This is a more typical looking tree with selectable nodes.\n Click to select, CTRL+Click to toggle, click on arrows or double-click to open. " ) ;
static bool align_label_with_current_x_position = false ;
ImGui : : Checkbox ( " Align label with current X position) " , & align_label_with_current_x_position ) ;
ImGui : : Text ( " Hello! " ) ;
@ -589,10 +591,12 @@ static void ShowDemoWindowWidgets()
for ( int i = 0 ; i < 6 ; i + + )
{
// Disable the default open on single-click behavior and pass in Selected flag according to our selection state.
ImGuiTreeNodeFlags node_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ( ( selection_mask & ( 1 < < i ) ) ? ImGuiTreeNodeFlags_Selected : 0 ) ;
ImGuiTreeNodeFlags node_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick ;
if ( selection_mask & ( 1 < < i ) )
node_flags | = ImGuiTreeNodeFlags_Selected ;
if ( i < 3 )
{
// Node
// Items 0..2 are Tree Node
bool node_open = ImGui : : TreeNodeEx ( ( void * ) ( intptr_t ) i , node_flags , " Selectable Node %d " , i ) ;
if ( ImGui : : IsItemClicked ( ) )
node_clicked = i ;
@ -604,7 +608,9 @@ static void ShowDemoWindowWidgets()
}
else
{
// Leaf: The only reason we have a TreeNode at all is to allow selection of the leaf. Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text().
// Items 3..5 are Tree Leaves
// The only reason we use TreeNode at all is to allow selection of the leaf.
// Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text().
node_flags | = ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen ; // ImGuiTreeNodeFlags_Bullet
ImGui : : TreeNodeEx ( ( void * ) ( intptr_t ) i , node_flags , " Selectable Leaf %d " , i ) ;
if ( ImGui : : IsItemClicked ( ) )
@ -630,7 +636,7 @@ static void ShowDemoWindowWidgets()
if ( ImGui : : TreeNode ( " Collapsing Headers " ) )
{
static bool closable_group = true ;
ImGui : : Checkbox ( " Enable extra group " , & closable_group ) ;
ImGui : : Checkbox ( " Show 2nd header " , & closable_group ) ;
if ( ImGui : : CollapsingHeader ( " Header " ) )
{
ImGui : : Text ( " IsItemHovered: %d " , ImGui : : IsItemHovered ( ) ) ;
@ -734,7 +740,7 @@ static void ShowDemoWindowWidgets()
ImGui : : Text ( " %.0fx%.0f " , my_tex_w , my_tex_h ) ;
ImVec2 pos = ImGui : : GetCursorScreenPos ( ) ;
ImGui : : Image ( my_tex_id , ImVec2 ( my_tex_w , my_tex_h ) , ImVec2 ( 0 , 0 ) , ImVec2 ( 1 , 1 ) , Im Color( 255 , 255 , 255 , 255 ) , ImColor ( 255 , 255 , 255 , 128 ) ) ;
ImGui : : Image ( my_tex_id , ImVec2 ( my_tex_w , my_tex_h ) , ImVec2 ( 0 , 0 ) , ImVec2 ( 1 , 1 ) , Im Vec4( 1.0f , 1.0f , 1.0f , 1.0f ) , ImVec4 ( 1.0f , 1.0f , 1.0f , 0.5f ) ) ;
if ( ImGui : : IsItemHovered ( ) )
{
ImGui : : BeginTooltip ( ) ;
@ -746,7 +752,7 @@ static void ShowDemoWindowWidgets()
ImGui : : Text ( " Max: (%.2f, %.2f) " , region_x + region_sz , region_y + region_sz ) ;
ImVec2 uv0 = ImVec2 ( ( region_x ) / my_tex_w , ( region_y ) / my_tex_h ) ;
ImVec2 uv1 = ImVec2 ( ( region_x + region_sz ) / my_tex_w , ( region_y + region_sz ) / my_tex_h ) ;
ImGui : : Image ( my_tex_id , ImVec2 ( region_sz * zoom , region_sz * zoom ) , uv0 , uv1 , Im Color( 255 , 255 , 255 , 255 ) , ImColor ( 255 , 255 , 255 , 128 ) ) ;
ImGui : : Image ( my_tex_id , ImVec2 ( region_sz * zoom , region_sz * zoom ) , uv0 , uv1 , Im Vec4( 1.0f , 1.0f , 1.0f , 1.0f ) , ImVec4 ( 1.0f , 1.0f , 1.0f , 0.5f ) ) ;
ImGui : : EndTooltip ( ) ;
}
ImGui : : TextWrapped ( " And now some textured buttons.. " ) ;
@ -755,7 +761,7 @@ static void ShowDemoWindowWidgets()
{
ImGui : : PushID ( i ) ;
int frame_padding = - 1 + i ; // -1 = uses default padding
if ( ImGui : : ImageButton ( my_tex_id , ImVec2 ( 32 , 32 ) , ImVec2 ( 0 , 0 ) , ImVec2 ( 32.0f / my_tex_w , 32 / my_tex_h ) , frame_padding , Im Color( 0 , 0 , 0 , 255 ) ) )
if ( ImGui : : ImageButton ( my_tex_id , ImVec2 ( 32 , 32 ) , ImVec2 ( 0 , 0 ) , ImVec2 ( 32.0f / my_tex_w , 32 / my_tex_h ) , frame_padding , Im Vec4( 0.0f , 0.0f , 0.0f , 1.0f ) ) )
pressed_count + = 1 ;
ImGui : : PopID ( ) ;
ImGui : : SameLine ( ) ;
@ -986,7 +992,8 @@ static void ShowDemoWindowWidgets()
return 0 ;
}
// Tip: Because ImGui:: is a namespace you can add your own function into the namespace from your own source files.
// Tip: Because ImGui:: is a namespace you would typicall add your own function into the namespace in your own source files.
// For example, you may add a function called ImGui::InputText(const char* label, MyString* my_str).
static bool MyInputTextMultiline ( const char * label , ImVector < char > * my_str , const ImVec2 & size = ImVec2 ( 0 , 0 ) , ImGuiInputTextFlags flags = 0 )
{
IM_ASSERT ( ( flags & ImGuiInputTextFlags_CallbackResize ) = = 0 ) ;
@ -2087,7 +2094,8 @@ static void ShowDemoWindowLayout()
ImGui : : PopID ( ) ;
}
}
float scroll_x = ImGui : : GetScrollX ( ) , scroll_max_x = ImGui : : GetScrollMaxX ( ) ;
float scroll_x = ImGui : : GetScrollX ( ) ;
float scroll_max_x = ImGui : : GetScrollMaxX ( ) ;
ImGui : : EndChild ( ) ;
ImGui : : PopStyleVar ( 2 ) ;
float scroll_x_delta = 0.0f ;
@ -3061,7 +3069,9 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
}
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 ) ) ;
ImVec4 tint_col = ImVec4 ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
ImVec4 border_col = ImVec4 ( 1.0f , 1.0f , 1.0f , 0.5f ) ;
ImGui : : Image ( atlas - > TexID , ImVec2 ( ( float ) atlas - > TexWidth , ( float ) atlas - > TexHeight ) , ImVec2 ( 0 , 0 ) , ImVec2 ( 1 , 1 ) , tint_col , border_col ) ;
ImGui : : TreePop ( ) ;
}
@ -3097,7 +3107,10 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar()
//-----------------------------------------------------------------------------
// Demonstrate creating a fullscreen menu bar and populating it.
// Demonstrate creating a "main" fullscreen menu bar and populating it.
// Note the difference between BeginMainMenuBar() and BeginMenuBar():
// - BeginMenuBar() = menu-bar inside current window we Begin()-ed into (the window needs the ImGuiWindowFlags_MenuBar flag)
// - BeginMainMenuBar() = helper to create menu-bar-sized window at the top of the main viewport + call BeginMenuBar() into it.
static void ShowExampleAppMainMenuBar ( )
{
if ( ImGui : : BeginMainMenuBar ( ) )
@ -3121,6 +3134,7 @@ static void ShowExampleAppMainMenuBar()
}
}
// Note that shortcuts are currently provided for display only (future version will add flags to BeginMenu to process shortcuts)
static void ShowExampleMenuFile ( )
{
ImGui : : MenuItem ( " (dummy menu) " , NULL , false , false ) ;
@ -3654,7 +3668,7 @@ static void ShowExampleAppLog(bool* p_open)
static ExampleAppLog log ;
// For the demo: add a debug button _BEFORE_ the normal log window contents
// We take advantage of the fact that multiple calls to Begin()/End() are appending to the same window.
// We take advantage of a rarely used feature: multiple calls to Begin()/End() are appending to the _ same_ window.
// Most of the contents of the window will be added by the log.Draw() call.
ImGui : : SetNextWindowSize ( ImVec2 ( 500 , 400 ) , ImGuiCond_FirstUseEver ) ;
ImGui : : Begin ( " Example: Log " , p_open ) ;
@ -3672,6 +3686,7 @@ static void ShowExampleAppLog(bool* p_open)
}
ImGui : : End ( ) ;
// Actually call in the regular Log helper (which will Begin() into the same window as we just did)
log . Draw ( " Example: Log " , p_open ) ;
}
@ -3955,8 +3970,8 @@ static void ShowExampleAppSimpleOverlay(bool* p_open)
ImVec2 window_pos_pivot = ImVec2 ( ( corner & 1 ) ? 1.0f : 0.0f , ( corner & 2 ) ? 1.0f : 0.0f ) ;
ImGui : : SetNextWindowPos ( window_pos , ImGuiCond_Always , window_pos_pivot ) ;
}
ImGui : : SetNextWindowBgAlpha ( 0.3 f) ; // Transparent background
if ( ImGui : : Begin ( " Example: Simple overlay " , p_open , ( corner ! = - 1 ? ImGuiWindowFlags_NoMove : 0 ) | ImGuiWindowFlags_No TitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav ) )
ImGui : : SetNextWindowBgAlpha ( 0.3 5 f) ; // Transparent background
if ( ImGui : : Begin ( " Example: Simple overlay " , p_open , ( corner ! = - 1 ? ImGuiWindowFlags_NoMove : 0 ) | ImGuiWindowFlags_No Decoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav ) )
{
ImGui : : Text ( " Simple overlay \n " " in the corner of the screen. \n " " (right-click to change position) " ) ;
ImGui : : Separator ( ) ;
@ -4047,27 +4062,27 @@ static void ShowExampleAppCustomRendering(bool* p_open)
{
// First line uses a thickness of 1.0, second line uses the configurable thickness
float th = ( n = = 0 ) ? 1.0f : thickness ;
draw_list - > AddCircle ( ImVec2 ( x + sz * 0.5f , y + sz * 0.5f ) , sz * 0.5f , col32 , 6 , th ) ; x + = sz + spacing ; // Hexagon
draw_list - > AddCircle ( ImVec2 ( x + sz * 0.5f , y + sz * 0.5f ) , sz * 0.5f , col32 , 20 , th ) ; x + = sz + spacing ; // Circle
draw_list - > AddRect ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 , 0.0f , ImDrawCornerFlags_All , th ) ; x + = sz + spacing ;
draw_list - > AddCircle ( ImVec2 ( x + sz * 0.5f , y + sz * 0.5f ) , sz * 0.5f , col32 , 6 , th ) ; x + = sz + spacing ; // Hexagon
draw_list - > AddCircle ( ImVec2 ( x + sz * 0.5f , y + sz * 0.5f ) , sz * 0.5f , col32 , 20 , th ) ; x + = sz + spacing ; // Circle
draw_list - > AddRect ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 , 0.0f , ImDrawCornerFlags_All , th ) ; x + = sz + spacing ;
draw_list - > AddRect ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 , 10.0f , ImDrawCornerFlags_All , th ) ; x + = sz + spacing ;
draw_list - > AddRect ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 , 10.0f , ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotRight , th ) ; x + = sz + spacing ;
draw_list - > AddTriangle ( ImVec2 ( x + sz * 0.5f , y ) , ImVec2 ( x + sz , y + sz - 0.5f ) , ImVec2 ( x , y + sz - 0.5f ) , col32 , th ) ; x + = sz + spacing ;
draw_list - > AddLine ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y ) , col32 , th ) ; x + = sz + spacing ; // Horizontal line (note: drawing a filled rectangle will be faster!)
draw_list - > AddLine ( ImVec2 ( x , y ) , ImVec2 ( x , y + sz ) , col32 , th ) ; x + = spacing ; // Vertical line (note: drawing a filled rectangle will be faster!)
draw_list - > AddLine ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 , th ) ; x + = sz + spacing ; // Diagonal line
draw_list - > AddLine ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y ) , col32 , th ) ; x + = sz + spacing ; // Horizontal line (note: drawing a filled rectangle will be faster!)
draw_list - > AddLine ( ImVec2 ( x , y ) , ImVec2 ( x , y + sz ) , col32 , th ) ; x + = spacing ; // Vertical line (note: drawing a filled rectangle will be faster!)
draw_list - > AddLine ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 , th ) ; x + = sz + spacing ; // Diagonal line
draw_list - > AddBezierCurve ( ImVec2 ( x , y ) , ImVec2 ( x + sz * 1.3f , y + sz * 0.3f ) , ImVec2 ( x + sz - sz * 1.3f , y + sz - sz * 0.3f ) , ImVec2 ( x + sz , y + sz ) , col32 , th ) ;
x = p . x + 4 ;
y + = sz + spacing ;
}
draw_list - > AddCircleFilled ( ImVec2 ( x + sz * 0.5f , y + sz * 0.5f ) , sz * 0.5f , col32 , 6 ) ; x + = sz + spacing ; // Hexagon
draw_list - > AddCircleFilled ( ImVec2 ( x + sz * 0.5f , y + sz * 0.5f ) , sz * 0.5f , col32 , 32 ) ; x + = sz + spacing ; // Circle
draw_list - > AddCircleFilled ( ImVec2 ( x + sz * 0.5f , y + sz * 0.5f ) , sz * 0.5f , col32 , 6 ) ; x + = sz + spacing ; // Hexagon
draw_list - > AddCircleFilled ( ImVec2 ( x + sz * 0.5f , y + sz * 0.5f ) , sz * 0.5f , col32 , 32 ) ; x + = sz + spacing ; // Circle
draw_list - > AddRectFilled ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 ) ; x + = sz + spacing ;
draw_list - > AddRectFilled ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 , 10.0f ) ; x + = sz + spacing ;
draw_list - > AddRectFilled ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , col32 , 10.0f , ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotRight ) ; x + = sz + spacing ;
draw_list - > AddTriangleFilled ( ImVec2 ( x + sz * 0.5f , y ) , ImVec2 ( x + sz , y + sz - 0.5f ) , ImVec2 ( x , y + sz - 0.5f ) , col32 ) ; x + = sz + spacing ;
draw_list - > AddRectFilled ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + thickness ) , col32 ) ; x + = sz + spacing ; // Horizontal line (faster than AddLine, but only handle integer thickness)
draw_list - > AddRectFilled ( ImVec2 ( x , y ) , ImVec2 ( x + thickness , y + sz ) , col32 ) ; x + = spacing + spacing ; // Vertical line (faster than AddLine, but only handle integer thickness)
draw_list - > AddRectFilled ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + thickness ) , col32 ) ; x + = sz + spacing ; // Horizontal line (faster than AddLine, but only handle integer thickness)
draw_list - > AddRectFilled ( ImVec2 ( x , y ) , ImVec2 ( x + thickness , y + sz ) , col32 ) ; x + = spacing + spacing ; // Vertical line (faster than AddLine, but only handle integer thickness)
draw_list - > AddRectFilled ( ImVec2 ( x , y ) , ImVec2 ( x + 1 , y + 1 ) , col32 ) ; x + = sz ; // Pixel (faster than AddLine)
draw_list - > AddRectFilledMultiColor ( ImVec2 ( x , y ) , ImVec2 ( x + sz , y + sz ) , IM_COL32 ( 0 , 0 , 0 , 255 ) , IM_COL32 ( 255 , 0 , 0 , 255 ) , IM_COL32 ( 255 , 255 , 0 , 255 ) , IM_COL32 ( 0 , 255 , 0 , 255 ) ) ;
ImGui : : Dummy ( ImVec2 ( ( sz + spacing ) * 9.5f , ( sz + spacing ) * 3 ) ) ;
@ -4135,7 +4150,7 @@ static void ShowExampleAppCustomRendering(bool* p_open)
ImVec2 window_size = ImGui : : GetWindowSize ( ) ;
ImVec2 window_center = ImVec2 ( window_pos . x + window_size . x * 0.5f , window_pos . y + window_size . y * 0.5f ) ;
if ( draw_bg )
ImGui : : GetBackgroundDrawList ( ) - > AddCircle ( window_center , window_size . x * 0.6f , IM_COL32 ( 255 , 0 , 0 , 200 ) , 32 , 10 ) ;
ImGui : : GetBackgroundDrawList ( ) - > AddCircle ( window_center , window_size . x * 0.6f , IM_COL32 ( 255 , 0 , 0 , 200 ) , 32 , 10 + 4 ) ;
if ( draw_fg )
ImGui : : GetForegroundDrawList ( ) - > AddCircle ( window_center , window_size . y * 0.6f , IM_COL32 ( 0 , 255 , 0 , 200 ) , 32 , 10 ) ;
ImGui : : EndTabItem ( ) ;