Skip to content

Commit 6537820

Browse files
[PTRun]Add setting to disable thumbnails (#24600)
1 parent 07029ff commit 6537820

File tree

12 files changed

+80
-22
lines changed

12 files changed

+80
-22
lines changed

src/modules/launcher/PowerLauncher/SettingsReader.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ public void ReadSettings()
166166
_settings.StartupPosition = overloadSettings.Properties.Position;
167167
}
168168

169+
if (_settings.GenerateThumbnailsFromFiles != overloadSettings.Properties.GenerateThumbnailsFromFiles)
170+
{
171+
_settings.GenerateThumbnailsFromFiles = overloadSettings.Properties.GenerateThumbnailsFromFiles;
172+
}
173+
169174
retry = false;
170175
}
171176

src/modules/launcher/PowerLauncher/ViewModel/ResultViewModel.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using PowerLauncher.Helper;
1111
using PowerLauncher.Plugin;
1212
using Wox.Infrastructure.Image;
13+
using Wox.Infrastructure.UserSettings;
1314
using Wox.Plugin;
1415
using Wox.Plugin.Logger;
1516

@@ -23,6 +24,8 @@ public enum ActivationType
2324
Hover,
2425
}
2526

27+
private readonly PowerToysRunSettings _settings;
28+
2629
public ObservableCollection<ContextMenuItemViewModel> ContextMenuItems { get; } = new ObservableCollection<ContextMenuItemViewModel>();
2730

2831
public ICommand ActivateContextButtonsHoverCommand { get; }
@@ -65,13 +68,15 @@ public int ContextMenuSelectedIndex
6568

6669
public const int NoSelectionIndex = -1;
6770

68-
public ResultViewModel(Result result, IMainViewModel mainViewModel)
71+
public ResultViewModel(Result result, IMainViewModel mainViewModel, PowerToysRunSettings settings)
6972
{
7073
if (result != null)
7174
{
7275
Result = result;
7376
}
7477

78+
_settings = settings;
79+
7580
ContextMenuSelectedIndex = NoSelectionIndex;
7681
LoadContextMenu();
7782

@@ -201,7 +206,7 @@ public ImageSource Image
201206
}
202207

203208
// will get here either when icoPath has value\icon delegate is null\when had exception in delegate
204-
return ImageLoader.Load(imagePath);
209+
return ImageLoader.Load(imagePath, _settings.GenerateThumbnailsFromFiles);
205210
}
206211
}
207212

src/modules/launcher/PowerLauncher/ViewModel/ResultsViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ public void AddResults(List<Result> newRawResults, CancellationToken ct)
272272
List<ResultViewModel> newResults = new List<ResultViewModel>(newRawResults.Count);
273273
foreach (Result r in newRawResults)
274274
{
275-
newResults.Add(new ResultViewModel(r, _mainViewModel));
275+
newResults.Add(new ResultViewModel(r, _mainViewModel, _settings));
276276
ct.ThrowIfCancellationRequested();
277277
}
278278

src/modules/launcher/Wox.Infrastructure/Image/ImageLoader.cs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System.Windows.Media;
1313
using System.Windows.Media.Imaging;
1414
using ManagedCommon;
15+
using Wox.Infrastructure.UserSettings;
1516
using Wox.Plugin;
1617
using Wox.Plugin.Logger;
1718

@@ -67,7 +68,7 @@ public static void Initialize(Theme theme)
6768
{
6869
ImageCache.Usage.AsParallel().ForAll(x =>
6970
{
70-
Load(x.Key);
71+
Load(x.Key, true);
7172
});
7273
});
7374

@@ -119,7 +120,7 @@ private enum ImageType
119120
Cache,
120121
}
121122

