super-hero/extensions/shader-graph/dist/block-forge/block.js

419 lines
45 KiB
JavaScript
Raw Permalink Normal View History

2024-05-29 19:24:12 -07:00
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
exports.replaceDeclareBlock = exports.unDeclareBlock = exports.declareBlock = exports.removeDeclareBlock = exports.getDeclareBlock = exports.hasDeclareBlock = exports.generateBlockOption = exports.blockMap = void 0;
const ui_graph_1 = require("@itharbors/ui-graph");
const utils_1 = require("./utils");
const pin_1 = require("./pin");
// import { unregisterNode } from '@itharbors/ui-graph/dist/manager';
exports.blockMap = new Map();
/**
* Block 元素更新的一些工具方法
* 一般是传入元素 + 数据更新元素内的一些 HTML 对象
*/
const BlockElementUtils = {
/**
* 更新 Block 元素的 title
* @param elem
* @param blockDesc
* @param details
*/
updateTitle(elem, blockDesc, details) {
const title = blockDesc.title || details.title || 'Unknown';
elem.shadowRoot.querySelector(`.title ui-label`).innerHTML = title;
},
/**
* 更新 Block 元素的 icon
* @param elem
* @param blockDesc
* @returns
*/
updateIcon(elem, blockDesc) {
const feature = blockDesc.feature || {};
const icon = feature.icon;
if (!icon) {
return;
}
const $icon = elem.shadowRoot.querySelector(`.title ui-icon`);
$icon.removeAttribute('hidden');
$icon.setAttribute('value', icon);
},
/**
* 更新 Block 元素是否可进入的图标显示状态
* @param elem
* @param blockDesc
*/
updateCollapsed(elem, blockDesc) {
const feature = blockDesc.feature || {};
const isCollapsed = feature.isCollapsedBlock;
const $svg = elem.shadowRoot.querySelector(`.title svg`);
if (isCollapsed) {
$svg.removeAttribute('hidden');
}
else {
$svg.setAttribute('hidden', '');
}
},
/**
* 更新元素展开折叠的状态
* @param elem
* @param blockDesc
* @param details
*/
updateExpand(elem, blockDesc, details) {
if (blockDesc.inputPins.length > 0 || blockDesc.outputPins.length > 0) {
elem.setAttribute('expand', '');
}
else {
elem.removeAttribute('expand');
}
},
};
/**
* 创建一个专用的节点渲染对象
*
* @returns
* @param blockDesc
*/
function generateBlockOption(blockDesc) {
blockDesc.style = blockDesc.style || {};
blockDesc.feature = blockDesc.feature || {};
const showQuickConnectPoint = !!blockDesc.feature.showQuickConnectPoint;
return {
template: /*html*/ `
<section class="wrapper">
<header class="title">
<div>
<ui-icon hidden></ui-icon>
<ui-label></ui-label>
<svg hidden viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M1 13L8 3L15 13H1Z"></path></svg>
</div>
${showQuickConnectPoint ? '<div hidden class="quick-connect" name="t"></div' : ''}
</header>
<section class="content"></section>
</section>
`,
style: `${STYLE.host(blockDesc)}${STYLE.header(blockDesc)}${STYLE.pin(blockDesc)}`,
/**
* 初始化的时候设置一些事件和 HTML
* @param this
* @param details
*/
onInit(details) {
// 设置 title 可拖拽
const $title = this.shadowRoot.querySelector('header.title');
$title.addEventListener('mousedown', (event) => {
event.stopPropagation();
event.preventDefault();
if (!this.hasAttribute('selected')) {
if (!event.metaKey && !event.ctrlKey) {
this.clearOtherSelected();
}
this.select({
clearLines: false,
clearNodes: false,
});
}
this.startMove();
});
// 绑定快速连接点的事件
const $param = this.shadowRoot.querySelector(`.quick-connect`);
$param && $param.addEventListener('mousedown', () => {
this.startConnect('straight');
});
// 绑定元素点击开始连接的事件
if (blockDesc.inputPins.length === 0 && blockDesc.outputPins.length === 0) {
this.addEventListener('mousedown', (event) => {
if (event.button === 0 && this.hasConnect()) {
event.stopPropagation();
event.preventDefault();
this.startConnect('straight');
}
}, true);
}
this.addEventListener('dblclick', (event) => {
// event.stopPropagation();
// event.preventDefault();
const customEvent = new CustomEvent('block-dblclick', {
bubbles: true,
cancelable: true,
detail: {
pageX: event.pageX,
pageY: event.pageY,
offsetX: event.offsetX,
offsetY: event.offsetY,
},
});
this.dispatchEvent(customEvent);
});
this.addEventListener('click', (event) => {
const custom = new CustomEvent('block-click', {
bubbles: true,
cancelable: true,
detail: {},
});
this.dispatchEvent(custom);
});
this.addEventListener('mouseup', (event) => {
if (event.button !== 2) {
return;
}
const custom = new CustomEvent('block-right-click', {
bubbles: true,
cancelable: true,
detail: {},
});
this.dispatchEvent(custom);
});
this.data.addPropertyListener('selected', (selected, legacySelected) => {
if (selected === legacySelected) {
return;
}
if (selected) {
const custom = new CustomEvent('block-selected', {
bubbles: true,
cancelable: true,
detail: {},
});
this.dispatchEvent(custom);
}
else {
const custom = new CustomEvent('block-unselected', {
bubbles: true,
cancelable: true,
detail: {},
});
this.dispatchEvent(custom);
}
});
},
onUpdate(details) {
// 更新 title
BlockElementUtils.updateTitle(this, blockDesc, details);
// 更新 icon
BlockElementUtils.updateIcon(this, blockDesc);
// 更新折叠图标
BlockElementUtils.updateCollapsed(this, blockDesc);
// 更新折叠状态
BlockElementUtils.updateExpand(this, blockDesc, details);
// 数据更新后,更新对应的资源
// this.data.addPropertyListener('details', (details) => {
// updateHTML(details.label);
// });
// 生成针脚
const $content = this.shadowRoot.querySelector('.content');
$content.innerHTML = '';
if (blockDesc.createDynamicOutputPins) {
const outputList = blockDesc.createDynamicOutputPins(blockDesc, details);
outputList.forEach((pin, index) => {
return $content?.appendChild((0, pin_1.generateOutputPinHTML)(pin, details.outputPins[index]));
});
}
else {
blockDesc.outputPins.forEach((pin, index) => {
return $content?.appendChild((0, pin_1.generateOutputPinHTML)(pin, details.outputPins[index]));
});
}
const $graph = this.getRootNode().host;
const uuid = this.getAttribute('node-uuid');
if (blockDesc.createDynamicInputPins) {
const inputList = blockDesc.createDynamicInputPins(blockDesc, details);
inputList.forEach((pin, index) => {
return $content?.appendChild((0, pin_1.generateInputPinHTML)(pin, details.inputPins, index, uuid, $graph.getProperty('lines')));
});
}
else {
blockDesc.inputPins.forEach((pin, index) => {
return $content?.appendChild((0, pin_1.generateInputPinHTML)(pin, details.inputPins, index, uuid, $graph.getProperty('lines')));
});
}
// 绑定参数连接点的事件
const $paramList = this.shadowRoot.querySelectorAll(`v-graph-node-param`);
Array.prototype.forEach.call($paramList, ($param) => {
$param.addEventListener('mousedown', (event) => {
event.stopPropagation();
event.preventDefault();
const name = $param.getAttribute('name');
if (!name) {
return;
}
const paramDirection = $param.getAttribute('direction');
if (paramDirection !== 'input' && paramDirection !== 'output') {
return;
}
this.startConnect('curve', name, paramDirection);
});
});
},
};
}
exports.generateBlockOption = generateBlockOption;
const STYLE = {
host(block) {
const config = block.style || {};
return /*css*/ `
:host *[hidden] {
display: none;
}
:host {
--font-color: ${config.fontColor || '#ccc'};
--font-color-hover: ${config.fontHoverColor || config.fontColor || '#ccc'};
--border-color: ${config.borderColor || 'white'};
--border-color-hover: ${config.borderHoverColor || config.borderColor || 'white'};
--shadow-color: ${config.shadowColor || '#ccc'};
--shadow-color-hover: ${config.shadowHoverColor || config.shadowColor || '#ccc'};
--background-color: ${config.backgroundColor || '#2b2b2bcc'};
--border-radius: 2px;
--header-height: 24px;
--header-background: ${config.headerColor || '#2b2b2bcc'};
--pin-height: 24px;
width: 200px;
color: var(--font-color);
cursor: default;
}
:host > section.wrapper {
margin: 10px;
}
:host(:hover) > section.wrapper, :host([selected]) > section.wrapper {
border-color: var(--border-color-hover);
color: var(--font-color-hover);
box-shadow: 0px 0px 7px 2px var(--shadow-color-hover);
}
section.wrapper {
position: relative;
border-radius: var(--border-radius);
background: var(--background-color);
box-shadow: 0px 0px 7px 2px none;
}
:host(:hover) > section.wrapper::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1;
border-radius: var(--border-radius);
box-shadow: 0px 0px 0px 1px var(--shadow-color-hover) inset;
pointer-events: none;
}
`;
},
header(block) {
const config = block.style || {};
return /*css*/ `
header.title {
line-height: var(--header-height);
text-align: center;
border-radius: var(--border-radius);
${config.secondaryColor ? `background: ${config.secondaryColor}; padding-left: 6px;` : ''}
}
header.title > div {
padding: 0 10px;
height: 24px;
border-radius: var(--border-radius);
display: flex;
background: var(--header-background);
}
:host([expand]) header.title > div {
border-radius: var(--border-radius) var(--border-radius) 0 0;
}
header.title > div > ui-label {
display: block;
padding: 0 10px;
}
header.title > div > ui-icon {
display: block;
}
header.title > div > svg {
fill: white;
display: block;
width: 10px;
transform: rotate(90deg);
}
header.title > .quick-connect {
display: block;
padding: 0;
width: 12px;
height: 12px;
border-radius: 6px;
background: white;
position: absolute;
right: -6px;
top: 50%;
margin-top: -6px;
opacity: 0;
transition: opacity 0.3s;
}
:host(:hover) header.title > .quick-connect {
display: block;
opacity: 1;
}
`;
},
pin: pin_1.generateStyle,
};
function hasDeclareBlock(type) {
return exports.blockMap.has(type);
}
exports.hasDeclareBlock = hasDeclareBlock;
function getDeclareBlock(type) {
return exports.blockMap.get(type);
}
exports.getDeclareBlock = getDeclareBlock;
function removeDeclareBlock(type) {
const graph = '*';
const unknownOption = (0, ui_graph_1.queryNode)(graph, 'unknown');
(0, ui_graph_1.registerNode)(graph, type, unknownOption);
exports.blockMap.delete(type);
}
exports.removeDeclareBlock = removeDeclareBlock;
// @ts-ignore
window.removeDeclareBlock = removeDeclareBlock;
/**
* 注册一个 block 类型
* @param block
* @returns
*/
function declareBlock(block) {
const graph = '*';
// if (blockMap.has(block.type)) {
// console.warn(`Cannot declare duplicate block types: ${block.type}`);
// return;
// }
// 合并 extend 数据
if (block.extend) {
const extend = exports.blockMap.get(block.extend);
if (!extend) {
console.warn(`Inheritance data not found: ${block.extend}`);
}
else {
(0, utils_1.completeBlockTarget)(block, extend);
}
}
const options = generateBlockOption(block);
(0, ui_graph_1.registerNode)(graph, block.type, options);
exports.blockMap.set(block.type, block);
}
exports.declareBlock = declareBlock;
function unDeclareBlock(type) {
const graph = '*';
// TODO 需要删除底层 block 节点
// unregisterNode(graph, type);
exports.blockMap.delete(type);
}
exports.unDeclareBlock = unDeclareBlock;
function replaceDeclareBlock(searchType, block) {
if (exports.blockMap.has(searchType)) {
unDeclareBlock(searchType);
}
declareBlock(block);
}
exports.replaceDeclareBlock = replaceDeclareBlock;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvY2stZm9yZ2UvYmxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7QUFJYixrREFBOEQ7QUFFOUQsbUNBQThDO0FBRTlDLCtCQUF1RztBQUN2RyxxRUFBcUU7QUFFeEQsUUFBQSxRQUFRLEdBQW1DLElBQUksR0FBRyxFQUFFLENBQUM7QUFFbEU7OztHQUdHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRztJQUN0Qjs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxJQUFzQixFQUFFLFNBQTRCLEVBQUUsT0FBK0I7UUFDN0YsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQztRQUM1RCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBRSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLElBQXNCLEVBQUUsU0FBNEI7UUFDM0QsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsT0FBTztTQUNWO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUUsQ0FBQztRQUMvRCxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZUFBZSxDQUFDLElBQXNCLEVBQUUsU0FBNEI7UUFDaEUsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9B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