Implement Everything AutoInstall

This commit is contained in:
Hongtao Zhang 2022-08-16 21:32:49 -04:00
parent 4b6b10af02
commit 6423143c5c
No known key found for this signature in database
GPG key ID: 75F655B91C7AC9BB
6 changed files with 226 additions and 115 deletions

View file

@ -26,6 +26,7 @@
<system:String x:Key="plugin_explorer_quickaccesslinks_header">Quick Access Links</system:String>
<system:String x:Key="plugin_explorer_everything_setting_header">Everything Setting</system:String>
<system:String x:Key="plugin_explorer_everything_sort_option">Sort Option:</system:String>
<system:String x:Key="plugin_explorer_everything_installed_path">Everything Path:</system:String>
<system:String x:Key="plugin_explorer_launch_hidden">Launch Hidden</system:String>
<system:String x:Key="plugin_explorer_editor_path">Editor Path</system:String>
<system:String x:Key="plugin_explorer_shell_path">Shell Path</system:String>

View file

@ -35,11 +35,11 @@ namespace Flow.Launcher.Plugin.Explorer
public Task InitAsync(PluginInitContext context)
{
Context = context;
Settings = context.API.LoadSettingJsonStorage<Settings>();
viewModel = new SettingsViewModel(context, Settings);
// as at v1.7.0 this is to maintain backwards compatibility, need to be removed afterwards.
if (Settings.QuickFolderAccessLinks.Any())
@ -52,8 +52,18 @@ namespace Flow.Launcher.Plugin.Explorer
searchManager = new SearchManager(Settings, Context);
ResultManager.Init(Context, Settings);
if (Settings.EverythingEnabled)
{
_ = EverythingDownloadHelper.PromptDownloadIfNotInstallAsync(Settings.EverythingInstalledPath, context.API)
.ContinueWith(s =>
{
if (s.IsCompletedSuccessfully)
Settings.EverythingInstalledPath = s.Result;
}, TaskScheduler.Default);
}
SortOptionTranslationHelper.API = context.API;
EverythingApiDllImport.Load(Path.Combine(Context.CurrentPluginMetadata.PluginDirectory, "EverythingSDK",
Environment.Is64BitProcess ? "Everything64.dll" : "Everything86.dll"));
return Task.CompletedTask;
@ -79,4 +89,4 @@ namespace Flow.Launcher.Plugin.Explorer
return Context.API.GetTranslation("plugin_explorer_plugin_description");
}
}
}
}

View file

