|
5. 이전/다음 연결 모양 정의
- 블록 주위로 시계 방향으로 윤곽선 경로가 그려지며, 왼쪽 상단에서 시작합니다.
- 결과적으로 이전 연결은 왼쪽에서 오른쪽으로 그려지고, 다음 연결은 오른쪽에서 왼쪽으로 그려집니다.
- 이전 및 다음 연결은 동일한 객체로 정의됩니다. 객체에는 네 가지 속성이 있습니다.
- makeRectangularPreviousConn()이라는 새 함수를 정의하고 CustomConstantProvider 클래스 정의 내부에 넣습니다.
- NOTCH_WIDTH와 NOTCH_HEIGHT는 이미 constructor()에서 재정의되었으므로 재사용됩니다.
6. 입력/출력 연결 모양 정의
- 이전/다음 연결 모양이 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 그려지는 것처럼 입력/출력 연결 모양은 위에서 아래로, 아래에서 위로 그려집니다.
- 입력 및 출력 연결은 동일한 객체에 의해 정의됩니다. 객체에는 네 가지 속성이 있습니다.
- makeRectangularInputConn()이라는 새 함수를 정의하고 CustomConstantProvider 클래스 정의 내부에 넣습니다.
- TAB_WIDTH 및 TAB_HEIGHT는 이미 constructor()에서 재정의되었으므로 재사용됩니다.
7. init() 재정의
- CustomConstantProvider 클래스 정의에서 init() 함수를 재정의하고 새 모양 객체를 RECT_PREV_NEXT 및 RECT_INPUT_OUTPUT으로 저장합니다.
- 재정의되지 않은 다른 객체를 저장하려면 슈퍼클래스 init() 함수를 호출해야 합니다.
8. 랜더링 결과
9. 전체 코드
import * as Blockly from 'blockly/core';
class CustomConstantProvider extends Blockly.blockRendering.ConstantProvider {
constructor() {
super();
this.NOTCH_WIDTH = 20;
this.NOTCH_HEIGHT = 10;
this.CORNER_RADIUS = 2;
this.TAB_HEIGHT = 8;
}
/**
* @override
*/
init() {
super.init();
this.RECT_PREV_NEXT = this.makeRectangularPreviousConn();
this.RECT_INPUT_OUTPUT = this.makeRectangularInputConn();
}
/**
* @override
*/
shapeFor(connection) {
switch (connection.type) {
case Blockly.INPUT_VALUE:
case Blockly.OUTPUT_VALUE:
return this.RECT_INPUT_OUTPUT;
case Blockly.PREVIOUS_STATEMENT:
case Blockly.NEXT_STATEMENT:
return this.RECT_PREV_NEXT;
default:
throw Error('Unknown connection type');
}
}
makeRectangularPreviousConn() {
const width = this.NOTCH_WIDTH;
const height = this.NOTCH_HEIGHT;
function makeMainPath(dir) {
return Blockly.utils.svgPaths.line([
Blockly.utils.svgPaths.point(0, height),
Blockly.utils.svgPaths.point(dir * width, 0),
Blockly.utils.svgPaths.point(0, -height),
]);
}
const pathLeft = makeMainPath(1);
const pathRight = makeMainPath(-1);
return {
width: width,
height: height,
pathLeft: pathLeft,
pathRight: pathRight,
};
}
makeRectangularInputConn() {
const width = this.TAB_WIDTH;
const height = this.TAB_HEIGHT;
function makeMainPath(dir) {
return Blockly.utils.svgPaths.line([
Blockly.utils.svgPaths.point(-width, 0),
Blockly.utils.svgPaths.point(0, dir * height),
Blockly.utils.svgPaths.point(width, 0),
]);
}
const pathUp = makeMainPath(-1);
const pathDown = makeMainPath(1);
return {
width: width,
height: height,
pathUp: pathUp,
pathDown: pathDown,
};
}
}
export class CustomRenderer extends Blockly.blockRendering.Renderer {
constructor() {
super();
}
makeConstants_() {
return new CustomConstantProvider();
}
}
// 새로운 렌더러를 등록
Blockly.blockRendering.register('custom_renderer', CustomRenderer);
|