mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 19:57:57 +01:00
[FancyZones Editor] Duplicating non-selected layout applies duplicated layout fix (#28042)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,8 +30,6 @@ namespace FancyZonesEditor
|
||||
private const int MinimalForDefaultWrapPanelsHeight = 900;
|
||||
|
||||
private readonly MainWindowSettingsModel _settings = ((App)Application.Current).MainWindowSettings;
|
||||
private LayoutModel _backup;
|
||||
private List<LayoutModel> _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<LayoutModel>(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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -17,6 +17,7 @@ namespace FancyZonesEditor
|
||||
private LayoutPreview _layoutPreview;
|
||||
private UserControl _editorLayout;
|
||||
private EditorWindow _editorWindow;
|
||||
private LayoutBackup _layoutBackup = new LayoutBackup();
|
||||
|
||||
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()
|
||||
{
|
||||
for (int i = 0; i < DesktopsCount; i++)
|
||||
|
||||
Reference in New Issue
Block a user