added a message collection function for adding multiple msgs at once. only one notification will be raised for a batch of msgs

This commit is contained in:
David Sparer
2017-02-03 15:02:16 -07:00
parent 5437967218
commit 27d0467e08
2 changed files with 51 additions and 7 deletions

View File

@@ -56,5 +56,37 @@ namespace mRemoteNGTests.Messages
_messageCollector.AddMessage(message);
Assert.That(wasCalled, Is.True);
}
[Test]
public void BatchAddAddsAllItems()
{
var msg1 = Substitute.For<IMessage>();
var msg2 = Substitute.For<IMessage>();
var msgCollection = new[] {msg1, msg2};
_messageCollector.AddMessages(msgCollection);
Assert.That(_messageCollector.Messages, Is.EquivalentTo(msgCollection));
}
[Test]
public void OneNotificationRaisedForBatchAdd()
{
var notificationCount = 0;
_messageCollector.CollectionChanged += (sender, args) => notificationCount++;
var msg1 = Substitute.For<IMessage>();
var msg2 = Substitute.For<IMessage>();
_messageCollector.AddMessages(new[] { msg1, msg2 });
Assert.That(notificationCount, Is.EqualTo(1));
}
[Test]
public void EventNotRaisedIfMsgIsntUnique()
{
var notificationCount = 0;
var msg1 = Substitute.For<IMessage>();
_messageCollector.AddMessage(msg1);
_messageCollector.CollectionChanged += (sender, args) => notificationCount++;
_messageCollector.AddMessage(msg1);
Assert.That(notificationCount, Is.EqualTo(0));
}
}
}

View File

@@ -1,7 +1,8 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
namespace mRemoteNG.Messages
@@ -14,8 +15,7 @@ namespace mRemoteNG.Messages
public MessageCollector()
{
_messageList = new ObservableCollection<IMessage>();
((INotifyCollectionChanged) _messageList).CollectionChanged += RaiseCollectionChangedEvent;
_messageList = new List<IMessage>();
}
public void AddMessage(MessageClass messageClass, string messageText, bool onlyLog = false)
@@ -26,8 +26,20 @@ namespace mRemoteNG.Messages
public void AddMessage(IMessage message)
{
if (_messageList.Contains(message)) return;
_messageList.Add(message);
AddMessages(new [] {message});
}
public void AddMessages(IEnumerable<IMessage> messages)
{
var newMessages = new List<IMessage>();
foreach (var message in messages)
{
if (_messageList.Contains(message)) continue;
_messageList.Add(message);
newMessages.Add(message);
}
if (newMessages.Any())
RaiseCollectionChangedEvent(NotifyCollectionChangedAction.Add, newMessages);
}
public void AddExceptionMessage(string message, Exception ex, MessageClass msgClass = MessageClass.ErrorMsg, bool logOnly = true)
@@ -47,9 +59,9 @@ namespace mRemoteNG.Messages
public event NotifyCollectionChangedEventHandler CollectionChanged;
private void RaiseCollectionChangedEvent(object sender, NotifyCollectionChangedEventArgs args)
private void RaiseCollectionChangedEvent(NotifyCollectionChangedAction action, IList items)
{
CollectionChanged?.Invoke(this, args);
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(action, items));
}
}
}