Skip to content

Commit 2337e46

Browse files
committed
✨ feat: update showFloatTip to accept HTMLElement or structured object
1 parent 99421b5 commit 2337e46

File tree

3 files changed

+45
-31
lines changed

3 files changed

+45
-31
lines changed

packages/chili-core/src/foundation/pubsub.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export interface PubSubEventMap {
3030
parentVisibleChanged: (model: INode) => void;
3131
selectionChanged: (document: IDocument, selected: INode[], unselected: INode[]) => void;
3232
showDialog: (title: I18nKeys, content: HTMLElement, callback?: (result: DialogResult) => void) => void;
33-
showFloatTip: (level: MessageType, msg: string) => void;
33+
showFloatTip: (dom: HTMLElement | { level: MessageType; msg: string }) => void;
3434
showInput: (text: string, handler: (text: string) => Result<string, I18nKeys>) => void;
3535
showPermanent: (action: () => Promise<void>, message: I18nKeys, ...args: any[]) => void;
3636
showProperties(document: IDocument, nodes: INode[]): void;

packages/chili-ui/src/viewport/flyout/flyout.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Input } from "./input";
77
import { Tip } from "./tip";
88

99
export class Flyout extends HTMLElement {
10-
private _tip: Tip | undefined;
10+
private _tip: HTMLElement | undefined;
1111
private _input: Input | undefined;
1212
private lastFocus: HTMLElement | null = null;
1313

@@ -30,12 +30,16 @@ export class Flyout extends HTMLElement {
3030
PubSub.default.remove("clearInput", this.clearInput);
3131
}
3232

33-
private readonly showTip = (level: MessageType, msg: string) => {
34-
if (this._tip === undefined) {
35-
this._tip = new Tip(msg, level);
33+
private readonly showTip = (dom: HTMLElement | { level: MessageType; msg: string }) => {
34+
if (dom instanceof HTMLElement) {
35+
this._tip?.remove();
36+
this._tip = dom;
3637
this.append(this._tip);
37-
} else {
38-
this._tip.set(msg, level);
38+
} else if (this._tip === undefined) {
39+
this._tip = new Tip(dom.msg, dom.level);
40+
this.append(this._tip);
41+
} else if (this._tip instanceof Tip) {
42+
this._tip.set(dom.msg, dom.level);
3943
}
4044
};
4145

packages/chili/src/snap/handlers/snapEventHandler.ts

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export abstract class SnapEventHandler<D extends SnapData = SnapData> implements
7373
}
7474

7575
private cleanupResources() {
76-
this.clearSnapTip();
76+
this.clearSnapPrompt();
7777
this.clearInput();
7878
this.removeTempVisuals();
7979
this.snaps.forEach((snap) => snap.clear());
@@ -93,9 +93,9 @@ export abstract class SnapEventHandler<D extends SnapData = SnapData> implements
9393
private updateSnapPoint(view: IView, event: PointerEvent) {
9494
this.setSnaped(view, event);
9595
if (this._snaped) {
96-
this.showSnapPrompt(this.formatPrompt(this._snaped));
96+
this.showSnapPrompt(this._snaped);
9797
} else {
98-
this.clearSnapTip();
98+
this.clearSnapPrompt();
9999
}
100100
}
101101

@@ -104,22 +104,6 @@ export abstract class SnapEventHandler<D extends SnapData = SnapData> implements
104104
view.document.visual.update();
105105
}
106106

107-
private formatPrompt(snaped: SnapResult) {
108-
let prompt = this.data.prompt?.(snaped);
109-
if (!prompt) {
110-
let distance = snaped.distance ?? snaped.refPoint?.distanceTo(snaped.point!);
111-
if (distance) {
112-
prompt = this.formatDistance(distance);
113-
}
114-
}
115-
116-
return [snaped.info, prompt].filter((x) => x !== undefined).join(" -> ");
117-
}
118-
119-
protected formatDistance(num: number) {
120-
return num.toFixed(2);
121-
}
122-
123107
protected setSnaped(view: IView, event: PointerEvent) {
124108
this.findSnapPoint(ShapeType.Edge, view, event);
125109

@@ -173,16 +157,42 @@ export abstract class SnapEventHandler<D extends SnapData = SnapData> implements
173157
return { shapes, view, mx: event.offsetX, my: event.offsetY };
174158
}
175159

176-
private clearSnapTip() {
160+
protected clearSnapPrompt() {
177161
PubSub.default.pub("clearFloatTip");
178162
}
179163

180-
private showSnapPrompt(msg: string | undefined) {
181-
if (!msg) {
182-
this.clearSnapTip();
164+
protected showSnapPrompt(snaped: SnapResult) {
165+
const prompt = this.formatSnapPrompt(snaped);
166+
if (!prompt) {
167+
this.clearSnapPrompt();
183168
return;
184169
}
185-
PubSub.default.pub("showFloatTip", MessageType.info, msg);
170+
PubSub.default.pub("showFloatTip", prompt);
171+
}
172+
173+
protected formatSnapPrompt(
174+
snaped: SnapResult,
175+
): HTMLElement | { level: MessageType; msg: string } | undefined {
176+
let prompt = this.data.prompt?.(snaped);
177+
if (!prompt) {
178+
let distance = snaped.distance ?? snaped.refPoint?.distanceTo(snaped.point!);
179+
if (distance) {
180+
prompt = this.formatSnapDistance(distance);
181+
}
182+
}
183+
184+
if (!prompt && !snaped.info) {
185+
return undefined;
186+
}
187+
188+
return {
189+
level: MessageType.info,
190+
msg: [snaped.info, prompt].filter((x) => x !== undefined).join(" -> "),
191+
};
192+
}
193+
194+
protected formatSnapDistance(num: number) {
195+
return num.toFixed(2);
186196
}
187197

188198
private removeTempVisuals() {

0 commit comments

Comments
 (0)