mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Misc tweaks/fixes (see details).
Combo: ultra minor fix for popup positioning policy mismatch depending on ImGuiComboFlags_PopupAlignLeft flag. Made ImHashXXX functions return ImGuiID. IsWindowNavFocusable use !WasActive.. it worked because it was only called in NewFrame()->NavUpdate() before the transition loop + EndFrame() only. Fix unused variable warning.
This commit is contained in:
		@@ -1433,7 +1433,7 @@ static const ImU32 GCrc32LookupTable[256] =
 | 
			
		||||
// Known size hash
 | 
			
		||||
// It is ok to call ImHashData on a string with known length but the ### operator won't be supported.
 | 
			
		||||
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
 | 
			
		||||
ImU32 ImHashData(const void* data_p, size_t data_size, ImU32 seed)
 | 
			
		||||
ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed)
 | 
			
		||||
{
 | 
			
		||||
    ImU32 crc = ~seed;
 | 
			
		||||
    const unsigned char* data = (const unsigned char*)data_p;
 | 
			
		||||
@@ -1449,7 +1449,7 @@ ImU32 ImHashData(const void* data_p, size_t data_size, ImU32 seed)
 | 
			
		||||
// - If we reach ### in the string we discard the hash so far and reset to the seed.
 | 
			
		||||
// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build)
 | 
			
		||||
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
 | 
			
		||||
ImU32 ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
 | 
			
		||||
ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
 | 
			
		||||
{
 | 
			
		||||
    seed = ~seed;
 | 
			
		||||
    ImU32 crc = seed;
 | 
			
		||||
@@ -6405,7 +6405,7 @@ bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags)
 | 
			
		||||
// If you want a window to never be focused, you may use the e.g. NoInputs flag.
 | 
			
		||||
bool ImGui::IsWindowNavFocusable(ImGuiWindow* window)
 | 
			
		||||
{
 | 
			
		||||
    return window->Active && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus);
 | 
			
		||||
    return window->WasActive && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float ImGui::GetWindowWidth()
 | 
			
		||||
@@ -7002,6 +7002,7 @@ void ImGuiStackSizes::CompareWithCurrentState()
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
			
		||||
    IM_UNUSED(window);
 | 
			
		||||
 | 
			
		||||
    // Window stacks
 | 
			
		||||
    // NOT checking: DC.ItemWidth, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							@@ -371,9 +371,9 @@ namespace ImGui
 | 
			
		||||
    IMGUI_API ImU32         GetColorU32(ImU32 col);                                         // retrieve given color with style alpha applied
 | 
			
		||||
 | 
			
		||||
    // Parameters stacks (current window)
 | 
			
		||||
    IMGUI_API void          PushItemWidth(float item_width);                                // push width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side). 0.0f = default to ~2/3 of windows width,
 | 
			
		||||
    IMGUI_API void          PushItemWidth(float item_width);                                // push width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side). 0.0f = default to ~2/3 of windows width,
 | 
			
		||||
    IMGUI_API void          PopItemWidth();
 | 
			
		||||
    IMGUI_API void          SetNextItemWidth(float item_width);                             // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)
 | 
			
		||||
    IMGUI_API void          SetNextItemWidth(float item_width);                             // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side)
 | 
			
		||||
    IMGUI_API float         CalcItemWidth();                                                // width of item given pushed settings and current cursor position. NOT necessarily the width of last item unlike most 'Item' functions.
 | 
			
		||||
    IMGUI_API void          PushTextWrapPos(float wrap_local_pos_x = 0.0f);                 // push word-wrapping position for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space
 | 
			
		||||
    IMGUI_API void          PopTextWrapPos();
 | 
			
		||||
 
 | 
			
		||||
@@ -250,10 +250,10 @@ namespace ImStb
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Helpers: Hashing
 | 
			
		||||
IMGUI_API ImU32         ImHashData(const void* data, size_t data_size, ImU32 seed = 0);
 | 
			
		||||
IMGUI_API ImU32         ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0);
 | 
			
		||||
IMGUI_API ImGuiID       ImHashData(const void* data, size_t data_size, ImU32 seed = 0);
 | 
			
		||||
IMGUI_API ImGuiID       ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0);
 | 
			
		||||
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
 | 
			
		||||
static inline ImU32     ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68]
 | 
			
		||||
static inline ImGuiID   ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68]
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Helpers: Sorting
 | 
			
		||||
 
 | 
			
		||||
@@ -1590,13 +1590,17 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
 | 
			
		||||
    char name[16];
 | 
			
		||||
    ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth
 | 
			
		||||
 | 
			
		||||
    // Peak into expected window size so we can position it
 | 
			
		||||
    // Position the window given a custom constraint (peak into expected window size so we can position it)
 | 
			
		||||
    // This might be easier to express with an hypothetical SetNextWindowPosConstraints() function.
 | 
			
		||||
    if (ImGuiWindow* popup_window = FindWindowByName(name))
 | 
			
		||||
        if (popup_window->WasActive)
 | 
			
		||||
        {
 | 
			
		||||
            // Always override 'AutoPosLastDirection' to not leave a chance for a past value to affect us.
 | 
			
		||||
            ImVec2 size_expected = CalcWindowExpectedSize(popup_window);
 | 
			
		||||
            if (flags & ImGuiComboFlags_PopupAlignLeft)
 | 
			
		||||
                popup_window->AutoPosLastDirection = ImGuiDir_Left;
 | 
			
		||||
                popup_window->AutoPosLastDirection = ImGuiDir_Left; // "Below, Toward Left"
 | 
			
		||||
            else
 | 
			
		||||
                popup_window->AutoPosLastDirection = ImGuiDir_Down; // "Below, Toward Right (default)"
 | 
			
		||||
            ImRect r_outer = GetWindowAllowedExtentRect(popup_window);
 | 
			
		||||
            ImVec2 pos = FindBestWindowPosForPopupEx(frame_bb.GetBL(), size_expected, &popup_window->AutoPosLastDirection, r_outer, frame_bb, ImGuiPopupPositionPolicy_ComboBox);
 | 
			
		||||
            SetNextWindowPos(pos);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user