Skip to content

Commit 40d2ef4

Browse files
authored
Add SVG Thumbnail Provider for Windows Explorer (microsoft#5048)
* Add SVG Thumbnail Provider * Some cleanup * Small settings changes * Update PowerToys.sln Remove Any CPU entries * Fix project configuration issues * Fix bad merge * Update output path for SVG thumbnail provider * Sync with latest
1 parent 8e5a877 commit 40d2ef4

File tree

28 files changed

+1610
-687
lines changed

28 files changed

+1610
-687
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,5 @@ src/common/Telemetry/*.etl
340340

341341
# Don't ignore MergeModules
342342
!**/MergeModules/Release/
343-
!**/MergeModules/Debug/
343+
!**/MergeModules/Debug/
344+
/src/modules/previewpane/SvgThumbnailProvider/$(SolutionDir)$(Platform)/$(Configuration)/modules/FileExplorerPreview/SvgThumbnailProvider.xml

PowerToys.sln

Lines changed: 602 additions & 589 deletions
Large diffs are not rendered by default.

installer/PowerToysSetup/Product.wxs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,23 @@
428428
<RegistryValue Type="string" Key="InprocServer32\$(var.Version).0" Name="RuntimeVersion" Value="v4.0.30319" />
429429
<RegistryValue Type="string" Key="InprocServer32\$(var.Version).0" Name="CodeBase" Value="file:///[FileExplorerPreviewInstallFolder]SvgPreviewHandler.dll" />
430430
</RegistryKey>
431+
<!-- Registry Key for Class Registration of Svg Thumbnail Provider -->
432+
<RegistryKey Root="HKCR" Key="CLSID\{36B27788-A8BB-4698-A756-DF9F11F64F84}">
433+
<RegistryValue Type="string" Value="SvgThumbnailProvider.SvgThumbnailProvider" />
434+
<RegistryValue Type="string" Name="DisplayName" Value="Svg Thumbnail Provider" />
435+
<RegistryValue Type="string" Name="AppID" Value="{CF142243-F059-45AF-8842-DBBE9783DB14}" />
436+
<RegistryValue Type="string" Key="Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value=""/>
437+
<RegistryValue Type="string" Key="InprocServer32" Value="mscoree.dll" />
438+
<RegistryValue Type="string" Key="InprocServer32" Name="Assembly" Value="SvgThumbnailProvider, Version=$(var.Version).0, Culture=neutral" />
439+
<RegistryValue Type="string" Key="InprocServer32" Name="Class" Value="SvgThumbnailProvider.SvgThumbnailProvider" />
440+
<RegistryValue Type="string" Key="InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" />
441+
<RegistryValue Type="string" Key="InprocServer32" Name="ThreadingModel" Value="Both" />
442+
<RegistryValue Type="string" Key="InprocServer32" Name="CodeBase" Value="file:///[FileExplorerPreviewInstallFolder]SvgThumbnailProvider.dll" />
443+
<RegistryValue Type="string" Key="InprocServer32\$(var.Version).0" Name="Assembly" Value="SvgThumbnailProvider, Version=$(var.Version).0, Culture=neutral" />
444+
<RegistryValue Type="string" Key="InprocServer32\$(var.Version).0" Name="Class" Value="SvgThumbnailProvider.SvgThumbnailProvider" />
445+
<RegistryValue Type="string" Key="InprocServer32\$(var.Version).0" Name="RuntimeVersion" Value="v4.0.30319" />
446+
<RegistryValue Type="string" Key="InprocServer32\$(var.Version).0" Name="CodeBase" Value="file:///[FileExplorerPreviewInstallFolder]SvgThumbnailProvider.dll" />
447+
</RegistryKey>
431448
<!-- Registry Key for Class Registration of Markdown Preview Handler -->
432449
<RegistryKey Root="HKCR" Key="CLSID\{45769bcc-e8fd-42d0-947e-02beef77a1f5}">
433450
<RegistryValue Type="string" Value="MarkdownPreviewHandler.MarkdownPreviewHandler" />
@@ -461,6 +478,10 @@
461478
<RegistryKey Root="HKCR" Key=".svg\shellex">
462479
<RegistryValue Type="string" Key="{8895b1c6-b41f-4c1c-a562-0d564250836f}" Value="{ddee2b8a-6807-48a6-bb20-2338174ff779}" />
463480
</RegistryKey>
481+
<!-- Add file type association for Svg Thumbnail Provider -->
482+
<RegistryKey Root="HKCR" Key=".svg\shellex">
483+
<RegistryValue Type="string" Key="{E357FCCD-A995-4576-B01F-234630154E96}" Value="{36B27788-A8BB-4698-A756-DF9F11F64F84}" />
484+
</RegistryKey>
464485
<!-- Add file type association for Markdown Preview Handler -->
465486
<RegistryKey Root="HKCR" Key=".md\shellex">
466487
<RegistryValue Type="string" Key="{8895b1c6-b41f-4c1c-a562-0d564250836f}" Value="{45769bcc-e8fd-42d0-947e-02beef77a1f5}" />
@@ -469,6 +490,10 @@
469490
<RegistryKey Root="HKLM" Key="Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION">
470491
<RegistryValue Type="integer" Name="prevhost.exe" Value="11000" />
471492
</RegistryKey>
493+
<!-- Update Key to use IE11 for dllhost.exe -->
494+
<RegistryKey Root="HKLM" Key="Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION">
495+
<RegistryValue Type="integer" Name="dllhost.exe" Value="11000" />
496+
</RegistryKey>
472497
</Component>
473498
</DirectoryRef>
474499

@@ -611,6 +636,8 @@
611636
<File Source="$(var.BinX64Dir)modules\FileExplorerPreview\Telemetry.dll" />
612637
<!-- File to include dll for Svg Preview Handler -->
613638
<File Source="$(var.BinX64Dir)modules\FileExplorerPreview\SvgPreviewHandler.dll" />
639+
<!-- File to include dll for Svg Preview Handler -->
640+
<File Source="$(var.BinX64Dir)modules\FileExplorerPreview\SvgThumbnailProvider.dll" />
614641
<!-- Files to include dll's for Markdown Preview Handler and it's dependencies -->
615642
<File Source="$(var.BinX64Dir)modules\FileExplorerPreview\MarkdownPreviewHandler.dll" />
616643
<File Source="$(var.BinX64Dir)modules\FileExplorerPreview\Markdig.Signed.dll" />

src/core/Microsoft.PowerToys.Settings.UI.Lib/PowerPreviewProperties.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,53 @@ namespace Microsoft.PowerToys.Settings.UI.Lib
1212
{
1313
public class PowerPreviewProperties
1414
{
15-
private bool enableSvg = true;
15+
private bool enableSvgPreview = true;
1616

1717
[JsonPropertyName("svg-previewer-toggle-setting")]
1818
[JsonConverter(typeof(BoolPropertyJsonConverter))]
19-
public bool EnableSvg
19+
public bool EnableSvgPreview
2020
{
21-
get => this.enableSvg;
21+
get => this.enableSvgPreview;
2222
set
2323
{
24-
if (value != this.enableSvg)
24+
if (value != this.enableSvgPreview)
2525
{
2626
LogTelemetryEvent(value);
27-
this.enableSvg = value;
27+
this.enableSvgPreview = value;
28+
}
29+
}
30+
}
31+
32+
private bool enableSvgThumbnail = true;
33+
34+
[JsonPropertyName("svg-thumbnail-toggle-setting")]
35+
[JsonConverter(typeof(BoolPropertyJsonConverter))]
36+
public bool EnableSvgThumbnail
37+
{
38+
get => this.enableSvgThumbnail;
39+
set
40+
{
41+
if (value != this.enableSvgThumbnail)
42+
{
43+
LogTelemetryEvent(value);
44+
this.enableSvgThumbnail = value;
2845
}
2946
}
3047
}
3148

32-
private bool enableMd = true;
49+
private bool enableMdPreview = true;
3350

3451
[JsonPropertyName("md-previewer-toggle-setting")]
3552
[JsonConverter(typeof(BoolPropertyJsonConverter))]
36-
public bool EnableMd
53+
public bool EnableMdPreview
3754
{
38-
get => this.enableMd;
55+
get => this.enableMdPreview;
3956
set
4057
{
41-
if (value != this.enableMd)
58+
if (value != this.enableMdPreview)
4259
{
4360
LogTelemetryEvent(value);
44-
this.enableMd = value;
61+
this.enableMdPreview = value;
4562
}
4663
}
4764
}

src/core/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,9 @@
422422
</data>
423423
<data name="FileExplorerPreview_ToggleSwitch_Preview_SVG.Header" xml:space="preserve">
424424
<value>Enable SVG (.svg) preview</value>
425+
</data>
426+
<data name="FileExplorerPreview_ToggleSwitch_SVG_Thumbnail.Header" xml:space="preserve">
427+
<value>Enable SVG (.svg) thumbnails</value>
425428
</data>
426429
<data name="FileExplorerPreview_Description.Text" xml:space="preserve">
427430
<value>These settings allow you to manage your Windows File Explorer custom preview handlers.</value>

src/core/Microsoft.PowerToys.Settings.UI/ViewModels/PowerPreviewViewModel.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ public PowerPreviewViewModel()
2727
SettingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName);
2828
}
2929

30-
this._svgRenderIsEnabled = Settings.properties.EnableSvg;
31-
this._mdRenderIsEnabled = Settings.properties.EnableMd;
30+
this._svgRenderIsEnabled = Settings.properties.EnableSvgPreview;
31+
this._svgThumbnailIsEnabled = Settings.properties.EnableSvgThumbnail;
32+
this._mdRenderIsEnabled = Settings.properties.EnableMdPreview;
3233
}
3334

