|
@@ -193,7 +193,7 @@ static void ShowExampleMenuFile();
|
|
|
static void HelpMarker(const char* desc)
|
|
|
{
|
|
|
ImGui::TextDisabled("(?)");
|
|
|
- if (ImGui::IsItemHovered())
|
|
|
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort))
|
|
|
{
|
|
|
ImGui::BeginTooltip();
|
|
|
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
|
|
@@ -691,22 +691,6 @@ static void ShowDemoWindowWidgets()
|
|
|
ImGui::SameLine();
|
|
|
ImGui::Text("%d", counter);
|
|
|
|
|
|
- IMGUI_DEMO_MARKER("Widgets/Basic/Tooltips");
|
|
|
- ImGui::Text("Hover over me");
|
|
|
- if (ImGui::IsItemHovered())
|
|
|
- ImGui::SetTooltip("I am a tooltip");
|
|
|
-
|
|
|
- ImGui::SameLine();
|
|
|
- ImGui::Text("- or me");
|
|
|
- if (ImGui::IsItemHovered())
|
|
|
- {
|
|
|
- ImGui::BeginTooltip();
|
|
|
- ImGui::Text("I am a fancy tooltip");
|
|
|
- static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
|
|
|
- ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr));
|
|
|
- ImGui::EndTooltip();
|
|
|
- }
|
|
|
-
|
|
|
ImGui::Separator();
|
|
|
ImGui::LabelText("label", "Value");
|
|
|
|
|
@@ -830,6 +814,40 @@ static void ShowDemoWindowWidgets()
|
|
|
"Using the simplified one-liner ListBox API here.\nRefer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API.");
|
|
|
}
|
|
|
|
|
|
+ {
|
|
|
+ // Tooltips
|
|
|
+ IMGUI_DEMO_MARKER("Widgets/Basic/Tooltips");
|
|
|
+ ImGui::AlignTextToFramePadding();
|
|
|
+ ImGui::Text("Tooltips:");
|
|
|
+
|
|
|
+ ImGui::SameLine();
|
|
|
+ ImGui::Button("Button");
|
|
|
+ if (ImGui::IsItemHovered())
|
|
|
+ ImGui::SetTooltip("I am a tooltip");
|
|
|
+
|
|
|
+ ImGui::SameLine();
|
|
|
+ ImGui::Button("Fancy");
|
|
|
+ if (ImGui::IsItemHovered())
|
|
|
+ {
|
|
|
+ ImGui::BeginTooltip();
|
|
|
+ ImGui::Text("I am a fancy tooltip");
|
|
|
+ static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
|
|
|
+ ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr));
|
|
|
+ ImGui::Text("Sin(time) = %f", sinf((float)ImGui::GetTime()));
|
|
|
+ ImGui::EndTooltip();
|
|
|
+ }
|
|
|
+
|
|
|
+ ImGui::SameLine();
|
|
|
+ ImGui::Button("Delayed");
|
|
|
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal)) // Delay best used on items that highlight on hover, so this not a great example!
|
|
|
+ ImGui::SetTooltip("I am a tooltip with a delay.");
|
|
|
+
|
|
|
+ ImGui::SameLine();
|
|
|
+ HelpMarker(
|
|
|
+ "Tooltip are created by using the IsItemHovered() function over any kind of item.");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
ImGui::TreePop();
|
|
|
}
|
|
|
|
|
@@ -2404,6 +2422,10 @@ static void ShowDemoWindowWidgets()
|
|
|
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)); }
|
|
|
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)); }
|
|
|
|
|
|
+ bool hovered_delay_none = ImGui::IsItemHovered();
|
|
|
+ bool hovered_delay_short = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort);
|
|
|
+ bool hovered_delay_normal = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal);
|
|
|
+
|
|
|
// Display the values of IsItemHovered() and other common item state functions.
|
|
|
// Note that the ImGuiHoveredFlags_XXX flags can be combined.
|
|
|
// Because BulletText is an item itself and that would affect the output of IsItemXXX functions,
|
|
@@ -2448,6 +2470,8 @@ static void ShowDemoWindowWidgets()
|
|
|
ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y,
|
|
|
ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y
|
|
|
);
|
|
|
+ ImGui::BulletText(
|
|
|
+ "w/ Hovering Delay: None = %d, Fast %d, Normal = %d", hovered_delay_none, hovered_delay_short, hovered_delay_normal);
|
|
|
|
|
|
if (item_disabled)
|
|
|
ImGui::EndDisabled();
|
|
@@ -7359,53 +7383,84 @@ static void ShowExampleAppAutoResize(bool* p_open)
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
// Demonstrate creating a window with custom resize constraints.
|
|
|
+// Note that size constraints currently don't work on a docked window (when in 'docking' branch)
|
|
|
static void ShowExampleAppConstrainedResize(bool* p_open)
|
|
|
{
|
|
|
struct CustomConstraints
|
|
|
{
|
|
|
// Helper functions to demonstrate programmatic constraints
|
|
|
- static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->DesiredSize.x, data->DesiredSize.y); }
|
|
|
- static void Step(ImGuiSizeCallbackData* data) { float step = (float)(int)(intptr_t)data->UserData; data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); }
|
|
|
+ // FIXME: This doesn't take account of decoration size (e.g. title bar), library should make this easier.
|
|
|
+ static void AspectRatio(ImGuiSizeCallbackData* data) { float aspect_ratio = *(float*)data->UserData; data->DesiredSize.x = IM_MAX(data->CurrentSize.x, data->CurrentSize.y); data->DesiredSize.y = (float)(int)(data->DesiredSize.x / aspect_ratio); }
|
|
|
+ static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->CurrentSize.x, data->CurrentSize.y); }
|
|
|
+ static void Step(ImGuiSizeCallbackData* data) { float step = *(float*)data->UserData; data->DesiredSize = ImVec2((int)(data->CurrentSize.x / step + 0.5f) * step, (int)(data->CurrentSize.y / step + 0.5f) * step); }
|
|
|
};
|
|
|
|
|
|
const char* test_desc[] =
|
|
|
{
|
|
|
+ "Between 100x100 and 500x500",
|
|
|
+ "At least 100x100",
|
|
|
"Resize vertical only",
|
|
|
"Resize horizontal only",
|
|
|
- "Width > 100, Height > 100",
|
|
|
- "Width 400-500",
|
|
|
- "Height 400-500",
|
|
|
+ "Width Between 400 and 500",
|
|
|
+ "Custom: Aspect Ratio 16:9",
|
|
|
"Custom: Always Square",
|
|
|
"Custom: Fixed Steps (100)",
|
|
|
};
|
|
|
|
|
|
+ // Options
|
|
|
static bool auto_resize = false;
|
|
|
- static int type = 0;
|
|
|
+ static bool window_padding = true;
|
|
|
+ static int type = 5; // Aspect Ratio
|
|
|
static int display_lines = 10;
|
|
|
- if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only
|
|
|
- if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only
|
|
|
- if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100
|
|
|
- if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width 400-500
|
|
|
- if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, 500)); // Height 400-500
|
|
|
- if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square
|
|
|
- if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)(intptr_t)100); // Fixed Step
|
|
|
|
|
|
- ImGuiWindowFlags flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0;
|
|
|
- if (ImGui::Begin("Example: Constrained Resize", p_open, flags))
|
|
|
+ // Submit constraint
|
|
|
+ float aspect_ratio = 16.0f / 9.0f;
|
|
|
+ float fixed_step = 100.0f;
|
|
|
+ if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(500, 500)); // Between 100x100 and 500x500
|
|
|
+ if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100
|
|
|
+ if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only
|
|
|
+ if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only
|
|
|
+ if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width Between and 400 and 500
|
|
|
+ if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (void*)&aspect_ratio); // Aspect ratio
|
|
|
+ if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square
|
|
|
+ if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)&fixed_step); // Fixed Step
|
|
|
+
|
|
|
+ // Submit window
|
|
|
+ if (!window_padding)
|
|
|
+ ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
|
|
+ const ImGuiWindowFlags window_flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0;
|
|
|
+ const bool window_open = ImGui::Begin("Example: Constrained Resize", p_open, window_flags);
|
|
|
+ if (!window_padding)
|
|
|
+ ImGui::PopStyleVar();
|
|
|
+ if (window_open)
|
|
|
{
|
|
|
IMGUI_DEMO_MARKER("Examples/Constrained Resizing window");
|
|
|
- if (ImGui::IsWindowDocked())
|
|
|
- ImGui::Text("Warning: Sizing Constraints won't work if the window is docked!");
|
|
|
- if (ImGui::Button("200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine();
|
|
|
- if (ImGui::Button("500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine();
|
|
|
- if (ImGui::Button("800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); }
|
|
|
- ImGui::SetNextItemWidth(200);
|
|
|
- ImGui::Combo("Constraint", &type, test_desc, IM_ARRAYSIZE(test_desc));
|
|
|
- ImGui::SetNextItemWidth(200);
|
|
|
- ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100);
|
|
|
- ImGui::Checkbox("Auto-resize", &auto_resize);
|
|
|
- for (int i = 0; i < display_lines; i++)
|
|
|
- ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, "");
|
|
|
+ if (ImGui::GetIO().KeyShift)
|
|
|
+ {
|
|
|
+ // Display a dummy viewport (in your real app you would likely use ImageButton() to display a texture.
|
|
|
+ ImVec2 avail_size = ImGui::GetContentRegionAvail();
|
|
|
+ ImVec2 pos = ImGui::GetCursorScreenPos();
|
|
|
+ ImGui::ColorButton("viewport", ImVec4(0.5f, 0.2f, 0.5f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, avail_size);
|
|
|
+ ImGui::SetCursorScreenPos(ImVec2(pos.x + 10, pos.y + 10));
|
|
|
+ ImGui::Text("%.2f x %.2f", avail_size.x, avail_size.y);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ImGui::Text("(Hold SHIFT to display a dummy viewport)");
|
|
|
+ if (ImGui::IsWindowDocked())
|
|
|
+ ImGui::Text("Warning: Sizing Constraints won't work if the window is docked!");
|
|
|
+ if (ImGui::Button("Set 200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine();
|
|
|
+ if (ImGui::Button("Set 500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine();
|
|
|
+ if (ImGui::Button("Set 800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); }
|
|
|
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 20);
|
|
|
+ ImGui::Combo("Constraint", &type, test_desc, IM_ARRAYSIZE(test_desc));
|
|
|
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 20);
|
|
|
+ ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100);
|
|
|
+ ImGui::Checkbox("Auto-resize", &auto_resize);
|
|
|
+ ImGui::Checkbox("Window padding", &window_padding);
|
|
|
+ for (int i = 0; i < display_lines; i++)
|
|
|
+ ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, "");
|
|
|
+ }
|
|
|
}
|
|
|
ImGui::End();
|
|
|
}
|
|
@@ -7418,29 +7473,35 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
|
|
|
// + a context-menu to choose which corner of the screen to use.
|
|
|
static void ShowExampleAppSimpleOverlay(bool* p_open)
|
|
|
{
|
|
|
- static int corner = 0;
|
|
|
+ static int location = 0;
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav;
|
|
|
- if (corner != -1)
|
|
|
+ if (location >= 0)
|
|
|
{
|
|
|
const float PAD = 10.0f;
|
|
|
const ImGuiViewport* viewport = ImGui::GetMainViewport();
|
|
|
ImVec2 work_pos = viewport->WorkPos; // Use work area to avoid menu-bar/task-bar, if any!
|
|
|
ImVec2 work_size = viewport->WorkSize;
|
|
|
ImVec2 window_pos, window_pos_pivot;
|
|
|
- window_pos.x = (corner & 1) ? (work_pos.x + work_size.x - PAD) : (work_pos.x + PAD);
|
|
|
- window_pos.y = (corner & 2) ? (work_pos.y + work_size.y - PAD) : (work_pos.y + PAD);
|
|
|
- window_pos_pivot.x = (corner & 1) ? 1.0f : 0.0f;
|
|
|
- window_pos_pivot.y = (corner & 2) ? 1.0f : 0.0f;
|
|
|
+ window_pos.x = (location & 1) ? (work_pos.x + work_size.x - PAD) : (work_pos.x + PAD);
|
|
|
+ window_pos.y = (location & 2) ? (work_pos.y + work_size.y - PAD) : (work_pos.y + PAD);
|
|
|
+ window_pos_pivot.x = (location & 1) ? 1.0f : 0.0f;
|
|
|
+ window_pos_pivot.y = (location & 2) ? 1.0f : 0.0f;
|
|
|
ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot);
|
|
|
ImGui::SetNextWindowViewport(viewport->ID);
|
|
|
window_flags |= ImGuiWindowFlags_NoMove;
|
|
|
}
|
|
|
+ else if (location == -2)
|
|
|
+ {
|
|
|
+ // Center window
|
|
|
+ ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
|
|
|
+ window_flags |= ImGuiWindowFlags_NoMove;
|
|
|
+ }
|
|
|
ImGui::SetNextWindowBgAlpha(0.35f); // Transparent background
|
|
|
if (ImGui::Begin("Example: Simple overlay", p_open, window_flags))
|
|
|
{
|
|
|
IMGUI_DEMO_MARKER("Examples/Simple Overlay");
|
|
|
- ImGui::Text("Simple overlay\n" "in the corner of the screen.\n" "(right-click to change position)");
|
|
|
+ ImGui::Text("Simple overlay\n" "(right-click to change position)");
|
|
|
ImGui::Separator();
|
|
|
if (ImGui::IsMousePosValid())
|
|
|
ImGui::Text("Mouse Position: (%.1f,%.1f)", io.MousePos.x, io.MousePos.y);
|
|
@@ -7448,11 +7509,12 @@ static void ShowExampleAppSimpleOverlay(bool* p_open)
|
|
|
ImGui::Text("Mouse Position: <invalid>");
|
|
|
if (ImGui::BeginPopupContextWindow())
|
|
|
{
|
|
|
- if (ImGui::MenuItem("Custom", NULL, corner == -1)) corner = -1;
|
|
|
- if (ImGui::MenuItem("Top-left", NULL, corner == 0)) corner = 0;
|
|
|
- if (ImGui::MenuItem("Top-right", NULL, corner == 1)) corner = 1;
|
|
|
- if (ImGui::MenuItem("Bottom-left", NULL, corner == 2)) corner = 2;
|
|
|
- if (ImGui::MenuItem("Bottom-right", NULL, corner == 3)) corner = 3;
|
|
|
+ if (ImGui::MenuItem("Custom", NULL, location == -1)) location = -1;
|
|
|
+ if (ImGui::MenuItem("Center", NULL, location == -2)) location = -2;
|
|
|
+ if (ImGui::MenuItem("Top-left", NULL, location == 0)) location = 0;
|
|
|
+ if (ImGui::MenuItem("Top-right", NULL, location == 1)) location = 1;
|
|
|
+ if (ImGui::MenuItem("Bottom-left", NULL, location == 2)) location = 2;
|
|
|
+ if (ImGui::MenuItem("Bottom-right", NULL, location == 3)) location = 3;
|
|
|
if (p_open && ImGui::MenuItem("Close")) *p_open = false;
|
|
|
ImGui::EndPopup();
|
|
|
}
|