diff options
Diffstat (limited to 'src/imgui_helper.cpp')
-rw-r--r-- | src/imgui_helper.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/imgui_helper.cpp b/src/imgui_helper.cpp new file mode 100644 index 0000000..dc120e1 --- /dev/null +++ b/src/imgui_helper.cpp @@ -0,0 +1,90 @@ +// Widgets not directly related to drawing UI. + +// Returns a normalized UV position of the composition +static v2 +ImGui_ScreenPointToCompUV(ImVec2 ViewportMin, ImVec2 CompPos, ImVec2 CompZoom, ImVec2 MousePos) +{ + ImVec2 LocalMousePos = MousePos - ViewportMin; + ImVec2 LocalCompPos = CompPos - ViewportMin; + ImVec2 MouseScreenUV = LocalMousePos - LocalCompPos; + ImVec2 Result = MouseScreenUV / CompZoom; + return V2(Result); +} + +// NOTE(fox): We have to do a bit of hackery here to tell how many times the +// mouse has been warped during a drag, since it doesn't seem like we can rely +// on SDL_WarpMouseGlobal to update on the first frame of a WantSetPos request. + +static void +ImGui_WarpMouse(project_state *State, ImVec2 MousePos, ImVec2 Min, ImVec2 Max, int Direction) +{ + if (Direction & 1) { + if (MousePos.x < Min.x) { + State->Warp_WantSetPos = true; + State->Warp_PositionToSet = ImVec2(Max.x - 5, MousePos.y); + State->Warp_PositionInitial = MousePos.x; + State->Warp_Direction = 0; + } + if (MousePos.x > Max.x) { + State->Warp_WantSetPos = true; + State->Warp_PositionToSet = ImVec2(Min.x + 5, MousePos.y); + State->Warp_PositionInitial = MousePos.x; + State->Warp_Direction = 1; + } + } + if (Direction & 2) { + if (MousePos.y < Min.y) { + State->Warp_WantSetPos = true; + State->Warp_PositionToSet = ImVec2(MousePos.x, Max.y - 5); + State->Warp_PositionInitial = MousePos.y; + State->Warp_Direction = 2; + } + if (MousePos.y > Max.y) { + State->Warp_WantSetPos = true; + State->Warp_PositionToSet = ImVec2(MousePos.x, Min.y + 5); + State->Warp_PositionInitial = MousePos.y; + State->Warp_Direction = 3; + } + } +} + +// We record the initial position and the direction of the wrap, and only +// increment the wrap amount when MousePos actually is measured to be what we expect. + +static void +ImGui_WarpMouseFinish(project_state *State, ImVec2 MousePos) +{ + if (State->Warp_Direction == 0) { + if (MousePos.x < State->Warp_PositionInitial) State->Warp_X--; + } else if (State->Warp_Direction == 1) { + if (MousePos.x > State->Warp_PositionInitial) State->Warp_X++; + } else if (State->Warp_Direction == 2) { + if (MousePos.y < State->Warp_PositionInitial) State->Warp_Y--; + } else if (State->Warp_Direction == 3) { + if (MousePos.y > State->Warp_PositionInitial) State->Warp_Y++; + } else { + Assert(0); + } +} + +static bool32 +ImGui_TestBoxSelection_Point(ImVec2 Pos, ImGuiIO &io, bool32 *Test) +{ + bool32 Result = 0; + real32 Y_Top = (io.MouseClickedPos[0].y < io.MousePos.y) ? io.MouseClickedPos[0].y : io.MousePos.y; + real32 Y_Bottom = (io.MouseClickedPos[0].y > io.MousePos.y) ? io.MouseClickedPos[0].y : io.MousePos.y; + real32 X_Left = (io.MouseClickedPos[0].x < io.MousePos.x) ? io.MouseClickedPos[0].x : io.MousePos.x; + real32 X_Right = (io.MouseClickedPos[0].x > io.MousePos.x) ? io.MouseClickedPos[0].x : io.MousePos.x; + + if (Pos.y >= Y_Top && Pos.y <= Y_Bottom && + Pos.x >= X_Left && Pos.x <= X_Right) + { + if (!(*Test)) { + *Test = 1; + Result = 1; + } + } else if (!io.KeyShift) { + *Test = 0; + } + return Result; +} |