Skip to content

Commit 5d77340

Browse files
committed
refactor(tweakpane): use computed for a lot of bindings stuff instead of set signal
1 parent a525c7c commit 5d77340

File tree

8 files changed

+89
-76
lines changed

8 files changed

+89
-76
lines changed

Diff for: libs/tweakpane/src/lib/binding.ts

+43-27
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ import { NgtTweakDebounce } from './debounce';
1616
import { NgtTweakFolder } from './folder';
1717
import { NgtTweakLabel } from './label';
1818

19-
export type NgtTweakBindingParams<TParams extends BindingParams> = Omit<
20-
TParams,
21-
'tag' | 'label' | 'disabled' | 'hidden'
22-
>;
23-
2419
export const NGT_TWEAK_BINDING_AS_HOST = new InjectionToken<
2520
true | { in: (value: unknown) => unknown; out: (value: unknown) => unknown } | null
2621
>('hostDirective NgtTweakBinding', { factory: () => null });
@@ -47,13 +42,13 @@ export class NgtTweakBinding<TValue> {
4742
private injector = inject(Injector);
4843
private asHostDirective = inject(NGT_TWEAK_BINDING_AS_HOST);
4944

50-
binding = signal<BindingApi<unknown, TValue> | null>(null);
5145
private bindingBaseParams = computed(() => ({
5246
label: this.label.snapshot.label,
5347
tag: this.label.snapshot.tag,
5448
disabled: this.blade.disabled(),
5549
hidden: this.blade.hidden(),
5650
}));
51+
private bindingParams = signal<Record<string, unknown>>({});
5752

5853
private get bindableObject() {
5954
let value = untracked(this.value);
@@ -65,43 +60,64 @@ export class NgtTweakBinding<TValue> {
6560
return { value };
6661
}
6762

63+
private bindingApi = computed(() => {
64+
const parent = this.parent.folder();
65+
if (!parent) return null;
66+
67+
const bindingParams = { ...this.bindingBaseParams(), ...this.bindingParams() };
68+
return parent.addBinding(this.bindableObject, 'value', bindingParams) as BindingApi<unknown, TValue>;
69+
});
70+
6871
constructor() {
69-
this.blade.startChangeEffect(this.binding);
70-
this.label.startChangeEffect(this.binding);
71-
this.debounce.startDebounceEffect(this.binding, (ev) => {
72+
this.blade.startChangeEffect(this.bindingApi);
73+
this.label.startChangeEffect(this.bindingApi);
74+
this.debounce.startDebounceEffect(this.bindingApi, (ev) => {
7275
if (this.asHostDirective && typeof this.asHostDirective === 'object') {
7376
this.value.set(this.asHostDirective.out(ev.value) as TValue);
7477
} else {
7578
this.value.set(ev.value);
7679
}
7780
});
7881

79-
if (!this.asHostDirective) {
80-
this.createBindingEffect(this.bindingBaseParams);
81-
}
82+
effect((onCleanup) => {
83+
const bindingApi = this.bindingApi();
84+
if (!bindingApi) return;
85+
onCleanup(() => {
86+
bindingApi.dispose();
87+
});
88+
});
8289

8390
inject(DestroyRef).onDestroy(() => {
84-
this.binding()?.dispose();
91+
this.bindingApi()?.dispose();
8592
});
8693
}
8794

88-
createBindingEffect(params: () => BindingParams) {
95+
syncBindingParams(params: () => BindingParams) {
8996
return effect(
90-
(onCleanup) => {
91-
const parent = this.parent.folder();
92-
if (!parent) return;
93-
94-
const bindingParams = { ...this.bindingBaseParams(), ...params() };
95-
const binding = parent.addBinding(this.bindableObject, 'value', bindingParams);
96-
97-
this.binding.set(binding);
98-
99-
onCleanup(() => {
100-
binding.dispose();
101-
this.binding.set(null);
102-
});
97+
() => {
98+
this.bindingParams.set(params());
10399
},
104100
{ injector: this.injector },
105101
);
106102
}
103+
104+
// createBindingEffect(params: () => BindingParams) {
105+
// return effect(
106+
// (onCleanup) => {
107+
// const parent = this.parent.folder();
108+
// if (!parent) return;
109+
//
110+
// const bindingParams = { ...this.bindingBaseParams(), ...params() };
111+
// const binding = parent.addBinding(this.bindableObject, 'value', bindingParams);
112+
//
113+
// this.bindingApi.set(binding);
114+
//
115+
// onCleanup(() => {
116+
// binding.dispose();
117+
// this.bindingApi.set(null);
118+
// });
119+
// },
120+
// { injector: this.injector },
121+
// );
122+
// }
107123
}

Diff for: libs/tweakpane/src/lib/button.ts

+23-25
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,58 @@
1-
import { DestroyRef, Directive, effect, inject, input, output, signal, untracked } from '@angular/core';
1+
import { computed, DestroyRef, Directive, effect, inject, output } from '@angular/core';
22
import { TpMouseEvent } from '@tweakpane/core';
33
import { ButtonApi } from 'tweakpane';
44
import { NgtTweakBlade } from './blade';
55
import { NgtTweakFolder } from './folder';
6+
import { NgtTweakLabel } from './label';
67
import { NgtTweakTitle } from './title';
78

89
@Directive({
910
selector: 'ngt-tweak-button',
1011
hostDirectives: [
1112
{ directive: NgtTweakTitle, inputs: ['title'] },
13+
{ directive: NgtTweakLabel, inputs: ['label'] },
1214
{ directive: NgtTweakBlade, inputs: ['hidden', 'disabled'] },
1315
],
1416
})
1517
export class NgtTweakButton {
16-
label = input('');
1718
click = output<TpMouseEvent<ButtonApi>>();
1819

1920
private title = inject(NgtTweakTitle);
21+
private label = inject(NgtTweakLabel);
2022
private blade = inject(NgtTweakBlade);
2123
private parent = inject(NgtTweakFolder);
2224

23-
button = signal<ButtonApi | null>(null);
25+
private buttonApi = computed(() => {
26+
const parent = this.parent.folder();
27+
if (!parent) return null;
28+
29+
return parent.addButton({
30+
title: this.title.snapshot,
31+
hidden: this.blade.snapshot.hidden,
32+
disabled: this.blade.snapshot.disabled,
33+
label: this.label.snapshot.label,
34+
});
35+
});
2436

2537
constructor() {
2638
effect((onCleanup) => {
27-
const parent = this.parent.folder();
28-
if (!parent) return;
29-
30-
const button = parent.addButton({
31-
title: this.title.snapshot,
32-
hidden: this.blade.snapshot.hidden,
33-
disabled: this.blade.snapshot.disabled,
34-
label: untracked(this.label),
35-
});
39+
const buttonApi = this.buttonApi();
40+
if (!buttonApi) return;
3641

3742
const boundEmit = this.click.emit.bind(this.click);
38-
button.on('click', boundEmit);
39-
this.button.set(button);
43+
buttonApi.on('click', boundEmit);
4044

4145
onCleanup(() => {
42-
button.off('click', boundEmit);
46+
buttonApi.off('click', boundEmit);
4347
});
4448
});
4549

46-
effect(() => {
47-
const button = this.button();
48-
if (!button) return;
49-
50-
button.label = this.label();
51-
});
52-
53-
this.title.startChangeEffect(this.button);
54-
this.blade.startChangeEffect(this.button);
50+
this.label.startChangeEffect(this.buttonApi);
51+
this.title.startChangeEffect(this.buttonApi);
52+
this.blade.startChangeEffect(this.buttonApi);
5553

5654
inject(DestroyRef).onDestroy(() => {
57-
this.button()?.dispose();
55+
this.buttonApi()?.dispose();
5856
});
5957
}
6058
}

Diff for: libs/tweakpane/src/lib/checkbox.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ export class NgtTweakCheckbox {
1313
private binding = inject(NgtTweakBinding);
1414

1515
constructor() {
16-
this.binding.createBindingEffect(this.params);
16+
this.binding.syncBindingParams(this.params);
1717
}
1818
}

Diff for: libs/tweakpane/src/lib/color.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ export class NgtTweakColor {
1313
private binding = inject(NgtTweakBinding);
1414

1515
constructor() {
16-
this.binding.createBindingEffect(this.params);
16+
this.binding.syncBindingParams(this.params);
1717
}
1818
}

Diff for: libs/tweakpane/src/lib/list.ts

+18-19
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { computed, DestroyRef, Directive, effect, inject, input, model, signal, untracked } from '@angular/core';
1+
import { computed, DestroyRef, Directive, effect, inject, input, model, untracked } from '@angular/core';
22
import { ListItem } from '@tweakpane/core';
33
import { ListBladeApi } from 'tweakpane';
44
import { NgtTweakBlade } from './blade';
@@ -23,7 +23,6 @@ export class NgtTweakList<TOptionValue> {
2323
private label = inject(NgtTweakLabel);
2424
private parent = inject(NgtTweakFolder);
2525

26-
list = signal<ListBladeApi<TOptionValue> | null>(null);
2726
private listOptions = computed(() => {
2827
const options = this.options();
2928
if (Array.isArray(options)) {
@@ -35,34 +34,34 @@ export class NgtTweakList<TOptionValue> {
3534
return { text: key, value } as ListItem<TOptionValue>;
3635
});
3736
});
37+
private listApi = computed(() => {
38+
const parent = this.parent.folder();
39+
if (!parent) return null;
40+
41+
return parent.addBlade({
42+
view: 'list',
43+
options: this.listOptions(),
44+
value: untracked(this.value),
45+
label: this.label.snapshot.label,
46+
}) as ListBladeApi<TOptionValue>;
47+
});
3848

3949
constructor() {
40-
this.label.startChangeEffect(this.list);
41-
this.blade.startChangeEffect(this.list);
42-
this.debounce.startDebounceEffect(this.list, (ev) => {
50+
this.label.startChangeEffect(this.listApi);
51+
this.blade.startChangeEffect(this.listApi);
52+
this.debounce.startDebounceEffect(this.listApi, (ev) => {
4353
this.value.set(ev.value);
4454
});
4555

4656
effect((onCleanup) => {
47-
const parent = this.parent.folder();
48-
if (!parent) return;
49-
50-
const list = parent.addBlade({
51-
view: 'list',
52-
options: this.listOptions(),
53-
value: untracked(this.value),
54-
label: this.label.snapshot.label,
55-
}) as ListBladeApi<TOptionValue>;
56-
57-
this.list.set(list);
58-
57+
const listApi = this.listApi();
5958
onCleanup(() => {
60-
list.dispose();
59+
listApi?.dispose();
6160
});
6261
});
6362

6463
inject(DestroyRef).onDestroy(() => {
65-
this.list()?.dispose();
64+
this.listApi()?.dispose();
6665
});
6766
}
6867
}

Diff for: libs/tweakpane/src/lib/number.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ export class NgtTweakNumber {
1313
private binding = inject(NgtTweakBinding);
1414

1515
constructor() {
16-
this.binding.createBindingEffect(this.params);
16+
this.binding.syncBindingParams(this.params);
1717
}
1818
}

Diff for: libs/tweakpane/src/lib/point.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@ export class NgtTweakPoint {
3131
private binding = inject(NgtTweakBinding);
3232

3333
constructor() {
34-
this.binding.createBindingEffect(this.params);
34+
this.binding.syncBindingParams(this.params);
3535
}
3636
}

Diff for: libs/tweakpane/src/lib/text.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ export class NgtTweakText {
1313
private binding = inject(NgtTweakBinding);
1414

1515
constructor() {
16-
this.binding.createBindingEffect(this.params);
16+
this.binding.syncBindingParams(this.params);
1717
}
1818
}

0 commit comments

Comments
 (0)