同步代码

This commit is contained in:
fan 2023-07-17 09:15:35 +08:00
parent 28ffe0f52b
commit 87aa370787
3 changed files with 76 additions and 55 deletions

@ -1 +1 @@
Subproject commit 0a7e6144bad3d943b5adfec4595c70209d8b1127 Subproject commit 6899504fef7c623a9539905812aba3a93a58395f

View File

@ -212,16 +212,11 @@ export class ContextMenu extends Container {
// this.initTitle(); // this.initTitle();
this.groups = []; this.groups = [];
const options = this.menuOptions; const options = this.menuOptions;
let maxItemWidth = 0;
let borderHeight = 0;
options.groups.forEach((group) => { options.groups.forEach((group) => {
const menuGroup = new MenuGroup(this, group); const menuGroup = new MenuGroup(this, group);
this.groups.push(menuGroup); this.groups.push(menuGroup);
borderHeight += menuGroup.totalHeight;
if (menuGroup.maxWidth > maxItemWidth) {
maxItemWidth = menuGroup.maxWidth;
}
}); });
const { borderHeight, maxItemWidth } = this.calculateBorderInfo();
const splitLineWidth = 1; const splitLineWidth = 1;
@ -293,20 +288,40 @@ export class ContextMenu extends Container {
} }
} }
private calculateBorderInfo(): {
borderHeight: number;
maxItemWidth: number;
} {
let maxItemNameWidth = 0;
let maxShortcutWidth = 0;
let maxGutter = 0;
let borderHeight = 0;
this.groups.forEach((menuGroup) => {
borderHeight += menuGroup.totalHeight;
const maxInw = menuGroup.maxItemNameWidth;
if (maxInw > maxItemNameWidth) {
maxItemNameWidth = maxInw;
}
const maxSw = menuGroup.maxShortcutWidth;
if (maxSw > maxShortcutWidth) {
maxShortcutWidth = maxSw;
}
const gutter = menuGroup.totalGutter;
if (gutter > maxGutter) {
maxGutter = gutter;
}
});
const maxItemWidth = maxItemNameWidth + maxShortcutWidth + maxGutter;
return { borderHeight, maxItemWidth };
}
updateBg() { updateBg() {
this.bg.clear(); this.bg.clear();
const options = this.menuOptions; const options = this.menuOptions;
let maxItemWidth = 0; const { borderHeight, maxItemWidth } = this.calculateBorderInfo();
let borderHeight = 0;
const splitLineWidth = 1; const splitLineWidth = 1;
this.groups.forEach((menuGroup) => {
borderHeight += menuGroup.totalHeight;
if (menuGroup.maxWidth > maxItemWidth) {
maxItemWidth = menuGroup.maxWidth;
}
});
const bgWidth = maxItemWidth + this.padding * 2; const bgWidth = maxItemWidth + this.padding * 2;
const bgHeight = const bgHeight =
borderHeight + borderHeight +
@ -350,8 +365,12 @@ export class ContextMenu extends Container {
} }
update() { update() {
this.groups.forEach((group) => group.update()); if (this.menuOptions.groups.length !== this.groups.length) {
this.updateBg(); this.init();
} else {
this.groups.forEach((group) => group.update());
this.updateBg();
}
} }
public get menuName(): string { public get menuName(): string {
@ -426,10 +445,14 @@ class MenuGroup extends Container {
super(); super();
this.config = config; this.config = config;
this.menu = menu; this.menu = menu;
config.items.forEach((item) => { this.init();
this.items.push(new ContextMenuItem(menu, item)); }
});
private init() {
this.items = []; // 清空
this.config.items.forEach((item) => {
this.items.push(new ContextMenuItem(this.menu, item));
});
this.addChild(...this.items); this.addChild(...this.items);
} }
@ -443,22 +466,24 @@ class MenuGroup extends Container {
return false; return false;
} }
public get maxWidth(): number { public get maxItemNameWidth(): number {
const maxNameWidth = this.items const maxNameWidth = this.items
.map((item) => item.nameBounds.width) .map((item) => item.nameBounds.width)
.sort((a, b) => a - b) .sort((a, b) => a - b)
.reverse()[0]; .reverse()[0];
return maxNameWidth;
}
public get maxShortcutWidth(): number {
const maxShortcutWidth = this.items const maxShortcutWidth = this.items
.map((item) => item.shortcutKeyBounds.width) .map((item) => item.shortcutKeyBounds.width)
.sort((a, b) => a - b) .sort((a, b) => a - b)
.reverse()[0]; .reverse()[0];
const maxWidth = return maxShortcutWidth;
maxNameWidth + }
this.gutter +
maxShortcutWidth + public get totalGutter(): number {
this.items[0].paddingLeft + return this.gutter + this.items[0].paddingLeft + this.items[0].paddingRight;
this.items[0].paddingRight;
return maxWidth;
} }
public get totalHeight(): number { public get totalHeight(): number {
@ -468,21 +493,18 @@ class MenuGroup extends Container {
} }
update() { update() {
let i = 0; if (this.items.length !== this.config.items.length) {
this.items.forEach((item) => { this.init();
item.update(); } else {
if (item.visible) { let i = 0;
item.position.y = i * item.totalHeight; this.items.forEach((item) => {
i++; item.update();
} if (item.visible) {
}); item.position.y = i * item.totalHeight;
// this.items.forEach() i++;
// for (let i = 0; i < this.items.length; i++) { }
// const item = this.items[i]; });
// if (item.visible) { }
// item.position.y = i * item.totalHeight;
// }
// }
} }
updateItemBox(maxItemWidth: number) { updateItemBox(maxItemWidth: number) {
@ -557,7 +579,7 @@ class ContextMenuItem extends Container {
this.config.handler(); this.config.handler();
this.menu.plugin.app.emit('post-menu-handle', this.config); this.menu.plugin.app.emit('post-menu-handle', this.config);
} }
if (!this.config.subMenu || this.config.subMenu.length === 0) { if (!this.config.subMenu || this.config.subMenu.groups.length === 0) {
this.active = false; this.active = false;
this.menu.active = false; this.menu.active = false;
this.menu.rootMenu.close(); this.menu.rootMenu.close();
@ -684,20 +706,13 @@ class ContextMenuItem extends Container {
} }
initSubMenu() { initSubMenu() {
if (this.config.subMenu && this.config.subMenu.length > 0) { if (this.config.subMenu && this.config.subMenu.groups.length > 0) {
this.arrowText = new Text('>', { this.arrowText = new Text('>', {
fontSize: this.fontSize, fontSize: this.fontSize,
fill: this.fontColor, fill: this.fontColor,
}); });
this.addChild(this.arrowText); this.addChild(this.arrowText);
this.subMenu = new ContextMenu( this.subMenu = new ContextMenu(this.config.subMenu, this);
{
name: `${this.config.name}子菜单`,
groups: this.config.subMenu,
style: this.menu.style,
},
this
);
} }
} }
@ -767,6 +782,12 @@ class ContextMenuItem extends Container {
this.initShortcutKeyText(); this.initShortcutKeyText();
} }
if (this.config.subMenu == undefined && this.subMenu) {
this.subMenu = undefined;
} else if (this.config.subMenu && this.subMenu == undefined) {
this.initSubMenu();
}
if (this.subMenu) { if (this.subMenu) {
this.subMenu.update(); this.subMenu.update();
} }

View File

@ -101,7 +101,7 @@ export interface MenuItemOptions {
/** /**
* *
*/ */
subMenu?: MenuGroupOptions[]; subMenu?: MenuOptions;
} }
export interface MenuItemStyle { export interface MenuItemStyle {