From c5a5215261f2dedf46163b3e61213dedd58d7cb0 Mon Sep 17 00:00:00 2001 From: N3xoX1 Date: Mon, 23 Jun 2025 17:16:48 +0930 Subject: [PATCH] Add System config screen --- external/sciterui | 2 +- lang/english/css/main_window.css | 17 +- lang/english/html/system_config.html | 176 ++++++++++++++++++ lang/english/html/system_config_audio.html | 30 +++ src/nxemu/main.cpp | 4 +- src/nxemu/nxemu.vcxproj | 6 +- src/nxemu/nxemu.vcxproj.filters | 18 +- .../user_interface/sciter_main_window.cpp | 30 ++- src/nxemu/user_interface/sciter_main_window.h | 14 +- .../settings/config_setting_section.cpp | 30 --- .../settings/config_setting_section.h | 28 --- .../user_interface/settings/system_config.cpp | 66 +++++++ .../user_interface/settings/system_config.h | 32 ++++ .../settings/system_config_audio.cpp | 8 + .../settings/system_config_audio.h | 19 ++ 15 files changed, 390 insertions(+), 90 deletions(-) create mode 100644 lang/english/html/system_config.html create mode 100644 lang/english/html/system_config_audio.html delete mode 100644 src/nxemu/user_interface/settings/config_setting_section.cpp delete mode 100644 src/nxemu/user_interface/settings/config_setting_section.h create mode 100644 src/nxemu/user_interface/settings/system_config.cpp create mode 100644 src/nxemu/user_interface/settings/system_config.h create mode 100644 src/nxemu/user_interface/settings/system_config_audio.cpp create mode 100644 src/nxemu/user_interface/settings/system_config_audio.h diff --git a/external/sciterui b/external/sciterui index d1620cd8..4caaf3d3 160000 --- a/external/sciterui +++ b/external/sciterui @@ -1 +1 @@ -Subproject commit d1620cd8727048b2ce2b9e2041283504b2318bf2 +Subproject commit 4caaf3d3bbfe54f832b3f95fc01e15996fbbf002 diff --git a/lang/english/css/main_window.css b/lang/english/css/main_window.css index 869edd25..27ac2de1 100644 --- a/lang/english/css/main_window.css +++ b/lang/english/css/main_window.css @@ -110,10 +110,6 @@ ul#menu-bar font-family: 'Segoe UI', Arial, sans-serif; font-size: 0.9em; font-weight: 100; -} - -ul#menu-bar -{ behavior:menu-bar; flow: horizontal; padding: 0; @@ -122,7 +118,7 @@ ul#menu-bar ul#menu-bar > li { - padding: 0.5em 0.5em 0.1em 0.5em; + padding: 0.25em 0.5em 0.1em 0.5em; border: 1px solid transparent; margin:0; white-space:nowrap; @@ -147,10 +143,11 @@ menu flow: vertical; display:none; margin:0; - padding:0; + padding: 0.2em; max-width:max-content; background: #31363b; color: #eff0f1; + border: 1px solid #434242; } @media (menu-animation-supported) { @@ -172,7 +169,7 @@ menu li vertical-align:middle; foreground-repeat: no-repeat; foreground-position: left 2px top 50%; - padding: 0.7em 1.8em 0.7em 1.3em; + padding: 0.2em 1.8em 0.2em 1.3em; margin: 0; } @@ -200,6 +197,12 @@ menu li:has-child-of-type(menu):rtl foreground-position: top 50% left 2px; } +hr +{ + padding: 0; + margin: 0.2em 0; +} + #MainContents { width: 100%%; diff --git a/lang/english/html/system_config.html b/lang/english/html/system_config.html new file mode 100644 index 00000000..b55dca3f --- /dev/null +++ b/lang/english/html/system_config.html @@ -0,0 +1,176 @@ + + + + + NxEmu Configuration + + +
+ NxEmu Configuration + + + +
+ +
+ + + +
+
+ + + \ No newline at end of file diff --git a/lang/english/html/system_config_audio.html b/lang/english/html/system_config_audio.html new file mode 100644 index 00000000..bd24f38d --- /dev/null +++ b/lang/english/html/system_config_audio.html @@ -0,0 +1,30 @@ +
+
Audio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
100%
+
+
+
+
+
+
+
+
+ diff --git a/src/nxemu/main.cpp b/src/nxemu/main.cpp index e70e1ff3..2ca5508f 100644 --- a/src/nxemu/main.cpp +++ b/src/nxemu/main.cpp @@ -7,11 +7,13 @@ #include #include #include +#include #include void RegisterWidgets(ISciterUI & sciterUI) { - WidgetMenuBar::Register(sciterUI); + Register_WidgetMenuBar(sciterUI); + Register_WidgetPageNav(sciterUI); } int WINAPI WinMain(_In_ HINSTANCE /*hInstance*/, _In_opt_ HINSTANCE /*hPrevInstance*/, _In_ LPSTR /*lpszArgs*/, _In_ int /*nWinMode*/) diff --git a/src/nxemu/nxemu.vcxproj b/src/nxemu/nxemu.vcxproj index eb7dc553..f9a0c81f 100644 --- a/src/nxemu/nxemu.vcxproj +++ b/src/nxemu/nxemu.vcxproj @@ -40,8 +40,9 @@ - + + @@ -49,8 +50,9 @@ - + + diff --git a/src/nxemu/nxemu.vcxproj.filters b/src/nxemu/nxemu.vcxproj.filters index b2410196..2869042f 100644 --- a/src/nxemu/nxemu.vcxproj.filters +++ b/src/nxemu/nxemu.vcxproj.filters @@ -45,15 +45,18 @@ Source Files\user_interface - - Source Files\user_interface\settings - Source Files\user_interface Source Files\user_interface\settings + + Source Files\user_interface\settings + + + Source Files\user_interface\settings + @@ -68,15 +71,18 @@ Header Files\user_interface - - Header Files\user_interface\settings - Header Files\user_interface Header Files\user_interface\settings + + Header Files\user_interface\settings + + + Header Files\user_interface\settings + diff --git a/src/nxemu/user_interface/sciter_main_window.cpp b/src/nxemu/user_interface/sciter_main_window.cpp index 2233a826..12235715 100644 --- a/src/nxemu/user_interface/sciter_main_window.cpp +++ b/src/nxemu/user_interface/sciter_main_window.cpp @@ -1,5 +1,6 @@ #include "sciter_main_window.h" #include "settings/input_config.h" +#include "settings/system_config.h" #include "settings/ui_settings.h" #include #include @@ -11,11 +12,12 @@ #include #include -SciterMainWindow::SciterMainWindow(ISciterUI & SciterUI, const char * windowTitle) : - m_sciterUI(SciterUI), +SciterMainWindow::SciterMainWindow(ISciterUI & sciterUI, const char * windowTitle) : + m_sciterUI(sciterUI), m_window(nullptr), m_renderWindow(nullptr), - m_windowTitle(windowTitle) + m_windowTitle(windowTitle), + m_systemConfig(sciterUI) { Settings & settings = Settings::GetInstance(); settings.RegisterCallback(NXCoreSetting::GameFile, std::bind(&SciterMainWindow::GameFileChanged, this)); @@ -31,7 +33,8 @@ void SciterMainWindow::ResetMenu() return; } MenuBarItemList fileMenu; - fileMenu.push_back(MenuBarItem(ID_FILE_OPEN_GAME, "Open Game...")); + fileMenu.push_back(MenuBarItem(ID_FILE_LOAD_FILE, "Load File...")); + fileMenu.push_back(MenuBarItem(MenuBarItem::SPLITER)); Stringlist & recentFiles = uiSettings.recentFiles; MenuBarItemList RecentGameMenu; @@ -49,12 +52,13 @@ void SciterMainWindow::ResetMenu() fileMenu.push_back(MenuBarItem(MenuBarItem::SPLITER)); fileMenu.push_back(MenuBarItem(ID_FILE_EXIT, "Exit")); - MenuBarItemList OptionsMenu; - OptionsMenu.push_back(MenuBarItem(ID_OPTIONS_INPUT, "Configure Input...")); + MenuBarItemList emulationMenu; + emulationMenu.push_back(MenuBarItem(ID_EMULATION_CONTROLLERS, "Controllers...")); + emulationMenu.push_back(MenuBarItem(ID_EMULATION_CONFIGURE, "Configure...")); MenuBarItemList mainTitleMenu; mainTitleMenu.push_back(MenuBarItem(MenuBarItem::SUB_MENU, "File", &fileMenu)); - mainTitleMenu.push_back(MenuBarItem(MenuBarItem::SUB_MENU, "Options", &OptionsMenu)); + mainTitleMenu.push_back(MenuBarItem(MenuBarItem::SUB_MENU, "Emulation", &emulationMenu)); m_menuBar->AddSink(this); m_menuBar->SetMenuContent(mainTitleMenu); @@ -351,7 +355,7 @@ void SciterMainWindow::DisplayedFramesChanged(void) ShowWindow((HWND)m_renderWindow, SW_SHOW); } -void SciterMainWindow::OnOpenGame(void) +void SciterMainWindow::OnOpenFile(void) { SwitchSystem * system = SwitchSystem::GetInstance(); system->Systemloader().SelectAndLoad((void *)m_window->GetHandle()); @@ -362,6 +366,11 @@ void SciterMainWindow::OnFileExit(void) m_sciterUI.Stop(); } +void SciterMainWindow::OnSystemConfig(void) +{ + m_systemConfig.Display((void*)m_window->GetHandle()); +} + void SciterMainWindow::OnInputConfig(void) { InputConfig(m_sciterUI).Display((void *)m_window->GetHandle()); @@ -386,9 +395,10 @@ void SciterMainWindow::OnMenuItem(int32_t id, SCITER_ELEMENT /*item*/) { switch (id) { - case ID_FILE_OPEN_GAME: OnOpenGame(); break; + case ID_FILE_LOAD_FILE: OnOpenFile(); break; case ID_FILE_EXIT: OnFileExit(); break; - case ID_OPTIONS_INPUT: OnInputConfig(); break; + case ID_EMULATION_CONTROLLERS: OnInputConfig(); break; + case ID_EMULATION_CONFIGURE: OnSystemConfig(); break; default: if (id >= ID_RECENT_FILE_START && id <= ID_RECENT_FILE_END) { diff --git a/src/nxemu/user_interface/sciter_main_window.h b/src/nxemu/user_interface/sciter_main_window.h index c8d08eed..32c2d279 100644 --- a/src/nxemu/user_interface/sciter_main_window.h +++ b/src/nxemu/user_interface/sciter_main_window.h @@ -3,6 +3,7 @@ #include #include #include +#include "user_interface/settings/system_config.h" class SciterMainWindow : public IWindowDestroySink, @@ -14,11 +15,12 @@ class SciterMainWindow : enum MainMenuID { // File Menu - ID_FILE_OPEN_GAME = 1, + ID_FILE_LOAD_FILE = 1, ID_FILE_EXIT, - // Options Menu - ID_OPTIONS_INPUT, + // Emulation Menu + ID_EMULATION_CONTROLLERS, + ID_EMULATION_CONFIGURE, // Recent files ID_RECENT_FILE_START, @@ -26,7 +28,7 @@ class SciterMainWindow : }; public: - SciterMainWindow(ISciterUI & SciterUI, const char * windowTitle); + SciterMainWindow(ISciterUI & sciterUI, const char * windowTitle); void ResetMenu(); bool Show(void); @@ -45,8 +47,9 @@ private: int32_t SciterKeyToSwitchKey(SciterKeys key); int32_t SciterKeyToVKCode(SciterKeys vkcode); - void OnOpenGame(void); + void OnOpenFile(void); void OnFileExit(void); + void OnSystemConfig(void); void OnInputConfig(void); void OnRecetGame(uint32_t fileIndex); @@ -73,4 +76,5 @@ private: std::shared_ptr m_menuBar; void * m_renderWindow; std::string m_windowTitle; + SystemConfig m_systemConfig; }; diff --git a/src/nxemu/user_interface/settings/config_setting_section.cpp b/src/nxemu/user_interface/settings/config_setting_section.cpp deleted file mode 100644 index bb03fd95..00000000 --- a/src/nxemu/user_interface/settings/config_setting_section.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "config_setting_section.h" - -ConfigSettingSection::ConfigSettingSection(const wchar_t * pageTitle) : - m_pageTitle(pageTitle) -{ -} - -void ConfigSettingSection::AddPage(std::shared_ptr page) -{ - m_pages.push_back(page); -} - -SettingsPage * ConfigSettingSection::GetPage(uint32_t pageNo) -{ - if (pageNo < 0 || pageNo >= (uint32_t)m_pages.size()) - { - return NULL; - } - return m_pages[pageNo].get(); -} - -const wchar_t * ConfigSettingSection::GetPageTitle(void) const -{ - return m_pageTitle.c_str(); -} - -size_t ConfigSettingSection::GetPageCount(void) const -{ - return m_pages.size(); -} \ No newline at end of file diff --git a/src/nxemu/user_interface/settings/config_setting_section.h b/src/nxemu/user_interface/settings/config_setting_section.h deleted file mode 100644 index 386bdeb3..00000000 --- a/src/nxemu/user_interface/settings/config_setting_section.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include -#include -#include - -class SettingsPage; - -class ConfigSettingSection -{ -public: - ConfigSettingSection(const wchar_t * pageTitle); - - void AddPage(std::shared_ptr page); - SettingsPage * GetPage(uint32_t pageNo); - - const wchar_t * GetPageTitle(void) const; - size_t GetPageCount(void) const; - -private: - ConfigSettingSection() = delete; - ConfigSettingSection(const ConfigSettingSection &) = delete; - ConfigSettingSection & operator=(const ConfigSettingSection &) = delete; - - typedef std::vector> SETTING_PAGES; - - SETTING_PAGES m_pages; - std::wstring m_pageTitle; -}; diff --git a/src/nxemu/user_interface/settings/system_config.cpp b/src/nxemu/user_interface/settings/system_config.cpp new file mode 100644 index 00000000..82289151 --- /dev/null +++ b/src/nxemu/user_interface/settings/system_config.cpp @@ -0,0 +1,66 @@ +#include "system_config.h" +#include "system_config_audio.h" +#include +#include +#include + +SystemConfig::SystemConfig(ISciterUI & SciterUI) : + m_sciterUI(SciterUI), + m_window(nullptr) +{ +} + +SystemConfig::~SystemConfig() +{ +} + +void SystemConfig::Display(void * parentWindow) +{ + enum + { + WINDOW_HEIGHT = 300, + WINDOW_WIDTH = 300, + }; + + if (!m_sciterUI.WindowCreate(parentWindow, "system_config.html", 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, SUIW_CHILD, m_window)) + { + return; + } + SciterElement root(m_window->GetRootElement()); + if (root.IsValid()) + { + SciterElement pageNav = root.GetElementByID("MainTabNav"); + if (pageNav.IsValid()) + { + void * interfacePtr = nullptr; + if (m_sciterUI.GetElementInterface(pageNav, IID_IPAGENAV, &interfacePtr)) + { + m_pageNav = std::shared_ptr(reinterpret_cast(interfacePtr), [](IPageNav*) {}); + m_pageNav->AddSink(this); + } + } + } +} + +bool SystemConfig::PageNavChangeFrom(const std::string& PageName, SCITER_ELEMENT PageNav) +{ + return true; +} + +bool SystemConfig::PageNavChangeTo(const std::string& PageName, SCITER_ELEMENT PageNav) +{ + return true; +} + +void SystemConfig::PageNavCreatedPage(const std::string& PageName, SCITER_ELEMENT Page) +{ + if (PageName == "Audio") + { + m_systemConfigAudio.reset(new SystemConfigAudio(m_sciterUI, m_window->GetHandle(), Page)); + } +} + +void SystemConfig::PageNavPageChanged(const std::string& PageName, SCITER_ELEMENT PageNav) +{ +} + diff --git a/src/nxemu/user_interface/settings/system_config.h b/src/nxemu/user_interface/settings/system_config.h new file mode 100644 index 00000000..269216a9 --- /dev/null +++ b/src/nxemu/user_interface/settings/system_config.h @@ -0,0 +1,32 @@ +#pragma once +#include + +__interface ISciterUI; +__interface ISciterWindow; +class SystemConfigAudio; + +class SystemConfig : + public IPagesSink +{ +public: + SystemConfig(ISciterUI& SciterUI); + ~SystemConfig(); + + void Display(void* parentWindow); + + // IPagesSink + bool PageNavChangeFrom(const std::string& PageName, SCITER_ELEMENT PageNav) override; + bool PageNavChangeTo(const std::string& PageName, SCITER_ELEMENT PageNav) override; + void PageNavCreatedPage(const std::string& PageName, SCITER_ELEMENT Page) override; + void PageNavPageChanged(const std::string& PageName, SCITER_ELEMENT PageNav) override; + +private: + SystemConfig() = delete; + SystemConfig(const SystemConfig &) = delete; + SystemConfig & operator=(const SystemConfig &) = delete; + + ISciterUI & m_sciterUI; + ISciterWindow * m_window; + std::shared_ptr m_pageNav; + std::unique_ptr m_systemConfigAudio; +}; diff --git a/src/nxemu/user_interface/settings/system_config_audio.cpp b/src/nxemu/user_interface/settings/system_config_audio.cpp new file mode 100644 index 00000000..d668258e --- /dev/null +++ b/src/nxemu/user_interface/settings/system_config_audio.cpp @@ -0,0 +1,8 @@ +#include "system_config_audio.h" + +SystemConfigAudio::SystemConfigAudio(ISciterUI & sciterUI, HWINDOW parent, SciterElement page) : + m_sciterUI(sciterUI), + m_parent(parent), + m_page(page) +{ +} diff --git a/src/nxemu/user_interface/settings/system_config_audio.h b/src/nxemu/user_interface/settings/system_config_audio.h new file mode 100644 index 00000000..3912e8df --- /dev/null +++ b/src/nxemu/user_interface/settings/system_config_audio.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include + +class SystemConfigAudio +{ +public: + SystemConfigAudio(ISciterUI & sciterUI, HWINDOW parent, SciterElement page); + ~SystemConfigAudio() = default; + +private: + SystemConfigAudio() = delete; + SystemConfigAudio(const SystemConfigAudio &) = delete; + SystemConfigAudio & operator=(const SystemConfigAudio &) = delete; + + ISciterUI & m_sciterUI; + HWINDOW m_parent; + SciterElement m_page; +}; \ No newline at end of file