同步代码
This commit is contained in:
parent
28ffe0f52b
commit
87aa370787
@ -1 +1 @@
|
|||||||
Subproject commit 0a7e6144bad3d943b5adfec4595c70209d8b1127
|
Subproject commit 6899504fef7c623a9539905812aba3a93a58395f
|
@ -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,9 +365,13 @@ export class ContextMenu extends Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
|
if (this.menuOptions.groups.length !== this.groups.length) {
|
||||||
|
this.init();
|
||||||
|
} else {
|
||||||
this.groups.forEach((group) => group.update());
|
this.groups.forEach((group) => group.update());
|
||||||
this.updateBg();
|
this.updateBg();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public get menuName(): string {
|
public get menuName(): string {
|
||||||
return this.menuOptions.name;
|
return this.menuOptions.name;
|
||||||
@ -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,6 +493,9 @@ class MenuGroup extends Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
|
if (this.items.length !== this.config.items.length) {
|
||||||
|
this.init();
|
||||||
|
} else {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
this.items.forEach((item) => {
|
this.items.forEach((item) => {
|
||||||
item.update();
|
item.update();
|
||||||
@ -476,13 +504,7 @@ class MenuGroup extends Container {
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// this.items.forEach()
|
}
|
||||||
// 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();
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ export interface MenuItemOptions {
|
|||||||
/**
|
/**
|
||||||
* 子菜单
|
* 子菜单
|
||||||
*/
|
*/
|
||||||
subMenu?: MenuGroupOptions[];
|
subMenu?: MenuOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MenuItemStyle {
|
export interface MenuItemStyle {
|
||||||
|
Loading…
Reference in New Issue
Block a user