[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; private CanvasLayoutModel _model;
public CanvasEditor() public CanvasEditor(CanvasLayoutModel layout)
{ {
InitializeComponent(); InitializeComponent();
Loaded += OnLoaded; Loaded += OnLoaded;
Unloaded += OnUnloaded; Unloaded += OnUnloaded;
KeyDown += CanvasEditor_KeyDown; KeyDown += CanvasEditor_KeyDown;
_model = layout;
} }
private void CanvasEditor_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) private void CanvasEditor_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
@@ -47,17 +48,8 @@ namespace FancyZonesEditor
private void OnLoaded(object sender, RoutedEventArgs e) private void OnLoaded(object sender, RoutedEventArgs e)
{ {
CanvasLayoutModel model = (CanvasLayoutModel)DataContext; UpdateZoneRects();
if (model != null) _model.PropertyChanged += OnModelChanged;
{
_model = model;
var workArea = App.Overlay.WorkArea;
UpdateZoneRects();
_model.PropertyChanged += OnModelChanged;
}
} }
private void OnUnloaded(object sender, RoutedEventArgs e) private void OnUnloaded(object sender, RoutedEventArgs e)

View File

@@ -11,39 +11,28 @@ namespace FancyZonesEditor
{ {
public partial class CanvasEditorWindow : EditorWindow public partial class CanvasEditorWindow : EditorWindow
{ {
private CanvasLayoutModel _model; public CanvasEditorWindow(CanvasLayoutModel layout)
private CanvasLayoutModel _stashedModel; : base(layout)
public CanvasEditorWindow()
{ {
InitializeComponent(); InitializeComponent();
KeyUp += CanvasEditorWindow_KeyUp; KeyUp += CanvasEditorWindow_KeyUp;
KeyDown += CanvasEditorWindow_KeyDown; 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) private void OnAddZone(object sender, RoutedEventArgs e)
{ {
Logger.LogInfo("Add zone"); Logger.LogInfo("Add zone");
_model.AddZone(); if (EditingLayout is CanvasLayoutModel canvas)
{
canvas.AddZone();
}
} }
protected new void OnCancel(object sender, RoutedEventArgs e) protected new void OnCancel(object sender, RoutedEventArgs e)
{ {
Logger.LogInfo("Cancel changes"); Logger.LogInfo("Cancel changes");
base.OnCancel(sender, e); base.OnCancel(sender, e);
_stashedModel.RestoreTo(_model);
} }
private void CanvasEditorWindow_KeyUp(object sender, KeyEventArgs e) private void CanvasEditorWindow_KeyUp(object sender, KeyEventArgs e)

View File

@@ -11,29 +11,35 @@ namespace FancyZonesEditor
{ {
public class EditorWindow : Window public class EditorWindow : Window
{ {
public LayoutModel EditingLayout { get; set; }
public EditorWindow(LayoutModel editingLayout)
{
EditingLayout = editingLayout;
}
protected void OnSaveApplyTemplate(object sender, RoutedEventArgs e) protected void OnSaveApplyTemplate(object sender, RoutedEventArgs e)
{ {
Logger.LogTrace(); 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), EditingLayout.Type = LayoutType.Custom;
// 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.Persist();
MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings;
settings.SetAppliedModel(EditingLayout);
App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(EditingLayout);
App.FancyZonesEditorIO.SerializeLayoutTemplates(); App.FancyZonesEditorIO.SerializeLayoutTemplates();
App.FancyZonesEditorIO.SerializeCustomLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts();
App.FancyZonesEditorIO.SerializeAppliedLayouts(); App.FancyZonesEditorIO.SerializeAppliedLayouts();
App.FancyZonesEditorIO.SerializeDefaultLayouts();
App.FancyZonesEditorIO.SerializeLayoutHotkeys();
Close(); Close();
} }
@@ -46,7 +52,7 @@ namespace FancyZonesEditor
protected void OnCancel(object sender, RoutedEventArgs e) protected void OnCancel(object sender, RoutedEventArgs e)
{ {
// restore backup, clean up // restore backup, clean up
App.Overlay.EndEditing(true); App.Overlay.EndEditing(EditingLayout);
// select and draw applied layout // select and draw applied layout
var settings = ((App)Application.Current).MainWindowSettings; var settings = ((App)Application.Current).MainWindowSettings;

View File

@@ -36,7 +36,7 @@ namespace FancyZonesEditor
private GridData _data; private GridData _data;
public GridEditor() public GridEditor(GridLayoutModel layoutModel)
{ {
InitializeComponent(); InitializeComponent();
Loaded += GridEditor_Loaded; Loaded += GridEditor_Loaded;
@@ -44,6 +44,9 @@ namespace FancyZonesEditor
KeyDown += GridEditor_KeyDown; KeyDown += GridEditor_KeyDown;
KeyUp += GridEditor_KeyUp; KeyUp += GridEditor_KeyUp;
gridEditorUniqueId = ++gridEditorUniqueIdCounter; gridEditorUniqueId = ++gridEditorUniqueIdCounter;
_data = new GridData(layoutModel);
Model = layoutModel;
} }
public void FocusZone() public void FocusZone()
@@ -58,16 +61,6 @@ namespace FancyZonesEditor
private void GridEditor_Loaded(object sender, RoutedEventArgs e) private void GridEditor_Loaded(object sender, RoutedEventArgs e)
{ {
((App)Application.Current).MainWindowSettings.PropertyChanged += ZoneSettings_PropertyChanged; ((App)Application.Current).MainWindowSettings.PropertyChanged += ZoneSettings_PropertyChanged;
GridLayoutModel model = (GridLayoutModel)DataContext;
if (model == null)
{
return;
}
_data = new GridData(model);
Model = model;
Model.PropertyChanged += OnGridDimensionsChanged; Model.PropertyChanged += OnGridDimensionsChanged;
SetupUI(); SetupUI();
} }

View File

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

View File

@@ -3,14 +3,15 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System.Collections.Generic; using System.Collections.Generic;
using System.Windows;
using FancyZonesEditor.Models; using FancyZonesEditor.Models;
using FancyZonesEditor.Utils;
namespace FancyZonesEditor namespace FancyZonesEditor
{ {
public class LayoutBackup public class LayoutBackup
{ {
private LayoutModel _backup; private LayoutModel _backup;
private string _hotkeyBackup;
private List<LayoutModel> _defaultLayoutsBackup; private List<LayoutModel> _defaultLayoutsBackup;
public LayoutBackup() public LayoutBackup()
@@ -28,32 +29,31 @@ namespace FancyZonesEditor
_backup = new CanvasLayoutModel(canvas); _backup = new CanvasLayoutModel(canvas);
} }
_hotkeyBackup = MainWindowSettingsModel.LayoutHotkeys.Key(model.Uuid);
_defaultLayoutsBackup = new List<LayoutModel>(MainWindowSettingsModel.DefaultLayouts.Layouts); _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) if (_backup is GridLayoutModel grid)
{ {
grid.RestoreTo((GridLayoutModel)selectedModel); grid.RestoreTo((GridLayoutModel)layoutToRestore);
grid.InitTemplateZones(); grid.InitTemplateZones();
} }
else if (_backup is CanvasLayoutModel canvas) 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) if (_defaultLayoutsBackup != null)
{ {
MainWindowSettingsModel.DefaultLayouts.Restore(_defaultLayoutsBackup); MainWindowSettingsModel.DefaultLayouts.Restore(_defaultLayoutsBackup);
@@ -63,6 +63,7 @@ namespace FancyZonesEditor
public void Clear() public void Clear()
{ {
_backup = null; _backup = null;
_hotkeyBackup = null;
_defaultLayoutsBackup = null; _defaultLayoutsBackup = null;
} }
} }

View File

@@ -146,29 +146,17 @@ namespace FancyZonesEditor
private void DecrementZones_Click(object sender, RoutedEventArgs e) private void DecrementZones_Click(object sender, RoutedEventArgs e)
{ {
var mainEditor = App.Overlay; if (_settings.SelectedModel.TemplateZoneCount > 1)
if (mainEditor.CurrentDataContext is not LayoutModel model)
{ {
return; _settings.SelectedModel.TemplateZoneCount--;
}
if (model.TemplateZoneCount > 1)
{
model.TemplateZoneCount--;
} }
} }
private void IncrementZones_Click(object sender, RoutedEventArgs e) private void IncrementZones_Click(object sender, RoutedEventArgs e)
{ {
var mainEditor = App.Overlay; if (_settings.SelectedModel.IsZoneAddingAllowed)
if (mainEditor.CurrentDataContext is not LayoutModel model)
{ {
return; _settings.SelectedModel.TemplateZoneCount++;
}
if (model.IsZoneAddingAllowed)
{
model.TemplateZoneCount++;
} }
} }
@@ -303,25 +291,23 @@ namespace FancyZonesEditor
private void Apply() private void Apply()
{ {
Logger.LogTrace(); Logger.LogTrace();
var mainEditor = App.Overlay;
if (mainEditor.CurrentDataContext is LayoutModel model) LayoutModel model = _settings.SelectedModel;
{ _settings.SetAppliedModel(model);
_settings.SetAppliedModel(model); App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model);
App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model); App.FancyZonesEditorIO.SerializeAppliedLayouts();
App.FancyZonesEditorIO.SerializeAppliedLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts();
App.FancyZonesEditorIO.SerializeCustomLayouts();
}
} }
private void OnClosing(object sender, EventArgs e) private void OnClosing(object sender, EventArgs e)
{ {
Logger.LogTrace(); Logger.LogTrace();
App.Overlay.EndEditing(true);
App.FancyZonesEditorIO.SerializeAppliedLayouts(); App.FancyZonesEditorIO.SerializeAppliedLayouts();
App.FancyZonesEditorIO.SerializeCustomLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts();
App.FancyZonesEditorIO.SerializeLayoutHotkeys(); App.FancyZonesEditorIO.SerializeLayoutHotkeys();
App.FancyZonesEditorIO.SerializeLayoutTemplates(); App.FancyZonesEditorIO.SerializeLayoutTemplates();
App.FancyZonesEditorIO.SerializeDefaultLayouts();
App.Overlay.CloseLayoutWindow(); App.Overlay.CloseLayoutWindow();
App.Current.Shutdown(); App.Current.Shutdown();
} }
@@ -345,7 +331,8 @@ namespace FancyZonesEditor
var dataContext = ((FrameworkElement)sender).DataContext; var dataContext = ((FrameworkElement)sender).DataContext;
Select((LayoutModel)dataContext); Select((LayoutModel)dataContext);
App.Overlay.StartEditing((LayoutModel)dataContext);
App.Overlay.StartEditing(_settings.SelectedModel);
Keyboard.ClearFocus(); Keyboard.ClearFocus();
EditLayoutDialogTitle.Text = string.Format(CultureInfo.CurrentCulture, Properties.Resources.Edit_Template, ((LayoutModel)dataContext).Name); EditLayoutDialogTitle.Text = string.Format(CultureInfo.CurrentCulture, Properties.Resources.Edit_Template, ((LayoutModel)dataContext).Name);
@@ -358,16 +345,8 @@ namespace FancyZonesEditor
var dataContext = ((FrameworkElement)sender).DataContext; var dataContext = ((FrameworkElement)sender).DataContext;
Select((LayoutModel)dataContext); Select((LayoutModel)dataContext);
EditLayoutDialog.Hide(); EditLayoutDialog.Hide();
var mainEditor = App.Overlay;
if (mainEditor.CurrentDataContext is not LayoutModel model)
{
return;
}
_settings.SetSelectedModel(model);
Hide(); Hide();
mainEditor.OpenEditor(model); App.Overlay.OpenEditor(_settings.SelectedModel);
} }
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
@@ -438,7 +417,7 @@ namespace FancyZonesEditor
// EditLayout: Cancel changes // EditLayout: Cancel changes
private void EditLayoutDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args) private void EditLayoutDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{ {
App.Overlay.EndEditing(false); App.Overlay.EndEditing(_settings.SelectedModel);
Select(_settings.AppliedModel); Select(_settings.AppliedModel);
} }
@@ -447,13 +426,8 @@ namespace FancyZonesEditor
{ {
Logger.LogTrace(); Logger.LogTrace();
var mainEditor = App.Overlay; App.Overlay.EndEditing(null);
if (mainEditor.CurrentDataContext is not LayoutModel model) LayoutModel model = _settings.SelectedModel;
{
return;
}
mainEditor.EndEditing(false);
// update current settings // update current settings
if (model == _settings.AppliedModel) if (model == _settings.AppliedModel)
@@ -465,6 +439,7 @@ namespace FancyZonesEditor
App.FancyZonesEditorIO.SerializeCustomLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts();
App.FancyZonesEditorIO.SerializeLayoutTemplates(); App.FancyZonesEditorIO.SerializeLayoutTemplates();
App.FancyZonesEditorIO.SerializeLayoutHotkeys(); App.FancyZonesEditorIO.SerializeLayoutHotkeys();
App.FancyZonesEditorIO.SerializeDefaultLayouts();
// reset selected model // reset selected model
Select(_settings.AppliedModel); Select(_settings.AppliedModel);
@@ -653,7 +628,6 @@ namespace FancyZonesEditor
if (dataContext is LayoutModel model) if (dataContext is LayoutModel model)
{ {
MainWindowSettingsModel.DefaultLayouts.Set(model, MonitorConfigurationType.Vertical); MainWindowSettingsModel.DefaultLayouts.Set(model, MonitorConfigurationType.Vertical);
App.FancyZonesEditorIO.SerializeDefaultLayouts();
} }
} }
@@ -663,7 +637,6 @@ namespace FancyZonesEditor
if (dataContext is LayoutModel model) if (dataContext is LayoutModel model)
{ {
MainWindowSettingsModel.DefaultLayouts.Set(model, MonitorConfigurationType.Horizontal); MainWindowSettingsModel.DefaultLayouts.Set(model, MonitorConfigurationType.Horizontal);
App.FancyZonesEditorIO.SerializeDefaultLayouts();
} }
} }
@@ -673,7 +646,6 @@ namespace FancyZonesEditor
if (dataContext is LayoutModel model) if (dataContext is LayoutModel model)
{ {
MainWindowSettingsModel.DefaultLayouts.Reset(MonitorConfigurationType.Horizontal); MainWindowSettingsModel.DefaultLayouts.Reset(MonitorConfigurationType.Horizontal);
App.FancyZonesEditorIO.SerializeDefaultLayouts();
} }
} }
@@ -683,7 +655,6 @@ namespace FancyZonesEditor
if (dataContext is LayoutModel model) if (dataContext is LayoutModel model)
{ {
MainWindowSettingsModel.DefaultLayouts.Reset(MonitorConfigurationType.Vertical); MainWindowSettingsModel.DefaultLayouts.Reset(MonitorConfigurationType.Vertical);
App.FancyZonesEditorIO.SerializeDefaultLayouts();
} }
} }
} }