3435
private bool _svgRenderIsEnabled = false;
3536
private bool _mdRenderIsEnabled = false;
37+
private bool _svgThumbnailIsEnabled = false;
3638

3739
public bool SVGRenderIsEnabled
3840
{
@@ -46,7 +48,25 @@ public bool SVGRenderIsEnabled
4648
if (value != _svgRenderIsEnabled)
4749
{
4850
_svgRenderIsEnabled = value;
49-
Settings.properties.EnableSvg = value;
51+
Settings.properties.EnableSvgPreview = value;
52+
RaisePropertyChanged();
53+
}
54+
}
55+
}
56+
57+
public bool SVGThumbnailIsEnabled
58+
{
59+
get
60+
{
61+
return _svgThumbnailIsEnabled;
62+
}
63+
64+
set
65+
{
66+
if (value != _svgThumbnailIsEnabled)
67+
{
68+
_svgThumbnailIsEnabled = value;
69+
Settings.properties.EnableSvgThumbnail = value;
5070
RaisePropertyChanged();
5171
}
5272
}
@@ -64,7 +84,7 @@ public bool MDRenderIsEnabled
6484
if (value != _mdRenderIsEnabled)
6585
{
6686
_mdRenderIsEnabled = value;
67-
Settings.properties.EnableMd = value;
87+
Settings.properties.EnableMdPreview = value;
6888
RaisePropertyChanged();
6989
}
7090
}

