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