Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Cascading User + Default Settings #2515

Merged
merged 54 commits into from
Sep 16, 2019
Merged
Changes from 1 commit
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
858341f
Create profiles by layering them
zadjii-msft Aug 20, 2019
2074ac2
Update test to layer multiple times on the same profile
zadjii-msft Aug 20, 2019
deb135f
Add support for layering an array of profiles, but break a couple tests
zadjii-msft Aug 20, 2019
e524ea7
Add a defaults.json to the package
zadjii-msft Aug 20, 2019
8157fd6
Layer colorschemes
zadjii-msft Aug 20, 2019
16336bb
Layer an array of color schemes
zadjii-msft Aug 20, 2019
870fed3
Merge remote-tracking branch 'origin/master' into dev/migrie/f/754-la…
zadjii-msft Aug 21, 2019
22e375d
oh no, this was missed with #2481
zadjii-msft Aug 21, 2019
4e3c3c3
Layer keybindings
zadjii-msft Aug 21, 2019
2c2fa14
Read settings from defaults.json + profiles.json, layer appropriately
zadjii-msft Aug 21, 2019
9bcf0c5
Add tests for keybindings
zadjii-msft Aug 21, 2019
c6b80b9
Layer or clear optional properties
zadjii-msft Aug 21, 2019
c040356
Add a helper to get an optional variable for a bunch of different types
zadjii-msft Aug 21, 2019
51bcf11
Do this with the stretch mode too
zadjii-msft Aug 21, 2019
8b938ff
Add back in the GUID check for profiles
zadjii-msft Aug 22, 2019
aec4c51
Add some tests for global settings layering
zadjii-msft Aug 22, 2019
1d662ca
M A D W I T H P O W E R
zadjii-msft Aug 22, 2019
9a14dab
When the user's profile.json doesn't exist, create it from a template
zadjii-msft Aug 22, 2019
82b57f8
Re-order profiles to match the order set in the user's profiles.json
zadjii-msft Aug 22, 2019
2084f89
Add tests for re-ordering profiles to match user ordering
zadjii-msft Aug 22, 2019
e07c1ba
Add support for hiding profiles using `"hidden": true`
zadjii-msft Aug 22, 2019
3ab0f25
Use the hardcoded defaults.json for the exception->"use defaults" case
zadjii-msft Aug 22, 2019
39b7fe1
Merge remote-tracking branch 'origin/master' into dev/migrie/f/754-la…
zadjii-msft Aug 22, 2019
9b6a2ee
Somehow I messed up the git submodules?
zadjii-msft Aug 22, 2019
be8e858
woo documentation
zadjii-msft Aug 22, 2019
7dcb179
Fix a Terminal.App.Unit.Tests failure
zadjii-msft Aug 23, 2019
7953e8c
signed/unsigned is hard
zadjii-msft Aug 23, 2019
2032b96
Use Alt+Settings button to open the default settings
zadjii-msft Aug 23, 2019
bf792e8
Missed a signed/unsigned
zadjii-msft Aug 23, 2019
215af70
Merge branch 'master' into dev/migrie/f/754-layer-settings
zadjii-msft Aug 26, 2019
48d3e76
Some very preliminary PR feedback
zadjii-msft Aug 26, 2019
679bf2e
More PR feedback
zadjii-msft Aug 26, 2019
2c978f7
Add templates to these bois
zadjii-msft Aug 26, 2019
9320304
remove some code for generating defaults, reorder defaults.json a tad
zadjii-msft Aug 26, 2019
083ac42
Merge branch 'master' into dev/migrie/f/754-layer-settings
zadjii-msft Aug 26, 2019
2278f22
Make guid a std::optional
zadjii-msft Aug 26, 2019
0873210
Large block of PR feedback
zadjii-msft Aug 27, 2019
e3171ea
stl is love, stl is life
zadjii-msft Aug 27, 2019
966ddeb
add `-noprofile`
zadjii-msft Aug 29, 2019
db6a734
Fix the crash that dustin found
zadjii-msft Aug 29, 2019
eea22cc
-Encoding ASCII
zadjii-msft Aug 29, 2019
a685bd8
Set a profile's default scheme to Campbell
zadjii-msft Aug 29, 2019
5e98b81
Fix the tests I regressed
zadjii-msft Aug 29, 2019
4eec81b
Update UsingJsonSetting.md to reflect that changes from these PRs
zadjii-msft Aug 29, 2019
ff1ad96
Change how GenerateGuidForProfile works
zadjii-msft Sep 3, 2019
54eb9c7
Merge branch 'master' into dev/migrie/f/754-layer-settings
zadjii-msft Sep 5, 2019
a659db1
Make AppKeyBindings do its own serialization
zadjii-msft Sep 5, 2019
a757b07
Remove leftover dead code from the previous commit
zadjii-msft Sep 5, 2019
46adadf
Fix up an enormous number of PR nits
zadjii-msft Sep 6, 2019
86aabba
Merge remote-tracking branch 'origin/master' into dev/migrie/f/754-la…
zadjii-msft Sep 11, 2019
edb1ead
Fix a typo; Update the defaults to match #2378
zadjii-msft Sep 11, 2019
fed6492
Tiny nits
zadjii-msft Sep 11, 2019
d1e98b6
Some typos, PR nits
zadjii-msft Sep 13, 2019
e454753
Fix this broken defaults case
zadjii-msft Sep 16, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Layer an array of color schemes
zadjii-msft committed Aug 20, 2019
commit 16336bb6a52d10e5cdaa21e25536ed521603cc36
155 changes: 77 additions & 78 deletions src/cascadia/LocalTests_TerminalApp/ColorSchemeTests.cpp
Original file line number Diff line number Diff line change
@@ -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
@@ -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);
41 changes: 37 additions & 4 deletions src/cascadia/TerminalApp/CascadiaSettingsSerialization.cpp
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
@@ -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();