src/core/Microsoft.PowerToys.Settings.UI/Views/PowerPreviewPage.xaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
Margin="{StaticResource MediumTopMargin}"
5151
IsOn="{Binding Mode=TwoWay, Path=SVGRenderIsEnabled}" />
5252

53+
<ToggleSwitch x:Uid="FileExplorerPreview_ToggleSwitch_SVG_Thumbnail"
54+
Margin="{StaticResource SmallTopMargin}"
55+
IsOn="{Binding Mode=TwoWay, Path=SVGThumbnailIsEnabled}" />
56+
5357
<ToggleSwitch x:Uid="FileExplorerPreview_ToggleSwitch_Preview_MD"
5458
Margin="{StaticResource SmallTopMargin}"
5559
IsOn="{Binding Mode=TwoWay, Path=MDRenderIsEnabled}" />

src/core/Microsoft.PowerToys.Settings.UnitTest/ViewModelTests/PowerPreview.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,30 @@ public void SVGRenderIsEnabled_ShouldPrevHandler_WhenSuccessful()
5959
ShellPage.DefaultSndMSGCallback = msg =>
6060
{
6161
SndModuleSettings<SndPowerPreviewSettings> snd = JsonSerializer.Deserialize<SndModuleSettings<SndPowerPreviewSettings>>(msg);
62-
Assert.IsTrue(snd.powertoys.FileExplorerPreviewSettings.properties.EnableSvg);
62+
Assert.IsTrue(snd.powertoys.FileExplorerPreviewSettings.properties.EnableSvgPreview);
6363
};
6464

