mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-02-24 20:20:38 +01:00
* Add variable support - initial version without UI * Add variable in template filename support in New+ * Fix XAML style * Addressed code review feedback
248 lines
7.8 KiB
C++
248 lines
7.8 KiB
C++
#include "pch.h"
|
|
|
|
#include <common/utils/gpo.h>
|
|
#include <common/utils/json.h>
|
|
#include <common/SettingsAPI/settings_helpers.h>
|
|
#include <common/SettingsAPI/settings_objects.h>
|
|
|
|
#include "settings.h"
|
|
#include "constants.h"
|
|
#include "Generated Files/resource.h"
|
|
|
|
// NewSettings are stored in PowerToys/New/settings.json
|
|
// The New PowerToy enabled state is stored in the general PowerToys/settings.json
|
|
|
|
static bool LastModifiedTime(const std::wstring& file_Path, FILETIME* returned_file_timestamp)
|
|
{
|
|
WIN32_FILE_ATTRIBUTE_DATA attr{};
|
|
if (GetFileAttributesExW(file_Path.c_str(), GetFileExInfoStandard, &attr))
|
|
{
|
|
*returned_file_timestamp = attr.ftLastWriteTime;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
NewSettings::NewSettings()
|
|
{
|
|
// New+ overall enable state is stored in the general settings json file
|
|
general_settings_json_file_path = PTSettingsHelper::get_powertoys_general_save_file_location();
|
|
|
|
// New+' actual settings are stored in new_settings_json_file_path
|
|
std::wstring settings_save_path = PTSettingsHelper::get_module_save_folder_location(newplus::constants::non_localizable::powertoy_key);
|
|
new_settings_json_file_path = settings_save_path + newplus::constants::non_localizable::settings_json_data_file_path;
|
|
|
|
RefreshEnabledState();
|
|
|
|
Load();
|
|
}
|
|
|
|
void NewSettings::Save()
|
|
{
|
|
PowerToysSettings::PowerToyValues values(newplus::constants::non_localizable::powertoy_key, newplus::constants::non_localizable::powertoy_key);
|
|
|
|
values.add_property(newplus::constants::non_localizable::settings_json_key_hide_file_extension, new_settings.hide_file_extension);
|
|
values.add_property(newplus::constants::non_localizable::settings_json_key_hide_starting_digits, new_settings.hide_starting_digits);
|
|
values.add_property(newplus::constants::non_localizable::settings_json_key_replace_variables, new_settings.replace_variables);
|
|
values.add_property(newplus::constants::non_localizable::settings_json_key_template_location, new_settings.template_location);
|
|
|
|
values.save_to_settings_file();
|
|
|
|
GetSystemTimeAsFileTime(&new_settings_last_loaded_timestamp);
|
|
}
|
|
|
|
void NewSettings::Load()
|
|
{
|
|
if (!std::filesystem::exists(new_settings_json_file_path))
|
|
{
|
|
InitializeWithDefaultSettings();
|
|
|
|
Save();
|
|
}
|
|
else
|
|
{
|
|
ParseJson();
|
|
}
|
|
}
|
|
|
|
void NewSettings::InitializeWithDefaultSettings()
|
|
{
|
|
// Init the default New settings - in case the New/settings.json doesn't exist
|
|
// Currently a similar defaulting logic is also in InitializeWithDefaultSettings in NewViewModel.cs
|
|
SetHideFileExtension(true);
|
|
|
|
// By default Replace Variables is turned off
|
|
SetReplaceVariables(false);
|
|
|
|
SetTemplateLocation(GetTemplateLocationDefaultPath());
|
|
}
|
|
|
|
void NewSettings::RefreshEnabledState()
|
|
{
|
|
// Load json general settings from data file, if it was modified since we last checked
|
|
FILETIME last_modified_timestamp{};
|
|
if (!(LastModifiedTime(general_settings_json_file_path, &last_modified_timestamp) &&
|
|
CompareFileTime(&last_modified_timestamp, &general_settings_last_loaded_timestamp) == 1))
|
|
{
|
|
return;
|
|
}
|
|
|
|
general_settings_last_loaded_timestamp = last_modified_timestamp;
|
|
|
|
auto json = json::from_file(general_settings_json_file_path);
|
|
if (!json)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Load the enabled settings for the New PowerToy via the general settings
|
|
const json::JsonObject& json_general_settings = json.value();
|
|
try
|
|
{
|
|
json::JsonObject powertoy_new_enabled_state;
|
|
json::get(json_general_settings, L"enabled", powertoy_new_enabled_state, json::JsonObject{});
|
|
json::get(powertoy_new_enabled_state, newplus::constants::non_localizable::powertoy_key, new_settings.enabled, false);
|
|
}
|
|
catch (const winrt::hresult_error&)
|
|
{
|
|
Logger::error(L"New+ unable to load enabled state from json");
|
|
}
|
|
}
|
|
|
|
void NewSettings::Reload()
|
|
{
|
|
// Load json New settings from data file, if it was modified since we last checked.
|
|
FILETIME very_latest_modified_timestamp{};
|
|
if (LastModifiedTime(new_settings_json_file_path, &very_latest_modified_timestamp) &&
|
|
CompareFileTime(&very_latest_modified_timestamp, &new_settings_last_loaded_timestamp) == 1)
|
|
{
|
|
Load();
|
|
}
|
|
}
|
|
|
|
void NewSettings::ParseJson()
|
|
{
|
|
PowerToysSettings::PowerToyValues settings =
|
|
PowerToysSettings::PowerToyValues::load_from_settings_file(newplus::constants::non_localizable::powertoy_key);
|
|
|
|
auto templateValue = settings.get_string_value(newplus::constants::non_localizable::settings_json_key_template_location);
|
|
if (templateValue.has_value())
|
|
{
|
|
new_settings.template_location = templateValue.value();
|
|
}
|
|
|
|
auto hideFileExtensionValue = settings.get_bool_value(newplus::constants::non_localizable::settings_json_key_hide_file_extension);
|
|
if (hideFileExtensionValue.has_value())
|
|
{
|
|
new_settings.hide_file_extension = hideFileExtensionValue.value();
|
|
}
|
|
|
|
auto hideStartingDigitsValue = settings.get_bool_value(newplus::constants::non_localizable::settings_json_key_hide_starting_digits);
|
|
if (hideStartingDigitsValue.has_value())
|
|
{
|
|
new_settings.hide_starting_digits = hideStartingDigitsValue.value();
|
|
}
|
|
|
|
auto resolveVariables = settings.get_bool_value(newplus::constants::non_localizable::settings_json_key_replace_variables);
|
|
if (resolveVariables.has_value())
|
|
{
|
|
new_settings.replace_variables = resolveVariables.value();
|
|
}
|
|
|
|
GetSystemTimeAsFileTime(&new_settings_last_loaded_timestamp);
|
|
}
|
|
|
|
bool NewSettings::GetEnabled()
|
|
{
|
|
auto gpoSetting = powertoys_gpo::getConfiguredNewPlusEnabledValue();
|
|
if (gpoSetting == powertoys_gpo::gpo_rule_configured_enabled)
|
|
{
|
|
return true;
|
|
}
|
|
if (gpoSetting == powertoys_gpo::gpo_rule_configured_disabled)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Reload();
|
|
|
|
RefreshEnabledState();
|
|
|
|
return new_settings.enabled;
|
|
}
|
|
|
|
bool NewSettings::GetHideFileExtension() const
|
|
{
|
|
const auto gpoSetting = powertoys_gpo::getConfiguredNewPlusHideTemplateFilenameExtensionValue();
|
|
|
|
if (gpoSetting == powertoys_gpo::gpo_rule_configured_disabled)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return new_settings.hide_file_extension;
|
|
}
|
|
|
|
void NewSettings::SetHideFileExtension(const bool hide_file_extension)
|
|
{
|
|
new_settings.hide_file_extension = hide_file_extension;
|
|
}
|
|
|
|
bool NewSettings::GetHideStartingDigits() const
|
|
{
|
|
return new_settings.hide_starting_digits;
|
|
}
|
|
|
|
void NewSettings::SetHideStartingDigits(const bool hide_starting_digits)
|
|
{
|
|
new_settings.hide_starting_digits = hide_starting_digits;
|
|
}
|
|
|
|
bool NewSettings::GetReplaceVariables() const
|
|
{
|
|
const auto gpoSetting = powertoys_gpo::getConfiguredNewPlusReplaceVariablesValue();
|
|
|
|
if (gpoSetting == powertoys_gpo::gpo_rule_configured_disabled)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return new_settings.replace_variables;
|
|
}
|
|
|
|
void NewSettings::SetReplaceVariables(const bool replace_variables)
|
|
{
|
|
new_settings.replace_variables = replace_variables;
|
|
}
|
|
|
|
std::wstring NewSettings::GetTemplateLocation() const
|
|
{
|
|
return new_settings.template_location;
|
|
}
|
|
|
|
void NewSettings::SetTemplateLocation(const std::wstring template_location)
|
|
{
|
|
new_settings.template_location = template_location;
|
|
}
|
|
|
|
std::wstring NewSettings::GetTemplateLocationDefaultPath() const
|
|
{
|
|
static const std::wstring default_template_sub_folder_name =
|
|
GET_RESOURCE_STRING_FALLBACK(
|
|
IDS_DEFAULT_TEMPLATE_SUB_FOLDER_NAME_WHERE_TEMPLATES_ARE_STORED,
|
|
L"Templates");
|
|
|
|
static const std::wstring full_path = PTSettingsHelper::get_module_save_folder_location(
|
|
newplus::constants::non_localizable::powertoy_key) +
|
|
L"\\" + default_template_sub_folder_name;
|
|
|
|
return full_path;
|
|
}
|
|
|
|
NewSettings& NewSettingsInstance()
|
|
{
|
|
static NewSettings instance;
|
|
|
|
return instance;
|
|
}
|