Skip to content

Commit f06ff5f

Browse files
committed
step selection after drop.
1 parent 99c0804 commit f06ff5f

File tree

6 files changed

+92
-7
lines changed

6 files changed

+92
-7
lines changed

src/behaviors/drag-step-behavior.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export class DragStepBehavior implements Behavior {
8181
);
8282
} else {
8383
SequenceModifier.insertStep(this.step, this.currentPlaceholder.parentSequence, this.currentPlaceholder.index);
84+
this.context.setSelectedStep(this.step);
8485
}
8586
this.context.notifiyDefinitionChanged();
8687
} else {

src/core/simple-event-race.spec.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { SimpleEvent } from './simple-event';
2+
import { race } from './simple-event-race';
3+
4+
describe('race', () => {
5+
let a: SimpleEvent<number>;
6+
let b: SimpleEvent<number>;
7+
8+
beforeEach(() => {
9+
a = new SimpleEvent<number>();
10+
b = new SimpleEvent<number>();
11+
});
12+
13+
it('joins two events', done => {
14+
race(0, a, b).subscribe(r => {
15+
expect(r[0]).toEqual(0x128);
16+
expect(r[1]).toEqual(0x256);
17+
done();
18+
});
19+
20+
a.forward(0x128);
21+
b.forward(0x256);
22+
});
23+
24+
it('forwards first event only', done => {
25+
race(0, a, b).subscribe(r => {
26+
expect(r[0]).toEqual(0x128);
27+
expect(r[1]).toBeUndefined();
28+
done();
29+
});
30+
31+
a.forward(0x128);
32+
});
33+
34+
it('forwards second event only', done => {
35+
race(0, a, b).subscribe(r => {
36+
expect(r[0]).toBeUndefined();
37+
expect(r[1]).toEqual(0x256);
38+
done();
39+
});
40+
41+
b.forward(0x256);
42+
});
43+
});

src/core/simple-event-race.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { SimpleEvent } from './simple-event';
2+
3+
export function race<A, B>(timeout: number, a: SimpleEvent<A>, b: SimpleEvent<B>): SimpleEvent<[A?, B?]> {
4+
const value: [A?, B?] = [undefined, undefined];
5+
const result = new SimpleEvent<[A?, B?]>();
6+
let scheduled = false;
7+
8+
function forward() {
9+
if (scheduled) {
10+
return;
11+
}
12+
scheduled = true;
13+
setTimeout(() => {
14+
try {
15+
result.forward(value);
16+
} finally {
17+
scheduled = false;
18+
value.fill(undefined);
19+
}
20+
}, timeout);
21+
}
22+
23+
[a, b]
24+
.filter(e => e)
25+
.forEach((e, index) => {
26+
e.subscribe(v => {
27+
value[index] = v;
28+
forward();
29+
});
30+
});
31+
return result;
32+
}

src/designer-context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export class DesignerContext {
1818
public readonly onIsMoveModeEnabledChanged = new SimpleEvent<boolean>();
1919
public readonly onIsToolboxCollapsedChanged = new SimpleEvent<boolean>();
2020
public readonly onIsSmartEditorCollapsedChanged = new SimpleEvent<boolean>();
21-
public readonly onDefinitionChanged = new SimpleEvent<void>();
21+
public readonly onDefinitionChanged = new SimpleEvent<Definition>();
2222

2323
public viewPort: ViewPort = {
2424
position: new Vector(0, 0),
@@ -135,7 +135,7 @@ export class DesignerContext {
135135
}
136136

137137
public notifiyDefinitionChanged() {
138-
this.onDefinitionChanged.forward();
138+
this.onDefinitionChanged.forward(this.definition);
139139
}
140140

141141
public getPlacehodlers(): Placeholder[] {

src/designer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export default class Designer {
1818

1919
const view = DesignerView.create(parent, context, configuration);
2020
const designer = new Designer(view, context);
21-
context.onDefinitionChanged.subscribe(() => designer.onDefinitionChanged.forward(context.definition));
21+
context.onDefinitionChanged.subscribe(d => designer.onDefinitionChanged.forward(d));
2222
return designer;
2323
}
2424

src/workspace/workspace.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { MoveViewPortBehavior } from '../behaviors/move-view-port-behavior';
22
import { SelectStepBehavior } from '../behaviors/select-step-behavior';
3+
import { race } from '../core/simple-event-race';
34
import { Vector } from '../core/vector';
45
import { Step } from '../definition';
56
import { DesignerComponentProvider, DesignerContext, ViewPort } from '../designer-context';
@@ -21,12 +22,19 @@ export class Workspace implements DesignerComponentProvider {
2122
});
2223

2324
context.setProvider(workspace);
24-
context.onDefinitionChanged.subscribe(() => workspace.render());
2525
context.onViewPortChanged.subscribe(vp => workspace.onViewPortChanged(vp));
26-
context.onSelectedStepChanged.subscribe(s => workspace.onSelectedStepChanged(s));
2726
context.onIsDraggingChanged.subscribe(i => workspace.onIsDraggingChanged(i));
2827
context.onIsSmartEditorCollapsedChanged.subscribe(() => workspace.onIsSmartEditorCollapsedChanged());
2928

29+
race(0, context.onDefinitionChanged, context.onSelectedStepChanged).subscribe(v => {
30+
const [definiton, selectedStep] = v;
31+
if (definiton) {
32+
workspace.render();
33+
} else if (selectedStep !== undefined) {
34+
workspace.onSelectedStepChanged(selectedStep);
35+
}
36+
});
37+
3038
view.bindMouseDown((p, t, b) => workspace.onMouseDown(p, t, b));
3139
view.bindTouchStart(e => workspace.onTouchStart(e));
3240
view.bindWheel(e => workspace.onWheel(e));
@@ -157,9 +165,10 @@ export class Workspace implements DesignerComponentProvider {
157165
}
158166
if (step) {
159167
this.selectedStepComponent = this.getRootComponent().findById(step.id);
160-
if (this.selectedStepComponent) {
161-
this.selectedStepComponent.setState(StepComponentState.selected);
168+
if (!this.selectedStepComponent) {
169+
throw new Error(`Cannot find a step component by id ${step.id}`);
162170
}
171+
this.selectedStepComponent.setState(StepComponentState.selected);
163172
}
164173
}
165174

0 commit comments

Comments
 (0)