@fmsim/board 2.0.0-beta.101 → 2.0.0-beta.104
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +2020 -1759
- package/dist/src/modeller/bulk-create-dialog.d.ts +12 -1
- package/dist/src/modeller/bulk-create-dialog.js +67 -3
- package/dist/src/modeller/bulk-create-dialog.js.map +1 -1
- package/dist/src/modeller/bulk-create.d.ts +6 -0
- package/dist/src/modeller/bulk-create.js +3 -1
- package/dist/src/modeller/bulk-create.js.map +1 -1
- package/dist/src/modeller/component-toolbar/component-toolbar.d.ts +6 -0
- package/dist/src/modeller/component-toolbar/component-toolbar.js +18 -2
- package/dist/src/modeller/component-toolbar/component-toolbar.js.map +1 -1
- package/dist/src/modeller/edit-toolbar.js +10 -1
- package/dist/src/modeller/edit-toolbar.js.map +1 -1
- package/dist/src/modeller/property-sidebar/effects/effects.js +3 -2
- package/dist/src/modeller/property-sidebar/effects/effects.js.map +1 -1
- package/dist/src/modeller/property-sidebar/shapes/ox-input-entity-id.js +12 -3
- package/dist/src/modeller/property-sidebar/shapes/ox-input-entity-id.js.map +1 -1
- package/dist/src/modeller/property-sidebar/shapes/shapes.js +40 -24
- package/dist/src/modeller/property-sidebar/shapes/shapes.js.map +1 -1
- package/dist/src/modeller/property-sidebar/specifics/parent-object.d.ts +29 -0
- package/dist/src/modeller/property-sidebar/specifics/parent-object.js +74 -0
- package/dist/src/modeller/property-sidebar/specifics/parent-object.js.map +1 -0
- package/dist/src/modeller/property-sidebar/specifics/specifics.d.ts +4 -2
- package/dist/src/modeller/property-sidebar/specifics/specifics.js +13 -31
- package/dist/src/modeller/property-sidebar/specifics/specifics.js.map +1 -1
- package/dist/src/ox-board-modeller.js +9 -2
- package/dist/src/ox-board-modeller.js.map +1 -1
- package/dist/src/ox-board-viewer.js +8 -2
- package/dist/src/ox-board-viewer.js.map +1 -1
- package/dist/src/scene-monitor-renderer.d.ts +10 -0
- package/dist/src/scene-monitor-renderer.js +226 -0
- package/dist/src/scene-monitor-renderer.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-toolbar.js","sourceRoot":"","sources":["../../../src/modeller/edit-toolbar.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { html, LitElement, PropertyValues } from 'lit'\nimport { property, state } from 'lit/decorators.js'\n\nimport { Component, Scene } from '@hatiolab/things-scene'\nimport { copyToClipboard, isMacOS } from '@operato/utils'\nimport { OxPopup } from '@operato/popup'\n\nimport { style } from './edit-toolbar-style'\nimport './bulk-create-dialog.js'\nimport type { BulkCreateDialog } from './bulk-create-dialog.js'\n\nconst MACOS = isMacOS()\n\n/**\n * 컴포넌트 model JSON 만으로 type-aware bounding box (width, height) 추출.\n *\n * things-scene 의 component.bounds 는 *path 의 bounding box* 인데, model JSON 만\n * 으로는 path 를 그릴 수 없으므로 type-specific 필드를 직접 본다.\n * - width/height 명시 (Rect, Container 등) → 그대로\n * - rx/ry (Ellipse 등) → 2*rx, 2*ry\n * - points 배열 (Line, Polygon 등) → 점들의 bounding box\n * - 그 외 → 50x50 fallback\n *\n * bulk-paste 가 영역 안에 N 개 복제할 때 *원본 크기를 보존* 하기 위해 사용.\n */\nfunction deriveBoundsFromModel(model: Record<string, any>): { width: number; height: number } {\n if (typeof model.width === 'number' && typeof model.height === 'number') {\n return { width: model.width, height: model.height }\n }\n if (typeof model.rx === 'number' && typeof model.ry === 'number') {\n return { width: 2 * Math.abs(model.rx), height: 2 * Math.abs(model.ry) }\n }\n if (Array.isArray(model.points) && model.points.length > 0) {\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n for (const p of model.points) {\n if (typeof p?.x === 'number') {\n if (p.x < minX) minX = p.x\n if (p.x > maxX) maxX = p.x\n }\n if (typeof p?.y === 'number') {\n if (p.y < minY) minY = p.y\n if (p.y > maxY) maxY = p.y\n }\n }\n if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {\n return { width: maxX - minX, height: maxY - minY }\n }\n }\n return { width: 50, height: 50 }\n}\n\nexport class EditToolbar extends LitElement {\n static styles = [style]\n\n @property({ type: Object }) scene?: Scene\n @property({ type: Array }) selected: any[] = []\n @property({ type: Boolean }) hideProperty: boolean = false\n\n @state() private _dimension: '2d' | '3d' | null = null\n @state() private _gizmoAttached = false\n\n private cliped?: string\n\n firstUpdated() {\n this.addEventListener('mousewheel', this.onWheelEvent.bind(this) as EventListener, false)\n\n // 툴바 버튼 클릭 후 씬으로 포커스를 돌려서 키보드 단축키가 계속 작동하도록 한다\n this.addEventListener('click', () => {\n ;(this.scene?.root as any)?.element?.focus()\n })\n\n window.addEventListener('paste', (e: Event) => {\n try {\n this.cliped = (e as ClipboardEvent).clipboardData?.getData('text/plain')\n } catch (e) {\n console.error('model paste failed', e)\n }\n })\n // 모든 버튼은 템플릿 @click 디렉티브로 바인딩 — 조건부 렌더링 시에도 정상 작동\n }\n\n updated(changes: PropertyValues<this>) {\n changes.has('scene') && this.onSceneChanged(this.scene, changes.get('scene') as Scene)\n changes.has('selected') && this.onSelectedChanged(this.selected, changes.get('selected') as Component[])\n }\n\n render() {\n return html`\n <div tools>\n <span><slot></slot></span>\n\n ${this.hasEmptySlot() ? html`` : html`<span class=\"vline\"></span>`}\n\n <span button id=\"undo\" title=\"undo (${this.getShortcutString('cmd', 'z')})\" @click=${this.onTapUndo}> </span>\n <span button id=\"redo\" title=\"redo (${this.getShortcutString('cmd', 'shift', 'z')})\" @click=${this.onTapRedo}> </span>\n\n <span class=\"vline\"></span>\n\n <span button id=\"style-copy\" title=\"style copy (${this.getShortcutString('cmd', '1')})\" @click=${this.onStartStylePasteMode}> </span>\n <span button id=\"databind-copy\" title=\"databind copy (${this.getShortcutString('cmd', '2')})\" @click=${this.onStartDatabindPasteMode}> </span>\n\n <span class=\"vline\"></span>\n\n <span button id=\"cut\" title=\"cut (${this.getShortcutString('cmd', 'x')})\" @click=${this.onTapCut}> </span>\n <span button id=\"copy\" title=\"copy (${this.getShortcutString('cmd', 'c')})\" @click=${this.onTapCopy}> </span>\n <span button id=\"paste\" title=\"paste (${this.getShortcutString('cmd', 'v')})\" @click=${this.onTapPaste}> </span>\n <span button id=\"delete\"\n title=\"delete (${this.getShortcutString('backspace')}, ${this.getShortcutString('delete')})\"\n @click=${this.onTapDelete}> </span>\n\n <span class=\"vline\"></span>\n\n <span button data-align=\"left\" id=\"align-left\"\n title=\"align left (${this.getShortcutString('alt', 'shift', 'l')})\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"center\" id=\"align-center\"\n title=\"align center (${this.getShortcutString('alt', 'shift', 'c')})\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"right\" id=\"align-right\"\n title=\"align right (${this.getShortcutString('alt', 'shift', 'r')})\" @click=${this.onTapAlign}> </span>\n\n <span button data-align=\"top\" id=\"align-top\"\n title=\"align top (${this.getShortcutString('alt', 'shift', 't')})\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"middle\" id=\"align-middle\"\n title=\"align middle (${this.getShortcutString('alt', 'shift', 'm')})\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"bottom\" id=\"align-bottom\"\n title=\"align bottom (${this.getShortcutString('alt', 'shift', 'b')})\" @click=${this.onTapAlign}> </span>\n\n <span button data-distribute=\"HORIZONTAL\" id=\"distribute-horizontal\"\n title=\"distribute horizontally (${this.getShortcutString('alt', 'shift', 'h')})\" @click=${this.onTapDistribute}> </span>\n <span button data-distribute=\"VERTICAL\" id=\"distribute-vertical\"\n title=\"distribute vertically (${this.getShortcutString('alt', 'shift', 'v')})\" @click=${this.onTapDistribute}> </span>\n\n ${this._dimension === '3d'\n ? html`\n <span class=\"vline\"></span>\n\n <span button data-align=\"z-front\" id=\"align-z-front\" title=\"align Z front\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"z-middle\" id=\"align-z-middle\" title=\"align Z middle\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"z-back\" id=\"align-z-back\" title=\"align Z back\" @click=${this.onTapAlign}> </span>\n <span button data-distribute=\"Z\" id=\"distribute-z\" title=\"distribute Z\" @click=${this.onTapDistribute}> </span>\n `\n : this._dimension === '2d'\n ? html`\n <span class=\"vline\"></span>\n\n <span button id=\"front\" data-zorder=\"front\"\n title=\"bring to front (${this.getShortcutString('cmd', 'shift', 'f')})\" @click=${this.onTapZorder}> </span>\n <span button id=\"back\" data-zorder=\"back\"\n title=\"send to back (${this.getShortcutString('cmd', 'shift', 'b')})\" @click=${this.onTapZorder}> </span>\n <span button id=\"forward\" data-zorder=\"forward\"\n title=\"bring forward (${this.getShortcutString('cmd', 'f')})\" @click=${this.onTapZorder}> </span>\n <span button id=\"backward\" data-zorder=\"backward\"\n title=\"send backward (${this.getShortcutString('cmd', 'b')})\" @click=${this.onTapZorder}> </span>\n `\n : ''}\n\n ${this._dimension === '2d' ? html`\n <span class=\"vline\"></span>\n\n <span button id=\"group\" title=\"group (${this.getShortcutString('cmd', 'g')})\" @click=${this.onTapGroup}> </span>\n <span button id=\"ungroup\" title=\"ungroup (${this.getShortcutString('cmd', 'shift', 'g')})\" @click=${this.onTapUngroup}> </span>\n ` : this._dimension === '3d' ? html`\n <span class=\"vline\"></span>\n\n <span button class=\"gizmo-btn\" data-gizmo=\"translate\" title=\"Move (W)\"\n @click=${() => this._setGizmoMode('translate')}>\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <line x1=\"10\" y1=\"2\" x2=\"10\" y2=\"18\"/><line x1=\"2\" y1=\"10\" x2=\"18\" y2=\"10\"/>\n <polyline points=\"10,2 7.5,5\"/><polyline points=\"10,2 12.5,5\"/>\n <polyline points=\"18,10 15,7.5\"/><polyline points=\"18,10 15,12.5\"/>\n <polyline points=\"10,18 7.5,15\"/><polyline points=\"10,18 12.5,15\"/>\n <polyline points=\"2,10 5,7.5\"/><polyline points=\"2,10 5,12.5\"/>\n </svg>\n </span>\n <span button class=\"gizmo-btn\" data-gizmo=\"rotate\" title=\"Rotate (E)\"\n @click=${() => this._setGizmoMode('rotate')}>\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M14.5 3.5A7 7 0 1 0 17 10\"/>\n <polyline points=\"14,1 15,3.5 12.5,4.5\"/>\n </svg>\n </span>\n <span button class=\"gizmo-btn\" data-gizmo=\"scale\" title=\"Scale (R)\"\n @click=${() => this._setGizmoMode('scale')}>\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <line x1=\"4\" y1=\"16\" x2=\"16\" y2=\"4\"/>\n <rect x=\"2\" y=\"13\" width=\"4\" height=\"4\" rx=\"0.5\" fill=\"currentColor\"/>\n <rect x=\"14\" y=\"2\" width=\"4\" height=\"4\" rx=\"0.5\" fill=\"currentColor\"/>\n </svg>\n </span>\n ` : ''}\n\n <span class=\"vline\"></span>\n\n <span button id=\"font-increase\" title=\"increase font size\" @click=${this.onTapFontIncrease}></span>\n <span button id=\"font-decrease\" title=\"decrease font size\" style=\"scale: 0.7;\" @click=${this.onTapFontDecrease}></span>\n\n <span class=\"vline\"></span>\n <span>(v${process.env['APP-VERSION']})</span>\n <span padding></span>\n\n <span button id=\"fit-scene\" title=\"fit scene (${this.getShortcutString('cmd', 'd')})\" @click=${this.onTapFitScene}> </span>\n\n <span class=\"vline\"></span>\n\n <span button id=\"preview\" title=\"preview (${this.getShortcutString('ctrl', 'p')})\" @click=${this.onTapPreview}> </span>\n\n <span button id=\"fullscreen\" title=\"fullscreen (${this.getShortcutString('f11')})\" @click=${this.onTapFullscreen}> </span>\n\n <span button id=\"toggle-property\"\n title=\"toggle property panel (${this.getShortcutString('cmd', 'h')})\"\n toggles=\"true\" @click=${this.onTapToggle}> </span>\n </div>\n `\n }\n\n hasEmptySlot() {\n const slot = this.renderRoot.querySelector('slot') as HTMLSlotElement\n return slot?.assignedNodes().length === 0\n }\n\n onWheelEvent(e: Event) {\n var delta = Math.max(-1, Math.min(1, (e as WheelEvent).deltaY || -(e as WheelEvent).detail))\n this.scrollLeft -= delta * 40\n\n e.preventDefault()\n }\n\n getSymbol(key: string) {\n var symbol\n switch (key) {\n case 'cmd':\n case 'ctrl':\n symbol = MACOS ? '⌘' : 'Ctrl'\n break\n case 'shift':\n symbol = MACOS ? '⇧' : 'Shift'\n break\n case 'alt':\n case 'option':\n symbol = MACOS ? '⌥' : 'Alt'\n break\n case 'backspace':\n symbol = MACOS ? '⌫' : 'BackSpace'\n break\n case 'delete':\n symbol = MACOS ? '⌦' : 'Del'\n break\n default:\n symbol = key.toUpperCase()\n break\n }\n\n return symbol\n }\n\n private getShortcutString(...keys: string[]) {\n var symbols = []\n for (var i = 0; i < arguments.length; i++) {\n symbols.push(this.getSymbol(arguments[i]))\n }\n\n return symbols.join(MACOS ? '' : '+')\n }\n\n onShortcut(e: KeyboardEvent) {\n if (MACOS) var ctrlKey = e.metaKey\n else var ctrlKey = e.ctrlKey\n\n var altKey = e.altKey\n var shiftKey = e.shiftKey\n\n var defaultPrevent = ctrlKey || altKey\n\n switch (e.code) {\n case 'KeyZ':\n if (ctrlKey && !shiftKey) this.onTapUndo()\n else if (ctrlKey && shiftKey) this.onTapRedo()\n break\n case 'KeyY':\n if (ctrlKey && !shiftKey) this.onTapRedo()\n break\n case 'Digit1':\n if (ctrlKey) this.onStartStylePasteMode()\n break\n case 'Digit2':\n if (ctrlKey) this.onStartDatabindPasteMode()\n break\n case 'KeyC':\n if (ctrlKey && !shiftKey) this.onTapCopy()\n else if (altKey && shiftKey) this.onTapAlign('center')\n break\n case 'KeyX':\n if (ctrlKey && !shiftKey) this.onTapCut()\n break\n case 'KeyV':\n if (ctrlKey && shiftKey && !altKey) {\n // Ctrl+Shift+V = Bulk Paste (Paste Special 컨벤션) — 클립보드의\n // 단일 컴포넌트를 N개로 일괄 붙여넣기.\n this.onBulkPaste()\n defaultPrevent = true\n } else if (ctrlKey && !shiftKey) {\n this.onTapPaste()\n defaultPrevent = false\n } else if (altKey && shiftKey) this.onTapDistribute('VERTICAL')\n break\n case 'Delete':\n case 'Backspace':\n this.onTapDelete()\n defaultPrevent = true\n break\n case 'KeyG':\n if (this._dimension === '2d') {\n if (ctrlKey && !shiftKey) this.onTapGroup()\n else if (ctrlKey && shiftKey) this.onTapUngroup()\n }\n break\n case 'BracketRight':\n // Ctrl+] = Bring Forward, Ctrl+Shift+] = Bring to Front\n // (Photoshop / Illustrator 표준 컨벤션)\n if (this._dimension === '2d') {\n if (ctrlKey && !shiftKey) {\n this.scene?.zorder('forward')\n defaultPrevent = true\n } else if (ctrlKey && shiftKey) {\n this.scene?.zorder('front')\n defaultPrevent = true\n }\n }\n break\n case 'BracketLeft':\n // Ctrl+[ = Send Backward, Ctrl+Shift+[ = Send to Back\n if (this._dimension === '2d') {\n if (ctrlKey && !shiftKey) {\n this.scene?.zorder('backward')\n defaultPrevent = true\n } else if (ctrlKey && shiftKey) {\n this.scene?.zorder('back')\n defaultPrevent = true\n }\n }\n break\n case 'KeyB':\n // zorder 는 BracketLeft 로 이동. KeyB 의 Alt+Shift+B = align bottom 만 유지.\n if (altKey && shiftKey) this.onTapAlign('bottom')\n break\n case 'KeyH':\n if (ctrlKey && !shiftKey) this.onTapToggle()\n else if (altKey && shiftKey) this.onTapDistribute('HORIZONTAL')\n break\n case 'F11':\n this.onTapFullscreen()\n defaultPrevent = true\n break\n case 'KeyP':\n if (ctrlKey) {\n this.onTapPreview()\n defaultPrevent = true\n }\n break\n case 'KeyA':\n if (ctrlKey) this.onTapSelectAll()\n break\n case 'KeyL':\n if (altKey && shiftKey) this.onTapAlign('left')\n break\n case 'KeyR':\n if (altKey && shiftKey) this.onTapAlign('right')\n break\n case 'KeyM':\n if (altKey && shiftKey) this.onTapAlign('middle')\n break\n case 'KeyT':\n if (altKey && shiftKey) this.onTapAlign('top')\n break\n case 'KeyD':\n if (ctrlKey) {\n this.onTapFitScene()\n defaultPrevent = true\n }\n break\n case 'KeyE':\n if (ctrlKey && shiftKey) this.onTapDownloadModel()\n break\n\n case 'Escape':\n this.scene?.stopStylePasteMode()\n this.scene?.stopDatabindPasteMode()\n defaultPrevent = true\n break\n\n default:\n return false\n }\n\n if (defaultPrevent) e.preventDefault()\n return true\n }\n\n private _setDisabled(id: string, disabled: boolean) {\n const el = this.renderRoot.querySelector(`#${id}`)\n disabled ? el?.setAttribute('disabled', '') : el?.removeAttribute('disabled')\n }\n\n onExecute(command: string, undoable: boolean, redoable: boolean) {\n this._setDisabled('undo', !undoable)\n this._setDisabled('redo', !redoable)\n }\n\n onUndo(undoable: boolean, redoable: boolean) {\n this._setDisabled('undo', !undoable)\n this._setDisabled('redo', !redoable)\n }\n\n onRedo(undoable: boolean, redoable: boolean) {\n this._setDisabled('undo', !undoable)\n this._setDisabled('redo', !redoable)\n }\n\n onSceneChanged(after?: Scene, before?: Scene) {\n if (before) {\n before.off('execute', this.onExecute, this)\n before.off('undo', this.onUndo, this)\n before.off('redo', this.onRedo, this)\n before.off('dimension', this._onDimensionChanged, this)\n before.off('gizmoattach', this._onGizmoAttachChanged, this)\n }\n\n if (after) {\n after.on('execute', this.onExecute, this)\n after.on('undo', this.onUndo, this)\n after.on('redo', this.onRedo, this)\n after.on('dimension', this._onDimensionChanged, this)\n after.on('gizmoattach', this._onGizmoAttachChanged, this)\n\n // scene 설정 시 현재 dimension을 즉시 반영 (초기 이벤트를 놓친 경우 대비)\n const threed = (after as any).model_layer?.model?.threed\n this._dimension = threed ? '3d' : '2d'\n }\n }\n\n private _onDimensionChanged(dimension: '2d' | '3d') {\n this._dimension = dimension\n }\n\n private _onGizmoAttachChanged(isAttached: boolean) {\n this._gizmoAttached = isAttached\n }\n\n private _setGizmoMode(mode: 'translate' | 'rotate' | 'scale') {\n ;(this.scene?.root as any)?.setGizmoMode(mode)\n }\n\n onSelectedChanged(after: Component[], before: Component[]) {\n var hasSelection = after.length > 0\n var alignable = after.length > 1\n\n // 선택 필요 버튼\n ;['style-copy', 'databind-copy', 'cut', 'copy', 'delete'].forEach(id =>\n this._setDisabled(id, !hasSelection)\n )\n\n // 정렬 버튼\n this.renderRoot.querySelectorAll('[data-align]').forEach(el =>\n alignable ? el.removeAttribute('disabled') : el.setAttribute('disabled', '')\n )\n\n if (this._dimension === '2d') {\n var movable = after.length === 1\n\n /* forward, backward 이동은 한 컴포넌트만 가능하다. */\n this._setDisabled('forward', !movable)\n this._setDisabled('backward', !movable)\n\n /* 여러 컴포넌트는 front, back 이동이 가능하다. */\n this._setDisabled('front', !(alignable || movable))\n this._setDisabled('back', !(alignable || movable))\n }\n\n // 분배 버튼\n this.renderRoot.querySelectorAll('[data-distribute]').forEach(el =>\n alignable ? el.removeAttribute('disabled') : el.setAttribute('disabled', '')\n )\n\n if (this._dimension === '3d') {\n this.renderRoot.querySelectorAll('.gizmo-btn').forEach(btn => {\n hasSelection ? btn.removeAttribute('disabled') : btn.setAttribute('disabled', '')\n })\n }\n }\n\n onTapUndo() {\n this.scene?.undo()\n }\n\n onTapRedo() {\n this.scene?.redo()\n }\n\n onStartStylePasteMode() {\n if (this.selected?.length !== 1) return\n if (this.selected[0] === this.scene?.root) return\n this.scene?.startStylePasteMode()\n }\n\n onStartDatabindPasteMode() {\n if (this.selected?.length !== 1) return\n if (this.selected[0] === this.scene?.root) return\n this.scene?.startDatabindPasteMode()\n }\n\n onTapCut() {\n this.scene?.cut()\n }\n\n async onTapCopy() {\n var copied = this.scene?.copy()\n\n if (!copied) return\n\n await copyToClipboard(copied)\n this.cliped = copied\n }\n\n onTapPaste() {\n setTimeout(() => {\n this.cliped && this.scene?.paste(this.cliped)\n }, 100)\n }\n\n onTapDelete() {\n this.scene?.remove()\n }\n\n /**\n * 멀티 컴포넌트 일괄 붙여넣기 — Ctrl+Shift+V 진입점.\n *\n * 흐름:\n * 1. 클립보드 (this.cliped) 검증 — *단일* 컴포넌트만 허용\n * 2. scene.startBulkCreateMode → AddLayer 가 캔버스 위에 드래그 박스 그림\n * 3. 사용자가 영역 드래그 → Promise resolve({area, template})\n * ESC/취소 → Promise resolve(null)\n * 4. 영역이 결정되면 dialog 오픈\n */\n async onBulkPaste() {\n if (!this.cliped) {\n console.warn('bulk-paste: 먼저 Ctrl+C 로 컴포넌트를 복사하세요.')\n return\n }\n let parsed: any[]\n try {\n parsed = JSON.parse(this.cliped)\n } catch (e) {\n console.warn('bulk-paste: 클립보드 파싱 실패', e)\n return\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n console.warn('bulk-paste: 클립보드 비어있음')\n return\n }\n if (parsed.length > 1) {\n console.warn('bulk-paste: 단일 컴포넌트만 일괄 붙여넣기 가능. 다중은 일반 paste 사용.')\n return\n }\n\n const template = parsed[0]\n // bulk 모드 임을 시각 구분하기 위해 파란 점선 (일반 add 의 검정과 색만 차별).\n const result = await this.scene?.startBulkCreateMode(template, { boxStrokeStyle: '#2964c2' })\n if (result) {\n this._openBulkCreateDialog(template, result.area)\n }\n }\n\n private _openBulkCreateDialog(\n template: Record<string, any>,\n initialArea: { left: number; top: number; width: number; height: number }\n ) {\n const dialogEl = document.createElement('bulk-create-dialog') as BulkCreateDialog\n dialogEl.template = template\n dialogEl.initialArea = initialArea\n // 충돌 검사용 — scene 의 모든 컴포넌트 id 수집.\n // (scene.ids 는 indexMap 기반인데 fmsim 의 일부 컴포넌트는 indexMap 미등록\n // 되는 케이스가 있어 직접 컴포넌트 트리 walk.)\n const existingIds = new Set<string>()\n const collectIds = (comp: any) => {\n if (!comp) return\n const id = comp?.state?.id ?? comp?.model?.id\n if (typeof id === 'string' && id) existingIds.add(id)\n const children = comp.components || []\n for (const c of children) collectIds(c)\n }\n const root = (this.scene as any)?.root\n if (root) collectIds(root)\n dialogEl.existingIds = existingIds\n dialogEl.onConfirm = (models) => {\n const scene = this.scene\n if (!scene || !models.length) {\n popup?.close()\n return\n }\n // cliped 의 template model 자체에서 type-aware bounds 추출. things-scene 의\n // component.bounds (= path bounding box) 와 동일 결과를 model JSON 의\n // type-specific 필드 (width/height, rx/ry, points) 만으로 계산.\n const bounds = deriveBoundsFromModel(template)\n scene.undoableChange(() => {\n for (const m of models) {\n const cx = m.left + m.width / 2\n const cy = m.top + m.height / 2\n scene.add(m, {\n left: cx - bounds.width / 2,\n top: cy - bounds.height / 2,\n width: bounds.width,\n height: bounds.height\n })\n }\n })\n popup?.close()\n }\n dialogEl.onCancel = () => {\n popup?.close()\n }\n const popup = OxPopup.open({\n template: dialogEl,\n backdrop: true\n })\n }\n\n onTapSelectAll() {\n this.scene?.select('(child)')\n }\n\n onTapFontIncrease(e: TouchEvent) {\n var selected = this.scene?.selected\n if (!selected || !selected.length) {\n return\n }\n\n this.scene?.undoableChange(function () {\n selected!.forEach(function (component: Component) {\n var fontSize = component.get('fontSize')\n\n if (!fontSize) fontSize = '15'\n\n if (fontSize) {\n var size = parseInt(fontSize)\n component.set('fontSize', size + 1)\n }\n })\n })\n }\n\n onTapFontDecrease(e: TouchEvent) {\n var selected = this.scene?.selected\n\n if (!selected || !selected.length) {\n return\n }\n\n this.scene?.undoableChange(function () {\n selected!.forEach(function (component: Component) {\n var fontSize = component.get('fontSize')\n\n if (!fontSize) fontSize = '15'\n\n if (fontSize) {\n var size = parseInt(fontSize)\n if (size > 1) component.set('fontSize', size - 1)\n }\n })\n })\n }\n\n onTapAlign(e: TouchEvent | string) {\n if (!this.scene) return\n\n var selected = this.scene.selected\n\n var align = typeof e === 'string' ? e : (e.target as HTMLElement).getAttribute('data-align')\n if (!align) {\n return\n }\n\n if (selected.length <= 1) {\n this.scene.place(align)\n } else {\n this.scene.align(align)\n }\n }\n\n onTapZorder(e: TouchEvent | string) {\n if (!this.scene) return\n\n var selected = this.scene.selected\n if (selected.length < 1) return\n\n var zorder = typeof e === 'string' ? e : (e.target as HTMLElement).getAttribute('data-zorder')\n\n zorder && this.scene.zorder(zorder)\n }\n\n onTapGroup() {\n this.scene && this.scene.group()\n }\n\n onTapUngroup() {\n this.scene && this.scene.ungroup()\n }\n\n onTapFullscreen() {\n this.dispatchEvent(new CustomEvent('modeller-fullscreen'))\n }\n\n onTapToggle() {\n this.hideProperty = !this.hideProperty\n this.dispatchEvent(\n new CustomEvent('hide-property-changed', {\n bubbles: true,\n composed: true,\n detail: { value: this.hideProperty }\n })\n )\n }\n\n onTapFitScene() {\n if (this.scene) {\n this.scene.resize()\n this.scene.fit('ratio')\n }\n }\n\n onTapPreview() {\n this.dispatchEvent(new CustomEvent('open-preview'))\n }\n\n onTapDownloadModel() {\n this.dispatchEvent(new CustomEvent('download-model'))\n }\n\n onTapDistribute(e: TouchEvent | string) {\n if (!this.scene) return\n\n var selected = this.scene.selected\n if (selected.length <= 1) {\n return\n }\n\n var distribute = typeof e === 'string' ? e : (e.target as HTMLElement)!.getAttribute('data-distribute')\n\n distribute && this.scene.distribute(distribute)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"edit-toolbar.js","sourceRoot":"","sources":["../../../src/modeller/edit-toolbar.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { html, LitElement, PropertyValues } from 'lit'\nimport { property, state } from 'lit/decorators.js'\n\nimport { Component, Scene } from '@hatiolab/things-scene'\nimport { copyToClipboard, isMacOS } from '@operato/utils'\nimport { OxPopup } from '@operato/popup'\n\nimport { style } from './edit-toolbar-style'\nimport './bulk-create-dialog.js'\nimport type { BulkCreateDialog } from './bulk-create-dialog.js'\nimport { parentObjectForTemplate } from './property-sidebar/specifics/parent-object.js'\n\nconst MACOS = isMacOS()\n\n/**\n * 컴포넌트 model JSON 만으로 type-aware bounding box (width, height) 추출.\n *\n * things-scene 의 component.bounds 는 *path 의 bounding box* 인데, model JSON 만\n * 으로는 path 를 그릴 수 없으므로 type-specific 필드를 직접 본다.\n * - width/height 명시 (Rect, Container 등) → 그대로\n * - rx/ry (Ellipse 등) → 2*rx, 2*ry\n * - points 배열 (Line, Polygon 등) → 점들의 bounding box\n * - 그 외 → 50x50 fallback\n *\n * bulk-paste 가 영역 안에 N 개 복제할 때 *원본 크기를 보존* 하기 위해 사용.\n */\nfunction deriveBoundsFromModel(model: Record<string, any>): { width: number; height: number } {\n if (typeof model.width === 'number' && typeof model.height === 'number') {\n return { width: model.width, height: model.height }\n }\n if (typeof model.rx === 'number' && typeof model.ry === 'number') {\n return { width: 2 * Math.abs(model.rx), height: 2 * Math.abs(model.ry) }\n }\n if (Array.isArray(model.points) && model.points.length > 0) {\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n for (const p of model.points) {\n if (typeof p?.x === 'number') {\n if (p.x < minX) minX = p.x\n if (p.x > maxX) maxX = p.x\n }\n if (typeof p?.y === 'number') {\n if (p.y < minY) minY = p.y\n if (p.y > maxY) maxY = p.y\n }\n }\n if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {\n return { width: maxX - minX, height: maxY - minY }\n }\n }\n return { width: 50, height: 50 }\n}\n\nexport class EditToolbar extends LitElement {\n static styles = [style]\n\n @property({ type: Object }) scene?: Scene\n @property({ type: Array }) selected: any[] = []\n @property({ type: Boolean }) hideProperty: boolean = false\n\n @state() private _dimension: '2d' | '3d' | null = null\n @state() private _gizmoAttached = false\n\n private cliped?: string\n\n firstUpdated() {\n this.addEventListener('mousewheel', this.onWheelEvent.bind(this) as EventListener, false)\n\n // 툴바 버튼 클릭 후 씬으로 포커스를 돌려서 키보드 단축키가 계속 작동하도록 한다\n this.addEventListener('click', () => {\n ;(this.scene?.root as any)?.element?.focus()\n })\n\n window.addEventListener('paste', (e: Event) => {\n try {\n this.cliped = (e as ClipboardEvent).clipboardData?.getData('text/plain')\n } catch (e) {\n console.error('model paste failed', e)\n }\n })\n // 모든 버튼은 템플릿 @click 디렉티브로 바인딩 — 조건부 렌더링 시에도 정상 작동\n }\n\n updated(changes: PropertyValues<this>) {\n changes.has('scene') && this.onSceneChanged(this.scene, changes.get('scene') as Scene)\n changes.has('selected') && this.onSelectedChanged(this.selected, changes.get('selected') as Component[])\n }\n\n render() {\n return html`\n <div tools>\n <span><slot></slot></span>\n\n ${this.hasEmptySlot() ? html`` : html`<span class=\"vline\"></span>`}\n\n <span button id=\"undo\" title=\"undo (${this.getShortcutString('cmd', 'z')})\" @click=${this.onTapUndo}> </span>\n <span button id=\"redo\" title=\"redo (${this.getShortcutString('cmd', 'shift', 'z')})\" @click=${this.onTapRedo}> </span>\n\n <span class=\"vline\"></span>\n\n <span button id=\"style-copy\" title=\"style copy (${this.getShortcutString('cmd', '1')})\" @click=${this.onStartStylePasteMode}> </span>\n <span button id=\"databind-copy\" title=\"databind copy (${this.getShortcutString('cmd', '2')})\" @click=${this.onStartDatabindPasteMode}> </span>\n\n <span class=\"vline\"></span>\n\n <span button id=\"cut\" title=\"cut (${this.getShortcutString('cmd', 'x')})\" @click=${this.onTapCut}> </span>\n <span button id=\"copy\" title=\"copy (${this.getShortcutString('cmd', 'c')})\" @click=${this.onTapCopy}> </span>\n <span button id=\"paste\" title=\"paste (${this.getShortcutString('cmd', 'v')})\" @click=${this.onTapPaste}> </span>\n <span button id=\"delete\"\n title=\"delete (${this.getShortcutString('backspace')}, ${this.getShortcutString('delete')})\"\n @click=${this.onTapDelete}> </span>\n\n <span class=\"vline\"></span>\n\n <span button data-align=\"left\" id=\"align-left\"\n title=\"align left (${this.getShortcutString('alt', 'shift', 'l')})\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"center\" id=\"align-center\"\n title=\"align center (${this.getShortcutString('alt', 'shift', 'c')})\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"right\" id=\"align-right\"\n title=\"align right (${this.getShortcutString('alt', 'shift', 'r')})\" @click=${this.onTapAlign}> </span>\n\n <span button data-align=\"top\" id=\"align-top\"\n title=\"align top (${this.getShortcutString('alt', 'shift', 't')})\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"middle\" id=\"align-middle\"\n title=\"align middle (${this.getShortcutString('alt', 'shift', 'm')})\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"bottom\" id=\"align-bottom\"\n title=\"align bottom (${this.getShortcutString('alt', 'shift', 'b')})\" @click=${this.onTapAlign}> </span>\n\n <span button data-distribute=\"HORIZONTAL\" id=\"distribute-horizontal\"\n title=\"distribute horizontally (${this.getShortcutString('alt', 'shift', 'h')})\" @click=${this.onTapDistribute}> </span>\n <span button data-distribute=\"VERTICAL\" id=\"distribute-vertical\"\n title=\"distribute vertically (${this.getShortcutString('alt', 'shift', 'v')})\" @click=${this.onTapDistribute}> </span>\n\n ${this._dimension === '3d'\n ? html`\n <span class=\"vline\"></span>\n\n <span button data-align=\"z-front\" id=\"align-z-front\" title=\"align Z front\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"z-middle\" id=\"align-z-middle\" title=\"align Z middle\" @click=${this.onTapAlign}> </span>\n <span button data-align=\"z-back\" id=\"align-z-back\" title=\"align Z back\" @click=${this.onTapAlign}> </span>\n <span button data-distribute=\"Z\" id=\"distribute-z\" title=\"distribute Z\" @click=${this.onTapDistribute}> </span>\n `\n : this._dimension === '2d'\n ? html`\n <span class=\"vline\"></span>\n\n <span button id=\"front\" data-zorder=\"front\"\n title=\"bring to front (${this.getShortcutString('cmd', 'shift', 'f')})\" @click=${this.onTapZorder}> </span>\n <span button id=\"back\" data-zorder=\"back\"\n title=\"send to back (${this.getShortcutString('cmd', 'shift', 'b')})\" @click=${this.onTapZorder}> </span>\n <span button id=\"forward\" data-zorder=\"forward\"\n title=\"bring forward (${this.getShortcutString('cmd', 'f')})\" @click=${this.onTapZorder}> </span>\n <span button id=\"backward\" data-zorder=\"backward\"\n title=\"send backward (${this.getShortcutString('cmd', 'b')})\" @click=${this.onTapZorder}> </span>\n `\n : ''}\n\n ${this._dimension === '2d' ? html`\n <span class=\"vline\"></span>\n\n <span button id=\"group\" title=\"group (${this.getShortcutString('cmd', 'g')})\" @click=${this.onTapGroup}> </span>\n <span button id=\"ungroup\" title=\"ungroup (${this.getShortcutString('cmd', 'shift', 'g')})\" @click=${this.onTapUngroup}> </span>\n ` : this._dimension === '3d' ? html`\n <span class=\"vline\"></span>\n\n <span button class=\"gizmo-btn\" data-gizmo=\"translate\" title=\"Move (W)\"\n @click=${() => this._setGizmoMode('translate')}>\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <line x1=\"10\" y1=\"2\" x2=\"10\" y2=\"18\"/><line x1=\"2\" y1=\"10\" x2=\"18\" y2=\"10\"/>\n <polyline points=\"10,2 7.5,5\"/><polyline points=\"10,2 12.5,5\"/>\n <polyline points=\"18,10 15,7.5\"/><polyline points=\"18,10 15,12.5\"/>\n <polyline points=\"10,18 7.5,15\"/><polyline points=\"10,18 12.5,15\"/>\n <polyline points=\"2,10 5,7.5\"/><polyline points=\"2,10 5,12.5\"/>\n </svg>\n </span>\n <span button class=\"gizmo-btn\" data-gizmo=\"rotate\" title=\"Rotate (E)\"\n @click=${() => this._setGizmoMode('rotate')}>\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M14.5 3.5A7 7 0 1 0 17 10\"/>\n <polyline points=\"14,1 15,3.5 12.5,4.5\"/>\n </svg>\n </span>\n <span button class=\"gizmo-btn\" data-gizmo=\"scale\" title=\"Scale (R)\"\n @click=${() => this._setGizmoMode('scale')}>\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <line x1=\"4\" y1=\"16\" x2=\"16\" y2=\"4\"/>\n <rect x=\"2\" y=\"13\" width=\"4\" height=\"4\" rx=\"0.5\" fill=\"currentColor\"/>\n <rect x=\"14\" y=\"2\" width=\"4\" height=\"4\" rx=\"0.5\" fill=\"currentColor\"/>\n </svg>\n </span>\n ` : ''}\n\n <span class=\"vline\"></span>\n\n <span button id=\"font-increase\" title=\"increase font size\" @click=${this.onTapFontIncrease}></span>\n <span button id=\"font-decrease\" title=\"decrease font size\" style=\"scale: 0.7;\" @click=${this.onTapFontDecrease}></span>\n\n <span class=\"vline\"></span>\n <span>(v${process.env['APP-VERSION']})</span>\n <span padding></span>\n\n <span button id=\"fit-scene\" title=\"fit scene (${this.getShortcutString('cmd', 'd')})\" @click=${this.onTapFitScene}> </span>\n\n <span class=\"vline\"></span>\n\n <span button id=\"preview\" title=\"preview (${this.getShortcutString('ctrl', 'p')})\" @click=${this.onTapPreview}> </span>\n\n <span button id=\"fullscreen\" title=\"fullscreen (${this.getShortcutString('f11')})\" @click=${this.onTapFullscreen}> </span>\n\n <span button id=\"toggle-property\"\n title=\"toggle property panel (${this.getShortcutString('cmd', 'h')})\"\n toggles=\"true\" @click=${this.onTapToggle}> </span>\n </div>\n `\n }\n\n hasEmptySlot() {\n const slot = this.renderRoot.querySelector('slot') as HTMLSlotElement\n return slot?.assignedNodes().length === 0\n }\n\n onWheelEvent(e: Event) {\n var delta = Math.max(-1, Math.min(1, (e as WheelEvent).deltaY || -(e as WheelEvent).detail))\n this.scrollLeft -= delta * 40\n\n e.preventDefault()\n }\n\n getSymbol(key: string) {\n var symbol\n switch (key) {\n case 'cmd':\n case 'ctrl':\n symbol = MACOS ? '⌘' : 'Ctrl'\n break\n case 'shift':\n symbol = MACOS ? '⇧' : 'Shift'\n break\n case 'alt':\n case 'option':\n symbol = MACOS ? '⌥' : 'Alt'\n break\n case 'backspace':\n symbol = MACOS ? '⌫' : 'BackSpace'\n break\n case 'delete':\n symbol = MACOS ? '⌦' : 'Del'\n break\n default:\n symbol = key.toUpperCase()\n break\n }\n\n return symbol\n }\n\n private getShortcutString(...keys: string[]) {\n var symbols = []\n for (var i = 0; i < arguments.length; i++) {\n symbols.push(this.getSymbol(arguments[i]))\n }\n\n return symbols.join(MACOS ? '' : '+')\n }\n\n onShortcut(e: KeyboardEvent) {\n if (MACOS) var ctrlKey = e.metaKey\n else var ctrlKey = e.ctrlKey\n\n var altKey = e.altKey\n var shiftKey = e.shiftKey\n\n var defaultPrevent = ctrlKey || altKey\n\n switch (e.code) {\n case 'KeyZ':\n if (ctrlKey && !shiftKey) this.onTapUndo()\n else if (ctrlKey && shiftKey) this.onTapRedo()\n break\n case 'KeyY':\n if (ctrlKey && !shiftKey) this.onTapRedo()\n break\n case 'Digit1':\n if (ctrlKey) this.onStartStylePasteMode()\n break\n case 'Digit2':\n if (ctrlKey) this.onStartDatabindPasteMode()\n break\n case 'KeyC':\n if (ctrlKey && !shiftKey) this.onTapCopy()\n else if (altKey && shiftKey) this.onTapAlign('center')\n break\n case 'KeyX':\n if (ctrlKey && !shiftKey) this.onTapCut()\n break\n case 'KeyV':\n if (ctrlKey && shiftKey && !altKey) {\n // Ctrl+Shift+V = Bulk Paste (Paste Special 컨벤션) — 클립보드의\n // 단일 컴포넌트를 N개로 일괄 붙여넣기.\n this.onBulkPaste()\n defaultPrevent = true\n } else if (ctrlKey && !shiftKey) {\n this.onTapPaste()\n defaultPrevent = false\n } else if (altKey && shiftKey) this.onTapDistribute('VERTICAL')\n break\n case 'Delete':\n case 'Backspace':\n this.onTapDelete()\n defaultPrevent = true\n break\n case 'KeyG':\n if (this._dimension === '2d') {\n if (ctrlKey && !shiftKey) this.onTapGroup()\n else if (ctrlKey && shiftKey) this.onTapUngroup()\n }\n break\n case 'BracketRight':\n // Ctrl+] = Bring Forward, Ctrl+Shift+] = Bring to Front\n // (Photoshop / Illustrator 표준 컨벤션)\n if (this._dimension === '2d') {\n if (ctrlKey && !shiftKey) {\n this.scene?.zorder('forward')\n defaultPrevent = true\n } else if (ctrlKey && shiftKey) {\n this.scene?.zorder('front')\n defaultPrevent = true\n }\n }\n break\n case 'BracketLeft':\n // Ctrl+[ = Send Backward, Ctrl+Shift+[ = Send to Back\n if (this._dimension === '2d') {\n if (ctrlKey && !shiftKey) {\n this.scene?.zorder('backward')\n defaultPrevent = true\n } else if (ctrlKey && shiftKey) {\n this.scene?.zorder('back')\n defaultPrevent = true\n }\n }\n break\n case 'KeyB':\n // zorder 는 BracketLeft 로 이동. KeyB 의 Alt+Shift+B = align bottom 만 유지.\n if (altKey && shiftKey) this.onTapAlign('bottom')\n break\n case 'KeyH':\n if (ctrlKey && !shiftKey) this.onTapToggle()\n else if (altKey && shiftKey) this.onTapDistribute('HORIZONTAL')\n break\n case 'F11':\n this.onTapFullscreen()\n defaultPrevent = true\n break\n case 'KeyP':\n if (ctrlKey) {\n this.onTapPreview()\n defaultPrevent = true\n }\n break\n case 'KeyA':\n if (ctrlKey) this.onTapSelectAll()\n break\n case 'KeyL':\n if (altKey && shiftKey) this.onTapAlign('left')\n break\n case 'KeyR':\n if (altKey && shiftKey) this.onTapAlign('right')\n break\n case 'KeyM':\n if (altKey && shiftKey) this.onTapAlign('middle')\n break\n case 'KeyT':\n if (altKey && shiftKey) this.onTapAlign('top')\n break\n case 'KeyD':\n if (ctrlKey) {\n this.onTapFitScene()\n defaultPrevent = true\n }\n break\n case 'KeyE':\n if (ctrlKey && shiftKey) this.onTapDownloadModel()\n break\n\n case 'Escape':\n this.scene?.stopStylePasteMode()\n this.scene?.stopDatabindPasteMode()\n defaultPrevent = true\n break\n\n default:\n return false\n }\n\n if (defaultPrevent) e.preventDefault()\n return true\n }\n\n private _setDisabled(id: string, disabled: boolean) {\n const el = this.renderRoot.querySelector(`#${id}`)\n disabled ? el?.setAttribute('disabled', '') : el?.removeAttribute('disabled')\n }\n\n onExecute(command: string, undoable: boolean, redoable: boolean) {\n this._setDisabled('undo', !undoable)\n this._setDisabled('redo', !redoable)\n }\n\n onUndo(undoable: boolean, redoable: boolean) {\n this._setDisabled('undo', !undoable)\n this._setDisabled('redo', !redoable)\n }\n\n onRedo(undoable: boolean, redoable: boolean) {\n this._setDisabled('undo', !undoable)\n this._setDisabled('redo', !redoable)\n }\n\n onSceneChanged(after?: Scene, before?: Scene) {\n if (before) {\n before.off('execute', this.onExecute, this)\n before.off('undo', this.onUndo, this)\n before.off('redo', this.onRedo, this)\n before.off('dimension', this._onDimensionChanged, this)\n before.off('gizmoattach', this._onGizmoAttachChanged, this)\n }\n\n if (after) {\n after.on('execute', this.onExecute, this)\n after.on('undo', this.onUndo, this)\n after.on('redo', this.onRedo, this)\n after.on('dimension', this._onDimensionChanged, this)\n after.on('gizmoattach', this._onGizmoAttachChanged, this)\n\n // scene 설정 시 현재 dimension을 즉시 반영 (초기 이벤트를 놓친 경우 대비)\n const threed = (after as any).model_layer?.model?.threed\n this._dimension = threed ? '3d' : '2d'\n }\n }\n\n private _onDimensionChanged(dimension: '2d' | '3d') {\n this._dimension = dimension\n }\n\n private _onGizmoAttachChanged(isAttached: boolean) {\n this._gizmoAttached = isAttached\n }\n\n private _setGizmoMode(mode: 'translate' | 'rotate' | 'scale') {\n ;(this.scene?.root as any)?.setGizmoMode(mode)\n }\n\n onSelectedChanged(after: Component[], before: Component[]) {\n var hasSelection = after.length > 0\n var alignable = after.length > 1\n\n // 선택 필요 버튼\n ;['style-copy', 'databind-copy', 'cut', 'copy', 'delete'].forEach(id =>\n this._setDisabled(id, !hasSelection)\n )\n\n // 정렬 버튼\n this.renderRoot.querySelectorAll('[data-align]').forEach(el =>\n alignable ? el.removeAttribute('disabled') : el.setAttribute('disabled', '')\n )\n\n if (this._dimension === '2d') {\n var movable = after.length === 1\n\n /* forward, backward 이동은 한 컴포넌트만 가능하다. */\n this._setDisabled('forward', !movable)\n this._setDisabled('backward', !movable)\n\n /* 여러 컴포넌트는 front, back 이동이 가능하다. */\n this._setDisabled('front', !(alignable || movable))\n this._setDisabled('back', !(alignable || movable))\n }\n\n // 분배 버튼\n this.renderRoot.querySelectorAll('[data-distribute]').forEach(el =>\n alignable ? el.removeAttribute('disabled') : el.setAttribute('disabled', '')\n )\n\n if (this._dimension === '3d') {\n this.renderRoot.querySelectorAll('.gizmo-btn').forEach(btn => {\n hasSelection ? btn.removeAttribute('disabled') : btn.setAttribute('disabled', '')\n })\n }\n }\n\n onTapUndo() {\n this.scene?.undo()\n }\n\n onTapRedo() {\n this.scene?.redo()\n }\n\n onStartStylePasteMode() {\n if (this.selected?.length !== 1) return\n if (this.selected[0] === this.scene?.root) return\n this.scene?.startStylePasteMode()\n }\n\n onStartDatabindPasteMode() {\n if (this.selected?.length !== 1) return\n if (this.selected[0] === this.scene?.root) return\n this.scene?.startDatabindPasteMode()\n }\n\n onTapCut() {\n this.scene?.cut()\n }\n\n async onTapCopy() {\n var copied = this.scene?.copy()\n\n if (!copied) return\n\n await copyToClipboard(copied)\n this.cliped = copied\n }\n\n onTapPaste() {\n setTimeout(() => {\n this.cliped && this.scene?.paste(this.cliped)\n }, 100)\n }\n\n onTapDelete() {\n this.scene?.remove()\n }\n\n /**\n * 멀티 컴포넌트 일괄 붙여넣기 — Ctrl+Shift+V 진입점.\n *\n * 흐름:\n * 1. 클립보드 (this.cliped) 검증 — *단일* 컴포넌트만 허용\n * 2. scene.startBulkCreateMode → AddLayer 가 캔버스 위에 드래그 박스 그림\n * 3. 사용자가 영역 드래그 → Promise resolve({area, template})\n * ESC/취소 → Promise resolve(null)\n * 4. 영역이 결정되면 dialog 오픈\n */\n async onBulkPaste() {\n if (!this.cliped) {\n console.warn('bulk-paste: 먼저 Ctrl+C 로 컴포넌트를 복사하세요.')\n return\n }\n let parsed: any[]\n try {\n parsed = JSON.parse(this.cliped)\n } catch (e) {\n console.warn('bulk-paste: 클립보드 파싱 실패', e)\n return\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n console.warn('bulk-paste: 클립보드 비어있음')\n return\n }\n if (parsed.length > 1) {\n console.warn('bulk-paste: 단일 컴포넌트만 일괄 붙여넣기 가능. 다중은 일반 paste 사용.')\n return\n }\n\n const template = parsed[0]\n // bulk 모드 임을 시각 구분하기 위해 파란 점선 (일반 add 의 검정과 색만 차별).\n const result = await this.scene?.startBulkCreateMode(template, { boxStrokeStyle: '#2964c2' })\n if (result) {\n this._openBulkCreateDialog(template, result.area)\n }\n }\n\n private _openBulkCreateDialog(\n template: Record<string, any>,\n initialArea: { left: number; top: number; width: number; height: number }\n ) {\n const dialogEl = document.createElement('bulk-create-dialog') as BulkCreateDialog\n dialogEl.template = template\n dialogEl.initialArea = initialArea\n // 충돌 검사용 — scene 의 모든 컴포넌트 id 수집.\n // (scene.ids 는 indexMap 기반인데 fmsim 의 일부 컴포넌트는 indexMap 미등록\n // 되는 케이스가 있어 직접 컴포넌트 트리 walk.)\n const existingIds = new Set<string>()\n const collectIds = (comp: any) => {\n if (!comp) return\n const id = comp?.state?.id ?? comp?.model?.id\n if (typeof id === 'string' && id) existingIds.add(id)\n const children = comp.components || []\n for (const c of children) collectIds(c)\n }\n const root = (this.scene as any)?.root\n if (root) collectIds(root)\n dialogEl.existingIds = existingIds\n\n // parentObject 커스터마이징: template 타입이 ParentObjectMixin 이면 상위객체 선택 필드 노출.\n // 후보 리스트는 타입의 parentObjectTypes 기준으로 씬에서 수집 (속성창과 동일 로직 재사용).\n const { has, items } = parentObjectForTemplate(template, root)\n dialogEl.hasParentObject = has\n dialogEl.parentObjectItems = items\n\n dialogEl.onConfirm = (models) => {\n const scene = this.scene\n if (!scene || !models.length) {\n popup?.close()\n return\n }\n // cliped 의 template model 자체에서 type-aware bounds 추출. things-scene 의\n // component.bounds (= path bounding box) 와 동일 결과를 model JSON 의\n // type-specific 필드 (width/height, rx/ry, points) 만으로 계산.\n const bounds = deriveBoundsFromModel(template)\n scene.undoableChange(() => {\n for (const m of models) {\n const cx = m.left + m.width / 2\n const cy = m.top + m.height / 2\n scene.add(m, {\n left: cx - bounds.width / 2,\n top: cy - bounds.height / 2,\n width: bounds.width,\n height: bounds.height\n })\n }\n })\n popup?.close()\n }\n dialogEl.onCancel = () => {\n popup?.close()\n }\n const popup = OxPopup.open({\n template: dialogEl,\n backdrop: true,\n // 내부 입력(parentObject 검색 드롭다운 등)이 blur/focusout 될 때 팝업이 자동으로\n // 닫히지 않도록. 닫기는 OK/취소 버튼 또는 backdrop/Escape 로만.\n preventCloseOnBlur: true\n })\n }\n\n onTapSelectAll() {\n this.scene?.select('(child)')\n }\n\n onTapFontIncrease(e: TouchEvent) {\n var selected = this.scene?.selected\n if (!selected || !selected.length) {\n return\n }\n\n this.scene?.undoableChange(function () {\n selected!.forEach(function (component: Component) {\n var fontSize = component.get('fontSize')\n\n if (!fontSize) fontSize = '15'\n\n if (fontSize) {\n var size = parseInt(fontSize)\n component.set('fontSize', size + 1)\n }\n })\n })\n }\n\n onTapFontDecrease(e: TouchEvent) {\n var selected = this.scene?.selected\n\n if (!selected || !selected.length) {\n return\n }\n\n this.scene?.undoableChange(function () {\n selected!.forEach(function (component: Component) {\n var fontSize = component.get('fontSize')\n\n if (!fontSize) fontSize = '15'\n\n if (fontSize) {\n var size = parseInt(fontSize)\n if (size > 1) component.set('fontSize', size - 1)\n }\n })\n })\n }\n\n onTapAlign(e: TouchEvent | string) {\n if (!this.scene) return\n\n var selected = this.scene.selected\n\n var align = typeof e === 'string' ? e : (e.target as HTMLElement).getAttribute('data-align')\n if (!align) {\n return\n }\n\n if (selected.length <= 1) {\n this.scene.place(align)\n } else {\n this.scene.align(align)\n }\n }\n\n onTapZorder(e: TouchEvent | string) {\n if (!this.scene) return\n\n var selected = this.scene.selected\n if (selected.length < 1) return\n\n var zorder = typeof e === 'string' ? e : (e.target as HTMLElement).getAttribute('data-zorder')\n\n zorder && this.scene.zorder(zorder)\n }\n\n onTapGroup() {\n this.scene && this.scene.group()\n }\n\n onTapUngroup() {\n this.scene && this.scene.ungroup()\n }\n\n onTapFullscreen() {\n this.dispatchEvent(new CustomEvent('modeller-fullscreen'))\n }\n\n onTapToggle() {\n this.hideProperty = !this.hideProperty\n this.dispatchEvent(\n new CustomEvent('hide-property-changed', {\n bubbles: true,\n composed: true,\n detail: { value: this.hideProperty }\n })\n )\n }\n\n onTapFitScene() {\n if (this.scene) {\n this.scene.resize()\n this.scene.fit('ratio')\n }\n }\n\n onTapPreview() {\n this.dispatchEvent(new CustomEvent('open-preview'))\n }\n\n onTapDownloadModel() {\n this.dispatchEvent(new CustomEvent('download-model'))\n }\n\n onTapDistribute(e: TouchEvent | string) {\n if (!this.scene) return\n\n var selected = this.scene.selected\n if (selected.length <= 1) {\n return\n }\n\n var distribute = typeof e === 'string' ? e : (e.target as HTMLElement)!.getAttribute('data-distribute')\n\n distribute && this.scene.distribute(distribute)\n }\n}\n"]}
|
|
@@ -5,6 +5,7 @@ import { __decorate } from "tslib";
|
|
|
5
5
|
import '@operato/i18n/ox-i18n.js';
|
|
6
6
|
import { html, nothing } from 'lit';
|
|
7
7
|
import { property } from 'lit/decorators.js';
|
|
8
|
+
import { isThreedEnabled } from '@hatiolab/things-scene';
|
|
8
9
|
import { ScopedElementsMixin } from '@open-wc/scoped-elements';
|
|
9
10
|
import { AbstractProperty } from '../abstract-property.js';
|
|
10
11
|
import { PropertySharedStyle } from '../property-shared-style.js';
|
|
@@ -30,7 +31,7 @@ export class PropertyEffects extends ScopedElementsMixin(AbstractProperty) {
|
|
|
30
31
|
// 3D 그림자 편집은 단일 선택 + 3D 표현 가능한 컴포넌트에서만 노출.
|
|
31
32
|
// (material3d 는 컴포넌트별 객체라 다중 선택 일괄 병합은 위험 — 단일로 제한.)
|
|
32
33
|
const target = this.selected.length == 1 ? this.selected[0] : null;
|
|
33
|
-
const
|
|
34
|
+
const supports3d = !!((_a = target === null || target === void 0 ? void 0 : target.is3dish) === null || _a === void 0 ? void 0 : _a.call(target));
|
|
34
35
|
const material3d = value.material3d || {};
|
|
35
36
|
const castShadow = (_b = material3d.castShadow) !== null && _b !== void 0 ? _b : true;
|
|
36
37
|
const receiveShadow = (_c = material3d.receiveShadow) !== null && _c !== void 0 ? _c : false;
|
|
@@ -43,7 +44,7 @@ export class PropertyEffects extends ScopedElementsMixin(AbstractProperty) {
|
|
|
43
44
|
<property-shadow value-key="shadow" .value=${value.shadow || {}}> </property-shadow>
|
|
44
45
|
</fieldset>
|
|
45
46
|
|
|
46
|
-
${
|
|
47
|
+
${supports3d && isThreedEnabled()
|
|
47
48
|
? html `
|
|
48
49
|
<fieldset>
|
|
49
50
|
<legend>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/effects/effects.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,0BAA0B,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/effects/effects.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@operato/i18n/ox-i18n.js'\n\nimport { html, nothing } from 'lit'\nimport { property } from 'lit/decorators.js'\n\nimport { Component, Properties, Scene, isThreedEnabled } from '@hatiolab/things-scene'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\n\nimport { AbstractProperty } from '../abstract-property.js'\nimport { PropertySharedStyle } from '../property-shared-style.js'\nimport { PropertyEvent } from './property-event.js'\nimport { PropertyShadow } from './property-shadow.js'\n\nexport class PropertyEffects extends ScopedElementsMixin(AbstractProperty) {\n static styles = [PropertySharedStyle]\n\n @property({ type: Object }) value?: Properties\n @property({ type: Object }) scene?: Scene\n @property({ type: Array }) selected: Component[] = []\n\n firstUpdated() {\n this.renderRoot.addEventListener('change', this._onValueChange.bind(this))\n }\n\n static get scopedElements() {\n return {\n 'property-shadow': PropertyShadow,\n 'property-event': PropertyEvent\n }\n }\n\n render() {\n const value = this.value || {}\n\n // 3D 그림자 편집은 단일 선택 + 3D 표현 가능한 컴포넌트에서만 노출.\n // (material3d 는 컴포넌트별 객체라 다중 선택 일괄 병합은 위험 — 단일로 제한.)\n const target = this.selected.length == 1 ? (this.selected[0] as any) : null\n const supports3d = !!target?.is3dish?.()\n const material3d = (value.material3d as any) || {}\n const castShadow = material3d.castShadow ?? true\n const receiveShadow = material3d.receiveShadow ?? false\n\n return html`\n <fieldset>\n <legend>\n <ox-i18n topic=\"board-modeller/effects/shadow\" msgid=\"label.shadow\">shadow</ox-i18n>\n </legend>\n\n <property-shadow value-key=\"shadow\" .value=${value.shadow || {}}> </property-shadow>\n </fieldset>\n\n ${supports3d && isThreedEnabled()\n ? html`\n <fieldset>\n <legend>\n <ox-i18n topic=\"board-modeller/effects/shadow-3d\" msgid=\"label.shadow-3d\">3D shadow</ox-i18n>\n </legend>\n\n <div>\n <input\n id=\"cb-cast-shadow\"\n type=\"checkbox\"\n .checked=${castShadow}\n @change=${(e: Event) => this._onShadow3dChange('castShadow', e)}\n />\n <label for=\"cb-cast-shadow\">\n <ox-i18n msgid=\"label.cast-shadow\">cast shadow</ox-i18n>\n </label>\n\n <input\n id=\"cb-receive-shadow\"\n type=\"checkbox\"\n .checked=${receiveShadow}\n @change=${(e: Event) => this._onShadow3dChange('receiveShadow', e)}\n />\n <label for=\"cb-receive-shadow\">\n <ox-i18n msgid=\"label.receive-shadow\">receive shadow</ox-i18n>\n </label>\n </div>\n </fieldset>\n `\n : nothing}\n\n ${this.selected.length == 1\n ? html`\n <property-event\n value-key=\"eventHandlers\"\n .scene=${this.scene}\n .value=${value.eventHandlers || []}\n >\n </property-event>\n `\n : nothing}\n `\n }\n\n /**\n * 3D 그림자 토글 — material3d.castShadow / receiveShadow 만 갱신.\n *\n * material3d 는 단일 객체 속성이므로 기존 material3d 전체를 보존한 채 해당\n * 키만 덮어써 dispatch 한다 ({ castShadow } 만 보내면 set() 의 top-level shallow\n * merge 로 material3d 전체가 사라짐). value-key 를 두지 않아 AbstractProperty\n * 의 제너릭 change 핸들러는 이 입력을 무시한다.\n */\n private _onShadow3dChange(key: 'castShadow' | 'receiveShadow', e: Event) {\n const checked = (e.target as HTMLInputElement).checked\n const current = (this.value?.material3d as any) || {}\n\n this.dispatchEvent(\n new CustomEvent('property-change', {\n bubbles: true,\n composed: true,\n detail: { material3d: { ...current, [key]: checked } }\n })\n )\n }\n}\n"]}
|
|
@@ -81,6 +81,7 @@ export class OxInputEntityId extends LitElement {
|
|
|
81
81
|
render() {
|
|
82
82
|
return html `
|
|
83
83
|
<input
|
|
84
|
+
part="input"
|
|
84
85
|
.value=${this.value || ''}
|
|
85
86
|
placeholder=${this.placeholder}
|
|
86
87
|
autocomplete="off"
|
|
@@ -148,21 +149,27 @@ export class OxInputEntityId extends LitElement {
|
|
|
148
149
|
this._open = false;
|
|
149
150
|
return;
|
|
150
151
|
}
|
|
152
|
+
// 드롭다운이 열린 상태에서 처리하는 키는 부모(다이얼로그 confirm/cancel 등)로
|
|
153
|
+
// 전파되지 않도록 stopPropagation 한다. (Enter 로 항목 선택 시 다이얼로그가 닫히던 버그.)
|
|
151
154
|
if (e.key === 'ArrowDown') {
|
|
152
155
|
e.preventDefault();
|
|
156
|
+
e.stopPropagation();
|
|
153
157
|
this._activeIndex = (this._activeIndex + 1) % ids.length;
|
|
154
158
|
}
|
|
155
159
|
else if (e.key === 'ArrowUp') {
|
|
156
160
|
e.preventDefault();
|
|
161
|
+
e.stopPropagation();
|
|
157
162
|
this._activeIndex = (this._activeIndex - 1 + ids.length) % ids.length;
|
|
158
163
|
}
|
|
159
164
|
else if (e.key === 'Enter') {
|
|
165
|
+
e.preventDefault();
|
|
166
|
+
e.stopPropagation();
|
|
160
167
|
if (this._activeIndex >= 0) {
|
|
161
|
-
e.preventDefault();
|
|
162
168
|
this._commitValue(ids[this._activeIndex]);
|
|
163
169
|
}
|
|
164
170
|
}
|
|
165
171
|
else if (e.key === 'Escape') {
|
|
172
|
+
e.stopPropagation();
|
|
166
173
|
this._open = false;
|
|
167
174
|
this._activeIndex = -1;
|
|
168
175
|
}
|
|
@@ -173,14 +180,16 @@ export class OxInputEntityId extends LitElement {
|
|
|
173
180
|
this._commitValue(id);
|
|
174
181
|
}
|
|
175
182
|
_commitValue(id) {
|
|
176
|
-
var _a;
|
|
177
183
|
this.value = id;
|
|
178
184
|
this._open = false;
|
|
179
185
|
this._activeIndex = -1;
|
|
180
186
|
if (this._input)
|
|
181
187
|
this._input.value = id;
|
|
182
188
|
this._emitChange();
|
|
183
|
-
|
|
189
|
+
// NOTE: blur() 하지 않는다. null 로 blur 하면 relatedTarget=null 이 되어, 팝업 안에서
|
|
190
|
+
// 쓰일 때 OxPopup 의 focusout(밖으로 나감) 판정에 걸려 팝업이 통째로 닫혔다.
|
|
191
|
+
// 드롭다운은 _open=false 로 이미 닫히므로 blur 는 불필요하고, 선택 후 입력창에
|
|
192
|
+
// 포커스가 남는 편이 자연스럽다.
|
|
184
193
|
}
|
|
185
194
|
_emitChange() {
|
|
186
195
|
// 같은 값 재발행 skip (예: 드롭다운 선택 직후 blur 의 native change 중복)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-input-entity-id.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/shapes/ox-input-entity-id.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@operato/i18n/ox-i18n.js'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { searchFigureIds, filterFigureIds } from '@fmsim/api'\n\n/**\n * 컴포넌트 ID 입력기 — 자유 입력 + 타입별 백엔드(MCS) 검색 선택을 함께 제공.\n *\n * - 기존처럼 자유롭게 텍스트로 ID 를 입력할 수 있다 (commit = blur/Enter).\n * - input 에 *포커스가 가면* 아래로 검색 드롭다운이 펼쳐진다. `entityType`\n * (컴포넌트 타입) 으로 MCS 에 정의된 ID 후보를 조회한다.\n * - machine 타입 → 머신 id 가 1레벨 평면으로 (선택 가능)\n * - unit 타입 → machine 이 그룹 헤더, 그 아래 unit id 가 자식 (선택 가능).\n * 컴포넌트가 부모 machine 을 알면(`machine` prop) 그 머신으로 좁혀 조회.\n *\n * value-key=\"id\" 와 함께 property-grid 안에 두면, 이 host 가 `change`(bubbles+\n * composed) 를 발행하므로 AbstractProperty 제너릭 핸들러가 `element.value` 를\n * 읽어 property-change 로 전파한다.\n *\n * 등록: 패널 자식 커스텀 엘리먼트 컨벤션에 따라 전역 `@customElement` 가 아니라\n * 부모 패널(PropertyShapes)의 `scopedElements` 로 등록한다 (@open-wc/scoped-elements).\n */\nexport class OxInputEntityId extends LitElement {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n position: relative;\n display: flex;\n align-items: stretch;\n width: 100%;\n height: 100%;\n }\n\n input {\n flex: 1 1 auto;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n margin: 0;\n padding: var(--input-padding, 2px 4px);\n font: inherit;\n border: var(--property-sidebar-fieldset-border, 1px solid #ccc);\n }\n\n .dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n\n max-height: 220px;\n overflow-y: auto;\n\n margin-top: 2px;\n background: var(--md-sys-color-surface, #fff);\n border: 1px solid var(--md-sys-color-outline-variant, #c4c7c5);\n border-radius: 4px;\n box-shadow: 0 4px 10px rgba(0, 0, 0, 0.18);\n }\n\n .group-header {\n padding: 3px 8px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--md-sys-color-on-surface-variant, #777);\n background: var(--md-sys-color-surface-variant, #eef0f3);\n position: sticky;\n top: 0;\n }\n\n .item {\n padding: 4px 8px;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font: var(--property-sidebar-fieldset-label, 12px sans-serif);\n }\n\n /* unit 항목 (그룹 자식) 은 살짝 들여쓰기 */\n .item.child {\n padding-left: 18px;\n }\n\n .item:hover,\n .item.active {\n background: var(--md-sys-color-secondary-container, #d7e3ff);\n }\n\n .hint {\n padding: 6px 8px;\n color: var(--md-sys-color-on-surface-variant, #888);\n font-size: 11px;\n }\n `\n ]\n\n /** 현재 ID 값. */\n @property({ type: String }) value = ''\n /** 검색 조건 — 선택된 컴포넌트 타입 (예: 'STOCKER', 'AGV', 'Port'). */\n @property({ type: String }) entityType = ''\n /** 검색 조건 — 부모 machine id (unit 컴포넌트가 소속 machine 을 알 때). */\n @property({ type: String }) machine = ''\n /** machine 필수 타입(예: Port) — machine 없으면 조회하지 않는다 (후보 과다 방지). */\n @property({ type: Boolean }) requireMachine = false\n /** 백엔드 조회 대신 사용할 로컬 후보 리스트 (예: parentObject — 씬의 머신들). null 이면 백엔드 조회. */\n @property({ type: Array }) localItems: string[] | null = null\n @property({ type: String }) placeholder = ''\n\n @state() private _open = false\n /** 서버에서 받은 전체 후보 리스트 (포커스 시 1회 조회, 키워드 미적용). */\n @state() private _all: string[] = []\n @state() private _loading = false\n /** machine 필수인데 machine 미지정이라 조회를 보류한 상태. */\n @state() private _needMachine = false\n /** 선택 가능 항목 기준 active index. */\n @state() private _activeIndex = -1\n\n @query('input') private _input!: HTMLInputElement\n\n private _blurTimer?: ReturnType<typeof setTimeout>\n private _loadSeq = 0\n /** 마지막으로 발행한 값 — 같은 값 재발행(undo 중복) 방지. */\n private _lastEmitted?: string\n\n disconnectedCallback() {\n super.disconnectedCallback()\n clearTimeout(this._blurTimer)\n }\n\n updated(changed: PropertyValues) {\n // 열린 상태에서 조회 조건(타입/부모 머신)이 바뀌면 재조회 (예: 부모 머신을 방금 지정).\n if (this._open && (changed.has('entityType') || changed.has('machine') || changed.has('localItems'))) {\n this._load()\n }\n // 화살표 키로 active 항목 이동 시 항상 보이도록 드롭다운을 스크롤.\n if (changed.has('_activeIndex') && this._open && this._activeIndex >= 0) {\n const el = this.renderRoot.querySelector('.item.active') as HTMLElement | null\n el?.scrollIntoView({ block: 'nearest' })\n }\n }\n\n /**\n * 드롭다운 표시 항목 — 입력값(초기값 포함)으로 풀텍스트 로컬 필터.\n * 단, 매치가 0이면 전체 후보로 fallback (막다른 \"결과 없음\" 방지 — 예: committed\n * id 가 후보 형식과 달라 안 맞는 경우). 서버 재조회 없음.\n */\n private get _items(): string[] {\n if (!this._all.length) return []\n const filtered = filterFigureIds(this._all, this.value || '')\n return filtered.length ? filtered : this._all\n }\n\n /** 드롭다운에서 선택 가능한 id 들 (표시 순서). */\n private get _selectableIds(): string[] {\n return this._items\n }\n\n render() {\n return html`\n <input\n .value=${this.value || ''}\n placeholder=${this.placeholder}\n autocomplete=\"off\"\n @focus=${this._onFocus}\n @blur=${this._onBlur}\n @input=${this._onInput}\n @change=${this._onInputCommit}\n @keydown=${this._onKeydown}\n />\n ${this._open ? this._renderDropdown() : ''}\n `\n }\n\n private _renderDropdown() {\n if (this._needMachine) {\n return html`<div class=\"dropdown\">\n <div class=\"hint\"><ox-i18n msgid=\"text.need-parent-machine\">상위 머신을 먼저 지정하세요</ox-i18n></div>\n </div>`\n }\n if (this._loading) {\n return html`<div class=\"dropdown\"><div class=\"hint\"><ox-i18n msgid=\"text.searching\">searching…</ox-i18n></div></div>`\n }\n if (!this._items.length) {\n return html`<div class=\"dropdown\"><div class=\"hint\"><ox-i18n msgid=\"text.no-results\">no results</ox-i18n></div></div>`\n }\n\n return html`\n <div class=\"dropdown\">\n ${this._items.map(\n (id, idx) => html`\n <div\n class=\"item ${idx === this._activeIndex ? 'active' : ''}\"\n @mousedown=${(e: MouseEvent) => this._select(id, e)}\n >\n ${id}\n </div>\n `\n )}\n </div>\n `\n }\n\n private _onFocus() {\n clearTimeout(this._blurTimer)\n this._open = true\n this._activeIndex = -1\n this._load()\n }\n\n private _onBlur() {\n // 드롭다운 항목 mousedown 이 먼저 처리되도록 약간 지연 후 닫기\n this._blurTimer = setTimeout(() => {\n this._open = false\n this._activeIndex = -1\n }, 150)\n }\n\n private _onInput(e: Event) {\n this.value = (e.target as HTMLInputElement).value\n this._open = true\n this._activeIndex = -1\n }\n\n /** 자유 입력 commit (blur/Enter 의 native change) — 기존 free-text 동작 보존. */\n private _onInputCommit(e: Event) {\n this.value = (e.target as HTMLInputElement).value\n this._emitChange()\n }\n\n private _onKeydown(e: KeyboardEvent) {\n const ids = this._selectableIds\n if (!this._open || !ids.length) {\n if (e.key === 'Escape') this._open = false\n return\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n this._activeIndex = (this._activeIndex + 1) % ids.length\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n this._activeIndex = (this._activeIndex - 1 + ids.length) % ids.length\n } else if (e.key === 'Enter') {\n if (this._activeIndex >= 0) {\n e.preventDefault()\n this._commitValue(ids[this._activeIndex])\n }\n } else if (e.key === 'Escape') {\n this._open = false\n this._activeIndex = -1\n }\n }\n\n private _select(id: string, e: MouseEvent) {\n // mousedown 기본동작(blur) 막아 흐름 제어\n e.preventDefault()\n this._commitValue(id)\n }\n\n private _commitValue(id: string) {\n this.value = id\n this._open = false\n this._activeIndex = -1\n if (this._input) this._input.value = id\n this._emitChange()\n this._input?.blur()\n }\n\n private _emitChange() {\n // 같은 값 재발행 skip (예: 드롭다운 선택 직후 blur 의 native change 중복)\n if (this.value === this._lastEmitted) return\n this._lastEmitted = this.value\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n }\n\n /**\n * 후보 전체를 1회 조회 (포커스 시). keyword 는 보내지 않으며, 표시 필터는 _items\n * 게터가 로컬에서 처리한다. entityType(+unit 이면 machine) 만 서버로 보낸다.\n */\n private async _load() {\n // 로컬 리스트 모드(예: parentObject) — 백엔드 조회 없이 주어진 리스트 사용.\n if (this.localItems != null) {\n this._needMachine = false\n this._loading = false\n this._all = this.localItems\n return\n }\n if (!this.entityType) {\n this._all = []\n return\n }\n // machine 필수 타입(Port 등)인데 부모 머신 미지정 → 조회 보류 (후보 과다 방지).\n if (this.requireMachine && !this.machine) {\n this._all = []\n this._needMachine = true\n return\n }\n this._needMachine = false\n const seq = ++this._loadSeq\n this._loading = true\n try {\n const ids = await searchFigureIds(this.entityType, '', this.machine ? { machine: this.machine } : {})\n if (seq !== this._loadSeq) return // 더 최신 조회가 있으면 폐기\n this._all = ids\n } catch {\n if (seq === this._loadSeq) this._all = []\n } finally {\n if (seq === this._loadSeq) this._loading = false\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ox-input-entity-id.js","sourceRoot":"","sources":["../../../../../src/modeller/property-sidebar/shapes/ox-input-entity-id.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@operato/i18n/ox-i18n.js'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { searchFigureIds, filterFigureIds } from '@fmsim/api'\n\n/**\n * 컴포넌트 ID 입력기 — 자유 입력 + 타입별 백엔드(MCS) 검색 선택을 함께 제공.\n *\n * - 기존처럼 자유롭게 텍스트로 ID 를 입력할 수 있다 (commit = blur/Enter).\n * - input 에 *포커스가 가면* 아래로 검색 드롭다운이 펼쳐진다. `entityType`\n * (컴포넌트 타입) 으로 MCS 에 정의된 ID 후보를 조회한다.\n * - machine 타입 → 머신 id 가 1레벨 평면으로 (선택 가능)\n * - unit 타입 → machine 이 그룹 헤더, 그 아래 unit id 가 자식 (선택 가능).\n * 컴포넌트가 부모 machine 을 알면(`machine` prop) 그 머신으로 좁혀 조회.\n *\n * value-key=\"id\" 와 함께 property-grid 안에 두면, 이 host 가 `change`(bubbles+\n * composed) 를 발행하므로 AbstractProperty 제너릭 핸들러가 `element.value` 를\n * 읽어 property-change 로 전파한다.\n *\n * 등록: 패널 자식 커스텀 엘리먼트 컨벤션에 따라 전역 `@customElement` 가 아니라\n * 부모 패널(PropertyShapes)의 `scopedElements` 로 등록한다 (@open-wc/scoped-elements).\n */\nexport class OxInputEntityId extends LitElement {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n position: relative;\n display: flex;\n align-items: stretch;\n width: 100%;\n height: 100%;\n }\n\n input {\n flex: 1 1 auto;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n margin: 0;\n padding: var(--input-padding, 2px 4px);\n font: inherit;\n border: var(--property-sidebar-fieldset-border, 1px solid #ccc);\n }\n\n .dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n\n max-height: 220px;\n overflow-y: auto;\n\n margin-top: 2px;\n background: var(--md-sys-color-surface, #fff);\n border: 1px solid var(--md-sys-color-outline-variant, #c4c7c5);\n border-radius: 4px;\n box-shadow: 0 4px 10px rgba(0, 0, 0, 0.18);\n }\n\n .group-header {\n padding: 3px 8px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--md-sys-color-on-surface-variant, #777);\n background: var(--md-sys-color-surface-variant, #eef0f3);\n position: sticky;\n top: 0;\n }\n\n .item {\n padding: 4px 8px;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font: var(--property-sidebar-fieldset-label, 12px sans-serif);\n }\n\n /* unit 항목 (그룹 자식) 은 살짝 들여쓰기 */\n .item.child {\n padding-left: 18px;\n }\n\n .item:hover,\n .item.active {\n background: var(--md-sys-color-secondary-container, #d7e3ff);\n }\n\n .hint {\n padding: 6px 8px;\n color: var(--md-sys-color-on-surface-variant, #888);\n font-size: 11px;\n }\n `\n ]\n\n /** 현재 ID 값. */\n @property({ type: String }) value = ''\n /** 검색 조건 — 선택된 컴포넌트 타입 (예: 'STOCKER', 'AGV', 'Port'). */\n @property({ type: String }) entityType = ''\n /** 검색 조건 — 부모 machine id (unit 컴포넌트가 소속 machine 을 알 때). */\n @property({ type: String }) machine = ''\n /** machine 필수 타입(예: Port) — machine 없으면 조회하지 않는다 (후보 과다 방지). */\n @property({ type: Boolean }) requireMachine = false\n /** 백엔드 조회 대신 사용할 로컬 후보 리스트 (예: parentObject — 씬의 머신들). null 이면 백엔드 조회. */\n @property({ type: Array }) localItems: string[] | null = null\n @property({ type: String }) placeholder = ''\n\n @state() private _open = false\n /** 서버에서 받은 전체 후보 리스트 (포커스 시 1회 조회, 키워드 미적용). */\n @state() private _all: string[] = []\n @state() private _loading = false\n /** machine 필수인데 machine 미지정이라 조회를 보류한 상태. */\n @state() private _needMachine = false\n /** 선택 가능 항목 기준 active index. */\n @state() private _activeIndex = -1\n\n @query('input') private _input!: HTMLInputElement\n\n private _blurTimer?: ReturnType<typeof setTimeout>\n private _loadSeq = 0\n /** 마지막으로 발행한 값 — 같은 값 재발행(undo 중복) 방지. */\n private _lastEmitted?: string\n\n disconnectedCallback() {\n super.disconnectedCallback()\n clearTimeout(this._blurTimer)\n }\n\n updated(changed: PropertyValues) {\n // 열린 상태에서 조회 조건(타입/부모 머신)이 바뀌면 재조회 (예: 부모 머신을 방금 지정).\n if (this._open && (changed.has('entityType') || changed.has('machine') || changed.has('localItems'))) {\n this._load()\n }\n // 화살표 키로 active 항목 이동 시 항상 보이도록 드롭다운을 스크롤.\n if (changed.has('_activeIndex') && this._open && this._activeIndex >= 0) {\n const el = this.renderRoot.querySelector('.item.active') as HTMLElement | null\n el?.scrollIntoView({ block: 'nearest' })\n }\n }\n\n /**\n * 드롭다운 표시 항목 — 입력값(초기값 포함)으로 풀텍스트 로컬 필터.\n * 단, 매치가 0이면 전체 후보로 fallback (막다른 \"결과 없음\" 방지 — 예: committed\n * id 가 후보 형식과 달라 안 맞는 경우). 서버 재조회 없음.\n */\n private get _items(): string[] {\n if (!this._all.length) return []\n const filtered = filterFigureIds(this._all, this.value || '')\n return filtered.length ? filtered : this._all\n }\n\n /** 드롭다운에서 선택 가능한 id 들 (표시 순서). */\n private get _selectableIds(): string[] {\n return this._items\n }\n\n render() {\n return html`\n <input\n part=\"input\"\n .value=${this.value || ''}\n placeholder=${this.placeholder}\n autocomplete=\"off\"\n @focus=${this._onFocus}\n @blur=${this._onBlur}\n @input=${this._onInput}\n @change=${this._onInputCommit}\n @keydown=${this._onKeydown}\n />\n ${this._open ? this._renderDropdown() : ''}\n `\n }\n\n private _renderDropdown() {\n if (this._needMachine) {\n return html`<div class=\"dropdown\">\n <div class=\"hint\"><ox-i18n msgid=\"text.need-parent-machine\">상위 머신을 먼저 지정하세요</ox-i18n></div>\n </div>`\n }\n if (this._loading) {\n return html`<div class=\"dropdown\"><div class=\"hint\"><ox-i18n msgid=\"text.searching\">searching…</ox-i18n></div></div>`\n }\n if (!this._items.length) {\n return html`<div class=\"dropdown\"><div class=\"hint\"><ox-i18n msgid=\"text.no-results\">no results</ox-i18n></div></div>`\n }\n\n return html`\n <div class=\"dropdown\">\n ${this._items.map(\n (id, idx) => html`\n <div\n class=\"item ${idx === this._activeIndex ? 'active' : ''}\"\n @mousedown=${(e: MouseEvent) => this._select(id, e)}\n >\n ${id}\n </div>\n `\n )}\n </div>\n `\n }\n\n private _onFocus() {\n clearTimeout(this._blurTimer)\n this._open = true\n this._activeIndex = -1\n this._load()\n }\n\n private _onBlur() {\n // 드롭다운 항목 mousedown 이 먼저 처리되도록 약간 지연 후 닫기\n this._blurTimer = setTimeout(() => {\n this._open = false\n this._activeIndex = -1\n }, 150)\n }\n\n private _onInput(e: Event) {\n this.value = (e.target as HTMLInputElement).value\n this._open = true\n this._activeIndex = -1\n }\n\n /** 자유 입력 commit (blur/Enter 의 native change) — 기존 free-text 동작 보존. */\n private _onInputCommit(e: Event) {\n this.value = (e.target as HTMLInputElement).value\n this._emitChange()\n }\n\n private _onKeydown(e: KeyboardEvent) {\n const ids = this._selectableIds\n if (!this._open || !ids.length) {\n if (e.key === 'Escape') this._open = false\n return\n }\n // 드롭다운이 열린 상태에서 처리하는 키는 부모(다이얼로그 confirm/cancel 등)로\n // 전파되지 않도록 stopPropagation 한다. (Enter 로 항목 선택 시 다이얼로그가 닫히던 버그.)\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n e.stopPropagation()\n this._activeIndex = (this._activeIndex + 1) % ids.length\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n e.stopPropagation()\n this._activeIndex = (this._activeIndex - 1 + ids.length) % ids.length\n } else if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n if (this._activeIndex >= 0) {\n this._commitValue(ids[this._activeIndex])\n }\n } else if (e.key === 'Escape') {\n e.stopPropagation()\n this._open = false\n this._activeIndex = -1\n }\n }\n\n private _select(id: string, e: MouseEvent) {\n // mousedown 기본동작(blur) 막아 흐름 제어\n e.preventDefault()\n this._commitValue(id)\n }\n\n private _commitValue(id: string) {\n this.value = id\n this._open = false\n this._activeIndex = -1\n if (this._input) this._input.value = id\n this._emitChange()\n // NOTE: blur() 하지 않는다. null 로 blur 하면 relatedTarget=null 이 되어, 팝업 안에서\n // 쓰일 때 OxPopup 의 focusout(밖으로 나감) 판정에 걸려 팝업이 통째로 닫혔다.\n // 드롭다운은 _open=false 로 이미 닫히므로 blur 는 불필요하고, 선택 후 입력창에\n // 포커스가 남는 편이 자연스럽다.\n }\n\n private _emitChange() {\n // 같은 값 재발행 skip (예: 드롭다운 선택 직후 blur 의 native change 중복)\n if (this.value === this._lastEmitted) return\n this._lastEmitted = this.value\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))\n }\n\n /**\n * 후보 전체를 1회 조회 (포커스 시). keyword 는 보내지 않으며, 표시 필터는 _items\n * 게터가 로컬에서 처리한다. entityType(+unit 이면 machine) 만 서버로 보낸다.\n */\n private async _load() {\n // 로컬 리스트 모드(예: parentObject) — 백엔드 조회 없이 주어진 리스트 사용.\n if (this.localItems != null) {\n this._needMachine = false\n this._loading = false\n this._all = this.localItems\n return\n }\n if (!this.entityType) {\n this._all = []\n return\n }\n // machine 필수 타입(Port 등)인데 부모 머신 미지정 → 조회 보류 (후보 과다 방지).\n if (this.requireMachine && !this.machine) {\n this._all = []\n this._needMachine = true\n return\n }\n this._needMachine = false\n const seq = ++this._loadSeq\n this._loading = true\n try {\n const ids = await searchFigureIds(this.entityType, '', this.machine ? { machine: this.machine } : {})\n if (seq !== this._loadSeq) return // 더 최신 조회가 있으면 폐기\n this._all = ids\n } catch {\n if (seq === this._loadSeq) this._all = []\n } finally {\n if (seq === this._loadSeq) this._loading = false\n }\n }\n}\n"]}
|
|
@@ -9,6 +9,7 @@ import '@operato/i18n/ox-i18n.js';
|
|
|
9
9
|
import { css, html } from 'lit';
|
|
10
10
|
import { property } from 'lit/decorators.js';
|
|
11
11
|
import { keyed } from 'lit/directives/keyed.js';
|
|
12
|
+
import { isThreedEnabled } from '@hatiolab/things-scene';
|
|
12
13
|
import { ScopedElementsMixin } from '@open-wc/scoped-elements';
|
|
13
14
|
import { AbstractProperty } from '../abstract-property';
|
|
14
15
|
import { PropertySharedStyle } from '../property-shared-style';
|
|
@@ -104,11 +105,25 @@ export class PropertyShapes extends ScopedElementsMixin(AbstractProperty) {
|
|
|
104
105
|
${this.selected.length && this.selected[0].isRootModel()
|
|
105
106
|
? html ``
|
|
106
107
|
: html `
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
${isThreedEnabled()
|
|
109
|
+
? html `
|
|
110
|
+
<label class="depth"> <ox-i18n msgid="label.depth">depth</ox-i18n> </label>
|
|
111
|
+
<input
|
|
112
|
+
type="number"
|
|
113
|
+
value-key="depth"
|
|
114
|
+
.value=${String((_a = value.depth) !== null && _a !== void 0 ? _a : '')}
|
|
115
|
+
placeholder="auto"
|
|
116
|
+
/>
|
|
117
|
+
|
|
118
|
+
<label class="zPos"> <ox-i18n msgid="label.zPos">zPos</ox-i18n> </label>
|
|
119
|
+
<input
|
|
120
|
+
type="number"
|
|
121
|
+
value-key="zPos"
|
|
122
|
+
.value=${String((_b = value.zPos) !== null && _b !== void 0 ? _b : '')}
|
|
123
|
+
placeholder="auto"
|
|
124
|
+
/>
|
|
125
|
+
`
|
|
126
|
+
: html ``}
|
|
112
127
|
|
|
113
128
|
<label class="rotate"> <ox-i18n msgid="label.rotate">rotate</ox-i18n> </label>
|
|
114
129
|
<ox-input-angle value-key="rotation" .value=${value.rotation}> </ox-input-angle>
|
|
@@ -202,25 +217,26 @@ export class PropertyShapes extends ScopedElementsMixin(AbstractProperty) {
|
|
|
202
217
|
<option value="height">height</option>
|
|
203
218
|
</select>
|
|
204
219
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
220
|
+
${isThreedEnabled()
|
|
221
|
+
? html `
|
|
222
|
+
<div class="checkbox-row">
|
|
223
|
+
<input id="cb-threed" type="checkbox" value-key="threed" .checked=${!!value.threed} />
|
|
224
|
+
<label for="cb-threed"><ox-i18n msgid="label.start-in-3d">Start in 3D</ox-i18n></label>
|
|
225
|
+
</div>
|
|
226
|
+
|
|
227
|
+
<div class="checkbox-row">
|
|
228
|
+
<input
|
|
229
|
+
id="cb-floor-constraint"
|
|
230
|
+
type="checkbox"
|
|
231
|
+
value-key="cameraFloorConstraint"
|
|
232
|
+
.checked=${!!value.cameraFloorConstraint}
|
|
233
|
+
/>
|
|
234
|
+
<label for="cb-floor-constraint">
|
|
235
|
+
<ox-i18n msgid="label.keep-above-ground">Keep Above Ground</ox-i18n>
|
|
236
|
+
</label>
|
|
237
|
+
</div>
|
|
238
|
+
`
|
|
239
|
+
: html ``}
|
|
224
240
|
|
|
225
241
|
<div class="checkbox-row">
|
|
226
242
|
<input id="cb-id-lookup" type="checkbox" value-key="idLookup" .checked=${value.idLookup !== false} />
|