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(); }
void Pyx::Graphics::Gui::ImGuiImpl::OnFrame() { if (m_isInitialized) { if (!m_isResourcesCreated) CreateResources(); if (m_isResourcesCreated) { auto* pRenderer = GraphicsContext::GetInstance().GetMainRenderer(); if (pRenderer) { auto& io = ImGui::GetIO(); if (Input::InputContext::GetInstance().CursorIsVisible() && pRenderer->GetAttachedWindow() == GetForegroundWindow()) { auto cursorPos = Input::InputContext::GetInstance().GetCursorPosition(); ScreenToClient(pRenderer->GetAttachedWindow(), &cursorPos); io.MousePos.x = cursorPos.x; io.MousePos.y = cursorPos.y; io.MouseDown[0] = GetAsyncKeyState(VK_LBUTTON) != 0; io.MouseDown[1] = GetAsyncKeyState(VK_RBUTTON) != 0; io.MouseDown[2] = GetAsyncKeyState(VK_MBUTTON) != 0; io.KeyCtrl = GetAsyncKeyState(VK_CONTROL) != 0; io.KeyShift = GetAsyncKeyState(VK_SHIFT) != 0; io.KeyAlt = GetAsyncKeyState(VK_MENU) != 0; } switch (pRenderer->GetRendererType()) { case RendererType::D3D9: { ImGui_ImplDX9_NewFrame(); break; } case RendererType::D3D11: { ImGui_ImplDX11_NewFrame(); break; } default: return; } if (m_isVisible) { BuildMainMenuBar(); if (m_showConsole) BuildLogsWindow(); if (m_showDebugWindow) BuildDebugWindow(); GetOnRenderCallbacks().Run(this); Scripting::ScriptingContext::GetInstance().FireCallbacks(XorStringW(L"ImGui.OnRender")); ImGui::Render(); } } static int lastToggleVisibilityTick = 0; if (GetTickCount() - lastToggleVisibilityTick > 250) { bool shouldToggleGui = true; for (auto vKey : PyxContext::GetInstance().GetSettings().GuiToggleVisibilityHotkeys) { if (GetAsyncKeyState(vKey) == NULL) { shouldToggleGui = false; break; } } if (shouldToggleGui) { ToggleVisibility(!IsVisible()); lastToggleVisibilityTick = GetTickCount(); } } static int lastToggleConsoleVisibilityTick = 0; if (GetTickCount() - lastToggleConsoleVisibilityTick > 250) { bool shouldToggleConsole = true; for (auto vKey : PyxContext::GetInstance().GetSettings().ImGuiToggleConsoleHotkeys) { if (GetAsyncKeyState(vKey) == NULL) { shouldToggleConsole = false; break; } } if (shouldToggleConsole) { m_showConsole = !m_showConsole; lastToggleConsoleVisibilityTick = GetTickCount(); } } } } }