Console class is now a proper object oriented class.

This commit is contained in:
Kenix3 2022-08-09 23:50:21 -04:00
parent 81cd594704
commit 23fb885e09
5 changed files with 136 additions and 86 deletions

View File

@ -16,7 +16,7 @@ namespace Ship {
return usage; return usage;
} }
static bool HelpCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args) { bool Console::HelpCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args) {
SohImGui::console->SendInfoMessage("SoH Commands:"); SohImGui::console->SendInfoMessage("SoH Commands:");
for (const auto& cmd : SohImGui::console->Commands) { for (const auto& cmd : SohImGui::console->Commands) {
SohImGui::console->SendInfoMessage(" - " + cmd.first); SohImGui::console->SendInfoMessage(" - " + cmd.first);
@ -24,12 +24,12 @@ namespace Ship {
return CMD_SUCCESS; return CMD_SUCCESS;
} }
static bool ClearCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args) { bool Console::ClearCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args) {
SohImGui::console->Log[SohImGui::console->selected_channel].clear(); Console->ClearLogs(Console->GetCurrentChannel());
return CMD_SUCCESS; return CMD_SUCCESS;
} }
static bool BindCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args) { bool Console::BindCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args) {
if (args.size() > 2) { if (args.size() > 2) {
const ImGuiIO* io = &ImGui::GetIO();; const ImGuiIO* io = &ImGui::GetIO();;
for (size_t k = 0; k < std::size(io->KeysData); k++) { for (size_t k = 0; k < std::size(io->KeysData); k++) {
@ -49,7 +49,7 @@ namespace Ship {
return CMD_SUCCESS; return CMD_SUCCESS;
} }
static bool BindToggleCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args) { bool Console::BindToggleCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args) {
if (args.size() > 2) { if (args.size() > 2) {
const ImGuiIO* io = &ImGui::GetIO();; const ImGuiIO* io = &ImGui::GetIO();;
for (size_t k = 0; k < std::size(io->KeysData); k++) { for (size_t k = 0; k < std::size(io->KeysData); k++) {
@ -66,14 +66,14 @@ namespace Ship {
} }
void Console::Init() { void Console::Init() {
this->InputBuffer = new char[MAX_BUFFER_SIZE]; this->inputBuffer = new char[MAX_BUFFER_SIZE];
strcpy(this->InputBuffer, ""); strcpy(this->inputBuffer, "");
this->FilterBuffer = new char[MAX_BUFFER_SIZE]; this->filterBuffer = new char[MAX_BUFFER_SIZE];
strcpy(this->FilterBuffer, ""); strcpy(this->filterBuffer, "");
this->Commands["help"] = { HelpCommand, "Shows all the commands" }; AddCommand("help", { HelpCommand, "Shows all the commands" });
this->Commands["clear"] = { ClearCommand, "Clear the console history" }; AddCommand("help", { ClearCommand, "Clear the console history" });
this->Commands["bind"] = { BindCommand, "Binds key to commands" }; AddCommand("help", { BindCommand, "Binds key to commands" });
this->Commands["bind-toggle"] = { BindToggleCommand, "Bind key as a bool toggle" }; AddCommand("help", { BindToggleCommand, "Bind key as a bool toggle" });
} }
void Console::Update() { void Console::Update() {
@ -103,7 +103,7 @@ namespace Ship {
// SohImGui::ShowCursor(ImGui::IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows | ImGuiHoveredFlags_RectOnly), SohImGui::Dialogues::dConsole); // SohImGui::ShowCursor(ImGui::IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows | ImGuiHoveredFlags_RectOnly), SohImGui::Dialogues::dConsole);
// Renders autocomplete window // Renders autocomplete window
if (this->OpenAutocomplete) { if (this->openAutocomplete) {
ImGui::SetNextWindowSize(ImVec2(350, std::min(static_cast<int>(this->Autocomplete.size()), 3) * 20.f), ImGuiCond_Once); ImGui::SetNextWindowSize(ImVec2(350, std::min(static_cast<int>(this->Autocomplete.size()), 3) * 20.f), ImGuiCond_Once);
ImGui::SetNextWindowPos(ImVec2(pos.x + 8, pos.y + size.y - 1)); ImGui::SetNextWindowPos(ImVec2(pos.x + 8, pos.y + size.y - 1));
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(3, 3)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(3, 3));
@ -118,16 +118,16 @@ namespace Ship {
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0); ImGui::TableSetColumnIndex(0);
if (ImGui::Selectable(preview.c_str())) { if (ImGui::Selectable(preview.c_str())) {
memset(this->InputBuffer, 0, MAX_BUFFER_SIZE); memset(this->inputBuffer, 0, MAX_BUFFER_SIZE);
memcpy(this->InputBuffer, autocomplete.c_str(), sizeof(char) * autocomplete.size()); memcpy(this->inputBuffer, autocomplete.c_str(), sizeof(char) * autocomplete.size());
this->OpenAutocomplete = false; this->openAutocomplete = false;
input_focus = true; input_focus = true;
} }
} }
ImGui::EndTable(); ImGui::EndTable();
} }
if (ImGui::IsKeyPressed(ImGuiKey_Escape)) { if (ImGui::IsKeyPressed(ImGuiKey_Escape)) {
this->OpenAutocomplete = false; this->openAutocomplete = false;
} }
ImGui::PopStyleColor(); ImGui::PopStyleColor();
ImGui::EndChild(); ImGui::EndChild();
@ -137,7 +137,7 @@ namespace Ship {
if (ImGui::BeginPopupContextWindow("Context Menu")) { if (ImGui::BeginPopupContextWindow("Context Menu")) {
if (ImGui::MenuItem("Copy Text")) { if (ImGui::MenuItem("Copy Text")) {
ImGui::SetClipboardText(this->Log[this->selected_channel][this->selectedId].text.c_str()); ImGui::SetClipboardText(this->Log[this->currentChannel][this->selectedId].text.c_str());
this->selectedId = -1; this->selectedId = -1;
} }
ImGui::EndPopup(); ImGui::EndPopup();
@ -147,44 +147,44 @@ namespace Ship {
} }
// Renders top bar filters // Renders top bar filters
if (ImGui::Button("Clear")) this->Log[this->selected_channel].clear(); if (ImGui::Button("Clear")) this->Log[this->currentChannel].clear();
if (CVar_GetS32("gSinkEnabled", 0)) { if (CVar_GetS32("gSinkEnabled", 0)) {
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetNextItemWidth(150); ImGui::SetNextItemWidth(150);
if (ImGui::BeginCombo("##channel", this->selected_channel.c_str())) { if (ImGui::BeginCombo("##channel", this->currentChannel.c_str())) {
for (const auto& channel : log_channels) { for (const auto& channel : LogChannels) {
const bool is_selected = (channel == std::string(this->selected_channel)); const bool is_selected = (channel == std::string(this->currentChannel));
if (ImGui::Selectable(channel.c_str(), is_selected)) if (ImGui::Selectable(channel.c_str(), is_selected))
this->selected_channel = channel; this->currentChannel = channel;
if (is_selected) ImGui::SetItemDefaultFocus(); if (is_selected) ImGui::SetItemDefaultFocus();
} }
ImGui::EndCombo(); ImGui::EndCombo();
} }
} else { } else {
this->selected_channel = "Console"; this->currentChannel = "Console";
} }
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetNextItemWidth(150); ImGui::SetNextItemWidth(150);
if (this->selected_channel != "Console") { if (this->currentChannel != "Console") {
if (ImGui::BeginCombo("##level", spdlog::level::to_string_view(this->level_filter).data())) { if (ImGui::BeginCombo("##level", spdlog::level::to_string_view(this->levelFilter).data())) {
for (const auto& priority_filter : priority_filters) { for (const auto& priority_filter : PriorityFilters) {
const bool is_selected = priority_filter == this->level_filter; const bool is_selected = priority_filter == this->levelFilter;
if (ImGui::Selectable(spdlog::level::to_string_view(priority_filter).data(), is_selected)) if (ImGui::Selectable(spdlog::level::to_string_view(priority_filter).data(), is_selected))
{ {
this->level_filter = priority_filter; this->levelFilter = priority_filter;
if (is_selected) ImGui::SetItemDefaultFocus(); if (is_selected) ImGui::SetItemDefaultFocus();
} }
} }
ImGui::EndCombo(); ImGui::EndCombo();
} }
} else { } else {
this->level_filter = spdlog::level::trace; this->levelFilter = spdlog::level::trace;
} }
ImGui::SameLine(); ImGui::SameLine();
ImGui::PushItemWidth(-1); ImGui::PushItemWidth(-1);
if (ImGui::InputTextWithHint("##input", "Filter", this->FilterBuffer, MAX_BUFFER_SIZE))this->filter = std::string(this->FilterBuffer); if (ImGui::InputTextWithHint("##input", "Filter", this->filterBuffer, MAX_BUFFER_SIZE))this->filter = std::string(this->filterBuffer);
ImGui::PopItemWidth(); ImGui::PopItemWidth();
// Renders console history // Renders console history
@ -198,16 +198,16 @@ namespace Ship {
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_UpArrow))) if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_UpArrow)))
if (this->selectedId > 0)--this->selectedId; if (this->selectedId > 0)--this->selectedId;
const std::vector<ConsoleLine> channel = this->Log[this->selected_channel]; const std::vector<ConsoleLine> channel = this->Log[this->currentChannel];
for (int i = 0; i < static_cast<int>(channel.size()); i++) { for (int i = 0; i < static_cast<int>(channel.size()); i++) {
ConsoleLine line = channel[i]; ConsoleLine line = channel[i];
if (!this->filter.empty() && line.text.find(this->filter) == std::string::npos) continue; if (!this->filter.empty() && line.text.find(this->filter) == std::string::npos) continue;
if (this->level_filter > line.priority) continue; if (this->levelFilter > line.priority) continue;
std::string id = line.text + "##" + std::to_string(i); std::string id = line.text + "##" + std::to_string(i);
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0); ImGui::TableSetColumnIndex(0);
const bool is_selected = (this->selectedId == i) || std::find(this->selectedEntries.begin(), this->selectedEntries.end(), i) != this->selectedEntries.end(); const bool is_selected = (this->selectedId == i) || std::find(this->selectedEntries.begin(), this->selectedEntries.end(), i) != this->selectedEntries.end();
ImGui::PushStyleColor(ImGuiCol_Text, this->priority_colors[line.priority]); ImGui::PushStyleColor(ImGuiCol_Text, this->PriorityColours[line.priority]);
if (ImGui::Selectable(id.c_str(), is_selected)) { if (ImGui::Selectable(id.c_str(), is_selected)) {
if (ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_LeftCtrl)) && !is_selected) if (ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_LeftCtrl)) && !is_selected)
this->selectedEntries.push_back(i); this->selectedEntries.push_back(i);
@ -225,25 +225,25 @@ namespace Ship {
ImGui::SetScrollHereY(1.0f); ImGui::SetScrollHereY(1.0f);
ImGui::EndChild(); ImGui::EndChild();
if (this->selected_channel == "Console") { if (this->currentChannel == "Console") {
// Renders input textfield // Renders input textfield
constexpr ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackEdit | constexpr ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackEdit |
ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory; ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory;
ImGui::PushItemWidth(-53); ImGui::PushItemWidth(-53);
if (ImGui::InputTextWithHint("##CMDInput", ">", this->InputBuffer, MAX_BUFFER_SIZE, flags, &Console::CallbackStub, this)) { if (ImGui::InputTextWithHint("##CMDInput", ">", this->inputBuffer, MAX_BUFFER_SIZE, flags, &Console::CallbackStub, this)) {
input_focus = true; input_focus = true;
if (this->InputBuffer[0] != '\0' && this->InputBuffer[0] != ' ') if (this->inputBuffer[0] != '\0' && this->inputBuffer[0] != ' ')
this->Dispatch(std::string(this->InputBuffer)); this->Dispatch(std::string(this->inputBuffer));
memset(this->InputBuffer, 0, MAX_BUFFER_SIZE); memset(this->inputBuffer, 0, MAX_BUFFER_SIZE);
} }
if (this->CMDHint != NULLSTR) { if (this->cmdHint != NULLSTR) {
if (ImGui::IsItemFocused()) { if (ImGui::IsItemFocused()) {
ImGui::SetNextWindowPos(ImVec2(pos.x, pos.y + size.y)); ImGui::SetNextWindowPos(ImVec2(pos.x, pos.y + size.y));
ImGui::SameLine(); ImGui::SameLine();
ImGui::BeginTooltip(); ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
ImGui::TextUnformatted(this->CMDHint.c_str()); ImGui::TextUnformatted(this->cmdHint.c_str());
ImGui::PopTextWrapPos(); ImGui::PopTextWrapPos();
ImGui::EndTooltip(); ImGui::EndTooltip();
} }
@ -251,9 +251,9 @@ namespace Ship {
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x - 50); ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x - 50);
if (ImGui::Button("Submit") && !input_focus && this->InputBuffer[0] != '\0' && this->InputBuffer[0] != ' ') { if (ImGui::Button("Submit") && !input_focus && this->inputBuffer[0] != '\0' && this->inputBuffer[0] != ' ') {
this->Dispatch(std::string(this->InputBuffer)); this->Dispatch(std::string(this->inputBuffer));
memset(this->InputBuffer, 0, MAX_BUFFER_SIZE); memset(this->inputBuffer, 0, MAX_BUFFER_SIZE);
} }
ImGui::SetItemDefaultFocus(); ImGui::SetItemDefaultFocus();
@ -264,7 +264,7 @@ namespace Ship {
} }
void Console::Dispatch(const std::string& line) { void Console::Dispatch(const std::string& line) {
this->CMDHint = NULLSTR; this->cmdHint = NULLSTR;
this->History.push_back(line); this->History.push_back(line);
SendInfoMessage("> " + line); SendInfoMessage("> " + line);
const std::vector<std::string> cmd_args = StringHelper::Split(line, " "); const std::vector<std::string> cmd_args = StringHelper::Split(line, " ");
@ -282,7 +282,7 @@ namespace Ship {
int Console::CallbackStub(ImGuiInputTextCallbackData* data) { int Console::CallbackStub(ImGuiInputTextCallbackData* data) {
const auto instance = static_cast<Console*>(data->UserData); const auto instance = static_cast<Console*>(data->UserData);
const bool empty_history = instance->History.empty(); const bool empty_history = instance->History.empty();
const int history_index = instance->HistoryIndex; const int history_index = instance->historyIndex;
std::string history; std::string history;
switch (data->EventKey) { switch (data->EventKey) {
@ -290,39 +290,39 @@ namespace Ship {
instance->Autocomplete.clear(); instance->Autocomplete.clear();
for (auto& [cmd, entry] : instance->Commands) for (auto& [cmd, entry] : instance->Commands)
if (cmd.find(std::string(data->Buf)) != std::string::npos) instance->Autocomplete.push_back(cmd); if (cmd.find(std::string(data->Buf)) != std::string::npos) instance->Autocomplete.push_back(cmd);
instance->OpenAutocomplete = !instance->Autocomplete.empty(); instance->openAutocomplete = !instance->Autocomplete.empty();
instance->CMDHint = NULLSTR; instance->cmdHint = NULLSTR;
break; break;
case ImGuiKey_UpArrow: case ImGuiKey_UpArrow:
if (empty_history) break; if (empty_history) break;
if (history_index < static_cast<int>(instance->History.size()) - 1) instance->HistoryIndex += 1; if (history_index < static_cast<int>(instance->History.size()) - 1) instance->historyIndex += 1;
data->DeleteChars(0, data->BufTextLen); data->DeleteChars(0, data->BufTextLen);
data->InsertChars(0, instance->History[instance->HistoryIndex].c_str()); data->InsertChars(0, instance->History[instance->historyIndex].c_str());
instance->CMDHint = NULLSTR; instance->cmdHint = NULLSTR;
break; break;
case ImGuiKey_DownArrow: case ImGuiKey_DownArrow:
if (empty_history) break; if (empty_history) break;
if (history_index > -1) instance->HistoryIndex -= 1; if (history_index > -1) instance->historyIndex -= 1;
data->DeleteChars(0, data->BufTextLen); data->DeleteChars(0, data->BufTextLen);
if (history_index >= 0) if (history_index >= 0)
data->InsertChars(0, instance->History[history_index].c_str()); data->InsertChars(0, instance->History[history_index].c_str());
instance->CMDHint = NULLSTR; instance->cmdHint = NULLSTR;
break; break;
case ImGuiKey_Escape: case ImGuiKey_Escape:
instance->HistoryIndex = -1; instance->historyIndex = -1;
data->DeleteChars(0, data->BufTextLen); data->DeleteChars(0, data->BufTextLen);
instance->OpenAutocomplete = false; instance->openAutocomplete = false;
instance->CMDHint = NULLSTR; instance->cmdHint = NULLSTR;
break; break;
default: default:
instance->OpenAutocomplete = false; instance->openAutocomplete = false;
for (auto& [cmd, entry] : instance->Commands) { for (auto& [cmd, entry] : instance->Commands) {
const std::vector<std::string> cmd_args = StringHelper::Split(std::string(data->Buf), " "); const std::vector<std::string> cmd_args = StringHelper::Split(std::string(data->Buf), " ");
if (data->BufTextLen > 2 && !cmd_args.empty() && cmd.find(cmd_args[0]) != std::string::npos) { if (data->BufTextLen > 2 && !cmd_args.empty() && cmd.find(cmd_args[0]) != std::string::npos) {
instance->CMDHint = cmd + " " + BuildUsage(entry); instance->cmdHint = cmd + " " + BuildUsage(entry);
break; break;
} }
instance->CMDHint = NULLSTR; instance->cmdHint = NULLSTR;
} }
} }
return 0; return 0;
@ -363,4 +363,30 @@ namespace Ship {
void Console::SendErrorMessage(const std::string& str) { void Console::SendErrorMessage(const std::string& str) {
Append("Console", spdlog::level::err, str.c_str()); Append("Console", spdlog::level::err, str.c_str());
} }
void Console::ClearLogs(std::string channel) {
Log[channel].clear();
}
void Console::ClearLogs() {
for (auto [key, var] : Log) {
var.clear();
}
}
bool Console::HasCommand(const std::string& command) {
for (const auto& Command : Commands) {
if (Command.first == command) {
return true;
}
}
return false;
}
void Console::AddCommand(const std::string& command, CommandEntry entry) {
if (!HasCommand(command)) {
Commands[command] = entry;
}
}
} }

View File

@ -43,13 +43,33 @@ namespace Ship {
class Console : public std::enable_shared_from_this<Console> { class Console : public std::enable_shared_from_this<Console> {
private: private:
static int CallbackStub(ImGuiInputTextCallbackData* data);
static bool ClearCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args);
static bool HelpCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args);
static bool BindCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args);
static bool BindToggleCommand(std::shared_ptr<Console> Console, const std::vector<std::string>& args);
bool opened = false;
int selectedId = -1; int selectedId = -1;
int historyIndex = -1;
std::vector<int> selectedEntries; std::vector<int> selectedEntries;
std::string filter; std::string filter;
spdlog::level::level_enum level_filter = spdlog::level::trace; std::string currentChannel = "Console";
const std::vector<std::string> log_channels = { "Console", "Logs" }; bool openAutocomplete = false;
const std::vector<spdlog::level::level_enum> priority_filters = { spdlog::level::off, spdlog::level::critical, spdlog::level::err, spdlog::level::warn, spdlog::level::info, spdlog::level::debug, spdlog::level::trace }; char* inputBuffer = nullptr;
const std::vector<ImVec4> priority_colors = { char* filterBuffer = nullptr;
std::string cmdHint = NULLSTR;
spdlog::level::level_enum levelFilter = spdlog::level::trace;
std::vector<std::string> History;
std::vector<std::string> Autocomplete;
std::map<ImGuiKey, std::string> Bindings;
std::map<ImGuiKey, std::string> BindingToggle;
std::map<std::string, CommandEntry> Commands;
std::map<std::string, std::vector<ConsoleLine>> Log;
const std::vector<std::string> LogChannels = { "Console", "Logs" };
const std::vector<spdlog::level::level_enum> PriorityFilters = { spdlog::level::off, spdlog::level::critical, spdlog::level::err, spdlog::level::warn, spdlog::level::info, spdlog::level::debug, spdlog::level::trace };
const std::vector<ImVec4> PriorityColours = {
ImVec4(0.8f, 0.8f, 0.8f, 1.0f), // TRACE ImVec4(0.8f, 0.8f, 0.8f, 1.0f), // TRACE
ImVec4(0.9f, 0.9f, 0.9f, 1.0f), // DEBUG ImVec4(0.9f, 0.9f, 0.9f, 1.0f), // DEBUG
ImVec4(1.0f, 1.0f, 1.0f, 1.0f), // INFO ImVec4(1.0f, 1.0f, 1.0f, 1.0f), // INFO
@ -62,28 +82,23 @@ namespace Ship {
void Append(const std::string& channel, spdlog::level::level_enum priority, const char* fmt, va_list args); void Append(const std::string& channel, spdlog::level::level_enum priority, const char* fmt, va_list args);
public: public:
std::map<ImGuiKey, std::string> Bindings; void ClearLogs(std::string channel);
std::map<ImGuiKey, std::string> BindingToggle; void ClearLogs();
std::map<std::string, std::vector<ConsoleLine>> Log;
std::map<std::string, CommandEntry> Commands;
std::vector<std::string> Autocomplete;
std::vector<std::string> History;
std::string CMDHint = NULLSTR;
char* FilterBuffer = nullptr;
char* InputBuffer = nullptr;
bool OpenAutocomplete = false;
int HistoryIndex = -1;
bool opened = false;
std::string selected_channel = "Console";
void Init(); void Init();
void Update(); void Update();
void Draw(); void Draw();
void Dispatch(const std::string& line); void Dispatch(const std::string& line);
static int CallbackStub(ImGuiInputTextCallbackData* data);
void SendInfoMessage(const char* fmt, ...); void SendInfoMessage(const char* fmt, ...);
void SendErrorMessage(const char* fmt, ...); void SendErrorMessage(const char* fmt, ...);
void SendInfoMessage(const std::string& str); void SendInfoMessage(const std::string& str);
void SendErrorMessage(const std::string& str); void SendErrorMessage(const std::string& str);
void Append(const std::string& channel, spdlog::level::level_enum priority, const char* fmt, ...); void Append(const std::string& channel, spdlog::level::level_enum priority, const char* fmt, ...);
bool HasCommand(const std::string& command);
void AddCommand(const std::string& command, CommandEntry entry);
std::string GetCurrentChannel() { return currentChannel; }
bool IsOpened() { return opened; }
void Close() { opened = false; }
void Open() { opened = true; }
}; };
} }

View File

@ -156,7 +156,8 @@ namespace Ship {
this->CurrentFont = DefaultFont; this->CurrentFont = DefaultFont;
} }
} }
SohImGui::console->Commands["overlay"] = { OverlayCommand, "Draw an overlay using a cvar value" };
SohImGui::console->AddCommand("overlay", { OverlayCommand, "Draw an overlay using a cvar value" });
} }
void GameOverlay::DrawSettings() { void GameOverlay::DrawSettings() {

View File

@ -141,7 +141,11 @@ namespace SohImGui {
Ship::RegisterHook<Ship::AudioInit>(UpdateAudio); Ship::RegisterHook<Ship::AudioInit>(UpdateAudio);
Ship::RegisterHook<Ship::GfxInit>([] { Ship::RegisterHook<Ship::GfxInit>([] {
gfx_get_current_rendering_api()->set_texture_filter((FilteringMode)CVar_GetS32("gTextureFilter", FILTER_THREE_POINT)); gfx_get_current_rendering_api()->set_texture_filter((FilteringMode)CVar_GetS32("gTextureFilter", FILTER_THREE_POINT));
SohImGui::console->opened = CVar_GetS32("gConsoleEnabled", 0); if (CVar_GetS32("gConsoleEnabled", 0)) {
console->Open();
} else {
console->Close();
}
SohImGui::controller->Opened = CVar_GetS32("gControllerConfigurationEnabled", 0); SohImGui::controller->Opened = CVar_GetS32("gControllerConfigurationEnabled", 0);
UpdateAudio(); UpdateAudio();
}); });
@ -863,7 +867,7 @@ namespace SohImGui {
if ((ImGui::IsKeyDown(ImGuiKey_LeftCtrl) || if ((ImGui::IsKeyDown(ImGuiKey_LeftCtrl) ||
ImGui::IsKeyDown(ImGuiKey_RightCtrl)) && ImGui::IsKeyDown(ImGuiKey_RightCtrl)) &&
ImGui::IsKeyPressed(ImGuiKey_R, false)) { ImGui::IsKeyPressed(ImGuiKey_R, false)) {
console->Commands["reset"].handler(console, emptyArgs); console->Dispatch("reset");
} }
#endif #endif
@ -891,7 +895,7 @@ namespace SohImGui {
"Ctrl+R" "Ctrl+R"
#endif #endif
)) { )) {
console->Commands["reset"].handler(console, emptyArgs); console->Dispatch("reset");
} }
ImGui::EndMenu(); ImGui::EndMenu();
} }
@ -1638,7 +1642,7 @@ namespace SohImGui {
CVar_SetS32("gEnableBetaQuest", betaQuestEnabled); CVar_SetS32("gEnableBetaQuest", betaQuestEnabled);
CVar_SetS32("gBetaQuestWorld", betaQuestWorld); CVar_SetS32("gBetaQuestWorld", betaQuestWorld);
console->Commands["reset"].handler(console, emptyArgs); console->Dispatch("reset");
needs_save = true; needs_save = true;
} }
@ -1695,7 +1699,11 @@ namespace SohImGui {
bool currentValue = CVar_GetS32("gConsoleEnabled", 0); bool currentValue = CVar_GetS32("gConsoleEnabled", 0);
CVar_SetS32("gConsoleEnabled", !currentValue); CVar_SetS32("gConsoleEnabled", !currentValue);
needs_save = true; needs_save = true;
console->opened = CVar_GetS32("gConsoleEnabled", 0); if(CVar_GetS32("gConsoleEnabled", 0)){
console->Open();
} else {
console->Close();
}
} }
Tooltip("Enables the console window, allowing you to input commands, type help for some examples"); Tooltip("Enables the console window, allowing you to input commands, type help for some examples");
InsertPadding(); InsertPadding();
@ -2240,7 +2248,7 @@ namespace SohImGui {
} }
void BindCmd(const std::string& cmd, CommandEntry entry) { void BindCmd(const std::string& cmd, CommandEntry entry) {
console->Commands[cmd] = std::move(entry); console->AddCommand(cmd, entry);
} }
void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc, bool isEnabled, bool isHidden) { void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc, bool isEnabled, bool isHidden) {

View File

@ -41,7 +41,7 @@ protected:
} }
formatted.push_back('\0'); formatted.push_back('\0');
const char* msg_output = formatted.data(); const char* msg_output = formatted.data();
if (CVar_GetS32("gSinkEnabled", 0) && SohImGui::console->opened) { if (CVar_GetS32("gSinkEnabled", 0) && SohImGui::console->IsOpened()) {
SohImGui::console->Append("Logs", msg.level, "%s", msg_output); SohImGui::console->Append("Logs", msg.level, "%s", msg_output);
} }
} }