Implement PluginSearch TextBox & ContentControl Lazy Load

This commit is contained in:
Hongtao Zhang 2021-12-11 11:52:43 -06:00
parent 1f64dc8e94
commit ee0f8ef22a
4 changed files with 56 additions and 6 deletions

View file

@ -901,6 +901,7 @@
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="73" />
<RowDefinition Height="73" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
@ -912,12 +913,23 @@
Text="{DynamicResource plugin}"
TextAlignment="left" />
</Border>
<Border Grid.Row="1" Padding="5,18,0,0">
<TextBox
Name="pluginFilterTxb"
Margin="0,5,0,0"
FontSize="30"
Text=""
TextAlignment="left"
TextChanged="OnPluginSearchTextChanged"
/>
</Border>
<Border
Grid.Row="1"
Grid.Row="2"
Grid.Column="0"
Padding="0,0,0,0"
Background="{DynamicResource Color01B}">
<ListBox
Name="pluginList"
Width="Auto"
Margin="5,0,0,0"
Padding="0,0,7,0"
@ -942,7 +954,7 @@
Padding="0"
Background="Transparent"
FlowDirection="RightToLeft"
IsExpanded="{Binding Mode=TwoWay, Path=IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem, Mode=FindAncestor}}"
IsExpanded="{Binding Mode=TwoWay, Path=IsExpanded}"
Style="{StaticResource ExpanderStyle1}">
<Expander.Header>
<Grid

View file

@ -13,6 +13,8 @@ using ModernWpf;
using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Interop;
@ -41,9 +43,11 @@ namespace Flow.Launcher
DataContext = viewModel;
this.viewModel = viewModel;
API = api;
}
#region General
private void OnLoaded(object sender, RoutedEventArgs e)
{
RefreshMaximizeRestoreButton();
@ -52,6 +56,9 @@ namespace Flow.Launcher
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = RenderMode.SoftwareOnly;
pluginListView = (CollectionView) CollectionViewSource.GetDefaultView(pluginList.ItemsSource);
pluginListView.Filter = PluginFilter;
}
private void OnAutoStartupChecked(object sender, RoutedEventArgs e)
@ -247,6 +254,7 @@ namespace Flow.Launcher
PluginManager.API.OpenDirectory(directory);
}
}
#endregion
#region Proxy
@ -264,6 +272,7 @@ namespace Flow.Launcher
viewModel.UpdateApp(); // TODO: change to command
}
private void OnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
API.OpenUrl(e.Uri.AbsoluteUri);
@ -307,7 +316,7 @@ namespace Flow.Launcher
private void OnExternalPluginInstallClick(object sender, RoutedEventArgs e)
{
if(sender is Button { DataContext: UserPlugin plugin })
if (sender is Button { DataContext: UserPlugin plugin })
{
var pluginsManagerPlugin = PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7");
var actionKeyword = pluginsManagerPlugin.Metadata.ActionKeywords.Count == 0 ? "" : pluginsManagerPlugin.Metadata.ActionKeywords[0];
@ -326,7 +335,7 @@ namespace Flow.Launcher
textBox.MoveFocus(tRequest);
}
private void ColorSchemeSelectedIndexChanged(object sender, EventArgs e)
private void ColorSchemeSelectedIndexChanged(object sender, EventArgs e)
=> ThemeManager.Current.ApplicationTheme = settings.ColorScheme switch
{
Constant.Light => ApplicationTheme.Light,
@ -370,5 +379,22 @@ namespace Flow.Launcher
RefreshMaximizeRestoreButton();
}
private CollectionView pluginListView;
private bool PluginFilter(object item)
{
if (string.IsNullOrEmpty(pluginFilterTxb.Text))
return true;
if (item is PluginViewModel model)
{
return StringMatcher.FuzzySearch(pluginFilterTxb.Text, model.PluginPair.Metadata.Name).IsSearchPrecisionScoreMet();
}
return false;
}
private void OnPluginSearchTextChanged(object sender, TextChangedEventArgs e)
{
pluginListView.Refresh();
}
}
}
}

View file

@ -30,9 +30,20 @@ namespace Flow.Launcher.ViewModel
get => !PluginPair.Metadata.Disabled;
set => PluginPair.Metadata.Disabled = !value;
}
public bool IsExpanded
{
get => _isExpanded;
set
{
_isExpanded = value;
OnPropertyChanged();
OnPropertyChanged(nameof(SettingControl));
}
}
private Control _settingControl;
public Control SettingControl => _settingControl ??= PluginPair.Plugin is not ISettingProvider settingProvider ? new Control() : settingProvider.CreateSettingPanel();
private bool _isExpanded;
public Control SettingControl => IsExpanded ? _settingControl ??= PluginPair.Plugin is not ISettingProvider settingProvider ? new Control() : settingProvider.CreateSettingPanel() : null;
public Visibility ActionKeywordsVisibility => PluginPair.Metadata.ActionKeywords.Count == 1 ? Visibility.Visible : Visibility.Collapsed;
public string InitilizaTime => PluginPair.Metadata.InitTime + "ms";

View file

@ -19,6 +19,7 @@ using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels;
using System.Windows.Data;
namespace Flow.Launcher.ViewModel
{