PowerToys/src/settings-ui/Settings.UI/ViewModels/AlwaysOnTopViewModel.cs
Jaime Bernardo a63288009a
[GPO] Add policies for configuring utilities enabled states (#21411)
* Add GPOWrapper headers and C++/WinRT library

* Check GPO before starting utilities

* Show message on GPO having disabled preview panes.

* Don't generate thumbnails if GPO disabled

* Fix FancyZonesEditor unable to recognize GPOWrapper

* Move settings view models to the settings project

* Use GPO to block enabling utilities in Settings

* Hide context menu entries when gpo disables utilities

* Apply gpo policies when enabling PowerToys on runner

* Add version and metadata to dll

* Add GPOWrapper to the installer

* Fix MSBuild errors on WPF apps by using Projection

* Signing

* Add gpo files and publish them

* Add GPO policies to the bug report tool

* Add some documentation for using GPO

* Mention support to actual lowest supported version of Windows

* Move PowerToys to the root of administrative templates tree

* Save policies on Software\Policies\PowerToys

* Support both machine and user scopes

* Fix documentation to reference computer and user scopes

* Mention incompatibility with outlook in gpo

* Set a better folder structure for gpo assets

* Move PDF Handler warning to the description

* Update doc/gpo/README.md

Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>

* Add actual minimum version of PowerToys to gpo files

* Fix identation

* Remove GPOWrapper Readme

* Add Active Directory instructions to doc

Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
2022-10-26 14:02:31 +01:00

292 lines
9.1 KiB
C#

// 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.Globalization;
using System.Runtime.CompilerServices;
using System.Text.Json;
using global::PowerToys.GPOWrapper;
using Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Settings.UI.Library.Helpers;
using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
namespace Microsoft.PowerToys.Settings.UI.ViewModels
{
public class AlwaysOnTopViewModel : Observable
{
private ISettingsUtils SettingsUtils { get; set; }
private GeneralSettings GeneralSettingsConfig { get; set; }
private AlwaysOnTopSettings Settings { get; set; }
private Func<string, int> SendConfigMSG { get; }
public AlwaysOnTopViewModel(ISettingsUtils settingsUtils, ISettingsRepository<GeneralSettings> settingsRepository, ISettingsRepository<AlwaysOnTopSettings> moduleSettingsRepository, Func<string, int> ipcMSGCallBackFunc)
{
if (settingsUtils == null)
{
throw new ArgumentNullException(nameof(settingsUtils));
}
SettingsUtils = settingsUtils;
// To obtain the general settings configurations of PowerToys Settings.
if (settingsRepository == null)
{
throw new ArgumentNullException(nameof(settingsRepository));
}
GeneralSettingsConfig = settingsRepository.SettingsConfig;
// To obtain the settings configurations of AlwaysOnTop.
if (moduleSettingsRepository == null)
{
throw new ArgumentNullException(nameof(moduleSettingsRepository));
}
Settings = moduleSettingsRepository.SettingsConfig;
_enabledGpoRuleConfiguration = GPOWrapper.GetConfiguredAlwaysOnTopEnabledValue();
if (_enabledGpoRuleConfiguration == GpoRuleConfigured.Disabled || _enabledGpoRuleConfiguration == GpoRuleConfigured.Enabled)
{
// Get the enabled state from GPO.
_enabledStateIsGPOConfigured = true;
_isEnabled = _enabledGpoRuleConfiguration == GpoRuleConfigured.Enabled;
}
else
{
_isEnabled = GeneralSettingsConfig.Enabled.AlwaysOnTop;
}
_hotkey = Settings.Properties.Hotkey.Value;
_frameEnabled = Settings.Properties.FrameEnabled.Value;
_frameThickness = Settings.Properties.FrameThickness.Value;
_frameColor = Settings.Properties.FrameColor.Value;
_frameAccentColor = Settings.Properties.FrameAccentColor.Value;
_soundEnabled = Settings.Properties.SoundEnabled.Value;
_doNotActivateOnGameMode = Settings.Properties.DoNotActivateOnGameMode.Value;
_roundCornersEnabled = Settings.Properties.RoundCornersEnabled.Value;
_excludedApps = Settings.Properties.ExcludedApps.Value;
_windows11 = Helper.Windows11();
// set the callback functions value to hangle outgoing IPC message.
SendConfigMSG = ipcMSGCallBackFunc;
}
public bool IsEnabled
{
get => _isEnabled;
set
{
if (_enabledStateIsGPOConfigured)
{
// If it's GPO configured, shouldn't be able to change this state.
return;
}
if (value != _isEnabled)
{
_isEnabled = value;
// Set the status in the general settings configuration
GeneralSettingsConfig.Enabled.AlwaysOnTop = value;
OutGoingGeneralSettings snd = new OutGoingGeneralSettings(GeneralSettingsConfig);
SendConfigMSG(snd.ToString());
OnPropertyChanged(nameof(IsEnabled));
}
}
}
public bool IsEnabledGpoConfigured
{
get => _enabledStateIsGPOConfigured;
}
public HotkeySettings Hotkey
{
get => _hotkey;
set
{
if (value != _hotkey)
{
if (value == null || value.IsEmpty())
{
_hotkey = AlwaysOnTopProperties.DefaultHotkeyValue;
}
else
{
_hotkey = value;
}
Settings.Properties.Hotkey.Value = _hotkey;
NotifyPropertyChanged();
// Using InvariantCulture as this is an IPC message
SendConfigMSG(
string.Format(
CultureInfo.InvariantCulture,
"{{ \"powertoys\": {{ \"{0}\": {1} }} }}",
AlwaysOnTopSettings.ModuleName,
JsonSerializer.Serialize(Settings)));
}
}
}
public bool FrameEnabled
{
get => _frameEnabled;
set
{
if (value != _frameEnabled)
{
_frameEnabled = value;
Settings.Properties.FrameEnabled.Value = value;
NotifyPropertyChanged();
}
}
}
public int FrameThickness
{
get => _frameThickness;
set
{
if (value != _frameThickness)
{
_frameThickness = value;
Settings.Properties.FrameThickness.Value = value;
NotifyPropertyChanged();
}
}
}
public string FrameColor
{
get => _frameColor;
set
{
if (value != _frameColor)
{
_frameColor = value;
Settings.Properties.FrameColor.Value = value;
NotifyPropertyChanged();
}
}
}
public bool SoundEnabled
{
get => _soundEnabled;
set
{
if (value != _soundEnabled)
{
_soundEnabled = value;
Settings.Properties.SoundEnabled.Value = value;
NotifyPropertyChanged();
}
}
}
public bool DoNotActivateOnGameMode
{
get => _doNotActivateOnGameMode;
set
{
if (value != _doNotActivateOnGameMode)
{
_doNotActivateOnGameMode = value;
Settings.Properties.DoNotActivateOnGameMode.Value = value;
NotifyPropertyChanged();
}
}
}
public bool RoundCornersEnabled
{
get => _roundCornersEnabled;
set
{
if (value != _roundCornersEnabled)
{
_roundCornersEnabled = value;
Settings.Properties.RoundCornersEnabled.Value = value;
NotifyPropertyChanged();
}
}
}
public string ExcludedApps
{
get => _excludedApps;
set
{
if (value != _excludedApps)
{
_excludedApps = value;
Settings.Properties.ExcludedApps.Value = value;
NotifyPropertyChanged();
}
}
}
public bool FrameAccentColor
{
get => _frameAccentColor;
set
{
if (value != _frameAccentColor)
{
_frameAccentColor = value;
Settings.Properties.FrameAccentColor.Value = value;
NotifyPropertyChanged();
}
}
}
public bool Windows11
{
get => _windows11;
set
{
_windows11 = value;
}
}
public void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
OnPropertyChanged(propertyName);
SettingsUtils.SaveSettings(Settings.ToJsonString(), AlwaysOnTopSettings.ModuleName);
}
private GpoRuleConfigured _enabledGpoRuleConfiguration;
private bool _enabledStateIsGPOConfigured;
private bool _isEnabled;
private HotkeySettings _hotkey;
private bool _frameEnabled;
private int _frameThickness;
private string _frameColor;
private bool _frameAccentColor;
private bool _soundEnabled;
private bool _doNotActivateOnGameMode;
private bool _roundCornersEnabled;
private string _excludedApps;
private bool _windows11;
}
}