6565
// act
6666
viewModel.SVGRenderIsEnabled = true;
6767
}
6868

69+
[TestMethod]
70+
public void SVGThumbnailIsEnabled_ShouldPrevHandler_WhenSuccessful()
71+
{
72+
// arrange
73+
PowerPreviewViewModel viewModel = new PowerPreviewViewModel();
74+
75+
// Assert
76+
ShellPage.DefaultSndMSGCallback = msg =>
77+
{
78+
SndModuleSettings<SndPowerPreviewSettings> snd = JsonSerializer.Deserialize<SndModuleSettings<SndPowerPreviewSettings>>(msg);
79+
Assert.IsTrue(snd.powertoys.FileExplorerPreviewSettings.properties.EnableSvgThumbnail);
80+
};
81+
82+
// act
83+
viewModel.SVGThumbnailIsEnabled = true;
84+
}
85+
6986
[TestMethod]
7087
public void MDRenderIsEnabled_ShouldPrevHandler_WhenSuccessful()
7188
{
@@ -76,7 +93,7 @@ public void MDRenderIsEnabled_ShouldPrevHandler_WhenSuccessful()
7693
ShellPage.DefaultSndMSGCallback = msg =>
7794
{
7895
SndModuleSettings<SndPowerPreviewSettings> snd = JsonSerializer.Deserialize<SndModuleSettings<SndPowerPreviewSettings>>(msg);
79-
Assert.IsTrue(snd.powertoys.FileExplorerPreviewSettings.properties.EnableMd);
96+
Assert.IsTrue(snd.powertoys.FileExplorerPreviewSettings.properties.EnableMdPreview);
8097
};
8198

8299
// act

src/modules/previewpane/SvgPreviewHandler/SvgPreviewControl.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
using Microsoft.PowerToys.Telemetry;
1818
using PreviewHandlerCommon;
1919
using SvgPreviewHandler.Telemetry.Events;
20-
using SvgPreviewHandler.Utilities;
2120

2221
namespace SvgPreviewHandler
2322
{

src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@
112112
<Compile Include="Telemetry\Events\SvgFileHandlerLoaded.cs" />
113113
<Compile Include="Telemetry\Events\SvgFilePreviewed.cs" />
114114
<Compile Include="Telemetry\Events\SvgFilePreviewError.cs" />
115-
<Compile Include="Utilities\SvgPreviewHandlerHelper.cs" />
116115
</ItemGroup>
117116
<ItemGroup>
118117
<ProjectReference Include="..\..\..\common\ManagedTelemetry\Telemetry\Telemetry.csproj">
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
3+
"settings": {
4+
"documentationRules": {
5+
"companyName": "Microsoft Corporation",
6+
"copyrightText": "Copyright (c) {companyName}\r\nThe {companyName} licenses this file to you under the MIT license.\r\nSee the LICENSE file in the project root for more information.",
7+
"xmlHeader": false,
8+
"headerDecoration": "",
9+
"fileNamingConvention": "metadata",
10+
"documentInterfaces": false,
11+
"documentExposedElements": false,
12+
"documentInternalElements": false
13+
},
14+
"layoutRules": {
15+
"newlineAtEndOfFile": "require"
16+
},
17+
"orderingRules": {
18+
"usingDirectivesPlacement": "outsideNamespace"
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)