import type {ButtonGroupColors, ButtonConfig} from '../components/button-group/index.type'; import {Toolbar} from '../components/button-group/toolbar'; import {BimComponent} from '../core/component'; import type {BimEngine} from '../bim-engine'; import {BimButtonGroup} from "../components/button-group"; import {BimTree} from "../components/tree"; import {TreeNodeConfig} from "../components/tree/types.ts"; import {BimDialog} from "../components/dialog"; const MOCK_STRUCT_DATA: TreeNodeConfig[] =[ { id: 'root', label: '全部构件', expanded: true, clickAction: 'expand', children: [ { id: 'level-1', label: '一层', expanded: false, icon:'', clickAction: 'expand', children: [ { id: 'l1-wall', label: '墙体(128)'}, { id: 'l1-column', label: '柱(46)' }, { id: 'l1-beam', label: '梁(82)' }, { id: 'l1-slab', label: '楼板(12)' }, { id: 'l1-door', label: '门(24)' }, { id: 'l1-window', label: '窗(36)' } ] }, { id: 'level-2', label: '二层', expanded: false, clickAction: 'expand', children: [ { id: 'l2-wall', label: '墙体(141)' }, { id: 'l2-column', label: '柱(52)' }, { id: 'l2-beam', label: '梁(90)' }, { id: 'l2-slab', label: '楼板(12)' }, { id: 'l2-door', label: '门(18)' }, { id: 'l2-window', label: '窗(40)' } ] }, { id: 'level-3', label: '三层', expanded: false, clickAction: 'expand', children: [ { id: 'l3-wall', label: '墙体(136)' }, { id: 'l3-column', label: '柱(48)' }, { id: 'l3-beam', label: '梁(88)' }, { id: 'l3-slab', label: '楼板(12)' }, { id: 'l3-door', label: '门(16)' }, { id: 'l3-window', label: '窗(38)' } ] }, { id: 'level-roof', label: '屋面层', expanded: false, clickAction: 'expand', children: [ { id: 'rf-slab', label: '屋面板(6)' }, { id: 'rf-beam', label: '屋面梁(24)' }, { id: 'rf-parapet', label: '女儿墙(18)' } ] } ] } ]; /** * 底部工具栏管理器 (ToolbarManager) * 仅负责管理底部工具栏实例。 */ export class ConstructTreeManagerBtn extends BimComponent { private toolbar: Toolbar | null = null; private toolbarContainer: HTMLElement | null = null; private container: HTMLElement; private dialog: BimDialog | null = null; constructor(engine: BimEngine, container: HTMLElement) { super(engine); this.container = container; this.init(); } private init() { // 创建底部工具栏专用容器 this.toolbarContainer = document.createElement('div'); this.toolbarContainer.id = 'bim-construct-tree'; this.container.appendChild(this.toolbarContainer); this.toolbar = new BimButtonGroup({ container: this.toolbarContainer, showLabel: false, direction: 'column', position: 'top-left', // 底部居中 align: 'vertical', // 图标在上 expand: 'up' // 向上展开 }); this.toolbar.init(); this.toolbar.setEngine(this.engine); this.toolbar.addGroup('construct-tree'); this.toolbar.addButton({ id: 'construct-tree-btn', groupId: 'construct-tree', type: 'button', label: 'construct-tree', icon: '', onClick: () => { this.openConstructTreeDialog() } }); this.toolbar.render(); } public openConstructTreeDialog() { this.setVisible(false) const tree = new BimTree({ data: MOCK_STRUCT_DATA, checkable: true, indent: 0, enableSearch: true, checkStrictly: true, defaultExpandAll: true, renderActions:(_node)=>{ return '' }, onNodeCheck: (node) => { console.log('onNodeCheck', node); }, onNodeSelect: (node) => { console.log('onNodeSelect', node); }, onNodeExpand: (node) => { console.log('onNodeExpand', node); this.dialog?.fitWidth() }, }); tree.init(); this.dialog = this.engine.dialog!.create({ title: 'constructTree.title', minWidth: 300, height: 400, content: tree.element, position: {x: 20, y: 20}, resizable: false, // 关键:绑定生命周期 onClose: () => { this.setVisible(true) } }); this.dialog?.fitWidth() } public refresh() { this.toolbar?.render(); } public destroy() { this.toolbar?.destroy(); this.toolbar = null; } // --- 转发 API --- public addGroup(groupId: string, beforeGroupId?: string) { this.toolbar?.addGroup(groupId, beforeGroupId); this.toolbar?.render(); } public addButton(config: ButtonConfig) { this.toolbar?.addButton(config); this.toolbar?.render(); } public setButtonVisibility(id: string, v: boolean) { this.toolbar?.updateButtonVisibility(id, v); } public setShowLabel(show: boolean) { this.toolbar?.setShowLabel(show); } public setVisible(visible: boolean) { if (this.toolbarContainer) { this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden'; } } public setBackgroundColor(color: string) { this.toolbar?.setBackgroundColor(color); } public setColors(colors: ButtonGroupColors) { this.toolbar?.setColors(colors); } }