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