@@ -13,7 +13,7 @@ public class SnackbarMessageQueue : ISnackbarMessageQueue, IDisposable
13
13
{
14
14
private readonly TimeSpan _messageDuration ;
15
15
private readonly HashSet < Snackbar > _pairedSnackbars = new HashSet < Snackbar > ( ) ;
16
- private readonly Queue < SnackbarMessageQueueItem > _snackbarMessages = new Queue < SnackbarMessageQueueItem > ( ) ;
16
+ private readonly LinkedList < SnackbarMessageQueueItem > _snackbarMessages = new LinkedList < SnackbarMessageQueueItem > ( ) ;
17
17
private readonly ManualResetEvent _disposedEvent = new ManualResetEvent ( false ) ;
18
18
private readonly ManualResetEvent _pausedEvent = new ManualResetEvent ( false ) ;
19
19
private readonly ManualResetEvent _messageWaitingEvent = new ManualResetEvent ( false ) ;
@@ -193,7 +193,7 @@ public void Enqueue(object content, bool neverConsiderToBeDuplicate)
193
193
{
194
194
if ( content == null ) throw new ArgumentNullException ( nameof ( content ) ) ;
195
195
196
- _snackbarMessages . Enqueue ( new SnackbarMessageQueueItem ( content ) ) ;
196
+ _snackbarMessages . AddLast ( new SnackbarMessageQueueItem ( content ) ) ;
197
197
_messageWaitingEvent . Set ( ) ;
198
198
}
199
199
@@ -202,11 +202,11 @@ public void Enqueue(object content, object actionContent, Action actionHandler)
202
202
Enqueue ( content , actionContent , actionHandler , false ) ;
203
203
}
204
204
205
- public void Enqueue ( object content , object actionContent , Action actionHandler , bool neverConsiderToBeDuplicate )
205
+ public void Enqueue ( object content , object actionContent , Action actionHandler , bool promote )
206
206
{
207
207
if ( content == null ) throw new ArgumentNullException ( nameof ( content ) ) ;
208
208
209
- _snackbarMessages . Enqueue ( new SnackbarMessageQueueItem ( content , actionContent , actionHandler ) ) ;
209
+ _snackbarMessages . AddLast ( new SnackbarMessageQueueItem ( content , actionContent , actionHandler ) ) ;
210
210
_messageWaitingEvent . Set ( ) ;
211
211
}
212
212
@@ -217,7 +217,7 @@ public void Enqueue<TArgument>(object content, object actionContent, Action<TArg
217
217
}
218
218
219
219
public void Enqueue < TArgument > ( object content , object actionContent , Action < TArgument > actionHandler ,
220
- TArgument actionArgument , bool neverConsiderToBeDuplicate )
220
+ TArgument actionArgument , bool promote )
221
221
{
222
222
if ( content == null ) throw new ArgumentNullException ( nameof ( content ) ) ;
223
223
@@ -230,11 +230,32 @@ public void Enqueue<TArgument>(object content, object actionContent, Action<TArg
230
230
}
231
231
232
232
var argumentType = actionArgument != null ? typeof ( TArgument ) : null ;
233
- _snackbarMessages . Enqueue ( new SnackbarMessageQueueItem ( content , actionContent , actionHandler ,
234
- actionArgument , argumentType , neverConsiderToBeDuplicate ) ) ;
233
+
234
+ var snackbarMessageQueueItem = new SnackbarMessageQueueItem ( content , actionContent , actionHandler ,
235
+ actionArgument , argumentType , promote ) ;
236
+ if ( promote )
237
+ InsertAsLastNotPromotedNode ( snackbarMessageQueueItem ) ;
238
+ else
239
+ _snackbarMessages . AddLast ( snackbarMessageQueueItem ) ;
240
+
235
241
_messageWaitingEvent . Set ( ) ;
236
242
}
237
243
244
+ private void InsertAsLastNotPromotedNode ( SnackbarMessageQueueItem snackbarMessageQueueItem )
245
+ {
246
+ var node = _snackbarMessages . First ;
247
+ while ( node != null )
248
+ {
249
+ if ( ! node . Value . IsPromoted )
250
+ {
251
+ _snackbarMessages . AddBefore ( node , snackbarMessageQueueItem ) ;
252
+ return ;
253
+ }
254
+ node = node . Next ;
255
+ }
256
+ _snackbarMessages . AddLast ( snackbarMessageQueueItem ) ;
257
+ }
258
+
238
259
private async void PumpAsync ( )
239
260
{
240
261
while ( ! _isDisposed )
@@ -264,9 +285,10 @@ private async void PumpAsync()
264
285
//show message
265
286
if ( snackbar != null )
266
287
{
267
- var message = _snackbarMessages . Dequeue ( ) ;
288
+ var message = _snackbarMessages . First . Value ;
289
+ _snackbarMessages . RemoveFirst ( ) ;
268
290
if ( _latestShownItem == null
269
- || message . NeverConsiderToBeDuplicate
291
+ || message . IsPromoted
270
292
|| ! Equals ( _latestShownItem . Item1 . Content , message . Content )
271
293
|| ! Equals ( _latestShownItem . Item1 . ActionContent , message . ActionContent )
272
294
|| _latestShownItem . Item2 <= DateTime . Now . Subtract ( _messageDuration ) )
@@ -359,7 +381,7 @@ await Task.WhenAny(
359
381
durationPassedWaitHandle
360
382
} ) ;
361
383
} ) ,
362
- Task . Factory . StartNew ( ( ) => actionClickWaitHandle . WaitOne ( ) ) ) ;
384
+ Task . Factory . StartNew ( actionClickWaitHandle . WaitOne ) ) ;
363
385
}
364
386
365
387
private static void DoActionCallback ( SnackbarMessageQueueItem messageQueueItem )
@@ -403,7 +425,7 @@ public void Dispose()
403
425
_isDisposed = true ;
404
426
_disposedEvent . Set ( ) ;
405
427
_disposedEvent . Dispose ( ) ;
406
- _pausedEvent . Dispose ( ) ;
428
+ _pausedEvent . Dispose ( ) ;
407
429
}
408
430
}
409
431
}
0 commit comments