From c2bb2a8c3aa0e8c225d0ce1af70971af36125566 Mon Sep 17 00:00:00 2001 From: Seraphima Zykova Date: Tue, 22 Aug 2023 21:25:03 +0300 Subject: [PATCH] [FancyZones Editor] Duplicating non-selected layout applies duplicated layout fix (#28042) --- .../editor/FancyZonesEditor/EditorWindow.cs | 8 +++ .../FancyZonesEditor/GridEditorWindow.xaml.cs | 6 -- .../editor/FancyZonesEditor/LayoutBackup.cs | 69 +++++++++++++++++++ .../FancyZonesEditor/MainWindow.xaml.cs | 53 ++------------ .../Models/MainWindowSettingsModel.cs | 21 ------ .../editor/FancyZonesEditor/Overlay.cs | 16 +++++ 6 files changed, 98 insertions(+), 75 deletions(-) create mode 100644 src/modules/fancyzones/editor/FancyZonesEditor/LayoutBackup.cs diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs b/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs index 908d5fe32f..2f9cd05372 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs @@ -45,6 +45,14 @@ namespace FancyZonesEditor protected void OnCancel(object sender, RoutedEventArgs e) { + // restore backup, clean up + App.Overlay.EndEditing(true); + + // select and draw applied layout + var settings = ((App)Application.Current).MainWindowSettings; + settings.SetSelectedModel(settings.AppliedModel); + App.Overlay.CurrentDataContext = settings.AppliedModel; + Close(); } } diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/GridEditorWindow.xaml.cs b/src/modules/fancyzones/editor/FancyZonesEditor/GridEditorWindow.xaml.cs index 72179e5a2a..1aea412c66 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/GridEditorWindow.xaml.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/GridEditorWindow.xaml.cs @@ -16,15 +16,11 @@ namespace FancyZonesEditor KeyUp += GridEditorWindow_KeyUp; KeyDown += ((App)Application.Current).App_KeyDown; - - _stashedModel = (GridLayoutModel)(App.Overlay.CurrentDataContext as GridLayoutModel).Clone(); } protected new void OnCancel(object sender, RoutedEventArgs e) { base.OnCancel(sender, e); - GridLayoutModel model = App.Overlay.CurrentDataContext as GridLayoutModel; - _stashedModel.RestoreTo(model); } private void GridEditorWindow_KeyUp(object sender, KeyEventArgs e) @@ -37,8 +33,6 @@ namespace FancyZonesEditor ((App)Application.Current).App_KeyUp(sender, e); } - private GridLayoutModel _stashedModel; - // This is required to fix a WPF rendering bug when using custom chrome private void EditorWindow_ContentRendered(object sender, System.EventArgs e) { diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/LayoutBackup.cs b/src/modules/fancyzones/editor/FancyZonesEditor/LayoutBackup.cs new file mode 100644 index 0000000000..36dd671107 --- /dev/null +++ b/src/modules/fancyzones/editor/FancyZonesEditor/LayoutBackup.cs @@ -0,0 +1,69 @@ +// 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.Collections.Generic; +using System.Windows; +using FancyZonesEditor.Models; + +namespace FancyZonesEditor +{ + public class LayoutBackup + { + private LayoutModel _backup; + private List _defaultLayoutsBackup; + + public LayoutBackup() + { + } + + public void Backup(LayoutModel model) + { + if (model is GridLayoutModel grid) + { + _backup = new GridLayoutModel(grid); + } + else if (model is CanvasLayoutModel canvas) + { + _backup = new CanvasLayoutModel(canvas); + } + + _defaultLayoutsBackup = new List(MainWindowSettingsModel.DefaultLayouts.Layouts); + } + + public void Restore() + { + if (_backup != 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.InitTemplateZones(); + } + else if (_backup is CanvasLayoutModel canvas) + { + canvas.RestoreTo((CanvasLayoutModel)selectedModel); + } + } + + if (_defaultLayoutsBackup != null) + { + MainWindowSettingsModel.DefaultLayouts.Restore(_defaultLayoutsBackup); + } + } + + public void Clear() + { + _backup = null; + _defaultLayoutsBackup = null; + } + } +} diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs b/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs index 5c2eaeee36..b5dd83edb6 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs @@ -30,8 +30,6 @@ namespace FancyZonesEditor private const int MinimalForDefaultWrapPanelsHeight = 900; private readonly MainWindowSettingsModel _settings = ((App)Application.Current).MainWindowSettings; - private LayoutModel _backup; - private List _defaultLayoutsBackup; private ContentDialog _openedDialog; private TextBlock _createLayoutAnnounce; @@ -244,21 +242,15 @@ namespace FancyZonesEditor Logger.LogTrace(); var dataContext = ((FrameworkElement)sender).DataContext; - Select((LayoutModel)dataContext); - EditLayoutDialog.Hide(); - var mainEditor = App.Overlay; - if (mainEditor.CurrentDataContext is not LayoutModel model) + if (dataContext is not LayoutModel model) { return; } - model.IsSelected = false; - // make a copy model = model.Clone(); - mainEditor.CurrentDataContext = model; string name = model.Name; var index = name.LastIndexOf('('); @@ -293,11 +285,8 @@ namespace FancyZonesEditor } model.Name = name + " (" + (++maxCustomIndex) + ')'; - model.Persist(); - App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model); - App.FancyZonesEditorIO.SerializeAppliedLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts(); } @@ -327,7 +316,7 @@ namespace FancyZonesEditor private void OnClosing(object sender, EventArgs e) { Logger.LogTrace(); - CancelLayoutChanges(); + App.Overlay.EndEditing(true); App.FancyZonesEditorIO.SerializeAppliedLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts(); @@ -356,17 +345,7 @@ namespace FancyZonesEditor var dataContext = ((FrameworkElement)sender).DataContext; Select((LayoutModel)dataContext); - - if (_settings.SelectedModel is GridLayoutModel grid) - { - _backup = new GridLayoutModel(grid); - } - else if (_settings.SelectedModel is CanvasLayoutModel canvas) - { - _backup = new CanvasLayoutModel(canvas); - } - - _defaultLayoutsBackup = new List(MainWindowSettingsModel.DefaultLayouts.Layouts); + App.Overlay.StartEditing((LayoutModel)dataContext); Keyboard.ClearFocus(); EditLayoutDialogTitle.Text = string.Format(CultureInfo.CurrentCulture, Properties.Resources.Edit_Template, ((LayoutModel)dataContext).Name); @@ -459,7 +438,7 @@ namespace FancyZonesEditor // EditLayout: Cancel changes private void EditLayoutDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args) { - CancelLayoutChanges(); + App.Overlay.EndEditing(false); Select(_settings.AppliedModel); } @@ -474,8 +453,7 @@ namespace FancyZonesEditor return; } - _backup = null; - _defaultLayoutsBackup = null; + mainEditor.EndEditing(false); // update current settings if (model == _settings.AppliedModel) @@ -510,12 +488,6 @@ namespace FancyZonesEditor if (result == ContentDialogResult.Primary) { LayoutModel model = element.DataContext as LayoutModel; - - if (_backup != null && model.Guid == _backup.Guid) - { - _backup = null; - } - MainWindowSettingsModel.DefaultLayouts.Reset(model.Uuid); if (model == _settings.AppliedModel) @@ -591,21 +563,6 @@ namespace FancyZonesEditor } } - private void CancelLayoutChanges() - { - if (_backup != null) - { - _settings.RestoreSelectedModel(_backup); - _backup = null; - } - - if (_defaultLayoutsBackup != null) - { - MainWindowSettingsModel.DefaultLayouts.Restore(_defaultLayoutsBackup); - _defaultLayoutsBackup = null; - } - } - private void NumberBox_Loaded(object sender, RoutedEventArgs e) { // The TextBox inside a NumberBox doesn't inherit the Automation Properties name, so we have to set it. diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs index 4cea41f04d..0e5391f724 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs @@ -267,27 +267,6 @@ namespace FancyZonesEditor return foundModel; } - public void RestoreSelectedModel(LayoutModel model) - { - if (SelectedModel == null || model == null) - { - return; - } - - SelectedModel.SensitivityRadius = model.SensitivityRadius; - SelectedModel.TemplateZoneCount = model.TemplateZoneCount; - SelectedModel.IsSelected = model.IsSelected; - SelectedModel.IsApplied = model.IsApplied; - SelectedModel.Name = model.Name; - SelectedModel.QuickKey = model.QuickKey; - - if (model is GridLayoutModel grid) - { - ((GridLayoutModel)SelectedModel).Spacing = grid.Spacing; - ((GridLayoutModel)SelectedModel).ShowSpacing = grid.ShowSpacing; - } - } - public void SetSelectedModel(LayoutModel model) { if (_selectedModel != null) diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs index 1e55c3f61f..a1cbaeb77b 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs @@ -17,6 +17,7 @@ namespace FancyZonesEditor private LayoutPreview _layoutPreview; private UserControl _editorLayout; private EditorWindow _editorWindow; + private LayoutBackup _layoutBackup = new LayoutBackup(); public List Monitors { get; private set; } @@ -261,6 +262,21 @@ namespace FancyZonesEditor } } + public void StartEditing(LayoutModel model) + { + _layoutBackup.Backup(model); + } + + public void EndEditing(bool restoreBackup) + { + if (restoreBackup) + { + _layoutBackup.Restore(); + } + + _layoutBackup.Clear(); + } + public void CloseLayoutWindow() { for (int i = 0; i < DesktopsCount; i++)