From 198442621a94de8aabf26e56d58dec751080c294 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 21 Jan 2025 14:37:14 +0800
Subject: [PATCH] Add support for record key
---
Flow.Launcher.Plugin/Result.cs | 17 +++++++++++++++
Flow.Launcher/Storage/TopMostRecord.cs | 18 ++++++++++++----
Flow.Launcher/Storage/UserSelectedRecord.cs | 24 ++++++++++++++++-----
3 files changed, 50 insertions(+), 9 deletions(-)
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index c6ca81cf3..bb005752e 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -185,6 +185,16 @@ namespace Flow.Launcher.Plugin
TitleHighlightData = TitleHighlightData,
OriginQuery = OriginQuery,
PluginDirectory = PluginDirectory,
+ ContextData = ContextData,
+ PluginID = PluginID,
+ TitleToolTip = TitleToolTip,
+ SubTitleToolTip = SubTitleToolTip,
+ PreviewPanel = PreviewPanel,
+ ProgressBar = ProgressBar,
+ ProgressBarColor = ProgressBarColor,
+ Preview = Preview,
+ AddSelectedCount = AddSelectedCount,
+ RecordKey = RecordKey
};
}
@@ -252,6 +262,13 @@ namespace Flow.Launcher.Plugin
///
public const int MaxScore = int.MaxValue;
+ ///
+ /// The key to identify the record. This is used when FL checks whether the result is the topmost record. Or FL calculates the hashcode of the result for user selected records.
+ /// This can be useful when your plugin will change the Title or SubTitle of the result dynamically.
+ /// If the plugin does not specific this, FL just uses Title and SubTitle to identify this result.
+ ///
+ public string RecordKey { get; set; } = string.Empty;
+
///
/// Info of the preview section of a
///
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index cbd0b88fc..05cf01401 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -33,7 +33,8 @@ namespace Flow.Launcher.Storage
{
PluginID = result.PluginID,
Title = result.Title,
- SubTitle = result.SubTitle
+ SubTitle = result.SubTitle,
+ RecordKey = result.RecordKey
};
records.AddOrUpdate(result.OriginQuery.RawQuery, record, (key, oldValue) => record);
}
@@ -49,12 +50,21 @@ namespace Flow.Launcher.Storage
public string Title { get; set; }
public string SubTitle { get; set; }
public string PluginID { get; set; }
+ public string RecordKey { get; set; }
public bool Equals(Result r)
{
- return Title == r.Title
- && SubTitle == r.SubTitle
- && PluginID == r.PluginID;
+ if (string.IsNullOrEmpty(RecordKey) || string.IsNullOrEmpty(r.RecordKey))
+ {
+ return Title == r.Title
+ && SubTitle == r.SubTitle
+ && PluginID == r.PluginID;
+ }
+ else
+ {
+ return RecordKey == r.RecordKey
+ && PluginID == r.PluginID;
+ }
}
}
}
diff --git a/Flow.Launcher/Storage/UserSelectedRecord.cs b/Flow.Launcher/Storage/UserSelectedRecord.cs
index d6405005d..6da36747d 100644
--- a/Flow.Launcher/Storage/UserSelectedRecord.cs
+++ b/Flow.Launcher/Storage/UserSelectedRecord.cs
@@ -15,7 +15,6 @@ namespace Flow.Launcher.Storage
[JsonInclude, JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public Dictionary records { get; private set; }
-
public UserSelectedRecord()
{
recordsWithQuery = new Dictionary();
@@ -45,8 +44,15 @@ namespace Flow.Launcher.Storage
private static int GenerateResultHashCode(Result result)
{
- int hashcode = GenerateStaticHashCode(result.Title);
- return GenerateStaticHashCode(result.SubTitle, hashcode);
+ if (string.IsNullOrEmpty(result.RecordKey))
+ {
+ int hashcode = GenerateStaticHashCode(result.Title);
+ return GenerateStaticHashCode(result.SubTitle, hashcode);
+ }
+ else
+ {
+ return GenerateStaticHashCode(result.RecordKey);
+ }
}
private static int GenerateQueryAndResultHashCode(Query query, Result result)
@@ -58,8 +64,16 @@ namespace Flow.Launcher.Storage
int hashcode = GenerateStaticHashCode(query.ActionKeyword);
hashcode = GenerateStaticHashCode(query.Search, hashcode);
- hashcode = GenerateStaticHashCode(result.Title, hashcode);
- hashcode = GenerateStaticHashCode(result.SubTitle, hashcode);
+
+ if (string.IsNullOrEmpty(result.RecordKey))
+ {
+ hashcode = GenerateStaticHashCode(result.Title, hashcode);
+ hashcode = GenerateStaticHashCode(result.SubTitle, hashcode);
+ }
+ else
+ {
+ hashcode = GenerateStaticHashCode(result.RecordKey, hashcode);
+ }
return hashcode;
}