mirror of
https://github.com/ocornut/imgui.git
synced 2025-09-17 16:58:24 +00:00
Merge branch 'master' into docking
# Conflicts: # imgui_internal.h
This commit is contained in:
@@ -833,7 +833,7 @@ bool ImGui_ImplDX12_Init(ImGui_ImplDX12_InitInfo* init_info)
|
|||||||
init_info->SrvDescriptorAllocFn = [](ImGui_ImplDX12_InitInfo*, D3D12_CPU_DESCRIPTOR_HANDLE* out_cpu_handle, D3D12_GPU_DESCRIPTOR_HANDLE* out_gpu_handle)
|
init_info->SrvDescriptorAllocFn = [](ImGui_ImplDX12_InitInfo*, D3D12_CPU_DESCRIPTOR_HANDLE* out_cpu_handle, D3D12_GPU_DESCRIPTOR_HANDLE* out_gpu_handle)
|
||||||
{
|
{
|
||||||
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
|
ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
|
||||||
IM_ASSERT(bd->LegacySingleDescriptorUsed == false);
|
IM_ASSERT(bd->LegacySingleDescriptorUsed == false && "Only 1 simultaneous texture allowed with legacy ImGui_ImplDX12_Init() signature!");
|
||||||
*out_cpu_handle = bd->InitInfo.LegacySingleSrvCpuDescriptor;
|
*out_cpu_handle = bd->InitInfo.LegacySingleSrvCpuDescriptor;
|
||||||
*out_gpu_handle = bd->InitInfo.LegacySingleSrvGpuDescriptor;
|
*out_gpu_handle = bd->InitInfo.LegacySingleSrvGpuDescriptor;
|
||||||
bd->LegacySingleDescriptorUsed = true;
|
bd->LegacySingleDescriptorUsed = true;
|
||||||
|
@@ -35,7 +35,7 @@ struct ImGui_ImplDX12_InitInfo
|
|||||||
void* UserData;
|
void* UserData;
|
||||||
|
|
||||||
// Allocating SRV descriptors for textures is up to the application, so we provide callbacks.
|
// Allocating SRV descriptors for textures is up to the application, so we provide callbacks.
|
||||||
// (current version of the backend will only allocate one descriptor, future versions will need to allocate more)
|
// (current version of the backend will only allocate one descriptor, from 1.92 the backend will need to allocate more)
|
||||||
ID3D12DescriptorHeap* SrvDescriptorHeap;
|
ID3D12DescriptorHeap* SrvDescriptorHeap;
|
||||||
void (*SrvDescriptorAllocFn)(ImGui_ImplDX12_InitInfo* info, D3D12_CPU_DESCRIPTOR_HANDLE* out_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE* out_gpu_desc_handle);
|
void (*SrvDescriptorAllocFn)(ImGui_ImplDX12_InitInfo* info, D3D12_CPU_DESCRIPTOR_HANDLE* out_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE* out_gpu_desc_handle);
|
||||||
void (*SrvDescriptorFreeFn)(ImGui_ImplDX12_InitInfo* info, D3D12_CPU_DESCRIPTOR_HANDLE cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE gpu_desc_handle);
|
void (*SrvDescriptorFreeFn)(ImGui_ImplDX12_InitInfo* info, D3D12_CPU_DESCRIPTOR_HANDLE cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE gpu_desc_handle);
|
||||||
|
@@ -215,7 +215,6 @@ static void ImGui_ImplSDL2_PlatformSetImeData(ImGuiContext*, ImGuiViewport* view
|
|||||||
ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode);
|
ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode);
|
||||||
ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode)
|
ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode)
|
||||||
{
|
{
|
||||||
IM_UNUSED(scancode);
|
|
||||||
switch (keycode)
|
switch (keycode)
|
||||||
{
|
{
|
||||||
case SDLK_TAB: return ImGuiKey_Tab;
|
case SDLK_TAB: return ImGuiKey_Tab;
|
||||||
@@ -355,6 +354,7 @@ ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode sca
|
|||||||
case SDL_SCANCODE_COMMA: return ImGuiKey_Comma;
|
case SDL_SCANCODE_COMMA: return ImGuiKey_Comma;
|
||||||
case SDL_SCANCODE_PERIOD: return ImGuiKey_Period;
|
case SDL_SCANCODE_PERIOD: return ImGuiKey_Period;
|
||||||
case SDL_SCANCODE_SLASH: return ImGuiKey_Slash;
|
case SDL_SCANCODE_SLASH: return ImGuiKey_Slash;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
return ImGuiKey_None;
|
return ImGuiKey_None;
|
||||||
}
|
}
|
||||||
|
@@ -327,6 +327,7 @@ ImGuiKey ImGui_ImplSDL3_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode sca
|
|||||||
case SDL_SCANCODE_COMMA: return ImGuiKey_Comma;
|
case SDL_SCANCODE_COMMA: return ImGuiKey_Comma;
|
||||||
case SDL_SCANCODE_PERIOD: return ImGuiKey_Period;
|
case SDL_SCANCODE_PERIOD: return ImGuiKey_Period;
|
||||||
case SDL_SCANCODE_SLASH: return ImGuiKey_Slash;
|
case SDL_SCANCODE_SLASH: return ImGuiKey_Slash;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
return ImGuiKey_None;
|
return ImGuiKey_None;
|
||||||
}
|
}
|
||||||
|
@@ -77,11 +77,21 @@ Other changes:
|
|||||||
inner/outer padding applied to hit-testing of windows borders and detection
|
inner/outer padding applied to hit-testing of windows borders and detection
|
||||||
of hovered window.
|
of hovered window.
|
||||||
- InputText: Allow CTRL+Shift+Z to redo even outside of OSX. (#8389) [@tanksdude]
|
- InputText: Allow CTRL+Shift+Z to redo even outside of OSX. (#8389) [@tanksdude]
|
||||||
|
- InputText: Pasting a multi-line buffer into a single-line edit replaces
|
||||||
|
carriage return by spaces. (#8459)
|
||||||
- InputTextWithHint(): Fixed buffer-overflow (luckily often with no visible effect)
|
- InputTextWithHint(): Fixed buffer-overflow (luckily often with no visible effect)
|
||||||
when a user callback modified the buffer contents in a way that altered the
|
when a user callback modified the buffer contents in a way that altered the
|
||||||
visibility of the preview/hint buffer. (#8368) [@m9710797, @ocornut]
|
visibility of the preview/hint buffer. (#8368) [@m9710797, @ocornut]
|
||||||
- Scrollbar: Rework logic that fades-out scrollbar when it becomes too small,
|
- Scrollbar: Rework logic that fades-out scrollbar when it becomes too small,
|
||||||
which amusingly made it disappear when using very big font/frame size.
|
which amusingly made it disappear when using very big font/frame size.
|
||||||
|
- Scrollbar: Automatically stabilize ScrollbarX visibility when detecting a
|
||||||
|
feedback loop manifesting with ScrollbarX visibility toggling on and off
|
||||||
|
repeatedly. (#8488, #3285, #4539)
|
||||||
|
(feedback loops of this sort can manifest in various situations, but combining
|
||||||
|
horizontal + vertical scrollbar + using a clipper with varying width items is
|
||||||
|
one frequent cause. The better solution is to, either: (1) enforce visibility
|
||||||
|
by using ImGuiWindowFlags_AlwaysHorizontalScrollbar or (2) declare stable
|
||||||
|
contents width with SetNextWindowContentSize(), if you can compute it.)
|
||||||
- Tables: fixed calling SetNextWindowScroll() on clipped scrolling table
|
- Tables: fixed calling SetNextWindowScroll() on clipped scrolling table
|
||||||
to not leak the value into a subsequent window. (#8196)
|
to not leak the value into a subsequent window. (#8196)
|
||||||
- Tables: fixed an issue where Columns Visible/Width state wouldn't be correctly
|
- Tables: fixed an issue where Columns Visible/Width state wouldn't be correctly
|
||||||
|
@@ -166,6 +166,9 @@ int main(int, char**)
|
|||||||
init_info.SrvDescriptorFreeFn = [](ImGui_ImplDX12_InitInfo*, D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle, D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle) { return g_pd3dSrvDescHeapAlloc.Free(cpu_handle, gpu_handle); };
|
init_info.SrvDescriptorFreeFn = [](ImGui_ImplDX12_InitInfo*, D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle, D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle) { return g_pd3dSrvDescHeapAlloc.Free(cpu_handle, gpu_handle); };
|
||||||
ImGui_ImplDX12_Init(&init_info);
|
ImGui_ImplDX12_Init(&init_info);
|
||||||
|
|
||||||
|
// Before 1.91.6: our signature was using a single descriptor. From 1.92, specifying SrvDescriptorAllocFn/SrvDescriptorFreeFn will be required to benefit from new features.
|
||||||
|
//ImGui_ImplDX12_Init(g_pd3dDevice, APP_NUM_FRAMES_IN_FLIGHT, DXGI_FORMAT_R8G8B8A8_UNORM, g_pd3dSrvDescHeap, g_pd3dSrvDescHeap->GetCPUDescriptorHandleForHeapStart(), g_pd3dSrvDescHeap->GetGPUDescriptorHandleForHeapStart());
|
||||||
|
|
||||||
// Load Fonts
|
// Load Fonts
|
||||||
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
|
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
|
||||||
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
|
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
|
||||||
|
14
imgui.cpp
14
imgui.cpp
@@ -7959,9 +7959,23 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f;
|
ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f;
|
||||||
float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x;
|
float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x;
|
||||||
float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y;
|
float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y;
|
||||||
|
bool scrollbar_x_prev = window->ScrollbarX;
|
||||||
//bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons?
|
//bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons?
|
||||||
window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar));
|
window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar));
|
||||||
window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar));
|
window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar));
|
||||||
|
|
||||||
|
// Track when ScrollbarX visibility keeps toggling, which is a sign of a feedback loop, and stabilize by enforcing visibility (#3285, #8488)
|
||||||
|
// (Feedback loops of this sort can manifest in various situations, but combining horizontal + vertical scrollbar + using a clipper with varying width items is one frequent cause.
|
||||||
|
// The better solution is to, either (1) enforce visibility by using ImGuiWindowFlags_AlwaysHorizontalScrollbar or (2) declare stable contents width with SetNextWindowContentSize(), if you can compute it)
|
||||||
|
window->ScrollbarXStabilizeToggledHistory <<= 1;
|
||||||
|
window->ScrollbarXStabilizeToggledHistory |= (scrollbar_x_prev != window->ScrollbarX) ? 0x01 : 0x00;
|
||||||
|
const bool scrollbar_x_stabilize = (window->ScrollbarXStabilizeToggledHistory != 0) && ImCountSetBits(window->ScrollbarXStabilizeToggledHistory) >= 4; // 4 == half of bits in our U8 history.
|
||||||
|
if (scrollbar_x_stabilize)
|
||||||
|
window->ScrollbarX = true;
|
||||||
|
//if (scrollbar_x_stabilize && !window->ScrollbarXStabilizeEnabled)
|
||||||
|
// IMGUI_DEBUG_LOG("[scroll] Stabilize ScrollbarX for Window '%s'\n", window->Name);
|
||||||
|
window->ScrollbarXStabilizeEnabled = scrollbar_x_stabilize;
|
||||||
|
|
||||||
if (window->ScrollbarX && !window->ScrollbarY)
|
if (window->ScrollbarX && !window->ScrollbarY)
|
||||||
window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar);
|
window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar);
|
||||||
window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f);
|
window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f);
|
||||||
|
@@ -381,6 +381,7 @@ IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
|
|||||||
static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
|
static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
|
||||||
static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }
|
static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }
|
||||||
static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
|
static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
|
||||||
|
static inline unsigned int ImCountSetBits(unsigned int v) { unsigned int count = 0; while (v > 0) { v = v & (v - 1); count++; } return count; }
|
||||||
|
|
||||||
// Helpers: String
|
// Helpers: String
|
||||||
#define ImStrlen strlen
|
#define ImStrlen strlen
|
||||||
@@ -2735,6 +2736,8 @@ struct IMGUI_API ImGuiWindow
|
|||||||
ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold
|
ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold
|
||||||
ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar.
|
ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar.
|
||||||
bool ScrollbarX, ScrollbarY; // Are scrollbars visible?
|
bool ScrollbarX, ScrollbarY; // Are scrollbars visible?
|
||||||
|
bool ScrollbarXStabilizeEnabled; // Was ScrollbarX previously auto-stabilized?
|
||||||
|
ImU8 ScrollbarXStabilizeToggledHistory; // Used to stabilize scrollbar visibility in case of feedback loops
|
||||||
bool ViewportOwned;
|
bool ViewportOwned;
|
||||||
bool Active; // Set to true on Begin(), unless Collapsed
|
bool Active; // Set to true on Begin(), unless Collapsed
|
||||||
bool WasActive;
|
bool WasActive;
|
||||||
|
@@ -1637,7 +1637,7 @@ void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, flo
|
|||||||
if (table->IsInitializing)
|
if (table->IsInitializing)
|
||||||
{
|
{
|
||||||
ImGuiTableFlags init_flags = ~0;
|
ImGuiTableFlags init_flags = ~0;
|
||||||
if (column->WidthRequest >= 0.0f && column->StretchWeight >= 0.0f)
|
if (column->WidthRequest >= 0.0f || column->StretchWeight >= 0.0f)
|
||||||
init_flags &= ~ImGuiTableFlags_Resizable;
|
init_flags &= ~ImGuiTableFlags_Resizable;
|
||||||
TableInitColumnDefaults(table, column, init_flags);
|
TableInitColumnDefaults(table, column, init_flags);
|
||||||
}
|
}
|
||||||
|
@@ -4301,6 +4301,12 @@ static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, Im
|
|||||||
{
|
{
|
||||||
bool pass = false;
|
bool pass = false;
|
||||||
pass |= (c == '\n') && (flags & ImGuiInputTextFlags_Multiline) != 0; // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code)
|
pass |= (c == '\n') && (flags & ImGuiInputTextFlags_Multiline) != 0; // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code)
|
||||||
|
if (c == '\n' && input_source_is_clipboard && (flags & ImGuiInputTextFlags_Multiline) == 0) // In single line mode, replace \n with a space
|
||||||
|
{
|
||||||
|
c = *p_char = ' ';
|
||||||
|
pass = true;
|
||||||
|
}
|
||||||
|
pass |= (c == '\n') && (flags & ImGuiInputTextFlags_Multiline) != 0;
|
||||||
pass |= (c == '\t') && (flags & ImGuiInputTextFlags_AllowTabInput) != 0;
|
pass |= (c == '\t') && (flags & ImGuiInputTextFlags_AllowTabInput) != 0;
|
||||||
if (!pass)
|
if (!pass)
|
||||||
return false;
|
return false;
|
||||||
|
Reference in New Issue
Block a user