You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.8 KiB
72 lines
1.8 KiB
import { Graph, register, Rect, ExtensionCategory } from '@antv/g6'; |
|
import { DeviceType, NODE_SIZE } from "./index"; |
|
|
|
|
|
// const typeToIconMap = Object.entries(DeviceType).filter(([key, value]) => typeof value === 'number') |
|
// console.log(typeToIconMap) |
|
|
|
export default class UserCardNode extends Rect { |
|
get nodeData() { |
|
return this.context.graph.getNodeData(this.id); |
|
} |
|
|
|
get data() { |
|
return this.nodeData.data || {}; |
|
} |
|
|
|
// 用户名样式 |
|
|
|
|
|
drawNameShape(attributes: any, container: any) { |
|
if (!this.data.name) return; |
|
const getUsernameStyle = (attributes: any) => { |
|
return { |
|
x: -14, |
|
text: this.data.name || '', |
|
// fontSize: 12, |
|
width: 20, |
|
fill: '#262626', |
|
fontWeight: 'bold', |
|
textAlign: 'left', |
|
textBaseline: 'middle', |
|
maxWidth: 80, // 限制最大宽度 |
|
ellipsis: true, // 超出显示 ... |
|
}; |
|
} |
|
|
|
const usernameStyle = getUsernameStyle(attributes); |
|
this.upsert('username', 'text', usernameStyle, container); |
|
} |
|
|
|
|
|
// 头像样式 |
|
getAvatarStyle(attributes: any) { |
|
const [width, height] = this.getSize(attributes); |
|
const type = this!.data!.type |
|
return { |
|
x: -width / 2 + 4, |
|
y: -height / 2 + 6, |
|
width: 24, |
|
height: 24, |
|
src: typeToIconMap[type as keyof typeof type] || '', |
|
}; |
|
} |
|
|
|
drawAvatarShape(attributes: any, container: any) { |
|
if (!this.data.typeString) return; |
|
|
|
const avatarStyle = this.getAvatarStyle(attributes); |
|
this.upsert('avatar', 'image', avatarStyle, container); |
|
} |
|
|
|
|
|
render(attributes: any, container: any) { |
|
// 渲染基础矩形 |
|
super.render(attributes, container); |
|
|
|
this.drawAvatarShape(attributes, container); |
|
this.drawNameShape(attributes, container); |
|
} |
|
} |
|
|
|
|
|
|