add custom shapes for json array and object
This commit is contained in:
parent
e348067067
commit
c6134cf2ee
2 changed files with 142 additions and 0 deletions
|
|
@ -19,6 +19,145 @@ class CustomConstantProvider extends Blockly.zelos.ConstantProvider {
|
||||||
this.FIELD_TEXT_FONTWEIGHT = 'bold';
|
this.FIELD_TEXT_FONTWEIGHT = 'bold';
|
||||||
this.FIELD_TEXT_FONTFAMILY = '"Source Code Pro", monospace';
|
this.FIELD_TEXT_FONTFAMILY = '"Source Code Pro", monospace';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
init() {
|
||||||
|
super.init()
|
||||||
|
this.ROUNDEL = this.makeRoundel()
|
||||||
|
this.ROUNDEDINVERTED = this.makeRoundedInverted()
|
||||||
|
}
|
||||||
|
|
||||||
|
makeRoundedInverted() {
|
||||||
|
const maxWidth = this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;
|
||||||
|
const maxHeight = maxWidth * 2;
|
||||||
|
|
||||||
|
function makeMainPath(blockHeight, up, right) {
|
||||||
|
const remainingHeight = blockHeight > maxHeight ? blockHeight - maxHeight : 0;
|
||||||
|
const height = blockHeight > maxHeight ? maxHeight : blockHeight;
|
||||||
|
const radius = height / 2;
|
||||||
|
return (
|
||||||
|
Blockly.utils.svgPaths.lineOnAxis('h', (right ? 1 : -1) * radius) +
|
||||||
|
Blockly.utils.svgPaths.arc(
|
||||||
|
'a',
|
||||||
|
'0 0,0',
|
||||||
|
radius,
|
||||||
|
Blockly.utils.svgPaths.point((up ? .5 : -.5) * radius, (up ? -1 : 1) * radius),
|
||||||
|
) +
|
||||||
|
Blockly.utils.svgPaths.lineOnAxis('v', (right ? 1 : -1) * remainingHeight) +
|
||||||
|
Blockly.utils.svgPaths.arc(
|
||||||
|
'a',
|
||||||
|
'0 0,0',
|
||||||
|
radius,
|
||||||
|
Blockly.utils.svgPaths.point((up ? -.5 : .5) * radius, (up ? -1 : 1) * radius),
|
||||||
|
) +
|
||||||
|
Blockly.utils.svgPaths.lineOnAxis('h', (right ? -1 : 1) * radius)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: this.SHAPES.HEXAGONAL,
|
||||||
|
isDynamic: true,
|
||||||
|
width(height) {
|
||||||
|
const halfHeight = height / 2;
|
||||||
|
return halfHeight > maxWidth ? maxWidth : halfHeight;
|
||||||
|
},
|
||||||
|
height(height) {
|
||||||
|
return height;
|
||||||
|
},
|
||||||
|
connectionOffsetY(connectionHeight) {
|
||||||
|
return connectionHeight / 2;
|
||||||
|
},
|
||||||
|
connectionOffsetX(connectionWidth) {
|
||||||
|
return -connectionWidth;
|
||||||
|
},
|
||||||
|
pathDown(height) {
|
||||||
|
return makeMainPath(height, false, false);
|
||||||
|
},
|
||||||
|
pathUp(height) {
|
||||||
|
return makeMainPath(height, true, false);
|
||||||
|
},
|
||||||
|
pathRightDown(height) {
|
||||||
|
return makeMainPath(height, false, true);
|
||||||
|
},
|
||||||
|
pathRightUp(height) {
|
||||||
|
return makeMainPath(height, false, true);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
makeRoundel() {
|
||||||
|
const maxWidth = this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;
|
||||||
|
const maxHeight = maxWidth * 2;
|
||||||
|
|
||||||
|
function makeMainPath(blockHeight, up, right) {
|
||||||
|
const height = blockHeight > maxHeight ? maxHeight : blockHeight;
|
||||||
|
const radius = height / 2;
|
||||||
|
return (
|
||||||
|
Blockly.utils.svgPaths.arc(
|
||||||
|
'a',
|
||||||
|
'0 0,1',
|
||||||
|
radius,
|
||||||
|
Blockly.utils.svgPaths.point((up ? -.5 : .5) * radius, (up ? -.5 : .5) * radius),
|
||||||
|
) +
|
||||||
|
Blockly.utils.svgPaths.lineOnAxis('h', (right ? .5 : -.5) * radius) +
|
||||||
|
Blockly.utils.svgPaths.lineOnAxis('v', (up ? -1 : 1) * radius) +
|
||||||
|
Blockly.utils.svgPaths.lineOnAxis('h', (right ? -.5 : .5) * radius) +
|
||||||
|
Blockly.utils.svgPaths.arc(
|
||||||
|
'a',
|
||||||
|
'0 0,1',
|
||||||
|
radius,
|
||||||
|
Blockly.utils.svgPaths.point((up ? .5 : -.5) * radius, (up ? -.5 : .5) * radius),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: this.SHAPES.ROUND,
|
||||||
|
isDynamic: true,
|
||||||
|
width(height) {
|
||||||
|
const halfHeight = height / 2;
|
||||||
|
return halfHeight > maxWidth ? maxWidth : halfHeight;
|
||||||
|
},
|
||||||
|
height(height) {
|
||||||
|
return height;
|
||||||
|
},
|
||||||
|
connectionOffsetY(connectionHeight) {
|
||||||
|
return connectionHeight / 2;
|
||||||
|
},
|
||||||
|
connectionOffsetX(connectionWidth) {
|
||||||
|
return -connectionWidth;
|
||||||
|
},
|
||||||
|
pathDown(height) {
|
||||||
|
return makeMainPath(height, false, false);
|
||||||
|
},
|
||||||
|
pathUp(height) {
|
||||||
|
return makeMainPath(height, true, false);
|
||||||
|
},
|
||||||
|
pathRightDown(height) {
|
||||||
|
return makeMainPath(height, false, true);
|
||||||
|
},
|
||||||
|
pathRightUp(height) {
|
||||||
|
return makeMainPath(height, false, true);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Blockly.RenderedConnection} connection
|
||||||
|
*/
|
||||||
|
shapeFor(connection) {
|
||||||
|
let checks = connection.getCheck();
|
||||||
|
if (!checks && connection.targetConnection) {
|
||||||
|
checks = connection.targetConnection.getCheck();
|
||||||
|
}
|
||||||
|
if (connection.type == Blockly.ConnectionType.INPUT_VALUE || connection.type == Blockly.ConnectionType.OUTPUT_VALUE) {
|
||||||
|
if (checks && checks.indexOf('JSONArray') !== -1) {
|
||||||
|
return this.ROUNDEDINVERTED;
|
||||||
|
} else if (checks && checks.indexOf('JSONObject') !== -1) {
|
||||||
|
return this.ROUNDEL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.shapeFor(connection)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Renderer extends Blockly.zelos.Renderer {
|
export default class Renderer extends Blockly.zelos.Renderer {
|
||||||
|
|
|
||||||
|
|
@ -8,5 +8,8 @@ export default defineConfig({
|
||||||
'@blockly/continuous-toolbox',
|
'@blockly/continuous-toolbox',
|
||||||
'file-saver',
|
'file-saver',
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
sourcemap: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue