Skip to content

Commit

Permalink
Layer an array of color schemes
Browse files Browse the repository at this point in the history
  • Loading branch information
zadjii-msft committed Aug 20, 2019
1 parent 8157fd6 commit 16336bb
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 82 deletions.
155 changes: 77 additions & 78 deletions src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
2 changes: 2 additions & 0 deletions src/cascadia/TerminalApp/CascadiaSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
41 changes: 37 additions & 4 deletions src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,15 +191,15 @@ std::unique_ptr<CascadiaSettings> 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);
}
}
}
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 16336bb

Please sign in to comment.