Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sisilicon
GitHub Repository: sisilicon/worldedit-be
Path: blob/master/src/editor/modules/gradients.ts
1784 views
1
import { ButtonVariant, IPlayerUISession, makeObservable } from "@minecraft/server-editor";
2
import { UIPane } from "editor/pane/builder";
3
import { EditorModule } from "./base";
4
import { PatternListUIBuilder } from "editor/pane/patternList";
5
import { Pattern } from "@modules/pattern";
6
7
export class GradientsModule extends EditorModule {
8
private readonly pane: UIPane;
9
private readonly selectedGradientIdx = makeObservable(-1);
10
11
private readonly editPane: UIPane;
12
private readonly dithering = makeObservable(0);
13
private readonly editPatternList: PatternListUIBuilder;
14
15
private readonly createPane: string;
16
private readonly createName = makeObservable("");
17
private readonly createDithering = makeObservable(0);
18
private readonly createPatternList: PatternListUIBuilder;
19
20
constructor(session: IPlayerUISession) {
21
super(session);
22
this.editPatternList = new PatternListUIBuilder([], this.player);
23
this.createPatternList = new PatternListUIBuilder([], this.player);
24
const tool = session.toolRail.addTool("worldedit:gradients", { title: "WorldEdit Gradients", icon: "pack://textures/editor/gradients_tool.png" });
25
this.pane = new UIPane(this.session, {
26
title: "Gradients",
27
items: [
28
{
29
type: "dropdown",
30
title: "Select Gradient",
31
uniqueId: "gradient",
32
entries: [],
33
value: this.selectedGradientIdx,
34
onChange: () => this.updateGradientPanel(),
35
},
36
{
37
type: "button",
38
title: "Create New Gradient",
39
variant: ButtonVariant.Confirmation,
40
pressed: () => {
41
this.createName.set("");
42
this.createDithering.set(0);
43
this.createPatternList.patterns = [new Pattern("stone")];
44
this.pane.showModalPane(this.createPane);
45
},
46
},
47
{
48
type: "subpane",
49
uniqueId: "editGradient",
50
hasExpander: false,
51
hasMargins: false,
52
53
items: [
54
{ type: "divider" },
55
{
56
type: "slider",
57
title: "Dither",
58
min: 0,
59
max: 1,
60
value: this.dithering,
61
onChange: () => this.saveSelectedGradient(),
62
},
63
{
64
type: "subpane",
65
title: "Patterns",
66
items: this.editPatternList,
67
},
68
{ type: "divider" },
69
{
70
type: "button",
71
title: "Delete",
72
variant: ButtonVariant.Destructive,
73
pressed: () => {
74
if (!this.selectedGradientIdx) return;
75
const gradients = this.worldedit.getGradientNames();
76
const gradient = gradients[this.selectedGradientIdx.value];
77
this.worldedit.deleteGradient(gradient);
78
},
79
},
80
],
81
},
82
],
83
});
84
this.createPane = this.pane.createModalPane({
85
items: [
86
{
87
type: "text_area",
88
title: "Gradient ID",
89
value: this.createName,
90
onChange: (name) => {
91
this.pane.getSubPane(this.createPane).setEnabled("createGradient", name && !this.worldedit.getGradientNames().includes(name));
92
},
93
},
94
{
95
type: "slider",
96
title: "Dither",
97
min: 0,
98
max: 1,
99
value: this.createDithering,
100
},
101
{
102
type: "subpane",
103
title: "Patterns",
104
items: this.createPatternList,
105
},
106
{ type: "divider" },
107
{
108
type: "button",
109
title: "Create New Gradient",
110
uniqueId: "createGradient",
111
variant: ButtonVariant.Confirmation,
112
enable: false,
113
pressed: () => {
114
this.worldedit.createGradient(this.createName.value, this.createDithering.value, this.createPatternList.patterns);
115
this.pane.hideModalPane(this.createPane);
116
},
117
},
118
{
119
type: "button",
120
title: "Cancel",
121
variant: ButtonVariant.Destructive,
122
pressed: () => this.pane.hideModalPane(this.createPane),
123
},
124
],
125
});
126
this.editPane = this.pane.getSubPane("editGradient");
127
128
this.pane.bindToTool(tool);
129
this.updateGradientsList();
130
131
this.worldedit.on("gradientListUpdated", () => this.updateGradientsList());
132
}
133
134
private get selectedGradient() {
135
if (this.selectedGradientIdx.value < 0) return;
136
const gradients = this.worldedit.getGradientNames();
137
const gradientId = gradients[this.selectedGradientIdx.value];
138
return { name: gradientId, ...this.worldedit.getGradient(gradientId) };
139
}
140
141
private updateGradientsList() {
142
const gradients = this.worldedit.getGradientNames();
143
this.pane.updateEntries(
144
"gradient",
145
gradients.map((label, value) => ({ label, value }))
146
);
147
148
const oldGradient = this.selectedGradient?.name;
149
this.selectedGradientIdx.set(Math.min(Math.max(this.selectedGradientIdx.value, 0), gradients.length - 1));
150
if (oldGradient !== this.selectedGradient?.name) this.updateGradientPanel();
151
}
152
153
private updateGradientPanel() {
154
const gradient = this.selectedGradient;
155
this.editPane.visible = !!this.selectedGradient;
156
if (!this.editPane.visible) return;
157
158
this.dithering.set(gradient.dither);
159
this.editPatternList.patterns = gradient.patterns;
160
}
161
162
private saveSelectedGradient() {
163
if (this.selectedGradientIdx.value < 0) return;
164
this.worldedit.createGradient(this.selectedGradient.name, this.dithering.value, this.editPatternList.patterns);
165
}
166
}
167
168