103#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
104#define _CRT_SECURE_NO_WARNINGS
117#if !defined(_MSC_VER) || _MSC_VER >= 1800
121#include <emscripten/version.h>
126#pragma warning (disable: 4127)
127#pragma warning (disable: 4996)
128#pragma warning (disable: 26451)
132#if defined(__clang__)
133#if __has_warning("-Wunknown-warning-option")
134#pragma clang diagnostic ignored "-Wunknown-warning-option"
136#pragma clang diagnostic ignored "-Wunknown-pragmas"
137#pragma clang diagnostic ignored "-Wold-style-cast"
138#pragma clang diagnostic ignored "-Wdeprecated-declarations"
139#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast"
140#pragma clang diagnostic ignored "-Wformat-security"
141#pragma clang diagnostic ignored "-Wexit-time-destructors"
142#pragma clang diagnostic ignored "-Wunused-macros"
143#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
144#pragma clang diagnostic ignored "-Wdouble-promotion"
145#pragma clang diagnostic ignored "-Wreserved-id-macro"
146#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
147#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
148#elif defined(__GNUC__)
149#pragma GCC diagnostic ignored "-Wpragmas"
150#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
151#pragma GCC diagnostic ignored "-Wformat-security"
152#pragma GCC diagnostic ignored "-Wdouble-promotion"
153#pragma GCC diagnostic ignored "-Wconversion"
154#pragma GCC diagnostic ignored "-Wmisleading-indentation"
159#define IM_NEWLINE "\r\n"
161#define IM_NEWLINE "\n"
165#if defined(_MSC_VER) && !defined(snprintf)
166#define snprintf _snprintf
168#if defined(_MSC_VER) && !defined(vsnprintf)
169#define vsnprintf _vsnprintf
173#if !defined(PRId64) && defined(_MSC_VER)
176#elif !defined(PRId64)
185#define IM_MIN(A, B) (((A) < (B)) ? (A) : (B))
186#define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B))
187#define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V))
193#define IMGUI_CDECL __cdecl
203#if !defined(IMGUI_DISABLE_DEMO_WINDOWS)
207static void ShowExampleAppMainMenuBar();
208static void ShowExampleAppAssetsBrowser(
bool* p_open);
209static void ShowExampleAppConsole(
bool* p_open);
210static void ShowExampleAppCustomRendering(
bool* p_open);
211static void ShowExampleAppDockSpace(
bool* p_open);
212static void ShowExampleAppDocuments(
bool* p_open);
213static void ShowExampleAppLog(
bool* p_open);
214static void ShowExampleAppLayout(
bool* p_open);
216static void ShowExampleAppSimpleOverlay(
bool* p_open);
217static void ShowExampleAppAutoResize(
bool* p_open);
218static void ShowExampleAppConstrainedResize(
bool* p_open);
219static void ShowExampleAppFullscreen(
bool* p_open);
220static void ShowExampleAppLongText(
bool* p_open);
221static void ShowExampleAppWindowTitles(
bool* p_open);
222static void ShowExampleMenuFile();
229static void ShowDemoWindowLayout();
230static void ShowDemoWindowPopups();
231static void ShowDemoWindowTables();
232static void ShowDemoWindowColumns();
233static void ShowDemoWindowInputs();
241static void HelpMarker(
const char* desc)
243 ImGui::TextDisabled(
"(?)");
244 if (ImGui::BeginItemTooltip())
246 ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
248 ImGui::PopTextWrapPos();
253static void ShowDockingDisabledMessage()
255 ImGuiIO& io = ImGui::GetIO();
256 ImGui::Text(
"ERROR: Docking is not enabled! See Demo > Configuration.");
257 ImGui::Text(
"Set io.ConfigFlags |= ImGuiConfigFlags_DockingEnable in your code, or ");
258 ImGui::SameLine(0.0f, 0.0f);
259 if (ImGui::SmallButton(
"click here"))
260 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
269#define IMGUI_DEMO_MARKER(section) do { if (GImGuiDemoMarkerCallback != NULL) GImGuiDemoMarkerCallback(__FILE__, __LINE__, section, GImGuiDemoMarkerCallbackUserData); } while (0)
306 {
"MyBool", ImGuiDataType_Bool, 1, offsetof(
ExampleTreeNode, DataMyBool) },
307 {
"MyInt", ImGuiDataType_S32, 1, offsetof(
ExampleTreeNode, DataMyInt) },
308 {
"MyVec2", ImGuiDataType_Float, 2, offsetof(
ExampleTreeNode, DataMyVec2) },
314 snprintf(node->
Name, IM_ARRAYSIZE(node->
Name),
"%s", name);
319 parent->
Childs.push_back(node);
326 ExampleTree_DestroyNode(child_node);
334 static const char* root_names[] = {
"Apple",
"Banana",
"Cherry",
"Kiwi",
"Mango",
"Orange",
"Pear",
"Pineapple",
"Strawberry",
"Watermelon" };
336 char name_buf[NAME_MAX_LEN];
338 ExampleTreeNode* node_L0 = ExampleTree_CreateNode(
"<ROOT>", ++uid, NULL);
339 const int root_items_multiplier = 2;
340 for (
int idx_L0 = 0; idx_L0 < IM_ARRAYSIZE(root_names) * root_items_multiplier; idx_L0++)
342 snprintf(name_buf, IM_ARRAYSIZE(name_buf),
"%s %d", root_names[idx_L0 / root_items_multiplier], idx_L0 % root_items_multiplier);
343 ExampleTreeNode* node_L1 = ExampleTree_CreateNode(name_buf, ++uid, node_L0);
344 const int number_of_childs = (int)strlen(node_L1->
Name);
345 for (
int idx_L1 = 0; idx_L1 < number_of_childs; idx_L1++)
347 snprintf(name_buf, IM_ARRAYSIZE(name_buf),
"Child %d", idx_L1);
348 ExampleTreeNode* node_L2 = ExampleTree_CreateNode(name_buf, ++uid, node_L1);
352 snprintf(name_buf, IM_ARRAYSIZE(name_buf),
"Sub-child %d", 0);
353 ExampleTreeNode* node_L3 = ExampleTree_CreateNode(name_buf, ++uid, node_L2);
401void ImGui::ShowDemoWindow(
bool* p_open)
405 IM_ASSERT(ImGui::GetCurrentContext() != NULL &&
"Missing Dear ImGui context. Refer to examples app!");
408 IMGUI_CHECKVERSION();
438 ImGui::ShowStyleEditor();
443 static bool no_titlebar =
false;
444 static bool no_scrollbar =
false;
445 static bool no_menu =
false;
446 static bool no_move =
false;
447 static bool no_resize =
false;
448 static bool no_collapse =
false;
449 static bool no_close =
false;
450 static bool no_nav =
false;
451 static bool no_background =
false;
452 static bool no_bring_to_front =
false;
453 static bool no_docking =
false;
454 static bool unsaved_document =
false;
456 ImGuiWindowFlags window_flags = 0;
457 if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar;
458 if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar;
459 if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar;
460 if (no_move) window_flags |= ImGuiWindowFlags_NoMove;
461 if (no_resize) window_flags |= ImGuiWindowFlags_NoResize;
462 if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse;
463 if (no_nav) window_flags |= ImGuiWindowFlags_NoNav;
464 if (no_background) window_flags |= ImGuiWindowFlags_NoBackground;
465 if (no_bring_to_front) window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus;
466 if (no_docking) window_flags |= ImGuiWindowFlags_NoDocking;
467 if (unsaved_document) window_flags |= ImGuiWindowFlags_UnsavedDocument;
468 if (no_close) p_open = NULL;
472 const ImGuiViewport* main_viewport = ImGui::GetMainViewport();
473 ImGui::SetNextWindowPos(ImVec2(main_viewport->WorkPos.x + 650, main_viewport->WorkPos.y + 20), ImGuiCond_FirstUseEver);
474 ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver);
477 if (!ImGui::Begin(
"Dear ImGui Demo", p_open, window_flags))
485 ImGui::PushItemWidth(ImGui::GetFontSize() * -12);
489 ShowDemoWindowMenuBar(&demo_data);
491 ImGui::Text(
"dear imgui says hello! (%s) (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
495 if (ImGui::CollapsingHeader(
"Help"))
497 ImGui::SeparatorText(
"ABOUT THIS DEMO:");
498 ImGui::BulletText(
"Sections below are demonstrating many aspects of the library.");
499 ImGui::BulletText(
"The \"Examples\" menu above leads to more demo contents.");
500 ImGui::BulletText(
"The \"Tools\" menu above gives access to: About Box, Style Editor,\n"
501 "and Metrics/Debugger (general purpose Dear ImGui debugging tool).");
503 ImGui::SeparatorText(
"PROGRAMMER GUIDE:");
504 ImGui::BulletText(
"See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!");
505 ImGui::BulletText(
"See comments in imgui.cpp.");
506 ImGui::BulletText(
"See example applications in the examples/ folder.");
507 ImGui::BulletText(
"Read the FAQ at ");
508 ImGui::SameLine(0, 0);
509 ImGui::TextLinkOpenURL(
"https://www.dearimgui.com/faq/");
510 ImGui::BulletText(
"Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls.");
511 ImGui::BulletText(
"Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls.");
513 ImGui::SeparatorText(
"USER GUIDE:");
514 ImGui::ShowUserGuide();
518 if (ImGui::CollapsingHeader(
"Configuration"))
520 ImGuiIO& io = ImGui::GetIO();
522 if (ImGui::TreeNode(
"Configuration##2"))
524 ImGui::SeparatorText(
"General");
525 ImGui::CheckboxFlags(
"io.ConfigFlags: NavEnableKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard);
526 ImGui::SameLine(); HelpMarker(
"Enable keyboard controls.");
527 ImGui::CheckboxFlags(
"io.ConfigFlags: NavEnableGamepad", &io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad);
528 ImGui::SameLine(); HelpMarker(
"Enable gamepad controls. Require backend to set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details.");
529 ImGui::CheckboxFlags(
"io.ConfigFlags: NoMouse", &io.ConfigFlags, ImGuiConfigFlags_NoMouse);
530 ImGui::SameLine(); HelpMarker(
"Instruct dear imgui to disable mouse inputs and interactions.");
533 if (io.ConfigFlags & ImGuiConfigFlags_NoMouse)
535 if (fmodf((
float)ImGui::GetTime(), 0.40f) < 0.20f)
538 ImGui::Text(
"<<PRESS SPACE TO DISABLE>>");
541 if (ImGui::IsKeyPressed(ImGuiKey_Space) || (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard))
542 io.ConfigFlags &= ~ImGuiConfigFlags_NoMouse;
545 ImGui::CheckboxFlags(
"io.ConfigFlags: NoMouseCursorChange", &io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange);
546 ImGui::SameLine(); HelpMarker(
"Instruct backend to not alter mouse cursor shape and visibility.");
547 ImGui::CheckboxFlags(
"io.ConfigFlags: NoKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NoKeyboard);
548 ImGui::SameLine(); HelpMarker(
"Instruct dear imgui to disable keyboard inputs and interactions.");
550 ImGui::Checkbox(
"io.ConfigInputTrickleEventQueue", &io.ConfigInputTrickleEventQueue);
551 ImGui::SameLine(); HelpMarker(
"Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates.");
552 ImGui::Checkbox(
"io.MouseDrawCursor", &io.MouseDrawCursor);
553 ImGui::SameLine(); HelpMarker(
"Instruct Dear ImGui to render a mouse cursor itself. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something).");
555 ImGui::SeparatorText(
"Keyboard/Gamepad Navigation");
556 ImGui::Checkbox(
"io.ConfigNavSwapGamepadButtons", &io.ConfigNavSwapGamepadButtons);
557 ImGui::Checkbox(
"io.ConfigNavMoveSetMousePos", &io.ConfigNavMoveSetMousePos);
558 ImGui::SameLine(); HelpMarker(
"Directional/tabbing navigation teleports the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is difficult");
559 ImGui::Checkbox(
"io.ConfigNavCaptureKeyboard", &io.ConfigNavCaptureKeyboard);
560 ImGui::Checkbox(
"io.ConfigNavEscapeClearFocusItem", &io.ConfigNavEscapeClearFocusItem);
561 ImGui::SameLine(); HelpMarker(
"Pressing Escape clears focused item.");
562 ImGui::Checkbox(
"io.ConfigNavEscapeClearFocusWindow", &io.ConfigNavEscapeClearFocusWindow);
563 ImGui::SameLine(); HelpMarker(
"Pressing Escape clears focused window.");
564 ImGui::Checkbox(
"io.ConfigNavCursorVisibleAuto", &io.ConfigNavCursorVisibleAuto);
565 ImGui::SameLine(); HelpMarker(
"Using directional navigation key makes the cursor visible. Mouse click hides the cursor.");
566 ImGui::Checkbox(
"io.ConfigNavCursorVisibleAlways", &io.ConfigNavCursorVisibleAlways);
567 ImGui::SameLine(); HelpMarker(
"Navigation cursor is always visible.");
569 ImGui::SeparatorText(
"Docking");
570 ImGui::CheckboxFlags(
"io.ConfigFlags: DockingEnable", &io.ConfigFlags, ImGuiConfigFlags_DockingEnable);
572 if (io.ConfigDockingWithShift)
573 HelpMarker(
"Drag from window title bar or their tab to dock/undock. Hold SHIFT to enable docking.\n\nDrag from window menu button (upper-left button) to undock an entire node (all windows).");
575 HelpMarker(
"Drag from window title bar or their tab to dock/undock. Hold SHIFT to disable docking.\n\nDrag from window menu button (upper-left button) to undock an entire node (all windows).");
576 if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable)
579 ImGui::Checkbox(
"io.ConfigDockingNoSplit", &io.ConfigDockingNoSplit);
580 ImGui::SameLine(); HelpMarker(
"Simplified docking mode: disable window splitting, so docking is limited to merging multiple windows together into tab-bars.");
581 ImGui::Checkbox(
"io.ConfigDockingWithShift", &io.ConfigDockingWithShift);
582 ImGui::SameLine(); HelpMarker(
"Enable docking when holding Shift only (allow to drop in wider space, reduce visual noise)");
583 ImGui::Checkbox(
"io.ConfigDockingAlwaysTabBar", &io.ConfigDockingAlwaysTabBar);
584 ImGui::SameLine(); HelpMarker(
"Create a docking node and tab-bar on single floating windows.");
585 ImGui::Checkbox(
"io.ConfigDockingTransparentPayload", &io.ConfigDockingTransparentPayload);
586 ImGui::SameLine(); HelpMarker(
"Make window or viewport transparent when docking and only display docking boxes on the target viewport. Useful if rendering of multiple viewport cannot be synced. Best used with ConfigViewportsNoAutoMerge.");
590 ImGui::SeparatorText(
"Multi-viewports");
591 ImGui::CheckboxFlags(
"io.ConfigFlags: ViewportsEnable", &io.ConfigFlags, ImGuiConfigFlags_ViewportsEnable);
592 ImGui::SameLine(); HelpMarker(
"[beta] Enable beta multi-viewports support. See ImGuiPlatformIO for details.");
593 if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
596 ImGui::Checkbox(
"io.ConfigViewportsNoAutoMerge", &io.ConfigViewportsNoAutoMerge);
597 ImGui::SameLine(); HelpMarker(
"Set to make all floating imgui windows always create their own viewport. Otherwise, they are merged into the main host viewports when overlapping it.");
598 ImGui::Checkbox(
"io.ConfigViewportsNoTaskBarIcon", &io.ConfigViewportsNoTaskBarIcon);
599 ImGui::SameLine(); HelpMarker(
"Toggling this at runtime is normally unsupported (most platform backends won't refresh the task bar icon state right away).");
600 ImGui::Checkbox(
"io.ConfigViewportsNoDecoration", &io.ConfigViewportsNoDecoration);
601 ImGui::SameLine(); HelpMarker(
"Toggling this at runtime is normally unsupported (most platform backends won't refresh the decoration right away).");
602 ImGui::Checkbox(
"io.ConfigViewportsNoDefaultParent", &io.ConfigViewportsNoDefaultParent);
603 ImGui::SameLine(); HelpMarker(
"Toggling this at runtime is normally unsupported (most platform backends won't refresh the parenting right away).");
607 ImGui::SeparatorText(
"Windows");
608 ImGui::Checkbox(
"io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges);
609 ImGui::SameLine(); HelpMarker(
"Enable resizing of windows from their edges and from the lower-left corner.\nThis requires ImGuiBackendFlags_HasMouseCursors for better mouse cursor feedback.");
610 ImGui::Checkbox(
"io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly);
611 ImGui::Checkbox(
"io.ConfigWindowsCopyContentsWithCtrlC", &io.ConfigWindowsCopyContentsWithCtrlC);
612 ImGui::SameLine(); HelpMarker(
"*EXPERIMENTAL* CTRL+C copy the contents of focused window into the clipboard.\n\nExperimental because:\n- (1) has known issues with nested Begin/End pairs.\n- (2) text output quality varies.\n- (3) text output is in submission order rather than spatial order.");
613 ImGui::Checkbox(
"io.ConfigScrollbarScrollByPage", &io.ConfigScrollbarScrollByPage);
614 ImGui::SameLine(); HelpMarker(
"Enable scrolling page by page when clicking outside the scrollbar grab.\nWhen disabled, always scroll to clicked location.\nWhen enabled, Shift+Click scrolls to clicked location.");
616 ImGui::SeparatorText(
"Widgets");
617 ImGui::Checkbox(
"io.ConfigInputTextCursorBlink", &io.ConfigInputTextCursorBlink);
618 ImGui::SameLine(); HelpMarker(
"Enable blinking cursor (optional as some users consider it to be distracting).");
619 ImGui::Checkbox(
"io.ConfigInputTextEnterKeepActive", &io.ConfigInputTextEnterKeepActive);
620 ImGui::SameLine(); HelpMarker(
"Pressing Enter will keep item active and select contents (single-line only).");
621 ImGui::Checkbox(
"io.ConfigDragClickToInputText", &io.ConfigDragClickToInputText);
622 ImGui::SameLine(); HelpMarker(
"Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving).");
623 ImGui::Checkbox(
"io.ConfigMacOSXBehaviors", &io.ConfigMacOSXBehaviors);
624 ImGui::SameLine(); HelpMarker(
"Swap Cmd<>Ctrl keys, enable various MacOS style behaviors.");
625 ImGui::Text(
"Also see Style->Rendering for rendering options.");
628 ImGui::SeparatorText(
"Error Handling");
630 ImGui::Checkbox(
"io.ConfigErrorRecovery", &io.ConfigErrorRecovery);
631 ImGui::SameLine(); HelpMarker(
632 "Options to configure how we handle recoverable errors.\n"
633 "- Error recovery is not perfect nor guaranteed! It is a feature to ease development.\n"
634 "- You not are not supposed to rely on it in the course of a normal application run.\n"
635 "- Possible usage: facilitate recovery from errors triggered from a scripting language or after specific exceptions handlers.\n"
636 "- Always ensure that on programmers seat you have at minimum Asserts or Tooltips enabled when making direct imgui API call!"
637 "Otherwise it would severely hinder your ability to catch and correct mistakes!");
638 ImGui::Checkbox(
"io.ConfigErrorRecoveryEnableAssert", &io.ConfigErrorRecoveryEnableAssert);
639 ImGui::Checkbox(
"io.ConfigErrorRecoveryEnableDebugLog", &io.ConfigErrorRecoveryEnableDebugLog);
640 ImGui::Checkbox(
"io.ConfigErrorRecoveryEnableTooltip", &io.ConfigErrorRecoveryEnableTooltip);
641 if (!io.ConfigErrorRecoveryEnableAssert && !io.ConfigErrorRecoveryEnableDebugLog && !io.ConfigErrorRecoveryEnableTooltip)
642 io.ConfigErrorRecoveryEnableAssert = io.ConfigErrorRecoveryEnableDebugLog = io.ConfigErrorRecoveryEnableTooltip =
true;
645 ImGui::SeparatorText(
"Debug");
646 ImGui::Checkbox(
"io.ConfigDebugIsDebuggerPresent", &io.ConfigDebugIsDebuggerPresent);
647 ImGui::SameLine(); HelpMarker(
"Enable various tools calling IM_DEBUG_BREAK().\n\nRequires a debugger being attached, otherwise IM_DEBUG_BREAK() options will appear to crash your application.");
648 ImGui::Checkbox(
"io.ConfigDebugHighlightIdConflicts", &io.ConfigDebugHighlightIdConflicts);
649 ImGui::SameLine(); HelpMarker(
"Highlight and show an error message when multiple items have conflicting identifiers.");
650 ImGui::BeginDisabled();
651 ImGui::Checkbox(
"io.ConfigDebugBeginReturnValueOnce", &io.ConfigDebugBeginReturnValueOnce);
652 ImGui::EndDisabled();
653 ImGui::SameLine(); HelpMarker(
"First calls to Begin()/BeginChild() will return false.\n\nTHIS OPTION IS DISABLED because it needs to be set at application boot-time to make sense. Showing the disabled option is a way to make this feature easier to discover.");
654 ImGui::Checkbox(
"io.ConfigDebugBeginReturnValueLoop", &io.ConfigDebugBeginReturnValueLoop);
655 ImGui::SameLine(); HelpMarker(
"Some calls to Begin()/BeginChild() will return false.\n\nWill cycle through window depths then repeat. Windows should be flickering while running.");
656 ImGui::Checkbox(
"io.ConfigDebugIgnoreFocusLoss", &io.ConfigDebugIgnoreFocusLoss);
657 ImGui::SameLine(); HelpMarker(
"Option to deactivate io.AddFocusEvent(false) handling. May facilitate interactions with a debugger when focus loss leads to clearing inputs data.");
658 ImGui::Checkbox(
"io.ConfigDebugIniSettings", &io.ConfigDebugIniSettings);
659 ImGui::SameLine(); HelpMarker(
"Option to save .ini data with extra comments (particularly helpful for Docking, but makes saving slower).");
666 if (ImGui::TreeNode(
"Backend Flags"))
669 "Those flags are set by the backends (imgui_impl_xxx files) to specify their capabilities.\n"
670 "Here we expose them as read-only fields to avoid breaking interactions with your backend.");
674 ImGui::BeginDisabled();
675 ImGui::CheckboxFlags(
"io.BackendFlags: HasGamepad", &io.BackendFlags, ImGuiBackendFlags_HasGamepad);
676 ImGui::CheckboxFlags(
"io.BackendFlags: HasMouseCursors", &io.BackendFlags, ImGuiBackendFlags_HasMouseCursors);
677 ImGui::CheckboxFlags(
"io.BackendFlags: HasSetMousePos", &io.BackendFlags, ImGuiBackendFlags_HasSetMousePos);
678 ImGui::CheckboxFlags(
"io.BackendFlags: PlatformHasViewports", &io.BackendFlags, ImGuiBackendFlags_PlatformHasViewports);
679 ImGui::CheckboxFlags(
"io.BackendFlags: HasMouseHoveredViewport",&io.BackendFlags, ImGuiBackendFlags_HasMouseHoveredViewport);
680 ImGui::CheckboxFlags(
"io.BackendFlags: RendererHasVtxOffset", &io.BackendFlags, ImGuiBackendFlags_RendererHasVtxOffset);
681 ImGui::CheckboxFlags(
"io.BackendFlags: RendererHasViewports", &io.BackendFlags, ImGuiBackendFlags_RendererHasViewports);
682 ImGui::EndDisabled();
689 if (ImGui::TreeNode(
"Style"))
693 HelpMarker(
"The same contents can be accessed in 'Tools->Style Editor' or by calling the ShowStyleEditor() function.");
699 if (ImGui::TreeNode(
"Capture/Logging"))
702 "The logging API redirects all text output so you can easily capture the content of "
703 "a window or a block. Tree nodes can be automatically expanded.\n"
704 "Try opening any of the contents below in this window and then click one of the \"Log To\" button.");
707 HelpMarker(
"You can also call ImGui::LogText() to output directly to the log without a visual output.");
708 if (ImGui::Button(
"Copy \"Hello, world!\" to clipboard"))
710 ImGui::LogToClipboard();
711 ImGui::LogText(
"Hello, world!");
719 if (ImGui::CollapsingHeader(
"Window options"))
721 if (ImGui::BeginTable(
"split", 3))
723 ImGui::TableNextColumn(); ImGui::Checkbox(
"No titlebar", &no_titlebar);
724 ImGui::TableNextColumn(); ImGui::Checkbox(
"No scrollbar", &no_scrollbar);
725 ImGui::TableNextColumn(); ImGui::Checkbox(
"No menu", &no_menu);
726 ImGui::TableNextColumn(); ImGui::Checkbox(
"No move", &no_move);
727 ImGui::TableNextColumn(); ImGui::Checkbox(
"No resize", &no_resize);
728 ImGui::TableNextColumn(); ImGui::Checkbox(
"No collapse", &no_collapse);
729 ImGui::TableNextColumn(); ImGui::Checkbox(
"No close", &no_close);
730 ImGui::TableNextColumn(); ImGui::Checkbox(
"No nav", &no_nav);
731 ImGui::TableNextColumn(); ImGui::Checkbox(
"No background", &no_background);
732 ImGui::TableNextColumn(); ImGui::Checkbox(
"No bring to front", &no_bring_to_front);
733 ImGui::TableNextColumn(); ImGui::Checkbox(
"No docking", &no_docking);
734 ImGui::TableNextColumn(); ImGui::Checkbox(
"Unsaved document", &unsaved_document);
740 ShowDemoWindowWidgets(&demo_data);
741 ShowDemoWindowLayout();
742 ShowDemoWindowPopups();
743 ShowDemoWindowTables();
744 ShowDemoWindowInputs();
747 ImGui::PopItemWidth();
758 if (ImGui::BeginMenuBar())
760 if (ImGui::BeginMenu(
"Menu"))
763 ShowExampleMenuFile();
766 if (ImGui::BeginMenu(
"Examples"))
771 ImGui::SeparatorText(
"Mini apps");
777 ImGui::MenuItem(
"Log", NULL, &demo_data->
ShowAppLog);
779 ImGui::MenuItem(
"Simple layout", NULL, &demo_data->
ShowAppLayout);
782 ImGui::SeparatorText(
"Concepts");
786 ImGui::MenuItem(
"Long text display", NULL, &demo_data->
ShowAppLongText);
792 if (ImGui::BeginMenu(
"Tools"))
795 ImGuiIO& io = ImGui::GetIO();
796#ifndef IMGUI_DISABLE_DEBUG_TOOLS
797 const bool has_debug_tools =
true;
799 const bool has_debug_tools =
false;
801 ImGui::MenuItem(
"Metrics/Debugger", NULL, &demo_data->
ShowMetrics, has_debug_tools);
802 ImGui::MenuItem(
"Debug Log", NULL, &demo_data->
ShowDebugLog, has_debug_tools);
803 ImGui::MenuItem(
"ID Stack Tool", NULL, &demo_data->
ShowIDStackTool, has_debug_tools);
804 bool is_debugger_present = io.ConfigDebugIsDebuggerPresent;
805 if (ImGui::MenuItem(
"Item Picker", NULL,
false, has_debug_tools && is_debugger_present))
806 ImGui::DebugStartItemPicker();
807 if (!is_debugger_present)
808 ImGui::SetItemTooltip(
"Requires io.ConfigDebugIsDebuggerPresent=true to be set.\n\nWe otherwise disable the menu option to avoid casual users crashing the application.\n\nYou can however always access the Item Picker in Metrics->Tools.");
810 ImGui::MenuItem(
"About Dear ImGui", NULL, &demo_data->
ShowAbout);
812 ImGui::SeparatorText(
"Debug Options");
813 ImGui::MenuItem(
"Highlight ID Conflicts", NULL, &io.ConfigDebugHighlightIdConflicts, has_debug_tools);
828 if (!ImGui::CollapsingHeader(
"Widgets"))
831 static bool disable_all =
false;
833 ImGui::BeginDisabled();
836 if (ImGui::TreeNode(
"Basic"))
838 ImGui::SeparatorText(
"General");
841 static int clicked = 0;
842 if (ImGui::Button(
"Button"))
847 ImGui::Text(
"Thanks for clicking me!");
851 static bool check =
true;
852 ImGui::Checkbox(
"checkbox", &check);
856 ImGui::RadioButton(
"radio a", &e, 0); ImGui::SameLine();
857 ImGui::RadioButton(
"radio b", &e, 1); ImGui::SameLine();
858 ImGui::RadioButton(
"radio c", &e, 2);
862 for (
int i = 0; i < 7; i++)
867 ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f));
868 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f));
869 ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f));
870 ImGui::Button(
"Click");
871 ImGui::PopStyleColor(3);
878 ImGui::AlignTextToFramePadding();
879 ImGui::Text(
"Hold to repeat:");
884 static int counter = 0;
885 float spacing = ImGui::GetStyle().ItemInnerSpacing.x;
886 ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat,
true);
887 if (ImGui::ArrowButton(
"##left", ImGuiDir_Left)) { counter--; }
888 ImGui::SameLine(0.0f, spacing);
889 if (ImGui::ArrowButton(
"##right", ImGuiDir_Right)) { counter++; }
890 ImGui::PopItemFlag();
892 ImGui::Text(
"%d", counter);
894 ImGui::Button(
"Tooltip");
895 ImGui::SetItemTooltip(
"I am a tooltip");
897 ImGui::LabelText(
"label",
"Value");
899 ImGui::SeparatorText(
"Inputs");
905 static char str0[128] =
"Hello, world!";
906 ImGui::InputText(
"input text", str0, IM_ARRAYSIZE(str0));
907 ImGui::SameLine(); HelpMarker(
909 "Hold SHIFT or use mouse to select text.\n"
910 "CTRL+Left/Right to word jump.\n"
911 "CTRL+A or Double-Click to select all.\n"
912 "CTRL+X,CTRL+C,CTRL+V clipboard.\n"
913 "CTRL+Z,CTRL+Y undo/redo.\n"
914 "ESCAPE to revert.\n\n"
916 "You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() "
917 "to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated "
918 "in imgui_demo.cpp).");
920 static char str1[128] =
"";
921 ImGui::InputTextWithHint(
"input text (w/ hint)",
"enter text here", str1, IM_ARRAYSIZE(str1));
925 ImGui::InputInt(
"input int", &i0);
927 static float f0 = 0.001f;
928 ImGui::InputFloat(
"input float", &f0, 0.01f, 1.0f,
"%.3f");
930 static double d0 = 999999.00000001;
931 ImGui::InputDouble(
"input double", &d0, 0.01f, 1.0f,
"%.8f");
933 static float f1 = 1.e10f;
934 ImGui::InputFloat(
"input scientific", &f1, 0.0f, 0.0f,
"%e");
935 ImGui::SameLine(); HelpMarker(
936 "You can input value using the scientific notation,\n"
937 " e.g. \"1e+8\" becomes \"100000000\".");
939 static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f };
940 ImGui::InputFloat3(
"input float3", vec4a);
943 ImGui::SeparatorText(
"Drags");
947 static int i1 = 50, i2 = 42,
i3 = 128;
948 ImGui::DragInt(
"drag int", &i1, 1);
949 ImGui::SameLine(); HelpMarker(
950 "Click and drag to edit value.\n"
951 "Hold SHIFT/ALT for faster/slower edit.\n"
952 "Double-click or CTRL+click to input value.");
953 ImGui::DragInt(
"drag int 0..100", &i2, 1, 0, 100,
"%d%%", ImGuiSliderFlags_AlwaysClamp);
954 ImGui::DragInt(
"drag int wrap 100..200", &
i3, 1, 100, 200,
"%d", ImGuiSliderFlags_WrapAround);
956 static float f1 = 1.00f, f2 = 0.0067f;
957 ImGui::DragFloat(
"drag float", &f1, 0.005f);
958 ImGui::DragFloat(
"drag small float", &f2, 0.0001f, 0.0f, 0.0f,
"%.06f ns");
962 ImGui::SeparatorText(
"Sliders");
967 ImGui::SliderInt(
"slider int", &i1, -1, 3);
968 ImGui::SameLine(); HelpMarker(
"CTRL+click to input value.");
970 static float f1 = 0.123f, f2 = 0.0f;
971 ImGui::SliderFloat(
"slider float", &f1, 0.0f, 1.0f,
"ratio = %.3f");
972 ImGui::SliderFloat(
"slider float (log)", &f2, -10.0f, 10.0f,
"%.4f", ImGuiSliderFlags_Logarithmic);
975 static float angle = 0.0f;
976 ImGui::SliderAngle(
"slider angle", &angle);
982 enum Element { Element_Fire, Element_Earth, Element_Air, Element_Water, Element_COUNT };
983 static int elem = Element_Fire;
984 const char* elems_names[Element_COUNT] = {
"Fire",
"Earth",
"Air",
"Water" };
985 const char* elem_name = (elem >= 0 && elem < Element_COUNT) ? elems_names[elem] :
"Unknown";
986 ImGui::SliderInt(
"slider enum", &elem, 0, Element_COUNT - 1, elem_name);
987 ImGui::SameLine(); HelpMarker(
"Using the format string parameter to display a name instead of the underlying integer.");
990 ImGui::SeparatorText(
"Selectors/Pickers");
994 static float col1[3] = { 1.0f, 0.0f, 0.2f };
995 static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
996 ImGui::ColorEdit3(
"color 1", col1);
997 ImGui::SameLine(); HelpMarker(
998 "Click on the color square to open a color picker.\n"
999 "Click and hold to use drag and drop.\n"
1000 "Right-click on the color square to show options.\n"
1001 "CTRL+click on individual component to input value.\n");
1003 ImGui::ColorEdit4(
"color 2", col2);
1010 const char* items[] = {
"AAAA",
"BBBB",
"CCCC",
"DDDD",
"EEEE",
"FFFF",
"GGGG",
"HHHH",
"IIIIIII",
"JJJJ",
"KKKKKKK" };
1011 static int item_current = 0;
1012 ImGui::Combo(
"combo", &item_current, items, IM_ARRAYSIZE(items));
1013 ImGui::SameLine(); HelpMarker(
1014 "Using the simplified one-liner Combo API here.\n"
1015 "Refer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API.");
1022 const char* items[] = {
"Apple",
"Banana",
"Cherry",
"Kiwi",
"Mango",
"Orange",
"Pineapple",
"Strawberry",
"Watermelon" };
1023 static int item_current = 1;
1024 ImGui::ListBox(
"listbox", &item_current, items, IM_ARRAYSIZE(items), 4);
1025 ImGui::SameLine(); HelpMarker(
1026 "Using the simplified one-liner ListBox API here.\n"
1027 "Refer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API.");
1034 if (ImGui::TreeNode(
"Tooltips"))
1037 ImGui::SeparatorText(
"General");
1047 "Tooltip are typically created by using a IsItemHovered() + SetTooltip() sequence.\n\n"
1048 "We provide a helper SetItemTooltip() function to perform the two with standards flags.");
1050 ImVec2 sz = ImVec2(-FLT_MIN, 0.0f);
1052 ImGui::Button(
"Basic", sz);
1053 ImGui::SetItemTooltip(
"I am a tooltip");
1055 ImGui::Button(
"Fancy", sz);
1056 if (ImGui::BeginItemTooltip())
1058 ImGui::Text(
"I am a fancy tooltip");
1059 static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
1060 ImGui::PlotLines(
"Curve", arr, IM_ARRAYSIZE(arr));
1061 ImGui::Text(
"Sin(time) = %f", sinf((
float)ImGui::GetTime()));
1062 ImGui::EndTooltip();
1065 ImGui::SeparatorText(
"Always On");
1069 static int always_on = 0;
1070 ImGui::RadioButton(
"Off", &always_on, 0);
1072 ImGui::RadioButton(
"Always On (Simple)", &always_on, 1);
1074 ImGui::RadioButton(
"Always On (Advanced)", &always_on, 2);
1076 ImGui::SetTooltip(
"I am following you around.");
1077 else if (always_on == 2 && ImGui::BeginTooltip())
1079 ImGui::ProgressBar(sinf((
float)ImGui::GetTime()) * 0.5f + 0.5f, ImVec2(ImGui::GetFontSize() * 25, 0.0f));
1080 ImGui::EndTooltip();
1083 ImGui::SeparatorText(
"Custom");
1086 "Passing ImGuiHoveredFlags_ForTooltip to IsItemHovered() is the preferred way to standardize"
1087 "tooltip activation details across your application. You may however decide to use custom"
1088 "flags for a specific tooltip instance.");
1094 ImGui::Button(
"Manual", sz);
1095 if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip))
1096 ImGui::SetTooltip(
"I am a manually emitted tooltip.");
1098 ImGui::Button(
"DelayNone", sz);
1099 if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNone))
1100 ImGui::SetTooltip(
"I am a tooltip with no delay.");
1102 ImGui::Button(
"DelayShort", sz);
1103 if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_NoSharedDelay))
1104 ImGui::SetTooltip(
"I am a tooltip with a short delay (%0.2f sec).", ImGui::GetStyle().HoverDelayShort);
1106 ImGui::Button(
"DelayLong", sz);
1107 if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay))
1108 ImGui::SetTooltip(
"I am a tooltip with a long delay (%0.2f sec).", ImGui::GetStyle().HoverDelayNormal);
1110 ImGui::Button(
"Stationary", sz);
1111 if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary))
1112 ImGui::SetTooltip(
"I am a tooltip requiring mouse to be stationary before activating.");
1116 ImGui::BeginDisabled();
1117 ImGui::Button(
"Disabled item", sz);
1118 if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip))
1119 ImGui::SetTooltip(
"I am a a tooltip for a disabled item.");
1120 ImGui::EndDisabled();
1132 if (ImGui::TreeNode(
"Tree Nodes"))
1135 if (ImGui::TreeNode(
"Basic trees"))
1137 for (
int i = 0; i < 5; i++)
1142 ImGui::SetNextItemOpen(
true, ImGuiCond_Once);
1148 if (ImGui::TreeNode(
"",
"Child %d", i))
1150 ImGui::Text(
"blah blah");
1152 if (ImGui::SmallButton(
"button")) {}
1161 if (ImGui::TreeNode(
"Advanced, with Selectable nodes"))
1164 "This is a more typical looking tree with selectable nodes.\n"
1165 "Click to select, CTRL+Click to toggle, click on arrows or double-click to open.");
1166 static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth;
1167 static bool align_label_with_current_x_position =
false;
1168 static bool test_drag_and_drop =
false;
1169 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_OpenOnArrow", &base_flags, ImGuiTreeNodeFlags_OpenOnArrow);
1170 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_OpenOnDoubleClick", &base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick);
1171 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_SpanAvailWidth", &base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker(
"Extend hit area to all available width instead of allowing more items to be laid out after the node.");
1172 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_SpanFullWidth", &base_flags, ImGuiTreeNodeFlags_SpanFullWidth);
1173 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_SpanTextWidth", &base_flags, ImGuiTreeNodeFlags_SpanTextWidth); ImGui::SameLine(); HelpMarker(
"Reduce hit area to the text label and a bit of margin.");
1174 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_SpanAllColumns", &base_flags, ImGuiTreeNodeFlags_SpanAllColumns); ImGui::SameLine(); HelpMarker(
"For use in Tables only.");
1175 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_AllowOverlap", &base_flags, ImGuiTreeNodeFlags_AllowOverlap);
1176 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_Framed", &base_flags, ImGuiTreeNodeFlags_Framed); ImGui::SameLine(); HelpMarker(
"Draw frame with background (e.g. for CollapsingHeader)");
1177 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_NavLeftJumpsBackHere", &base_flags, ImGuiTreeNodeFlags_NavLeftJumpsBackHere);
1178 ImGui::Checkbox(
"Align label with current X position", &align_label_with_current_x_position);
1179 ImGui::Checkbox(
"Test tree node as drag source", &test_drag_and_drop);
1180 ImGui::Text(
"Hello!");
1181 if (align_label_with_current_x_position)
1182 ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing());
1188 static int selection_mask = (1 << 2);
1189 int node_clicked = -1;
1190 for (
int i = 0; i < 6; i++)
1194 ImGuiTreeNodeFlags node_flags = base_flags;
1195 const bool is_selected = (selection_mask & (1 << i)) != 0;
1197 node_flags |= ImGuiTreeNodeFlags_Selected;
1201 bool node_open = ImGui::TreeNodeEx((
void*)(intptr_t)i, node_flags,
"Selectable Node %d", i);
1202 if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
1204 if (test_drag_and_drop && ImGui::BeginDragDropSource())
1206 ImGui::SetDragDropPayload(
"_TREENODE", NULL, 0);
1207 ImGui::Text(
"This is a drag and drop source");
1208 ImGui::EndDragDropSource();
1210 if (i == 2 && (base_flags & ImGuiTreeNodeFlags_SpanTextWidth))
1214 if (ImGui::SmallButton(
"button")) {}
1218 ImGui::BulletText(
"Blah blah\nBlah Blah");
1220 ImGui::SmallButton(
"Button");
1229 node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen;
1230 ImGui::TreeNodeEx((
void*)(intptr_t)i, node_flags,
"Selectable Leaf %d", i);
1231 if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen())
1233 if (test_drag_and_drop && ImGui::BeginDragDropSource())
1235 ImGui::SetDragDropPayload(
"_TREENODE", NULL, 0);
1236 ImGui::Text(
"This is a drag and drop source");
1237 ImGui::EndDragDropSource();
1241 if (node_clicked != -1)
1245 if (ImGui::GetIO().KeyCtrl)
1246 selection_mask ^= (1 << node_clicked);
1248 selection_mask = (1 << node_clicked);
1250 if (align_label_with_current_x_position)
1251 ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing());
1258 if (ImGui::TreeNode(
"Collapsing Headers"))
1260 static bool closable_group =
true;
1261 ImGui::Checkbox(
"Show 2nd header", &closable_group);
1262 if (ImGui::CollapsingHeader(
"Header", ImGuiTreeNodeFlags_None))
1264 ImGui::Text(
"IsItemHovered: %d", ImGui::IsItemHovered());
1265 for (
int i = 0; i < 5; i++)
1266 ImGui::Text(
"Some content %d", i);
1268 if (ImGui::CollapsingHeader(
"Header with a close button", &closable_group))
1270 ImGui::Text(
"IsItemHovered: %d", ImGui::IsItemHovered());
1271 for (
int i = 0; i < 5; i++)
1272 ImGui::Text(
"More content %d", i);
1282 if (ImGui::TreeNode(
"Bullets"))
1284 ImGui::BulletText(
"Bullet point 1");
1285 ImGui::BulletText(
"Bullet point 2\nOn multiple lines");
1286 if (ImGui::TreeNode(
"Tree node"))
1288 ImGui::BulletText(
"Another bullet point");
1291 ImGui::Bullet(); ImGui::Text(
"Bullet point 3 (two calls)");
1292 ImGui::Bullet(); ImGui::SmallButton(
"Button");
1297 if (ImGui::TreeNode(
"Text"))
1300 if (ImGui::TreeNode(
"Colorful Text"))
1303 ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f),
"Pink");
1304 ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
"Yellow");
1305 ImGui::TextDisabled(
"Disabled");
1306 ImGui::SameLine(); HelpMarker(
"The TextDisabled color is stored in ImGuiStyle.");
1311 if (ImGui::TreeNode(
"Word Wrapping"))
1315 "This text should automatically wrap on the edge of the window. The current implementation "
1316 "for text wrapping follows simple rules suitable for English and possibly other languages.");
1319 static float wrap_width = 200.0f;
1320 ImGui::SliderFloat(
"Wrap width", &wrap_width, -20, 600,
"%.0f");
1322 ImDrawList* draw_list = ImGui::GetWindowDrawList();
1323 for (
int n = 0; n < 2; n++)
1325 ImGui::Text(
"Test paragraph %d:", n);
1326 ImVec2 pos = ImGui::GetCursorScreenPos();
1327 ImVec2 marker_min = ImVec2(pos.x + wrap_width, pos.y);
1328 ImVec2 marker_max = ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight());
1329 ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width);
1331 ImGui::Text(
"The lazy dog is a good dog. This paragraph should fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width);
1333 ImGui::Text(
"aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh");
1336 draw_list->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255, 255, 0, 255));
1337 draw_list->AddRectFilled(marker_min, marker_max, IM_COL32(255, 0, 255, 255));
1338 ImGui::PopTextWrapPos();
1345 if (ImGui::TreeNode(
"UTF-8 Text"))
1358 "CJK text will only appear if the font was loaded with the appropriate CJK character ranges. "
1359 "Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. "
1360 "Read docs/FONTS.md for details.");
1361 ImGui::Text(
"Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)");
1362 ImGui::Text(
"Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)");
1363 static char buf[32] =
"\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e";
1365 ImGui::InputText(
"UTF-8 input", buf, IM_ARRAYSIZE(buf));
1372 if (ImGui::TreeNode(
"Images"))
1374 ImGuiIO& io = ImGui::GetIO();
1376 "Below we are displaying the font texture (which is the only texture we have access to in this demo). "
1377 "Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. "
1378 "Hover the texture for a zoomed view!");
1395 ImTextureID my_tex_id = io.Fonts->TexID;
1396 float my_tex_w = (float)io.Fonts->TexWidth;
1397 float my_tex_h = (float)io.Fonts->TexHeight;
1399 static bool use_text_color_for_tint =
false;
1400 ImGui::Checkbox(
"Use Text Color for Tint", &use_text_color_for_tint);
1401 ImGui::Text(
"%.0fx%.0f", my_tex_w, my_tex_h);
1402 ImVec2 pos = ImGui::GetCursorScreenPos();
1403 ImVec2 uv_min = ImVec2(0.0f, 0.0f);
1404 ImVec2 uv_max = ImVec2(1.0f, 1.0f);
1405 ImVec4 tint_col = use_text_color_for_tint ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : ImVec4(1.0f, 1.0f, 1.0f, 1.0f);
1406 ImVec4 border_col = ImGui::GetStyleColorVec4(ImGuiCol_Border);
1407 ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col);
1408 if (ImGui::BeginItemTooltip())
1410 float region_sz = 32.0f;
1411 float region_x = io.MousePos.x - pos.x - region_sz * 0.5f;
1412 float region_y = io.MousePos.y - pos.y - region_sz * 0.5f;
1414 if (region_x < 0.0f) { region_x = 0.0f; }
1415 else if (region_x > my_tex_w - region_sz) { region_x = my_tex_w - region_sz; }
1416 if (region_y < 0.0f) { region_y = 0.0f; }
1417 else if (region_y > my_tex_h - region_sz) { region_y = my_tex_h - region_sz; }
1418 ImGui::Text(
"Min: (%.2f, %.2f)", region_x, region_y);
1419 ImGui::Text(
"Max: (%.2f, %.2f)", region_x + region_sz, region_y + region_sz);
1420 ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h);
1421 ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h);
1422 ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, tint_col, border_col);
1423 ImGui::EndTooltip();
1428 ImGui::TextWrapped(
"And now some textured buttons..");
1429 static int pressed_count = 0;
1430 for (
int i = 0; i < 8; i++)
1437 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(i - 1.0f, i - 1.0f));
1438 ImVec2
size = ImVec2(32.0f, 32.0f);
1439 ImVec2 uv0 = ImVec2(0.0f, 0.0f);
1440 ImVec2 uv1 = ImVec2(32.0f / my_tex_w, 32.0f / my_tex_h);
1441 ImVec4 bg_col = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
1442 ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f);
1443 if (ImGui::ImageButton(
"", my_tex_id, size, uv0, uv1, bg_col, tint_col))
1446 ImGui::PopStyleVar();
1451 ImGui::Text(
"Pressed %d times.", pressed_count);
1456 if (ImGui::TreeNode(
"Combo"))
1460 static ImGuiComboFlags flags = 0;
1461 ImGui::CheckboxFlags(
"ImGuiComboFlags_PopupAlignLeft", &flags, ImGuiComboFlags_PopupAlignLeft);
1462 ImGui::SameLine(); HelpMarker(
"Only makes a difference if the popup is larger than the combo");
1463 if (ImGui::CheckboxFlags(
"ImGuiComboFlags_NoArrowButton", &flags, ImGuiComboFlags_NoArrowButton))
1464 flags &= ~ImGuiComboFlags_NoPreview;
1465 if (ImGui::CheckboxFlags(
"ImGuiComboFlags_NoPreview", &flags, ImGuiComboFlags_NoPreview))
1466 flags &= ~(ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_WidthFitPreview);
1467 if (ImGui::CheckboxFlags(
"ImGuiComboFlags_WidthFitPreview", &flags, ImGuiComboFlags_WidthFitPreview))
1468 flags &= ~ImGuiComboFlags_NoPreview;
1471 if (ImGui::CheckboxFlags(
"ImGuiComboFlags_HeightSmall", &flags, ImGuiComboFlags_HeightSmall))
1472 flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightSmall);
1473 if (ImGui::CheckboxFlags(
"ImGuiComboFlags_HeightRegular", &flags, ImGuiComboFlags_HeightRegular))
1474 flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightRegular);
1475 if (ImGui::CheckboxFlags(
"ImGuiComboFlags_HeightLargest", &flags, ImGuiComboFlags_HeightLargest))
1476 flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightLargest);
1481 const char* items[] = {
"AAAA",
"BBBB",
"CCCC",
"DDDD",
"EEEE",
"FFFF",
"GGGG",
"HHHH",
"IIII",
"JJJJ",
"KKKK",
"LLLLLLL",
"MMMM",
"OOOOOOO" };
1482 static int item_selected_idx = 0;
1485 const char* combo_preview_value = items[item_selected_idx];
1487 if (ImGui::BeginCombo(
"combo 1", combo_preview_value, flags))
1489 for (
int n = 0; n < IM_ARRAYSIZE(items); n++)
1491 const bool is_selected = (item_selected_idx == n);
1492 if (ImGui::Selectable(items[n], is_selected))
1493 item_selected_idx = n;
1497 ImGui::SetItemDefaultFocus();
1503 ImGui::SeparatorText(
"One-liner variants");
1504 HelpMarker(
"Flags above don't apply to this section.");
1508 static int item_current_2 = 0;
1509 ImGui::Combo(
"combo 2 (one-liner)", &item_current_2,
"aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
1513 static int item_current_3 = -1;
1514 ImGui::Combo(
"combo 3 (array)", &item_current_3, items, IM_ARRAYSIZE(items));
1517 static int item_current_4 = 0;
1518 ImGui::Combo(
"combo 4 (function)", &item_current_4, [](
void* data,
int n) {
return ((
const char**)data)[n]; }, items, IM_ARRAYSIZE(items));
1524 if (ImGui::TreeNode(
"List boxes"))
1534 const char* items[] = {
"AAAA",
"BBBB",
"CCCC",
"DDDD",
"EEEE",
"FFFF",
"GGGG",
"HHHH",
"IIII",
"JJJJ",
"KKKK",
"LLLLLLL",
"MMMM",
"OOOOOOO" };
1535 static int item_selected_idx = 0;
1537 static bool item_highlight =
false;
1538 int item_highlighted_idx = -1;
1539 ImGui::Checkbox(
"Highlight hovered item in second listbox", &item_highlight);
1541 if (ImGui::BeginListBox(
"listbox 1"))
1543 for (
int n = 0; n < IM_ARRAYSIZE(items); n++)
1545 const bool is_selected = (item_selected_idx == n);
1546 if (ImGui::Selectable(items[n], is_selected))
1547 item_selected_idx = n;
1549 if (item_highlight && ImGui::IsItemHovered())
1550 item_highlighted_idx = n;
1554 ImGui::SetItemDefaultFocus();
1556 ImGui::EndListBox();
1558 ImGui::SameLine(); HelpMarker(
"Here we are sharing selection state between both boxes.");
1561 ImGui::Text(
"Full-width:");
1562 if (ImGui::BeginListBox(
"##listbox 2", ImVec2(-FLT_MIN, 5 * ImGui::GetTextLineHeightWithSpacing())))
1564 for (
int n = 0; n < IM_ARRAYSIZE(items); n++)
1566 bool is_selected = (item_selected_idx == n);
1567 ImGuiSelectableFlags flags = (item_highlighted_idx == n) ? ImGuiSelectableFlags_Highlight : 0;
1568 if (ImGui::Selectable(items[n], is_selected, flags))
1569 item_selected_idx = n;
1573 ImGui::SetItemDefaultFocus();
1575 ImGui::EndListBox();
1583 if (ImGui::TreeNode(
"Selectables"))
1592 if (ImGui::TreeNode(
"Basic"))
1594 static bool selection[5] = {
false,
true,
false,
false };
1595 ImGui::Selectable(
"1. I am selectable", &selection[0]);
1596 ImGui::Selectable(
"2. I am selectable", &selection[1]);
1597 ImGui::Selectable(
"3. I am selectable", &selection[2]);
1598 if (ImGui::Selectable(
"4. I am double clickable", selection[3], ImGuiSelectableFlags_AllowDoubleClick))
1599 if (ImGui::IsMouseDoubleClicked(0))
1600 selection[3] = !selection[3];
1605 if (ImGui::TreeNode(
"Rendering more items on the same line"))
1609 static bool selected[3] = {
false,
false,
false };
1610 ImGui::SetNextItemAllowOverlap(); ImGui::Selectable(
"main.c", &selected[0]); ImGui::SameLine(); ImGui::SmallButton(
"Link 1");
1611 ImGui::SetNextItemAllowOverlap(); ImGui::Selectable(
"Hello.cpp", &selected[1]); ImGui::SameLine(); ImGui::SmallButton(
"Link 2");
1612 ImGui::SetNextItemAllowOverlap(); ImGui::Selectable(
"Hello.h", &selected[2]); ImGui::SameLine(); ImGui::SmallButton(
"Link 3");
1617 if (ImGui::TreeNode(
"In Tables"))
1619 static bool selected[10] = {};
1621 if (ImGui::BeginTable(
"split1", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders))
1623 for (
int i = 0; i < 10; i++)
1626 sprintf(label,
"Item %d", i);
1627 ImGui::TableNextColumn();
1628 ImGui::Selectable(label, &selected[i]);
1633 if (ImGui::BeginTable(
"split2", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders))
1635 for (
int i = 0; i < 10; i++)
1638 sprintf(label,
"Item %d", i);
1639 ImGui::TableNextRow();
1640 ImGui::TableNextColumn();
1641 ImGui::Selectable(label, &selected[i], ImGuiSelectableFlags_SpanAllColumns);
1642 ImGui::TableNextColumn();
1643 ImGui::Text(
"Some other contents");
1644 ImGui::TableNextColumn();
1645 ImGui::Text(
"123456");
1653 if (ImGui::TreeNode(
"Grid"))
1655 static char selected[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } };
1658 const float time = (float)ImGui::GetTime();
1659 const bool winning_state = memchr(selected, 0,
sizeof(selected)) == NULL;
1661 ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f + 0.5f * cosf(time * 2.0f), 0.5f + 0.5f * sinf(time * 3.0f)));
1663 for (
int y = 0; y < 4; y++)
1664 for (
int x = 0; x < 4; x++)
1668 ImGui::PushID(y * 4 + x);
1669 if (ImGui::Selectable(
"Sailor", selected[y][x] != 0, 0, ImVec2(50, 50)))
1672 selected[y][x] ^= 1;
1673 if (x > 0) { selected[y][x - 1] ^= 1; }
1674 if (x < 3) { selected[y][x + 1] ^= 1; }
1675 if (y > 0) { selected[y - 1][x] ^= 1; }
1676 if (y < 3) { selected[y + 1][x] ^= 1; }
1682 ImGui::PopStyleVar();
1686 if (ImGui::TreeNode(
"Alignment"))
1689 "By default, Selectables uses style.SelectableTextAlign but it can be overridden on a per-item "
1690 "basis using PushStyleVar(). You'll probably want to always keep your default situation to "
1691 "left-align otherwise it becomes difficult to layout multiple items on a same line");
1692 static bool selected[3 * 3] = {
true,
false,
true,
false,
true,
false,
true,
false,
true };
1693 for (
int y = 0; y < 3; y++)
1695 for (
int x = 0; x < 3; x++)
1697 ImVec2 alignment = ImVec2((
float)x / 2.0f, (
float)y / 2.0f);
1699 sprintf(name,
"(%.1f,%.1f)", alignment.x, alignment.y);
1700 if (x > 0) ImGui::SameLine();
1701 ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment);
1702 ImGui::Selectable(name, &selected[3 * y + x], ImGuiSelectableFlags_None, ImVec2(80, 80));
1703 ImGui::PopStyleVar();
1711 ShowDemoWindowMultiSelect(demo_data);
1716 if (ImGui::TreeNode(
"Text Input"))
1719 if (ImGui::TreeNode(
"Multi-line Text Input"))
1723 static char text[1024 * 16] =
1725 " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n"
1726 " the hexadecimal encoding of one offending instruction,\n"
1727 " more formally, the invalid operand with locked CMPXCHG8B\n"
1728 " instruction bug, is a design flaw in the majority of\n"
1729 " Intel Pentium, Pentium MMX, and Pentium OverDrive\n"
1730 " processors (all in the P5 microarchitecture).\n"
1733 "\tlock cmpxchg8b eax\n";
1735 static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput;
1736 HelpMarker(
"You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include <string> in here)");
1737 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly);
1738 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput);
1739 ImGui::SameLine(); HelpMarker(
"When _AllowTabInput is set, passing through the widget with Tabbing doesn't automatically activate it, in order to also cycling through subsequent widgets.");
1740 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine);
1741 ImGui::InputTextMultiline(
"##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags);
1746 if (ImGui::TreeNode(
"Filtered Text Input"))
1751 static int FilterCasingSwap(ImGuiInputTextCallbackData* data)
1753 if (data->EventChar >=
'a' && data->EventChar <=
'z') { data->EventChar -=
'a' -
'A'; }
1754 else if (data->EventChar >=
'A' && data->EventChar <=
'Z') { data->EventChar +=
'a' -
'A'; }
1759 static int FilterImGuiLetters(ImGuiInputTextCallbackData* data)
1761 if (data->EventChar < 256 && strchr(
"imgui", (
char)data->EventChar))
1767 static char buf1[32] =
""; ImGui::InputText(
"default", buf1, 32);
1768 static char buf2[32] =
""; ImGui::InputText(
"decimal", buf2, 32, ImGuiInputTextFlags_CharsDecimal);
1769 static char buf3[32] =
""; ImGui::InputText(
"hexadecimal", buf3, 32, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase);
1770 static char buf4[32] =
""; ImGui::InputText(
"uppercase", buf4, 32, ImGuiInputTextFlags_CharsUppercase);
1771 static char buf5[32] =
""; ImGui::InputText(
"no blank", buf5, 32, ImGuiInputTextFlags_CharsNoBlank);
1772 static char buf6[32] =
""; ImGui::InputText(
"casing swap", buf6, 32, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterCasingSwap);
1773 static char buf7[32] =
""; ImGui::InputText(
"\"imgui\"", buf7, 32, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters);
1778 if (ImGui::TreeNode(
"Password Input"))
1780 static char password[64] =
"password123";
1781 ImGui::InputText(
"password", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password);
1782 ImGui::SameLine(); HelpMarker(
"Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
1783 ImGui::InputTextWithHint(
"password (w/ hint)",
"<password>", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password);
1784 ImGui::InputText(
"password (clear)", password, IM_ARRAYSIZE(password));
1789 if (ImGui::TreeNode(
"Completion, History, Edit Callbacks"))
1793 static int MyCallback(ImGuiInputTextCallbackData* data)
1795 if (data->EventFlag == ImGuiInputTextFlags_CallbackCompletion)
1797 data->InsertChars(data->CursorPos,
"..");
1799 else if (data->EventFlag == ImGuiInputTextFlags_CallbackHistory)
1801 if (data->EventKey == ImGuiKey_UpArrow)
1803 data->DeleteChars(0, data->BufTextLen);
1804 data->InsertChars(0,
"Pressed Up!");
1807 else if (data->EventKey == ImGuiKey_DownArrow)
1809 data->DeleteChars(0, data->BufTextLen);
1810 data->InsertChars(0,
"Pressed Down!");
1814 else if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit)
1817 char c = data->Buf[0];
1818 if ((c >=
'a' && c <=
'z') || (c >=
'A' && c <=
'Z')) data->Buf[0] ^= 32;
1819 data->BufDirty =
true;
1822 int* p_int = (
int*)data->UserData;
1823 *p_int = *p_int + 1;
1828 static char buf1[64];
1829 ImGui::InputText(
"Completion", buf1, 64, ImGuiInputTextFlags_CallbackCompletion, Funcs::MyCallback);
1830 ImGui::SameLine(); HelpMarker(
1831 "Here we append \"..\" each time Tab is pressed. "
1832 "See 'Examples>Console' for a more meaningful demonstration of using this callback.");
1834 static char buf2[64];
1835 ImGui::InputText(
"History", buf2, 64, ImGuiInputTextFlags_CallbackHistory, Funcs::MyCallback);
1836 ImGui::SameLine(); HelpMarker(
1837 "Here we replace and select text each time Up/Down are pressed. "
1838 "See 'Examples>Console' for a more meaningful demonstration of using this callback.");
1840 static char buf3[64];
1841 static int edit_count = 0;
1842 ImGui::InputText(
"Edit", buf3, 64, ImGuiInputTextFlags_CallbackEdit, Funcs::MyCallback, (
void*)&edit_count);
1843 ImGui::SameLine(); HelpMarker(
1844 "Here we toggle the casing of the first character on every edit + count edits.");
1845 ImGui::SameLine(); ImGui::Text(
"(%d)", edit_count);
1851 if (ImGui::TreeNode(
"Resize Callback"))
1857 "Using ImGuiInputTextFlags_CallbackResize to wire your custom string type to InputText().\n\n"
1858 "See misc/cpp/imgui_stdlib.h for an implementation of this for std::string.");
1861 static int MyResizeCallback(ImGuiInputTextCallbackData* data)
1863 if (data->EventFlag == ImGuiInputTextFlags_CallbackResize)
1865 ImVector<char>* my_str = (ImVector<char>*)data->UserData;
1866 IM_ASSERT(my_str->begin() == data->Buf);
1867 my_str->resize(data->BufSize);
1868 data->Buf = my_str->begin();
1875 static bool MyInputTextMultiline(
const char* label, ImVector<char>* my_str,
const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0)
1877 IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
1878 return ImGui::InputTextMultiline(label, my_str->begin(), (
size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (
void*)my_str);
1885 static ImVector<char> my_str;
1887 my_str.push_back(0);
1888 Funcs::MyInputTextMultiline(
"##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16));
1889 ImGui::Text(
"Data: %p\nSize: %d\nCapacity: %d", (
void*)my_str.begin(), my_str.size(), my_str.capacity());
1894 if (ImGui::TreeNode(
"Eliding, Alignment"))
1896 static char buf1[128] =
"/path/to/some/folder/with/long/filename.cpp";
1897 static ImGuiInputTextFlags flags = ImGuiInputTextFlags_ElideLeft;
1898 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_ElideLeft", &flags, ImGuiInputTextFlags_ElideLeft);
1899 ImGui::InputText(
"Path", buf1, IM_ARRAYSIZE(buf1), flags);
1904 if (ImGui::TreeNode(
"Miscellaneous"))
1906 static char buf1[16];
1907 static ImGuiInputTextFlags flags = ImGuiInputTextFlags_EscapeClearsAll;
1908 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_EscapeClearsAll", &flags, ImGuiInputTextFlags_EscapeClearsAll);
1909 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly);
1910 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_NoUndoRedo", &flags, ImGuiInputTextFlags_NoUndoRedo);
1911 ImGui::InputText(
"Hello", buf1, IM_ARRAYSIZE(buf1), flags);
1920 if (ImGui::TreeNode(
"Tabs"))
1923 if (ImGui::TreeNode(
"Basic"))
1925 ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None;
1926 if (ImGui::BeginTabBar(
"MyTabBar", tab_bar_flags))
1928 if (ImGui::BeginTabItem(
"Avocado"))
1930 ImGui::Text(
"This is the Avocado tab!\nblah blah blah blah blah");
1931 ImGui::EndTabItem();
1933 if (ImGui::BeginTabItem(
"Broccoli"))
1935 ImGui::Text(
"This is the Broccoli tab!\nblah blah blah blah blah");
1936 ImGui::EndTabItem();
1938 if (ImGui::BeginTabItem(
"Cucumber"))
1940 ImGui::Text(
"This is the Cucumber tab!\nblah blah blah blah blah");
1941 ImGui::EndTabItem();
1950 if (ImGui::TreeNode(
"Advanced & Close Button"))
1953 static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable;
1954 ImGui::CheckboxFlags(
"ImGuiTabBarFlags_Reorderable", &tab_bar_flags, ImGuiTabBarFlags_Reorderable);
1955 ImGui::CheckboxFlags(
"ImGuiTabBarFlags_AutoSelectNewTabs", &tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs);
1956 ImGui::CheckboxFlags(
"ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton);
1957 ImGui::CheckboxFlags(
"ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", &tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton);
1958 ImGui::CheckboxFlags(
"ImGuiTabBarFlags_DrawSelectedOverline", &tab_bar_flags, ImGuiTabBarFlags_DrawSelectedOverline);
1959 if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0)
1960 tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_;
1961 if (ImGui::CheckboxFlags(
"ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown))
1962 tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown);
1963 if (ImGui::CheckboxFlags(
"ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll))
1964 tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll);
1967 ImGui::AlignTextToFramePadding();
1968 ImGui::Text(
"Opened:");
1969 const char* names[4] = {
"Artichoke",
"Beetroot",
"Celery",
"Daikon" };
1970 static bool opened[4] = {
true,
true,
true,
true };
1971 for (
int n = 0; n < IM_ARRAYSIZE(opened); n++)
1974 ImGui::Checkbox(names[n], &opened[n]);
1979 if (ImGui::BeginTabBar(
"MyTabBar", tab_bar_flags))
1981 for (
int n = 0; n < IM_ARRAYSIZE(opened); n++)
1982 if (opened[n] && ImGui::BeginTabItem(names[n], &opened[n], ImGuiTabItemFlags_None))
1984 ImGui::Text(
"This is the %s tab!", names[n]);
1986 ImGui::Text(
"I am an odd tab.");
1987 ImGui::EndTabItem();
1996 if (ImGui::TreeNode(
"TabItemButton & Leading/Trailing flags"))
1998 static ImVector<int> active_tabs;
1999 static int next_tab_id = 0;
2000 if (next_tab_id == 0)
2001 for (
int i = 0; i < 3; i++)
2002 active_tabs.push_back(next_tab_id++);
2007 static bool show_leading_button =
true;
2008 static bool show_trailing_button =
true;
2009 ImGui::Checkbox(
"Show Leading TabItemButton()", &show_leading_button);
2010 ImGui::Checkbox(
"Show Trailing TabItemButton()", &show_trailing_button);
2013 static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyResizeDown;
2014 ImGui::CheckboxFlags(
"ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton);
2015 if (ImGui::CheckboxFlags(
"ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown))
2016 tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown);
2017 if (ImGui::CheckboxFlags(
"ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll))
2018 tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll);
2020 if (ImGui::BeginTabBar(
"MyTabBar", tab_bar_flags))
2023 if (show_leading_button)
2024 if (ImGui::TabItemButton(
"?", ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_NoTooltip))
2025 ImGui::OpenPopup(
"MyHelpMenu");
2026 if (ImGui::BeginPopup(
"MyHelpMenu"))
2028 ImGui::Selectable(
"Hello!");
2035 if (show_trailing_button)
2036 if (ImGui::TabItemButton(
"+", ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip))
2037 active_tabs.push_back(next_tab_id++);
2040 for (
int n = 0; n < active_tabs.Size; )
2044 snprintf(name, IM_ARRAYSIZE(name),
"%04d", active_tabs[n]);
2045 if (ImGui::BeginTabItem(name, &open, ImGuiTabItemFlags_None))
2047 ImGui::Text(
"This is the %s tab!", name);
2048 ImGui::EndTabItem();
2052 active_tabs.erase(active_tabs.Data + n);
2069 if (ImGui::TreeNode(
"Plotting"))
2071 static bool animate =
true;
2072 ImGui::Checkbox(
"Animate", &animate);
2075 static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
2076 ImGui::PlotLines(
"Frame Times", arr, IM_ARRAYSIZE(arr));
2077 ImGui::PlotHistogram(
"Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f));
2083 static float values[90] = {};
2084 static int values_offset = 0;
2085 static double refresh_time = 0.0;
2086 if (!animate || refresh_time == 0.0)
2087 refresh_time = ImGui::GetTime();
2088 while (refresh_time < ImGui::GetTime())
2090 static float phase = 0.0f;
2091 values[values_offset] = cosf(phase);
2092 values_offset = (values_offset + 1) % IM_ARRAYSIZE(values);
2093 phase += 0.10f * values_offset;
2094 refresh_time += 1.0f / 60.0f;
2100 float average = 0.0f;
2101 for (
int n = 0; n < IM_ARRAYSIZE(values); n++)
2102 average += values[n];
2103 average /= (float)IM_ARRAYSIZE(values);
2105 sprintf(overlay,
"avg %f", average);
2106 ImGui::PlotLines(
"Lines", values, IM_ARRAYSIZE(values), values_offset, overlay, -1.0f, 1.0f, ImVec2(0, 80.0f));
2114 static float Sin(
void*,
int i) {
return sinf(i * 0.1f); }
2115 static float Saw(
void*,
int i) {
return (i & 1) ? 1.0f : -1.0f; }
2117 static int func_type = 0, display_count = 70;
2118 ImGui::SeparatorText(
"Functions");
2119 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
2120 ImGui::Combo(
"func", &func_type,
"Sin\0Saw\0");
2122 ImGui::SliderInt(
"Sample count", &display_count, 1, 400);
2123 float (*func)(
void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw;
2124 ImGui::PlotLines(
"Lines##2", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80));
2125 ImGui::PlotHistogram(
"Histogram##2", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80));
2128 ImGui::Text(
"Need better plotting and graphing? Consider using ImPlot:");
2129 ImGui::TextLinkOpenURL(
"https://github.com/epezent/implot");
2136 if (ImGui::TreeNode(
"Progress Bars"))
2139 static float progress = 0.0f, progress_dir = 1.0f;
2140 progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime;
2141 if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; }
2142 if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }
2146 ImGui::ProgressBar(progress, ImVec2(0.0f, 0.0f));
2147 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
2148 ImGui::Text(
"Progress Bar");
2150 float progress_saturated =
IM_CLAMP(progress, 0.0f, 1.0f);
2152 sprintf(buf,
"%d/%d", (
int)(progress_saturated * 1753), 1753);
2153 ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf);
2157 ImGui::ProgressBar(-1.0f * (
float)ImGui::GetTime(), ImVec2(0.0f, 0.0f),
"Searching..");
2158 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
2159 ImGui::Text(
"Indeterminate");
2165 if (ImGui::TreeNode(
"Color/Picker Widgets"))
2167 static ImVec4 color = ImVec4(114.0f / 255.0f, 144.0f / 255.0f, 154.0f / 255.0f, 200.0f / 255.0f);
2169 static bool alpha_preview =
true;
2170 static bool alpha_half_preview =
false;
2171 static bool drag_and_drop =
true;
2172 static bool options_menu =
true;
2173 static bool hdr =
false;
2174 ImGui::SeparatorText(
"Options");
2175 ImGui::Checkbox(
"With Alpha Preview", &alpha_preview);
2176 ImGui::Checkbox(
"With Half Alpha Preview", &alpha_half_preview);
2177 ImGui::Checkbox(
"With Drag and Drop", &drag_and_drop);
2178 ImGui::Checkbox(
"With Options Menu", &options_menu); ImGui::SameLine(); HelpMarker(
"Right-click on the individual color widget to show options.");
2179 ImGui::Checkbox(
"With HDR", &hdr); ImGui::SameLine(); HelpMarker(
"Currently all this does is to lift the 0..1 limits on dragging widgets.");
2180 ImGuiColorEditFlags misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions);
2183 ImGui::SeparatorText(
"Inline color editor");
2184 ImGui::Text(
"Color widget:");
2185 ImGui::SameLine(); HelpMarker(
2186 "Click on the color square to open a color picker.\n"
2187 "CTRL+click on individual component to input value.\n");
2188 ImGui::ColorEdit3(
"MyColor##1", (
float*)&color, misc_flags);
2191 ImGui::Text(
"Color widget HSV with Alpha:");
2192 ImGui::ColorEdit4(
"MyColor##2", (
float*)&color, ImGuiColorEditFlags_DisplayHSV | misc_flags);
2195 ImGui::Text(
"Color widget with Float Display:");
2196 ImGui::ColorEdit4(
"MyColor##2f", (
float*)&color, ImGuiColorEditFlags_Float | misc_flags);
2199 ImGui::Text(
"Color button with Picker:");
2200 ImGui::SameLine(); HelpMarker(
2201 "With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\n"
2202 "With the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only "
2203 "be used for the tooltip and picker popup.");
2204 ImGui::ColorEdit4(
"MyColor##3", (
float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags);
2207 ImGui::Text(
"Color button with Custom Picker Popup:");
2210 static bool saved_palette_init =
true;
2211 static ImVec4 saved_palette[32] = {};
2212 if (saved_palette_init)
2214 for (
int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)
2216 ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f,
2217 saved_palette[n].x, saved_palette[n].y, saved_palette[n].z);
2218 saved_palette[n].w = 1.0f;
2220 saved_palette_init =
false;
2223 static ImVec4 backup_color;
2224 bool open_popup = ImGui::ColorButton(
"MyColor##3b", color, misc_flags);
2225 ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x);
2226 open_popup |= ImGui::Button(
"Palette");
2229 ImGui::OpenPopup(
"mypicker");
2230 backup_color = color;
2232 if (ImGui::BeginPopup(
"mypicker"))
2234 ImGui::Text(
"MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!");
2236 ImGui::ColorPicker4(
"##picker", (
float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview);
2239 ImGui::BeginGroup();
2240 ImGui::Text(
"Current");
2241 ImGui::ColorButton(
"##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40));
2242 ImGui::Text(
"Previous");
2243 if (ImGui::ColorButton(
"##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40)))
2244 color = backup_color;
2246 ImGui::Text(
"Palette");
2247 for (
int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)
2251 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
2253 ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip;
2254 if (ImGui::ColorButton(
"##palette", saved_palette[n], palette_button_flags, ImVec2(20, 20)))
2255 color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w);
2259 if (ImGui::BeginDragDropTarget())
2261 if (
const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
2262 memcpy((
float*)&saved_palette[n], payload->Data,
sizeof(
float) * 3);
2263 if (
const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F))
2264 memcpy((
float*)&saved_palette[n], payload->Data,
sizeof(
float) * 4);
2265 ImGui::EndDragDropTarget();
2275 ImGui::Text(
"Color button only:");
2276 static bool no_border =
false;
2277 ImGui::Checkbox(
"ImGuiColorEditFlags_NoBorder", &no_border);
2278 ImGui::ColorButton(
"MyColor##3c", *(ImVec4*)&color, misc_flags | (no_border ? ImGuiColorEditFlags_NoBorder : 0), ImVec2(80, 80));
2281 ImGui::SeparatorText(
"Color picker");
2282 static bool alpha =
true;
2283 static bool alpha_bar =
true;
2284 static bool side_preview =
true;
2285 static bool ref_color =
false;
2286 static ImVec4 ref_color_v(1.0f, 0.0f, 1.0f, 0.5f);
2287 static int display_mode = 0;
2288 static int picker_mode = 0;
2289 ImGui::Checkbox(
"With Alpha", &alpha);
2290 ImGui::Checkbox(
"With Alpha Bar", &alpha_bar);
2291 ImGui::Checkbox(
"With Side Preview", &side_preview);
2295 ImGui::Checkbox(
"With Ref Color", &ref_color);
2299 ImGui::ColorEdit4(
"##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags);
2302 ImGui::Combo(
"Display Mode", &display_mode,
"Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0");
2303 ImGui::SameLine(); HelpMarker(
2304 "ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, "
2305 "but the user can change it with a right-click on those inputs.\n\nColorPicker defaults to displaying RGB+HSV+Hex "
2306 "if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions().");
2307 ImGui::SameLine(); HelpMarker(
"When not specified explicitly (Auto/Current mode), user can right-click the picker to change mode.");
2308 ImGuiColorEditFlags flags = misc_flags;
2309 if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha;
2310 if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar;
2311 if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview;
2312 if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar;
2313 if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel;
2314 if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs;
2315 if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB;
2316 if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV;
2317 if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex;
2318 ImGui::ColorPicker4(
"MyColor##4", (
float*)&color, flags, ref_color ? &ref_color_v.x : NULL);
2320 ImGui::Text(
"Set defaults in code:");
2321 ImGui::SameLine(); HelpMarker(
2322 "SetColorEditOptions() is designed to allow you to set boot-time default.\n"
2323 "We don't have Push/Pop functions because you can force options on a per-widget basis if needed,"
2324 "and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid"
2325 "encouraging you to persistently save values that aren't forward-compatible.");
2326 if (ImGui::Button(
"Default: Uint8 + HSV + Hue Bar"))
2327 ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar);
2328 if (ImGui::Button(
"Default: Float + HDR + Hue Wheel"))
2329 ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel);
2333 ImGui::Text(
"Both types:");
2334 float w = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.y) * 0.40f;
2335 ImGui::SetNextItemWidth(w);
2336 ImGui::ColorPicker3(
"##MyColor##5", (
float*)&color, ImGuiColorEditFlags_PickerHueBar | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha);
2338 ImGui::SetNextItemWidth(w);
2339 ImGui::ColorPicker3(
"##MyColor##6", (
float*)&color, ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha);
2342 static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f);
2344 ImGui::Text(
"HSV encoded colors");
2345 ImGui::SameLine(); HelpMarker(
2346 "By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV"
2347 "allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the"
2348 "added benefit that you can manipulate hue values with the picker even when saturation or value are zero.");
2349 ImGui::Text(
"Color widget with InputHSV:");
2350 ImGui::ColorEdit4(
"HSV shown as RGB##1", (
float*)&color_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float);
2351 ImGui::ColorEdit4(
"HSV shown as HSV##1", (
float*)&color_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float);
2352 ImGui::DragFloat4(
"Raw HSV values", (
float*)&color_hsv, 0.01f, 0.0f, 1.0f);
2358 if (ImGui::TreeNode(
"Drag/Slider Flags"))
2361 static ImGuiSliderFlags flags = ImGuiSliderFlags_None;
2362 ImGui::CheckboxFlags(
"ImGuiSliderFlags_AlwaysClamp", &flags, ImGuiSliderFlags_AlwaysClamp);
2363 ImGui::CheckboxFlags(
"ImGuiSliderFlags_ClampOnInput", &flags, ImGuiSliderFlags_ClampOnInput);
2364 ImGui::SameLine(); HelpMarker(
"Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds.");
2365 ImGui::CheckboxFlags(
"ImGuiSliderFlags_ClampZeroRange", &flags, ImGuiSliderFlags_ClampZeroRange);
2366 ImGui::SameLine(); HelpMarker(
"Clamp even if min==max==0.0f. Otherwise DragXXX functions don't clamp.");
2367 ImGui::CheckboxFlags(
"ImGuiSliderFlags_Logarithmic", &flags, ImGuiSliderFlags_Logarithmic);
2368 ImGui::SameLine(); HelpMarker(
"Enable logarithmic editing (more precision for small values).");
2369 ImGui::CheckboxFlags(
"ImGuiSliderFlags_NoRoundToFormat", &flags, ImGuiSliderFlags_NoRoundToFormat);
2370 ImGui::SameLine(); HelpMarker(
"Disable rounding underlying value to match precision of the format string (e.g. %.3f values are rounded to those 3 digits).");
2371 ImGui::CheckboxFlags(
"ImGuiSliderFlags_NoInput", &flags, ImGuiSliderFlags_NoInput);
2372 ImGui::SameLine(); HelpMarker(
"Disable CTRL+Click or Enter key allowing to input text directly into the widget.");
2373 ImGui::CheckboxFlags(
"ImGuiSliderFlags_WrapAround", &flags, ImGuiSliderFlags_WrapAround);
2374 ImGui::SameLine(); HelpMarker(
"Enable wrapping around from max to min and from min to max (only supported by DragXXX() functions)");
2377 static float drag_f = 0.5f;
2378 static int drag_i = 50;
2379 ImGui::Text(
"Underlying float value: %f", drag_f);
2380 ImGui::DragFloat(
"DragFloat (0 -> 1)", &drag_f, 0.005f, 0.0f, 1.0f,
"%.3f", flags);
2381 ImGui::DragFloat(
"DragFloat (0 -> +inf)", &drag_f, 0.005f, 0.0f, FLT_MAX,
"%.3f", flags);
2382 ImGui::DragFloat(
"DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f,
"%.3f", flags);
2383 ImGui::DragFloat(
"DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX,
"%.3f", flags);
2386 ImGui::DragInt(
"DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100,
"%d", flags);
2389 static float slider_f = 0.5f;
2390 static int slider_i = 50;
2391 const ImGuiSliderFlags flags_for_sliders = flags & ~ImGuiSliderFlags_WrapAround;
2392 ImGui::Text(
"Underlying float value: %f", slider_f);
2393 ImGui::SliderFloat(
"SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f,
"%.3f", flags_for_sliders);
2394 ImGui::SliderInt(
"SliderInt (0 -> 100)", &slider_i, 0, 100,
"%d", flags_for_sliders);
2400 if (ImGui::TreeNode(
"Range Widgets"))
2403 static int begin_i = 100, end_i = 1000;
2404 ImGui::DragFloatRange2(
"range float", &
begin, &
end, 0.25f, 0.0f, 100.0f,
"Min: %.1f %%",
"Max: %.1f %%", ImGuiSliderFlags_AlwaysClamp);
2405 ImGui::DragIntRange2(
"range int", &begin_i, &end_i, 5, 0, 1000,
"Min: %d units",
"Max: %d units");
2406 ImGui::DragIntRange2(
"range int (no bounds)", &begin_i, &end_i, 5, 0, 0,
"Min: %d units",
"Max: %d units");
2411 if (ImGui::TreeNode(
"Data Types"))
2431 ImS64 LLONG_MIN = -9223372036854775807LL - 1;
2432 ImS64 LLONG_MAX = 9223372036854775807LL;
2433 ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1);
2435 const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127;
2436 const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255;
2437 const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767;
2438 const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535;
2439 const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2;
2440 const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2;
2441 const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2;
2442 const ImU64 u64_zero = 0, u64_one = 1, u64_fifty = 50, u64_min = 0, u64_max = ULLONG_MAX/2, u64_hi_a = ULLONG_MAX/2 - 100, u64_hi_b = ULLONG_MAX/2;
2443 const float f32_zero = 0.f, f32_one = 1.f, f32_lo_a = -10000000000.0f, f32_hi_a = +10000000000.0f;
2444 const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0;
2447 static char s8_v = 127;
2448 static ImU8 u8_v = 255;
2449 static short s16_v = 32767;
2450 static ImU16 u16_v = 65535;
2451 static ImS32 s32_v = -1;
2452 static ImU32 u32_v = (ImU32)-1;
2453 static ImS64 s64_v = -1;
2454 static ImU64 u64_v = (ImU64)-1;
2455 static float f32_v = 0.123f;
2456 static double f64_v = 90000.01234567890123456789;
2458 const float drag_speed = 0.2f;
2459 static bool drag_clamp =
false;
2461 ImGui::SeparatorText(
"Drags");
2462 ImGui::Checkbox(
"Clamp integers to 0..50", &drag_clamp);
2463 ImGui::SameLine(); HelpMarker(
2464 "As with every widget in dear imgui, we never modify values unless there is a user interaction.\n"
2465 "You can override the clamping limits by using CTRL+Click to input a value.");
2466 ImGui::DragScalar(
"drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL);
2467 ImGui::DragScalar(
"drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL,
"%u ms");
2468 ImGui::DragScalar(
"drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL);
2469 ImGui::DragScalar(
"drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL,
"%u ms");
2470 ImGui::DragScalar(
"drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL);
2471 ImGui::DragScalar(
"drag s32 hex", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL,
"0x%08X");
2472 ImGui::DragScalar(
"drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL,
"%u ms");
2473 ImGui::DragScalar(
"drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL);
2474 ImGui::DragScalar(
"drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL);
2475 ImGui::DragScalar(
"drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one,
"%f");
2476 ImGui::DragScalar(
"drag float log", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one,
"%f", ImGuiSliderFlags_Logarithmic);
2477 ImGui::DragScalar(
"drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL,
"%.10f grams");
2478 ImGui::DragScalar(
"drag double log",ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one,
"0 < %.10f < 1", ImGuiSliderFlags_Logarithmic);
2481 ImGui::SeparatorText(
"Sliders");
2482 ImGui::SliderScalar(
"slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max,
"%d");
2483 ImGui::SliderScalar(
"slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max,
"%u");
2484 ImGui::SliderScalar(
"slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max,
"%d");
2485 ImGui::SliderScalar(
"slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max,
"%u");
2486 ImGui::SliderScalar(
"slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,
"%d");
2487 ImGui::SliderScalar(
"slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b,
"%d");
2488 ImGui::SliderScalar(
"slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max,
"%d");
2489 ImGui::SliderScalar(
"slider s32 hex", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,
"0x%04X");
2490 ImGui::SliderScalar(
"slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,
"%u");
2491 ImGui::SliderScalar(
"slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b,
"%u");
2492 ImGui::SliderScalar(
"slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max,
"%u");
2493 ImGui::SliderScalar(
"slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,
"%" PRId64);
2494 ImGui::SliderScalar(
"slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b,
"%" PRId64);
2495 ImGui::SliderScalar(
"slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max,
"%" PRId64);
2496 ImGui::SliderScalar(
"slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,
"%" PRIu64 " ms");
2497 ImGui::SliderScalar(
"slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b,
"%" PRIu64 " ms");
2498 ImGui::SliderScalar(
"slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max,
"%" PRIu64 " ms");
2499 ImGui::SliderScalar(
"slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one);
2500 ImGui::SliderScalar(
"slider float low log", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one,
"%.10f", ImGuiSliderFlags_Logarithmic);
2501 ImGui::SliderScalar(
"slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a,
"%e");
2502 ImGui::SliderScalar(
"slider double low", ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one,
"%.10f grams");
2503 ImGui::SliderScalar(
"slider double low log",ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one,
"%.10f", ImGuiSliderFlags_Logarithmic);
2504 ImGui::SliderScalar(
"slider double high", ImGuiDataType_Double, &f64_v, &f64_lo_a, &f64_hi_a,
"%e grams");
2506 ImGui::SeparatorText(
"Sliders (reverse)");
2507 ImGui::SliderScalar(
"slider s8 reverse", ImGuiDataType_S8, &s8_v, &s8_max, &s8_min,
"%d");
2508 ImGui::SliderScalar(
"slider u8 reverse", ImGuiDataType_U8, &u8_v, &u8_max, &u8_min,
"%u");
2509 ImGui::SliderScalar(
"slider s32 reverse", ImGuiDataType_S32, &s32_v, &s32_fifty, &s32_zero,
"%d");
2510 ImGui::SliderScalar(
"slider u32 reverse", ImGuiDataType_U32, &u32_v, &u32_fifty, &u32_zero,
"%u");
2511 ImGui::SliderScalar(
"slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero,
"%" PRId64);
2512 ImGui::SliderScalar(
"slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero,
"%" PRIu64 " ms");
2515 static bool inputs_step =
true;
2516 static ImGuiInputTextFlags flags = ImGuiInputTextFlags_None;
2517 ImGui::SeparatorText(
"Inputs");
2518 ImGui::Checkbox(
"Show step buttons", &inputs_step);
2519 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly);
2520 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_ParseEmptyRefVal", &flags, ImGuiInputTextFlags_ParseEmptyRefVal);
2521 ImGui::CheckboxFlags(
"ImGuiInputTextFlags_DisplayEmptyRefVal", &flags, ImGuiInputTextFlags_DisplayEmptyRefVal);
2522 ImGui::InputScalar(
"input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL,
"%d", flags);
2523 ImGui::InputScalar(
"input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL,
"%u", flags);
2524 ImGui::InputScalar(
"input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL,
"%d", flags);
2525 ImGui::InputScalar(
"input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL,
"%u", flags);
2526 ImGui::InputScalar(
"input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL,
"%d", flags);
2527 ImGui::InputScalar(
"input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL,
"%04X", flags);
2528 ImGui::InputScalar(
"input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL,
"%u", flags);
2529 ImGui::InputScalar(
"input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL,
"%08X", flags);
2530 ImGui::InputScalar(
"input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL, NULL, NULL, flags);
2531 ImGui::InputScalar(
"input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL, NULL, NULL, flags);
2532 ImGui::InputScalar(
"input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL, NULL, NULL, flags);
2533 ImGui::InputScalar(
"input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL, NULL, NULL, flags);
2539 if (ImGui::TreeNode(
"Multi-component Widgets"))
2541 static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f };
2542 static int vec4i[4] = { 1, 5, 100, 255 };
2544 ImGui::SeparatorText(
"2-wide");
2545 ImGui::InputFloat2(
"input float2", vec4f);
2546 ImGui::DragFloat2(
"drag float2", vec4f, 0.01f, 0.0f, 1.0f);
2547 ImGui::SliderFloat2(
"slider float2", vec4f, 0.0f, 1.0f);
2548 ImGui::InputInt2(
"input int2", vec4i);
2549 ImGui::DragInt2(
"drag int2", vec4i, 1, 0, 255);
2550 ImGui::SliderInt2(
"slider int2", vec4i, 0, 255);
2552 ImGui::SeparatorText(
"3-wide");
2553 ImGui::InputFloat3(
"input float3", vec4f);
2554 ImGui::DragFloat3(
"drag float3", vec4f, 0.01f, 0.0f, 1.0f);
2555 ImGui::SliderFloat3(
"slider float3", vec4f, 0.0f, 1.0f);
2556 ImGui::InputInt3(
"input int3", vec4i);
2557 ImGui::DragInt3(
"drag int3", vec4i, 1, 0, 255);
2558 ImGui::SliderInt3(
"slider int3", vec4i, 0, 255);
2560 ImGui::SeparatorText(
"4-wide");
2561 ImGui::InputFloat4(
"input float4", vec4f);
2562 ImGui::DragFloat4(
"drag float4", vec4f, 0.01f, 0.0f, 1.0f);
2563 ImGui::SliderFloat4(
"slider float4", vec4f, 0.0f, 1.0f);
2564 ImGui::InputInt4(
"input int4", vec4i);
2565 ImGui::DragInt4(
"drag int4", vec4i, 1, 0, 255);
2566 ImGui::SliderInt4(
"slider int4", vec4i, 0, 255);
2572 if (ImGui::TreeNode(
"Vertical Sliders"))
2574 const float spacing = 4;
2575 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, spacing));
2577 static int int_value = 0;
2578 ImGui::VSliderInt(
"##int", ImVec2(18, 160), &int_value, 0, 5);
2581 static float values[7] = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f };
2582 ImGui::PushID(
"set1");
2583 for (
int i = 0; i < 7; i++)
2585 if (i > 0) ImGui::SameLine();
2587 ImGui::PushStyleColor(ImGuiCol_FrameBg, (ImVec4)ImColor::HSV(i / 7.0f, 0.5f, 0.5f));
2588 ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.5f));
2589 ImGui::PushStyleColor(ImGuiCol_FrameBgActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.5f));
2590 ImGui::PushStyleColor(ImGuiCol_SliderGrab, (ImVec4)ImColor::HSV(i / 7.0f, 0.9f, 0.9f));
2591 ImGui::VSliderFloat(
"##v", ImVec2(18, 160), &values[i], 0.0f, 1.0f,
"");
2592 if (ImGui::IsItemActive() || ImGui::IsItemHovered())
2593 ImGui::SetTooltip(
"%.3f", values[i]);
2594 ImGui::PopStyleColor(4);
2600 ImGui::PushID(
"set2");
2601 static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f };
2603 const ImVec2 small_slider_size(18, (
float)(
int)((160.0f - (rows - 1) * spacing) / rows));
2604 for (
int nx = 0; nx < 4; nx++)
2606 if (nx > 0) ImGui::SameLine();
2607 ImGui::BeginGroup();
2608 for (
int ny = 0; ny < rows; ny++)
2610 ImGui::PushID(nx * rows + ny);
2611 ImGui::VSliderFloat(
"##v", small_slider_size, &values2[nx], 0.0f, 1.0f,
"");
2612 if (ImGui::IsItemActive() || ImGui::IsItemHovered())
2613 ImGui::SetTooltip(
"%.3f", values2[nx]);
2621 ImGui::PushID(
"set3");
2622 for (
int i = 0; i < 4; i++)
2624 if (i > 0) ImGui::SameLine();
2626 ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, 40);
2627 ImGui::VSliderFloat(
"##v", ImVec2(40, 160), &values[i], 0.0f, 1.0f,
"%.2f\nsec");
2628 ImGui::PopStyleVar();
2632 ImGui::PopStyleVar();
2637 if (ImGui::TreeNode(
"Drag and Drop"))
2640 if (ImGui::TreeNode(
"Drag and drop in standard widgets"))
2646 HelpMarker(
"You can drag from the color squares.");
2647 static float col1[3] = { 1.0f, 0.0f, 0.2f };
2648 static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
2649 ImGui::ColorEdit3(
"color 1", col1);
2650 ImGui::ColorEdit4(
"color 2", col2);
2655 if (ImGui::TreeNode(
"Drag and drop to copy/swap items"))
2663 static int mode = 0;
2664 if (ImGui::RadioButton(
"Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine();
2665 if (ImGui::RadioButton(
"Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine();
2666 if (ImGui::RadioButton(
"Swap", mode == Mode_Swap)) { mode = Mode_Swap; }
2667 static const char* names[9] =
2669 "Bobby",
"Beatrice",
"Betty",
2670 "Brianna",
"Barry",
"Bernard",
2671 "Bibi",
"Blaine",
"Bryn"
2673 for (
int n = 0; n < IM_ARRAYSIZE(names); n++)
2678 ImGui::Button(names[n], ImVec2(60, 60));
2681 if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None))
2684 ImGui::SetDragDropPayload(
"DND_DEMO_CELL", &n,
sizeof(
int));
2688 if (mode == Mode_Copy) { ImGui::Text(
"Copy %s", names[n]); }
2689 if (mode == Mode_Move) { ImGui::Text(
"Move %s", names[n]); }
2690 if (mode == Mode_Swap) { ImGui::Text(
"Swap %s", names[n]); }
2691 ImGui::EndDragDropSource();
2693 if (ImGui::BeginDragDropTarget())
2695 if (
const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(
"DND_DEMO_CELL"))
2697 IM_ASSERT(payload->DataSize ==
sizeof(
int));
2698 int payload_n = *(
const int*)payload->Data;
2699 if (mode == Mode_Copy)
2701 names[n] = names[payload_n];
2703 if (mode == Mode_Move)
2705 names[n] = names[payload_n];
2706 names[payload_n] =
"";
2708 if (mode == Mode_Swap)
2710 const char* tmp = names[n];
2711 names[n] = names[payload_n];
2712 names[payload_n] = tmp;
2715 ImGui::EndDragDropTarget();
2723 if (ImGui::TreeNode(
"Drag to reorder items (simple)"))
2728 ImGui::PushItemFlag(ImGuiItemFlags_AllowDuplicateId,
true);
2732 "We don't use the drag and drop api at all here! "
2733 "Instead we query when the item is held but not hovered, and order items accordingly.");
2734 static const char* item_names[] = {
"Item One",
"Item Two",
"Item Three",
"Item Four",
"Item Five" };
2735 for (
int n = 0; n < IM_ARRAYSIZE(item_names); n++)
2737 const char* item = item_names[n];
2738 ImGui::Selectable(item);
2740 if (ImGui::IsItemActive() && !ImGui::IsItemHovered())
2742 int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1);
2743 if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names))
2745 item_names[n] = item_names[n_next];
2746 item_names[n_next] = item;
2747 ImGui::ResetMouseDragDelta();
2752 ImGui::PopItemFlag();
2757 if (ImGui::TreeNode(
"Tooltip at target location"))
2759 for (
int n = 0; n < 2; n++)
2762 ImGui::Button(n ?
"drop here##1" :
"drop here##0");
2763 if (ImGui::BeginDragDropTarget())
2765 ImGuiDragDropFlags drop_target_flags = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoPreviewTooltip;
2766 if (
const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, drop_target_flags))
2769 ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed);
2770 ImGui::SetTooltip(
"Cannot drop here!");
2772 ImGui::EndDragDropTarget();
2776 static ImVec4 col4 = { 1.0f, 0.0f, 0.2f, 1.0f };
2778 ImGui::ColorButton(
"drag me", col4);
2788 if (ImGui::TreeNode(
"Querying Item Status (Edited/Active/Hovered etc.)"))
2791 const char* item_names[] =
2793 "Text",
"Button",
"Button (w/ repeat)",
"Checkbox",
"SliderFloat",
"InputText",
"InputTextMultiline",
"InputFloat",
2794 "InputFloat3",
"ColorEdit4",
"Selectable",
"MenuItem",
"TreeNode",
"TreeNode (w/ double-click)",
"Combo",
"ListBox"
2796 static int item_type = 4;
2797 static bool item_disabled =
false;
2798 ImGui::Combo(
"Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names));
2800 HelpMarker(
"Testing how various types of items are interacting with the IsItemXXX functions. Note that the bool return value of most ImGui function is generally equivalent to calling ImGui::IsItemHovered().");
2801 ImGui::Checkbox(
"Item Disabled", &item_disabled);
2805 static bool b =
false;
2806 static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f };
2807 static char str[16] = {};
2809 ImGui::BeginDisabled(
true);
2810 if (item_type == 0) { ImGui::Text(
"ITEM: Text"); }
2811 if (item_type == 1) { ret = ImGui::Button(
"ITEM: Button"); }
2812 if (item_type == 2) { ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat,
true); ret = ImGui::Button(
"ITEM: Button"); ImGui::PopItemFlag(); }
2813 if (item_type == 3) { ret = ImGui::Checkbox(
"ITEM: Checkbox", &b); }
2814 if (item_type == 4) { ret = ImGui::SliderFloat(
"ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); }
2815 if (item_type == 5) { ret = ImGui::InputText(
"ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); }
2816 if (item_type == 6) { ret = ImGui::InputTextMultiline(
"ITEM: InputTextMultiline", &str[0], IM_ARRAYSIZE(str)); }
2817 if (item_type == 7) { ret = ImGui::InputFloat(
"ITEM: InputFloat", col4f, 1.0f); }
2818 if (item_type == 8) { ret = ImGui::InputFloat3(
"ITEM: InputFloat3", col4f); }
2819 if (item_type == 9) { ret = ImGui::ColorEdit4(
"ITEM: ColorEdit4", col4f); }
2820 if (item_type == 10){ ret = ImGui::Selectable(
"ITEM: Selectable"); }
2821 if (item_type == 11){ ret = ImGui::MenuItem(
"ITEM: MenuItem"); }
2822 if (item_type == 12){ ret = ImGui::TreeNode(
"ITEM: TreeNode");
if (ret) ImGui::TreePop(); }
2823 if (item_type == 13){ ret = ImGui::TreeNodeEx(
"ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); }
2824 if (item_type == 14){
const char* items[] = {
"Apple",
"Banana",
"Cherry",
"Kiwi" };
static int current = 1; ret = ImGui::Combo(
"ITEM: Combo", ¤t, items, IM_ARRAYSIZE(items)); }
2825 if (item_type == 15){
const char* items[] = {
"Apple",
"Banana",
"Cherry",
"Kiwi" };
static int current = 1; ret = ImGui::ListBox(
"ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
2827 bool hovered_delay_none = ImGui::IsItemHovered();
2828 bool hovered_delay_stationary = ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary);
2829 bool hovered_delay_short = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort);
2830 bool hovered_delay_normal = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal);
2831 bool hovered_delay_tooltip = ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip);
2838 "Return value = %d\n"
2839 "IsItemFocused() = %d\n"
2840 "IsItemHovered() = %d\n"
2841 "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n"
2842 "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n"
2843 "IsItemHovered(_AllowWhenOverlappedByItem) = %d\n"
2844 "IsItemHovered(_AllowWhenOverlappedByWindow) = %d\n"
2845 "IsItemHovered(_AllowWhenDisabled) = %d\n"
2846 "IsItemHovered(_RectOnly) = %d\n"
2847 "IsItemActive() = %d\n"
2848 "IsItemEdited() = %d\n"
2849 "IsItemActivated() = %d\n"
2850 "IsItemDeactivated() = %d\n"
2851 "IsItemDeactivatedAfterEdit() = %d\n"
2852 "IsItemVisible() = %d\n"
2853 "IsItemClicked() = %d\n"
2854 "IsItemToggledOpen() = %d\n"
2855 "GetItemRectMin() = (%.1f, %.1f)\n"
2856 "GetItemRectMax() = (%.1f, %.1f)\n"
2857 "GetItemRectSize() = (%.1f, %.1f)",
2859 ImGui::IsItemFocused(),
2860 ImGui::IsItemHovered(),
2861 ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup),
2862 ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),
2863 ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlappedByItem),
2864 ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlappedByWindow),
2865 ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled),
2866 ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly),
2867 ImGui::IsItemActive(),
2868 ImGui::IsItemEdited(),
2869 ImGui::IsItemActivated(),
2870 ImGui::IsItemDeactivated(),
2871 ImGui::IsItemDeactivatedAfterEdit(),
2872 ImGui::IsItemVisible(),
2873 ImGui::IsItemClicked(),
2874 ImGui::IsItemToggledOpen(),
2875 ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y,
2876 ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y,
2877 ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y
2880 "with Hovering Delay or Stationary test:\n"
2881 "IsItemHovered() = = %d\n"
2882 "IsItemHovered(_Stationary) = %d\n"
2883 "IsItemHovered(_DelayShort) = %d\n"
2884 "IsItemHovered(_DelayNormal) = %d\n"
2885 "IsItemHovered(_Tooltip) = %d",
2886 hovered_delay_none, hovered_delay_stationary, hovered_delay_short, hovered_delay_normal, hovered_delay_tooltip);
2889 ImGui::EndDisabled();
2892 ImGui::InputText(
"unused", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_ReadOnly);
2894 HelpMarker(
"This widget is only here to be able to tab-out of the widgets above and see e.g. Deactivated() status.");
2900 if (ImGui::TreeNode(
"Querying Window Status (Focused/Hovered etc.)"))
2902 static bool embed_all_inside_a_child_window =
false;
2903 ImGui::Checkbox(
"Embed everything inside a child window for testing _RootWindow flag.", &embed_all_inside_a_child_window);
2904 if (embed_all_inside_a_child_window)
2905 ImGui::BeginChild(
"outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), ImGuiChildFlags_Borders);
2909 "IsWindowFocused() = %d\n"
2910 "IsWindowFocused(_ChildWindows) = %d\n"
2911 "IsWindowFocused(_ChildWindows|_NoPopupHierarchy) = %d\n"
2912 "IsWindowFocused(_ChildWindows|_DockHierarchy) = %d\n"
2913 "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n"
2914 "IsWindowFocused(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n"
2915 "IsWindowFocused(_ChildWindows|_RootWindow|_DockHierarchy) = %d\n"
2916 "IsWindowFocused(_RootWindow) = %d\n"
2917 "IsWindowFocused(_RootWindow|_NoPopupHierarchy) = %d\n"
2918 "IsWindowFocused(_RootWindow|_DockHierarchy) = %d\n"
2919 "IsWindowFocused(_AnyWindow) = %d\n",
2920 ImGui::IsWindowFocused(),
2921 ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows),
2922 ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_NoPopupHierarchy),
2923 ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_DockHierarchy),
2924 ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow),
2925 ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy),
2926 ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_DockHierarchy),
2927 ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow),
2928 ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy),
2929 ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_DockHierarchy),
2930 ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow));
2934 "IsWindowHovered() = %d\n"
2935 "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n"
2936 "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n"
2937 "IsWindowHovered(_ChildWindows) = %d\n"
2938 "IsWindowHovered(_ChildWindows|_NoPopupHierarchy) = %d\n"
2939 "IsWindowHovered(_ChildWindows|_DockHierarchy) = %d\n"
2940 "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n"
2941 "IsWindowHovered(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n"
2942 "IsWindowHovered(_ChildWindows|_RootWindow|_DockHierarchy) = %d\n"
2943 "IsWindowHovered(_RootWindow) = %d\n"
2944 "IsWindowHovered(_RootWindow|_NoPopupHierarchy) = %d\n"
2945 "IsWindowHovered(_RootWindow|_DockHierarchy) = %d\n"
2946 "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n"
2947 "IsWindowHovered(_AnyWindow) = %d\n"
2948 "IsWindowHovered(_Stationary) = %d\n",
2949 ImGui::IsWindowHovered(),
2950 ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup),
2951 ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),
2952 ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows),
2953 ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy),
2954 ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_DockHierarchy),
2955 ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow),
2956 ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy),
2957 ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_DockHierarchy),
2958 ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow),
2959 ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy),
2960 ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_DockHierarchy),
2961 ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup),
2962 ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow),
2963 ImGui::IsWindowHovered(ImGuiHoveredFlags_Stationary));
2965 ImGui::BeginChild(
"child", ImVec2(0, 50), ImGuiChildFlags_Borders);
2966 ImGui::Text(
"This is another child window for testing the _ChildWindows flag.");
2968 if (embed_all_inside_a_child_window)
2974 static bool test_window =
false;
2975 ImGui::Checkbox(
"Hovered/Active tests after Begin() for title bar testing", &test_window);
2980 ImGui::Begin(
"Title bar Hovered/Active tests", &test_window);
2981 if (ImGui::BeginPopupContextItem())
2983 if (ImGui::MenuItem(
"Close")) { test_window =
false; }
2987 "IsItemHovered() after begin = %d (== is title bar hovered)\n"
2988 "IsItemActive() after begin = %d (== is window being clicked/moved)\n",
2989 ImGui::IsItemHovered(), ImGui::IsItemActive());
2999 ImGui::EndDisabled();
3002 if (ImGui::TreeNode(
"Disable block"))
3004 ImGui::Checkbox(
"Disable entire section above", &disable_all);
3005 ImGui::SameLine(); HelpMarker(
"Demonstrate using BeginDisabled()/EndDisabled() across this section.");
3010 if (ImGui::TreeNode(
"Text Filter"))
3014 HelpMarker(
"Not a widget per-se, but ImGuiTextFilter is a helper to perform simple filtering on text strings.");
3015 static ImGuiTextFilter
filter;
3016 ImGui::Text(
"Filter usage:\n"
3017 " \"\" display all lines\n"
3018 " \"xxx\" display lines containing \"xxx\"\n"
3019 " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n"
3020 " \"-xxx\" hide lines containing \"xxx\"");
3022 const char* lines[] = {
"aaa1.c",
"bbb1.c",
"ccc1.c",
"aaa2.cpp",
"bbb2.cpp",
"ccc2.cpp",
"abc.h",
"hello, world" };
3023 for (
int i = 0; i < IM_ARRAYSIZE(lines); i++)
3024 if (
filter.PassFilter(lines[i]))
3025 ImGui::BulletText(
"%s", lines[i]);
3030static const char* ExampleNames[] =
3032 "Artichoke",
"Arugula",
"Asparagus",
"Avocado",
"Bamboo Shoots",
"Bean Sprouts",
"Beans",
"Beet",
"Belgian Endive",
"Bell Pepper",
3033 "Bitter Gourd",
"Bok Choy",
"Broccoli",
"Brussels Sprouts",
"Burdock Root",
"Cabbage",
"Calabash",
"Capers",
"Carrot",
"Cassava",
3034 "Cauliflower",
"Celery",
"Celery Root",
"Celcuce",
"Chayote",
"Chinese Broccoli",
"Corn",
"Cucumber"
3053 const int focused_idx = (int)ms_io->NavIdItem;
3054 if (ms_io->NavIdSelected ==
false)
3056 ms_io->RangeSrcReset =
true;
3061 for (
int idx = focused_idx + 1; idx < items_count; idx++)
3062 if (!Contains(GetStorageIdFromIndex(idx)))
3066 for (
int idx =
IM_MIN(focused_idx, items_count) - 1; idx >= 0; idx--)
3067 if (!Contains(GetStorageIdFromIndex(idx)))
3076 template<
typename ITEM_TYPE>
3081 ImVector<ITEM_TYPE> new_items;
3082 new_items.reserve(items.Size - Size);
3083 int item_next_idx_to_select = -1;
3084 for (
int idx = 0; idx < items.Size; idx++)
3086 if (!Contains(GetStorageIdFromIndex(idx)))
3087 new_items.push_back(items[idx]);
3088 if (item_curr_idx_to_select == idx)
3089 item_next_idx_to_select = new_items.Size - 1;
3091 items.swap(new_items);
3095 if (item_next_idx_to_select != -1 && ms_io->NavIdSelected)
3096 SetItemSelected(GetStorageIdFromIndex(item_next_idx_to_select),
true);
3109 IM_ASSERT((src == 0 && dst == 1) || (src == 1 && dst == 0));
3110 for (ImGuiID item_id :
Items[src])
3111 Items[dst].push_back(item_id);
3119 for (
int src_n = 0; src_n <
Items[src].Size; src_n++)
3121 ImGuiID item_id =
Items[src][src_n];
3125 Items[dst].push_back(item_id);
3137 Selections[side].AdapterIndexToStorageId = [](ImGuiSelectionBasicStorage* self,
int idx) { ImGuiID* items = (ImGuiID*)self->UserData;
return items[idx]; };
3142 const int* a = (
const int*)lhs;
3143 const int* b = (
const int*)rhs;
3144 return (*a - *b) > 0 ? +1 : -1;
3153 if (ImGui::BeginTable(
"split", 3, ImGuiTableFlags_None))
3155 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthStretch);
3156 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed);
3157 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthStretch);
3158 ImGui::TableNextRow();
3160 int request_move_selected = -1;
3161 int request_move_all = -1;
3162 float child_height_0 = 0.0f;
3163 for (
int side = 0; side < 2; side++)
3167 ImVector<ImGuiID>& items =
Items[side];
3168 ImGuiSelectionBasicStorage& selection =
Selections[side];
3170 ImGui::TableSetColumnIndex((side == 0) ? 0 : 2);
3171 ImGui::Text(
"%s (%d)", (side == 0) ?
"Available" :
"Basket", items.Size);
3174 const float items_height = ImGui::GetTextLineHeightWithSpacing();
3175 ImGui::SetNextWindowContentSize(ImVec2(0.0f, items.Size * items_height));
3181 ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, ImGui::GetFrameHeightWithSpacing() * 4), ImVec2(FLT_MAX, FLT_MAX));
3182 child_visible = ImGui::BeginChild(
"0", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY);
3183 child_height_0 = ImGui::GetWindowSize().y;
3188 child_visible = ImGui::BeginChild(
"1", ImVec2(-FLT_MIN, child_height_0), ImGuiChildFlags_FrameStyle);
3192 ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_None;
3193 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, items.Size);
3196 for (
int item_n = 0; item_n < items.Size; item_n++)
3198 ImGuiID item_id = items[item_n];
3199 bool item_is_selected = selection.Contains(item_id);
3200 ImGui::SetNextItemSelectionUserData(item_n);
3201 ImGui::Selectable(ExampleNames[item_id], item_is_selected, ImGuiSelectableFlags_AllowDoubleClick);
3202 if (ImGui::IsItemFocused())
3205 if (ImGui::IsKeyPressed(ImGuiKey_Enter) || ImGui::IsKeyPressed(ImGuiKey_KeypadEnter))
3206 request_move_selected = side;
3207 if (ImGui::IsMouseDoubleClicked(0))
3208 request_move_selected = side;
3212 ms_io = ImGui::EndMultiSelect();
3219 ImGui::TableSetColumnIndex(1);
3222 ImVec2 button_sz = { ImGui::GetFrameHeight(), ImGui::GetFrameHeight() };
3225 if (ImGui::Button(
">>", button_sz))
3226 request_move_all = 0;
3227 if (ImGui::Button(
">", button_sz))
3228 request_move_selected = 0;
3229 if (ImGui::Button(
"<", button_sz))
3230 request_move_selected = 1;
3231 if (ImGui::Button(
"<<", button_sz))
3232 request_move_all = 1;
3235 if (request_move_all != -1)
3236 MoveAll(request_move_all, request_move_all ^ 1);
3237 if (request_move_selected != -1)
3238 MoveSelected(request_move_selected, request_move_selected ^ 1);
3265 if (ImGui::TreeNode(
"Selection State & Multi-Select"))
3267 HelpMarker(
"Selections can be built using Selectable(), TreeNode() or other widgets. Selection state is owned by application code/data.");
3271 if (ImGui::TreeNode(
"Single-Select"))
3273 static int selected = -1;
3274 for (
int n = 0; n < 5; n++)
3277 sprintf(buf,
"Object %d", n);
3278 if (ImGui::Selectable(buf, selected == n))
3286 IMGUI_DEMO_MARKER(
"Widgets/Selection State/Multi-Select (manual/simplified, without BeginMultiSelect)");
3287 if (ImGui::TreeNode(
"Multi-Select (manual/simplified, without BeginMultiSelect)"))
3289 HelpMarker(
"Hold CTRL and click to select multiple items.");
3290 static bool selection[5] = {
false,
false,
false,
false,
false };
3291 for (
int n = 0; n < 5; n++)
3294 sprintf(buf,
"Object %d", n);
3295 if (ImGui::Selectable(buf, selection[n]))
3297 if (!ImGui::GetIO().KeyCtrl)
3298 memset(selection, 0,
sizeof(selection));
3309 if (ImGui::TreeNode(
"Multi-Select"))
3311 ImGui::Text(
"Supported features:");
3312 ImGui::BulletText(
"Keyboard navigation (arrows, page up/down, home/end, space).");
3313 ImGui::BulletText(
"Ctrl modifier to preserve and toggle selection.");
3314 ImGui::BulletText(
"Shift modifier for range selection.");
3315 ImGui::BulletText(
"CTRL+A to select all.");
3316 ImGui::BulletText(
"Escape to clear selection.");
3317 ImGui::BulletText(
"Click and drag to box-select.");
3318 ImGui::Text(
"Tip: Use 'Demo->Tools->Debug Log->Selection' to see selection requests as they happen.");
3321 const int ITEMS_COUNT = 50;
3322 static ImGuiSelectionBasicStorage selection;
3323 ImGui::Text(
"Selection: %d/%d", selection.Size, ITEMS_COUNT);
3326 if (ImGui::BeginChild(
"##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
3328 ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
3329 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, ITEMS_COUNT);
3330 selection.ApplyRequests(ms_io);
3332 for (
int n = 0; n < ITEMS_COUNT; n++)
3335 sprintf(label,
"Object %05d: %s", n, ExampleNames[n % IM_ARRAYSIZE(ExampleNames)]);
3336 bool item_is_selected = selection.Contains((ImGuiID)n);
3337 ImGui::SetNextItemSelectionUserData(n);
3338 ImGui::Selectable(label, item_is_selected);
3341 ms_io = ImGui::EndMultiSelect();
3342 selection.ApplyRequests(ms_io);
3350 if (ImGui::TreeNode(
"Multi-Select (with clipper)"))
3353 static ImGuiSelectionBasicStorage selection;
3355 ImGui::Text(
"Added features:");
3356 ImGui::BulletText(
"Using ImGuiListClipper.");
3358 const int ITEMS_COUNT = 10000;
3359 ImGui::Text(
"Selection: %d/%d", selection.Size, ITEMS_COUNT);
3360 if (ImGui::BeginChild(
"##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
3362 ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
3363 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, ITEMS_COUNT);
3364 selection.ApplyRequests(ms_io);
3366 ImGuiListClipper clipper;
3367 clipper.Begin(ITEMS_COUNT);
3368 if (ms_io->RangeSrcItem != -1)
3369 clipper.IncludeItemByIndex((
int)ms_io->RangeSrcItem);
3370 while (clipper.Step())
3372 for (
int n = clipper.DisplayStart; n < clipper.DisplayEnd; n++)
3375 sprintf(label,
"Object %05d: %s", n, ExampleNames[n % IM_ARRAYSIZE(ExampleNames)]);
3376 bool item_is_selected = selection.Contains((ImGuiID)n);
3377 ImGui::SetNextItemSelectionUserData(n);
3378 ImGui::Selectable(label, item_is_selected);
3382 ms_io = ImGui::EndMultiSelect();
3383 selection.ApplyRequests(ms_io);
3397 if (ImGui::TreeNode(
"Multi-Select (with deletion)"))
3402 static ImVector<ImGuiID> items;
3404 selection.UserData = (
void*)&items;
3405 selection.AdapterIndexToStorageId = [](ImGuiSelectionBasicStorage* self,
int idx) { ImVector<ImGuiID>* p_items = (ImVector<ImGuiID>*)self->UserData;
return (*p_items)[idx]; };
3407 ImGui::Text(
"Added features:");
3408 ImGui::BulletText(
"Dynamic list with Delete key support.");
3409 ImGui::Text(
"Selection size: %d/%d", selection.Size, items.Size);
3412 static ImGuiID items_next_id = 0;
3413 if (items_next_id == 0)
3414 for (ImGuiID n = 0; n < 50; n++)
3415 items.push_back(items_next_id++);
3416 if (ImGui::SmallButton(
"Add 20 items")) {
for (
int n = 0; n < 20; n++) { items.push_back(items_next_id++); } }
3418 if (ImGui::SmallButton(
"Remove 20 items")) {
for (
int n =
IM_MIN(20, items.Size); n > 0; n--) { selection.SetItemSelected(items.back(),
false); items.pop_back(); } }
3421 const float items_height = ImGui::GetTextLineHeightWithSpacing();
3422 ImGui::SetNextWindowContentSize(ImVec2(0.0f, items.Size * items_height));
3424 if (ImGui::BeginChild(
"##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
3426 ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
3427 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, items.Size);
3428 selection.ApplyRequests(ms_io);
3430 const bool want_delete = ImGui::Shortcut(ImGuiKey_Delete, ImGuiInputFlags_Repeat) && (selection.Size > 0);
3431 const int item_curr_idx_to_focus = want_delete ? selection.
ApplyDeletionPreLoop(ms_io, items.Size) : -1;
3433 for (
int n = 0; n < items.Size; n++)
3435 const ImGuiID item_id = items[n];
3437 sprintf(label,
"Object %05u: %s", item_id, ExampleNames[item_id % IM_ARRAYSIZE(ExampleNames)]);
3439 bool item_is_selected = selection.Contains(item_id);
3440 ImGui::SetNextItemSelectionUserData(n);
3441 ImGui::Selectable(label, item_is_selected);
3442 if (item_curr_idx_to_focus == n)
3443 ImGui::SetKeyboardFocusHere(-1);
3447 ms_io = ImGui::EndMultiSelect();
3448 selection.ApplyRequests(ms_io);
3458 if (ImGui::TreeNode(
"Multi-Select (dual list box)"))
3462 if (dlb.
Items[0].Size == 0 && dlb.
Items[1].Size == 0)
3463 for (
int item_id = 0; item_id < IM_ARRAYSIZE(ExampleNames); item_id++)
3464 dlb.
Items[0].push_back((ImGuiID)item_id);
3474 if (ImGui::TreeNode(
"Multi-Select (in a table)"))
3476 static ImGuiSelectionBasicStorage selection;
3478 const int ITEMS_COUNT = 10000;
3479 ImGui::Text(
"Selection: %d/%d", selection.Size, ITEMS_COUNT);
3480 if (ImGui::BeginTable(
"##Basket", 2, ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter))
3482 ImGui::TableSetupColumn(
"Object");
3483 ImGui::TableSetupColumn(
"Action");
3484 ImGui::TableSetupScrollFreeze(0, 1);
3485 ImGui::TableHeadersRow();
3487 ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
3488 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, ITEMS_COUNT);
3489 selection.ApplyRequests(ms_io);
3491 ImGuiListClipper clipper;
3492 clipper.Begin(ITEMS_COUNT);
3493 if (ms_io->RangeSrcItem != -1)
3494 clipper.IncludeItemByIndex((
int)ms_io->RangeSrcItem);
3495 while (clipper.Step())
3497 for (
int n = clipper.DisplayStart; n < clipper.DisplayEnd; n++)
3499 ImGui::TableNextRow();
3500 ImGui::TableNextColumn();
3502 sprintf(label,
"Object %05d: %s", n, ExampleNames[n % IM_ARRAYSIZE(ExampleNames)]);
3503 bool item_is_selected = selection.Contains((ImGuiID)n);
3504 ImGui::SetNextItemSelectionUserData(n);
3505 ImGui::Selectable(label, item_is_selected, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap);
3506 ImGui::TableNextColumn();
3507 ImGui::SmallButton(
"hello");
3511 ms_io = ImGui::EndMultiSelect();
3512 selection.ApplyRequests(ms_io);
3519 if (ImGui::TreeNode(
"Multi-Select (checkboxes)"))
3521 ImGui::Text(
"In a list of checkboxes (not selectable):");
3522 ImGui::BulletText(
"Using _NoAutoSelect + _NoAutoClear flags.");
3523 ImGui::BulletText(
"Shift+Click to check multiple boxes.");
3524 ImGui::BulletText(
"Shift+Keyboard to copy current value to other boxes.");
3527 static bool items[20] = {};
3528 static ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_NoAutoSelect | ImGuiMultiSelectFlags_NoAutoClear | ImGuiMultiSelectFlags_ClearOnEscape;
3529 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_NoAutoSelect", &flags, ImGuiMultiSelectFlags_NoAutoSelect);
3530 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_NoAutoClear", &flags, ImGuiMultiSelectFlags_NoAutoClear);
3531 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_BoxSelect2d", &flags, ImGuiMultiSelectFlags_BoxSelect2d);
3533 if (ImGui::BeginChild(
"##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeY))
3535 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, -1, IM_ARRAYSIZE(items));
3536 ImGuiSelectionExternalStorage storage_wrapper;
3537 storage_wrapper.UserData = (
void*)items;
3538 storage_wrapper.AdapterSetItemSelected = [](ImGuiSelectionExternalStorage* self,
int n,
bool selected) {
bool* array = (
bool*)self->UserData; array[n] = selected; };
3539 storage_wrapper.ApplyRequests(ms_io);
3540 for (
int n = 0; n < 20; n++)
3543 sprintf(label,
"Item %d", n);
3544 ImGui::SetNextItemSelectionUserData(n);
3545 ImGui::Checkbox(label, &items[n]);
3547 ms_io = ImGui::EndMultiSelect();
3548 storage_wrapper.ApplyRequests(ms_io);
3557 if (ImGui::TreeNode(
"Multi-Select (multiple scopes)"))
3560 const int SCOPES_COUNT = 3;
3561 const int ITEMS_COUNT = 8;
3562 static ImGuiSelectionBasicStorage selections_data[SCOPES_COUNT];
3565 static ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ScopeRect | ImGuiMultiSelectFlags_ClearOnEscape;
3566 if (ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_ScopeWindow", &flags, ImGuiMultiSelectFlags_ScopeWindow) && (flags & ImGuiMultiSelectFlags_ScopeWindow))
3567 flags &= ~ImGuiMultiSelectFlags_ScopeRect;
3568 if (ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_ScopeRect", &flags, ImGuiMultiSelectFlags_ScopeRect) && (flags & ImGuiMultiSelectFlags_ScopeRect))
3569 flags &= ~ImGuiMultiSelectFlags_ScopeWindow;
3570 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_ClearOnClickVoid", &flags, ImGuiMultiSelectFlags_ClearOnClickVoid);
3571 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_BoxSelect1d", &flags, ImGuiMultiSelectFlags_BoxSelect1d);
3573 for (
int selection_scope_n = 0; selection_scope_n < SCOPES_COUNT; selection_scope_n++)
3575 ImGui::PushID(selection_scope_n);
3576 ImGuiSelectionBasicStorage* selection = &selections_data[selection_scope_n];
3577 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection->Size, ITEMS_COUNT);
3578 selection->ApplyRequests(ms_io);
3580 ImGui::SeparatorText(
"Selection scope");
3581 ImGui::Text(
"Selection size: %d/%d", selection->Size, ITEMS_COUNT);
3583 for (
int n = 0; n < ITEMS_COUNT; n++)
3586 sprintf(label,
"Object %05d: %s", n, ExampleNames[n % IM_ARRAYSIZE(ExampleNames)]);
3587 bool item_is_selected = selection->Contains((ImGuiID)n);
3588 ImGui::SetNextItemSelectionUserData(n);
3589 ImGui::Selectable(label, item_is_selected);
3593 ms_io = ImGui::EndMultiSelect();
3594 selection->ApplyRequests(ms_io);
3601 if (ImGui::TreeNode(
"Multi-Select (tiled assets browser)"))
3604 ImGui::Text(
"(also access from 'Examples->Assets Browser' in menu)");
3619 if (ImGui::TreeNode(
"Multi-Select (trees)"))
3622 "This is rather advanced and experimental. If you are getting started with multi-select,"
3623 "please don't start by looking at how to use it for a tree!\n\n"
3624 "Future versions will try to simplify and formalize some of this.");
3626 struct ExampleTreeFuncs
3628 static void DrawNode(
ExampleTreeNode* node, ImGuiSelectionBasicStorage* selection)
3630 ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
3631 tree_node_flags |= ImGuiTreeNodeFlags_NavLeftJumpsBackHere;
3632 if (node->
Childs.Size == 0)
3633 tree_node_flags |= ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_Leaf;
3634 if (selection->Contains((ImGuiID)node->
UID))
3635 tree_node_flags |= ImGuiTreeNodeFlags_Selected;
3639 ImGui::SetNextItemSelectionUserData((ImGuiSelectionUserData)(intptr_t)node);
3640 ImGui::SetNextItemStorageID((ImGuiID)node->
UID);
3641 if (ImGui::TreeNodeEx(node->
Name, tree_node_flags))
3644 DrawNode(child, selection);
3647 else if (ImGui::IsItemToggledOpen())
3649 TreeCloseAndUnselectChildNodes(node, selection);
3655 return ImGui::GetStateStorage()->GetBool((ImGuiID)node->
UID);
3660 ImGui::GetStateStorage()->SetBool((ImGuiID)node->
UID, open);
3666 static int TreeCloseAndUnselectChildNodes(
ExampleTreeNode* node, ImGuiSelectionBasicStorage* selection,
int depth = 0)
3669 int unselected_count = selection->Contains((ImGuiID)node->
UID) ? 1 : 0;
3670 if (depth == 0 || TreeNodeGetOpen(node))
3673 unselected_count += TreeCloseAndUnselectChildNodes(child, selection, depth + 1);
3674 TreeNodeSetOpen(node,
false);
3678 selection->SetItemSelected((ImGuiID)node->
UID, (depth == 0 && unselected_count > 0));
3679 return unselected_count;
3683 static void ApplySelectionRequests(ImGuiMultiSelectIO* ms_io,
ExampleTreeNode* tree, ImGuiSelectionBasicStorage* selection)
3685 for (ImGuiSelectionRequest& req : ms_io->Requests)
3687 if (req.Type == ImGuiSelectionRequestType_SetAll)
3690 TreeSetAllInOpenNodes(tree, selection, req.Selected);
3694 else if (req.Type == ImGuiSelectionRequestType_SetRange)
3698 for (
ExampleTreeNode* node = first_node; node != NULL; node = TreeGetNextNodeInVisibleOrder(node, last_node))
3699 selection->SetItemSelected((ImGuiID)node->
UID, req.Selected);
3704 static void TreeSetAllInOpenNodes(
ExampleTreeNode* node, ImGuiSelectionBasicStorage* selection,
bool selected)
3706 if (node->
Parent != NULL)
3707 selection->SetItemSelected((ImGuiID)node->
UID, selected);
3708 if (node->
Parent == NULL || TreeNodeGetOpen(node))
3710 TreeSetAllInOpenNodes(child, selection, selected);
3724 if (curr_node == last_node)
3728 if (curr_node->
Childs.Size > 0 && TreeNodeGetOpen(curr_node))
3729 return curr_node->
Childs[0];
3732 while (curr_node->
Parent != NULL)
3736 curr_node = curr_node->
Parent;
3743 static ImGuiSelectionBasicStorage selection;
3745 demo_data->
DemoTree = ExampleTree_CreateDemoTree();
3746 ImGui::Text(
"Selection size: %d", selection.Size);
3748 if (ImGui::BeginChild(
"##Tree", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
3751 ImGuiMultiSelectFlags ms_flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect2d;
3752 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(ms_flags, selection.Size, -1);
3753 ExampleTreeFuncs::ApplySelectionRequests(ms_io, tree, &selection);
3755 ExampleTreeFuncs::DrawNode(node, &selection);
3756 ms_io = ImGui::EndMultiSelect();
3757 ExampleTreeFuncs::ApplySelectionRequests(ms_io, tree, &selection);
3772 if (ImGui::TreeNode(
"Multi-Select (advanced)"))
3775 enum WidgetType { WidgetType_Selectable, WidgetType_TreeNode };
3776 static bool use_clipper =
true;
3777 static bool use_deletion =
true;
3778 static bool use_drag_drop =
true;
3779 static bool show_in_table =
false;
3780 static bool show_color_button =
true;
3781 static ImGuiMultiSelectFlags flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_BoxSelect1d;
3782 static WidgetType widget_type = WidgetType_Selectable;
3784 if (ImGui::TreeNode(
"Options"))
3786 if (ImGui::RadioButton(
"Selectables", widget_type == WidgetType_Selectable)) { widget_type = WidgetType_Selectable; }
3788 if (ImGui::RadioButton(
"Tree nodes", widget_type == WidgetType_TreeNode)) { widget_type = WidgetType_TreeNode; }
3790 HelpMarker(
"TreeNode() is technically supported but... using this correctly is more complicated (you need some sort of linear/random access to your tree, which is suited to advanced trees setups already implementing filters and clipper. We will work toward simplifying and demoing this.\n\nFor now the tree demo is actually a little bit meaningless because it is an empty tree with only root nodes.");
3791 ImGui::Checkbox(
"Enable clipper", &use_clipper);
3792 ImGui::Checkbox(
"Enable deletion", &use_deletion);
3793 ImGui::Checkbox(
"Enable drag & drop", &use_drag_drop);
3794 ImGui::Checkbox(
"Show in a table", &show_in_table);
3795 ImGui::Checkbox(
"Show color button", &show_color_button);
3796 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_SingleSelect", &flags, ImGuiMultiSelectFlags_SingleSelect);
3797 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_NoSelectAll", &flags, ImGuiMultiSelectFlags_NoSelectAll);
3798 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_NoRangeSelect", &flags, ImGuiMultiSelectFlags_NoRangeSelect);
3799 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_NoAutoSelect", &flags, ImGuiMultiSelectFlags_NoAutoSelect);
3800 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_NoAutoClear", &flags, ImGuiMultiSelectFlags_NoAutoClear);
3801 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_NoAutoClearOnReselect", &flags, ImGuiMultiSelectFlags_NoAutoClearOnReselect);
3802 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_BoxSelect1d", &flags, ImGuiMultiSelectFlags_BoxSelect1d);
3803 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_BoxSelect2d", &flags, ImGuiMultiSelectFlags_BoxSelect2d);
3804 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_BoxSelectNoScroll", &flags, ImGuiMultiSelectFlags_BoxSelectNoScroll);
3805 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_ClearOnEscape", &flags, ImGuiMultiSelectFlags_ClearOnEscape);
3806 ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_ClearOnClickVoid", &flags, ImGuiMultiSelectFlags_ClearOnClickVoid);
3807 if (ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_ScopeWindow", &flags, ImGuiMultiSelectFlags_ScopeWindow) && (flags & ImGuiMultiSelectFlags_ScopeWindow))
3808 flags &= ~ImGuiMultiSelectFlags_ScopeRect;
3809 if (ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_ScopeRect", &flags, ImGuiMultiSelectFlags_ScopeRect) && (flags & ImGuiMultiSelectFlags_ScopeRect))
3810 flags &= ~ImGuiMultiSelectFlags_ScopeWindow;
3811 if (ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_SelectOnClick", &flags, ImGuiMultiSelectFlags_SelectOnClick) && (flags & ImGuiMultiSelectFlags_SelectOnClick))
3812 flags &= ~ImGuiMultiSelectFlags_SelectOnClickRelease;
3813 if (ImGui::CheckboxFlags(
"ImGuiMultiSelectFlags_SelectOnClickRelease", &flags, ImGuiMultiSelectFlags_SelectOnClickRelease) && (flags & ImGuiMultiSelectFlags_SelectOnClickRelease))
3814 flags &= ~ImGuiMultiSelectFlags_SelectOnClick;
3815 ImGui::SameLine(); HelpMarker(
"Allow dragging an unselected item without altering selection.");
3821 static ImVector<int> items;
3822 static int items_next_id = 0;
3823 if (items_next_id == 0) {
for (
int n = 0; n < 1000; n++) { items.push_back(items_next_id++); } }
3825 static bool request_deletion_from_menu =
false;
3827 ImGui::Text(
"Selection size: %d/%d", selection.Size, items.Size);
3829 const float items_height = (widget_type == WidgetType_TreeNode) ? ImGui::GetTextLineHeight() : ImGui::GetTextLineHeightWithSpacing();
3830 ImGui::SetNextWindowContentSize(ImVec2(0.0f, items.Size * items_height));
3831 if (ImGui::BeginChild(
"##Basket", ImVec2(-FLT_MIN, ImGui::GetFontSize() * 20), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY))
3833 ImVec2 color_button_sz(ImGui::GetFontSize(), ImGui::GetFontSize());
3834 if (widget_type == WidgetType_TreeNode)
3835 ImGui::PushStyleVarY(ImGuiStyleVar_ItemSpacing, 0.0f);
3837 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(flags, selection.Size, items.Size);
3838 selection.ApplyRequests(ms_io);
3840 const bool want_delete = (ImGui::Shortcut(ImGuiKey_Delete, ImGuiInputFlags_Repeat) && (selection.Size > 0)) || request_deletion_from_menu;
3841 const int item_curr_idx_to_focus = want_delete ? selection.
ApplyDeletionPreLoop(ms_io, items.Size) : -1;
3842 request_deletion_from_menu =
false;
3846 if (widget_type == WidgetType_TreeNode)
3847 ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(0.0f, 0.0f));
3848 ImGui::BeginTable(
"##Split", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_NoPadOuterX);
3849 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthStretch, 0.70f);
3850 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthStretch, 0.30f);
3854 ImGuiListClipper clipper;
3857 clipper.Begin(items.Size);
3858 if (item_curr_idx_to_focus != -1)
3859 clipper.IncludeItemByIndex(item_curr_idx_to_focus);
3860 if (ms_io->RangeSrcItem != -1)
3861 clipper.IncludeItemByIndex((
int)ms_io->RangeSrcItem);
3864 while (!use_clipper || clipper.Step())
3866 const int item_begin = use_clipper ? clipper.DisplayStart : 0;
3867 const int item_end = use_clipper ? clipper.DisplayEnd : items.Size;
3868 for (
int n = item_begin; n < item_end; n++)
3871 ImGui::TableNextColumn();
3873 const int item_id = items[n];
3874 const char* item_category = ExampleNames[item_id % IM_ARRAYSIZE(ExampleNames)];
3876 sprintf(label,
"Object %05d: %s", item_id, item_category);
3882 ImGui::PushID(item_id);
3886 if (show_color_button)
3888 ImU32 dummy_col = (ImU32)((
unsigned int)n * 0xC250B74B) | IM_COL32_A_MASK;
3889 ImGui::ColorButton(
"##", ImColor(dummy_col), ImGuiColorEditFlags_NoTooltip, color_button_sz);
3894 bool item_is_selected = selection.Contains((ImGuiID)n);
3895 bool item_is_open =
false;
3896 ImGui::SetNextItemSelectionUserData(n);
3897 if (widget_type == WidgetType_Selectable)
3899 ImGui::Selectable(label, item_is_selected, ImGuiSelectableFlags_None);
3901 else if (widget_type == WidgetType_TreeNode)
3903 ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
3904 if (item_is_selected)
3905 tree_node_flags |= ImGuiTreeNodeFlags_Selected;
3906 item_is_open = ImGui::TreeNodeEx(label, tree_node_flags);
3910 if (item_curr_idx_to_focus == n)
3911 ImGui::SetKeyboardFocusHere(-1);
3914 if (use_drag_drop && ImGui::BeginDragDropSource())
3918 if (ImGui::GetDragDropPayload() == NULL)
3920 ImVector<int> payload_items;
3923 if (!item_is_selected)
3924 payload_items.push_back(item_id);
3926 while (selection.GetNextSelectedItem(&it, &
id))
3927 payload_items.push_back((
int)
id);
3928 ImGui::SetDragDropPayload(
"MULTISELECT_DEMO_ITEMS", payload_items.Data, (
size_t)payload_items.size_in_bytes());
3932 const ImGuiPayload* payload = ImGui::GetDragDropPayload();
3933 const int* payload_items = (
int*)payload->Data;
3934 const int payload_count = (int)payload->DataSize / (
int)
sizeof(int);
3935 if (payload_count == 1)
3936 ImGui::Text(
"Object %05d: %s", payload_items[0], ExampleNames[payload_items[0] % IM_ARRAYSIZE(ExampleNames)]);
3938 ImGui::Text(
"Dragging %d objects", payload_count);
3940 ImGui::EndDragDropSource();
3943 if (widget_type == WidgetType_TreeNode && item_is_open)
3947 if (ImGui::BeginPopupContextItem())
3949 ImGui::BeginDisabled(!use_deletion || selection.Size == 0);
3950 sprintf(label,
"Delete %d item(s)###DeleteSelected", selection.Size);
3951 if (ImGui::Selectable(label))
3952 request_deletion_from_menu =
true;
3953 ImGui::EndDisabled();
3954 ImGui::Selectable(
"Close");
3961 ImGui::TableNextColumn();
3962 ImGui::SetNextItemWidth(-FLT_MIN);
3963 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
3964 ImGui::InputText(
"###NoLabel", (
char*)(
void*)item_category, strlen(item_category), ImGuiInputTextFlags_ReadOnly);
3965 ImGui::PopStyleVar();
3977 if (widget_type == WidgetType_TreeNode)
3978 ImGui::PopStyleVar();
3982 ms_io = ImGui::EndMultiSelect();
3983 selection.ApplyRequests(ms_io);
3987 if (widget_type == WidgetType_TreeNode)
3988 ImGui::PopStyleVar();
4001static void ShowDemoWindowLayout()
4004 if (!ImGui::CollapsingHeader(
"Layout & Scrolling"))
4008 if (ImGui::TreeNode(
"Child windows"))
4010 ImGui::SeparatorText(
"Child windows");
4012 HelpMarker(
"Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window.");
4013 static bool disable_mouse_wheel =
false;
4014 static bool disable_menu =
false;
4015 ImGui::Checkbox(
"Disable Mouse Wheel", &disable_mouse_wheel);
4016 ImGui::Checkbox(
"Disable Menu", &disable_menu);
4020 ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar;
4021 if (disable_mouse_wheel)
4022 window_flags |= ImGuiWindowFlags_NoScrollWithMouse;
4023 ImGui::BeginChild(
"ChildL", ImVec2(ImGui::GetContentRegionAvail().x * 0.5f, 260), ImGuiChildFlags_None, window_flags);
4024 for (
int i = 0; i < 100; i++)
4025 ImGui::Text(
"%04d: scrollable region", i);
4033 ImGuiWindowFlags window_flags = ImGuiWindowFlags_None;
4034 if (disable_mouse_wheel)
4035 window_flags |= ImGuiWindowFlags_NoScrollWithMouse;
4037 window_flags |= ImGuiWindowFlags_MenuBar;
4038 ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f);
4039 ImGui::BeginChild(
"ChildR", ImVec2(0, 260), ImGuiChildFlags_Borders, window_flags);
4040 if (!disable_menu && ImGui::BeginMenuBar())
4042 if (ImGui::BeginMenu(
"Menu"))
4044 ShowExampleMenuFile();
4047 ImGui::EndMenuBar();
4049 if (ImGui::BeginTable(
"split", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings))
4051 for (
int i = 0; i < 100; i++)
4054 sprintf(buf,
"%03d", i);
4055 ImGui::TableNextColumn();
4056 ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f));
4061 ImGui::PopStyleVar();
4065 ImGui::SeparatorText(
"Manual-resize");
4067 HelpMarker(
"Drag bottom border to resize. Double-click bottom border to auto-fit to vertical contents.");
4071 ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetStyleColorVec4(ImGuiCol_FrameBg));
4072 if (ImGui::BeginChild(
"ResizableChild", ImVec2(-FLT_MIN, ImGui::GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeY))
4073 for (
int n = 0; n < 10; n++)
4074 ImGui::Text(
"Line %04d", n);
4075 ImGui::PopStyleColor();
4080 ImGui::SeparatorText(
"Auto-resize with constraints");
4082 static int draw_lines = 3;
4083 static int max_height_in_lines = 10;
4084 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
4085 ImGui::DragInt(
"Lines Count", &draw_lines, 0.2f);
4086 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
4087 ImGui::DragInt(
"Max Height (in Lines)", &max_height_in_lines, 0.2f);
4089 ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 1), ImVec2(FLT_MAX, ImGui::GetTextLineHeightWithSpacing() * max_height_in_lines));
4090 if (ImGui::BeginChild(
"ConstrainedChild", ImVec2(-FLT_MIN, 0.0f), ImGuiChildFlags_Borders | ImGuiChildFlags_AutoResizeY))
4091 for (
int n = 0; n < draw_lines; n++)
4092 ImGui::Text(
"Line %04d", n);
4096 ImGui::SeparatorText(
"Misc/Advanced");
4106 static int offset_x = 0;
4107 static bool override_bg_color =
true;
4108 static ImGuiChildFlags child_flags = ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY;
4109 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
4110 ImGui::DragInt(
"Offset X", &offset_x, 1.0f, -1000, 1000);
4111 ImGui::Checkbox(
"Override ChildBg color", &override_bg_color);
4112 ImGui::CheckboxFlags(
"ImGuiChildFlags_Borders", &child_flags, ImGuiChildFlags_Borders);
4113 ImGui::CheckboxFlags(
"ImGuiChildFlags_AlwaysUseWindowPadding", &child_flags, ImGuiChildFlags_AlwaysUseWindowPadding);
4114 ImGui::CheckboxFlags(
"ImGuiChildFlags_ResizeX", &child_flags, ImGuiChildFlags_ResizeX);
4115 ImGui::CheckboxFlags(
"ImGuiChildFlags_ResizeY", &child_flags, ImGuiChildFlags_ResizeY);
4116 ImGui::CheckboxFlags(
"ImGuiChildFlags_FrameStyle", &child_flags, ImGuiChildFlags_FrameStyle);
4117 ImGui::SameLine(); HelpMarker(
"Style the child window like a framed item: use FrameBg, FrameRounding, FrameBorderSize, FramePadding instead of ChildBg, ChildRounding, ChildBorderSize, WindowPadding.");
4118 if (child_flags & ImGuiChildFlags_FrameStyle)
4119 override_bg_color =
false;
4121 ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (
float)offset_x);
4122 if (override_bg_color)
4123 ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100));
4124 ImGui::BeginChild(
"Red", ImVec2(200, 100), child_flags, ImGuiWindowFlags_None);
4125 if (override_bg_color)
4126 ImGui::PopStyleColor();
4128 for (
int n = 0; n < 50; n++)
4129 ImGui::Text(
"Some test %d", n);
4131 bool child_is_hovered = ImGui::IsItemHovered();
4132 ImVec2 child_rect_min = ImGui::GetItemRectMin();
4133 ImVec2 child_rect_max = ImGui::GetItemRectMax();
4134 ImGui::Text(
"Hovered: %d", child_is_hovered);
4135 ImGui::Text(
"Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y);
4142 if (ImGui::TreeNode(
"Widgets Width"))
4144 static float f = 0.0f;
4145 static bool show_indented_items =
true;
4146 ImGui::Checkbox(
"Show indented items", &show_indented_items);
4153 ImGui::Text(
"SetNextItemWidth/PushItemWidth(100)");
4154 ImGui::SameLine(); HelpMarker(
"Fixed width.");
4155 ImGui::PushItemWidth(100);
4156 ImGui::DragFloat(
"float##1b", &f);
4157 if (show_indented_items)
4160 ImGui::DragFloat(
"float (indented)##1b", &f);
4163 ImGui::PopItemWidth();
4165 ImGui::Text(
"SetNextItemWidth/PushItemWidth(-100)");
4166 ImGui::SameLine(); HelpMarker(
"Align to right edge minus 100");
4167 ImGui::PushItemWidth(-100);
4168 ImGui::DragFloat(
"float##2a", &f);
4169 if (show_indented_items)
4172 ImGui::DragFloat(
"float (indented)##2b", &f);
4175 ImGui::PopItemWidth();
4177 ImGui::Text(
"SetNextItemWidth/PushItemWidth(GetContentRegionAvail().x * 0.5f)");
4178 ImGui::SameLine(); HelpMarker(
"Half of available width.\n(~ right-cursor_pos)\n(works within a column set)");
4179 ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x * 0.5f);
4180 ImGui::DragFloat(
"float##3a", &f);
4181 if (show_indented_items)
4184 ImGui::DragFloat(
"float (indented)##3b", &f);
4187 ImGui::PopItemWidth();
4189 ImGui::Text(
"SetNextItemWidth/PushItemWidth(-GetContentRegionAvail().x * 0.5f)");
4190 ImGui::SameLine(); HelpMarker(
"Align to right edge minus half");
4191 ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f);
4192 ImGui::DragFloat(
"float##4a", &f);
4193 if (show_indented_items)
4196 ImGui::DragFloat(
"float (indented)##4b", &f);
4199 ImGui::PopItemWidth();
4203 ImGui::Text(
"SetNextItemWidth/PushItemWidth(-FLT_MIN)");
4204 ImGui::SameLine(); HelpMarker(
"Align to right edge");
4205 ImGui::PushItemWidth(-FLT_MIN);
4206 ImGui::DragFloat(
"##float5a", &f);
4207 if (show_indented_items)
4210 ImGui::DragFloat(
"float (indented)##5b", &f);
4213 ImGui::PopItemWidth();
4219 if (ImGui::TreeNode(
"Basic Horizontal Layout"))
4221 ImGui::TextWrapped(
"(Use ImGui::SameLine() to keep adding items to the right of the preceding item)");
4225 ImGui::Text(
"Two items: Hello"); ImGui::SameLine();
4226 ImGui::TextColored(ImVec4(1, 1, 0, 1),
"Sailor");
4229 ImGui::Text(
"More spacing: Hello"); ImGui::SameLine(0, 20);
4230 ImGui::TextColored(ImVec4(1, 1, 0, 1),
"Sailor");
4233 ImGui::AlignTextToFramePadding();
4234 ImGui::Text(
"Normal buttons"); ImGui::SameLine();
4235 ImGui::Button(
"Banana"); ImGui::SameLine();
4236 ImGui::Button(
"Apple"); ImGui::SameLine();
4237 ImGui::Button(
"Corniflower");
4240 ImGui::Text(
"Small buttons"); ImGui::SameLine();
4241 ImGui::SmallButton(
"Like this one"); ImGui::SameLine();
4242 ImGui::Text(
"can fit within a text block.");
4246 ImGui::Text(
"Aligned");
4247 ImGui::SameLine(150); ImGui::Text(
"x=150");
4248 ImGui::SameLine(300); ImGui::Text(
"x=300");
4249 ImGui::Text(
"Aligned");
4250 ImGui::SameLine(150); ImGui::SmallButton(
"x=150");
4251 ImGui::SameLine(300); ImGui::SmallButton(
"x=300");
4255 static bool c1 =
false, c2 =
false, c3 =
false, c4 =
false;
4256 ImGui::Checkbox(
"My", &c1); ImGui::SameLine();
4257 ImGui::Checkbox(
"Tailor", &c2); ImGui::SameLine();
4258 ImGui::Checkbox(
"Is", &c3); ImGui::SameLine();
4259 ImGui::Checkbox(
"Rich", &c4);
4262 static float f0 = 1.0f, f1 = 2.0f, f2 = 3.0f;
4263 ImGui::PushItemWidth(80);
4264 const char* items[] = {
"AAAA",
"BBBB",
"CCCC",
"DDDD" };
4265 static int item = -1;
4266 ImGui::Combo(
"Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine();
4267 ImGui::SliderFloat(
"X", &f0, 0.0f, 5.0f); ImGui::SameLine();
4268 ImGui::SliderFloat(
"Y", &f1, 0.0f, 5.0f); ImGui::SameLine();
4269 ImGui::SliderFloat(
"Z", &f2, 0.0f, 5.0f);
4270 ImGui::PopItemWidth();
4272 ImGui::PushItemWidth(80);
4273 ImGui::Text(
"Lists:");
4274 static int selection[4] = { 0, 1, 2, 3 };
4275 for (
int i = 0; i < 4; i++)
4277 if (i > 0) ImGui::SameLine();
4279 ImGui::ListBox(
"", &selection[i], items, IM_ARRAYSIZE(items));
4283 ImGui::PopItemWidth();
4287 ImVec2 button_sz(40, 40);
4288 ImGui::Button(
"A", button_sz); ImGui::SameLine();
4289 ImGui::Dummy(button_sz); ImGui::SameLine();
4290 ImGui::Button(
"B", button_sz);
4295 ImGui::Text(
"Manual wrapping:");
4296 ImGuiStyle& style = ImGui::GetStyle();
4297 int buttons_count = 20;
4298 float window_visible_x2 = ImGui::GetCursorScreenPos().x + ImGui::GetContentRegionAvail().x;
4299 for (
int n = 0; n < buttons_count; n++)
4302 ImGui::Button(
"Box", button_sz);
4303 float last_button_x2 = ImGui::GetItemRectMax().x;
4304 float next_button_x2 = last_button_x2 + style.ItemSpacing.x + button_sz.x;
4305 if (n + 1 < buttons_count && next_button_x2 < window_visible_x2)
4314 if (ImGui::TreeNode(
"Groups"))
4317 "BeginGroup() basically locks the horizontal position for new line. "
4318 "EndGroup() bundles the whole group so that you can use \"item\" functions such as "
4319 "IsItemHovered()/IsItemActive() or SameLine() etc. on the whole group.");
4320 ImGui::BeginGroup();
4322 ImGui::BeginGroup();
4323 ImGui::Button(
"AAA");
4325 ImGui::Button(
"BBB");
4327 ImGui::BeginGroup();
4328 ImGui::Button(
"CCC");
4329 ImGui::Button(
"DDD");
4332 ImGui::Button(
"EEE");
4334 ImGui::SetItemTooltip(
"First group hovered");
4337 ImVec2
size = ImGui::GetItemRectSize();
4338 const float values[5] = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f };
4339 ImGui::PlotHistogram(
"##values", values, IM_ARRAYSIZE(values), 0, NULL, 0.0f, 1.0f, size);
4341 ImGui::Button(
"ACTION", ImVec2((
size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f,
size.y));
4343 ImGui::Button(
"REACTION", ImVec2((
size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f,
size.y));
4347 ImGui::Button(
"LEVERAGE\nBUZZWORD", size);
4350 if (ImGui::BeginListBox(
"List", size))
4352 ImGui::Selectable(
"Selected",
true);
4353 ImGui::Selectable(
"Not Selected",
false);
4354 ImGui::EndListBox();
4361 if (ImGui::TreeNode(
"Text Baseline Alignment"))
4364 ImGui::BulletText(
"Text baseline:");
4365 ImGui::SameLine(); HelpMarker(
4366 "This is testing the vertical alignment that gets applied on text to keep it aligned with widgets. "
4367 "Lines only composed of text or \"small\" widgets use less vertical space than lines with framed widgets.");
4370 ImGui::Text(
"KO Blahblah"); ImGui::SameLine();
4371 ImGui::Button(
"Some framed item"); ImGui::SameLine();
4372 HelpMarker(
"Baseline of button will look misaligned with text..");
4377 ImGui::AlignTextToFramePadding();
4378 ImGui::Text(
"OK Blahblah"); ImGui::SameLine();
4379 ImGui::Button(
"Some framed item##2"); ImGui::SameLine();
4380 HelpMarker(
"We call AlignTextToFramePadding() to vertically align the text baseline by +FramePadding.y");
4383 ImGui::Button(
"TEST##1"); ImGui::SameLine();
4384 ImGui::Text(
"TEST"); ImGui::SameLine();
4385 ImGui::SmallButton(
"TEST##2");
4388 ImGui::AlignTextToFramePadding();
4389 ImGui::Text(
"Text aligned to framed item"); ImGui::SameLine();
4390 ImGui::Button(
"Item##1"); ImGui::SameLine();
4391 ImGui::Text(
"Item"); ImGui::SameLine();
4392 ImGui::SmallButton(
"Item##2"); ImGui::SameLine();
4393 ImGui::Button(
"Item##3");
4401 ImGui::BulletText(
"Multi-line text:");
4403 ImGui::Text(
"One\nTwo\nThree"); ImGui::SameLine();
4404 ImGui::Text(
"Hello\nWorld"); ImGui::SameLine();
4405 ImGui::Text(
"Banana");
4407 ImGui::Text(
"Banana"); ImGui::SameLine();
4408 ImGui::Text(
"Hello\nWorld"); ImGui::SameLine();
4409 ImGui::Text(
"One\nTwo\nThree");
4411 ImGui::Button(
"HOP##1"); ImGui::SameLine();
4412 ImGui::Text(
"Banana"); ImGui::SameLine();
4413 ImGui::Text(
"Hello\nWorld"); ImGui::SameLine();
4414 ImGui::Text(
"Banana");
4416 ImGui::Button(
"HOP##2"); ImGui::SameLine();
4417 ImGui::Text(
"Hello\nWorld"); ImGui::SameLine();
4418 ImGui::Text(
"Banana");
4425 ImGui::BulletText(
"Misc items:");
4429 ImGui::Button(
"80x80", ImVec2(80, 80));
4431 ImGui::Button(
"50x50", ImVec2(50, 50));
4433 ImGui::Button(
"Button()");
4435 ImGui::SmallButton(
"SmallButton()");
4438 const float spacing = ImGui::GetStyle().ItemInnerSpacing.x;
4439 ImGui::Button(
"Button##1");
4440 ImGui::SameLine(0.0f, spacing);
4441 if (ImGui::TreeNode(
"Node##1"))
4444 for (
int i = 0; i < 6; i++)
4445 ImGui::BulletText(
"Item %d..", i);
4451 ImGui::AlignTextToFramePadding();
4455 bool node_open = ImGui::TreeNode(
"Node##2");
4456 ImGui::SameLine(0.0f, spacing); ImGui::Button(
"Button##2");
4460 for (
int i = 0; i < 6; i++)
4461 ImGui::BulletText(
"Item %d..", i);
4466 ImGui::Button(
"Button##3");
4467 ImGui::SameLine(0.0f, spacing);
4468 ImGui::BulletText(
"Bullet text");
4470 ImGui::AlignTextToFramePadding();
4471 ImGui::BulletText(
"Node");
4472 ImGui::SameLine(0.0f, spacing); ImGui::Button(
"Button##4");
4480 if (ImGui::TreeNode(
"Scrolling"))
4484 HelpMarker(
"Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given vertical position.");
4486 static int track_item = 50;
4487 static bool enable_track =
true;
4488 static bool enable_extra_decorations =
false;
4489 static float scroll_to_off_px = 0.0f;
4490 static float scroll_to_pos_px = 200.0f;
4492 ImGui::Checkbox(
"Decoration", &enable_extra_decorations);
4494 ImGui::Checkbox(
"Track", &enable_track);
4495 ImGui::PushItemWidth(100);
4496 ImGui::SameLine(140); enable_track |= ImGui::DragInt(
"##item", &track_item, 0.25f, 0, 99,
"Item = %d");
4498 bool scroll_to_off = ImGui::Button(
"Scroll Offset");
4499 ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat(
"##off", &scroll_to_off_px, 1.00f, 0, FLT_MAX,
"+%.0f px");
4501 bool scroll_to_pos = ImGui::Button(
"Scroll To Pos");
4502 ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat(
"##pos", &scroll_to_pos_px, 1.00f, -10, FLT_MAX,
"X/Y = %.0f px");
4503 ImGui::PopItemWidth();
4505 if (scroll_to_off || scroll_to_pos)
4506 enable_track =
false;
4508 ImGuiStyle& style = ImGui::GetStyle();
4509 float child_w = (ImGui::GetContentRegionAvail().x - 4 * style.ItemSpacing.x) / 5;
4512 ImGui::PushID(
"##VerticalScrolling");
4513 for (
int i = 0; i < 5; i++)
4515 if (i > 0) ImGui::SameLine();
4516 ImGui::BeginGroup();
4517 const char* names[] = {
"Top",
"25%",
"Center",
"75%",
"Bottom" };
4520 const ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0;
4521 const ImGuiID child_id = ImGui::GetID((
void*)(intptr_t)i);
4522 const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), ImGuiChildFlags_Borders, child_flags);
4523 if (ImGui::BeginMenuBar())
4526 ImGui::EndMenuBar();
4529 ImGui::SetScrollY(scroll_to_off_px);
4531 ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f);
4532 if (child_is_visible)
4534 for (
int item = 0; item < 100; item++)
4536 if (enable_track && item == track_item)
4538 ImGui::TextColored(ImVec4(1, 1, 0, 1),
"Item %d", item);
4539 ImGui::SetScrollHereY(i * 0.25f);
4543 ImGui::Text(
"Item %d", item);
4547 float scroll_y = ImGui::GetScrollY();
4548 float scroll_max_y = ImGui::GetScrollMaxY();
4550 ImGui::Text(
"%.0f/%.0f", scroll_y, scroll_max_y);
4559 "Use SetScrollHereX() or SetScrollFromPosX() to scroll to a given horizontal position.\n\n"
4560 "Because the clipping rectangle of most window hides half worth of WindowPadding on the "
4561 "left/right, using SetScrollFromPosX(+1) will usually result in clipped text whereas the "
4562 "equivalent SetScrollFromPosY(+1) wouldn't.");
4563 ImGui::PushID(
"##HorizontalScrolling");
4564 for (
int i = 0; i < 5; i++)
4566 float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f;
4567 ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0);
4568 ImGuiID child_id = ImGui::GetID((
void*)(intptr_t)i);
4569 bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), ImGuiChildFlags_Borders, child_flags);
4571 ImGui::SetScrollX(scroll_to_off_px);
4573 ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f);
4574 if (child_is_visible)
4576 for (
int item = 0; item < 100; item++)
4580 if (enable_track && item == track_item)
4582 ImGui::TextColored(ImVec4(1, 1, 0, 1),
"Item %d", item);
4583 ImGui::SetScrollHereX(i * 0.25f);
4587 ImGui::Text(
"Item %d", item);
4591 float scroll_x = ImGui::GetScrollX();
4592 float scroll_max_x = ImGui::GetScrollMaxX();
4595 const char* names[] = {
"Left",
"25%",
"Center",
"75%",
"Right" };
4596 ImGui::Text(
"%s\n%.0f/%.0f", names[i], scroll_x, scroll_max_x);
4604 "Horizontal scrolling for a window is enabled via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\n"
4605 "You may want to also explicitly specify content width by using SetNextWindowContentWidth() before Begin().");
4606 static int lines = 7;
4607 ImGui::SliderInt(
"Lines", &lines, 1, 15);
4608 ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);
4609 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f));
4610 ImVec2 scrolling_child_size = ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 7 + 30);
4611 ImGui::BeginChild(
"scrolling", scrolling_child_size, ImGuiChildFlags_Borders, ImGuiWindowFlags_HorizontalScrollbar);
4612 for (
int line = 0; line < lines; line++)
4618 int num_buttons = 10 + ((line & 1) ? line * 9 : line * 3);
4619 for (
int n = 0; n < num_buttons; n++)
4621 if (n > 0) ImGui::SameLine();
4622 ImGui::PushID(n + line * 1000);
4624 sprintf(num_buf,
"%d", n);
4625 const char* label = (!(n % 15)) ?
"FizzBuzz" : (!(n % 3)) ?
"Fizz" : (!(n % 5)) ?
"Buzz" : num_buf;
4626 float hue = n * 0.05f;
4627 ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue, 0.6f, 0.6f));
4628 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue, 0.7f, 0.7f));
4629 ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue, 0.8f, 0.8f));
4630 ImGui::Button(label, ImVec2(40.0f + sinf((
float)(line + n)) * 20.0f, 0.0f));
4631 ImGui::PopStyleColor(3);
4635 float scroll_x = ImGui::GetScrollX();
4636 float scroll_max_x = ImGui::GetScrollMaxX();
4638 ImGui::PopStyleVar(2);
4639 float scroll_x_delta = 0.0f;
4640 ImGui::SmallButton(
"<<");
4641 if (ImGui::IsItemActive())
4642 scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f;
4644 ImGui::Text(
"Scroll from code"); ImGui::SameLine();
4645 ImGui::SmallButton(
">>");
4646 if (ImGui::IsItemActive())
4647 scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f;
4649 ImGui::Text(
"%.0f/%.0f", scroll_x, scroll_max_x);
4650 if (scroll_x_delta != 0.0f)
4654 ImGui::BeginChild(
"scrolling");
4655 ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta);
4660 static bool show_horizontal_contents_size_demo_window =
false;
4661 ImGui::Checkbox(
"Show Horizontal contents size demo window", &show_horizontal_contents_size_demo_window);
4663 if (show_horizontal_contents_size_demo_window)
4665 static bool show_h_scrollbar =
true;
4666 static bool show_button =
true;
4667 static bool show_tree_nodes =
true;
4668 static bool show_text_wrapped =
false;
4669 static bool show_columns =
true;
4670 static bool show_tab_bar =
true;
4671 static bool show_child =
false;
4672 static bool explicit_content_size =
false;
4673 static float contents_size_x = 300.0f;
4674 if (explicit_content_size)
4675 ImGui::SetNextWindowContentSize(ImVec2(contents_size_x, 0.0f));
4676 ImGui::Begin(
"Horizontal contents size demo window", &show_horizontal_contents_size_demo_window, show_h_scrollbar ? ImGuiWindowFlags_HorizontalScrollbar : 0);
4678 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2, 0));
4679 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0));
4681 "Test how different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\n"
4682 "Use 'Metrics->Tools->Show windows rectangles' to visualize rectangles.");
4683 ImGui::Checkbox(
"H-scrollbar", &show_h_scrollbar);
4684 ImGui::Checkbox(
"Button", &show_button);
4685 ImGui::Checkbox(
"Tree nodes", &show_tree_nodes);
4686 ImGui::Checkbox(
"Text wrapped", &show_text_wrapped);
4687 ImGui::Checkbox(
"Columns", &show_columns);
4688 ImGui::Checkbox(
"Tab bar", &show_tab_bar);
4689 ImGui::Checkbox(
"Child", &show_child);
4690 ImGui::Checkbox(
"Explicit content size", &explicit_content_size);
4691 ImGui::Text(
"Scroll %.1f/%.1f %.1f/%.1f", ImGui::GetScrollX(), ImGui::GetScrollMaxX(), ImGui::GetScrollY(), ImGui::GetScrollMaxY());
4692 if (explicit_content_size)
4695 ImGui::SetNextItemWidth(100);
4696 ImGui::DragFloat(
"##csx", &contents_size_x);
4697 ImVec2 p = ImGui::GetCursorScreenPos();
4698 ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + 10, p.y + 10), IM_COL32_WHITE);
4699 ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(p.x + contents_size_x - 10, p.y), ImVec2(p.x + contents_size_x, p.y + 10), IM_COL32_WHITE);
4700 ImGui::Dummy(ImVec2(0, 10));
4702 ImGui::PopStyleVar(2);
4706 ImGui::Button(
"this is a 300-wide button", ImVec2(300, 0));
4708 if (show_tree_nodes)
4711 if (ImGui::TreeNode(
"this is a tree node"))
4713 if (ImGui::TreeNode(
"another one of those tree node..."))
4715 ImGui::Text(
"Some tree contents");
4720 ImGui::CollapsingHeader(
"CollapsingHeader", &open);
4722 if (show_text_wrapped)
4724 ImGui::TextWrapped(
"This text should automatically wrap on the edge of the work rectangle.");
4728 ImGui::Text(
"Tables:");
4729 if (ImGui::BeginTable(
"table", 4, ImGuiTableFlags_Borders))
4731 for (
int n = 0; n < 4; n++)
4733 ImGui::TableNextColumn();
4734 ImGui::Text(
"Width %.2f", ImGui::GetContentRegionAvail().x);
4738 ImGui::Text(
"Columns:");
4740 for (
int n = 0; n < 4; n++)
4742 ImGui::Text(
"Width %.2f", ImGui::GetColumnWidth());
4743 ImGui::NextColumn();
4747 if (show_tab_bar && ImGui::BeginTabBar(
"Hello"))
4749 if (ImGui::BeginTabItem(
"OneOneOne")) { ImGui::EndTabItem(); }
4750 if (ImGui::BeginTabItem(
"TwoTwoTwo")) { ImGui::EndTabItem(); }
4751 if (ImGui::BeginTabItem(
"ThreeThreeThree")) { ImGui::EndTabItem(); }
4752 if (ImGui::BeginTabItem(
"FourFourFour")) { ImGui::EndTabItem(); }
4757 ImGui::BeginChild(
"child", ImVec2(0, 0), ImGuiChildFlags_Borders);
4767 if (ImGui::TreeNode(
"Text Clipping"))
4769 static ImVec2
size(100.0f, 100.0f);
4770 static ImVec2 offset(30.0f, 30.0f);
4771 ImGui::DragFloat2(
"size", (
float*)&size, 0.5f, 1.0f, 200.0f,
"%.0f");
4772 ImGui::TextWrapped(
"(Click and drag to scroll)");
4775 "(Left) Using ImGui::PushClipRect():\n"
4776 "Will alter ImGui hit-testing logic + ImDrawList rendering.\n"
4777 "(use this if you want your clipping rectangle to affect interactions)\n\n"
4778 "(Center) Using ImDrawList::PushClipRect():\n"
4779 "Will alter ImDrawList rendering only.\n"
4780 "(use this as a shortcut if you are only using ImDrawList calls)\n\n"
4781 "(Right) Using ImDrawList::AddText() with a fine ClipRect:\n"
4782 "Will alter only this specific ImDrawList::AddText() rendering.\n"
4783 "This is often used internally to avoid altering the clipping rectangle and minimize draw calls.");
4785 for (
int n = 0; n < 3; n++)
4791 ImGui::InvisibleButton(
"##canvas", size);
4792 if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left))
4794 offset.x += ImGui::GetIO().MouseDelta.x;
4795 offset.y += ImGui::GetIO().MouseDelta.y;
4798 if (!ImGui::IsItemVisible())
4801 const ImVec2 p0 = ImGui::GetItemRectMin();
4802 const ImVec2 p1 = ImGui::GetItemRectMax();
4803 const char* text_str =
"Line 1 hello\nLine 2 clip me!";
4804 const ImVec2 text_pos = ImVec2(p0.x + offset.x, p0.y + offset.y);
4805 ImDrawList* draw_list = ImGui::GetWindowDrawList();
4809 ImGui::PushClipRect(p0, p1,
true);
4810 draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255));
4811 draw_list->AddText(text_pos, IM_COL32_WHITE, text_str);
4812 ImGui::PopClipRect();
4815 draw_list->PushClipRect(p0, p1,
true);
4816 draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255));
4817 draw_list->AddText(text_pos, IM_COL32_WHITE, text_str);
4818 draw_list->PopClipRect();
4821 ImVec4 clip_rect(p0.x, p0.y, p1.x, p1.y);
4822 draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255));
4823 draw_list->AddText(ImGui::GetFont(), ImGui::GetFontSize(), text_pos, IM_COL32_WHITE, text_str, NULL, 0.0f, &clip_rect);
4832 if (ImGui::TreeNode(
"Overlap Mode"))
4834 static bool enable_allow_overlap =
true;
4837 "Hit-testing is by default performed in item submission order, which generally is perceived as 'back-to-front'.\n\n"
4838 "By using SetNextItemAllowOverlap() you can notify that an item may be overlapped by another. "
4839 "Doing so alters the hovering logic: items using AllowOverlap mode requires an extra frame to accept hovered state.");
4840 ImGui::Checkbox(
"Enable AllowOverlap", &enable_allow_overlap);
4842 ImVec2 button1_pos = ImGui::GetCursorScreenPos();
4843 ImVec2 button2_pos = ImVec2(button1_pos.x + 50.0f, button1_pos.y + 50.0f);
4844 if (enable_allow_overlap)
4845 ImGui::SetNextItemAllowOverlap();
4846 ImGui::Button(
"Button 1", ImVec2(80, 80));
4847 ImGui::SetCursorScreenPos(button2_pos);
4848 ImGui::Button(
"Button 2", ImVec2(80, 80));
4853 if (enable_allow_overlap)
4854 ImGui::SetNextItemAllowOverlap();
4855 ImGui::Selectable(
"Some Selectable",
false);
4857 ImGui::SmallButton(
"++");
4867static void ShowDemoWindowPopups()
4870 if (!ImGui::CollapsingHeader(
"Popups & Modal windows"))
4892 if (ImGui::TreeNode(
"Popups"))
4895 "When a popup is active, it inhibits interacting with windows that are behind the popup. "
4896 "Clicking outside the popup closes it.");
4898 static int selected_fish = -1;
4899 const char* names[] = {
"Bream",
"Haddock",
"Mackerel",
"Pollock",
"Tilefish" };
4900 static bool toggles[] = {
true,
false,
false,
false,
false };
4904 if (ImGui::Button(
"Select.."))
4905 ImGui::OpenPopup(
"my_select_popup");
4908 if (ImGui::BeginPopup(
"my_select_popup"))
4910 ImGui::SeparatorText(
"Aquarium");
4911 for (
int i = 0; i < IM_ARRAYSIZE(names); i++)
4912 if (ImGui::Selectable(names[i]))
4918 if (ImGui::Button(
"Toggle.."))
4919 ImGui::OpenPopup(
"my_toggle_popup");
4920 if (ImGui::BeginPopup(
"my_toggle_popup"))
4922 for (
int i = 0; i < IM_ARRAYSIZE(names); i++)
4923 ImGui::MenuItem(names[i],
"", &toggles[i]);
4924 if (ImGui::BeginMenu(
"Sub-menu"))
4926 ImGui::MenuItem(
"Click me");
4931 ImGui::Text(
"Tooltip here");
4932 ImGui::SetItemTooltip(
"I am a tooltip over a popup");
4934 if (ImGui::Button(
"Stacked Popup"))
4935 ImGui::OpenPopup(
"another popup");
4936 if (ImGui::BeginPopup(
"another popup"))
4938 for (
int i = 0; i < IM_ARRAYSIZE(names); i++)
4939 ImGui::MenuItem(names[i],
"", &toggles[i]);
4940 if (ImGui::BeginMenu(
"Sub-menu"))
4942 ImGui::MenuItem(
"Click me");
4943 if (ImGui::Button(
"Stacked Popup"))
4944 ImGui::OpenPopup(
"another popup");
4945 if (ImGui::BeginPopup(
"another popup"))
4947 ImGui::Text(
"I am the last one here.");
4958 if (ImGui::Button(
"With a menu.."))
4959 ImGui::OpenPopup(
"my_file_popup");
4960 if (ImGui::BeginPopup(
"my_file_popup", ImGuiWindowFlags_MenuBar))
4962 if (ImGui::BeginMenuBar())
4964 if (ImGui::BeginMenu(
"File"))
4966 ShowExampleMenuFile();
4969 if (ImGui::BeginMenu(
"Edit"))
4971 ImGui::MenuItem(
"Dummy");
4974 ImGui::EndMenuBar();
4976 ImGui::Text(
"Hello from popup!");
4977 ImGui::Button(
"This is a dummy button..");
4985 if (ImGui::TreeNode(
"Context menus"))
4987 HelpMarker(
"\"Context\" functions are simple helpers to associate a Popup to a given Item or Window identifier.");
5002 const char* names[5] = {
"Label1",
"Label2",
"Label3",
"Label4",
"Label5" };
5003 static int selected = -1;
5004 for (
int n = 0; n < 5; n++)
5006 if (ImGui::Selectable(names[n], selected == n))
5008 if (ImGui::BeginPopupContextItem())
5011 ImGui::Text(
"This a popup for \"%s\"!", names[n]);
5012 if (ImGui::Button(
"Close"))
5013 ImGui::CloseCurrentPopup();
5016 ImGui::SetItemTooltip(
"Right-click to open popup");
5024 HelpMarker(
"Text() elements don't have stable identifiers so we need to provide one.");
5025 static float value = 0.5f;
5026 ImGui::Text(
"Value = %.3f <-- (1) right-click this text", value);
5027 if (ImGui::BeginPopupContextItem(
"my popup"))
5029 if (ImGui::Selectable(
"Set to zero")) value = 0.0f;
5030 if (ImGui::Selectable(
"Set to PI")) value = 3.1415f;
5031 ImGui::SetNextItemWidth(-FLT_MIN);
5032 ImGui::DragFloat(
"##Value", &value, 0.1f, 0.0f, 0.0f);
5039 ImGui::Text(
"(2) Or right-click this text");
5040 ImGui::OpenPopupOnItemClick(
"my popup", ImGuiPopupFlags_MouseButtonRight);
5043 if (ImGui::Button(
"(3) Or click this button"))
5044 ImGui::OpenPopup(
"my popup");
5052 HelpMarker(
"Showcase using a popup ID linked to item ID, with the item having a changing label + stable ID using the ### operator.");
5053 static char name[32] =
"Label1";
5055 sprintf(buf,
"Button: %s###Button", name);
5057 if (ImGui::BeginPopupContextItem())
5059 ImGui::Text(
"Edit name:");
5060 ImGui::InputText(
"##edit", name, IM_ARRAYSIZE(name));
5061 if (ImGui::Button(
"Close"))
5062 ImGui::CloseCurrentPopup();
5065 ImGui::SameLine(); ImGui::Text(
"(<-- right-click here)");
5072 if (ImGui::TreeNode(
"Modals"))
5074 ImGui::TextWrapped(
"Modal windows are like popups but the user cannot close them by clicking outside.");
5076 if (ImGui::Button(
"Delete.."))
5077 ImGui::OpenPopup(
"Delete?");
5080 ImVec2 center = ImGui::GetMainViewport()->GetCenter();
5081 ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
5083 if (ImGui::BeginPopupModal(
"Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
5085 ImGui::Text(
"All those beautiful files will be deleted.\nThis operation cannot be undone!");
5091 static bool dont_ask_me_next_time =
false;
5092 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
5093 ImGui::Checkbox(
"Don't ask me next time", &dont_ask_me_next_time);
5094 ImGui::PopStyleVar();
5096 if (ImGui::Button(
"OK", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); }
5097 ImGui::SetItemDefaultFocus();
5099 if (ImGui::Button(
"Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); }
5103 if (ImGui::Button(
"Stacked modals.."))
5104 ImGui::OpenPopup(
"Stacked 1");
5105 if (ImGui::BeginPopupModal(
"Stacked 1", NULL, ImGuiWindowFlags_MenuBar))
5107 if (ImGui::BeginMenuBar())
5109 if (ImGui::BeginMenu(
"File"))
5111 if (ImGui::MenuItem(
"Some menu item")) {}
5114 ImGui::EndMenuBar();
5116 ImGui::Text(
"Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDimBg] behind it.");
5119 static int item = 1;
5120 static float color[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
5121 ImGui::Combo(
"Combo", &item,
"aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
5122 ImGui::ColorEdit4(
"Color", color);
5124 if (ImGui::Button(
"Add another modal.."))
5125 ImGui::OpenPopup(
"Stacked 2");
5130 bool unused_open =
true;
5131 if (ImGui::BeginPopupModal(
"Stacked 2", &unused_open))
5133 ImGui::Text(
"Hello from Stacked The Second!");
5134 ImGui::ColorEdit4(
"Color", color);
5135 if (ImGui::Button(
"Close"))
5136 ImGui::CloseCurrentPopup();
5140 if (ImGui::Button(
"Close"))
5141 ImGui::CloseCurrentPopup();
5149 if (ImGui::TreeNode(
"Menus inside a regular window"))
5151 ImGui::TextWrapped(
"Below we are testing adding menu items to a regular window. It's rather unusual but should work!");
5154 ImGui::MenuItem(
"Menu item",
"CTRL+M");
5155 if (ImGui::BeginMenu(
"Menu inside a regular window"))
5157 ShowExampleMenuFile();
5176 MyItemColumnID_Name,
5177 MyItemColumnID_Action,
5178 MyItemColumnID_Quantity,
5179 MyItemColumnID_Description
5195 static const ImGuiTableSortSpecs* s_current_sort_specs;
5197 static void SortWithSortSpecs(ImGuiTableSortSpecs* sort_specs, MyItem* items,
int items_count)
5199 s_current_sort_specs = sort_specs;
5200 if (items_count > 1)
5201 qsort(items, (
size_t)items_count,
sizeof(items[0]), MyItem::CompareWithSortSpecs);
5202 s_current_sort_specs = NULL;
5206 static int IMGUI_CDECL CompareWithSortSpecs(
const void* lhs,
const void* rhs)
5208 const MyItem* a = (
const MyItem*)lhs;
5209 const MyItem* b = (
const MyItem*)rhs;
5210 for (
int n = 0; n < s_current_sort_specs->SpecsCount; n++)
5214 const ImGuiTableColumnSortSpecs* sort_spec = &s_current_sort_specs->Specs[n];
5216 switch (sort_spec->ColumnUserID)
5218 case MyItemColumnID_ID: delta = (a->ID - b->ID);
break;
5219 case MyItemColumnID_Name: delta = (strcmp(a->Name, b->Name));
break;
5220 case MyItemColumnID_Quantity: delta = (a->Quantity - b->Quantity);
break;
5221 case MyItemColumnID_Description: delta = (strcmp(a->Name, b->Name));
break;
5222 default: IM_ASSERT(0);
break;
5225 return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? +1 : -1;
5227 return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? -1 : +1;
5233 return (a->ID - b->ID);
5236const ImGuiTableSortSpecs* MyItem::s_current_sort_specs = NULL;
5240static void PushStyleCompact()
5242 ImGuiStyle& style = ImGui::GetStyle();
5243 ImGui::PushStyleVarY(ImGuiStyleVar_FramePadding, (
float)(
int)(style.FramePadding.y * 0.60f));
5244 ImGui::PushStyleVarY(ImGuiStyleVar_ItemSpacing, (
float)(
int)(style.ItemSpacing.y * 0.60f));
5247static void PopStyleCompact()
5249 ImGui::PopStyleVar(2);
5253static void EditTableSizingFlags(ImGuiTableFlags* p_flags)
5255 struct EnumDesc { ImGuiTableFlags Value;
const char* Name;
const char*
Tooltip; };
5256 static const EnumDesc policies[] =
5258 { ImGuiTableFlags_None,
"Default",
"Use default sizing policy:\n- ImGuiTableFlags_SizingFixedFit if ScrollX is on or if host window has ImGuiWindowFlags_AlwaysAutoResize.\n- ImGuiTableFlags_SizingStretchSame otherwise." },
5259 { ImGuiTableFlags_SizingFixedFit,
"ImGuiTableFlags_SizingFixedFit",
"Columns default to _WidthFixed (if resizable) or _WidthAuto (if not resizable), matching contents width." },
5260 { ImGuiTableFlags_SizingFixedSame,
"ImGuiTableFlags_SizingFixedSame",
"Columns are all the same width, matching the maximum contents width.\nImplicitly disable ImGuiTableFlags_Resizable and enable ImGuiTableFlags_NoKeepColumnsVisible." },
5261 { ImGuiTableFlags_SizingStretchProp,
"ImGuiTableFlags_SizingStretchProp",
"Columns default to _WidthStretch with weights proportional to their widths." },
5262 { ImGuiTableFlags_SizingStretchSame,
"ImGuiTableFlags_SizingStretchSame",
"Columns default to _WidthStretch with same weights." }
5265 for (idx = 0; idx < IM_ARRAYSIZE(policies); idx++)
5266 if (policies[idx].Value == (*p_flags & ImGuiTableFlags_SizingMask_))
5268 const char* preview_text = (idx < IM_ARRAYSIZE(policies)) ? policies[idx].Name + (idx > 0 ? strlen(
"ImGuiTableFlags") : 0) :
"";
5269 if (ImGui::BeginCombo(
"Sizing Policy", preview_text))
5271 for (
int n = 0; n < IM_ARRAYSIZE(policies); n++)
5272 if (ImGui::Selectable(policies[n].Name, idx == n))
5273 *p_flags = (*p_flags & ~ImGuiTableFlags_SizingMask_) | policies[n].Value;
5277 ImGui::TextDisabled(
"(?)");
5278 if (ImGui::BeginItemTooltip())
5280 ImGui::PushTextWrapPos(ImGui::GetFontSize() * 50.0f);
5281 for (
int m = 0; m < IM_ARRAYSIZE(policies); m++)
5284 ImGui::Text(
"%s:", policies[m].Name);
5286 ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetStyle().IndentSpacing * 0.5f);
5289 ImGui::PopTextWrapPos();
5290 ImGui::EndTooltip();
5294static void EditTableColumnsFlags(ImGuiTableColumnFlags* p_flags)
5296 ImGui::CheckboxFlags(
"_Disabled", p_flags, ImGuiTableColumnFlags_Disabled); ImGui::SameLine(); HelpMarker(
"Master disable flag (also hide from context menu)");
5297 ImGui::CheckboxFlags(
"_DefaultHide", p_flags, ImGuiTableColumnFlags_DefaultHide);
5298 ImGui::CheckboxFlags(
"_DefaultSort", p_flags, ImGuiTableColumnFlags_DefaultSort);
5299 if (ImGui::CheckboxFlags(
"_WidthStretch", p_flags, ImGuiTableColumnFlags_WidthStretch))
5300 *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthStretch);
5301 if (ImGui::CheckboxFlags(
"_WidthFixed", p_flags, ImGuiTableColumnFlags_WidthFixed))
5302 *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthFixed);
5303 ImGui::CheckboxFlags(
"_NoResize", p_flags, ImGuiTableColumnFlags_NoResize);
5304 ImGui::CheckboxFlags(
"_NoReorder", p_flags, ImGuiTableColumnFlags_NoReorder);
5305 ImGui::CheckboxFlags(
"_NoHide", p_flags, ImGuiTableColumnFlags_NoHide);
5306 ImGui::CheckboxFlags(
"_NoClip", p_flags, ImGuiTableColumnFlags_NoClip);
5307 ImGui::CheckboxFlags(
"_NoSort", p_flags, ImGuiTableColumnFlags_NoSort);
5308 ImGui::CheckboxFlags(
"_NoSortAscending", p_flags, ImGuiTableColumnFlags_NoSortAscending);
5309 ImGui::CheckboxFlags(
"_NoSortDescending", p_flags, ImGuiTableColumnFlags_NoSortDescending);
5310 ImGui::CheckboxFlags(
"_NoHeaderLabel", p_flags, ImGuiTableColumnFlags_NoHeaderLabel);
5311 ImGui::CheckboxFlags(
"_NoHeaderWidth", p_flags, ImGuiTableColumnFlags_NoHeaderWidth);
5312 ImGui::CheckboxFlags(
"_PreferSortAscending", p_flags, ImGuiTableColumnFlags_PreferSortAscending);
5313 ImGui::CheckboxFlags(
"_PreferSortDescending", p_flags, ImGuiTableColumnFlags_PreferSortDescending);
5314 ImGui::CheckboxFlags(
"_IndentEnable", p_flags, ImGuiTableColumnFlags_IndentEnable); ImGui::SameLine(); HelpMarker(
"Default for column 0");
5315 ImGui::CheckboxFlags(
"_IndentDisable", p_flags, ImGuiTableColumnFlags_IndentDisable); ImGui::SameLine(); HelpMarker(
"Default for column >0");
5316 ImGui::CheckboxFlags(
"_AngledHeader", p_flags, ImGuiTableColumnFlags_AngledHeader);
5319static void ShowTableColumnsStatusFlags(ImGuiTableColumnFlags flags)
5321 ImGui::CheckboxFlags(
"_IsEnabled", &flags, ImGuiTableColumnFlags_IsEnabled);
5322 ImGui::CheckboxFlags(
"_IsVisible", &flags, ImGuiTableColumnFlags_IsVisible);
5323 ImGui::CheckboxFlags(
"_IsSorted", &flags, ImGuiTableColumnFlags_IsSorted);
5324 ImGui::CheckboxFlags(
"_IsHovered", &flags, ImGuiTableColumnFlags_IsHovered);
5331static void ShowDemoWindowTables()
5335 if (!ImGui::CollapsingHeader(
"Tables & Columns"))
5340 const float TEXT_BASE_HEIGHT = ImGui::GetTextLineHeightWithSpacing();
5342 ImGui::PushID(
"Tables");
5344 int open_action = -1;
5345 if (ImGui::Button(
"Expand all"))
5348 if (ImGui::Button(
"Collapse all"))
5353 static bool disable_indent =
false;
5354 ImGui::Checkbox(
"Disable tree indentation", &disable_indent);
5356 HelpMarker(
"Disable the indenting of tree nodes so demo tables can use the full window width.");
5359 ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0.0f);
5372 if (open_action != -1)
5373 ImGui::SetNextItemOpen(open_action != 0);
5375 if (ImGui::TreeNode(
"Basic"))
5382 HelpMarker(
"Using TableNextRow() + calling TableSetColumnIndex() _before_ each cell, in a loop.");
5383 if (ImGui::BeginTable(
"table1", 3))
5385 for (
int row = 0; row < 4; row++)
5387 ImGui::TableNextRow();
5388 for (
int column = 0; column < 3; column++)
5390 ImGui::TableSetColumnIndex(column);
5391 ImGui::Text(
"Row %d Column %d", row, column);
5399 HelpMarker(
"Using TableNextRow() + calling TableNextColumn() _before_ each cell, manually.");
5400 if (ImGui::BeginTable(
"table2", 3))
5402 for (
int row = 0; row < 4; row++)
5404 ImGui::TableNextRow();
5405 ImGui::TableNextColumn();
5406 ImGui::Text(
"Row %d", row);
5407 ImGui::TableNextColumn();
5408 ImGui::Text(
"Some contents");
5409 ImGui::TableNextColumn();
5410 ImGui::Text(
"123.456");
5419 "Only using TableNextColumn(), which tends to be convenient for tables where every cell contains "
5420 "the same type of contents.\n This is also more similar to the old NextColumn() function of the "
5421 "Columns API, and provided to facilitate the Columns->Tables API transition.");
5422 if (ImGui::BeginTable(
"table3", 3))
5424 for (
int item = 0; item < 14; item++)
5426 ImGui::TableNextColumn();
5427 ImGui::Text(
"Item %d", item);
5435 if (open_action != -1)
5436 ImGui::SetNextItemOpen(open_action != 0);
5438 if (ImGui::TreeNode(
"Borders, background"))
5441 enum ContentsType { CT_Text, CT_FillButton };
5442 static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg;
5443 static bool display_headers =
false;
5444 static int contents_type = CT_Text;
5447 ImGui::CheckboxFlags(
"ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg);
5448 ImGui::CheckboxFlags(
"ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders);
5449 ImGui::SameLine(); HelpMarker(
"ImGuiTableFlags_Borders\n = ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterV\n | ImGuiTableFlags_BordersInnerH\n | ImGuiTableFlags_BordersOuterH");
5452 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH);
5454 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH);
5455 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH);
5458 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV);
5460 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV);
5461 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV);
5464 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersOuter", &flags, ImGuiTableFlags_BordersOuter);
5465 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersInner", &flags, ImGuiTableFlags_BordersInner);
5468 ImGui::AlignTextToFramePadding(); ImGui::Text(
"Cell contents:");
5469 ImGui::SameLine(); ImGui::RadioButton(
"Text", &contents_type, CT_Text);
5470 ImGui::SameLine(); ImGui::RadioButton(
"FillButton", &contents_type, CT_FillButton);
5471 ImGui::Checkbox(
"Display headers", &display_headers);
5472 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker(
"Disable vertical borders in columns Body (borders will always appear in Headers");
5475 if (ImGui::BeginTable(
"table1", 3, flags))
5479 if (display_headers)
5481 ImGui::TableSetupColumn(
"One");
5482 ImGui::TableSetupColumn(
"Two");
5483 ImGui::TableSetupColumn(
"Three");
5484 ImGui::TableHeadersRow();
5487 for (
int row = 0; row < 5; row++)
5489 ImGui::TableNextRow();
5490 for (
int column = 0; column < 3; column++)
5492 ImGui::TableSetColumnIndex(column);
5494 sprintf(buf,
"Hello %d,%d", column, row);
5495 if (contents_type == CT_Text)
5497 else if (contents_type == CT_FillButton)
5498 ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f));
5506 if (open_action != -1)
5507 ImGui::SetNextItemOpen(open_action != 0);
5509 if (ImGui::TreeNode(
"Resizable, stretch"))
5513 static ImGuiTableFlags flags = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody;
5515 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
5516 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV);
5517 ImGui::SameLine(); HelpMarker(
5518 "Using the _Resizable flag automatically enables the _BordersInnerV flag as well, "
5519 "this is why the resize borders are still showing when unchecking this.");
5522 if (ImGui::BeginTable(
"table1", 3, flags))
5524 for (
int row = 0; row < 5; row++)
5526 ImGui::TableNextRow();
5527 for (
int column = 0; column < 3; column++)
5529 ImGui::TableSetColumnIndex(column);
5530 ImGui::Text(
"Hello %d,%d", column, row);
5538 if (open_action != -1)
5539 ImGui::SetNextItemOpen(open_action != 0);
5541 if (ImGui::TreeNode(
"Resizable, fixed"))
5548 "Using _Resizable + _SizingFixedFit flags.\n"
5549 "Fixed-width columns generally makes more sense if you want to use horizontal scrolling.\n\n"
5550 "Double-click a column border to auto-fit the column to its contents.");
5552 static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody;
5553 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX);
5556 if (ImGui::BeginTable(
"table1", 3, flags))
5558 for (
int row = 0; row < 5; row++)
5560 ImGui::TableNextRow();
5561 for (
int column = 0; column < 3; column++)
5563 ImGui::TableSetColumnIndex(column);
5564 ImGui::Text(
"Hello %d,%d", column, row);
5572 if (open_action != -1)
5573 ImGui::SetNextItemOpen(open_action != 0);
5575 if (ImGui::TreeNode(
"Resizable, mixed"))
5578 "Using TableSetupColumn() to alter resizing policy on a per-column basis.\n\n"
5579 "When combining Fixed and Stretch columns, generally you only want one, maybe two trailing columns to use _WidthStretch.");
5580 static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable;
5582 if (ImGui::BeginTable(
"table1", 3, flags))
5584 ImGui::TableSetupColumn(
"AAA", ImGuiTableColumnFlags_WidthFixed);
5585 ImGui::TableSetupColumn(
"BBB", ImGuiTableColumnFlags_WidthFixed);
5586 ImGui::TableSetupColumn(
"CCC", ImGuiTableColumnFlags_WidthStretch);
5587 ImGui::TableHeadersRow();
5588 for (
int row = 0; row < 5; row++)
5590 ImGui::TableNextRow();
5591 for (
int column = 0; column < 3; column++)
5593 ImGui::TableSetColumnIndex(column);
5594 ImGui::Text(
"%s %d,%d", (column == 2) ?
"Stretch" :
"Fixed", column, row);
5599 if (ImGui::BeginTable(
"table2", 6, flags))
5601 ImGui::TableSetupColumn(
"AAA", ImGuiTableColumnFlags_WidthFixed);
5602 ImGui::TableSetupColumn(
"BBB", ImGuiTableColumnFlags_WidthFixed);
5603 ImGui::TableSetupColumn(
"CCC", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_DefaultHide);
5604 ImGui::TableSetupColumn(
"DDD", ImGuiTableColumnFlags_WidthStretch);
5605 ImGui::TableSetupColumn(
"EEE", ImGuiTableColumnFlags_WidthStretch);
5606 ImGui::TableSetupColumn(
"FFF", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_DefaultHide);
5607 ImGui::TableHeadersRow();
5608 for (
int row = 0; row < 5; row++)
5610 ImGui::TableNextRow();
5611 for (
int column = 0; column < 6; column++)
5613 ImGui::TableSetColumnIndex(column);
5614 ImGui::Text(
"%s %d,%d", (column >= 3) ?
"Stretch" :
"Fixed", column, row);
5622 if (open_action != -1)
5623 ImGui::SetNextItemOpen(open_action != 0);
5625 if (ImGui::TreeNode(
"Reorderable, hideable, with headers"))
5628 "Click and drag column headers to reorder columns.\n\n"
5629 "Right-click on a header to open a context menu.");
5630 static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV;
5632 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
5633 ImGui::CheckboxFlags(
"ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable);
5634 ImGui::CheckboxFlags(
"ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable);
5635 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody);
5636 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker(
"Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers)");
5637 ImGui::CheckboxFlags(
"ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn);
5640 if (ImGui::BeginTable(
"table1", 3, flags))
5644 ImGui::TableSetupColumn(
"One");
5645 ImGui::TableSetupColumn(
"Two");
5646 ImGui::TableSetupColumn(
"Three");
5647 ImGui::TableHeadersRow();
5648 for (
int row = 0; row < 6; row++)
5650 ImGui::TableNextRow();
5651 for (
int column = 0; column < 3; column++)
5653 ImGui::TableSetColumnIndex(column);
5654 ImGui::Text(
"Hello %d,%d", column, row);
5662 if (ImGui::BeginTable(
"table2", 3, flags | ImGuiTableFlags_SizingFixedFit, ImVec2(0.0f, 0.0f)))
5664 ImGui::TableSetupColumn(
"One");
5665 ImGui::TableSetupColumn(
"Two");
5666 ImGui::TableSetupColumn(
"Three");
5667 ImGui::TableHeadersRow();
5668 for (
int row = 0; row < 6; row++)
5670 ImGui::TableNextRow();
5671 for (
int column = 0; column < 3; column++)
5673 ImGui::TableSetColumnIndex(column);
5674 ImGui::Text(
"Fixed %d,%d", column, row);
5682 if (open_action != -1)
5683 ImGui::SetNextItemOpen(open_action != 0);
5685 if (ImGui::TreeNode(
"Padding"))
5690 "We often want outer padding activated when any using features which makes the edges of a column visible:\n"
5693 "- any form of row selection\n"
5694 "Because of this, activating BorderOuterV sets the default to PadOuterX. "
5695 "Using PadOuterX or NoPadOuterX you can override the default.\n\n"
5696 "Actual padding values are using style.CellPadding.\n\n"
5697 "In this demo we don't show horizontal borders to emphasize how they don't affect default horizontal padding.");
5699 static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV;
5701 ImGui::CheckboxFlags(
"ImGuiTableFlags_PadOuterX", &flags1, ImGuiTableFlags_PadOuterX);
5702 ImGui::SameLine(); HelpMarker(
"Enable outer-most padding (default if ImGuiTableFlags_BordersOuterV is set)");
5703 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoPadOuterX", &flags1, ImGuiTableFlags_NoPadOuterX);
5704 ImGui::SameLine(); HelpMarker(
"Disable outer-most padding (default if ImGuiTableFlags_BordersOuterV is not set)");
5705 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoPadInnerX", &flags1, ImGuiTableFlags_NoPadInnerX);
5706 ImGui::SameLine(); HelpMarker(
"Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off)");
5707 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersOuterV", &flags1, ImGuiTableFlags_BordersOuterV);
5708 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersInnerV", &flags1, ImGuiTableFlags_BordersInnerV);
5709 static bool show_headers =
false;
5710 ImGui::Checkbox(
"show_headers", &show_headers);
5713 if (ImGui::BeginTable(
"table_padding", 3, flags1))
5717 ImGui::TableSetupColumn(
"One");
5718 ImGui::TableSetupColumn(
"Two");
5719 ImGui::TableSetupColumn(
"Three");
5720 ImGui::TableHeadersRow();
5723 for (
int row = 0; row < 5; row++)
5725 ImGui::TableNextRow();
5726 for (
int column = 0; column < 3; column++)
5728 ImGui::TableSetColumnIndex(column);
5731 ImGui::Text(
"Avail %.2f", ImGui::GetContentRegionAvail().x);
5736 sprintf(buf,
"Hello %d,%d", column, row);
5737 ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f));
5748 HelpMarker(
"Setting style.CellPadding to (0,0) or a custom value.");
5749 static ImGuiTableFlags flags2 = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg;
5750 static ImVec2 cell_padding(0.0f, 0.0f);
5751 static bool show_widget_frame_bg =
true;
5754 ImGui::CheckboxFlags(
"ImGuiTableFlags_Borders", &flags2, ImGuiTableFlags_Borders);
5755 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersH", &flags2, ImGuiTableFlags_BordersH);
5756 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersV", &flags2, ImGuiTableFlags_BordersV);
5757 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersInner", &flags2, ImGuiTableFlags_BordersInner);
5758 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersOuter", &flags2, ImGuiTableFlags_BordersOuter);
5759 ImGui::CheckboxFlags(
"ImGuiTableFlags_RowBg", &flags2, ImGuiTableFlags_RowBg);
5760 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags2, ImGuiTableFlags_Resizable);
5761 ImGui::Checkbox(
"show_widget_frame_bg", &show_widget_frame_bg);
5762 ImGui::SliderFloat2(
"CellPadding", &cell_padding.x, 0.0f, 10.0f,
"%.0f");
5765 ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cell_padding);
5766 if (ImGui::BeginTable(
"table_padding_2", 3, flags2))
5768 static char text_bufs[3 * 5][16];
5769 static bool init =
true;
5770 if (!show_widget_frame_bg)
5771 ImGui::PushStyleColor(ImGuiCol_FrameBg, 0);
5772 for (
int cell = 0; cell < 3 * 5; cell++)
5774 ImGui::TableNextColumn();
5776 strcpy(text_bufs[cell],
"edit me");
5777 ImGui::SetNextItemWidth(-FLT_MIN);
5778 ImGui::PushID(cell);
5779 ImGui::InputText(
"##cell", text_bufs[cell], IM_ARRAYSIZE(text_bufs[cell]));
5782 if (!show_widget_frame_bg)
5783 ImGui::PopStyleColor();
5787 ImGui::PopStyleVar();
5792 if (open_action != -1)
5793 ImGui::SetNextItemOpen(open_action != 0);
5795 if (ImGui::TreeNode(
"Sizing policies"))
5797 static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody;
5799 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable);
5800 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoHostExtendX", &flags1, ImGuiTableFlags_NoHostExtendX);
5803 static ImGuiTableFlags sizing_policy_flags[4] = { ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingFixedSame, ImGuiTableFlags_SizingStretchProp, ImGuiTableFlags_SizingStretchSame };
5804 for (
int table_n = 0; table_n < 4; table_n++)
5806 ImGui::PushID(table_n);
5807 ImGui::SetNextItemWidth(TEXT_BASE_WIDTH * 30);
5808 EditTableSizingFlags(&sizing_policy_flags[table_n]);
5813 if (ImGui::BeginTable(
"table1", 3, sizing_policy_flags[table_n] | flags1))
5815 for (
int row = 0; row < 3; row++)
5817 ImGui::TableNextRow();
5818 ImGui::TableNextColumn(); ImGui::Text(
"Oh dear");
5819 ImGui::TableNextColumn(); ImGui::Text(
"Oh dear");
5820 ImGui::TableNextColumn(); ImGui::Text(
"Oh dear");
5824 if (ImGui::BeginTable(
"table2", 3, sizing_policy_flags[table_n] | flags1))
5826 for (
int row = 0; row < 3; row++)
5828 ImGui::TableNextRow();
5829 ImGui::TableNextColumn(); ImGui::Text(
"AAAA");
5830 ImGui::TableNextColumn(); ImGui::Text(
"BBBBBBBB");
5831 ImGui::TableNextColumn(); ImGui::Text(
"CCCCCCCCCCCC");
5842 "This section allows you to interact and see the effect of various sizing policies "
5843 "depending on whether Scroll is enabled and the contents of your columns.");
5845 enum ContentsType { CT_ShowWidth, CT_ShortText, CT_LongText, CT_Button, CT_FillButton, CT_InputText };
5846 static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable;
5847 static int contents_type = CT_ShowWidth;
5848 static int column_count = 3;
5851 ImGui::PushID(
"Advanced");
5852 ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30);
5853 EditTableSizingFlags(&flags);
5854 ImGui::Combo(
"Contents", &contents_type,
"Show width\0Short Text\0Long Text\0Button\0Fill Button\0InputText\0");
5855 if (contents_type == CT_FillButton)
5859 "Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop "
5860 "where contents width can feed into auto-column width can feed into contents width.");
5862 ImGui::DragInt(
"Columns", &column_count, 0.1f, 1, 64,
"%d", ImGuiSliderFlags_AlwaysClamp);
5863 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
5864 ImGui::CheckboxFlags(
"ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths);
5865 ImGui::SameLine(); HelpMarker(
"Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth.");
5866 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX);
5867 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
5868 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip);
5869 ImGui::PopItemWidth();
5873 if (ImGui::BeginTable(
"table2", column_count, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 7)))
5875 for (
int cell = 0; cell < 10 * column_count; cell++)
5877 ImGui::TableNextColumn();
5878 int column = ImGui::TableGetColumnIndex();
5879 int row = ImGui::TableGetRowIndex();
5881 ImGui::PushID(cell);
5883 static char text_buf[32] =
"";
5884 sprintf(label,
"Hello %d,%d", column, row);
5885 switch (contents_type)
5888 case CT_LongText: ImGui::Text(
"Some %s text %d,%d\nOver two lines..", column == 0 ?
"long" :
"longeeer", column, row);
break;
5889 case CT_ShowWidth: ImGui::Text(
"W: %.1f", ImGui::GetContentRegionAvail().x);
break;
5890 case CT_Button: ImGui::Button(label);
break;
5891 case CT_FillButton: ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f));
break;
5892 case CT_InputText: ImGui::SetNextItemWidth(-FLT_MIN); ImGui::InputText(
"##", text_buf, IM_ARRAYSIZE(text_buf));
break;
5901 if (open_action != -1)
5902 ImGui::SetNextItemOpen(open_action != 0);
5904 if (ImGui::TreeNode(
"Vertical scrolling, with clipping"))
5907 "Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\n"
5908 "We also demonstrate using ImGuiListClipper to virtualize the submission of many items.");
5909 static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable;
5912 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
5917 ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8);
5918 if (ImGui::BeginTable(
"table_scrolly", 3, flags, outer_size))
5920 ImGui::TableSetupScrollFreeze(0, 1);
5921 ImGui::TableSetupColumn(
"One", ImGuiTableColumnFlags_None);
5922 ImGui::TableSetupColumn(
"Two", ImGuiTableColumnFlags_None);
5923 ImGui::TableSetupColumn(
"Three", ImGuiTableColumnFlags_None);
5924 ImGui::TableHeadersRow();
5927 ImGuiListClipper clipper;
5928 clipper.Begin(1000);
5929 while (clipper.Step())
5931 for (
int row = clipper.DisplayStart; row < clipper.DisplayEnd; row++)
5933 ImGui::TableNextRow();
5934 for (
int column = 0; column < 3; column++)
5936 ImGui::TableSetColumnIndex(column);
5937 ImGui::Text(
"Hello %d,%d", column, row);
5946 if (open_action != -1)
5947 ImGui::SetNextItemOpen(open_action != 0);
5949 if (ImGui::TreeNode(
"Horizontal scrolling"))
5952 "When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, "
5953 "as automatically stretching columns doesn't make much sense with horizontal scrolling.\n\n"
5954 "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX, "
5955 "because the container window won't automatically extend vertically to fix contents "
5956 "(this may be improved in future versions).");
5957 static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable;
5958 static int freeze_cols = 1;
5959 static int freeze_rows = 1;
5962 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
5963 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX);
5964 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
5965 ImGui::SetNextItemWidth(ImGui::GetFrameHeight());
5966 ImGui::DragInt(
"freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput);
5967 ImGui::SetNextItemWidth(ImGui::GetFrameHeight());
5968 ImGui::DragInt(
"freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput);
5973 ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8);
5974 if (ImGui::BeginTable(
"table_scrollx", 7, flags, outer_size))
5976 ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows);
5977 ImGui::TableSetupColumn(
"Line #", ImGuiTableColumnFlags_NoHide);
5978 ImGui::TableSetupColumn(
"One");
5979 ImGui::TableSetupColumn(
"Two");
5980 ImGui::TableSetupColumn(
"Three");
5981 ImGui::TableSetupColumn(
"Four");
5982 ImGui::TableSetupColumn(
"Five");
5983 ImGui::TableSetupColumn(
"Six");
5984 ImGui::TableHeadersRow();
5985 for (
int row = 0; row < 20; row++)
5987 ImGui::TableNextRow();
5988 for (
int column = 0; column < 7; column++)
5996 if (!ImGui::TableSetColumnIndex(column) && column > 0)
5999 ImGui::Text(
"Line %d", row);
6001 ImGui::Text(
"Hello world %d,%d", column, row);
6011 "Showcase using Stretch columns + ScrollX together: "
6012 "this is rather unusual and only makes sense when specifying an 'inner_width' for the table!\n"
6013 "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns "
6014 "along with ScrollX doesn't make sense.");
6015 static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody;
6016 static float inner_width = 1000.0f;
6018 ImGui::PushID(
"flags3");
6019 ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30);
6020 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollX", &flags2, ImGuiTableFlags_ScrollX);
6021 ImGui::DragFloat(
"inner_width", &inner_width, 1.0f, 0.0f, FLT_MAX,
"%.1f");
6022 ImGui::PopItemWidth();
6025 if (ImGui::BeginTable(
"table2", 7, flags2, outer_size, inner_width))
6027 for (
int cell = 0; cell < 20 * 7; cell++)
6029 ImGui::TableNextColumn();
6030 ImGui::Text(
"Hello world %d,%d", ImGui::TableGetColumnIndex(), ImGui::TableGetRowIndex());
6037 if (open_action != -1)
6038 ImGui::SetNextItemOpen(open_action != 0);
6040 if (ImGui::TreeNode(
"Columns flags"))
6043 const int column_count = 3;
6044 const char* column_names[column_count] = {
"One",
"Two",
"Three" };
6045 static ImGuiTableColumnFlags column_flags[column_count] = { ImGuiTableColumnFlags_DefaultSort, ImGuiTableColumnFlags_None, ImGuiTableColumnFlags_DefaultHide };
6046 static ImGuiTableColumnFlags column_flags_out[column_count] = { 0, 0, 0 };
6048 if (ImGui::BeginTable(
"table_columns_flags_checkboxes", column_count, ImGuiTableFlags_None))
6051 for (
int column = 0; column < column_count; column++)
6053 ImGui::TableNextColumn();
6054 ImGui::PushID(column);
6055 ImGui::AlignTextToFramePadding();
6056 ImGui::Text(
"'%s'", column_names[column]);
6058 ImGui::Text(
"Input flags:");
6059 EditTableColumnsFlags(&column_flags[column]);
6061 ImGui::Text(
"Output flags:");
6062 ImGui::BeginDisabled();
6063 ShowTableColumnsStatusFlags(column_flags_out[column]);
6064 ImGui::EndDisabled();
6075 const ImGuiTableFlags flags
6076 = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY
6077 | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV
6078 | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable;
6079 ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 9);
6080 if (ImGui::BeginTable(
"table_columns_flags", column_count, flags, outer_size))
6082 bool has_angled_header =
false;
6083 for (
int column = 0; column < column_count; column++)
6085 has_angled_header |= (column_flags[column] & ImGuiTableColumnFlags_AngledHeader) != 0;
6086 ImGui::TableSetupColumn(column_names[column], column_flags[column]);
6088 if (has_angled_header)
6089 ImGui::TableAngledHeadersRow();
6090 ImGui::TableHeadersRow();
6091 for (
int column = 0; column < column_count; column++)
6092 column_flags_out[column] = ImGui::TableGetColumnFlags(column);
6093 float indent_step = (float)((
int)TEXT_BASE_WIDTH / 2);
6094 for (
int row = 0; row < 8; row++)
6097 ImGui::Indent(indent_step);
6098 ImGui::TableNextRow();
6099 for (
int column = 0; column < column_count; column++)
6101 ImGui::TableSetColumnIndex(column);
6102 ImGui::Text(
"%s %s", (column == 0) ?
"Indented" :
"Hello",
ImGui::TableGetColumnName(column));
6105 ImGui::Unindent(indent_step * 8.0f);
6112 if (open_action != -1)
6113 ImGui::SetNextItemOpen(open_action != 0);
6115 if (ImGui::TreeNode(
"Columns widths"))
6117 HelpMarker(
"Using TableSetupColumn() to setup default width.");
6119 static ImGuiTableFlags flags1 = ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBodyUntilResize;
6121 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable);
6122 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoBordersInBodyUntilResize", &flags1, ImGuiTableFlags_NoBordersInBodyUntilResize);
6124 if (ImGui::BeginTable(
"table1", 3, flags1))
6127 ImGui::TableSetupColumn(
"one", ImGuiTableColumnFlags_WidthFixed, 100.0f);
6128 ImGui::TableSetupColumn(
"two", ImGuiTableColumnFlags_WidthFixed, 200.0f);
6129 ImGui::TableSetupColumn(
"three", ImGuiTableColumnFlags_WidthFixed);
6130 ImGui::TableHeadersRow();
6131 for (
int row = 0; row < 4; row++)
6133 ImGui::TableNextRow();
6134 for (
int column = 0; column < 3; column++)
6136 ImGui::TableSetColumnIndex(column);
6138 ImGui::Text(
"(w: %5.1f)", ImGui::GetContentRegionAvail().x);
6140 ImGui::Text(
"Hello %d,%d", column, row);
6147 "Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, "
6148 "fixed columns with set width may still be shrunk down if there's not enough space in the host.");
6150 static ImGuiTableFlags flags2 = ImGuiTableFlags_None;
6152 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoKeepColumnsVisible", &flags2, ImGuiTableFlags_NoKeepColumnsVisible);
6153 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersInnerV", &flags2, ImGuiTableFlags_BordersInnerV);
6154 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersOuterV", &flags2, ImGuiTableFlags_BordersOuterV);
6156 if (ImGui::BeginTable(
"table2", 4, flags2))
6160 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed, 100.0f);
6161 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f);
6162 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 30.0f);
6163 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f);
6164 for (
int row = 0; row < 5; row++)
6166 ImGui::TableNextRow();
6167 for (
int column = 0; column < 4; column++)
6169 ImGui::TableSetColumnIndex(column);
6171 ImGui::Text(
"(w: %5.1f)", ImGui::GetContentRegionAvail().x);
6173 ImGui::Text(
"Hello %d,%d", column, row);
6181 if (open_action != -1)
6182 ImGui::SetNextItemOpen(open_action != 0);
6184 if (ImGui::TreeNode(
"Nested tables"))
6186 HelpMarker(
"This demonstrates embedding a table into another table cell.");
6188 if (ImGui::BeginTable(
"table_nested1", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable))
6190 ImGui::TableSetupColumn(
"A0");
6191 ImGui::TableSetupColumn(
"A1");
6192 ImGui::TableHeadersRow();
6194 ImGui::TableNextColumn();
6195 ImGui::Text(
"A0 Row 0");
6197 float rows_height = TEXT_BASE_HEIGHT * 2;
6198 if (ImGui::BeginTable(
"table_nested2", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable))
6200 ImGui::TableSetupColumn(
"B0");
6201 ImGui::TableSetupColumn(
"B1");
6202 ImGui::TableHeadersRow();
6204 ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height);
6205 ImGui::TableNextColumn();
6206 ImGui::Text(
"B0 Row 0");
6207 ImGui::TableNextColumn();
6208 ImGui::Text(
"B1 Row 0");
6209 ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height);
6210 ImGui::TableNextColumn();
6211 ImGui::Text(
"B0 Row 1");
6212 ImGui::TableNextColumn();
6213 ImGui::Text(
"B1 Row 1");
6218 ImGui::TableNextColumn(); ImGui::Text(
"A1 Row 0");
6219 ImGui::TableNextColumn(); ImGui::Text(
"A0 Row 1");
6220 ImGui::TableNextColumn(); ImGui::Text(
"A1 Row 1");
6226 if (open_action != -1)
6227 ImGui::SetNextItemOpen(open_action != 0);
6229 if (ImGui::TreeNode(
"Row height"))
6232 "You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, "
6233 "so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\n"
6234 "We cannot honor a _maximum_ row height as that would require a unique clipping rectangle per row.");
6235 if (ImGui::BeginTable(
"table_row_height", 1, ImGuiTableFlags_Borders))
6237 for (
int row = 0; row < 8; row++)
6239 float min_row_height = (float)(
int)(TEXT_BASE_HEIGHT * 0.30f * row);
6240 ImGui::TableNextRow(ImGuiTableRowFlags_None, min_row_height);
6241 ImGui::TableNextColumn();
6242 ImGui::Text(
"min_row_height = %.2f", min_row_height);
6248 "Showcase using SameLine(0,0) to share Current Line Height between cells.\n\n"
6249 "Please note that Tables Row Height is not the same thing as Current Line Height, "
6250 "as a table cell may contains multiple lines.");
6251 if (ImGui::BeginTable(
"table_share_lineheight", 2, ImGuiTableFlags_Borders))
6253 ImGui::TableNextRow();
6254 ImGui::TableNextColumn();
6255 ImGui::ColorButton(
"##1", ImVec4(0.13f, 0.26f, 0.40f, 1.0f), ImGuiColorEditFlags_None, ImVec2(40, 40));
6256 ImGui::TableNextColumn();
6257 ImGui::Text(
"Line 1");
6258 ImGui::Text(
"Line 2");
6260 ImGui::TableNextRow();
6261 ImGui::TableNextColumn();
6262 ImGui::ColorButton(
"##2", ImVec4(0.13f, 0.26f, 0.40f, 1.0f), ImGuiColorEditFlags_None, ImVec2(40, 40));
6263 ImGui::TableNextColumn();
6264 ImGui::SameLine(0.0f, 0.0f);
6265 ImGui::Text(
"Line 1, with SameLine(0,0)");
6266 ImGui::Text(
"Line 2");
6271 HelpMarker(
"Showcase altering CellPadding.y between rows. Note that CellPadding.x is locked for the entire table.");
6272 if (ImGui::BeginTable(
"table_changing_cellpadding_y", 1, ImGuiTableFlags_Borders))
6274 ImGuiStyle& style = ImGui::GetStyle();
6275 for (
int row = 0; row < 8; row++)
6278 ImGui::PushStyleVarY(ImGuiStyleVar_CellPadding, 20.0f);
6279 ImGui::TableNextRow(ImGuiTableRowFlags_None);
6280 ImGui::TableNextColumn();
6281 ImGui::Text(
"CellPadding.y = %.2f", style.CellPadding.y);
6283 ImGui::PopStyleVar();
6291 if (open_action != -1)
6292 ImGui::SetNextItemOpen(open_action != 0);
6294 if (ImGui::TreeNode(
"Outer size"))
6298 ImGui::Text(
"Using NoHostExtendX and NoHostExtendY:");
6300 static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_ContextMenuInBody | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX;
6301 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX);
6302 ImGui::SameLine(); HelpMarker(
"Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used.");
6303 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY);
6304 ImGui::SameLine(); HelpMarker(
"Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible.");
6307 ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 5.5f);
6308 if (ImGui::BeginTable(
"table1", 3, flags, outer_size))
6310 for (
int row = 0; row < 10; row++)
6312 ImGui::TableNextRow();
6313 for (
int column = 0; column < 3; column++)
6315 ImGui::TableNextColumn();
6316 ImGui::Text(
"Cell %d,%d", column, row);
6322 ImGui::Text(
"Hello!");
6326 ImGui::Text(
"Using explicit size:");
6327 if (ImGui::BeginTable(
"table2", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f)))
6329 for (
int row = 0; row < 5; row++)
6331 ImGui::TableNextRow();
6332 for (
int column = 0; column < 3; column++)
6334 ImGui::TableNextColumn();
6335 ImGui::Text(
"Cell %d,%d", column, row);
6341 if (ImGui::BeginTable(
"table3", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f)))
6343 for (
int row = 0; row < 3; row++)
6345 ImGui::TableNextRow(0, TEXT_BASE_HEIGHT * 1.5f);
6346 for (
int column = 0; column < 3; column++)
6348 ImGui::TableNextColumn();
6349 ImGui::Text(
"Cell %d,%d", column, row);
6358 if (open_action != -1)
6359 ImGui::SetNextItemOpen(open_action != 0);
6361 if (ImGui::TreeNode(
"Background color"))
6363 static ImGuiTableFlags flags = ImGuiTableFlags_RowBg;
6364 static int row_bg_type = 1;
6365 static int row_bg_target = 1;
6366 static int cell_bg_type = 1;
6369 ImGui::CheckboxFlags(
"ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders);
6370 ImGui::CheckboxFlags(
"ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg);
6371 ImGui::SameLine(); HelpMarker(
"ImGuiTableFlags_RowBg automatically sets RowBg0 to alternative colors pulled from the Style.");
6372 ImGui::Combo(
"row bg type", (
int*)&row_bg_type,
"None\0Red\0Gradient\0");
6373 ImGui::Combo(
"row bg target", (
int*)&row_bg_target,
"RowBg0\0RowBg1\0"); ImGui::SameLine(); HelpMarker(
"Target RowBg0 to override the alternating odd/even colors,\nTarget RowBg1 to blend with them.");
6374 ImGui::Combo(
"cell bg type", (
int*)&cell_bg_type,
"None\0Blue\0"); ImGui::SameLine(); HelpMarker(
"We are colorizing cells to B1->C2 here.");
6375 IM_ASSERT(row_bg_type >= 0 && row_bg_type <= 2);
6376 IM_ASSERT(row_bg_target >= 0 && row_bg_target <= 1);
6377 IM_ASSERT(cell_bg_type >= 0 && cell_bg_type <= 1);
6380 if (ImGui::BeginTable(
"table1", 5, flags))
6382 for (
int row = 0; row < 6; row++)
6384 ImGui::TableNextRow();
6388 if (row_bg_type != 0)
6390 ImU32 row_bg_color = ImGui::GetColorU32(row_bg_type == 1 ? ImVec4(0.7f, 0.3f, 0.3f, 0.65f) : ImVec4(0.2f + row * 0.1f, 0.2f, 0.2f, 0.65f));
6391 ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0 + row_bg_target, row_bg_color);
6395 for (
int column = 0; column < 5; column++)
6397 ImGui::TableSetColumnIndex(column);
6398 ImGui::Text(
"%c%c",
'A' + row,
'0' + column);
6404 if (row >= 1 && row <= 2 && column >= 1 && column <= 2 && cell_bg_type == 1)
6406 ImU32 cell_bg_color = ImGui::GetColorU32(ImVec4(0.3f, 0.3f, 0.7f, 0.65f));
6407 ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color);
6416 if (open_action != -1)
6417 ImGui::SetNextItemOpen(open_action != 0);
6419 if (ImGui::TreeNode(
"Tree view"))
6421 static ImGuiTableFlags flags = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody;
6423 static ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_SpanAllColumns;
6424 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_SpanFullWidth", &tree_node_flags, ImGuiTreeNodeFlags_SpanFullWidth);
6425 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_SpanTextWidth", &tree_node_flags, ImGuiTreeNodeFlags_SpanTextWidth);
6426 ImGui::CheckboxFlags(
"ImGuiTreeNodeFlags_SpanAllColumns", &tree_node_flags, ImGuiTreeNodeFlags_SpanAllColumns);
6428 HelpMarker(
"See \"Columns flags\" section to configure how indentation is applied to individual columns.");
6429 if (ImGui::BeginTable(
"3ways", 3, flags))
6432 ImGui::TableSetupColumn(
"Name", ImGuiTableColumnFlags_NoHide);
6433 ImGui::TableSetupColumn(
"Size", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f);
6434 ImGui::TableSetupColumn(
"Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f);
6435 ImGui::TableHeadersRow();
6445 static void DisplayNode(
const MyTreeNode* node,
const MyTreeNode* all_nodes)
6447 ImGui::TableNextRow();
6448 ImGui::TableNextColumn();
6449 const bool is_folder = (node->ChildCount > 0);
6452 bool open = ImGui::TreeNodeEx(node->Name, tree_node_flags);
6453 ImGui::TableNextColumn();
6454 ImGui::TextDisabled(
"--");
6455 ImGui::TableNextColumn();
6459 for (
int child_n = 0; child_n < node->ChildCount; child_n++)
6460 DisplayNode(&all_nodes[node->ChildIdx + child_n], all_nodes);
6466 ImGui::TreeNodeEx(node->Name, tree_node_flags | ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen);
6467 ImGui::TableNextColumn();
6468 ImGui::Text(
"%d", node->Size);
6469 ImGui::TableNextColumn();
6474 static const MyTreeNode nodes[] =
6476 {
"Root",
"Folder", -1, 1, 3 },
6477 {
"Music",
"Folder", -1, 4, 2 },
6478 {
"Textures",
"Folder", -1, 6, 3 },
6479 {
"desktop.ini",
"System file", 1024, -1,-1 },
6480 {
"File1_a.wav",
"Audio file", 123000, -1,-1 },
6481 {
"File1_b.wav",
"Audio file", 456000, -1,-1 },
6482 {
"Image001.png",
"Image file", 203128, -1,-1 },
6483 {
"Copy of Image001.png",
"Image file", 203256, -1,-1 },
6484 {
"Copy of Image001 (Final2).png",
"Image file", 203512, -1,-1 },
6487 MyTreeNode::DisplayNode(&nodes[0], nodes);
6494 if (open_action != -1)
6495 ImGui::SetNextItemOpen(open_action != 0);
6497 if (ImGui::TreeNode(
"Item width"))
6500 "Showcase using PushItemWidth() and how it is preserved on a per-column basis.\n\n"
6501 "Note that on auto-resizing non-resizable fixed columns, querying the content width for "
6502 "e.g. right-alignment doesn't make sense.");
6503 if (ImGui::BeginTable(
"table_item_width", 3, ImGuiTableFlags_Borders))
6505 ImGui::TableSetupColumn(
"small");
6506 ImGui::TableSetupColumn(
"half");
6507 ImGui::TableSetupColumn(
"right-align");
6508 ImGui::TableHeadersRow();
6510 for (
int row = 0; row < 3; row++)
6512 ImGui::TableNextRow();
6516 ImGui::TableSetColumnIndex(0);
6517 ImGui::PushItemWidth(TEXT_BASE_WIDTH * 3.0f);
6518 ImGui::TableSetColumnIndex(1);
6519 ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f);
6520 ImGui::TableSetColumnIndex(2);
6521 ImGui::PushItemWidth(-FLT_MIN);
6525 static float dummy_f = 0.0f;
6527 ImGui::TableSetColumnIndex(0);
6528 ImGui::SliderFloat(
"float0", &dummy_f, 0.0f, 1.0f);
6529 ImGui::TableSetColumnIndex(1);
6530 ImGui::SliderFloat(
"float1", &dummy_f, 0.0f, 1.0f);
6531 ImGui::TableSetColumnIndex(2);
6532 ImGui::SliderFloat(
"##float2", &dummy_f, 0.0f, 1.0f);
6541 if (open_action != -1)
6542 ImGui::SetNextItemOpen(open_action != 0);
6544 if (ImGui::TreeNode(
"Custom headers"))
6546 const int COLUMNS_COUNT = 3;
6547 if (ImGui::BeginTable(
"table_custom_headers", COLUMNS_COUNT, ImGuiTableFlags_Borders | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable))
6549 ImGui::TableSetupColumn(
"Apricot");
6550 ImGui::TableSetupColumn(
"Banana");
6551 ImGui::TableSetupColumn(
"Cherry");
6555 static bool column_selected[3] = {};
6562 ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
6563 for (
int column = 0; column < COLUMNS_COUNT; column++)
6565 ImGui::TableSetColumnIndex(column);
6566 const char* column_name = ImGui::TableGetColumnName(column);
6567 ImGui::PushID(column);
6568 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
6569 ImGui::Checkbox(
"##checkall", &column_selected[column]);
6570 ImGui::PopStyleVar();
6571 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
6572 ImGui::TableHeader(column_name);
6577 for (
int row = 0; row < 5; row++)
6579 ImGui::TableNextRow();
6580 for (
int column = 0; column < 3; column++)
6583 sprintf(buf,
"Cell %d,%d", column, row);
6584 ImGui::TableSetColumnIndex(column);
6585 ImGui::Selectable(buf, column_selected[column]);
6594 if (open_action != -1)
6595 ImGui::SetNextItemOpen(open_action != 0);
6597 if (ImGui::TreeNode(
"Angled headers"))
6599 const char* column_names[] = {
"Track",
"cabasa",
"ride",
"smash",
"tom-hi",
"tom-mid",
"tom-low",
"hihat-o",
"hihat-c",
"snare-s",
"snare-c",
"clap",
"rim",
"kick" };
6600 const int columns_count = IM_ARRAYSIZE(column_names);
6601 const int rows_count = 12;
6603 static ImGuiTableFlags table_flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_Hideable | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_HighlightHoveredColumn;
6604 static ImGuiTableColumnFlags column_flags = ImGuiTableColumnFlags_AngledHeader | ImGuiTableColumnFlags_WidthFixed;
6605 static bool bools[columns_count * rows_count] = {};
6606 static int frozen_cols = 1;
6607 static int frozen_rows = 2;
6608 ImGui::CheckboxFlags(
"_ScrollX", &table_flags, ImGuiTableFlags_ScrollX);
6609 ImGui::CheckboxFlags(
"_ScrollY", &table_flags, ImGuiTableFlags_ScrollY);
6610 ImGui::CheckboxFlags(
"_Resizable", &table_flags, ImGuiTableFlags_Resizable);
6611 ImGui::CheckboxFlags(
"_Sortable", &table_flags, ImGuiTableFlags_Sortable);
6612 ImGui::CheckboxFlags(
"_NoBordersInBody", &table_flags, ImGuiTableFlags_NoBordersInBody);
6613 ImGui::CheckboxFlags(
"_HighlightHoveredColumn", &table_flags, ImGuiTableFlags_HighlightHoveredColumn);
6614 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
6615 ImGui::SliderInt(
"Frozen columns", &frozen_cols, 0, 2);
6616 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
6617 ImGui::SliderInt(
"Frozen rows", &frozen_rows, 0, 2);
6618 ImGui::CheckboxFlags(
"Disable header contributing to column width", &column_flags, ImGuiTableColumnFlags_NoHeaderWidth);
6620 if (ImGui::TreeNode(
"Style settings"))
6623 HelpMarker(
"Giving access to some ImGuiStyle value in this demo for convenience.");
6624 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
6625 ImGui::SliderAngle(
"style.TableAngledHeadersAngle", &ImGui::GetStyle().TableAngledHeadersAngle, -50.0f, +50.0f);
6626 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
6627 ImGui::SliderFloat2(
"style.TableAngledHeadersTextAlign", (
float*)&ImGui::GetStyle().TableAngledHeadersTextAlign, 0.0f, 1.0f,
"%.2f");
6631 if (ImGui::BeginTable(
"table_angled_headers", columns_count, table_flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 12)))
6633 ImGui::TableSetupColumn(column_names[0], ImGuiTableColumnFlags_NoHide | ImGuiTableColumnFlags_NoReorder);
6634 for (
int n = 1; n < columns_count; n++)
6635 ImGui::TableSetupColumn(column_names[n], column_flags);
6636 ImGui::TableSetupScrollFreeze(frozen_cols, frozen_rows);
6638 ImGui::TableAngledHeadersRow();
6639 ImGui::TableHeadersRow();
6640 for (
int row = 0; row < rows_count; row++)
6643 ImGui::TableNextRow();
6644 ImGui::TableSetColumnIndex(0);
6645 ImGui::AlignTextToFramePadding();
6646 ImGui::Text(
"Track %d", row);
6647 for (
int column = 1; column < columns_count; column++)
6648 if (ImGui::TableSetColumnIndex(column))
6650 ImGui::PushID(column);
6651 ImGui::Checkbox(
"", &bools[row * columns_count + column]);
6663 if (open_action != -1)
6664 ImGui::SetNextItemOpen(open_action != 0);
6666 if (ImGui::TreeNode(
"Context menus"))
6669 "By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\n"
6670 "Using ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body.");
6671 static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody;
6674 ImGui::CheckboxFlags(
"ImGuiTableFlags_ContextMenuInBody", &flags1, ImGuiTableFlags_ContextMenuInBody);
6680 const int COLUMNS_COUNT = 3;
6681 if (ImGui::BeginTable(
"table_context_menu", COLUMNS_COUNT, flags1))
6683 ImGui::TableSetupColumn(
"One");
6684 ImGui::TableSetupColumn(
"Two");
6685 ImGui::TableSetupColumn(
"Three");
6688 ImGui::TableHeadersRow();
6691 for (
int row = 0; row < 4; row++)
6693 ImGui::TableNextRow();
6694 for (
int column = 0; column < COLUMNS_COUNT; column++)
6696 ImGui::TableSetColumnIndex(column);
6697 ImGui::Text(
"Cell %d,%d", column, row);
6708 "Demonstrate mixing table context menu (over header), item context button (over button) "
6709 "and custom per-colunm context menu (over column body).");
6710 ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders;
6711 if (ImGui::BeginTable(
"table_context_menu_2", COLUMNS_COUNT, flags2))
6713 ImGui::TableSetupColumn(
"One");
6714 ImGui::TableSetupColumn(
"Two");
6715 ImGui::TableSetupColumn(
"Three");
6718 ImGui::TableHeadersRow();
6719 for (
int row = 0; row < 4; row++)
6721 ImGui::TableNextRow();
6722 for (
int column = 0; column < COLUMNS_COUNT; column++)
6725 ImGui::TableSetColumnIndex(column);
6726 ImGui::Text(
"Cell %d,%d", column, row);
6730 ImGui::PushID(row * COLUMNS_COUNT + column);
6731 ImGui::SmallButton(
"..");
6732 if (ImGui::BeginPopupContextItem())
6734 ImGui::Text(
"This is the popup for Button(\"..\") in Cell %d,%d", column, row);
6735 if (ImGui::Button(
"Close"))
6736 ImGui::CloseCurrentPopup();
6746 int hovered_column = -1;
6747 for (
int column = 0; column < COLUMNS_COUNT + 1; column++)
6749 ImGui::PushID(column);
6750 if (ImGui::TableGetColumnFlags(column) & ImGuiTableColumnFlags_IsHovered)
6751 hovered_column = column;
6752 if (hovered_column == column && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(1))
6753 ImGui::OpenPopup(
"MyPopup");
6754 if (ImGui::BeginPopup(
"MyPopup"))
6756 if (column == COLUMNS_COUNT)
6757 ImGui::Text(
"This is a custom popup for unused space after the last column.");
6759 ImGui::Text(
"This is a custom popup for Column %d", column);
6760 if (ImGui::Button(
"Close"))
6761 ImGui::CloseCurrentPopup();
6768 ImGui::Text(
"Hovered column: %d", hovered_column);
6774 if (open_action != -1)
6775 ImGui::SetNextItemOpen(open_action != 0);
6777 if (ImGui::TreeNode(
"Synced instances"))
6779 HelpMarker(
"Multiple tables with the same identifier will share their settings, width, visibility, order etc.");
6781 static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings;
6782 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
6783 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
6784 ImGui::CheckboxFlags(
"ImGuiTableFlags_SizingFixedFit", &flags, ImGuiTableFlags_SizingFixedFit);
6785 ImGui::CheckboxFlags(
"ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn);
6786 for (
int n = 0; n < 3; n++)
6789 sprintf(buf,
"Synced Table %d", n);
6790 bool open = ImGui::CollapsingHeader(buf, ImGuiTreeNodeFlags_DefaultOpen);
6791 if (open && ImGui::BeginTable(
"Table", 3, flags, ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 5)))
6793 ImGui::TableSetupColumn(
"One");
6794 ImGui::TableSetupColumn(
"Two");
6795 ImGui::TableSetupColumn(
"Three");
6796 ImGui::TableHeadersRow();
6797 const int cell_count = (n == 1) ? 27 : 9;
6798 for (
int cell = 0; cell < cell_count; cell++)
6800 ImGui::TableNextColumn();
6801 ImGui::Text(
"this cell %d", cell);
6812 static const char* template_items_names[] =
6814 "Banana",
"Apple",
"Cherry",
"Watermelon",
"Grapefruit",
"Strawberry",
"Mango",
6815 "Kiwi",
"Orange",
"Pineapple",
"Blueberry",
"Plum",
"Coconut",
"Pear",
"Apricot"
6817 if (open_action != -1)
6818 ImGui::SetNextItemOpen(open_action != 0);
6820 if (ImGui::TreeNode(
"Sorting"))
6823 static ImVector<MyItem> items;
6824 if (items.Size == 0)
6826 items.resize(50, MyItem());
6827 for (
int n = 0; n < items.Size; n++)
6829 const int template_n = n % IM_ARRAYSIZE(template_items_names);
6830 MyItem& item = items[n];
6832 item.Name = template_items_names[template_n];
6833 item.Quantity = (n * n - n) % 20;
6838 static ImGuiTableFlags flags =
6839 ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti
6840 | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_NoBordersInBody
6841 | ImGuiTableFlags_ScrollY;
6843 ImGui::CheckboxFlags(
"ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti);
6844 ImGui::SameLine(); HelpMarker(
"When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1).");
6845 ImGui::CheckboxFlags(
"ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate);
6846 ImGui::SameLine(); HelpMarker(
"When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0).");
6849 if (ImGui::BeginTable(
"table_sorting", 4, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 15), 0.0f))
6858 ImGui::TableSetupColumn(
"ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_ID);
6859 ImGui::TableSetupColumn(
"Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name);
6860 ImGui::TableSetupColumn(
"Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action);
6861 ImGui::TableSetupColumn(
"Quantity", ImGuiTableColumnFlags_PreferSortDescending | ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Quantity);
6862 ImGui::TableSetupScrollFreeze(0, 1);
6863 ImGui::TableHeadersRow();
6866 if (ImGuiTableSortSpecs* sort_specs = ImGui::TableGetSortSpecs())
6867 if (sort_specs->SpecsDirty)
6869 MyItem::SortWithSortSpecs(sort_specs, items.Data, items.Size);
6870 sort_specs->SpecsDirty =
false;
6874 ImGuiListClipper clipper;
6875 clipper.Begin(items.Size);
6876 while (clipper.Step())
6877 for (
int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++)
6880 MyItem* item = &items[row_n];
6881 ImGui::PushID(item->ID);
6882 ImGui::TableNextRow();
6883 ImGui::TableNextColumn();
6884 ImGui::Text(
"%04d", item->ID);
6885 ImGui::TableNextColumn();
6887 ImGui::TableNextColumn();
6888 ImGui::SmallButton(
"None");
6889 ImGui::TableNextColumn();
6890 ImGui::Text(
"%d", item->Quantity);
6902 if (open_action != -1)
6903 ImGui::SetNextItemOpen(open_action != 0);
6905 if (ImGui::TreeNode(
"Advanced"))
6907 static ImGuiTableFlags flags =
6908 ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable
6909 | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti
6910 | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBody
6911 | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY
6912 | ImGuiTableFlags_SizingFixedFit;
6913 static ImGuiTableColumnFlags columns_base_flags = ImGuiTableColumnFlags_None;
6915 enum ContentsType { CT_Text, CT_Button, CT_SmallButton, CT_FillButton, CT_Selectable, CT_SelectableSpanRow };
6916 static int contents_type = CT_SelectableSpanRow;
6917 const char* contents_type_names[] = {
"Text",
"Button",
"SmallButton",
"FillButton",
"Selectable",
"Selectable (span row)" };
6918 static int freeze_cols = 1;
6919 static int freeze_rows = 1;
6920 static int items_count = IM_ARRAYSIZE(template_items_names) * 2;
6921 static ImVec2 outer_size_value = ImVec2(0.0f, TEXT_BASE_HEIGHT * 12);
6922 static float row_min_height = 0.0f;
6923 static float inner_width_with_scroll = 0.0f;
6924 static bool outer_size_enabled =
true;
6925 static bool show_headers =
true;
6926 static bool show_wrapped_text =
false;
6929 if (ImGui::TreeNode(
"Options"))
6933 ImGui::PushItemWidth(TEXT_BASE_WIDTH * 28.0f);
6935 if (ImGui::TreeNodeEx(
"Features:", ImGuiTreeNodeFlags_DefaultOpen))
6937 ImGui::CheckboxFlags(
"ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
6938 ImGui::CheckboxFlags(
"ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable);
6939 ImGui::CheckboxFlags(
"ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable);
6940 ImGui::CheckboxFlags(
"ImGuiTableFlags_Sortable", &flags, ImGuiTableFlags_Sortable);
6941 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoSavedSettings", &flags, ImGuiTableFlags_NoSavedSettings);
6942 ImGui::CheckboxFlags(
"ImGuiTableFlags_ContextMenuInBody", &flags, ImGuiTableFlags_ContextMenuInBody);
6946 if (ImGui::TreeNodeEx(
"Decorations:", ImGuiTreeNodeFlags_DefaultOpen))
6948 ImGui::CheckboxFlags(
"ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg);
6949 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV);
6950 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV);
6951 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV);
6952 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH);
6953 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH);
6954 ImGui::CheckboxFlags(
"ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH);
6955 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker(
"Disable vertical borders in columns Body (borders will always appear in Headers");
6956 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker(
"Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers)");
6960 if (ImGui::TreeNodeEx(
"Sizing:", ImGuiTreeNodeFlags_DefaultOpen))
6962 EditTableSizingFlags(&flags);
6963 ImGui::SameLine(); HelpMarker(
"In the Advanced demo we override the policy of each column so those table-wide settings have less effect that typical.");
6964 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX);
6965 ImGui::SameLine(); HelpMarker(
"Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used.");
6966 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY);
6967 ImGui::SameLine(); HelpMarker(
"Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible.");
6968 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoKeepColumnsVisible", &flags, ImGuiTableFlags_NoKeepColumnsVisible);
6969 ImGui::SameLine(); HelpMarker(
"Only available if ScrollX is disabled.");
6970 ImGui::CheckboxFlags(
"ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths);
6971 ImGui::SameLine(); HelpMarker(
"Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth.");
6972 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip);
6973 ImGui::SameLine(); HelpMarker(
"Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with ScrollFreeze options.");
6977 if (ImGui::TreeNodeEx(
"Padding:", ImGuiTreeNodeFlags_DefaultOpen))
6979 ImGui::CheckboxFlags(
"ImGuiTableFlags_PadOuterX", &flags, ImGuiTableFlags_PadOuterX);
6980 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoPadOuterX", &flags, ImGuiTableFlags_NoPadOuterX);
6981 ImGui::CheckboxFlags(
"ImGuiTableFlags_NoPadInnerX", &flags, ImGuiTableFlags_NoPadInnerX);
6985 if (ImGui::TreeNodeEx(
"Scrolling:", ImGuiTreeNodeFlags_DefaultOpen))
6987 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX);
6989 ImGui::SetNextItemWidth(ImGui::GetFrameHeight());
6990 ImGui::DragInt(
"freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput);
6991 ImGui::CheckboxFlags(
"ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
6993 ImGui::SetNextItemWidth(ImGui::GetFrameHeight());
6994 ImGui::DragInt(
"freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput);
6998 if (ImGui::TreeNodeEx(
"Sorting:", ImGuiTreeNodeFlags_DefaultOpen))
7000 ImGui::CheckboxFlags(
"ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti);
7001 ImGui::SameLine(); HelpMarker(
"When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1).");
7002 ImGui::CheckboxFlags(
"ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate);
7003 ImGui::SameLine(); HelpMarker(
"When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0).");
7007 if (ImGui::TreeNodeEx(
"Headers:", ImGuiTreeNodeFlags_DefaultOpen))
7009 ImGui::Checkbox(
"show_headers", &show_headers);
7010 ImGui::CheckboxFlags(
"ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn);
7011 ImGui::CheckboxFlags(
"ImGuiTableColumnFlags_AngledHeader", &columns_base_flags, ImGuiTableColumnFlags_AngledHeader);
7012 ImGui::SameLine(); HelpMarker(
"Enable AngledHeader on all columns. Best enabled on selected narrow columns (see \"Angled headers\" section of the demo).");
7016 if (ImGui::TreeNodeEx(
"Other:", ImGuiTreeNodeFlags_DefaultOpen))
7018 ImGui::Checkbox(
"show_wrapped_text", &show_wrapped_text);
7020 ImGui::DragFloat2(
"##OuterSize", &outer_size_value.x);
7021 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
7022 ImGui::Checkbox(
"outer_size", &outer_size_enabled);
7024 HelpMarker(
"If scrolling is disabled (ScrollX and ScrollY not set):\n"
7025 "- The table is output directly in the parent window.\n"
7026 "- OuterSize.x < 0.0f will right-align the table.\n"
7027 "- OuterSize.x = 0.0f will narrow fit the table unless there are any Stretch columns.\n"
7028 "- OuterSize.y then becomes the minimum size for the table, which will extend vertically if there are more rows (unless NoHostExtendY is set).");
7032 ImGui::DragFloat(
"inner_width (when ScrollX active)", &inner_width_with_scroll, 1.0f, 0.0f, FLT_MAX);
7034 ImGui::DragFloat(
"row_min_height", &row_min_height, 1.0f, 0.0f, FLT_MAX);
7035 ImGui::SameLine(); HelpMarker(
"Specify height of the Selectable item.");
7037 ImGui::DragInt(
"items_count", &items_count, 0.1f, 0, 9999);
7038 ImGui::Combo(
"items_type (first column)", &contents_type, contents_type_names, IM_ARRAYSIZE(contents_type_names));
7043 ImGui::PopItemWidth();
7050 static ImVector<MyItem> items;
7051 static ImVector<int> selection;
7052 static bool items_need_sort =
false;
7053 if (items.Size != items_count)
7055 items.resize(items_count, MyItem());
7056 for (
int n = 0; n < items_count; n++)
7058 const int template_n = n % IM_ARRAYSIZE(template_items_names);
7059 MyItem& item = items[n];
7061 item.Name = template_items_names[template_n];
7062 item.Quantity = (template_n == 3) ? 10 : (template_n == 4) ? 20 : 0;
7066 const ImDrawList* parent_draw_list = ImGui::GetWindowDrawList();
7067 const int parent_draw_list_draw_cmd_count = parent_draw_list->CmdBuffer.Size;
7068 ImVec2 table_scroll_cur, table_scroll_max;
7069 const ImDrawList* table_draw_list = NULL;
7072 const float inner_width_to_use = (flags & ImGuiTableFlags_ScrollX) ? inner_width_with_scroll : 0.0f;
7073 if (ImGui::BeginTable(
"table_advanced", 6, flags, outer_size_enabled ? outer_size_value : ImVec2(0, 0), inner_width_to_use))
7078 ImGui::TableSetupColumn(
"ID", columns_base_flags | ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID);
7079 ImGui::TableSetupColumn(
"Name", columns_base_flags | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name);
7080 ImGui::TableSetupColumn(
"Action", columns_base_flags | ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action);
7081 ImGui::TableSetupColumn(
"Quantity", columns_base_flags | ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity);
7082 ImGui::TableSetupColumn(
"Description", columns_base_flags | ((flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch), 0.0f, MyItemColumnID_Description);
7083 ImGui::TableSetupColumn(
"Hidden", columns_base_flags | ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort);
7084 ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows);
7087 ImGuiTableSortSpecs* sort_specs = ImGui::TableGetSortSpecs();
7088 if (sort_specs && sort_specs->SpecsDirty)
7089 items_need_sort =
true;
7090 if (sort_specs && items_need_sort && items.Size > 1)
7092 MyItem::SortWithSortSpecs(sort_specs, items.Data, items.Size);
7093 sort_specs->SpecsDirty =
false;
7095 items_need_sort =
false;
7099 const bool sorts_specs_using_quantity = (ImGui::TableGetColumnFlags(3) & ImGuiTableColumnFlags_IsSorted) != 0;
7102 if (show_headers && (columns_base_flags & ImGuiTableColumnFlags_AngledHeader) != 0)
7103 ImGui::TableAngledHeadersRow();
7105 ImGui::TableHeadersRow();
7111 ImGuiListClipper clipper;
7112 clipper.Begin(items.Size);
7113 while (clipper.Step())
7115 for (
int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++)
7119 for (
int row_n = 0; row_n < items.Size; row_n++)
7122 MyItem* item = &items[row_n];
7126 const bool item_is_selected = selection.contains(item->ID);
7127 ImGui::PushID(item->ID);
7128 ImGui::TableNextRow(ImGuiTableRowFlags_None, row_min_height);
7131 ImGui::TableSetColumnIndex(0);
7133 sprintf(label,
"%04d", item->ID);
7134 if (contents_type == CT_Text)
7136 else if (contents_type == CT_Button)
7137 ImGui::Button(label);
7138 else if (contents_type == CT_SmallButton)
7139 ImGui::SmallButton(label);
7140 else if (contents_type == CT_FillButton)
7141 ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f));
7142 else if (contents_type == CT_Selectable || contents_type == CT_SelectableSpanRow)
7144 ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap : ImGuiSelectableFlags_None;
7145 if (ImGui::Selectable(label, item_is_selected, selectable_flags, ImVec2(0, row_min_height)))
7147 if (ImGui::GetIO().KeyCtrl)
7149 if (item_is_selected)
7150 selection.find_erase_unsorted(item->ID);
7152 selection.push_back(item->ID);
7157 selection.push_back(item->ID);
7162 if (ImGui::TableSetColumnIndex(1))
7169 if (ImGui::TableSetColumnIndex(2))
7171 if (ImGui::SmallButton(
"Chop")) { item->Quantity += 1; }
7172 if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort =
true; }
7174 if (ImGui::SmallButton(
"Eat")) { item->Quantity -= 1; }
7175 if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort =
true; }
7178 if (ImGui::TableSetColumnIndex(3))
7179 ImGui::Text(
"%d", item->Quantity);
7181 ImGui::TableSetColumnIndex(4);
7182 if (show_wrapped_text)
7183 ImGui::TextWrapped(
"Lorem ipsum dolor sit amet");
7185 ImGui::Text(
"Lorem ipsum dolor sit amet");
7187 if (ImGui::TableSetColumnIndex(5))
7188 ImGui::Text(
"1234");
7195 table_scroll_cur = ImVec2(ImGui::GetScrollX(), ImGui::GetScrollY());
7196 table_scroll_max = ImVec2(ImGui::GetScrollMaxX(), ImGui::GetScrollMaxY());
7197 table_draw_list = ImGui::GetWindowDrawList();
7200 static bool show_debug_details =
false;
7201 ImGui::Checkbox(
"Debug details", &show_debug_details);
7202 if (show_debug_details && table_draw_list)
7204 ImGui::SameLine(0.0f, 0.0f);
7205 const int table_draw_list_draw_cmd_count = table_draw_list->CmdBuffer.Size;
7206 if (table_draw_list == parent_draw_list)
7207 ImGui::Text(
": DrawCmd: +%d (in same window)",
7208 table_draw_list_draw_cmd_count - parent_draw_list_draw_cmd_count);
7210 ImGui::Text(
": DrawCmd: +%d (in child window), Scroll: (%.f/%.f) (%.f/%.f)",
7211 table_draw_list_draw_cmd_count - 1, table_scroll_cur.x, table_scroll_max.x, table_scroll_cur.y, table_scroll_max.y);
7218 ShowDemoWindowColumns();
7221 ImGui::PopStyleVar();
7226static void ShowDemoWindowColumns()
7229 bool open = ImGui::TreeNode(
"Legacy Columns API");
7231 HelpMarker(
"Columns() is an old API! Prefer using the more flexible and powerful BeginTable() API!");
7237 if (ImGui::TreeNode(
"Basic"))
7239 ImGui::Text(
"Without border:");
7240 ImGui::Columns(3,
"mycolumns3",
false);
7242 for (
int n = 0; n < 14; n++)
7245 sprintf(label,
"Item %d", n);
7246 if (ImGui::Selectable(label)) {}
7248 ImGui::NextColumn();
7253 ImGui::Text(
"With border:");
7254 ImGui::Columns(4,
"mycolumns");
7256 ImGui::Text(
"ID"); ImGui::NextColumn();
7257 ImGui::Text(
"Name"); ImGui::NextColumn();
7258 ImGui::Text(
"Path"); ImGui::NextColumn();
7259 ImGui::Text(
"Hovered"); ImGui::NextColumn();
7261 const char* names[3] = {
"One",
"Two",
"Three" };
7262 const char* paths[3] = {
"/path/one",
"/path/two",
"/path/three" };
7263 static int selected = -1;
7264 for (
int i = 0; i < 3; i++)
7267 sprintf(label,
"%04d", i);
7268 if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns))
7270 bool hovered = ImGui::IsItemHovered();
7271 ImGui::NextColumn();
7272 ImGui::Text(names[i]); ImGui::NextColumn();
7273 ImGui::Text(paths[i]); ImGui::NextColumn();
7274 ImGui::Text(
"%d", hovered); ImGui::NextColumn();
7282 if (ImGui::TreeNode(
"Borders"))
7285 static bool h_borders =
true;
7286 static bool v_borders =
true;
7287 static int columns_count = 4;
7288 const int lines_count = 3;
7289 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
7290 ImGui::DragInt(
"##columns_count", &columns_count, 0.1f, 2, 10,
"%d columns");
7291 if (columns_count < 2)
7294 ImGui::Checkbox(
"horizontal", &h_borders);
7296 ImGui::Checkbox(
"vertical", &v_borders);
7297 ImGui::Columns(columns_count, NULL, v_borders);
7298 for (
int i = 0; i < columns_count * lines_count; i++)
7300 if (h_borders && ImGui::GetColumnIndex() == 0)
7303 ImGui::Text(
"%c%c%c",
'a' + i,
'a' + i,
'a' + i);
7304 ImGui::Text(
"Width %.2f", ImGui::GetColumnWidth());
7305 ImGui::Text(
"Avail %.2f", ImGui::GetContentRegionAvail().x);
7306 ImGui::Text(
"Offset %.2f", ImGui::GetColumnOffset());
7307 ImGui::Text(
"Long text that is likely to clip");
7308 ImGui::Button(
"Button", ImVec2(-FLT_MIN, 0.0f));
7310 ImGui::NextColumn();
7320 if (ImGui::TreeNode(
"Mixed items"))
7322 ImGui::Columns(3,
"mixed");
7325 ImGui::Text(
"Hello");
7326 ImGui::Button(
"Banana");
7327 ImGui::NextColumn();
7329 ImGui::Text(
"ImGui");
7330 ImGui::Button(
"Apple");
7331 static float foo = 1.0f;
7332 ImGui::InputFloat(
"red", &foo, 0.05f, 0,
"%.3f");
7333 ImGui::Text(
"An extra line here.");
7334 ImGui::NextColumn();
7336 ImGui::Text(
"Sailor");
7337 ImGui::Button(
"Corniflower");
7338 static float bar = 1.0f;
7339 ImGui::InputFloat(
"blue", &bar, 0.05f, 0,
"%.3f");
7340 ImGui::NextColumn();
7342 if (ImGui::CollapsingHeader(
"Category A")) { ImGui::Text(
"Blah blah blah"); } ImGui::NextColumn();
7343 if (ImGui::CollapsingHeader(
"Category B")) { ImGui::Text(
"Blah blah blah"); } ImGui::NextColumn();
7344 if (ImGui::CollapsingHeader(
"Category C")) { ImGui::Text(
"Blah blah blah"); } ImGui::NextColumn();
7352 if (ImGui::TreeNode(
"Word-wrapping"))
7354 ImGui::Columns(2,
"word-wrapping");
7356 ImGui::TextWrapped(
"The quick brown fox jumps over the lazy dog.");
7357 ImGui::TextWrapped(
"Hello Left");
7358 ImGui::NextColumn();
7359 ImGui::TextWrapped(
"The quick brown fox jumps over the lazy dog.");
7360 ImGui::TextWrapped(
"Hello Right");
7367 if (ImGui::TreeNode(
"Horizontal Scrolling"))
7369 ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f));
7370 ImVec2 child_size = ImVec2(0, ImGui::GetFontSize() * 20.0f);
7371 ImGui::BeginChild(
"##ScrollingRegion", child_size, ImGuiChildFlags_None, ImGuiWindowFlags_HorizontalScrollbar);
7375 int ITEMS_COUNT = 2000;
7376 ImGuiListClipper clipper;
7377 clipper.Begin(ITEMS_COUNT);
7378 while (clipper.Step())
7380 for (
int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
7381 for (
int j = 0; j < 10; j++)
7383 ImGui::Text(
"Line %d Column %d...", i, j);
7384 ImGui::NextColumn();
7393 if (ImGui::TreeNode(
"Tree"))
7395 ImGui::Columns(2,
"tree",
true);
7396 for (
int x = 0; x < 3; x++)
7398 bool open1 = ImGui::TreeNode((
void*)(intptr_t)x,
"Node%d", x);
7399 ImGui::NextColumn();
7400 ImGui::Text(
"Node contents");
7401 ImGui::NextColumn();
7404 for (
int y = 0; y < 3; y++)
7406 bool open2 = ImGui::TreeNode((
void*)(intptr_t)y,
"Node%d.%d", x, y);
7407 ImGui::NextColumn();
7408 ImGui::Text(
"Node contents");
7411 ImGui::Text(
"Even more contents");
7412 if (ImGui::TreeNode(
"Tree in column"))
7414 ImGui::Text(
"The quick brown fox jumps over the lazy dog");
7418 ImGui::NextColumn();
7436static void ShowDemoWindowInputs()
7439 if (ImGui::CollapsingHeader(
"Inputs & Focus"))
7441 ImGuiIO& io = ImGui::GetIO();
7445 ImGui::SetNextItemOpen(
true, ImGuiCond_Once);
7446 bool inputs_opened = ImGui::TreeNode(
"Inputs");
7449 "This is a simplified view. See more detailed input state:\n"
7450 "- in 'Tools->Metrics/Debugger->Inputs'.\n"
7451 "- in 'Tools->Debug Log->IO'.");
7454 if (ImGui::IsMousePosValid())
7455 ImGui::Text(
"Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y);
7457 ImGui::Text(
"Mouse pos: <INVALID>");
7458 ImGui::Text(
"Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y);
7459 ImGui::Text(
"Mouse down:");
7460 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]); }
7461 ImGui::Text(
"Mouse wheel: %.1f", io.MouseWheel);
7467 struct funcs {
static bool IsLegacyNativeDupe(ImGuiKey) {
return false; } };
7468 ImGuiKey start_key = ImGuiKey_NamedKey_BEGIN;
7469 ImGui::Text(
"Keys down:");
for (ImGuiKey key = start_key; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) {
if (funcs::IsLegacyNativeDupe(key) || !ImGui::IsKeyDown(key))
continue; ImGui::SameLine(); ImGui::Text((key < ImGuiKey_NamedKey_BEGIN) ?
"\"%s\"" :
"\"%s\" %d",
ImGui::GetKeyName(key), key); }
7470 ImGui::Text(
"Keys mods: %s%s%s%s", io.KeyCtrl ?
"CTRL " :
"", io.KeyShift ?
"SHIFT " :
"", io.KeyAlt ?
"ALT " :
"", io.KeySuper ?
"SUPER " :
"");
7471 ImGui::Text(
"Chars queue:");
for (
int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text(
"\'%c\' (0x%04X)", (c >
' ' && c <= 255) ? (
char)c :
'?', c); }
7478 ImGui::SetNextItemOpen(
true, ImGuiCond_Once);
7479 bool outputs_opened = ImGui::TreeNode(
"Outputs");
7482 "The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui "
7483 "to instruct your application of how to route inputs. Typically, when a value is true, it means "
7484 "Dear ImGui wants the corresponding inputs and we expect the underlying application to ignore them.\n\n"
7485 "The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, "
7486 "and underlying application should ignore mouse inputs (in practice there are many and more subtle "
7487 "rules leading to how those flags are set).");
7490 ImGui::Text(
"io.WantCaptureMouse: %d", io.WantCaptureMouse);
7491 ImGui::Text(
"io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose);
7492 ImGui::Text(
"io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard);
7493 ImGui::Text(
"io.WantTextInput: %d", io.WantTextInput);
7494 ImGui::Text(
"io.WantSetMousePos: %d", io.WantSetMousePos);
7495 ImGui::Text(
"io.NavActive: %d, io.NavVisible: %d", io.NavActive, io.NavVisible);
7498 if (ImGui::TreeNode(
"WantCapture override"))
7501 "Hovering the colored canvas will override io.WantCaptureXXX fields.\n"
7502 "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering "
7503 "and true when clicking.");
7504 static int capture_override_mouse = -1;
7505 static int capture_override_keyboard = -1;
7506 const char* capture_override_desc[] = {
"None",
"Set to false",
"Set to true" };
7507 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
7508 ImGui::SliderInt(
"SetNextFrameWantCaptureMouse() on hover", &capture_override_mouse, -1, +1, capture_override_desc[capture_override_mouse + 1], ImGuiSliderFlags_AlwaysClamp);
7509 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
7510 ImGui::SliderInt(
"SetNextFrameWantCaptureKeyboard() on hover", &capture_override_keyboard, -1, +1, capture_override_desc[capture_override_keyboard + 1], ImGuiSliderFlags_AlwaysClamp);
7512 ImGui::ColorButton(
"##panel", ImVec4(0.7f, 0.1f, 0.7f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, ImVec2(128.0f, 96.0f));
7513 if (ImGui::IsItemHovered() && capture_override_mouse != -1)
7514 ImGui::SetNextFrameWantCaptureMouse(capture_override_mouse == 1);
7515 if (ImGui::IsItemHovered() && capture_override_keyboard != -1)
7516 ImGui::SetNextFrameWantCaptureKeyboard(capture_override_keyboard == 1);
7534 if (ImGui::TreeNode(
"Shortcuts"))
7536 static ImGuiInputFlags route_options = ImGuiInputFlags_Repeat;
7537 static ImGuiInputFlags route_type = ImGuiInputFlags_RouteFocused;
7538 ImGui::CheckboxFlags(
"ImGuiInputFlags_Repeat", &route_options, ImGuiInputFlags_Repeat);
7539 ImGui::RadioButton(
"ImGuiInputFlags_RouteActive", &route_type, ImGuiInputFlags_RouteActive);
7540 ImGui::RadioButton(
"ImGuiInputFlags_RouteFocused (default)", &route_type, ImGuiInputFlags_RouteFocused);
7541 ImGui::RadioButton(
"ImGuiInputFlags_RouteGlobal", &route_type, ImGuiInputFlags_RouteGlobal);
7543 ImGui::BeginDisabled(route_type != ImGuiInputFlags_RouteGlobal);
7544 ImGui::CheckboxFlags(
"ImGuiInputFlags_RouteOverFocused", &route_options, ImGuiInputFlags_RouteOverFocused);
7545 ImGui::CheckboxFlags(
"ImGuiInputFlags_RouteOverActive", &route_options, ImGuiInputFlags_RouteOverActive);
7546 ImGui::CheckboxFlags(
"ImGuiInputFlags_RouteUnlessBgFocused", &route_options, ImGuiInputFlags_RouteUnlessBgFocused);
7547 ImGui::EndDisabled();
7549 ImGui::RadioButton(
"ImGuiInputFlags_RouteAlways", &route_type, ImGuiInputFlags_RouteAlways);
7550 ImGuiInputFlags flags = route_type | route_options;
7551 if (route_type != ImGuiInputFlags_RouteGlobal)
7552 flags &= ~(ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused);
7554 ImGui::SeparatorText(
"Using SetNextItemShortcut()");
7555 ImGui::Text(
"Ctrl+S");
7556 ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_S, flags | ImGuiInputFlags_Tooltip);
7557 ImGui::Button(
"Save");
7558 ImGui::Text(
"Alt+F");
7559 ImGui::SetNextItemShortcut(ImGuiMod_Alt | ImGuiKey_F, flags | ImGuiInputFlags_Tooltip);
7560 static float f = 0.5f;
7561 ImGui::SliderFloat(
"Factor", &f, 0.0f, 1.0f);
7563 ImGui::SeparatorText(
"Using Shortcut()");
7564 const float line_height = ImGui::GetTextLineHeightWithSpacing();
7565 const ImGuiKeyChord key_chord = ImGuiMod_Ctrl | ImGuiKey_A;
7567 ImGui::Text(
"Ctrl+A");
7568 ImGui::Text(
"IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ?
"PRESSED" :
"...");
7570 ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 0.0f, 1.0f, 0.1f));
7572 ImGui::BeginChild(
"WindowA", ImVec2(-FLT_MIN, line_height * 14),
true);
7573 ImGui::Text(
"Press CTRL+A and see who receives it!");
7577 ImGui::Text(
"(in WindowA)");
7578 ImGui::Text(
"IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ?
"PRESSED" :
"...");
7590 ImGui::BeginChild(
"ChildD", ImVec2(-FLT_MIN, line_height * 4),
true);
7591 ImGui::Text(
"(in ChildD: not using same Shortcut)");
7592 ImGui::Text(
"IsWindowFocused: %d", ImGui::IsWindowFocused());
7596 ImGui::BeginChild(
"ChildE", ImVec2(-FLT_MIN, line_height * 4),
true);
7597 ImGui::Text(
"(in ChildE: using same Shortcut)");
7598 ImGui::Text(
"IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ?
"PRESSED" :
"...");
7602 if (ImGui::Button(
"Open Popup"))
7603 ImGui::OpenPopup(
"PopupF");
7604 if (ImGui::BeginPopup(
"PopupF"))
7606 ImGui::Text(
"(in PopupF)");
7607 ImGui::Text(
"IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ?
"PRESSED" :
"...");
7614 ImGui::PopStyleColor();
7621 if (ImGui::TreeNode(
"Mouse Cursors"))
7623 const char* mouse_cursors_names[] = {
"Arrow",
"TextInput",
"ResizeAll",
"ResizeNS",
"ResizeEW",
"ResizeNESW",
"ResizeNWSE",
"Hand",
"NotAllowed" };
7624 IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_COUNT);
7626 ImGuiMouseCursor current = ImGui::GetMouseCursor();
7627 const char* cursor_name = (current >= ImGuiMouseCursor_Arrow) && (current < ImGuiMouseCursor_COUNT) ? mouse_cursors_names[current] :
"N/A";
7628 ImGui::Text(
"Current mouse cursor = %d: %s", current, cursor_name);
7629 ImGui::BeginDisabled(
true);
7630 ImGui::CheckboxFlags(
"io.BackendFlags: HasMouseCursors", &io.BackendFlags, ImGuiBackendFlags_HasMouseCursors);
7631 ImGui::EndDisabled();
7633 ImGui::Text(
"Hover to see mouse cursors:");
7634 ImGui::SameLine(); HelpMarker(
7635 "Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. "
7636 "If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, "
7637 "otherwise your backend needs to handle it.");
7638 for (
int i = 0; i < ImGuiMouseCursor_COUNT; i++)
7641 sprintf(label,
"Mouse cursor %d: %s", i, mouse_cursors_names[i]);
7642 ImGui::Bullet(); ImGui::Selectable(label,
false);
7643 if (ImGui::IsItemHovered())
7644 ImGui::SetMouseCursor(i);
7650 if (ImGui::TreeNode(
"Tabbing"))
7652 ImGui::Text(
"Use TAB/SHIFT+TAB to cycle through keyboard editable fields.");
7653 static char buf[32] =
"hello";
7654 ImGui::InputText(
"1", buf, IM_ARRAYSIZE(buf));
7655 ImGui::InputText(
"2", buf, IM_ARRAYSIZE(buf));
7656 ImGui::InputText(
"3", buf, IM_ARRAYSIZE(buf));
7657 ImGui::PushItemFlag(ImGuiItemFlags_NoTabStop,
true);
7658 ImGui::InputText(
"4 (tab skip)", buf, IM_ARRAYSIZE(buf));
7659 ImGui::SameLine(); HelpMarker(
"Item won't be cycled through when using TAB or Shift+Tab.");
7660 ImGui::PopItemFlag();
7661 ImGui::InputText(
"5", buf, IM_ARRAYSIZE(buf));
7666 if (ImGui::TreeNode(
"Focus from code"))
7668 bool focus_1 = ImGui::Button(
"Focus on 1"); ImGui::SameLine();
7669 bool focus_2 = ImGui::Button(
"Focus on 2"); ImGui::SameLine();
7670 bool focus_3 = ImGui::Button(
"Focus on 3");
7672 static char buf[128] =
"click on a button to set focus";
7674 if (focus_1) ImGui::SetKeyboardFocusHere();
7675 ImGui::InputText(
"1", buf, IM_ARRAYSIZE(buf));
7676 if (ImGui::IsItemActive()) has_focus = 1;
7678 if (focus_2) ImGui::SetKeyboardFocusHere();
7679 ImGui::InputText(
"2", buf, IM_ARRAYSIZE(buf));
7680 if (ImGui::IsItemActive()) has_focus = 2;
7682 ImGui::PushItemFlag(ImGuiItemFlags_NoTabStop,
true);
7683 if (focus_3) ImGui::SetKeyboardFocusHere();
7684 ImGui::InputText(
"3 (tab skip)", buf, IM_ARRAYSIZE(buf));
7685 if (ImGui::IsItemActive()) has_focus = 3;
7686 ImGui::SameLine(); HelpMarker(
"Item won't be cycled through when using TAB or Shift+Tab.");
7687 ImGui::PopItemFlag();
7690 ImGui::Text(
"Item with focus: %d", has_focus);
7692 ImGui::Text(
"Item with focus: <none>");
7695 static float f3[3] = { 0.0f, 0.0f, 0.0f };
7696 int focus_ahead = -1;
7697 if (ImGui::Button(
"Focus on X")) { focus_ahead = 0; } ImGui::SameLine();
7698 if (ImGui::Button(
"Focus on Y")) { focus_ahead = 1; } ImGui::SameLine();
7699 if (ImGui::Button(
"Focus on Z")) { focus_ahead = 2; }
7700 if (focus_ahead != -1) ImGui::SetKeyboardFocusHere(focus_ahead);
7701 ImGui::SliderFloat3(
"Float3", &f3[0], 0.0f, 1.0f);
7703 ImGui::TextWrapped(
"NB: Cursor & selection are preserved when refocusing last used item in code.");
7708 if (ImGui::TreeNode(
"Dragging"))
7710 ImGui::TextWrapped(
"You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget.");
7711 for (
int button = 0; button < 3; button++)
7713 ImGui::Text(
"IsMouseDragging(%d):", button);
7714 ImGui::Text(
" w/ default threshold: %d,", ImGui::IsMouseDragging(button));
7715 ImGui::Text(
" w/ zero threshold: %d,", ImGui::IsMouseDragging(button, 0.0f));
7716 ImGui::Text(
" w/ large threshold: %d,", ImGui::IsMouseDragging(button, 20.0f));
7719 ImGui::Button(
"Drag Me");
7720 if (ImGui::IsItemActive())
7721 ImGui::GetForegroundDrawList()->AddLine(io.MouseClickedPos[0], io.MousePos, ImGui::GetColorU32(ImGuiCol_Button), 4.0f);
7726 ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f);
7727 ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0);
7728 ImVec2 mouse_delta = io.MouseDelta;
7729 ImGui::Text(
"GetMouseDragDelta(0):");
7730 ImGui::Text(
" w/ default threshold: (%.1f, %.1f)", value_with_lock_threshold.x, value_with_lock_threshold.y);
7731 ImGui::Text(
" w/ zero threshold: (%.1f, %.1f)", value_raw.x, value_raw.y);
7732 ImGui::Text(
"io.MouseDelta: (%.1f, %.1f)", mouse_delta.x, mouse_delta.y);
7743void ImGui::ShowAboutWindow(
bool* p_open)
7745 if (!ImGui::Begin(
"About Dear ImGui", p_open, ImGuiWindowFlags_AlwaysAutoResize))
7751 ImGui::Text(
"Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
7753 ImGui::TextLinkOpenURL(
"Homepage",
"https://github.com/ocornut/imgui");
7755 ImGui::TextLinkOpenURL(
"FAQ",
"https://github.com/ocornut/imgui/blob/master/docs/FAQ.md");
7757 ImGui::TextLinkOpenURL(
"Wiki",
"https://github.com/ocornut/imgui/wiki");
7759 ImGui::TextLinkOpenURL(
"Releases",
"https://github.com/ocornut/imgui/releases");
7761 ImGui::TextLinkOpenURL(
"Funding",
"https://github.com/ocornut/imgui/wiki/Funding");
7764 ImGui::Text(
"By Omar Cornut and all Dear ImGui contributors.");
7765 ImGui::Text(
"Dear ImGui is licensed under the MIT License, see LICENSE for more information.");
7766 ImGui::Text(
"If your company uses this, please consider funding the project.");
7768 static bool show_config_info =
false;
7769 ImGui::Checkbox(
"Config/Build Information", &show_config_info);
7770 if (show_config_info)
7772 ImGuiIO& io = ImGui::GetIO();
7773 ImGuiStyle& style = ImGui::GetStyle();
7775 bool copy_to_clipboard = ImGui::Button(
"Copy to clipboard");
7776 ImVec2 child_size = ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18);
7777 ImGui::BeginChild(ImGui::GetID(
"cfg_infos"), child_size, ImGuiChildFlags_FrameStyle);
7778 if (copy_to_clipboard)
7780 ImGui::LogToClipboard();
7781 ImGui::LogText(
"```\n");
7784 ImGui::Text(
"Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
7786 ImGui::Text(
"sizeof(size_t): %d, sizeof(ImDrawIdx): %d, sizeof(ImDrawVert): %d", (
int)
sizeof(
size_t), (
int)
sizeof(ImDrawIdx), (
int)
sizeof(ImDrawVert));
7787 ImGui::Text(
"define: __cplusplus=%d", (
int)__cplusplus);
7788#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
7789 ImGui::Text(
"define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS");
7791#ifdef IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
7792 ImGui::Text(
"define: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS");
7794#ifdef IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
7795 ImGui::Text(
"define: IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS");
7797#ifdef IMGUI_DISABLE_WIN32_FUNCTIONS
7798 ImGui::Text(
"define: IMGUI_DISABLE_WIN32_FUNCTIONS");
7800#ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
7801 ImGui::Text(
"define: IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS");
7803#ifdef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
7804 ImGui::Text(
"define: IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS");
7806#ifdef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
7807 ImGui::Text(
"define: IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS");
7809#ifdef IMGUI_DISABLE_FILE_FUNCTIONS
7810 ImGui::Text(
"define: IMGUI_DISABLE_FILE_FUNCTIONS");
7812#ifdef IMGUI_DISABLE_DEFAULT_ALLOCATORS
7813 ImGui::Text(
"define: IMGUI_DISABLE_DEFAULT_ALLOCATORS");
7815#ifdef IMGUI_USE_BGRA_PACKED_COLOR
7816 ImGui::Text(
"define: IMGUI_USE_BGRA_PACKED_COLOR");
7819 ImGui::Text(
"define: _WIN32");
7822 ImGui::Text(
"define: _WIN64");
7825 ImGui::Text(
"define: __linux__");
7828 ImGui::Text(
"define: __APPLE__");
7831 ImGui::Text(
"define: _MSC_VER=%d", _MSC_VER);
7834 ImGui::Text(
"define: _MSVC_LANG=%d", (
int)_MSVC_LANG);
7837 ImGui::Text(
"define: __MINGW32__");
7840 ImGui::Text(
"define: __MINGW64__");
7843 ImGui::Text(
"define: __GNUC__=%d", (
int)__GNUC__);
7845#ifdef __clang_version__
7846 ImGui::Text(
"define: __clang_version__=%s", __clang_version__);
7848#ifdef __EMSCRIPTEN__
7849 ImGui::Text(
"define: __EMSCRIPTEN__");
7850 ImGui::Text(
"Emscripten: %d.%d.%d", __EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__);
7852#ifdef IMGUI_HAS_VIEWPORT
7853 ImGui::Text(
"define: IMGUI_HAS_VIEWPORT");
7855#ifdef IMGUI_HAS_DOCK
7856 ImGui::Text(
"define: IMGUI_HAS_DOCK");
7859 ImGui::Text(
"io.BackendPlatformName: %s", io.BackendPlatformName ? io.BackendPlatformName :
"NULL");
7860 ImGui::Text(
"io.BackendRendererName: %s", io.BackendRendererName ? io.BackendRendererName :
"NULL");
7861 ImGui::Text(
"io.ConfigFlags: 0x%08X", io.ConfigFlags);
7862 if (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) ImGui::Text(
" NavEnableKeyboard");
7863 if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) ImGui::Text(
" NavEnableGamepad");
7864 if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) ImGui::Text(
" NoMouse");
7865 if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) ImGui::Text(
" NoMouseCursorChange");
7866 if (io.ConfigFlags & ImGuiConfigFlags_NoKeyboard) ImGui::Text(
" NoKeyboard");
7867 if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) ImGui::Text(
" DockingEnable");
7868 if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) ImGui::Text(
" ViewportsEnable");
7869 if (io.ConfigFlags & ImGuiConfigFlags_DpiEnableScaleViewports) ImGui::Text(
" DpiEnableScaleViewports");
7870 if (io.ConfigFlags & ImGuiConfigFlags_DpiEnableScaleFonts) ImGui::Text(
" DpiEnableScaleFonts");
7871 if (io.MouseDrawCursor) ImGui::Text(
"io.MouseDrawCursor");
7872 if (io.ConfigViewportsNoAutoMerge) ImGui::Text(
"io.ConfigViewportsNoAutoMerge");
7873 if (io.ConfigViewportsNoTaskBarIcon) ImGui::Text(
"io.ConfigViewportsNoTaskBarIcon");
7874 if (io.ConfigViewportsNoDecoration) ImGui::Text(
"io.ConfigViewportsNoDecoration");
7875 if (io.ConfigViewportsNoDefaultParent) ImGui::Text(
"io.ConfigViewportsNoDefaultParent");
7876 if (io.ConfigDockingNoSplit) ImGui::Text(
"io.ConfigDockingNoSplit");
7877 if (io.ConfigDockingWithShift) ImGui::Text(
"io.ConfigDockingWithShift");
7878 if (io.ConfigDockingAlwaysTabBar) ImGui::Text(
"io.ConfigDockingAlwaysTabBar");
7879 if (io.ConfigDockingTransparentPayload) ImGui::Text(
"io.ConfigDockingTransparentPayload");
7880 if (io.ConfigMacOSXBehaviors) ImGui::Text(
"io.ConfigMacOSXBehaviors");
7881 if (io.ConfigNavMoveSetMousePos) ImGui::Text(
"io.ConfigNavMoveSetMousePos");
7882 if (io.ConfigNavCaptureKeyboard) ImGui::Text(
"io.ConfigNavCaptureKeyboard");
7883 if (io.ConfigInputTextCursorBlink) ImGui::Text(
"io.ConfigInputTextCursorBlink");
7884 if (io.ConfigWindowsResizeFromEdges) ImGui::Text(
"io.ConfigWindowsResizeFromEdges");
7885 if (io.ConfigWindowsMoveFromTitleBarOnly) ImGui::Text(
"io.ConfigWindowsMoveFromTitleBarOnly");
7886 if (io.ConfigMemoryCompactTimer >= 0.0f) ImGui::Text(
"io.ConfigMemoryCompactTimer = %.1f", io.ConfigMemoryCompactTimer);
7887 ImGui::Text(
"io.BackendFlags: 0x%08X", io.BackendFlags);
7888 if (io.BackendFlags & ImGuiBackendFlags_HasGamepad) ImGui::Text(
" HasGamepad");
7889 if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(
" HasMouseCursors");
7890 if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(
" HasSetMousePos");
7891 if (io.BackendFlags & ImGuiBackendFlags_PlatformHasViewports) ImGui::Text(
" PlatformHasViewports");
7892 if (io.BackendFlags & ImGuiBackendFlags_HasMouseHoveredViewport)ImGui::Text(
" HasMouseHoveredViewport");
7893 if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(
" RendererHasVtxOffset");
7894 if (io.BackendFlags & ImGuiBackendFlags_RendererHasViewports) ImGui::Text(
" RendererHasViewports");
7896 ImGui::Text(
"io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight);
7897 ImGui::Text(
"io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y);
7898 ImGui::Text(
"io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
7900 ImGui::Text(
"style.WindowPadding: %.2f,%.2f", style.WindowPadding.x, style.WindowPadding.y);
7901 ImGui::Text(
"style.WindowBorderSize: %.2f", style.WindowBorderSize);
7902 ImGui::Text(
"style.FramePadding: %.2f,%.2f", style.FramePadding.x, style.FramePadding.y);
7903 ImGui::Text(
"style.FrameRounding: %.2f", style.FrameRounding);
7904 ImGui::Text(
"style.FrameBorderSize: %.2f", style.FrameBorderSize);
7905 ImGui::Text(
"style.ItemSpacing: %.2f,%.2f", style.ItemSpacing.x, style.ItemSpacing.y);
7906 ImGui::Text(
"style.ItemInnerSpacing: %.2f,%.2f", style.ItemInnerSpacing.x, style.ItemInnerSpacing.y);
7908 if (copy_to_clipboard)
7910 ImGui::LogText(
"\n```\n");
7931void ImGui::ShowFontSelector(
const char* label)
7933 ImGuiIO& io = ImGui::GetIO();
7934 ImFont* font_current = ImGui::GetFont();
7935 if (ImGui::BeginCombo(label, font_current->GetDebugName()))
7937 for (ImFont* font : io.Fonts->Fonts)
7939 ImGui::PushID((
void*)font);
7940 if (ImGui::Selectable(font->GetDebugName(), font == font_current))
7941 io.FontDefault = font;
7948 "- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n"
7949 "- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n"
7950 "- Read FAQ and docs/FONTS.md for more details.\n"
7951 "- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame().");
7957bool ImGui::ShowStyleSelector(
const char* label)
7959 static int style_idx = -1;
7960 if (ImGui::Combo(label, &style_idx,
"Dark\0Light\0Classic\0"))
7964 case 0: ImGui::StyleColorsDark();
break;
7965 case 1: ImGui::StyleColorsLight();
break;
7966 case 2: ImGui::StyleColorsClassic();
break;
7973void ImGui::ShowStyleEditor(ImGuiStyle* ref)
7978 ImGuiStyle& style = ImGui::GetStyle();
7979 static ImGuiStyle ref_saved_style;
7982 static bool init =
true;
7983 if (init && ref == NULL)
7984 ref_saved_style = style;
7987 ref = &ref_saved_style;
7989 ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.50f);
7991 if (ImGui::ShowStyleSelector(
"Colors##Selector"))
7992 ref_saved_style = style;
7993 ImGui::ShowFontSelector(
"Fonts##Selector");
7996 if (ImGui::SliderFloat(
"FrameRounding", &style.FrameRounding, 0.0f, 12.0f,
"%.0f"))
7997 style.GrabRounding = style.FrameRounding;
7998 {
bool border = (style.WindowBorderSize > 0.0f);
if (ImGui::Checkbox(
"WindowBorder", &border)) { style.WindowBorderSize = border ? 1.0f : 0.0f; } }
8000 {
bool border = (style.FrameBorderSize > 0.0f);
if (ImGui::Checkbox(
"FrameBorder", &border)) { style.FrameBorderSize = border ? 1.0f : 0.0f; } }
8002 {
bool border = (style.PopupBorderSize > 0.0f);
if (ImGui::Checkbox(
"PopupBorder", &border)) { style.PopupBorderSize = border ? 1.0f : 0.0f; } }
8005 if (ImGui::Button(
"Save Ref"))
8006 *ref = ref_saved_style = style;
8008 if (ImGui::Button(
"Revert Ref"))
8012 "Save/Revert in local non-persistent storage. Default Colors definition are not affected. "
8013 "Use \"Export\" below to save them somewhere.");
8017 if (ImGui::BeginTabBar(
"##tabs", ImGuiTabBarFlags_None))
8019 if (ImGui::BeginTabItem(
"Sizes"))
8021 ImGui::SeparatorText(
"Main");
8022 ImGui::SliderFloat2(
"WindowPadding", (
float*)&style.WindowPadding, 0.0f, 20.0f,
"%.0f");
8023 ImGui::SliderFloat2(
"FramePadding", (
float*)&style.FramePadding, 0.0f, 20.0f,
"%.0f");
8024 ImGui::SliderFloat2(
"ItemSpacing", (
float*)&style.ItemSpacing, 0.0f, 20.0f,
"%.0f");
8025 ImGui::SliderFloat2(
"ItemInnerSpacing", (
float*)&style.ItemInnerSpacing, 0.0f, 20.0f,
"%.0f");
8026 ImGui::SliderFloat2(
"TouchExtraPadding", (
float*)&style.TouchExtraPadding, 0.0f, 10.0f,
"%.0f");
8027 ImGui::SliderFloat(
"IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f,
"%.0f");
8028 ImGui::SliderFloat(
"ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f,
"%.0f");
8029 ImGui::SliderFloat(
"GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f,
"%.0f");
8031 ImGui::SeparatorText(
"Borders");
8032 ImGui::SliderFloat(
"WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f,
"%.0f");
8033 ImGui::SliderFloat(
"ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f,
"%.0f");
8034 ImGui::SliderFloat(
"PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f,
"%.0f");
8035 ImGui::SliderFloat(
"FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f,
"%.0f");
8036 ImGui::SliderFloat(
"TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f,
"%.0f");
8037 ImGui::SliderFloat(
"TabBarBorderSize", &style.TabBarBorderSize, 0.0f, 2.0f,
"%.0f");
8038 ImGui::SliderFloat(
"TabBarOverlineSize", &style.TabBarOverlineSize, 0.0f, 2.0f,
"%.0f");
8039 ImGui::SameLine(); HelpMarker(
"Overline is only drawn over the selected tab when ImGuiTabBarFlags_DrawSelectedOverline is set.");
8041 ImGui::SeparatorText(
"Rounding");
8042 ImGui::SliderFloat(
"WindowRounding", &style.WindowRounding, 0.0f, 12.0f,
"%.0f");
8043 ImGui::SliderFloat(
"ChildRounding", &style.ChildRounding, 0.0f, 12.0f,
"%.0f");
8044 ImGui::SliderFloat(
"FrameRounding", &style.FrameRounding, 0.0f, 12.0f,
"%.0f");
8045 ImGui::SliderFloat(
"PopupRounding", &style.PopupRounding, 0.0f, 12.0f,
"%.0f");
8046 ImGui::SliderFloat(
"ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f,
"%.0f");
8047 ImGui::SliderFloat(
"GrabRounding", &style.GrabRounding, 0.0f, 12.0f,
"%.0f");
8048 ImGui::SliderFloat(
"TabRounding", &style.TabRounding, 0.0f, 12.0f,
"%.0f");
8050 ImGui::SeparatorText(
"Tables");
8051 ImGui::SliderFloat2(
"CellPadding", (
float*)&style.CellPadding, 0.0f, 20.0f,
"%.0f");
8052 ImGui::SliderAngle(
"TableAngledHeadersAngle", &style.TableAngledHeadersAngle, -50.0f, +50.0f);
8053 ImGui::SliderFloat2(
"TableAngledHeadersTextAlign", (
float*)&style.TableAngledHeadersTextAlign, 0.0f, 1.0f,
"%.2f");
8055 ImGui::SeparatorText(
"Widgets");
8056 ImGui::SliderFloat2(
"WindowTitleAlign", (
float*)&style.WindowTitleAlign, 0.0f, 1.0f,
"%.2f");
8057 int window_menu_button_position = style.WindowMenuButtonPosition + 1;
8058 if (ImGui::Combo(
"WindowMenuButtonPosition", (
int*)&window_menu_button_position,
"None\0Left\0Right\0"))
8059 style.WindowMenuButtonPosition = (ImGuiDir)(window_menu_button_position - 1);
8060 ImGui::Combo(
"ColorButtonPosition", (
int*)&style.ColorButtonPosition,
"Left\0Right\0");
8061 ImGui::SliderFloat2(
"ButtonTextAlign", (
float*)&style.ButtonTextAlign, 0.0f, 1.0f,
"%.2f");
8062 ImGui::SameLine(); HelpMarker(
"Alignment applies when a button is larger than its text content.");
8063 ImGui::SliderFloat2(
"SelectableTextAlign", (
float*)&style.SelectableTextAlign, 0.0f, 1.0f,
"%.2f");
8064 ImGui::SameLine(); HelpMarker(
"Alignment applies when a selectable is larger than its text content.");
8065 ImGui::SliderFloat(
"SeparatorTextBorderSize", &style.SeparatorTextBorderSize, 0.0f, 10.0f,
"%.0f");
8066 ImGui::SliderFloat2(
"SeparatorTextAlign", (
float*)&style.SeparatorTextAlign, 0.0f, 1.0f,
"%.2f");
8067 ImGui::SliderFloat2(
"SeparatorTextPadding", (
float*)&style.SeparatorTextPadding, 0.0f, 40.0f,
"%.0f");
8068 ImGui::SliderFloat(
"LogSliderDeadzone", &style.LogSliderDeadzone, 0.0f, 12.0f,
"%.0f");
8070 ImGui::SeparatorText(
"Docking");
8071 ImGui::SliderFloat(
"DockingSplitterSize", &style.DockingSeparatorSize, 0.0f, 12.0f,
"%.0f");
8073 ImGui::SeparatorText(
"Tooltips");
8074 for (
int n = 0; n < 2; n++)
8075 if (ImGui::TreeNodeEx(n == 0 ?
"HoverFlagsForTooltipMouse" :
"HoverFlagsForTooltipNav"))
8077 ImGuiHoveredFlags* p = (n == 0) ? &style.HoverFlagsForTooltipMouse : &style.HoverFlagsForTooltipNav;
8078 ImGui::CheckboxFlags(
"ImGuiHoveredFlags_DelayNone", p, ImGuiHoveredFlags_DelayNone);
8079 ImGui::CheckboxFlags(
"ImGuiHoveredFlags_DelayShort", p, ImGuiHoveredFlags_DelayShort);
8080 ImGui::CheckboxFlags(
"ImGuiHoveredFlags_DelayNormal", p, ImGuiHoveredFlags_DelayNormal);
8081 ImGui::CheckboxFlags(
"ImGuiHoveredFlags_Stationary", p, ImGuiHoveredFlags_Stationary);
8082 ImGui::CheckboxFlags(
"ImGuiHoveredFlags_NoSharedDelay", p, ImGuiHoveredFlags_NoSharedDelay);
8086 ImGui::SeparatorText(
"Misc");
8087 ImGui::SliderFloat2(
"DisplayWindowPadding", (
float*)&style.DisplayWindowPadding, 0.0f, 30.0f,
"%.0f"); ImGui::SameLine(); HelpMarker(
"Apply to regular windows: amount which we enforce to keep visible when moving near edges of your screen.");
8088 ImGui::SliderFloat2(
"DisplaySafeAreaPadding", (
float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f,
"%.0f"); ImGui::SameLine(); HelpMarker(
"Apply to every windows, menus, popups, tooltips: amount where we avoid displaying contents. Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured).");
8090 ImGui::EndTabItem();
8093 if (ImGui::BeginTabItem(
"Colors"))
8095 static int output_dest = 0;
8096 static bool output_only_modified =
true;
8097 if (ImGui::Button(
"Export"))
8099 if (output_dest == 0)
8100 ImGui::LogToClipboard();
8103 ImGui::LogText(
"ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE);
8104 for (
int i = 0; i < ImGuiCol_COUNT; i++)
8106 const ImVec4& col = style.Colors[i];
8107 const char* name = ImGui::GetStyleColorName(i);
8108 if (!output_only_modified || memcmp(&col, &ref->Colors[i],
sizeof(ImVec4)) != 0)
8109 ImGui::LogText(
"colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE,
8110 name, 23 - (
int)strlen(name),
"", col.x, col.y, col.z, col.w);
8114 ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo(
"##output_type", &output_dest,
"To Clipboard\0To TTY\0");
8115 ImGui::SameLine(); ImGui::Checkbox(
"Only Modified Colors", &output_only_modified);
8117 static ImGuiTextFilter
filter;
8118 filter.Draw(
"Filter colors", ImGui::GetFontSize() * 16);
8120 static ImGuiColorEditFlags alpha_flags = 0;
8121 if (ImGui::RadioButton(
"Opaque", alpha_flags == ImGuiColorEditFlags_None)) { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine();
8122 if (ImGui::RadioButton(
"Alpha", alpha_flags == ImGuiColorEditFlags_AlphaPreview)) { alpha_flags = ImGuiColorEditFlags_AlphaPreview; } ImGui::SameLine();
8123 if (ImGui::RadioButton(
"Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine();
8125 "In the color list:\n"
8126 "Left-click on color square to open color picker,\n"
8127 "Right-click to open edit options menu.");
8129 ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 10), ImVec2(FLT_MAX, FLT_MAX));
8130 ImGui::BeginChild(
"##colors", ImVec2(0, 0), ImGuiChildFlags_Borders | ImGuiChildFlags_NavFlattened, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar);
8131 ImGui::PushItemWidth(ImGui::GetFontSize() * -12);
8132 for (
int i = 0; i < ImGuiCol_COUNT; i++)
8134 const char* name = ImGui::GetStyleColorName(i);
8135 if (!
filter.PassFilter(name))
8138#ifndef IMGUI_DISABLE_DEBUG_TOOLS
8139 if (ImGui::Button(
"?"))
8140 ImGui::DebugFlashStyleColor((ImGuiCol)i);
8141 ImGui::SetItemTooltip(
"Flash given color to identify places where it is used.");
8144 ImGui::ColorEdit4(
"##color", (
float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags);
8145 if (memcmp(&style.Colors[i], &ref->Colors[i],
sizeof(ImVec4)) != 0)
8150 ImGui::SameLine(0.0f, style.ItemInnerSpacing.x);
if (ImGui::Button(
"Save")) { ref->Colors[i] = style.Colors[i]; }
8151 ImGui::SameLine(0.0f, style.ItemInnerSpacing.x);
if (ImGui::Button(
"Revert")) { style.Colors[i] = ref->Colors[i]; }
8153 ImGui::SameLine(0.0f, style.ItemInnerSpacing.x);
8157 ImGui::PopItemWidth();
8160 ImGui::EndTabItem();
8163 if (ImGui::BeginTabItem(
"Fonts"))
8165 ImGuiIO& io = ImGui::GetIO();
8166 ImFontAtlas* atlas = io.Fonts;
8167 HelpMarker(
"Read FAQ and docs/FONTS.md for details on font loading.");
8172 const float MIN_SCALE = 0.3f;
8173 const float MAX_SCALE = 2.0f;
8175 "Those are old settings provided for convenience.\n"
8176 "However, the _correct_ way of scaling your UI is currently to reload your font at the designed size, "
8177 "rebuild the font atlas, and call style.ScaleAllSizes() on a reference ImGuiStyle structure.\n"
8178 "Using those settings here will give you poor quality results.");
8179 static float window_scale = 1.0f;
8180 ImGui::PushItemWidth(ImGui::GetFontSize() * 8);
8181 if (ImGui::DragFloat(
"window scale", &window_scale, 0.005f, MIN_SCALE, MAX_SCALE,
"%.2f", ImGuiSliderFlags_AlwaysClamp))
8182 ImGui::SetWindowFontScale(window_scale);
8183 ImGui::DragFloat(
"global scale", &io.FontGlobalScale, 0.005f, MIN_SCALE, MAX_SCALE,
"%.2f", ImGuiSliderFlags_AlwaysClamp);
8184 ImGui::PopItemWidth();
8186 ImGui::EndTabItem();
8189 if (ImGui::BeginTabItem(
"Rendering"))
8191 ImGui::Checkbox(
"Anti-aliased lines", &style.AntiAliasedLines);
8193 HelpMarker(
"When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well.");
8195 ImGui::Checkbox(
"Anti-aliased lines use texture", &style.AntiAliasedLinesUseTex);
8197 HelpMarker(
"Faster lines using texture data. Require backend to render with bilinear filtering (not point/nearest filtering).");
8199 ImGui::Checkbox(
"Anti-aliased fill", &style.AntiAliasedFill);
8200 ImGui::PushItemWidth(ImGui::GetFontSize() * 8);
8201 ImGui::DragFloat(
"Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, 10.0f,
"%.2f");
8202 if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f;
8205 ImGui::DragFloat(
"Circle Tessellation Max Error", &style.CircleTessellationMaxError , 0.005f, 0.10f, 5.0f,
"%.2f", ImGuiSliderFlags_AlwaysClamp);
8206 const bool show_samples = ImGui::IsItemActive();
8208 ImGui::SetNextWindowPos(ImGui::GetCursorScreenPos());
8209 if (show_samples && ImGui::BeginTooltip())
8213 ImDrawList* draw_list = ImGui::GetWindowDrawList();
8215 for (
int n = 0; n < 8; n++)
8217 const float RAD_MIN = 5.0f;
8218 const float RAD_MAX = 70.0f;
8219 const float rad = RAD_MIN + (RAD_MAX - RAD_MIN) * (
float)n / (8.0f - 1.0f);
8221 ImGui::BeginGroup();
8224 ImGui::Text(
"R: %.f\nN: %d", rad, draw_list->_CalcCircleAutoSegmentCount(rad));
8226 const float canvas_width =
IM_MAX(min_widget_width, rad * 2.0f);
8227 const float offset_x = floorf(canvas_width * 0.5f);
8228 const float offset_y = floorf(RAD_MAX);
8230 const ImVec2 p1 = ImGui::GetCursorScreenPos();
8231 draw_list->AddCircle(ImVec2(p1.x + offset_x, p1.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text));
8232 ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2));
8243 ImGui::EndTooltip();
8246 HelpMarker(
"When drawing circle primitives with \"num_segments == 0\" tesselation will be calculated automatically.");
8248 ImGui::DragFloat(
"Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f,
"%.2f");
8249 ImGui::DragFloat(
"Disabled Alpha", &style.DisabledAlpha, 0.005f, 0.0f, 1.0f,
"%.2f"); ImGui::SameLine(); HelpMarker(
"Additional alpha multiplier for disabled items (multiply over current value of Alpha).");
8250 ImGui::PopItemWidth();
8252 ImGui::EndTabItem();
8258 ImGui::PopItemWidth();
8265void ImGui::ShowUserGuide()
8267 ImGuiIO& io = ImGui::GetIO();
8268 ImGui::BulletText(
"Double-click on title bar to collapse window.");
8270 "Click and drag on lower corner to resize window\n"
8271 "(double-click to auto fit window to its contents).");
8272 ImGui::BulletText(
"CTRL+Click on a slider or drag box to input value as text.");
8273 ImGui::BulletText(
"TAB/SHIFT+TAB to cycle through keyboard editable fields.");
8274 ImGui::BulletText(
"CTRL+Tab to select a window.");
8275 if (io.FontAllowUserScaling)
8276 ImGui::BulletText(
"CTRL+Mouse Wheel to zoom window contents.");
8277 ImGui::BulletText(
"While inputing text:\n");
8279 ImGui::BulletText(
"CTRL+Left/Right to word jump.");
8280 ImGui::BulletText(
"CTRL+A or double-click to select all.");
8281 ImGui::BulletText(
"CTRL+X/C/V to use clipboard cut/copy/paste.");
8282 ImGui::BulletText(
"CTRL+Z,CTRL+Y to undo/redo.");
8283 ImGui::BulletText(
"ESCAPE to revert.");
8285 ImGui::BulletText(
"With keyboard navigation enabled:");
8287 ImGui::BulletText(
"Arrow keys to navigate.");
8288 ImGui::BulletText(
"Space to activate a widget.");
8289 ImGui::BulletText(
"Return to input text into a widget.");
8290 ImGui::BulletText(
"Escape to deactivate a widget, close popup, exit child window.");
8291 ImGui::BulletText(
"Alt to jump to the menu layer of a window.");
8306static void ShowExampleAppMainMenuBar()
8308 if (ImGui::BeginMainMenuBar())
8310 if (ImGui::BeginMenu(
"File"))
8312 ShowExampleMenuFile();
8315 if (ImGui::BeginMenu(
"Edit"))
8317 if (ImGui::MenuItem(
"Undo",
"CTRL+Z")) {}
8318 if (ImGui::MenuItem(
"Redo",
"CTRL+Y",
false,
false)) {}
8320 if (ImGui::MenuItem(
"Cut",
"CTRL+X")) {}
8321 if (ImGui::MenuItem(
"Copy",
"CTRL+C")) {}
8322 if (ImGui::MenuItem(
"Paste",
"CTRL+V")) {}
8325 ImGui::EndMainMenuBar();
8331static void ShowExampleMenuFile()
8334 ImGui::MenuItem(
"(demo menu)", NULL,
false,
false);
8335 if (ImGui::MenuItem(
"New")) {}
8336 if (ImGui::MenuItem(
"Open",
"Ctrl+O")) {}
8337 if (ImGui::BeginMenu(
"Open Recent"))
8339 ImGui::MenuItem(
"fish_hat.c");
8340 ImGui::MenuItem(
"fish_hat.inl");
8341 ImGui::MenuItem(
"fish_hat.h");
8342 if (ImGui::BeginMenu(
"More.."))
8344 ImGui::MenuItem(
"Hello");
8345 ImGui::MenuItem(
"Sailor");
8346 if (ImGui::BeginMenu(
"Recurse.."))
8348 ShowExampleMenuFile();
8355 if (ImGui::MenuItem(
"Save",
"Ctrl+S")) {}
8356 if (ImGui::MenuItem(
"Save As..")) {}
8360 if (ImGui::BeginMenu(
"Options"))
8362 static bool enabled =
true;
8363 ImGui::MenuItem(
"Enabled",
"", &enabled);
8364 ImGui::BeginChild(
"child", ImVec2(0, 60), ImGuiChildFlags_Borders);
8365 for (
int i = 0; i < 10; i++)
8366 ImGui::Text(
"Scrolling Text %d", i);
8368 static float f = 0.5f;
8370 ImGui::SliderFloat(
"Value", &f, 0.0f, 1.0f);
8371 ImGui::InputFloat(
"Input", &f, 0.1f);
8372 ImGui::Combo(
"Combo", &n,
"Yes\0No\0Maybe\0\0");
8377 if (ImGui::BeginMenu(
"Colors"))
8379 float sz = ImGui::GetTextLineHeight();
8380 for (
int i = 0; i < ImGuiCol_COUNT; i++)
8382 const char* name = ImGui::GetStyleColorName((ImGuiCol)i);
8383 ImVec2 p = ImGui::GetCursorScreenPos();
8384 ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + sz, p.y + sz), ImGui::GetColorU32((ImGuiCol)i));
8385 ImGui::Dummy(ImVec2(sz, sz));
8387 ImGui::MenuItem(name);
8395 if (ImGui::BeginMenu(
"Options"))
8398 static bool b =
true;
8399 ImGui::Checkbox(
"SomeOption", &b);
8403 if (ImGui::BeginMenu(
"Disabled",
false))
8407 if (ImGui::MenuItem(
"Checked", NULL,
true)) {}
8409 if (ImGui::MenuItem(
"Quit",
"Alt+F4")) {}
8443 AddLog(
"Welcome to Dear ImGui!");
8448 for (
int i = 0; i <
History.Size; i++)
8453 static int Stricmp(
const char* s1,
const char* s2) {
int d;
while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; }
return d; }
8454 static int Strnicmp(
const char* s1,
const char* s2,
int n) {
int d = 0;
while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; }
return d; }
8455 static char*
Strdup(
const char* s) { IM_ASSERT(s);
size_t len = strlen(s) + 1;
void* buf = ImGui::MemAlloc(len); IM_ASSERT(buf);
return (
char*)memcpy(buf, (
const void*)s, len); }
8456 static void Strtrim(
char* s) {
char* str_end = s + strlen(s);
while (str_end > s && str_end[-1] ==
' ') str_end--; *str_end = 0; }
8460 for (
int i = 0; i <
Items.Size; i++)
8461 ImGui::MemFree(
Items[i]);
8465 void AddLog(
const char* fmt, ...) IM_FMTARGS(2)
8470 va_start(args, fmt);
8471 vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args);
8472 buf[IM_ARRAYSIZE(buf)-1] = 0;
8477 void Draw(
const char* title,
bool* p_open)
8479 ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver);
8480 if (!ImGui::Begin(title, p_open))
8489 if (ImGui::BeginPopupContextItem())
8491 if (ImGui::MenuItem(
"Close Console"))
8497 "This example implements a console with basic coloring, completion (TAB key) and history (Up/Down keys). A more elaborate "
8498 "implementation may want to store entries along with extra data such as timestamp, emitter, etc.");
8499 ImGui::TextWrapped(
"Enter 'HELP' for help.");
8503 if (ImGui::SmallButton(
"Add Debug Text")) {
AddLog(
"%d some text",
Items.Size);
AddLog(
"some more text");
AddLog(
"display very important message here!"); }
8505 if (ImGui::SmallButton(
"Add Debug Error")) {
AddLog(
"[error] something went wrong"); }
8507 if (ImGui::SmallButton(
"Clear")) {
ClearLog(); }
8509 bool copy_to_clipboard = ImGui::SmallButton(
"Copy");
8515 if (ImGui::BeginPopup(
"Options"))
8522 ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_O, ImGuiInputFlags_Tooltip);
8523 if (ImGui::Button(
"Options"))
8524 ImGui::OpenPopup(
"Options");
8526 Filter.Draw(
"Filter (\"incl,-excl\") (\"error\")", 180);
8530 const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing();
8531 if (ImGui::BeginChild(
"ScrollingRegion", ImVec2(0, -footer_height_to_reserve), ImGuiChildFlags_NavFlattened, ImGuiWindowFlags_HorizontalScrollbar))
8533 if (ImGui::BeginPopupContextWindow())
8535 if (ImGui::Selectable(
"Clear"))
ClearLog();
8563 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 1));
8564 if (copy_to_clipboard)
8565 ImGui::LogToClipboard();
8566 for (
const char* item :
Items)
8568 if (!
Filter.PassFilter(item))
8574 bool has_color =
false;
8575 if (strstr(item,
"[error]")) { color = ImVec4(1.0f, 0.4f, 0.4f, 1.0f); has_color =
true; }
8576 else if (strncmp(item,
"# ", 2) == 0) { color = ImVec4(1.0f, 0.8f, 0.6f, 1.0f); has_color =
true; }
8578 ImGui::PushStyleColor(ImGuiCol_Text, color);
8581 ImGui::PopStyleColor();
8583 if (copy_to_clipboard)
8589 ImGui::SetScrollHereY(1.0f);
8592 ImGui::PopStyleVar();
8598 bool reclaim_focus =
false;
8599 ImGuiInputTextFlags input_text_flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_EscapeClearsAll | ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory;
8607 reclaim_focus =
true;
8611 ImGui::SetItemDefaultFocus();
8613 ImGui::SetKeyboardFocusHere(-1);
8620 AddLog(
"# %s\n", command_line);
8625 for (
int i =
History.Size - 1; i >= 0; i--)
8635 if (
Stricmp(command_line,
"CLEAR") == 0)
8639 else if (
Stricmp(command_line,
"HELP") == 0)
8642 for (
int i = 0; i <
Commands.Size; i++)
8645 else if (
Stricmp(command_line,
"HISTORY") == 0)
8647 int first =
History.Size - 10;
8648 for (
int i = first > 0 ? first : 0; i <
History.Size; i++)
8653 AddLog(
"Unknown command: '%s'\n", command_line);
8670 switch (data->EventFlag)
8672 case ImGuiInputTextFlags_CallbackCompletion:
8677 const char* word_end = data->Buf + data->CursorPos;
8678 const char* word_start = word_end;
8679 while (word_start > data->Buf)
8681 const char c = word_start[-1];
8682 if (c ==
' ' || c ==
'\t' || c ==
',' || c ==
';')
8688 ImVector<const char*> candidates;
8689 for (
int i = 0; i <
Commands.Size; i++)
8693 if (candidates.Size == 0)
8696 AddLog(
"No match for \"%.*s\"!\n", (
int)(word_end - word_start), word_start);
8698 else if (candidates.Size == 1)
8701 data->DeleteChars((
int)(word_start - data->Buf), (
int)(word_end - word_start));
8702 data->InsertChars(data->CursorPos, candidates[0]);
8703 data->InsertChars(data->CursorPos,
" ");
8709 int match_len = (int)(word_end - word_start);
8713 bool all_candidates_matches =
true;
8714 for (
int i = 0; i < candidates.Size && all_candidates_matches; i++)
8716 c = toupper(candidates[i][match_len]);
8717 else if (c == 0 || c != toupper(candidates[i][match_len]))
8718 all_candidates_matches =
false;
8719 if (!all_candidates_matches)
8726 data->DeleteChars((
int)(word_start - data->Buf), (
int)(word_end - word_start));
8727 data->InsertChars(data->CursorPos, candidates[0], candidates[0] + match_len);
8731 AddLog(
"Possible matches:\n");
8732 for (
int i = 0; i < candidates.Size; i++)
8733 AddLog(
"- %s\n", candidates[i]);
8738 case ImGuiInputTextFlags_CallbackHistory:
8742 if (data->EventKey == ImGuiKey_UpArrow)
8749 else if (data->EventKey == ImGuiKey_DownArrow)
8760 data->DeleteChars(0, data->BufTextLen);
8761 data->InsertChars(0, history_str);
8769static void ShowExampleAppConsole(
bool* p_open)
8772 console.
Draw(
"Example: Console", p_open);
8803 void AddLog(
const char* fmt, ...) IM_FMTARGS(2)
8805 int old_size =
Buf.size();
8807 va_start(args, fmt);
8808 Buf.appendfv(fmt, args);
8810 for (
int new_size =
Buf.size(); old_size < new_size; old_size++)
8811 if (
Buf[old_size] ==
'\n')
8815 void Draw(
const char* title,
bool* p_open = NULL)
8817 if (!ImGui::Begin(title, p_open))
8824 if (ImGui::BeginPopup(
"Options"))
8831 if (ImGui::Button(
"Options"))
8832 ImGui::OpenPopup(
"Options");
8834 bool clear = ImGui::Button(
"Clear");
8836 bool copy = ImGui::Button(
"Copy");
8838 Filter.Draw(
"Filter", -100.0f);
8842 if (ImGui::BeginChild(
"scrolling", ImVec2(0, 0), ImGuiChildFlags_None, ImGuiWindowFlags_HorizontalScrollbar))
8847 ImGui::LogToClipboard();
8849 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
8850 const char* buf =
Buf.begin();
8851 const char* buf_end =
Buf.end();
8858 for (
int line_no = 0; line_no <
LineOffsets.Size; line_no++)
8860 const char* line_start = buf +
LineOffsets[line_no];
8861 const char* line_end = (line_no + 1 <
LineOffsets.Size) ? (buf +
LineOffsets[line_no + 1] - 1) : buf_end;
8862 if (
Filter.PassFilter(line_start, line_end))
8881 ImGuiListClipper clipper;
8883 while (clipper.Step())
8885 for (
int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++)
8887 const char* line_start = buf +
LineOffsets[line_no];
8888 const char* line_end = (line_no + 1 <
LineOffsets.Size) ? (buf +
LineOffsets[line_no + 1] - 1) : buf_end;
8894 ImGui::PopStyleVar();
8898 if (
AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())
8899 ImGui::SetScrollHereY(1.0f);
8907static void ShowExampleAppLog(
bool* p_open)
8914 ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver);
8915 ImGui::Begin(
"Example: Log", p_open);
8917 if (ImGui::SmallButton(
"[Debug] Add 5 entries"))
8919 static int counter = 0;
8920 const char* categories[3] = {
"info",
"warn",
"error" };
8921 const char* words[] = {
"Bumfuzzled",
"Cattywampus",
"Snickersnee",
"Abibliophobia",
"Absquatulate",
"Nincompoop",
"Pauciloquent" };
8922 for (
int n = 0; n < 5; n++)
8924 const char* category = categories[counter % IM_ARRAYSIZE(categories)];
8925 const char*
word = words[counter % IM_ARRAYSIZE(words)];
8926 log.AddLog(
"[%05d] [%s] Hello, current time is %.1f, here's a word: '%s'\n",
8927 ImGui::GetFrameCount(), category, ImGui::GetTime(), word);
8934 log.Draw(
"Example: Log", p_open);
8942static void ShowExampleAppLayout(
bool* p_open)
8944 ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver);
8945 if (ImGui::Begin(
"Example: Simple layout", p_open, ImGuiWindowFlags_MenuBar))
8948 if (ImGui::BeginMenuBar())
8950 if (ImGui::BeginMenu(
"File"))
8952 if (ImGui::MenuItem(
"Close",
"Ctrl+W")) { *p_open =
false; }
8955 ImGui::EndMenuBar();
8959 static int selected = 0;
8961 ImGui::BeginChild(
"left pane", ImVec2(150, 0), ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeX);
8962 for (
int i = 0; i < 100; i++)
8966 sprintf(label,
"MyObject %d", i);
8967 if (ImGui::Selectable(label, selected == i))
8976 ImGui::BeginGroup();
8977 ImGui::BeginChild(
"item view", ImVec2(0, -ImGui::GetFrameHeightWithSpacing()));
8978 ImGui::Text(
"MyObject: %d", selected);
8980 if (ImGui::BeginTabBar(
"##Tabs", ImGuiTabBarFlags_None))
8982 if (ImGui::BeginTabItem(
"Description"))
8984 ImGui::TextWrapped(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ");
8985 ImGui::EndTabItem();
8987 if (ImGui::BeginTabItem(
"Details"))
8989 ImGui::Text(
"ID: 0123456789");
8990 ImGui::EndTabItem();
8995 if (ImGui::Button(
"Revert")) {}
8997 if (ImGui::Button(
"Save")) {}
9022 if (ImGui::BeginChild(
"##tree", ImVec2(300, 0), ImGuiChildFlags_ResizeX | ImGuiChildFlags_Borders | ImGuiChildFlags_NavFlattened))
9024 ImGui::SetNextItemWidth(-FLT_MIN);
9025 ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_F, ImGuiInputFlags_Tooltip);
9026 ImGui::PushItemFlag(ImGuiItemFlags_NoNavDefaultFocus,
true);
9027 if (ImGui::InputTextWithHint(
"##Filter",
"incl,-excl",
Filter.InputBuf, IM_ARRAYSIZE(
Filter.InputBuf), ImGuiInputTextFlags_EscapeClearsAll))
9029 ImGui::PopItemFlag();
9031 if (ImGui::BeginTable(
"##bg", 1, ImGuiTableFlags_RowBg))
9034 if (
Filter.PassFilter(node->Name))
9044 ImGui::BeginGroup();
9047 ImGui::Text(
"%s", node->Name);
9048 ImGui::TextDisabled(
"UID: 0x%08X", node->UID);
9050 if (ImGui::BeginTable(
"##properties", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_ScrollY))
9052 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed);
9053 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthStretch, 2.0f);
9061 ImGui::TableNextRow();
9062 ImGui::PushID(field_desc.Name);
9063 ImGui::TableNextColumn();
9064 ImGui::AlignTextToFramePadding();
9066 ImGui::TableNextColumn();
9067 void* field_ptr = (
void*)(((
unsigned char*)node) + field_desc.Offset);
9068 switch (field_desc.DataType)
9070 case ImGuiDataType_Bool:
9072 IM_ASSERT(field_desc.DataCount == 1);
9073 ImGui::Checkbox(
"##Editor", (
bool*)field_ptr);
9076 case ImGuiDataType_S32:
9078 int v_min = INT_MIN, v_max = INT_MAX;
9079 ImGui::SetNextItemWidth(-FLT_MIN);
9080 ImGui::DragScalarN(
"##Editor", field_desc.DataType, field_ptr, field_desc.DataCount, 1.0f, &v_min, &v_max);
9083 case ImGuiDataType_Float:
9085 float v_min = 0.0f, v_max = 1.0f;
9086 ImGui::SetNextItemWidth(-FLT_MIN);
9087 ImGui::SliderScalarN(
"##Editor", field_desc.DataType, field_ptr, field_desc.DataCount, &v_min, &v_max);
9102 ImGui::TableNextRow();
9103 ImGui::TableNextColumn();
9104 ImGui::PushID(node->
UID);
9105 ImGuiTreeNodeFlags tree_flags = ImGuiTreeNodeFlags_None;
9106 tree_flags |= ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
9107 tree_flags |= ImGuiTreeNodeFlags_NavLeftJumpsBackHere;
9109 tree_flags |= ImGuiTreeNodeFlags_Selected;
9110 if (node->
Childs.Size == 0)
9111 tree_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet;
9113 ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]);
9114 bool node_open = ImGui::TreeNodeEx(
"", tree_flags,
"%s", node->
Name);
9116 ImGui::PopStyleColor();
9117 if (ImGui::IsItemFocused())
9132 ImGui::SetNextWindowSize(ImVec2(430, 450), ImGuiCond_FirstUseEver);
9133 if (!ImGui::Begin(
"Example: Property editor", p_open))
9142 demo_data->
DemoTree = ExampleTree_CreateDemoTree();
9153static void ShowExampleAppLongText(
bool* p_open)
9155 ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver);
9156 if (!ImGui::Begin(
"Example: Long text display", p_open))
9163 static int test_type = 0;
9164 static ImGuiTextBuffer
log;
9165 static int lines = 0;
9166 ImGui::Text(
"Printing unusually long amount of text.");
9167 ImGui::Combo(
"Test type", &test_type,
9168 "Single call to TextUnformatted()\0"
9169 "Multiple calls to Text(), clipped\0"
9170 "Multiple calls to Text(), not clipped (slow)\0");
9171 ImGui::Text(
"Buffer contents: %d lines, %d bytes", lines,
log.size());
9172 if (ImGui::Button(
"Clear")) {
log.clear(); lines = 0; }
9174 if (ImGui::Button(
"Add 1000 lines"))
9176 for (
int i = 0; i < 1000; i++)
9177 log.appendf(
"%i The quick brown fox jumps over the lazy dog\n", lines + i);
9180 ImGui::BeginChild(
"Log");
9190 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
9191 ImGuiListClipper clipper;
9192 clipper.Begin(lines);
9193 while (clipper.Step())
9194 for (
int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
9195 ImGui::Text(
"%i The quick brown fox jumps over the lazy dog", i);
9196 ImGui::PopStyleVar();
9201 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
9202 for (
int i = 0; i < lines; i++)
9203 ImGui::Text(
"%i The quick brown fox jumps over the lazy dog", i);
9204 ImGui::PopStyleVar();
9216static void ShowExampleAppAutoResize(
bool* p_open)
9218 if (!ImGui::Begin(
"Example: Auto-resizing window", p_open, ImGuiWindowFlags_AlwaysAutoResize))
9225 static int lines = 10;
9227 "Window will resize every-frame to the size of its content.\n"
9228 "Note that you probably don't want to query the window size to\n"
9229 "output your content because that would create a feedback loop.");
9230 ImGui::SliderInt(
"Number of lines", &lines, 1, 20);
9231 for (
int i = 0; i < lines; i++)
9232 ImGui::Text(
"%*sThis is line %d", i * 4,
"", i);
9242static void ShowExampleAppConstrainedResize(
bool* p_open)
9244 struct CustomConstraints
9249 static void AspectRatio(ImGuiSizeCallbackData* data)
9251 float aspect_ratio = *(
float*)data->UserData;
9252 data->DesiredSize.y = (float)(
int)(data->DesiredSize.x / aspect_ratio);
9254 static void Square(ImGuiSizeCallbackData* data)
9256 data->DesiredSize.x = data->DesiredSize.y =
IM_MAX(data->DesiredSize.x, data->DesiredSize.y);
9258 static void Step(ImGuiSizeCallbackData* data)
9260 float step = *(
float*)data->UserData;
9261 data->DesiredSize = ImVec2((
int)(data->DesiredSize.x / step + 0.5f) * step, (
int)(data->DesiredSize.y / step + 0.5f) * step);
9265 const char* test_desc[] =
9267 "Between 100x100 and 500x500",
9269 "Resize vertical + lock current width",
9270 "Resize horizontal + lock current height",
9271 "Width Between 400 and 500",
9272 "Height at least 400",
9273 "Custom: Aspect Ratio 16:9",
9274 "Custom: Always Square",
9275 "Custom: Fixed Steps (100)",
9279 static bool auto_resize =
false;
9280 static bool window_padding =
true;
9281 static int type = 6;
9282 static int display_lines = 10;
9285 float aspect_ratio = 16.0f / 9.0f;
9286 float fixed_step = 100.0f;
9287 if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(500, 500));
9288 if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX));
9289 if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX));
9290 if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1));
9291 if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1));
9292 if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, FLT_MAX));
9293 if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (
void*)&aspect_ratio);
9294 if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square);
9295 if (type == 8) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (
void*)&fixed_step);
9298 if (!window_padding)
9299 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
9300 const ImGuiWindowFlags window_flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0;
9301 const bool window_open = ImGui::Begin(
"Example: Constrained Resize", p_open, window_flags);
9302 if (!window_padding)
9303 ImGui::PopStyleVar();
9307 if (ImGui::GetIO().KeyShift)
9310 ImVec2 avail_size = ImGui::GetContentRegionAvail();
9311 ImVec2 pos = ImGui::GetCursorScreenPos();
9312 ImGui::ColorButton(
"viewport", ImVec4(0.5f, 0.2f, 0.5f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, avail_size);
9313 ImGui::SetCursorScreenPos(ImVec2(pos.x + 10, pos.y + 10));
9314 ImGui::Text(
"%.2f x %.2f", avail_size.x, avail_size.y);
9318 ImGui::Text(
"(Hold SHIFT to display a dummy viewport)");
9319 if (ImGui::IsWindowDocked())
9320 ImGui::Text(
"Warning: Sizing Constraints won't work if the window is docked!");
9321 if (ImGui::Button(
"Set 200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine();
9322 if (ImGui::Button(
"Set 500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine();
9323 if (ImGui::Button(
"Set 800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); }
9324 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 20);
9325 ImGui::Combo(
"Constraint", &type, test_desc, IM_ARRAYSIZE(test_desc));
9326 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 20);
9327 ImGui::DragInt(
"Lines", &display_lines, 0.2f, 1, 100);
9328 ImGui::Checkbox(
"Auto-resize", &auto_resize);
9329 ImGui::Checkbox(
"Window padding", &window_padding);
9330 for (
int i = 0; i < display_lines; i++)
9331 ImGui::Text(
"%*sHello, sailor! Making this line long enough for the example.", i * 4,
"");
9343static void ShowExampleAppSimpleOverlay(
bool* p_open)
9345 static int location = 0;
9346 ImGuiIO& io = ImGui::GetIO();
9347 ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav;
9350 const float PAD = 10.0f;
9351 const ImGuiViewport* viewport = ImGui::GetMainViewport();
9352 ImVec2 work_pos = viewport->WorkPos;
9353 ImVec2 work_size = viewport->WorkSize;
9354 ImVec2 window_pos, window_pos_pivot;
9355 window_pos.x = (location & 1) ? (work_pos.x + work_size.x - PAD) : (work_pos.x + PAD);
9356 window_pos.y = (location & 2) ? (work_pos.y + work_size.y - PAD) : (work_pos.y + PAD);
9357 window_pos_pivot.x = (location & 1) ? 1.0f : 0.0f;
9358 window_pos_pivot.y = (location & 2) ? 1.0f : 0.0f;
9359 ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot);
9360 ImGui::SetNextWindowViewport(viewport->ID);
9361 window_flags |= ImGuiWindowFlags_NoMove;
9363 else if (location == -2)
9366 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
9367 window_flags |= ImGuiWindowFlags_NoMove;
9369 ImGui::SetNextWindowBgAlpha(0.35f);
9370 if (ImGui::Begin(
"Example: Simple overlay", p_open, window_flags))
9373 ImGui::Text(
"Simple overlay\n" "(right-click to change position)");
9375 if (ImGui::IsMousePosValid())
9376 ImGui::Text(
"Mouse Position: (%.1f,%.1f)", io.MousePos.x, io.MousePos.y);
9378 ImGui::Text(
"Mouse Position: <invalid>");
9379 if (ImGui::BeginPopupContextWindow())
9381 if (ImGui::MenuItem(
"Custom", NULL, location == -1)) location = -1;
9382 if (ImGui::MenuItem(
"Center", NULL, location == -2)) location = -2;
9383 if (ImGui::MenuItem(
"Top-left", NULL, location == 0)) location = 0;
9384 if (ImGui::MenuItem(
"Top-right", NULL, location == 1)) location = 1;
9385 if (ImGui::MenuItem(
"Bottom-left", NULL, location == 2)) location = 2;
9386 if (ImGui::MenuItem(
"Bottom-right", NULL, location == 3)) location = 3;
9387 if (p_open && ImGui::MenuItem(
"Close")) *p_open =
false;
9399static void ShowExampleAppFullscreen(
bool* p_open)
9401 static bool use_work_area =
true;
9402 static ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings;
9406 const ImGuiViewport* viewport = ImGui::GetMainViewport();
9407 ImGui::SetNextWindowPos(use_work_area ? viewport->WorkPos : viewport->Pos);
9408 ImGui::SetNextWindowSize(use_work_area ? viewport->WorkSize : viewport->Size);
9410 if (ImGui::Begin(
"Example: Fullscreen window", p_open, flags))
9412 ImGui::Checkbox(
"Use work area instead of main area", &use_work_area);
9414 HelpMarker(
"Main Area = entire viewport,\nWork Area = entire viewport minus sections used by the main menu bars, task bars etc.\n\nEnable the main-menu bar in Examples menu to see the difference.");
9416 ImGui::CheckboxFlags(
"ImGuiWindowFlags_NoBackground", &flags, ImGuiWindowFlags_NoBackground);
9417 ImGui::CheckboxFlags(
"ImGuiWindowFlags_NoDecoration", &flags, ImGuiWindowFlags_NoDecoration);
9419 ImGui::CheckboxFlags(
"ImGuiWindowFlags_NoTitleBar", &flags, ImGuiWindowFlags_NoTitleBar);
9420 ImGui::CheckboxFlags(
"ImGuiWindowFlags_NoCollapse", &flags, ImGuiWindowFlags_NoCollapse);
9421 ImGui::CheckboxFlags(
"ImGuiWindowFlags_NoScrollbar", &flags, ImGuiWindowFlags_NoScrollbar);
9424 if (p_open && ImGui::Button(
"Close this window"))
9437static void ShowExampleAppWindowTitles(
bool*)
9439 const ImGuiViewport* viewport = ImGui::GetMainViewport();
9440 const ImVec2 base_pos = viewport->Pos;
9446 ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 100), ImGuiCond_FirstUseEver);
9447 ImGui::Begin(
"Same title as another window##1");
9449 ImGui::Text(
"This is window 1.\nMy title is the same as window 2, but my identifier is unique.");
9452 ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 200), ImGuiCond_FirstUseEver);
9453 ImGui::Begin(
"Same title as another window##2");
9454 ImGui::Text(
"This is window 2.\nMy title is the same as window 1, but my identifier is unique.");
9459 sprintf(buf,
"Animated title %c %d###AnimatedTitle",
"|/-\\"[(
int)(ImGui::GetTime() / 0.25f) & 3], ImGui::GetFrameCount());
9460 ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 300), ImGuiCond_FirstUseEver);
9462 ImGui::Text(
"This window has a changing title.");
9471static void PathConcaveShape(ImDrawList* draw_list,
float x,
float y,
float sz)
9473 const ImVec2 pos_norms[] = { { 0.0f, 0.0f }, { 0.3f, 0.0f }, { 0.3f, 0.7f }, { 0.7f, 0.7f }, { 0.7f, 0.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f }, { 0.0f, 1.0f } };
9474 for (
const ImVec2& p : pos_norms)
9475 draw_list->PathLineTo(ImVec2(x + 0.5f + (int)(sz * p.x), y + 0.5f + (int)(sz * p.y)));
9479static void ShowExampleAppCustomRendering(
bool* p_open)
9481 if (!ImGui::Begin(
"Example: Custom rendering", p_open))
9493 if (ImGui::BeginTabBar(
"##TabBar"))
9495 if (ImGui::BeginTabItem(
"Primitives"))
9497 ImGui::PushItemWidth(-ImGui::GetFontSize() * 15);
9498 ImDrawList* draw_list = ImGui::GetWindowDrawList();
9503 ImGui::Text(
"Gradients");
9504 ImVec2 gradient_size = ImVec2(ImGui::CalcItemWidth(), ImGui::GetFrameHeight());
9506 ImVec2 p0 = ImGui::GetCursorScreenPos();
9507 ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y);
9508 ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 0, 0, 255));
9509 ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 255, 255, 255));
9510 draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a);
9511 ImGui::InvisibleButton(
"##gradient1", gradient_size);
9514 ImVec2 p0 = ImGui::GetCursorScreenPos();
9515 ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y);
9516 ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 255, 0, 255));
9517 ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 0, 0, 255));
9518 draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a);
9519 ImGui::InvisibleButton(
"##gradient2", gradient_size);
9523 ImGui::Text(
"All primitives");
9524 static float sz = 36.0f;
9525 static float thickness = 3.0f;
9526 static int ngon_sides = 6;
9527 static bool circle_segments_override =
false;
9528 static int circle_segments_override_v = 12;
9529 static bool curve_segments_override =
false;
9530 static int curve_segments_override_v = 8;
9531 static ImVec4 colf = ImVec4(1.0f, 1.0f, 0.4f, 1.0f);
9532 ImGui::DragFloat(
"Size", &sz, 0.2f, 2.0f, 100.0f,
"%.0f");
9533 ImGui::DragFloat(
"Thickness", &thickness, 0.05f, 1.0f, 8.0f,
"%.02f");
9534 ImGui::SliderInt(
"N-gon sides", &ngon_sides, 3, 12);
9535 ImGui::Checkbox(
"##circlesegmentoverride", &circle_segments_override);
9536 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
9537 circle_segments_override |= ImGui::SliderInt(
"Circle segments override", &circle_segments_override_v, 3, 40);
9538 ImGui::Checkbox(
"##curvessegmentoverride", &curve_segments_override);
9539 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
9540 curve_segments_override |= ImGui::SliderInt(
"Curves segments override", &curve_segments_override_v, 3, 40);
9541 ImGui::ColorEdit4(
"Color", &colf.x);
9543 const ImVec2 p = ImGui::GetCursorScreenPos();
9544 const ImU32 col = ImColor(colf);
9545 const float spacing = 10.0f;
9546 const ImDrawFlags corners_tl_br = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomRight;
9547 const float rounding = sz / 5.0f;
9548 const int circle_segments = circle_segments_override ? circle_segments_override_v : 0;
9549 const int curve_segments = curve_segments_override ? curve_segments_override_v : 0;
9550 const ImVec2 cp3[3] = { ImVec2(0.0f, sz * 0.6f), ImVec2(sz * 0.5f, -sz * 0.4f), ImVec2(sz, sz) };
9551 const ImVec2 cp4[4] = { ImVec2(0.0f, 0.0f), ImVec2(sz * 1.3f, sz * 0.3f), ImVec2(sz - sz * 1.3f, sz - sz * 0.3f), ImVec2(sz, sz) };
9553 float x = p.x + 4.0f;
9554 float y = p.y + 4.0f;
9555 for (
int n = 0; n < 2; n++)
9558 float th = (n == 0) ? 1.0f : thickness;
9559 draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing;
9560 draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing;
9561 draw_list->AddEllipse(ImVec2(x + sz*0.5f, y + sz*0.5f), ImVec2(sz*0.5f, sz*0.3f), col, -0.3f, circle_segments, th); x += sz + spacing;
9562 draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing;
9563 draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing;
9564 draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing;
9565 draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing;
9567 PathConcaveShape(draw_list, x, y, sz); draw_list->PathStroke(col, ImDrawFlags_Closed, th); x += sz + spacing;
9569 draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing;
9570 draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing;
9571 draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing;
9574 draw_list->PathArcTo(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, 3.141592f, 3.141592f * -0.5f);
9575 draw_list->PathStroke(col, ImDrawFlags_None, th);
9579 draw_list->AddBezierQuadratic(ImVec2(x + cp3[0].x, y + cp3[0].y), ImVec2(x + cp3[1].x, y + cp3[1].y), ImVec2(x + cp3[2].x, y + cp3[2].y), col, th, curve_segments);
9583 draw_list->AddBezierCubic(ImVec2(x + cp4[0].x, y + cp4[0].y), ImVec2(x + cp4[1].x, y + cp4[1].y), ImVec2(x + cp4[2].x, y + cp4[2].y), ImVec2(x + cp4[3].x, y + cp4[3].y), col, th, curve_segments);
9590 draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, ngon_sides); x += sz + spacing;
9591 draw_list->AddCircleFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, circle_segments); x += sz + spacing;
9592 draw_list->AddEllipseFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), ImVec2(sz * 0.5f, sz * 0.3f), col, -0.3f, circle_segments); x += sz + spacing;
9593 draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing;
9594 draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing;
9595 draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing;
9596 draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing;
9598 PathConcaveShape(draw_list, x, y, sz); draw_list->PathFillConcave(col); x += sz + spacing;
9599 draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing;
9600 draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;
9601 draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz;
9604 draw_list->PathArcTo(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, 3.141592f * -0.5f, 3.141592f);
9605 draw_list->PathFillConvex(col);
9609 draw_list->PathLineTo(ImVec2(x + cp3[0].x, y + cp3[0].y));
9610 draw_list->PathBezierQuadraticCurveTo(ImVec2(x + cp3[1].x, y + cp3[1].y), ImVec2(x + cp3[2].x, y + cp3[2].y), curve_segments);
9611 draw_list->PathFillConvex(col);
9614 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));
9617 ImGui::Dummy(ImVec2((sz + spacing) * 13.2f, (sz + spacing) * 3.0f));
9618 ImGui::PopItemWidth();
9619 ImGui::EndTabItem();
9622 if (ImGui::BeginTabItem(
"Canvas"))
9624 static ImVector<ImVec2> points;
9625 static ImVec2 scrolling(0.0f, 0.0f);
9626 static bool opt_enable_grid =
true;
9627 static bool opt_enable_context_menu =
true;
9628 static bool adding_line =
false;
9630 ImGui::Checkbox(
"Enable grid", &opt_enable_grid);
9631 ImGui::Checkbox(
"Enable context menu", &opt_enable_context_menu);
9632 ImGui::Text(
"Mouse Left: drag to add lines,\nMouse Right: drag to scroll, click for context menu.");
9646 ImVec2 canvas_p0 = ImGui::GetCursorScreenPos();
9647 ImVec2 canvas_sz = ImGui::GetContentRegionAvail();
9648 if (canvas_sz.x < 50.0f) canvas_sz.x = 50.0f;
9649 if (canvas_sz.y < 50.0f) canvas_sz.y = 50.0f;
9650 ImVec2 canvas_p1 = ImVec2(canvas_p0.x + canvas_sz.x, canvas_p0.y + canvas_sz.y);
9653 ImGuiIO& io = ImGui::GetIO();
9654 ImDrawList* draw_list = ImGui::GetWindowDrawList();
9655 draw_list->AddRectFilled(canvas_p0, canvas_p1, IM_COL32(50, 50, 50, 255));
9656 draw_list->AddRect(canvas_p0, canvas_p1, IM_COL32(255, 255, 255, 255));
9659 ImGui::InvisibleButton(
"canvas", canvas_sz, ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight);
9660 const bool is_hovered = ImGui::IsItemHovered();
9661 const bool is_active = ImGui::IsItemActive();
9662 const ImVec2 origin(canvas_p0.x + scrolling.x, canvas_p0.y + scrolling.y);
9663 const ImVec2 mouse_pos_in_canvas(io.MousePos.x - origin.x, io.MousePos.y - origin.y);
9666 if (is_hovered && !adding_line && ImGui::IsMouseClicked(ImGuiMouseButton_Left))
9668 points.push_back(mouse_pos_in_canvas);
9669 points.push_back(mouse_pos_in_canvas);
9674 points.back() = mouse_pos_in_canvas;
9675 if (!ImGui::IsMouseDown(ImGuiMouseButton_Left))
9676 adding_line =
false;
9681 const float mouse_threshold_for_pan = opt_enable_context_menu ? -1.0f : 0.0f;
9682 if (is_active && ImGui::IsMouseDragging(ImGuiMouseButton_Right, mouse_threshold_for_pan))
9684 scrolling.x += io.MouseDelta.x;
9685 scrolling.y += io.MouseDelta.y;
9689 ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right);
9690 if (opt_enable_context_menu && drag_delta.x == 0.0f && drag_delta.y == 0.0f)
9691 ImGui::OpenPopupOnItemClick(
"context", ImGuiPopupFlags_MouseButtonRight);
9692 if (ImGui::BeginPopup(
"context"))
9695 points.resize(points.size() - 2);
9696 adding_line =
false;
9697 if (ImGui::MenuItem(
"Remove one", NULL,
false, points.Size > 0)) { points.resize(points.size() - 2); }
9698 if (ImGui::MenuItem(
"Remove all", NULL,
false, points.Size > 0)) { points.clear(); }
9703 draw_list->PushClipRect(canvas_p0, canvas_p1,
true);
9704 if (opt_enable_grid)
9706 const float GRID_STEP = 64.0f;
9707 for (
float x = fmodf(scrolling.x, GRID_STEP); x < canvas_sz.x; x += GRID_STEP)
9708 draw_list->AddLine(ImVec2(canvas_p0.x + x, canvas_p0.y), ImVec2(canvas_p0.x + x, canvas_p1.y), IM_COL32(200, 200, 200, 40));
9709 for (
float y = fmodf(scrolling.y, GRID_STEP); y < canvas_sz.y; y += GRID_STEP)
9710 draw_list->AddLine(ImVec2(canvas_p0.x, canvas_p0.y + y), ImVec2(canvas_p1.x, canvas_p0.y + y), IM_COL32(200, 200, 200, 40));
9712 for (
int n = 0; n < points.Size; n += 2)
9713 draw_list->AddLine(ImVec2(origin.x + points[n].x, origin.y + points[n].y), ImVec2(origin.x + points[n + 1].x, origin.y + points[n + 1].y), IM_COL32(255, 255, 0, 255), 2.0f);
9714 draw_list->PopClipRect();
9716 ImGui::EndTabItem();
9719 if (ImGui::BeginTabItem(
"BG/FG draw lists"))
9721 static bool draw_bg =
true;
9722 static bool draw_fg =
true;
9723 ImGui::Checkbox(
"Draw in Background draw list", &draw_bg);
9724 ImGui::SameLine(); HelpMarker(
"The Background draw list will be rendered below every Dear ImGui windows.");
9725 ImGui::Checkbox(
"Draw in Foreground draw list", &draw_fg);
9726 ImGui::SameLine(); HelpMarker(
"The Foreground draw list will be rendered over every Dear ImGui windows.");
9727 ImVec2 window_pos = ImGui::GetWindowPos();
9728 ImVec2 window_size = ImGui::GetWindowSize();
9729 ImVec2 window_center = ImVec2(window_pos.x + window_size.x * 0.5f, window_pos.y + window_size.y * 0.5f);
9731 ImGui::GetBackgroundDrawList()->AddCircle(window_center, window_size.x * 0.6f, IM_COL32(255, 0, 0, 200), 0, 10 + 4);
9733 ImGui::GetForegroundDrawList()->AddCircle(window_center, window_size.y * 0.6f, IM_COL32(0, 255, 0, 200), 0, 10);
9734 ImGui::EndTabItem();
9740 if (ImGui::BeginTabItem(
"Draw Channels"))
9742 ImDrawList* draw_list = ImGui::GetWindowDrawList();
9744 ImGui::Text(
"Blue shape is drawn first: appears in back");
9745 ImGui::Text(
"Red shape is drawn after: appears in front");
9746 ImVec2 p0 = ImGui::GetCursorScreenPos();
9747 draw_list->AddRectFilled(ImVec2(p0.x, p0.y), ImVec2(p0.x + 50, p0.y + 50), IM_COL32(0, 0, 255, 255));
9748 draw_list->AddRectFilled(ImVec2(p0.x + 25, p0.y + 25), ImVec2(p0.x + 75, p0.y + 75), IM_COL32(255, 0, 0, 255));
9749 ImGui::Dummy(ImVec2(75, 75));
9753 ImGui::Text(
"Blue shape is drawn first, into channel 1: appears in front");
9754 ImGui::Text(
"Red shape is drawn after, into channel 0: appears in back");
9755 ImVec2 p1 = ImGui::GetCursorScreenPos();
9759 draw_list->ChannelsSplit(2);
9760 draw_list->ChannelsSetCurrent(1);
9761 draw_list->AddRectFilled(ImVec2(p1.x, p1.y), ImVec2(p1.x + 50, p1.y + 50), IM_COL32(0, 0, 255, 255));
9762 draw_list->ChannelsSetCurrent(0);
9763 draw_list->AddRectFilled(ImVec2(p1.x + 25, p1.y + 25), ImVec2(p1.x + 75, p1.y + 75), IM_COL32(255, 0, 0, 255));
9767 draw_list->ChannelsMerge();
9768 ImGui::Dummy(ImVec2(75, 75));
9769 ImGui::Text(
"After reordering, contents of channel 0 appears below channel 1.");
9771 ImGui::EndTabItem();
9799void ShowExampleAppDockSpace(
bool* p_open)
9816 static bool opt_fullscreen =
true;
9817 static bool opt_padding =
false;
9818 static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_None;
9822 ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
9825 const ImGuiViewport* viewport = ImGui::GetMainViewport();
9826 ImGui::SetNextWindowPos(viewport->WorkPos);
9827 ImGui::SetNextWindowSize(viewport->WorkSize);
9828 ImGui::SetNextWindowViewport(viewport->ID);
9829 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
9830 ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
9831 window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
9832 window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
9836 dockspace_flags &= ~ImGuiDockNodeFlags_PassthruCentralNode;
9841 if (dockspace_flags & ImGuiDockNodeFlags_PassthruCentralNode)
9842 window_flags |= ImGuiWindowFlags_NoBackground;
9850 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
9851 ImGui::Begin(
"DockSpace Demo", p_open, window_flags);
9853 ImGui::PopStyleVar();
9856 ImGui::PopStyleVar(2);
9859 ImGuiIO& io = ImGui::GetIO();
9860 if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable)
9862 ImGuiID dockspace_id = ImGui::GetID(
"MyDockSpace");
9863 ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags);
9867 ShowDockingDisabledMessage();
9870 if (ImGui::BeginMenuBar())
9872 if (ImGui::BeginMenu(
"Options"))
9876 ImGui::MenuItem(
"Fullscreen", NULL, &opt_fullscreen);
9877 ImGui::MenuItem(
"Padding", NULL, &opt_padding);
9880 if (ImGui::MenuItem(
"Flag: NoDockingOverCentralNode",
"", (dockspace_flags & ImGuiDockNodeFlags_NoDockingOverCentralNode) != 0)) { dockspace_flags ^= ImGuiDockNodeFlags_NoDockingOverCentralNode; }
9881 if (ImGui::MenuItem(
"Flag: NoDockingSplit",
"", (dockspace_flags & ImGuiDockNodeFlags_NoDockingSplit) != 0)) { dockspace_flags ^= ImGuiDockNodeFlags_NoDockingSplit; }
9882 if (ImGui::MenuItem(
"Flag: NoUndocking",
"", (dockspace_flags & ImGuiDockNodeFlags_NoUndocking) != 0)) { dockspace_flags ^= ImGuiDockNodeFlags_NoUndocking; }
9883 if (ImGui::MenuItem(
"Flag: NoResize",
"", (dockspace_flags & ImGuiDockNodeFlags_NoResize) != 0)) { dockspace_flags ^= ImGuiDockNodeFlags_NoResize; }
9884 if (ImGui::MenuItem(
"Flag: AutoHideTabBar",
"", (dockspace_flags & ImGuiDockNodeFlags_AutoHideTabBar) != 0)) { dockspace_flags ^= ImGuiDockNodeFlags_AutoHideTabBar; }
9885 if (ImGui::MenuItem(
"Flag: PassthruCentralNode",
"", (dockspace_flags & ImGuiDockNodeFlags_PassthruCentralNode) != 0, opt_fullscreen)) { dockspace_flags ^= ImGuiDockNodeFlags_PassthruCentralNode; }
9888 if (ImGui::MenuItem(
"Close", NULL,
false, p_open != NULL))
9893 "When docking is enabled, you can ALWAYS dock MOST window into another! Try it now!" "\n"
9894 "- Drag from window title bar or their tab to dock/undock." "\n"
9895 "- Drag from window menu button (upper-left button) to undock an entire node (all windows)." "\n"
9896 "- Hold SHIFT to disable docking (if io.ConfigDockingWithShift == false, default)" "\n"
9897 "- Hold SHIFT to enable docking (if io.ConfigDockingWithShift == true)" "\n"
9898 "This demo app has nothing to do with enabling docking!" "\n\n"
9899 "This demo app only demonstrate the use of ImGui::DockSpace() which allows you to manually create a docking node _within_ another window." "\n\n"
9900 "Read comments in ShowExampleAppDockSpace() for more details.");
9902 ImGui::EndMenuBar();
9922 MyDocument(
int uid,
const char* name,
bool open =
true,
const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f))
9925 snprintf(
Name,
sizeof(
Name),
"%s", name);
9948 Documents.push_back(
MyDocument(4,
"A Rather Long Title",
false, ImVec4(0.4f, 0.8f, 0.8f, 1.0f)));
9949 Documents.push_back(
MyDocument(5,
"Some Document",
false, ImVec4(0.8f, 0.8f, 1.0f, 1.0f)));
9955 snprintf(out_buf, out_buf_size,
"%s###doc%d", doc->
Name, doc->
UID);
9962 ImGui::Text(
"Document \"%s\"", doc->
Name);
9963 ImGui::PushStyleColor(ImGuiCol_Text, doc->
Color);
9964 ImGui::TextWrapped(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
9965 ImGui::PopStyleColor();
9967 ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_R, ImGuiInputFlags_Tooltip);
9968 if (ImGui::Button(
"Rename.."))
9975 ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_M, ImGuiInputFlags_Tooltip);
9976 if (ImGui::Button(
"Modify"))
9980 ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_S, ImGuiInputFlags_Tooltip);
9981 if (ImGui::Button(
"Save"))
9985 ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_W, ImGuiInputFlags_Tooltip);
9986 if (ImGui::Button(
"Close"))
9988 ImGui::ColorEdit3(
"color", &doc->
Color.x);
9995 if (!ImGui::BeginPopupContextItem())
9999 sprintf(buf,
"Save %s", doc->
Name);
10000 if (ImGui::MenuItem(buf,
"Ctrl+S",
false, doc->
Open))
10002 if (ImGui::MenuItem(
"Rename...",
"Ctrl+R",
false, doc->
Open))
10004 if (ImGui::MenuItem(
"Close",
"Ctrl+W",
false, doc->
Open))
10021 if (!doc.Open && doc.OpenPrev)
10022 ImGui::SetTabItemClosed(doc.Name);
10023 doc.OpenPrev = doc.Open;
10028void ShowExampleAppDocuments(
bool* p_open)
10037 Target_DockSpaceAndWindow
10039 static Target opt_target = Target_Tab;
10040 static bool opt_reorderable =
true;
10041 static ImGuiTabBarFlags opt_fitting_flags = ImGuiTabBarFlags_FittingPolicyDefault_;
10050 bool window_contents_visible = ImGui::Begin(
"Example: Documents", p_open, ImGuiWindowFlags_MenuBar);
10051 if (!window_contents_visible && opt_target != Target_DockSpaceAndWindow)
10058 if (ImGui::BeginMenuBar())
10060 if (ImGui::BeginMenu(
"File"))
10062 int open_count = 0;
10064 open_count += doc.Open ? 1 : 0;
10066 if (ImGui::BeginMenu(
"Open", open_count < app.
Documents.Size))
10069 if (!doc.Open &&
ImGui::MenuItem(doc.Name))
10073 if (ImGui::MenuItem(
"Close All Documents", NULL,
false, open_count > 0))
10075 app.CloseQueue.push_back(&doc);
10076 if (ImGui::MenuItem(
"Exit") && p_open)
10080 ImGui::EndMenuBar();
10084 for (
int doc_n = 0; doc_n < app.
Documents.Size; doc_n++)
10089 ImGui::PushID(&doc);
10090 if (ImGui::Checkbox(doc.
Name, &doc.
Open))
10095 ImGui::PushItemWidth(ImGui::GetFontSize() * 12);
10096 ImGui::Combo(
"Output", (
int*)&opt_target,
"None\0TabBar+Tabs\0DockSpace+Window\0");
10097 ImGui::PopItemWidth();
10098 bool redock_all =
false;
10099 if (opt_target == Target_Tab) { ImGui::SameLine(); ImGui::Checkbox(
"Reorderable Tabs", &opt_reorderable); }
10100 if (opt_target == Target_DockSpaceAndWindow) { ImGui::SameLine(); redock_all = ImGui::Button(
"Redock all"); }
10102 ImGui::Separator();
10115 if (opt_target == Target_Tab)
10117 ImGuiTabBarFlags tab_bar_flags = (opt_fitting_flags) | (opt_reorderable ? ImGuiTabBarFlags_Reorderable : 0);
10118 tab_bar_flags |= ImGuiTabBarFlags_DrawSelectedOverline;
10119 if (ImGui::BeginTabBar(
"##tabs", tab_bar_flags))
10121 if (opt_reorderable)
10135 char doc_name_buf[64];
10136 app.
GetTabName(&doc, doc_name_buf,
sizeof(doc_name_buf));
10137 ImGuiTabItemFlags tab_flags = (doc.
Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0);
10138 bool visible = ImGui::BeginTabItem(doc_name_buf, &doc.
Open, tab_flags);
10151 ImGui::EndTabItem();
10155 ImGui::EndTabBar();
10158 else if (opt_target == Target_DockSpaceAndWindow)
10160 if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_DockingEnable)
10165 ImGuiID dockspace_id = ImGui::GetID(
"MyDockSpace");
10166 ImGui::DockSpace(dockspace_id);
10169 for (
int doc_n = 0; doc_n < app.
Documents.Size; doc_n++)
10175 ImGui::SetNextWindowDockID(dockspace_id, redock_all ? ImGuiCond_Always : ImGuiCond_FirstUseEver);
10176 ImGuiWindowFlags window_flags = (doc->
Dirty ? ImGuiWindowFlags_UnsavedDocument : 0);
10177 bool visible = ImGui::Begin(doc->
Name, &doc->
Open, window_flags);
10195 ShowDockingDisabledMessage();
10200 if (!window_contents_visible)
10210 ImGui::OpenPopup(
"Rename");
10211 if (ImGui::BeginPopup(
"Rename"))
10213 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 30);
10216 ImGui::CloseCurrentPopup();
10220 ImGui::SetKeyboardFocusHere(-1);
10233 int close_queue_unsaved_documents = 0;
10234 for (
int n = 0; n < app.
CloseQueue.Size; n++)
10236 close_queue_unsaved_documents++;
10238 if (close_queue_unsaved_documents == 0)
10241 for (
int n = 0; n < app.
CloseQueue.Size; n++)
10247 if (!ImGui::IsPopupOpen(
"Save?"))
10248 ImGui::OpenPopup(
"Save?");
10249 if (ImGui::BeginPopupModal(
"Save?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
10251 ImGui::Text(
"Save change to the following items?");
10252 float item_height = ImGui::GetTextLineHeightWithSpacing();
10253 if (ImGui::BeginChild(ImGui::GetID(
"frame"), ImVec2(-FLT_MIN, 6.25f * item_height), ImGuiChildFlags_FrameStyle))
10256 ImGui::Text(
"%s", doc->Name);
10259 ImVec2 button_size(ImGui::GetFontSize() * 7.0f, 0.0f);
10260 if (ImGui::Button(
"Yes", button_size))
10269 ImGui::CloseCurrentPopup();
10272 if (ImGui::Button(
"No", button_size))
10275 doc->DoForceClose();
10277 ImGui::CloseCurrentPopup();
10280 if (ImGui::Button(
"Cancel", button_size))
10283 ImGui::CloseCurrentPopup();
10311 if (items_count > 1)
10325 if (sort_spec->ColumnIndex == 0)
10326 delta = ((int)a->
ID - (
int)b->
ID);
10327 else if (sort_spec->ColumnIndex == 1)
10330 return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? +1 : -1;
10332 return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? -1 : +1;
10334 return ((
int)a->
ID - (int)b->
ID);
10375 if (
Items.Size == 0)
10378 for (
int n = 0; n < count; n++,
NextItemId++)
10411 void Draw(
const char* title,
bool* p_open)
10413 ImGui::SetNextWindowSize(ImVec2(
IconSize * 25,
IconSize * 15), ImGuiCond_FirstUseEver);
10414 if (!ImGui::Begin(title, p_open, ImGuiWindowFlags_MenuBar))
10421 if (ImGui::BeginMenuBar())
10423 if (ImGui::BeginMenu(
"File"))
10425 if (ImGui::MenuItem(
"Add 10000 items"))
10427 if (ImGui::MenuItem(
"Clear items"))
10429 ImGui::Separator();
10430 if (ImGui::MenuItem(
"Close", NULL,
false, p_open != NULL))
10434 if (ImGui::BeginMenu(
"Edit"))
10436 if (ImGui::MenuItem(
"Delete",
"Del",
false,
Selection.Size > 0))
10440 if (ImGui::BeginMenu(
"Options"))
10442 ImGui::PushItemWidth(ImGui::GetFontSize() * 10);
10444 ImGui::SeparatorText(
"Contents");
10448 ImGui::SeparatorText(
"Selection Behavior");
10452 ImGui::SeparatorText(
"Layout");
10453 ImGui::SliderFloat(
"Icon Size", &
IconSize, 16.0f, 128.0f,
"%.0f");
10454 ImGui::SameLine(); HelpMarker(
"Use CTRL+Wheel to zoom");
10455 ImGui::SliderInt(
"Icon Spacing", &
IconSpacing, 0, 32);
10458 ImGui::PopItemWidth();
10461 ImGui::EndMenuBar();
10467 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
10468 ImGuiTableFlags table_flags_for_sort_specs = ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Borders;
10469 if (ImGui::BeginTable(
"for_sort_specs_only", 2, table_flags_for_sort_specs, ImVec2(0.0f, ImGui::GetFrameHeight())))
10471 ImGui::TableSetupColumn(
"Index");
10472 ImGui::TableSetupColumn(
"Type");
10473 ImGui::TableHeadersRow();
10474 if (ImGuiTableSortSpecs* sort_specs = ImGui::TableGetSortSpecs())
10482 ImGui::PopStyleVar();
10485 ImGuiIO& io = ImGui::GetIO();
10487 if (ImGui::BeginChild(
"Assets", ImVec2(0.0f, -ImGui::GetTextLineHeightWithSpacing()), ImGuiChildFlags_Borders, ImGuiWindowFlags_NoMove))
10489 ImDrawList* draw_list = ImGui::GetWindowDrawList();
10491 const float avail_width = ImGui::GetContentRegionAvail().x;
10495 ImVec2 start_pos = ImGui::GetCursorScreenPos();
10497 ImGui::SetCursorScreenPos(start_pos);
10500 ImGuiMultiSelectFlags ms_flags = ImGuiMultiSelectFlags_ClearOnEscape | ImGuiMultiSelectFlags_ClearOnClickVoid;
10504 ms_flags |= ImGuiMultiSelectFlags_BoxSelect2d;
10508 ms_flags |= ImGuiMultiSelectFlags_SelectOnClickRelease;
10514 ms_flags |= ImGuiMultiSelectFlags_NavWrapX;
10516 ImGuiMultiSelectIO* ms_io = ImGui::BeginMultiSelect(ms_flags,
Selection.Size,
Items.Size);
10523 const bool want_delete = (ImGui::Shortcut(ImGuiKey_Delete, ImGuiInputFlags_Repeat) && (
Selection.Size > 0)) ||
RequestDelete;
10535 const ImU32 icon_type_overlay_colors[3] = { 0, IM_COL32(200, 70, 70, 255), IM_COL32(70, 170, 70, 255) };
10536 const ImU32 icon_bg_color = ImGui::GetColorU32(IM_COL32(35, 35, 35, 220));
10537 const ImVec2 icon_type_overlay_size = ImVec2(4.0f, 4.0f);
10541 ImGuiListClipper clipper;
10543 if (item_curr_idx_to_focus != -1)
10544 clipper.IncludeItemByIndex(item_curr_idx_to_focus / column_count);
10545 if (ms_io->RangeSrcItem != -1)
10546 clipper.IncludeItemByIndex((
int)ms_io->RangeSrcItem / column_count);
10547 while (clipper.Step())
10549 for (
int line_idx = clipper.DisplayStart; line_idx < clipper.DisplayEnd; line_idx++)
10551 const int item_min_idx_for_current_line = line_idx * column_count;
10552 const int item_max_idx_for_current_line =
IM_MIN((line_idx + 1) * column_count,
Items.Size);
10553 for (
int item_idx = item_min_idx_for_current_line; item_idx < item_max_idx_for_current_line; ++item_idx)
10556 ImGui::PushID((
int)item_data->
ID);
10560 ImGui::SetCursorScreenPos(pos);
10562 ImGui::SetNextItemSelectionUserData(item_idx);
10563 bool item_is_selected =
Selection.Contains((ImGuiID)item_data->
ID);
10565 ImGui::Selectable(
"", item_is_selected, ImGuiSelectableFlags_None,
LayoutItemSize);
10569 if (ImGui::IsItemToggledSelection())
10570 item_is_selected = !item_is_selected;
10573 if (item_curr_idx_to_focus == item_idx)
10574 ImGui::SetKeyboardFocusHere(-1);
10577 if (ImGui::BeginDragDropSource())
10581 if (ImGui::GetDragDropPayload() == NULL)
10583 ImVector<ImGuiID> payload_items;
10586 if (!item_is_selected)
10587 payload_items.push_back(item_data->
ID);
10589 while (
Selection.GetNextSelectedItem(&it, &
id))
10590 payload_items.push_back(
id);
10591 ImGui::SetDragDropPayload(
"ASSETS_BROWSER_ITEMS", payload_items.Data, (
size_t)payload_items.size_in_bytes());
10596 const ImGuiPayload* payload = ImGui::GetDragDropPayload();
10597 const int payload_count = (int)payload->DataSize / (
int)
sizeof(ImGuiID);
10598 ImGui::Text(
"%d assets", payload_count);
10600 ImGui::EndDragDropSource();
10605 if (item_is_visible)
10607 ImVec2 box_min(pos.x - 1, pos.y - 1);
10609 draw_list->AddRectFilled(box_min, box_max, icon_bg_color);
10612 ImU32 type_col = icon_type_overlay_colors[item_data->
Type % IM_ARRAYSIZE(icon_type_overlay_colors)];
10613 draw_list->AddRectFilled(ImVec2(box_max.x - 2 - icon_type_overlay_size.x, box_min.y + 2), ImVec2(box_max.x - 2, box_min.y + 2 + icon_type_overlay_size.y), type_col);
10617 ImU32 label_col = ImGui::GetColorU32(item_is_selected ? ImGuiCol_Text : ImGuiCol_TextDisabled);
10619 sprintf(label,
"%d", item_data->
ID);
10620 draw_list->AddText(ImVec2(box_min.x, box_max.y - ImGui::GetFontSize()), label_col, label);
10629 ImGui::PopStyleVar();
10632 if (ImGui::BeginPopupContextWindow())
10634 ImGui::Text(
"Selection: %d items",
Selection.Size);
10635 ImGui::Separator();
10636 if (ImGui::MenuItem(
"Delete",
"Del",
false,
Selection.Size > 0))
10641 ms_io = ImGui::EndMultiSelect();
10647 if (ImGui::IsWindowAppearing())
10649 if (ImGui::IsWindowHovered() && io.MouseWheel != 0.0f && ImGui::IsKeyDown(ImGuiMod_Ctrl) && ImGui::IsAnyItemActive() ==
false)
10658 const int hovered_item_idx = ((int)hovered_item_ny *
LayoutColumnCount) + (int)hovered_item_nx;
10671 hovered_item_rel_pos_y += ImGui::GetStyle().WindowPadding.y;
10672 float mouse_local_y = io.MousePos.y - ImGui::GetWindowPos().y;
10673 ImGui::SetScrollY(hovered_item_rel_pos_y - mouse_local_y);
10679 ImGui::Text(
"Selected: %d/%d items",
Selection.Size,
Items.Size);
10684void ShowExampleAppAssetsBrowser(
bool* p_open)
10688 assets_browser.
Draw(
"Example: Assets Browser", p_open);
10694void ImGui::ShowAboutWindow(
bool*) {}
10695void ImGui::ShowDemoWindow(
bool*) {}
10696void ImGui::ShowUserGuide() {}
10697void ImGui::ShowStyleEditor(ImGuiStyle*) {}
10698bool ImGui::ShowStyleSelector(
const char* label) {
return false; }
10699void ImGui::ShowFontSelector(
const char* label) {}
imat3 i3(ivec3(1, 2, 3), ivec3(4, 5, 6), ivec3(7, 8, 9))
#define IM_CLAMP(V, MN, MX)
void * GImGuiDemoMarkerCallbackUserData
ImGuiDemoMarkerCallback GImGuiDemoMarkerCallback
void(* ImGuiDemoMarkerCallback)(const char *file, int line, const char *section, void *user_data)
#define IMGUI_DEMO_MARKER(section)
IMGUI_API void ShowFontAtlas(ImFontAtlas *atlas)
auto CalcTextSize(std::string_view str)
void TextUnformatted(const std::string &str)
constexpr double log(double x)
void ID(const char *str_id, std::invocable<> auto next)
void Tooltip(std::invocable<> auto next)
uint16_t word
16 bit unsigned integer
size_t size(std::string_view utf8)
auto filter(ForwardRange &&range, Predicate pred)
constexpr auto values(Map &&map)
void Draw(const char *title, bool *p_open)
int TextEditCallback(ImGuiInputTextCallbackData *data)
ImVector< char * > History
ImVector< const char * > Commands
static int TextEditCallbackStub(ImGuiInputTextCallbackData *data)
static void Strtrim(char *s)
static int Stricmp(const char *s1, const char *s2)
void AddLog(const char *fmt,...) IM_FMTARGS(2)
static int Strnicmp(const char *s1, const char *s2, int n)
void ExecCommand(const char *command_line)
static char * Strdup(const char *s)
void NotifyOfDocumentsClosedElsewhere()
void DisplayDocContents(MyDocument *doc)
void DisplayDocContextMenu(MyDocument *doc)
ImVector< MyDocument > Documents
void GetTabName(MyDocument *doc, char *out_buf, size_t out_buf_size)
ImVector< MyDocument * > CloseQueue
void Draw(const char *title, bool *p_open=NULL)
ImVector< int > LineOffsets
void AddLog(const char *fmt,...) IM_FMTARGS(2)
ExampleTreeNode * VisibleNode
void DrawTreeNode(ExampleTreeNode *node)
void Draw(ExampleTreeNode *root_node)
ExampleAsset(ImGuiID id, int type)
static void SortWithSortSpecs(ImGuiTableSortSpecs *sort_specs, ExampleAsset *items, int items_count)
static int IMGUI_CDECL CompareWithSortSpecs(const void *lhs, const void *rhs)
static const ImGuiTableSortSpecs * s_current_sort_specs
float LayoutSelectableSpacing
void Draw(const char *title, bool *p_open)
void UpdateLayoutSizes(float avail_width)
ImVector< ExampleAsset > Items
ExampleSelectionWithDeletion Selection
ImVector< ImGuiID > Items[2]
static int IMGUI_CDECL CompareItemsByValue(const void *lhs, const void *rhs)
void MoveSelected(int src, int dst)
void ApplySelectionRequests(ImGuiMultiSelectIO *ms_io, int side)
void MoveAll(int src, int dst)
ImGuiSelectionBasicStorage Selections[2]
int ApplyDeletionPreLoop(ImGuiMultiSelectIO *ms_io, int items_count)
void ApplyDeletionPostLoop(ImGuiMultiSelectIO *ms_io, ImVector< ITEM_TYPE > &items, int item_curr_idx_to_select)
unsigned short IndexInParent
ImVector< ExampleTreeNode * > Childs
bool ShowAppConstrainedResize
bool ShowAppCustomRendering
bool ShowAppAssetsBrowser
ExampleTreeNode * DemoTree
bool ShowAppPropertyEditor
bool ShowAppSimpleOverlay
MyDocument(int uid, const char *name, bool open=true, const ImVec4 &color=ImVec4(1.0f, 1.0f, 1.0f, 1.0f))
constexpr auto begin(const zstring_view &x)
constexpr auto end(const zstring_view &x)