mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +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)
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 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.
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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++)
|
||||||
|
|||||||
Reference in New Issue
Block a user