Skip to content

Commit 8d44c58

Browse files
committed
fix: update outline tree when node loop property changes
1 parent 09707ce commit 8d44c58

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

packages/plugin-outline-pane/src/controllers/tree-node.ts

+18
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ enum EVENT_NAMES {
3737
expandableChanged = 'expandableChanged',
3838

3939
conditionChanged = 'conditionChanged',
40+
41+
loopChanged = 'loopChanged',
4042
}
4143

4244
export default class TreeNode {
@@ -160,6 +162,10 @@ export default class TreeNode {
160162
return this.node.hasCondition() && !this.node.conditionGroup;
161163
}
162164

165+
get loop(): boolean {
166+
return this.node.hasLoop();
167+
}
168+
163169
get children(): TreeNode[] | null {
164170
return this.node.children?.map((node) => this.tree.getTreeNode(node)) || null;
165171
}
@@ -222,6 +228,14 @@ export default class TreeNode {
222228
};
223229
}
224230

231+
onLoopChanged(fn: (treeNode: TreeNode) => void): IPublicTypeDisposable {
232+
this.event.on(EVENT_NAMES.loopChanged, fn);
233+
234+
return () => {
235+
this.event.off(EVENT_NAMES.loopChanged, fn);
236+
};
237+
}
238+
225239
onExpandableChanged(fn: (expandable: boolean) => void): IPublicTypeDisposable {
226240
this.event.on(EVENT_NAMES.expandableChanged, fn);
227241
return () => {
@@ -244,6 +258,10 @@ export default class TreeNode {
244258
this.event.emit(EVENT_NAMES.conditionChanged, this.condition);
245259
}
246260

261+
notifyLoopChanged(): void {
262+
this.event.emit(EVENT_NAMES.loopChanged, this.loop);
263+
}
264+
247265
setHidden(flag: boolean) {
248266
if (this.node.conditionGroup) {
249267
return;

packages/plugin-outline-pane/src/controllers/tree.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ export class Tree {
3636

3737
doc?.onChangeNodeProp((info: IPublicTypePropChangeOptions) => {
3838
const { node, key } = info;
39+
const treeNode = this.getTreeNodeById(node.id);
3940
if (key === '___title___') {
40-
const treeNode = this.getTreeNodeById(node.id);
4141
treeNode?.notifyTitleLabelChanged();
4242
} else if (key === '___condition___') {
43-
const treeNode = this.getTreeNodeById(node.id);
4443
treeNode?.notifyConditionChanged();
44+
} else if (key === '___loop___') {
45+
treeNode?.notifyLoopChanged();
4546
}
4647
});
4748

packages/plugin-outline-pane/src/views/tree-title.tsx

+8-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export default class TreeTitle extends PureComponent<{
2828
editing: boolean;
2929
title: string;
3030
condition?: boolean;
31+
loop?: boolean;
3132
visible?: boolean;
3233
filterWorking: boolean;
3334
keywords: string;
@@ -89,6 +90,7 @@ export default class TreeTitle extends PureComponent<{
8990
editing: false,
9091
title: treeNode.titleLabel,
9192
condition: treeNode.condition,
93+
loop: treeNode.loop,
9294
visible: !treeNode.hidden,
9395
});
9496
treeNode.onTitleLabelChanged(() => {
@@ -101,6 +103,11 @@ export default class TreeTitle extends PureComponent<{
101103
condition: treeNode.condition,
102104
});
103105
});
106+
treeNode.onLoopChanged(() => {
107+
this.setState({
108+
loop: treeNode.loop,
109+
});
110+
});
104111
treeNode.onHiddenChanged((hidden: boolean) => {
105112
this.setState({
106113
visible: !hidden,
@@ -207,7 +214,7 @@ export default class TreeTitle extends PureComponent<{
207214
<Tip>{intlNode('Slot for {prop}', { prop: node.slotFor.key })}</Tip>
208215
</a>
209216
)}
210-
{node.hasLoop() && (
217+
{this.state.loop && (
211218
<a className="tree-node-tag loop">
212219
{/* todo: click todo something */}
213220
<IconLoop />

0 commit comments

Comments
 (0)