yunkong2.javascript/admin/google-blockly/own/blocks_system.js
2018-07-21 19:30:07 +08:00

789 lines
29 KiB
JavaScript

'use strict';
goog.provide('Blockly.JavaScript.System');
goog.require('Blockly.JavaScript');
Blockly.CustomBlocks = Blockly.CustomBlocks || [];
Blockly.CustomBlocks.push('System');
function getHelp(word) {
return 'https://git.spacen.net/yunkong2/yunkong2.javascript/blob/master/README.md#' + Blockly.Words[word][systemLang];
}
Blockly.System = {
HUE: 210,
blocks: {}
};
// --- Debug output --------------------------------------------------
Blockly.System.blocks['debug'] =
'<block type="debug">'
+ ' <value name="TEXT">'
+ ' <shadow type="text">'
+ ' <field name="TEXT">test</field>'
+ ' </shadow>'
+ ' </value>'
+ '</block>';
Blockly.Blocks['debug'] = {
init: function() {
this.appendValueInput('TEXT')
.setCheck(null)
.appendField(Blockly.Words['debug'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([['info', 'log'], ['debug', 'debug'], ['warning', 'warn'], ['error', 'error']]), 'Severity');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['debug_tooltip'][systemLang]);
this.setHelpUrl(getHelp('debug_help'));
}
};
Blockly.JavaScript['debug'] = function(block) {
var value_text = Blockly.JavaScript.valueToCode(block, 'TEXT', Blockly.JavaScript.ORDER_ATOMIC);
var dropdown_severity = block.getFieldValue('Severity');
return 'console.' + dropdown_severity + '(' + value_text + ');\n';
};
// --- comment --------------------------------------------------
Blockly.System.blocks['comment'] =
'<block type="comment">'
+ ' <value name="COMMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['comment'] = {
init: function() {
this.appendDummyInput('COMMENT')
.appendField(new Blockly.FieldTextInput(Blockly.Words['comment'][systemLang]), 'COMMENT');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setColour('#FFFF00');
this.setTooltip(Blockly.Words['comment_tooltip'][systemLang]);
}
};
Blockly.JavaScript['comment'] = function(block) {
var comment = block.getFieldValue('COMMENT');
return '// ' + comment + '\n';
};
// --- control -----------------------------------------------------------
Blockly.System.blocks['control'] =
'<block type="control">'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="VALUE">'
+ ' </value>'
+ ' <value name="WITH_DELAY">'
+ ' </value>'
+ ' <mutation delay_input="false"></mutation>'
+ ' <value name="DELAY_MS">'
+ ' </value>'
+ ' <value name="UNIT">'
+ ' </value>'
+ ' <value name="CLEAR_RUNNING">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['control'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['control'][systemLang]);
this.appendDummyInput('OID')
.appendField(new Blockly.FieldOID('Object ID', main.initSelectId(), main.objects), 'OID');
this.appendValueInput('VALUE')
.setCheck(null)
.appendField(Blockly.Words['control_with'][systemLang]);
this.appendDummyInput('WITH_DELAY')
.appendField(Blockly.Words['control_delay'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
var delayInput = (option == true);
this.sourceBlock_.updateShape_(delayInput);
}), 'WITH_DELAY');
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['control_tooltip'][systemLang]);
this.setHelpUrl(getHelp('control_help'));
},
mutationToDom: function() {
var container = document.createElement('mutation');
container.setAttribute('delay_input', this.getFieldValue('WITH_DELAY') === 'TRUE');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('delay_input') == 'true');
},
updateShape_: function(delayInput) {
// Add or remove a delay Input.
var inputExists = this.getInput('DELAY');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('DELAY')
.appendField(' ')
.appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['control_ms'][systemLang], 'ms'],
[Blockly.Words['control_sec'][systemLang], 'sec'],
[Blockly.Words['control_min'][systemLang], 'min']
]), 'UNIT');
//.appendField(Blockly.Words['control_ms'][systemLang]);
}
} else if (inputExists) {
this.removeInput('DELAY');
}
inputExists = this.getInput('CLEAR_RUNNING_INPUT');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('CLEAR_RUNNING_INPUT')
.appendField(Blockly.Words['control_clear_running'][systemLang])
.appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
}
} else if (inputExists) {
this.removeInput('CLEAR_RUNNING_INPUT');
}
}
};
Blockly.JavaScript['control'] = function(block) {
var valueObjectID = block.getFieldValue('OID');
Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
var valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
var unit = block.getFieldValue('UNIT');
if (unit === 'min') {
valueDelay *= 60000;
} else if (unit === 'sec') {
valueDelay *= 1000;
}
var clearRunning = block.getFieldValue('CLEAR_RUNNING') === 'TRUE';
var valueValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
var objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
var code;
if (this.getFieldValue('WITH_DELAY') === 'TRUE') {
code = 'setStateDelayed("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', ' + valueValue + ', ' + valueDelay + ', ' + clearRunning + ');\n';
} else {
code = 'setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', ' + valueValue + ');\n';
}
return code;
};
// --- toggle -----------------------------------------------------------
Blockly.System.blocks['toggle'] =
'<block type="toggle">'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="WITH_DELAY">'
+ ' </value>'
+ ' <mutation delay_input="false"></mutation>'
+ ' <value name="DELAY_MS">'
+ ' </value>'
+ ' <value name="UNIT">'
+ ' </value>'
+ ' <value name="CLEAR_RUNNING">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['toggle'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['toggle'][systemLang]);
this.appendDummyInput('OID')
.appendField(new Blockly.FieldOID('Object ID', main.initSelectId(), main.objects), 'OID');
this.appendDummyInput('WITH_DELAY')
.appendField(Blockly.Words['toggle_delay'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
var delayInput = (option == true);
this.sourceBlock_.updateShape_(delayInput);
}), 'WITH_DELAY');
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['toggle_tooltip'][systemLang]);
this.setHelpUrl(getHelp('toggle_help'));
},
mutationToDom: function() {
var container = document.createElement('mutation');
container.setAttribute('delay_input', this.getFieldValue('WITH_DELAY') === 'TRUE');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('delay_input') == 'true');
},
updateShape_: function(delayInput) {
// Add or remove a delay Input.
var inputExists = this.getInput('DELAY');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('DELAY')
.appendField(' ')
.appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['control_ms'][systemLang], 'ms'],
[Blockly.Words['control_sec'][systemLang], 'sec'],
[Blockly.Words['control_min'][systemLang], 'min']
]), 'UNIT');
//.appendField(Blockly.Words['toggle_ms'][systemLang]);
}
} else if (inputExists) {
this.removeInput('DELAY');
}
inputExists = this.getInput('CLEAR_RUNNING_INPUT');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('CLEAR_RUNNING_INPUT')
.appendField(Blockly.Words['toggle_clear_running'][systemLang])
.appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
}
} else if (inputExists) {
this.removeInput('CLEAR_RUNNING_INPUT');
}
}
};
Blockly.JavaScript['toggle'] = function(block) {
var valueObjectID = block.getFieldValue('OID');
Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
var valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10);
var unit = block.getFieldValue('UNIT');
if (unit === 'min') {
valueDelay *= 60000;
} else if (unit === 'sec') {
valueDelay *= 1000;
}
var clearRunning = block.getFieldValue('CLEAR_RUNNING') === 'TRUE';
var objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : '';
var objectType = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.type ? main.objects[valueObjectID].common.type : 'boolean';
var code;
var setCommand;
if (objectType === 'number') {
var max = 100;
var min = 0;
if (main.objects[valueObjectID].common.max !== undefined) {
max = parseFloat(main.objects[valueObjectID].common.max);
}
if (main.objects[valueObjectID].common.min !== undefined) {
min = parseFloat(main.objects[valueObjectID].common.min);
}
setCommand = ' setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? (state.val == ' + min + ' ? ' + max + ' : ' + min + ') : ' + max + ');\n';
} else {
setCommand = ' setState("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? !state.val : true);\n';
}
if (this.getFieldValue('WITH_DELAY') === 'TRUE') {
code =
'getState("' + valueObjectID + '", function (err, state) {\n' +
' setStateDelayed("' + valueObjectID + '"' + (objectName ? '/*' + objectName + '*/' : '') + ', state ? !state.val : true, ' + valueDelay + ', ' + clearRunning + ');\n' +
'});\n';
} else {
code =
'getState("' + valueObjectID + '", function (err, state) {\n' +
setCommand +
'});\n';
}
return code;
};
// --- update -----------------------------------------------------------
Blockly.System.blocks['update'] =
'<block type="update">'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="VALUE">'
+ ' </value>'
+ ' <value name="WITH_DELAY">'
+ ' </value>'
+ ' <mutation delay_input="false"></mutation>'
+ ' <value name="DELAY_MS">'
+ ' </value>'
+ ' <value name="UNIT">'
+ ' </value>'
+ ' <value name="CLEAR_RUNNING">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['update'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['update'][systemLang]);
this.appendDummyInput('OID')
.appendField(new Blockly.FieldOID("Object ID", main.initSelectId(), main.objects), 'OID');
this.appendValueInput('VALUE')
.setCheck(null)
.appendField(Blockly.Words['update_with'][systemLang]);
this.appendDummyInput('WITH_DELAY')
.appendField(Blockly.Words['update_delay'][systemLang])
.appendField(new Blockly.FieldCheckbox('FALSE', function(option) {
this.sourceBlock_.updateShape_(option == true);
}), 'WITH_DELAY');
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['update_tooltip'][systemLang]);
this.setHelpUrl(getHelp('update_help'));
},
mutationToDom: function() {
var container = document.createElement('mutation');
container.setAttribute('delay_input', this.getFieldValue('WITH_DELAY') === 'TRUE');
return container;
},
domToMutation: function(xmlElement) {
this.updateShape_(xmlElement.getAttribute('delay_input') == 'true');
},
updateShape_: function(delayInput) {
// Add or remove a delay Input.
var inputExists = this.getInput('DELAY');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('DELAY')
.appendField(' ')
.appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['control_ms'][systemLang], 'ms'],
[Blockly.Words['control_sec'][systemLang], 'sec'],
[Blockly.Words['control_min'][systemLang], 'min']
]), 'UNIT');
//.appendField(Blockly.Words['update_ms'][systemLang]);
}
} else if (inputExists) {
this.removeInput('DELAY');
}
inputExists = this.getInput('CLEAR_RUNNING_INPUT');
if (delayInput) {
if (!inputExists) {
this.appendDummyInput('CLEAR_RUNNING_INPUT')
.appendField(Blockly.Words['control_clear_running'][systemLang])
.appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
}
} else if (inputExists) {
this.removeInput('CLEAR_RUNNING_INPUT');
}
}
};
Blockly.JavaScript['update'] = function(block) {
var value_objectid = block.getFieldValue('OID');
Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value';
var value_value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
var value_delay = parseInt(block.getFieldValue('DELAY_MS'), 10);
var clearRunning = block.getFieldValue('CLEAR_RUNNING') === 'TRUE';
var unit = block.getFieldValue('UNIT');
if (unit === 'min') {
value_delay *= 60000;
} else if (unit === 'sec') {
value_delay *= 1000;
}
var objectname = main.objects[value_objectid] && main.objects[value_objectid].common && main.objects[value_objectid].common.name ? main.objects[value_objectid].common.name : '';
var code;
if (this.getFieldValue('WITH_DELAY') === 'TRUE') {
code = 'setStateDelayed("' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + value_value + ', true, ' + value_delay + ', ' + clearRunning + ');\n';
} else {
code = 'setState("' + value_objectid + '"' + (objectname ? '/*' + objectname + '*/' : '') + ', ' + value_value + ', true);\n';
}
return code;
};
// --- direct binding -----------------------------------------------------------
Blockly.System.blocks['direct'] =
'<block type="direct">'
+ ' <value name="OID_SRC">'
+ ' <shadow type="field_oid">'
+ ' <field name="oid">Object ID 1</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="OID_DST">'
+ ' <shadow type="field_oid">'
+ ' <field name="oid">Object ID 2</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="ONLY_CHANGES">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['direct'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['direct'][systemLang]);
this.appendValueInput('OID_SRC')
.setCheck('String')
.appendField(Blockly.Words['direct_oid_src'][systemLang]);
this.appendValueInput('OID_DST')
.setCheck('String')
.appendField(Blockly.Words['direct_oid_dst'][systemLang]);
this.appendDummyInput('ONLY_CHANGES')
.appendField(Blockly.Words['direct_only_changes'][systemLang])
.appendField(new Blockly.FieldCheckbox('TRUE'), 'ONLY_CHANGES');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['direct_tooltip'][systemLang]);
this.setHelpUrl(getHelp('direct_help'));
}
};
Blockly.JavaScript['direct'] = function(block) {
var oidSrc = Blockly.JavaScript.valueToCode(block, 'OID_SRC', Blockly.JavaScript.ORDER_ATOMIC);
var onlyChanges = block.getFieldValue('ONLY_CHANGES');
var oidDest = Blockly.JavaScript.valueToCode(block, 'OID_DST', Blockly.JavaScript.ORDER_ATOMIC);
return 'on({id: ' + oidSrc + ', change: "' + (onlyChanges == 'TRUE' ? 'ne' : 'any') + '"}, function (obj) {\n setState(' + oidDest + ', obj.state.val);\n});';
};
// --- control ex -----------------------------------------------------------
Blockly.System.blocks['control_ex'] =
'<block type="control_ex">'
+ ' <value name="OID">'
+ ' <shadow type="field_oid">'
+ ' <field name="oid">Object ID</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="VALUE">'
+ ' <shadow type="logic_boolean">'
+ ' <field name="BOOL">TRUE</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="TYPE">'
+ ' </value>'
+ ' <value name="DELAY_MS">'
+ ' <shadow type="math_number">'
+ ' <field name="NUM">0</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="CLEAR_RUNNING">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['control_ex'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['control_ex'][systemLang]);
this.appendValueInput('OID')
.setCheck('String')
.appendField(Blockly.Words['field_oid_OID'][systemLang]);
this.appendDummyInput('TYPE')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['control_ex_control'][systemLang], 'false'],
[Blockly.Words['control_ex_update'][systemLang], 'true']
]), 'TYPE');
this.appendValueInput('VALUE')
.setCheck(null)
.appendField(Blockly.Words['control_ex_value'][systemLang]);
this.appendValueInput('DELAY_MS')
.setCheck('Number')
.appendField(Blockly.Words['control_ex_delay'][systemLang]);
this.appendDummyInput('CLEAR_RUNNING_INPUT')
.appendField(Blockly.Words['control_ex_clear_running'][systemLang])
.appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING');
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['control_tooltip'][systemLang]);
this.setHelpUrl(getHelp('control_help'));
}
};
Blockly.JavaScript['control_ex'] = function(block) {
var valueObjectID = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC);
var value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC);
var valueDelay = Blockly.JavaScript.valueToCode(block, 'DELAY_MS', Blockly.JavaScript.ORDER_ATOMIC);
var clearRunning = block.getFieldValue('CLEAR_RUNNING') === 'TRUE';
var type = block.getFieldValue('TYPE') === 'true';
return 'setStateDelayed(' + valueObjectID + ', ' + value + ', ' + type + ', parseInt(' + valueDelay + ', 10), ' + clearRunning + ');\n';
};
// --- create state --------------------------------------------------
Blockly.System.blocks['create'] =
'<block type="create">'
+ ' <value name="NAME">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['create'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['create'][systemLang]);
this.appendDummyInput('NAME')
.appendField(new Blockly.FieldTextInput(Blockly.Words['create_jsState'][systemLang]), 'NAME');
this.appendStatementInput('STATEMENT')
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['create_tooltip'][systemLang]);
this.setHelpUrl(getHelp('create_help'));
}
};
Blockly.JavaScript['create'] = function(block) {
var name = block.getFieldValue('NAME');
var statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return 'createState("' + name + '", function () {\n' + statement + '});\n';
};
// --- get value --------------------------------------------------
Blockly.System.blocks['get_value'] =
'<block type="get_value">'
+ ' <value name="ATTR">'
+ ' </value>'
+ ' <value name="OID">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['get_value'] = {
// Checkbox.
init: function() {
this.appendDummyInput('ATTR')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['get_value_val'][systemLang], 'val'],
[Blockly.Words['get_value_ack'][systemLang], 'ack'],
[Blockly.Words['get_value_ts'][systemLang], 'ts'],
[Blockly.Words['get_value_lc'][systemLang], 'lc'],
[Blockly.Words['get_value_q'][systemLang] , 'q'],
[Blockly.Words['get_value_from'][systemLang], 'from']
]), 'ATTR');
this.appendDummyInput()
.appendField(Blockly.Words['get_value_OID'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldOID(Blockly.Words['get_value_default'][systemLang], main.initSelectId(), main.objects), 'OID');
this.setInputsInline(true);
this.setOutput(true);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['get_value_tooltip'][systemLang]);
this.setHelpUrl(getHelp('get_value_help'));
}
};
Blockly.JavaScript['get_value'] = function(block) {
var oid = block.getFieldValue('OID');
var attr = block.getFieldValue('ATTR');
return ['getState("' + oid + '").' + attr, Blockly.JavaScript.ORDER_ATOMIC];
};
// --- get value async--------------------------------------------------
Blockly.System.blocks['get_value_async'] =
'<block type="get_value_async">'
+ ' <value name="ATTR">'
+ ' </value>'
+ ' <value name="OID">'
+ ' </value>'
+ ' <value name="STATEMENT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['get_value_async'] = {
// Checkbox.
init: function() {
this.appendDummyInput('ATTR')
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['get_value_val'][systemLang], 'val'],
[Blockly.Words['get_value_ack'][systemLang], 'ack'],
[Blockly.Words['get_value_ts'][systemLang], 'ts'],
[Blockly.Words['get_value_lc'][systemLang], 'lc'],
[Blockly.Words['get_value_q'][systemLang] , 'q'],
[Blockly.Words['get_value_from'][systemLang], 'from']
]), 'ATTR');
this.appendDummyInput()
.appendField(Blockly.Words['get_value_OID'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldOID(Blockly.Words['get_value_default'][systemLang], main.initSelectId(), main.objects), 'OID');
this.appendStatementInput('STATEMENT')
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['get_value_tooltip'][systemLang]);
this.setHelpUrl(getHelp('get_value_help'));
}
};
Blockly.JavaScript['get_value_async'] = function(block) {
var oid = block.getFieldValue('OID');
var attr = block.getFieldValue('ATTR');
var statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT');
return 'getState("' + oid + '", function (err, state) {\n var value = state.' + attr + ';\n' + statement + '});\n';
};
// --- select OID --------------------------------------------------
Blockly.System.blocks['field_oid'] =
'<block type="field_oid">'
+ ' <value name="TEXT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['field_oid'] = {
// Checkbox.
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['field_oid_OID'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldOID('default', main.initSelectId(), main.objects), 'oid');
this.setInputsInline(true);
this.setColour(Blockly.System.HUE);
this.setOutput(true, 'String');
this.setTooltip(Blockly.Words['field_oid_tooltip'][systemLang]);
}
};
Blockly.JavaScript['field_oid'] = function(block) {
var oid = block.getFieldValue('oid');
return ['\'' + oid + '\'', Blockly.JavaScript.ORDER_ATOMIC]
};
// --- get attribute --------------------------------------------------
Blockly.System.blocks['get_attr'] =
'<block type="get_attr">'
+ ' <value name="PATH">'
+ ' <shadow type="text">'
+ ' <field name="PATH">attr1.attr2</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="OBJECT">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['get_attr'] = {
init: function() {
this.appendValueInput('PATH')
.setCheck(null)
.appendField(Blockly.Words['get_attr_path'][systemLang]);
// this.appendDummyInput()
this.appendValueInput('OBJECT')
.appendField(Blockly.Words['get_attr_by'][systemLang]);
this.setInputsInline(true);
this.setOutput(true);
this.setColour(Blockly.System.HUE);
this.setTooltip(Blockly.Words['get_attr_tooltip'][systemLang]);
this.setHelpUrl(getHelp('get_attr_help'));
}
};
Blockly.JavaScript['get_attr'] = function(block) {
var path = Blockly.JavaScript.valueToCode(block, 'PATH', Blockly.JavaScript.ORDER_ATOMIC);
var obj = Blockly.JavaScript.valueToCode(block, 'OBJECT', Blockly.JavaScript.ORDER_ATOMIC);
return ['getAttr(' + obj + ', ' + path + ')', Blockly.JavaScript.ORDER_ATOMIC];
};
// --- Text new line --------------------------------------------------
Blockly.Blocks['text_newline'] = {
// Checkbox.
init: function() {
this.appendDummyInput()
.appendField(Blockly.Words['text_newline'][systemLang]);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([['\\n', '\\n'], ['\\r\\n', '\\r\\n'], ['\\r', '\\r']]), 'Type');
this.setInputsInline(true);
this.setColour(Blockly.Blocks.texts.HUE);
this.setOutput(true, 'String');
this.setTooltip(Blockly.Words['text_newline_tooltip'][systemLang]);
}
};
Blockly.JavaScript['text_newline'] = function(block) {
var dropdown_type = block.getFieldValue('Type');
return ['\'' + dropdown_type + '\'', Blockly.JavaScript.ORDER_ATOMIC]
};
// --- Round Number to n decimal places -------------------------------
Blockly.Blocks['math_rndfixed'] = {
init: function() {
this.appendValueInput('x')
.setCheck('Number')
.appendField(Blockly.Words['math_rndfixed_round'][systemLang]);
this.appendDummyInput()
.appendField(Blockly.Words['math_rndfixed_to'][systemLang])
.appendField(new Blockly.FieldNumber(0, 1, 25), 'n')
.appendField(Blockly.Words['math_rndfixed_decplcs'][systemLang]);
this.setInputsInline(true);
this.setColour(Blockly.Blocks.math.HUE);
this.setOutput(true, 'Number');
this.setTooltip(Blockly.Words['math_rndfixed_tooltip'][systemLang]);
}
};
Blockly.JavaScript['math_rndfixed'] = function(block) {
var x = Blockly.JavaScript.valueToCode(block, 'x', Blockly.JavaScript.ORDER_ATOMIC);
const exp = Math.pow(10, block.getFieldValue('n'));
return ['Math.round(' + x + '*' + exp + ')/' + exp, Blockly.JavaScript.ORDER_ATOMIC];
};