Files
PowerToys/src/core/Microsoft.PowerToys.Settings.UI/ViewModels/FancyZonesViewModel.cs
Ivan Stošić 8f98866d71 [FancyZones] Feature to create zone layouts spanning multiple monitors (#5289)
* Added the setting

* Added a property to Editor Settings

This will be used later

* Fixed a bug in the previous commit

* Simplified a method

* Added snapping points to the editor

* Simplified a method in ZoneSet

* Updated ZoneSet testcases

* Add a method to FancyZones / ZoneWindowHost

* Almost works

* The editor now launches, but FZ does not understand the results

* Refactored some code

* Snapping to a zone by dragging seems to work

* Hotkeys seem to work

* Refresh the work area handler after changing settings

* Fixed zones not snapping to monitor edges when moved

* Remove unused method in FancyZones.h

* Fixed an issue with DPI awareness

* Renamed setting to spanZonesAcrossMonitors

* Renamed a function

* Fixed a bug with the magnetic effect

* Fix restoring window positions on layout changes
2020-08-07 10:06:25 +02:00

493 lines
15 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.Runtime.CompilerServices;
using Microsoft.PowerToys.Settings.UI.Helpers;
using Microsoft.PowerToys.Settings.UI.Lib;
using Microsoft.PowerToys.Settings.UI.ViewModels.Commands;
using Microsoft.PowerToys.Settings.UI.Views;
using Microsoft.Toolkit.Uwp.Helpers;
using Windows.UI;
namespace Microsoft.PowerToys.Settings.UI.ViewModels
{
public class FancyZonesViewModel : Observable
{
private const string ModuleName = "FancyZones";
public ButtonClickCommand LaunchEditorEventHandler { get; set; }
private FancyZonesSettings Settings { get; set; }
public FancyZonesViewModel()
{
try
{
Settings = SettingsUtils.GetSettings<FancyZonesSettings>(ModuleName);
}
catch
{
Settings = new FancyZonesSettings();
SettingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName);
}
LaunchEditorEventHandler = new ButtonClickCommand(LaunchEditor);
_shiftDrag = Settings.Properties.FancyzonesShiftDrag.Value;
_mouseSwitch = Settings.Properties.FancyzonesMouseSwitch.Value;
_overrideSnapHotkeys = Settings.Properties.FancyzonesOverrideSnapHotkeys.Value;
_moveWindowsAcrossMonitors = Settings.Properties.FancyzonesMoveWindowsAcrossMonitors.Value;
_displayChangemoveWindows = Settings.Properties.FancyzonesDisplayChangeMoveWindows.Value;
_zoneSetChangeMoveWindows = Settings.Properties.FancyzonesZoneSetChangeMoveWindows.Value;
_appLastZoneMoveWindows = Settings.Properties.FancyzonesAppLastZoneMoveWindows.Value;
_openWindowOnActiveMonitor = Settings.Properties.FancyzonesOpenWindowOnActiveMonitor.Value;
_restoreSize = Settings.Properties.FancyzonesRestoreSize.Value;
_useCursorPosEditorStartupScreen = Settings.Properties.UseCursorposEditorStartupscreen.Value;
_showOnAllMonitors = Settings.Properties.FancyzonesShowOnAllMonitors.Value;
_spanZonesAcrossMonitors = Settings.Properties.FancyzonesSpanZonesAcrossMonitors.Value;
_makeDraggedWindowTransparent = Settings.Properties.FancyzonesMakeDraggedWindowTransparent.Value;
_highlightOpacity = Settings.Properties.FancyzonesHighlightOpacity.Value;
_excludedApps = Settings.Properties.FancyzonesExcludedApps.Value;
EditorHotkey = Settings.Properties.FancyzonesEditorHotkey.Value;
string inactiveColor = Settings.Properties.FancyzonesInActiveColor.Value;
_zoneInActiveColor = inactiveColor != string.Empty ? inactiveColor.ToColor() : "#F5FCFF".ToColor();
string borderColor = Settings.Properties.FancyzonesBorderColor.Value;
_zoneBorderColor = borderColor != string.Empty ? borderColor.ToColor() : "#FFFFFF".ToColor();
string highlightColor = Settings.Properties.FancyzonesZoneHighlightColor.Value;
_zoneHighlightColor = highlightColor != string.Empty ? highlightColor.ToColor() : "#0078D7".ToColor();
GeneralSettings generalSettings;
try
{
generalSettings = SettingsUtils.GetSettings<GeneralSettings>(string.Empty);
}
catch
{
generalSettings = new GeneralSettings();
SettingsUtils.SaveSettings(generalSettings.ToJsonString(), string.Empty);
}
_isEnabled = generalSettings.Enabled.FancyZones;
}
private bool _isEnabled;
private bool _shiftDrag;
private bool _mouseSwitch;
private bool _overrideSnapHotkeys;
private bool _moveWindowsAcrossMonitors;
private bool _displayChangemoveWindows;
private bool _zoneSetChangeMoveWindows;
private bool _appLastZoneMoveWindows;
private bool _openWindowOnActiveMonitor;
private bool _spanZonesAcrossMonitors;
private bool _restoreSize;
private bool _useCursorPosEditorStartupScreen;
private bool _showOnAllMonitors;
private bool _makeDraggedWindowTransparent;
private int _highlightOpacity;
private string _excludedApps;
private HotkeySettings _editorHotkey;
private Color _zoneInActiveColor;
private Color _zoneBorderColor;
private Color _zoneHighlightColor;
public bool IsEnabled
{
get
{
return _isEnabled;
}
set
{
if (value != _isEnabled)
{
_isEnabled = value;
GeneralSettings generalSettings = SettingsUtils.GetSettings<GeneralSettings>(string.Empty);
generalSettings.Enabled.FancyZones = value;
OutGoingGeneralSettings snd = new OutGoingGeneralSettings(generalSettings);
ShellPage.DefaultSndMSGCallback(snd.ToString());
OnPropertyChanged("IsEnabled");
}
}
}
public bool ShiftDrag
{
get
{
return _shiftDrag;
}
set
{
if (value != _shiftDrag)
{
_shiftDrag = value;
Settings.Properties.FancyzonesShiftDrag.Value = value;
RaisePropertyChanged();
}
}
}
public bool MouseSwitch
{
get
{
return _mouseSwitch;
}
set
{
if (value != _mouseSwitch)
{
_mouseSwitch = value;
Settings.Properties.FancyzonesMouseSwitch.Value = value;
RaisePropertyChanged();
}
}
}
public bool OverrideSnapHotkeys
{
get
{
return _overrideSnapHotkeys;
}
set
{
if (value != _overrideSnapHotkeys)
{
_overrideSnapHotkeys = value;
Settings.Properties.FancyzonesOverrideSnapHotkeys.Value = value;
RaisePropertyChanged();
}
}
}
public bool MoveWindowsAcrossMonitors
{
get
{
return _moveWindowsAcrossMonitors;
}
set
{
if (value != _moveWindowsAcrossMonitors)
{
_moveWindowsAcrossMonitors = value;
Settings.Properties.FancyzonesMoveWindowsAcrossMonitors.Value = value;
RaisePropertyChanged();
}
}
}
public bool DisplayChangeMoveWindows
{
get
{
return _displayChangemoveWindows;
}
set
{
if (value != _displayChangemoveWindows)
{
_displayChangemoveWindows = value;
Settings.Properties.FancyzonesDisplayChangeMoveWindows.Value = value;
RaisePropertyChanged();
}
}
}
public bool ZoneSetChangeMoveWindows
{
get
{
return _zoneSetChangeMoveWindows;
}
set
{
if (value != _zoneSetChangeMoveWindows)
{
_zoneSetChangeMoveWindows = value;
Settings.Properties.FancyzonesZoneSetChangeMoveWindows.Value = value;
RaisePropertyChanged();
}
}
}
public bool AppLastZoneMoveWindows
{
get
{
return _appLastZoneMoveWindows;
}
set
{
if (value != _appLastZoneMoveWindows)
{
_appLastZoneMoveWindows = value;
Settings.Properties.FancyzonesAppLastZoneMoveWindows.Value = value;
RaisePropertyChanged();
}
}
}
public bool OpenWindowOnActiveMonitor
{
get
{
return _openWindowOnActiveMonitor;
}
set
{
if (value != _openWindowOnActiveMonitor)
{
_openWindowOnActiveMonitor = value;
Settings.Properties.FancyzonesOpenWindowOnActiveMonitor.Value = value;
RaisePropertyChanged();
}
}
}
public bool RestoreSize
{
get
{
return _restoreSize;
}
set
{
if (value != _restoreSize)
{
_restoreSize = value;
Settings.Properties.FancyzonesRestoreSize.Value = value;
RaisePropertyChanged();
}
}
}
public bool UseCursorPosEditorStartupScreen
{
get
{
return _useCursorPosEditorStartupScreen;
}
set
{
if (value != _useCursorPosEditorStartupScreen)
{
_useCursorPosEditorStartupScreen = value;
Settings.Properties.UseCursorposEditorStartupscreen.Value = value;
RaisePropertyChanged();
}
}
}
public bool ShowOnAllMonitors
{
get
{
return _showOnAllMonitors;
}
set
{
if (value != _showOnAllMonitors)
{
_showOnAllMonitors = value;
Settings.Properties.FancyzonesShowOnAllMonitors.Value = value;
RaisePropertyChanged();
}
}
}
public bool SpanZonesAcrossMonitors
{
get
{
return _spanZonesAcrossMonitors;
}
set
{
if (value != _spanZonesAcrossMonitors)
{
_spanZonesAcrossMonitors = value;
Settings.Properties.FancyzonesSpanZonesAcrossMonitors.Value = value;
RaisePropertyChanged();
}
}
}
public bool MakeDraggedWindowsTransparent
{
get
{
return _makeDraggedWindowTransparent;
}
set
{
if (value != _makeDraggedWindowTransparent)
{
_makeDraggedWindowTransparent = value;
Settings.Properties.FancyzonesMakeDraggedWindowTransparent.Value = value;
RaisePropertyChanged();
}
}
}
public Color ZoneHighlightColor
{
get
{
return _zoneHighlightColor;
}
set
{
if (value != _zoneHighlightColor)
{
_zoneHighlightColor = value;
Settings.Properties.FancyzonesZoneHighlightColor.Value = ToRGBHex(value);
RaisePropertyChanged();
}
}
}
public Color ZoneBorderColor
{
get
{
return _zoneBorderColor;
}
set
{
if (value != _zoneBorderColor)
{
_zoneBorderColor = value;
Settings.Properties.FancyzonesBorderColor.Value = ToRGBHex(value);
RaisePropertyChanged();
}
}
}
public Color ZoneInActiveColor
{
get
{
return _zoneInActiveColor;
}
set
{
if (value != _zoneInActiveColor)
{
_zoneInActiveColor = value;
Settings.Properties.FancyzonesInActiveColor.Value = ToRGBHex(value);
RaisePropertyChanged();
}
}
}
public int HighlightOpacity
{
get
{
return _highlightOpacity;
}
set
{
if (value != _highlightOpacity)
{
_highlightOpacity = value;
Settings.Properties.FancyzonesHighlightOpacity.Value = value;
RaisePropertyChanged();
}
}
}
public HotkeySettings EditorHotkey
{
get
{
return _editorHotkey;
}
set
{
if (value != _editorHotkey)
{
if (value.IsEmpty())
{
_editorHotkey = FZConfigProperties.DefaultHotkeyValue;
}
else
{
_editorHotkey = value;
}
Settings.Properties.FancyzonesEditorHotkey.Value = _editorHotkey;
RaisePropertyChanged();
}
}
}
public string ExcludedApps
{
get
{
return _excludedApps;
}
set
{
if (value != _excludedApps)
{
_excludedApps = value;
Settings.Properties.FancyzonesExcludedApps.Value = value;
RaisePropertyChanged();
}
}
}
private void LaunchEditor()
{
// send message to launch the zones editor;
ShellPage.DefaultSndMSGCallback("{\"action\":{\"FancyZones\":{\"action_name\":\"ToggledFZEditor\", \"value\":\"\"}}}");
}
private string ToRGBHex(Color color)
{
return "#" + color.R.ToString("X2") + color.G.ToString("X2") + color.B.ToString("X2");
}
public void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
OnPropertyChanged(propertyName);
if (ShellPage.DefaultSndMSGCallback != null)
{
SndFancyZonesSettings outsettings = new SndFancyZonesSettings(Settings);
SndModuleSettings<SndFancyZonesSettings> ipcMessage = new SndModuleSettings<SndFancyZonesSettings>(outsettings);
ShellPage.DefaultSndMSGCallback(ipcMessage.ToJsonString());
}
}
}
}