diff --git a/ExtraIsland/Components/BetterCountdown/BetterCountdown.axaml.cs b/ExtraIsland/Components/BetterCountdown/BetterCountdown.axaml.cs index 52ba596..3fd5e04 100644 --- a/ExtraIsland/Components/BetterCountdown/BetterCountdown.axaml.cs +++ b/ExtraIsland/Components/BetterCountdown/BetterCountdown.axaml.cs @@ -39,6 +39,7 @@ void OnLoad() { SilentUpdater(); OnTimeChanged += DetectEvent; OnTimeChanged += DetectTimeUp; + OnTimeChanged += DetectTimeNode; Settings.OnAccuracyChanged += UpdateAccuracy; Settings.OnNoGapDisplayChanged += UpdateGap; LessonsService.PostMainTimerTicked += UpdateTime; @@ -115,7 +116,7 @@ void DetectEvent() { _dyAnimator.Update(_days,Settings.IsAnimationEnabled); } } - if ((_hours != span.Hours.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 1)) { + if ((_hours != span.Hours.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 1 | Settings.LatestNode is not null)) { int hourI = span.Hours; int hourCi = (int)Settings.Accuracy == 1 & Settings.IsCorrectorEnabled ? hourI + 1 : hourI; _hours = hourCi.ToString(); @@ -132,7 +133,7 @@ void DetectEvent() { _hrAnimator.Update(_hours,Settings.IsAnimationEnabled); } } - if ((_minutes != span.Minutes.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 2)) { + if ((_minutes != span.Minutes.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 2 | Settings.LatestNode is not null)) { int minuteI = span.Minutes; int minuteCi = (int)Settings.Accuracy == 2 & Settings.IsCorrectorEnabled ? minuteI + 1 : minuteI; _minutes = minuteCi.ToString(); @@ -156,7 +157,7 @@ void DetectEvent() { } } // ReSharper disable once InvertIf - if ((_seconds != span.Seconds.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 3)) { + if ((_seconds != span.Seconds.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 3 | Settings.LatestNode is not null)) { _seconds = span.Seconds.ToString(); string s = _seconds; if (s.Length == 1) { @@ -175,12 +176,12 @@ void SilentUpdater() { _days = (int)Settings.Accuracy == 0 ? (dayI + 1).ToString() : dayI.ToString(); _dyAnimator.SilentUpdate(_days); } - if ((_hours != span.Hours.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 1)) { + if ((_hours != span.Hours.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 1 | Settings.LatestNode is not null)) { int hourI = span.Hours; _hours = (int)Settings.Accuracy == 1 ? (hourI + 1).ToString() : hourI.ToString(); _hrAnimator.SilentUpdate(_hours); } - if ((_minutes != span.Minutes.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 2)) { + if ((_minutes != span.Minutes.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 2 | Settings.LatestNode is not null)) { int minuteI = span.Minutes; _minutes = (int)Settings.Accuracy == 2 ? (minuteI + 1).ToString() : minuteI.ToString(); string m = _minutes; @@ -190,7 +191,7 @@ void SilentUpdater() { _mnAnimator.SilentUpdate(m); } // ReSharper disable once InvertIf - if ((_seconds != span.Seconds.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 3)) { + if ((_seconds != span.Seconds.ToString() | _isAccurateChanged) & (Settings.IsNotify | (int)Settings.Accuracy >= 3 | Settings.LatestNode is not null)) { _seconds = span.Seconds.ToString(); string s = _seconds; if (s.Length == 1) { @@ -200,36 +201,58 @@ void SilentUpdater() { } } - void Notify() { - TimeUpNotification.Notify(string.Format(Settings.Message, Settings.Prefix, Settings.Suffix), + void TimeUpNotify() { + BetterCountdownNotification.Notify(Settings.Name, Settings.Message, 0, Settings.LeftIcon, Settings.RightIcon); Settings.IsNotified = true; } + void TimeNodeNotify(TimeNode tn) { + BetterCountdownNotification.Notify(Settings.Name, tn.NotifyText, 1, + Settings.LeftIcon, Settings.RightIcon, tn.ToString()); + _isTimeNodeDetected = true; + } void DetectTimeUp() { if (!Settings.IsNotify || Settings.IsNotified) return; if (Settings.IsCorrectorEnabled) { if ((int)Settings.Accuracy == 1 & _days == "0" & _hours == "1" & _minutes == "0" & _seconds == "-1") { - Notify(); + TimeUpNotify(); } if ((int)Settings.Accuracy == 2 & _days == "0" & _hours == "0" & _minutes == "1" & _seconds == "-1") { - Notify(); + TimeUpNotify(); } if ((int)Settings.Accuracy == 3 & _days == "0" & _hours == "0" & _minutes == "0" & _seconds == "0") { - Notify(); + TimeUpNotify(); } } else { if (_days == "0" & _hours == "0" & _minutes == "0" & _seconds == "0") { - Notify(); + TimeUpNotify(); } } } + bool _isTimeNodeDetected = false; + void DetectTimeNode() { + if (Settings.LatestNode is null || _isTimeNodeDetected) return; + TimeSpan span = EiUtils.GetDateTimeSpan(Now,Settings.TargetDateTime); + if (span.Days==Settings.LatestNode.CountdownTime.Days + && span.Hours==Settings.LatestNode.CountdownTime.Hours + && span.Minutes==Settings.LatestNode.CountdownTime.Minutes + && span.Seconds==Settings.LatestNode.CountdownTime.Seconds) { + TimeNodeNotify(Settings.LatestNode); + Settings.LatestNode = Settings.Times[Settings.Times.IndexOf(Settings.LatestNode) + 1]; + Console.WriteLine(Settings.LatestNode); + } + _isTimeNodeDetected = false; + } void OnAttachedToVisualTree(object? sender, VisualTreeAttachmentEventArgs visualTreeAttachmentEventArgs) { Dispatcher.UIThread.InvokeAsync(OnLoad); + Settings.Times.Config = Settings; + Settings.Times.GetLatest(); } void OnDetachedFromVisualTree(object? sender,VisualTreeAttachmentEventArgs visualTreeAttachmentEventArgs) { OnTimeChanged -= DetectEvent; OnTimeChanged -= DetectTimeUp; + OnTimeChanged -= DetectTimeNode; Settings.OnAccuracyChanged -= UpdateAccuracy; Settings.OnNoGapDisplayChanged -= UpdateGap; LessonsService.PostMainTimerTicked -= UpdateTime; diff --git a/ExtraIsland/Components/BetterCountdown/BetterCountdownConfig.cs b/ExtraIsland/Components/BetterCountdown/BetterCountdownConfig.cs index 6c1dd6e..12b9fdb 100644 --- a/ExtraIsland/Components/BetterCountdown/BetterCountdownConfig.cs +++ b/ExtraIsland/Components/BetterCountdown/BetterCountdownConfig.cs @@ -1,5 +1,6 @@ using System.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel; +using ExtraIsland.Shared; namespace ExtraIsland.Components; @@ -7,6 +8,9 @@ namespace ExtraIsland.Components; public class BetterCountdownConfig : ObservableObject { public BetterCountdownConfig() { Separators.PropertyChanged += (_,_) => OnPropertyChanged(); + Console.WriteLine("Bcd Consturct!"); + Times = []; + Times.Config = this; TargetDateTime = DateTime.Now.AddMinutes(1); } @@ -17,6 +21,8 @@ public DateTime TargetDateTime { if (_targetDateTime == value) return; _targetDateTime = value; IsNotified = false; + + Times.GetLatest(); } } @@ -81,11 +87,22 @@ public CountdownAccuracy Accuracy { public bool IsFocusedModeEnabled { get; set; } public bool IsNotify {get; set;} - public string Message { get; set; } = "{0} 已结束"; + public string Name {get; set;} = "倒计时名称"; + public string Message { get; set; } = ""; public string LeftIcon { get; set; } = "\uE352"; public string RightIcon { get; set; } = ""; + + //TimeNodeObservableCollection _times; + + public TimeNodeObservableCollection Times { + get; + set; + } + + public TimeNode? LatestNode { get; set; } + } public class CountdownSeparatorConfigs : ObservableObject { @@ -136,4 +153,15 @@ public enum CountdownAccuracy { Minute, [Description("秒")] Second +} + +public partial class TimeNode: ObservableObject { + + [ObservableProperty] + TimeSpan _countdownTime = new TimeSpan(1, 1 ,1 ,1 ); + public bool IsNotify { get; set; } + public String NotifyText { get; set; } = "距离{n}仅剩{t}"; + public override string ToString() { + return CountdownTime.Days + "天" + CountdownTime.Hours + "小时" + CountdownTime.Minutes+"分"+CountdownTime.Seconds+"秒"; + } } \ No newline at end of file diff --git a/ExtraIsland/Components/BetterCountdown/BetterCountdownSettings.axaml b/ExtraIsland/Components/BetterCountdown/BetterCountdownSettings.axaml index de2ec27..f9bd34c 100644 --- a/ExtraIsland/Components/BetterCountdown/BetterCountdownSettings.axaml +++ b/ExtraIsland/Components/BetterCountdown/BetterCountdownSettings.axaml @@ -82,6 +82,13 @@ + + + + + @@ -100,6 +107,13 @@ + + + + + @@ -163,18 +177,18 @@ + Description="启用后,倒计时到后将进行提醒,"> - - - - - + + + + +