feat: 实现定时器功能

This commit is contained in:
Xu 2025-08-06 19:21:33 +08:00
commit 3674afa6d1
5 changed files with 33 additions and 30 deletions

View file

@ -82,22 +82,22 @@
VerticalAlignment="Center"
Text="{x:Bind ViewModel.TimerLabelText, Mode=OneWay}" />
</Grid>
<Button Click="{x:Bind ViewModel.ToggleTimer}"
<Button Click="{x:Bind ViewModel.ToggleTimerFullscreen}"
IsEnabled="{x:Bind ViewModel.IsNotRunning, Mode=OneWay}">
<local:SimpleStackPanel Orientation="Horizontal"
Spacing="8">
<FontIcon FontSize="{StaticResource StandardIconSize}"
Glyph="&#xE740;" />
<TextBlock Text="{x:Bind ViewModel.TimerFullscreenButtonText, Mode=OneWay}" />
<TextBlock Text="{x:Bind ViewModel.TimerButtonText(x:False), Mode=OneWay}" />
</local:SimpleStackPanel>
</Button>
<Button Click="{x:Bind ViewModel.ToggleTimer}"
<Button Click="{x:Bind ViewModel.ToggleTimerWindowed}"
IsEnabled="{x:Bind ViewModel.IsNotRunning, Mode=OneWay}">
<local:SimpleStackPanel Orientation="Horizontal"
Spacing="8">
<FontIcon FontSize="{StaticResource StandardIconSize}"
Glyph="&#xE737;" />
<TextBlock Text="{x:Bind ViewModel.TimerWindowedButtonText, Mode=OneWay}" />
<TextBlock Text="{x:Bind ViewModel.TimerButtonText(x:True), Mode=OneWay}" />
</local:SimpleStackPanel>
</Button>
</local:SimpleStackPanel>

View file

@ -66,20 +66,10 @@ hstring HomeViewModel::TimerLabelText() const noexcept {
return to_hstring((int)std::ceil(ScalingService.SecondsLeft()));
}
hstring HomeViewModel::TimerFullscreenButtonText() const noexcept {
hstring HomeViewModel::TimerButtonText(bool windowedMode) const noexcept {
ResourceLoader resourceLoader =
ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID);
if (ScalingService::Get().IsTimerOn(false)) {
return resourceLoader.GetString(L"Home_Activation_Timer_Cancel");
} else {
return resourceLoader.GetString(L"Home_Activation_Timer_Start");
}
}
hstring HomeViewModel::TimerWindowedButtonText() const noexcept {
ResourceLoader resourceLoader =
ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID);
if (ScalingService::Get().IsTimerOn(true)) {
if (ScalingService::Get().IsTimerOn(windowedMode)) {
return resourceLoader.GetString(L"Home_Activation_Timer_Cancel");
} else {
return resourceLoader.GetString(L"Home_Activation_Timer_Start");
@ -90,13 +80,12 @@ bool HomeViewModel::IsNotRunning() const noexcept {
return !ScalingService::Get().IsScaling();
}
void HomeViewModel::ToggleTimer() const noexcept {
ScalingService& scalingService = ScalingService::Get();
if (scalingService.IsTimerOn()) {
scalingService.StopTimer();
} else {
scalingService.StartTimer(false);
}
void HomeViewModel::ToggleTimerFullscreen() const noexcept {
_ToggleTimer(false);
}
void HomeViewModel::ToggleTimerWindowed() const noexcept {
_ToggleTimer(true);
}
uint32_t HomeViewModel::Delay() const noexcept {
@ -633,8 +622,7 @@ void HomeViewModel::_ScalingService_IsTimerOnChanged(bool value, bool) {
RaisePropertyChanged(L"TimerProgressRingValue");
RaisePropertyChanged(L"TimerLabelText");
RaisePropertyChanged(L"TimerWindowedButtonText");
RaisePropertyChanged(L"TimerFullscreenButtonText");
RaisePropertyChanged(L"TimerButtonText");
RaisePropertyChanged(L"IsTimerOn");
}
@ -647,4 +635,13 @@ void HomeViewModel::_ScalingService_IsScalingChanged(bool) {
RaisePropertyChanged(L"IsNotRunning");
}
void HomeViewModel::_ToggleTimer(bool windowedMode) const noexcept {
ScalingService& scalingService = ScalingService::Get();
if (scalingService.IsTimerOn(windowedMode)) {
scalingService.StopTimer();
} else {
scalingService.StartTimer(windowedMode);
}
}
}

View file

@ -15,13 +15,17 @@ struct HomeViewModel : HomeViewModelT<HomeViewModel>, wil::notify_property_chang
hstring TimerLabelText() const noexcept;
hstring TimerButtonText(bool windowedMode) const noexcept;
hstring TimerFullscreenButtonText() const noexcept;
hstring TimerWindowedButtonText() const noexcept;
bool IsNotRunning() const noexcept;
void ToggleTimer() const noexcept;
void ToggleTimerFullscreen() const noexcept;
void ToggleTimerWindowed() const noexcept;
uint32_t Delay() const noexcept;
void Delay(uint32_t value);
@ -124,6 +128,8 @@ private:
void _ScalingService_IsScalingChanged(bool);
void _ToggleTimer(bool windowedMode) const noexcept;
::Magpie::Event<bool, bool>::EventRevoker _isTimerOnRevoker;
::Magpie::Event<double>::EventRevoker _timerTickRevoker;
::Magpie::Event<bool>::EventRevoker _isScalingChangedRevoker;

View file

@ -11,12 +11,12 @@ namespace Magpie {
Boolean IsTimerOn { get; };
Double TimerProgressRingValue { get; };
String TimerLabelText { get; };
String TimerFullscreenButtonText { get; };
String TimerWindowedButtonText { get; };
Boolean IsNotRunning { get; };
UInt32 Delay;
void ToggleTimer();
String TimerButtonText(Boolean windowedMode);
void ToggleTimerFullscreen();
void ToggleTimerWindowed();
String InitialToolbarStateDescription { get; };
Int32 FullscreenInitialToolbarState;

View file

@ -142,7 +142,7 @@ void ScalingService::_CountDownTimer_Tick(winrt::IInspectable const&, winrt::IIn
// 剩余时间在 10 ms 以内计时结束
if (timeLeft < 0.01) {
StopTimer();
_ScaleForegroundWindow(false);
_ScaleForegroundWindow(_isCurCountdownWindowedMode);
return;
}