122-
private static ImageResult LoadInternal(string path, bool loadFullImage = false)
123+
private static ImageResult LoadInternal(string path, bool generateThumbnailsFromFiles, bool loadFullImage = false)
123124
{
124125
ImageSource image;
125126
ImageType type = ImageType.Error;
@@ -172,18 +173,27 @@ private static ImageResult LoadInternal(string path, bool loadFullImage = false)
172173
}
173174
else
174175
{
175-
/* Although the documentation for GetImage on MSDN indicates that
176-
* if a thumbnail is available it will return one, this has proved to not
177-
* be the case in many situations while testing.
178-
* - Solution: explicitly pass the ThumbnailOnly flag
179-
*/
180-
image = WindowsThumbnailProvider.GetThumbnail(path, Constant.ThumbnailSize, Constant.ThumbnailSize, ThumbnailOptions.ThumbnailOnly);
176+
// PowerToys Run internal images are png, so we make this exception
177+
if (extension == ".png" || generateThumbnailsFromFiles)
178+
{
179+
/* Although the documentation for GetImage on MSDN indicates that
180+
* if a thumbnail is available it will return one, this has proved to not
181+
* be the case in many situations while testing.
182+
* - Solution: explicitly pass the ThumbnailOnly flag
183+
*/
184+
image = WindowsThumbnailProvider.GetThumbnail(path, Constant.ThumbnailSize, Constant.ThumbnailSize, ThumbnailOptions.ThumbnailOnly);
185+
}
186+
else
187+
{
188+
image = WindowsThumbnailProvider.GetThumbnail(path, Constant.ThumbnailSize, Constant.ThumbnailSize, ThumbnailOptions.IconOnly);
189+
}
181190
}
182191
}
183-
else if (extension == ".pdf" && WindowsThumbnailProvider.DoesPdfUseAcrobatAsProvider())
192+
else if (!generateThumbnailsFromFiles || (extension == ".pdf" && WindowsThumbnailProvider.DoesPdfUseAcrobatAsProvider()))
184193
{
185194
// 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)
186195
// 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.
196+
// Also don't get thumbnail if the GenerateThumbnailsFromFiles option is off.
187197
type = ImageType.File;
188198
image = WindowsThumbnailProvider.GetThumbnail(path, Constant.ThumbnailSize, Constant.ThumbnailSize, ThumbnailOptions.IconOnly);
189199
}
@@ -217,9 +227,9 @@ private static ImageResult LoadInternal(string path, bool loadFullImage = false)
217227

218228
private const bool _enableImageHash = true;
219229

220-
public static ImageSource Load(string path, bool loadFullImage = false)
230+
public static ImageSource Load(string path, bool generateThumbnailsFromFiles, bool loadFullImage = false)
221231
{
222-
var imageResult = LoadInternal(path, loadFullImage);
232+
var imageResult = LoadInternal(path, generateThumbnailsFromFiles, loadFullImage);
223233

224234
var img = imageResult.ImageSource;
225235
if (imageResult.ImageType != ImageType.Error && imageResult.ImageType != ImageType.Cache)

src/modules/launcher/Wox.Infrastructure/UserSettings/PowerToysRunSettings.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,8 @@ public bool HideNotifyIcon
323323

324324
public bool StartedFromPowerToysRunner { get; set; }
325325

326+
public bool GenerateThumbnailsFromFiles { get; set; } = true;
327+
326328
public HttpProxy Proxy { get; set; } = new HttpProxy();
327329

328330
[JsonConverter(typeof(JsonStringEnumConverter))]

src/modules/launcher/Wox.Test/ResultViewModelTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void Setup()
2626
var result = new Result();
2727
contextMenuResult = new ContextMenuResult();
2828
mainViewModelMock = new Mock<IMainViewModel>();
29-
resultViewModel = new ResultViewModel(result, mainViewModelMock.Object);
29+
resultViewModel = new ResultViewModel(result, mainViewModelMock.Object, null);
3030

3131
var pluginMock = new Mock<IPlugin>();
3232
pluginMock.As<IContextMenu>().Setup(x => x.LoadContextMenus(result)).Returns(new List<ContextMenuResult> { contextMenuResult });

src/modules/launcher/Wox.Test/ResultsViewModelTest.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public void ContextMenuSelectedIndexShouldEqualNoSelectionIndexWhenInitialized()
1818
// Arrange
1919
ResultsViewModel rvm = new ResultsViewModel();
2020
Result result = new Result();
21-
ResultViewModel selectedItem = new ResultViewModel(result, null);
21+
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
2222
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
2323
rvm.SelectedItem = selectedItem;
2424

@@ -32,7 +32,7 @@ public void SelectNextContextMenuItemIncrementsContextMenuSelectedIndexWhenCalle
3232
// Arrange
3333
ResultsViewModel rvm = new ResultsViewModel();
3434
Result result = new Result();
35-
ResultViewModel selectedItem = new ResultViewModel(result, null);
35+
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
3636
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
3737
rvm.SelectedItem = selectedItem;
3838

@@ -49,7 +49,7 @@ public void SelectNextContextMenuItemDoesnNotIncrementContextMenuSelectedIndexWh
4949
// Arrange
5050
ResultsViewModel rvm = new ResultsViewModel();
5151
Result result = new Result();
52-
ResultViewModel selectedItem = new ResultViewModel(result, null);
52+
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
5353
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
5454
rvm.SelectedItem = selectedItem;
5555

@@ -66,7 +66,7 @@ public void SelectPreviousContextMenuItemDecrementsContextMenuSelectedIndexWhenC
6666
// Arrange
6767
ResultsViewModel rvm = new ResultsViewModel();
6868
Result result = new Result();
69-
ResultViewModel selectedItem = new ResultViewModel(result, null);
69+
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
7070
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
7171
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
7272
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
@@ -88,7 +88,7 @@ public void SelectPreviousContextMenuItemResetsContextMenuSelectedIndexWhenCalle
8888
// Arrange
8989
ResultsViewModel rvm = new ResultsViewModel();
9090
Result result = new Result();
91-
ResultViewModel selectedItem = new ResultViewModel(result, null);
91+
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
9292
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
9393
rvm.SelectedItem = selectedItem;
9494

@@ -106,7 +106,7 @@ public void IsContextMenuItemSelectedReturnsTrueWhenContextMenuItemIsSelected()
106106
// Arrange
107107
ResultsViewModel rvm = new ResultsViewModel();
108108
Result result = new Result();
109-
ResultViewModel selectedItem = new ResultViewModel(result, null);
109+
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
110110
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
111111
rvm.SelectedItem = selectedItem;
112112

@@ -124,7 +124,7 @@ public void IsContextMenuItemSelectedReturnsFalseWhenContextMenuItemIsNotSelecte
124124
// Arrange
125125
ResultsViewModel rvm = new ResultsViewModel();
126126
Result result = new Result();
127-
ResultViewModel selectedItem = new ResultViewModel(result, null);
127+
ResultViewModel selectedItem = new ResultViewModel(result, null, null);
128128
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
129129
rvm.SelectedItem = selectedItem;
130130

src/settings-ui/Settings.UI.Library/PowerLauncherProperties.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ public class PowerLauncherProperties
7272
[JsonPropertyName("search_wait_for_slow_results")]
7373
public bool SearchWaitForSlowResults { get; set; }
7474

75+
[JsonPropertyName("generate_thumbnails_from_files")]
76+
public bool GenerateThumbnailsFromFiles { get; set; }
77+
7578
public PowerLauncherProperties()
7679
{
7780
OpenPowerLauncher = new HotkeySettings(false, false, true, false, 32);
@@ -92,6 +95,7 @@ public PowerLauncherProperties()
9295
SearchClickedItemWeight = 5;
9396
SearchQueryTuningEnabled = false;
9497
SearchWaitForSlowResults = false;
98+
GenerateThumbnailsFromFiles = true;
9599
}
96100
}
97101
}

