框架同步

This commit is contained in:
fan 2023-07-21 15:54:03 +08:00
parent 6db77f7668
commit 26bdaa0e0a
7 changed files with 93 additions and 65 deletions

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

View File

@ -543,8 +543,13 @@ export class GraphicApp extends EventEmitter<GraphicAppEvents> {
g.loadState(state); g.loadState(state);
this.addGraphics(g); this.addGraphics(g);
} else { } else {
list.forEach((g) => { // 调整逻辑:所有图形对象状态数据更新完后再统一重绘
g.updateStates(state); list
.filter((g) => {
return g.updateStates(state);
})
.forEach((g) => {
g.repaint();
}); });
} }
}); });

View File

@ -902,7 +902,7 @@ export abstract class JlGraphic extends Container {
this.onStateChange(state, old); this.onStateChange(state, old);
stateChange = true; stateChange = true;
this.emit('stateupdate', this.getStates(), old); this.emit('stateupdate', this.getStates(), old);
this.repaint(); // this.repaint();
} }
return stateChange; return stateChange;
} }
@ -912,8 +912,12 @@ export abstract class JlGraphic extends Container {
onStateChange(newVal: GraphicState, old?: GraphicState): void {} onStateChange(newVal: GraphicState, old?: GraphicState): void {}
repaint(): void { repaint(): void {
try {
this.doRepaint(); this.doRepaint();
this.emit('repaint', this); this.emit('repaint', this);
} catch (e) {
console.error(`设备id=${this.id},type=${this.type}重绘逻辑异常`, e);
}
} }
/** /**

View File

@ -2,3 +2,4 @@ export * from './VectorGraphic';
export * from './VectorText'; export * from './VectorText';
export * from './DraggablePoint'; export * from './DraggablePoint';
export * from './AbsorbablePosition'; export * from './AbsorbablePosition';
export * from './DashedLine';

View File

@ -52,9 +52,6 @@ class CompleteMouseToolOptions implements IMouseToolOptions {
} }
} }
const DefaultSelectToolOptions: CompleteMouseToolOptions =
new CompleteMouseToolOptions();
/** /**
* *
*/ */
@ -72,7 +69,7 @@ export class CommonMouseTool extends AppInteractionPlugin {
constructor(graphicApp: GraphicApp) { constructor(graphicApp: GraphicApp) {
super(CommonMouseTool.Name, graphicApp); super(CommonMouseTool.Name, graphicApp);
this.options = DefaultSelectToolOptions; this.options = new CompleteMouseToolOptions();
this.box = new Graphics(); this.box = new Graphics();
this.box.name = CommonMouseTool.SelectBox; this.box.name = CommonMouseTool.SelectBox;

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,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();
} }

View File

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