mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 09:27:00 +00:00
Viewport: Added ImGuiConfigFlags_ViewportsNoMerge flag (to enforce a platform window for all floating windows) + minor tidying up and addition of non-functional wip code.
This commit is contained in:
parent
423577e14e
commit
d268471285
@ -135,6 +135,7 @@ int main(int, char**)
|
|||||||
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
|
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
|
||||||
//io.ConfigFlags |= ImGuiConfigFlags_ViewportsNoTaskBarIcons;
|
//io.ConfigFlags |= ImGuiConfigFlags_ViewportsNoTaskBarIcons;
|
||||||
|
//io.ConfigFlags |= ImGuiConfigFlags_ViewportsNoMerge;
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_DpiEnableScaleFonts;
|
io.ConfigFlags |= ImGuiConfigFlags_DpiEnableScaleFonts;
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_DpiEnableScaleViewports;
|
io.ConfigFlags |= ImGuiConfigFlags_DpiEnableScaleViewports;
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
||||||
|
@ -518,6 +518,22 @@ static float ImGui_ImplWin32_GetWindowDpiScale(ImGuiViewport* viewport)
|
|||||||
(int)(viewport->Pos.x + viewport->Size.x), (int)(viewport->Pos.y + viewport->Size.y));
|
(int)(viewport->Pos.x + viewport->Size.x), (int)(viewport->Pos.y + viewport->Size.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME-DPI: Testing DPI related ideas
|
||||||
|
static void ImGui_ImplWin32_OnChangedViewport(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
(void)viewport;
|
||||||
|
#if 0
|
||||||
|
ImGuiStyle default_style;
|
||||||
|
//default_style.WindowPadding = ImVec2(0, 0);
|
||||||
|
//default_style.WindowBorderSize = 0.0f;
|
||||||
|
//default_style.ItemSpacing.y = 3.0f;
|
||||||
|
//default_style.FramePadding = ImVec2(0, 0);
|
||||||
|
default_style.ScaleAllSizes(viewport->DpiScale);
|
||||||
|
ImGuiStyle& style = ImGui::GetStyle();
|
||||||
|
style = default_style;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static LRESULT CALLBACK ImGui_ImplWin32_WndProcHandler_PlatformWindow(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
static LRESULT CALLBACK ImGui_ImplWin32_WndProcHandler_PlatformWindow(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
||||||
@ -604,6 +620,7 @@ static void ImGui_ImplWin32_InitPlatformInterface()
|
|||||||
platform_io.Platform_SetWindowTitle = ImGui_ImplWin32_SetWindowTitle;
|
platform_io.Platform_SetWindowTitle = ImGui_ImplWin32_SetWindowTitle;
|
||||||
platform_io.Platform_SetWindowAlpha = ImGui_ImplWin32_SetWindowAlpha;
|
platform_io.Platform_SetWindowAlpha = ImGui_ImplWin32_SetWindowAlpha;
|
||||||
platform_io.Platform_GetWindowDpiScale = ImGui_ImplWin32_GetWindowDpiScale;
|
platform_io.Platform_GetWindowDpiScale = ImGui_ImplWin32_GetWindowDpiScale;
|
||||||
|
platform_io.Platform_OnChangedViewport = ImGui_ImplWin32_OnChangedViewport; // FIXME-DPI
|
||||||
|
|
||||||
// Register main window handle (which is owned by the main application, not by us)
|
// Register main window handle (which is owned by the main application, not by us)
|
||||||
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
||||||
|
45
imgui.cpp
45
imgui.cpp
@ -752,7 +752,7 @@ static void NavUpdate();
|
|||||||
static void NavUpdateWindowing();
|
static void NavUpdateWindowing();
|
||||||
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id);
|
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id);
|
||||||
|
|
||||||
static void NewFrameUpdateMovingWindow();
|
static void UpdateMovingWindow();
|
||||||
static void UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]);
|
static void UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]);
|
||||||
static void FocusFrontMostActiveWindow(ImGuiWindow* ignore_window);
|
static void FocusFrontMostActiveWindow(ImGuiWindow* ignore_window);
|
||||||
|
|
||||||
@ -3305,6 +3305,16 @@ static void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport)
|
|||||||
window->ViewportOwned = (viewport->Window == window);
|
window->ViewportOwned = (viewport->Window == window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool GetWindowAlwaysWantOwnViewport(ImGuiWindow* window)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) && (g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsNoMerge))
|
||||||
|
//if (window->DockStatus == ImGuiDockStatus_Floating)
|
||||||
|
if ((window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_ChildMenu)) == 0)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void ImGui::UpdateTryMergeWindowIntoHostViewport(ImGuiWindow* window, ImGuiViewportP* viewport)
|
static void ImGui::UpdateTryMergeWindowIntoHostViewport(ImGuiWindow* window, ImGuiViewportP* viewport)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -3314,6 +3324,8 @@ static void ImGui::UpdateTryMergeWindowIntoHostViewport(ImGuiWindow* window, ImG
|
|||||||
return;
|
return;
|
||||||
if (!viewport->GetRect().Contains(window->Rect()))
|
if (!viewport->GetRect().Contains(window->Rect()))
|
||||||
return;
|
return;
|
||||||
|
if (GetWindowAlwaysWantOwnViewport(window))
|
||||||
|
return;
|
||||||
|
|
||||||
// Move to the existing viewport, Move child/hosted windows as well (FIXME-OPT: iterate child)
|
// Move to the existing viewport, Move child/hosted windows as well (FIXME-OPT: iterate child)
|
||||||
ImGuiViewportP* old_viewport = window->Viewport;
|
ImGuiViewportP* old_viewport = window->Viewport;
|
||||||
@ -3324,7 +3336,7 @@ static void ImGui::UpdateTryMergeWindowIntoHostViewport(ImGuiWindow* window, ImG
|
|||||||
SetWindowViewport(window, viewport);
|
SetWindowViewport(window, viewport);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui::NewFrameUpdateMovingWindow()
|
static void ImGui::UpdateMovingWindow()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.MovingWindow && g.MovingWindow->MoveId == g.ActiveId && g.ActiveIdSource == ImGuiInputSource_Mouse)
|
if (g.MovingWindow && g.MovingWindow->MoveId == g.ActiveId && g.ActiveIdSource == ImGuiInputSource_Mouse)
|
||||||
@ -3474,9 +3486,11 @@ static void ImGui::UpdateViewports()
|
|||||||
//if (viewport == GetMainViewport())
|
//if (viewport == GetMainViewport())
|
||||||
// g.PlatformInterface.SetWindowSize(viewport, viewport->Size * scale_factor);
|
// g.PlatformInterface.SetWindowSize(viewport, viewport->Size * scale_factor);
|
||||||
|
|
||||||
// FIXME-DPI: We need to preserve our pivots
|
// Scale our window moving pivot so that the window will rescale roughly around the mouse position.
|
||||||
//if (g.MovingWindow)
|
// FIXME-VIEWPORT: This currently creates a resizing feedback loop when a window is straddling a DPI transition border.
|
||||||
// g.ActiveIdClickOffset = g.ActiveIdClickOffset * scale_factor;
|
// (Minor: since our sizes do not perfectly linearly scale, deferring the click offset scale until we know the actual window scale ratio may get us slightly more precise mouse positioning.)
|
||||||
|
//if (g.MovingWindow != NULL && g.MovingWindow->Viewport == viewport)
|
||||||
|
// g.ActiveIdClickOffset = ImFloor(g.ActiveIdClickOffset * scale_factor);
|
||||||
}
|
}
|
||||||
viewport->DpiScale = new_dpi_scale;
|
viewport->DpiScale = new_dpi_scale;
|
||||||
}
|
}
|
||||||
@ -3897,7 +3911,7 @@ void ImGui::NewFrame()
|
|||||||
g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX;
|
g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX;
|
||||||
|
|
||||||
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
|
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
|
||||||
NewFrameUpdateMovingWindow();
|
UpdateMovingWindow();
|
||||||
NewFrameUpdateHoveredWindowAndCaptureFlags();
|
NewFrameUpdateHoveredWindowAndCaptureFlags();
|
||||||
|
|
||||||
if (GetFrontMostPopupModal() != NULL)
|
if (GetFrontMostPopupModal() != NULL)
|
||||||
@ -6184,6 +6198,10 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
|
|||||||
window->Viewport = AddUpdateViewport(window, window->ID, viewport_flags, viewport_pos, window->Size);
|
window->Viewport = AddUpdateViewport(window, window->ID, viewport_flags, viewport_pos, window->Size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (!window->ViewportOwned && GetWindowAlwaysWantOwnViewport(window))
|
||||||
|
{
|
||||||
|
window->Viewport = AddUpdateViewport(window, window->ID, ImGuiViewportFlags_NoDecoration, window->Pos, window->Size);
|
||||||
|
}
|
||||||
|
|
||||||
// Mark window as allowed to protrude outside of its viewport and into the current monitor
|
// Mark window as allowed to protrude outside of its viewport and into the current monitor
|
||||||
bool allow_protrude_on_whole_monitor = false;
|
bool allow_protrude_on_whole_monitor = false;
|
||||||
@ -14010,20 +14028,6 @@ static void ScaleWindow(ImGuiWindow* window, float scale)
|
|||||||
void ImGui::ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale)
|
void ImGui::ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
|
||||||
// FIXME-DPI: This is meant to have the window rescale around the mouse. It currently creates feedback loop when a window is straddling a DPI transition border.
|
|
||||||
// NB: since our sizes do not perfectly linearly scale, deferring the ClickOffset scale until we know the actual window scale ratio may get us slightly more precise mouse positioning.
|
|
||||||
//if (g.MovingWindow != NULL && g.MovingWindow->Viewport == viewport)
|
|
||||||
// g.ActiveIdClickOffset = ImFloor(g.ActiveIdClickOffset * scale);
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (g.IO.MousePosViewport == viewport->ID)
|
|
||||||
{
|
|
||||||
g.IO.MousePos = g.IO.MousePosPrev = ImFloor((g.IO.MousePos - viewport->Pos) * scale) + viewport->Pos;
|
|
||||||
g.IO.MouseDelta = ImVec2(0,0);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (viewport->Window)
|
if (viewport->Window)
|
||||||
{
|
{
|
||||||
ScaleWindow(viewport->Window, scale);
|
ScaleWindow(viewport->Window, scale);
|
||||||
@ -14036,7 +14040,6 @@ void ImGui::ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void RenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb)
|
static void RenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
6
imgui.h
6
imgui.h
@ -797,8 +797,10 @@ enum ImGuiConfigFlags_
|
|||||||
// [BETA] Viewports
|
// [BETA] Viewports
|
||||||
ImGuiConfigFlags_ViewportsEnable = 1 << 10, // Viewport enable flags (require both ImGuiConfigFlags_PlatformHasViewports + ImGuiConfigFlags_RendererHasViewports set by the respective back-ends)
|
ImGuiConfigFlags_ViewportsEnable = 1 << 10, // Viewport enable flags (require both ImGuiConfigFlags_PlatformHasViewports + ImGuiConfigFlags_RendererHasViewports set by the respective back-ends)
|
||||||
ImGuiConfigFlags_ViewportsNoTaskBarIcons = 1 << 11, // Disable task bars icons for all secondary viewports (will set ImGuiViewportFlags_NoTaskBarIcon on them)
|
ImGuiConfigFlags_ViewportsNoTaskBarIcons = 1 << 11, // Disable task bars icons for all secondary viewports (will set ImGuiViewportFlags_NoTaskBarIcon on them)
|
||||||
ImGuiConfigFlags_DpiEnableScaleViewports = 1 << 12,
|
ImGuiConfigFlags_ViewportsNoMerge = 1 << 12, // All floating windows _always_ have create their own viewport and platform window.
|
||||||
ImGuiConfigFlags_DpiEnableScaleFonts = 1 << 13,
|
|
||||||
|
ImGuiConfigFlags_DpiEnableScaleViewports = 1 << 13,
|
||||||
|
ImGuiConfigFlags_DpiEnableScaleFonts = 1 << 14,
|
||||||
|
|
||||||
// User storage (to allow your back-end/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core ImGui)
|
// User storage (to allow your back-end/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core ImGui)
|
||||||
ImGuiConfigFlags_IsSRGB = 1 << 20, // Application is SRGB-aware.
|
ImGuiConfigFlags_IsSRGB = 1 << 20, // Application is SRGB-aware.
|
||||||
|
Loading…
Reference in New Issue
Block a user