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 @@ +