mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +01:00
[FZEditor]Fix "Save and close" not updating layouts (#28201)
* keep editing model * hotkey backup * added restore to base model * pass model as an arg to edit and backup * init canvas zones * serialization * not needed line
This commit is contained in:
@@ -19,12 +19,13 @@ namespace FancyZonesEditor
|
||||
|
||||
private CanvasLayoutModel _model;
|
||||
|
||||
public CanvasEditor()
|
||||
public CanvasEditor(CanvasLayoutModel layout)
|
||||
{
|
||||
InitializeComponent();
|
||||
Loaded += OnLoaded;
|
||||
Unloaded += OnUnloaded;
|
||||
KeyDown += CanvasEditor_KeyDown;
|
||||
_model = layout;
|
||||
}
|
||||
|
||||
private void CanvasEditor_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
|
||||
@@ -47,17 +48,8 @@ namespace FancyZonesEditor
|
||||
|
||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
CanvasLayoutModel model = (CanvasLayoutModel)DataContext;
|
||||
if (model != null)
|
||||
{
|
||||
_model = model;
|
||||
|
||||
var workArea = App.Overlay.WorkArea;
|
||||
|
||||
UpdateZoneRects();
|
||||
|
||||
_model.PropertyChanged += OnModelChanged;
|
||||
}
|
||||
UpdateZoneRects();
|
||||
_model.PropertyChanged += OnModelChanged;
|
||||
}
|
||||
|
||||
private void OnUnloaded(object sender, RoutedEventArgs e)
|
||||
|
||||
@@ -11,39 +11,28 @@ namespace FancyZonesEditor
|
||||
{
|
||||
public partial class CanvasEditorWindow : EditorWindow
|
||||
{
|
||||
private CanvasLayoutModel _model;
|
||||
private CanvasLayoutModel _stashedModel;
|
||||
|
||||
public CanvasEditorWindow()
|
||||
public CanvasEditorWindow(CanvasLayoutModel layout)
|
||||
: base(layout)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
KeyUp += CanvasEditorWindow_KeyUp;
|
||||
KeyDown += CanvasEditorWindow_KeyDown;
|
||||
|
||||
_model = App.Overlay.CurrentDataContext as CanvasLayoutModel;
|
||||
_stashedModel = (CanvasLayoutModel)_model.Clone();
|
||||
}
|
||||
|
||||
public LayoutModel Model
|
||||
{
|
||||
get
|
||||
{
|
||||
return _model;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnAddZone(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Logger.LogInfo("Add zone");
|
||||
_model.AddZone();
|
||||
if (EditingLayout is CanvasLayoutModel canvas)
|
||||
{
|
||||
canvas.AddZone();
|
||||
}
|
||||
}
|
||||
|
||||
protected new void OnCancel(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Logger.LogInfo("Cancel changes");
|
||||
base.OnCancel(sender, e);
|
||||
_stashedModel.RestoreTo(_model);
|
||||
}
|
||||
|
||||
private void CanvasEditorWindow_KeyUp(object sender, KeyEventArgs e)
|
||||
|
||||
@@ -11,29 +11,35 @@ namespace FancyZonesEditor
|
||||
{
|
||||
public class EditorWindow : Window
|
||||
{
|
||||
public LayoutModel EditingLayout { get; set; }
|
||||
|
||||
public EditorWindow(LayoutModel editingLayout)
|
||||
{
|
||||
EditingLayout = editingLayout;
|
||||
}
|
||||
|
||||
protected void OnSaveApplyTemplate(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Logger.LogTrace();
|
||||
var mainEditor = App.Overlay;
|
||||
if (mainEditor.CurrentDataContext is LayoutModel model)
|
||||
|
||||
// If new custom Canvas layout is created (i.e. edited Blank layout),
|
||||
// it's type needs to be updated
|
||||
if (EditingLayout.Type == LayoutType.Blank)
|
||||
{
|
||||
// If new custom Canvas layout is created (i.e. edited Blank layout),
|
||||
// it's type needs to be updated
|
||||
if (model.Type == LayoutType.Blank)
|
||||
{
|
||||
model.Type = LayoutType.Custom;
|
||||
}
|
||||
|
||||
model.Persist();
|
||||
|
||||
MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings;
|
||||
settings.SetAppliedModel(model);
|
||||
App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model);
|
||||
EditingLayout.Type = LayoutType.Custom;
|
||||
}
|
||||
|
||||
EditingLayout.Persist();
|
||||
|
||||
MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings;
|
||||
settings.SetAppliedModel(EditingLayout);
|
||||
App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(EditingLayout);
|
||||
|
||||
App.FancyZonesEditorIO.SerializeLayoutTemplates();
|
||||
App.FancyZonesEditorIO.SerializeCustomLayouts();
|
||||
App.FancyZonesEditorIO.SerializeAppliedLayouts();
|
||||
App.FancyZonesEditorIO.SerializeDefaultLayouts();
|
||||
App.FancyZonesEditorIO.SerializeLayoutHotkeys();
|
||||
|
||||
Close();
|
||||
}
|
||||
@@ -46,7 +52,7 @@ namespace FancyZonesEditor
|
||||
protected void OnCancel(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// restore backup, clean up
|
||||
App.Overlay.EndEditing(true);
|
||||
App.Overlay.EndEditing(EditingLayout);
|
||||
|
||||
// select and draw applied layout
|
||||
var settings = ((App)Application.Current).MainWindowSettings;
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace FancyZonesEditor
|
||||
|
||||
private GridData _data;
|
||||
|
||||
public GridEditor()
|
||||
public GridEditor(GridLayoutModel layoutModel)
|
||||
{
|
||||
InitializeComponent();
|
||||
Loaded += GridEditor_Loaded;
|
||||
@@ -44,6 +44,9 @@ namespace FancyZonesEditor
|
||||
KeyDown += GridEditor_KeyDown;
|
||||
KeyUp += GridEditor_KeyUp;
|
||||
gridEditorUniqueId = ++gridEditorUniqueIdCounter;
|
||||
|
||||
_data = new GridData(layoutModel);
|
||||
Model = layoutModel;
|
||||
}
|
||||
|
||||
public void FocusZone()
|
||||
@@ -58,16 +61,6 @@ namespace FancyZonesEditor
|
||||
private void GridEditor_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
((App)Application.Current).MainWindowSettings.PropertyChanged += ZoneSettings_PropertyChanged;
|
||||
|
||||
GridLayoutModel model = (GridLayoutModel)DataContext;
|
||||
if (model == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_data = new GridData(model);
|
||||
|
||||
Model = model;
|
||||
Model.PropertyChanged += OnGridDimensionsChanged;
|
||||
SetupUI();
|
||||
}
|
||||
|
||||
@@ -10,7 +10,8 @@ namespace FancyZonesEditor
|
||||
{
|
||||
public partial class GridEditorWindow : EditorWindow
|
||||
{
|
||||
public GridEditorWindow()
|
||||
public GridEditorWindow(GridLayoutModel model)
|
||||
: base(model)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
|
||||
@@ -3,14 +3,15 @@
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Windows;
|
||||
using FancyZonesEditor.Models;
|
||||
using FancyZonesEditor.Utils;
|
||||
|
||||
namespace FancyZonesEditor
|
||||
{
|
||||
public class LayoutBackup
|
||||
{
|
||||
private LayoutModel _backup;
|
||||
private string _hotkeyBackup;
|
||||
private List<LayoutModel> _defaultLayoutsBackup;
|
||||
|
||||
public LayoutBackup()
|
||||
@@ -28,32 +29,31 @@ namespace FancyZonesEditor
|
||||
_backup = new CanvasLayoutModel(canvas);
|
||||
}
|
||||
|
||||
_hotkeyBackup = MainWindowSettingsModel.LayoutHotkeys.Key(model.Uuid);
|
||||
_defaultLayoutsBackup = new List<LayoutModel>(MainWindowSettingsModel.DefaultLayouts.Layouts);
|
||||
}
|
||||
|
||||
public void Restore()
|
||||
public void Restore(LayoutModel layoutToRestore)
|
||||
{
|
||||
if (_backup != null)
|
||||
if (_backup != null && layoutToRestore != null)
|
||||
{
|
||||
var settings = ((App)Application.Current).MainWindowSettings;
|
||||
var selectedModel = settings.SelectedModel;
|
||||
|
||||
if (selectedModel == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_backup is GridLayoutModel grid)
|
||||
{
|
||||
grid.RestoreTo((GridLayoutModel)selectedModel);
|
||||
grid.RestoreTo((GridLayoutModel)layoutToRestore);
|
||||
grid.InitTemplateZones();
|
||||
}
|
||||
else if (_backup is CanvasLayoutModel canvas)
|
||||
{
|
||||
canvas.RestoreTo((CanvasLayoutModel)selectedModel);
|
||||
canvas.RestoreTo((CanvasLayoutModel)layoutToRestore);
|
||||
canvas.InitTemplateZones();
|
||||
}
|
||||
}
|
||||
|
||||
if (_hotkeyBackup != null)
|
||||
{
|
||||
MainWindowSettingsModel.LayoutHotkeys.SelectKey(_hotkeyBackup, layoutToRestore.Uuid);
|
||||
}
|
||||
|
||||
if (_defaultLayoutsBackup != null)
|
||||
{
|
||||
MainWindowSettingsModel.DefaultLayouts.Restore(_defaultLayoutsBackup);
|
||||
@@ -63,6 +63,7 @@ namespace FancyZonesEditor
|
||||
public void Clear()
|
||||
{
|
||||
_backup = null;
|
||||
_hotkeyBackup = null;
|
||||
_defaultLayoutsBackup = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,29 +146,17 @@ namespace FancyZonesEditor
|
||||
|
||||
private void DecrementZones_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var mainEditor = App.Overlay;
|
||||
if (mainEditor.CurrentDataContext is not LayoutModel model)
|
||||
if (_settings.SelectedModel.TemplateZoneCount > 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (model.TemplateZoneCount > 1)
|
||||
{
|
||||
model.TemplateZoneCount--;
|
||||
_settings.SelectedModel.TemplateZoneCount--;
|
||||
}
|
||||
}
|
||||
|
||||
private void IncrementZones_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var mainEditor = App.Overlay;
|
||||
if (mainEditor.CurrentDataContext is not LayoutModel model)
|
||||
if (_settings.SelectedModel.IsZoneAddingAllowed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (model.IsZoneAddingAllowed)
|
||||
{
|
||||
model.TemplateZoneCount++;
|
||||
_settings.SelectedModel.TemplateZoneCount++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -303,25 +291,23 @@ namespace FancyZonesEditor
|
||||
private void Apply()
|
||||
{
|
||||
Logger.LogTrace();
|
||||
var mainEditor = App.Overlay;
|
||||
if (mainEditor.CurrentDataContext is LayoutModel model)
|
||||
{
|
||||
_settings.SetAppliedModel(model);
|
||||
App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model);
|
||||
App.FancyZonesEditorIO.SerializeAppliedLayouts();
|
||||
App.FancyZonesEditorIO.SerializeCustomLayouts();
|
||||
}
|
||||
|
||||
LayoutModel model = _settings.SelectedModel;
|
||||
_settings.SetAppliedModel(model);
|
||||
App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model);
|
||||
App.FancyZonesEditorIO.SerializeAppliedLayouts();
|
||||
App.FancyZonesEditorIO.SerializeCustomLayouts();
|
||||
}
|
||||
|
||||
private void OnClosing(object sender, EventArgs e)
|
||||
{
|
||||
Logger.LogTrace();
|
||||
App.Overlay.EndEditing(true);
|
||||
|
||||
App.FancyZonesEditorIO.SerializeAppliedLayouts();
|
||||
App.FancyZonesEditorIO.SerializeCustomLayouts();
|
||||
App.FancyZonesEditorIO.SerializeLayoutHotkeys();
|
||||
App.FancyZonesEditorIO.SerializeLayoutTemplates();
|
||||
App.FancyZonesEditorIO.SerializeDefaultLayouts();
|
||||
App.Overlay.CloseLayoutWindow();
|
||||
App.Current.Shutdown();
|
||||
}
|
||||
@@ -345,7 +331,8 @@ namespace FancyZonesEditor
|
||||
|
||||
var dataContext = ((FrameworkElement)sender).DataContext;
|
||||
Select((LayoutModel)dataContext);
|
||||
App.Overlay.StartEditing((LayoutModel)dataContext);
|
||||
|
||||
App.Overlay.StartEditing(_settings.SelectedModel);
|
||||
|
||||
Keyboard.ClearFocus();
|
||||
EditLayoutDialogTitle.Text = string.Format(CultureInfo.CurrentCulture, Properties.Resources.Edit_Template, ((LayoutModel)dataContext).Name);
|
||||
@@ -358,16 +345,8 @@ namespace FancyZonesEditor
|
||||
var dataContext = ((FrameworkElement)sender).DataContext;
|
||||
Select((LayoutModel)dataContext);
|
||||
EditLayoutDialog.Hide();
|
||||
var mainEditor = App.Overlay;
|
||||
if (mainEditor.CurrentDataContext is not LayoutModel model)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_settings.SetSelectedModel(model);
|
||||
|
||||
Hide();
|
||||
mainEditor.OpenEditor(model);
|
||||
App.Overlay.OpenEditor(_settings.SelectedModel);
|
||||
}
|
||||
|
||||
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
|
||||
@@ -438,7 +417,7 @@ namespace FancyZonesEditor
|
||||
// EditLayout: Cancel changes
|
||||
private void EditLayoutDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
|
||||
{
|
||||
App.Overlay.EndEditing(false);
|
||||
App.Overlay.EndEditing(_settings.SelectedModel);
|
||||
Select(_settings.AppliedModel);
|
||||
}
|
||||
|
||||
@@ -447,13 +426,8 @@ namespace FancyZonesEditor
|
||||
{
|
||||
Logger.LogTrace();
|
||||
|
||||
var mainEditor = App.Overlay;
|
||||
if (mainEditor.CurrentDataContext is not LayoutModel model)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mainEditor.EndEditing(false);
|
||||
App.Overlay.EndEditing(null);
|
||||
LayoutModel model = _settings.SelectedModel;
|
||||
|
||||
// update current settings
|
||||
if (model == _settings.AppliedModel)
|
||||
@@ -465,6 +439,7 @@ namespace FancyZonesEditor
|
||||
App.FancyZonesEditorIO.SerializeCustomLayouts();
|
||||
App.FancyZonesEditorIO.SerializeLayoutTemplates();
|
||||
App.FancyZonesEditorIO.SerializeLayoutHotkeys();
|
||||
App.FancyZonesEditorIO.SerializeDefaultLayouts();
|
||||
|
||||
// reset selected model
|
||||
Select(_settings.AppliedModel);
|
||||
@@ -653,7 +628,6 @@ namespace FancyZonesEditor
|
||||
if (dataContext is LayoutModel model)
|
||||
{
|
||||
MainWindowSettingsModel.DefaultLayouts.Set(model, MonitorConfigurationType.Vertical);
|
||||
App.FancyZonesEditorIO.SerializeDefaultLayouts();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -663,7 +637,6 @@ namespace FancyZonesEditor
|
||||
if (dataContext is LayoutModel model)
|
||||
{
|
||||
MainWindowSettingsModel.DefaultLayouts.Set(model, MonitorConfigurationType.Horizontal);
|
||||
App.FancyZonesEditorIO.SerializeDefaultLayouts();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -673,7 +646,6 @@ namespace FancyZonesEditor
|
||||
if (dataContext is LayoutModel model)
|
||||
{
|
||||
MainWindowSettingsModel.DefaultLayouts.Reset(MonitorConfigurationType.Horizontal);
|
||||
App.FancyZonesEditorIO.SerializeDefaultLayouts();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -683,7 +655,6 @@ namespace FancyZonesEditor
|
||||
if (dataContext is LayoutModel model)
|
||||
{
|
||||
MainWindowSettingsModel.DefaultLayouts.Reset(MonitorConfigurationType.Vertical);
|
||||
App.FancyZonesEditorIO.SerializeDefaultLayouts();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,6 +184,8 @@ namespace FancyZonesEditor.Models
|
||||
|
||||
public void RestoreTo(CanvasLayoutModel other)
|
||||
{
|
||||
base.RestoreTo(other);
|
||||
|
||||
other.Zones.Clear();
|
||||
foreach (Int32Rect zone in Zones)
|
||||
{
|
||||
@@ -191,7 +193,6 @@ namespace FancyZonesEditor.Models
|
||||
}
|
||||
|
||||
other._topLeft = _topLeft;
|
||||
other.SensitivityRadius = SensitivityRadius;
|
||||
other.CanvasRect = CanvasRect;
|
||||
other.UpdateLayout();
|
||||
}
|
||||
|
||||
@@ -280,6 +280,8 @@ namespace FancyZonesEditor.Models
|
||||
|
||||
public void RestoreTo(GridLayoutModel layout)
|
||||
{
|
||||
base.RestoreTo(layout);
|
||||
|
||||
int rows = Rows;
|
||||
int cols = Columns;
|
||||
|
||||
@@ -315,7 +317,6 @@ namespace FancyZonesEditor.Models
|
||||
|
||||
layout.ShowSpacing = ShowSpacing;
|
||||
layout.Spacing = Spacing;
|
||||
layout.SensitivityRadius = SensitivityRadius;
|
||||
|
||||
layout.FirePropertyChanged();
|
||||
}
|
||||
|
||||
@@ -68,6 +68,19 @@ namespace FancyZonesEditor.Models
|
||||
return true;
|
||||
}
|
||||
|
||||
public string Key(string uuid)
|
||||
{
|
||||
foreach (var pair in SelectedKeys)
|
||||
{
|
||||
if (pair.Value == uuid)
|
||||
{
|
||||
return pair.Key;
|
||||
}
|
||||
}
|
||||
|
||||
return Properties.Resources.Quick_Key_None;
|
||||
}
|
||||
|
||||
public void CleanUp()
|
||||
{
|
||||
var keys = SelectedKeys.Keys.ToList();
|
||||
|
||||
@@ -339,6 +339,12 @@ namespace FancyZonesEditor.Models
|
||||
}
|
||||
}
|
||||
|
||||
public void RestoreTo(LayoutModel layout)
|
||||
{
|
||||
layout.SensitivityRadius = SensitivityRadius;
|
||||
layout.TemplateZoneCount = TemplateZoneCount;
|
||||
}
|
||||
|
||||
// Adds new custom Layout
|
||||
public void AddCustomLayout(LayoutModel model)
|
||||
{
|
||||
|
||||
@@ -186,26 +186,19 @@ namespace FancyZonesEditor
|
||||
Logger.LogTrace();
|
||||
|
||||
_layoutPreview = null;
|
||||
if (CurrentDataContext is GridLayoutModel)
|
||||
if (model is GridLayoutModel grid)
|
||||
{
|
||||
_editorLayout = new GridEditor();
|
||||
_editorLayout = new GridEditor(grid);
|
||||
_editorWindow = new GridEditorWindow(grid);
|
||||
}
|
||||
else if (CurrentDataContext is CanvasLayoutModel)
|
||||
else if (model is CanvasLayoutModel canvas)
|
||||
{
|
||||
_editorLayout = new CanvasEditor();
|
||||
_editorLayout = new CanvasEditor(canvas);
|
||||
_editorWindow = new CanvasEditorWindow(canvas);
|
||||
}
|
||||
|
||||
CurrentLayoutWindow.Content = _editorLayout;
|
||||
|
||||
if (model is GridLayoutModel)
|
||||
{
|
||||
_editorWindow = new GridEditorWindow();
|
||||
}
|
||||
else
|
||||
{
|
||||
_editorWindow = new CanvasEditorWindow();
|
||||
}
|
||||
|
||||
_editorWindow.Owner = Monitors[App.Overlay.CurrentDesktop].Window;
|
||||
_editorWindow.DataContext = model;
|
||||
_editorWindow.Show();
|
||||
@@ -267,11 +260,11 @@ namespace FancyZonesEditor
|
||||
_layoutBackup.Backup(model);
|
||||
}
|
||||
|
||||
public void EndEditing(bool restoreBackup)
|
||||
public void EndEditing(LayoutModel modelToRestore)
|
||||
{
|
||||
if (restoreBackup)
|
||||
if (modelToRestore != null)
|
||||
{
|
||||
_layoutBackup.Restore();
|
||||
_layoutBackup.Restore(modelToRestore);
|
||||
}
|
||||
|
||||
_layoutBackup.Clear();
|
||||
|
||||
Reference in New Issue
Block a user