summaryrefslogtreecommitdiff
path: root/src/imgui_helper.cpp
diff options
context:
space:
mode:
authorFox Caminiti <fox@foxcam.net>2022-12-16 20:16:43 -0500
committerFox Caminiti <fox@foxcam.net>2022-12-16 20:16:43 -0500
commitbedd6906eabdd513042d6a178d4dc56a3a41d1d3 (patch)
tree2bcbd3e46ae61e583707a2ccc5b3f5cfeacb61a8 /src/imgui_helper.cpp
parentcdb9e1f7240cb0716b7d99df5e1fd7c3fc3407a8 (diff)
v3, file/build organization
Diffstat (limited to 'src/imgui_helper.cpp')
-rw-r--r--src/imgui_helper.cpp90
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;
+}