View File

@@ -184,6 +184,8 @@ namespace FancyZonesEditor.Models
public void RestoreTo(CanvasLayoutModel other) public void RestoreTo(CanvasLayoutModel other)
{ {
base.RestoreTo(other);
other.Zones.Clear(); other.Zones.Clear();
foreach (Int32Rect zone in Zones) foreach (Int32Rect zone in Zones)
{ {
@@ -191,7 +193,6 @@ namespace FancyZonesEditor.Models
} }
other._topLeft = _topLeft; other._topLeft = _topLeft;
other.SensitivityRadius = SensitivityRadius;
other.CanvasRect = CanvasRect; other.CanvasRect = CanvasRect;
other.UpdateLayout(); other.UpdateLayout();
} }

View File

@@ -280,6 +280,8 @@ namespace FancyZonesEditor.Models
public void RestoreTo(GridLayoutModel layout) public void RestoreTo(GridLayoutModel layout)
{ {
base.RestoreTo(layout);
int rows = Rows; int rows = Rows;
int cols = Columns; int cols = Columns;
@@ -315,7 +317,6 @@ namespace FancyZonesEditor.Models
layout.ShowSpacing = ShowSpacing; layout.ShowSpacing = ShowSpacing;
layout.Spacing = Spacing; layout.Spacing = Spacing;
layout.SensitivityRadius = SensitivityRadius;
layout.FirePropertyChanged(); layout.FirePropertyChanged();
} }

View File

@@ -68,6 +68,19 @@ namespace FancyZonesEditor.Models
return true; 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() public void CleanUp()
{ {
var keys = SelectedKeys.Keys.ToList(); 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 // Adds new custom Layout
public void AddCustomLayout(LayoutModel model) public void AddCustomLayout(LayoutModel model)
{ {

View File

@@ -186,26 +186,19 @@ namespace FancyZonesEditor
Logger.LogTrace(); Logger.LogTrace();
_layoutPreview = null; _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; CurrentLayoutWindow.Content = _editorLayout;
if (model is GridLayoutModel)
{
_editorWindow = new GridEditorWindow();
}
else
{
_editorWindow = new CanvasEditorWindow();
}
_editorWindow.Owner = Monitors[App.Overlay.CurrentDesktop].Window; _editorWindow.Owner = Monitors[App.Overlay.CurrentDesktop].Window;
_editorWindow.DataContext = model; _editorWindow.DataContext = model;
_editorWindow.Show(); _editorWindow.Show();
@@ -267,11 +260,11 @@ namespace FancyZonesEditor
_layoutBackup.Backup(model); _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(); _layoutBackup.Clear();