|
@@ -1,4 +1,4 @@
|
1
|
|
-// ImGui library v1.32
|
|
1
|
+// ImGui library v1.33
|
2
|
2
|
// See ImGui::ShowTestWindow() for sample code.
|
3
|
3
|
// Read 'Programmer guide' below for notes on how to setup ImGui in your codebase.
|
4
|
4
|
// Get latest version at https://github.com/ocornut/imgui
|
|
@@ -269,7 +269,7 @@
|
269
|
269
|
- columns: declare column set (each column: fixed size, %, fill, distribute default size among fills)
|
270
|
270
|
- columns: columns header to act as button (~sort op) and allow resize/reorder
|
271
|
271
|
- columns: user specify columns size
|
272
|
|
- - columns: tree node example actually has a small bug (opening node in right column extends the column different from opening node in left column)
|
|
272
|
+ - columns: tree node example, removing the last NextColumn() makes a padding difference (it should not)
|
273
|
273
|
- combo: turn child handling code into pop up helper
|
274
|
274
|
- combo: contents should extends to fit label if combo widget is small
|
275
|
275
|
- listbox: multiple selection
|
|
@@ -289,12 +289,14 @@
|
289
|
289
|
- text edit: flag to disable live update of the user buffer.
|
290
|
290
|
- text edit: field resize behavior - field could stretch when being edited? hover tooltip shows more text?
|
291
|
291
|
- text edit: add multi-line text edit
|
|
292
|
+ - tree: reformulate OpenNextNode() into SetNextWindowCollapsed() api
|
292
|
293
|
- tree: add treenode/treepush int variants? because (void*) cast from int warns on some platforms/settings
|
293
|
294
|
- settings: write more decent code to allow saving/loading new fields
|
294
|
295
|
- settings: api for per-tool simple persistent data (bool,int,float) in .ini file
|
295
|
296
|
! style: store rounded corners in texture to use 1 quad per corner (filled and wireframe). so rounding have minor cost.
|
296
|
297
|
- style: checkbox: padding for "active" color should be a multiplier of the
|
297
|
298
|
- style: colorbox not always square?
|
|
299
|
+ - text: simple markup language for color change?
|
298
|
300
|
- log: LogButtons() options for specifying depth and/or hiding depth slider
|
299
|
301
|
- log: have more control over the log scope (e.g. stop logging when leaving current tree node scope)
|
300
|
302
|
- log: be able to right-click and log a window or tree-node into tty/file/clipboard / generalized context menu?
|
|
@@ -530,8 +532,8 @@ ImGuiStyle::ImGuiStyle()
|
530
|
532
|
Colors[ImGuiCol_TooltipBg] = ImVec4(0.05f, 0.05f, 0.10f, 0.90f);
|
531
|
533
|
}
|
532
|
534
|
|
533
|
|
-// Statically allocated font atlas. This is merely a maneuver to keep its definition at the bottom of the .H file.
|
534
|
|
-// Because we cannot new() at this point (before users may define IO.MemAllocFn)
|
|
535
|
+// Statically allocated font atlas. This is merely a maneuver to keep ImFontAtlas definition at the bottom of the .h file (otherwise it'd be inside ImGuiIO)
|
|
536
|
+// Also we wouldn't be able to new() one at this point, before users may define IO.MemAllocFn.
|
535
|
537
|
static ImFontAtlas GDefaultFontAtlas;
|
536
|
538
|
|
537
|
539
|
ImGuiIO::ImGuiIO()
|
|
@@ -563,7 +565,7 @@ ImGuiIO::ImGuiIO()
|
563
|
565
|
|
564
|
566
|
// Pass in translated ASCII characters for text input.
|
565
|
567
|
// - with glfw you can get those from the callback set in glfwSetCharCallback()
|
566
|
|
-// - on Windows you can get those using ToAscii+keyboard state, or via the VM_CHAR message
|
|
568
|
+// - on Windows you can get those using ToAscii+keyboard state, or via the WM_CHAR message
|
567
|
569
|
void ImGuiIO::AddInputCharacter(ImWchar c)
|
568
|
570
|
{
|
569
|
571
|
const size_t n = ImStrlenW(InputCharacters);
|
|
@@ -589,7 +591,7 @@ const float PI = 3.14159265358979323846f;
|
589
|
591
|
#define IM_INT_MAX 2147483647
|
590
|
592
|
#endif
|
591
|
593
|
|
592
|
|
-// Play it nice with Windows users. Notepad in 2014 still doesn't display text data with Unix-style \n.
|
|
594
|
+// Play it nice with Windows users. Notepad in 2015 still doesn't display text data with Unix-style \n.
|
593
|
595
|
#ifdef _MSC_VER
|
594
|
596
|
#define STR_NEWLINE "\r\n"
|
595
|
597
|
#else
|
|
@@ -648,8 +650,7 @@ static char* ImStrdup(const char *str)
|
648
|
650
|
static size_t ImStrlenW(const ImWchar* str)
|
649
|
651
|
{
|
650
|
652
|
size_t n = 0;
|
651
|
|
- while (*str++)
|
652
|
|
- n++;
|
|
653
|
+ while (*str++) n++;
|
653
|
654
|
return n;
|
654
|
655
|
}
|
655
|
656
|
|
|
@@ -842,7 +843,7 @@ struct ImGuiStyleMod // Style modifier, backup of modified data so we can res
|
842
|
843
|
ImVec2 PreviousValue;
|
843
|
844
|
};
|
844
|
845
|
|
845
|
|
-struct ImGuiAabb // 2D axis aligned bounding-box
|
|
846
|
+struct ImGuiAabb // 2D axis aligned bounding-box
|
846
|
847
|
{
|
847
|
848
|
ImVec2 Min;
|
848
|
849
|
ImVec2 Max;
|
|
@@ -927,6 +928,7 @@ struct ImGuiDrawContext
|
927
|
928
|
// Internal state of the currently focused/edited text input box
|
928
|
929
|
struct ImGuiTextEditState
|
929
|
930
|
{
|
|
931
|
+ ImGuiID Id; // widget id owning the text state
|
930
|
932
|
ImWchar Text[1024]; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
|
931
|
933
|
char InitialText[1024*3+1]; // backup of end-user buffer at the time of focus (in UTF-8, unconverted)
|
932
|
934
|
size_t BufSize; // end-user buffer size, <= 1024 (or increase above)
|
|
@@ -934,7 +936,7 @@ struct ImGuiTextEditState
|
934
|
936
|
float ScrollX;
|
935
|
937
|
STB_TexteditState StbState;
|
936
|
938
|
float CursorAnim;
|
937
|
|
- ImVec2 LastCursorPos; // Cursor position in screen space to be used by IME callback.
|
|
939
|
+ ImVec2 InputCursorScreenPos; // Cursor position in screen space to be used by IME callback.
|
938
|
940
|
bool SelectedAllMouseLock;
|
939
|
941
|
ImFont* Font;
|
940
|
942
|
float FontSize;
|
|
@@ -991,6 +993,7 @@ struct ImGuiState
|
991
|
993
|
ImGuiID ActiveId;
|
992
|
994
|
ImGuiID ActiveIdPreviousFrame;
|
993
|
995
|
bool ActiveIdIsAlive;
|
|
996
|
+ bool ActiveIdIsFocusedOnly; // Set only by active widget. Denote focus but no active interaction.
|
994
|
997
|
float SettingsDirtyTimer;
|
995
|
998
|
ImVector<ImGuiIniData*> Settings;
|
996
|
999
|
ImVector<ImGuiColMod> ColorModifiers;
|
|
@@ -1030,6 +1033,10 @@ struct ImGuiState
|
1030
|
1033
|
ImGuiState()
|
1031
|
1034
|
{
|
1032
|
1035
|
Initialized = false;
|
|
1036
|
+ Font = NULL;
|
|
1037
|
+ FontSize = 0.0f;
|
|
1038
|
+ FontTexUvWhitePixel = ImVec2(0.0f, 0.0f);
|
|
1039
|
+
|
1033
|
1040
|
Time = 0.0f;
|
1034
|
1041
|
FrameCount = 0;
|
1035
|
1042
|
FrameCountRendered = -1;
|
|
@@ -1037,7 +1044,11 @@ struct ImGuiState
|
1037
|
1044
|
FocusedWindow = NULL;
|
1038
|
1045
|
HoveredWindow = NULL;
|
1039
|
1046
|
HoveredRootWindow = NULL;
|
|
1047
|
+ HoveredId = 0;
|
|
1048
|
+ ActiveId = 0;
|
|
1049
|
+ ActiveIdPreviousFrame = 0;
|
1040
|
1050
|
ActiveIdIsAlive = false;
|
|
1051
|
+ ActiveIdIsFocusedOnly = false;
|
1041
|
1052
|
SettingsDirtyTimer = 0.0f;
|
1042
|
1053
|
SetNextWindowPosVal = ImVec2(0.0f, 0.0f);
|
1043
|
1054
|
SetNextWindowPosCond = 0;
|
|
@@ -1045,15 +1056,21 @@ struct ImGuiState
|
1045
|
1056
|
SetNextWindowSizeCond = 0;
|
1046
|
1057
|
SetNextWindowCollapsedVal = false;
|
1047
|
1058
|
SetNextWindowCollapsedCond = 0;
|
|
1059
|
+
|
1048
|
1060
|
SliderAsInputTextId = 0;
|
1049
|
1061
|
ActiveComboID = 0;
|
1050
|
1062
|
memset(Tooltip, 0, sizeof(Tooltip));
|
1051
|
1063
|
PrivateClipboard = NULL;
|
|
1064
|
+
|
1052
|
1065
|
LogEnabled = false;
|
1053
|
1066
|
LogFile = NULL;
|
|
1067
|
+ LogClipboard = NULL;
|
1054
|
1068
|
LogStartDepth = 0;
|
1055
|
1069
|
LogAutoExpandMaxDepth = 2;
|
1056
|
|
- LogClipboard = NULL;
|
|
1070
|
+
|
|
1071
|
+ memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
|
|
1072
|
+ FramerateSecPerFrameIdx = 0;
|
|
1073
|
+ FramerateSecPerFrameAccum = 0.0f;
|
1057
|
1074
|
}
|
1058
|
1075
|
};
|
1059
|
1076
|
|
|
@@ -1086,6 +1103,7 @@ struct ImGuiWindow
|
1086
|
1103
|
ImGuiDrawContext DC;
|
1087
|
1104
|
ImVector<ImGuiID> IDStack;
|
1088
|
1105
|
ImVector<ImVec4> ClipRectStack; // Scissoring / clipping rectangle. x1, y1, x2, y2.
|
|
1106
|
+ ImGuiAabb ClippedAabb; // = ClipRectStack.front() after setup in Begin()
|
1089
|
1107
|
int LastFrameDrawn;
|
1090
|
1108
|
float ItemWidthDefault;
|
1091
|
1109
|
ImGuiStorage StateStorage;
|
|
@@ -1118,12 +1136,12 @@ public:
|
1118
|
1136
|
ImVec2 CursorPos() const { return DC.CursorPos; }
|
1119
|
1137
|
float TitleBarHeight() const { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0 : FontSize() + GImGui->Style.FramePadding.y * 2.0f; }
|
1120
|
1138
|
ImGuiAabb TitleBarAabb() const { return ImGuiAabb(Pos, Pos + ImVec2(SizeFull.x, TitleBarHeight())); }
|
1121
|
|
- ImVec2 WindowPadding() const { return ((Flags & ImGuiWindowFlags_ChildWindow) && !(Flags & ImGuiWindowFlags_ShowBorders)) ? ImVec2(1,1) : GImGui->Style.WindowPadding; }
|
|
1139
|
+ ImVec2 WindowPadding() const { return ((Flags & ImGuiWindowFlags_ChildWindow) && !(Flags & ImGuiWindowFlags_ShowBorders)) ? ImVec2(0,0) : GImGui->Style.WindowPadding; }
|
1122
|
1140
|
ImU32 Color(ImGuiCol idx, float a=1.f) const { ImVec4 c = GImGui->Style.Colors[idx]; c.w *= GImGui->Style.Alpha * a; return ImGui::ColorConvertFloat4ToU32(c); }
|
1123
|
1141
|
ImU32 Color(const ImVec4& col) const { ImVec4 c = col; c.w *= GImGui->Style.Alpha; return ImGui::ColorConvertFloat4ToU32(c); }
|
1124
|
1142
|
};
|
1125
|
1143
|
|
1126
|
|
-static ImGuiWindow* GetCurrentWindow()
|
|
1144
|
+static inline ImGuiWindow* GetCurrentWindow()
|
1127
|
1145
|
{
|
1128
|
1146
|
ImGuiState& g = *GImGui;
|
1129
|
1147
|
IM_ASSERT(g.CurrentWindow != NULL); // ImGui::NewFrame() hasn't been called yet?
|
|
@@ -1135,6 +1153,7 @@ static void SetActiveId(ImGuiID id)
|
1135
|
1153
|
{
|
1136
|
1154
|
ImGuiState& g = *GImGui;
|
1137
|
1155
|
g.ActiveId = id;
|
|
1156
|
+ g.ActiveIdIsFocusedOnly = false;
|
1138
|
1157
|
}
|
1139
|
1158
|
|
1140
|
1159
|
static void RegisterAliveId(const ImGuiID& id)
|
|
@@ -1260,23 +1279,28 @@ void ImGuiStorage::SetAllInt(int v)
|
1260
|
1279
|
//-----------------------------------------------------------------------------
|
1261
|
1280
|
|
1262
|
1281
|
// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
|
1263
|
|
-ImGuiTextFilter::ImGuiTextFilter()
|
|
1282
|
+ImGuiTextFilter::ImGuiTextFilter(const char* default_filter)
|
1264
|
1283
|
{
|
1265
|
|
- InputBuf[0] = 0;
|
1266
|
|
- CountGrep = 0;
|
|
1284
|
+ if (default_filter)
|
|
1285
|
+ {
|
|
1286
|
+ ImFormatString(InputBuf, IM_ARRAYSIZE(InputBuf), "%s", default_filter);
|
|
1287
|
+ Build();
|
|
1288
|
+ }
|
|
1289
|
+ else
|
|
1290
|
+ {
|
|
1291
|
+ InputBuf[0] = 0;
|
|
1292
|
+ CountGrep = 0;
|
|
1293
|
+ }
|
1267
|
1294
|
}
|
1268
|
1295
|
|
1269
|
1296
|
void ImGuiTextFilter::Draw(const char* label, float width)
|
1270
|
1297
|
{
|
1271
|
1298
|
ImGuiWindow* window = GetCurrentWindow();
|
1272
|
|
- if (width < 0.0f)
|
1273
|
|
- {
|
1274
|
|
- ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true);
|
1275
|
|
- width = ImMax(window->Pos.x + ImGui::GetContentRegionMax().x - window->DC.CursorPos.x - (label_size.x + GImGui->Style.ItemSpacing.x*4), 10.0f);
|
1276
|
|
- }
|
1277
|
|
- ImGui::PushItemWidth(width);
|
|
1299
|
+ if (width > 0.0f)
|
|
1300
|
+ ImGui::PushItemWidth(width);
|
1278
|
1301
|
ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf));
|
1279
|
|
- ImGui::PopItemWidth();
|
|
1302
|
+ if (width > 0.0f)
|
|
1303
|
+ ImGui::PopItemWidth();
|
1280
|
1304
|
Build();
|
1281
|
1305
|
}
|
1282
|
1306
|
|
|
@@ -1393,8 +1417,7 @@ ImGuiWindow::ImGuiWindow(const char* name)
|
1393
|
1417
|
{
|
1394
|
1418
|
Name = ImStrdup(name);
|
1395
|
1419
|
ID = GetID(name);
|
1396
|
|
- IDStack.push_back(ID);
|
1397
|
|
-
|
|
1420
|
+ Flags = 0;
|
1398
|
1421
|
PosFloat = Pos = ImVec2(0.0f, 0.0f);
|
1399
|
1422
|
Size = SizeFull = ImVec2(0.0f, 0.0f);
|
1400
|
1423
|
SizeContentsFit = ImVec2(0.0f, 0.0f);
|
|
@@ -1409,6 +1432,7 @@ ImGuiWindow::ImGuiWindow(const char* name)
|
1409
|
1432
|
AutoFitOnlyGrows = false;
|
1410
|
1433
|
SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiSetCondition_Always | ImGuiSetCondition_FirstUseThisSession | ImGuiSetCondition_FirstUseEver;
|
1411
|
1434
|
|
|
1435
|
+ IDStack.push_back(ID);
|
1412
|
1436
|
LastFrameDrawn = -1;
|
1413
|
1437
|
ItemWidthDefault = 0.0f;
|
1414
|
1438
|
FontWindowScale = 1.0f;
|
|
@@ -1421,6 +1445,7 @@ ImGuiWindow::ImGuiWindow(const char* name)
|
1421
|
1445
|
|
1422
|
1446
|
DrawList = (ImDrawList*)ImGui::MemAlloc(sizeof(ImDrawList));
|
1423
|
1447
|
new(DrawList) ImDrawList();
|
|
1448
|
+ RootWindow = NULL;
|
1424
|
1449
|
|
1425
|
1450
|
FocusIdxAllCounter = FocusIdxTabCounter = -1;
|
1426
|
1451
|
FocusIdxAllRequestCurrent = FocusIdxTabRequestCurrent = IM_INT_MAX;
|
|
@@ -2309,7 +2334,9 @@ static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs)
|
2309
|
2334
|
continue;
|
2310
|
2335
|
if (excluding_childs && (window->Flags & ImGuiWindowFlags_ChildWindow) != 0)
|
2311
|
2336
|
continue;
|
2312
|
|
- ImGuiAabb bb(window->Pos - g.Style.TouchExtraPadding, window->Pos + window->Size + g.Style.TouchExtraPadding);
|
|
2337
|
+
|
|
2338
|
+ // Using the clipped AABB so a child window will typically be clipped by its parent.
|
|
2339
|
+ ImGuiAabb bb(window->ClippedAabb.Min - g.Style.TouchExtraPadding, window->ClippedAabb.Max + g.Style.TouchExtraPadding);
|
2313
|
2340
|
if (bb.Contains(pos))
|
2314
|
2341
|
return window;
|
2315
|
2342
|
}
|
|
@@ -2432,6 +2459,12 @@ bool ImGui::IsItemActive()
|
2432
|
2459
|
return false;
|
2433
|
2460
|
}
|
2434
|
2461
|
|
|
2462
|
+bool ImGui::IsAnyItemActive()
|
|
2463
|
+{
|
|
2464
|
+ ImGuiState& g = *GImGui;
|
|
2465
|
+ return g.ActiveId != 0;
|
|
2466
|
+}
|
|
2467
|
+
|
2435
|
2468
|
ImVec2 ImGui::GetItemBoxMin()
|
2436
|
2469
|
{
|
2437
|
2470
|
ImGuiWindow* window = GetCurrentWindow();
|
|
@@ -2482,14 +2515,7 @@ void ImGui::EndTooltip()
|
2482
|
2515
|
ImGui::End();
|
2483
|
2516
|
}
|
2484
|
2517
|
|
2485
|
|
-void ImGui::BeginChild(ImGuiID id, ImVec2 size, bool border, ImGuiWindowFlags extra_flags)
|
2486
|
|
-{
|
2487
|
|
- char str_id[32];
|
2488
|
|
- ImFormatString(str_id, IM_ARRAYSIZE(str_id), "child_%x", id);
|
2489
|
|
- ImGui::BeginChild(str_id, size, border, extra_flags);
|
2490
|
|
-}
|
2491
|
|
-
|
2492
|
|
-void ImGui::BeginChild(const char* str_id, ImVec2 size, bool border, ImGuiWindowFlags extra_flags)
|
|
2518
|
+bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags)
|
2493
|
2519
|
{
|
2494
|
2520
|
ImGuiState& g = *GImGui;
|
2495
|
2521
|
ImGuiWindow* window = GetCurrentWindow();
|
|
@@ -2498,6 +2524,7 @@ void ImGui::BeginChild(const char* str_id, ImVec2 size, bool border, ImGuiWindow
|
2498
|
2524
|
|
2499
|
2525
|
const ImVec2 content_max = window->Pos + ImGui::GetContentRegionMax();
|
2500
|
2526
|
const ImVec2 cursor_pos = window->Pos + ImGui::GetCursorPos();
|
|
2527
|
+ ImVec2 size = size_arg;
|
2501
|
2528
|
if (size.x <= 0.0f)
|
2502
|
2529
|
{
|
2503
|
2530
|
if (size.x == 0.0f)
|
|
@@ -2518,10 +2545,20 @@ void ImGui::BeginChild(const char* str_id, ImVec2 size, bool border, ImGuiWindow
|
2518
|
2545
|
ImFormatString(title, IM_ARRAYSIZE(title), "%s.%s", window->Name, str_id);
|
2519
|
2546
|
|
2520
|
2547
|
const float alpha = 1.0f;
|
2521
|
|
- ImGui::Begin(title, NULL, size, alpha, flags);
|
|
2548
|
+ bool ret = ImGui::Begin(title, NULL, size, alpha, flags);
|
2522
|
2549
|
|
2523
|
2550
|
if (!(window->Flags & ImGuiWindowFlags_ShowBorders))
|
2524
|
2551
|
g.CurrentWindow->Flags &= ~ImGuiWindowFlags_ShowBorders;
|
|
2552
|
+
|
|
2553
|
+ return ret;
|
|
2554
|
+}
|
|
2555
|
+
|
|
2556
|
+bool ImGui::BeginChild(ImGuiID id, const ImVec2& size, bool border, ImGuiWindowFlags extra_flags)
|
|
2557
|
+{
|
|
2558
|
+ char str_id[32];
|
|
2559
|
+ ImFormatString(str_id, IM_ARRAYSIZE(str_id), "child_%x", id);
|
|
2560
|
+ bool ret = ImGui::BeginChild(str_id, size, border, extra_flags);
|
|
2561
|
+ return ret;
|
2525
|
2562
|
}
|
2526
|
2563
|
|
2527
|
2564
|
void ImGui::EndChild()
|
|
@@ -2623,13 +2660,14 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
|
2623
|
2660
|
}
|
2624
|
2661
|
|
2625
|
2662
|
// Push a new ImGui window to add widgets to.
|
2626
|
|
-// - A default window called "Debug" is automatically stacked at the beginning of every frame.
|
2627
|
|
-// - This can be called multiple times during the frame with the same window name to append content to the same window.
|
|
2663
|
+// - 'size' for a regular window denote the initial size for first-time creation (no saved data) and isn't that useful. Use SetNextWindowSize() prior to calling Begin() for more flexible window manipulation.
|
|
2664
|
+// - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair.
|
|
2665
|
+// - Begin/End can be called multiple times during the frame with the same window name to append content.
|
2628
|
2666
|
// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file). Note that you can use ## to append unique data that isn't displayed, e.g. "My window##1" will use "My window##1" as unique window ID but display "My window" to the user.
|
2629
|
2667
|
// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned.
|
2630
|
2668
|
// - Passing 'bool* p_opened' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed.
|
2631
|
2669
|
// - Passing non-zero 'size' is roughly equivalent to calling SetNextWindowSize(size, ImGuiSetCondition_FirstUseEver) prior to calling Begin().
|
2632
|
|
-bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alpha, ImGuiWindowFlags flags)
|
|
2670
|
+bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size, float bg_alpha, ImGuiWindowFlags flags)
|
2633
|
2671
|
{
|
2634
|
2672
|
ImGuiState& g = *GImGui;
|
2635
|
2673
|
const ImGuiStyle& style = g.Style;
|
|
@@ -2681,8 +2719,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph
|
2681
|
2719
|
window->RootWindow = g.CurrentWindowStack[root_idx];
|
2682
|
2720
|
|
2683
|
2721
|
// Default alpha
|
2684
|
|
- if (fill_alpha < 0.0f)
|
2685
|
|
- fill_alpha = style.WindowFillAlphaDefault;
|
|
2722
|
+ if (bg_alpha < 0.0f)
|
|
2723
|
+ bg_alpha = style.WindowFillAlphaDefault;
|
2686
|
2724
|
|
2687
|
2725
|
// When reusing window again multiple times a frame, just append content (don't need to setup again)
|
2688
|
2726
|
const int current_frame = ImGui::GetFrameCount();
|
|
@@ -2888,16 +2926,16 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph
|
2888
|
2926
|
window->ScrollbarY = (window->SizeContentsFit.y > window->Size.y) && !(window->Flags & ImGuiWindowFlags_NoScrollbar);
|
2889
|
2927
|
|
2890
|
2928
|
// Window background
|
2891
|
|
- if (fill_alpha > 0.0f)
|
|
2929
|
+ if (bg_alpha > 0.0f)
|
2892
|
2930
|
{
|
2893
|
2931
|
if ((window->Flags & ImGuiWindowFlags_ComboBox) != 0)
|
2894
|
|
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_ComboBg, fill_alpha), window_rounding);
|
|
2932
|
+ window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_ComboBg, bg_alpha), window_rounding);
|
2895
|
2933
|
else if ((window->Flags & ImGuiWindowFlags_Tooltip) != 0)
|
2896
|
|
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_TooltipBg, fill_alpha), window_rounding);
|
|
2934
|
+ window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_TooltipBg, bg_alpha), window_rounding);
|
2897
|
2935
|
else if ((window->Flags & ImGuiWindowFlags_ChildWindow) != 0)
|
2898
|
|
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size-ImVec2(window->ScrollbarY?style.ScrollBarWidth:0.0f,0.0f), window->Color(ImGuiCol_ChildWindowBg, fill_alpha), window_rounding, window->ScrollbarY ? (1|8) : (0xF));
|
|
2936
|
+ window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size-ImVec2(window->ScrollbarY?style.ScrollBarWidth:0.0f,0.0f), window->Color(ImGuiCol_ChildWindowBg, bg_alpha), window_rounding, window->ScrollbarY ? (1|8) : (0xF));
|
2899
|
2937
|
else
|
2900
|
|
- window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_WindowBg, fill_alpha), window_rounding);
|
|
2938
|
+ window->DrawList->AddRectFilled(window->Pos, window->Pos+window->Size, window->Color(ImGuiCol_WindowBg, bg_alpha), window_rounding);
|
2901
|
2939
|
}
|
2902
|
2940
|
|
2903
|
2941
|
// Title bar
|
|
@@ -3014,6 +3052,10 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph
|
3014
|
3052
|
const ImVec2 text_max = window->Pos + ImVec2(window->Size.x - (p_opened ? (title_bar_aabb.GetHeight()-3) : style.FramePadding.x), style.FramePadding.y*2 + text_size.y);
|
3015
|
3053
|
RenderTextClipped(text_min, name, NULL, &text_size, text_max);
|
3016
|
3054
|
}
|
|
3055
|
+
|
|
3056
|
+ // Save clipped aabb so we can access it in constant-time in FindHoveredWindow()
|
|
3057
|
+ window->ClippedAabb = window->Aabb();
|
|
3058
|
+ window->ClippedAabb.Clip(window->ClipRectStack.front());
|
3017
|
3059
|
}
|
3018
|
3060
|
|
3019
|
3061
|
// Inner clipping rectangle
|
|
@@ -3033,8 +3075,10 @@ bool ImGui::Begin(const char* name, bool* p_opened, ImVec2 size, float fill_alph
|
3033
|
3075
|
if (flags & ImGuiWindowFlags_ChildWindow)
|
3034
|
3076
|
{
|
3035
|
3077
|
IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0);
|
|
3078
|
+ window->Collapsed = parent_window && parent_window->Collapsed;
|
|
3079
|
+
|
3036
|
3080
|
const ImVec4 clip_rect_t = window->ClipRectStack.back();
|
3037
|
|
- window->Collapsed = (clip_rect_t.x >= clip_rect_t.z || clip_rect_t.y >= clip_rect_t.w);
|
|
3081
|
+ window->Collapsed |= (clip_rect_t.x >= clip_rect_t.z || clip_rect_t.y >= clip_rect_t.w);
|
3038
|
3082
|
|
3039
|
3083
|
// We also hide the window from rendering because we've already added its border to the command list.
|
3040
|
3084
|
// (we could perform the check earlier in the function but it is simpler at this point)
|
|
@@ -3417,11 +3461,12 @@ void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiSetCondition cond)
|
3417
|
3461
|
ImVec2 ImGui::GetContentRegionMax()
|
3418
|
3462
|
{
|
3419
|
3463
|
ImGuiWindow* window = GetCurrentWindow();
|
3420
|
|
- ImVec2 mx = window->Size - window->WindowPadding();
|
|
3464
|
+ ImVec2 window_padding = window->WindowPadding();
|
|
3465
|
+ ImVec2 mx = window->Size - window_padding;
|
3421
|
3466
|
if (window->DC.ColumnsCount != 1)
|
3422
|
3467
|
{
|
3423
|
3468
|
mx.x = ImGui::GetColumnOffset(window->DC.ColumnsCurrent + 1);
|
3424
|
|
- mx.x -= GImGui->Style.WindowPadding.x;
|
|
3469
|
+ mx.x -= window_padding.x;
|
3425
|
3470
|
}
|
3426
|
3471
|
else
|
3427
|
3472
|
{
|
|
@@ -3761,8 +3806,11 @@ static bool IsHovered(const ImGuiAabb& bb, const ImGuiID& id)
|
3761
|
3806
|
if (g.HoveredId == 0)
|
3762
|
3807
|
{
|
3763
|
3808
|
ImGuiWindow* window = GetCurrentWindow();
|
3764
|
|
- const bool hovered = (g.HoveredRootWindow == window->RootWindow) && (g.ActiveId == 0 || g.ActiveId == id) && IsMouseHoveringBox(bb);
|
3765
|
|
- return hovered;
|
|
3809
|
+ if (g.HoveredRootWindow == window->RootWindow)
|
|
3810
|
+ {
|
|
3811
|
+ bool hovered = (g.ActiveId == 0 || g.ActiveId == id || g.ActiveIdIsFocusedOnly) && IsMouseHoveringBox(bb);
|
|
3812
|
+ return hovered;
|
|
3813
|
+ }
|
3766
|
3814
|
}
|
3767
|
3815
|
return false;
|
3768
|
3816
|
}
|
|
@@ -4486,20 +4534,14 @@ bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, c
|
4486
|
4534
|
if (g.SliderAsInputTextId == 0)
|
4487
|
4535
|
{
|
4488
|
4536
|
// First frame
|
4489
|
|
- IM_ASSERT(g.ActiveId == id); // InputText ID should match the Slider ID (else we'd need to store them both which is also possible)
|
|
4537
|
+ IM_ASSERT(g.ActiveId == id); // InputText ID expected to match the Slider ID (else we'd need to store them both, which is also possible)
|
4490
|
4538
|
g.SliderAsInputTextId = g.ActiveId;
|
4491
|
|
- SetActiveId(id);
|
4492
|
4539
|
g.HoveredId = id;
|
4493
|
4540
|
}
|
4494
|
|
- else
|
|
4541
|
+ else if (g.ActiveId != g.SliderAsInputTextId)
|
4495
|
4542
|
{
|
4496
|
|
- if (g.ActiveId == g.SliderAsInputTextId)
|
4497
|
|
- SetActiveId(id);
|
4498
|
|
- else
|
4499
|
|
- {
|
4500
|
|
- SetActiveId(0);
|
4501
|
|
- g.SliderAsInputTextId = 0;
|
4502
|
|
- }
|
|
4543
|
+ // Release
|
|
4544
|
+ g.SliderAsInputTextId = 0;
|
4503
|
4545
|
}
|
4504
|
4546
|
if (value_changed)
|
4505
|
4547
|
{
|
|
@@ -4594,8 +4636,9 @@ bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, c
|
4594
|
4636
|
|
4595
|
4637
|
// Draw value using user-provided display format so user can add prefix/suffix/decorations to the value.
|
4596
|
4638
|
char value_buf[64];
|
4597
|
|
- ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v);
|
4598
|
|
- RenderText(ImVec2(slider_bb.GetCenter().x-CalcTextSize(value_buf, NULL, true).x*0.5f, frame_bb.Min.y + style.FramePadding.y), value_buf);
|
|
4639
|
+ char* value_buf_end = value_buf + ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v);
|
|
4640
|
+ const ImVec2 value_text_size = CalcTextSize(value_buf, value_buf_end, true);
|
|
4641
|
+ RenderTextClipped(ImVec2(ImMax(frame_bb.Min.x + style.FramePadding.x, slider_bb.GetCenter().x - value_text_size.x*0.5f), frame_bb.Min.y + style.FramePadding.y), value_buf, value_buf_end, &value_text_size, frame_bb.Max);
|
4599
|
4642
|
|
4600
|
4643
|
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, slider_bb.Min.y), label);
|
4601
|
4644
|
|
|
@@ -5010,7 +5053,7 @@ static void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int pos, int n)
|
5010
|
5053
|
static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const ImWchar* new_text, int new_text_len)
|
5011
|
5054
|
{
|
5012
|
5055
|
const size_t text_len = ImStrlenW(obj->Text);
|
5013
|
|
- if ((size_t)new_text_len + text_len + 1 >= obj->BufSize)
|
|
5056
|
+ if ((size_t)new_text_len + text_len + 1 > obj->BufSize)
|
5014
|
5057
|
return false;
|
5015
|
5058
|
|
5016
|
5059
|
if (pos != (int)text_len)
|
|
@@ -5311,29 +5354,45 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
5311
|
5354
|
|
5312
|
5355
|
const bool is_ctrl_down = io.KeyCtrl;
|
5313
|
5356
|
const bool is_shift_down = io.KeyShift;
|
5314
|
|
- const bool tab_focus_requested = window->FocusItemRegister(g.ActiveId == id, (flags & ImGuiInputTextFlags_CallbackCompletion) == 0); // Using completion callback disable keyboard tabbing
|
5315
|
|
- //const bool align_center = (bool)(flags & ImGuiInputTextFlags_AlignCenter); // FIXME: Unsupported
|
|
5357
|
+ const bool focus_requested = window->FocusItemRegister(g.ActiveId == id, (flags & ImGuiInputTextFlags_CallbackCompletion) == 0); // Using completion callback disable keyboard tabbing
|
|
5358
|
+ const bool focus_requested_by_code = focus_requested && (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent);
|
|
5359
|
+ const bool focus_requested_by_tab = focus_requested && !focus_requested_by_code;
|
5316
|
5360
|
|
5317
|
5361
|
const bool hovered = IsHovered(frame_bb, id);
|
5318
|
5362
|
if (hovered)
|
5319
|
5363
|
g.HoveredId = id;
|
|
5364
|
+ const bool user_clicked = hovered && io.MouseClicked[0];
|
5320
|
5365
|
|
5321
|
5366
|
bool select_all = (g.ActiveId != id) && (flags & ImGuiInputTextFlags_AutoSelectAll) != 0;
|
5322
|
|
- if (tab_focus_requested || (hovered && io.MouseClicked[0]))
|
|
5367
|
+ if (focus_requested || user_clicked)
|
5323
|
5368
|
{
|
5324
|
5369
|
if (g.ActiveId != id)
|
5325
|
5370
|
{
|
5326
|
5371
|
// Start edition
|
5327
|
5372
|
// Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar)
|
5328
|
5373
|
ImFormatString(edit_state.InitialText, IM_ARRAYSIZE(edit_state.InitialText), "%s", buf);
|
5329
|
|
- ImTextStrFromUtf8(edit_state.Text, IM_ARRAYSIZE(edit_state.Text), buf, NULL);
|
5330
|
|
- edit_state.ScrollX = 0.0f;
|
|
5374
|
+ size_t buf_len = ImTextStrFromUtf8(edit_state.Text, IM_ARRAYSIZE(edit_state.Text), buf, NULL);
|
5331
|
5375
|
edit_state.Width = w;
|
5332
|
|
- stb_textedit_initialize_state(&edit_state.StbState, true);
|
|
5376
|
+ edit_state.InputCursorScreenPos = ImVec2(-1.f,-1.f);
|
5333
|
5377
|
edit_state.CursorAnimReset();
|
5334
|
|
- edit_state.LastCursorPos = ImVec2(-1.f,-1.f);
|
5335
|
5378
|
|
5336
|
|
- if (tab_focus_requested || is_ctrl_down)
|
|
5379
|
+ if (edit_state.Id != id)
|
|
5380
|
+ {
|
|
5381
|
+ edit_state.Id = id;
|
|
5382
|
+ edit_state.ScrollX = 0.0f;
|
|
5383
|
+ stb_textedit_initialize_state(&edit_state.StbState, true);
|
|
5384
|
+ if (focus_requested_by_code)
|
|
5385
|
+ select_all = true;
|
|
5386
|
+ }
|
|
5387
|
+ else
|
|
5388
|
+ {
|
|
5389
|
+ // Recycle existing cursor/selection/undo stack but clamp position
|
|
5390
|
+ // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler.
|
|
5391
|
+ edit_state.StbState.cursor = ImMin(edit_state.StbState.cursor, buf_len);
|
|
5392
|
+ edit_state.StbState.select_start = ImMin(edit_state.StbState.select_start, buf_len);
|
|
5393
|
+ edit_state.StbState.select_end = ImMin(edit_state.StbState.select_end, buf_len);
|
|
5394
|
+ }
|
|
5395
|
+ if (focus_requested_by_tab || (user_clicked && is_ctrl_down))
|
5337
|
5396
|
select_all = true;
|
5338
|
5397
|
}
|
5339
|
5398
|
SetActiveId(id);
|
|
@@ -5348,6 +5407,11 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
5348
|
5407
|
}
|
5349
|
5408
|
}
|
5350
|
5409
|
|
|
5410
|
+ // Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget.
|
|
5411
|
+ // Down the line we should have a cleaner concept of focused vs active in the library.
|
|
5412
|
+ if (g.ActiveId == id)
|
|
5413
|
+ g.ActiveIdIsFocusedOnly = !io.MouseDown[0];
|
|
5414
|
+
|
5351
|
5415
|
bool value_changed = false;
|
5352
|
5416
|
bool cancel_edit = false;
|
5353
|
5417
|
bool enter_pressed = false;
|
|
@@ -5563,7 +5627,6 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
5563
|
5627
|
}
|
5564
|
5628
|
}
|
5565
|
5629
|
|
5566
|
|
- // FIXME: 'align_center' unsupported
|
5567
|
5630
|
ImGuiTextEditState::RenderTextScrolledClipped(window->Font(), window->FontSize(), buf, frame_bb.Min + style.FramePadding, w, (g.ActiveId == id) ? edit_state.ScrollX : 0.0f);
|
5568
|
5631
|
|
5569
|
5632
|
if (g.ActiveId == id)
|
|
@@ -5574,11 +5637,11 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
5574
|
5637
|
if (g.InputTextState.CursorIsVisible())
|
5575
|
5638
|
window->DrawList->AddRect(cursor_pos - font_off_up + ImVec2(0,2), cursor_pos + font_off_dn - ImVec2(0,3), window->Color(ImGuiCol_Text));
|
5576
|
5639
|
|
5577
|
|
- // Notify OS of text input position
|
5578
|
|
- if (io.ImeSetInputScreenPosFn && ImLengthSqr(edit_state.LastCursorPos - cursor_pos) > 0.0001f)
|
|
5640
|
+ // Notify OS of text input position for advanced IME
|
|
5641
|
+ if (io.ImeSetInputScreenPosFn && ImLengthSqr(edit_state.InputCursorScreenPos - cursor_pos) > 0.0001f)
|
5579
|
5642
|
io.ImeSetInputScreenPosFn((int)cursor_pos.x - 1, (int)(cursor_pos.y - window->FontSize())); // -1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.
|
5580
|
5643
|
|
5581
|
|
- edit_state.LastCursorPos = cursor_pos;
|
|
5644
|
+ edit_state.InputCursorScreenPos = cursor_pos;
|
5582
|
5645
|
}
|
5583
|
5646
|
|
5584
|
5647
|
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
|
|
@@ -6148,7 +6211,10 @@ void ImGui::Separator()
|
6148
|
6211
|
window->DrawList->AddLine(bb.Min, bb.Max, window->Color(ImGuiCol_Border));
|
6149
|
6212
|
|
6150
|
6213
|
if (window->DC.ColumnsCount > 1)
|
|
6214
|
+ {
|
6151
|
6215
|
PushColumnClipRect();
|
|
6216
|
+ window->DC.ColumnsCellMinY = window->DC.CursorPos.y;
|
|
6217
|
+ }
|
6152
|
6218
|
}
|
6153
|
6219
|
|
6154
|
6220
|
// A little vertical spacing.
|
|
@@ -6206,6 +6272,7 @@ bool ImGui::IsClipped(const ImVec2& item_size)
|
6206
|
6272
|
|
6207
|
6273
|
static bool ItemAdd(const ImGuiAabb& bb, const ImGuiID* id)
|
6208
|
6274
|
{
|
|
6275
|
+ //ImGuiState& g = *GImGui;
|
6209
|
6276
|
ImGuiWindow* window = GetCurrentWindow();
|
6210
|
6277
|
window->DC.LastItemID = id ? *id : 0;
|
6211
|
6278
|
window->DC.LastItemAabb = bb;
|
|
@@ -6214,7 +6281,11 @@ static bool ItemAdd(const ImGuiAabb& bb, const ImGuiID* id)
|
6214
|
6281
|
window->DC.LastItemHovered = false;
|
6215
|
6282
|
return false;
|
6216
|
6283
|
}
|
6217
|
|
- window->DC.LastItemHovered = IsMouseHoveringBox(bb); // this is a sensible default but widgets are free to override it after calling ItemAdd()
|
|
6284
|
+
|
|
6285
|
+ // This is a sensible default, but widgets are free to override it after calling ItemAdd()
|
|
6286
|
+ const bool hovered = IsMouseHoveringBox(bb);
|
|
6287
|
+ //const bool hovered = (g.ActiveId == 0 || (id && g.ActiveId == *id) || g.ActiveIdIsFocusedOnly) && IsMouseHoveringBox(bb); // matching the behaviour of IsHovered(), not always what the user wants?
|
|
6288
|
+ window->DC.LastItemHovered = hovered;
|
6218
|
6289
|
return true;
|
6219
|
6290
|
}
|
6220
|
6291
|
|
|
@@ -6289,7 +6360,10 @@ float ImGui::GetColumnOffset(int column_index)
|
6289
|
6360
|
// Read from cache
|
6290
|
6361
|
IM_ASSERT(column_index < (int)window->DC.ColumnsOffsetsT.size());
|
6291
|
6362
|
const float t = window->DC.ColumnsOffsetsT[column_index];
|
6292
|
|
- const float offset = window->DC.ColumnsStartX + t * (window->Size.x - g.Style.ScrollBarWidth - window->DC.ColumnsStartX);
|
|
6363
|
+
|
|
6364
|
+ const float min_x = window->DC.ColumnsStartX;
|
|
6365
|
+ const float max_x = window->Size.x - (g.Style.ScrollBarWidth);// - window->WindowPadding().x;
|
|
6366
|
+ const float offset = min_x + t * (max_x - min_x);
|
6293
|
6367
|
return offset;
|
6294
|
6368
|
}
|
6295
|
6369
|
|
|
@@ -6302,7 +6376,10 @@ void ImGui::SetColumnOffset(int column_index, float offset)
|
6302
|
6376
|
|
6303
|
6377
|
IM_ASSERT(column_index < (int)window->DC.ColumnsOffsetsT.size());
|
6304
|
6378
|
const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index);
|
6305
|
|
- const float t = (offset - window->DC.ColumnsStartX) / (window->Size.x - g.Style.ScrollBarWidth - window->DC.ColumnsStartX);
|
|
6379
|
+
|
|
6380
|
+ const float min_x = window->DC.ColumnsStartX;
|
|
6381
|
+ const float max_x = window->Size.x - (window->ScrollbarY);// - window->WindowPadding().x;
|
|
6382
|
+ const float t = (offset - min_x) / (max_x - min_x);
|
6306
|
6383
|
window->StateStorage.SetFloat(column_id, t);
|
6307
|
6384
|
window->DC.ColumnsOffsetsT[column_index] = t;
|
6308
|
6385
|
}
|
|
@@ -6332,8 +6409,6 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
|
6332
|
6409
|
{
|
6333
|
6410
|
ImGuiState& g = *GImGui;
|
6334
|
6411
|
ImGuiWindow* window = GetCurrentWindow();
|
6335
|
|
- if (window->SkipItems)
|
6336
|
|
- return;
|
6337
|
6412
|
|
6338
|
6413
|
if (window->DC.ColumnsCount != 1)
|
6339
|
6414
|
{
|
|
@@ -6347,7 +6422,7 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
|
6347
|
6422
|
}
|
6348
|
6423
|
|
6349
|
6424
|
// Draw columns borders and handle resize at the time of "closing" a columns set
|
6350
|
|
- if (window->DC.ColumnsCount != columns_count && window->DC.ColumnsCount != 1 && window->DC.ColumnsShowBorders)
|
|
6425
|
+ if (window->DC.ColumnsCount != columns_count && window->DC.ColumnsCount != 1 && window->DC.ColumnsShowBorders && !window->SkipItems)
|
6351
|
6426
|
{
|
6352
|
6427
|
const float y1 = window->DC.ColumnsStartPos.y;
|
6353
|
6428
|
const float y2 = window->DC.CursorPos.y;
|
|
@@ -7382,7 +7457,7 @@ void ImFont::BuildLookupTable()
|
7382
|
7457
|
{
|
7383
|
7458
|
Glyphs.resize(Glyphs.size() + 1);
|
7384
|
7459
|
ImFont::Glyph& tab_glyph = Glyphs.back();
|
7385
|
|
- tab_glyph = *space_glyph;
|
|
7460
|
+ tab_glyph = *FindGlyph((unsigned short)' ');
|
7386
|
7461
|
tab_glyph.Codepoint = '\t';
|
7387
|
7462
|
tab_glyph.XAdvance *= 4;
|
7388
|
7463
|
IndexXAdvance[(size_t)tab_glyph.Codepoint] = (float)tab_glyph.XAdvance;
|
|
@@ -8115,7 +8190,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
8115
|
8190
|
static bool no_move = false;
|
8116
|
8191
|
static bool no_scrollbar = false;
|
8117
|
8192
|
static bool no_collapse = false;
|
8118
|
|
- static float fill_alpha = 0.65f;
|
|
8193
|
+ static float bg_alpha = 0.65f;
|
8119
|
8194
|
|
8120
|
8195
|
// Demonstrate the various window flags. Typically you would just use the default.
|
8121
|
8196
|
ImGuiWindowFlags window_flags = 0;
|
|
@@ -8125,7 +8200,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
8125
|
8200
|
if (no_move) window_flags |= ImGuiWindowFlags_NoMove;
|
8126
|
8201
|
if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar;
|
8127
|
8202
|
if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse;
|
8128
|
|
- if (!ImGui::Begin("ImGui Test", opened, ImVec2(550,680), fill_alpha, window_flags))
|
|
8203
|
+ if (!ImGui::Begin("ImGui Test", opened, ImVec2(550,680), bg_alpha, window_flags))
|
8129
|
8204
|
{
|
8130
|
8205
|
// Early out if the window is collapsed, as an optimization.
|
8131
|
8206
|
ImGui::End();
|
|
@@ -8156,7 +8231,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
8156
|
8231
|
ImGui::Checkbox("no move", &no_move); ImGui::SameLine(150);
|
8157
|
8232
|
ImGui::Checkbox("no scrollbar", &no_scrollbar); ImGui::SameLine(300);
|
8158
|
8233
|
ImGui::Checkbox("no collapse", &no_collapse);
|
8159
|
|
- ImGui::SliderFloat("fill alpha", &fill_alpha, 0.0f, 1.0f);
|
|
8234
|
+ ImGui::SliderFloat("bg alpha", &bg_alpha, 0.0f, 1.0f);
|
8160
|
8235
|
|
8161
|
8236
|
if (ImGui::TreeNode("Style"))
|
8162
|
8237
|
{
|
|
@@ -8595,34 +8670,59 @@ void ImGui::ShowTestWindow(bool* opened)
|
8595
|
8670
|
|
8596
|
8671
|
if (ImGui::CollapsingHeader("Columns"))
|
8597
|
8672
|
{
|
8598
|
|
- ImGui::Columns(4, "data", true);
|
|
8673
|
+ // Basic columns
|
|
8674
|
+ ImGui::Text("Basic:");
|
|
8675
|
+ ImGui::Columns(4, "mycolumns");
|
8599
|
8676
|
ImGui::Text("ID"); ImGui::NextColumn();
|
8600
|
8677
|
ImGui::Text("Name"); ImGui::NextColumn();
|
8601
|
8678
|
ImGui::Text("Path"); ImGui::NextColumn();
|
8602
|
8679
|
ImGui::Text("Flags"); ImGui::NextColumn();
|
8603
|
8680
|
ImGui::Separator();
|
|
8681
|
+ const char* names[3] = { "Robert", "Stephanie", "C64" };
|
|
8682
|
+ const char* paths[3] = { "/path/robert", "/path/stephanie", "/path/computer" };
|
|
8683
|
+ for (int i = 0; i < 3; i++)
|
|
8684
|
+ {
|
|
8685
|
+ ImGui::Text("%04d", i); ImGui::NextColumn();
|
|
8686
|
+ ImGui::Text(names[i]); ImGui::NextColumn();
|
|
8687
|
+ ImGui::Text(paths[i]); ImGui::NextColumn();
|
|
8688
|
+ ImGui::Text("...."); ImGui::NextColumn();
|
|
8689
|
+ }
|
|
8690
|
+ ImGui::Columns(1);
|
8604
|
8691
|
|
8605
|
|
- ImGui::Text("0000"); ImGui::NextColumn();
|
8606
|
|
- ImGui::Text("Robert"); ImGui::NextColumn();
|
8607
|
|
- ImGui::Text("/path/robert"); ImGui::NextColumn();
|
8608
|
|
- ImGui::Text("...."); ImGui::NextColumn();
|
8609
|
|
-
|
8610
|
|
- ImGui::Text("0001"); ImGui::NextColumn();
|
8611
|
|
- ImGui::Text("Stephanie"); ImGui::NextColumn();
|
8612
|
|
- ImGui::Text("/path/stephanie"); ImGui::NextColumn();
|
8613
|
|
- ImGui::Text("line 1"); ImGui::Text("line 2"); ImGui::NextColumn(); // two lines, two items
|
|
8692
|
+ ImGui::Separator();
|
|
8693
|
+ ImGui::Spacing();
|
8614
|
8694
|
|
8615
|
|
- ImGui::Text("0002"); ImGui::NextColumn();
|
8616
|
|
- ImGui::Text("C64"); ImGui::NextColumn();
|
8617
|
|
- ImGui::Text("/path/computer"); ImGui::NextColumn();
|
8618
|
|
- ImGui::Text("...."); ImGui::NextColumn();
|
|
8695
|
+ // Scrolling columns
|
|
8696
|
+ /*
|
|
8697
|
+ ImGui::Text("Scrolling:");
|
|
8698
|
+ ImGui::BeginChild("##header", ImVec2(0, ImGui::GetTextLineHeightWithSpacing()+ImGui::GetStyle().ItemSpacing.y));
|
|
8699
|
+ ImGui::Columns(3);
|
|
8700
|
+ ImGui::Text("ID"); ImGui::NextColumn();
|
|
8701
|
+ ImGui::Text("Name"); ImGui::NextColumn();
|
|
8702
|
+ ImGui::Text("Path"); ImGui::NextColumn();
|
|
8703
|
+ ImGui::Columns(1);
|
|
8704
|
+ ImGui::Separator();
|
|
8705
|
+ ImGui::EndChild();
|
|
8706
|
+ ImGui::BeginChild("##scrollingregion", ImVec2(0, 60));
|
|
8707
|
+ ImGui::Columns(3);
|
|
8708
|
+ for (int i = 0; i < 10; i++)
|
|
8709
|
+ {
|
|
8710
|
+ ImGui::Text("%04d", i); ImGui::NextColumn();
|
|
8711
|
+ ImGui::Text("Foobar"); ImGui::NextColumn();
|
|
8712
|
+ ImGui::Text("/path/foobar/%04d/", i); ImGui::NextColumn();
|
|
8713
|
+ }
|
8619
|
8714
|
ImGui::Columns(1);
|
|
8715
|
+ ImGui::EndChild();
|
8620
|
8716
|
|
8621
|
8717
|
ImGui::Separator();
|
|
8718
|
+ ImGui::Spacing();
|
|
8719
|
+ */
|
8622
|
8720
|
|
|
8721
|
+ // Create multiple items in a same cell before switching to next column
|
|
8722
|
+ ImGui::Text("Mixed items:");
|
8623
|
8723
|
ImGui::Columns(3, "mixed");
|
|
8724
|
+ ImGui::Separator();
|
8624
|
8725
|
|
8625
|
|
- // Create multiple items in a same cell because switching to next column
|
8626
|
8726
|
static int e = 0;
|
8627
|
8727
|
ImGui::Text("Hello");
|
8628
|
8728
|
ImGui::Button("Banana");
|
|
@@ -8632,38 +8732,41 @@ void ImGui::ShowTestWindow(bool* opened)
|
8632
|
8732
|
ImGui::Text("ImGui");
|
8633
|
8733
|
ImGui::Button("Apple");
|
8634
|
8734
|
ImGui::RadioButton("radio b", &e, 1);
|
|
8735
|
+ static float foo = 1.0f;
|
|
8736
|
+ ImGui::InputFloat("red", &foo, 0.05f, 0, 3);
|
8635
|
8737
|
ImGui::Text("An extra line here.");
|
8636
|
8738
|
ImGui::NextColumn();
|
8637
|
8739
|
|
8638
|
8740
|
ImGui::Text("World!");
|
8639
|
8741
|
ImGui::Button("Corniflower");
|
8640
|
8742
|
ImGui::RadioButton("radio c", &e, 2);
|
|
8743
|
+ static float bar = 1.0f;
|
|
8744
|
+ ImGui::InputFloat("blue", &bar, 0.05f, 0, 3);
|
8641
|
8745
|
ImGui::NextColumn();
|
8642
|
8746
|
|
8643
|
8747
|
if (ImGui::CollapsingHeader("Category A")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
|
8644
|
8748
|
if (ImGui::CollapsingHeader("Category B")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
|
8645
|
8749
|
if (ImGui::CollapsingHeader("Category C")) ImGui::Text("Blah blah blah"); ImGui::NextColumn();
|
8646
|
|
-
|
8647
|
|
- ImGui::Columns(1);
|
8648
|
|
-
|
8649
|
|
- ImGui::Separator();
|
8650
|
|
-
|
8651
|
|
- ImGui::Columns(2, "multiple components");
|
8652
|
|
- static float foo = 1.0f;
|
8653
|
|
- ImGui::InputFloat("red", &foo, 0.05f, 0, 3); ImGui::NextColumn();
|
8654
|
|
- static float bar = 1.0f;
|
8655
|
|
- ImGui::InputFloat("blue", &bar, 0.05f, 0, 3); ImGui::NextColumn();
|
8656
|
8750
|
ImGui::Columns(1);
|
8657
|
8751
|
|
8658
|
8752
|
ImGui::Separator();
|
|
8753
|
+ ImGui::Spacing();
|
8659
|
8754
|
|
|
8755
|
+ // Tree items
|
|
8756
|
+ ImGui::Text("Tree items:");
|
8660
|
8757
|
ImGui::Columns(2, "tree items");
|
|
8758
|
+ ImGui::Separator();
|
8661
|
8759
|
if (ImGui::TreeNode("Hello")) { ImGui::BulletText("World"); ImGui::TreePop(); } ImGui::NextColumn();
|
8662
|
|
- if (ImGui::TreeNode("Bonjour")) { ImGui::BulletText("Monde"); ImGui::TreePop(); }
|
|
8760
|
+ if (ImGui::TreeNode("Bonjour")) { ImGui::BulletText("Monde"); ImGui::TreePop(); } ImGui::NextColumn();
|
8663
|
8761
|
ImGui::Columns(1);
|
|
8762
|
+
|
8664
|
8763
|
ImGui::Separator();
|
|
8764
|
+ ImGui::Spacing();
|
8665
|
8765
|
|
8666
|
|
- ImGui::Columns(2, "word wrapping");
|
|
8766
|
+ // Word-wrapping
|
|
8767
|
+ ImGui::Text("Word-wrapping:");
|
|
8768
|
+ ImGui::Columns(2, "word-wrapping");
|
|
8769
|
+ ImGui::Separator();
|
8667
|
8770
|
ImGui::TextWrapped("The quick brown fox jumps over the lazy dog.");
|
8668
|
8771
|
ImGui::Text("Hello Left");
|
8669
|
8772
|
ImGui::NextColumn();
|
|
@@ -8672,34 +8775,29 @@ void ImGui::ShowTestWindow(bool* opened)
|
8672
|
8775
|
ImGui::Columns(1);
|
8673
|
8776
|
|
8674
|
8777
|
ImGui::Separator();
|
|
8778
|
+ ImGui::Spacing();
|
8675
|
8779
|
|
8676
|
8780
|
if (ImGui::TreeNode("Inside a tree.."))
|
8677
|
8781
|
{
|
8678
|
8782
|
if (ImGui::TreeNode("node 1 (with borders)"))
|
8679
|
8783
|
{
|
8680
|
8784
|
ImGui::Columns(4);
|
8681
|
|
- ImGui::Text("aaa"); ImGui::NextColumn();
|
8682
|
|
- ImGui::Text("bbb"); ImGui::NextColumn();
|
8683
|
|
- ImGui::Text("ccc"); ImGui::NextColumn();
|
8684
|
|
- ImGui::Text("ddd"); ImGui::NextColumn();
|
8685
|
|
- ImGui::Text("eee"); ImGui::NextColumn();
|
8686
|
|
- ImGui::Text("fff"); ImGui::NextColumn();
|
8687
|
|
- ImGui::Text("ggg"); ImGui::NextColumn();
|
8688
|
|
- ImGui::Text("hhh"); ImGui::NextColumn();
|
|
8785
|
+ for (int i = 0; i < 8; i++)
|
|
8786
|
+ {
|
|
8787
|
+ ImGui::Text("%c%c%c", 'a'+i, 'a'+i, 'a'+i);
|
|
8788
|
+ ImGui::NextColumn();
|
|
8789
|
+ }
|
8689
|
8790
|
ImGui::Columns(1);
|
8690
|
8791
|
ImGui::TreePop();
|
8691
|
8792
|
}
|
8692
|
8793
|
if (ImGui::TreeNode("node 2 (without borders)"))
|
8693
|
8794
|
{
|
8694
|
8795
|
ImGui::Columns(4, NULL, false);
|
8695
|
|
- ImGui::Text("aaa"); ImGui::NextColumn();
|
8696
|
|
- ImGui::Text("bbb"); ImGui::NextColumn();
|
8697
|
|
- ImGui::Text("ccc"); ImGui::NextColumn();
|
8698
|
|
- ImGui::Text("ddd"); ImGui::NextColumn();
|
8699
|
|
- ImGui::Text("eee"); ImGui::NextColumn();
|
8700
|
|
- ImGui::Text("fff"); ImGui::NextColumn();
|
8701
|
|
- ImGui::Text("ggg"); ImGui::NextColumn();
|
8702
|
|
- ImGui::Text("hhh"); ImGui::NextColumn();
|
|
8796
|
+ for (int i = 0; i < 8; i++)
|
|
8797
|
+ {
|
|
8798
|
+ ImGui::Text("%c%c%c", 'a'+i, 'a'+i, 'a'+i);
|
|
8799
|
+ ImGui::NextColumn();
|
|
8800
|
+ }
|
8703
|
8801
|
ImGui::Columns(1);
|
8704
|
8802
|
ImGui::TreePop();
|
8705
|
8803
|
}
|
|
@@ -8764,6 +8862,7 @@ void ImGui::ShowTestWindow(bool* opened)
|
8764
|
8862
|
ImGui::Text("Item with focus: %d", has_focus);
|
8765
|
8863
|
else
|
8766
|
8864
|
ImGui::Text("Item with focus: <none>");
|
|
8865
|
+ ImGui::TextWrapped("Cursor & selection are preserved when refocusing last used item in code.");
|
8767
|
8866
|
ImGui::TreePop();
|
8768
|
8867
|
}
|
8769
|
8868
|
}
|