mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Fixed using IsItemEdited() after Combo() not matching the return value from Combo(). (#2034) + fix some PVS warnings, fix typo, blanks.
Amend e28b1078
			
			
This commit is contained in:
		| @@ -18,7 +18,7 @@ | |||||||
|  |  | ||||||
| // CHANGELOG | // CHANGELOG | ||||||
| // (minor and older changes stripped away, please see git history for details) | // (minor and older changes stripped away, please see git history for details) | ||||||
| //  2021-01-03: OpenGL: Backup, setup and restore GL_SHADE_MODAL state, disable GL_STENCIL_TEST and disable GL_NORMAL_ARRAY client state to increase compatibility with legacy OpenGL applications. | //  2021-01-03: OpenGL: Backup, setup and restore GL_SHADE_MODEL state, disable GL_STENCIL_TEST and disable GL_NORMAL_ARRAY client state to increase compatibility with legacy OpenGL applications. | ||||||
| //  2020-01-23: OpenGL: Backup, setup and restore GL_TEXTURE_ENV to increase compatibility with legacy OpenGL applications. | //  2020-01-23: OpenGL: Backup, setup and restore GL_TEXTURE_ENV to increase compatibility with legacy OpenGL applications. | ||||||
| //  2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. | //  2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. | ||||||
| //  2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display. | //  2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display. | ||||||
|   | |||||||
| @@ -261,8 +261,8 @@ static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_wid | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     // Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT) |     // Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT) | ||||||
|     bool clip_origin_lower_left = true; |  | ||||||
| #if defined(GL_CLIP_ORIGIN) && !defined(__APPLE__) | #if defined(GL_CLIP_ORIGIN) && !defined(__APPLE__) | ||||||
|  |     bool clip_origin_lower_left = true; | ||||||
|     GLenum current_clip_origin = 0; glGetIntegerv(GL_CLIP_ORIGIN, (GLint*)¤t_clip_origin); |     GLenum current_clip_origin = 0; glGetIntegerv(GL_CLIP_ORIGIN, (GLint*)¤t_clip_origin); | ||||||
|     if (current_clip_origin == GL_UPPER_LEFT) |     if (current_clip_origin == GL_UPPER_LEFT) | ||||||
|         clip_origin_lower_left = false; |         clip_origin_lower_left = false; | ||||||
| @@ -275,7 +275,9 @@ static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_wid | |||||||
|     float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; |     float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; | ||||||
|     float T = draw_data->DisplayPos.y; |     float T = draw_data->DisplayPos.y; | ||||||
|     float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; |     float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; | ||||||
|  | #if defined(GL_CLIP_ORIGIN) && !defined(__APPLE__) | ||||||
|     if (!clip_origin_lower_left) { float tmp = T; T = B; B = tmp; } // Swap top and bottom if origin is upper left |     if (!clip_origin_lower_left) { float tmp = T; T = B; B = tmp; } // Swap top and bottom if origin is upper left | ||||||
|  | #endif | ||||||
|     const float ortho_projection[4][4] = |     const float ortho_projection[4][4] = | ||||||
|     { |     { | ||||||
|         { 2.0f/(R-L),   0.0f,         0.0f,   0.0f }, |         { 2.0f/(R-L),   0.0f,         0.0f,   0.0f }, | ||||||
| @@ -286,12 +288,12 @@ static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_wid | |||||||
|     glUseProgram(g_ShaderHandle); |     glUseProgram(g_ShaderHandle); | ||||||
|     glUniform1i(g_AttribLocationTex, 0); |     glUniform1i(g_AttribLocationTex, 0); | ||||||
|     glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]); |     glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]); | ||||||
|      |  | ||||||
| #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER | ||||||
|     if (g_GlVersion >= 330) |     if (g_GlVersion >= 330) | ||||||
|         glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise. |         glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise. | ||||||
| #endif | #endif | ||||||
|      |  | ||||||
|     (void)vertex_array_object; |     (void)vertex_array_object; | ||||||
| #ifndef IMGUI_IMPL_OPENGL_ES2 | #ifndef IMGUI_IMPL_OPENGL_ES2 | ||||||
|     glBindVertexArray(vertex_array_object); |     glBindVertexArray(vertex_array_object); | ||||||
|   | |||||||
| @@ -90,6 +90,7 @@ Other Changes: | |||||||
| - InputText: Fixed updating cursor/selection position when a callback altered the buffer in a way | - InputText: Fixed updating cursor/selection position when a callback altered the buffer in a way | ||||||
|   where the byte count is unchanged but the decoded character count changes. (#3587) [@gqw] |   where the byte count is unchanged but the decoded character count changes. (#3587) [@gqw] | ||||||
| - InputText: Fixed swiching from single to multi-line while preserving same ID. | - InputText: Fixed swiching from single to multi-line while preserving same ID. | ||||||
|  | - Fixed using IsItemEdited() after Combo() not matching the return value from Combo(). (#2034) | ||||||
| - Nav: Fixed IsItemFocused() from returning false when Nav highlight is hidden because mouse has moved. | - Nav: Fixed IsItemFocused() from returning false when Nav highlight is hidden because mouse has moved. | ||||||
|   It's essentially been always the case but it doesn't make much sense. Instead we will aim at exposing |   It's essentially been always the case but it doesn't make much sense. Instead we will aim at exposing | ||||||
|   feedback and control of keyboard/gamepad navigation highlight and mouse hover disable flag. (#787, #2048) |   feedback and control of keyboard/gamepad navigation highlight and mouse hover disable flag. (#787, #2048) | ||||||
| @@ -117,8 +118,8 @@ Other Changes: | |||||||
| - Demo: Clarify usage of right-aligned items in Demo>Layout>Widgets Width. | - Demo: Clarify usage of right-aligned items in Demo>Layout>Widgets Width. | ||||||
| - Backends: OpenGL3: Use glGetString(GL_VERSION) query instead of glGetIntegerv(GL_MAJOR_VERSION, ...) | - Backends: OpenGL3: Use glGetString(GL_VERSION) query instead of glGetIntegerv(GL_MAJOR_VERSION, ...) | ||||||
|   when the later returns zero (e.g. Desktop GL 2.x). (#3530) [@xndcn] |   when the later returns zero (e.g. Desktop GL 2.x). (#3530) [@xndcn] | ||||||
| - Backends: OpenGL2: Backup and restore GL_SHADE_MODAL and disable GL_NORMAL_ARRAY state to increase compatibility | - Backends: OpenGL2: Backup and restore GL_SHADE_MODEL and disable GL_NORMAL_ARRAY state to increase  | ||||||
|   with legacy code. (#3671) |   compatibility with legacy code. (#3671) | ||||||
| - Backends: OpenGL3: Backup and restore GL_PRIMITIVE_RESTART state. (#3544) [@Xipiryon] | - Backends: OpenGL3: Backup and restore GL_PRIMITIVE_RESTART state. (#3544) [@Xipiryon] | ||||||
| - Backends: OpenGL2, OpenGL3: Backup and restore GL_STENCIL_TEST enable state. (#3668) | - Backends: OpenGL2, OpenGL3: Backup and restore GL_STENCIL_TEST enable state. (#3668) | ||||||
| - Backends: Vulkan: Added support for specifying which subpass to reference during VkPipeline creation. (@3579) [@bdero] | - Backends: Vulkan: Added support for specifying which subpass to reference during VkPipeline creation. (@3579) [@bdero] | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -1050,7 +1050,7 @@ enum ImGuiTabItemFlags_ | |||||||
| //      (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). | //      (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). | ||||||
| // - When ScrollX is on: | // - When ScrollX is on: | ||||||
| //    - Table defaults to ImGuiTableFlags_SizingPolicyFixed -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed or ImGuiTableColumnFlags_WidthAuto. | //    - Table defaults to ImGuiTableFlags_SizingPolicyFixed -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed or ImGuiTableColumnFlags_WidthAuto. | ||||||
| //    - Columns sizing policy allowed: Fixed/Auto mostly.  | //    - Columns sizing policy allowed: Fixed/Auto mostly. | ||||||
| //    - Fixed Columns can be enlarged as needed. Table will show an horizontal scrollbar if needed. | //    - Fixed Columns can be enlarged as needed. Table will show an horizontal scrollbar if needed. | ||||||
| //    - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). | //    - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). | ||||||
| //      If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. | //      If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. | ||||||
|   | |||||||
| @@ -1976,18 +1976,18 @@ static void ShowDemoWindowWidgets() | |||||||
|         ImGui::TreePop(); |         ImGui::TreePop(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (ImGui::TreeNode("Querying Status (Active/Focused/Hovered etc.)")) |     if (ImGui::TreeNode("Querying Status (Edited/Active/Focused/Hovered etc.)")) | ||||||
|     { |     { | ||||||
|         // Select an item type |         // Select an item type | ||||||
|         const char* item_names[] = |         const char* item_names[] = | ||||||
|         { |         { | ||||||
|             "Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputFloat", |             "Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputFloat", | ||||||
|             "InputFloat3", "ColorEdit4", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "ListBox" |             "InputFloat3", "ColorEdit4", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox" | ||||||
|         }; |         }; | ||||||
|         static int item_type = 1; |         static int item_type = 1; | ||||||
|         ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names)); |         ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names)); | ||||||
|         ImGui::SameLine(); |         ImGui::SameLine(); | ||||||
|         HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions."); |         HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions. Note that the bool return value of most ImGui function is generally equivalent to calling ImGui::IsItemHovered()."); | ||||||
|  |  | ||||||
|         // Submit selected item item so we can query their status in the code following it. |         // Submit selected item item so we can query their status in the code following it. | ||||||
|         bool ret = false; |         bool ret = false; | ||||||
| @@ -2006,7 +2006,8 @@ static void ShowDemoWindowWidgets() | |||||||
|         if (item_type == 9) { ret = ImGui::MenuItem("ITEM: MenuItem"); }                                // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy) |         if (item_type == 9) { ret = ImGui::MenuItem("ITEM: MenuItem"); }                                // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy) | ||||||
|         if (item_type == 10){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); }     // Testing tree node |         if (item_type == 10){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); }     // Testing tree node | ||||||
|         if (item_type == 11){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy. |         if (item_type == 11){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy. | ||||||
|         if (item_type == 12){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); } |         if (item_type == 12){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", ¤t, items, IM_ARRAYSIZE(items)); } | ||||||
|  |         if (item_type == 13){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); } | ||||||
|  |  | ||||||
|         // Display the values of IsItemHovered() and other common item state functions. |         // Display the values of IsItemHovered() and other common item state functions. | ||||||
|         // Note that the ImGuiHoveredFlags_XXX flags can be combined. |         // Note that the ImGuiHoveredFlags_XXX flags can be combined. | ||||||
| @@ -6043,7 +6044,7 @@ struct ExampleAppConsole | |||||||
|     // Portable helpers |     // Portable helpers | ||||||
|     static int   Stricmp(const char* s1, const char* s2)         { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; } |     static int   Stricmp(const char* s1, const char* s2)         { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; } | ||||||
|     static int   Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; } |     static int   Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; } | ||||||
|     static char* Strdup(const char* s)                           { size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); } |     static char* Strdup(const char* s)                           { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); } | ||||||
|     static void  Strtrim(char* s)                                { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; } |     static void  Strtrim(char* s)                                { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; } | ||||||
|  |  | ||||||
|     void    ClearLog() |     void    ClearLog() | ||||||
|   | |||||||
| @@ -2170,10 +2170,11 @@ bool    ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) | |||||||
|         for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++) |         for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++) | ||||||
|             if (cfg.DstFont == atlas->Fonts[output_i]) |             if (cfg.DstFont == atlas->Fonts[output_i]) | ||||||
|                 src_tmp.DstIndex = output_i; |                 src_tmp.DstIndex = output_i; | ||||||
|         IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array? |  | ||||||
|         if (src_tmp.DstIndex == -1) |         if (src_tmp.DstIndex == -1) | ||||||
|  |         { | ||||||
|  |             IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array? | ||||||
|             return false; |             return false; | ||||||
|  |         } | ||||||
|         // Initialize helper structure for font loading and verify that the TTF/OTF data is correct |         // Initialize helper structure for font loading and verify that the TTF/OTF data is correct | ||||||
|         const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); |         const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); | ||||||
|         IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found."); |         IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found."); | ||||||
|   | |||||||
| @@ -1906,7 +1906,7 @@ typedef ImU8 ImGuiTableDrawChannelIdx; | |||||||
|  |  | ||||||
| // [Internal] sizeof() ~ 104 | // [Internal] sizeof() ~ 104 | ||||||
| // We use the terminology "Enabled" to refer to a column that is not Hidden by user/api. | // We use the terminology "Enabled" to refer to a column that is not Hidden by user/api. | ||||||
| // We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.  | // We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping. | ||||||
| // This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". | // This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". | ||||||
| struct ImGuiTableColumn | struct ImGuiTableColumn | ||||||
| { | { | ||||||
| @@ -2022,7 +2022,7 @@ struct ImGuiTable | |||||||
|     float                       ResizeLockMinContentsX2;    // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. |     float                       ResizeLockMinContentsX2;    // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. | ||||||
|     float                       RefScale;                   // Reference scale to be able to rescale columns on font/dpi changes. |     float                       RefScale;                   // Reference scale to be able to rescale columns on font/dpi changes. | ||||||
|     ImRect                      OuterRect;                  // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). |     ImRect                      OuterRect;                  // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). | ||||||
|     ImRect                      InnerRect;                  // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is  |     ImRect                      InnerRect;                  // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is | ||||||
|     ImRect                      WorkRect; |     ImRect                      WorkRect; | ||||||
|     ImRect                      InnerClipRect; |     ImRect                      InnerClipRect; | ||||||
|     ImRect                      BgClipRect;                 // We use this to cpu-clip cell background color fill |     ImRect                      BgClipRect;                 // We use this to cpu-clip cell background color fill | ||||||
|   | |||||||
| @@ -1713,6 +1713,9 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     EndCombo(); |     EndCombo(); | ||||||
|  |     if (value_changed) | ||||||
|  |         MarkItemEdited(g.CurrentWindow->DC.LastItemId); | ||||||
|  |  | ||||||
|     return value_changed; |     return value_changed; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user