[FancyZones Editor] Duplicating non-selected layout applies duplicated layout fix (#28042)

This commit is contained in:
Seraphima Zykova
2023-08-22 21:25:03 +03:00
committed by GitHub
parent 5426759b9c
commit c2bb2a8c3a
6 changed files with 98 additions and 75 deletions

View File

@@ -45,6 +45,14 @@ namespace FancyZonesEditor
protected void OnCancel(object sender, RoutedEventArgs e) 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(); Close();
} }
} }

View File

@@ -16,15 +16,11 @@ namespace FancyZonesEditor
KeyUp += GridEditorWindow_KeyUp; KeyUp += GridEditorWindow_KeyUp;
KeyDown += ((App)Application.Current).App_KeyDown; KeyDown += ((App)Application.Current).App_KeyDown;
_stashedModel = (GridLayoutModel)(App.Overlay.CurrentDataContext as GridLayoutModel).Clone();
} }
protected new void OnCancel(object sender, RoutedEventArgs e) protected new void OnCancel(object sender, RoutedEventArgs e)
{ {
base.OnCancel(sender, e); base.OnCancel(sender, e);
GridLayoutModel model = App.Overlay.CurrentDataContext as GridLayoutModel;
_stashedModel.RestoreTo(model);
} }
private void GridEditorWindow_KeyUp(object sender, KeyEventArgs e) private void GridEditorWindow_KeyUp(object sender, KeyEventArgs e)
@@ -37,8 +33,6 @@ namespace FancyZonesEditor
((App)Application.Current).App_KeyUp(sender, e); ((App)Application.Current).App_KeyUp(sender, e);
} }
private GridLayoutModel _stashedModel;
// This is required to fix a WPF rendering bug when using custom chrome // This is required to fix a WPF rendering bug when using custom chrome
private void EditorWindow_ContentRendered(object sender, System.EventArgs e) private void EditorWindow_ContentRendered(object sender, System.EventArgs e)
{ {

View File

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

View File

@@ -30,8 +30,6 @@ namespace FancyZonesEditor
private const int MinimalForDefaultWrapPanelsHeight = 900; private const int MinimalForDefaultWrapPanelsHeight = 900;
private readonly MainWindowSettingsModel _settings = ((App)Application.Current).MainWindowSettings; private readonly MainWindowSettingsModel _settings = ((App)Application.Current).MainWindowSettings;
private LayoutModel _backup;
private List<LayoutModel> _defaultLayoutsBackup;
private ContentDialog _openedDialog; private ContentDialog _openedDialog;
private TextBlock _createLayoutAnnounce; private TextBlock _createLayoutAnnounce;
@@ -244,21 +242,15 @@ namespace FancyZonesEditor
Logger.LogTrace(); Logger.LogTrace();
var dataContext = ((FrameworkElement)sender).DataContext; var dataContext = ((FrameworkElement)sender).DataContext;
Select((LayoutModel)dataContext);
EditLayoutDialog.Hide(); EditLayoutDialog.Hide();
var mainEditor = App.Overlay; if (dataContext is not LayoutModel model)
if (mainEditor.CurrentDataContext is not LayoutModel model)
{ {
return; return;
} }
model.IsSelected = false;
// make a copy // make a copy
model = model.Clone(); model = model.Clone();
mainEditor.CurrentDataContext = model;
string name = model.Name; string name = model.Name;
var index = name.LastIndexOf('('); var index = name.LastIndexOf('(');
@@ -293,11 +285,8 @@ namespace FancyZonesEditor
} }
model.Name = name + " (" + (++maxCustomIndex) + ')'; model.Name = name + " (" + (++maxCustomIndex) + ')';
model.Persist(); model.Persist();
App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model);
App.FancyZonesEditorIO.SerializeAppliedLayouts();
App.FancyZonesEditorIO.SerializeCustomLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts();
} }
@@ -327,7 +316,7 @@ namespace FancyZonesEditor
private void OnClosing(object sender, EventArgs e) private void OnClosing(object sender, EventArgs e)
{ {
Logger.LogTrace(); Logger.LogTrace();
CancelLayoutChanges(); App.Overlay.EndEditing(true);
App.FancyZonesEditorIO.SerializeAppliedLayouts(); App.FancyZonesEditorIO.SerializeAppliedLayouts();
App.FancyZonesEditorIO.SerializeCustomLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts();
@@ -356,17 +345,7 @@ namespace FancyZonesEditor
var dataContext = ((FrameworkElement)sender).DataContext; var dataContext = ((FrameworkElement)sender).DataContext;
Select((LayoutModel)dataContext); Select((LayoutModel)dataContext);
App.Overlay.StartEditing((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<LayoutModel>(MainWindowSettingsModel.DefaultLayouts.Layouts);
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);
@@ -459,7 +438,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)
{ {
CancelLayoutChanges(); App.Overlay.EndEditing(false);
Select(_settings.AppliedModel); Select(_settings.AppliedModel);
} }
@@ -474,8 +453,7 @@ namespace FancyZonesEditor
return; return;
} }
_backup = null; mainEditor.EndEditing(false);
_defaultLayoutsBackup = null;
// update current settings // update current settings
if (model == _settings.AppliedModel) if (model == _settings.AppliedModel)
@@ -510,12 +488,6 @@ namespace FancyZonesEditor
if (result == ContentDialogResult.Primary) if (result == ContentDialogResult.Primary)
{ {
LayoutModel model = element.DataContext as LayoutModel; LayoutModel model = element.DataContext as LayoutModel;
if (_backup != null && model.Guid == _backup.Guid)
{
_backup = null;
}
MainWindowSettingsModel.DefaultLayouts.Reset(model.Uuid); MainWindowSettingsModel.DefaultLayouts.Reset(model.Uuid);
if (model == _settings.AppliedModel) 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) 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. // The TextBox inside a NumberBox doesn't inherit the Automation Properties name, so we have to set it.

View File

@@ -267,27 +267,6 @@ namespace FancyZonesEditor
return foundModel; 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) public void SetSelectedModel(LayoutModel model)
{ {
if (_selectedModel != null) if (_selectedModel != null)

View File

@@ -17,6 +17,7 @@ namespace FancyZonesEditor
private LayoutPreview _layoutPreview; private LayoutPreview _layoutPreview;
private UserControl _editorLayout; private UserControl _editorLayout;
private EditorWindow _editorWindow; private EditorWindow _editorWindow;
private LayoutBackup _layoutBackup = new LayoutBackup();
public List<Monitor> Monitors { get; private set; } public List<Monitor> 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() public void CloseLayoutWindow()
{ {
for (int i = 0; i < DesktopsCount; i++) for (int i = 0; i < DesktopsCount; i++)