src/settings-ui/Settings.UI.UnitTests/ViewModelTests/PowerLauncherViewModelTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ public void OriginalFilesModificationTest(string version, string fileName)
8080
Assert.AreEqual(originalSettings.Properties.OverrideWinkeyS, viewModel.OverrideWinSKey);
8181
Assert.AreEqual(originalSettings.Properties.SearchResultPreference, viewModel.SearchResultPreference);
8282
Assert.AreEqual(originalSettings.Properties.SearchTypePreference, viewModel.SearchTypePreference);
83+
Assert.AreEqual(originalSettings.Properties.GenerateThumbnailsFromFiles, viewModel.GenerateThumbnailsFromFiles);
8384

8485
// Verify that the stub file was used
8586
var expectedCallCount = 2; // once via the view model, and once by the test (GetSettings<T>)

src/settings-ui/Settings.UI/Strings/en-us/Resources.resw

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,12 @@
499499
<data name="PowerLauncher_TabSelectsContextButtons.Description" xml:space="preserve">
500500
<value>Pressing tab will first select through the available context buttons of the current selection before moving onto the next result</value>
501501
</data>
502+
<data name="PowerLauncher_GenerateThumbnailsFromFiles.Header" xml:space="preserve">
503+
<value>Generate thumbnails from files</value>
504+
</data>
505+
<data name="PowerLauncher_GenerateThumbnailsFromFiles.Description" xml:space="preserve">
506+
<value>Results will try to generate thumbnails for files. Disabling this setting may increase stability and speed</value>
507+
</data>
502508
<data name="PowerLauncher_SearchQueryResultsWithDelay.Header" xml:space="preserve">
503509
<value>Input Smoothing</value>
504510
<comment>This is about adding a delay to wait for more input before executing a search</comment>

0 commit comments

Comments
 (0)