Skip to content

Commit

Permalink
Canvas: Handle non-zero window position with Viewports (#91, #90)
Browse files Browse the repository at this point in the history
  • Loading branch information
thedmd committed Dec 5, 2020
1 parent 12e72a9 commit a7fdf74
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 0 deletions.
2 changes: 2 additions & 0 deletions docs/CHANGELOG.txt
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,5 @@ v0.9.1 (WIP):
BUGFIX: Fix ObjectId serialization

BUGFIX: GroupNode resize instead of move on low zoom #87

BUGFIX: Make Canvas work with Viewports (#91, #90)
13 changes: 13 additions & 0 deletions imgui_canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -350,20 +350,28 @@ void ImGuiEx::Canvas::RestoreInputState()
void ImGuiEx::Canvas::SaveViewportState()
{
# if defined(IMGUI_HAS_VIEWPORT)
auto window = ImGui::GetCurrentWindow();
auto viewport = ImGui::GetWindowViewport();

m_WindowPosBackup = window->Pos;
m_ViewportPosBackup = viewport->Pos;
m_ViewportSizeBackup = viewport->Size;
m_ViewportWorkOffsetMinBackup = viewport->WorkOffsetMin;
m_ViewportWorkOffsetMaxBackup = viewport->WorkOffsetMax;
# endif
}

void ImGuiEx::Canvas::RestoreViewportState()
{
# if defined(IMGUI_HAS_VIEWPORT)
auto window = ImGui::GetCurrentWindow();
auto viewport = ImGui::GetWindowViewport();

window->Pos = m_WindowPosBackup;
viewport->Pos = m_ViewportPosBackup;
viewport->Size = m_ViewportSizeBackup;
viewport->WorkOffsetMin = m_ViewportWorkOffsetMinBackup;
viewport->WorkOffsetMax = m_ViewportWorkOffsetMaxBackup;
# endif
}

Expand Down Expand Up @@ -409,6 +417,9 @@ void ImGuiEx::Canvas::EnterLocalSpace()
m_DrawListStartVertexIndex = m_DrawList->_VtxCurrentIdx + ImVtxOffsetRef(m_DrawList);

# if defined(IMGUI_HAS_VIEWPORT)
auto window = ImGui::GetCurrentWindow();
window->Pos = ImVec2(0.0f, 0.0f);

auto viewport_min = m_ViewportPosBackup;
auto viewport_max = m_ViewportPosBackup + m_ViewportSizeBackup;

Expand All @@ -420,6 +431,8 @@ void ImGuiEx::Canvas::EnterLocalSpace()
auto viewport = ImGui::GetWindowViewport();
viewport->Pos = viewport_min;
viewport->Size = viewport_max - viewport_min;
viewport->WorkOffsetMin = m_ViewportWorkOffsetMinBackup * m_View.InvScale;
viewport->WorkOffsetMax = m_ViewportWorkOffsetMaxBackup * m_View.InvScale;
# endif

// Clip rectangle in parent canvas space and move it to local space.
Expand Down
3 changes: 3 additions & 0 deletions imgui_canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,11 @@ struct Canvas
ImVec2 m_WindowCursorMaxBackup;

# if defined(IMGUI_HAS_VIEWPORT)
ImVec2 m_WindowPosBackup;
ImVec2 m_ViewportPosBackup;
ImVec2 m_ViewportSizeBackup;
ImVec2 m_ViewportWorkOffsetMinBackup;
ImVec2 m_ViewportWorkOffsetMaxBackup;
# endif
};

Expand Down

0 comments on commit a7fdf74

Please sign in to comment.