mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-08-28 22:10:31 -04:00
Add a serializable attribute to field, distinct from EDITABLE
This commit is contained in:
parent
514fc04738
commit
cb058a69af
5 changed files with 51 additions and 19 deletions
|
@ -31,7 +31,7 @@ goog.require('Blockly.Colours');
|
|||
goog.require('Blockly.Comment');
|
||||
goog.require('Blockly.Connection');
|
||||
goog.require('Blockly.Extensions');
|
||||
goog.require('Blockly.FieldLabelEditable');
|
||||
goog.require('Blockly.FieldLabelSerializable');
|
||||
goog.require('Blockly.FieldVariableGetter');
|
||||
goog.require('Blockly.Input');
|
||||
goog.require('Blockly.Mutator');
|
||||
|
@ -1337,7 +1337,7 @@ Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) {
|
|||
field = Blockly.Block.newFieldLabelFromJson_(element);
|
||||
break;
|
||||
case 'field_label_editable':
|
||||
field = Blockly.Block.newFieldLabelEditableFromJson_(element);
|
||||
field = Blockly.Block.newFieldLabelSerializableFromJson_(element);
|
||||
break;
|
||||
case 'field_input':
|
||||
field = Blockly.Block.newFieldTextInputFromJson_(element);
|
||||
|
@ -1449,15 +1449,15 @@ Blockly.Block.newFieldLabelFromJson_ = function(options) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Helper function to construct a FieldLabelEditable from a JSON arg object,
|
||||
* Helper function to construct a FieldLabelSerializable from a JSON arg object,
|
||||
* dereferencing any string table references.
|
||||
* @param {!Object} options A JSON object with options (text, and class).
|
||||
* @returns {!Blockly.FieldLabelEditable} The new label.
|
||||
* @returns {!Blockly.FieldLabelSerializable} The new label.
|
||||
* @private
|
||||
*/
|
||||
Blockly.Block.newFieldLabelEditableFromJson_ = function(options) {
|
||||
Blockly.Block.newFieldLabelSerializableFromJson_ = function(options) {
|
||||
var text = Blockly.utils.replaceMessageReferences(options['text']);
|
||||
return new Blockly.FieldLabelEditable(text, options['class']);
|
||||
return new Blockly.FieldLabelSerializable(text, options['class']);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -132,10 +132,20 @@ Blockly.Field.prototype.validator_ = null;
|
|||
Blockly.Field.NBSP = '\u00A0';
|
||||
|
||||
/**
|
||||
* Editable fields are saved by the XML renderer, non-editable fields are not.
|
||||
* Editable fields usually show some sort of UI for the user to change them.
|
||||
* @type {boolean}
|
||||
* @public
|
||||
*/
|
||||
Blockly.Field.prototype.EDITABLE = true;
|
||||
|
||||
/**
|
||||
* Serializable fields are saved by the XML renderer, non-serializable fields
|
||||
* are not. Editable fields should be serialized.
|
||||
* @type {boolean}
|
||||
* @public
|
||||
*/
|
||||
Blockly.Field.prototype.SERIALIZABLE = Blockly.Field.prototype.EDITABLE;
|
||||
|
||||
/**
|
||||
* Attach this field to a block.
|
||||
* @param {!Blockly.Block} block The block containing this field.
|
||||
|
|
|
@ -20,12 +20,12 @@
|
|||
|
||||
/**
|
||||
* @fileoverview Serialized label field. Behaves like a normal label but is
|
||||
* always serialized to XML.
|
||||
* always serialized to XML. It may only be edited programmatically.
|
||||
* @author fenichel@google.com (Rachel Fenichel)
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
goog.provide('Blockly.FieldLabelEditable');
|
||||
goog.provide('Blockly.FieldLabelSerializable');
|
||||
|
||||
goog.require('Blockly.FieldLabel');
|
||||
|
||||
|
@ -38,25 +38,36 @@ goog.require('Blockly.FieldLabel');
|
|||
* @constructor
|
||||
*
|
||||
*/
|
||||
Blockly.FieldLabelEditable = function(text, opt_class) {
|
||||
Blockly.FieldLabelEditable.superClass_.constructor.call(this, text,
|
||||
Blockly.FieldLabelSerializable = function(text, opt_class) {
|
||||
Blockly.FieldLabelSerializable.superClass_.constructor.call(this, text,
|
||||
opt_class);
|
||||
// Used in base field rendering, but we don't need it.
|
||||
this.arrowWidth_ = 0;
|
||||
};
|
||||
goog.inherits(Blockly.FieldLabelEditable, Blockly.FieldLabel);
|
||||
goog.inherits(Blockly.FieldLabelSerializable, Blockly.FieldLabel);
|
||||
|
||||
/**
|
||||
* Editable fields are saved by the XML renderer, non-editable fields are not.
|
||||
* Editable fields usually show some sort of UI for the user to change them.
|
||||
* This field should be serialized, but only edited programmatically.
|
||||
* @type {boolean}
|
||||
* @public
|
||||
*/
|
||||
Blockly.FieldLabelEditable.prototype.EDITABLE = true;
|
||||
Blockly.FieldLabelSerializable.prototype.EDITABLE = false;
|
||||
|
||||
/**
|
||||
* Serializable fields are saved by the XML renderer, non-serializable fields
|
||||
* are not. This field should be serialized, but only edited programmatically.
|
||||
* @type {boolean}
|
||||
* @public
|
||||
*/
|
||||
Blockly.FieldLabelSerializable.prototype.SERIALIZABLE = true;
|
||||
|
||||
/**
|
||||
* Updates the width of the field. This calls getCachedWidth which won't cache
|
||||
* the approximated width on IE/Edge when `getComputedTextLength` fails. Once
|
||||
* it eventually does succeed, the result will be cached.
|
||||
**/
|
||||
Blockly.FieldLabelEditable.prototype.updateWidth = function() {
|
||||
Blockly.FieldLabelSerializable.prototype.updateWidth = function() {
|
||||
// Set width of the field.
|
||||
// Unlike the base Field class, this doesn't add space to editable fields.
|
||||
this.size_.width = Blockly.Field.getCachedWidth(this.textElement_);
|
||||
|
@ -67,7 +78,7 @@ Blockly.FieldLabelEditable.prototype.updateWidth = function() {
|
|||
* Saves the computed width in a property.
|
||||
* @private
|
||||
*/
|
||||
Blockly.FieldLabelEditable.prototype.render_ = function() {
|
||||
Blockly.FieldLabelSerializable.prototype.render_ = function() {
|
||||
if (this.visible_ && this.textElement_) {
|
||||
// Replace the text.
|
||||
goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_));
|
||||
|
|
|
@ -45,9 +45,20 @@ Blockly.FieldVariableGetter = function(text, name) {
|
|||
goog.inherits(Blockly.FieldVariableGetter, Blockly.Field);
|
||||
|
||||
/**
|
||||
* Editable fields are saved by the XML renderer, non-editable fields are not.
|
||||
* Editable fields usually show some sort of UI for the user to change them.
|
||||
* This field should be serialized, but only edited programmatically.
|
||||
* @type {boolean}
|
||||
* @public
|
||||
*/
|
||||
Blockly.FieldVariableGetter.prototype.EDITABLE = true;
|
||||
Blockly.FieldVariableGetter.prototype.EDITABLE = false;
|
||||
|
||||
/**
|
||||
* Serializable fields are saved by the XML renderer, non-serializable fields
|
||||
* are not. This field should be serialized, but only edited programmatically.
|
||||
* @type {boolean}
|
||||
* @public
|
||||
*/
|
||||
Blockly.FieldVariableGetter.prototype.SERIALIZABLE = true;
|
||||
|
||||
/**
|
||||
* Install this field on a block.
|
||||
|
|
|
@ -107,7 +107,7 @@ Blockly.Xml.blockToDom = function(block, opt_noId) {
|
|||
}
|
||||
}
|
||||
function fieldToDom(field) {
|
||||
if (field.name && field.EDITABLE) {
|
||||
if (field.name && field.SERIALIZABLE) {
|
||||
var container = goog.dom.createDom('field', null, field.getValue());
|
||||
container.setAttribute('name', field.name);
|
||||
if (field instanceof Blockly.FieldVariable || field instanceof
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue