Theme aware plugin (#4499)

* Migrate theme manager to infrastructure and added it as input to public API instance

* Working event-delegate for PublicAPIInstance

* Theme aware UWP applications

* Theme aware program plugin

* Update query icon on theme change

* Theme aware calculator plugin

* Fix issue with query running before theme change

* Theme based changes in ImageLoader

* Removed ErrorIcon direct references and added references from ImageLoader

* Nit fixes

* Removed unnecessary TODO in UWP.cs

* Added preference to theme based icons

* Added IDisposable interfaces to unsubscribe events
This commit is contained in:
Divyansh Srivastava
2020-06-26 17:42:06 -07:00
committed by GitHub
parent d9597d5ad5
commit d3b10d0d4d
15 changed files with 255 additions and 41 deletions

View File

@@ -13,11 +13,11 @@ using Wox.Plugin;
using Microsoft.Plugin.Program.Views;
using Stopwatch = Wox.Infrastructure.Stopwatch;
using Microsoft.Plugin.Program.Programs;
namespace Microsoft.Plugin.Program
{
public class Main : ISettingProvider, IPlugin, IPluginI18n, IContextMenu, ISavable, IReloadable
public class Main : ISettingProvider, IPlugin, IPluginI18n, IContextMenu, ISavable, IReloadable, IDisposable
{
private static readonly object IndexLock = new object();
internal static Programs.Win32[] _win32s { get; set; }
@@ -34,6 +34,7 @@ namespace Microsoft.Plugin.Program
private static BinaryStorage<Programs.Win32[]> _win32Storage;
private static BinaryStorage<Programs.UWP.Application[]> _uwpStorage;
private readonly PluginJsonStorage<Settings> _settingsStorage;
private bool _disposed = false;
public Main()
{
@@ -104,6 +105,21 @@ namespace Microsoft.Plugin.Program
public void Init(PluginInitContext context)
{
_context = context;
_context.API.ThemeChanged += OnThemeChanged;
UpdateUWPIconPath(_context.API.GetCurrentTheme());
}
public void OnThemeChanged(Theme _, Theme currentTheme)
{
UpdateUWPIconPath(currentTheme);
}
public void UpdateUWPIconPath(Theme theme)
{
foreach (UWP.Application app in _uwps)
{
app.UpdatePath(theme);
}
}
public static void IndexWin32Programs()
@@ -186,6 +202,25 @@ namespace Microsoft.Plugin.Program
public void UpdateSettings(PowerLauncherSettings settings)
{
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_context.API.ThemeChanged -= OnThemeChanged;
_disposed = true;
}
}
}
void InitializeFileWatchers()
{
// Create a new FileSystemWatcher and set its properties.

View File

@@ -21,6 +21,7 @@ using System.Windows.Input;
using System.Runtime.InteropServices.ComTypes;
using Wox.Plugin.SharedCommands;
using System.Reflection;
using Wox.Infrastructure.Image;
namespace Microsoft.Plugin.Program.Programs
{
@@ -404,7 +405,6 @@ namespace Microsoft.Plugin.Program.Programs
DisplayName = ResourceFromPri(package.FullName, DisplayName);
Description = ResourceFromPri(package.FullName, Description);
LogoUri = LogoUriFromManifest(manifestApp);
LogoPath = LogoPathFromUri(LogoUri);
Enabled = true;
CanRunElevated = IfApplicationcanRunElevated();
@@ -516,7 +516,19 @@ namespace Microsoft.Plugin.Program.Programs
}
}
internal string LogoPathFromUri(string uri)
public void UpdatePath(Theme theme)
{
if (theme == Theme.Light || theme == Theme.HighContrastWhite)
{
LogoPath = LogoPathFromUri(LogoUri, "contrast-white");
}
else
{
LogoPath = LogoPathFromUri(LogoUri, "contrast-black");
}
}
internal string LogoPathFromUri(string uri, string theme)
{
// all https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets
// windows 10 https://msdn.microsoft.com/en-us/library/windows/apps/dn934817.aspx
@@ -539,11 +551,7 @@ namespace Microsoft.Plugin.Program.Programs
{
var end = path.Length - extension.Length;
var prefix = path.Substring(0, end);
var paths = new List<string> { path };
// TODO: This value must be set in accordance to the WPF theme (work in progress).
// Must be set to `contrast-white` for light theme and to `contrast-black` for dark theme to get an icon of the contrasting color.
var theme = "contrast-black";
var paths = new List<string> { path };
var scaleFactors = new Dictionary<PackageVersion, List<int>>
{
@@ -563,6 +571,7 @@ namespace Microsoft.Plugin.Program.Programs
}
}
paths = paths.OrderByDescending(x => x.Contains(theme)).ToList();
var selected = paths.FirstOrDefault(File.Exists);
if (!string.IsNullOrEmpty(selected))
{
@@ -589,6 +598,7 @@ namespace Microsoft.Plugin.Program.Programs
pathFactorPairs.Add(prefixThemePath, factor);
}
paths = paths.OrderByDescending(x => x.Contains(theme)).ToList();
var selectedIconPath = paths.OrderBy(x => Math.Abs(pathFactorPairs.GetValueOrDefault(x) - appIconSize)).FirstOrDefault(File.Exists);
if (!string.IsNullOrEmpty(selectedIconPath))
{
@@ -630,7 +640,7 @@ namespace Microsoft.Plugin.Program.Programs
ProgramLogger.LogException($"|UWP|ImageFromPath|{path}" +
$"|Unable to get logo for {UserModelId} from {path} and" +
$" located in {Package.Location}", new FileNotFoundException());
return new BitmapImage(new Uri(Constant.ErrorIcon));
return new BitmapImage(new Uri(ImageLoader.ErrorIconPath));
}
}