|
@@ -5116,18 +5116,23 @@ static void ShowDemoWindowTables()
|
|
if (ImGui::TreeNode("Synced instances"))
|
|
if (ImGui::TreeNode("Synced instances"))
|
|
{
|
|
{
|
|
HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc.");
|
|
HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc.");
|
|
|
|
+
|
|
|
|
+ static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings;
|
|
|
|
+ ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
|
|
|
|
+ ImGui::CheckboxFlags("ImGuiTableFlags_SizingFixedFit", &flags, ImGuiTableFlags_SizingFixedFit);
|
|
for (int n = 0; n < 3; n++)
|
|
for (int n = 0; n < 3; n++)
|
|
{
|
|
{
|
|
char buf[32];
|
|
char buf[32];
|
|
sprintf(buf, "Synced Table %d", n);
|
|
sprintf(buf, "Synced Table %d", n);
|
|
bool open = ImGui::CollapsingHeader(buf, ImGuiTreeNodeFlags_DefaultOpen);
|
|
bool open = ImGui::CollapsingHeader(buf, ImGuiTreeNodeFlags_DefaultOpen);
|
|
- if (open && ImGui::BeginTable("Table", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings))
|
|
|
|
|
|
+ if (open && ImGui::BeginTable("Table", 3, flags, ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 5)))
|
|
{
|
|
{
|
|
ImGui::TableSetupColumn("One");
|
|
ImGui::TableSetupColumn("One");
|
|
ImGui::TableSetupColumn("Two");
|
|
ImGui::TableSetupColumn("Two");
|
|
ImGui::TableSetupColumn("Three");
|
|
ImGui::TableSetupColumn("Three");
|
|
ImGui::TableHeadersRow();
|
|
ImGui::TableHeadersRow();
|
|
- for (int cell = 0; cell < 9; cell++)
|
|
|
|
|
|
+ const int cell_count = (n == 1) ? 27 : 9; // Make second table have a scrollbar to verify that additional decoration is not affecting column positions.
|
|
|
|
+ for (int cell = 0; cell < cell_count; cell++)
|
|
{
|
|
{
|
|
ImGui::TableNextColumn();
|
|
ImGui::TableNextColumn();
|
|
ImGui::Text("this cell %d", cell);
|
|
ImGui::Text("this cell %d", cell);
|
|
@@ -5800,18 +5805,6 @@ static void ShowDemoWindowInputs()
|
|
IMGUI_DEMO_MARKER("Inputs & Focus/Outputs");
|
|
IMGUI_DEMO_MARKER("Inputs & Focus/Outputs");
|
|
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
|
|
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
|
|
if (ImGui::TreeNode("Outputs"))
|
|
if (ImGui::TreeNode("Outputs"))
|
|
- {
|
|
|
|
- ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse);
|
|
|
|
- ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose);
|
|
|
|
- ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard);
|
|
|
|
- ImGui::Text("io.WantTextInput: %d", io.WantTextInput);
|
|
|
|
- ImGui::Text("io.WantSetMousePos: %d", io.WantSetMousePos);
|
|
|
|
- ImGui::Text("io.NavActive: %d, io.NavVisible: %d", io.NavActive, io.NavVisible);
|
|
|
|
- ImGui::TreePop();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- IMGUI_DEMO_MARKER("Inputs & Focus/IO Output: Capture override");
|
|
|
|
- if (ImGui::TreeNode("IO Output: Capture override"))
|
|
|
|
{
|
|
{
|
|
HelpMarker(
|
|
HelpMarker(
|
|
"The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui "
|
|
"The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui "
|
|
@@ -5820,27 +5813,104 @@ static void ShowDemoWindowInputs()
|
|
"The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, "
|
|
"The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, "
|
|
"and underlying application should ignore mouse inputs (in practice there are many and more subtle "
|
|
"and underlying application should ignore mouse inputs (in practice there are many and more subtle "
|
|
"rules leading to how those flags are set).");
|
|
"rules leading to how those flags are set).");
|
|
-
|
|
|
|
ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse);
|
|
ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse);
|
|
ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose);
|
|
ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose);
|
|
ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard);
|
|
ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard);
|
|
|
|
+ ImGui::Text("io.WantTextInput: %d", io.WantTextInput);
|
|
|
|
+ ImGui::Text("io.WantSetMousePos: %d", io.WantSetMousePos);
|
|
|
|
+ ImGui::Text("io.NavActive: %d, io.NavVisible: %d", io.NavActive, io.NavVisible);
|
|
|
|
|
|
- HelpMarker(
|
|
|
|
- "Hovering the colored canvas will override io.WantCaptureXXX fields.\n"
|
|
|
|
- "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering and true when clicking.");
|
|
|
|
- static int capture_override_mouse = -1;
|
|
|
|
- static int capture_override_keyboard = -1;
|
|
|
|
- const char* capture_override_desc[] = { "None", "Set to false", "Set to true" };
|
|
|
|
- ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
|
|
|
|
- ImGui::SliderInt("SetNextFrameWantCaptureMouse()", &capture_override_mouse, -1, +1, capture_override_desc[capture_override_mouse + 1], ImGuiSliderFlags_AlwaysClamp);
|
|
|
|
- ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
|
|
|
|
- ImGui::SliderInt("SetNextFrameWantCaptureKeyboard()", &capture_override_keyboard, -1, +1, capture_override_desc[capture_override_keyboard + 1], ImGuiSliderFlags_AlwaysClamp);
|
|
|
|
-
|
|
|
|
- ImGui::ColorButton("##panel", ImVec4(0.7f, 0.1f, 0.7f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, ImVec2(256.0f, 192.0f)); // Dummy item
|
|
|
|
- if (ImGui::IsItemHovered() && capture_override_mouse != -1)
|
|
|
|
- ImGui::SetNextFrameWantCaptureMouse(capture_override_mouse == 1);
|
|
|
|
- if (ImGui::IsItemHovered() && capture_override_keyboard != -1)
|
|
|
|
- ImGui::SetNextFrameWantCaptureKeyboard(capture_override_keyboard == 1);
|
|
|
|
|
|
+ IMGUI_DEMO_MARKER("Inputs & Focus/Outputs/WantCapture override");
|
|
|
|
+ if (ImGui::TreeNode("WantCapture override"))
|
|
|
|
+ {
|
|
|
|
+ HelpMarker(
|
|
|
|
+ "Hovering the colored canvas will override io.WantCaptureXXX fields.\n"
|
|
|
|
+ "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering and true when clicking.");
|
|
|
|
+ static int capture_override_mouse = -1;
|
|
|
|
+ static int capture_override_keyboard = -1;
|
|
|
|
+ const char* capture_override_desc[] = { "None", "Set to false", "Set to true" };
|
|
|
|
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
|
|
|
|
+ ImGui::SliderInt("SetNextFrameWantCaptureMouse() on hover", &capture_override_mouse, -1, +1, capture_override_desc[capture_override_mouse + 1], ImGuiSliderFlags_AlwaysClamp);
|
|
|
|
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
|
|
|
|
+ ImGui::SliderInt("SetNextFrameWantCaptureKeyboard() on hover", &capture_override_keyboard, -1, +1, capture_override_desc[capture_override_keyboard + 1], ImGuiSliderFlags_AlwaysClamp);
|
|
|
|
+
|
|
|
|
+ ImGui::ColorButton("##panel", ImVec4(0.7f, 0.1f, 0.7f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, ImVec2(128.0f, 96.0f)); // Dummy item
|
|
|
|
+ if (ImGui::IsItemHovered() && capture_override_mouse != -1)
|
|
|
|
+ ImGui::SetNextFrameWantCaptureMouse(capture_override_mouse == 1);
|
|
|
|
+ if (ImGui::IsItemHovered() && capture_override_keyboard != -1)
|
|
|
|
+ ImGui::SetNextFrameWantCaptureKeyboard(capture_override_keyboard == 1);
|
|
|
|
+
|
|
|
|
+ ImGui::TreePop();
|
|
|
|
+ }
|
|
|
|
+ ImGui::TreePop();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Demonstrate using Shortcut() and Routing Policies.
|
|
|
|
+ // The general flow is:
|
|
|
|
+ // - Code interested in a chord (e.g. "Ctrl+A") declares their intent.
|
|
|
|
+ // - Multiple locations may be interested in same chord! Routing helps find a winner.
|
|
|
|
+ // - Every frame, we resolve all claims and assign one owner if the modifiers are matching.
|
|
|
|
+ // - The lower-level function is 'bool SetShortcutRouting()', returns true when caller got the route.
|
|
|
|
+ // - Most of the times, SetShortcutRouting() is not called directly. User mostly calls Shortcut() with routing flags.
|
|
|
|
+ // - If you call Shortcut() WITHOUT any routing option, it uses ImGuiInputFlags_RouteFocused.
|
|
|
|
+ // TL;DR: Most uses will simply be:
|
|
|
|
+ // - Shortcut(ImGuiMod_Ctrl | ImGuiKey_A); // Use ImGuiInputFlags_RouteFocused policy.
|
|
|
|
+ if (ImGui::TreeNode("Shortcut Routing"))
|
|
|
|
+ {
|
|
|
|
+ const float line_height = ImGui::GetTextLineHeightWithSpacing();
|
|
|
|
+ const ImGuiKeyChord key_chord = ImGuiMod_Ctrl | ImGuiKey_A;
|
|
|
|
+ static ImGuiInputFlags repeat_flags = ImGuiInputFlags_Repeat;
|
|
|
|
+ static ImGuiInputFlags routing_flags = ImGuiInputFlags_RouteFocused;
|
|
|
|
+ ImGui::CheckboxFlags("ImGuiInputFlags_Repeat", &repeat_flags, ImGuiInputFlags_Repeat);
|
|
|
|
+ ImGui::RadioButton("ImGuiInputFlags_RouteFocused (default)", &routing_flags, ImGuiInputFlags_RouteFocused);
|
|
|
|
+ ImGui::RadioButton("ImGuiInputFlags_RouteAlways", &routing_flags, ImGuiInputFlags_RouteAlways);
|
|
|
|
+ ImGui::RadioButton("ImGuiInputFlags_RouteGlobal", &routing_flags, ImGuiInputFlags_RouteGlobal);
|
|
|
|
+ ImGui::RadioButton("ImGuiInputFlags_RouteGlobalHigh", &routing_flags, ImGuiInputFlags_RouteGlobalHigh);
|
|
|
|
+ ImGui::RadioButton("ImGuiInputFlags_RouteGlobalLow", &routing_flags, ImGuiInputFlags_RouteGlobalLow);
|
|
|
|
+ const ImGuiInputFlags flags = repeat_flags | routing_flags; // Merged flags
|
|
|
|
+
|
|
|
|
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, 0, flags) ? "PRESSED" : "...");
|
|
|
|
+
|
|
|
|
+ ImGui::BeginChild("WindowA", ImVec2(-FLT_MIN, line_height * 18), true);
|
|
|
|
+ ImGui::Text("Press CTRL+A and see who receives it!");
|
|
|
|
+ ImGui::Separator();
|
|
|
|
+
|
|
|
|
+ // 1: Window polling for CTRL+A
|
|
|
|
+ ImGui::Text("(in WindowA)");
|
|
|
|
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, 0, flags) ? "PRESSED" : "...");
|
|
|
|
+
|
|
|
|
+ // 2: InputText also polling for CTRL+A: it always uses _RouteFocused internally (gets priority when active)
|
|
|
|
+ char str[16] = "Press CTRL+A";
|
|
|
|
+ ImGui::Spacing();
|
|
|
|
+ ImGui::InputText("InputTextB", str, IM_ARRAYSIZE(str), ImGuiInputTextFlags_ReadOnly);
|
|
|
|
+ ImGuiID item_id = ImGui::GetItemID();
|
|
|
|
+ ImGui::SameLine(); HelpMarker("Internal widgets always use _RouteFocused");
|
|
|
|
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, item_id, flags) ? "PRESSED" : "...");
|
|
|
|
+
|
|
|
|
+ // 3: Dummy child is not claiming the route: focusing them shouldn't steal route away from WindowA
|
|
|
|
+ ImGui::BeginChild("ChildD", ImVec2(-FLT_MIN, line_height * 4), true);
|
|
|
|
+ ImGui::Text("(in ChildD: not using same Shortcut)");
|
|
|
|
+ ImGui::Text("IsWindowFocused: %d", ImGui::IsWindowFocused());
|
|
|
|
+ ImGui::EndChild();
|
|
|
|
+
|
|
|
|
+ // 4: Child window polling for CTRL+A. It is deeper than WindowA and gets priority when focused.
|
|
|
|
+ ImGui::BeginChild("ChildE", ImVec2(-FLT_MIN, line_height * 4), true);
|
|
|
|
+ ImGui::Text("(in ChildE: using same Shortcut)");
|
|
|
|
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, 0, flags) ? "PRESSED" : "...");
|
|
|
|
+ ImGui::EndChild();
|
|
|
|
+
|
|
|
|
+ // 5: In a popup
|
|
|
|
+ if (ImGui::Button("Open Popup"))
|
|
|
|
+ ImGui::OpenPopup("PopupF");
|
|
|
|
+ if (ImGui::BeginPopup("PopupF"))
|
|
|
|
+ {
|
|
|
|
+ ImGui::Text("(in PopupF)");
|
|
|
|
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, 0, flags) ? "PRESSED" : "...");
|
|
|
|
+ ImGui::InputText("InputTextG", str, IM_ARRAYSIZE(str), ImGuiInputTextFlags_ReadOnly);
|
|
|
|
+ ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, ImGui::GetItemID(), flags) ? "PRESSED" : "...");
|
|
|
|
+ ImGui::EndPopup();
|
|
|
|
+ }
|
|
|
|
+ ImGui::EndChild();
|
|
|
|
|
|
ImGui::TreePop();
|
|
ImGui::TreePop();
|
|
}
|
|
}
|
|
@@ -7123,12 +7193,15 @@ static void ShowExampleAppLayout(bool* p_open)
|
|
{
|
|
{
|
|
if (ImGui::BeginMenu("File"))
|
|
if (ImGui::BeginMenu("File"))
|
|
{
|
|
{
|
|
- if (ImGui::MenuItem("Close")) *p_open = false;
|
|
|
|
|
|
+ if (ImGui::MenuItem("Close", "Ctrl+W")) { *p_open = false; }
|
|
ImGui::EndMenu();
|
|
ImGui::EndMenu();
|
|
}
|
|
}
|
|
ImGui::EndMenuBar();
|
|
ImGui::EndMenuBar();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (ImGui::Shortcut(ImGuiMod_Ctrl | ImGuiKey_W))
|
|
|
|
+ *p_open = false;
|
|
|
|
+
|
|
// Left
|
|
// Left
|
|
static int selected = 0;
|
|
static int selected = 0;
|
|
{
|
|
{
|
|
@@ -7964,11 +8037,14 @@ struct MyDocument
|
|
ImGui::PushStyleColor(ImGuiCol_Text, doc->Color);
|
|
ImGui::PushStyleColor(ImGuiCol_Text, doc->Color);
|
|
ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
|
|
ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
|
|
ImGui::PopStyleColor();
|
|
ImGui::PopStyleColor();
|
|
- if (ImGui::Button("Modify", ImVec2(100, 0)))
|
|
|
|
|
|
+ if (ImGui::Button("Modify (Ctrl+M)") || ImGui::Shortcut(ImGuiMod_Shortcut | ImGuiKey_M))
|
|
doc->Dirty = true;
|
|
doc->Dirty = true;
|
|
ImGui::SameLine();
|
|
ImGui::SameLine();
|
|
- if (ImGui::Button("Save", ImVec2(100, 0)))
|
|
|
|
|
|
+ if (ImGui::Button("Save (Ctrl+S)") || ImGui::Shortcut(ImGuiMod_Shortcut | ImGuiKey_S))
|
|
doc->DoSave();
|
|
doc->DoSave();
|
|
|
|
+ ImGui::SameLine();
|
|
|
|
+ if (ImGui::Button("Close (Ctrl+W)") || ImGui::Shortcut(ImGuiMod_Shortcut | ImGuiKey_W))
|
|
|
|
+ doc->DoQueueClose();
|
|
ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior.
|
|
ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior.
|
|
ImGui::PopID();
|
|
ImGui::PopID();
|
|
}
|
|
}
|
|
@@ -7981,9 +8057,9 @@ struct MyDocument
|
|
|
|
|
|
char buf[256];
|
|
char buf[256];
|
|
sprintf(buf, "Save %s", doc->Name);
|
|
sprintf(buf, "Save %s", doc->Name);
|
|
- if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open))
|
|
|
|
|
|
+ if (ImGui::MenuItem(buf, "Ctrl+S", false, doc->Open))
|
|
doc->DoSave();
|
|
doc->DoSave();
|
|
- if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open))
|
|
|
|
|
|
+ if (ImGui::MenuItem("Close", "Ctrl+W", false, doc->Open))
|
|
doc->DoQueueClose();
|
|
doc->DoQueueClose();
|
|
ImGui::EndPopup();
|
|
ImGui::EndPopup();
|
|
}
|
|
}
|
|
@@ -8075,7 +8151,7 @@ void ShowExampleAppDocuments(bool* p_open)
|
|
if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0))
|
|
if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0))
|
|
for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
|
|
for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
|
|
app.Documents[doc_n].DoQueueClose();
|
|
app.Documents[doc_n].DoQueueClose();
|
|
- if (ImGui::MenuItem("Exit", "Ctrl+F4") && p_open)
|
|
|
|
|
|
+ if (ImGui::MenuItem("Exit") && p_open)
|
|
*p_open = false;
|
|
*p_open = false;
|
|
ImGui::EndMenu();
|
|
ImGui::EndMenu();
|
|
}
|
|
}
|