From 16336bb6a52d10e5cdaa21e25536ed521603cc36 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 20 Aug 2019 17:14:31 -0500 Subject: [PATCH] Layer an array of color schemes --- .../ColorSchemeTests.cpp | 155 +++++++++--------- src/cascadia/TerminalApp/CascadiaSettings.h | 2 + .../CascadiaSettingsSerialization.cpp | 41 ++++- 3 files changed, 116 insertions(+), 82 deletions(-) diff --git a/src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp b/src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp index f08da3fe734..ab01d5c655c 100644 --- a/src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp +++ b/src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp @@ -153,83 +153,82 @@ namespace TerminalAppLocalTests void ColorSchemeTests::LayerColorSchemesOnArray() { - // const std::string profile0String{ R"({ - // "name" : "profile0", - // "guid" : "{6239a42c-0000-49a3-80bd-e8fdd045185c}" - // })" }; - // const std::string profile1String{ R"({ - // "name" : "profile1", - // "guid" : "{6239a42c-1111-49a3-80bd-e8fdd045185c}" - // })" }; - // const std::string profile2String{ R"({ - // "name" : "profile2", - // "guid" : "{6239a42c-2222-49a3-80bd-e8fdd045185c}" - // })" }; - // const std::string profile3String{ R"({ - // "name" : "profile3", - // "guid" : "{6239a42c-0000-49a3-80bd-e8fdd045185c}" - // })" }; - // const std::string profile4String{ R"({ - // "name" : "profile4", - // "guid" : "{6239a42c-0000-49a3-80bd-e8fdd045185c}" - // })" }; - - // const auto profile0Json = VerifyParseSucceeded(profile0String); - // const auto profile1Json = VerifyParseSucceeded(profile1String); - // const auto profile2Json = VerifyParseSucceeded(profile2String); - // const auto profile3Json = VerifyParseSucceeded(profile3String); - // const auto profile4Json = VerifyParseSucceeded(profile4String); - - // CascadiaSettings settings{}; - - // VERIFY_ARE_EQUAL(0, settings._profiles.size()); - // VERIFY_IS_NULL(settings._FindMatchingProfile(profile0Json)); - // VERIFY_IS_NULL(settings._FindMatchingProfile(profile1Json)); - // VERIFY_IS_NULL(settings._FindMatchingProfile(profile2Json)); - // VERIFY_IS_NULL(settings._FindMatchingProfile(profile3Json)); - // VERIFY_IS_NULL(settings._FindMatchingProfile(profile4Json)); - - // settings._LayerOrCreateProfile(profile0Json); - // VERIFY_ARE_EQUAL(1, settings._profiles.size()); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile0Json)); - // VERIFY_IS_NULL(settings._FindMatchingProfile(profile1Json)); - // VERIFY_IS_NULL(settings._FindMatchingProfile(profile2Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile3Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile4Json)); - - // settings._LayerOrCreateProfile(profile1Json); - // VERIFY_ARE_EQUAL(2, settings._profiles.size()); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile0Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile1Json)); - // VERIFY_IS_NULL(settings._FindMatchingProfile(profile2Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile3Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile4Json)); - - // settings._LayerOrCreateProfile(profile2Json); - // VERIFY_ARE_EQUAL(3, settings._profiles.size()); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile0Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile1Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile2Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile3Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile4Json)); - // VERIFY_ARE_EQUAL(L"profile0", settings._profiles.at(0)._name); - - // settings._LayerOrCreateProfile(profile3Json); - // VERIFY_ARE_EQUAL(3, settings._profiles.size()); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile0Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile1Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile2Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile3Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile4Json)); - // VERIFY_ARE_EQUAL(L"profile3", settings._profiles.at(0)._name); - - // settings._LayerOrCreateProfile(profile4Json); - // VERIFY_ARE_EQUAL(3, settings._profiles.size()); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile0Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile1Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile2Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile3Json)); - // VERIFY_IS_NOT_NULL(settings._FindMatchingProfile(profile4Json)); - // VERIFY_ARE_EQUAL(L"profile4", settings._profiles.at(0)._name); + const std::string scheme0String{ R"({ + "name": "scheme0", + "foreground": "#000000", + "background": "#010101" + })" }; + const std::string scheme1String{ R"({ + "name": "scheme1", + "foreground": "#020202", + "background": "#030303" + })" }; + const std::string scheme2String{ R"({ + "name": "scheme0", + "foreground": "#040404", + "background": "#050505" + })" }; + const std::string scheme3String{ R"({ + // "name": "scheme3", + "foreground": "#060606", + "background": "#070707" + })" }; + + const auto scheme0Json = VerifyParseSucceeded(scheme0String); + const auto scheme1Json = VerifyParseSucceeded(scheme1String); + const auto scheme2Json = VerifyParseSucceeded(scheme2String); + const auto scheme3Json = VerifyParseSucceeded(scheme3String); + + CascadiaSettings settings{}; + + VERIFY_ARE_EQUAL(0, settings._globals.GetColorSchemes().size()); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme0Json)); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme1Json)); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme2Json)); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme3Json)); + + settings._LayerOrCreateColorScheme(scheme0Json); + VERIFY_ARE_EQUAL(1, settings._globals.GetColorSchemes().size()); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme0Json)); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme1Json)); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme2Json)); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme3Json)); + VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 0), settings._globals.GetColorSchemes().at(0)._defaultForeground); + VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 1), settings._globals.GetColorSchemes().at(0)._defaultBackground); + + settings._LayerOrCreateColorScheme(scheme1Json); + VERIFY_ARE_EQUAL(2, settings._globals.GetColorSchemes().size()); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme0Json)); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme1Json)); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme2Json)); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme3Json)); + VERIFY_ARE_EQUAL(ARGB(0, 0, 0, 0), settings._globals.GetColorSchemes().at(0)._defaultForeground); + VERIFY_ARE_EQUAL(ARGB(0, 1, 1, 1), settings._globals.GetColorSchemes().at(0)._defaultBackground); + VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), settings._globals.GetColorSchemes().at(1)._defaultForeground); + VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), settings._globals.GetColorSchemes().at(1)._defaultBackground); + + settings._LayerOrCreateColorScheme(scheme2Json); + VERIFY_ARE_EQUAL(2, settings._globals.GetColorSchemes().size()); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme0Json)); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme1Json)); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme2Json)); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme3Json)); + VERIFY_ARE_EQUAL(ARGB(0, 4, 4, 4), settings._globals.GetColorSchemes().at(0)._defaultForeground); + VERIFY_ARE_EQUAL(ARGB(0, 5, 5, 5), settings._globals.GetColorSchemes().at(0)._defaultBackground); + VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), settings._globals.GetColorSchemes().at(1)._defaultForeground); + VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), settings._globals.GetColorSchemes().at(1)._defaultBackground); + + settings._LayerOrCreateColorScheme(scheme3Json); + VERIFY_ARE_EQUAL(3, settings._globals.GetColorSchemes().size()); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme0Json)); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme1Json)); + VERIFY_IS_NOT_NULL(settings._FindMatchingColorScheme(scheme2Json)); + VERIFY_IS_NULL(settings._FindMatchingColorScheme(scheme3Json)); + VERIFY_ARE_EQUAL(ARGB(0, 4, 4, 4), settings._globals.GetColorSchemes().at(0)._defaultForeground); + VERIFY_ARE_EQUAL(ARGB(0, 5, 5, 5), settings._globals.GetColorSchemes().at(0)._defaultBackground); + VERIFY_ARE_EQUAL(ARGB(0, 2, 2, 2), settings._globals.GetColorSchemes().at(1)._defaultForeground); + VERIFY_ARE_EQUAL(ARGB(0, 3, 3, 3), settings._globals.GetColorSchemes().at(1)._defaultBackground); + VERIFY_ARE_EQUAL(ARGB(0, 6, 6, 6), settings._globals.GetColorSchemes().at(2)._defaultForeground); + VERIFY_ARE_EQUAL(ARGB(0, 7, 7, 7), settings._globals.GetColorSchemes().at(2)._defaultBackground); } } diff --git a/src/cascadia/TerminalApp/CascadiaSettings.h b/src/cascadia/TerminalApp/CascadiaSettings.h index abf190586bd..f5d9155b023 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.h +++ b/src/cascadia/TerminalApp/CascadiaSettings.h @@ -75,6 +75,8 @@ class TerminalApp::CascadiaSettings final void _LayerOrCreateProfile(const Json::Value& profileJson); Profile* _FindMatchingProfile(const Json::Value& profileJson); + void _LayerOrCreateColorScheme(const Json::Value& schemeJson); + ColorScheme* _FindMatchingColorScheme(const Json::Value& schemeJson); static bool _IsPackaged(); static void _WriteSettings(const std::string_view content); diff --git a/src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp b/src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp index 605841afc2b..4975c624a88 100644 --- a/src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp +++ b/src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp @@ -191,15 +191,15 @@ std::unique_ptr CascadiaSettings::FromJson(const Json::Value& // Not having any profiles is also bad - should we say the file is corrupted? // Or should we just recreate the default profiles? - auto& resultSchemes = resultPtr->_globals.GetColorSchemes(); if (auto schemes{ json[SchemesKey.data()] }) { for (auto schemeJson : schemes) { if (schemeJson.isObject()) { - auto scheme = ColorScheme::FromJson(schemeJson); - resultSchemes.emplace_back(std::move(scheme)); + // auto scheme = ColorScheme::FromJson(schemeJson); + // resultSchemes.emplace_back(std::move(scheme)); + resultPtr->_LayerOrCreateColorScheme(schemeJson); } } } @@ -247,6 +247,33 @@ Profile* CascadiaSettings::_FindMatchingProfile(const Json::Value& profileJson) return nullptr; } +void CascadiaSettings::_LayerOrCreateColorScheme(const Json::Value& schemeJson) +{ + // Layer the json on top of an existing profile, if we have one: + auto pScheme = _FindMatchingColorScheme(schemeJson); + if (pScheme) + { + pScheme->LayerJson(schemeJson); + } + else + { + auto scheme = ColorScheme::FromJson(schemeJson); + _globals.GetColorSchemes().emplace_back(scheme); + } +} + +ColorScheme* CascadiaSettings::_FindMatchingColorScheme(const Json::Value& schemeJson) +{ + for (auto& scheme : _globals.GetColorSchemes()) + { + if (scheme.ShouldBeLayered(schemeJson)) + { + return &scheme; + } + } + return nullptr; +} + // Function Description: // - Returns true if we're running in a packaged context. // If we are, we want to change our settings path slightly. @@ -274,7 +301,13 @@ void CascadiaSettings::_WriteSettings(const std::string_view content) { auto pathToSettingsFile{ CascadiaSettings::GetSettingsPath() }; - auto hOut = CreateFileW(pathToSettingsFile.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + auto hOut = CreateFileW(pathToSettingsFile.c_str(), + GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + NULL); if (hOut == INVALID_HANDLE_VALUE) { THROW_LAST_ERROR();