@@ -34,6 +34,7 @@ public bool ShowMessageTypeCount
3434 public object Source { get ; private set ; }
3535 public string SourceName { get ; private set ; }
3636 public IList < Message > Messages { get ; private set ; }
37+ public int CurrentMessageIndex { get ; private set ; }
3738
3839
3940 public MessageBanner ( object source , string sourceName , bool showMessageTypeCount = true )
@@ -79,6 +80,18 @@ public MessageBanner(IList<Message> messages, object source, string sourceName,
7980 overflow = Overflow . Hidden ,
8081 unityTextAlign = TextAnchor . MiddleLeft ,
8182 unityFontDefinition = new StyleFontDefinition ( ResCache . GetMonospaceFontAsset ( ) ) ,
83+ //transitionDuration = new List<TimeValue>
84+ //{
85+ // new TimeValue(_messageContentTransitionDuration, TimeUnit.Millisecond)
86+ //},
87+ //transitionTimingFunction = new List<EasingFunction>
88+ //{
89+ // new EasingFunction(EasingMode.EaseInOut)
90+ //},
91+ //transitionProperty = new List<StylePropertyName>
92+ //{
93+ // new StylePropertyName("scale"),
94+ //},
8295 }
8396 } ;
8497 Add ( ContentLabel ) ;
@@ -104,6 +117,7 @@ public MessageBanner(IList<Message> messages, object source, string sourceName,
104117 RegisterCallback < ClickEvent > ( OnClick ) ;
105118 RegisterCallback < ContextClickEvent > ( OnContextClick ) ;
106119
120+ InitializeMessageSwitch ( ) ;
107121 }
108122
109123 private Image CreateMessageTypeImage ( Texture defaultIcon , float iconSize )
@@ -154,7 +168,9 @@ public void SetMessages(IList<Message> messages)
154168
155169 public void Refresh ( )
156170 {
157- Message message = ( Messages ? . Count ?? 0 ) > 0 ? Messages [ Messages . Count - 1 ] : null ;
171+ CurrentMessageIndex = ( Messages ? . Count ?? 0 ) - 1 ;
172+
173+ Message message = CurrentMessageIndex > - 1 ? Messages [ CurrentMessageIndex ] : null ;
158174 SetMessage ( message ) ;
159175
160176 Messages . CountByType ( out int infoCount , out int warningCount , out int errorCount ) ;
@@ -222,5 +238,70 @@ private void OnContextClick(ContextClickEvent evt)
222238
223239 menu . ShowAsContext ( ) ;
224240 }
241+
242+
243+ #region Message Transition
244+
245+ private uint _messageSwitchInterval = 3000 ;
246+ /// <summary>
247+ /// 消息轮播时的切换间隔(毫秒)。
248+ /// 若为0,则不自动切换消息。
249+ /// </summary>
250+ public uint MessageSwitchInterval
251+ {
252+ get => _messageSwitchInterval ;
253+ set
254+ {
255+ if ( _messageSwitchInterval == value )
256+ {
257+ return ;
258+ }
259+
260+ bool prevDisabled = IsMessageSwitchDisabled ( ) ;
261+ _messageSwitchInterval = value ;
262+ if ( ! IsMessageSwitchDisabled ( ) && prevDisabled )
263+ {
264+ InitializeMessageSwitch ( ) ;
265+ }
266+ }
267+ }
268+
269+ public bool IsMessageSwitchDisabled ( )
270+ {
271+ return MessageSwitchInterval < 1 ;
272+ }
273+
274+
275+ private void InitializeMessageSwitch ( )
276+ {
277+ if ( IsMessageSwitchDisabled ( ) )
278+ {
279+ return ;
280+ }
281+
282+ schedule . Execute ( SwitchToNextMessage )
283+ . Every ( MessageSwitchInterval )
284+ . StartingIn ( MessageSwitchInterval )
285+ . Until ( IsMessageSwitchDisabled ) ;
286+ }
287+
288+ private void SwitchToNextMessage ( )
289+ {
290+ if ( ( Messages ? . Count ?? 0 ) < 1 )
291+ {
292+ CurrentMessageIndex = - 1 ;
293+ return ;
294+ }
295+
296+ CurrentMessageIndex ++ ;
297+ if ( CurrentMessageIndex == Messages . Count )
298+ {
299+ CurrentMessageIndex = 0 ;
300+ }
301+
302+ SetMessage ( Messages [ CurrentMessageIndex ] ) ;
303+ }
304+
305+ #endregion
225306 }
226307}
0 commit comments