[File Explorer] Fix enable/disable for File Explorer PowerToy (#6883)

* Commented out enable/disable for File Explorer

* Revert UI changes

* Disable the toggles if PT is not running elevated

* Fixed compilation errors in tests

* Cleaned up preview pane code to separate thumbnail and preview panes as separate classes

* Fixed broken settings format and added elevation check and registry updated required logic. Preview Handler tested manually working, Thumbnail Enable/Disable needs to be fixed

* Updated Thumbnail enable/disable logic and added warning messages

* Update tests for File Explorer

* Fixed RegGetValue failing in Release config

* Renamed new classes

* Split wrappers for disable to work

* Modified enabled flag check to also check if user is on new settings. Fixed casing issue in powerpreview.h that caused a dialog prompt on first launch after install

* Update fontweight and margin

* Fixed release build not working

* Move UseNewSettings usage to powerpreview.cpp to avoid tests breaking. For new settings the enable check is done in constructor and for old settings it is done in enable

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

Co-authored-by: htcfreek <61519853+htcfreek@users.noreply.github.com>

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

Co-authored-by: htcfreek <61519853+htcfreek@users.noreply.github.com>

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

Co-authored-by: htcfreek <61519853+htcfreek@users.noreply.github.com>

* Moved dup code to method

* Use correct versions of general settings for backwards compat test

Co-authored-by: htcfreek <61519853+htcfreek@users.noreply.github.com>
This commit is contained in:
Arjun Balgovind
2020-10-09 14:45:30 -07:00
committed by GitHub
parent d753179d1e
commit 7fd5e18ef4
22 changed files with 727 additions and 233 deletions

View File

@@ -11,12 +11,6 @@ namespace PowerPreviewSettings
{
extern "C" IMAGE_DOS_HEADER __ImageBase;
// 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),
@@ -28,7 +22,7 @@ namespace PowerPreviewSettings
{
}
FileExplorerPreviewSettings::~FileExplorerPreviewSettings()
FileExplorerPreviewSettings::~FileExplorerPreviewSettings()
{
if (this->m_registryWrapper != NULL)
{
@@ -66,7 +60,7 @@ namespace PowerPreviewSettings
return this->m_registryValueData;
}
// Load initial state of the Preview Handler. If no inital state present initialize setting with default value.
// Load initial state of the file explorer module. If no inital state present initialize setting with default value.
void FileExplorerPreviewSettings::LoadState(PowerToysSettings::PowerToyValues& settings)
{
auto toggle = settings.get_bool_value(this->GetToggleSettingName());
@@ -77,8 +71,8 @@ namespace PowerPreviewSettings
}
}
// Manage change in state of Preview Handler settings.
void FileExplorerPreviewSettings::UpdateState(PowerToysSettings::PowerToyValues& settings, bool enabled)
// Manage change in state of file explorer module settings.
bool FileExplorerPreviewSettings::UpdateState(PowerToysSettings::PowerToyValues& settings, bool enabled, bool isElevated)
{
auto toggle = settings.get_bool_value(this->GetToggleSettingName());
if (toggle)
@@ -89,27 +83,40 @@ namespace PowerPreviewSettings
{
this->UpdateToggleSettingState(newState);
// If global setting is enable. Add or remove the preview handler otherwise just change the UI and save the updated config.
// If global setting is enable. Add or remove the file explorer module otherwise just change the UI and save the updated config.
if (enabled)
{
LONG err;
if (lastState)
// Check if the registry state does not match the new state, registry needs to be modified
if (this->CheckRegistryState() != newState)
{
err = this->DisablePreview();
}
else
{
err = this->EnablePreview();
}
if (isElevated)
{
LONG err;
if (lastState)
{
err = this->Disable();
}
else
{
err = this->Enable();
}
if (err == ERROR_SUCCESS)
{
Trace::PowerPreviewSettingsUpdated(this->GetToggleSettingName().c_str(), lastState, newState, enabled);
}
else
{
Trace::PowerPreviewSettingsUpdateFailed(this->GetToggleSettingName().c_str(), lastState, newState, enabled);
if (err == ERROR_SUCCESS)
{
Trace::PowerPreviewSettingsUpdated(this->GetToggleSettingName().c_str(), lastState, newState, enabled);
}
else
{
Trace::PowerPreviewSettingsUpdateFailed(this->GetToggleSettingName().c_str(), lastState, newState, enabled);
}
}
// If process is not elevated, return false as it is not possible to update the registry
else
{
return false;
}
}
// If it matches the new state, no update to registry is required
}
else
{
@@ -117,29 +124,7 @@ namespace PowerPreviewSettings
}
}
}
}
LONG FileExplorerPreviewSettings::EnablePreview()
{
// Add registry value to enable preview.
return this->m_registryWrapper->SetRegistryValue(HKEY_CURRENT_USER, preview_handlers_subkey, this->GetCLSID(), REG_SZ, (LPBYTE)this->GetRegistryValueData().c_str(), (DWORD)(this->GetRegistryValueData().length() * sizeof(wchar_t)));
}
LONG FileExplorerPreviewSettings::DisablePreview()
{
// 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());
return true;
}
}