[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:
Seraphima Zykova
2023-08-29 22:24:30 +03:00
committed by GitHub
parent 2305c8e754
commit 742e50eed7
12 changed files with 101 additions and 134 deletions

View File

@@ -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,18 +48,9 @@ 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;
}
}
private void OnUnloaded(object sender, RoutedEventArgs e)
{

View File

@@ -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)

View File

@@ -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 (model.Type == LayoutType.Blank)
if (EditingLayout.Type == LayoutType.Blank)
{
model.Type = LayoutType.Custom;
EditingLayout.Type = LayoutType.Custom;
}
model.Persist();
EditingLayout.Persist();
MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings;
settings.SetAppliedModel(model);
App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model);
}
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;

View File

@@ -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();
}

View File

@@ -10,7 +10,8 @@ namespace FancyZonesEditor
{
public partial class GridEditorWindow : EditorWindow
{
public GridEditorWindow()
public GridEditorWindow(GridLayoutModel model)
: base(model)
{
InitializeComponent();

View File

@@ -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;
}
}

View File

@@ -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)
{
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();
}
}
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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)
{

View File

@@ -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();