#include "ConsolePanel.h" #include "Core/EditorConsoleSink.h" #include #include namespace XCEngine { namespace Editor { ConsolePanel::ConsolePanel() : Panel("Console") { } void ConsolePanel::Render() { ImGui::Begin(m_name.c_str(), nullptr, ImGuiWindowFlags_None); if (ImGui::Button("Clear")) { Debug::EditorConsoleSink::GetInstance()->Clear(); } ImGui::SameLine(); ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 1.0f), "Filter:"); ImGui::SameLine(); ImGui::Separator(); ImGui::SameLine(); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 4.0f); ImGui::PushStyleColor(ImGuiCol_Button, m_showInfo ? ImVec4(0.2f, 0.6f, 0.2f, 1.0f) : ImVec4(0.3f, 0.3f, 0.3f, 1.0f)); if (ImGui::Button("Info")) { m_showInfo = !m_showInfo; } ImGui::PopStyleColor(); ImGui::SameLine(); ImGui::PushStyleColor(ImGuiCol_Button, m_showWarning ? ImVec4(0.8f, 0.6f, 0.0f, 1.0f) : ImVec4(0.3f, 0.3f, 0.3f, 1.0f)); if (ImGui::Button("Warn")) { m_showWarning = !m_showWarning; } ImGui::PopStyleColor(); ImGui::SameLine(); ImGui::PushStyleColor(ImGuiCol_Button, m_showError ? ImVec4(0.8f, 0.2f, 0.2f, 1.0f) : ImVec4(0.3f, 0.3f, 0.3f, 1.0f)); if (ImGui::Button("Error")) { m_showError = !m_showError; } ImGui::PopStyleColor(); ImGui::PopStyleVar(); ImGui::Separator(); ImGui::BeginChild("LogScroll", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar); const auto& logs = Debug::EditorConsoleSink::GetInstance()->GetLogs(); size_t logIndex = 0; for (const auto& log : logs) { bool shouldShow = false; switch (log.level) { case ::XCEngine::Debug::LogLevel::Info: case ::XCEngine::Debug::LogLevel::Verbose: case ::XCEngine::Debug::LogLevel::Debug: shouldShow = m_showInfo; break; case ::XCEngine::Debug::LogLevel::Warning: shouldShow = m_showWarning; break; case ::XCEngine::Debug::LogLevel::Error: case ::XCEngine::Debug::LogLevel::Fatal: shouldShow = m_showError; break; } if (!shouldShow) { continue; } ImVec4 color; const char* prefix; switch (log.level) { case ::XCEngine::Debug::LogLevel::Verbose: case ::XCEngine::Debug::LogLevel::Debug: case ::XCEngine::Debug::LogLevel::Info: color = ImVec4(0.5f, 0.5f, 0.5f, 1.0f); prefix = "[INFO] "; break; case ::XCEngine::Debug::LogLevel::Warning: color = ImVec4(1.0f, 0.8f, 0.0f, 1.0f); prefix = "[WARN] "; break; case ::XCEngine::Debug::LogLevel::Error: case ::XCEngine::Debug::LogLevel::Fatal: color = ImVec4(1.0f, 0.3f, 0.3f, 1.0f); prefix = "[ERROR]"; break; } ImGui::PushID(static_cast(logIndex)); ImGui::TextColored(ImVec4(0.4f, 0.4f, 0.4f, 1.0f), "%s", log.message.CStr()); ImGui::SameLine(); std::string fullMessage = std::string(prefix) + log.message.CStr(); ImGui::TextColored(color, "%s", fullMessage.c_str()); if (ImGui::IsItemClicked()) { ImGui::SetClipboardText(fullMessage.c_str()); } ImGui::PopID(); logIndex++; } ImGui::EndChild(); ImGui::End(); } } }