build: Updated ImGui to v1.90.5
This commit is contained in:
parent
43149498cf
commit
e9ebfe36b0
@ -178,7 +178,7 @@ namespace hex {
|
|||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape))
|
||||||
this->getWindowOpenState() = false;
|
this->getWindowOpenState() = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -606,7 +606,7 @@ ImU32 TextEditor::GetGlyphColor(const Glyph &aGlyph) const {
|
|||||||
return mPalette[(int)PaletteIndex::MultiLineComment];
|
return mPalette[(int)PaletteIndex::MultiLineComment];
|
||||||
if (aGlyph.mDeactivated)
|
if (aGlyph.mDeactivated)
|
||||||
return mPalette[(int)PaletteIndex::PreprocessorDeactivated];
|
return mPalette[(int)PaletteIndex::PreprocessorDeactivated];
|
||||||
auto const color = mPalette[(int)aGlyph.mColorIndex];
|
const auto color = mPalette[(int)aGlyph.mColorIndex];
|
||||||
if (aGlyph.mPreprocessor) {
|
if (aGlyph.mPreprocessor) {
|
||||||
const auto ppcolor = mPalette[(int)PaletteIndex::Preprocessor];
|
const auto ppcolor = mPalette[(int)PaletteIndex::Preprocessor];
|
||||||
const int c0 = ((ppcolor & 0xff) + (color & 0xff)) / 2;
|
const int c0 = ((ppcolor & 0xff) + (color & 0xff)) / 2;
|
||||||
@ -621,18 +621,18 @@ ImU32 TextEditor::GetGlyphColor(const Glyph &aGlyph) const {
|
|||||||
void TextEditor::HandleKeyboardInputs() {
|
void TextEditor::HandleKeyboardInputs() {
|
||||||
ImGuiIO &io = ImGui::GetIO();
|
ImGuiIO &io = ImGui::GetIO();
|
||||||
auto shift = io.KeyShift;
|
auto shift = io.KeyShift;
|
||||||
auto left = ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_LeftArrow));
|
auto left = ImGui::IsKeyPressed(ImGuiKey_LeftArrow);
|
||||||
auto right = ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_RightArrow));
|
auto right = ImGui::IsKeyPressed(ImGuiKey_RightArrow);
|
||||||
auto up = ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_UpArrow));
|
auto up = ImGui::IsKeyPressed(ImGuiKey_UpArrow);
|
||||||
auto down = ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_DownArrow));
|
auto down = ImGui::IsKeyPressed(ImGuiKey_DownArrow);
|
||||||
auto ctrl = io.ConfigMacOSXBehaviors ? io.KeyAlt : io.KeyCtrl;
|
auto ctrl = io.ConfigMacOSXBehaviors ? io.KeyAlt : io.KeyCtrl;
|
||||||
auto alt = io.ConfigMacOSXBehaviors ? io.KeyCtrl : io.KeyAlt;
|
auto alt = io.ConfigMacOSXBehaviors ? io.KeyCtrl : io.KeyAlt;
|
||||||
auto home = io.ConfigMacOSXBehaviors ? io.KeySuper && left : ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Home));
|
auto home = io.ConfigMacOSXBehaviors ? io.KeySuper && left : ImGui::IsKeyPressed(ImGuiKey_Home);
|
||||||
auto end = io.ConfigMacOSXBehaviors ? io.KeySuper && right : ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_End));
|
auto end = io.ConfigMacOSXBehaviors ? io.KeySuper && right : ImGui::IsKeyPressed(ImGuiKey_End);
|
||||||
auto top = io.ConfigMacOSXBehaviors ? io.KeySuper && up : ctrl && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Home));
|
auto top = io.ConfigMacOSXBehaviors ? io.KeySuper && up : ctrl && ImGui::IsKeyPressed(ImGuiKey_Home);
|
||||||
auto bottom = io.ConfigMacOSXBehaviors ? io.KeySuper && down : ctrl && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_End));
|
auto bottom = io.ConfigMacOSXBehaviors ? io.KeySuper && down : ctrl && ImGui::IsKeyPressed(ImGuiKey_End);
|
||||||
auto pageUp = io.ConfigMacOSXBehaviors ? ctrl && up : ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_PageUp));
|
auto pageUp = io.ConfigMacOSXBehaviors ? ctrl && up : ImGui::IsKeyPressed(ImGuiKey_PageUp);
|
||||||
auto pageDown = io.ConfigMacOSXBehaviors ? ctrl && down : ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_PageDown));
|
auto pageDown = io.ConfigMacOSXBehaviors ? ctrl && down : ImGui::IsKeyPressed(ImGuiKey_PageDown);
|
||||||
|
|
||||||
if (ImGui::IsWindowFocused()) {
|
if (ImGui::IsWindowFocused()) {
|
||||||
if (ImGui::IsWindowHovered())
|
if (ImGui::IsWindowHovered())
|
||||||
@ -642,11 +642,11 @@ void TextEditor::HandleKeyboardInputs() {
|
|||||||
io.WantCaptureKeyboard = true;
|
io.WantCaptureKeyboard = true;
|
||||||
io.WantTextInput = true;
|
io.WantTextInput = true;
|
||||||
|
|
||||||
if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Z)))
|
if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Z))
|
||||||
Undo();
|
Undo();
|
||||||
else if (!IsReadOnly() && !ctrl && !shift && alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Backspace)))
|
else if (!IsReadOnly() && !ctrl && !shift && alt && ImGui::IsKeyPressed(ImGuiKey_Backspace))
|
||||||
Undo();
|
Undo();
|
||||||
else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Y)))
|
else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Y))
|
||||||
Redo();
|
Redo();
|
||||||
else if (!ctrl && !alt && up)
|
else if (!ctrl && !alt && up)
|
||||||
MoveUp(1, shift);
|
MoveUp(1, shift);
|
||||||
@ -668,43 +668,43 @@ void TextEditor::HandleKeyboardInputs() {
|
|||||||
MoveHome(shift);
|
MoveHome(shift);
|
||||||
else if (!ctrl && !alt && end)
|
else if (!ctrl && !alt && end)
|
||||||
MoveEnd(shift);
|
MoveEnd(shift);
|
||||||
else if (!IsReadOnly() && !ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Delete)))
|
else if (!IsReadOnly() && !ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Delete))
|
||||||
Delete();
|
Delete();
|
||||||
else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Delete))) {
|
else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Delete)) {
|
||||||
auto wordStart = GetCursorPosition();
|
auto wordStart = GetCursorPosition();
|
||||||
MoveRight();
|
MoveRight();
|
||||||
auto wordEnd = FindWordEnd(GetCursorPosition());
|
auto wordEnd = FindWordEnd(GetCursorPosition());
|
||||||
SetSelection(wordStart, wordEnd);
|
SetSelection(wordStart, wordEnd);
|
||||||
Backspace();
|
Backspace();
|
||||||
}
|
}
|
||||||
else if (!IsReadOnly() && !ctrl && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Backspace)))
|
else if (!IsReadOnly() && !ctrl && !alt && ImGui::IsKeyPressed(ImGuiKey_Backspace))
|
||||||
Backspace();
|
Backspace();
|
||||||
else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Backspace))) {
|
else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Backspace)) {
|
||||||
auto wordEnd = GetCursorPosition();
|
auto wordEnd = GetCursorPosition();
|
||||||
MoveLeft();
|
MoveLeft();
|
||||||
auto wordStart = FindWordStart(GetCursorPosition());
|
auto wordStart = FindWordStart(GetCursorPosition());
|
||||||
SetSelection(wordStart, wordEnd);
|
SetSelection(wordStart, wordEnd);
|
||||||
Backspace();
|
Backspace();
|
||||||
}
|
}
|
||||||
else if (!ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Insert)))
|
else if (!ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Insert))
|
||||||
mOverwrite = !mOverwrite;
|
mOverwrite = !mOverwrite;
|
||||||
else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Insert)))
|
else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Insert))
|
||||||
Copy();
|
Copy();
|
||||||
else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_C)))
|
else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_C))
|
||||||
Copy();
|
Copy();
|
||||||
else if (!IsReadOnly() && !ctrl && shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Insert)))
|
else if (!IsReadOnly() && !ctrl && shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Insert))
|
||||||
Paste();
|
Paste();
|
||||||
else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_V)))
|
else if (!IsReadOnly() && ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_V))
|
||||||
Paste();
|
Paste();
|
||||||
else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_X)))
|
else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_X))
|
||||||
Cut();
|
Cut();
|
||||||
else if (!ctrl && shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Delete)))
|
else if (!ctrl && shift && !alt && ImGui::IsKeyPressed(ImGuiKey_Delete))
|
||||||
Cut();
|
Cut();
|
||||||
else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_A)))
|
else if (ctrl && !shift && !alt && ImGui::IsKeyPressed(ImGuiKey_A))
|
||||||
SelectAll();
|
SelectAll();
|
||||||
else if (!IsReadOnly() && !ctrl && !shift && !alt && (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Enter)) || ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_KeypadEnter))))
|
else if (!IsReadOnly() && !ctrl && !shift && !alt && (ImGui::IsKeyPressed(ImGuiKey_Enter) || ImGui::IsKeyPressed(ImGuiKey_KeypadEnter)))
|
||||||
EnterCharacter('\n', false);
|
EnterCharacter('\n', false);
|
||||||
else if (!IsReadOnly() && !ctrl && !alt && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Tab)))
|
else if (!IsReadOnly() && !ctrl && !alt && ImGui::IsKeyPressed(ImGuiKey_Tab))
|
||||||
EnterCharacter('\t', shift);
|
EnterCharacter('\t', shift);
|
||||||
else if (!ctrl && !alt && !shift && ImGui::IsKeyPressed(ImGuiKey_F3))
|
else if (!ctrl && !alt && !shift && ImGui::IsKeyPressed(ImGuiKey_F3))
|
||||||
mFindReplaceHandler.FindMatch(this, true);
|
mFindReplaceHandler.FindMatch(this, true);
|
||||||
@ -2134,9 +2134,10 @@ bool TextEditor::FindReplaceHandler::FindNext(TextEditor *editor, bool wrapAroun
|
|||||||
curPos.mColumn = textLoc - byteIndex;
|
curPos.mColumn = textLoc - byteIndex;
|
||||||
|
|
||||||
auto &line = editor->mLines[curPos.mLine];
|
auto &line = editor->mLines[curPos.mLine];
|
||||||
for (int i = 0; i < line.size(); i++)
|
for (int i = 0; i < line.size(); i++) {
|
||||||
if (line[i].mChar == '\t')
|
if (line[i].mChar == '\t')
|
||||||
curPos.mColumn += (editor->mTabSize - 1);
|
curPos.mColumn += (editor->mTabSize - 1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
} else {// just keep adding
|
} else {// just keep adding
|
||||||
byteIndex += byteCount;
|
byteIndex += byteCount;
|
||||||
|
@ -3901,8 +3901,8 @@ CIMGUI_API void ImDrawList_AddCircle(ImDrawList* self,const ImVec2 center,float
|
|||||||
CIMGUI_API void ImDrawList_AddCircleFilled(ImDrawList* self,const ImVec2 center,float radius,ImU32 col,int num_segments);
|
CIMGUI_API void ImDrawList_AddCircleFilled(ImDrawList* self,const ImVec2 center,float radius,ImU32 col,int num_segments);
|
||||||
CIMGUI_API void ImDrawList_AddNgon(ImDrawList* self,const ImVec2 center,float radius,ImU32 col,int num_segments,float thickness);
|
CIMGUI_API void ImDrawList_AddNgon(ImDrawList* self,const ImVec2 center,float radius,ImU32 col,int num_segments,float thickness);
|
||||||
CIMGUI_API void ImDrawList_AddNgonFilled(ImDrawList* self,const ImVec2 center,float radius,ImU32 col,int num_segments);
|
CIMGUI_API void ImDrawList_AddNgonFilled(ImDrawList* self,const ImVec2 center,float radius,ImU32 col,int num_segments);
|
||||||
CIMGUI_API void ImDrawList_AddEllipse(ImDrawList* self,const ImVec2 center,float radius_x,float radius_y,ImU32 col,float rot,int num_segments,float thickness);
|
CIMGUI_API void ImDrawList_AddEllipse(ImDrawList* self,const ImVec2 center,ImVec2 radius,ImU32 col,float rot,int num_segments,float thickness);
|
||||||
CIMGUI_API void ImDrawList_AddEllipseFilled(ImDrawList* self,const ImVec2 center,float radius_x,float radius_y,ImU32 col,float rot,int num_segments);
|
CIMGUI_API void ImDrawList_AddEllipseFilled(ImDrawList* self,const ImVec2 center,ImVec2 radius,ImU32 col,float rot,int num_segments);
|
||||||
CIMGUI_API void ImDrawList_AddText_Vec2(ImDrawList* self,const ImVec2 pos,ImU32 col,const char* text_begin,const char* text_end);
|
CIMGUI_API void ImDrawList_AddText_Vec2(ImDrawList* self,const ImVec2 pos,ImU32 col,const char* text_begin,const char* text_end);
|
||||||
CIMGUI_API void ImDrawList_AddText_FontPtr(ImDrawList* self,const ImFont* font,float font_size,const ImVec2 pos,ImU32 col,const char* text_begin,const char* text_end,float wrap_width,const ImVec4* cpu_fine_clip_rect);
|
CIMGUI_API void ImDrawList_AddText_FontPtr(ImDrawList* self,const ImFont* font,float font_size,const ImVec2 pos,ImU32 col,const char* text_begin,const char* text_end,float wrap_width,const ImVec4* cpu_fine_clip_rect);
|
||||||
CIMGUI_API void ImDrawList_AddPolyline(ImDrawList* self,const ImVec2* points,int num_points,ImU32 col,ImDrawFlags flags,float thickness);
|
CIMGUI_API void ImDrawList_AddPolyline(ImDrawList* self,const ImVec2* points,int num_points,ImU32 col,ImDrawFlags flags,float thickness);
|
||||||
@ -3923,7 +3923,7 @@ CIMGUI_API void ImDrawList_PathFillConvex(ImDrawList* self,ImU32 col);
|
|||||||
CIMGUI_API void ImDrawList_PathStroke(ImDrawList* self,ImU32 col,ImDrawFlags flags,float thickness);
|
CIMGUI_API void ImDrawList_PathStroke(ImDrawList* self,ImU32 col,ImDrawFlags flags,float thickness);
|
||||||
CIMGUI_API void ImDrawList_PathArcTo(ImDrawList* self,const ImVec2 center,float radius,float a_min,float a_max,int num_segments);
|
CIMGUI_API void ImDrawList_PathArcTo(ImDrawList* self,const ImVec2 center,float radius,float a_min,float a_max,int num_segments);
|
||||||
CIMGUI_API void ImDrawList_PathArcToFast(ImDrawList* self,const ImVec2 center,float radius,int a_min_of_12,int a_max_of_12);
|
CIMGUI_API void ImDrawList_PathArcToFast(ImDrawList* self,const ImVec2 center,float radius,int a_min_of_12,int a_max_of_12);
|
||||||
CIMGUI_API void ImDrawList_PathEllipticalArcTo(ImDrawList* self,const ImVec2 center,float radius_x,float radius_y,float rot,float a_min,float a_max,int num_segments);
|
CIMGUI_API void ImDrawList_PathEllipticalArcTo(ImDrawList* self,const ImVec2 center,ImVec2 radius,float rot,float a_min,float a_max,int num_segments);
|
||||||
CIMGUI_API void ImDrawList_PathBezierCubicCurveTo(ImDrawList* self,const ImVec2 p2,const ImVec2 p3,const ImVec2 p4,int num_segments);
|
CIMGUI_API void ImDrawList_PathBezierCubicCurveTo(ImDrawList* self,const ImVec2 p2,const ImVec2 p3,const ImVec2 p4,int num_segments);
|
||||||
CIMGUI_API void ImDrawList_PathBezierQuadraticCurveTo(ImDrawList* self,const ImVec2 p2,const ImVec2 p3,int num_segments);
|
CIMGUI_API void ImDrawList_PathBezierQuadraticCurveTo(ImDrawList* self,const ImVec2 p2,const ImVec2 p3,int num_segments);
|
||||||
CIMGUI_API void ImDrawList_PathRect(ImDrawList* self,const ImVec2 rect_min,const ImVec2 rect_max,float rounding,ImDrawFlags flags);
|
CIMGUI_API void ImDrawList_PathRect(ImDrawList* self,const ImVec2 rect_min,const ImVec2 rect_max,float rounding,ImDrawFlags flags);
|
||||||
|
16
lib/third_party/imgui/cimgui/source/cimgui.cpp
vendored
16
lib/third_party/imgui/cimgui/source/cimgui.cpp
vendored
@ -2192,13 +2192,13 @@ CIMGUI_API void ImDrawList_AddNgonFilled(ImDrawList* self,const ImVec2 center,fl
|
|||||||
{
|
{
|
||||||
return self->AddNgonFilled(center,radius,col,num_segments);
|
return self->AddNgonFilled(center,radius,col,num_segments);
|
||||||
}
|
}
|
||||||
CIMGUI_API void ImDrawList_AddEllipse(ImDrawList* self,const ImVec2 center,float radius_x,float radius_y,ImU32 col,float rot,int num_segments,float thickness)
|
CIMGUI_API void ImDrawList_AddEllipse(ImDrawList* self,const ImVec2 center,ImVec2 radius,ImU32 col,float rot,int num_segments,float thickness)
|
||||||
{
|
{
|
||||||
return self->AddEllipse(center,radius_x,radius_y,col,rot,num_segments,thickness);
|
return self->AddEllipse(center,radius,col,rot,num_segments,thickness);
|
||||||
}
|
}
|
||||||
CIMGUI_API void ImDrawList_AddEllipseFilled(ImDrawList* self,const ImVec2 center,float radius_x,float radius_y,ImU32 col,float rot,int num_segments)
|
CIMGUI_API void ImDrawList_AddEllipseFilled(ImDrawList* self,const ImVec2 center,ImVec2 radius,ImU32 col,float rot,int num_segments)
|
||||||
{
|
{
|
||||||
return self->AddEllipseFilled(center,radius_x,radius_y,col,rot,num_segments);
|
return self->AddEllipseFilled(center,radius,col,rot,num_segments);
|
||||||
}
|
}
|
||||||
CIMGUI_API void ImDrawList_AddText_Vec2(ImDrawList* self,const ImVec2 pos,ImU32 col,const char* text_begin,const char* text_end)
|
CIMGUI_API void ImDrawList_AddText_Vec2(ImDrawList* self,const ImVec2 pos,ImU32 col,const char* text_begin,const char* text_end)
|
||||||
{
|
{
|
||||||
@ -2280,9 +2280,9 @@ CIMGUI_API void ImDrawList_PathArcToFast(ImDrawList* self,const ImVec2 center,fl
|
|||||||
{
|
{
|
||||||
return self->PathArcToFast(center,radius,a_min_of_12,a_max_of_12);
|
return self->PathArcToFast(center,radius,a_min_of_12,a_max_of_12);
|
||||||
}
|
}
|
||||||
CIMGUI_API void ImDrawList_PathEllipticalArcTo(ImDrawList* self,const ImVec2 center,float radius_x,float radius_y,float rot,float a_min,float a_max,int num_segments)
|
CIMGUI_API void ImDrawList_PathEllipticalArcTo(ImDrawList* self,const ImVec2 center,ImVec2 radius,float rot,float a_min,float a_max,int num_segments)
|
||||||
{
|
{
|
||||||
return self->PathEllipticalArcTo(center,radius_x,radius_y,rot,a_min,a_max,num_segments);
|
return self->PathEllipticalArcTo(center,radius,rot,a_min,a_max,num_segments);
|
||||||
}
|
}
|
||||||
CIMGUI_API void ImDrawList_PathBezierCubicCurveTo(ImDrawList* self,const ImVec2 p2,const ImVec2 p3,const ImVec2 p4,int num_segments)
|
CIMGUI_API void ImDrawList_PathBezierCubicCurveTo(ImDrawList* self,const ImVec2 p2,const ImVec2 p3,const ImVec2 p4,int num_segments)
|
||||||
{
|
{
|
||||||
@ -2740,10 +2740,6 @@ CIMGUI_API void ImGuiPlatformImeData_destroy(ImGuiPlatformImeData* self)
|
|||||||
{
|
{
|
||||||
IM_DELETE(self);
|
IM_DELETE(self);
|
||||||
}
|
}
|
||||||
CIMGUI_API ImGuiKey igGetKeyIndex(ImGuiKey key)
|
|
||||||
{
|
|
||||||
return ImGui::GetKeyIndex(key);
|
|
||||||
}
|
|
||||||
CIMGUI_API ImGuiID igImHashData(const void* data,size_t data_size,ImGuiID seed)
|
CIMGUI_API ImGuiID igImHashData(const void* data,size_t data_size,ImGuiID seed)
|
||||||
{
|
{
|
||||||
return ImHashData(data,data_size,seed);
|
return ImHashData(data,data_size,seed);
|
||||||
|
83
lib/third_party/imgui/imgui/include/imgui.h
vendored
83
lib/third_party/imgui/imgui/include/imgui.h
vendored
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.4
|
// dear imgui, v1.90.5
|
||||||
// (headers)
|
// (headers)
|
||||||
|
|
||||||
// Help:
|
// Help:
|
||||||
@ -7,15 +7,19 @@
|
|||||||
// - Read top of imgui.cpp for more details, links and comments.
|
// - Read top of imgui.cpp for more details, links and comments.
|
||||||
|
|
||||||
// Resources:
|
// Resources:
|
||||||
// - FAQ https://dearimgui.com/faq
|
// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md)
|
||||||
// - Getting Started https://dearimgui.com/getting-started
|
// - Homepage ................... https://github.com/ocornut/imgui
|
||||||
// - Homepage https://github.com/ocornut/imgui
|
// - Releases & changelog ....... https://github.com/ocornut/imgui/releases
|
||||||
// - Releases & changelog https://github.com/ocornut/imgui/releases
|
// - Gallery .................... https://github.com/ocornut/imgui/issues/6897 (please post your screenshots/video there!)
|
||||||
// - Gallery https://github.com/ocornut/imgui/issues/6897 (please post your screenshots/video there!)
|
// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there)
|
||||||
// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there)
|
// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code)
|
||||||
// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
|
// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more)
|
||||||
// - Issues & support https://github.com/ocornut/imgui/issues
|
// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines)
|
||||||
// - Tests & Automation https://github.com/ocornut/imgui_test_engine
|
// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
|
||||||
|
// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools
|
||||||
|
// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui
|
||||||
|
// - Issues & support ........... https://github.com/ocornut/imgui/issues
|
||||||
|
// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps)
|
||||||
|
|
||||||
// For first-time users having issues compiling/linking/running/loading fonts:
|
// For first-time users having issues compiling/linking/running/loading fonts:
|
||||||
// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
|
// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
|
||||||
@ -23,8 +27,8 @@
|
|||||||
|
|
||||||
// Library Version
|
// Library Version
|
||||||
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
||||||
#define IMGUI_VERSION "1.90.4"
|
#define IMGUI_VERSION "1.90.5"
|
||||||
#define IMGUI_VERSION_NUM 19040
|
#define IMGUI_VERSION_NUM 19050
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
#define IMGUI_HAS_VIEWPORT // Viewport WIP branch
|
#define IMGUI_HAS_VIEWPORT // Viewport WIP branch
|
||||||
#define IMGUI_HAS_DOCK // Docking WIP branch
|
#define IMGUI_HAS_DOCK // Docking WIP branch
|
||||||
@ -176,8 +180,9 @@ struct ImGuiWindowClass; // Window class (rare/advanced uses: provide
|
|||||||
// Enumerations
|
// Enumerations
|
||||||
// - We don't use strongly typed enums much because they add constraints (can't extend in private code, can't store typed in bit fields, extra casting on iteration)
|
// - We don't use strongly typed enums much because they add constraints (can't extend in private code, can't store typed in bit fields, extra casting on iteration)
|
||||||
// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists!
|
// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists!
|
||||||
// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
||||||
// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
|
// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
|
||||||
|
// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
|
||||||
enum ImGuiKey : int; // -> enum ImGuiKey // Enum: A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value)
|
enum ImGuiKey : int; // -> enum ImGuiKey // Enum: A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value)
|
||||||
enum ImGuiMouseSource : int; // -> enum ImGuiMouseSource // Enum; A mouse input source identifier (Mouse, TouchScreen, Pen)
|
enum ImGuiMouseSource : int; // -> enum ImGuiMouseSource // Enum; A mouse input source identifier (Mouse, TouchScreen, Pen)
|
||||||
typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling
|
typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling
|
||||||
@ -192,8 +197,9 @@ typedef int ImGuiTableBgTarget; // -> enum ImGuiTableBgTarget_ // Enum: A
|
|||||||
|
|
||||||
// Flags (declared as int to allow using as flags without overhead, and to not pollute the top of this file)
|
// Flags (declared as int to allow using as flags without overhead, and to not pollute the top of this file)
|
||||||
// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists!
|
// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists!
|
||||||
// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
||||||
// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
|
// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
|
||||||
|
// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
|
||||||
typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions
|
typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions
|
||||||
typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance
|
typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance
|
||||||
typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build
|
typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build
|
||||||
@ -1624,8 +1630,9 @@ enum ImGuiCol_
|
|||||||
// - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code.
|
// - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code.
|
||||||
// During initialization or between frames, feel free to just poke into ImGuiStyle directly.
|
// During initialization or between frames, feel free to just poke into ImGuiStyle directly.
|
||||||
// - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description.
|
// - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description.
|
||||||
// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
||||||
// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
|
// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
|
||||||
|
// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
|
||||||
// - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type.
|
// - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type.
|
||||||
enum ImGuiStyleVar_
|
enum ImGuiStyleVar_
|
||||||
{
|
{
|
||||||
@ -1653,7 +1660,9 @@ enum ImGuiStyleVar_
|
|||||||
ImGuiStyleVar_GrabMinSize, // float GrabMinSize
|
ImGuiStyleVar_GrabMinSize, // float GrabMinSize
|
||||||
ImGuiStyleVar_GrabRounding, // float GrabRounding
|
ImGuiStyleVar_GrabRounding, // float GrabRounding
|
||||||
ImGuiStyleVar_TabRounding, // float TabRounding
|
ImGuiStyleVar_TabRounding, // float TabRounding
|
||||||
|
ImGuiStyleVar_TabBorderSize, // float TabBorderSize
|
||||||
ImGuiStyleVar_TabBarBorderSize, // float TabBarBorderSize
|
ImGuiStyleVar_TabBarBorderSize, // float TabBarBorderSize
|
||||||
|
ImGuiStyleVar_TableAngledHeadersAngle,// float TableAngledHeadersAngle
|
||||||
ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign
|
ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign
|
||||||
ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign
|
ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign
|
||||||
ImGuiStyleVar_SeparatorTextBorderSize,// float SeparatorTextBorderSize
|
ImGuiStyleVar_SeparatorTextBorderSize,// float SeparatorTextBorderSize
|
||||||
@ -2074,7 +2083,7 @@ struct ImGuiStyle
|
|||||||
float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
|
float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
|
||||||
ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines.
|
ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines.
|
||||||
ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label).
|
ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label).
|
||||||
ImVec2 CellPadding; // Padding within a table cell. CellPadding.y may be altered between different rows.
|
ImVec2 CellPadding; // Padding within a table cell. Cellpadding.x is locked for entire table. CellPadding.y may be altered between different rows.
|
||||||
ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
|
ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
|
||||||
float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
|
float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
|
||||||
float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
|
float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
|
||||||
@ -2125,6 +2134,9 @@ struct ImGuiStyle
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Communicate most settings and inputs/outputs to Dear ImGui using this structure.
|
// Communicate most settings and inputs/outputs to Dear ImGui using this structure.
|
||||||
// Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage.
|
// Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage.
|
||||||
|
// It is generally expected that:
|
||||||
|
// - initialization: backends and user code writes to ImGuiIO.
|
||||||
|
// - main loop: backends writes to ImGuiIO, user code and imgui code reads from ImGuiIO.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
// [Internal] Storage used by IsKeyDown(), IsKeyPressed() etc functions.
|
// [Internal] Storage used by IsKeyDown(), IsKeyPressed() etc functions.
|
||||||
@ -2365,6 +2377,8 @@ struct ImGuiInputTextCallbackData
|
|||||||
void* UserData; // What user passed to InputText() // Read-only
|
void* UserData; // What user passed to InputText() // Read-only
|
||||||
|
|
||||||
// Arguments for the different callback events
|
// Arguments for the different callback events
|
||||||
|
// - During Resize callback, Buf will be same as your input buffer.
|
||||||
|
// - However, during Completion/History/Always callback, Buf always points to our own internal data (it is not the same as your buffer)! Changes to it will be reflected into your own buffer shortly after the callback.
|
||||||
// - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary.
|
// - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary.
|
||||||
// - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state.
|
// - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state.
|
||||||
ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0;
|
ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0;
|
||||||
@ -2872,15 +2886,20 @@ struct ImDrawList
|
|||||||
IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0);
|
IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0);
|
||||||
IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f);
|
IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f);
|
||||||
IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments);
|
IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments);
|
||||||
IMGUI_API void AddEllipse(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f);
|
IMGUI_API void AddEllipse(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f);
|
||||||
IMGUI_API void AddEllipseFilled(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0);
|
IMGUI_API void AddEllipseFilled(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot = 0.0f, int num_segments = 0);
|
||||||
IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
|
IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
|
||||||
IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
|
IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
|
||||||
IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness);
|
|
||||||
IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col);
|
|
||||||
IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points)
|
IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points)
|
||||||
IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points)
|
IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points)
|
||||||
|
|
||||||
|
// General polygon
|
||||||
|
// - Only simple polygons are supported by filling functions (no self-intersections, no holes).
|
||||||
|
// - Concave polygon fill is more expensive than convex one: it has O(N^2) complexity. Provided as a convenience fo user but not used by main library.
|
||||||
|
IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness);
|
||||||
|
IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col);
|
||||||
|
IMGUI_API void AddConcavePolyFilled(const ImVec2* points, int num_points, ImU32 col);
|
||||||
|
|
||||||
// Image primitives
|
// Image primitives
|
||||||
// - Read FAQ to understand what ImTextureID is.
|
// - Read FAQ to understand what ImTextureID is.
|
||||||
// - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle.
|
// - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle.
|
||||||
@ -2913,10 +2932,11 @@ struct ImDrawList
|
|||||||
inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); }
|
inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); }
|
||||||
inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); }
|
inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); }
|
||||||
inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; }
|
inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; }
|
||||||
|
inline void PathFillConcave(ImU32 col) { AddConcavePolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; }
|
||||||
inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; }
|
inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; }
|
||||||
IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0);
|
IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0);
|
||||||
IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle
|
IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle
|
||||||
IMGUI_API void PathEllipticalArcTo(const ImVec2& center, float radius_x, float radius_y, float rot, float a_min, float a_max, int num_segments = 0); // Ellipse
|
IMGUI_API void PathEllipticalArcTo(const ImVec2& center, const ImVec2& radius, float rot, float a_min, float a_max, int num_segments = 0); // Ellipse
|
||||||
IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points)
|
IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points)
|
||||||
IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points)
|
IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points)
|
||||||
IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0);
|
IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0);
|
||||||
@ -2949,6 +2969,9 @@ struct ImDrawList
|
|||||||
inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index
|
inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index
|
||||||
|
|
||||||
// Obsolete names
|
// Obsolete names
|
||||||
|
//inline void AddEllipse(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f) { AddEllipse(center, ImVec2(radius_x, radius_y), col, rot, num_segments, thickness); } // OBSOLETED in 1.90.5 (Mar 2024)
|
||||||
|
//inline void AddEllipseFilled(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0) { AddEllipseFilled(center, ImVec2(radius_x, radius_y), col, rot, num_segments); } // OBSOLETED in 1.90.5 (Mar 2024)
|
||||||
|
//inline void PathEllipticalArcTo(const ImVec2& center, float radius_x, float radius_y, float rot, float a_min, float a_max, int num_segments = 0) { PathEllipticalArcTo(center, ImVec2(radius_x, radius_y), rot, a_min, a_max, num_segments); } // OBSOLETED in 1.90.5 (Mar 2024)
|
||||||
//inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
|
//inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
|
||||||
//inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
|
//inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021)
|
||||||
|
|
||||||
@ -3472,15 +3495,6 @@ struct ImGuiPlatformImeData
|
|||||||
// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead.
|
// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
namespace ImGui
|
|
||||||
{
|
|
||||||
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
|
|
||||||
IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); // map ImGuiKey_* values into legacy native key index. == io.KeyMap[key]
|
|
||||||
#else
|
|
||||||
static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END && "ImGuiKey and native_index was merged together and native_index is disabled by IMGUI_DISABLE_OBSOLETE_KEYIO. Please switch to ImGuiKey."); return key; }
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||||
namespace ImGui
|
namespace ImGui
|
||||||
{
|
{
|
||||||
@ -3502,6 +3516,9 @@ namespace ImGui
|
|||||||
// OBSOLETED in 1.88 (from May 2022)
|
// OBSOLETED in 1.88 (from May 2022)
|
||||||
static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value.
|
static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value.
|
||||||
static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value.
|
static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value.
|
||||||
|
// OBSOLETED in 1.87 (from February 2022)
|
||||||
|
IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); // Map ImGuiKey_* values into legacy native key index. == io.KeyMap[key]. When using a 1.87+ backend using io.AddKeyEvent(), calling GetKeyIndex() with ANY ImGuiKey_XXXX values will return the same value!
|
||||||
|
//static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END); return key; }
|
||||||
|
|
||||||
// Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE)
|
// Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE)
|
||||||
//-- OBSOLETED in 1.86 (from November 2021)
|
//-- OBSOLETED in 1.86 (from November 2021)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.4
|
// dear imgui, v1.90.5
|
||||||
// (internal structures/api)
|
// (internal structures/api)
|
||||||
|
|
||||||
// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
|
// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
|
||||||
@ -87,10 +87,12 @@ Index of this file:
|
|||||||
#pragma clang diagnostic ignored "-Wdouble-promotion"
|
#pragma clang diagnostic ignored "-Wdouble-promotion"
|
||||||
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
|
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
|
||||||
#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn'
|
#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn'
|
||||||
|
#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
|
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
|
||||||
#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
|
#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
|
||||||
|
#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h
|
// In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h
|
||||||
@ -510,7 +512,8 @@ IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const
|
|||||||
IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
|
IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
|
||||||
IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
|
IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
|
||||||
IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
|
IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
|
||||||
inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
|
inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
|
||||||
|
inline bool ImTriangleIsClockwise(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ((b.x - a.x) * (c.y - b.y)) - ((c.x - b.x) * (b.y - a.y)) > 0.0f; }
|
||||||
|
|
||||||
// Helper: ImVec1 (1D vector)
|
// Helper: ImVec1 (1D vector)
|
||||||
// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
|
// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
|
||||||
@ -878,6 +881,7 @@ enum ImGuiInputTextFlagsPrivate_
|
|||||||
ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline()
|
ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline()
|
||||||
ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data
|
ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data
|
||||||
ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
|
ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
|
||||||
|
ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 29, // For internal use by InputScalar() and TempInputScalar()
|
||||||
};
|
};
|
||||||
|
|
||||||
// Extend ImGuiButtonFlags_
|
// Extend ImGuiButtonFlags_
|
||||||
@ -1315,7 +1319,7 @@ struct ImGuiPopupData
|
|||||||
{
|
{
|
||||||
ImGuiID PopupId; // Set on OpenPopup()
|
ImGuiID PopupId; // Set on OpenPopup()
|
||||||
ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
|
ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
|
||||||
ImGuiWindow* BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
|
ImGuiWindow* RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
|
||||||
int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value
|
int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value
|
||||||
int OpenFrameCount; // Set on OpenPopup()
|
int OpenFrameCount; // Set on OpenPopup()
|
||||||
ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
|
ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
|
||||||
@ -1373,7 +1377,6 @@ enum ImGuiInputSource
|
|||||||
ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them.
|
ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them.
|
||||||
ImGuiInputSource_Keyboard,
|
ImGuiInputSource_Keyboard,
|
||||||
ImGuiInputSource_Gamepad,
|
ImGuiInputSource_Gamepad,
|
||||||
ImGuiInputSource_Clipboard, // Currently only used by InputText()
|
|
||||||
ImGuiInputSource_COUNT
|
ImGuiInputSource_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1604,6 +1607,7 @@ enum ImGuiNavMoveFlags_
|
|||||||
ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item.
|
ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item.
|
||||||
ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo
|
ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo
|
||||||
ImGuiNavMoveFlags_NoSetNavHighlight = 1 << 14, // Do not alter the visible state of keyboard vs mouse nav highlight
|
ImGuiNavMoveFlags_NoSetNavHighlight = 1 << 14, // Do not alter the visible state of keyboard vs mouse nav highlight
|
||||||
|
ImGuiNavMoveFlags_NoClearActiveId = 1 << 15, // (Experimental) Do not clear active id when applying move result
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ImGuiNavLayer
|
enum ImGuiNavLayer
|
||||||
|
211
lib/third_party/imgui/imgui/source/imgui.cpp
vendored
211
lib/third_party/imgui/imgui/source/imgui.cpp
vendored
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.4
|
// dear imgui, v1.90.5
|
||||||
// (main code and documentation)
|
// (main code and documentation)
|
||||||
|
|
||||||
// Help:
|
// Help:
|
||||||
@ -7,15 +7,19 @@
|
|||||||
// - Read top of imgui.cpp for more details, links and comments.
|
// - Read top of imgui.cpp for more details, links and comments.
|
||||||
|
|
||||||
// Resources:
|
// Resources:
|
||||||
// - FAQ https://dearimgui.com/faq
|
// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md)
|
||||||
// - Getting Started https://dearimgui.com/getting-started
|
// - Homepage ................... https://github.com/ocornut/imgui
|
||||||
// - Homepage https://github.com/ocornut/imgui
|
// - Releases & changelog ....... https://github.com/ocornut/imgui/releases
|
||||||
// - Releases & changelog https://github.com/ocornut/imgui/releases
|
// - Gallery .................... https://github.com/ocornut/imgui/issues/6897 (please post your screenshots/video there!)
|
||||||
// - Gallery https://github.com/ocornut/imgui/issues/6897 (please post your screenshots/video there!)
|
// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there)
|
||||||
// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there)
|
// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code)
|
||||||
// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
|
// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more)
|
||||||
// - Issues & support https://github.com/ocornut/imgui/issues
|
// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines)
|
||||||
// - Tests & Automation https://github.com/ocornut/imgui_test_engine
|
// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
|
||||||
|
// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools
|
||||||
|
// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui
|
||||||
|
// - Issues & support ........... https://github.com/ocornut/imgui/issues
|
||||||
|
// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps)
|
||||||
|
|
||||||
// For first-time users having issues compiling/linking/running/loading fonts:
|
// For first-time users having issues compiling/linking/running/loading fonts:
|
||||||
// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
|
// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above.
|
||||||
@ -26,7 +30,7 @@
|
|||||||
// See LICENSE.txt for copyright and licensing details (standard MIT License).
|
// See LICENSE.txt for copyright and licensing details (standard MIT License).
|
||||||
// This library is free but needs your support to sustain development and maintenance.
|
// This library is free but needs your support to sustain development and maintenance.
|
||||||
// Businesses: you can support continued development via B2B invoiced technical support, maintenance and sponsoring contracts.
|
// Businesses: you can support continued development via B2B invoiced technical support, maintenance and sponsoring contracts.
|
||||||
// PLEASE reach out at omar AT dearimgui DOT com. See https://github.com/ocornut/imgui/wiki/Sponsors
|
// PLEASE reach out at omar AT dearimgui DOT com. See https://github.com/ocornut/imgui/wiki/Funding
|
||||||
// Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine.
|
// Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine.
|
||||||
|
|
||||||
// It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library.
|
// It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library.
|
||||||
@ -73,6 +77,7 @@ CODE
|
|||||||
// [SECTION] RENDER HELPERS
|
// [SECTION] RENDER HELPERS
|
||||||
// [SECTION] INITIALIZATION, SHUTDOWN
|
// [SECTION] INITIALIZATION, SHUTDOWN
|
||||||
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
|
||||||
|
// [SECTION] ID STACK
|
||||||
// [SECTION] INPUTS
|
// [SECTION] INPUTS
|
||||||
// [SECTION] ERROR CHECKING
|
// [SECTION] ERROR CHECKING
|
||||||
// [SECTION] ITEM SUBMISSION
|
// [SECTION] ITEM SUBMISSION
|
||||||
@ -433,6 +438,9 @@ CODE
|
|||||||
- likewise io.MousePos and GetMousePos() will use OS coordinates.
|
- likewise io.MousePos and GetMousePos() will use OS coordinates.
|
||||||
If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
|
If you query mouse positions to interact with non-imgui coordinates you will need to offset them, e.g. subtract GetWindowViewport()->Pos.
|
||||||
|
|
||||||
|
- 2024/03/18 (1.90.5) - merged the radius_x/radius_y parameters in ImDrawList::AddEllipse(), AddEllipseFilled() and PathEllipticalArcTo() into a single ImVec2 parameter. Exceptionally, because those functions were added in 1.90, we are not adding inline redirection functions. The transition is easy and should affect few users. (#2743, #7417)
|
||||||
|
- 2024/03/08 (1.90.5) - inputs: more formally obsoleted GetKeyIndex() when IMGUI_DISABLE_OBSOLETE_FUNCTIONS is set. It has been unnecessary and a no-op since 1.87 (it returns the same value as passed when used with a 1.87+ backend using io.AddKeyEvent() function). (#4921)
|
||||||
|
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
|
||||||
- 2024/01/15 (1.90.2) - commented out obsolete ImGuiIO::ImeWindowHandle marked obsolete in 1.87, favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'.
|
- 2024/01/15 (1.90.2) - commented out obsolete ImGuiIO::ImeWindowHandle marked obsolete in 1.87, favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'.
|
||||||
- 2023/12/19 (1.90.1) - commented out obsolete ImGuiKey_KeyPadEnter redirection to ImGuiKey_KeypadEnter.
|
- 2023/12/19 (1.90.1) - commented out obsolete ImGuiKey_KeyPadEnter redirection to ImGuiKey_KeypadEnter.
|
||||||
- 2023/11/06 (1.90.1) - removed CalcListClipping() marked obsolete in 1.86. Prefer using ImGuiListClipper which can return non-contiguous ranges.
|
- 2023/11/06 (1.90.1) - removed CalcListClipping() marked obsolete in 1.86. Prefer using ImGuiListClipper which can return non-contiguous ranges.
|
||||||
@ -943,7 +951,7 @@ CODE
|
|||||||
A: - Businesses: please reach out to "omar AT dearimgui DOT com" if you work in a place using Dear ImGui!
|
A: - Businesses: please reach out to "omar AT dearimgui DOT com" if you work in a place using Dear ImGui!
|
||||||
We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts.
|
We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts.
|
||||||
This is among the most useful thing you can do for Dear ImGui. With increased funding, we sustain and grow work on this project.
|
This is among the most useful thing you can do for Dear ImGui. With increased funding, we sustain and grow work on this project.
|
||||||
Also see https://github.com/ocornut/imgui/wiki/Sponsors
|
>>> See https://github.com/ocornut/imgui/wiki/Funding
|
||||||
- Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine.
|
- Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine.
|
||||||
- If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, and see how you want to help and can help!
|
- If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, and see how you want to help and can help!
|
||||||
- Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc.
|
- Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc.
|
||||||
@ -1219,7 +1227,7 @@ ImGuiStyle::ImGuiStyle()
|
|||||||
FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested.
|
FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested.
|
||||||
ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines
|
ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines
|
||||||
ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)
|
ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)
|
||||||
CellPadding = ImVec2(4,2); // Padding within a table cell. CellPadding.y may be altered between different rows.
|
CellPadding = ImVec2(4,2); // Padding within a table cell. Cellpadding.x is locked for entire table. CellPadding.y may be altered between different rows.
|
||||||
TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
|
TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
|
||||||
IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
|
IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
|
||||||
ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
|
ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
|
||||||
@ -3190,7 +3198,9 @@ static const ImGuiDataVarInfo GStyleVarInfo[] =
|
|||||||
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize
|
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize
|
||||||
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding
|
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding
|
||||||
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding
|
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding
|
||||||
|
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabBorderSize) }, // ImGuiStyleVar_TabBorderSize
|
||||||
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabBarBorderSize) }, // ImGuiStyleVar_TabBarBorderSize
|
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabBarBorderSize) }, // ImGuiStyleVar_TabBarBorderSize
|
||||||
|
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TableAngledHeadersAngle)},// ImGuiStyleVar_TableAngledHeadersAngle
|
||||||
{ ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign
|
{ ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign
|
||||||
{ ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign
|
{ ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign
|
||||||
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, SeparatorTextBorderSize) },// ImGuiStyleVar_SeparatorTextBorderSize
|
{ ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, SeparatorTextBorderSize) },// ImGuiStyleVar_SeparatorTextBorderSize
|
||||||
@ -3866,45 +3876,6 @@ ImGuiWindow::~ImGuiWindow()
|
|||||||
ColumnsStorage.clear_destruct();
|
ColumnsStorage.clear_destruct();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
|
|
||||||
{
|
|
||||||
ImGuiID seed = IDStack.back();
|
|
||||||
ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed);
|
|
||||||
ImGuiContext& g = *Ctx;
|
|
||||||
if (g.DebugHookIdInfo == id)
|
|
||||||
ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGuiID ImGuiWindow::GetID(const void* ptr)
|
|
||||||
{
|
|
||||||
ImGuiID seed = IDStack.back();
|
|
||||||
ImGuiID id = ImHashData(&ptr, sizeof(void*), seed);
|
|
||||||
ImGuiContext& g = *Ctx;
|
|
||||||
if (g.DebugHookIdInfo == id)
|
|
||||||
ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGuiID ImGuiWindow::GetID(int n)
|
|
||||||
{
|
|
||||||
ImGuiID seed = IDStack.back();
|
|
||||||
ImGuiID id = ImHashData(&n, sizeof(n), seed);
|
|
||||||
ImGuiContext& g = *Ctx;
|
|
||||||
if (g.DebugHookIdInfo == id)
|
|
||||||
ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is only used in rare/specific situations to manufacture an ID out of nowhere.
|
|
||||||
ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs)
|
|
||||||
{
|
|
||||||
ImGuiID seed = IDStack.back();
|
|
||||||
ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs);
|
|
||||||
ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetCurrentWindow(ImGuiWindow* window)
|
static void SetCurrentWindow(ImGuiWindow* window)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -6193,7 +6164,7 @@ static int ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& si
|
|||||||
|
|
||||||
int ret_auto_fit_mask = 0x00;
|
int ret_auto_fit_mask = 0x00;
|
||||||
const float grip_draw_size = IM_TRUNC(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
|
const float grip_draw_size = IM_TRUNC(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
|
||||||
const float grip_hover_inner_size = IM_TRUNC(grip_draw_size * 0.75f);
|
const float grip_hover_inner_size = (resize_grip_count > 0) ? IM_TRUNC(grip_draw_size * 0.75f) : 0.0f;
|
||||||
const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_HOVER_PADDING : 0.0f;
|
const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_HOVER_PADDING : 0.0f;
|
||||||
|
|
||||||
ImRect clamp_rect = visibility_rect;
|
ImRect clamp_rect = visibility_rect;
|
||||||
@ -6331,10 +6302,13 @@ static int ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& si
|
|||||||
border_target = ImClamp(border_target, clamp_min, clamp_max);
|
border_target = ImClamp(border_target, clamp_min, clamp_max);
|
||||||
if (flags & ImGuiWindowFlags_ChildWindow) // Clamp resizing of childs within parent
|
if (flags & ImGuiWindowFlags_ChildWindow) // Clamp resizing of childs within parent
|
||||||
{
|
{
|
||||||
if ((flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (flags & ImGuiWindowFlags_NoScrollbar))
|
ImGuiWindowFlags parent_flags = window->ParentWindow->Flags;
|
||||||
border_target.x = ImClamp(border_target.x, window->ParentWindow->InnerClipRect.Min.x, window->ParentWindow->InnerClipRect.Max.x);
|
ImRect border_limit_rect = window->ParentWindow->InnerRect;
|
||||||
if (flags & ImGuiWindowFlags_NoScrollbar)
|
border_limit_rect.Expand(ImVec2(-ImMax(window->WindowPadding.x, window->WindowBorderSize), -ImMax(window->WindowPadding.y, window->WindowBorderSize)));
|
||||||
border_target.y = ImClamp(border_target.y, window->ParentWindow->InnerClipRect.Min.y, window->ParentWindow->InnerClipRect.Max.y);
|
if ((parent_flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (parent_flags & ImGuiWindowFlags_NoScrollbar))
|
||||||
|
border_target.x = ImClamp(border_target.x, border_limit_rect.Min.x, border_limit_rect.Max.x);
|
||||||
|
if (parent_flags & ImGuiWindowFlags_NoScrollbar)
|
||||||
|
border_target.y = ImClamp(border_target.y, border_limit_rect.Min.y, border_limit_rect.Max.y);
|
||||||
}
|
}
|
||||||
if (!ignore_resize)
|
if (!ignore_resize)
|
||||||
CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target);
|
CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target);
|
||||||
@ -6899,7 +6873,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
PushFocusScope((flags & ImGuiWindowFlags_NavFlattened) ? g.CurrentFocusScopeId : window->ID);
|
PushFocusScope((flags & ImGuiWindowFlags_NavFlattened) ? g.CurrentFocusScopeId : window->ID);
|
||||||
window->NavRootFocusScopeId = g.CurrentFocusScopeId;
|
window->NavRootFocusScopeId = g.CurrentFocusScopeId;
|
||||||
|
|
||||||
// Add to popup stack
|
// Add to popup stacks: update OpenPopupStack[] data, push to BeginPopupStack[]
|
||||||
if (flags & ImGuiWindowFlags_Popup)
|
if (flags & ImGuiWindowFlags_Popup)
|
||||||
{
|
{
|
||||||
ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size];
|
ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size];
|
||||||
@ -7062,8 +7036,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x);
|
window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x);
|
||||||
window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y;
|
window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y;
|
||||||
|
|
||||||
|
// Depending on condition we use previous or current window size to compare against contents size to decide if a scrollbar should be visible.
|
||||||
|
// Those flags will be altered further down in the function depending on more conditions.
|
||||||
bool use_current_size_for_scrollbar_x = window_just_created;
|
bool use_current_size_for_scrollbar_x = window_just_created;
|
||||||
bool use_current_size_for_scrollbar_y = window_just_created;
|
bool use_current_size_for_scrollbar_y = window_just_created;
|
||||||
|
if (window_size_x_set_by_api && window->ContentSizeExplicit.x != 0.0f)
|
||||||
|
use_current_size_for_scrollbar_x = true;
|
||||||
|
if (window_size_y_set_by_api && window->ContentSizeExplicit.y != 0.0f) // #7252
|
||||||
|
use_current_size_for_scrollbar_y = true;
|
||||||
|
|
||||||
// Collapse window by double-clicking on title bar
|
// Collapse window by double-clicking on title bar
|
||||||
// At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing
|
// At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing
|
||||||
@ -7071,8 +7051,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
{
|
{
|
||||||
// We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed), so verify that we don't have items over the title bar.
|
// We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed), so verify that we don't have items over the title bar.
|
||||||
ImRect title_bar_rect = window->TitleBarRect();
|
ImRect title_bar_rect = window->TitleBarRect();
|
||||||
if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseClickedCount[0] == 2)
|
if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max))
|
||||||
window->WantCollapseToggle = true;
|
if (g.IO.MouseClickedCount[0] == 2 && GetKeyOwner(ImGuiKey_MouseLeft) == ImGuiKeyOwner_None)
|
||||||
|
window->WantCollapseToggle = true;
|
||||||
if (window->WantCollapseToggle)
|
if (window->WantCollapseToggle)
|
||||||
{
|
{
|
||||||
window->Collapsed = !window->Collapsed;
|
window->Collapsed = !window->Collapsed;
|
||||||
@ -8607,6 +8588,69 @@ ImGuiStorage* ImGui::GetStateStorage()
|
|||||||
return window->DC.StateStorage;
|
return window->DC.StateStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ImGui::IsRectVisible(const ImVec2& size)
|
||||||
|
{
|
||||||
|
ImGuiWindow* window = GImGui->CurrentWindow;
|
||||||
|
return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max)
|
||||||
|
{
|
||||||
|
ImGuiWindow* window = GImGui->CurrentWindow;
|
||||||
|
return window->ClipRect.Overlaps(ImRect(rect_min, rect_max));
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// [SECTION] ID STACK
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// This is one of the very rare legacy case where we use ImGuiWindow methods,
|
||||||
|
// it should ideally be flattened at some point but it's been used a lots by widgets.
|
||||||
|
ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
|
||||||
|
{
|
||||||
|
ImGuiID seed = IDStack.back();
|
||||||
|
ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed);
|
||||||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
|
ImGuiContext& g = *Ctx;
|
||||||
|
if (g.DebugHookIdInfo == id)
|
||||||
|
ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end);
|
||||||
|
#endif
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiID ImGuiWindow::GetID(const void* ptr)
|
||||||
|
{
|
||||||
|
ImGuiID seed = IDStack.back();
|
||||||
|
ImGuiID id = ImHashData(&ptr, sizeof(void*), seed);
|
||||||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
|
ImGuiContext& g = *Ctx;
|
||||||
|
if (g.DebugHookIdInfo == id)
|
||||||
|
ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL);
|
||||||
|
#endif
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiID ImGuiWindow::GetID(int n)
|
||||||
|
{
|
||||||
|
ImGuiID seed = IDStack.back();
|
||||||
|
ImGuiID id = ImHashData(&n, sizeof(n), seed);
|
||||||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
|
ImGuiContext& g = *Ctx;
|
||||||
|
if (g.DebugHookIdInfo == id)
|
||||||
|
ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL);
|
||||||
|
#endif
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is only used in rare/specific situations to manufacture an ID out of nowhere.
|
||||||
|
ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs)
|
||||||
|
{
|
||||||
|
ImGuiID seed = IDStack.back();
|
||||||
|
ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs);
|
||||||
|
ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
void ImGui::PushID(const char* str_id)
|
void ImGui::PushID(const char* str_id)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -8644,8 +8688,10 @@ void ImGui::PushOverrideID(ImGuiID id)
|
|||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
if (g.DebugHookIdInfo == id)
|
if (g.DebugHookIdInfo == id)
|
||||||
DebugHookIdInfo(id, ImGuiDataType_ID, NULL, NULL);
|
DebugHookIdInfo(id, ImGuiDataType_ID, NULL, NULL);
|
||||||
|
#endif
|
||||||
window->IDStack.push_back(id);
|
window->IDStack.push_back(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8655,18 +8701,22 @@ void ImGui::PushOverrideID(ImGuiID id)
|
|||||||
ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed)
|
ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed)
|
||||||
{
|
{
|
||||||
ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed);
|
ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed);
|
||||||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.DebugHookIdInfo == id)
|
if (g.DebugHookIdInfo == id)
|
||||||
DebugHookIdInfo(id, ImGuiDataType_String, str, str_end);
|
DebugHookIdInfo(id, ImGuiDataType_String, str, str_end);
|
||||||
|
#endif
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGuiID ImGui::GetIDWithSeed(int n, ImGuiID seed)
|
ImGuiID ImGui::GetIDWithSeed(int n, ImGuiID seed)
|
||||||
{
|
{
|
||||||
ImGuiID id = ImHashData(&n, sizeof(n), seed);
|
ImGuiID id = ImHashData(&n, sizeof(n), seed);
|
||||||
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.DebugHookIdInfo == id)
|
if (g.DebugHookIdInfo == id)
|
||||||
DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL);
|
DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL);
|
||||||
|
#endif
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8695,19 +8745,6 @@ ImGuiID ImGui::GetID(const void* ptr_id)
|
|||||||
return window->GetID(ptr_id);
|
return window->GetID(ptr_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImGui::IsRectVisible(const ImVec2& size)
|
|
||||||
{
|
|
||||||
ImGuiWindow* window = GImGui->CurrentWindow;
|
|
||||||
return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max)
|
|
||||||
{
|
|
||||||
ImGuiWindow* window = GImGui->CurrentWindow;
|
|
||||||
return window->ClipRect.Overlaps(ImRect(rect_min, rect_max));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] INPUTS
|
// [SECTION] INPUTS
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -9843,7 +9880,7 @@ void ImGui::SetNextFrameWantCaptureMouse(bool want_capture_mouse)
|
|||||||
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
||||||
static const char* GetInputSourceName(ImGuiInputSource source)
|
static const char* GetInputSourceName(ImGuiInputSource source)
|
||||||
{
|
{
|
||||||
const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad", "Clipboard" };
|
const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad" };
|
||||||
IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT && source >= 0 && source < ImGuiInputSource_COUNT);
|
IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT && source >= 0 && source < ImGuiInputSource_COUNT);
|
||||||
return input_source_names[source];
|
return input_source_names[source];
|
||||||
}
|
}
|
||||||
@ -11466,7 +11503,7 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags)
|
|||||||
ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
|
ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
|
||||||
popup_ref.PopupId = id;
|
popup_ref.PopupId = id;
|
||||||
popup_ref.Window = NULL;
|
popup_ref.Window = NULL;
|
||||||
popup_ref.BackupNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type).
|
popup_ref.RestoreNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type).
|
||||||
popup_ref.OpenFrameCount = g.FrameCount;
|
popup_ref.OpenFrameCount = g.FrameCount;
|
||||||
popup_ref.OpenParentId = parent_window->IDStack.back();
|
popup_ref.OpenParentId = parent_window->IDStack.back();
|
||||||
popup_ref.OpenPopupPos = NavCalcPreferredRefPos();
|
popup_ref.OpenPopupPos = NavCalcPreferredRefPos();
|
||||||
@ -11515,6 +11552,7 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Don't close our own child popup windows.
|
// Don't close our own child popup windows.
|
||||||
|
//IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupsOverWindow(\"%s\") restore_under=%d\n", ref_window ? ref_window->Name : "<NULL>", restore_focus_to_window_under_popup);
|
||||||
int popup_count_to_keep = 0;
|
int popup_count_to_keep = 0;
|
||||||
if (ref_window)
|
if (ref_window)
|
||||||
{
|
{
|
||||||
@ -11572,18 +11610,19 @@ void ImGui::ClosePopupsExceptModals()
|
|||||||
void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup)
|
void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_focus_to_window_under_popup=%d\n", remaining, restore_focus_to_window_under_popup);
|
IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_under=%d\n", remaining, restore_focus_to_window_under_popup);
|
||||||
IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size);
|
IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size);
|
||||||
|
|
||||||
// Trim open popup stack
|
// Trim open popup stack
|
||||||
ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window;
|
ImGuiPopupData prev_popup = g.OpenPopupStack[remaining];
|
||||||
ImGuiWindow* popup_backup_nav_window = g.OpenPopupStack[remaining].BackupNavWindow;
|
|
||||||
g.OpenPopupStack.resize(remaining);
|
g.OpenPopupStack.resize(remaining);
|
||||||
|
|
||||||
if (restore_focus_to_window_under_popup)
|
// Restore focus (unless popup window was not yet submitted, and didn't have a chance to take focus anyhow. See #7325 for an edge case)
|
||||||
|
if (restore_focus_to_window_under_popup && prev_popup.Window)
|
||||||
{
|
{
|
||||||
ImGuiWindow* focus_window = (popup_window && popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : popup_backup_nav_window;
|
ImGuiWindow* popup_window = prev_popup.Window;
|
||||||
if (focus_window && !focus_window->WasActive && popup_window)
|
ImGuiWindow* focus_window = (popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : prev_popup.RestoreNavWindow;
|
||||||
|
if (focus_window && !focus_window->WasActive)
|
||||||
FocusTopMostWindowUnderOne(popup_window, NULL, NULL, ImGuiFocusRequestFlags_RestoreFocusedChild); // Fallback
|
FocusTopMostWindowUnderOne(popup_window, NULL, NULL, ImGuiFocusRequestFlags_RestoreFocusedChild); // Fallback
|
||||||
else
|
else
|
||||||
FocusWindow(focus_window, (g.NavLayer == ImGuiNavLayer_Main) ? ImGuiFocusRequestFlags_RestoreFocusedChild : ImGuiFocusRequestFlags_None);
|
FocusWindow(focus_window, (g.NavLayer == ImGuiNavLayer_Main) ? ImGuiFocusRequestFlags_RestoreFocusedChild : ImGuiFocusRequestFlags_None);
|
||||||
@ -12989,8 +13028,10 @@ void ImGui::NavMoveRequestApplyResult()
|
|||||||
g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid;
|
g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Could become optional e.g. ImGuiNavMoveFlags_NoClearActiveId if we later want to apply navigation requests without altering active input.
|
// Clear active id unless requested not to
|
||||||
if (g.ActiveId != result->ID)
|
// FIXME: ImGuiNavMoveFlags_NoClearActiveId is currently unused as we don't have a clear strategy to preserve active id after interaction,
|
||||||
|
// so this is mostly provided as a gateway for further experiments (see #1418, #2890)
|
||||||
|
if (g.ActiveId != result->ID && (g.NavMoveFlags & ImGuiNavMoveFlags_NoClearActiveId) == 0)
|
||||||
ClearActiveID();
|
ClearActiveID();
|
||||||
|
|
||||||
// Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId)
|
// Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId)
|
||||||
@ -20150,9 +20191,9 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
{
|
{
|
||||||
// As it's difficult to interact with tree nodes while popups are open, we display everything inline.
|
// As it's difficult to interact with tree nodes while popups are open, we display everything inline.
|
||||||
ImGuiWindow* window = popup_data.Window;
|
ImGuiWindow* window = popup_data.Window;
|
||||||
BulletText("PopupID: %08x, Window: '%s' (%s%s), BackupNavWindow '%s', ParentWindow '%s'",
|
BulletText("PopupID: %08x, Window: '%s' (%s%s), RestoreNavWindow '%s', ParentWindow '%s'",
|
||||||
popup_data.PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "",
|
popup_data.PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "",
|
||||||
popup_data.BackupNavWindow ? popup_data.BackupNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL");
|
popup_data.RestoreNavWindow ? popup_data.RestoreNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL");
|
||||||
}
|
}
|
||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.4
|
// dear imgui, v1.90.5
|
||||||
// (demo code)
|
// (demo code)
|
||||||
|
|
||||||
// Help:
|
// Help:
|
||||||
@ -7,7 +7,7 @@
|
|||||||
// - Need help integrating Dear ImGui in your codebase?
|
// - Need help integrating Dear ImGui in your codebase?
|
||||||
// - Read Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started
|
// - Read Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started
|
||||||
// - Read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
|
// - Read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
|
||||||
// Read imgui.cpp for more details, documentation and comments.
|
// Read top of imgui.cpp and imgui.h for many details, documentation, comments, links.
|
||||||
// Get the latest version at https://github.com/ocornut/imgui
|
// Get the latest version at https://github.com/ocornut/imgui
|
||||||
|
|
||||||
//---------------------------------------------------
|
//---------------------------------------------------
|
||||||
@ -54,8 +54,9 @@
|
|||||||
// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp.
|
// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp.
|
||||||
|
|
||||||
// Navigating this file:
|
// Navigating this file:
|
||||||
// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
||||||
// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
|
// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
|
||||||
|
// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
@ -1349,6 +1350,7 @@ static void ShowDemoWindowWidgets()
|
|||||||
}
|
}
|
||||||
ImGui::EndListBox();
|
ImGui::EndListBox();
|
||||||
}
|
}
|
||||||
|
ImGui::SameLine(); HelpMarker("Here we are sharing selection state between both boxes.");
|
||||||
|
|
||||||
// Custom size: use all width, 5 items tall
|
// Custom size: use all width, 5 items tall
|
||||||
ImGui::Text("Full-width:");
|
ImGui::Text("Full-width:");
|
||||||
@ -1883,6 +1885,7 @@ static void ShowDemoWindowWidgets()
|
|||||||
static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
|
static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
|
||||||
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
|
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
|
||||||
ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f));
|
ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f));
|
||||||
|
//ImGui::SameLine(); HelpMarker("Consider using ImPlot instead!");
|
||||||
|
|
||||||
// Fill an array of contiguous float values to plot
|
// Fill an array of contiguous float values to plot
|
||||||
// Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float
|
// Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float
|
||||||
@ -2542,9 +2545,7 @@ static void ShowDemoWindowWidgets()
|
|||||||
{
|
{
|
||||||
IM_UNUSED(payload);
|
IM_UNUSED(payload);
|
||||||
ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed);
|
ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed);
|
||||||
ImGui::BeginTooltip();
|
ImGui::SetTooltip("Cannot drop here!");
|
||||||
ImGui::Text("Cannot drop here!");
|
|
||||||
ImGui::EndTooltip();
|
|
||||||
}
|
}
|
||||||
ImGui::EndDragDropTarget();
|
ImGui::EndDragDropTarget();
|
||||||
}
|
}
|
||||||
@ -5555,6 +5556,7 @@ static void ShowDemoWindowTables()
|
|||||||
HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc.");
|
HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc.");
|
||||||
|
|
||||||
static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings;
|
static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings;
|
||||||
|
ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable);
|
||||||
ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
|
ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY);
|
||||||
ImGui::CheckboxFlags("ImGuiTableFlags_SizingFixedFit", &flags, ImGuiTableFlags_SizingFixedFit);
|
ImGui::CheckboxFlags("ImGuiTableFlags_SizingFixedFit", &flags, ImGuiTableFlags_SizingFixedFit);
|
||||||
ImGui::CheckboxFlags("ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn);
|
ImGui::CheckboxFlags("ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn);
|
||||||
@ -6427,7 +6429,7 @@ void ImGui::ShowAboutWindow(bool* p_open)
|
|||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
ImGui::Text("By Omar Cornut and all Dear ImGui contributors.");
|
ImGui::Text("By Omar Cornut and all Dear ImGui contributors.");
|
||||||
ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information.");
|
ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information.");
|
||||||
ImGui::Text("If your company uses this, please consider sponsoring the project!");
|
ImGui::Text("If your company uses this, please consider funding the project.");
|
||||||
|
|
||||||
static bool show_config_info = false;
|
static bool show_config_info = false;
|
||||||
ImGui::Checkbox("Config/Build Information", &show_config_info);
|
ImGui::Checkbox("Config/Build Information", &show_config_info);
|
||||||
@ -7905,7 +7907,7 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
|
|||||||
if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Resize vertical + lock current width
|
if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Resize vertical + lock current width
|
||||||
if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Resize horizontal + lock current height
|
if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Resize horizontal + lock current height
|
||||||
if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width Between and 400 and 500
|
if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width Between and 400 and 500
|
||||||
if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 500), ImVec2(-1, FLT_MAX)); // Height at least 400
|
if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, FLT_MAX)); // Height at least 400
|
||||||
if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (void*)&aspect_ratio); // Aspect ratio
|
if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (void*)&aspect_ratio); // Aspect ratio
|
||||||
if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square
|
if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square
|
||||||
if (type == 8) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)&fixed_step); // Fixed Step
|
if (type == 8) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)&fixed_step); // Fixed Step
|
||||||
@ -8083,6 +8085,14 @@ static void ShowExampleAppWindowTitles(bool*)
|
|||||||
// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering()
|
// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering()
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Add a |_| looking shape
|
||||||
|
static void PathConcaveShape(ImDrawList* draw_list, float x, float y, float sz)
|
||||||
|
{
|
||||||
|
const ImVec2 pos_norms[] = { { 0.0f, 0.0f }, { 0.3f, 0.0f }, { 0.3f, 0.7f }, { 0.7f, 0.7f }, { 0.7f, 0.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f }, { 0.0f, 1.0f } };
|
||||||
|
for (const ImVec2& p : pos_norms)
|
||||||
|
draw_list->PathLineTo(ImVec2(x + 0.5f + (int)(sz * p.x), y + 0.5f + (int)(sz * p.y)));
|
||||||
|
}
|
||||||
|
|
||||||
// Demonstrate using the low-level ImDrawList to draw custom shapes.
|
// Demonstrate using the low-level ImDrawList to draw custom shapes.
|
||||||
static void ShowExampleAppCustomRendering(bool* p_open)
|
static void ShowExampleAppCustomRendering(bool* p_open)
|
||||||
{
|
{
|
||||||
@ -8166,12 +8176,14 @@ static void ShowExampleAppCustomRendering(bool* p_open)
|
|||||||
float th = (n == 0) ? 1.0f : thickness;
|
float th = (n == 0) ? 1.0f : thickness;
|
||||||
draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon
|
draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon
|
||||||
draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle
|
draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle
|
||||||
draw_list->AddEllipse(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, sz*0.3f, col, -0.3f, circle_segments, th); x += sz + spacing; // Ellipse
|
draw_list->AddEllipse(ImVec2(x + sz*0.5f, y + sz*0.5f), ImVec2(sz*0.5f, sz*0.3f), col, -0.3f, circle_segments, th); x += sz + spacing; // Ellipse
|
||||||
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing; // Square
|
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing; // Square
|
||||||
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing; // Square with all rounded corners
|
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing; // Square with all rounded corners
|
||||||
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners
|
draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners
|
||||||
draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing; // Triangle
|
draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing; // Triangle
|
||||||
//draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th);x+= sz*0.4f + spacing; // Thin triangle
|
//draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th);x+= sz*0.4f + spacing; // Thin triangle
|
||||||
|
PathConcaveShape(draw_list, x, y, sz); draw_list->PathStroke(col, ImDrawFlags_Closed, th); x += sz + spacing; // Concave Shape
|
||||||
|
//draw_list->AddPolyline(concave_shape, IM_ARRAYSIZE(concave_shape), col, ImDrawFlags_Closed, th);
|
||||||
draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!)
|
draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!)
|
||||||
draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!)
|
draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!)
|
||||||
draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line
|
draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line
|
||||||
@ -8195,12 +8207,13 @@ static void ShowExampleAppCustomRendering(bool* p_open)
|
|||||||
// Filled shapes
|
// Filled shapes
|
||||||
draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, ngon_sides); x += sz + spacing; // N-gon
|
draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, ngon_sides); x += sz + spacing; // N-gon
|
||||||
draw_list->AddCircleFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, circle_segments); x += sz + spacing; // Circle
|
draw_list->AddCircleFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, circle_segments); x += sz + spacing; // Circle
|
||||||
draw_list->AddEllipseFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, sz * 0.3f, col, -0.3f, circle_segments); x += sz + spacing;// Ellipse
|
draw_list->AddEllipseFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), ImVec2(sz * 0.5f, sz * 0.3f), col, -0.3f, circle_segments); x += sz + spacing;// Ellipse
|
||||||
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square
|
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square
|
||||||
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners
|
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners
|
||||||
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners
|
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners
|
||||||
draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle
|
draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle
|
||||||
//draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle
|
//draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle
|
||||||
|
PathConcaveShape(draw_list, x, y, sz); draw_list->PathFillConcave(col); x += sz + spacing; // Concave shape
|
||||||
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness)
|
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness)
|
||||||
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;// Vertical line (faster than AddLine, but only handle integer thickness)
|
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;// Vertical line (faster than AddLine, but only handle integer thickness)
|
||||||
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine)
|
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine)
|
||||||
@ -8216,15 +8229,10 @@ static void ShowExampleAppCustomRendering(bool* p_open)
|
|||||||
draw_list->PathFillConvex(col);
|
draw_list->PathFillConvex(col);
|
||||||
x += sz + spacing;
|
x += sz + spacing;
|
||||||
|
|
||||||
// Cubic Bezier Curve (4 control points): this is concave so not drawing it yet
|
|
||||||
//draw_list->PathLineTo(ImVec2(x + cp4[0].x, y + cp4[0].y));
|
|
||||||
//draw_list->PathBezierCubicCurveTo(ImVec2(x + cp4[1].x, y + cp4[1].y), ImVec2(x + cp4[2].x, y + cp4[2].y), ImVec2(x + cp4[3].x, y + cp4[3].y), curve_segments);
|
|
||||||
//draw_list->PathFillConvex(col);
|
|
||||||
//x += sz + spacing;
|
|
||||||
|
|
||||||
draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255));
|
draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255));
|
||||||
|
x += sz + spacing;
|
||||||
|
|
||||||
ImGui::Dummy(ImVec2((sz + spacing) * 12.2f, (sz + spacing) * 3.0f));
|
ImGui::Dummy(ImVec2((sz + spacing) * 13.2f, (sz + spacing) * 3.0f));
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
343
lib/third_party/imgui/imgui/source/imgui_draw.cpp
vendored
343
lib/third_party/imgui/imgui/source/imgui_draw.cpp
vendored
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.4
|
// dear imgui, v1.90.5
|
||||||
// (drawing and font code)
|
// (drawing and font code)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -9,6 +9,7 @@ Index of this file:
|
|||||||
// [SECTION] Style functions
|
// [SECTION] Style functions
|
||||||
// [SECTION] ImDrawList
|
// [SECTION] ImDrawList
|
||||||
// [SECTION] ImDrawList Shadow Primitives
|
// [SECTION] ImDrawList Shadow Primitives
|
||||||
|
// [SECTION] ImTriangulator, ImDrawList concave polygon fill
|
||||||
// [SECTION] ImDrawListSplitter
|
// [SECTION] ImDrawListSplitter
|
||||||
// [SECTION] ImDrawData
|
// [SECTION] ImDrawData
|
||||||
// [SECTION] Helpers ShadeVertsXXX functions
|
// [SECTION] Helpers ShadeVertsXXX functions
|
||||||
@ -1252,10 +1253,10 @@ void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, floa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImDrawList::PathEllipticalArcTo(const ImVec2& center, float radius_x, float radius_y, float rot, float a_min, float a_max, int num_segments)
|
void ImDrawList::PathEllipticalArcTo(const ImVec2& center, const ImVec2& radius, float rot, float a_min, float a_max, int num_segments)
|
||||||
{
|
{
|
||||||
if (num_segments <= 0)
|
if (num_segments <= 0)
|
||||||
num_segments = _CalcCircleAutoSegmentCount(ImMax(radius_x, radius_y)); // A bit pessimistic, maybe there's a better computation to do here.
|
num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here.
|
||||||
|
|
||||||
_Path.reserve(_Path.Size + (num_segments + 1));
|
_Path.reserve(_Path.Size + (num_segments + 1));
|
||||||
|
|
||||||
@ -1264,11 +1265,10 @@ void ImDrawList::PathEllipticalArcTo(const ImVec2& center, float radius_x, float
|
|||||||
for (int i = 0; i <= num_segments; i++)
|
for (int i = 0; i <= num_segments; i++)
|
||||||
{
|
{
|
||||||
const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min);
|
const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min);
|
||||||
ImVec2 point(ImCos(a) * radius_x, ImSin(a) * radius_y);
|
ImVec2 point(ImCos(a) * radius.x, ImSin(a) * radius.y);
|
||||||
const float rel_x = (point.x * cos_rot) - (point.y * sin_rot);
|
const ImVec2 rel((point.x * cos_rot) - (point.y * sin_rot), (point.x * sin_rot) + (point.y * cos_rot));
|
||||||
const float rel_y = (point.x * sin_rot) + (point.y * cos_rot);
|
point.x = rel.x + center.x;
|
||||||
point.x = rel_x + center.x;
|
point.y = rel.y + center.y;
|
||||||
point.y = rel_y + center.y;
|
|
||||||
_Path.push_back(point);
|
_Path.push_back(point);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1593,31 +1593,31 @@ void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ellipse
|
// Ellipse
|
||||||
void ImDrawList::AddEllipse(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot, int num_segments, float thickness)
|
void ImDrawList::AddEllipse(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot, int num_segments, float thickness)
|
||||||
{
|
{
|
||||||
if ((col & IM_COL32_A_MASK) == 0)
|
if ((col & IM_COL32_A_MASK) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (num_segments <= 0)
|
if (num_segments <= 0)
|
||||||
num_segments = _CalcCircleAutoSegmentCount(ImMax(radius_x, radius_y)); // A bit pessimistic, maybe there's a better computation to do here.
|
num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here.
|
||||||
|
|
||||||
// Because we are filling a closed shape we remove 1 from the count of segments/points
|
// Because we are filling a closed shape we remove 1 from the count of segments/points
|
||||||
const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
|
const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
|
||||||
PathEllipticalArcTo(center, radius_x, radius_y, rot, 0.0f, a_max, num_segments - 1);
|
PathEllipticalArcTo(center, radius, rot, 0.0f, a_max, num_segments - 1);
|
||||||
PathStroke(col, true, thickness);
|
PathStroke(col, true, thickness);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImDrawList::AddEllipseFilled(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot, int num_segments)
|
void ImDrawList::AddEllipseFilled(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot, int num_segments)
|
||||||
{
|
{
|
||||||
if ((col & IM_COL32_A_MASK) == 0)
|
if ((col & IM_COL32_A_MASK) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (num_segments <= 0)
|
if (num_segments <= 0)
|
||||||
num_segments = _CalcCircleAutoSegmentCount(ImMax(radius_x, radius_y)); // A bit pessimistic, maybe there's a better computation to do here.
|
num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here.
|
||||||
|
|
||||||
// Because we are filling a closed shape we remove 1 from the count of segments/points
|
// Because we are filling a closed shape we remove 1 from the count of segments/points
|
||||||
const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
|
const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
|
||||||
PathEllipticalArcTo(center, radius_x, radius_y, rot, 0.0f, a_max, num_segments - 1);
|
PathEllipticalArcTo(center, radius, rot, 0.0f, a_max, num_segments - 1);
|
||||||
PathFillConvex(col);
|
PathFillConvex(col);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1648,10 +1648,11 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos,
|
|||||||
if ((col & IM_COL32_A_MASK) == 0)
|
if ((col & IM_COL32_A_MASK) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Accept null ranges
|
||||||
|
if (text_begin == text_end || text_begin[0] == 0)
|
||||||
|
return;
|
||||||
if (text_end == NULL)
|
if (text_end == NULL)
|
||||||
text_end = text_begin + strlen(text_begin);
|
text_end = text_begin + strlen(text_begin);
|
||||||
if (text_begin == text_end)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Pull default font/size from the shared ImDrawListSharedData instance
|
// Pull default font/size from the shared ImDrawListSharedData instance
|
||||||
if (font == NULL)
|
if (font == NULL)
|
||||||
@ -1735,6 +1736,316 @@ void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_mi
|
|||||||
PopTextureID();
|
PopTextureID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// [SECTION] ImTriangulator, ImDrawList concave polygon fill
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Triangulate concave polygons. Based on "Triangulation by Ear Clipping" paper, O(N^2) complexity.
|
||||||
|
// Reference: https://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf
|
||||||
|
// Provided as a convenience for user but not used by main library.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// - ImTriangulator [Internal]
|
||||||
|
// - AddConcavePolyFilled()
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
enum ImTriangulatorNodeType
|
||||||
|
{
|
||||||
|
ImTriangulatorNodeType_Convex,
|
||||||
|
ImTriangulatorNodeType_Ear,
|
||||||
|
ImTriangulatorNodeType_Reflex
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ImTriangulatorNode
|
||||||
|
{
|
||||||
|
ImTriangulatorNodeType Type;
|
||||||
|
int Index;
|
||||||
|
ImVec2 Pos;
|
||||||
|
ImTriangulatorNode* Next;
|
||||||
|
ImTriangulatorNode* Prev;
|
||||||
|
|
||||||
|
void Unlink() { Next->Prev = Prev; Prev->Next = Next; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ImTriangulatorNodeSpan
|
||||||
|
{
|
||||||
|
ImTriangulatorNode** Data = NULL;
|
||||||
|
int Size = 0;
|
||||||
|
|
||||||
|
void push_back(ImTriangulatorNode* node) { Data[Size++] = node; }
|
||||||
|
void find_erase_unsorted(int idx) { for (int i = Size - 1; i >= 0; i--) if (Data[i]->Index == idx) { Data[i] = Data[Size - 1]; Size--; return; } }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ImTriangulator
|
||||||
|
{
|
||||||
|
static int EstimateTriangleCount(int points_count) { return (points_count < 3) ? 0 : points_count - 2; }
|
||||||
|
static int EstimateScratchBufferSize(int points_count) { return sizeof(ImTriangulatorNode) * points_count + sizeof(ImTriangulatorNode*) * points_count * 2; }
|
||||||
|
|
||||||
|
void Init(const ImVec2* points, int points_count, void* scratch_buffer);
|
||||||
|
void GetNextTriangle(unsigned int out_triangle[3]); // Return relative indexes for next triangle
|
||||||
|
|
||||||
|
// Internal functions
|
||||||
|
void BuildNodes(const ImVec2* points, int points_count);
|
||||||
|
void BuildReflexes();
|
||||||
|
void BuildEars();
|
||||||
|
void FlipNodeList();
|
||||||
|
bool IsEar(int i0, int i1, int i2, const ImVec2& v0, const ImVec2& v1, const ImVec2& v2) const;
|
||||||
|
void ReclassifyNode(ImTriangulatorNode* node);
|
||||||
|
|
||||||
|
// Internal members
|
||||||
|
int _TrianglesLeft = 0;
|
||||||
|
ImTriangulatorNode* _Nodes = NULL;
|
||||||
|
ImTriangulatorNodeSpan _Ears;
|
||||||
|
ImTriangulatorNodeSpan _Reflexes;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Distribute storage for nodes, ears and reflexes.
|
||||||
|
// FIXME-OPT: if everything is convex, we could report it to caller and let it switch to an convex renderer
|
||||||
|
// (this would require first building reflexes to bail to convex if empty, without even building nodes)
|
||||||
|
void ImTriangulator::Init(const ImVec2* points, int points_count, void* scratch_buffer)
|
||||||
|
{
|
||||||
|
IM_ASSERT(scratch_buffer != NULL && points_count >= 3);
|
||||||
|
_TrianglesLeft = EstimateTriangleCount(points_count);
|
||||||
|
_Nodes = (ImTriangulatorNode*)scratch_buffer; // points_count x Node
|
||||||
|
_Ears.Data = (ImTriangulatorNode**)(_Nodes + points_count); // points_count x Node*
|
||||||
|
_Reflexes.Data = (ImTriangulatorNode**)(_Nodes + points_count) + points_count; // points_count x Node*
|
||||||
|
BuildNodes(points, points_count);
|
||||||
|
BuildReflexes();
|
||||||
|
BuildEars();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImTriangulator::BuildNodes(const ImVec2* points, int points_count)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < points_count; i++)
|
||||||
|
{
|
||||||
|
_Nodes[i].Type = ImTriangulatorNodeType_Convex;
|
||||||
|
_Nodes[i].Index = i;
|
||||||
|
_Nodes[i].Pos = points[i];
|
||||||
|
_Nodes[i].Next = _Nodes + i + 1;
|
||||||
|
_Nodes[i].Prev = _Nodes + i - 1;
|
||||||
|
}
|
||||||
|
_Nodes[0].Prev = _Nodes + points_count - 1;
|
||||||
|
_Nodes[points_count - 1].Next = _Nodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImTriangulator::BuildReflexes()
|
||||||
|
{
|
||||||
|
ImTriangulatorNode* n1 = _Nodes;
|
||||||
|
for (int i = _TrianglesLeft; i >= 0; i--, n1 = n1->Next)
|
||||||
|
{
|
||||||
|
if (ImTriangleIsClockwise(n1->Prev->Pos, n1->Pos, n1->Next->Pos))
|
||||||
|
continue;
|
||||||
|
n1->Type = ImTriangulatorNodeType_Reflex;
|
||||||
|
_Reflexes.push_back(n1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImTriangulator::BuildEars()
|
||||||
|
{
|
||||||
|
ImTriangulatorNode* n1 = _Nodes;
|
||||||
|
for (int i = _TrianglesLeft; i >= 0; i--, n1 = n1->Next)
|
||||||
|
{
|
||||||
|
if (n1->Type != ImTriangulatorNodeType_Convex)
|
||||||
|
continue;
|
||||||
|
if (!IsEar(n1->Prev->Index, n1->Index, n1->Next->Index, n1->Prev->Pos, n1->Pos, n1->Next->Pos))
|
||||||
|
continue;
|
||||||
|
n1->Type = ImTriangulatorNodeType_Ear;
|
||||||
|
_Ears.push_back(n1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImTriangulator::GetNextTriangle(unsigned int out_triangle[3])
|
||||||
|
{
|
||||||
|
if (_Ears.Size == 0)
|
||||||
|
{
|
||||||
|
FlipNodeList();
|
||||||
|
|
||||||
|
ImTriangulatorNode* node = _Nodes;
|
||||||
|
for (int i = _TrianglesLeft; i >= 0; i--, node = node->Next)
|
||||||
|
node->Type = ImTriangulatorNodeType_Convex;
|
||||||
|
_Reflexes.Size = 0;
|
||||||
|
BuildReflexes();
|
||||||
|
BuildEars();
|
||||||
|
|
||||||
|
// If we still don't have ears, it means geometry is degenerated.
|
||||||
|
if (_Ears.Size == 0)
|
||||||
|
{
|
||||||
|
// Return first triangle available, mimicking the behavior of convex fill.
|
||||||
|
IM_ASSERT(_TrianglesLeft > 0); // Geometry is degenerated
|
||||||
|
_Ears.Data[0] = _Nodes;
|
||||||
|
_Ears.Size = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImTriangulatorNode* ear = _Ears.Data[--_Ears.Size];
|
||||||
|
out_triangle[0] = ear->Prev->Index;
|
||||||
|
out_triangle[1] = ear->Index;
|
||||||
|
out_triangle[2] = ear->Next->Index;
|
||||||
|
|
||||||
|
ear->Unlink();
|
||||||
|
if (ear == _Nodes)
|
||||||
|
_Nodes = ear->Next;
|
||||||
|
|
||||||
|
ReclassifyNode(ear->Prev);
|
||||||
|
ReclassifyNode(ear->Next);
|
||||||
|
_TrianglesLeft--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImTriangulator::FlipNodeList()
|
||||||
|
{
|
||||||
|
ImTriangulatorNode* prev = _Nodes;
|
||||||
|
ImTriangulatorNode* temp = _Nodes;
|
||||||
|
ImTriangulatorNode* current = _Nodes->Next;
|
||||||
|
prev->Next = prev;
|
||||||
|
prev->Prev = prev;
|
||||||
|
while (current != _Nodes)
|
||||||
|
{
|
||||||
|
temp = current->Next;
|
||||||
|
|
||||||
|
current->Next = prev;
|
||||||
|
prev->Prev = current;
|
||||||
|
_Nodes->Next = current;
|
||||||
|
current->Prev = _Nodes;
|
||||||
|
|
||||||
|
prev = current;
|
||||||
|
current = temp;
|
||||||
|
}
|
||||||
|
_Nodes = prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A triangle is an ear is no other vertex is inside it. We can test reflexes vertices only (see reference algorithm)
|
||||||
|
bool ImTriangulator::IsEar(int i0, int i1, int i2, const ImVec2& v0, const ImVec2& v1, const ImVec2& v2) const
|
||||||
|
{
|
||||||
|
ImTriangulatorNode** p_end = _Reflexes.Data + _Reflexes.Size;
|
||||||
|
for (ImTriangulatorNode** p = _Reflexes.Data; p < p_end; p++)
|
||||||
|
{
|
||||||
|
ImTriangulatorNode* reflex = *p;
|
||||||
|
if (reflex->Index != i0 && reflex->Index != i1 && reflex->Index != i2)
|
||||||
|
if (ImTriangleContainsPoint(v0, v1, v2, reflex->Pos))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImTriangulator::ReclassifyNode(ImTriangulatorNode* n1)
|
||||||
|
{
|
||||||
|
// Classify node
|
||||||
|
ImTriangulatorNodeType type;
|
||||||
|
const ImTriangulatorNode* n0 = n1->Prev;
|
||||||
|
const ImTriangulatorNode* n2 = n1->Next;
|
||||||
|
if (!ImTriangleIsClockwise(n0->Pos, n1->Pos, n2->Pos))
|
||||||
|
type = ImTriangulatorNodeType_Reflex;
|
||||||
|
else if (IsEar(n0->Index, n1->Index, n2->Index, n0->Pos, n1->Pos, n2->Pos))
|
||||||
|
type = ImTriangulatorNodeType_Ear;
|
||||||
|
else
|
||||||
|
type = ImTriangulatorNodeType_Convex;
|
||||||
|
|
||||||
|
// Update lists when a type changes
|
||||||
|
if (type == n1->Type)
|
||||||
|
return;
|
||||||
|
if (n1->Type == ImTriangulatorNodeType_Reflex)
|
||||||
|
_Reflexes.find_erase_unsorted(n1->Index);
|
||||||
|
else if (n1->Type == ImTriangulatorNodeType_Ear)
|
||||||
|
_Ears.find_erase_unsorted(n1->Index);
|
||||||
|
if (type == ImTriangulatorNodeType_Reflex)
|
||||||
|
_Reflexes.push_back(n1);
|
||||||
|
else if (type == ImTriangulatorNodeType_Ear)
|
||||||
|
_Ears.push_back(n1);
|
||||||
|
n1->Type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use ear-clipping algorithm to triangulate a simple polygon (no self-interaction, no holes).
|
||||||
|
// (Reminder: we don't perform any coarse clipping/culling in ImDrawList layer!
|
||||||
|
// It is up to caller to ensure not making costly calls that will be outside of visible area.
|
||||||
|
// As concave fill is noticeably more expensive than other primitives, be mindful of this...
|
||||||
|
// Caller can build AABB of points, and avoid filling if 'draw_list->_CmdHeader.ClipRect.Overlays(points_bb) == false')
|
||||||
|
void ImDrawList::AddConcavePolyFilled(const ImVec2* points, const int points_count, ImU32 col)
|
||||||
|
{
|
||||||
|
if (points_count < 3 || (col & IM_COL32_A_MASK) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const ImVec2 uv = _Data->TexUvWhitePixel;
|
||||||
|
ImTriangulator triangulator;
|
||||||
|
unsigned int triangle[3];
|
||||||
|
if (Flags & ImDrawListFlags_AntiAliasedFill)
|
||||||
|
{
|
||||||
|
// Anti-aliased Fill
|
||||||
|
const float AA_SIZE = _FringeScale;
|
||||||
|
const ImU32 col_trans = col & ~IM_COL32_A_MASK;
|
||||||
|
const int idx_count = (points_count - 2) * 3 + points_count * 6;
|
||||||
|
const int vtx_count = (points_count * 2);
|
||||||
|
PrimReserve(idx_count, vtx_count);
|
||||||
|
|
||||||
|
// Add indexes for fill
|
||||||
|
unsigned int vtx_inner_idx = _VtxCurrentIdx;
|
||||||
|
unsigned int vtx_outer_idx = _VtxCurrentIdx + 1;
|
||||||
|
|
||||||
|
_Data->TempBuffer.reserve_discard((ImTriangulator::EstimateScratchBufferSize(points_count) + sizeof(ImVec2)) / sizeof(ImVec2));
|
||||||
|
triangulator.Init(points, points_count, _Data->TempBuffer.Data);
|
||||||
|
while (triangulator._TrianglesLeft > 0)
|
||||||
|
{
|
||||||
|
triangulator.GetNextTriangle(triangle);
|
||||||
|
_IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (triangle[0] << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (triangle[1] << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx + (triangle[2] << 1));
|
||||||
|
_IdxWritePtr += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute normals
|
||||||
|
_Data->TempBuffer.reserve_discard(points_count);
|
||||||
|
ImVec2* temp_normals = _Data->TempBuffer.Data;
|
||||||
|
for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++)
|
||||||
|
{
|
||||||
|
const ImVec2& p0 = points[i0];
|
||||||
|
const ImVec2& p1 = points[i1];
|
||||||
|
float dx = p1.x - p0.x;
|
||||||
|
float dy = p1.y - p0.y;
|
||||||
|
IM_NORMALIZE2F_OVER_ZERO(dx, dy);
|
||||||
|
temp_normals[i0].x = dy;
|
||||||
|
temp_normals[i0].y = -dx;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++)
|
||||||
|
{
|
||||||
|
// Average normals
|
||||||
|
const ImVec2& n0 = temp_normals[i0];
|
||||||
|
const ImVec2& n1 = temp_normals[i1];
|
||||||
|
float dm_x = (n0.x + n1.x) * 0.5f;
|
||||||
|
float dm_y = (n0.y + n1.y) * 0.5f;
|
||||||
|
IM_FIXNORMAL2F(dm_x, dm_y);
|
||||||
|
dm_x *= AA_SIZE * 0.5f;
|
||||||
|
dm_y *= AA_SIZE * 0.5f;
|
||||||
|
|
||||||
|
// Add vertices
|
||||||
|
_VtxWritePtr[0].pos.x = (points[i1].x - dm_x); _VtxWritePtr[0].pos.y = (points[i1].y - dm_y); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner
|
||||||
|
_VtxWritePtr[1].pos.x = (points[i1].x + dm_x); _VtxWritePtr[1].pos.y = (points[i1].y + dm_y); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer
|
||||||
|
_VtxWritePtr += 2;
|
||||||
|
|
||||||
|
// Add indexes for fringes
|
||||||
|
_IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (i0 << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1));
|
||||||
|
_IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx + (i1 << 1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1));
|
||||||
|
_IdxWritePtr += 6;
|
||||||
|
}
|
||||||
|
_VtxCurrentIdx += (ImDrawIdx)vtx_count;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Non Anti-aliased Fill
|
||||||
|
const int idx_count = (points_count - 2) * 3;
|
||||||
|
const int vtx_count = points_count;
|
||||||
|
PrimReserve(idx_count, vtx_count);
|
||||||
|
for (int i = 0; i < vtx_count; i++)
|
||||||
|
{
|
||||||
|
_VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
|
||||||
|
_VtxWritePtr++;
|
||||||
|
}
|
||||||
|
_Data->TempBuffer.reserve_discard((ImTriangulator::EstimateScratchBufferSize(points_count) + sizeof(ImVec2)) / sizeof(ImVec2));
|
||||||
|
triangulator.Init(points, points_count, _Data->TempBuffer.Data);
|
||||||
|
while (triangulator._TrianglesLeft > 0)
|
||||||
|
{
|
||||||
|
triangulator.GetNextTriangle(triangle);
|
||||||
|
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx + triangle[0]); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + triangle[1]); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + triangle[2]);
|
||||||
|
_IdxWritePtr += 3;
|
||||||
|
}
|
||||||
|
_VtxCurrentIdx += (ImDrawIdx)vtx_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] ImDrawList Shadow Primitives
|
// [SECTION] ImDrawList Shadow Primitives
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.4
|
// dear imgui, v1.90.5
|
||||||
// (tables and columns code)
|
// (tables and columns code)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -24,8 +24,9 @@ Index of this file:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Navigating this file:
|
// Navigating this file:
|
||||||
// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot.
|
||||||
// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments.
|
// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments.
|
||||||
|
// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments.
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] Commentary
|
// [SECTION] Commentary
|
||||||
@ -498,6 +499,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG
|
|||||||
table->DeclColumnsCount = table->AngledHeadersCount = 0;
|
table->DeclColumnsCount = table->AngledHeadersCount = 0;
|
||||||
if (previous_frame_active + 1 < g.FrameCount)
|
if (previous_frame_active + 1 < g.FrameCount)
|
||||||
table->IsActiveIdInTable = false;
|
table->IsActiveIdInTable = false;
|
||||||
|
table->AngledHeadersHeight = 0.0f;
|
||||||
temp_data->AngledHeadersExtraWidth = 0.0f;
|
temp_data->AngledHeadersExtraWidth = 0.0f;
|
||||||
|
|
||||||
// Using opaque colors facilitate overlapping lines of the grid, otherwise we'd need to improve TableDrawBorders()
|
// Using opaque colors facilitate overlapping lines of the grid, otherwise we'd need to improve TableDrawBorders()
|
||||||
@ -1066,6 +1068,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
|
|||||||
// - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column.
|
// - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column.
|
||||||
// - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow.
|
// - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow.
|
||||||
// - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter.
|
// - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter.
|
||||||
|
const float previous_instance_work_min_x = column->WorkMinX;
|
||||||
column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1;
|
column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1;
|
||||||
column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max
|
column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max
|
||||||
column->ItemWidth = ImTrunc(column->WidthGiven * 0.65f);
|
column->ItemWidth = ImTrunc(column->WidthGiven * 0.65f);
|
||||||
@ -1118,8 +1121,22 @@ void ImGui::TableUpdateLayout(ImGuiTable* table)
|
|||||||
// column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f);
|
// column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f);
|
||||||
|
|
||||||
// Reset content width variables
|
// Reset content width variables
|
||||||
column->ContentMaxXFrozen = column->ContentMaxXUnfrozen = column->WorkMinX;
|
if (table->InstanceCurrent == 0)
|
||||||
column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX;
|
{
|
||||||
|
column->ContentMaxXFrozen = column->WorkMinX;
|
||||||
|
column->ContentMaxXUnfrozen = column->WorkMinX;
|
||||||
|
column->ContentMaxXHeadersUsed = column->WorkMinX;
|
||||||
|
column->ContentMaxXHeadersIdeal = column->WorkMinX;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// As we store an absolute value to make per-cell updates faster, we need to offset values used for width computation.
|
||||||
|
const float offset_from_previous_instance = column->WorkMinX - previous_instance_work_min_x;
|
||||||
|
column->ContentMaxXFrozen += offset_from_previous_instance;
|
||||||
|
column->ContentMaxXUnfrozen += offset_from_previous_instance;
|
||||||
|
column->ContentMaxXHeadersUsed += offset_from_previous_instance;
|
||||||
|
column->ContentMaxXHeadersIdeal += offset_from_previous_instance;
|
||||||
|
}
|
||||||
|
|
||||||
// Don't decrement auto-fit counters until container window got a chance to submit its items
|
// Don't decrement auto-fit counters until container window got a chance to submit its items
|
||||||
if (table->HostSkipItems == false)
|
if (table->HostSkipItems == false)
|
||||||
@ -1240,7 +1257,7 @@ void ImGui::TableUpdateBorders(ImGuiTable* table)
|
|||||||
ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
|
ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent);
|
||||||
const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS;
|
const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS;
|
||||||
const float hit_y1 = (table->FreezeRowsCount >= 1 ? table->OuterRect.Min.y : table->WorkRect.Min.y) + table->AngledHeadersHeight;
|
const float hit_y1 = (table->FreezeRowsCount >= 1 ? table->OuterRect.Min.y : table->WorkRect.Min.y) + table->AngledHeadersHeight;
|
||||||
const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight);
|
const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight - table->AngledHeadersHeight);
|
||||||
const float hit_y2_head = hit_y1 + table_instance->LastTopHeadersRowHeight;
|
const float hit_y2_head = hit_y1 + table_instance->LastTopHeadersRowHeight;
|
||||||
|
|
||||||
for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
|
for (int order_n = 0; order_n < table->ColumnsCount; order_n++)
|
||||||
@ -1890,7 +1907,7 @@ void ImGui::TableEndRow(ImGuiTable* table)
|
|||||||
if (is_visible)
|
if (is_visible)
|
||||||
{
|
{
|
||||||
// Update data for TableGetHoveredRow()
|
// Update data for TableGetHoveredRow()
|
||||||
if (table->HoveredColumnBody != -1 && g.IO.MousePos.y >= bg_y1 && g.IO.MousePos.y < bg_y2)
|
if (table->HoveredColumnBody != -1 && g.IO.MousePos.y >= bg_y1 && g.IO.MousePos.y < bg_y2 && table_instance->HoveredRowNext < 0)
|
||||||
table_instance->HoveredRowNext = table->CurrentRow;
|
table_instance->HoveredRowNext = table->CurrentRow;
|
||||||
|
|
||||||
// Decide of background color for the row
|
// Decide of background color for the row
|
||||||
@ -3185,7 +3202,7 @@ void ImGui::TableAngledHeadersRowEx(float angle, float max_label_width)
|
|||||||
// Calculate our base metrics and set angled headers data _before_ the first call to TableNextRow()
|
// Calculate our base metrics and set angled headers data _before_ the first call to TableNextRow()
|
||||||
// FIXME-STYLE: Would it be better for user to submit 'max_label_width' or 'row_height' ? One can be derived from the other.
|
// FIXME-STYLE: Would it be better for user to submit 'max_label_width' or 'row_height' ? One can be derived from the other.
|
||||||
const float header_height = g.FontSize + g.Style.CellPadding.x * 2.0f;
|
const float header_height = g.FontSize + g.Style.CellPadding.x * 2.0f;
|
||||||
const float row_height = ImFabs(ImRotate(ImVec2(max_label_width, flip_label ? +header_height : -header_height), cos_a, sin_a).y);
|
const float row_height = ImTrunc(ImFabs(ImRotate(ImVec2(max_label_width, flip_label ? +header_height : -header_height), cos_a, sin_a).y));
|
||||||
table->AngledHeadersHeight = row_height;
|
table->AngledHeadersHeight = row_height;
|
||||||
table->AngledHeadersSlope = (sin_a != 0.0f) ? (cos_a / sin_a) : 0.0f;
|
table->AngledHeadersSlope = (sin_a != 0.0f) ? (cos_a / sin_a) : 0.0f;
|
||||||
const ImVec2 header_angled_vector = unit_right * (row_height / -sin_a); // vector from bottom-left to top-left, and from bottom-right to top-right
|
const ImVec2 header_angled_vector = unit_right * (row_height / -sin_a); // vector from bottom-left to top-left, and from bottom-right to top-right
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.4
|
// dear imgui, v1.90.5
|
||||||
// (widgets code)
|
// (widgets code)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -122,9 +122,9 @@ static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1);
|
|||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
// For InputTextEx()
|
// For InputTextEx()
|
||||||
static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source);
|
static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard = false);
|
||||||
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
|
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
|
||||||
static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
|
static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
// [SECTION] Widgets: Text, etc.
|
// [SECTION] Widgets: Text, etc.
|
||||||
@ -1294,12 +1294,15 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over
|
|||||||
if (!ItemAdd(bb, 0))
|
if (!ItemAdd(bb, 0))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Render
|
// Out of courtesy we accept a NaN fraction without crashing
|
||||||
fraction = ImSaturate(fraction);
|
fraction = ImSaturate(fraction);
|
||||||
|
const float fraction_not_nan = (fraction == fraction) ? fraction : 0.0f;
|
||||||
|
|
||||||
|
// Render
|
||||||
RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
||||||
bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize));
|
bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize));
|
||||||
const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y);
|
const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction_not_nan), bb.Max.y);
|
||||||
RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding);
|
RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction_not_nan, style.FrameRounding);
|
||||||
|
|
||||||
// Default displaying the fraction as percentage string, but user can override it
|
// Default displaying the fraction as percentage string, but user can override it
|
||||||
char overlay_buf[32];
|
char overlay_buf[32];
|
||||||
@ -3432,7 +3435,7 @@ bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImG
|
|||||||
DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format);
|
DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format);
|
||||||
ImStrTrimBlanks(data_buf);
|
ImStrTrimBlanks(data_buf);
|
||||||
|
|
||||||
ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited;
|
ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint;
|
||||||
|
|
||||||
bool value_changed = false;
|
bool value_changed = false;
|
||||||
if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags))
|
if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags))
|
||||||
@ -3477,6 +3480,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data
|
|||||||
DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format);
|
DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format);
|
||||||
|
|
||||||
flags |= ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string.
|
flags |= ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string.
|
||||||
|
flags |= (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint;
|
||||||
|
|
||||||
bool value_changed = false;
|
bool value_changed = false;
|
||||||
if (p_step == NULL)
|
if (p_step == NULL)
|
||||||
@ -3922,9 +3926,8 @@ void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return false to discard a character.
|
// Return false to discard a character.
|
||||||
static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source)
|
static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard)
|
||||||
{
|
{
|
||||||
IM_ASSERT(input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Clipboard);
|
|
||||||
unsigned int c = *p_char;
|
unsigned int c = *p_char;
|
||||||
|
|
||||||
// Filter non-printable (NB: isprint is unreliable! see #2467)
|
// Filter non-printable (NB: isprint is unreliable! see #2467)
|
||||||
@ -3939,7 +3942,7 @@ static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, Im
|
|||||||
apply_named_filters = false; // Override named filters below so newline and tabs can still be inserted.
|
apply_named_filters = false; // Override named filters below so newline and tabs can still be inserted.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input_source != ImGuiInputSource_Clipboard)
|
if (input_source_is_clipboard == false)
|
||||||
{
|
{
|
||||||
// We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817)
|
// We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817)
|
||||||
if (c == 127)
|
if (c == 127)
|
||||||
@ -3955,7 +3958,7 @@ static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, Im
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Generic named filters
|
// Generic named filters
|
||||||
if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific)))
|
if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint)))
|
||||||
{
|
{
|
||||||
// The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf to use e.g. ',' instead of '.'.
|
// The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf to use e.g. ',' instead of '.'.
|
||||||
// The standard mandate that programs starts in the "C" locale where the decimal point is '.'.
|
// The standard mandate that programs starts in the "C" locale where the decimal point is '.'.
|
||||||
@ -3965,7 +3968,7 @@ static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, Im
|
|||||||
// Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions.
|
// Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions.
|
||||||
ImGuiContext& g = *ctx;
|
ImGuiContext& g = *ctx;
|
||||||
const unsigned c_decimal_point = (unsigned int)g.IO.PlatformLocaleDecimalPoint;
|
const unsigned c_decimal_point = (unsigned int)g.IO.PlatformLocaleDecimalPoint;
|
||||||
if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsScientific))
|
if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsScientific | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint))
|
||||||
if (c == '.' || c == ',')
|
if (c == '.' || c == ',')
|
||||||
c = c_decimal_point;
|
c = c_decimal_point;
|
||||||
|
|
||||||
@ -4424,7 +4427,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
if (Shortcut(ImGuiKey_Tab, id, ImGuiInputFlags_Repeat))
|
if (Shortcut(ImGuiKey_Tab, id, ImGuiInputFlags_Repeat))
|
||||||
{
|
{
|
||||||
unsigned int c = '\t'; // Insert TAB
|
unsigned int c = '\t'; // Insert TAB
|
||||||
if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data))
|
||||||
state->OnKeyPressed((int)c);
|
state->OnKeyPressed((int)c);
|
||||||
}
|
}
|
||||||
// FIXME: Implement Shift+Tab
|
// FIXME: Implement Shift+Tab
|
||||||
@ -4447,7 +4450,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
unsigned int c = (unsigned int)io.InputQueueCharacters[n];
|
unsigned int c = (unsigned int)io.InputQueueCharacters[n];
|
||||||
if (c == '\t') // Skip Tab, see above.
|
if (c == '\t') // Skip Tab, see above.
|
||||||
continue;
|
continue;
|
||||||
if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data))
|
||||||
state->OnKeyPressed((int)c);
|
state->OnKeyPressed((int)c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4530,7 +4533,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
else if (!is_readonly)
|
else if (!is_readonly)
|
||||||
{
|
{
|
||||||
unsigned int c = '\n'; // Insert new line
|
unsigned int c = '\n'; // Insert new line
|
||||||
if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data))
|
||||||
state->OnKeyPressed((int)c);
|
state->OnKeyPressed((int)c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4597,7 +4600,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
{
|
{
|
||||||
unsigned int c;
|
unsigned int c;
|
||||||
s += ImTextCharFromUtf8(&c, s, NULL);
|
s += ImTextCharFromUtf8(&c, s, NULL);
|
||||||
if (!InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard))
|
if (!InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, true))
|
||||||
continue;
|
continue;
|
||||||
clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c;
|
clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c;
|
||||||
}
|
}
|
||||||
@ -6935,6 +6938,7 @@ bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg)
|
|||||||
ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y);
|
ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y);
|
||||||
RenderText(label_pos, label);
|
RenderText(label_pos, label);
|
||||||
window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size);
|
window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size);
|
||||||
|
AlignTextToFramePadding();
|
||||||
}
|
}
|
||||||
|
|
||||||
BeginChild(id, frame_bb.GetSize(), ImGuiChildFlags_FrameStyle);
|
BeginChild(id, frame_bb.GetSize(), ImGuiChildFlags_FrameStyle);
|
||||||
@ -7373,9 +7377,9 @@ bool ImGui::BeginViewportSideBar(const char* name, ImGuiViewport* viewport_p, Im
|
|||||||
}
|
}
|
||||||
|
|
||||||
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDocking;
|
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDocking;
|
||||||
SetNextWindowViewport(viewport->ID); // Enforce viewport so we don't create our own viewport when ImGuiConfigFlags_ViewportsNoMerge is set.
|
|
||||||
|
|
||||||
// Create window
|
// Create window
|
||||||
|
SetNextWindowViewport(viewport->ID); // Enforce viewport so we don't create our own viewport when ImGuiConfigFlags_ViewportsNoMerge is set.
|
||||||
PushStyleColor(ImGuiCol_WindowShadow, ImVec4(0, 0, 0, 0));
|
PushStyleColor(ImGuiCol_WindowShadow, ImVec4(0, 0, 0, 0));
|
||||||
PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
|
PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
|
||||||
PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); // Lift normal size constraint
|
PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); // Lift normal size constraint
|
||||||
|
@ -75,7 +75,7 @@ namespace hex::plugin::builtin {
|
|||||||
}
|
}
|
||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
|
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape))
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ namespace hex::plugin::builtin {
|
|||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetCursorPosX(width / 9 * 5);
|
ImGui::SetCursorPosX(width / 9 * 5);
|
||||||
if (ImGui::Button("hex.ui.common.no"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape))) {
|
if (ImGui::Button("hex.ui.common.no"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
||||||
m_noFunction();
|
m_noFunction();
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ namespace hex::plugin::builtin {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape))
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ namespace hex::plugin::builtin::recent {
|
|||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape))
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -766,7 +766,7 @@ namespace hex::plugin::builtin {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Allow the window to be closed by pressing ESC
|
// Allow the window to be closed by pressing ESC
|
||||||
if (ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyDown(ImGuiKey_Escape))
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
|
|
||||||
if (ImGui::BeginTabBar("about_tab_bar")) {
|
if (ImGui::BeginTabBar("about_tab_bar")) {
|
||||||
|
@ -36,7 +36,7 @@ namespace hex::plugin::builtin {
|
|||||||
ImGui::BringWindowToFocusFront(ImGui::GetCurrentWindowRead());
|
ImGui::BringWindowToFocusFront(ImGui::GetCurrentWindowRead());
|
||||||
|
|
||||||
// Close the popup if the user presses ESC
|
// Close the popup if the user presses ESC
|
||||||
if (ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyDown(ImGuiKey_Escape))
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
|
|
||||||
|
|
||||||
|
@ -990,7 +990,7 @@ namespace hex::plugin::builtin {
|
|||||||
// Handle deletion of links using the Delete key
|
// Handle deletion of links using the Delete key
|
||||||
{
|
{
|
||||||
const int selectedLinkCount = ImNodes::NumSelectedLinks();
|
const int selectedLinkCount = ImNodes::NumSelectedLinks();
|
||||||
if (selectedLinkCount > 0 && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Delete))) {
|
if (selectedLinkCount > 0 && ImGui::IsKeyPressed(ImGuiKey_Delete)) {
|
||||||
std::vector<int> selectedLinks;
|
std::vector<int> selectedLinks;
|
||||||
selectedLinks.resize(static_cast<size_t>(selectedLinkCount));
|
selectedLinks.resize(static_cast<size_t>(selectedLinkCount));
|
||||||
ImNodes::GetSelectedLinks(selectedLinks.data());
|
ImNodes::GetSelectedLinks(selectedLinks.data());
|
||||||
@ -1005,7 +1005,7 @@ namespace hex::plugin::builtin {
|
|||||||
// Handle deletion of noes using the Delete key
|
// Handle deletion of noes using the Delete key
|
||||||
{
|
{
|
||||||
const int selectedNodeCount = ImNodes::NumSelectedNodes();
|
const int selectedNodeCount = ImNodes::NumSelectedNodes();
|
||||||
if (selectedNodeCount > 0 && ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Delete))) {
|
if (selectedNodeCount > 0 && ImGui::IsKeyPressed(ImGuiKey_Delete)) {
|
||||||
std::vector<int> selectedNodes;
|
std::vector<int> selectedNodes;
|
||||||
selectedNodes.resize(static_cast<size_t>(selectedNodeCount));
|
selectedNodes.resize(static_cast<size_t>(selectedNodeCount));
|
||||||
ImNodes::GetSelectedNodes(selectedNodes.data());
|
ImNodes::GetSelectedNodes(selectedNodes.data());
|
||||||
|
@ -492,7 +492,7 @@ namespace hex::plugin::builtin {
|
|||||||
ImGui::SetNextWindowPos(ImGui::GetWindowPos() + ImGui::GetWindowContentRegionMin() - ImGui::GetStyle().WindowPadding, ImGuiCond_Appearing);
|
ImGui::SetNextWindowPos(ImGui::GetWindowPos() + ImGui::GetWindowContentRegionMin() - ImGui::GetStyle().WindowPadding, ImGuiCond_Appearing);
|
||||||
if (ImGui::BeginPopup("##hex_editor_popup", ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize |ImGuiWindowFlags_NoTitleBar)) {
|
if (ImGui::BeginPopup("##hex_editor_popup", ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize |ImGuiWindowFlags_NoTitleBar)) {
|
||||||
// Force close the popup when user is editing an input
|
// Force close the popup when user is editing an input
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape))){
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape)){
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -883,7 +883,7 @@ namespace hex::plugin::builtin {
|
|||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
// Escape key to close the popup
|
// Escape key to close the popup
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape), false))
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape, false))
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
|
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
@ -108,7 +108,7 @@ namespace hex::plugin::builtin {
|
|||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetCursorPosX(width / 9 * 5);
|
ImGui::SetCursorPosX(width / 9 * 5);
|
||||||
if (ImGui::Button("hex.builtin.popup.safety_backup.delete"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape))) {
|
if (ImGui::Button("hex.builtin.popup.safety_backup.delete"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
||||||
m_deleteCallback();
|
m_deleteCallback();
|
||||||
|
|
||||||
this->close();
|
this->close();
|
||||||
@ -133,7 +133,7 @@ namespace hex::plugin::builtin {
|
|||||||
|
|
||||||
ImGui::SameLine((ImGui::GetMainViewport()->Size / 3 - ImGui::CalcTextSize("hex.ui.common.close"_lang) - ImGui::GetStyle().FramePadding).x);
|
ImGui::SameLine((ImGui::GetMainViewport()->Size / 3 - ImGui::CalcTextSize("hex.ui.common.close"_lang) - ImGui::GetStyle().FramePadding).x);
|
||||||
|
|
||||||
if (ImGui::Button("hex.ui.common.close"_lang) || ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::Button("hex.ui.common.close"_lang) || ImGui::IsKeyPressed(ImGuiKey_Escape))
|
||||||
Popup::close();
|
Popup::close();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -36,7 +36,7 @@ namespace hex::plugin::hashes {
|
|||||||
ImGui::InputText("##result", m_result, ImGuiInputTextFlags_ReadOnly);
|
ImGui::InputText("##result", m_result, ImGuiInputTextFlags_ReadOnly);
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape))
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ public:
|
|||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetCursorPosX(width / 9 * 5);
|
ImGui::SetCursorPosX(width / 9 * 5);
|
||||||
if (ImGui::Button("hex.ui.common.no"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape))) {
|
if (ImGui::Button("hex.ui.common.no"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
||||||
s_yesNoQuestionBoxResult = false;
|
s_yesNoQuestionBoxResult = false;
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
@ -92,7 +92,7 @@ public:
|
|||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetCursorPosX(width / 9 * 5);
|
ImGui::SetCursorPosX(width / 9 * 5);
|
||||||
if (ImGui::Button("hex.ui.common.cancel"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape))) {
|
if (ImGui::Button("hex.ui.common.cancel"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
||||||
s_inputTextBoxResult = "";
|
s_inputTextBoxResult = "";
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
@ -107,7 +107,7 @@ namespace hex::ui {
|
|||||||
}, {}, m_multiple);
|
}, {}, m_multiple);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape))
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ namespace hex::ui {
|
|||||||
|
|
||||||
ImGui::SetWindowPos((ImHexApi::System::getMainWindowSize() - ImGui::GetWindowSize()) / 2, ImGuiCond_Appearing);
|
ImGui::SetWindowPos((ImHexApi::System::getMainWindowSize() - ImGui::GetWindowSize()) / 2, ImGuiCond_Appearing);
|
||||||
|
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape)))
|
if (ImGui::IsKeyPressed(ImGuiKey_Escape))
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,13 +37,13 @@ namespace hex::ui {
|
|||||||
|
|
||||||
auto width = ImGui::GetWindowWidth();
|
auto width = ImGui::GetWindowWidth();
|
||||||
ImGui::SetCursorPosX(width / 9);
|
ImGui::SetCursorPosX(width / 9);
|
||||||
if (ImGui::Button("hex.ui.common.okay"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Enter))) {
|
if (ImGui::Button("hex.ui.common.okay"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGuiKey_Enter)) {
|
||||||
m_function(m_input);
|
m_function(m_input);
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetCursorPosX(width / 9 * 5);
|
ImGui::SetCursorPosX(width / 9 * 5);
|
||||||
if (ImGui::Button("hex.ui.common.cancel"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Escape))) {
|
if (ImGui::Button("hex.ui.common.cancel"_lang, ImVec2(width / 3, 0)) || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,7 +286,7 @@ namespace hex::plugin::visualizers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void processKeyEvent(ImGuiKey key, float &variable, float incr, float accel) {
|
void processKeyEvent(ImGuiKey key, float &variable, float incr, float accel) {
|
||||||
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(key))) {
|
if (ImGui::IsKeyPressed(key)) {
|
||||||
auto temp = variable + incr * accel;
|
auto temp = variable + incr * accel;
|
||||||
if (variable * temp < 0.0F)
|
if (variable * temp < 0.0F)
|
||||||
variable = 0.0F;
|
variable = 0.0F;
|
||||||
@ -297,8 +297,8 @@ namespace hex::plugin::visualizers {
|
|||||||
|
|
||||||
void processInputEvents(gl::Vector<float, 3> &rotation, gl::Vector<float, 3> &translation, float &scaling, float &nearLimit, float &farLimit) {
|
void processInputEvents(gl::Vector<float, 3> &rotation, gl::Vector<float, 3> &translation, float &scaling, float &nearLimit, float &farLimit) {
|
||||||
auto accel = 1.0F;
|
auto accel = 1.0F;
|
||||||
if (ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_LeftShift)) ||
|
if (ImGui::IsKeyDown(ImGuiKey_LeftShift) ||
|
||||||
ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_RightShift)))
|
ImGui::IsKeyDown(ImGuiKey_RightShift))
|
||||||
accel = 10.0F;
|
accel = 10.0F;
|
||||||
|
|
||||||
auto dragDelta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Middle);
|
auto dragDelta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Middle);
|
||||||
|
Loading…
Reference in New Issue
Block a user