// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #include "pch.h" #include "FontConfig.h" #include "FontConfig.g.cpp" #include "TerminalSettingsSerializationHelpers.h" #include "JsonUtils.h" using namespace Microsoft::Terminal::Settings::Model; using namespace winrt::Microsoft::Terminal::Settings::Model::implementation; static constexpr std::string_view FontInfoKey{ "font" }; static constexpr std::string_view LegacyFontFaceKey{ "fontFace" }; static constexpr std::string_view LegacyFontSizeKey{ "fontSize" }; static constexpr std::string_view LegacyFontWeightKey{ "fontWeight" }; winrt::Microsoft::Terminal::Settings::Model::implementation::FontConfig::FontConfig(winrt::weak_ref sourceProfile) : _sourceProfile(std::move(sourceProfile)) { } winrt::com_ptr FontConfig::CopyFontInfo(const FontConfig* source, winrt::weak_ref sourceProfile) { auto fontInfo{ winrt::make_self(std::move(sourceProfile)) }; #define FONT_SETTINGS_COPY(type, name, jsonKey, ...) \ fontInfo->_##name = source->_##name; MTSM_FONT_SETTINGS(FONT_SETTINGS_COPY) #undef FONT_SETTINGS_COPY return fontInfo; } Json::Value FontConfig::ToJson() const { Json::Value json{ Json::ValueType::objectValue }; #define FONT_SETTINGS_TO_JSON(type, name, jsonKey, ...) \ JsonUtils::SetValueForKey(json, jsonKey, _##name); MTSM_FONT_SETTINGS(FONT_SETTINGS_TO_JSON) #undef FONT_SETTINGS_TO_JSON return json; } // Method Description: // - Layer values from the given json object on top of the existing properties // of this object. For any keys we're expecting to be able to parse in the // given object, we'll parse them and replace our settings with values from // the new json object. Properties that _aren't_ in the json object will _not_ // be replaced. // - Optional values that are set to `null` in the json object // will be set to nullopt. // - This is similar to Profile::LayerJson but for FontConfig // Arguments: // - json: an object which should be a partial serialization of a FontConfig object. void FontConfig::LayerJson(const Json::Value& json) { // Legacy users may not have a font object defined in their profile, // so check for that before we decide how to parse this if (json.isMember(JsonKey(FontInfoKey))) { // A font object is defined, use that const auto fontInfoJson = json[JsonKey(FontInfoKey)]; #define FONT_SETTINGS_LAYER_JSON(type, name, jsonKey, ...) \ JsonUtils::GetValueForKey(fontInfoJson, jsonKey, _##name); MTSM_FONT_SETTINGS(FONT_SETTINGS_LAYER_JSON) #undef FONT_SETTINGS_LAYER_JSON } else { // No font object is defined JsonUtils::GetValueForKey(json, LegacyFontFaceKey, _FontFace); JsonUtils::GetValueForKey(json, LegacyFontSizeKey, _FontSize); JsonUtils::GetValueForKey(json, LegacyFontWeightKey, _FontWeight); } } bool FontConfig::HasAnyOptionSet() const { return HasFontFace() || HasFontSize() || HasFontWeight(); } winrt::Microsoft::Terminal::Settings::Model::Profile FontConfig::SourceProfile() { return _sourceProfile.get(); }