From 0e21ef5ff9d2cb36490a2e068fb866755a376c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 30 Oct 2026 14:21:13 +0100 Subject: [PATCH] Settings: Explain the speed hacks on their page instead of in the link The link is now just "Speed hacks", with a hint under it saying they can cause rendering errors, and the page starts with a longer explanation. Adds SettingsPage::Description() for text between the groups. Co-Authored-By: Claude Opus 5.5 --- UI/Settings/GraphicsPage.cpp | 3 +++ UI/SettingsPage.cpp | 16 +++++++++++++--- UI/SettingsPage.h | 3 +++ UI/SettingsPagesDialogScreen.cpp | 2 ++ assets/lang/en_US.ini | 2 +- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/UI/Settings/GraphicsPage.cpp b/UI/Settings/GraphicsPage.cpp index 19fd05517d..428f87fa37 100644 --- a/UI/Settings/GraphicsPage.cpp +++ b/UI/Settings/GraphicsPage.cpp @@ -96,6 +96,8 @@ static void OnRenderingDevice(SettingsPageHost *host) { static void BuildSpeedHacksPage(SettingsPage *page) { using namespace UI; + page->Description({I18NCat::GRAPHICS, "SpeedHacksDescription", "These settings can improve performance on some devices, but they can also cause graphical issues or make rendering stop working entirely."}); + page->RestoreDefaults(); page->Header(); @@ -313,6 +315,7 @@ void BuildGraphicsSettings(SettingsPage *page) { page->Header(); page->Link({I18NCat::GRAPHICS, "Speed Hacks"}, I18NCat::GRAPHICS, &BuildSpeedHacksPage); + page->Hint({I18NCat::GRAPHICS, "SpeedHacksHint", "These settings can cause rendering errors"}); page->Header(); page->Setting(&g_Config.iBloomHack).EnabledFunc([] { diff --git a/UI/SettingsPage.cpp b/UI/SettingsPage.cpp index ebd6177930..0c94257ea7 100644 --- a/UI/SettingsPage.cpp +++ b/UI/SettingsPage.cpp @@ -186,6 +186,10 @@ SettingItem &SettingsPage::Hint(SettingText text) { return Add(SettingType::Hint, text); } +SettingItem &SettingsPage::Description(SettingText text) { + return Add(SettingType::Description, text); +} + SettingItem &SettingsPage::Link(SettingText text, I18NCat cat, std::function build) { SettingItem &item = Add(SettingType::Link, text); item.linkCat = cat; @@ -361,6 +365,8 @@ static UI::View *CreateSettingViewInner(const SettingItem &item, I18NCat pageCat return parent->Add(new InfoItem(text, item.rightText)); case SettingType::Hint: return parent->Add(new SettingHint(text, prevView)); + case SettingType::Description: + return parent->Add(new SettingHint(text, nullptr)); case SettingType::Custom: return item.createCustom(parent); case SettingType::Link: @@ -402,17 +408,21 @@ void CreateSettingViews(const SettingsPage &page, UI::ViewGroup *parent, ScreenM // Each header is a group, which the items after it go in. Items before the first get one without a title. UI::ViewGroup *group = nullptr; for (const SettingItem &item : page.Items()) { - if (!group && item.type != SettingType::Header) { + // Descriptions go between the groups, so the items after one get a new group. + bool outsideGroups = item.type == SettingType::Header || item.type == SettingType::Description; + if (!group && !outsideGroups) { group = parent->Add(new UI::ChoiceGroup()); } - UI::View *view = CreateSettingView(item, page.DefaultCat(), prevView, item.type == SettingType::Header ? parent : group, screenManager); + UI::View *view = CreateSettingView(item, page.DefaultCat(), prevView, outsideGroups ? parent : group, screenManager); if (views) { views->push_back(view); } if (view && item.restoresDefaults) { static_cast(view)->OnClick.Add(RestoreDefaultsHandler(page)); } - if (view && item.type == SettingType::Header) { + if (item.type == SettingType::Description) { + group = nullptr; + } else if (view && item.type == SettingType::Header) { group = static_cast(view); } else if (view) { prevView = view; diff --git a/UI/SettingsPage.h b/UI/SettingsPage.h index 6dbf878930..54a1fbfdee 100644 --- a/UI/SettingsPage.h +++ b/UI/SettingsPage.h @@ -87,6 +87,7 @@ enum class SettingType { Choice, // A button. onChange is called on click. Info, Hint, // Explanatory text attached to the previous item. + Description, // Text about the page or a part of it, outside the groups. Custom, Link, // Opens another page. }; @@ -197,6 +198,8 @@ public: SettingItem &Choice(SettingText text, ImageID image = ImageID::invalid()); SettingItem &Info(SettingText text, std::string_view rightText); SettingItem &Hint(SettingText text); + // The items after it start a new group. Not searched. + SettingItem &Description(SettingText text); // For anything the other types can't describe. The text is only used for search. The view // returned is the one a following Hint is attached to, and the one search results lead to. SettingItem &Custom(SettingText text, std::function create); diff --git a/UI/SettingsPagesDialogScreen.cpp b/UI/SettingsPagesDialogScreen.cpp index a41e4b5bfc..4e3b7f53ff 100644 --- a/UI/SettingsPagesDialogScreen.cpp +++ b/UI/SettingsPagesDialogScreen.cpp @@ -425,6 +425,8 @@ bool SettingsPagesDialogScreen::SearchPage(UI::ViewGroup *parent, int settingsTa show[lastSetting] = true; } break; + case SettingType::Description: + break; default: lastSetting = i; show[i] = matches || sectionMatches; diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index a52038ec5e..8e71e9b903 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -918,7 +918,7 @@ Skip GPU Readbacks = Skip GPU Readbacks Smart 2D texture filtering = Smart 2D texture filtering Software Rendering = Software rendering (slow, accurate) Speed = Speed -Speed Hacks = Speed Hacks (can cause rendering errors!) +Speed Hacks = Speed hacks Stereo display shader = Stereo display shader Stereo rendering = Stereo rendering Stretch = Stretch