terminal/src/cascadia/TerminalApp
Leonard Hecker 168d28b036
Reduce usage of Json::Value throughout Terminal.Settings.Model (#11184)
This commit reduces the code surface that interacts with raw JSON data,
reducing code complexity and improving maintainability.
Files that needed to be changed drastically were additionally
cleaned up to remove any code cruft that has accrued over time.

In order to facility this the following changes were made:
* Move JSON handling from `CascadiaSettings` into `SettingsLoader`
  This allows us to use STL containers for data model instances.
  For instance profiles are now added to a hashmap for O(1) lookup.
* JSON parsing within `SettingsLoader` doesn't differentiate between user,
  inbox and fragment JSON data, reducing code complexity and size.
  It also centralizes common concerns, like profile deduplication and
  ensuring that all profiles are assigned a GUID.
* Direct JSON modification, like the insertion of dynamic profiles into
  settings.json were removed. This vastly reduces code complexity,
  but unfortunately removes support for comments in JSON on first start.
* `ColorScheme`s cannot be layered. As such its `LayerJson` API was replaced
  with `FromJson`, allowing us to remove JSON-based color scheme validation.
* `Profile`s used to test their wish to layer using `ShouldBeLayered`, which
  was replaced with a GUID-based hashmap lookup on previously parsed profiles.

Further changes were made as improvements upon the previous changes:
* Compact the JSON files embedded binary, saving 28kB
* Prevent double-initialization of the color table in `ColorScheme`
* Making `til::color` getters `constexpr`, allow better optimizations

The result is a reduction of:
* 48kB binary size for the Settings.Model.dll
* 5-10% startup duration
* 26% code for the `CascadiaSettings` class
* 1% overall code in this project

Furthermore this results in the following breaking changes:
* The long deprecated "globals" settings object will not be detected and no
  warning will be created during load.
* The initial creation of a new settings.json will not produce helpful comments.

Both cases are caused by the removal of manual JSON handling and the
move to representing the settings file with model objects instead

## PR Checklist
* [x] Closes #5276
* [x] Closes #7421
* [x] I work here
* [x] Tests added/passed

## Validation Steps Performed

* Out-of-box-experience is identical to before ✔️
  (Except for the settings.json file lacking comments.)
* Existing user settings load correctly ✔️
* New WSL instances are added to user settings ✔️
* New fragments are added to user settings ✔️
* All profiles are assigned GUIDs ✔️
2021-09-22 16:27:31 +00:00
..
dll Update to MUX 2.7 (#11240) 2021-09-20 22:08:55 +00:00
Resources/en-US Replace TrayIcon with NotificationIcon (#11219) 2021-09-14 16:12:40 +00:00
ActionPaletteItem.cpp Add a simple page for keybindings (#9253) 2021-02-23 23:37:23 +00:00
ActionPaletteItem.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
ActionPaletteItem.idl Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
ActionPreviewHandlers.cpp Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
App.base.h Fix some places where we weren't using winrt::make (#10335) 2021-06-04 22:22:06 +00:00
App.cpp Make Terminal look great in High Contrast (#6833) 2020-07-08 12:08:08 -07:00
App.h
App.idl Fix intellisense errors by moving TerminalApp projects around (#6897) 2020-08-20 22:44:37 +00:00
App.xaml Update to MUX 2.7 (#11240) 2021-09-20 22:08:55 +00:00
AppActionHandlers.cpp Add the ability to split a pane and put the new pane first. (#11145) 2021-09-15 20:14:57 +00:00
AppCommandlineArgs.cpp Add the ability to split a pane and put the new pane first. (#11145) 2021-09-15 20:14:57 +00:00
AppCommandlineArgs.h Move Pane to Tab (GH7075) (#10780) 2021-08-12 16:41:17 +00:00
AppKeyBindings.cpp Adding/fixing Alt+Space handling (#10799) 2021-08-10 19:53:07 +00:00
AppKeyBindings.h Adding/fixing Alt+Space handling (#10799) 2021-08-10 19:53:07 +00:00
AppKeyBindings.idl Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
AppLogic.cpp Reduce usage of Json::Value throughout Terminal.Settings.Model (#11184) 2021-09-22 16:27:31 +00:00
AppLogic.h Replace TrayIcon with NotificationIcon (#11219) 2021-09-14 16:12:40 +00:00
AppLogic.idl Replace TrayIcon with NotificationIcon (#11219) 2021-09-14 16:12:40 +00:00
ColorHelper.cpp
ColorHelper.h
ColorPickupFlyout.cpp Fix color picker minimum width (#10663) 2021-07-15 14:39:25 +00:00
ColorPickupFlyout.h Terminal color picker tweaks (#10219) 2021-06-10 15:49:52 +00:00
ColorPickupFlyout.idl
ColorPickupFlyout.xaml Terminal color picker tweaks (#10219) 2021-06-10 15:49:52 +00:00
Commandline.cpp
Commandline.h
CommandLinePaletteItem.cpp Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
CommandLinePaletteItem.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
CommandLinePaletteItem.idl Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
CommandPalette.cpp Teach Command Palette to filter out duplicate command lines (#11116) 2021-09-02 03:03:52 +00:00
CommandPalette.h Teach CommandPalette to persist recent command lines (#11030) 2021-08-26 19:04:35 +00:00
CommandPalette.idl Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
CommandPalette.xaml Search box visual tweaks (#11105) 2021-09-09 18:00:46 +00:00
DebugTapConnection.cpp Switch Connections to use ValueSets to initialize them (#10184) 2021-07-20 15:02:17 +00:00
DebugTapConnection.h Switch Connections to use ValueSets to initialize them (#10184) 2021-07-20 15:02:17 +00:00
EmptyStringVisibilityConverter.cpp Add some polish to nested commands in the command palette (#7299) 2020-08-18 19:32:17 +00:00
EmptyStringVisibilityConverter.h Change backslashes in include statements to forward slashes (#8205) 2020-11-25 21:02:10 +00:00
EmptyStringVisibilityConverter.idl Add some polish to nested commands in the command palette (#7299) 2020-08-18 19:32:17 +00:00
FilteredCommand.cpp Teach CmdPal search to use user locale (#9943) 2021-05-04 23:31:15 +00:00
FilteredCommand.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
FilteredCommand.idl Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
HighlightedText.cpp Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedText.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
HighlightedText.idl Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedTextControl.cpp Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedTextControl.h Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedTextControl.idl Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedTextControl.xaml Auto-format our XAML files and enforce in CI (#9589) 2021-03-29 17:09:38 -05:00
IDirectKeyListener.idl Pass the scancode in our tunneled DirectKey event (#7298) 2020-08-14 23:44:39 +00:00
init.cpp Hook up the WIL fallback error tracer in Terminal (#7864) 2020-10-09 22:20:12 +00:00
Jumplist.cpp Fix crash when unpackaged due to PrimaryLanguageOverride (#10434) 2021-06-16 21:08:14 +00:00
Jumplist.h Move jumplist creation to background thread (#7978) 2020-10-22 17:17:26 -07:00
LanguageProfileNotifier.cpp Reload settings when the input method changes (#10876) 2021-08-05 21:33:44 +00:00
LanguageProfileNotifier.h Reload settings when the input method changes (#10876) 2021-08-05 21:33:44 +00:00
MinMaxCloseControl.cpp Move events out of TermControl.h ; Use TYPED_EVENT in more places (#9526) 2021-03-18 22:02:39 +00:00
MinMaxCloseControl.h Move events out of TermControl.h ; Use TYPED_EVENT in more places (#9526) 2021-03-18 22:02:39 +00:00
MinMaxCloseControl.idl Fix intellisense errors by moving TerminalApp projects around (#6897) 2020-08-20 22:44:37 +00:00
MinMaxCloseControl.xaml Make TabView padding equal (#11115) 2021-09-02 14:34:03 +00:00
packages.config Update to MUX 2.7 (#11240) 2021-09-20 22:08:55 +00:00
PaletteItem.cpp Rename Microsoft.Terminal.TerminalControl to .Control; Split into dll & lib (#9472) 2021-03-17 20:47:24 +00:00
PaletteItem.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
PaletteItem.idl Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
PaletteItemTemplateSelector.cpp Add help text to 'more options' in command palette (#9271) 2021-02-24 12:02:09 -08:00
PaletteItemTemplateSelector.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
PaletteItemTemplateSelector.idl Add help text to 'more options' in command palette (#9271) 2021-02-24 12:02:09 -08:00
Pane.cpp Enable Vintage Opacity (#11180) 2021-09-20 17:08:13 +00:00
Pane.h Add the ability to split a pane and put the new pane first. (#11145) 2021-09-15 20:14:57 +00:00
Pane.LayoutSizeNode.cpp
pch.cpp
pch.h Allow exporting terminal buffer into file via tab context menu (#11062) 2021-08-31 19:36:43 +00:00
SettingsTab.cpp In specific scenarios, focus the active control (#10048) 2021-05-11 23:55:49 +00:00
SettingsTab.h In specific scenarios, focus the active control (#10048) 2021-05-11 23:55:49 +00:00
SettingsTab.idl Add a keybinding option to Terminal to open the Settings UI (#8048) 2020-12-11 13:47:10 -08:00
ShortcutActionDispatch.cpp Add X Macro for fun and for profit (#9667) 2021-03-31 16:38:25 +00:00
ShortcutActionDispatch.h Add X Macro for fun and for profit (#9667) 2021-03-31 16:38:25 +00:00
ShortcutActionDispatch.idl Add X Macro for fun and for profit (#9667) 2021-03-31 16:38:25 +00:00
TabBase.cpp In specific scenarios, focus the active control (#10048) 2021-05-11 23:55:49 +00:00
TabBase.h In specific scenarios, focus the active control (#10048) 2021-05-11 23:55:49 +00:00
TabBase.idl Introduce read-only panes (#8867) 2021-02-08 18:03:55 +00:00
TabHeaderControl.cpp Don't yeet focus to the control when the tab renamer is opened (#10114) 2021-05-18 18:48:57 +00:00
TabHeaderControl.h Don't yeet focus to the control when the tab renamer is opened (#10114) 2021-05-18 18:48:57 +00:00
TabHeaderControl.idl Don't yeet focus to the control when the tab renamer is opened (#10114) 2021-05-18 18:48:57 +00:00
TabHeaderControl.xaml Auto-format our XAML files and enforce in CI (#9589) 2021-03-29 17:09:38 -05:00
TabManagement.cpp Enable Vintage Opacity (#11180) 2021-09-20 17:08:13 +00:00
TabPaletteItem.cpp Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TabPaletteItem.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
TabPaletteItem.idl Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TabRowControl.cpp Set drag and drop on '+' tooltip text based on keyboard modifiers (#10841) 2021-08-02 18:44:39 +00:00
TabRowControl.h implement drag&drop path in '+' button (#10073) (#10160) 2021-07-20 14:26:35 +00:00
TabRowControl.idl
TabRowControl.xaml implement drag&drop path in '+' button (#10073) (#10160) 2021-07-20 14:26:35 +00:00
TaskbarState.cpp Combine progress states in the tab, taskbar (#10755) 2021-08-10 11:16:17 +00:00
TaskbarState.h Combine progress states in the tab, taskbar (#10755) 2021-08-10 11:16:17 +00:00
TaskbarState.idl Combine progress states in the tab, taskbar (#10755) 2021-08-10 11:16:17 +00:00
TerminalAppLib.vcxproj Update to MUX 2.7 (#11240) 2021-09-20 22:08:55 +00:00
TerminalAppLib.vcxproj.filters Reload settings when the input method changes (#10876) 2021-08-05 21:33:44 +00:00
TerminalPage.cpp Add the ability to split a pane and put the new pane first. (#11145) 2021-09-15 20:14:57 +00:00
TerminalPage.h Add the ability to split a pane and put the new pane first. (#11145) 2021-09-15 20:14:57 +00:00
TerminalPage.idl Add an openSystemMenu keybinding (#11086) 2021-09-10 18:25:43 +00:00
TerminalPage.xaml Enable Vintage Opacity (#11180) 2021-09-20 17:08:13 +00:00
TerminalTab.cpp Update to MUX 2.7 (#11240) 2021-09-20 22:08:55 +00:00
TerminalTab.h Add the ability to split a pane and put the new pane first. (#11145) 2021-09-15 20:14:57 +00:00
TerminalTab.idl Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TerminalTabStatus.cpp Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TerminalTabStatus.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
TerminalTabStatus.idl Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TitlebarControl.cpp
TitlebarControl.h
TitlebarControl.idl
TitlebarControl.xaml Auto-format our XAML files and enforce in CI (#9589) 2021-03-29 17:09:38 -05:00
Toast.cpp Add an action for identifying windows (#9523) 2021-03-30 16:08:03 +00:00
Toast.h Add an action for identifying windows (#9523) 2021-03-30 16:08:03 +00:00