From a240988f0e3b0ceb5e25351e3d486fccf5f71a25 Mon Sep 17 00:00:00 2001 From: 117il3 <117il3@users.noreply.github.com> Date: Tue, 15 Sep 2026 16:33:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=95=88=E6=9E=9C=E7=BB=84):=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=95=88=E6=9E=9C=E5=99=A8=E5=90=AF=E7=94=A8/?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在效果组编辑器中为每个效果新增一个开关按钮,用于临时禁用该效果,无需将其删除。 - EffectItem 新增 enabled 字段(默认 true)。仅在禁用时写入缩放模式配置 (enabled: false),因此现有配置文件不受影响。 - 装配运行期效果链时跳过被禁用的效果。ValidateFrameGenerationChain 改为通过 concept 鸭子类型判断自动忽略禁用项,避免任何调用点漏过滤而误报 「一组内存在多个补帧效果」。 - 被禁用的效果即使文件缺失也不再阻止启动,便于用户绕过损坏的效果器, 而不必直接删除它。 - 界面上该行整体变暗、按钮图标切换,悬停提示按当前状态显示「禁用」或「启用」。 生效时机为下次启动缩放;运行中的效果链不会实时重建。 --- src/Magpie.Core/include/ScalingOptions.h | 14 ++++++++ src/Magpie/Resources.language-en-US.resw | 6 ++++ src/Magpie/Resources.language-zh-Hans.resw | 6 ++++ src/Magpie/Resources.language-zh-Hant.resw | 6 ++++ src/Magpie/ScalingMode.h | 3 ++ src/Magpie/ScalingModeEffectItem.cpp | 41 ++++++++++++++++++++++ src/Magpie/ScalingModeEffectItem.h | 13 +++++++ src/Magpie/ScalingModeEffectItem.idl | 6 ++++ src/Magpie/ScalingModesPage.xaml | 15 ++++++++ src/Magpie/ScalingModesService.cpp | 8 +++++ src/Magpie/ScalingService.cpp | 13 +++++++ 11 files changed, 131 insertions(+) diff --git a/src/Magpie.Core/include/ScalingOptions.h b/src/Magpie.Core/include/ScalingOptions.h index 8356f8504..bc35e7bd5 100644 --- a/src/Magpie.Core/include/ScalingOptions.h +++ b/src/Magpie.Core/include/ScalingOptions.h @@ -142,12 +142,26 @@ struct FrameGenerationChainValidation { bool HasFrameGeneration() const noexcept { return count != 0; } }; +// 配置层的 EffectItem 带 enabled 字段,运行期的 EffectOption 没有。 +// 被禁用的效果不参与渲染,因此也不应参与补帧冲突校验。这里用概念做鸭子类型 +// 判断,让所有调用点(含 UI 的 CanAddEffect 与运行期装配)都自动忽略禁用项, +// 不会因为漏过滤而误报「一组内存在多个补帧效果」。 +template +concept HasEnabledFlag = requires(T effect) { + effect.enabled ? 0 : 1; +}; + template FrameGenerationChainValidation ValidateFrameGenerationChain( const EffectRange& effects ) noexcept { FrameGenerationChainValidation result; for (const auto& effect : effects) { + if constexpr (HasEnabledFlag) { + if (!effect.enabled) { + continue; + } + } const FrameGenerationEffectKind kind = ClassifyFrameGenerationEffect(effect.name); if (kind == FrameGenerationEffectKind::None) { diff --git a/src/Magpie/Resources.language-en-US.resw b/src/Magpie/Resources.language-en-US.resw index c4dc7d469..2e933761c 100644 --- a/src/Magpie/Resources.language-en-US.resw +++ b/src/Magpie/Resources.language-en-US.resw @@ -336,6 +336,12 @@ Add effect + + Disable + + + Enable + Delete diff --git a/src/Magpie/Resources.language-zh-Hans.resw b/src/Magpie/Resources.language-zh-Hans.resw index 4b26dafa0..fbc9b0f3e 100644 --- a/src/Magpie/Resources.language-zh-Hans.resw +++ b/src/Magpie/Resources.language-zh-Hans.resw @@ -336,6 +336,12 @@ 添加效果器 + + 禁用 + + + 启用 + 删除 diff --git a/src/Magpie/Resources.language-zh-Hant.resw b/src/Magpie/Resources.language-zh-Hant.resw index dfea64b2a..5cf4708e8 100644 --- a/src/Magpie/Resources.language-zh-Hant.resw +++ b/src/Magpie/Resources.language-zh-Hant.resw @@ -303,6 +303,12 @@ 新增效果器 + + 停用 + + + 啟用 + 刪除 diff --git a/src/Magpie/ScalingMode.h b/src/Magpie/ScalingMode.h index 1796d0193..e1f6e8fb7 100644 --- a/src/Magpie/ScalingMode.h +++ b/src/Magpie/ScalingMode.h @@ -10,6 +10,9 @@ struct EffectItem { std::pair scale = { 1.0f,1.0f }; bool isRecoveryInvalid = false; std::string recoveryOriginal; + // 临时禁用:效果仍保留在配置与列表中,但不参与渲染。 + // 放在末尾以免影响任何按位置聚合初始化的写法。 + bool enabled = true; bool HasScale() const noexcept { return scalingType != ScalingType::Normal || diff --git a/src/Magpie/ScalingModeEffectItem.cpp b/src/Magpie/ScalingModeEffectItem.cpp index 41e661bf1..1d966993b 100644 --- a/src/Magpie/ScalingModeEffectItem.cpp +++ b/src/Magpie/ScalingModeEffectItem.cpp @@ -93,6 +93,47 @@ hstring ScalingModeEffectItem::IssueDescription() const noexcept { _Data().isRecoveryInvalid ? L"ScalingModes_RecoveryInvalid_Description" : L"ScalingModes_MissingEffect_Description"); } +bool ScalingModeEffectItem::IsEffectEnabled() const noexcept { + if (_IsRemoved()) { + return true; + } + + return _Data().enabled; +} + +void ScalingModeEffectItem::IsEffectEnabled(bool value) { + if (_IsRemoved()) { + return; + } + + EffectItem& data = _Data(); + if (data.enabled == value) { + return; + } + + // 与删除效果一致,不阻止用户禁用全部效果;此时运行期会按空效果组报错 + data.enabled = value; + RaisePropertyChanged(L"IsEffectEnabled"); + RaisePropertyChanged(L"RowOpacity"); + RaisePropertyChanged(L"ToggleToolTip"); + AppSettings::Get().SaveAsync(); +} + +double ScalingModeEffectItem::RowOpacity() const noexcept { + return IsEffectEnabled() ? 1.0 : 0.45; +} + +hstring ScalingModeEffectItem::ToggleToolTip() const noexcept { + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); + return resourceLoader.GetString(IsEffectEnabled() + ? L"ScalingModes_EffectDisable" : L"ScalingModes_EffectEnable"); +} + +void ScalingModeEffectItem::ToggleEnabled() { + IsEffectEnabled(!IsEffectEnabled()); +} + IVector ScalingModeEffectItem::ScalingTypes() noexcept { using Windows::ApplicationModel::Resources::ResourceLoader; ResourceLoader resourceLoader = diff --git a/src/Magpie/ScalingModeEffectItem.h b/src/Magpie/ScalingModeEffectItem.h index 901b5f7df..8ef25419b 100644 --- a/src/Magpie/ScalingModeEffectItem.h +++ b/src/Magpie/ScalingModeEffectItem.h @@ -47,6 +47,19 @@ struct ScalingModeEffectItem : ScalingModeEffectItemT, bool HasParameters() const noexcept; hstring IssueDescription() const noexcept; + // 临时禁用:效果保留在列表中,但不进入渲染链 + bool IsEffectEnabled() const noexcept; + void IsEffectEnabled(bool value); + + // 禁用时整行变暗 + double RowOpacity() const noexcept; + + // 悬停提示:当前启用则提示「禁用」,当前禁用则提示「启用」 + hstring ToggleToolTip() const noexcept; + + // 按钮点击:切换启用/禁用 + void ToggleEnabled(); + IVector ScalingTypes() noexcept; int ScalingType() const noexcept; diff --git a/src/Magpie/ScalingModeEffectItem.idl b/src/Magpie/ScalingModeEffectItem.idl index 5733b6054..9f59cb12b 100644 --- a/src/Magpie/ScalingModeEffectItem.idl +++ b/src/Magpie/ScalingModeEffectItem.idl @@ -13,6 +13,12 @@ namespace Magpie { Boolean CanScale { get; }; Boolean HasParameters { get; }; + Boolean IsEffectEnabled; + Double RowOpacity { get; }; + String ToggleToolTip { get; }; + + void ToggleEnabled(); + IVector ScalingTypes { get; }; Int32 ScalingType; Boolean IsShowScaleFactors { get; }; diff --git a/src/Magpie/ScalingModesPage.xaml b/src/Magpie/ScalingModesPage.xaml index b22d8f6b1..a37f624c2 100644 --- a/src/Magpie/ScalingModesPage.xaml +++ b/src/Magpie/ScalingModesPage.xaml @@ -454,6 +454,7 @@ @@ -465,6 +466,20 @@ +