Change name to search delay & Support plugin search delay

This commit is contained in:
Jack251970 2025-03-18 11:12:58 +08:00
parent 2c949d6c92
commit 933582b620
9 changed files with 98 additions and 40 deletions

View file

@ -51,7 +51,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
metadata.Disabled = settings.Disabled;
metadata.Priority = settings.Priority;
metadata.SearchDelayTime = settings.SearchDelayTime;
metadata.SearchDelay = settings.SearchDelay;
}
else
{
@ -63,7 +63,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
ActionKeywords = metadata.ActionKeywords,
Disabled = metadata.Disabled,
Priority = metadata.Priority,
SearchDelayTime = metadata.SearchDelayTime,
SearchDelay = metadata.SearchDelay,
};
}
}
@ -76,7 +76,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public string Version { get; set; }
public List<string> ActionKeywords { get; set; } // a reference of the action keywords from plugin manager
public int Priority { get; set; }
public int SearchDelayTime { get; set; }
public int SearchDelay { get; set; }
/// <summary>
/// Used only to save the state of the plugin in settings

View file

@ -285,16 +285,19 @@ namespace Flow.Launcher.Infrastructure.UserSettings
OnPropertyChanged();
}
}
public int SearchInputDelay { get; set; } = 120;
public int SearchDelay { get; set; } = 120;
// TODO: Remove debug codes.
public const int SearchDelayInterval = 30 * 60;
[JsonIgnore]
public List<int> SearchInputDelayRange { get; } = new()
public List<int> SearchDelayRange { get; } = new()
{
30, 60, 90, 120, 150, 180, 210, 240, 270, 300
};
[JsonIgnore]
public List<int> PluginSearchInputDelayRange { get; } = new()
public List<int> PluginSearchDelayRange { get; } = new()
{
0, 30, 60, 90, 120, 150
};

View file

@ -34,7 +34,7 @@ namespace Flow.Launcher.Plugin
public List<string> ActionKeywords { get; set; }
public int SearchDelayTime { get; set; }
public int SearchDelay { get; set; }
public string IcoPath { get; set;}

View file

@ -880,8 +880,18 @@ namespace Flow.Launcher
conversion => (sender, eventArg) => conversion(sender, eventArg),
add => QueryTextBox.TextChanged += add,
remove => QueryTextBox.TextChanged -= remove)
.Throttle(TimeSpan.FromMilliseconds(_settings.SearchInputDelay))
.Do(@event => Dispatcher.Invoke(() => PerformSearchQuery((TextBox)@event.Sender)))
.Throttle(TimeSpan.FromMilliseconds(_settings.SearchDelay * 10))
.Do(@event => Dispatcher.Invoke(() => PerformSearchQuery(0, (TextBox)@event.Sender)))
.Throttle(TimeSpan.FromMilliseconds(Settings.SearchDelayInterval))
.Do(@event => Dispatcher.Invoke(() => PerformSearchQuery(30, (TextBox)@event.Sender)))
.Throttle(TimeSpan.FromMilliseconds(Settings.SearchDelayInterval))
.Do(@event => Dispatcher.Invoke(() => PerformSearchQuery(60, (TextBox)@event.Sender)))
.Throttle(TimeSpan.FromMilliseconds(Settings.SearchDelayInterval))
.Do(@event => Dispatcher.Invoke(() => PerformSearchQuery(90, (TextBox)@event.Sender)))
.Throttle(TimeSpan.FromMilliseconds(Settings.SearchDelayInterval))
.Do(@event => Dispatcher.Invoke(() => PerformSearchQuery(120, (TextBox)@event.Sender)))
.Throttle(TimeSpan.FromMilliseconds(Settings.SearchDelayInterval))
.Do(@event => Dispatcher.Invoke(() => PerformSearchQuery(150, (TextBox)@event.Sender)))
.Subscribe();
}
else
@ -893,14 +903,19 @@ namespace Flow.Launcher
private void QueryTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = (TextBox)sender;
PerformSearchQuery(textBox);
PerformSearchQuery(null, textBox);
}
private void PerformSearchQuery(TextBox textBox)
// If delayInputTime is null, we will query plugins with all plugin search delay times
private void PerformSearchQuery(int? searchDelay, TextBox textBox)
{
var text = textBox.Text;
_viewModel.QueryText = text;
_viewModel.Query();
// Only update query text when search delay is null or 0
if (searchDelay.GetValueOrDefault(0) == 0)
{
var text = textBox.Text;
_viewModel.QueryText = text;
}
_viewModel.Query(searchDelay);
}
#endregion

View file

@ -38,8 +38,8 @@
Cursor="Hand"
DockPanel.Dock="Right"
FontWeight="Bold"
ItemsSource="{Binding PluginSearchInputDelayRange}"
SelectedItem="{Binding PluginSearchDelayTime}"
ItemsSource="{Binding PluginSearchDelayRange}"
SelectedItem="{Binding PluginSearchDelay}"
ToolTip="{DynamicResource pluginSearchDelayTooltip}" />
</DockPanel>
</Border>

View file

