mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-28 09:30:56 +01:00
Added ImGuiWindowFlags_NoScrollWithMouse flag.
ButtonBehaviour test hovering of CurrentRootWindow (vs CurrentWindow, different for child-windows). This is intentionally meant to fix grabbing the lower-right resize grip when lower-right corner has a child-window, but may be the overall right-er test. Testing out.
This commit is contained in:
parent
e0dc8ac910
commit
860cf578f5
35
imgui.cpp
35
imgui.cpp
@ -1,4 +1,4 @@
|
||||
// ImGui library v1.17 wip
|
||||
// ImGui library v1.18 wip
|
||||
// See ImGui::ShowTestWindow() for sample code.
|
||||
// Read 'Programmer guide' below for notes on how to setup ImGui in your codebase.
|
||||
// Get latest version at https://github.com/ocornut/imgui
|
||||
@ -757,7 +757,7 @@ struct ImGuiState
|
||||
ImVector<ImGuiWindow*> CurrentWindowStack;
|
||||
ImGuiWindow* FocusedWindow; // Will catch keyboard inputs
|
||||
ImGuiWindow* HoveredWindow; // Will catch mouse inputs
|
||||
ImGuiWindow* HoveredWindowExcludingChilds; // Will catch mouse inputs (for focus/move only)
|
||||
ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only)
|
||||
ImGuiID HoveredId;
|
||||
ImGuiID ActiveId;
|
||||
ImGuiID ActiveIdPreviousFrame;
|
||||
@ -794,7 +794,7 @@ struct ImGuiState
|
||||
CurrentWindow = NULL;
|
||||
FocusedWindow = NULL;
|
||||
HoveredWindow = NULL;
|
||||
HoveredWindowExcludingChilds = NULL;
|
||||
HoveredRootWindow = NULL;
|
||||
ActiveIdIsAlive = false;
|
||||
SettingsDirtyTimer = 0.0f;
|
||||
NewWindowDefaultPos = ImVec2(60, 60);
|
||||
@ -837,8 +837,9 @@ struct ImGuiWindow
|
||||
int LastFrameDrawn;
|
||||
float ItemWidthDefault;
|
||||
ImGuiStorage StateStorage;
|
||||
float FontWindowScale; // Scale multipler per-window
|
||||
float FontWindowScale; // Scale multiplier per-window
|
||||
ImDrawList* DrawList;
|
||||
ImGuiWindow* RootWindow;
|
||||
|
||||
// Focus
|
||||
int FocusIdxAllCounter; // Start at -1 and increase as assigned via FocusItemRegister()
|
||||
@ -1445,7 +1446,7 @@ void ImGui::NewFrame()
|
||||
}
|
||||
|
||||
g.HoveredWindow = FindHoveredWindow(g.IO.MousePos, false);
|
||||
g.HoveredWindowExcludingChilds = FindHoveredWindow(g.IO.MousePos, true);
|
||||
g.HoveredRootWindow = FindHoveredWindow(g.IO.MousePos, true);
|
||||
|
||||
// Are we using inputs? Tell user so they can capture/discard them.
|
||||
g.IO.WantCaptureMouse = (g.HoveredWindow != NULL) || (g.ActiveId != 0);
|
||||
@ -1474,10 +1475,13 @@ void ImGui::NewFrame()
|
||||
else
|
||||
{
|
||||
// Scroll
|
||||
if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse))
|
||||
{
|
||||
const int scroll_lines = (window->Flags & ImGuiWindowFlags_ComboBox) ? 3 : 5;
|
||||
window->NextScrollY -= g.IO.MouseWheel * window->FontSize() * scroll_lines;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Pressing TAB activate widget focus
|
||||
// NB: Don't discard FocusedWindow if it isn't active, so that a window that go on/off programatically won't lose its keyboard focus.
|
||||
@ -1521,7 +1525,7 @@ void ImGui::Shutdown()
|
||||
g.RenderDrawLists.clear();
|
||||
g.FocusedWindow = NULL;
|
||||
g.HoveredWindow = NULL;
|
||||
g.HoveredWindowExcludingChilds = NULL;
|
||||
g.HoveredRootWindow = NULL;
|
||||
for (size_t i = 0; i < g.Settings.size(); i++)
|
||||
{
|
||||
g.Settings[i]->~ImGuiIniData();
|
||||
@ -2128,6 +2132,16 @@ bool ImGui::Begin(const char* name, bool* open, ImVec2 size, float fill_alpha, I
|
||||
g.CurrentWindowStack.push_back(window);
|
||||
g.CurrentWindow = window;
|
||||
|
||||
// Find root
|
||||
size_t root_idx = g.CurrentWindowStack.size() - 1;
|
||||
while (root_idx > 0)
|
||||
{
|
||||
if ((g.CurrentWindowStack[root_idx]->Flags & ImGuiWindowFlags_ChildWindow) == 0)
|
||||
break;
|
||||
root_idx--;
|
||||
}
|
||||
window->RootWindow = g.CurrentWindowStack[root_idx];
|
||||
|
||||
// Default alpha
|
||||
if (fill_alpha < 0.0f)
|
||||
fill_alpha = style.WindowFillAlphaDefault;
|
||||
@ -2282,7 +2296,7 @@ bool ImGui::Begin(const char* name, bool* open, ImVec2 size, float fill_alpha, I
|
||||
const ImVec2 size_auto_fit = ImClamp(window->SizeContentsFit + style.AutoFitPadding, style.WindowMinSize, g.IO.DisplaySize - style.AutoFitPadding);
|
||||
if ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)
|
||||
{
|
||||
// Don't continously mark settings as dirty, the size of the window doesn't need to be stored.
|
||||
// Don't continuously mark settings as dirty, the size of the window doesn't need to be stored.
|
||||
window->SizeFull = size_auto_fit;
|
||||
}
|
||||
else if (window->AutoFitFrames > 0)
|
||||
@ -2298,7 +2312,7 @@ bool ImGui::Begin(const char* name, bool* open, ImVec2 size, float fill_alpha, I
|
||||
{
|
||||
// Resize grip
|
||||
const ImGuiAabb resize_aabb(window->Aabb().GetBR()-ImVec2(18,18), window->Aabb().GetBR());
|
||||
const ImGuiID resize_id = window->GetID("#RESIZE");
|
||||
const ImGuiID resize_id = window->GetID("##RESIZE");
|
||||
bool hovered, held;
|
||||
ButtonBehaviour(resize_aabb, resize_id, &hovered, &held, true);
|
||||
resize_col = window->Color(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
|
||||
@ -2506,7 +2520,7 @@ void ImGui::End()
|
||||
|
||||
// Select window for move/focus when we're done with all our widgets (we only consider non-childs windows here)
|
||||
const ImGuiAabb bb(window->Pos, window->Pos+window->Size);
|
||||
if (g.ActiveId == 0 && g.HoveredId == 0 && g.HoveredWindowExcludingChilds == window && IsMouseHoveringBox(bb) && g.IO.MouseClicked[0])
|
||||
if (g.ActiveId == 0 && g.HoveredId == 0 && g.HoveredRootWindow == window && IsMouseHoveringBox(bb) && g.IO.MouseClicked[0])
|
||||
g.ActiveId = window->GetID("#MOVE");
|
||||
|
||||
// Stop logging
|
||||
@ -2532,6 +2546,7 @@ void ImGui::End()
|
||||
}
|
||||
|
||||
// Pop
|
||||
window->RootWindow = NULL;
|
||||
g.CurrentWindowStack.pop_back();
|
||||
g.CurrentWindow = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back();
|
||||
}
|
||||
@ -3113,7 +3128,7 @@ static bool ButtonBehaviour(const ImGuiAabb& bb, const ImGuiID& id, bool* out_ho
|
||||
ImGuiState& g = GImGui;
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
|
||||
const bool hovered = (g.HoveredWindow == window) && (g.HoveredId == 0) && IsMouseHoveringBox(bb);
|
||||
const bool hovered = (g.HoveredRootWindow == window->RootWindow) && (g.HoveredId == 0) && IsMouseHoveringBox(bb);
|
||||
bool pressed = false;
|
||||
if (hovered)
|
||||
{
|
||||
|
15
imgui.h
15
imgui.h
@ -1,4 +1,4 @@
|
||||
// ImGui library v1.17 wip
|
||||
// ImGui library v1.18 wip
|
||||
// See .cpp file for commentary.
|
||||
// See ImGui::ShowTestWindow() for sample code.
|
||||
// Read 'Programmer guide' in .cpp for notes on how to setup ImGui in your codebase.
|
||||
@ -308,12 +308,13 @@ enum ImGuiWindowFlags_
|
||||
ImGuiWindowFlags_NoResize = 1 << 2,
|
||||
ImGuiWindowFlags_NoMove = 1 << 3,
|
||||
ImGuiWindowFlags_NoScrollbar = 1 << 4,
|
||||
ImGuiWindowFlags_AlwaysAutoResize = 1 << 5,
|
||||
ImGuiWindowFlags_ChildWindow = 1 << 6, // For internal use by BeginChild()
|
||||
ImGuiWindowFlags_ChildWindowAutoFitX = 1 << 7, // For internal use by BeginChild()
|
||||
ImGuiWindowFlags_ChildWindowAutoFitY = 1 << 8, // For internal use by BeginChild()
|
||||
ImGuiWindowFlags_ComboBox = 1 << 9, // For internal use by ComboBox()
|
||||
ImGuiWindowFlags_Tooltip = 1 << 10 // For internal use by Render() when using Tooltip
|
||||
ImGuiWindowFlags_NoScrollWithMouse = 1 << 5,
|
||||
ImGuiWindowFlags_AlwaysAutoResize = 1 << 6,
|
||||
ImGuiWindowFlags_ChildWindow = 1 << 7, // For internal use by BeginChild()
|
||||
ImGuiWindowFlags_ChildWindowAutoFitX = 1 << 8, // For internal use by BeginChild()
|
||||
ImGuiWindowFlags_ChildWindowAutoFitY = 1 << 9, // For internal use by BeginChild()
|
||||
ImGuiWindowFlags_ComboBox = 1 << 10, // For internal use by ComboBox()
|
||||
ImGuiWindowFlags_Tooltip = 1 << 11 // For internal use by Render() when using Tooltip
|
||||
};
|
||||
|
||||
// Flags for ImGui::InputText()
|
||||
|
Loading…
Reference in New Issue
Block a user