Add SVG Thumbnail Provider for Windows Explorer (#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
This commit is contained in:
Chris Davis
2020-07-21 16:27:12 -07:00
committed by GitHub
parent 8e5a877997
commit 40d2ef4f0a
28 changed files with 1610 additions and 687 deletions

View File

@@ -16,8 +16,15 @@ const CLSID CLSID_SHIMActivateMdPreviewHandler = { 0xE0907A95, 0x6F9A, 0x4D1B, {
// 45769bcc-e8fd-42d0-947e-02beef77a1f5
const CLSID CLSID_MdPreviewHandler = { 0x45769bcc, 0xe8fd, 0x42d0, { 0x94, 0x7e, 0x02, 0xbe, 0xef, 0x77, 0xa1, 0xf5 } };
// 9C723B8C-4F5C-4147-9DE4-C2808F9AF66B
const CLSID CLSID_SHIMActivateSvgThumbnailProvider = { 0x9C723B8C, 0x4F5C, 0x4147, { 0x9D, 0xE4, 0xC2, 0x80, 0x8F, 0x9A, 0xF6, 0x6B } };
// 36B27788-A8BB-4698-A756-DF9F11F64F84
const CLSID CLSID_SvgThumbnailProvider = { 0x36B27788, 0xA8BB, 0x4698, { 0xA7, 0x56, 0xDF, 0x9F, 0x11, 0xF6, 0x4F, 0x84 } };
// Pairs of NativeClsid vs ManagedClsid used for preview handlers.
const std::vector<std::pair<CLSID, CLSID>> NativeToManagedClsid({
{ CLSID_SHIMActivateMdPreviewHandler, CLSID_MdPreviewHandler },
{ CLSID_SHIMActivateSvgPreviewHandler, CLSID_SvgPreviewHandler }
{ CLSID_SHIMActivateSvgPreviewHandler, CLSID_SvgPreviewHandler },
{ CLSID_SHIMActivateSvgThumbnailProvider, CLSID_SvgThumbnailProvider }
});

View File

@@ -26,6 +26,20 @@ void PowerPreviewModule::destroy()
}
}
for (auto thumbnailProvider : this->m_thumbnailProviders)
{
if (thumbnailProvider != NULL)
{
// Disable all the active thumbnail providers.
if (this->m_enabled && thumbnailProvider->GetToggleSettingState())
{
thumbnailProvider->DisablePreview();
}
delete thumbnailProvider;
}
}
delete this;
}
@@ -67,6 +81,15 @@ bool PowerPreviewModule::get_config(_Out_ wchar_t* buffer, _Out_ int* buffer_siz
previewHandler->GetToggleSettingState());
}
for (auto thumbnailProvider : this->m_thumbnailProviders)
{
settings.add_bool_toggle(
thumbnailProvider->GetToggleSettingName(),
thumbnailProvider->GetToggleSettingDescription(),
thumbnailProvider->GetToggleSettingState());
}
return settings.serialize_to_buffer(buffer, buffer_size);
}
@@ -82,6 +105,11 @@ void PowerPreviewModule::set_config(const wchar_t* config)
previewHandler->UpdateState(settings, this->m_enabled);
}
for (auto thumbnailProvider : this->m_thumbnailProviders)
{
thumbnailProvider->UpdateState(settings, this->m_enabled);
}
settings.save_to_settings_file();
}
catch (std::exception const& e)
@@ -106,6 +134,19 @@ void PowerPreviewModule::enable()
}
}
for (auto thumbnailProvider : this->m_thumbnailProviders)
{
if (thumbnailProvider->GetToggleSettingState())
{
// Enable all the thumbnail providers with initial state set as true.
thumbnailProvider->EnableThumbnailProvider();
}
else
{
thumbnailProvider->DisableThumbnailProvider();
}
}
if (!this->m_enabled)
{
Trace::EnabledPowerPreview(true);
@@ -122,6 +163,11 @@ void PowerPreviewModule::disable()
previewHandler->DisablePreview();
}
for (auto thumbnailProvider : this->m_thumbnailProviders)
{
thumbnailProvider->DisableThumbnailProvider();
}
if (this->m_enabled)
{
Trace::EnabledPowerPreview(false);
@@ -156,6 +202,12 @@ void PowerPreviewModule::init_settings()
{
previewHandler->LoadState(settings);
}
for (auto thumbnailProvider : this->m_thumbnailProviders)
{
thumbnailProvider->LoadState(settings);
}
}
catch (std::exception const& e)
{

View File

@@ -17,6 +17,7 @@ private:
bool m_enabled = false;
std::wstring m_moduleName;
std::vector<FileExplorerPreviewSettings *> m_previewHandlers;
std::vector<FileExplorerPreviewSettings*> m_thumbnailProviders;
public:
PowerPreviewModule() :
@@ -39,6 +40,16 @@ public:
L"{45769bcc-e8fd-42d0-947e-02beef77a1f5}",
L"Markdown Preview Handler",
new RegistryWrapper())
}),
m_thumbnailProviders(
{ // TODO: MOVE THIS SVG Thumbnail Provider settings object.
new FileExplorerPreviewSettings(
true,
L"svg-thumbnail-toggle-setting",
GET_RESOURCE_STRING(IDS_SVG_THUMBNAIL_PROVIDER_SETTINGS_DESCRIPTION),
L"{36B27788-A8BB-4698-A756-DF9F11F64F84}",
L"SVG Thumbnail Provider",
new RegistryWrapper())
})
{
init_settings();

View File

@@ -95,6 +95,7 @@ BEGIN
IDS_PREVPANE_SVG_BOOL_TOGGLE_CONTROLL L"IDS_PREVPANE_SVG_BOOL_TOGGLE_CONTROLL"
IDS_PREVPANE_SVG_SETTINGS_DESCRIPTION L"Svg Previewer"
IDS_PREVPANE_SVG_SETTINGS_DISPLAYNAME L"SVG Previewer"
IDS_SVG_THUMBNAIL_PROVIDER_SETTINGS_DESCRIPTION L"Svg Thumbnail Provider"
IDS_EXPLR_SVG_BOOL_TOGGLE_CONTROLL L"EXPLR_SVG_BOOL_TOGGLE_CONTROLL"
IDS_EXPLR_SVG_SETTINGS_DESCRIPTION L"Render SVG images"
END

View File

@@ -29,6 +29,7 @@
#define IDS_EXPLR_SVG_SETTINGS_DESCRIPTION 214
#define IDS_PREVPANE_SVG_SETTINGS_DISPLAYNAME 215
#define IDS_PREVPANE_MD_SETTINGS_DISPLAYNAME 216
#define IDS_SVG_THUMBNAIL_PROVIDER_SETTINGS_DESCRIPTION 217
// Next default values for new objects
//

View File

@@ -14,6 +14,9 @@ namespace PowerPreviewSettings
// Relative(HKLM/HKCU) sub key path of Preview Handlers list in registry.
static LPCWSTR preview_handlers_subkey = L"Software\\Microsoft\\Windows\\CurrentVersion\\PreviewHandlers";
// Relative HKCR sub key path of SVG thumbnail provider in registry
static LPCWSTR svg_thumbnail_provider_subkey = L".svg\\shellex\\{E357FCCD-A995-4576-B01F-234630154E96}";
// Base Settings Class Implementation
FileExplorerPreviewSettings::FileExplorerPreviewSettings(bool toggleSettingEnabled, const std::wstring& toggleSettingName, const std::wstring& toggleSettingDescription, LPCWSTR clsid, const std::wstring& registryValueData, RegistryWrapperIface* registryWrapper) :
m_toggleSettingEnabled(toggleSettingEnabled),
@@ -127,4 +130,16 @@ namespace PowerPreviewSettings
// Delete the registry key to disable preview.
return this->m_registryWrapper->DeleteRegistryValue(HKEY_CURRENT_USER, preview_handlers_subkey, this->GetCLSID());
}
LONG FileExplorerPreviewSettings::EnableThumbnailProvider()
{
// Add registry value to enable thumbnail provider.
return this->m_registryWrapper->SetRegistryValue(HKEY_CURRENT_USER, svg_thumbnail_provider_subkey, this->GetCLSID(), REG_SZ, (LPBYTE)this->GetRegistryValueData().c_str(), (DWORD)(this->GetRegistryValueData().length() * sizeof(wchar_t)));
}
LONG FileExplorerPreviewSettings::DisableThumbnailProvider()
{
// Delete the registry key to disable thumbnail provider.
return this->m_registryWrapper->DeleteRegistryValue(HKEY_CURRENT_USER, svg_thumbnail_provider_subkey, this->GetCLSID());
}
}

