mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-08-28 22:10:31 -04:00
Rename Field.setChangeHandler to Field.setValidator
This commit is contained in:
parent
d083958a1e
commit
63c112932b
10 changed files with 74 additions and 71 deletions
|
@ -84,7 +84,7 @@ Blockly.Blocks['controls_repeat'] = {
|
|||
});
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
|
||||
this.getField('TIMES').setChangeHandler(
|
||||
this.getField('TIMES').setValidator(
|
||||
Blockly.FieldTextInput.nonnegativeIntegerValidator);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1123,7 +1123,6 @@ Blockly.BlockSvg.prototype.dispose = function(healStack, animate) {
|
|||
}
|
||||
Blockly.Events.enable();
|
||||
|
||||
|
||||
goog.dom.removeNode(this.svgGroup_);
|
||||
// Sever JavaScript to DOM connections.
|
||||
this.svgGroup_ = null;
|
||||
|
|
|
@ -38,11 +38,16 @@ goog.require('goog.userAgent');
|
|||
/**
|
||||
* Abstract class for an editable field.
|
||||
* @param {string} text The initial content of the field.
|
||||
* @param {Function=} opt_validator An optional function that is called
|
||||
* to validate any constraints on what the user entered. Takes the new
|
||||
* text as an argument and returns either the accepted text, a replacement
|
||||
* text, or null to abort the change.
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.Field = function(text) {
|
||||
Blockly.Field = function(text, opt_validator) {
|
||||
this.size_ = new goog.math.Size(0, 25);
|
||||
this.setValue(text);
|
||||
this.setValidator(opt_validator);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -69,32 +74,37 @@ Blockly.Field.prototype.name = undefined;
|
|||
|
||||
/**
|
||||
* Maximum characters of text to display before adding an ellipsis.
|
||||
* @type {number}
|
||||
*/
|
||||
Blockly.Field.prototype.maxDisplayLength = 50;
|
||||
|
||||
/**
|
||||
* Visible text to display.
|
||||
* @type {string}
|
||||
* @private
|
||||
*/
|
||||
Blockly.Field.prototype.text_ = '';
|
||||
|
||||
/**
|
||||
* Block this field is attached to. Starts as null, then in set in init.
|
||||
* @type {Blockly.Block}
|
||||
* @private
|
||||
*/
|
||||
Blockly.Field.prototype.sourceBlock_ = null;
|
||||
|
||||
/**
|
||||
* Is the field visible, or hidden due to the block being collapsed?
|
||||
* @type {boolean}
|
||||
* @private
|
||||
*/
|
||||
Blockly.Field.prototype.visible_ = true;
|
||||
|
||||
/**
|
||||
* Change handler called when user edits an editable field.
|
||||
* Validation function called when user edits an editable field.
|
||||
* @type {Function}
|
||||
* @private
|
||||
*/
|
||||
Blockly.Field.prototype.changeHandler_ = null;
|
||||
Blockly.Field.prototype.validator_ = null;
|
||||
|
||||
/**
|
||||
* Non-breaking space.
|
||||
|
@ -158,7 +168,7 @@ Blockly.Field.prototype.dispose = function() {
|
|||
this.fieldGroup_ = null;
|
||||
this.textElement_ = null;
|
||||
this.borderRect_ = null;
|
||||
this.changeHandler_ = null;
|
||||
this.validator_ = null;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -208,11 +218,11 @@ Blockly.Field.prototype.setVisible = function(visible) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Sets a new change handler for editable fields.
|
||||
* @param {Function} handler New change handler, or null.
|
||||
* Sets a new validation function for editable fields.
|
||||
* @param {Function} handler New validation function, or null.
|
||||
*/
|
||||
Blockly.Field.prototype.setChangeHandler = function(handler) {
|
||||
this.changeHandler_ = handler;
|
||||
Blockly.Field.prototype.setValidator = function(handler) {
|
||||
this.validator_ = handler;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -34,20 +34,19 @@ goog.require('goog.userAgent');
|
|||
/**
|
||||
* Class for an editable angle field.
|
||||
* @param {string} text The initial content of the field.
|
||||
* @param {Function=} opt_changeHandler An optional function that is called
|
||||
* @param {Function=} opt_validator An optional function that is called
|
||||
* to validate any constraints on what the user entered. Takes the new
|
||||
* text as an argument and returns the accepted text or null to abort
|
||||
* the change.
|
||||
* @extends {Blockly.FieldTextInput}
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.FieldAngle = function(text, opt_changeHandler) {
|
||||
Blockly.FieldAngle = function(text, opt_validator) {
|
||||
// Add degree symbol: "360°" (LTR) or "°360" (RTL)
|
||||
this.symbol_ = Blockly.createSvgElement('tspan', {}, null);
|
||||
this.symbol_.appendChild(document.createTextNode('\u00B0'));
|
||||
|
||||
Blockly.FieldAngle.superClass_.constructor.call(this, text, null);
|
||||
this.setChangeHandler(opt_changeHandler);
|
||||
Blockly.FieldAngle.superClass_.constructor.call(this, text, opt_validator);
|
||||
};
|
||||
goog.inherits(Blockly.FieldAngle, Blockly.FieldTextInput);
|
||||
|
||||
|
@ -55,7 +54,7 @@ goog.inherits(Blockly.FieldAngle, Blockly.FieldTextInput);
|
|||
* Sets a new change handler for angle field.
|
||||
* @param {Function} handler New change handler, or null.
|
||||
*/
|
||||
Blockly.FieldAngle.prototype.setChangeHandler = function(handler) {
|
||||
Blockly.FieldAngle.prototype.setValidator = function(handler) {
|
||||
var wrappedHandler;
|
||||
if (handler) {
|
||||
// Wrap the user's change handler together with the angle validator.
|
||||
|
@ -77,7 +76,7 @@ Blockly.FieldAngle.prototype.setChangeHandler = function(handler) {
|
|||
} else {
|
||||
wrappedHandler = Blockly.FieldAngle.angleValidator;
|
||||
}
|
||||
Blockly.FieldAngle.superClass_.setChangeHandler.call(this, wrappedHandler);
|
||||
Blockly.FieldAngle.superClass_.setValidator.call(this, wrappedHandler);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -276,16 +275,16 @@ Blockly.FieldAngle.prototype.updateGraph_ = function() {
|
|||
var x2 = Blockly.FieldAngle.HALF;
|
||||
var y2 = Blockly.FieldAngle.HALF;
|
||||
if (!isNaN(angleRadians)) {
|
||||
var angle0 = goog.math.toRadians(Blockly.FieldAngle.OFFSET);
|
||||
var x1 = Math.cos(angle0) * Blockly.FieldAngle.RADIUS;
|
||||
var y1 = Math.sin(angle0) * -Blockly.FieldAngle.RADIUS;
|
||||
var angle1 = goog.math.toRadians(Blockly.FieldAngle.OFFSET);
|
||||
var x1 = Math.cos(angle1) * Blockly.FieldAngle.RADIUS;
|
||||
var y1 = Math.sin(angle1) * -Blockly.FieldAngle.RADIUS;
|
||||
if (Blockly.FieldAngle.CLOCKWISE) {
|
||||
angleRadians = 2 * angle0 - angleRadians;
|
||||
angleRadians = 2 * angle1 - angleRadians;
|
||||
}
|
||||
x2 += Math.cos(angleRadians) * Blockly.FieldAngle.RADIUS;
|
||||
y2 -= Math.sin(angleRadians) * Blockly.FieldAngle.RADIUS;
|
||||
// Don't ask how the flag calculations work. They just do.
|
||||
var largeFlag = Math.abs(Math.floor((angleRadians - angle0) / Math.PI) % 2);
|
||||
var largeFlag = Math.abs(Math.floor((angleRadians - angle1) / Math.PI) % 2);
|
||||
if (Blockly.FieldAngle.CLOCKWISE) {
|
||||
largeFlag = 1 - largeFlag;
|
||||
}
|
||||
|
|
|
@ -32,17 +32,15 @@ goog.require('Blockly.Field');
|
|||
/**
|
||||
* Class for a checkbox field.
|
||||
* @param {string} state The initial state of the field ('TRUE' or 'FALSE').
|
||||
* @param {Function=} opt_changeHandler A function that is executed when a new
|
||||
* @param {Function=} opt_validator A function that is executed when a new
|
||||
* option is selected. Its sole argument is the new checkbox state. If
|
||||
* it returns a value, this becomes the new checkbox state, unless the
|
||||
* value is null, in which case the change is aborted.
|
||||
* @extends {Blockly.Field}
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.FieldCheckbox = function(state, opt_changeHandler) {
|
||||
Blockly.FieldCheckbox.superClass_.constructor.call(this, '');
|
||||
|
||||
this.setChangeHandler(opt_changeHandler);
|
||||
Blockly.FieldCheckbox = function(state, opt_validator) {
|
||||
Blockly.FieldCheckbox.superClass_.constructor.call(this, '', opt_validator);
|
||||
// Set the initial state.
|
||||
this.setValue(state);
|
||||
};
|
||||
|
@ -100,9 +98,9 @@ Blockly.FieldCheckbox.prototype.setValue = function(strBool) {
|
|||
*/
|
||||
Blockly.FieldCheckbox.prototype.showEditor_ = function() {
|
||||
var newState = !this.state_;
|
||||
if (this.sourceBlock_ && this.changeHandler_) {
|
||||
// Call any change handler, and allow it to override.
|
||||
var override = this.changeHandler_(newState);
|
||||
if (this.sourceBlock_ && this.validator_) {
|
||||
// Call any validation function, and allow it to override.
|
||||
var override = this.validator_(newState);
|
||||
if (override !== undefined) {
|
||||
newState = override;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ goog.require('goog.ui.ColorPicker');
|
|||
/**
|
||||
* Class for a colour input field.
|
||||
* @param {string} colour The initial colour in '#rrggbb' format.
|
||||
* @param {Function=} opt_changeHandler A function that is executed when a new
|
||||
* @param {Function=} opt_validator A function that is executed when a new
|
||||
* colour is selected. Its sole argument is the new colour value. Its
|
||||
* return value becomes the selected colour, unless it is undefined, in
|
||||
* which case the new colour stands, or it is null, in which case the change
|
||||
|
@ -44,10 +44,9 @@ goog.require('goog.ui.ColorPicker');
|
|||
* @extends {Blockly.Field}
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.FieldColour = function(colour, opt_changeHandler) {
|
||||
Blockly.FieldColour.superClass_.constructor.call(this, colour);
|
||||
Blockly.FieldColour = function(colour, opt_validator) {
|
||||
Blockly.FieldColour.superClass_.constructor.call(this, colour, opt_validator);
|
||||
this.setText(Blockly.Field.NBSP + Blockly.Field.NBSP + Blockly.Field.NBSP);
|
||||
this.setChangeHandler(opt_changeHandler);
|
||||
};
|
||||
goog.inherits(Blockly.FieldColour, Blockly.Field);
|
||||
|
||||
|
@ -215,9 +214,9 @@ Blockly.FieldColour.prototype.showEditor_ = function() {
|
|||
function(event) {
|
||||
var colour = event.target.getSelectedColor() || '#000000';
|
||||
Blockly.WidgetDiv.hide();
|
||||
if (thisField.sourceBlock_ && thisField.changeHandler_) {
|
||||
// Call any change handler, and allow it to override.
|
||||
var override = thisField.changeHandler_(colour);
|
||||
if (thisField.sourceBlock_ && thisField.validator_) {
|
||||
// Call any validation function, and allow it to override.
|
||||
var override = thisField.validator_(colour);
|
||||
if (override !== undefined) {
|
||||
colour = override;
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ goog.require('goog.ui.DatePicker');
|
|||
/**
|
||||
* Class for a date input field.
|
||||
* @param {string} date The initial date.
|
||||
* @param {Function=} opt_changeHandler A function that is executed when a new
|
||||
* @param {Function=} opt_validator A function that is executed when a new
|
||||
* date is selected. Its sole argument is the new date value. Its
|
||||
* return value becomes the selected date, unless it is undefined, in
|
||||
* which case the new date stands, or it is null, in which case the change
|
||||
|
@ -47,13 +47,12 @@ goog.require('goog.ui.DatePicker');
|
|||
* @extends {Blockly.Field}
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.FieldDate = function(date, opt_changeHandler) {
|
||||
Blockly.FieldDate = function(date, opt_validator) {
|
||||
if (!date) {
|
||||
date = new goog.date.Date().toIsoString(true);
|
||||
}
|
||||
Blockly.FieldDate.superClass_.constructor.call(this, date);
|
||||
Blockly.FieldDate.superClass_.constructor.call(this, date, opt_validator);
|
||||
this.setValue(date);
|
||||
this.setChangeHandler(opt_changeHandler);
|
||||
};
|
||||
goog.inherits(Blockly.FieldDate, Blockly.Field);
|
||||
|
||||
|
@ -83,8 +82,8 @@ Blockly.FieldDate.prototype.getValue = function() {
|
|||
* @param {string} date The new date.
|
||||
*/
|
||||
Blockly.FieldDate.prototype.setValue = function(date) {
|
||||
if (this.sourceBlock_ && this.changeHandler_) {
|
||||
var validated = this.changeHandler_(date);
|
||||
if (this.sourceBlock_ && this.validator_) {
|
||||
var validated = this.validator_(date);
|
||||
// If the new date is invalid, validation returns null.
|
||||
// In this case we still want to display the illegal result.
|
||||
if (validated !== null && validated !== undefined) {
|
||||
|
@ -150,9 +149,9 @@ Blockly.FieldDate.prototype.showEditor_ = function() {
|
|||
function(event) {
|
||||
var date = event.date ? event.date.toIsoString(true) : '';
|
||||
Blockly.WidgetDiv.hide();
|
||||
if (thisField.sourceBlock_ && thisField.changeHandler_) {
|
||||
// Call any change handler, and allow it to override.
|
||||
var override = thisField.changeHandler_(date);
|
||||
if (thisField.sourceBlock_ && thisField.validator_) {
|
||||
// Call any validation function, and allow it to override.
|
||||
var override = thisField.validator_(date);
|
||||
if (override !== undefined) {
|
||||
date = override;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ goog.require('goog.userAgent');
|
|||
* Class for an editable dropdown field.
|
||||
* @param {(!Array.<!Array.<string>>|!Function)} menuGenerator An array of options
|
||||
* for a dropdown list, or a function which generates these options.
|
||||
* @param {Function=} opt_changeHandler A function that is executed when a new
|
||||
* @param {Function=} opt_validator A function that is executed when a new
|
||||
* option is selected, with the newly selected value as its sole argument.
|
||||
* If it returns a value, that value (which must be one of the options) will
|
||||
* become selected in place of the newly selected option, unless the return
|
||||
|
@ -49,14 +49,14 @@ goog.require('goog.userAgent');
|
|||
* @extends {Blockly.Field}
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.FieldDropdown = function(menuGenerator, opt_changeHandler) {
|
||||
Blockly.FieldDropdown = function(menuGenerator, opt_validator) {
|
||||
this.menuGenerator_ = menuGenerator;
|
||||
this.setChangeHandler(opt_changeHandler);
|
||||
this.trimOptions_();
|
||||
var firstTuple = this.getOptions_()[0];
|
||||
|
||||
// Call parent's constructor.
|
||||
Blockly.FieldDropdown.superClass_.constructor.call(this, firstTuple[1]);
|
||||
Blockly.FieldDropdown.superClass_.constructor.call(this, firstTuple[1],
|
||||
opt_validator);
|
||||
};
|
||||
goog.inherits(Blockly.FieldDropdown, Blockly.Field);
|
||||
|
||||
|
@ -110,9 +110,9 @@ Blockly.FieldDropdown.prototype.showEditor_ = function() {
|
|||
var menuItem = e.target;
|
||||
if (menuItem) {
|
||||
var value = menuItem.getValue();
|
||||
if (thisField.sourceBlock_ && thisField.changeHandler_) {
|
||||
// Call any change handler, and allow it to override.
|
||||
var override = thisField.changeHandler_(value);
|
||||
if (thisField.sourceBlock_ && thisField.validator_) {
|
||||
// Call any validation function, and allow it to override.
|
||||
var override = thisField.validator_(value);
|
||||
if (override !== undefined) {
|
||||
value = override;
|
||||
}
|
||||
|
|
|
@ -36,16 +36,16 @@ goog.require('goog.userAgent');
|
|||
/**
|
||||
* Class for an editable text field.
|
||||
* @param {string} text The initial content of the field.
|
||||
* @param {Function=} opt_changeHandler An optional function that is called
|
||||
* @param {Function=} opt_validator An optional function that is called
|
||||
* to validate any constraints on what the user entered. Takes the new
|
||||
* text as an argument and returns either the accepted text, a replacement
|
||||
* text, or null to abort the change.
|
||||
* @extends {Blockly.Field}
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.FieldTextInput = function(text, opt_changeHandler) {
|
||||
Blockly.FieldTextInput.superClass_.constructor.call(this, text);
|
||||
this.setChangeHandler(opt_changeHandler);
|
||||
Blockly.FieldTextInput = function(text, opt_validator) {
|
||||
Blockly.FieldTextInput.superClass_.constructor.call(this, text,
|
||||
opt_validator);
|
||||
};
|
||||
goog.inherits(Blockly.FieldTextInput, Blockly.Field);
|
||||
|
||||
|
@ -82,8 +82,8 @@ Blockly.FieldTextInput.prototype.setValue = function(text) {
|
|||
if (text === null) {
|
||||
return; // No change if null.
|
||||
}
|
||||
if (this.sourceBlock_ && this.changeHandler_) {
|
||||
var validated = this.changeHandler_(text);
|
||||
if (this.sourceBlock_ && this.validator_) {
|
||||
var validated = this.validator_(text);
|
||||
// If the new text is invalid, validation returns null.
|
||||
// In this case we still want to display the illegal result.
|
||||
if (validated !== null && validated !== undefined) {
|
||||
|
@ -114,8 +114,8 @@ Blockly.FieldTextInput.prototype.showEditor_ = function(opt_quietInput) {
|
|||
goog.userAgent.IPAD)) {
|
||||
// Mobile browsers have issues with in-line textareas (focus & keyboards).
|
||||
var newValue = window.prompt(Blockly.Msg.CHANGE_VALUE_TITLE, this.text_);
|
||||
if (this.sourceBlock_ && this.changeHandler_) {
|
||||
var override = this.changeHandler_(newValue);
|
||||
if (this.sourceBlock_ && this.validator_) {
|
||||
var override = this.validator_(newValue);
|
||||
if (override !== undefined) {
|
||||
newValue = override;
|
||||
}
|
||||
|
@ -210,8 +210,8 @@ Blockly.FieldTextInput.prototype.validate_ = function() {
|
|||
var valid = true;
|
||||
goog.asserts.assertObject(Blockly.FieldTextInput.htmlInput_);
|
||||
var htmlInput = Blockly.FieldTextInput.htmlInput_;
|
||||
if (this.sourceBlock_ && this.changeHandler_) {
|
||||
valid = this.changeHandler_(htmlInput.value);
|
||||
if (this.sourceBlock_ && this.validator_) {
|
||||
valid = this.validator_(htmlInput.value);
|
||||
}
|
||||
if (valid === null) {
|
||||
Blockly.addClass_(htmlInput, 'blocklyInvalidInput');
|
||||
|
@ -264,13 +264,13 @@ Blockly.FieldTextInput.prototype.widgetDispose_ = function() {
|
|||
var htmlInput = Blockly.FieldTextInput.htmlInput_;
|
||||
// Save the edit (if it validates).
|
||||
var text = htmlInput.value;
|
||||
if (thisField.sourceBlock_ && thisField.changeHandler_) {
|
||||
var text1 = thisField.changeHandler_(text);
|
||||
if (thisField.sourceBlock_ && thisField.validator_) {
|
||||
var text1 = thisField.validator_(text);
|
||||
if (text1 === null) {
|
||||
// Invalid edit.
|
||||
text = htmlInput.defaultValue;
|
||||
} else if (text1 !== undefined) {
|
||||
// Change handler has changed the text.
|
||||
// Validation function has changed the text.
|
||||
text = text1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,15 +36,14 @@ goog.require('goog.string');
|
|||
* Class for a variable's dropdown field.
|
||||
* @param {?string} varname The default name for the variable. If null,
|
||||
* a unique variable name will be generated.
|
||||
* @param {Function=} opt_changeHandler A function that is executed when a new
|
||||
* @param {Function=} opt_validator A function that is executed when a new
|
||||
* option is selected. Its sole argument is the new option value.
|
||||
* @extends {Blockly.FieldDropdown}
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.FieldVariable = function(varname, opt_changeHandler) {
|
||||
Blockly.FieldVariable = function(varname, opt_validator) {
|
||||
Blockly.FieldVariable.superClass_.constructor.call(this,
|
||||
Blockly.FieldVariable.dropdownCreate, null);
|
||||
this.setChangeHandler(opt_changeHandler);
|
||||
Blockly.FieldVariable.dropdownCreate, opt_validator);
|
||||
this.setValue(varname || '');
|
||||
};
|
||||
goog.inherits(Blockly.FieldVariable, Blockly.FieldDropdown);
|
||||
|
@ -53,7 +52,7 @@ goog.inherits(Blockly.FieldVariable, Blockly.FieldDropdown);
|
|||
* Sets a new change handler for angle field.
|
||||
* @param {Function} handler New change handler, or null.
|
||||
*/
|
||||
Blockly.FieldVariable.prototype.setChangeHandler = function(handler) {
|
||||
Blockly.FieldVariable.prototype.setValidator = function(handler) {
|
||||
var wrappedHandler;
|
||||
if (handler) {
|
||||
// Wrap the user's change handler together with the variable rename handler.
|
||||
|
@ -75,7 +74,7 @@ Blockly.FieldVariable.prototype.setChangeHandler = function(handler) {
|
|||
} else {
|
||||
wrappedHandler = Blockly.FieldVariable.dropdownChange;
|
||||
}
|
||||
Blockly.FieldVariable.superClass_.setChangeHandler.call(this, wrappedHandler);
|
||||
Blockly.FieldVariable.superClass_.setValidator.call(this, wrappedHandler);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue