mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-22 11:57:00 +00:00
Trim trailing whitespace (#305)
This commit is contained in:
parent
425c6cb3a3
commit
b1987d697f
224
imgui.cpp
224
imgui.cpp
@ -18,13 +18,13 @@
|
||||
- How do I update to a newer version of ImGui?
|
||||
- Can I have multiple widgets with the same label? Can I have widget without a label? (Yes)
|
||||
- Why is my text output blurry?
|
||||
- How can I load a different font than the default?
|
||||
- How can I load a different font than the default?
|
||||
- How can I load multiple fonts?
|
||||
- How can I display and input non-latin characters such as Chinese, Japanese, Korean, Cyrillic?
|
||||
- ISSUES & TODO-LIST
|
||||
- CODE
|
||||
|
||||
|
||||
|
||||
MISSION STATEMENT
|
||||
=================
|
||||
|
||||
@ -78,11 +78,11 @@
|
||||
|
||||
- getting started:
|
||||
- initialisation: call ImGui::GetIO() to retrieve the ImGuiIO structure and fill the 'Settings' data.
|
||||
- every frame:
|
||||
- every frame:
|
||||
1/ in your mainloop or right after you got your keyboard/mouse info, call ImGui::GetIO() and fill the 'Input' data, then call ImGui::NewFrame().
|
||||
2/ use any ImGui function you want between NewFrame() and Render()
|
||||
3/ ImGui::Render() to render all the accumulated command-lists. it will call your RenderDrawListFn handler that you set in the IO structure.
|
||||
- all rendering information are stored into command-lists until ImGui::Render() is called.
|
||||
- all rendering information are stored into command-lists until ImGui::Render() is called.
|
||||
- ImGui never touches or know about your GPU state. the only function that knows about GPU is the RenderDrawListFn handler that you must provide.
|
||||
- effectively it means you can create widgets at any time in your code, regardless of "update" vs "render" considerations.
|
||||
- refer to the examples applications in the examples/ folder for instruction on how to setup your code.
|
||||
@ -100,7 +100,7 @@
|
||||
unsigned char* pixels;
|
||||
int width, height, bytes_per_pixels;
|
||||
io.Fonts->GetTexDataAsRGBA32(pixels, &width, &height, &bytes_per_pixels);
|
||||
// TODO: copy texture to graphics memory.
|
||||
// TODO: copy texture to graphics memory.
|
||||
// TODO: store your texture pointer/identifier in 'io.Fonts->TexID'
|
||||
|
||||
// Application main loop
|
||||
@ -108,7 +108,7 @@
|
||||
{
|
||||
// 1) get low-level input
|
||||
// e.g. on Win32, GetKeyboardState(), or poll your events, etc.
|
||||
|
||||
|
||||
// 2) TODO: fill all fields of IO structure and call NewFrame
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
io.MousePos = mouse_pos;
|
||||
@ -139,7 +139,7 @@
|
||||
Occasionally introducing changes that are breaking the API. The breakage are generally minor and easy to fix.
|
||||
Here is a change-log of API breaking changes, if you are using one of the functions listed, expect to have to fix some code.
|
||||
Also read releases logs https://github.com/ocornut/imgui/releases for more details.
|
||||
|
||||
|
||||
- 2015/08/05 (1.44) - split imgui.cpp into extra files: imgui_demo.cpp imgui_draw.cpp imgui_internal.h that you need to add to your project.
|
||||
- 2015/07/18 (1.44) - fixed angles in ImDrawList::PathArcTo(), PathArcToFast() (introduced in 1.43) being off by an extra PI for no justifiable reason
|
||||
- 2015/07/14 (1.43) - add new ImFontAtlas::AddFont() API. For the old AddFont***, moved the 'font_no' parameter of ImFontAtlas::AddFont** functions to the ImFontConfig structure.
|
||||
@ -147,10 +147,10 @@
|
||||
- 2015/07/08 (1.43) - switched rendering data to use indexed rendering. this is saving a fair amount of CPU/GPU and enables us to get anti-aliasing for a marginal cost.
|
||||
this necessary change will break your rendering function! the fix should be very easy. sorry for that :(
|
||||
- if you are using a vanilla copy of one of the imgui_impl_XXXX.cpp provided in the example, you just need to update your copy and you can ignore the rest.
|
||||
- the signature of the io.RenderDrawListsFn handler has changed!
|
||||
- the signature of the io.RenderDrawListsFn handler has changed!
|
||||
ImGui_XXXX_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
|
||||
became:
|
||||
ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data).
|
||||
ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data).
|
||||
argument 'cmd_lists' -> 'draw_data->CmdLists'
|
||||
argument 'cmd_lists_count' -> 'draw_data->CmdListsCount'
|
||||
ImDrawList 'commands' -> 'CmdBuffer'
|
||||
@ -238,12 +238,12 @@
|
||||
|
||||
Q: Can I have multiple widgets with the same label? Can I have widget without a label? (Yes)
|
||||
A: Yes. A primer on the use of labels/IDs in ImGui..
|
||||
|
||||
|
||||
- Elements that are not clickable, such as Text() items don't need an ID.
|
||||
|
||||
- Interactive widgets require state to be carried over multiple frames (most typically ImGui often needs to remember what is the "active" widget).
|
||||
to do so they need an unique ID. unique ID are typically derived from a string label, an integer index or a pointer.
|
||||
|
||||
|
||||
Button("OK"); // Label = "OK", ID = hash of "OK"
|
||||
Button("Cancel"); // Label = "Cancel", ID = hash of "Cancel"
|
||||
|
||||
@ -320,7 +320,7 @@
|
||||
}
|
||||
|
||||
- when working with trees, ID are used to preserve the opened/closed state of each tree node.
|
||||
depending on your use cases you may want to use strings, indices or pointers as ID.
|
||||
depending on your use cases you may want to use strings, indices or pointers as ID.
|
||||
e.g. when displaying a single object that may change over time (1-1 relationship), using a static string as ID will preserve your node open/closed state when the targeted object change.
|
||||
e.g. when displaying a list of objects, using indices or pointers as ID will preserve the node open/closed state differently. experiment and see what makes more sense!
|
||||
|
||||
@ -381,7 +381,7 @@
|
||||
The list below consist mostly of notes of things to do before they are requested/discussed by users (at that point it usually happens on the github)
|
||||
|
||||
- window: autofit feedback loop when user relies on any dynamic layout (window width multiplier, column). maybe just clearly drop manual autofit?
|
||||
- window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to "clean" up from the global window list.
|
||||
- window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to "clean" up from the global window list.
|
||||
- window: allow resizing of child windows (possibly given min/max for each axis?)
|
||||
- window: background options for child windows, border option (disable rounding)
|
||||
- window: resizing from any sides? + mouse cursor directives for app.
|
||||
@ -391,7 +391,7 @@
|
||||
!- scrolling: allow immediately effective change of scroll if we haven't appended items yet
|
||||
- widgets: display mode: widget-label, label-widget (aligned on column or using fixed size), label-newline-tab-widget etc.
|
||||
- widgets: clean up widgets internal toward exposing everything.
|
||||
- widgets: add a disabled/read-only mode (#211)
|
||||
- widgets: add a disabled/read-only mode (#211)
|
||||
- main: considering adding EndFrame()/Init(). some constructs are awkward in the implementation because of the lack of them.
|
||||
- main: IsItemHovered() make it more consistent for various type of widgets, widgets with multiple components, etc. also effectively IsHovered() region sometimes differs from hot region, e.g tree nodes
|
||||
- main: IsItemHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode?
|
||||
@ -439,7 +439,7 @@
|
||||
- drag float: up/down axis
|
||||
- text edit: clean up the mess caused by converting UTF-8 <> wchar. the code is rather inefficient right now.
|
||||
- text edit: centered text for slider as input text so it matches typical positioning.
|
||||
- text edit: flag to disable live update of the user buffer.
|
||||
- text edit: flag to disable live update of the user buffer.
|
||||
- text edit: field resize behavior - field could stretch when being edited? hover tooltip shows more text?
|
||||
- tree: add treenode/treepush int variants? because (void*) cast from int warns on some platforms/settings
|
||||
- textwrapped: figure out better way to use TextWrapped() in an always auto-resize context (tooltip, etc.) (git issue #249)
|
||||
@ -502,7 +502,7 @@
|
||||
#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning : format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code.
|
||||
#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning : declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals.
|
||||
#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference it.
|
||||
#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness //
|
||||
#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness //
|
||||
#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning : function xx could be declared with attribute 'noreturn' warning // GetDefaultFontData() asserts which some implementation makes it never return.
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"// warning : 'xx' is deprecated: The POSIX name for this item.. // for strdup used in demo code (so user can copy & paste the code)
|
||||
#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning : cast to 'void *' from smaller integer type 'int'
|
||||
@ -820,30 +820,30 @@ int ImFormatStringV(char* buf, int buf_size, const char* fmt, va_list args)
|
||||
|
||||
// Pass data_size==0 for zero-terminated strings
|
||||
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
|
||||
ImU32 ImHash(const void* data, int data_size, ImU32 seed)
|
||||
{
|
||||
ImU32 ImHash(const void* data, int data_size, ImU32 seed)
|
||||
{
|
||||
static ImU32 crc32_lut[256] = { 0 };
|
||||
if (!crc32_lut[1])
|
||||
{
|
||||
const ImU32 polynomial = 0xEDB88320;
|
||||
for (ImU32 i = 0; i < 256; i++)
|
||||
{
|
||||
ImU32 crc = i;
|
||||
for (ImU32 j = 0; j < 8; j++)
|
||||
crc = (crc >> 1) ^ (ImU32(-int(crc & 1)) & polynomial);
|
||||
crc32_lut[i] = crc;
|
||||
for (ImU32 i = 0; i < 256; i++)
|
||||
{
|
||||
ImU32 crc = i;
|
||||
for (ImU32 j = 0; j < 8; j++)
|
||||
crc = (crc >> 1) ^ (ImU32(-int(crc & 1)) & polynomial);
|
||||
crc32_lut[i] = crc;
|
||||
}
|
||||
}
|
||||
|
||||
seed = ~seed;
|
||||
ImU32 crc = seed;
|
||||
ImU32 crc = seed;
|
||||
const unsigned char* current = (const unsigned char*)data;
|
||||
|
||||
if (data_size > 0)
|
||||
{
|
||||
// Known size
|
||||
while (data_size--)
|
||||
crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *current++];
|
||||
while (data_size--)
|
||||
crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *current++];
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -852,7 +852,7 @@ ImU32 ImHash(const void* data, int data_size, ImU32 seed)
|
||||
{
|
||||
// We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed.
|
||||
// Because this syntax is rarely used we are optimizing for the common case.
|
||||
// - If we reach ### in the string we discard the hash so far and reset to the seed.
|
||||
// - If we reach ### in the string we discard the hash so far and reset to the seed.
|
||||
// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller.
|
||||
if (c == '#' && current[0] == '#' && current[1] == '#')
|
||||
crc = seed;
|
||||
@ -860,8 +860,8 @@ ImU32 ImHash(const void* data, int data_size, ImU32 seed)
|
||||
crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c];
|
||||
}
|
||||
}
|
||||
return ~crc;
|
||||
}
|
||||
return ~crc;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// ImText* helpers
|
||||
@ -880,10 +880,10 @@ int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char*
|
||||
*out_char = c;
|
||||
return 1;
|
||||
}
|
||||
if ((*str & 0xe0) == 0xc0)
|
||||
if ((*str & 0xe0) == 0xc0)
|
||||
{
|
||||
*out_char = 0;
|
||||
if (in_text_end && in_text_end - (const char*)str < 2) return 0;
|
||||
if (in_text_end && in_text_end - (const char*)str < 2) return 0;
|
||||
if (*str < 0xc2) return 0;
|
||||
c = (unsigned int)((*str++ & 0x1f) << 6);
|
||||
if ((*str & 0xc0) != 0x80) return 0;
|
||||
@ -891,7 +891,7 @@ int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char*
|
||||
*out_char = c;
|
||||
return 2;
|
||||
}
|
||||
if ((*str & 0xf0) == 0xe0)
|
||||
if ((*str & 0xf0) == 0xe0)
|
||||
{
|
||||
*out_char = 0;
|
||||
if (in_text_end && in_text_end - (const char*)str < 3) return 0;
|
||||
@ -905,7 +905,7 @@ int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char*
|
||||
*out_char = c;
|
||||
return 3;
|
||||
}
|
||||
if ((*str & 0xf8) == 0xf0)
|
||||
if ((*str & 0xf8) == 0xf0)
|
||||
{
|
||||
*out_char = 0;
|
||||
if (in_text_end && in_text_end - (const char*)str < 4) return 0;
|
||||
@ -965,12 +965,12 @@ int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end)
|
||||
// Based on stb_to_utf8() from github.com/nothings/stb/
|
||||
static inline int ImTextCharToUtf8(char* buf, int buf_size, unsigned int c)
|
||||
{
|
||||
if (c < 0x80)
|
||||
if (c < 0x80)
|
||||
{
|
||||
buf[0] = (char)c;
|
||||
return 1;
|
||||
}
|
||||
if (c < 0x800)
|
||||
}
|
||||
if (c < 0x800)
|
||||
{
|
||||
if (buf_size < 2) return 0;
|
||||
buf[0] = (char)(0xc0 + (c >> 6));
|
||||
@ -980,8 +980,8 @@ static inline int ImTextCharToUtf8(char* buf, int buf_size, unsigned int c)
|
||||
if (c >= 0xdc00 && c < 0xe000)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (c >= 0xd800 && c < 0xdc00)
|
||||
}
|
||||
if (c >= 0xd800 && c < 0xdc00)
|
||||
{
|
||||
if (buf_size < 4) return 0;
|
||||
buf[0] = (char)(0xf0 + (c >> 18));
|
||||
@ -1073,7 +1073,7 @@ void ImGui::ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float&
|
||||
// Convert hsv floats ([0-1],[0-1],[0-1]) to rgb floats ([0-1],[0-1],[0-1]), from Foley & van Dam p593
|
||||
// also http://en.wikipedia.org/wiki/HSL_and_HSV
|
||||
void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b)
|
||||
{
|
||||
{
|
||||
if (s == 0.0f)
|
||||
{
|
||||
// gray
|
||||
@ -1366,7 +1366,7 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const
|
||||
// ImGuiTextBuffer
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// On some platform vsnprintf() takes va_list by reference and modifies it.
|
||||
// On some platform vsnprintf() takes va_list by reference and modifies it.
|
||||
// va_copy is the 'correct' way to copy a va_list but Visual Studio prior to 2013 doesn't have it.
|
||||
#ifndef va_copy
|
||||
#define va_copy(dest, src) (dest = src)
|
||||
@ -1406,12 +1406,12 @@ void ImGuiTextBuffer::append(const char* fmt, ...)
|
||||
// ImGuiSimpleColumns
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
ImGuiSimpleColumns::ImGuiSimpleColumns()
|
||||
{
|
||||
Count = 0;
|
||||
Spacing = Width = NextWidth = 0.0f;
|
||||
memset(Pos, 0, sizeof(Pos));
|
||||
memset(NextWidths, 0, sizeof(NextWidths));
|
||||
ImGuiSimpleColumns::ImGuiSimpleColumns()
|
||||
{
|
||||
Count = 0;
|
||||
Spacing = Width = NextWidth = 0.0f;
|
||||
memset(Pos, 0, sizeof(Pos));
|
||||
memset(NextWidths, 0, sizeof(NextWidths));
|
||||
}
|
||||
|
||||
void ImGuiSimpleColumns::Update(int count, float spacing, bool clear)
|
||||
@ -1454,7 +1454,7 @@ float ImGuiSimpleColumns::CalcExtraSpace(float avail_w)
|
||||
ImGuiWindow::ImGuiWindow(const char* name)
|
||||
{
|
||||
Name = ImStrdup(name);
|
||||
ID = ImHash(name, 0);
|
||||
ID = ImHash(name, 0);
|
||||
IDStack.push_back(ID);
|
||||
MoveID = GetID("#MOVE");
|
||||
|
||||
@ -1547,10 +1547,10 @@ ImGuiWindow* ImGui::GetParentWindow()
|
||||
return g.CurrentWindowStack[g.CurrentWindowStack.Size - 2];
|
||||
}
|
||||
|
||||
void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window = NULL)
|
||||
void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window = NULL)
|
||||
{
|
||||
ImGuiState& g = *GImGui;
|
||||
g.ActiveId = id;
|
||||
g.ActiveId = id;
|
||||
g.ActiveIdIsFocusedOnly = false;
|
||||
g.ActiveIdIsJustActivated = true;
|
||||
g.ActiveIdWindow = window;
|
||||
@ -1587,8 +1587,8 @@ void ImGui::ItemSize(const ImVec2& size, float text_offset_y)
|
||||
}
|
||||
|
||||
void ImGui::ItemSize(const ImRect& bb, float text_offset_y)
|
||||
{
|
||||
ItemSize(bb.GetSize(), text_offset_y);
|
||||
{
|
||||
ItemSize(bb.GetSize(), text_offset_y);
|
||||
}
|
||||
|
||||
// Declare item bounding box for clipping and interaction.
|
||||
@ -2242,11 +2242,11 @@ void ImGui::Render()
|
||||
|
||||
const bool first_render_of_the_frame = (g.FrameCountRendered != g.FrameCount);
|
||||
g.FrameCountRendered = g.FrameCount;
|
||||
|
||||
|
||||
if (first_render_of_the_frame)
|
||||
{
|
||||
// Hide implicit "Debug" window if it hasn't been used
|
||||
IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin/End
|
||||
IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin/End
|
||||
if (g.CurrentWindow && !g.CurrentWindow->Accessed)
|
||||
g.CurrentWindow->Active = false;
|
||||
ImGui::End();
|
||||
@ -2584,7 +2584,7 @@ void ImGui::RenderCollapseTriangle(ImVec2 p_min, bool opened, float scale, bool
|
||||
b = center + ImVec2(-0.500f,0.866f)*r;
|
||||
c = center + ImVec2(-0.500f,-0.866f)*r;
|
||||
}
|
||||
|
||||
|
||||
if (shadow && (window->Flags & ImGuiWindowFlags_ShowBorders) != 0)
|
||||
window->DrawList->AddTriangleFilled(a+ImVec2(2,2), b+ImVec2(2,2), c+ImVec2(2,2), window->Color(ImGuiCol_BorderShadow));
|
||||
window->DrawList->AddTriangleFilled(a, b, c, window->Color(ImGuiCol_Text));
|
||||
@ -2628,7 +2628,7 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex
|
||||
ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL);
|
||||
|
||||
// Cancel out character spacing for the last character of a line (it is baked into glyph->XAdvance field)
|
||||
const float font_scale = font_size / font->FontSize;
|
||||
const float font_scale = font_size / font->FontSize;
|
||||
const float character_spacing_x = 1.0f * font_scale;
|
||||
if (text_size.x > 0.0f)
|
||||
text_size.x -= character_spacing_x;
|
||||
@ -2636,7 +2636,7 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex
|
||||
return text_size;
|
||||
}
|
||||
|
||||
// Helper to calculate coarse clipping of large list of evenly sized items.
|
||||
// Helper to calculate coarse clipping of large list of evenly sized items.
|
||||
// NB: Prefer using the ImGuiListClipper higher-level helper if you can!
|
||||
// NB: 'items_count' is only used to clamp the result, if you don't know your count you can use INT_MAX
|
||||
// If you are displaying thousands of items and you have a random access to the list, you can perform clipping yourself to save on CPU.
|
||||
@ -3234,7 +3234,7 @@ void ImGui::EndChild()
|
||||
sz.x = ImMax(4.0f, sz.x - g.Style.WindowPadding.x);
|
||||
if (window->Flags & ImGuiWindowFlags_ChildWindowAutoFitY)
|
||||
sz.y = ImMax(4.0f, sz.y - g.Style.WindowPadding.y);
|
||||
|
||||
|
||||
ImGui::End();
|
||||
|
||||
window = GetCurrentWindow();
|
||||
@ -3281,7 +3281,7 @@ static ImVec2 FindBestPopupWindowPos(const ImVec2& base_pos, const ImVec2& size,
|
||||
const ImGuiStyle& style = GImGui->Style;
|
||||
|
||||
// Clamp into visible area while not overlapping the cursor
|
||||
ImRect r_outer(GetVisibleRect());
|
||||
ImRect r_outer(GetVisibleRect());
|
||||
r_outer.Reduce(style.DisplaySafeAreaPadding);
|
||||
ImVec2 base_pos_clamped = ImClamp(base_pos, r_outer.Min, r_outer.Max - size);
|
||||
|
||||
@ -3381,11 +3381,11 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
|
||||
return window;
|
||||
}
|
||||
|
||||
// Push a new ImGui window to add widgets to.
|
||||
// Push a new ImGui window to add widgets to.
|
||||
// - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair.
|
||||
// - Begin/End can be called multiple times during the frame with the same window name to append content.
|
||||
// - 'size_on_first_use' for a regular window denote the initial size for first-time creation (no saved data) and isn't that useful. Use SetNextWindowSize() prior to calling Begin() for more flexible window manipulation.
|
||||
// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file).
|
||||
// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file).
|
||||
// You can use the "##" or "###" markers to use the same label with different id, or same id with different label. See documentation at the top of this file.
|
||||
// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned.
|
||||
// - Passing 'bool* p_opened' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed.
|
||||
@ -3414,7 +3414,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
|
||||
window_is_new = true;
|
||||
}
|
||||
window->Flags = (ImGuiWindowFlags)flags;
|
||||
|
||||
|
||||
// Add to stack
|
||||
ImGuiWindow* parent_window = !g.CurrentWindowStack.empty() ? g.CurrentWindowStack.back() : NULL;
|
||||
g.CurrentWindowStack.push_back(window);
|
||||
@ -3839,7 +3839,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
|
||||
window->DC.ChildWindows.resize(0);
|
||||
window->DC.LayoutType = ImGuiLayoutType_Vertical;
|
||||
window->DC.ItemWidth = window->ItemWidthDefault;
|
||||
window->DC.ItemWidthStack.resize(0);
|
||||
window->DC.ItemWidthStack.resize(0);
|
||||
window->DC.ButtonRepeat = false;
|
||||
window->DC.ButtonRepeatStack.resize(0);
|
||||
window->DC.AllowKeyboardFocus = true;
|
||||
@ -3870,7 +3870,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
|
||||
const ImVec2 text_size = CalcTextSize(name, NULL, true);
|
||||
if (!(flags & ImGuiWindowFlags_NoCollapse))
|
||||
RenderCollapseTriangle(window->Pos + style.FramePadding, !window->Collapsed, 1.0f, true);
|
||||
|
||||
|
||||
ImVec2 text_min = window->Pos + style.FramePadding;
|
||||
ImVec2 text_max = window->Pos + ImVec2(window->Size.x - style.FramePadding.x, style.FramePadding.y*2 + text_size.y);
|
||||
ImVec2 clip_max = ImVec2(window->Pos.x + window->Size.x - (p_opened ? title_bar_rect.GetHeight() - 3 : style.FramePadding.x), text_max.y); // Match the size of CloseWindowButton()
|
||||
@ -4035,7 +4035,7 @@ void ImGui::FocusWindow(ImGuiWindow* window)
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
// And move its root window to the top of the pile
|
||||
// And move its root window to the top of the pile
|
||||
if (window->RootWindow)
|
||||
window = window->RootWindow;
|
||||
|
||||
@ -4794,7 +4794,7 @@ void ImGui::TextUnformatted(const char* text, const char* text_end)
|
||||
{
|
||||
// Long text!
|
||||
// Perform manual coarse clipping to optimize for long multi-line text
|
||||
// From this point we will only compute the width of lines that are visible. Optimization only available when word-wrapping is disabled.
|
||||
// From this point we will only compute the width of lines that are visible. Optimization only available when word-wrapping is disabled.
|
||||
// We also don't vertically center the text within the line full height, which is unlikely to matter because we are likely the biggest and only item on the line.
|
||||
const char* line = text;
|
||||
const float line_height = ImGui::GetTextLineHeight();
|
||||
@ -5154,7 +5154,7 @@ bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const I
|
||||
|
||||
const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : style.FramePadding;
|
||||
const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding*2);
|
||||
const ImRect image_bb(window->DC.CursorPos + padding, window->DC.CursorPos + padding + size);
|
||||
const ImRect image_bb(window->DC.CursorPos + padding, window->DC.CursorPos + padding + size);
|
||||
ItemSize(bb);
|
||||
if (!ItemAdd(bb, &id))
|
||||
return false;
|
||||
@ -5259,7 +5259,7 @@ void ImGui::LogButtons()
|
||||
|
||||
ImGui::PushID("LogButtons");
|
||||
const bool log_to_tty = ImGui::Button("Log To TTY");
|
||||
ImGui::SameLine();
|
||||
ImGui::SameLine();
|
||||
const bool log_to_file = ImGui::Button("Log To File");
|
||||
ImGui::SameLine();
|
||||
const bool log_to_clipboard = ImGui::Button("Log To Clipboard");
|
||||
@ -5423,7 +5423,7 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
if (window->SkipItems)
|
||||
return;
|
||||
|
||||
|
||||
ImGuiState& g = *GImGui;
|
||||
const ImGuiStyle& style = g.Style;
|
||||
|
||||
@ -5602,16 +5602,16 @@ static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* value1, const
|
||||
if (data_type == ImGuiDataType_Int)
|
||||
{
|
||||
if (op == '+')
|
||||
*(int*)value1 = *(int*)value1 + *(const int*)value2;
|
||||
*(int*)value1 = *(int*)value1 + *(const int*)value2;
|
||||
else if (op == '-')
|
||||
*(int*)value1 = *(int*)value1 - *(const int*)value2;
|
||||
*(int*)value1 = *(int*)value1 - *(const int*)value2;
|
||||
}
|
||||
else if (data_type == ImGuiDataType_Float)
|
||||
{
|
||||
if (op == '+')
|
||||
*(float*)value1 = *(float*)value1 + *(const float*)value2;
|
||||
*(float*)value1 = *(float*)value1 + *(const float*)value2;
|
||||
else if (op == '-')
|
||||
*(float*)value1 = *(float*)value1 - *(const float*)value2;
|
||||
*(float*)value1 = *(float*)value1 - *(const float*)value2;
|
||||
}
|
||||
}
|
||||
|
||||
@ -5639,7 +5639,7 @@ static void DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
|
||||
|
||||
if (data_type == ImGuiDataType_Int)
|
||||
{
|
||||
if (!scalar_format)
|
||||
if (!scalar_format)
|
||||
scalar_format = "%d";
|
||||
int* v = (int*)data_ptr;
|
||||
int ref_v = *v;
|
||||
@ -5655,7 +5655,7 @@ static void DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
|
||||
}
|
||||
else if (data_type == ImGuiDataType_Float)
|
||||
{
|
||||
if (!scalar_format)
|
||||
if (!scalar_format)
|
||||
scalar_format = "%f";
|
||||
float* v = (float*)data_ptr;
|
||||
float ref_v = *v;
|
||||
@ -5729,7 +5729,7 @@ float ImGui::RoundScalar(float value, int decimal_precision)
|
||||
// Round past decimal precision
|
||||
// So when our value is 1.99999 with a precision of 0.001 we'll end up rounding to 2.0
|
||||
// FIXME: Investigate better rounding methods
|
||||
static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f };
|
||||
static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f };
|
||||
float min_step = (decimal_precision >= 0 && decimal_precision < 10) ? min_steps[decimal_precision] : powf(10.0f, (float)-decimal_precision);
|
||||
bool negative = value < 0.0f;
|
||||
value = fabsf(value);
|
||||
@ -6432,7 +6432,7 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge
|
||||
const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f);
|
||||
const int v_idx = (int)(t * (values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0)));
|
||||
IM_ASSERT(v_idx >= 0 && v_idx < values_count);
|
||||
|
||||
|
||||
const float v0 = values_getter(data, (v_idx + values_offset) % values_count);
|
||||
const float v1 = values_getter(data, (v_idx + 1 + values_offset) % values_count);
|
||||
if (plot_type == ImGuiPlotType_Lines)
|
||||
@ -6549,7 +6549,7 @@ bool ImGui::Checkbox(const char* label, bool* v)
|
||||
if (*v)
|
||||
{
|
||||
const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
|
||||
const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
|
||||
const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
|
||||
window->DrawList->AddRectFilled(check_bb.Min+ImVec2(pad,pad), check_bb.Max-ImVec2(pad,pad), window->Color(ImGuiCol_CheckMark), style.FrameRounding);
|
||||
}
|
||||
|
||||
@ -6610,7 +6610,7 @@ bool ImGui::RadioButton(const char* label, bool active)
|
||||
if (active)
|
||||
{
|
||||
const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
|
||||
const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
|
||||
const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
|
||||
window->DrawList->AddCircleFilled(center, radius-pad, window->Color(ImGuiCol_CheckMark), 16);
|
||||
}
|
||||
|
||||
@ -6728,9 +6728,9 @@ static void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int pos, int n)
|
||||
obj->CurLenW -= n;
|
||||
|
||||
// Offset remaining text
|
||||
const ImWchar* src = obj->Text.Data + pos + n;
|
||||
const ImWchar* src = obj->Text.Data + pos + n;
|
||||
while (ImWchar c = *src++)
|
||||
*dst++ = c;
|
||||
*dst++ = c;
|
||||
*dst = '\0';
|
||||
}
|
||||
|
||||
@ -6779,10 +6779,10 @@ static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const Im
|
||||
}
|
||||
|
||||
void ImGuiTextEditState::OnKeyPressed(int key)
|
||||
{
|
||||
stb_textedit_key(this, &StbState, key);
|
||||
{
|
||||
stb_textedit_key(this, &StbState, key);
|
||||
CursorFollow = true;
|
||||
CursorAnimReset();
|
||||
CursorAnimReset();
|
||||
}
|
||||
|
||||
// Public API to manipulate UTF-8 text
|
||||
@ -6864,7 +6864,7 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
|
||||
{
|
||||
ImGuiTextEditCallbackData callback_data;
|
||||
memset(&callback_data, 0, sizeof(ImGuiTextEditCallbackData));
|
||||
callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter;
|
||||
callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter;
|
||||
callback_data.EventChar = (ImWchar)c;
|
||||
callback_data.Flags = flags;
|
||||
callback_data.UserData = user_data;
|
||||
@ -6961,7 +6961,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
|
||||
{
|
||||
edit_state.Id = id;
|
||||
edit_state.ScrollX = 0.f;
|
||||
stb_textedit_initialize_state(&edit_state.StbState, !is_multiline);
|
||||
stb_textedit_initialize_state(&edit_state.StbState, !is_multiline);
|
||||
if (!is_multiline && focus_requested_by_code)
|
||||
select_all = true;
|
||||
}
|
||||
@ -7055,9 +7055,9 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
|
||||
{
|
||||
bool ctrl_enter_for_new_line = (flags & ImGuiInputTextFlags_CtrlEnterForNewLine) != 0;
|
||||
if (!is_multiline || (ctrl_enter_for_new_line && !is_ctrl_down) || (!ctrl_enter_for_new_line && is_ctrl_down))
|
||||
{
|
||||
SetActiveID(0);
|
||||
enter_pressed = true;
|
||||
{
|
||||
SetActiveID(0);
|
||||
enter_pressed = true;
|
||||
}
|
||||
else // New line
|
||||
{
|
||||
@ -7172,7 +7172,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
|
||||
if (event_key != ImGuiKey_COUNT || (flags & ImGuiInputTextFlags_CallbackAlways) != 0)
|
||||
{
|
||||
ImGuiTextEditCallbackData callback_data;
|
||||
callback_data.EventFlag = event_flag;
|
||||
callback_data.EventFlag = event_flag;
|
||||
callback_data.EventKey = event_key;
|
||||
callback_data.Buf = edit_state.TempTextBuffer.Data;
|
||||
callback_data.BufSize = edit_state.BufSizeA;
|
||||
@ -7279,7 +7279,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
|
||||
{
|
||||
const float scroll_increment_x = size.x * 0.25f;
|
||||
if (cursor_offset.x < edit_state.ScrollX)
|
||||
edit_state.ScrollX = ImMax(0.0f, cursor_offset.x - scroll_increment_x);
|
||||
edit_state.ScrollX = ImMax(0.0f, cursor_offset.x - scroll_increment_x);
|
||||
else if (cursor_offset.x - size.x >= edit_state.ScrollX)
|
||||
edit_state.ScrollX = cursor_offset.x - size.x + scroll_increment_x;
|
||||
}
|
||||
@ -7345,7 +7345,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
|
||||
bool cursor_is_visible = (g.InputTextState.CursorAnim <= 0.0f) || fmodf(g.InputTextState.CursorAnim, 1.20f) <= 0.80f;
|
||||
if (cursor_is_visible)
|
||||
draw_window->DrawList->AddLine(cursor_screen_pos + ImVec2(0.0f,-g.FontSize+0.5f), cursor_screen_pos + ImVec2(0.0f,-1.5f), window->Color(ImGuiCol_Text));
|
||||
|
||||
|
||||
// Notify OS of text input position for advanced IME
|
||||
if (io.ImeSetInputScreenPosFn && ImLengthSqr(edit_state.InputCursorScreenPos - cursor_screen_pos) > 0.0001f)
|
||||
io.ImeSetInputScreenPosFn((int)cursor_screen_pos.x - 1, (int)(cursor_screen_pos.y - g.FontSize)); // -1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.
|
||||
@ -7644,7 +7644,7 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi
|
||||
|
||||
if (label_size.x > 0)
|
||||
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
|
||||
|
||||
|
||||
bool menu_toggled = false;
|
||||
if (hovered)
|
||||
{
|
||||
@ -7664,7 +7664,7 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool value_changed = false;
|
||||
if (IsPopupOpen(id))
|
||||
{
|
||||
@ -7845,7 +7845,7 @@ void ImGui::ListBoxFooter()
|
||||
ImGuiWindow* parent_window = GetParentWindow();
|
||||
const ImRect bb = parent_window->DC.LastItemRect;
|
||||
const ImGuiStyle& style = ImGui::GetStyle();
|
||||
|
||||
|
||||
ImGui::EndChildFrame();
|
||||
|
||||
// Redeclare item size so that it includes the label (we have stored the full size in LastItemRect)
|
||||
@ -7995,7 +7995,7 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
if (window->SkipItems)
|
||||
return false;
|
||||
|
||||
|
||||
ImGuiState& g = *GImGui;
|
||||
const ImGuiStyle& style = g.Style;
|
||||
const ImGuiID id = window->GetID(label);
|
||||
@ -8057,7 +8057,7 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
|
||||
//window->DrawList->PushClipRectFullScreen(); window->DrawList->AddTriangleFilled(ta, tb, tc, moving_within_opened_triangle ? 0x80008000 : 0x80000080); window->DrawList->PopClipRect(); // Debug
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
want_close = (opened && !hovered && g.HoveredWindow == window && g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrame != id && !moving_within_opened_triangle);
|
||||
want_open = (!opened && hovered && !moving_within_opened_triangle) || (!opened && hovered && pressed);
|
||||
}
|
||||
@ -8188,13 +8188,13 @@ bool ImGui::ColorEdit4(const char* label, float col[4], bool alpha)
|
||||
|
||||
const bool hide_prefix = (w_item_one <= CalcTextSize("M:999").x);
|
||||
const char* ids[4] = { "##X", "##Y", "##Z", "##W" };
|
||||
const char* fmt_table[3][4] =
|
||||
const char* fmt_table[3][4] =
|
||||
{
|
||||
{ "%3.0f", "%3.0f", "%3.0f", "%3.0f" },
|
||||
{ "%3.0f", "%3.0f", "%3.0f", "%3.0f" },
|
||||
{ "R:%3.0f", "G:%3.0f", "B:%3.0f", "A:%3.0f" },
|
||||
{ "H:%3.0f", "S:%3.0f", "V:%3.0f", "A:%3.0f" }
|
||||
{ "H:%3.0f", "S:%3.0f", "V:%3.0f", "A:%3.0f" }
|
||||
};
|
||||
const char** fmt = hide_prefix ? fmt_table[0] : hsv ? fmt_table[2] : fmt_table[1];
|
||||
const char** fmt = hide_prefix ? fmt_table[0] : hsv ? fmt_table[2] : fmt_table[1];
|
||||
|
||||
ImGui::PushItemWidth(w_item_one);
|
||||
for (int n = 0; n < components; n++)
|
||||
@ -8222,7 +8222,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], bool alpha)
|
||||
value_changed |= ImGui::InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase);
|
||||
ImGui::PopItemWidth();
|
||||
char* p = buf;
|
||||
while (*p == '#' || ImCharIsSpace(*p))
|
||||
while (*p == '#' || ImCharIsSpace(*p))
|
||||
p++;
|
||||
|
||||
// Treat at unsigned (%X is unsigned)
|
||||
@ -8404,7 +8404,7 @@ void ImGui::SameLine(float local_pos_x, float spacing_w)
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
if (window->SkipItems)
|
||||
return;
|
||||
|
||||
|
||||
ImGuiState& g = *GImGui;
|
||||
float x, y;
|
||||
if (local_pos_x != 0.0f)
|
||||
@ -8749,9 +8749,9 @@ static const char* GetClipboardTextFn_DefaultImpl()
|
||||
ImGui::MemFree(buf_local);
|
||||
buf_local = NULL;
|
||||
}
|
||||
if (!OpenClipboard(NULL))
|
||||
if (!OpenClipboard(NULL))
|
||||
return NULL;
|
||||
HANDLE wbuf_handle = GetClipboardData(CF_UNICODETEXT);
|
||||
HANDLE wbuf_handle = GetClipboardData(CF_UNICODETEXT);
|
||||
if (wbuf_handle == NULL)
|
||||
return NULL;
|
||||
if (ImWchar* wbuf_global = (ImWchar*)GlobalLock(wbuf_handle))
|
||||
@ -8760,8 +8760,8 @@ static const char* GetClipboardTextFn_DefaultImpl()
|
||||
buf_local = (char*)ImGui::MemAlloc(buf_len * sizeof(char));
|
||||
ImTextStrToUtf8(buf_local, buf_len, wbuf_global, NULL);
|
||||
}
|
||||
GlobalUnlock(wbuf_handle);
|
||||
CloseClipboard();
|
||||
GlobalUnlock(wbuf_handle);
|
||||
CloseClipboard();
|
||||
return buf_local;
|
||||
}
|
||||
|
||||
@ -8771,12 +8771,12 @@ static void SetClipboardTextFn_DefaultImpl(const char* text)
|
||||
return;
|
||||
|
||||
const int wbuf_length = ImTextCountCharsFromUtf8(text, NULL) + 1;
|
||||
HGLOBAL wbuf_handle = GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(ImWchar));
|
||||
HGLOBAL wbuf_handle = GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(ImWchar));
|
||||
if (wbuf_handle == NULL)
|
||||
return;
|
||||
ImWchar* wbuf_global = (ImWchar*)GlobalLock(wbuf_handle);
|
||||
ImWchar* wbuf_global = (ImWchar*)GlobalLock(wbuf_handle);
|
||||
ImTextStrFromUtf8(wbuf_global, wbuf_length, text, NULL);
|
||||
GlobalUnlock(wbuf_handle);
|
||||
GlobalUnlock(wbuf_handle);
|
||||
EmptyClipboard();
|
||||
SetClipboardData(CF_UNICODETEXT, wbuf_handle);
|
||||
CloseClipboard();
|
||||
@ -8879,8 +8879,8 @@ void ImGui::ShowMetricsWindow(bool* opened)
|
||||
for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)
|
||||
vtxs_rect.Add(draw_list->VtxBuffer[draw_list->IdxBuffer[i]].pos);
|
||||
GImGui->OverlayDrawList.PushClipRectFullScreen();
|
||||
clip_rect.Round(); GImGui->OverlayDrawList.AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0));
|
||||
vtxs_rect.Round(); GImGui->OverlayDrawList.AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255));
|
||||
clip_rect.Round(); GImGui->OverlayDrawList.AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0));
|
||||
vtxs_rect.Round(); GImGui->OverlayDrawList.AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255));
|
||||
GImGui->OverlayDrawList.PopClipRect();
|
||||
}
|
||||
}
|
||||
|
60
imgui.h
60
imgui.h
@ -30,7 +30,7 @@
|
||||
#define IMGUI_API
|
||||
#endif
|
||||
|
||||
#if defined(__clang__) || defined(__GNUC__)
|
||||
#if defined(__clang__) || defined(__GNUC__)
|
||||
#define IM_PRINTFARGS(FMT) __attribute__((format(printf, FMT, (FMT+1))))
|
||||
#else
|
||||
#define IM_PRINTFARGS(FMT)
|
||||
@ -60,7 +60,7 @@ typedef int ImGuiWindowFlags; // enum ImGuiWindowFlags_
|
||||
typedef int ImGuiSetCond; // enum ImGuiSetCond_
|
||||
typedef int ImGuiInputTextFlags; // enum ImGuiInputTextFlags_
|
||||
typedef int ImGuiSelectableFlags; // enum ImGuiSelectableFlags_
|
||||
struct ImGuiTextEditCallbackData; // for advanced uses of InputText()
|
||||
struct ImGuiTextEditCallbackData; // for advanced uses of InputText()
|
||||
typedef int (*ImGuiTextEditCallback)(ImGuiTextEditCallbackData *data);
|
||||
|
||||
struct ImVec2
|
||||
@ -93,7 +93,7 @@ struct ImVec4
|
||||
// - struct ImGuiStorage // Custom key value storage (if you need to alter open/close states manually)
|
||||
// - struct ImGuiTextEditCallbackData // Shared state of ImGui::InputText() when using custom callbacks
|
||||
// - struct ImGuiListClipper // Helper to manually clip large list of items.
|
||||
// - struct ImColor // Helper functions to created packed 32-bit RGBA color values
|
||||
// - struct ImColor // Helper functions to created packed 32-bit RGBA color values
|
||||
// - struct ImDrawList // Draw command list
|
||||
// - struct ImFontAtlas // Bake multiple fonts into a single texture, TTF font loader, bake glyphs into bitmap
|
||||
// - struct ImFont // Single font
|
||||
@ -114,7 +114,7 @@ namespace ImGui
|
||||
IMGUI_API void ShowMetricsWindow(bool* opened = NULL); // metrics window for debugging imgui
|
||||
|
||||
// Window
|
||||
IMGUI_API bool Begin(const char* name = "Debug", bool* p_opened = NULL, ImGuiWindowFlags flags = 0); // see .cpp for details. return false when window is collapsed, so you can early out in your code. 'bool* p_opened' creates a widget on the upper-right to close the window (which sets your bool to false).
|
||||
IMGUI_API bool Begin(const char* name = "Debug", bool* p_opened = NULL, ImGuiWindowFlags flags = 0); // see .cpp for details. return false when window is collapsed, so you can early out in your code. 'bool* p_opened' creates a widget on the upper-right to close the window (which sets your bool to false).
|
||||
IMGUI_API bool Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_use, float bg_alpha = -1.0f, ImGuiWindowFlags flags = 0); // this is the older/longer API. call SetNextWindowSize() instead if you want to set a window size. For regular windows, 'size_on_first_use' only applies to the first time EVER the window is created and probably not what you want! maybe obsolete this API eventually.
|
||||
IMGUI_API void End();
|
||||
IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0); // begin a scrolling region. size==0.0f: use remaining window size, size<0.0f: use remaining window size minus abs(size). size>0.0f: fixed size. each axis can use a different mode, e.g. ImVec2(0,400).
|
||||
@ -177,7 +177,7 @@ namespace ImGui
|
||||
IMGUI_API void PopButtonRepeat();
|
||||
|
||||
// Cursor / Layout
|
||||
IMGUI_API void BeginGroup(); // once closing a group it is seen as a single item (so you can use IsItemHovered() on a group, SameLine() between groups, etc.
|
||||
IMGUI_API void BeginGroup(); // once closing a group it is seen as a single item (so you can use IsItemHovered() on a group, SameLine() between groups, etc.
|
||||
IMGUI_API void EndGroup();
|
||||
IMGUI_API void Separator(); // horizontal line
|
||||
IMGUI_API void SameLine(float local_pos_x = 0.0f, float spacing_w = -1.0f); // call between widgets or groups to layout them horizontally
|
||||
@ -198,7 +198,7 @@ namespace ImGui
|
||||
IMGUI_API void SetCursorPos(const ImVec2& local_pos); // "
|
||||
IMGUI_API void SetCursorPosX(float x); // "
|
||||
IMGUI_API void SetCursorPosY(float y); // "
|
||||
IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position
|
||||
IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position
|
||||
IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute screen coordinates [0..io.DisplaySize]
|
||||
IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute screen coordinates [0..io.DisplaySize]
|
||||
IMGUI_API void AlignFirstTextHeightToWidgets(); // call once if the first item on the line is a Text() item and you want to vertically lower it to match subsequent (bigger) widgets
|
||||
@ -228,7 +228,7 @@ namespace ImGui
|
||||
IMGUI_API void TextWrapped(const char* fmt, ...) IM_PRINTFARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize().
|
||||
IMGUI_API void TextWrappedV(const char* fmt, va_list args);
|
||||
IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // doesn't require null terminated string if 'text_end' is specified. no copy done to any bounded stack buffer, recommended for long chunks of text
|
||||
IMGUI_API void LabelText(const char* label, const char* fmt, ...) IM_PRINTFARGS(2); // display text+label aligned the same way as value+label widgets
|
||||
IMGUI_API void LabelText(const char* label, const char* fmt, ...) IM_PRINTFARGS(2); // display text+label aligned the same way as value+label widgets
|
||||
IMGUI_API void LabelTextV(const char* label, const char* fmt, va_list args);
|
||||
IMGUI_API void Bullet();
|
||||
IMGUI_API void BulletText(const char* fmt, ...) IM_PRINTFARGS(1);
|
||||
@ -304,7 +304,7 @@ namespace ImGui
|
||||
IMGUI_API void SetNextTreeNodeOpened(bool opened, ImGuiSetCond cond = 0); // set next tree node to be opened.
|
||||
|
||||
// Widgets: Selectable / Lists
|
||||
IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
|
||||
IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
|
||||
IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0));
|
||||
IMGUI_API bool ListBox(const char* label, int* current_item, const char** items, int items_count, int height_in_items = -1);
|
||||
IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);
|
||||
@ -365,7 +365,7 @@ namespace ImGui
|
||||
IMGUI_API ImVec2 GetItemRectMax(); // "
|
||||
IMGUI_API ImVec2 GetItemRectSize(); // "
|
||||
IMGUI_API bool IsWindowHovered(); // is current window hovered and hoverable (not blocked by a popup) (differentiate child windows from each others)
|
||||
IMGUI_API bool IsWindowFocused(); // is current window focused
|
||||
IMGUI_API bool IsWindowFocused(); // is current window focused
|
||||
IMGUI_API bool IsRootWindowFocused(); // is current root window focused (top parent window in case of child windows)
|
||||
IMGUI_API bool IsRootWindowOrAnyChildFocused(); // is current root window or any of its child (including current window) focused
|
||||
IMGUI_API bool IsRectVisible(const ImVec2& size); // test if rectangle of given size starting from cursor pos is visible (not clipped). to perform coarse clipping on user's side (as an optimization)
|
||||
@ -389,7 +389,7 @@ namespace ImGui
|
||||
IMGUI_API bool IsKeyDown(int key_index); // key_index into the keys_down[] array, imgui doesn't know the semantic of each entry, uses your own indices!
|
||||
IMGUI_API bool IsKeyPressed(int key_index, bool repeat = true); // uses user's key indices as stored in the keys_down[] array. if repeat=true. uses io.KeyRepeatDelay / KeyRepeatRate
|
||||
IMGUI_API bool IsKeyReleased(int key_index); // "
|
||||
IMGUI_API bool IsMouseDown(int button); // is mouse button held
|
||||
IMGUI_API bool IsMouseDown(int button); // is mouse button held
|
||||
IMGUI_API bool IsMouseClicked(int button, bool repeat = false); // did mouse button clicked (went from !Down to Down)
|
||||
IMGUI_API bool IsMouseDoubleClicked(int button); // did mouse button double-clicked. a double-click returns false in IsMouseClicked(). uses io.MouseDoubleClickTime.
|
||||
IMGUI_API bool IsMouseReleased(int button); // did mouse button released (went from Down to !Down)
|
||||
@ -400,7 +400,7 @@ namespace ImGui
|
||||
IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls
|
||||
IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve backup of mouse positioning at the time of opening popup we have BeginPopup() into
|
||||
IMGUI_API ImVec2 GetMouseDragDelta(int button = 0, float lock_threshold = -1.0f); // dragging amount since clicking, also see: GetItemActiveDragDelta(). if lock_threshold < -1.0f uses io.MouseDraggingThreshold
|
||||
IMGUI_API void ResetMouseDragDelta(int button = 0); //
|
||||
IMGUI_API void ResetMouseDragDelta(int button = 0); //
|
||||
IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you
|
||||
IMGUI_API void SetMouseCursor(ImGuiMouseCursor type); // set desired cursor type
|
||||
IMGUI_API void CaptureKeyboardFromApp(); // manually enforce imgui setting the io.WantCaptureKeyboard flag next frame (your application needs to handle it). e.g. capture keyboard when your widget is being hovered.
|
||||
@ -681,9 +681,9 @@ struct ImGuiIO
|
||||
// User Functions
|
||||
//------------------------------------------------------------------
|
||||
|
||||
// REQUIRED: rendering function.
|
||||
// REQUIRED: rendering function.
|
||||
// See example code if you are unsure of how to implement this.
|
||||
void (*RenderDrawListsFn)(ImDrawData* data);
|
||||
void (*RenderDrawListsFn)(ImDrawData* data);
|
||||
|
||||
// Optional: access OS clipboard
|
||||
// (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
|
||||
@ -706,7 +706,7 @@ struct ImGuiIO
|
||||
|
||||
ImVec2 MousePos; // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
|
||||
bool MouseDown[5]; // Mouse buttons: left, right, middle + extras. ImGui itself mostly only uses left button (BeginPopupContext** are using right button). Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API.
|
||||
float MouseWheel; // Mouse wheel: 1 unit scrolls about 5 lines text.
|
||||
float MouseWheel; // Mouse wheel: 1 unit scrolls about 5 lines text.
|
||||
bool MouseDrawCursor; // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor).
|
||||
bool KeyCtrl; // Keyboard modifier pressed: Control
|
||||
bool KeyShift; // Keyboard modifier pressed: Shift
|
||||
@ -756,7 +756,7 @@ struct ImGuiIO
|
||||
// Helpers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// Lightweight std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).
|
||||
// Lightweight std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).
|
||||
// Our implementation does NOT call c++ constructors because we don't use them in ImGui. Don't use this class as a straight std::vector replacement in your code!
|
||||
template<typename T>
|
||||
class ImVector
|
||||
@ -794,14 +794,14 @@ public:
|
||||
inline int _grow_capacity(int new_size) { int new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > new_size ? new_capacity : new_size; }
|
||||
|
||||
inline void resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; }
|
||||
inline void reserve(int new_capacity)
|
||||
{
|
||||
inline void reserve(int new_capacity)
|
||||
{
|
||||
if (new_capacity <= Capacity) return;
|
||||
T* new_data = (value_type*)ImGui::MemAlloc((size_t)new_capacity * sizeof(value_type));
|
||||
memcpy(new_data, Data, (size_t)Size * sizeof(value_type));
|
||||
ImGui::MemFree(Data);
|
||||
Data = new_data;
|
||||
Capacity = new_capacity;
|
||||
Capacity = new_capacity;
|
||||
}
|
||||
|
||||
inline void push_back(const value_type& v) { if (Size == Capacity) reserve(_grow_capacity(Size+1)); Data[Size++] = v; }
|
||||
@ -884,13 +884,13 @@ struct ImGuiTextBuffer
|
||||
// - You want to store custom debug data easily without adding or editing structures in your code.
|
||||
struct ImGuiStorage
|
||||
{
|
||||
struct Pair
|
||||
{
|
||||
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; }
|
||||
struct Pair
|
||||
{
|
||||
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; }
|
||||
};
|
||||
ImVector<Pair> Data;
|
||||
|
||||
@ -905,7 +905,7 @@ struct ImGuiStorage
|
||||
IMGUI_API void* GetVoidPtr(ImGuiID key) const; // default_val is NULL
|
||||
IMGUI_API void SetVoidPtr(ImGuiID key, void* val);
|
||||
|
||||
// - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set.
|
||||
// - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set.
|
||||
// - 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.
|
||||
// - A typical use case where this is convenient:
|
||||
// float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar;
|
||||
@ -1064,7 +1064,7 @@ struct ImDrawList
|
||||
ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
|
||||
ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
|
||||
ImVector<ImVec4> _ClipRectStack; // [Internal]
|
||||
ImVector<ImTextureID> _TextureIdStack; // [Internal]
|
||||
ImVector<ImTextureID> _TextureIdStack; // [Internal]
|
||||
ImVector<ImVec2> _Path; // [Internal] current path building
|
||||
int _ChannelCurrent; // [Internal] current channel number (0)
|
||||
ImVector<ImDrawChannel> _Channels; // [Internal] draw channels for columns API
|
||||
@ -1079,7 +1079,7 @@ struct ImDrawList
|
||||
IMGUI_API void PushTextureID(const ImTextureID& texture_id);
|
||||
IMGUI_API void PopTextureID();
|
||||
|
||||
// Primitives
|
||||
// Primitives
|
||||
IMGUI_API void AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);
|
||||
IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F);
|
||||
IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F);
|
||||
@ -1137,7 +1137,7 @@ struct ImFontConfig
|
||||
{
|
||||
void* FontData; // // TTF data
|
||||
int FontDataSize; // // TTF data size
|
||||
bool FontDataOwnedByAtlas; // true // TTF data ownership taken by the container ImFontAtlas (will delete memory itself). Set to true
|
||||
bool FontDataOwnedByAtlas; // true // TTF data ownership taken by the container ImFontAtlas (will delete memory itself). Set to true
|
||||
int FontNo; // 0 // Index of font within TTF file
|
||||
float SizePixels; // // Size in pixels for rasterizer
|
||||
int OversampleH, OversampleV; // 3, 1 // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis.
|
||||
@ -1146,7 +1146,7 @@ struct ImFontConfig
|
||||
const ImWchar* GlyphRanges; // // List of Unicode range (2 value per range, values are inclusive, zero-terminated list)
|
||||
bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs).
|
||||
bool MergeGlyphCenterV; // false // When merging (multiple ImFontInput for one ImFont), vertically center new glyphs instead of aligning their baseline
|
||||
|
||||
|
||||
// [Internal]
|
||||
char Name[32]; // Name (strictly for debugging)
|
||||
ImFont* DstFont;
|
||||
|
@ -56,8 +56,8 @@ static void ShowExampleMenuFile();
|
||||
|
||||
static void ShowHelpMarker(const char* desc)
|
||||
{
|
||||
ImGui::TextDisabled("(?)");
|
||||
if (ImGui::IsItemHovered())
|
||||
ImGui::TextDisabled("(?)");
|
||||
if (ImGui::IsItemHovered())
|
||||
ImGui::SetTooltip(desc);
|
||||
}
|
||||
|
||||
@ -142,7 +142,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::End();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.65f); // 2/3 of the space for widget and 1/3 for labels
|
||||
ImGui::PushItemWidth(-140); // Right align, keep 140 pixels for labels
|
||||
|
||||
@ -189,7 +189,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
{
|
||||
ImGui::Checkbox("no titlebar", &no_titlebar); ImGui::SameLine(150);
|
||||
ImGui::Checkbox("no border", &no_border); ImGui::SameLine(300);
|
||||
ImGui::Checkbox("no resize", &no_resize);
|
||||
ImGui::Checkbox("no resize", &no_resize);
|
||||
ImGui::Checkbox("no move", &no_move); ImGui::SameLine(150);
|
||||
ImGui::Checkbox("no scrollbar", &no_scrollbar); ImGui::SameLine(300);
|
||||
ImGui::Checkbox("no collapse", &no_collapse);
|
||||
@ -431,7 +431,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
if (ImGui::Button("Button")) { printf("Clicked\n"); a ^= 1; }
|
||||
if (a)
|
||||
{
|
||||
ImGui::SameLine();
|
||||
ImGui::SameLine();
|
||||
ImGui::Text("Thanks for clicking me!");
|
||||
}
|
||||
|
||||
@ -535,7 +535,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
static float col2[4] = { 0.4f,0.7f,0.0f,0.5f };
|
||||
ImGui::ColorEdit3("color 1", col1);
|
||||
ImGui::SameLine(); ShowHelpMarker("Click on the colored square to change edit mode.\nCTRL+click on individual component to input value.\n");
|
||||
|
||||
|
||||
ImGui::ColorEdit4("color 2", col2);
|
||||
|
||||
const char* listbox_items[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pineapple", "Strawberry", "Watermelon" };
|
||||
@ -668,21 +668,21 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
|
||||
|
||||
static bool pause;
|
||||
static ImVector<float> values; if (values.empty()) { values.resize(90); memset(values.Data, 0, values.Size*sizeof(float)); }
|
||||
static int values_offset = 0;
|
||||
if (!pause)
|
||||
static ImVector<float> values; if (values.empty()) { values.resize(90); memset(values.Data, 0, values.Size*sizeof(float)); }
|
||||
static int values_offset = 0;
|
||||
if (!pause)
|
||||
{
|
||||
static float refresh_time = ImGui::GetTime(); // Create dummy data at fixed 60 hz rate for the demo
|
||||
for (; ImGui::GetTime() > refresh_time + 1.0f/60.0f; refresh_time += 1.0f/60.0f)
|
||||
{
|
||||
static float phase = 0.0f;
|
||||
values[values_offset] = cosf(phase);
|
||||
values_offset = (values_offset+1)%values.Size;
|
||||
phase += 0.10f*values_offset;
|
||||
values[values_offset] = cosf(phase);
|
||||
values_offset = (values_offset+1)%values.Size;
|
||||
phase += 0.10f*values_offset;
|
||||
}
|
||||
}
|
||||
ImGui::PlotLines("##Graph", values.Data, values.Size, values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
|
||||
ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x);
|
||||
ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x);
|
||||
ImGui::BeginGroup();
|
||||
ImGui::Text("Graph");
|
||||
ImGui::Checkbox("pause", &pause);
|
||||
@ -697,7 +697,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::Text("Without border");
|
||||
static int line = 50;
|
||||
bool goto_line = ImGui::Button("Goto");
|
||||
ImGui::SameLine();
|
||||
ImGui::SameLine();
|
||||
ImGui::PushItemWidth(100);
|
||||
goto_line |= ImGui::InputInt("##Line", &line, 0, 0, ImGuiInputTextFlags_EnterReturnsTrue);
|
||||
ImGui::PopItemWidth();
|
||||
@ -778,7 +778,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::Text("can fit within a text block.");
|
||||
|
||||
// Aligned to arbitrary position. Easy/cheap column.
|
||||
ImGui::Text("Aligned");
|
||||
ImGui::Text("Aligned");
|
||||
ImGui::SameLine(150); ImGui::Text("x=150");
|
||||
ImGui::SameLine(300); ImGui::Text("x=300");
|
||||
ImGui::Text("Aligned");
|
||||
@ -800,7 +800,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine();
|
||||
ImGui::SliderFloat("X", &f0, 0.0f,5.0f); ImGui::SameLine();
|
||||
ImGui::SliderFloat("Y", &f1, 0.0f,5.0f); ImGui::SameLine();
|
||||
ImGui::SliderFloat("Z", &f2, 0.0f,5.0f);
|
||||
ImGui::SliderFloat("Z", &f2, 0.0f,5.0f);
|
||||
ImGui::PopItemWidth();
|
||||
|
||||
ImGui::PushItemWidth(80);
|
||||
@ -812,7 +812,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::PushID(i);
|
||||
ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items));
|
||||
ImGui::PopID();
|
||||
//if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i);
|
||||
//if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i);
|
||||
}
|
||||
ImGui::PopItemWidth();
|
||||
|
||||
@ -869,9 +869,9 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
|
||||
if (ImGui::TreeNode("Text Baseline Alignment"))
|
||||
{
|
||||
ImGui::TextWrapped("(This is testing the vertical alignment that occurs on text to keep it at the same baseline as widgets. Lines only composed of text or \"small\" widgets fit in less vertical spaces than lines with normal widgets)");
|
||||
ImGui::TextWrapped("(This is testing the vertical alignment that occurs on text to keep it at the same baseline as widgets. Lines only composed of text or \"small\" widgets fit in less vertical spaces than lines with normal widgets)");
|
||||
|
||||
ImGui::Text("One\nTwo\nThree"); ImGui::SameLine();
|
||||
ImGui::Text("One\nTwo\nThree"); ImGui::SameLine();
|
||||
ImGui::Text("Hello\nWorld"); ImGui::SameLine();
|
||||
ImGui::Text("Banana");
|
||||
|
||||
@ -1037,8 +1037,8 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::Text("Value = %.3f (<-- right-click here)", value);
|
||||
if (ImGui::BeginPopupContextItem("item context menu"))
|
||||
{
|
||||
if (ImGui::Selectable("Set to zero")) value = 0.0f;
|
||||
if (ImGui::Selectable("Set to PI")) value = 3.1415f;
|
||||
if (ImGui::Selectable("Set to zero")) value = 0.0f;
|
||||
if (ImGui::Selectable("Set to PI")) value = 3.1415f;
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
|
||||
@ -1058,7 +1058,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
}
|
||||
|
||||
if (ImGui::TreeNode("Modals"))
|
||||
{
|
||||
{
|
||||
ImGui::TextWrapped("Modal windows are like popups but the user cannot close them by clicking outside the window.");
|
||||
|
||||
if (ImGui::Button("Delete.."))
|
||||
@ -1067,7 +1067,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
{
|
||||
ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n");
|
||||
ImGui::Separator();
|
||||
|
||||
|
||||
static bool dont_ask_me_next_time = false;
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0));
|
||||
ImGui::Checkbox("Don't ask me next time", &dont_ask_me_next_time);
|
||||
@ -1166,24 +1166,24 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::Separator();
|
||||
|
||||
static int e = 0;
|
||||
ImGui::Text("Hello");
|
||||
ImGui::Text("Hello");
|
||||
ImGui::Button("Banana");
|
||||
ImGui::RadioButton("radio a", &e, 0);
|
||||
ImGui::RadioButton("radio a", &e, 0);
|
||||
ImGui::NextColumn();
|
||||
|
||||
ImGui::Text("ImGui");
|
||||
ImGui::Text("ImGui");
|
||||
ImGui::Button("Apple");
|
||||
ImGui::RadioButton("radio b", &e, 1);
|
||||
static float foo = 1.0f;
|
||||
ImGui::InputFloat("red", &foo, 0.05f, 0, 3);
|
||||
ImGui::InputFloat("red", &foo, 0.05f, 0, 3);
|
||||
ImGui::Text("An extra line here.");
|
||||
ImGui::NextColumn();
|
||||
|
||||
|
||||
ImGui::Text("Sailor");
|
||||
ImGui::Button("Corniflower");
|
||||
ImGui::RadioButton("radio c", &e, 2);
|
||||
static float bar = 1.0f;
|
||||
ImGui::InputFloat("blue", &bar, 0.05f, 0, 3);
|
||||
ImGui::InputFloat("blue", &bar, 0.05f, 0, 3);
|
||||
ImGui::NextColumn();
|
||||
|
||||
if (ImGui::CollapsingHeader("Category A")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
|
||||
@ -1286,11 +1286,11 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
bool focus_3 = ImGui::Button("Focus on 3");
|
||||
int has_focus = 0;
|
||||
static char buf[128] = "click on a button to set focus";
|
||||
|
||||
|
||||
if (focus_1) ImGui::SetKeyboardFocusHere();
|
||||
ImGui::InputText("1", buf, IM_ARRAYSIZE(buf));
|
||||
if (ImGui::IsItemActive()) has_focus = 1;
|
||||
|
||||
|
||||
if (focus_2) ImGui::SetKeyboardFocusHere();
|
||||
ImGui::InputText("2", buf, IM_ARRAYSIZE(buf));
|
||||
if (ImGui::IsItemActive()) has_focus = 2;
|
||||
@ -1302,7 +1302,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
ImGui::PopAllowKeyboardFocus();
|
||||
if (has_focus)
|
||||
ImGui::Text("Item with focus: %d", has_focus);
|
||||
else
|
||||
else
|
||||
ImGui::Text("Item with focus: <none>");
|
||||
ImGui::TextWrapped("Cursor & selection are preserved when refocusing last used item in code.");
|
||||
ImGui::TreePop();
|
||||
@ -1361,8 +1361,8 @@ void ImGui::ShowTestWindow(bool* opened)
|
||||
{
|
||||
char label[32];
|
||||
sprintf(label, "Mouse cursor %d", i);
|
||||
ImGui::Bullet(); ImGui::Selectable(label, false);
|
||||
if (ImGui::IsItemHovered())
|
||||
ImGui::Bullet(); ImGui::Selectable(label, false);
|
||||
if (ImGui::IsItemHovered())
|
||||
ImGui::SetMouseCursor(i);
|
||||
}
|
||||
ImGui::TreePop();
|
||||
@ -1578,7 +1578,7 @@ static void ShowExampleAppFixedOverlay(bool* opened)
|
||||
}
|
||||
ImGui::Text("Simple overlay\non the top-left side of the screen.");
|
||||
ImGui::Separator();
|
||||
ImGui::Text("Mouse Position: (%.1f,%.1f)", ImGui::GetIO().MousePos.x, ImGui::GetIO().MousePos.y);
|
||||
ImGui::Text("Mouse Position: (%.1f,%.1f)", ImGui::GetIO().MousePos.x, ImGui::GetIO().MousePos.y);
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
@ -1696,14 +1696,14 @@ struct ExampleAppConsole
|
||||
~ExampleAppConsole()
|
||||
{
|
||||
ClearLog();
|
||||
for (int i = 0; i < Items.Size; i++)
|
||||
free(History[i]);
|
||||
for (int i = 0; i < Items.Size; i++)
|
||||
free(History[i]);
|
||||
}
|
||||
|
||||
void ClearLog()
|
||||
{
|
||||
for (int i = 0; i < Items.Size; i++)
|
||||
free(Items[i]);
|
||||
for (int i = 0; i < Items.Size; i++)
|
||||
free(Items[i]);
|
||||
Items.clear();
|
||||
ScrollToBottom = true;
|
||||
}
|
||||
@ -1734,8 +1734,8 @@ struct ExampleAppConsole
|
||||
|
||||
// TODO: display items starting from the bottom
|
||||
|
||||
if (ImGui::SmallButton("Add Dummy Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } ImGui::SameLine();
|
||||
if (ImGui::SmallButton("Add Dummy Error")) AddLog("[error] something went wrong"); ImGui::SameLine();
|
||||
if (ImGui::SmallButton("Add Dummy Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } ImGui::SameLine();
|
||||
if (ImGui::SmallButton("Add Dummy Error")) AddLog("[error] something went wrong"); ImGui::SameLine();
|
||||
if (ImGui::SmallButton("Clear")) ClearLog();
|
||||
//static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); }
|
||||
|
||||
@ -2054,7 +2054,7 @@ static void ShowExampleAppLayout(bool* opened)
|
||||
}
|
||||
ImGui::EndChild();
|
||||
ImGui::SameLine();
|
||||
|
||||
|
||||
// right
|
||||
ImGui::BeginGroup();
|
||||
ImGui::BeginChild("item view", ImVec2(0, -ImGui::GetItemsLineHeightWithSpacing())); // Leave room for 1 line below us
|
||||
@ -2085,7 +2085,7 @@ static void ShowExampleAppLongText(bool* opened)
|
||||
static ImGuiTextBuffer log;
|
||||
static int lines = 0;
|
||||
ImGui::Text("Printing unusually long amount of text.");
|
||||
ImGui::Combo("Test type", &test_type, "Single call to TextUnformatted()\0Multiple calls to Text(), clipped manually\0Multiple calls to Text(), not clipped\0");
|
||||
ImGui::Combo("Test type", &test_type, "Single call to TextUnformatted()\0Multiple calls to Text(), clipped manually\0Multiple calls to Text(), not clipped\0");
|
||||
ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size());
|
||||
if (ImGui::Button("Clear")) { log.clear(); lines = 0; }
|
||||
ImGui::SameLine();
|
||||
|
@ -172,7 +172,7 @@ void ImDrawList::ChannelsMerge(int channel_count)
|
||||
return;
|
||||
|
||||
ChannelsSetCurrent(0);
|
||||
if (CmdBuffer.Size && CmdBuffer.back().ElemCount == 0)
|
||||
if (CmdBuffer.Size && CmdBuffer.back().ElemCount == 0)
|
||||
CmdBuffer.pop_back();
|
||||
|
||||
int new_cmd_buffer_count = 0, new_idx_buffer_count = 0;
|
||||
@ -292,11 +292,11 @@ void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col)
|
||||
const ImVec2 uv = GImGui->FontTexUvWhitePixel;
|
||||
const ImVec2 b(c.x, a.y);
|
||||
const ImVec2 d(a.x, c.y);
|
||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);
|
||||
_IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);
|
||||
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
|
||||
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;
|
||||
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;
|
||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);
|
||||
_IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);
|
||||
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
|
||||
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;
|
||||
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;
|
||||
_VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col;
|
||||
_VtxWritePtr += 4;
|
||||
_VtxCurrentIdx += 4;
|
||||
@ -309,11 +309,11 @@ void ImDrawList::PrimRectUV(const ImVec2& a, const ImVec2& c, const ImVec2& uv_a
|
||||
const ImVec2 d(a.x, c.y);
|
||||
const ImVec2 uv_b(uv_c.x, uv_a.y);
|
||||
const ImVec2 uv_d(uv_a.x, uv_c.y);
|
||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);
|
||||
_IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);
|
||||
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;
|
||||
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;
|
||||
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;
|
||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);
|
||||
_IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);
|
||||
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;
|
||||
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;
|
||||
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;
|
||||
_VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col;
|
||||
_VtxWritePtr += 4;
|
||||
_VtxCurrentIdx += 4;
|
||||
@ -351,7 +351,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
|
||||
|
||||
for (int i1 = 0; i1 < count; i1++)
|
||||
{
|
||||
const int i2 = (i1+1) == points_count ? 0 : i1+1;
|
||||
const int i2 = (i1+1) == points_count ? 0 : i1+1;
|
||||
ImVec2 diff = points[i2] - points[i1];
|
||||
diff *= ImInvLength(diff, 1.0f);
|
||||
temp_normals[i1].x = diff.y;
|
||||
@ -428,7 +428,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
|
||||
unsigned int idx1 = _VtxCurrentIdx;
|
||||
for (int i1 = 0; i1 < count; i1++)
|
||||
{
|
||||
const int i2 = (i1+1) == points_count ? 0 : i1+1;
|
||||
const int i2 = (i1+1) == points_count ? 0 : i1+1;
|
||||
unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+4;
|
||||
|
||||
// Average normals
|
||||
@ -480,7 +480,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
|
||||
|
||||
for (int i1 = 0; i1 < count; i1++)
|
||||
{
|
||||
const int i2 = (i1+1) == points_count ? 0 : i1+1;
|
||||
const int i2 = (i1+1) == points_count ? 0 : i1+1;
|
||||
const ImVec2& p1 = points[i1];
|
||||
const ImVec2& p2 = points[i2];
|
||||
ImVec2 diff = p2 - p1;
|
||||
@ -494,8 +494,8 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
|
||||
_VtxWritePtr[3].pos.x = p1.x - dy; _VtxWritePtr[3].pos.y = p1.y + dx; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col;
|
||||
_VtxWritePtr += 4;
|
||||
|
||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);
|
||||
_IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);
|
||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);
|
||||
_IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);
|
||||
_IdxWritePtr += 6;
|
||||
_VtxCurrentIdx += 4;
|
||||
}
|
||||
@ -578,7 +578,7 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun
|
||||
}
|
||||
for (int i = 2; i < points_count; i++)
|
||||
{
|
||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+i-1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+i);
|
||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+i-1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+i);
|
||||
_IdxWritePtr += 3;
|
||||
}
|
||||
_VtxCurrentIdx += (ImDrawIdx)vtx_count;
|
||||
@ -900,7 +900,7 @@ void ImFontAtlas::ClearFonts()
|
||||
|
||||
void ImFontAtlas::Clear()
|
||||
{
|
||||
ClearInputData();
|
||||
ClearInputData();
|
||||
ClearTexData();
|
||||
ClearFonts();
|
||||
}
|
||||
@ -1005,7 +1005,7 @@ ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels,
|
||||
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
|
||||
if (font_cfg.Name[0] == '\0')
|
||||
{
|
||||
const char* p;
|
||||
const char* p;
|
||||
for (p = filename + strlen(filename); p > filename && p[-1] != '/' && p[-1] != '\\'; p--) {}
|
||||
snprintf(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "%s", p);
|
||||
}
|
||||
@ -1016,7 +1016,7 @@ ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels,
|
||||
ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)
|
||||
{
|
||||
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
|
||||
IM_ASSERT(font_cfg.FontData == NULL);
|
||||
IM_ASSERT(font_cfg.FontData == NULL);
|
||||
font_cfg.FontData = ttf_data;
|
||||
font_cfg.FontDataSize = ttf_size;
|
||||
font_cfg.SizePixels = size_pixels;
|
||||
@ -1032,7 +1032,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_d
|
||||
stb_decompress(buf_decompressed_data, (unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size);
|
||||
|
||||
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
|
||||
IM_ASSERT(font_cfg.FontData == NULL);
|
||||
IM_ASSERT(font_cfg.FontData == NULL);
|
||||
font_cfg.FontDataOwnedByAtlas = true;
|
||||
return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, font_cfg_template, glyph_ranges);
|
||||
}
|
||||
@ -1076,7 +1076,7 @@ bool ImFontAtlas::Build()
|
||||
IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == this));
|
||||
const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo);
|
||||
IM_ASSERT(font_offset >= 0);
|
||||
if (!stbtt_InitFont(&tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset))
|
||||
if (!stbtt_InitFont(&tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset))
|
||||
return false;
|
||||
|
||||
if (!cfg.GlyphRanges)
|
||||
@ -1226,7 +1226,7 @@ bool ImFontAtlas::Build()
|
||||
dst_font->Glyphs.resize(dst_font->Glyphs.Size + 1);
|
||||
ImFont::Glyph& glyph = dst_font->Glyphs.back();
|
||||
glyph.Codepoint = (ImWchar)codepoint;
|
||||
glyph.X0 = q.x0; glyph.Y0 = q.y0; glyph.X1 = q.x1; glyph.Y1 = q.y1;
|
||||
glyph.X0 = q.x0; glyph.Y0 = q.y0; glyph.X1 = q.x1; glyph.Y1 = q.y1;
|
||||
glyph.U0 = q.s0; glyph.V0 = q.t0; glyph.U1 = q.s1; glyph.V1 = q.t1;
|
||||
glyph.Y0 += (float)(int)(dst_font->Ascent + off_y + 0.5f);
|
||||
glyph.Y1 += (float)(int)(dst_font->Ascent + off_y + 0.5f);
|
||||
@ -1367,7 +1367,7 @@ const ImWchar* ImFontAtlas::GetGlyphRangesJapanese()
|
||||
{
|
||||
// Store the 1946 ideograms code points as successive offsets from the initial unicode codepoint 0x4E00. Each offset has an implicit +1.
|
||||
// This encoding helps us reduce the source code size.
|
||||
static const short offsets_from_0x4E00[] =
|
||||
static const short offsets_from_0x4E00[] =
|
||||
{
|
||||
-1,0,1,3,0,0,0,0,1,0,5,1,1,0,7,4,6,10,0,1,9,9,7,1,3,19,1,10,7,1,0,1,0,5,1,0,6,4,2,6,0,0,12,6,8,0,3,5,0,1,0,9,0,0,8,1,1,3,4,5,13,0,0,8,2,17,
|
||||
4,3,1,1,9,6,0,0,0,2,1,3,2,22,1,9,11,1,13,1,3,12,0,5,9,2,0,6,12,5,3,12,4,1,2,16,1,1,4,6,5,3,0,6,13,15,5,12,8,14,0,0,6,15,3,6,0,18,8,1,6,14,1,
|
||||
@ -1867,8 +1867,8 @@ void ImFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_re
|
||||
// NB: we are not calling PrimRectUV() here because non-inlined causes too much overhead in a debug build.
|
||||
// inlined:
|
||||
{
|
||||
idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2);
|
||||
idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3);
|
||||
idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2);
|
||||
idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3);
|
||||
vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1;
|
||||
vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1;
|
||||
vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2;
|
||||
@ -2002,7 +2002,7 @@ static unsigned int stb_decompress(unsigned char *output, unsigned char *i, unsi
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
IM_ASSERT(stb__dout <= output + olen);
|
||||
IM_ASSERT(stb__dout <= output + olen);
|
||||
if (stb__dout > output + olen)
|
||||
return 0;
|
||||
}
|
||||
@ -2105,7 +2105,7 @@ static const char proggy_clean_ttf_compressed_data_base85[11980+1] =
|
||||
"GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp"
|
||||
"O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#";
|
||||
|
||||
static const char* GetDefaultCompressedFontDataTTFBase85()
|
||||
{
|
||||
return proggy_clean_ttf_compressed_data_base85;
|
||||
static const char* GetDefaultCompressedFontDataTTFBase85()
|
||||
{
|
||||
return proggy_clean_ttf_compressed_data_base85;
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ struct ImRect
|
||||
void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
|
||||
void Reduce(const ImVec2& amount) { Min.x += amount.x; Min.y += amount.y; Max.x -= amount.x; Max.y -= amount.y; }
|
||||
void Clip(const ImRect& clip) { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; }
|
||||
void Round() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
|
||||
void Round() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
|
||||
ImVec2 GetClosestPoint(ImVec2 p, bool on_edge) const
|
||||
{
|
||||
if (!on_edge && Contains(p))
|
||||
@ -383,7 +383,7 @@ struct ImGuiState
|
||||
|
||||
// Logging
|
||||
bool LogEnabled;
|
||||
FILE* LogFile; // If != NULL log to stdout/ file
|
||||
FILE* LogFile; // If != NULL log to stdout/ file
|
||||
ImGuiTextBuffer* LogClipboard; // Else log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
|
||||
int LogStartDepth;
|
||||
int LogAutoExpandMaxDepth;
|
||||
@ -563,14 +563,14 @@ struct ImGuiWindow
|
||||
bool Collapsed; // Set when collapsing window to become only title-bar
|
||||
bool SkipItems; // == Visible && !Collapsed
|
||||
int BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
|
||||
ImGuiID PopupID; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
|
||||
ImGuiID PopupID; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
|
||||
int AutoFitFramesX, AutoFitFramesY;
|
||||
bool AutoFitOnlyGrows;
|
||||
int AutoPosLastDirection;
|
||||
int HiddenFrames;
|
||||
int SetWindowPosAllowFlags; // bit ImGuiSetCond_*** specify if SetWindowPos() call will succeed with this particular flag.
|
||||
int SetWindowSizeAllowFlags; // bit ImGuiSetCond_*** specify if SetWindowSize() call will succeed with this particular flag.
|
||||
int SetWindowCollapsedAllowFlags; // bit ImGuiSetCond_*** specify if SetWindowCollapsed() call will succeed with this particular flag.
|
||||
int SetWindowPosAllowFlags; // bit ImGuiSetCond_*** specify if SetWindowPos() call will succeed with this particular flag.
|
||||
int SetWindowSizeAllowFlags; // bit ImGuiSetCond_*** specify if SetWindowSize() call will succeed with this particular flag.
|
||||
int SetWindowCollapsedAllowFlags; // bit ImGuiSetCond_*** specify if SetWindowCollapsed() call will succeed with this particular flag.
|
||||
bool SetWindowPosCenterWanted;
|
||||
|
||||
ImGuiDrawContext DC; // Temporary per-window data, reset at the beginning of the frame
|
||||
|
Loading…
Reference in New Issue
Block a user