mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-24 07:40:22 +01:00
Resizing window doesn't rely on MouseDelta anymore, but rather recompute expected size based absolute mouse coords. (#668)
Storing ActiveIdClickOffset to generalize pattern already used by columns.
This commit is contained in:
parent
81bf5aeb09
commit
102d03a7eb
10
imgui.cpp
10
imgui.cpp
@ -3993,7 +3993,7 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
|
|||||||
if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup))
|
if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup))
|
||||||
{
|
{
|
||||||
window->Pos = window->PosFloat = parent_window->DC.CursorPos;
|
window->Pos = window->PosFloat = parent_window->DC.CursorPos;
|
||||||
window->Size = window->SizeFull = size_on_first_use; // NB: argument name 'size_on_first_use' misleading here, it's really just 'size' as provided by user.
|
window->Size = window->SizeFull = size_on_first_use; // NB: argument name 'size_on_first_use' misleading here, it's really just 'size' as provided by user passed via BeginChild()->Begin().
|
||||||
}
|
}
|
||||||
|
|
||||||
bool window_pos_center = false;
|
bool window_pos_center = false;
|
||||||
@ -4108,7 +4108,8 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
|
|||||||
}
|
}
|
||||||
else if (held)
|
else if (held)
|
||||||
{
|
{
|
||||||
window->SizeFull = ImMax(window->SizeFull + g.IO.MouseDelta, style.WindowMinSize);
|
// We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position
|
||||||
|
window->SizeFull = ImMax((g.IO.MousePos - g.ActiveIdClickOffset + resize_rect.GetSize()) - window->Pos, style.WindowMinSize);
|
||||||
if (!(flags & ImGuiWindowFlags_NoSavedSettings))
|
if (!(flags & ImGuiWindowFlags_NoSavedSettings))
|
||||||
MarkSettingsDirty();
|
MarkSettingsDirty();
|
||||||
}
|
}
|
||||||
@ -5423,6 +5424,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
|
|||||||
{
|
{
|
||||||
SetActiveID(id, window); // Hold on ID
|
SetActiveID(id, window); // Hold on ID
|
||||||
FocusWindow(window);
|
FocusWindow(window);
|
||||||
|
g.ActiveIdClickOffset = g.IO.MousePos - bb.Min;
|
||||||
}
|
}
|
||||||
if (((flags & ImGuiButtonFlags_PressedOnClick) && g.IO.MouseClicked[0]) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[0]))
|
if (((flags & ImGuiButtonFlags_PressedOnClick) && g.IO.MouseClicked[0]) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[0]))
|
||||||
{
|
{
|
||||||
@ -9188,7 +9190,7 @@ static float GetDraggedColumnOffset(int column_index)
|
|||||||
IM_ASSERT(column_index > 0); // We cannot drag column 0. If you get this assert you may have a conflict between the ID of your columns and another widgets.
|
IM_ASSERT(column_index > 0); // We cannot drag column 0. If you get this assert you may have a conflict between the ID of your columns and another widgets.
|
||||||
IM_ASSERT(g.ActiveId == window->DC.ColumnsSetID + ImGuiID(column_index));
|
IM_ASSERT(g.ActiveId == window->DC.ColumnsSetID + ImGuiID(column_index));
|
||||||
|
|
||||||
float x = g.IO.MousePos.x + g.ActiveClickDeltaToCenter.x - window->Pos.x;
|
float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x - window->Pos.x;
|
||||||
x = ImClamp(x, ImGui::GetColumnOffset(column_index-1)+g.Style.ColumnsMinSpacing, ImGui::GetColumnOffset(column_index+1)-g.Style.ColumnsMinSpacing);
|
x = ImClamp(x, ImGui::GetColumnOffset(column_index-1)+g.Style.ColumnsMinSpacing, ImGui::GetColumnOffset(column_index+1)-g.Style.ColumnsMinSpacing);
|
||||||
|
|
||||||
return (float)(int)x;
|
return (float)(int)x;
|
||||||
@ -9293,7 +9295,7 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
|
|||||||
if (held)
|
if (held)
|
||||||
{
|
{
|
||||||
if (g.ActiveIdIsJustActivated)
|
if (g.ActiveIdIsJustActivated)
|
||||||
g.ActiveClickDeltaToCenter.x = x - g.IO.MousePos.x;
|
g.ActiveIdClickOffset.x -= 4; // Store from center of column line
|
||||||
x = GetDraggedColumnOffset(i);
|
x = GetDraggedColumnOffset(i);
|
||||||
SetColumnOffset(i, x);
|
SetColumnOffset(i, x);
|
||||||
}
|
}
|
||||||
|
@ -1807,10 +1807,8 @@ static void ShowExampleAppFixedOverlay(bool* p_open)
|
|||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowExampleAppManipulatingWindowTitle(bool* p_open)
|
static void ShowExampleAppManipulatingWindowTitle(bool*)
|
||||||
{
|
{
|
||||||
(void)p_open;
|
|
||||||
|
|
||||||
// By default, Windows are uniquely identified by their title.
|
// By default, Windows are uniquely identified by their title.
|
||||||
// You can use the "##" and "###" markers to manipulate the display/ID. Read FAQ at the top of this file!
|
// You can use the "##" and "###" markers to manipulate the display/ID. Read FAQ at the top of this file!
|
||||||
|
|
||||||
|
@ -373,6 +373,7 @@ struct ImGuiContext
|
|||||||
bool ActiveIdIsAlive;
|
bool ActiveIdIsAlive;
|
||||||
bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
|
bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
|
||||||
bool ActiveIdAllowOverlap; // Set only by active widget
|
bool ActiveIdAllowOverlap; // Set only by active widget
|
||||||
|
ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
|
||||||
ImGuiWindow* ActiveIdWindow;
|
ImGuiWindow* ActiveIdWindow;
|
||||||
ImGuiWindow* MovedWindow; // Track the child window we clicked on to move a window.
|
ImGuiWindow* MovedWindow; // Track the child window we clicked on to move a window.
|
||||||
ImGuiID MovedWindowMoveId; // == MovedWindow->RootWindow->MoveId
|
ImGuiID MovedWindowMoveId; // == MovedWindow->RootWindow->MoveId
|
||||||
@ -410,7 +411,6 @@ struct ImGuiContext
|
|||||||
ImFont InputTextPasswordFont;
|
ImFont InputTextPasswordFont;
|
||||||
ImGuiID ScalarAsInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
|
ImGuiID ScalarAsInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
|
||||||
ImGuiStorage ColorEditModeStorage; // Store user selection of color edit mode
|
ImGuiStorage ColorEditModeStorage; // Store user selection of color edit mode
|
||||||
ImVec2 ActiveClickDeltaToCenter;
|
|
||||||
float DragCurrentValue; // Currently dragged value, always float, not rounded by end-user precision settings
|
float DragCurrentValue; // Currently dragged value, always float, not rounded by end-user precision settings
|
||||||
ImVec2 DragLastMouseDelta;
|
ImVec2 DragLastMouseDelta;
|
||||||
float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
|
float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
|
||||||
@ -458,6 +458,7 @@ struct ImGuiContext
|
|||||||
ActiveIdIsAlive = false;
|
ActiveIdIsAlive = false;
|
||||||
ActiveIdIsJustActivated = false;
|
ActiveIdIsJustActivated = false;
|
||||||
ActiveIdAllowOverlap = false;
|
ActiveIdAllowOverlap = false;
|
||||||
|
ActiveIdClickOffset = ImVec2(-1,-1);
|
||||||
ActiveIdWindow = NULL;
|
ActiveIdWindow = NULL;
|
||||||
MovedWindow = NULL;
|
MovedWindow = NULL;
|
||||||
MovedWindowMoveId = 0;
|
MovedWindowMoveId = 0;
|
||||||
@ -475,7 +476,6 @@ struct ImGuiContext
|
|||||||
SetNextTreeNodeOpenCond = 0;
|
SetNextTreeNodeOpenCond = 0;
|
||||||
|
|
||||||
ScalarAsInputTextId = 0;
|
ScalarAsInputTextId = 0;
|
||||||
ActiveClickDeltaToCenter = ImVec2(0.0f, 0.0f);
|
|
||||||
DragCurrentValue = 0.0f;
|
DragCurrentValue = 0.0f;
|
||||||
DragLastMouseDelta = ImVec2(0.0f, 0.0f);
|
DragLastMouseDelta = ImVec2(0.0f, 0.0f);
|
||||||
DragSpeedDefaultRatio = 0.01f;
|
DragSpeedDefaultRatio = 0.01f;
|
||||||
|
Loading…
Reference in New Issue
Block a user