feat(desktop): limit local messages stored

This commit is contained in:
Anna 2020-11-11 18:05:05 -05:00
parent 900fa642a0
commit 033d4add13
5 changed files with 59 additions and 6 deletions

View File

@ -8,6 +8,7 @@
<ResourceDictionary> <ResourceDictionary>
<local:DoubleConverter x:Key="DoubleConverter" /> <local:DoubleConverter x:Key="DoubleConverter" />
<local:UShortConverter x:Key="UShortConverter" /> <local:UShortConverter x:Key="UShortConverter" />
<local:UIntConverter x:Key="UIntConverter" />
<local:SenderPlayerConverter x:Key="SenderPlayerConverter" /> <local:SenderPlayerConverter x:Key="SenderPlayerConverter" />
<ResourceDictionary.MergedDictionaries> <ResourceDictionary.MergedDictionaries>

View File

@ -24,6 +24,7 @@
<TabItem Header="Window"> <TabItem Header="Window">
<Grid Margin="8"> <Grid Margin="8">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
@ -43,8 +44,15 @@
Text="{Binding Config.FontSize, Converter={StaticResource DoubleConverter}}" Text="{Binding Config.FontSize, Converter={StaticResource DoubleConverter}}"
ui:ControlHelper.Header="Log font size" ui:ControlHelper.Header="Log font size"
Width="200" /> Width="200" />
<TextBox Grid.Row="2"
Grid.Column="0"
ui:ControlHelper.Header="Messages to store locally"
HorizontalAlignment="Left"
PreviewTextInput="NumericInputFilter"
Text="{Binding Config.LocalBacklogMessages, Converter={StaticResource UIntConverter}}"
Width="200" />
<Button Grid.Row="3" <Button Grid.Row="4"
HorizontalAlignment="Right" HorizontalAlignment="Right"
Click="Save_Click"> Click="Save_Click">
Save Save

View File

@ -37,6 +37,8 @@ namespace XIVChat_Desktop {
public ushort BacklogMessages { get; set; } = 500; public ushort BacklogMessages { get; set; } = 500;
public uint LocalBacklogMessages { get; set; } = 10_000;
#region io #region io
private static string FilePath() => Path.Join( private static string FilePath() => Path.Join(
@ -156,6 +158,10 @@ namespace XIVChat_Desktop {
this.CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, messages, index)); this.CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, messages, index));
} }
private void NotifyRemoveItemsAt(IList messages, int index) {
this.CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, messages, index));
}
public void RepopulateMessages(IEnumerable<ServerMessage> mainMessages) { public void RepopulateMessages(IEnumerable<ServerMessage> mainMessages) {
this.Messages.Clear(); this.Messages.Clear();
@ -170,7 +176,7 @@ namespace XIVChat_Desktop {
private int lastSequence = -1; private int lastSequence = -1;
private int insertAt; private int insertAt;
public void AddReversedChunk(ServerMessage[] messages, int sequence) { public void AddReversedChunk(ServerMessage[] messages, int sequence, Configuration config) {
if (sequence != this.lastSequence) { if (sequence != this.lastSequence) {
this.lastSequence = sequence; this.lastSequence = sequence;
this.insertAt = this.Messages.Count; this.insertAt = this.Messages.Count;
@ -181,17 +187,31 @@ namespace XIVChat_Desktop {
.ToList(); .ToList();
this.Messages.InsertRange(this.insertAt, filtered); this.Messages.InsertRange(this.insertAt, filtered);
this.NotifyAddItemsAt(filtered, this.insertAt); this.NotifyAddItemsAt(filtered, this.insertAt);
this.Prune(config);
} }
public void AddMessage(ServerMessage message) { public void AddMessage(ServerMessage message, Configuration config) {
if (message.Channel != 0 && !this.Filter.Allowed(message)) { if (message.Channel != 0 && !this.Filter.Allowed(message)) {
return; return;
} }
this.Messages.Add(message); this.Messages.Add(message);
this.NotifyAdd(message); this.NotifyAdd(message);
this.Prune(config);
}
private void Prune(Configuration config) {
var diff = this.Messages.Count - config.LocalBacklogMessages;
if (diff <= 0) {
return;
}
var removed = this.Messages.Take((int)diff).ToList();
this.Messages.RemoveRange(0, (int)diff);
this.NotifyRemoveItemsAt(removed, 0);
} }
public void ClearMessages() { public void ClearMessages() {

View File

@ -33,6 +33,20 @@ namespace XIVChat_Desktop {
} }
} }
public class UIntConverter : IValueConverter {
public object? Convert(object value, Type targetType, object parameter, CultureInfo culture) {
return value.ToString();
}
public object? ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
if (uint.TryParse(value.ToString(), out var res)) {
return res;
}
return null;
}
}
public class SenderPlayerConverter : IValueConverter { public class SenderPlayerConverter : IValueConverter {
public object? Convert(object value, Type targetType, object parameter, CultureInfo culture) { public object? Convert(object value, Type targetType, object parameter, CultureInfo culture) {
if (!(value is ServerMessage.SenderPlayer sender)) { if (!(value is ServerMessage.SenderPlayer sender)) {

View File

@ -87,7 +87,12 @@ namespace XIVChat_Desktop {
this.Messages.InsertRange(this.insertAt, messages); this.Messages.InsertRange(this.insertAt, messages);
// add message to each tab if the filter allows for it // add message to each tab if the filter allows for it
foreach (var tab in this.App.Config.Tabs) { foreach (var tab in this.App.Config.Tabs) {
tab.AddReversedChunk(messages, sequence); tab.AddReversedChunk(messages, sequence, this.App.Config);
}
var diff = this.Messages.Count - this.App.Config.LocalBacklogMessages;
if (diff > 0) {
this.Messages.RemoveRange(0, (int)diff);
} }
// scroll to the bottom if previously at the bottom // scroll to the bottom if previously at the bottom
@ -105,7 +110,12 @@ namespace XIVChat_Desktop {
this.Messages.Add(message); this.Messages.Add(message);
// add message to each tab if the filter allows for it // add message to each tab if the filter allows for it
foreach (var tab in this.App.Config.Tabs) { foreach (var tab in this.App.Config.Tabs) {
tab.AddMessage(message); tab.AddMessage(message, this.App.Config);
}
var diff = this.Messages.Count - this.App.Config.LocalBacklogMessages;
if (diff > 0) {
this.Messages.RemoveRange(0, (int)diff);
} }
// scroll to the bottom if previously at the bottom // scroll to the bottom if previously at the bottom