@ -139,7 +139,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
}
}
public IEnumerable<int> SearchInputDelayRange => Settings.SearchInputDelayRange;
public IEnumerable<int> SearchDelayRange => Settings.SearchDelayRange;
public List<LastQueryModeData> LastQueryModes { get; } =
DropdownDataGeneric<LastQueryMode>.GetValues<LastQueryModeData>("LastQuery");

View file

@ -189,8 +189,8 @@
Sub="{DynamicResource searchDelayTimeToolTip}">
<ComboBox
Width="100"
ItemsSource="{Binding SearchInputDelayRange}"
SelectedItem="{Binding Settings.SearchInputDelay}" />
ItemsSource="{Binding SearchDelayRange}"
SelectedItem="{Binding Settings.SearchDelay}" />
</cc:Card>
</cc:CardGroup>

View file

@ -274,14 +274,14 @@ namespace Flow.Launcher.ViewModel
{
if (SelectedIsFromQueryResults())
{
QueryResults(isReQuery: true);
QueryResults(null, isReQuery: true);
}
}
public void ReQuery(bool reselect)
{
BackToQueryResults();
QueryResults(isReQuery: true, reSelect: reselect);
QueryResults(null, isReQuery: true, reSelect: reselect);
}
[RelayCommand]
@ -630,14 +630,14 @@ namespace Flow.Launcher.ViewModel
{
// re-query is done in QueryText's setter method
QueryText = queryText;
Query();
Query(null);
// set to false so the subsequent set true triggers
// PropertyChanged and MoveQueryTextToEnd is called
QueryTextCursorMovedToEnd = false;
}
else if (isReQuery)
{
Query(isReQuery: true);
Query(null, isReQuery: true);
}
QueryTextCursorMovedToEnd = true;
@ -690,12 +690,12 @@ namespace Flow.Launcher.ViewModel
// http://stackoverflow.com/posts/25895769/revisions
if (string.IsNullOrEmpty(QueryText))
{
Query();
Query(null);
}
else
{
QueryText = string.Empty;
Query();
Query(null);
}
}
@ -979,19 +979,27 @@ namespace Flow.Launcher.ViewModel
#region Query
public void Query(bool isReQuery = false)
public void Query(int? searchDelay, bool isReQuery = false)
{
if (SelectedIsFromQueryResults())
{
QueryResults(isReQuery);
QueryResults(searchDelay, isReQuery);
}
else if (ContextMenuSelected())
{
QueryContextMenu();
// Only query history when search delay is null or 0
if (searchDelay.GetValueOrDefault(0) == 0)
{
QueryContextMenu();
}
}
else if (HistorySelected())
{
QueryHistory();
// Only query history when search delay is null or 0
if (searchDelay.GetValueOrDefault(0) == 0)
{
QueryHistory();
}
}
}
@ -1081,7 +1089,7 @@ namespace Flow.Launcher.ViewModel
private readonly IReadOnlyList<Result> _emptyResult = new List<Result>();
private async void QueryResults(bool isReQuery = false, bool reSelect = true)
private async void QueryResults(int? searchDelay, bool isReQuery = false, bool reSelect = true)
{
_updateSource?.Cancel();
@ -1157,12 +1165,44 @@ namespace Flow.Launcher.ViewModel
// plugins is ICollection, meaning LINQ will get the Count and preallocate Array
var tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
Task[] tasks;
if (searchDelay.HasValue)
{
false => QueryTask(plugin, reSelect),
true => Task.CompletedTask
}).ToArray();
var searchDelayValue = searchDelay.Value;
tasks = plugins.Select(plugin => (plugin.Metadata.Disabled || plugin.Metadata.SearchDelay != searchDelayValue) switch
{
false => QueryTask(plugin, reSelect),
true => Task.CompletedTask
}).ToArray();
// TODO: Remove debug codes.
System.Diagnostics.Debug.WriteLine($"Querying {searchDelayValue}ms");
foreach (var plugin in plugins)
{
if (!(plugin.Metadata.Disabled || plugin.Metadata.SearchDelay != searchDelayValue))
{
System.Diagnostics.Debug.WriteLine($"Querying {plugin.Metadata.Name}");
}
}
}
else
{
tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
{
false => QueryTask(plugin, reSelect),
true => Task.CompletedTask
}).ToArray();
// TODO: Remove debug codes.
System.Diagnostics.Debug.WriteLine($"Querying null ms");
foreach (var plugin in plugins)
{
if (!plugin.Metadata.Disabled)
{
System.Diagnostics.Debug.WriteLine($"Querying {plugin.Metadata.Name}");
}
}
}
try
{

View file

@ -84,16 +84,16 @@ namespace Flow.Launcher.ViewModel
}
}
public IEnumerable<int> PluginSearchInputDelayRange { get; } =
Ioc.Default.GetRequiredService<Settings>().PluginSearchInputDelayRange;
public IEnumerable<int> PluginSearchDelayRange { get; } =
Ioc.Default.GetRequiredService<Settings>().PluginSearchDelayRange;
public int PluginSearchDelayTime
public int PluginSearchDelay
{
get => PluginPair.Metadata.SearchDelayTime;
get => PluginPair.Metadata.SearchDelay;
set
{
PluginPair.Metadata.SearchDelayTime = value;
PluginSettingsObject.SearchDelayTime = value;
PluginPair.Metadata.SearchDelay = value;
PluginSettingsObject.SearchDelay = value;
}
}