diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
index 268dc20b8c7..f0e4a79fcf6 100644
--- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
@@ -9,7 +9,7 @@ namespace Flow.Launcher.Infrastructure.Storage
///
/// Serialize object using json format.
///
- public class JsonStrorage
+ public class JsonStrorage where T : new()
{
private readonly JsonSerializerOptions _serializerSettings;
private T _data;
@@ -76,7 +76,7 @@ private void LoadDefault()
BackupOriginFile();
}
- _data = JsonSerializer.Deserialize("{}", _serializerSettings);
+ _data = new T();
Save();
}
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 09e69f6d81a..c92ef49562a 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
+using System.Text.Json.Serialization;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Storage
@@ -8,20 +9,24 @@ namespace Flow.Launcher.Storage
// todo this class is not thread safe.... but used from multiple threads.
public class TopMostRecord
{
- private Dictionary records = new Dictionary();
+ ///
+ /// You should not directly access this field
+ ///
+ /// It is public due to System.Text.Json limitation in version 3.1
+ ///
+ ///
+ /// TODO: Set it to private
+ public Dictionary records { get; set; } = new Dictionary();
internal bool IsTopMost(Result result)
{
- if (records.Count == 0)
+ if (records.Count == 0 || !records.ContainsKey(result.OriginQuery.RawQuery))
{
return false;
}
- // since this dictionary should be very small (or empty) going over it should be pretty fast.
- return records.Any(o => o.Value.Title == result.Title
- && o.Value.SubTitle == result.SubTitle
- && o.Value.PluginID == result.PluginID
- && o.Key == result.OriginQuery.RawQuery);
+ // since this dictionary should be very small (or empty) going over it should be pretty fast.
+ return records[result.OriginQuery.RawQuery].Equals(result);
}
internal void Remove(Result result)
@@ -53,5 +58,12 @@ public class Record
public string Title { get; set; }
public string SubTitle { get; set; }
public string PluginID { get; set; }
+
+ public bool Equals(Result r)
+ {
+ return Title == r.Title
+ && SubTitle == r.SubTitle
+ && PluginID == r.PluginID;
+ }
}
}
diff --git a/Flow.Launcher/Storage/UserSelectedRecord.cs b/Flow.Launcher/Storage/UserSelectedRecord.cs
index c7ffe1a1d40..bc7a2da73ce 100644
--- a/Flow.Launcher/Storage/UserSelectedRecord.cs
+++ b/Flow.Launcher/Storage/UserSelectedRecord.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Text.Json.Serialization;
using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Plugin;
@@ -6,14 +7,27 @@ namespace Flow.Launcher.Storage
{
public class UserSelectedRecord
{
- private Dictionary records = new Dictionary();
+ ///
+ /// You should not directly access this field
+ ///
+ /// It is public due to System.Text.Json limitation in version 3.1
+ ///
+ ///
+ /// TODO: Set it to private
+ [JsonPropertyName("records")]
+ public Dictionary records { get; set; }
+
+ public UserSelectedRecord()
+ {
+ records = new Dictionary();
+ }
public void Add(Result result)
{
var key = result.ToString();
- if (records.TryGetValue(key, out int value))
+ if (records.ContainsKey(key))
{
- records[key] = value + 1;
+ records[key]++;
}
else
{