View File

@@ -7,24 +7,24 @@
namespace PowerPreviewSettings
{
// PowerToy Windows Explore File Preview Settings.
class FileExplorerPreviewSettings
{
private:
bool m_toggleSettingEnabled;
// PowerToy Windows Explorer File Preview Settings.
class FileExplorerPreviewSettings
{
private:
bool m_toggleSettingEnabled;
std::wstring m_toggleSettingName;
std::wstring m_toggleSettingDescription;
std::wstring m_registryValueData;
std::wstring m_registryValueData;
RegistryWrapperIface * m_registryWrapper;
LPCWSTR m_clsid;
LPCWSTR m_clsid;
public:
public:
FileExplorerPreviewSettings(bool toggleSettingEnabled, const std::wstring& toggleSettingName, const std::wstring& toggleSettingDescription, LPCWSTR clsid, const std::wstring& registryValueData, RegistryWrapperIface* registryWrapper);
~ FileExplorerPreviewSettings();
virtual bool GetToggleSettingState() const;
virtual bool GetToggleSettingState() const;
virtual void UpdateToggleSettingState(bool state);
virtual std::wstring GetToggleSettingName() const;
virtual std::wstring GetToggleSettingName() const;
virtual std::wstring GetToggleSettingDescription() const;
virtual LPCWSTR GetCLSID() const;
virtual std::wstring GetRegistryValueData() const;
@@ -32,5 +32,7 @@ namespace PowerPreviewSettings
virtual void UpdateState(PowerToysSettings::PowerToyValues& settings, bool enabled);
virtual LONG EnablePreview();
virtual LONG DisablePreview();
};
virtual LONG EnableThumbnailProvider();
virtual LONG DisableThumbnailProvider();
};
}