[Peek]Add setting to close after losing focus (#26364)

* [Peek] WindowActivationState checks are added for focus and close after losing focus.

* Add setting to activate the behavior

---------

Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
This commit is contained in:
gokcekantarci
2023-05-30 11:44:58 +03:00
committed by GitHub
parent 9786d08695
commit 0c69e3422c
9 changed files with 162 additions and 0 deletions

View File

@@ -46,6 +46,7 @@ namespace Peek.UI
{
// Core Services
services.AddTransient<NeighboringItemsQuery>();
services.AddSingleton<IUserSettings, UserSettings>();
// Views and ViewModels
services.AddTransient<TitleBar>();

View File

@@ -6,6 +6,7 @@ using System;
using interop;
using Microsoft.PowerToys.Telemetry;
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Input;
using Peek.Common.Constants;
using Peek.FilePreviewer.Models;
@@ -28,6 +29,7 @@ namespace Peek.UI
public MainWindow()
{
InitializeComponent();
this.Activated += PeekWindow_Activated;
ViewModel = App.GetService<MainWindowViewModel>();
@@ -38,6 +40,23 @@ namespace Peek.UI
AppWindow.Closing += AppWindow_Closing;
}
private void PeekWindow_Activated(object sender, Microsoft.UI.Xaml.WindowActivatedEventArgs args)
{
if (args.WindowActivationState == Microsoft.UI.Xaml.WindowActivationState.CodeActivated)
{
this.BringToForeground();
}
if (args.WindowActivationState == Microsoft.UI.Xaml.WindowActivationState.Deactivated)
{
var userSettings = App.GetService<IUserSettings>();
if (userSettings.CloseAfterLosingFocus)
{
Uninitialize();
}
}
}
/// <summary>
/// Handle Peek hotkey, by toggling the window visibility and querying files when necessary.
/// </summary>

View File

@@ -0,0 +1,13 @@
// 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;
namespace Peek.UI
{
public interface IUserSettings
{
public bool CloseAfterLosingFocus { get; }
}
}

View File

@@ -0,0 +1,85 @@
// 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;
using System.IO;
using System.IO.Abstractions;
using System.Threading;
using ManagedCommon;
using Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
namespace Peek.UI
{
public class UserSettings : IUserSettings
{
private const string PeekModuleName = "Peek";
private const int MaxNumberOfRetry = 5;
private readonly ISettingsUtils _settingsUtils;
private readonly IFileSystemWatcher _watcher;
private readonly object _loadingSettingsLock = new object();
public bool CloseAfterLosingFocus { get; private set; }
public UserSettings()
{
_settingsUtils = new SettingsUtils();
CloseAfterLosingFocus = false;
LoadSettingsFromJson();
_watcher = Helper.GetFileWatcher(PeekModuleName, "settings.json", () => LoadSettingsFromJson());
}
private void LoadSettingsFromJson()
{
lock (_loadingSettingsLock)
{
var retry = true;
var retryCount = 0;
while (retry)
{
try
{
retryCount++;
if (!_settingsUtils.SettingsExists(PeekModuleName))
{
Logger.LogInfo("Hosts settings.json was missing, creating a new one");
var defaultSettings = new PeekSettings();
defaultSettings.Save(_settingsUtils);
}
var settings = _settingsUtils.GetSettingsOrDefault<PeekSettings>(PeekModuleName);
if (settings != null)
{
CloseAfterLosingFocus = settings.Properties.CloseAfterLosingFocus.Value;
}
retry = false;
}
catch (IOException e)
{
if (retryCount > MaxNumberOfRetry)
{
retry = false;
Logger.LogError($"Failed to Deserialize PowerToys settings, Retrying {e.Message}", e);
}
else
{
Thread.Sleep(500);
}
}
catch (Exception ex)
{
retry = false;
Logger.LogError("Failed to read changed settings", ex);
}
}
}
}
}
}