|
|
@ -1250,8 +1250,9 @@ struct ImGuiState |
|
|
|
ImGuiID ActiveId; // Active widget
|
|
|
|
ImGuiID ActiveId; // Active widget
|
|
|
|
ImGuiID ActiveIdPreviousFrame; |
|
|
|
ImGuiID ActiveIdPreviousFrame; |
|
|
|
bool ActiveIdIsAlive; |
|
|
|
bool ActiveIdIsAlive; |
|
|
|
bool ActiveIdIsJustActivated; // Set when
|
|
|
|
bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
|
|
|
|
bool ActiveIdIsFocusedOnly; // Set only by active widget. Denote focus but no active interaction.
|
|
|
|
bool ActiveIdIsFocusedOnly; // Set only by active widget. Denote focus but no active interaction
|
|
|
|
|
|
|
|
ImGuiWindow* ActiveIdWindow; |
|
|
|
ImGuiWindow* MovedWindow; // Track the child window we clicked on to move a window. Only valid if ActiveID is the "#MOVE" identifier of a window.
|
|
|
|
ImGuiWindow* MovedWindow; // Track the child window we clicked on to move a window. Only valid if ActiveID is the "#MOVE" identifier of a window.
|
|
|
|
float SettingsDirtyTimer; |
|
|
|
float SettingsDirtyTimer; |
|
|
|
ImVector<ImGuiIniData> Settings; |
|
|
|
ImVector<ImGuiIniData> Settings; |
|
|
@ -1466,12 +1467,13 @@ static inline ImGuiWindow* GetParentWindow() |
|
|
|
return g.CurrentWindowStack[g.CurrentWindowStack.size() - 2]; |
|
|
|
return g.CurrentWindowStack[g.CurrentWindowStack.size() - 2]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void SetActiveId(ImGuiID id)
|
|
|
|
static void SetActiveId(ImGuiID id, ImGuiWindow* window = NULL)
|
|
|
|
{ |
|
|
|
{ |
|
|
|
ImGuiState& g = *GImGui; |
|
|
|
ImGuiState& g = *GImGui; |
|
|
|
g.ActiveId = id;
|
|
|
|
g.ActiveId = id;
|
|
|
|
g.ActiveIdIsFocusedOnly = false; |
|
|
|
g.ActiveIdIsFocusedOnly = false; |
|
|
|
g.ActiveIdIsJustActivated = true; |
|
|
|
g.ActiveIdIsJustActivated = true; |
|
|
|
|
|
|
|
g.ActiveIdWindow = window; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void RegisterAliveId(ImGuiID id) |
|
|
|
static void RegisterAliveId(ImGuiID id) |
|
|
@ -2379,7 +2381,7 @@ void ImGui::Render() |
|
|
|
{ |
|
|
|
{ |
|
|
|
IM_ASSERT(g.MovedWindow == NULL); |
|
|
|
IM_ASSERT(g.MovedWindow == NULL); |
|
|
|
g.MovedWindow = g.HoveredWindow; |
|
|
|
g.MovedWindow = g.HoveredWindow; |
|
|
|
SetActiveId(g.HoveredRootWindow->MoveID); |
|
|
|
SetActiveId(g.HoveredRootWindow->MoveID, g.HoveredRootWindow); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (g.FocusedWindow != NULL) |
|
|
|
else if (g.FocusedWindow != NULL) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -4887,7 +4889,7 @@ static bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetActiveId(id); |
|
|
|
SetActiveId(id, window); |
|
|
|
} |
|
|
|
} |
|
|
|
FocusWindow(window); |
|
|
|
FocusWindow(window); |
|
|
|
} |
|
|
|
} |
|
|
@ -5537,7 +5539,7 @@ static bool SliderFloatAsInputText(const char* label, float* v, ImGuiID id, int |
|
|
|
char text_buf[64]; |
|
|
|
char text_buf[64]; |
|
|
|
ImFormatString(text_buf, IM_ARRAYSIZE(text_buf), "%.*f", decimal_precision, *v); |
|
|
|
ImFormatString(text_buf, IM_ARRAYSIZE(text_buf), "%.*f", decimal_precision, *v); |
|
|
|
|
|
|
|
|
|
|
|
SetActiveId(g.ScalarAsInputTextId); |
|
|
|
SetActiveId(g.ScalarAsInputTextId, window); |
|
|
|
g.HoveredId = 0; |
|
|
|
g.HoveredId = 0; |
|
|
|
|
|
|
|
|
|
|
|
// Our replacement widget will override the focus ID (registered previously to allow for a TAB focus to happen)
|
|
|
|
// Our replacement widget will override the focus ID (registered previously to allow for a TAB focus to happen)
|
|
|
@ -5767,7 +5769,7 @@ bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, c |
|
|
|
const bool tab_focus_requested = window->FocusItemRegister(g.ActiveId == id); |
|
|
|
const bool tab_focus_requested = window->FocusItemRegister(g.ActiveId == id); |
|
|
|
if (tab_focus_requested || (hovered && g.IO.MouseClicked[0])) |
|
|
|
if (tab_focus_requested || (hovered && g.IO.MouseClicked[0])) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetActiveId(id); |
|
|
|
SetActiveId(id, window); |
|
|
|
FocusWindow(window); |
|
|
|
FocusWindow(window); |
|
|
|
|
|
|
|
|
|
|
|
const bool is_ctrl_down = g.IO.KeyCtrl; |
|
|
|
const bool is_ctrl_down = g.IO.KeyCtrl; |
|
|
@ -5825,7 +5827,7 @@ bool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float |
|
|
|
|
|
|
|
|
|
|
|
if (hovered && g.IO.MouseClicked[0]) |
|
|
|
if (hovered && g.IO.MouseClicked[0]) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetActiveId(id); |
|
|
|
SetActiveId(id, window); |
|
|
|
FocusWindow(window); |
|
|
|
FocusWindow(window); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -6071,7 +6073,7 @@ bool ImGui::DragFloat(const char* label, float *v, float v_speed, float v_min, f |
|
|
|
const bool tab_focus_requested = window->FocusItemRegister(g.ActiveId == id); |
|
|
|
const bool tab_focus_requested = window->FocusItemRegister(g.ActiveId == id); |
|
|
|
if (tab_focus_requested || (hovered && (g.IO.MouseClicked[0] | g.IO.MouseDoubleClicked[0]))) |
|
|
|
if (tab_focus_requested || (hovered && (g.IO.MouseClicked[0] | g.IO.MouseDoubleClicked[0]))) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SetActiveId(id); |
|
|
|
SetActiveId(id, window); |
|
|
|
FocusWindow(window); |
|
|
|
FocusWindow(window); |
|
|
|
|
|
|
|
|
|
|
|
if (tab_focus_requested || g.IO.KeyCtrl || g.IO.MouseDoubleClicked[0]) |
|
|
|
if (tab_focus_requested || g.IO.KeyCtrl || g.IO.MouseDoubleClicked[0]) |
|
|
@ -6855,16 +6857,14 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT |
|
|
|
if (focus_requested_by_tab || (user_clicked && is_ctrl_down)) |
|
|
|
if (focus_requested_by_tab || (user_clicked && is_ctrl_down)) |
|
|
|
select_all = true; |
|
|
|
select_all = true; |
|
|
|
} |
|
|
|
} |
|
|
|
SetActiveId(id); |
|
|
|
SetActiveId(id, window); |
|
|
|
FocusWindow(window); |
|
|
|
FocusWindow(window); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (io.MouseClicked[0]) |
|
|
|
else if (io.MouseClicked[0]) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Release focus when we click outside
|
|
|
|
// Release focus when we click outside
|
|
|
|
if (g.ActiveId == id) |
|
|
|
if (g.ActiveId == id) |
|
|
|
{ |
|
|
|
|
|
|
|
SetActiveId(0); |
|
|
|
SetActiveId(0); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget.
|
|
|
|
// Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget.
|
|
|
|