[PTRun]Add setting to disable thumbnails (#24600)

This commit is contained in:
Jaime Bernardo
2023-03-06 22:57:52 +00:00
committed by GitHub
parent 07029ff4c0
commit 65378200c6
12 changed files with 80 additions and 22 deletions

View File

@@ -166,6 +166,11 @@ namespace PowerLauncher
_settings.StartupPosition = overloadSettings.Properties.Position;
}
if (_settings.GenerateThumbnailsFromFiles != overloadSettings.Properties.GenerateThumbnailsFromFiles)
{
_settings.GenerateThumbnailsFromFiles = overloadSettings.Properties.GenerateThumbnailsFromFiles;
}
retry = false;
}

View File

@@ -10,6 +10,7 @@ using System.Windows.Media;
using PowerLauncher.Helper;
using PowerLauncher.Plugin;
using Wox.Infrastructure.Image;
using Wox.Infrastructure.UserSettings;
using Wox.Plugin;
using Wox.Plugin.Logger;
@@ -23,6 +24,8 @@ namespace PowerLauncher.ViewModel
Hover,
}
private readonly PowerToysRunSettings _settings;
public ObservableCollection<ContextMenuItemViewModel> ContextMenuItems { get; } = new ObservableCollection<ContextMenuItemViewModel>();
public ICommand ActivateContextButtonsHoverCommand { get; }
@@ -65,13 +68,15 @@ namespace PowerLauncher.ViewModel
public const int NoSelectionIndex = -1;
public ResultViewModel(Result result, IMainViewModel mainViewModel)
public ResultViewModel(Result result, IMainViewModel mainViewModel, PowerToysRunSettings settings)
{
if (result != null)
{
Result = result;
}
_settings = settings;
ContextMenuSelectedIndex = NoSelectionIndex;
LoadContextMenu();
@@ -201,7 +206,7 @@ namespace PowerLauncher.ViewModel
}
// will get here either when icoPath has value\icon delegate is null\when had exception in delegate
return ImageLoader.Load(imagePath);
return ImageLoader.Load(imagePath, _settings.GenerateThumbnailsFromFiles);
}
}

View File

@@ -272,7 +272,7 @@ namespace PowerLauncher.ViewModel
List<ResultViewModel> newResults = new List<ResultViewModel>(newRawResults.Count);
foreach (Result r in newRawResults)
{
newResults.Add(new ResultViewModel(r, _mainViewModel));
newResults.Add(new ResultViewModel(r, _mainViewModel, _settings));
ct.ThrowIfCancellationRequested();
}

View File

@@ -12,6 +12,7 @@ using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using ManagedCommon;
using Wox.Infrastructure.UserSettings;
using Wox.Plugin;
using Wox.Plugin.Logger;
@@ -67,7 +68,7 @@ namespace Wox.Infrastructure.Image
{
ImageCache.Usage.AsParallel().ForAll(x =>
{
Load(x.Key);
Load(x.Key, true);
});
});
@@ -119,7 +120,7 @@ namespace Wox.Infrastructure.Image
Cache,
}
private static ImageResult LoadInternal(string path, bool loadFullImage = false)
private static ImageResult LoadInternal(string path, bool generateThumbnailsFromFiles, bool loadFullImage = false)
{
ImageSource image;
ImageType type = ImageType.Error;
@@ -172,18 +173,27 @@ namespace Wox.Infrastructure.Image
}
else
{
/* Although the documentation for GetImage on MSDN indicates that
* if a thumbnail is available it will return one, this has proved to not
* be the case in many situations while testing.
* - Solution: explicitly pass the ThumbnailOnly flag
*/
image = WindowsThumbnailProvider.GetThumbnail(path, Constant.ThumbnailSize, Constant.ThumbnailSize, ThumbnailOptions.ThumbnailOnly);
// PowerToys Run internal images are png, so we make this exception
if (extension == ".png" || generateThumbnailsFromFiles)
{
/* Although the documentation for GetImage on MSDN indicates that
* if a thumbnail is available it will return one, this has proved to not
* be the case in many situations while testing.
* - Solution: explicitly pass the ThumbnailOnly flag
*/
image = WindowsThumbnailProvider.GetThumbnail(path, Constant.ThumbnailSize, Constant.ThumbnailSize, ThumbnailOptions.ThumbnailOnly);
}
else
{
image = WindowsThumbnailProvider.GetThumbnail(path, Constant.ThumbnailSize, Constant.ThumbnailSize, ThumbnailOptions.IconOnly);
}
}
}
else if (extension == ".pdf" && WindowsThumbnailProvider.DoesPdfUseAcrobatAsProvider())
else if (!generateThumbnailsFromFiles || (extension == ".pdf" && WindowsThumbnailProvider.DoesPdfUseAcrobatAsProvider()))
{
// The PDF thumbnail provider from Adobe Reader and Acrobat Pro lets crash PT Run with an Dispatcher exception. (https://github.com/microsoft/PowerToys/issues/18166)
// To not run into the crash, we only request the icon of PDF files if the PDF thumbnail handler is set to Adobe Reader/Acrobat Pro.
// Also don't get thumbnail if the GenerateThumbnailsFromFiles option is off.
type = ImageType.File;
image = WindowsThumbnailProvider.GetThumbnail(path, Constant.ThumbnailSize, Constant.ThumbnailSize, ThumbnailOptions.IconOnly);
}
@@ -217,9 +227,9 @@ namespace Wox.Infrastructure.Image
private const bool _enableImageHash = true;
public static ImageSource Load(string path, bool loadFullImage = false)
public static ImageSource Load(string path, bool generateThumbnailsFromFiles, bool loadFullImage = false)
{
var imageResult = LoadInternal(path, loadFullImage);
var imageResult = LoadInternal(path, generateThumbnailsFromFiles, loadFullImage);
var img = imageResult.ImageSource;
if (imageResult.ImageType != ImageType.Error && imageResult.ImageType != ImageType.Cache)

View File

@@ -323,6 +323,8 @@ namespace Wox.Infrastructure.UserSettings
public bool StartedFromPowerToysRunner { get; set; }
public bool GenerateThumbnailsFromFiles { get; set; } = true;
public HttpProxy Proxy { get; set; } = new HttpProxy();
[JsonConverter(typeof(JsonStringEnumConverter))]

View File

@@ -26,7 +26,7 @@ namespace Wox.Test
var result = new Result();
contextMenuResult = new ContextMenuResult();
mainViewModelMock = new Mock<IMainViewModel>();
resultViewModel = new ResultViewModel(result, mainViewModelMock.Object);
resultViewModel = new ResultViewModel(result, mainViewModelMock.Object, null);
var pluginMock = new Mock<IPlugin>();
pluginMock.As<IContextMenu>().Setup(x => x.LoadContextMenus(result)).Returns(new List<ContextMenuResult> { contextMenuResult });

View File

@@ -18,7 +18,7 @@ namespace Wox.Test
// Arrange
ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result, null);
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem;
@@ -32,7 +32,7 @@ namespace Wox.Test
// Arrange
ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result, null);
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem;
@@ -49,7 +49,7 @@ namespace Wox.Test
// Arrange
ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result, null);
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem;
@@ -66,7 +66,7 @@ namespace Wox.Test
// Arrange
ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result, null);
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
@@ -88,7 +88,7 @@ namespace Wox.Test
// Arrange
ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result, null);
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem;
@@ -106,7 +106,7 @@ namespace Wox.Test
// Arrange
ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result, null);
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem;
@@ -124,7 +124,7 @@ namespace Wox.Test
// Arrange
ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result, null);
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem;

