mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Selectable: Allow using ImGuiSelectableFlags_SpanAllColumns in other columns than first. Comments. (#125)
This commit is contained in:
		| @@ -46,6 +46,7 @@ Other Changes: | |||||||
| - InputText: Fixed password fields displaying ASCII spaces as blanks instead of using the '*' | - InputText: Fixed password fields displaying ASCII spaces as blanks instead of using the '*' | ||||||
|   glyph. (#2149, #515) |   glyph. (#2149, #515) | ||||||
| - Selectable: Fixed honoring style.SelectableTextAlign with unspecified size. (#2347, #2601) | - Selectable: Fixed honoring style.SelectableTextAlign with unspecified size. (#2347, #2601) | ||||||
|  | - Selectable: Allow using ImGuiSelectableFlags_SpanAllColumns in other columns than first. (#125) | ||||||
| - Scrolling: Fixed scrolling centering API leading to non-integer scrolling values and initial | - Scrolling: Fixed scrolling centering API leading to non-integer scrolling values and initial | ||||||
|   cursor position. This would often get fixed after the fix item submission, but using the |   cursor position. This would often get fixed after the fix item submission, but using the | ||||||
|   ImGuiListClipper as the first thing after Begin() could largely break size calculations. (#3073) |   ImGuiListClipper as the first thing after Begin() could largely break size calculations. (#3073) | ||||||
|   | |||||||
| @@ -71,11 +71,12 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i | |||||||
|  - widgets: alignment options in style (e.g. center Selectable, Right-Align within Button, etc.) #1260 |  - widgets: alignment options in style (e.g. center Selectable, Right-Align within Button, etc.) #1260 | ||||||
|  - widgets: activate by identifier (trigger button, focus given id) |  - widgets: activate by identifier (trigger button, focus given id) | ||||||
|  - widgets: a way to represent "mixed" values, so e.g. all values replaced with *, including check-boxes, colors, etc. with support for multi-components widgets (e.g. SliderFloat3, make only "Y" mixed) (#2644) |  - widgets: a way to represent "mixed" values, so e.g. all values replaced with *, including check-boxes, colors, etc. with support for multi-components widgets (e.g. SliderFloat3, make only "Y" mixed) (#2644) | ||||||
|  - widgets: selectable: generic BeginSelectable()/EndSelectable() mechanism. |  | ||||||
|  - widgets: selectable: a way to visualize partial/mixed selection (e.g. parent tree node has children with mixed selection) |  | ||||||
|  - widgets: checkbox: checkbox with custom glyph inside frame. |  - widgets: checkbox: checkbox with custom glyph inside frame. | ||||||
|  - widgets: coloredit: keep reporting as active when picker is on? |  - widgets: coloredit: keep reporting as active when picker is on? | ||||||
|  - widgets: group/scalarn functions: expose more per-component information. e.g. store NextItemData.ComponentIdx set by scalarn function, groups can expose them back somehow. |  - widgets: group/scalarn functions: expose more per-component information. e.g. store NextItemData.ComponentIdx set by scalarn function, groups can expose them back somehow. | ||||||
|  |  - selectable: using (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. | ||||||
|  |  - selectable: generic BeginSelectable()/EndSelectable() mechanism. | ||||||
|  |  - selectable: a way to visualize partial/mixed selection (e.g. parent tree node has children with mixed selection) | ||||||
|  |  | ||||||
|  - input text: clean up the mess caused by converting UTF-8 <> wchar. the code is rather inefficient right now and super fragile. |  - input text: clean up the mess caused by converting UTF-8 <> wchar. the code is rather inefficient right now and super fragile. | ||||||
|  - input text: reorganize event handling, allow CharFilter to modify buffers, allow multiple events? (#541) |  - input text: reorganize event handling, allow CharFilter to modify buffers, allow multiple events? (#541) | ||||||
|   | |||||||
| @@ -1023,7 +1023,7 @@ ImGuiStyle::ImGuiStyle() | |||||||
|     TabBorderSize           = 0.0f;             // Thickness of border around tabs. |     TabBorderSize           = 0.0f;             // Thickness of border around tabs. | ||||||
|     ColorButtonPosition     = ImGuiDir_Right;   // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. |     ColorButtonPosition     = ImGuiDir_Right;   // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. | ||||||
|     ButtonTextAlign         = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. |     ButtonTextAlign         = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. | ||||||
|     SelectableTextAlign     = ImVec2(0.0f,0.0f);// Alignment of selectable text when button is larger than text. |     SelectableTextAlign     = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. | ||||||
|     DisplayWindowPadding    = ImVec2(19,19);    // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. |     DisplayWindowPadding    = ImVec2(19,19);    // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. | ||||||
|     DisplaySafeAreaPadding  = ImVec2(3,3);      // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. |     DisplaySafeAreaPadding  = ImVec2(3,3);      // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. | ||||||
|     MouseCursorScale        = 1.0f;             // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. |     MouseCursorScale        = 1.0f;             // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -1141,8 +1141,12 @@ enum ImGuiCol_ | |||||||
| }; | }; | ||||||
|  |  | ||||||
| // Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure. | // Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure. | ||||||
| // NB: the enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. During initialization, feel free to just poke into ImGuiStyle directly. | // - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code.  | ||||||
| // NB: if changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. | //   During initialization or between frames, feel free to just poke into ImGuiStyle directly. | ||||||
|  | // - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description. | ||||||
|  | //   In Visual Studio IDE: CTRL+comma ("Edit.NavigateTo") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. | ||||||
|  | //   With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. | ||||||
|  | // - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. | ||||||
| enum ImGuiStyleVar_ | enum ImGuiStyleVar_ | ||||||
| { | { | ||||||
|     // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) |     // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) | ||||||
| @@ -1387,7 +1391,7 @@ struct ImGuiStyle | |||||||
|     float       TabBorderSize;              // Thickness of border around tabs. |     float       TabBorderSize;              // Thickness of border around tabs. | ||||||
|     ImGuiDir    ColorButtonPosition;        // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. |     ImGuiDir    ColorButtonPosition;        // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. | ||||||
|     ImVec2      ButtonTextAlign;            // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered). |     ImVec2      ButtonTextAlign;            // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered). | ||||||
|     ImVec2      SelectableTextAlign;        // Alignment of selectable text when selectable is larger than text. Defaults to (0.0f, 0.0f) (top-left aligned). |     ImVec2      SelectableTextAlign;        // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. | ||||||
|     ImVec2      DisplayWindowPadding;       // Window position are clamped to be visible within the display area by at least this amount. Only applies to regular windows. |     ImVec2      DisplayWindowPadding;       // Window position are clamped to be visible within the display area by at least this amount. Only applies to regular windows. | ||||||
|     ImVec2      DisplaySafeAreaPadding;     // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! |     ImVec2      DisplaySafeAreaPadding;     // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! | ||||||
|     float       MouseCursorScale;           // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. |     float       MouseCursorScale;           // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. | ||||||
|   | |||||||
| @@ -643,9 +643,9 @@ static void ShowDemoWindowWidgets() | |||||||
|             static bool align_label_with_current_x_position = false; |             static bool align_label_with_current_x_position = false; | ||||||
|             ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_OpenOnArrow); |             ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_OpenOnArrow); | ||||||
|             ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick); |             ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick); | ||||||
|             ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); |             ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker("Extend hit area to all available width instead of allowing more items to be layed out after the node."); | ||||||
|             ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_SpanFullWidth); |             ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_SpanFullWidth); | ||||||
|             ImGui::Checkbox("Align label with current X position)", &align_label_with_current_x_position); |             ImGui::Checkbox("Align label with current X position", &align_label_with_current_x_position); | ||||||
|             ImGui::Text("Hello!"); |             ImGui::Text("Hello!"); | ||||||
|             if (align_label_with_current_x_position) |             if (align_label_with_current_x_position) | ||||||
|                 ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing()); |                 ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing()); | ||||||
| @@ -980,7 +980,7 @@ static void ShowDemoWindowWidgets() | |||||||
|         } |         } | ||||||
|         if (ImGui::TreeNode("Alignment")) |         if (ImGui::TreeNode("Alignment")) | ||||||
|         { |         { | ||||||
|             HelpMarker("Alignment applies when a selectable is larger than its text content.\nBy default, Selectables uses style.SelectableTextAlign but it can be overriden on a per-item basis using PushStyleVar()."); |             HelpMarker("By default, Selectables uses style.SelectableTextAlign but it can be overriden on a per-item basis using PushStyleVar(). You'll probably want to always keep your default situation to left-align otherwise it becomes difficult to layout multiple items on a same line"); | ||||||
|             static bool selected[3*3] = { true, false, true, false, true, false, true, false, true }; |             static bool selected[3*3] = { true, false, true, false, true, false, true, false, true }; | ||||||
|             for (int y = 0; y < 3; y++) |             for (int y = 0; y < 3; y++) | ||||||
|             { |             { | ||||||
|   | |||||||
| @@ -5558,6 +5558,8 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags | |||||||
|  |  | ||||||
| // Tip: pass a non-visible label (e.g. "##dummy") then you can use the space to draw other text or image. | // Tip: pass a non-visible label (e.g. "##dummy") then you can use the space to draw other text or image. | ||||||
| // But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. | // But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. | ||||||
|  | // With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags. | ||||||
|  | // FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. | ||||||
| bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) | bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
| @@ -5579,13 +5581,17 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl | |||||||
|     ItemSize(size, 0.0f); |     ItemSize(size, 0.0f); | ||||||
|  |  | ||||||
|     // Fill horizontal space |     // Fill horizontal space | ||||||
|     const float max_x = (flags & ImGuiSelectableFlags_SpanAllColumns) ? GetWindowContentRegionMax().x + window->Pos.x : GetContentRegionMaxAbs().x; |     const float min_x = (flags & ImGuiSelectableFlags_SpanAllColumns) ? window->ContentRegionRect.Min.x : pos.x; | ||||||
|  |     const float max_x = (flags & ImGuiSelectableFlags_SpanAllColumns) ? window->ContentRegionRect.Max.x : GetContentRegionMaxAbs().x; | ||||||
|     if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth)) |     if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth)) | ||||||
|         size.x = ImMax(label_size.x, max_x - pos.x); |         size.x = ImMax(label_size.x, max_x - min_x); | ||||||
|     ImRect bb_align(pos, pos + size); |  | ||||||
|  |     // Text stays at the submission position, but bounding box may be extended on both sides | ||||||
|  |     const ImVec2 text_min = pos; | ||||||
|  |     const ImVec2 text_max(min_x + size.x, pos.y + size.y); | ||||||
|  |  | ||||||
|     // Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable. |     // Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable. | ||||||
|     ImRect bb_enlarged = bb_align; |     ImRect bb_enlarged(min_x, pos.y, text_max.x, text_max.y); | ||||||
|     const float spacing_x = style.ItemSpacing.x; |     const float spacing_x = style.ItemSpacing.x; | ||||||
|     const float spacing_y = style.ItemSpacing.y; |     const float spacing_y = style.ItemSpacing.y; | ||||||
|     const float spacing_L = IM_FLOOR(spacing_x * 0.50f); |     const float spacing_L = IM_FLOOR(spacing_x * 0.50f); | ||||||
| @@ -5665,7 +5671,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl | |||||||
|         PopColumnsBackground(); |         PopColumnsBackground(); | ||||||
|  |  | ||||||
|     if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); |     if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); | ||||||
|     RenderTextClipped(bb_align.Min, bb_align.Max, label, NULL, &label_size, style.SelectableTextAlign, &bb_enlarged); |     RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb_enlarged); | ||||||
|     if (flags & ImGuiSelectableFlags_Disabled) PopStyleColor(); |     if (flags & ImGuiSelectableFlags_Disabled) PopStyleColor(); | ||||||
|  |  | ||||||
|     // Automatically close popups |     // Automatically close popups | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user