From e33fd29bd2ecf80d3eb68007c8dc57c87067945a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 14 Mar 2026 13:44:17 +0100 Subject: [PATCH] Add a "quick-edit" button for the current server host/ip, if it's custom This was requested by Majin on Discord, whose server changes IP regularly for some reason. --- UI/AdhocServerScreen.cpp | 54 +++++++++++++++++++++++++++++++++++++ UI/AdhocServerScreen.h | 2 ++ UI/GameSettingsScreen.cpp | 9 ++++++- UI/UIAtlas.cpp | 1 + assets/ui_images/images.svg | 29 +++++++++++++------- 5 files changed, 84 insertions(+), 11 deletions(-) diff --git a/UI/AdhocServerScreen.cpp b/UI/AdhocServerScreen.cpp index 2e84967589..ec1711fbdf 100644 --- a/UI/AdhocServerScreen.cpp +++ b/UI/AdhocServerScreen.cpp @@ -3,6 +3,7 @@ #include "Common/Net/Resolve.h" #include "Common/UI/Root.h" +#include "Common/UI/PopupScreens.h" #include "Common/StringUtils.h" #include "Core/HLE/sceNetAdhoc.h" #include "UI/MiscViews.h" @@ -507,3 +508,56 @@ void AdhocServerScreen::OnCompleted(DialogResult result) { *value_ = StripSpaces(editValue_); } } + +bool AdhocServerNameIsCustom() { + for (auto iter : g_Config.vCustomAdhocServerList) { + if (iter == g_Config.sProAdhocServer) { + return true; + } + } + for (auto iter : g_Config.vCustomAdhocServerListWithRelay) { + if (iter == g_Config.sProAdhocServer) { + return true; + } + } + return false; +} + +static void EditServerName(std::string_view newServerName) { + newServerName = StripSpaces(newServerName); + if (newServerName != g_Config.sProAdhocServer) { + for (auto &name : g_Config.vCustomAdhocServerList) { + if (name == g_Config.sProAdhocServer) { + name = newServerName; + } + } + for (auto &name : g_Config.vCustomAdhocServerListWithRelay) { + if (name == g_Config.sProAdhocServer) { + name = newServerName; + } + } + g_Config.sProAdhocServer = newServerName; + } +} + +void AskToEditCurrentServer(int requestToken, ScreenManager *screenManager) { + using namespace UI; + auto n = GetI18NCategory(I18NCat::NETWORKING); + + // Choose method depending on platform capabilities. + if (System_GetPropertyBool(SYSPROP_HAS_TEXT_INPUT_DIALOG)) { + System_InputBoxGetString(requestToken, n->T("Change proAdhocServer Address"), g_Config.sProAdhocServer, false, [](const std::string &enteredValue, int) { + EditServerName(enteredValue); + }); + return; + } + static std::string editText = g_Config.sProAdhocServer; + TextEditPopupScreen *popupScreen = new TextEditPopupScreen(&editText, editText, n->T("Change proAdhocServer Address"), 256); + if (System_GetPropertyBool(SYSPROP_KEYBOARD_IS_SOFT)) { + popupScreen->SetAlignTop(true); + } + popupScreen->OnChange.Add([](EventParams &e) { + EditServerName(editText); + }); + screenManager->push(popupScreen); +} diff --git a/UI/AdhocServerScreen.h b/UI/AdhocServerScreen.h index bd9dc3026e..b220bed022 100644 --- a/UI/AdhocServerScreen.h +++ b/UI/AdhocServerScreen.h @@ -54,3 +54,5 @@ private: bool lastResolvedResult_ = false; }; +void AskToEditCurrentServer(int requestToken, ScreenManager *screenManager); +bool AdhocServerNameIsCustom(); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 37ec290550..81dbecb3bb 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1023,9 +1023,16 @@ void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSetti networkingSettings->Add(new ItemHeader(n->T("Ad Hoc multiplayer"))); - networkingSettings->Add(new ChoiceWithValueDisplay(&g_Config.sProAdhocServer, n->T("Change proAdhocServer Address"), I18NCat::NONE))->OnClick.Add([=](UI::EventParams &) { + LinearLayout *serverRow = networkingSettings->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); + serverRow->SetSpacing(0.0f); + serverRow->Add(new ChoiceWithValueDisplay(&g_Config.sProAdhocServer, n->T("Change proAdhocServer Address"), I18NCat::NONE, new LinearLayoutParams(1.0f)))->OnClick.Add([=](UI::EventParams &) { screenManager()->push(new AdhocServerScreen(&g_Config.sProAdhocServer, n->T("Ad hoc server address"))); }); + if (AdhocServerNameIsCustom()) { + serverRow->Add(new Choice(ImageID("I_EDIT_TEXT"), new LinearLayoutParams(ITEM_HEIGHT, ITEM_HEIGHT)))->OnClick.Add([this](UI::EventParams &) { + AskToEditCurrentServer(GetRequesterToken(), screenManager()); + }); + } static const char *relayModes[] = {"Auto", "Yes", "No"}; PopupMultiChoice *relayModePopup = networkingSettings->Add(new PopupMultiChoice(&g_Config.iAdhocServerRelayMode, n->T("Try to use server-provided packet relay"), relayModes, 0, ARRAY_SIZE(relayModes), I18NCat::DIALOG, screenManager())); diff --git a/UI/UIAtlas.cpp b/UI/UIAtlas.cpp index 00843ae837..92b1d3a011 100644 --- a/UI/UIAtlas.cpp +++ b/UI/UIAtlas.cpp @@ -187,6 +187,7 @@ static const ImageMeta imageIDs[] = { {"I_FILE_SAVE", false}, {"I_RADIO_EMPTY", false}, {"I_RADIO_SELECTED", false}, + {"I_EDIT_TEXT", false}, }; static std::string PNGNameFromID(std::string_view id) { diff --git a/assets/ui_images/images.svg b/assets/ui_images/images.svg index f2b6e58c55..c969e3ff11 100644 --- a/assets/ui_images/images.svg +++ b/assets/ui_images/images.svg @@ -7,7 +7,7 @@ viewBox="0 0 158.74998 185.20831" version="1.1" id="svg1" - inkscape:version="1.4 (86a8ad7, 2024-10-11)" + inkscape:version="1.4.3 (0d15f75, 2025-12-25)" sodipodi:docname="images.svg" xml:space="preserve" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" @@ -24,15 +24,15 @@ inkscape:pagecheckerboard="true" inkscape:deskcolor="#d1d1d1" inkscape:document-units="px" - inkscape:zoom="1.4142136" - inkscape:cx="307.94501" - inkscape:cy="348.9572" - inkscape:window-width="2560" - inkscape:window-height="1377" - inkscape:window-x="-8" - inkscape:window-y="-8" + inkscape:zoom="11.313709" + inkscape:cx="261.54111" + inkscape:cy="619.73488" + inkscape:window-width="3840" + inkscape:window-height="2071" + inkscape:window-x="-9" + inkscape:window-y="-9" inkscape:window-maximized="1" - inkscape:current-layer="layer1" + inkscape:current-layer="I_EDIT_TEXT" showgrid="false" showguides="true" />