@ -0,0 +1,99 @@
using Droplex;
using Flow.Launcher.Plugin.SharedCommands;
using Microsoft.Win32;
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Flow.Launcher.Plugin.Explorer.Search.Everything;
public class EverythingDownloadHelper
{
public static async Task<string> PromptDownloadIfNotInstallAsync(string installedLocation, IPublicAPI api)
{
if (installedLocation.FileExists())
return installedLocation;
if (!string.IsNullOrEmpty(installedLocation))
return installedLocation;
installedLocation = GetInstalledPath();
if (string.IsNullOrEmpty(installedLocation) &&
System.Windows.Forms.MessageBox.Show(
string.Format(api.GetTranslation("flowlauncher_plugin_everything_installing_select"), Environment.NewLine),
api.GetTranslation("flowlauncher_plugin_everything_installing_title"),
System.Windows.Forms.MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
{
// Solves single thread apartment (STA) mode requirement error when using OpenFileDialog
var t = new Thread(() =>
{
var dlg = new System.Windows.Forms.OpenFileDialog
{
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
};
var result = dlg.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrEmpty(dlg.FileName))
installedLocation = dlg.FileName;
});
// Run your code from a thread that joins the STA Thread
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
if (!string.IsNullOrEmpty(installedLocation))
{
return installedLocation;
}
api.ShowMsg(api.GetTranslation("flowlauncher_plugin_everything_installing_title"),
api.GetTranslation("flowlauncher_plugin_everything_installing_subtitle"), "", useMainWindowAsOwner: false);
await DroplexPackage.Drop(App.Everything1_4_1_1009).ConfigureAwait(false);
api.ShowMsg(api.GetTranslation("flowlauncher_plugin_everything_installing_title"),
api.GetTranslation("flowlauncher_plugin_everything_installationsuccess_subtitle"), "", useMainWindowAsOwner: false);
installedLocation = "C:\\Program Files\\Everything\\Everything.exe";
FilesFolders.OpenPath(installedLocation);
return installedLocation;
}
internal static string GetInstalledPath()
{
using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
if (key is not null)
{
foreach (var subKey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
{
if (subKey?.GetValue("DisplayName") is not string displayName || !displayName.Contains("Everything"))
{
continue;
}
if (subKey.GetValue("UninstallString") is not string uninstallString)
{
continue;
}
if (Path.GetDirectoryName(uninstallString) is not { } uninstallDirectory)
{
continue;
}
return Path.Combine(uninstallDirectory, "Everything.exe");
}
}
var scoopInstalledPath = Environment.ExpandEnvironmentVariables(@"%userprofile%\scoop\apps\everything\current\Everything.exe");
return File.Exists(scoopInstalledPath) ? scoopInstalledPath : string.Empty;
}
}

View file

@ -137,6 +137,10 @@ namespace Flow.Launcher.Plugin.Explorer
public bool EnableEverythingContentSearch { get; set; } = false;
public bool EverythingEnabled => IndexSearchEngine==IndexSearchEngineOption.Everything ||
PathEnumerationEngine == PathEnumerationEngineOption.Everything ||
ContentSearchEngine == ContentIndexSearchEngineOption.Everything;
#endregion
internal enum ActionKeyword

View file

@ -395,6 +395,16 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
}
}
public string EverythingInstalledPath
{
get => Settings.EverythingInstalledPath;
set
{
Settings.EverythingInstalledPath = value;
OnPropertyChanged();
}
}
#endregion

View file

@ -1,5 +1,4 @@
<UserControl
x:Class="Flow.Launcher.Plugin.Explorer.Views.ExplorerSettings"
<UserControl x:Class="Flow.Launcher.Plugin.Explorer.Views.ExplorerSettings"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
@ -13,40 +12,49 @@
d:DesignWidth="800"
mc:Ignorable="d">
<UserControl.Resources>
<DataTemplate x:Key="ListViewTemplateAccessLinks" DataType="qa:AccessLink">
<TextBlock Margin="0,5,0,5" Text="{Binding Path, Mode=OneTime}" />
<DataTemplate x:Key="ListViewTemplateAccessLinks"
DataType="qa:AccessLink">
<TextBlock Margin="0,5,0,5"
Text="{Binding Path, Mode=OneTime}" />
</DataTemplate>
<DataTemplate x:Key="ListViewActionKeywords" DataType="{x:Type views:ActionKeywordModel}">
<DataTemplate x:Key="ListViewActionKeywords"
DataType="{x:Type views:ActionKeywordModel}">
<Grid>
<TextBlock
Margin="0,5,0,0"
<TextBlock Margin="0,5,0,0"
IsEnabled="{Binding Enabled}"
Text="{Binding Description, Mode=OneTime}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Foreground" Value="{DynamicResource Color05B}" />
<Trigger Property="IsEnabled"
Value="True">
<Setter Property="Foreground"
Value="{DynamicResource Color05B}" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource Color18B}" />
<Trigger Property="IsEnabled"
Value="False">
<Setter Property="Foreground"
Value="{DynamicResource Color18B}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock
Margin="250,5,0,0"
<TextBlock Margin="250,5,0,0"
IsEnabled="{Binding Enabled}"
Text="{Binding Keyword}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Foreground" Value="{DynamicResource Color05B}" />
<Trigger Property="IsEnabled"
Value="True">
<Setter Property="Foreground"
Value="{DynamicResource Color05B}" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource Color18B}" />
<Trigger Property="IsEnabled"
Value="False">
<Setter Property="Foreground"
Value="{DynamicResource Color18B}" />
</Trigger>
</Style.Triggers>
</Style>
@ -61,10 +69,10 @@
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Margin="20,35,0,0">
<StackPanel Grid.Row="0"
Margin="20,35,0,0">
<StackPanel>
<Expander
Margin="15"
<Expander Margin="15"
Header="{DynamicResource plugin_explorer_generalsetting_header}"
Expanded="SettingExpander_OnExpanded"
Collapsed="SettingExpander_OnCollapsed">
@ -74,56 +82,47 @@
<TextBlock Text="{Binding Description}" />
</DataTemplate>
</StackPanel.Resources>
<CheckBox
Margin="12,10,0,0"
<CheckBox Margin="12,10,0,0"
Content="{DynamicResource plugin_explorer_usewindowsindexfordirectorysearch}"
IsChecked="{Binding UseWindowsIndexForDirectorySearch}"
ToolTip="{DynamicResource plugin_explorer_usewindowsindexfordirectorysearch_tooltip}" />
<CheckBox
Margin="12,10,0,0"
<CheckBox Margin="12,10,0,0"
HorizontalAlignment="Left"
Content="{DynamicResource plugin_explorer_use_location_as_working_dir}"
IsChecked="{Binding Settings.UseLocationAsWorkingDir}" />
<CheckBox
Margin="12,10,0,0"
<CheckBox Margin="12,10,0,0"
HorizontalAlignment="Left"
Content="{DynamicResource plugin_explorer_launch_hidden}"
IsChecked="{Binding Settings.LaunchHidden}" />
<StackPanel Orientation="Horizontal">
<TextBlock
Margin="10,6,6,6"
<TextBlock Margin="10,6,6,6"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="{DynamicResource plugin_explorer_editor_path}" />
<TextBox
Margin="15"
<TextBox Margin="15"
HorizontalAlignment="Left"
VerticalAlignment="Center"
TextWrapping="NoWrap"
MaxWidth="250"
Text="{Binding EditorPath}" />
<Button
MinWidth="50"
<Button MinWidth="50"
HorizontalAlignment="Left"
Margin="15"
Command="{Binding OpenEditorPath}"
Content="..." />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock
Margin="10,6,6,6"
<TextBlock Margin="10,6,6,6"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="{DynamicResource plugin_explorer_shell_path}" />
<TextBox
Margin="15"
<TextBox Margin="15"
HorizontalAlignment="Left"
VerticalAlignment="Center"
TextWrapping="NoWrap"
MaxWidth="250"
Text="{Binding ShellPath}" />
<Button
MinWidth="50"
<Button MinWidth="50"
HorizontalAlignment="Left"
Margin="15"
Command="{Binding OpenShellPath}"
@ -132,8 +131,7 @@
<StackPanel Orientation="Horizontal">
<TextBlock Text="Index Search Engine" />
<ComboBox
Margin="15"
<ComboBox Margin="15"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Width="250"
@ -144,8 +142,7 @@
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Content Search Engine" />
<ComboBox
Margin="15"
<ComboBox Margin="15"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Width="250"
@ -156,8 +153,7 @@
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Path Enumeration Engine" />
<ComboBox
Margin="15"
<ComboBox Margin="15"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Width="250"
@ -167,78 +163,78 @@
</ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button
Margin="15"
Content="Open Window Index Option"
Click="btnOpenIndexingOptions_Click"/>
<Button Margin="15"
Content="Open Window Index Option"
Click="btnOpenIndexingOptions_Click" />
</StackPanel>
</StackPanel>
</Expander>
<Expander
Margin="15"
<Expander Margin="15"
Header="{DynamicResource plugin_explorer_everything_setting_header}"
Expanded="SettingExpander_OnExpanded"
Collapsed="SettingExpander_OnCollapsed">
<DockPanel>
<TextBlock
Text="{DynamicResource plugin_explorer_everything_sort_option}"
Margin="15" />
<ComboBox
DockPanel.Dock="Left"
Width="200"
VerticalAlignment="Center"
ItemsSource="{Binding Settings.SortOptions, Mode=OneWay}"
SelectedItem="{Binding Settings.SortOption}"
SelectionChanged="EverythingSortOptionChanged">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Converter={StaticResource EnumNameConverter}}" />
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBlock
Name="tbFastSortWarning"
DockPanel.Dock="Right"
Margin="0 0 10 0"
VerticalAlignment="Center"
Foreground="Orange"
Text="{Binding SortOptionWarningMessage, Mode=OneTime}"
TextAlignment="Left"
TextWrapping="Wrap"
Visibility="{Binding FastSortWarningVisibility, Mode=OneTime}" />
</DockPanel>
<StackPanel Orientation="Vertical"
Margin="10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{DynamicResource plugin_explorer_everything_sort_option}"
Margin="15" />
<ComboBox DockPanel.Dock="Left"
Width="200"
VerticalAlignment="Center"
Margin="10"
ItemsSource="{Binding Settings.SortOptions, Mode=OneWay}"
SelectedItem="{Binding Settings.SortOption}"
SelectionChanged="EverythingSortOptionChanged">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Converter={StaticResource EnumNameConverter}}" />
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBlock Name="tbFastSortWarning"
DockPanel.Dock="Right"
Margin="10"
VerticalAlignment="Center"
Foreground="Orange"
Text="{Binding SortOptionWarningMessage, Mode=OneTime}"
TextAlignment="Left"
TextWrapping="Wrap"
Visibility="{Binding FastSortWarningVisibility, Mode=OneTime}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{DynamicResource plugin_explorer_everything_installed_path}"
Margin="10" />
<TextBox Text="{Binding EverythingInstalledPath}"
Margin="10" />
</StackPanel>
</StackPanel>
</Expander>
<Expander
Margin="15"
<Expander Margin="15"
Height="auto"
Expanded="SettingExpander_OnExpanded"
Collapsed="SettingExpander_OnCollapsed"
Header="{DynamicResource plugin_explorer_manageactionkeywords_header}">
<DockPanel HorizontalAlignment="Stretch">
<ListView
DockPanel.Dock="Top"
<ListView DockPanel.Dock="Top"
ItemTemplate="{StaticResource ListViewActionKeywords}"
ItemsSource="{Binding ActionKeywordsModels}"
SelectedItem="{Binding SelectedActionKeyword}" />
<Button
MinWidth="100"
<Button MinWidth="100"
Margin="10"
Command="{Binding EditActionKeywordCommand}"
Content="{DynamicResource plugin_explorer_edit}" />
</DockPanel>
</Expander>
<Expander
Margin="15"
<Expander Margin="15"
Expanded="SettingExpander_OnExpanded"
Collapsed="SettingExpander_OnCollapsed"
Name="expAccessLinks"
Header="{DynamicResource plugin_explorer_quickaccesslinks_header}">
<ScrollViewer>
<DockPanel HorizontalAlignment="Stretch">
<ListView
x:Name="lbxAccessLinks"
<ListView x:Name="lbxAccessLinks"
Height="200"
AllowDrop="True"
DragEnter="lbxAccessLinks_DragEnter"
@ -247,40 +243,35 @@
ItemTemplate="{StaticResource ListViewTemplateAccessLinks}"
ItemsSource="{Binding Settings.QuickAccessLinks}"
SelectedItem="{Binding SelectedQuickAccessLink}" />
<StackPanel
HorizontalAlignment="Right"
<StackPanel HorizontalAlignment="Right"
DockPanel.Dock="Bottom"
Orientation="Horizontal">
<Button
MinWidth="100"
<Button MinWidth="100"
Margin="10"
Command="{Binding RemoveLinkCommand}"
CommandParameter="QuickAccessLink"
Content="{DynamicResource plugin_explorer_delete}" />
<Button
MinWidth="100"
<Button MinWidth="100"
Margin="10"
Command="{Binding EditLinkCommand}"
CommandParameter="QuickAccessLink"
Content="{DynamicResource plugin_explorer_edit}" />
<Button
MinWidth="100"
<Button MinWidth="100"
Margin="10"
Command="{Binding AddLinkCommand}"
CommandParameter="QuickAccessLink"
Content="{DynamicResource plugin_explorer_add}" />
</StackPanel>
</DockPanel></ScrollViewer>
</DockPanel>
</ScrollViewer>
</Expander>
<Expander
Margin="15"
<Expander Margin="15"
Expanded="SettingExpander_OnExpanded"
Collapsed="SettingExpander_OnCollapsed"
Header="{DynamicResource plugin_explorer_indexsearchexcludedpaths_header}">
<ScrollViewer>
<DockPanel HorizontalAlignment="Stretch">
<ListView
Name="lbxExcludedPaths"
<ListView Name="lbxExcludedPaths"
AllowDrop="True"
DockPanel.Dock="Top"
DragEnter="lbxAccessLinks_DragEnter"
@ -288,24 +279,20 @@
ItemTemplate="{StaticResource ListViewActionKeywords}"
ItemsSource="{Binding Settings.IndexSearchExcludedSubdirectoryPaths}"
SelectedItem="{Binding SelectedIndexSearchExcludedPath}" />
<StackPanel
HorizontalAlignment="Right"
<StackPanel HorizontalAlignment="Right"
DockPanel.Dock="Bottom"
Orientation="Horizontal">
<Button
MinWidth="100"
<Button MinWidth="100"
Margin="10"
Command="{Binding RemoveLinkCommand}"
CommandParameter="IndexSearchExcludedPaths"
Content="{DynamicResource plugin_explorer_delete}" />
<Button
MinWidth="100"
<Button MinWidth="100"
Margin="10"
Command="{Binding EditLinkCommand}"
CommandParameter="IndexSearchExcludedPaths"
Content="{DynamicResource plugin_explorer_edit}" />
<Button
MinWidth="100"
<Button MinWidth="100"
Margin="10"
Command="{Binding AddLinkCommand}"
CommandParameter="IndexSearchExcludedPaths"