PowerToys/Plugins/Wox.Plugin.Program/Main.cs

214 lines
7.5 KiB
C#
Raw Normal View History

using System;
2014-01-04 20:26:13 +08:00
using System.Collections.Generic;
using System.Diagnostics;
2014-01-04 20:26:13 +08:00
using System.Linq;
2016-11-30 09:07:48 +08:00
using System.Threading.Tasks;
2016-01-07 05:34:42 +08:00
using System.Windows.Controls;
using Wox.Infrastructure.Logger;
using Wox.Infrastructure.Storage;
2016-08-20 08:17:28 +08:00
using Wox.Plugin.Program.Programs;
2019-09-08 20:16:47 +08:00
using Wox.Plugin.Program.Views;
using Stopwatch = Wox.Infrastructure.Stopwatch;
2014-01-04 20:26:13 +08:00
namespace Wox.Plugin.Program
2014-01-04 20:26:13 +08:00
{
2019-10-06 10:15:06 +08:00
public class Main : ISettingProvider, IPlugin, IPluginI18n, IContextMenu, ISavable, IReloadable
2014-01-04 20:26:13 +08:00
{
2017-01-13 09:21:00 +08:00
private static readonly object IndexLock = new object();
2019-09-08 20:18:55 +08:00
internal static Win32[] _win32s { get; set; }
internal static UWP.Application[] _uwps { get; set; }
internal static Settings _settings { get; set; }
2019-10-18 05:16:07 +08:00
private static bool IsStartupIndexProgramsRequired => _settings.LastIndexTime.AddDays(3) < DateTime.Today;
2019-10-18 04:53:00 +08:00
private static PluginInitContext _context;
private static BinaryStorage<Win32[]> _win32Storage;
2019-11-29 07:38:50 +08:00
private static BinaryStorage<UWP.Application[]> _uwpStorage;
2016-04-27 05:45:31 +08:00
private readonly PluginJsonStorage<Settings> _settingsStorage;
2016-05-07 10:55:09 +08:00
public Main()
{
2016-04-27 05:45:31 +08:00
_settingsStorage = new PluginJsonStorage<Settings>();
_settings = _settingsStorage.Load();
2016-07-22 03:49:01 +08:00
2019-09-11 06:05:20 +08:00
Stopwatch.Normal("|Wox.Plugin.Program.Main|Preload programs cost", () =>
2016-07-22 03:49:01 +08:00
{
2017-01-14 22:10:30 +08:00
_win32Storage = new BinaryStorage<Win32[]>("Win32");
_win32s = _win32Storage.TryLoad(new Win32[] { });
2017-01-14 22:10:30 +08:00
_uwpStorage = new BinaryStorage<UWP.Application[]>("UWP");
_uwps = _uwpStorage.TryLoad(new UWP.Application[] { });
2017-01-13 09:21:00 +08:00
});
2017-01-25 08:23:28 +08:00
Log.Info($"|Wox.Plugin.Program.Main|Number of preload win32 programs <{_win32s.Length}>");
2017-01-24 08:24:20 +08:00
Log.Info($"|Wox.Plugin.Program.Main|Number of preload uwps <{_uwps.Length}>");
2019-11-29 07:38:50 +08:00
var a = Task.Run(() =>
{
2019-10-18 04:53:00 +08:00
if (IsStartupIndexProgramsRequired || !_win32s.Any())
2019-09-11 06:05:20 +08:00
Stopwatch.Normal("|Wox.Plugin.Program.Main|Win32Program index cost", IndexWin32Programs);
});
var b = Task.Run(() =>
2017-01-13 09:21:00 +08:00
{
2019-10-18 04:53:00 +08:00
if (IsStartupIndexProgramsRequired || !_uwps.Any())
2019-09-11 06:05:20 +08:00
Stopwatch.Normal("|Wox.Plugin.Program.Main|Win32Program index cost", IndexUWPPrograms);
2016-07-22 03:49:01 +08:00
});
2019-10-18 05:01:07 +08:00
Task.WaitAll(a, b);
2019-10-18 05:16:07 +08:00
_settings.LastIndexTime = DateTime.Today;
}
public void Save()
{
_settingsStorage.Save();
_win32Storage.Save(_win32s);
_uwpStorage.Save(_uwps);
}
public List<Result> Query(Query query)
2014-01-04 20:26:13 +08:00
{
2019-11-29 07:38:50 +08:00
Win32[] win32;
UWP.Application[] uwps;
2017-01-13 09:21:00 +08:00
lock (IndexLock)
2019-11-29 07:38:50 +08:00
{ // just take the reference inside the lock to eliminate query time issues.
win32 = _win32s;
uwps = _uwps;
}
2019-11-29 07:38:50 +08:00
var results1 = win32.AsParallel()
2019-12-12 02:10:11 +08:00
.Where(p => p.Enabled)
.Select(p => p.Result(query.Search, _context.API));
2019-11-29 07:38:50 +08:00
var results2 = uwps.AsParallel()
.Where(p => p.Enabled)
.Select(p => p.Result(query.Search, _context.API));
var result = results1.Concat(results2).Where(r => r != null && r.Score > 0).ToList();
return result;
2014-01-04 20:26:13 +08:00
}
public void Init(PluginInitContext context)
2014-01-04 20:26:13 +08:00
{
_context = context;
}
public static void IndexWin32Programs()
{
2019-11-16 08:37:01 +08:00
var win32S = Win32.All(_settings);
lock (IndexLock)
2016-11-30 09:07:48 +08:00
{
2019-11-16 08:37:01 +08:00
_win32s = win32S;
}
}
public static void IndexUWPPrograms()
{
var windows10 = new Version(10, 0);
var support = Environment.OSVersion.Version.Major >= windows10.Major;
2019-11-16 08:37:01 +08:00
var applications = support ? UWP.All() : new UWP.Application[] { };
2017-01-13 09:21:00 +08:00
lock (IndexLock)
{
2019-11-16 08:37:01 +08:00
_uwps = applications;
2017-01-13 09:21:00 +08:00
}
}
2014-03-22 13:50:20 +08:00
public static void IndexPrograms()
{
2019-11-29 07:38:50 +08:00
var t1 = Task.Run(() => IndexWin32Programs());
2019-11-29 07:38:50 +08:00
var t2 = Task.Run(() => IndexUWPPrograms());
Task.WaitAll(t1, t2);
2019-10-18 04:53:00 +08:00
2019-10-18 05:16:07 +08:00
_settings.LastIndexTime = DateTime.Today;
2019-11-29 07:38:50 +08:00
}
2019-09-07 13:58:13 +08:00
2016-01-07 05:34:42 +08:00
public Control CreateSettingPanel()
{
2019-09-08 20:16:47 +08:00
return new ProgramSetting(_context, _settings, _win32s, _uwps);
}
2015-02-07 20:17:49 +08:00
public string GetTranslatedPluginTitle()
{
return _context.API.GetTranslation("wox_plugin_program_plugin_name");
2015-02-07 20:17:49 +08:00
}
public string GetTranslatedPluginDescription()
{
return _context.API.GetTranslation("wox_plugin_program_plugin_description");
2015-02-07 20:17:49 +08:00
}
public List<Result> LoadContextMenus(Result selectedResult)
{
var menuOptions = new List<Result>();
var program = selectedResult.ContextData as IProgram;
if (program != null)
{
2019-11-29 07:38:50 +08:00
menuOptions = program.ContextMenus(_context.API);
}
menuOptions.Add(
new Result
{
Title = _context.API.GetTranslation("wox_plugin_program_disable_program"),
Action = c =>
{
DisableProgram(program);
2019-11-29 07:38:50 +08:00
_context.API.ShowMsg(_context.API.GetTranslation("wox_plugin_program_disable_dlgtitle_success"),
_context.API.GetTranslation("wox_plugin_program_disable_dlgtitle_success_message"));
return false;
},
IcoPath = "Images/disable.png"
}
);
return menuOptions;
}
private void DisableProgram(IProgram programToDelete)
{
if (_settings.DisabledProgramSources.Any(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier))
return;
if (_uwps.Any(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier))
_uwps.Where(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier).FirstOrDefault().Enabled = false;
if (_win32s.Any(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier))
_win32s.Where(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier).FirstOrDefault().Enabled = false;
_settings.DisabledProgramSources
.Add(
new Settings.DisabledProgramSource
{
Name = programToDelete.Name,
Location = programToDelete.Location,
UniqueIdentifier = programToDelete.UniqueIdentifier,
Enabled = false
}
);
}
public static void StartProcess(Func<ProcessStartInfo, Process> runProcess, ProcessStartInfo info)
{
bool hide;
try
{
runProcess(info);
}
catch (Exception)
{
var name = "Plugin: Program";
var message = $"Unable to start: {info.FileName}";
_context.API.ShowMsg(name, message, string.Empty);
}
}
2019-10-06 10:15:06 +08:00
public void ReloadData()
{
IndexPrograms();
2019-10-06 10:15:06 +08:00
}
2014-01-04 20:26:13 +08:00
}
}