@@ -30,7 +30,7 @@ private class MouseNotOverManagedWaitHandle : IDisposable
30
30
private readonly ManualResetEvent _disposedWaitHandle = new ManualResetEvent ( false ) ;
31
31
private Action _cleanUp ;
32
32
private bool _isWaitHandleDisposed ;
33
- private readonly object _waitHandleGate = new object ( ) ;
33
+ private readonly object _waitHandleGate = new object ( ) ;
34
34
35
35
public MouseNotOverManagedWaitHandle ( UIElement uiElement )
36
36
{
@@ -124,7 +124,7 @@ private DurationMonitor(
124
124
125
125
Task . Factory . StartNew ( ( ) =>
126
126
{
127
- //keep upping the completion time in case it's paused...
127
+ //keep upping the completion time in case it's paused...
128
128
while ( DateTime . Now < _completionTime && ! ceaseWaitHandle . WaitOne ( granularity ) )
129
129
{
130
130
if ( pausedWaitHandle . WaitOne ( TimeSpan . Zero ) )
@@ -194,8 +194,7 @@ public void Enqueue(object content, bool neverConsiderToBeDuplicate)
194
194
{
195
195
if ( content == null ) throw new ArgumentNullException ( nameof ( content ) ) ;
196
196
197
- _snackbarMessages . AddLast ( new SnackbarMessageQueueItem ( content ) ) ;
198
- _messageWaitingEvent . Set ( ) ;
197
+ Enqueue ( content , null , null , null , false , neverConsiderToBeDuplicate ) ;
199
198
}
200
199
201
200
public void Enqueue ( object content , object actionContent , Action actionHandler )
@@ -206,34 +205,48 @@ public void Enqueue(object content, object actionContent, Action actionHandler)
206
205
public void Enqueue ( object content , object actionContent , Action actionHandler , bool promote )
207
206
{
208
207
if ( content == null ) throw new ArgumentNullException ( nameof ( content ) ) ;
209
-
210
- _snackbarMessages . AddLast ( new SnackbarMessageQueueItem ( content , actionContent , actionHandler ) ) ;
211
- _messageWaitingEvent . Set ( ) ;
208
+ if ( actionContent == null ) throw new ArgumentNullException ( nameof ( actionContent ) ) ;
209
+ if ( actionHandler == null ) throw new ArgumentNullException ( nameof ( actionHandler ) ) ;
210
+
211
+ Enqueue ( content , actionContent , _ => actionHandler ( ) , promote , false , false ) ;
212
212
}
213
213
214
214
public void Enqueue < TArgument > ( object content , object actionContent , Action < TArgument > actionHandler ,
215
215
TArgument actionArgument )
216
216
{
217
- Enqueue < TArgument > ( content , actionContent , actionHandler , actionArgument , false ) ;
217
+ Enqueue ( content , actionContent , actionHandler , actionArgument , false , false ) ;
218
218
}
219
219
220
220
public void Enqueue < TArgument > ( object content , object actionContent , Action < TArgument > actionHandler ,
221
- TArgument actionArgument , bool promote )
221
+ TArgument actionArgument , bool promote , bool neverConsiderToBeDuplicate )
222
222
{
223
223
if ( content == null ) throw new ArgumentNullException ( nameof ( content ) ) ;
224
224
225
- if ( ( actionContent != null || actionHandler != null || actionArgument != null )
226
- &&
227
- actionContent == null && actionHandler == null && actionArgument == null )
225
+ if ( actionContent == null ^ actionHandler == null )
228
226
{
229
227
throw new ArgumentException ( "All action arguments must be provided if any are provided." ,
230
- nameof ( actionContent ) ) ;
228
+ actionContent != null ? nameof ( actionContent ) : nameof ( actionHandler ) ) ;
231
229
}
232
230
233
- var argumentType = actionArgument != null ? typeof ( TArgument ) : null ;
231
+ Action < object > handler = actionHandler != null
232
+ ? new Action < object > ( argument => actionHandler ( ( TArgument ) argument ) )
233
+ : null ;
234
+ Enqueue ( content , actionContent , handler , actionArgument , promote , neverConsiderToBeDuplicate ) ;
235
+ }
236
+
237
+ public void Enqueue ( object content , object actionContent , Action < object > actionHandler ,
238
+ object actionArgument , bool promote , bool neverConsiderToBeDuplicate )
239
+ {
240
+ if ( content == null ) throw new ArgumentNullException ( nameof ( content ) ) ;
241
+
242
+ if ( actionContent == null ^ actionHandler == null )
243
+ {
244
+ throw new ArgumentException ( "All action arguments must be provided if any are provided." ,
245
+ actionContent != null ? nameof ( actionContent ) : nameof ( actionHandler ) ) ;
246
+ }
234
247
235
248
var snackbarMessageQueueItem = new SnackbarMessageQueueItem ( content , actionContent , actionHandler ,
236
- actionArgument , argumentType , promote ) ;
249
+ actionArgument , promote , neverConsiderToBeDuplicate ) ;
237
250
if ( promote )
238
251
InsertAsLastNotPromotedNode ( snackbarMessageQueueItem ) ;
239
252
else
@@ -261,7 +274,7 @@ private async void PumpAsync()
261
274
{
262
275
while ( ! _isDisposed )
263
276
{
264
- var eventId = WaitHandle . WaitAny ( new WaitHandle [ ] { _disposedEvent , _messageWaitingEvent } ) ;
277
+ var eventId = WaitHandle . WaitAny ( new WaitHandle [ ] { _disposedEvent , _messageWaitingEvent } ) ;
265
278
if ( eventId == 0 ) continue ;
266
279
var exemplar = _pairedSnackbars . FirstOrDefault ( ) ;
267
280
if ( exemplar == null )
@@ -281,7 +294,7 @@ private async void PumpAsync()
281
294
var message = _snackbarMessages . First . Value ;
282
295
_snackbarMessages . RemoveFirst ( ) ;
283
296
if ( _latestShownItem == null
284
- || message . IsPromoted
297
+ || message . IgnoreDuplicate
285
298
|| ! Equals ( _latestShownItem . Item1 . Content , message . Content )
286
299
|| ! Equals ( _latestShownItem . Item1 . ActionContent , message . ActionContent )
287
300
|| _latestShownItem . Item2 <= DateTime . Now . Subtract ( _messageDuration ) )
@@ -331,7 +344,7 @@ await Task.Run(async () =>
331
344
_pausedEvent , durationPassedWaitHandle , _disposedEvent ) ;
332
345
333
346
//wait until time span completed (including pauses and mouse overs), or the action is clicked
334
- await WaitForCompletionAsync ( mouseNotOverManagedWaitHandle , durationPassedWaitHandle , actionClickWaitHandle ) ;
347
+ await WaitForCompletionAsync ( mouseNotOverManagedWaitHandle , durationPassedWaitHandle , actionClickWaitHandle ) ;
335
348
336
349
//close message on snackbar
337
350
await
@@ -399,18 +412,8 @@ private static void DoActionCallback(SnackbarMessageQueueItem messageQueueItem)
399
412
{
400
413
try
401
414
{
402
- var action = messageQueueItem . ActionHandler as Action ;
403
- if ( action != null )
404
- {
405
- action ( ) ;
406
- return ;
407
- }
415
+ messageQueueItem . ActionHandler ( messageQueueItem . ActionArgument ) ;
408
416
409
- if ( messageQueueItem . ArgumentType == null ) return ;
410
-
411
- var genericType = typeof ( Action < > ) . MakeGenericType ( messageQueueItem . ArgumentType ) ;
412
- var method = genericType . GetMethod ( "Invoke" ) ;
413
- method . Invoke ( messageQueueItem . ActionHandler , new [ ] { messageQueueItem . ActionArgument } ) ;
414
417
}
415
418
catch ( Exception exc )
416
419
{
@@ -419,7 +422,7 @@ private static void DoActionCallback(SnackbarMessageQueueItem messageQueueItem)
419
422
Trace . WriteLine ( exc . StackTrace ) ;
420
423
421
424
throw ;
422
- }
425
+ }
423
426
}
424
427
425
428
private static SnackbarMessage Create ( SnackbarMessageQueueItem messageQueueItem )
@@ -433,10 +436,10 @@ private static SnackbarMessage Create(SnackbarMessageQueueItem messageQueueItem)
433
436
434
437
public void Dispose ( )
435
438
{
436
- _isDisposed = true ;
439
+ _isDisposed = true ;
437
440
_disposedEvent . Set ( ) ;
438
441
_disposedEvent . Dispose ( ) ;
439
- _pausedEvent . Dispose ( ) ;
442
+ _pausedEvent . Dispose ( ) ;
440
443
}
441
444
}
442
445
}
0 commit comments