-
Notifications
You must be signed in to change notification settings - Fork 7.5k
Validate editor preferences #7186
Changes from 11 commits
1274227
1b1a604
7f721fc
8d5482e
bc7b0bf
d0ef02f
3719aa2
cfb0cce
3428312
f476ac5
8268997
fd72a4f
0b441d9
5d22e35
0824ff6
a32a39b
b6fb768
3a158fa
35b18b8
2418344
bc71a60
a845bab
d2d4c72
9883d3c
835bc45
2062a78
3d82669
aca8a81
76a5b91
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -64,27 +64,28 @@ define(function (require, exports, module) { | |
| $fileInfo.text(_formatCountable(lines, Strings.STATUSBAR_LINE_COUNT_SINGULAR, Strings.STATUSBAR_LINE_COUNT_PLURAL)); | ||
| } | ||
|
|
||
| function _updateIndentType() { | ||
| var indentWithTabs = Editor.getUseTabChar(); | ||
| function _updateIndentType(editor) { | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I know that this code didn't had any JSDocs before, but should we add them now?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks. Functions without docs look ugly, hehe. |
||
| var indentWithTabs = editor.getUseTabChar(); | ||
| $indentType.text(indentWithTabs ? Strings.STATUSBAR_TAB_SIZE : Strings.STATUSBAR_SPACES); | ||
| $indentType.attr("title", indentWithTabs ? Strings.STATUSBAR_INDENT_TOOLTIP_SPACES : Strings.STATUSBAR_INDENT_TOOLTIP_TABS); | ||
| $indentWidthLabel.attr("title", indentWithTabs ? Strings.STATUSBAR_INDENT_SIZE_TOOLTIP_TABS : Strings.STATUSBAR_INDENT_SIZE_TOOLTIP_SPACES); | ||
| } | ||
|
|
||
| function _getIndentSize() { | ||
| return Editor.getUseTabChar() ? Editor.getTabSize() : Editor.getSpaceUnits(); | ||
| function _getIndentSize(editor) { | ||
| return editor.getUseTabChar() ? editor.getTabSize() : editor.getSpaceUnits(); | ||
| } | ||
|
|
||
| function _updateIndentSize() { | ||
| var size = _getIndentSize(); | ||
| function _updateIndentSize(editor) { | ||
| var size = _getIndentSize(editor); | ||
| $indentWidthLabel.text(size); | ||
| $indentWidthInput.val(size); | ||
| } | ||
|
|
||
| function _toggleIndentType() { | ||
| Editor.setUseTabChar(!Editor.getUseTabChar()); | ||
| _updateIndentType(); | ||
| _updateIndentSize(); | ||
| var current = EditorManager.getActiveEditor(); | ||
| current.setUseTabChar(!current.getUseTabChar()); | ||
| _updateIndentType(current); | ||
| _updateIndentSize(current); | ||
| } | ||
|
|
||
| function _updateCursorInfo(event, editor) { | ||
|
|
@@ -116,7 +117,7 @@ define(function (require, exports, module) { | |
| $cursorInfo.text(cursorStr + selStr); | ||
| } | ||
|
|
||
| function _changeIndentWidth(value) { | ||
| function _changeIndentWidth(editor, value) { | ||
| $indentWidthLabel.removeClass("hidden"); | ||
| $indentWidthInput.addClass("hidden"); | ||
|
|
||
|
|
@@ -130,15 +131,16 @@ define(function (require, exports, module) { | |
| return; | ||
| } | ||
|
|
||
| value = Math.max(Math.min(Math.floor(value), 10), 1); | ||
| if (Editor.getUseTabChar()) { | ||
| Editor.setTabSize(value); | ||
| if (editor.getUseTabChar()) { | ||
| value = Math.max(Math.min(Math.floor(value), Editor.MAX_TAB_SIZE), Editor.MIN_TAB_SIZE); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is fine, but seeing it here and below makes me think that this also belongs in the "model" (the preferences system). The most succinct form would be: definePreference("tabSize", "integer", DEFAULT_TAB_SIZE, {
min: MIN_TAB_SIZE,
max: MAX_TAB_SIZE
});But, even without going to that extreme, we could still do this: PreferencesManager.definePreference(TAB_SIZE, "number", DEFAULT_TAB_SIZE, {
validate: function (value) {
return ValidationUtils.isIntegerInRange(value, MIN_TAB_SIZE, MAX_TAB_SIZE);
},
coerce: function (value) {
return Math.max(Math.min(Math.floor(value), MAX_TAB_SIZE), MIN_TAB_SIZE);
}
});and have coerce run on
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure that will get us much. In this particular case, that still requires that you validate that
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What about if we also run The behavior in the status bar would change. Currently, for values out-of-range it changes them to upper or lower boundary (which is kinda weird anyway). Instead, value would not change at all, which is what happens now if value is wrong type (e.g. enter "x" for "spaceUnits").
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Running the validator on set seems like a good idea. I like that more than coerce.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I implemented |
||
| editor.setTabSize(value); | ||
| } else { | ||
| Editor.setSpaceUnits(value); | ||
| value = Math.max(Math.min(Math.floor(value), Editor.MAX_SPACE_UNITS), Editor.MIN_SPACE_UNITS); | ||
| editor.setSpaceUnits(value); | ||
| } | ||
|
|
||
| // update indicator | ||
| _updateIndentSize(); | ||
| _updateIndentSize(editor); | ||
|
|
||
| // column position may change when tab size changes | ||
| _updateCursorInfo(); | ||
|
|
@@ -184,8 +186,8 @@ define(function (require, exports, module) { | |
|
|
||
| $(current).on("cursorActivity.statusbar", _updateCursorInfo); | ||
| $(current).on("optionChange.statusbar", function () { | ||
| _updateIndentType(); | ||
| _updateIndentSize(); | ||
| _updateIndentType(current); | ||
| _updateIndentSize(current); | ||
| }); | ||
| $(current).on("change.statusbar", function () { | ||
| // async update to keep typing speed smooth | ||
|
|
@@ -200,8 +202,8 @@ define(function (require, exports, module) { | |
| _updateLanguageInfo(current); | ||
| _updateFileInfo(current); | ||
| _initOverwriteMode(current); | ||
| _updateIndentType(); | ||
| _updateIndentSize(); | ||
| _updateIndentType(current); | ||
| _updateIndentSize(current); | ||
| } | ||
| } | ||
|
|
||
|
|
@@ -219,21 +221,22 @@ define(function (require, exports, module) { | |
| $indentWidthLabel | ||
| .on("click", function () { | ||
| // update the input value before displaying | ||
| $indentWidthInput.val(_getIndentSize()); | ||
| var current = EditorManager.getActiveEditor(); | ||
| $indentWidthInput.val(_getIndentSize(current)); | ||
|
|
||
| $indentWidthLabel.addClass("hidden"); | ||
| $indentWidthInput.removeClass("hidden"); | ||
| $indentWidthInput.focus(); | ||
|
|
||
| $indentWidthInput | ||
| .on("blur", function () { | ||
| _changeIndentWidth($indentWidthInput.val()); | ||
| _changeIndentWidth(current, $indentWidthInput.val()); | ||
| }) | ||
| .on("keyup", function (event) { | ||
| if (event.keyCode === KeyEvent.DOM_VK_RETURN) { | ||
| $indentWidthInput.blur(); | ||
| } else if (event.keyCode === KeyEvent.DOM_VK_ESCAPE) { | ||
| _changeIndentWidth(false); | ||
| _changeIndentWidth(current, false); | ||
| } | ||
| }); | ||
| }); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -88,7 +88,7 @@ define(function (require, exports, module) { | |
|
|
||
| if (!options.indent) { | ||
| // default to using the same indentation value that the editor is using | ||
| options.indent = PreferencesManager.get("spaceUnits"); | ||
| options.indent = PreferencesManager.get("spaceUnits", fullPath); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any reason why we don't use
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We don't have an Editor instance.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see. I guess is fine then.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice change! At first, I figured this wasn't required, but since we have the path in hand, we're better off using it. That makes this function potentially usable for mass linting independent of the current editor. |
||
| } | ||
|
|
||
| // If the user has not defined the environment, we use browser by default. | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1102,7 +1102,8 @@ define(function (require, exports, module) { | |
| type: type, | ||
| initial: initial, | ||
| name: options.name, | ||
| description: options.description | ||
| description: options.description, | ||
| validator: options.validator | ||
| }); | ||
| this.set(id, initial, { | ||
| location: { | ||
|
|
@@ -1431,7 +1432,11 @@ define(function (require, exports, module) { | |
| if (scope) { | ||
| var result = scope.get(id, context); | ||
| if (result !== undefined) { | ||
| return _.cloneDeep(result); | ||
| var pref = this.getPreference(id); | ||
| var validator = pref && pref.validator; | ||
| if (!validator || validator(result)) { | ||
| return _.cloneDeep(result); | ||
| } | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There should be an else that returns the default value, or the initial one.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think we want an else case here. The default value should be set via
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure. Didn't saw the for loop. It should be done after the loop.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The default values are stored in the lowest priority scope, so if none of the other scopes return anything, then the default value will be returned. So, we don't need to handle default value.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice! I think I saw this comment elsewhere, but a test in PreferencesBase-test for this would be a good addition. |
||
| } | ||
| } | ||
| } | ||
|
|
||
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.
Why are these moving from Editor to Editor.prototype? We'd have to look at the backwards compatibility implications of this.
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.
I did this so we have
this.document.file.fullPath.Yes, I had to rework the code in
EditorStatusBar. One implication (of the new preferences changes in general, and not this change in particular) is that the status bar now updates for the focused editor. So, if you happen to have different prefs for .html and .css files, then when you switch focus between main and inline css editor, the prefs in status bar with change for the current file being edited. Or should status bar always show prefs for main editor?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.
That seems like a positive change to me.
Still, this is a change to public API, which means we should probably deprecate the old API and not just remove it. You could use the Brackets Extension Grabber to see if there are any extensions that call
Editor.set*orEditor.get*, or you could just add deprecation warnings.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.
@redmunds The status bar already behaves this way (e.g. the language indicator updates). Are you saying there was a bug where the indent indicator didn't update on focus change before?
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.
I just tested in master and the status bar already updates the indent indicator too when focus switches between the inline editor and the full-size editor -- so the behavior isn't changing here.
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.
@peterflynn Agreed. Thanks for doing the search!
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.
Yes, the PreferencesManager uses the current file when a file is not passed as a param, but I can see that being a problem with split view or multiple window support.
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.
Yes, I will restore the original API. Any tips or sample code I can look at for displaying "deprecated" messages to console?
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.
Original API restored and deprecated.
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.
@redmunds Good points. Pretty sure the old static APIs would still work fine with split views as well, for the same reason inlines do today (activeEditor changes with focus, and there's only one statusbar shared between the views)... but it's definitely much cleaner to be explicitly calling out an Editor instance and thus explicitly requesting a file-specific pref.