View File

@@ -72,6 +72,9 @@ namespace Microsoft.PowerToys.Settings.UI.Library
[JsonPropertyName("search_wait_for_slow_results")]
public bool SearchWaitForSlowResults { get; set; }
[JsonPropertyName("generate_thumbnails_from_files")]
public bool GenerateThumbnailsFromFiles { get; set; }
public PowerLauncherProperties()
{
OpenPowerLauncher = new HotkeySettings(false, false, true, false, 32);
@@ -92,6 +95,7 @@ namespace Microsoft.PowerToys.Settings.UI.Library
SearchClickedItemWeight = 5;
SearchQueryTuningEnabled = false;
SearchWaitForSlowResults = false;
GenerateThumbnailsFromFiles = true;
}
}
}

View File

@@ -80,6 +80,7 @@ namespace ViewModelTests
Assert.AreEqual(originalSettings.Properties.OverrideWinkeyS, viewModel.OverrideWinSKey);
Assert.AreEqual(originalSettings.Properties.SearchResultPreference, viewModel.SearchResultPreference);
Assert.AreEqual(originalSettings.Properties.SearchTypePreference, viewModel.SearchTypePreference);
Assert.AreEqual(originalSettings.Properties.GenerateThumbnailsFromFiles, viewModel.GenerateThumbnailsFromFiles);
// Verify that the stub file was used
var expectedCallCount = 2; // once via the view model, and once by the test (GetSettings<T>)

View File

@@ -499,6 +499,12 @@
<data name="PowerLauncher_TabSelectsContextButtons.Description" xml:space="preserve">
<value>Pressing tab will first select through the available context buttons of the current selection before moving onto the next result</value>
</data>
<data name="PowerLauncher_GenerateThumbnailsFromFiles.Header" xml:space="preserve">
<value>Generate thumbnails from files</value>
</data>
<data name="PowerLauncher_GenerateThumbnailsFromFiles.Description" xml:space="preserve">
<value>Results will try to generate thumbnails for files. Disabling this setting may increase stability and speed</value>
</data>
<data name="PowerLauncher_SearchQueryResultsWithDelay.Header" xml:space="preserve">
<value>Input Smoothing</value>
<comment>This is about adding a delay to wait for more input before executing a search</comment>

View File

@@ -563,6 +563,23 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
}
}
public bool GenerateThumbnailsFromFiles
{
get
{
return settings.Properties.GenerateThumbnailsFromFiles;
}
set
{
if (settings.Properties.GenerateThumbnailsFromFiles != value)
{
settings.Properties.GenerateThumbnailsFromFiles = value;
UpdateSettings();
}
}
}
private ObservableCollection<PowerLauncherPluginViewModel> _plugins;
public ObservableCollection<PowerLauncherPluginViewModel> Plugins

View File

@@ -185,6 +185,14 @@
IsOn="{x:Bind ViewModel.TabSelectsContextButtons, Mode=TwoWay}" />
</labs:SettingsCard>
<labs:SettingsCard
x:Uid="PowerLauncher_GenerateThumbnailsFromFiles"
>
<ToggleSwitch
x:Uid="ToggleSwitch"
IsOn="{x:Bind ViewModel.GenerateThumbnailsFromFiles, Mode=TwoWay}" />
</labs:SettingsCard>
</controls:SettingsGroup>
<!--<ComboBox x:Uid="PowerLauncher_SearchResultPreference"