fix game config (#97)

This commit is contained in:
N3xoX1 2026-07-23 17:53:07 +09:30 committed by GitHub
parent 804661f558
commit ed7acc5f99
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 78 additions and 0 deletions

View File

@ -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();

View File

@ -182,6 +182,8 @@ void GameConfig::Display(void * parentWindow, const char * gamePath)
m_pageNav = std::static_pointer_cast<IPageNav>(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;
}

View File

@ -1,5 +1,6 @@
#pragma once
#include <sciter_handler.h>
#include <widgets/page_nav.h>
#include <string>
@ -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;

View File

@ -62,3 +62,55 @@ void GameConfigAddons::PopulateAddons(void)
list.SetHTML(reinterpret_cast<const uint8_t *>(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<std::string> disabledNames;
std::vector<const char *> 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<uint32_t>(disabledPtrs.size()));
}