Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sisilicon
GitHub Repository: sisilicon/worldedit-be
Path: blob/master/src/editor/pane/patternList.ts
1784 views
1
import { Pattern, patternsFromSelection } from "@modules/pattern";
2
import { PaneBuilder, UIPane } from "./builder";
3
import { PatternUIBuilder } from "./pattern";
4
import { EventEmitter } from "library/classes/eventEmitter";
5
import { Player } from "@minecraft/server";
6
import { getSession } from "server/sessions";
7
8
export class PatternListUIBuilder extends EventEmitter<{ changed: [] }> implements PaneBuilder {
9
private builders: PatternUIBuilder[] = [];
10
private panes = new Set<UIPane>();
11
private player: Player;
12
13
constructor(patterns: Pattern[], player: Player) {
14
super();
15
this.patterns = patterns;
16
this.player = player;
17
}
18
19
get patterns() {
20
return this.builders.map((builder) => builder.value);
21
}
22
23
set patterns(value: Pattern[]) {
24
for (const builder of this.builders) builder.destroy();
25
this.builders = value.map((pattern) => new PatternUIBuilder(pattern));
26
this.panes.forEach((pane) => this.build(pane));
27
}
28
29
build(pane: UIPane) {
30
this.panes.add(pane);
31
const eachSubPane = (callback: (pane: UIPane, index: number) => void) => {
32
Object.values(patternPane.getAllSubPanes()).forEach((pane, index) => callback(pane, index));
33
};
34
35
const updateSubPanes = () => {
36
eachSubPane((pane, index) => {
37
pane.setVisibility(1, this.builders.length > 1);
38
pane.title = `Pattern ${index + 1}`;
39
});
40
};
41
42
const addPatternUI = (pane: UIPane, index: number, builder: PatternUIBuilder) => {
43
const subPane = pane.addSubPane({
44
title: `Pattern ${index + 1}`,
45
items: [
46
{ type: "subpane", hasExpander: false, hasMargins: false, items: builder },
47
{
48
type: "button",
49
title: "Remove Pattern",
50
variant: 3,
51
visible: this.builders.length > 1,
52
pressed: () => {
53
pane.removeSubPane(subPane);
54
const [builder] = this.builders.splice(index, 1);
55
builder.destroy();
56
updateSubPanes();
57
this.emit("changed");
58
},
59
},
60
],
61
});
62
};
63
64
pane.changeItems([
65
{ type: "subpane", hasExpander: false, hasMargins: false, items: [] },
66
{
67
type: "button",
68
title: "Add Pattern",
69
pressed: () => {
70
const builder = new PatternUIBuilder(new Pattern("stone"));
71
builder.on("changed", () => this.emit("changed"));
72
this.builders.push(builder);
73
addPatternUI(patternPane, this.builders.length - 1, builder);
74
updateSubPanes();
75
this.emit("changed");
76
},
77
},
78
{
79
type: "button",
80
title: "Generate Patterns from Selection",
81
pressed: () => {
82
const selection = getSession(this.player).selection;
83
if (!selection.isEmpty) this.patterns = patternsFromSelection(selection);
84
},
85
},
86
]);
87
88
const patternPane = pane.getSubPane(0);
89
for (let i = 0; i < this.builders.length; i++) addPatternUI(patternPane, i, this.builders[i]);
90
updateSubPanes();
91
}
92
}
93
94