mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Merge branch 'master' into docking
# Conflicts: # imgui.cpp # imgui.h
This commit is contained in:
		| @@ -107,7 +107,10 @@ Breaking Changes: | ||||
|   - IsItemHoveredRect(), IsPosHoveringAnyWindow(), IsMouseHoveringAnyWindow(), IsMouseHoveringWindow() functions. | ||||
|   - IMGUI_ONCE_UPON_A_FRAME macro. | ||||
|   If you were still using the old names, read "API Breaking Changes" section of imgui.cpp to find out | ||||
|   the new names and equivalent. | ||||
|   the new names or equivalent features. | ||||
| - Renamed ImFontAtlas::CustomRect to ImFontAtlasCustomRect. Kept redirection typedef (will obsolete). | ||||
| - Removed TreeAdvanceToLabelPos() which is rarely used and only does SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()). | ||||
|   Kept redirection function (will obsolete). (#581, #324) | ||||
|  | ||||
| Other Changes: | ||||
| - Window: Fixed InnerClipRect right-most coordinates using wrong padding setting (introduced in 1.71). | ||||
| @@ -117,16 +120,23 @@ Other Changes: | ||||
|   would be disabled if ImGuiWindowFlags_NoScrollbar was set on the child window, which is not the case | ||||
|   any more. Forwarding can still be disabled by setting ImGuiWindowFlags_NoInputs. (amend #1502, #1380). | ||||
| - Scrollbar: Avoid overlapping the opposite side when window (often a child window) is forcibly too small. | ||||
| - Combo: Hide arrow when there's not enough space even for the square button. | ||||
| - TabBar: Fixed unfocused tab bar separator color (was using ImGuiCol_Tab, should use ImGuiCol_TabUnfocusedActive). | ||||
| - Word-wrapping: Fixed overzealous word-wrapping when glyph edge lands exactly on the limit. Because | ||||
|   of this, auto-fitting exactly unwrapped text would make it wrap. (fixes initial 1.15 commit, 78645a7d). | ||||
| - Scrolling: Added SetScrollHereX(), SetScrollFromPosX() for completeness. (#1580) [@kevreco] | ||||
| - Style: Attenuated default opacity of ImGuiCol_Separator in Classic and Light styles. | ||||
| - Style: Added style.ColorButtonButton (left/right, defaults to ImGuiDir_Right) to move the color button | ||||
|   of ColorEdit3/ColorEdit4 functions to either side of the inputs. | ||||
| - Misc: Added IMGUI_DISABLE_METRICS_WINDOW imconfig.h setting to explicitly compile out ShowMetricsWindow(). | ||||
| - Debug, Metrics: Added "Tools->Item Picker" tool which allow clicking on a widget to break in the debugger | ||||
|   within the item code. The tool calls IM_DEBUG_BREAK() which can be redefined in imconfig.h if needed. | ||||
| - ImDrawList: Fixed CloneOutput() helper crashing. (#1860) [@gviot] | ||||
| - ImDrawList::ChannelsSplit(), ImDrawListSplitter: Fixed an issue with merging draw commands between | ||||
|   channel 0 and 1. (#2624) | ||||
| - ImDrawListSplitter: Fixed memory leak when using low-level split api (was not affecting ImDrawList api, | ||||
|   also this type was added in 1.71 and not advertised as a public-facing feature). | ||||
| - Fonts: binary_to_compressed_c.cpp: Display an error message if failing to open/read the input font file. | ||||
| - Backends: SDL2: Added dummy ImGui_ImplSDL2_InitForD3D() function to make D3D support more visible. | ||||
|   (#2482, #2632) [@josiahmanson] | ||||
| - Examples: Added SDL2+DirectX11 example application. (#2632, #2612, #2482) [@vincenthamm] | ||||
| @@ -308,7 +318,7 @@ Breaking Changes: | ||||
| - Renamed ColorEdit/ColorPicker's ImGuiColorEditFlags_RGB/_HSV/_HEX flags to respectively | ||||
|   ImGuiColorEditFlags_DisplayRGB/_DisplayHSV/_DisplayHex. This is because the addition of | ||||
|   new flag ImGuiColorEditFlags_InputHSV makes the earlier one ambiguous. | ||||
|   Keep redirection enum values (will obsolete). (#2384) [@haldean] | ||||
|   Kept redirection enum values (will obsolete). (#2384) [@haldean] | ||||
| - Renamed GetOverlayDrawList() to GetForegroundDrawList(). Kept redirection function (will obsolete). (#2391) | ||||
|  | ||||
| Other Changes: | ||||
| @@ -453,7 +463,7 @@ Breaking Changes: | ||||
|   side-effect because the window would have ID zero. In particular it is causing problems in viewport/docking branches. | ||||
| - Renamed io.ConfigResizeWindowsFromEdges to io.ConfigWindowsResizeFromEdges and removed its [Beta] mark. | ||||
|   The addition of new configuration options in the Docking branch is pushing for a little reorganization of those names. | ||||
| - Renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Keep redirection typedef (will obsolete). | ||||
| - Renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Kept redirection typedef (will obsolete). | ||||
|  | ||||
| Other Changes: | ||||
|  | ||||
| @@ -1195,7 +1205,7 @@ Breaking Changes: | ||||
| - Removed `IsItemRectHovered()`, `IsWindowRectHovered()` recently introduced in 1.51 which were merely the more consistent/correct names for the above functions which are now obsolete anyway. (#1382) | ||||
| - Changed `IsWindowHovered()` default parameters behavior to return false if an item is active in another window (e.g. click-dragging item from another window to this window). You can use the newly introduced IsWindowHovered() flags to requests this specific behavior if you need it. (#1382) | ||||
| - Renamed imconfig.h's `IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS`/`IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS` to `IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS`/`IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS` for consistency. | ||||
| - Renamed ImFont::Glyph to ImFontGlyph. Keep redirection typedef (will obsolete). | ||||
| - Renamed ImFont::Glyph to ImFontGlyph. Kept redirection typedef (will obsolete). | ||||
|  | ||||
| Other Changes: | ||||
|  | ||||
|   | ||||
| @@ -102,7 +102,7 @@ Demo Binaries | ||||
| ------------- | ||||
|  | ||||
| You should be able to build the examples from sources (tested on Windows/Mac/Linux). If you don't, let me know! If you want to have a quick look at some Dear ImGui features, you can download Windows binaries of the demo app here: | ||||
| - [imgui-demo-binaries-20190219.zip](http://www.dearimgui.org/binaries/imgui-demo-binaries-20190219.zip) (Windows binaries, Dear ImGui 1.68 built 2019/02/19, master branch, 5 executables) | ||||
| - [imgui-demo-binaries-20190715.zip](http://www.dearimgui.org/binaries/imgui-demo-binaries-20190715.zip) (Windows binaries, Dear ImGui 1.72 WIP built 2019/07/15, master branch, 5 executables) | ||||
|  | ||||
| The demo applications are unfortunately not yet DPI aware so expect some blurriness on a 4K screen. For DPI awareness in your application, you can load/reload your font at different scale, and scale your Style with `style.ScaleAllSizes()`. | ||||
|  | ||||
| @@ -137,6 +137,7 @@ Frameworks: | ||||
| - Platform: GLFW, SDL, Win32, OSX, GLUT: [examples/](https://github.com/ocornut/imgui/tree/master/examples) | ||||
| - Framework: Allegro 5, Emscripten, Marmalade: [examples/](https://github.com/ocornut/imgui/tree/master/examples) | ||||
| - Unmerged PR: Android: [#421](https://github.com/ocornut/imgui/pull/421) | ||||
| - bsf: [bsfimgui](https://github.com/pgruenbacher/bsfImgui) | ||||
| - Cinder: [Cinder-ImGui](https://github.com/simongeilfus/Cinder-ImGui) | ||||
| - Cocos2d-x: [imguix](https://github.com/c0i/imguix), [#551](https://github.com/ocornut/imgui/issues/551) | ||||
| - Flexium: [FlexGUI](https://github.com/DXsmiley/FlexGUI) | ||||
|   | ||||
| @@ -33,12 +33,13 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i | ||||
|  - window/child: allow SetNextWindowContentSize() to work on child windows. | ||||
|  - window/clipping: some form of clipping when DisplaySize (or corresponding viewport) is zero. | ||||
|  - window/tab: add a way to signify that a window or docked window requires attention (e.g. blinking title bar). | ||||
|  ! scrolling: exposing horizontal scrolling with Shift+Wheel even when scrollbar is disabled expose lots of issues (#2424, #1463) | ||||
|  - scrolling: while holding down a scrollbar, try to keep the same contents visible (at least while not moving mouse) | ||||
|  - scrolling: allow immediately effective change of scroll after Begin() if we haven't appended items yet. | ||||
|  - scrolling/clipping: separator on the initial position of a window is not visible (cursorpos.y <= clippos.y). (2017-08-20: can't repro) | ||||
|  - scrolling/style: shadows on scrollable areas to denote that there is more contents | ||||
|  | ||||
|  - drawdata: make it easy to clone (or swap?) a ImDrawData so user can easily save that data if they use threaded rendering. | ||||
|  - drawdata: make it easy to clone (or swap?) a full ImDrawData so user can easily save that data if they use threaded rendering. (e.g. #2646) | ||||
|  ! drawlist: add calctextsize func to facilitate consistent code from user pov (currently need to use ImGui or ImFont alternatives!) | ||||
|  - drawlist: end-user probably can't call Clear() directly because we expect a texture to be pushed in the stack. | ||||
|  - drawlist: maintaining bounding box per command would allow to merge draw command when clipping isn't relied on (typical non-scrolling window or non-overflowing column would merge with previous command). | ||||
| @@ -231,23 +232,24 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i | ||||
|  - shortcuts: programmatically access shortcuts "Focus("&Save")) | ||||
|  - menus: menu-bar: main menu-bar could affect clamping of windows position (~ akin to modifying DisplayMin) | ||||
|  - menus: hovering from menu to menu on a menu-bar has 1 frame without any menu, which is a little annoying. ideally either 0 either longer. | ||||
|  - menus: could merge draw call in most cases (how about storing an optional aabb in ImDrawCmd to move the burden of merging in a single spot). | ||||
|  | ||||
|  - text: selectable text (for copy) as a generic feature (ItemFlags?) | ||||
|  - text: proper alignment options in imgui_internal.h | ||||
|  - text wrapped: figure out better way to use TextWrapped() in an always auto-resize context (tooltip, etc.) (#249) | ||||
|  - text: it's currently impossible to have a window title with "##". perhaps an official workaround would be nice. \ style inhibitor? non-visible ascii code to insert between #? | ||||
|  - text: provided a framed text helper, e.g. https://pastebin.com/1Laxy8bT | ||||
|  - text: refactor TextUnformatted (or underlying function) to more explicitly request if we need width measurement or not | ||||
|  - text link/url button: underlined. should api expose an ID or use text contents as ID? which colors enum to use? | ||||
|  - text/wrapped: should be a more first-class citizen, e.g. wrapped text within a Selectable with known width | ||||
|  - text/wrapped: figure out better way to use TextWrapped() in an always auto-resize context (tooltip, etc.) (#249) | ||||
|  | ||||
|  - tree node / optimization: avoid formatting when clipped. | ||||
|  - tree node: tree-node/header right-most side doesn't take account of horizontal scrolling. | ||||
|  - tree node: add treenode/treepush int variants? not there because (void*) cast from int warns on some platforms/settings? | ||||
|  - tree node: try to apply scrolling at time of TreePop() if node was just opened and end of node is past scrolling limits? | ||||
|  - tree node / selectable render mismatch which is visible if you use them both next to each other (e.g. cf. property viewer) | ||||
|  - tree node: tweak color scheme to distinguish headers from selected tree node (#581) | ||||
|  - tree node: leaf/non-leaf highlight mismatch. | ||||
|  - tree node: _NoIndentOnOpen flag? would require to store a per-depth bit mask to store info for pop (or whatever is cheaper) | ||||
|  - tree node/opt: could avoid formatting when clipped (flag assuming we don't care about width/height, assume single line height?) | ||||
|  | ||||
|  - settings: write more decent code to allow saving/loading new fields: columns, selected tree nodes? | ||||
|  - settings: api for per-tool simple persistent data (bool,int,float,columns sizes,etc.) in .ini file (#437) | ||||
|   | ||||
| @@ -76,6 +76,11 @@ | ||||
| //typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); | ||||
| //#define ImDrawCallback MyImDrawCallback | ||||
|  | ||||
| //---- Debug Tools | ||||
| // Use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging. | ||||
| //#define IM_DEBUG_BREAK  IM_ASSERT(0) | ||||
| //#define IM_DEBUG_BREAK  __debugbreak() | ||||
|  | ||||
| //---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. | ||||
| /* | ||||
| namespace ImGui | ||||
|   | ||||
							
								
								
									
										119
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										119
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -6,7 +6,7 @@ | ||||
| // Get latest version at https://github.com/ocornut/imgui | ||||
| // Releases change-log at https://github.com/ocornut/imgui/releases | ||||
| // Technical Support for Getting Started https://discourse.dearimgui.org/c/getting-started | ||||
| // Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/1269 | ||||
| // Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/2529 | ||||
|  | ||||
| // Developed by Omar Cornut and every direct or indirect contributors to the GitHub. | ||||
| // See LICENSE.txt for copyright and licensing details (standard MIT License). | ||||
| @@ -380,6 +380,8 @@ CODE | ||||
|  - 2019/XX/XX (1.XX) - Moved IME support functions from io.ImeSetInputScreenPosFn, io.ImeWindowHandle to the PlatformIO api. | ||||
|   | ||||
|  | ||||
|  - 2019/07/15 (1.72) - removed TreeAdvanceToLabelPos() which is rarely used and only does SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()). Kept redirection function (will obsolete). | ||||
|  - 2019/07/12 (1.72) - renamed ImFontAtlas::CustomRect to ImFontAtlasCustomRect. Kept redirection typedef (will obsolete). | ||||
|  - 2019/06/14 (1.72) - removed redirecting functions/enums names that were marked obsolete in 1.51 (June 2017): ImGuiCol_Column*, ImGuiSetCond_*, IsItemHoveredRect(), IsPosHoveringAnyWindow(), IsMouseHoveringAnyWindow(), IsMouseHoveringWindow(), IMGUI_ONCE_UPON_A_FRAME. Grep this log for details and new names. | ||||
|  - 2019/06/07 (1.71) - rendering of child window outer decorations (bg color, border, scrollbars) is now performed as part of the parent window. If you have | ||||
|                        overlapping child windows in a same parent, and relied on their relative z-order to be mapped to their submission order, this will affect your rendering. | ||||
| @@ -394,7 +396,7 @@ CODE | ||||
|  - 2019/02/14 (1.68) - made it illegal/assert when io.DisplayTime == 0.0f (with an exception for the first frame). If for some reason your time step calculation gives you a zero value, replace it with a dummy small value! | ||||
|  - 2019/02/01 (1.68) - removed io.DisplayVisibleMin/DisplayVisibleMax (which were marked obsolete and removed from viewport/docking branch already). | ||||
|  - 2019/01/06 (1.67) - renamed io.InputCharacters[], marked internal as was always intended. Please don't access directly, and use AddInputCharacter() instead! | ||||
|  - 2019/01/06 (1.67) - renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Keep redirection typedef (will obsolete). | ||||
|  - 2019/01/06 (1.67) - renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Kept redirection typedef (will obsolete). | ||||
|  - 2018/12/20 (1.67) - made it illegal to call Begin("") with an empty string. This somehow half-worked before but had various undesirable side-effects. | ||||
|  - 2018/12/10 (1.67) - renamed io.ConfigResizeWindowsFromEdges to io.ConfigWindowsResizeFromEdges as we are doing a large pass on configuration flags. | ||||
|  - 2018/10/12 (1.66) - renamed misc/stl/imgui_stl.* to misc/cpp/imgui_stdlib.* in prevision for other C++ helper files. | ||||
| @@ -467,7 +469,7 @@ CODE | ||||
|                          IsMouseHoveringWindow()    --> IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) [weird, old behavior] | ||||
|  - 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead! | ||||
|  - 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete). | ||||
|  - 2017/09/26 (1.52) - renamed ImFont::Glyph to ImFontGlyph. Keep redirection typedef (will obsolete). | ||||
|  - 2017/09/26 (1.52) - renamed ImFont::Glyph to ImFontGlyph. Kept redirection typedef (will obsolete). | ||||
|  - 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete). | ||||
|  - 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your binding if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)". | ||||
|  - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)! | ||||
| @@ -1190,6 +1192,7 @@ ImGuiStyle::ImGuiStyle() | ||||
|     GrabRounding            = 0.0f;             // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. | ||||
|     TabRounding             = 4.0f;             // Radius of upper corners of a tab. Set to 0.0f to have rectangular 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. | ||||
|     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. | ||||
|     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. | ||||
| @@ -1968,15 +1971,15 @@ ImU32 ImGui::GetColorU32(ImU32 col) | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| // std::lower_bound but without the bullshit | ||||
| static ImGuiStorage::Pair* LowerBound(ImVector<ImGuiStorage::Pair>& data, ImGuiID key) | ||||
| static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector<ImGuiStorage::ImGuiStoragePair>& data, ImGuiID key) | ||||
| { | ||||
|     ImGuiStorage::Pair* first = data.Data; | ||||
|     ImGuiStorage::Pair* last = data.Data + data.Size; | ||||
|     ImGuiStorage::ImGuiStoragePair* first = data.Data; | ||||
|     ImGuiStorage::ImGuiStoragePair* last = data.Data + data.Size; | ||||
|     size_t count = (size_t)(last - first); | ||||
|     while (count > 0) | ||||
|     { | ||||
|         size_t count2 = count >> 1; | ||||
|         ImGuiStorage::Pair* mid = first + count2; | ||||
|         ImGuiStorage::ImGuiStoragePair* mid = first + count2; | ||||
|         if (mid->key < key) | ||||
|         { | ||||
|             first = ++mid; | ||||
| @@ -1998,18 +2001,18 @@ void ImGuiStorage::BuildSortByKey() | ||||
|         static int IMGUI_CDECL PairCompareByID(const void* lhs, const void* rhs) | ||||
|         { | ||||
|             // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that. | ||||
|             if (((const Pair*)lhs)->key > ((const Pair*)rhs)->key) return +1; | ||||
|             if (((const Pair*)lhs)->key < ((const Pair*)rhs)->key) return -1; | ||||
|             if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1; | ||||
|             if (((const ImGuiStoragePair*)lhs)->key < ((const ImGuiStoragePair*)rhs)->key) return -1; | ||||
|             return 0; | ||||
|         } | ||||
|     }; | ||||
|     if (Data.Size > 1) | ||||
|         ImQsort(Data.Data, (size_t)Data.Size, sizeof(Pair), StaticFunc::PairCompareByID); | ||||
|         ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairCompareByID); | ||||
| } | ||||
|  | ||||
| int ImGuiStorage::GetInt(ImGuiID key, int default_val) const | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key); | ||||
|     ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|         return default_val; | ||||
|     return it->val_i; | ||||
| @@ -2022,7 +2025,7 @@ bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const | ||||
|  | ||||
| float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key); | ||||
|     ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|         return default_val; | ||||
|     return it->val_f; | ||||
| @@ -2030,7 +2033,7 @@ float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const | ||||
|  | ||||
| void* ImGuiStorage::GetVoidPtr(ImGuiID key) const | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key); | ||||
|     ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|         return NULL; | ||||
|     return it->val_p; | ||||
| @@ -2039,9 +2042,9 @@ void* ImGuiStorage::GetVoidPtr(ImGuiID key) const | ||||
| // References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. | ||||
| int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val) | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(Data, key); | ||||
|     ImGuiStoragePair* it = LowerBound(Data, key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|         it = Data.insert(it, Pair(key, default_val)); | ||||
|         it = Data.insert(it, ImGuiStoragePair(key, default_val)); | ||||
|     return &it->val_i; | ||||
| } | ||||
|  | ||||
| @@ -2052,27 +2055,27 @@ bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val) | ||||
|  | ||||
| float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val) | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(Data, key); | ||||
|     ImGuiStoragePair* it = LowerBound(Data, key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|         it = Data.insert(it, Pair(key, default_val)); | ||||
|         it = Data.insert(it, ImGuiStoragePair(key, default_val)); | ||||
|     return &it->val_f; | ||||
| } | ||||
|  | ||||
| void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val) | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(Data, key); | ||||
|     ImGuiStoragePair* it = LowerBound(Data, key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|         it = Data.insert(it, Pair(key, default_val)); | ||||
|         it = Data.insert(it, ImGuiStoragePair(key, default_val)); | ||||
|     return &it->val_p; | ||||
| } | ||||
|  | ||||
| // FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame) | ||||
| void ImGuiStorage::SetInt(ImGuiID key, int val) | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(Data, key); | ||||
|     ImGuiStoragePair* it = LowerBound(Data, key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|     { | ||||
|         Data.insert(it, Pair(key, val)); | ||||
|         Data.insert(it, ImGuiStoragePair(key, val)); | ||||
|         return; | ||||
|     } | ||||
|     it->val_i = val; | ||||
| @@ -2085,10 +2088,10 @@ void ImGuiStorage::SetBool(ImGuiID key, bool val) | ||||
|  | ||||
| void ImGuiStorage::SetFloat(ImGuiID key, float val) | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(Data, key); | ||||
|     ImGuiStoragePair* it = LowerBound(Data, key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|     { | ||||
|         Data.insert(it, Pair(key, val)); | ||||
|         Data.insert(it, ImGuiStoragePair(key, val)); | ||||
|         return; | ||||
|     } | ||||
|     it->val_f = val; | ||||
| @@ -2096,10 +2099,10 @@ void ImGuiStorage::SetFloat(ImGuiID key, float val) | ||||
|  | ||||
| void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val) | ||||
| { | ||||
|     ImGuiStorage::Pair* it = LowerBound(Data, key); | ||||
|     ImGuiStoragePair* it = LowerBound(Data, key); | ||||
|     if (it == Data.end() || it->key != key) | ||||
|     { | ||||
|         Data.insert(it, Pair(key, val)); | ||||
|         Data.insert(it, ImGuiStoragePair(key, val)); | ||||
|         return; | ||||
|     } | ||||
|     it->val_p = val; | ||||
| @@ -2140,7 +2143,7 @@ bool ImGuiTextFilter::Draw(const char* label, float width) | ||||
|     return value_changed; | ||||
| } | ||||
|  | ||||
| void ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>* out) const | ||||
| void ImGuiTextFilter::ImGuiTextRange::split(char separator, ImVector<ImGuiTextRange>* out) const | ||||
| { | ||||
|     out->resize(0); | ||||
|     const char* wb = b; | ||||
| @@ -2149,25 +2152,25 @@ void ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>* out) | ||||
|     { | ||||
|         if (*we == separator) | ||||
|         { | ||||
|             out->push_back(TextRange(wb, we)); | ||||
|             out->push_back(ImGuiTextRange(wb, we)); | ||||
|             wb = we + 1; | ||||
|         } | ||||
|         we++; | ||||
|     } | ||||
|     if (wb != we) | ||||
|         out->push_back(TextRange(wb, we)); | ||||
|         out->push_back(ImGuiTextRange(wb, we)); | ||||
| } | ||||
|  | ||||
| void ImGuiTextFilter::Build() | ||||
| { | ||||
|     Filters.resize(0); | ||||
|     TextRange input_range(InputBuf, InputBuf+strlen(InputBuf)); | ||||
|     ImGuiTextRange input_range(InputBuf, InputBuf+strlen(InputBuf)); | ||||
|     input_range.split(',', &Filters); | ||||
|  | ||||
|     CountGrep = 0; | ||||
|     for (int i = 0; i != Filters.Size; i++) | ||||
|     { | ||||
|         TextRange& f = Filters[i]; | ||||
|         ImGuiTextRange& f = Filters[i]; | ||||
|         while (f.b < f.e && ImCharIsBlankA(f.b[0])) | ||||
|             f.b++; | ||||
|         while (f.e > f.b && ImCharIsBlankA(f.e[-1])) | ||||
| @@ -2189,19 +2192,19 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const | ||||
|  | ||||
|     for (int i = 0; i != Filters.Size; i++) | ||||
|     { | ||||
|         const TextRange& f = Filters[i]; | ||||
|         const ImGuiTextRange& f = Filters[i]; | ||||
|         if (f.empty()) | ||||
|             continue; | ||||
|         if (f.b[0] == '-') | ||||
|         { | ||||
|             // Subtract | ||||
|             if (ImStristr(text, text_end, f.begin()+1, f.end()) != NULL) | ||||
|             if (ImStristr(text, text_end, f.b + 1, f.e) != NULL) | ||||
|                 return false; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // Grep | ||||
|             if (ImStristr(text, text_end, f.begin(), f.end()) != NULL) | ||||
|             if (ImStristr(text, text_end, f.b, f.e) != NULL) | ||||
|                 return true; | ||||
|         } | ||||
|     } | ||||
| @@ -2917,6 +2920,16 @@ void ImGui::SetHoveredID(ImGuiID id) | ||||
|     g.HoveredIdAllowOverlap = false; | ||||
|     if (id != 0 && g.HoveredIdPreviousFrame != id) | ||||
|         g.HoveredIdTimer = g.HoveredIdNotActiveTimer = 0.0f; | ||||
|  | ||||
|     // [DEBUG] Item Picker tool! | ||||
|     // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making | ||||
|     // the cost of this tool near-zero. We would get slightly better call-stack if we made the test in ItemAdd() | ||||
|     // but that would incur a slightly higher cost and may require us to hide this feature behind a define. | ||||
|     if (id != 0 && id == g.DebugBreakItemId) | ||||
|     { | ||||
|         IM_DEBUG_BREAK(); | ||||
|         g.DebugBreakItemId = 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ImGuiID ImGui::GetHoveredID() | ||||
| @@ -3590,7 +3603,7 @@ void ImGui::UpdateMouseWheel() | ||||
|  | ||||
|     // Zoom / Scale window | ||||
|     // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned. | ||||
|     if (g.IO.MouseWheel != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling && !g.HoveredWindow->Collapsed) | ||||
|     if (g.IO.MouseWheel != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling) | ||||
|     { | ||||
|         ImGuiWindow* window = g.HoveredWindow; | ||||
|         const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f); | ||||
| @@ -10252,6 +10265,8 @@ ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name) | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     g.SettingsWindows.push_back(ImGuiWindowSettings()); | ||||
|     ImGuiWindowSettings* settings = &g.SettingsWindows.back(); | ||||
|     if (const char* p = strstr(name, "###"))  // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() | ||||
|         name = p; | ||||
|     settings->Name = ImStrdup(name); | ||||
|     settings->ID = ImHashStr(name); | ||||
|     return settings; | ||||
| @@ -10448,10 +10463,7 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl | ||||
|     for (int i = 0; i != g.SettingsWindows.Size; i++) | ||||
|     { | ||||
|         const ImGuiWindowSettings* settings = &g.SettingsWindows[i]; | ||||
|         const char* name = settings->Name; | ||||
|         if (const char* p = strstr(name, "###"))  // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() | ||||
|             name = p; | ||||
|         buf->appendf("[%s][%s]\n", handler->TypeName, name); | ||||
|         buf->appendf("[%s][%s]\n", handler->TypeName, settings->Name); | ||||
|         if (settings->ViewportId != 0 && settings->ViewportId != ImGui::IMGUI_VIEWPORT_DEFAULT_ID) | ||||
|         { | ||||
|             buf->appendf("ViewportPos=%d,%d\n", (int)settings->ViewportPos.x, (int)settings->ViewportPos.y); | ||||
| @@ -14836,7 +14848,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|                     NodeColumns(&window->ColumnsStorage[n]); | ||||
|                 ImGui::TreePop(); | ||||
|             } | ||||
|             ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * (int)sizeof(ImGuiStorage::Pair)); | ||||
|             ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.size_in_bytes()); | ||||
|             ImGui::TreePop(); | ||||
|         } | ||||
|  | ||||
| @@ -14927,6 +14939,28 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|  | ||||
|     if (ImGui::TreeNode("Tools")) | ||||
|     { | ||||
|         static bool picking_enabled = false; | ||||
|         if (ImGui::Button("Item Picker..")) | ||||
|             picking_enabled = true; | ||||
|         if (picking_enabled) | ||||
|         { | ||||
|             const ImGuiID hovered_id = g.HoveredIdPreviousFrame; | ||||
|             ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); | ||||
|             if (ImGui::IsKeyPressedMap(ImGuiKey_Escape)) | ||||
|                 picking_enabled = false; | ||||
|             if (ImGui::IsMouseClicked(0) && hovered_id) | ||||
|             { | ||||
|                 g.DebugBreakItemId = hovered_id; | ||||
|                 picking_enabled = false; | ||||
|             } | ||||
|             ImGui::SetNextWindowBgAlpha(0.5f); | ||||
|             ImGui::BeginTooltip(); | ||||
|             ImGui::Text("HoveredId: 0x%08X", hovered_id); | ||||
|             ImGui::Text("Press ESC to abort picking."); | ||||
|             ImGui::TextColored(GetStyleColorVec4(hovered_id ? ImGuiCol_Text : ImGuiCol_TextDisabled), "Click to break in debugger!"); | ||||
|             ImGui::EndTooltip(); | ||||
|         } | ||||
|  | ||||
|         ImGui::Checkbox("Show windows begin order", &show_windows_begin_order); | ||||
|         ImGui::Checkbox("Show windows rectangles", &show_windows_rects); | ||||
|         ImGui::SameLine(); | ||||
| @@ -14972,10 +15006,11 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|     } | ||||
|     ImGui::End(); | ||||
| } | ||||
|  | ||||
| #else | ||||
| void ImGui::ShowMetricsWindow(bool*) | ||||
| { | ||||
| } | ||||
|  | ||||
| void ImGui::ShowMetricsWindow(bool*) { } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| void ImGui::ShowDockingDebug() | ||||
|   | ||||
							
								
								
									
										102
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -133,32 +133,31 @@ typedef void* ImTextureID;          // User data to identify a texture (this is | ||||
| typedef unsigned int ImGuiID;       // Unique ID used by widgets (typically hashed from a stack of string) | ||||
| typedef unsigned short ImWchar;     // A single U16 character for keyboard input/display. We encode them as multi bytes UTF-8 when used in strings. | ||||
| typedef int ImGuiCol;               // -> enum ImGuiCol_             // Enum: A color identifier for styling | ||||
| typedef int ImGuiCond;              // -> enum ImGuiCond_            // Enum: A condition for Set*() | ||||
| typedef int ImGuiCond;              // -> enum ImGuiCond_            // Enum: A condition for many Set*() functions | ||||
| typedef int ImGuiDataType;          // -> enum ImGuiDataType_        // Enum: A primary data type | ||||
| typedef int ImGuiDir;               // -> enum ImGuiDir_             // Enum: A cardinal direction | ||||
| typedef int ImGuiKey;               // -> enum ImGuiKey_             // Enum: A key identifier (ImGui-side enum) | ||||
| typedef int ImGuiNavInput;          // -> enum ImGuiNavInput_        // Enum: An input identifier for navigation | ||||
| typedef int ImGuiMouseCursor;       // -> enum ImGuiMouseCursor_     // Enum: A mouse cursor identifier | ||||
| typedef int ImGuiStyleVar;          // -> enum ImGuiStyleVar_        // Enum: A variable identifier for styling | ||||
| typedef int ImDrawCornerFlags;      // -> enum ImDrawCornerFlags_    // Flags: for ImDrawList::AddRect*() etc. | ||||
| typedef int ImDrawCornerFlags;      // -> enum ImDrawCornerFlags_    // Flags: for ImDrawList::AddRect(), AddRectFilled() etc. | ||||
| typedef int ImDrawListFlags;        // -> enum ImDrawListFlags_      // Flags: for ImDrawList | ||||
| typedef int ImFontAtlasFlags;       // -> enum ImFontAtlasFlags_     // Flags: for ImFontAtlas | ||||
| typedef int ImGuiBackendFlags;      // -> enum ImGuiBackendFlags_    // Flags: for io.BackendFlags | ||||
| typedef int ImGuiColorEditFlags;    // -> enum ImGuiColorEditFlags_  // Flags: for ColorEdit*(), ColorPicker*() | ||||
| typedef int ImGuiColumnsFlags;      // -> enum ImGuiColumnsFlags_    // Flags: for Columns(), BeginColumns() | ||||
| typedef int ImGuiColorEditFlags;    // -> enum ImGuiColorEditFlags_  // Flags: for ColorEdit4(), ColorPicker4() etc. | ||||
| typedef int ImGuiConfigFlags;       // -> enum ImGuiConfigFlags_     // Flags: for io.ConfigFlags | ||||
| typedef int ImGuiComboFlags;        // -> enum ImGuiComboFlags_      // Flags: for BeginCombo() | ||||
| typedef int ImGuiDockNodeFlags;     // -> enum ImGuiDockNodeFlags_   // Flags: for DockSpace()                    | ||||
| typedef int ImGuiDragDropFlags;     // -> enum ImGuiDragDropFlags_   // Flags: for *DragDrop*() | ||||
| typedef int ImGuiDragDropFlags;     // -> enum ImGuiDragDropFlags_   // Flags: for BeginDragDropSource(), AcceptDragDropPayload() | ||||
| typedef int ImGuiFocusedFlags;      // -> enum ImGuiFocusedFlags_    // Flags: for IsWindowFocused() | ||||
| typedef int ImGuiHoveredFlags;      // -> enum ImGuiHoveredFlags_    // Flags: for IsItemHovered(), IsWindowHovered() etc. | ||||
| typedef int ImGuiInputTextFlags;    // -> enum ImGuiInputTextFlags_  // Flags: for InputText*() | ||||
| typedef int ImGuiInputTextFlags;    // -> enum ImGuiInputTextFlags_  // Flags: for InputText(), InputTextMultiline() | ||||
| typedef int ImGuiSelectableFlags;   // -> enum ImGuiSelectableFlags_ // Flags: for Selectable() | ||||
| typedef int ImGuiTabBarFlags;       // -> enum ImGuiTabBarFlags_     // Flags: for BeginTabBar() | ||||
| typedef int ImGuiTabItemFlags;      // -> enum ImGuiTabItemFlags_    // Flags: for BeginTabItem() | ||||
| typedef int ImGuiTreeNodeFlags;     // -> enum ImGuiTreeNodeFlags_   // Flags: for TreeNode*(),CollapsingHeader() | ||||
| typedef int ImGuiTreeNodeFlags;     // -> enum ImGuiTreeNodeFlags_   // Flags: for TreeNode(), TreeNodeEx(), CollapsingHeader() | ||||
| typedef int ImGuiViewportFlags;     // -> enum ImGuiViewportFlags_   // Flags: for ImGuiViewport | ||||
| typedef int ImGuiWindowFlags;       // -> enum ImGuiWindowFlags_     // Flags: for Begin*() | ||||
| typedef int ImGuiWindowFlags;       // -> enum ImGuiWindowFlags_     // Flags: for Begin(), BeginChild() | ||||
| typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData *data); | ||||
| typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data); | ||||
|  | ||||
| @@ -509,7 +508,6 @@ namespace ImGui | ||||
|     IMGUI_API void          TreePush(const char* str_id);                                       // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. | ||||
|     IMGUI_API void          TreePush(const void* ptr_id = NULL);                                // " | ||||
|     IMGUI_API void          TreePop();                                                          // ~ Unindent()+PopId() | ||||
|     IMGUI_API void          TreeAdvanceToLabelPos();                                            // advance cursor x position by GetTreeNodeToLabelSpacing() | ||||
|     IMGUI_API float         GetTreeNodeToLabelSpacing();                                        // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode | ||||
|     IMGUI_API bool          CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0);  // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). | ||||
|     IMGUI_API bool          CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags = 0); // when 'p_open' isn't NULL, display an additional small close button on upper right of the header | ||||
| @@ -926,7 +924,7 @@ enum ImGuiHoveredFlags_ | ||||
|     ImGuiHoveredFlags_AllowWhenBlockedByPopup       = 1 << 3,   // Return true even if a popup window is normally blocking access to this item/window | ||||
|     //ImGuiHoveredFlags_AllowWhenBlockedByModal     = 1 << 4,   // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet. | ||||
|     ImGuiHoveredFlags_AllowWhenBlockedByActiveItem  = 1 << 5,   // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns. | ||||
|     ImGuiHoveredFlags_AllowWhenOverlapped           = 1 << 6,   // Return true even if the position is overlapped by another window | ||||
|     ImGuiHoveredFlags_AllowWhenOverlapped           = 1 << 6,   // Return true even if the position is obstructed or overlapped by another window | ||||
|     ImGuiHoveredFlags_AllowWhenDisabled             = 1 << 7,   // Return true even if the item is disabled | ||||
|     ImGuiHoveredFlags_RectOnly                      = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped, | ||||
|     ImGuiHoveredFlags_RootAndChildWindows           = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows | ||||
| @@ -957,7 +955,7 @@ enum ImGuiDragDropFlags_ | ||||
| // A primary data type | ||||
| enum ImGuiDataType_ | ||||
| { | ||||
|     ImGuiDataType_S8,       // char | ||||
|     ImGuiDataType_S8,       // signed char / char (with sensible compilers) | ||||
|     ImGuiDataType_U8,       // unsigned char | ||||
|     ImGuiDataType_S16,      // short | ||||
|     ImGuiDataType_U16,      // unsigned short | ||||
| @@ -1111,7 +1109,7 @@ enum ImGuiCol_ | ||||
|     ImGuiCol_Button, | ||||
|     ImGuiCol_ButtonHovered, | ||||
|     ImGuiCol_ButtonActive, | ||||
|     ImGuiCol_Header, | ||||
|     ImGuiCol_Header,                // Header* colors are used for CollapsingHeader, TreeNode, Selectable, MenuItem | ||||
|     ImGuiCol_HeaderHovered, | ||||
|     ImGuiCol_HeaderActive, | ||||
|     ImGuiCol_Separator, | ||||
| @@ -1375,6 +1373,7 @@ struct ImGuiStyle | ||||
|     float       GrabRounding;               // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. | ||||
|     float       TabRounding;                // Radius of upper corners of a tab. Set to 0.0f to have rectangular 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. | ||||
|     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      DisplayWindowPadding;       // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. | ||||
| @@ -1416,7 +1415,7 @@ struct ImGuiIO | ||||
|     float       KeyRepeatRate;                  // = 0.050f         // When holding a key/button, rate at which it repeats, in seconds. | ||||
|     void*       UserData;                       // = NULL           // Store your own data for retrieval by callbacks. | ||||
|  | ||||
|     ImFontAtlas*Fonts;                          // <auto>           // Load, rasterize and pack one or more fonts into a single texture. | ||||
|     ImFontAtlas*Fonts;                          // <auto>           // Font atlas: load, rasterize and pack one or more fonts into a single texture. | ||||
|     float       FontGlobalScale;                // = 1.0f           // Global scale all fonts | ||||
|     bool        FontAllowUserScaling;           // = false          // Allow user scaling text of individual window with CTRL+Wheel. | ||||
|     ImFont*     FontDefault;                    // = NULL           // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0]. | ||||
| @@ -1625,8 +1624,10 @@ struct ImGuiWindowClass | ||||
| #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS | ||||
| namespace ImGui | ||||
| { | ||||
|     // OBSOLETED in 1.72 (from July 2019) | ||||
|     static inline void  TreeAdvanceToLabelPos()               { SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()); } | ||||
|     // OBSOLETED in 1.71 (from June 2019) | ||||
|     static inline void SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0)   { SetNextItemOpen(open, cond); } | ||||
|     static inline void  SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0) { SetNextItemOpen(open, cond); } | ||||
|     // OBSOLETED in 1.70 (from May 2019) | ||||
|     static inline float GetContentRegionAvailWidth()          { return GetContentRegionAvail().x; } | ||||
|     // OBSOLETED in 1.69 (from Mar 2019) | ||||
| @@ -1684,21 +1685,19 @@ struct ImGuiTextFilter | ||||
|     bool                IsActive() const { return !Filters.empty(); } | ||||
|  | ||||
|     // [Internal] | ||||
|     struct TextRange | ||||
|     struct ImGuiTextRange | ||||
|     { | ||||
|         const char* b; | ||||
|         const char* e; | ||||
|         const char*     b; | ||||
|         const char*     e; | ||||
|  | ||||
|         TextRange() { b = e = NULL; } | ||||
|         TextRange(const char* _b, const char* _e) { b = _b; e = _e; } | ||||
|         const char*     begin() const   { return b; } | ||||
|         const char*     end () const    { return e; } | ||||
|         bool            empty() const   { return b == e; } | ||||
|         IMGUI_API void  split(char separator, ImVector<TextRange>* out) const; | ||||
|         ImGuiTextRange()                                { b = e = NULL; } | ||||
|         ImGuiTextRange(const char* _b, const char* _e)  { b = _b; e = _e; } | ||||
|         bool            empty() const                   { return b == e; } | ||||
|         IMGUI_API void  split(char separator, ImVector<ImGuiTextRange>* out) const; | ||||
|     }; | ||||
|     char                InputBuf[256]; | ||||
|     ImVector<TextRange> Filters; | ||||
|     int                 CountGrep; | ||||
|     char                    InputBuf[256]; | ||||
|     ImVector<ImGuiTextRange>Filters; | ||||
|     int                     CountGrep; | ||||
| }; | ||||
|  | ||||
| // Helper: Growable text buffer for logging/accumulating text | ||||
| @@ -1732,15 +1731,17 @@ struct ImGuiTextBuffer | ||||
| // Types are NOT stored, so it is up to you to make sure your Key don't collide with different types. | ||||
| struct ImGuiStorage | ||||
| { | ||||
|     struct Pair | ||||
|     // [Internal] | ||||
|     struct ImGuiStoragePair | ||||
|     { | ||||
|         ImGuiID key; | ||||
|         union { int val_i; float val_f; void* val_p; }; | ||||
|         Pair(ImGuiID _key, int _val_i)   { key = _key; val_i = _val_i; } | ||||
|         Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } | ||||
|         Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } | ||||
|         ImGuiStoragePair(ImGuiID _key, int _val_i)      { key = _key; val_i = _val_i; } | ||||
|         ImGuiStoragePair(ImGuiID _key, float _val_f)    { key = _key; val_f = _val_f; } | ||||
|         ImGuiStoragePair(ImGuiID _key, void* _val_p)    { key = _key; val_p = _val_p; } | ||||
|     }; | ||||
|     ImVector<Pair>      Data; | ||||
|  | ||||
|     ImVector<ImGuiStoragePair>      Data; | ||||
|  | ||||
|     // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N) | ||||
|     // - Set***() functions find pair, insertion on demand if missing. | ||||
| @@ -2121,6 +2122,19 @@ struct ImFontGlyphRangesBuilder | ||||
|     IMGUI_API void  BuildRanges(ImVector<ImWchar>* out_ranges);                 // Output new ranges | ||||
| }; | ||||
|  | ||||
| // See ImFontAtlas::AddCustomRectXXX functions. | ||||
| struct ImFontAtlasCustomRect | ||||
| { | ||||
|     unsigned int    ID;             // Input    // User ID. Use <0x10000 to map into a font glyph, >=0x10000 for other/internal/custom texture data. | ||||
|     unsigned short  Width, Height;  // Input    // Desired rectangle dimension | ||||
|     unsigned short  X, Y;           // Output   // Packed position in Atlas | ||||
|     float           GlyphAdvanceX;  // Input    // For custom font glyphs only (ID<0x10000): glyph xadvance | ||||
|     ImVec2          GlyphOffset;    // Input    // For custom font glyphs only (ID<0x10000): glyph display offset | ||||
|     ImFont*         Font;           // Input    // For custom font glyphs only (ID<0x10000): target font | ||||
|     ImFontAtlasCustomRect()         { ID = 0xFFFFFFFF; Width = Height = 0; X = Y = 0xFFFF; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0,0); Font = NULL; } | ||||
|     bool IsPacked() const           { return X != 0xFFFF; } | ||||
| }; | ||||
|  | ||||
| enum ImFontAtlasFlags_ | ||||
| { | ||||
|     ImFontAtlasFlags_None               = 0, | ||||
| @@ -2185,7 +2199,7 @@ struct ImFontAtlas | ||||
|     IMGUI_API const ImWchar*    GetGlyphRangesChineseSimplifiedCommon();// Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese | ||||
|     IMGUI_API const ImWchar*    GetGlyphRangesCyrillic();               // Default + about 400 Cyrillic characters | ||||
|     IMGUI_API const ImWchar*    GetGlyphRangesThai();                   // Default + Thai characters | ||||
|     IMGUI_API const ImWchar*    GetGlyphRangesVietnamese();             // Default + Vietname characters | ||||
|     IMGUI_API const ImWchar*    GetGlyphRangesVietnamese();             // Default + Vietnamese characters | ||||
|  | ||||
|     //------------------------------------------- | ||||
|     // [BETA] Custom Rectangles/Glyphs API | ||||
| @@ -2196,24 +2210,13 @@ struct ImFontAtlas | ||||
|     // You can also request your rectangles to be mapped as font glyph (given a font + Unicode point),  | ||||
|     // so you can render e.g. custom colorful icons and use them as regular glyphs. | ||||
|     // Read misc/fonts/README.txt for more details about using colorful icons. | ||||
|     struct CustomRect | ||||
|     { | ||||
|         unsigned int    ID;             // Input    // User ID. Use <0x10000 to map into a font glyph, >=0x10000 for other/internal/custom texture data. | ||||
|         unsigned short  Width, Height;  // Input    // Desired rectangle dimension | ||||
|         unsigned short  X, Y;           // Output   // Packed position in Atlas | ||||
|         float           GlyphAdvanceX;  // Input    // For custom font glyphs only (ID<0x10000): glyph xadvance | ||||
|         ImVec2          GlyphOffset;    // Input    // For custom font glyphs only (ID<0x10000): glyph display offset | ||||
|         ImFont*         Font;           // Input    // For custom font glyphs only (ID<0x10000): target font | ||||
|         CustomRect()            { ID = 0xFFFFFFFF; Width = Height = 0; X = Y = 0xFFFF; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0,0); Font = NULL; } | ||||
|         bool IsPacked() const   { return X != 0xFFFF; } | ||||
|     }; | ||||
|     IMGUI_API int       AddCustomRectRegular(unsigned int id, int width, int height);                                                                   // Id needs to be >= 0x10000. Id >= 0x80000000 are reserved for ImGui and ImDrawList | ||||
|     IMGUI_API int       AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0,0));   // Id needs to be < 0x10000 to register a rectangle to map into a specific font. | ||||
|     const CustomRect*   GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; } | ||||
|     IMGUI_API int               AddCustomRectRegular(unsigned int id, int width, int height);                                                                   // Id needs to be >= 0x10000. Id >= 0x80000000 are reserved for ImGui and ImDrawList | ||||
|     IMGUI_API int               AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0,0));   // Id needs to be < 0x10000 to register a rectangle to map into a specific font. | ||||
|     const ImFontAtlasCustomRect*GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; } | ||||
|  | ||||
|     // [Internal] | ||||
|     IMGUI_API void      CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max); | ||||
|     IMGUI_API bool      GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]); | ||||
|     IMGUI_API void              CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max); | ||||
|     IMGUI_API bool              GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]); | ||||
|  | ||||
|     //------------------------------------------- | ||||
|     // Members | ||||
| @@ -2234,11 +2237,12 @@ struct ImFontAtlas | ||||
|     ImVec2                      TexUvScale;         // = (1.0f/TexWidth, 1.0f/TexHeight) | ||||
|     ImVec2                      TexUvWhitePixel;    // Texture coordinates to a white pixel | ||||
|     ImVector<ImFont*>           Fonts;              // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font. | ||||
|     ImVector<CustomRect>        CustomRects;        // Rectangles for packing custom texture data into the atlas. | ||||
|     ImVector<ImFontAtlasCustomRect> CustomRects;    // Rectangles for packing custom texture data into the atlas. | ||||
|     ImVector<ImFontConfig>      ConfigData;         // Internal data | ||||
|     int                         CustomRectIds[1];   // Identifiers of custom texture rectangle used by ImFontAtlas/ImDrawList | ||||
|  | ||||
| #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS | ||||
|     typedef ImFontAtlasCustomRect    CustomRect;         // OBSOLETED in 1.72+ | ||||
|     typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+ | ||||
| #endif | ||||
| }; | ||||
|   | ||||
| @@ -683,7 +683,7 @@ static void ShowDemoWindowWidgets() | ||||
|                 { | ||||
|                     // Items 3..5 are Tree Leaves | ||||
|                     // The only reason we use TreeNode at all is to allow selection of the leaf. | ||||
|                     // Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text(). | ||||
|                     // Otherwise we can use BulletText() or advance the cursor by GetTreeNodeToLabelSpacing() and call Text(). | ||||
|                     node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet | ||||
|                     ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i); | ||||
|                     if (ImGui::IsItemClicked()) | ||||
| @@ -1200,7 +1200,7 @@ static void ShowDemoWindowWidgets() | ||||
|  | ||||
|         static ImVec4 backup_color; | ||||
|         bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags); | ||||
|         ImGui::SameLine(); | ||||
|         ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x); | ||||
|         open_popup |= ImGui::Button("Palette"); | ||||
|         if (open_popup) | ||||
|         { | ||||
| @@ -2664,6 +2664,7 @@ static void ShowDemoWindowColumns() | ||||
|                 ImGui::Separator(); | ||||
|             ImGui::Text("%c%c%c", 'a' + i, 'a' + i, 'a' + i); | ||||
|             ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); | ||||
|             ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); | ||||
|             ImGui::Text("Offset %.2f", ImGui::GetColumnOffset()); | ||||
|             ImGui::Text("Long text that is likely to clip"); | ||||
|             ImGui::Button("Button", ImVec2(-FLT_MIN, 0.0f)); | ||||
| @@ -3229,6 +3230,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) | ||||
|             ImGui::Text("Alignment"); | ||||
|             ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f"); | ||||
|             ImGui::Combo("WindowMenuButtonPosition", (int*)&style.WindowMenuButtonPosition, "Left\0Right\0"); | ||||
|             ImGui::Combo("ColorButtonPosition", (int*)&style.ColorButtonPosition, "Left\0Right\0"); | ||||
|             ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content."); | ||||
|             ImGui::SliderFloat2("SelectableTextAlign", (float*)&style.SelectableTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content."); | ||||
|             ImGui::Text("Safe Area Padding"); ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured)."); | ||||
|   | ||||
| @@ -1726,7 +1726,7 @@ int ImFontAtlas::AddCustomRectRegular(unsigned int id, int width, int height) | ||||
|     IM_ASSERT(id >= 0x10000); | ||||
|     IM_ASSERT(width > 0 && width <= 0xFFFF); | ||||
|     IM_ASSERT(height > 0 && height <= 0xFFFF); | ||||
|     CustomRect r; | ||||
|     ImFontAtlasCustomRect r; | ||||
|     r.ID = id; | ||||
|     r.Width = (unsigned short)width; | ||||
|     r.Height = (unsigned short)height; | ||||
| @@ -1739,7 +1739,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int | ||||
|     IM_ASSERT(font != NULL); | ||||
|     IM_ASSERT(width > 0 && width <= 0xFFFF); | ||||
|     IM_ASSERT(height > 0 && height <= 0xFFFF); | ||||
|     CustomRect r; | ||||
|     ImFontAtlasCustomRect r; | ||||
|     r.ID = id; | ||||
|     r.Width = (unsigned short)width; | ||||
|     r.Height = (unsigned short)height; | ||||
| @@ -1750,7 +1750,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int | ||||
|     return CustomRects.Size - 1; // Return index | ||||
| } | ||||
|  | ||||
| void ImFontAtlas::CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) | ||||
| void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) | ||||
| { | ||||
|     IM_ASSERT(TexWidth > 0 && TexHeight > 0);   // Font atlas needs to be built before we can calculate UV coordinates | ||||
|     IM_ASSERT(rect->IsPacked());                // Make sure the rectangle has been packed | ||||
| @@ -1766,7 +1766,7 @@ bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* ou | ||||
|         return false; | ||||
|  | ||||
|     IM_ASSERT(CustomRectIds[0] != -1); | ||||
|     ImFontAtlas::CustomRect& r = CustomRects[CustomRectIds[0]]; | ||||
|     ImFontAtlasCustomRect& r = CustomRects[CustomRectIds[0]]; | ||||
|     IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID); | ||||
|     ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r.X, (float)r.Y); | ||||
|     ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][1]; | ||||
| @@ -2125,7 +2125,7 @@ void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opa | ||||
|     stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque; | ||||
|     IM_ASSERT(pack_context != NULL); | ||||
|  | ||||
|     ImVector<ImFontAtlas::CustomRect>& user_rects = atlas->CustomRects; | ||||
|     ImVector<ImFontAtlasCustomRect>& user_rects = atlas->CustomRects; | ||||
|     IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong. | ||||
|  | ||||
|     ImVector<stbrp_rect> pack_rects; | ||||
| @@ -2151,7 +2151,7 @@ static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas) | ||||
| { | ||||
|     IM_ASSERT(atlas->CustomRectIds[0] >= 0); | ||||
|     IM_ASSERT(atlas->TexPixelsAlpha8 != NULL); | ||||
|     ImFontAtlas::CustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]]; | ||||
|     ImFontAtlasCustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]]; | ||||
|     IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID); | ||||
|     IM_ASSERT(r.IsPacked()); | ||||
|  | ||||
| @@ -2186,7 +2186,7 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas) | ||||
|     // Register custom rectangle glyphs | ||||
|     for (int i = 0; i < atlas->CustomRects.Size; i++) | ||||
|     { | ||||
|         const ImFontAtlas::CustomRect& r = atlas->CustomRects[i]; | ||||
|         const ImFontAtlasCustomRect& r = atlas->CustomRects[i]; | ||||
|         if (r.Font == NULL || r.ID > 0x10000) | ||||
|             continue; | ||||
|  | ||||
|   | ||||
| @@ -95,6 +95,7 @@ struct ImGuiWindowSettings;         // Storage for window settings stored in .in | ||||
| typedef int ImGuiDataAuthority;         // -> enum ImGuiDataAuthority_      // Enum: for storing the source authority (dock node vs window) of a field | ||||
| typedef int ImGuiLayoutType;            // -> enum ImGuiLayoutType_         // Enum: Horizontal or vertical | ||||
| typedef int ImGuiButtonFlags;           // -> enum ImGuiButtonFlags_        // Flags: for ButtonEx(), ButtonBehavior() | ||||
| typedef int ImGuiColumnsFlags;          // -> enum ImGuiColumnsFlags_       // Flags: BeginColumns() | ||||
| typedef int ImGuiDragFlags;             // -> enum ImGuiDragFlags_          // Flags: for DragBehavior() | ||||
| typedef int ImGuiItemFlags;             // -> enum ImGuiItemFlags_          // Flags: for PushItemFlag() | ||||
| typedef int ImGuiItemStatusFlags;       // -> enum ImGuiItemStatusFlags_    // Flags: for DC.LastItemStatusFlags | ||||
| @@ -408,7 +409,7 @@ enum ImGuiItemStatusFlags_ | ||||
|     ImGuiItemStatusFlags_Deactivated        = 1 << 5    // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. | ||||
|  | ||||
| #ifdef IMGUI_ENABLE_TEST_ENGINE | ||||
|     , // [imgui-test only] | ||||
|     , // [imgui_tests only] | ||||
|     ImGuiItemStatusFlags_Openable           = 1 << 10,  // | ||||
|     ImGuiItemStatusFlags_Opened             = 1 << 11,  // | ||||
|     ImGuiItemStatusFlags_Checkable          = 1 << 12,  // | ||||
| @@ -1177,6 +1178,9 @@ struct ImGuiContext | ||||
|     int                     LogDepthToExpand; | ||||
|     int                     LogDepthToExpandDefault;            // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. | ||||
|  | ||||
|     // Debug Tools | ||||
|     ImGuiID                 DebugBreakItemId; | ||||
|  | ||||
|     // Misc | ||||
|     float                   FramerateSecPerFrame[120];          // Calculate estimate of framerate for user over the last 2 seconds. | ||||
|     int                     FramerateSecPerFrameIdx; | ||||
| @@ -1310,6 +1314,8 @@ struct ImGuiContext | ||||
|         LogDepthRef = 0; | ||||
|         LogDepthToExpand = LogDepthToExpandDefault = 2; | ||||
|  | ||||
|         DebugBreakItemId = 0; | ||||
|  | ||||
|         memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); | ||||
|         FramerateSecPerFrameIdx = 0; | ||||
|         FramerateSecPerFrameAccum = 0.0f; | ||||
| @@ -1891,7 +1897,19 @@ IMGUI_API void              ImFontAtlasBuildFinish(ImFontAtlas* atlas); | ||||
| IMGUI_API void              ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor); | ||||
| IMGUI_API void              ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride); | ||||
|  | ||||
| // Test engine hooks (imgui-test) | ||||
| // Debug Tools | ||||
| // Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item. | ||||
| #ifndef IM_DEBUG_BREAK       | ||||
| #if defined(__clang__) | ||||
| #define IM_DEBUG_BREAK()    __builtin_debugtrap() | ||||
| #elif defined (_MSC_VER) | ||||
| #define IM_DEBUG_BREAK()    __debugbreak() | ||||
| #else | ||||
| #define IM_DEBUG_BREAK()    IM_ASSERT(0)    // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger! | ||||
| #endif | ||||
| #endif // #ifndef IM_DEBUG_BREAK | ||||
|  | ||||
| // Test Engine Hooks (imgui_tests) | ||||
| //#define IMGUI_ENABLE_TEST_ENGINE | ||||
| #ifdef IMGUI_ENABLE_TEST_ENGINE | ||||
| extern void                 ImGuiTestEngineHook_PreNewFrame(ImGuiContext* ctx); | ||||
|   | ||||
| @@ -1462,7 +1462,8 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF | ||||
|         ImU32 bg_col = GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button); | ||||
|         ImU32 text_col = GetColorU32(ImGuiCol_Text); | ||||
|         window->DrawList->AddRectFilled(ImVec2(value_x2, frame_bb.Min.y), frame_bb.Max, bg_col, style.FrameRounding, (w <= arrow_size) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Right); | ||||
|         RenderArrow(window->DrawList, ImVec2(value_x2 + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), text_col, ImGuiDir_Down); | ||||
|         if (value_x2 + arrow_size - style.FramePadding.x <= frame_bb.Max.x) | ||||
|             RenderArrow(window->DrawList, ImVec2(value_x2 + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), text_col, ImGuiDir_Down, 1.0f); | ||||
|     } | ||||
|     RenderFrameBorder(frame_bb.Min, frame_bb.Max, style.FrameRounding); | ||||
|     if (preview_value != NULL && !(flags & ImGuiComboFlags_NoPreview)) | ||||
| @@ -4169,8 +4170,9 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     const ImGuiStyle& style = g.Style; | ||||
|     const float square_sz = GetFrameHeight(); | ||||
|     const float w_extra = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); | ||||
|     const float w_items_all = CalcItemWidth() - w_extra; | ||||
|     const float w_full = CalcItemWidth(); | ||||
|     const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); | ||||
|     const float w_inputs = w_full - w_button; | ||||
|     const char* label_display_end = FindRenderedTextEnd(label); | ||||
|     g.NextItemData.ClearFlags(); | ||||
|  | ||||
| @@ -4214,11 +4216,15 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | ||||
|     bool value_changed = false; | ||||
|     bool value_changed_as_float = false; | ||||
|  | ||||
|     const ImVec2 pos = window->DC.CursorPos; | ||||
|     const float inputs_offset_x = (style.ColorButtonPosition == ImGuiDir_Left) ? w_button : 0.0f; | ||||
|     window->DC.CursorPos.x = pos.x + inputs_offset_x; | ||||
|  | ||||
|     if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) | ||||
|     { | ||||
|         // RGB/HSV 0..255 Sliders | ||||
|         const float w_item_one  = ImMax(1.0f, (float)(int)((w_items_all - (style.ItemInnerSpacing.x) * (components-1)) / (float)components)); | ||||
|         const float w_item_last = ImMax(1.0f, (float)(int)(w_items_all - (w_item_one + style.ItemInnerSpacing.x) * (components-1))); | ||||
|         const float w_item_one  = ImMax(1.0f, (float)(int)((w_inputs - (style.ItemInnerSpacing.x) * (components-1)) / (float)components)); | ||||
|         const float w_item_last = ImMax(1.0f, (float)(int)(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components-1))); | ||||
|  | ||||
|         const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); | ||||
|         static const char* ids[4] = { "##X", "##Y", "##Z", "##W" }; | ||||
| @@ -4262,7 +4268,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | ||||
|             ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255), ImClamp(i[3],0,255)); | ||||
|         else | ||||
|             ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255)); | ||||
|         SetNextItemWidth(w_items_all); | ||||
|         SetNextItemWidth(w_inputs); | ||||
|         if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase)) | ||||
|         { | ||||
|             value_changed = true; | ||||
| @@ -4282,8 +4288,8 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | ||||
|     ImGuiWindow* picker_active_window = NULL; | ||||
|     if (!(flags & ImGuiColorEditFlags_NoSmallPreview)) | ||||
|     { | ||||
|         if (!(flags & ImGuiColorEditFlags_NoInputs)) | ||||
|             SameLine(0, style.ItemInnerSpacing.x); | ||||
|         const float button_offset_x = ((flags & ImGuiColorEditFlags_NoInputs) || (style.ColorButtonPosition == ImGuiDir_Left)) ? 0.0f : w_inputs + style.ItemInnerSpacing.x; | ||||
|         window->DC.CursorPos = ImVec2(pos.x + button_offset_x, pos.y); | ||||
|  | ||||
|         const ImVec4 col_v4(col[0], col[1], col[2], alpha ? col[3] : 1.0f); | ||||
|         if (ColorButton("##ColorButton", col_v4, flags)) | ||||
| @@ -4317,7 +4323,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | ||||
|  | ||||
|     if (label != label_display_end && !(flags & ImGuiColorEditFlags_NoLabel)) | ||||
|     { | ||||
|         SameLine(0, style.ItemInnerSpacing.x); | ||||
|         window->DC.CursorPos = ImVec2(pos.x + w_full + style.ItemInnerSpacing.x, pos.y + style.FramePadding.y); | ||||
|         TextEx(label, label_display_end); | ||||
|     } | ||||
|  | ||||
| @@ -5022,7 +5028,6 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl | ||||
| // - TreeNodeBehavior() [Internal] | ||||
| // - TreePush() | ||||
| // - TreePop() | ||||
| // - TreeAdvanceToLabelPos() | ||||
| // - GetTreeNodeToLabelSpacing() | ||||
| // - SetNextItemOpen() | ||||
| // - CollapsingHeader() | ||||
| @@ -5270,13 +5275,13 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l | ||||
|         window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledSelection; | ||||
|  | ||||
|     // Render | ||||
|     const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); | ||||
|     const ImU32 text_col = GetColorU32(ImGuiCol_Text); | ||||
|     const ImVec2 text_pos = frame_bb.Min + ImVec2(text_offset_x, text_base_offset_y); | ||||
|     ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin; | ||||
|     if (display_frame) | ||||
|     { | ||||
|         // Framed type | ||||
|         const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); | ||||
|         RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding); | ||||
|         RenderNavHighlight(frame_bb, id, nav_highlight_flags); | ||||
|         RenderArrow(window->DrawList, frame_bb.Min + ImVec2(padding.x, text_base_offset_y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); | ||||
| @@ -5301,6 +5306,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l | ||||
|         // Unframed typed for tree nodes | ||||
|         if (hovered || selected) | ||||
|         { | ||||
|             const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); | ||||
|             RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false); | ||||
|             RenderNavHighlight(frame_bb, id, nav_highlight_flags); | ||||
|         } | ||||
| @@ -5363,12 +5369,6 @@ void ImGui::TreePop() | ||||
|     PopID(); | ||||
| } | ||||
|  | ||||
| void ImGui::TreeAdvanceToLabelPos() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     g.CurrentWindow->DC.CursorPos.x += GetTreeNodeToLabelSpacing(); | ||||
| } | ||||
|  | ||||
| // Horizontal distance preceding label when using TreeNode() or Bullet() | ||||
| float ImGui::GetTreeNodeToLabelSpacing() | ||||
| { | ||||
| @@ -6380,7 +6380,7 @@ bool    ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG | ||||
|     window->DC.CursorPos.x = tab_bar->BarRect.Min.x; | ||||
|  | ||||
|     // Draw separator | ||||
|     const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_Tab); | ||||
|     const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive); | ||||
|     const float y = tab_bar->BarRect.Max.y - 1.0f; | ||||
|     if (dock_node != NULL) | ||||
|     { | ||||
|   | ||||
| @@ -48,12 +48,15 @@ int main(int argc, char** argv) | ||||
|         else if (strcmp(argv[argn], "-nocompress") == 0) { use_compression = false; argn++; } | ||||
|         else | ||||
|         { | ||||
|             printf("Unknown argument: '%s'\n", argv[argn]); | ||||
|             fprintf(stderr, "Unknown argument: '%s'\n", argv[argn]); | ||||
|             return 1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return binary_to_compressed_c(argv[argn], argv[argn+1], use_base85_encoding, use_compression) ? 0 : 1; | ||||
|     bool ret = binary_to_compressed_c(argv[argn], argv[argn+1], use_base85_encoding, use_compression); | ||||
|     if (!ret) | ||||
|         fprintf(stderr, "Error opening or reading file: '%s'\n", argv[argn]); | ||||
|     return ret ? 0 : 1; | ||||
| } | ||||
|  | ||||
| char Encode85Byte(unsigned int x) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user