void Pyx::Graphics::Gui::ImGuiImpl::BuildLogsWindow() { static bool logVisible = true; if (GImGui) { ImGuiState& g = *GImGui; ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 1)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.95f); if (ImGui::Begin(XorStringA("##pyx_console_logs"), &logVisible, ImVec2(ImGui::GetIO().DisplaySize.x, 155), -1, ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_ShowBorders | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings)) { ImGui::SetWindowPos(ImVec2(0, g.FontBaseSize + g.Style.FramePadding.y * 2.0f)); ImGui::SetWindowSize(ImVec2(ImGui::GetIO().DisplaySize.x, ImGui::GetWindowHeight())); for (std::string& item : m_logsItems) { ImVec4 col = ImColor(255, 255, 255); ImGui::PushStyleColor(ImGuiCol_Text, col); ImGui::TextUnformatted(item.c_str()); ImGui::PopStyleColor(); } if (m_logScrollToEnd) ImGui::SetScrollHere(); m_logScrollToEnd = false; } ImGui::End(); ImGui::PopStyleVar(3); } }
void Pyx::Graphics::GraphicsContext::SetMainRenderer(Renderer::IRenderer* pRenderer) { PYX_ASSERT_A(pRenderer != nullptr); m_pMainRenderer = pRenderer; PyxContext::GetInstance().Log(XorStringA("[Graphics] Using renderer : ") + std::string(pRenderer->GetRendererTypeString())); auto pGui = GuiContext::GetInstance().GetGui(); if (pGui) pGui->ToggleVisibility(true); }
void Pyx::Graphics::Gui::ImGuiImpl::BuildDebugWindow() { if (GImGui) { ImGuiState& g = *GImGui; if (ImGui::Begin(XorStringA("Pyx - Debug##pyx_debug_window"), &m_showDebugWindow)) { auto& io = ImGui::GetIO(); ImGui::Text(XorStringA("Performance : %.3f ms/frame (%.1f FPS)"), 1000.0f / io.Framerate, io.Framerate); ImGui::Text(XorStringA("Renderer : %s"), GraphicsContext::GetInstance().GetMainRenderer()->GetRendererTypeString()); ImGui::Text(XorStringA("Cursor visible : %d"), Input::InputContext::GetInstance().CursorIsVisible()); ImGui::Text(XorStringA("Cursor position : %.0f, %.0f"), io.MousePos.x, io.MousePos.y); ImGui::Text(XorStringA("WantCaptureMouse : %d"), io.WantCaptureMouse); ImGui::Text(XorStringA("WantCaptureKeyboard : %d"), io.WantCaptureKeyboard); ImGui::Text(XorStringA("WantTextInput : %d"), io.WantTextInput); ImGui::Text(XorStringA("HoveredWindow : %s"), g.HoveredWindow ? g.HoveredWindow->Name : XorStringA("<null>")); } ImGui::End(); } }
void Pyx::Scripting::ScriptingContext::ReloadScripts() { PyxContext::GetInstance().Log(XorStringA("[Scripting] Reloading scripts ...")); const auto& pyxSettings = PyxContext::GetInstance().GetSettings(); for (auto* pScript : m_scripts) { if (pScript->IsRunning()) pScript->Stop(); delete pScript; } m_scripts.clear(); WIN32_FIND_DATA ffd; HANDLE hFind = INVALID_HANDLE_VALUE; DWORD dwError = 0; hFind = FindFirstFileW(std::wstring(pyxSettings.RootDirectory + pyxSettings.ScriptsDirectory + L"\\*").c_str(), &ffd); if (INVALID_HANDLE_VALUE == hFind) return; do { if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { auto fileName = pyxSettings.RootDirectory + pyxSettings.ScriptsDirectory + L"\\" + std::wstring(ffd.cFileName) + L"\\script.def"; auto scriptName = std::wstring(ffd.cFileName); DWORD dwAttrib = GetFileAttributesW(fileName.c_str()); if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) { ScriptDef scriptDef(fileName); if (scriptDef.IsScript()) { PyxContext::GetInstance().Log(XorStringW(L"[Scripting] Found script \"%s\""), scriptDef.GetName().c_str()); m_scripts.push_back(new Script(scriptDef.GetName(), fileName)); } } } } while (FindNextFileW(hFind, &ffd) != 0); sort(m_scripts.begin(), m_scripts.end(), [](Script* a, Script* b) { return a->GetName().compare(b->GetName()) < 0; }); }
void Pyx::Graphics::Gui::ImGuiImpl::BuildMainMenuBar() { ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.95f); if (ImGui::BeginMainMenuBar()) { if (ImGui::BeginMenu((std::string(ICON_MD_HOME) + XorStringA(" Pyx")).c_str())) { ImGui::MenuItem((std::string(ICON_MD_FORMAT_LIST_BULLETED) + XorStringA(" Show console")).c_str(), nullptr, &m_showConsole); ImGui::MenuItem((std::string(ICON_MD_BUILD) + XorStringA(" Show debug window")).c_str(), nullptr, &m_showDebugWindow); ImGui::Separator(); if (ImGui::MenuItem((std::string(ICON_MD_EXIT_TO_APP) + XorStringA(" Unload")).c_str())) { PyxContext::GetInstance().RequestShutdown(); } ImGui::EndMenu(); } if (ImGui::BeginMenu((std::string(ICON_MD_EXTENSION) + XorStringA(" Scripts")).c_str())) { for (auto* pScript : Scripting::ScriptingContext::GetInstance().GetScripts()) { auto& name = pScript->GetName(); if (ImGui::MenuItem((std::string(pScript->IsRunning() ? ICON_MD_CLEAR : ICON_MD_PLAY_CIRCLE_OUTLINE) + " " + Utility::String::utf8_encode(name)).c_str(), pScript->IsRunning() ? XorStringA("(running)") : XorStringA("(stopped)"))) pScript->IsRunning() ? pScript->Stop() : pScript->Start(); } ImGui::Separator(); if (ImGui::MenuItem((std::string(ICON_MD_REPLAY) + XorStringA(" Reload scripts")).c_str())) { Scripting::ScriptingContext::GetInstance().ReloadScripts(); } ImGui::EndMenu(); } GetOnDrawMainMenuBarCallbacks().Run(this); Scripting::ScriptingContext::GetInstance().FireCallbacks(XorStringW(L"ImGui.OnRenderMainMenuBar")); ImGui::EndMainMenuBar(); } ImGui::PopStyleVar(); }