Add field_number to Block Factory.

This commit is contained in:
Neil Fraser
2016-07-10 22:54:57 -07:00
parent e1ad58f2e9
commit efc2ca3d82
4 changed files with 74 additions and 2 deletions

View File

@@ -44,6 +44,7 @@ goog.require('goog.math');
*/
Blockly.FieldNumber =
function(value, opt_min, opt_max, opt_precision, opt_validator) {
value = String(value);
Blockly.FieldNumber.superClass_.constructor.call(this, value, opt_validator);
this.setConstraints(opt_min, opt_max, opt_precision);
};

View File

@@ -243,6 +243,32 @@ Blockly.Blocks['field_input'] = {
}
};
Blockly.Blocks['field_number'] = {
// Numeric input.
init: function() {
this.setColour(160);
this.appendDummyInput()
.appendField('numeric input')
.appendField(new Blockly.FieldNumber(0), 'VALUE')
.appendField(',')
.appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME');
this.appendDummyInput()
.appendField('min')
.appendField(new Blockly.FieldNumber(-Infinity), 'MIN')
.appendField('max')
.appendField(new Blockly.FieldNumber(Infinity), 'MAX')
.appendField('precision')
.appendField(new Blockly.FieldNumber(0, 0), 'PRECISION');
this.setPreviousStatement(true, 'Field');
this.setNextStatement(true, 'Field');
this.setTooltip('An input field for the user to enter a number.');
this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=319');
},
onchange: function() {
fieldNameCheck(this);
}
};
Blockly.Blocks['field_angle'] = {
// Angle input.
init: function() {

View File

@@ -309,10 +309,31 @@ function getFieldsJs_(block) {
escapeString(block.getFieldValue('TEXT')) + '), ' +
escapeString(block.getFieldValue('FIELDNAME')));
break;
case 'field_number':
// Result: new Blockly.FieldNumber(10, 0, 100, 1), 'NUMBER'
var args = [
Number(block.getFieldValue('VALUE')),
Number(block.getFieldValue('MIN')),
Number(block.getFieldValue('MAX')),
Number(block.getFieldValue('PRECISION'))
];
// Remove any trailing arguments that aren't needed.
if (args[3] == 0) {
args.pop();
if (args[2] == Infinity) {
args.pop();
if (args[1] == -Infinity) {
args.pop();
}
}
}
fields.push('new Blockly.FieldNumber(' + args.join(', ') + '), ' +
escapeString(block.getFieldValue('FIELDNAME')));
break;
case 'field_angle':
// Result: new Blockly.FieldAngle(90), 'ANGLE'
fields.push('new Blockly.FieldAngle(' +
parseFloat(block.getFieldValue('ANGLE')) + '), ' +
Number(block.getFieldValue('ANGLE')) + '), ' +
escapeString(block.getFieldValue('FIELDNAME')));
break;
case 'field_checkbox':
@@ -354,7 +375,7 @@ function getFieldsJs_(block) {
}
break;
case 'field_image':
// Result: new Blockly.FieldImage('http://...', 80, 60)
// Result: new Blockly.FieldImage('http://...', 80, 60, '*')
var src = escapeString(block.getFieldValue('SRC'));
var width = Number(block.getFieldValue('WIDTH'));
var height = Number(block.getFieldValue('HEIGHT'));
@@ -391,6 +412,26 @@ function getFieldsJson_(block) {
text: block.getFieldValue('TEXT')
});
break;
case 'field_number':
var obj = {
type: block.type,
name: block.getFieldValue('FIELDNAME'),
value: parseFloat(block.getFieldValue('VALUE'))
};
var min = parseFloat(block.getFieldValue('MIN'));
if (min > -Infinity) {
obj.min = min;
}
var max = parseFloat(block.getFieldValue('MAX'));
if (max < Infinity) {
obj.max = max;
}
var precision = parseFloat(block.getFieldValue('PRECISION'));
if (precision) {
obj.precision = precision;
}
fields.push(obj);
break;
case 'field_angle':
fields.push({
type: block.type,
@@ -562,6 +603,9 @@ function updateGenerator(block) {
} else if (field instanceof Blockly.FieldDropdown) {
code.push(makeVar('dropdown', name) +
" = block.getFieldValue('" + name + "');");
} else if (field instanceof Blockly.FieldNumber) {
code.push(makeVar('number', name) +
" = block.getFieldValue('" + name + "');");
} else if (field instanceof Blockly.FieldTextInput) {
code.push(makeVar('text', name) +
" = block.getFieldValue('" + name + "');");

View File

@@ -192,6 +192,7 @@
<category name="Field">
<block type="field_static"></block>
<block type="field_input"></block>
<block type="field_number"></block>
<block type="field_angle"></block>
<block type="field_dropdown"></block>
<block type="field_checkbox"></block>