1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include "game.hpp"
#include "imgui.h"
GameSettings pkeSettings{};
const uint64_t consoleBufferCount = 30;
const uint64_t consoleLineLength = 128;
char consoleBuffer[consoleBufferCount][consoleLineLength];
long consoleBufferIndex = 0;
void Game_Tick(double delta) {
/*
* ECS_Tick() gets called first because it updates the public
* `EntitiesToBeRemoved` for all other ticks to use.
*/
ECS_Tick(delta);
}
void RecordImGuiConsole(bool *pOpen) {
static bool scrollToBottom = true;
if (!ImGui::Begin("Console", pOpen)) {
ImGui::End();
return;
}
ImVec2 region = ImGui::GetContentRegionAvail();
region.y -= 27;
if (ImGui::BeginListBox("##ConsoleHistory", region)) {
for (long i = consoleBufferIndex + 1; i < consoleBufferCount; ++i) {
ImGui::Text("%s", consoleBuffer[i]);
}
for (long i = 0; i < consoleBufferIndex; ++i) {
ImGui::Text("%s", consoleBuffer[i]);
}
if (scrollToBottom) ImGui::SetScrollHereY(1);
scrollToBottom = false;
ImGui::EndListBox();
}
ImGui::Separator();
if (ImGui::InputText("##ConsoleInput", consoleBuffer[consoleBufferIndex], consoleLineLength, ImGuiInputTextFlags_EnterReturnsTrue)) {
// TODO parse and execute.
scrollToBottom = true;
consoleBufferIndex = (consoleBufferIndex + 1) % consoleBufferCount;
memset(consoleBuffer[consoleBufferIndex], '\0', consoleLineLength);
}
auto flags = (ImGuiFocusedFlags_ChildWindows);
if (ImGui::IsWindowFocused(flags) && !ImGui::IsAnyItemFocused() && !ImGui::IsMouseClicked(ImGuiMouseButton_Left) && !ImGui::IsMouseClicked(ImGuiMouseButton_Left, true)) {
ImGui::SetKeyboardFocusHere(-1);
}
ImGui::End();
}
void RecordImGuiEditor() {
RecordImGuiConsole(&pkeSettings.isShowingEditor);
}
void Game_Init() {
for (long i = 0; i < consoleBufferCount; ++i) {
memset(consoleBuffer[i], '\0', consoleLineLength);
}
Event_RegisterCallback("RenderImGui", RecordImGuiEditor);
}
|