支持分别设置全屏和窗口模式缩放的工具栏初始状态 (#1205)

This commit is contained in:
Xu 2025-07-22 19:06:42 +08:00 committed by GitHub
commit f882504df6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 151 additions and 34 deletions

View file

@ -133,8 +133,10 @@ ScalingError Renderer::Initialize(HWND hwndAttach, OverlayOptions& overlayOption
return ScalingError::ScalingFailedGeneral;
}
if (!ScalingWindow::Get().Options().Is3DGameMode()) {
_overlayDrawer.ToolbarState(ScalingWindow::Get().Options().initialToolbarState);
const ScalingOptions& options = ScalingWindow::Get().Options();
if (!options.Is3DGameMode()) {
_overlayDrawer.ToolbarState(options.IsWindowedMode() ?
options.windowedInitialToolbarState : options.fullscreenInitialToolbarState);
}
_hKeyboardHook.reset(SetWindowsHookEx(WH_KEYBOARD_LL, _LowLevelKeyboardHook, NULL, 0));

View file

@ -107,7 +107,8 @@ void ScalingOptions::Log() const noexcept {
multiMonitorUsage: {}
cursorInterpolationMode: {}
duplicateFrameDetectionMode: {}
initialToolbarState: {}
fullscreenInitialToolbarState: {}
windowedInitialToolbarState: {}
screenshotsDir: {}
effects: {})",
IsWindowedMode(),
@ -138,7 +139,8 @@ void ScalingOptions::Log() const noexcept {
(int)multiMonitorUsage,
(int)cursorInterpolationMode,
(int)duplicateFrameDetectionMode,
(int)initialToolbarState,
(int)fullscreenInitialToolbarState,
(int)windowedInitialToolbarState,
StrHelper::UTF16ToUTF8(screenshotsDir.native()),
LogEffects(effects)
));

View file

@ -186,7 +186,8 @@ struct ScalingOptions {
MultiMonitorUsage multiMonitorUsage = MultiMonitorUsage::Closest;
CursorInterpolationMode cursorInterpolationMode = CursorInterpolationMode::NearestNeighbor;
DuplicateFrameDetectionMode duplicateFrameDetectionMode = DuplicateFrameDetectionMode::Dynamic;
ToolbarState initialToolbarState = ToolbarState::AutoHide;
ToolbarState fullscreenInitialToolbarState = ToolbarState::AutoHide;
ToolbarState windowedInitialToolbarState = ToolbarState::AutoHide;
float initialWindowedScaleFactor = 0.0f;
std::filesystem::path screenshotsDir;

View file

@ -621,8 +621,10 @@ bool AppSettings::_Save(const _AppSettingsData& data) noexcept {
writer.Key("overlay");
writer.StartObject();
writer.Key("initialToolbarState");
writer.Uint((uint32_t)_initialToolbarState);
writer.Key("fullscreenInitialToolbarState");
writer.Uint((uint32_t)_fullscreenInitialToolbarState);
writer.Key("windowedInitialToolbarState");
writer.Uint((uint32_t)_windowedInitialToolbarState);
writer.Key("screenshotsDir");
writer.String(StrHelper::UTF16ToUTF8(_screenshotsDir.native()).c_str());
writer.Key("windows");
@ -847,11 +849,27 @@ void AppSettings::_LoadSettings(const rapidjson::GenericObject<true, rapidjson::
auto overlayObj = overlayNode->value.GetObj();
uint32_t initialToolbarState = (uint32_t)ToolbarState::AutoHide;
JsonHelper::ReadUInt(overlayObj, "initialToolbarState", initialToolbarState);
if (initialToolbarState >= (uint32_t)ToolbarState::COUNT) {
if (JsonHelper::ReadUInt(overlayObj, "fullscreenInitialToolbarState", initialToolbarState, true)) {
if (initialToolbarState >= (uint32_t)ToolbarState::COUNT) {
initialToolbarState = (uint32_t)ToolbarState::AutoHide;
}
_fullscreenInitialToolbarState = (ToolbarState)initialToolbarState;
initialToolbarState = (uint32_t)ToolbarState::AutoHide;
JsonHelper::ReadUInt(overlayObj, "windowedInitialToolbarState", initialToolbarState);
if (initialToolbarState >= (uint32_t)ToolbarState::COUNT) {
initialToolbarState = (uint32_t)ToolbarState::AutoHide;
}
_windowedInitialToolbarState = (ToolbarState)initialToolbarState;
} else {
// v0.12.0-preview1 中工具栏初始状态不区分全屏和窗口模式缩放
JsonHelper::ReadUInt(overlayObj, "initialToolbarState", initialToolbarState);
if (initialToolbarState >= (uint32_t)ToolbarState::COUNT) {
initialToolbarState = (uint32_t)ToolbarState::AutoHide;
}
_fullscreenInitialToolbarState = (ToolbarState)initialToolbarState;
_windowedInitialToolbarState = (ToolbarState)initialToolbarState;
}
_initialToolbarState = (ToolbarState)initialToolbarState;
{
std::wstring value;

View file

@ -50,7 +50,8 @@ struct _AppSettingsData {
float _minFrameRate = 10.0f;
ToolbarState _initialToolbarState = ToolbarState::AutoHide;
ToolbarState _fullscreenInitialToolbarState = ToolbarState::AutoHide;
ToolbarState _windowedInitialToolbarState = ToolbarState::AutoHide;
// 为空表示 FOLDERID_Screenshots支持绝对路径和相对路径
std::filesystem::path _screenshotsDir;
@ -310,12 +311,21 @@ public:
SaveAsync();
}
ToolbarState InitialToolbarState() const noexcept {
return _initialToolbarState;
ToolbarState FullscreenInitialToolbarState() const noexcept {
return _fullscreenInitialToolbarState;
}
void InitialToolbarState(ToolbarState value) noexcept {
_initialToolbarState = value;
void FullscreenInitialToolbarState(ToolbarState value) noexcept {
_fullscreenInitialToolbarState = value;
SaveAsync();
}
ToolbarState WindowedInitialToolbarState() const noexcept {
return _windowedInitialToolbarState;
}
void WindowedInitialToolbarState(ToolbarState value) noexcept {
_windowedInitialToolbarState = value;
SaveAsync();
}

View file

@ -107,16 +107,33 @@
</local:ShortcutControl.Action>
</local:ShortcutControl>
</local:SettingsCard>
<local:SettingsCard x:Uid="Home_Toolbar_InitialState">
<local:SettingsCard.HeaderIcon>
<local:SettingsExpander x:Uid="Home_Toolbar_InitialState">
<local:SettingsExpander.HeaderIcon>
<FontIcon Glyph="&#xE840;" />
</local:SettingsCard.HeaderIcon>
<ComboBox SelectedIndex="{x:Bind ViewModel.InitialToolbarState, Mode=TwoWay}">
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_Off" />
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_AlwaysShow" />
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_AutoHide" />
</ComboBox>
</local:SettingsCard>
</local:SettingsExpander.HeaderIcon>
<local:SettingsExpander.Content>
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind ViewModel.InitialToolbarStateDescription, Mode=OneWay}" />
</local:SettingsExpander.Content>
<local:SettingsExpander.Items>
<local:SettingsCard x:Uid="Home_Toolbar_InitialState_Fullscreen">
<ComboBox DropDownOpened="ComboBox_DropDownOpened"
SelectedIndex="{x:Bind ViewModel.FullscreenInitialToolbarState, Mode=TwoWay}">
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_Off" />
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_AlwaysShow" />
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_AutoHide" />
</ComboBox>
</local:SettingsCard>
<local:SettingsCard x:Uid="Home_Toolbar_InitialState_Windowed">
<ComboBox DropDownOpened="ComboBox_DropDownOpened"
SelectedIndex="{x:Bind ViewModel.WindowedInitialToolbarState, Mode=TwoWay}">
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_Off" />
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_AlwaysShow" />
<ComboBoxItem x:Uid="Home_Toolbar_InitialState_AutoHide" />
</ComboBox>
</local:SettingsCard>
</local:SettingsExpander.Items>
</local:SettingsExpander>
<local:SettingsCard x:Uid="Home_Toolbar_ScreenshotSaveDirectory"
Click="{x:Bind ViewModel.OpenScreenshotSaveDirectory}"
Description="{x:Bind ViewModel.ScreenshotSaveDirectory, Mode=OneWay}"

View file

@ -141,11 +141,36 @@ void HomeViewModel::RemindMeLater() {
ShowUpdateCard(false);
}
int HomeViewModel::InitialToolbarState() const noexcept {
return (int)AppSettings::Get().InitialToolbarState();
hstring HomeViewModel::InitialToolbarStateDescription() const noexcept {
static constexpr std::array STATE_STRING_IDS = {
L"Home_Toolbar_InitialState_Off/Content",
L"Home_Toolbar_InitialState_AlwaysShow/Content",
L"Home_Toolbar_InitialState_AutoHide/Content"
};
const ToolbarState fullscreenInitialState =
AppSettings::Get().FullscreenInitialToolbarState();
const ToolbarState windowedInitialState =
AppSettings::Get().WindowedInitialToolbarState();
const ResourceLoader resourceLoader =
ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID);
if (fullscreenInitialState == windowedInitialState) {
return resourceLoader.GetString(STATE_STRING_IDS[(uint32_t)fullscreenInitialState]);
} else {
return hstring(StrHelper::Concat(
resourceLoader.GetString(STATE_STRING_IDS[(uint32_t)fullscreenInitialState]),
L" | ",
resourceLoader.GetString(STATE_STRING_IDS[(uint32_t)windowedInitialState]))
);
}
}
void HomeViewModel::InitialToolbarState(int value) {
int HomeViewModel::FullscreenInitialToolbarState() const noexcept {
return (int)AppSettings::Get().FullscreenInitialToolbarState();
}
void HomeViewModel::FullscreenInitialToolbarState(int value) {
if (value < 0) {
return;
}
@ -153,12 +178,34 @@ void HomeViewModel::InitialToolbarState(int value) {
const ToolbarState state = (ToolbarState)value;
AppSettings& settings = AppSettings::Get();
if (settings.InitialToolbarState() == state) {
if (settings.FullscreenInitialToolbarState() == state) {
return;
}
settings.InitialToolbarState(state);
RaisePropertyChanged(L"InitialToolbarState");
settings.FullscreenInitialToolbarState(state);
RaisePropertyChanged(L"FullscreenInitialToolbarState");
RaisePropertyChanged(L"InitialToolbarStateDescription");
}
int HomeViewModel::WindowedInitialToolbarState() const noexcept {
return (int)AppSettings::Get().WindowedInitialToolbarState();
}
void HomeViewModel::WindowedInitialToolbarState(int value) {
if (value < 0) {
return;
}
const ToolbarState state = (ToolbarState)value;
AppSettings& settings = AppSettings::Get();
if (settings.WindowedInitialToolbarState() == state) {
return;
}
settings.WindowedInitialToolbarState(state);
RaisePropertyChanged(L"WindowedInitialToolbarState");
RaisePropertyChanged(L"InitialToolbarStateDescription");
}
hstring HomeViewModel::ScreenshotSaveDirectory() const noexcept {

View file

@ -39,8 +39,13 @@ struct HomeViewModel : HomeViewModelT<HomeViewModel>, wil::notify_property_chang
void RemindMeLater();
int InitialToolbarState() const noexcept;
void InitialToolbarState(int value);
hstring InitialToolbarStateDescription() const noexcept;
int FullscreenInitialToolbarState() const noexcept;
void FullscreenInitialToolbarState(int value);
int WindowedInitialToolbarState() const noexcept;
void WindowedInitialToolbarState(int value);
hstring ScreenshotSaveDirectory() const noexcept;

View file

@ -16,7 +16,9 @@ namespace Magpie {
void ToggleTimer();
Int32 InitialToolbarState;
String InitialToolbarStateDescription { get; };
Int32 FullscreenInitialToolbarState;
Int32 WindowedInitialToolbarState;
String ScreenshotSaveDirectory { get; };
void OpenScreenshotSaveDirectory();
void ChangeScreenshotSaveDirectory();

View file

@ -994,4 +994,10 @@
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>Switch to Windowed Scaling</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>Fullscreen scaling</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>Windowed scaling</value>
</data>
</root>

View file

@ -994,4 +994,10 @@
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>切换到窗口模式缩放</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>全屏模式缩放</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>窗口模式缩放</value>
</data>
</root>

View file

@ -425,7 +425,8 @@ ScalingError ScalingService::_StartScaleImpl(HWND hWnd, const Profile& profile,
options.minFrameRate = settings.MinFrameRate();
}
options.initialToolbarState = settings.InitialToolbarState();
options.fullscreenInitialToolbarState = settings.FullscreenInitialToolbarState();
options.windowedInitialToolbarState = settings.WindowedInitialToolbarState();
options.screenshotsDir = settings.ScreenshotsDir();
if (options.screenshotsDir.empty()) {
// 回落到使用当前目录