mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Tweak four-corners resize grip code. Added ImRect::FixInverted() helper. (#822)
This commit is contained in:
parent
90ae1c59c4
commit
e103fe8c1f
39
imgui.cpp
39
imgui.cpp
@ -4214,19 +4214,17 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co
|
|||||||
|
|
||||||
struct ImGuiResizeGripDef
|
struct ImGuiResizeGripDef
|
||||||
{
|
{
|
||||||
const char* StrId;
|
ImVec2 CornerPos;
|
||||||
ImVec2 CornerNorm;
|
|
||||||
ImVec2 InnerDir;
|
ImVec2 InnerDir;
|
||||||
int AngleMin12, AngleMax12;
|
int AngleMin12, AngleMax12;
|
||||||
ImGuiMouseCursor MouseCursor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const ImGuiResizeGripDef resize_grip_def[4] =
|
const ImGuiResizeGripDef resize_grip_def[4] =
|
||||||
{
|
{
|
||||||
{ "#RESIZE0", ImVec2(1,1), ImVec2(-1,-1), 0, 3, ImGuiMouseCursor_ResizeNWSE }, // Lower right
|
{ ImVec2(1,1), ImVec2(-1,-1), 0, 3 }, // Lower right
|
||||||
{ "#RESIZE1", ImVec2(0,1), ImVec2(+1,-1), 3, 6, ImGuiMouseCursor_ResizeNESW }, // Lower left
|
{ ImVec2(0,1), ImVec2(+1,-1), 3, 6 }, // Lower left
|
||||||
{ "#RESIZE2", ImVec2(0,0), ImVec2(+1,+1), 6, 9, ImGuiMouseCursor_ResizeNWSE }, // Upper left
|
{ ImVec2(0,0), ImVec2(+1,+1), 6, 9 }, // Upper left
|
||||||
{ "#RESIZE3", ImVec2(1,0), ImVec2(-1,+1), 9,12, ImGuiMouseCursor_ResizeNESW }, // Upper right
|
{ ImVec2(1,0), ImVec2(-1,+1), 9,12 }, // Upper right
|
||||||
};
|
};
|
||||||
|
|
||||||
// Push a new ImGui window to add widgets to.
|
// Push a new ImGui window to add widgets to.
|
||||||
@ -4567,26 +4565,28 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
// Handle resize for: Resize Grips, Gamepad
|
// Handle resize for: Resize Grips, Gamepad
|
||||||
ImU32 resize_grip_col[4] = { 0 };
|
ImU32 resize_grip_col[4] = { 0 };
|
||||||
const int resize_grip_count = (flags & ImGuiWindowFlags_ResizeFromAnySide) ? 2 : 1; // 4
|
const int resize_grip_count = (flags & ImGuiWindowFlags_ResizeFromAnySide) ? 2 : 1; // 4
|
||||||
const float resize_corner_size = (float)(int)ImMax(g.FontSize * 1.35f, window_rounding + 1.0f + g.FontSize * 0.2f);
|
|
||||||
|
const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window_rounding + 1.0f + g.FontSize * 0.2f);
|
||||||
|
const float grip_hover_size = (float)(int)(grip_draw_size * 0.75f);
|
||||||
if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && !(flags & ImGuiWindowFlags_NoResize))
|
if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && !(flags & ImGuiWindowFlags_NoResize))
|
||||||
{
|
{
|
||||||
ImVec2 pos_target(FLT_MAX, FLT_MAX);
|
ImVec2 pos_target(FLT_MAX, FLT_MAX);
|
||||||
ImVec2 size_target(FLT_MAX, FLT_MAX);
|
ImVec2 size_target(FLT_MAX, FLT_MAX);
|
||||||
|
|
||||||
// Manual resize grips
|
// Manual resize grips
|
||||||
|
PushID("#RESIZE");
|
||||||
for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
|
for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
|
||||||
{
|
{
|
||||||
const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
|
const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
|
||||||
const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerNorm);
|
const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPos);
|
||||||
|
|
||||||
// Using the FlattenChilds button flag we make the resize button accessible even if we are hovering over a child window
|
// Using the FlattenChilds button flag we make the resize button accessible even if we are hovering over a child window
|
||||||
ImRect resize_rect;
|
ImRect resize_rect(corner, corner + grip.InnerDir * grip_hover_size);
|
||||||
resize_rect.Add(corner);
|
resize_rect.FixInverted();
|
||||||
resize_rect.Add(corner + grip.InnerDir * (float)(int)(resize_corner_size * 0.75f));
|
|
||||||
bool hovered, held;
|
bool hovered, held;
|
||||||
ButtonBehavior(resize_rect, window->GetID(grip.StrId), &hovered, &held, ImGuiButtonFlags_FlattenChilds);
|
ButtonBehavior(resize_rect, window->GetID((void*)resize_grip_n), &hovered, &held, ImGuiButtonFlags_FlattenChilds);
|
||||||
if (hovered || held)
|
if (hovered || held)
|
||||||
g.MouseCursor = grip.MouseCursor;
|
g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE;
|
||||||
|
|
||||||
if (g.HoveredWindow == window && held && g.IO.MouseDoubleClicked[0])
|
if (g.HoveredWindow == window && held && g.IO.MouseDoubleClicked[0])
|
||||||
{
|
{
|
||||||
@ -4598,11 +4598,12 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
{
|
{
|
||||||
// Resize from any of the four corners
|
// Resize from any of the four corners
|
||||||
// We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position
|
// We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position
|
||||||
ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + resize_rect.GetSize() * grip.CornerNorm; // Corner of the window corresponding to our corner grip
|
ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + resize_rect.GetSize() * grip.CornerPos; // Corner of the window corresponding to our corner grip
|
||||||
CalcResizePosSizeFromAnyCorner(window, corner_target, grip.CornerNorm, &pos_target, &size_target);
|
CalcResizePosSizeFromAnyCorner(window, corner_target, grip.CornerPos, &pos_target, &size_target);
|
||||||
}
|
}
|
||||||
resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
|
resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
|
||||||
}
|
}
|
||||||
|
PopID();
|
||||||
|
|
||||||
// Apply back modified position/size to window
|
// Apply back modified position/size to window
|
||||||
if (size_target.x != FLT_MAX)
|
if (size_target.x != FLT_MAX)
|
||||||
@ -4651,9 +4652,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
|
for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
|
||||||
{
|
{
|
||||||
const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
|
const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
|
||||||
const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerNorm);
|
const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPos);
|
||||||
window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, resize_corner_size) : ImVec2(resize_corner_size, window_border_size)));
|
window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, grip_draw_size) : ImVec2(grip_draw_size, window_border_size)));
|
||||||
window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_corner_size, window_border_size) : ImVec2(window_border_size, resize_corner_size)));
|
window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(grip_draw_size, window_border_size) : ImVec2(window_border_size, grip_draw_size)));
|
||||||
window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12);
|
window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12);
|
||||||
window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]);
|
window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]);
|
||||||
}
|
}
|
||||||
|
@ -281,6 +281,7 @@ struct IMGUI_API ImRect
|
|||||||
void Translate(const ImVec2& v) { Min.x += v.x; Min.y += v.y; Max.x += v.x; Max.y += v.y; }
|
void Translate(const ImVec2& v) { Min.x += v.x; Min.y += v.y; Max.x += v.x; Max.y += v.y; }
|
||||||
void ClipWith(const ImRect& clip) { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; }
|
void ClipWith(const ImRect& clip) { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; }
|
||||||
void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
|
void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
|
||||||
|
void FixInverted() { if (Min.x > Max.x) ImSwap(Min.x, Max.x); if (Min.y > Max.y) ImSwap(Min.y, Max.y); }
|
||||||
bool IsFinite() const { return Min.x != FLT_MAX; }
|
bool IsFinite() const { return Min.x != FLT_MAX; }
|
||||||
ImVec2 GetClosestPoint(ImVec2 p, bool on_edge) const
|
ImVec2 GetClosestPoint(ImVec2 p, bool on_edge) const
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user