diff --git a/src/nxemu/user_interface/sciter_main_window.cpp b/src/nxemu/user_interface/sciter_main_window.cpp index 2b5fbad4..d5d5caa5 100644 --- a/src/nxemu/user_interface/sciter_main_window.cpp +++ b/src/nxemu/user_interface/sciter_main_window.cpp @@ -2144,6 +2144,7 @@ bool SciterMainWindow::OnTimer(SCITER_ELEMENT /*element*/, uint32_t * timerId) m_gameConfig.reset(new GameConfig(m_sciterUI, m_modules)); m_gameConfig->Display((void *)m_window->GetHandle(), path.c_str()); } + } else if (timerId == (uint32_t *)TIMER_DEFERRED_STOP_GAME) { DoStopGame(); diff --git a/src/nxemu/user_interface/settings/game_config.cpp b/src/nxemu/user_interface/settings/game_config.cpp index 87379ea9..1e192276 100644 --- a/src/nxemu/user_interface/settings/game_config.cpp +++ b/src/nxemu/user_interface/settings/game_config.cpp @@ -182,6 +182,8 @@ void GameConfig::Display(void * parentWindow, const char * gamePath) m_pageNav = std::static_pointer_cast(interfacePtr); m_pageNav->AddSink(this); } + + AttachClickHandler(m_sciterUI, root.FindFirst("button[role=\"window-ok\"]"), this); } m_window->FixMinSize(); @@ -232,3 +234,21 @@ void GameConfig::PageNavCreatedPage(const std::string & pageName, SCITER_ELEMENT void GameConfig::PageNavPageChanged(const std::string & /*pageName*/, SCITER_ELEMENT /*pageNav*/) { } + +bool GameConfig::OnClick(SCITER_ELEMENT element, SCITER_ELEMENT /*source*/, uint32_t /*reason*/) +{ + SciterElement clickElem(element); + if (clickElem.GetAttribute("role") == "window-ok") + { + if (m_gameConfigAddons) + { + m_gameConfigAddons->SaveSetting(); + } + if (m_window != nullptr) + { + m_window->Destroy(); + m_window = nullptr; + } + } + return true; +} diff --git a/src/nxemu/user_interface/settings/game_config.h b/src/nxemu/user_interface/settings/game_config.h index d6f3eaa6..4d2b45ae 100644 --- a/src/nxemu/user_interface/settings/game_config.h +++ b/src/nxemu/user_interface/settings/game_config.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -9,6 +10,7 @@ class SystemModules; class GameConfigAddons; class GameConfig : + public IClickSink, public IPagesSink { public: @@ -18,6 +20,9 @@ public: void Display(void * parentWindow, const char * gamePath); uint64_t ProgramId() const { return m_programId; } + // IClickSink + bool OnClick(SCITER_ELEMENT element, SCITER_ELEMENT source, uint32_t reason) override; + // IPagesSink bool PageNavChangeFrom(const std::string & pageName, SCITER_ELEMENT pageNav) override; bool PageNavChangeTo(const std::string & pageName, SCITER_ELEMENT pageNav) override; diff --git a/src/nxemu/user_interface/settings/game_config_addons.cpp b/src/nxemu/user_interface/settings/game_config_addons.cpp index 2cc4cdae..ce672ebb 100644 --- a/src/nxemu/user_interface/settings/game_config_addons.cpp +++ b/src/nxemu/user_interface/settings/game_config_addons.cpp @@ -62,3 +62,55 @@ void GameConfigAddons::PopulateAddons(void) list.SetHTML(reinterpret_cast(html.c_str()), html.size()); } + +void GameConfigAddons::SaveSetting(void) +{ + const uint64_t programId = m_config.ProgramId(); + if (!m_page.IsValid() || programId == 0) + { + return; + } + + SciterElement list = m_page.GetElementByID("AddonsList"); + if (!list.IsValid()) + { + return; + } + + std::vector disabledNames; + std::vector disabledPtrs; + const uint32_t childCount = list.GetChildCount(); + for (uint32_t i = 0; i < childCount; ++i) + { + SciterElement row = list.GetChild(i); + if (!row.IsValid()) + { + continue; + } + SciterElement checkbox = row.FindFirst("input.addon-enabled"); + if (!checkbox.IsValid()) + { + continue; + } + const bool checked = (checkbox.GetState() & SciterElement::STATE_CHECKED) != 0; + if (checked) + { + continue; + } + const std::string name = checkbox.GetAttribute("data-name"); + if (!name.empty()) + { + disabledNames.push_back(name); + } + } + + disabledPtrs.reserve(disabledNames.size()); + for (const std::string & name : disabledNames) + { + disabledPtrs.push_back(name.c_str()); + } + + m_modules.Modules().Systemloader().SetDisabledAddons( + programId, disabledPtrs.empty() ? nullptr : disabledPtrs.data(), + static_cast(disabledPtrs.size())); +}