[PowerToys Run] Plugin manager (#9872)

This commit is contained in:
Mykhailo Pylyp
2021-02-26 13:21:58 +02:00
committed by GitHub
parent f839a408de
commit 4a9e920a1c
66 changed files with 749 additions and 276 deletions

View File

@@ -0,0 +1,41 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
{
public class PluginAdditionalOptionViewModel : INotifyPropertyChanged
{
private PluginAdditionalOption _additionalOption;
internal PluginAdditionalOptionViewModel(PluginAdditionalOption additionalOption)
{
_additionalOption = additionalOption;
}
public string DisplayLabel { get => _additionalOption.DisplayLabel; }
public bool Value
{
get => _additionalOption.Value;
set
{
if (value != _additionalOption.Value)
{
_additionalOption.Value = value;
NotifyPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}

View File

@@ -0,0 +1,170 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
{
public class PowerLauncherPluginViewModel : INotifyPropertyChanged
{
private readonly PowerLauncherPluginSettings settings;
private readonly Func<bool> isDark;
public PowerLauncherPluginViewModel(PowerLauncherPluginSettings settings, Func<bool> isDark)
{
if (settings == null)
{
throw new ArgumentNullException(nameof(settings), "PowerLauncherPluginSettings object is null");
}
this.settings = settings;
this.isDark = isDark;
foreach (var item in AdditionalOptions)
{
item.PropertyChanged += (object sender, PropertyChangedEventArgs e) =>
{
NotifyPropertyChanged(nameof(AdditionalOptions));
};
}
}
public string Id { get => settings.Id; }
public string Name { get => settings.Name; }
public string Description { get => settings.Description; }
public string Author { get => settings.Author; }
public bool Disabled
{
get
{
return settings.Disabled;
}
set
{
if (settings.Disabled != value)
{
settings.Disabled = value;
NotifyPropertyChanged();
NotifyPropertyChanged(nameof(ShowNotAccessibleWarning));
NotifyPropertyChanged(nameof(ShowNotAllowedKeywordWarning));
NotifyPropertyChanged(nameof(Enabled));
NotifyPropertyChanged(nameof(DisabledOpacity));
}
}
}
public bool Enabled => !Disabled;
public double DisabledOpacity => Disabled ? 0.5 : 1;
public bool IsGlobal
{
get
{
return settings.IsGlobal;
}
set
{
if (settings.IsGlobal != value)
{
settings.IsGlobal = value;
NotifyPropertyChanged();
NotifyPropertyChanged(nameof(ShowNotAccessibleWarning));
}
}
}
public string ActionKeyword
{
get
{
return settings.ActionKeyword;
}
set
{
if (settings.ActionKeyword != value)
{
settings.ActionKeyword = value;
NotifyPropertyChanged();
NotifyPropertyChanged(nameof(ShowNotAccessibleWarning));
NotifyPropertyChanged(nameof(ShowNotAllowedKeywordWarning));
}
}
}
private IEnumerable<PluginAdditionalOptionViewModel> _additionalOptions;
public IEnumerable<PluginAdditionalOptionViewModel> AdditionalOptions
{
get
{
if (_additionalOptions == null)
{
_additionalOptions = settings.AdditionalOptions.Select(x => new PluginAdditionalOptionViewModel(x)).ToList();
}
return _additionalOptions;
}
}
public bool ShowAdditionalOptions
{
get => AdditionalOptions.Any();
}
public override string ToString()
{
return $"{Name}. {Description}";
}
public string IconPath { get => isDark() ? settings.IconPathDark : settings.IconPathLight; }
private bool _showAdditionalInfoPanel;
public bool ShowAdditionalInfoPanel
{
get => _showAdditionalInfoPanel;
set
{
if (value != _showAdditionalInfoPanel)
{
_showAdditionalInfoPanel = value;
NotifyPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public bool ShowNotAccessibleWarning
{
get => !Disabled && !IsGlobal && string.IsNullOrWhiteSpace(ActionKeyword);
}
private static readonly List<string> NotAllowedKeywords = new List<string>()
{
"~", @"\", @"\\",
};
public bool ShowNotAllowedKeywordWarning
{
get => !Disabled && NotAllowedKeywords.Contains(ActionKeyword);
}
}
}

View File

@@ -3,7 +3,11 @@
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text.Json;
using ManagedCommon;
@@ -28,11 +32,14 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
private readonly SendCallback callback;
private readonly Func<bool> isDark;
private Func<string, int> SendConfigMSG { get; }
public PowerLauncherViewModel(ISettingsUtils settingsUtils, ISettingsRepository<GeneralSettings> settingsRepository, Func<string, int> ipcMSGCallBackFunc, int defaultKeyCode)
public PowerLauncherViewModel(ISettingsUtils settingsUtils, ISettingsRepository<GeneralSettings> settingsRepository, Func<string, int> ipcMSGCallBackFunc, int defaultKeyCode, Func<bool> isDark)
{
_settingsUtils = settingsUtils ?? throw new ArgumentNullException(nameof(settingsUtils));
this.isDark = isDark;
// To obtain the general Settings configurations of PowerToys
if (settingsRepository == null)
@@ -81,6 +88,17 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
_isSystemThemeRadioButtonChecked = true;
break;
}
foreach (var plugin in Plugins)
{
plugin.PropertyChanged += OnPluginInfoChange;
}
}
private void OnPluginInfoChange(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged(nameof(ShowAllPluginsDisabledWarning));
UpdateSettings();
}
public PowerLauncherViewModel(PowerLauncherSettings settings, SendCallback callback)
@@ -110,6 +128,7 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
{
GeneralSettingsConfig.Enabled.PowerLauncher = value;
OnPropertyChanged(nameof(EnablePowerLauncher));
OnPropertyChanged(nameof(ShowAllPluginsDisabledWarning));
OutGoingGeneralSettings outgoing = new OutGoingGeneralSettings(GeneralSettingsConfig);
SendConfigMSG(outgoing.ToString());
}
@@ -343,21 +362,24 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
}
}
public bool DisableDriveDetectionWarning
private ObservableCollection<PowerLauncherPluginViewModel> _plugins;
public ObservableCollection<PowerLauncherPluginViewModel> Plugins
{
get
{
return settings.Properties.DisableDriveDetectionWarning;
}
set
{
if (settings.Properties.DisableDriveDetectionWarning != value)
if (_plugins == null)
{
settings.Properties.DisableDriveDetectionWarning = value;
UpdateSettings();
_plugins = new ObservableCollection<PowerLauncherPluginViewModel>(settings.Plugins.Select(x => new PowerLauncherPluginViewModel(x, isDark)));
}
return _plugins;
}
}
public bool ShowAllPluginsDisabledWarning
{
get => EnablePowerLauncher && Plugins.All(x => x.Disabled);
}
}
}