-
Notifications
You must be signed in to change notification settings - Fork 8.3k
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
--- | ||
authors: Carlos Zamora (@carlos-zamora) and Kayla Cinnamon (@cinnamon-msft) | ||
created on: 2020-11-10 | ||
last updated: 2020-11-10 | ||
issue id: 1564 | ||
--- | ||
|
||
# Cascading Settings | ||
|
||
## Abstract | ||
|
||
Windows Terminal's settings model adhere's to a cascading settings architecture. This allows a settings object to be defined incrementally across multiple layers of declarations. The value for any global setting like `copyOnSelect`, for example, is set to your settings.json value if one is defined, otherwise defaults.json, and otherwise a system set value. Profiles in particular are more complicated in that they must also take into account the values in `profiles.defaults` and dynamic profile generators. | ||
|
||
This spec explores how to represent this feature in the Settings UI. | ||
|
||
## Inspiration | ||
|
||
Cascading settings (and `profiles.defaults` by extension) provides some major benefits: | ||
1. opt-in behavior for settings values provided in-box (i.e. reset to default) | ||
2. easy way to apply a setting to all your Profiles | ||
3. (future feature) simple way to base a Profile off of another Profile | ||
|
||
The following terminal emulators approach this issue as follows. | ||
| Terminal Emulator(s) | Relevant Features/Approach | | ||
|--|--| | ||
| ConEmu, Cmder | "Clone" a separate Profile | | ||
| Fluent Terminal | "Restore Defaults" button on each page | | ||
| iTerm2 | "Bulk Copy from Selected Profile..." and "Duplicate Profile" | | ||
|
||
Other Settings UIs have approached this issue as follows: | ||
| Project | Relevant Approach | | ||
|--|--| | ||
| Visual Studio | Present a dropdown with your options. An extra "\<inherit\>" option is shown to inherit a value from another place. | | ||
|
||
## Solution Design | ||
|
||
The XAML implementation will consist of introducing a `ContentControl` for each setting. The `ContentControl` simply wraps the XAML control used for a setting, then adds the chosen UI approach below. | ||
|
||
The `ContentControl` will take advantage of the following TerminalSettingsModel APIs for each setting: | ||
```c++ | ||
// Note: String and "Name" are replaced for each setting | ||
bool HasName(); | ||
void ClearName(); | ||
String Name(); | ||
void Name(String val); | ||
``` | ||
## UI/UX Design Proposals | ||
### Full Parity with JSON | ||
#### 1: Inobstructive text under a setting control | ||
This comment has been minimized.
Sorry, something went wrong. |
||
#### 2: <inherit> option | ||
#### 3: Lock & Key Button | ||
### Partial Parity with JSON | ||
#### Add New --> Duplicate/Clone/Copy Profile | ||
#### Reset Profile button | ||
#### "Apply to all profiles" button | ||
## Capabilities | ||
[comment]: # Discuss how the proposed fixes/features impact the following key considerations: | ||
### Accessibility | ||
[comment]: # How will the proposed change impact accessibility for users of screen readers, assistive input devices, etc. | ||
### Security | ||
[comment]: # How will the proposed change impact security? | ||
### Reliability | ||
[comment]: # Will the proposed change improve reliability? If not, why make the change? | ||
### Compatibility | ||
[comment]: # Will the proposed change break existing code/behaviors? If so, how, and is the breaking change "worth it"? | ||
### Performance, Power, and Efficiency | ||
## Potential Issues | ||
[comment]: # What are some of the things that might cause problems with the fixes/features proposed? Consider how the user might be negatively impacted. | ||
## Future considerations | ||
[comment]: # What are some of the things that the fixes/features might unlock in the future? Does the implementation of this spec enable scenarios? | ||
## Resources | ||
[comment]: # Be sure to add links to references, resources, footnotes, etc. |
1 comment
on commit f22552d
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
New misspellings found, please review:
- Inobstructive
To accept these changes, run the following commands
perl -e '
my @expect_files=qw('".github/actions/spell-check/expect/5757ec679b03a4240130c3c53766c91bbc5cd6a7.txt
.github/actions/spell-check/expect/655f007265b351e140d20b3976792523ad689241.txt
.github/actions/spell-check/expect/alphabet.txt
.github/actions/spell-check/expect/expect.txt
.github/actions/spell-check/expect/web.txt"');
@ARGV=@expect_files;
my @stale=qw('"AAAAA Bopomofo CParams GENERATEPROJECTPRIFILE hhhh Inlines renamer rgus SGRXY Unfocus xe xlang "');
my $re=join "|", @stale;
my $suffix=".".time();
my $previous="";
sub maybe_unlink { unlink($_[0]) if $_[0]; }
while (<>) {
if ($ARGV ne $old_argv) { maybe_unlink($previous); $previous="$ARGV$suffix"; rename($ARGV, $previous); open(ARGV_OUT, ">$ARGV"); select(ARGV_OUT); $old_argv = $ARGV; }
next if /^($re)(?:$| .*)/; print;
}; maybe_unlink($previous);'
perl -e '
my $new_expect_file=".github/actions/spell-check/expect/f22552d580386e27f844d51df7dd255eea5f5db5.txt";
open FILE, q{<}, $new_expect_file; chomp(my @words = <FILE>); close FILE;
my @add=qw('"inlines Inobstructive Renamer unfocus "');
my %items; @items{@words} = @words x (1); @items{@add} = @add x (1);
@words = sort {lc($a) cmp lc($b)} keys %items;
open FILE, q{>}, $new_expect_file; for my $word (@words) { print FILE "$word\n" if $word =~ /\w/; };
close FILE;'
git add .github/actions/spell-check/expect || echo '... you want to ensure .github/actions/spell-check/expect/f22552d580386e27f844d51df7dd255eea5f5db5.txt is added to your repository...'
✏️ Contributor please read this
By default the command suggestion will generate a file named based on your commit. That's generally ok as long as you add the file to your commit. Someone can reorganize it later.
perl
command excluding the outer '
marks and dropping any '"
/"'
quotation mark pairs into a file and then run perl file.pl
from the root of the repository to run the code. Alternatively, you can manually insert the items...
If the listed items are:
- ... misspelled, then please correct them instead of using the command.
- ... names, please add them to
.github/actions/spell-check/dictionary/names.txt
. - ... APIs, you can add them to a file in
.github/actions/spell-check/dictionary/
. - ... just things you're using, please add them to an appropriate file in
.github/actions/spell-check/expect/
. - ... tokens you only need in one place and shouldn't generally be used, you can add an item in an appropriate file in
.github/actions/spell-check/patterns/
.
See the README.md
in each directory for more information.
🔬 You can test your commits without appending to a PR by creating a new branch with that extra change and pushing it to your fork. The :check-spelling action will run in response to your push -- it doesn't require an open pull request. By using such a branch, you can limit the number of typos your peers see you make. 😉
⚠️ Reviewers
At present, the action that triggered this message will not show its ❌ in this PR unless the branch is within this repository.
Thus, you should make sure that this comment has been addressed before encouraging the merge bot to merge this PR.
unobtrusive?