Skip to content

Commit 142d29e

Browse files
committed
Added icon and progress bar to region operations tool
1 parent af89b13 commit 142d29e

File tree

4 files changed

+43
-10
lines changed

4 files changed

+43
-10
lines changed
182 Bytes
Loading

src/editor/modules/region_operations.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
/* eslint-disable prefer-const */
2-
import { IPlayerUISession, Widget, WidgetComponentClipboard, WidgetGroupSelectionMode } from "@minecraft/server-editor";
2+
import { IPlayerUISession, ProgressIndicatorPropertyItemVariant, Widget, WidgetComponentClipboard, WidgetGroupSelectionMode } from "@minecraft/server-editor";
33
import { UIPane } from "editor/pane/builder";
44
import { EditorModule } from "./base";
55
import { Pattern } from "@modules/pattern";
6-
import { regionSize, Server, Vector } from "@notbeer-api";
6+
import { regionSize, Server, Thread, Vector } from "@notbeer-api";
77
import { PatternUIBuilder } from "editor/pane/pattern";
88
import { MaskUIBuilder } from "editor/pane/mask";
99
import { Mask } from "@modules/mask";
1010
import { Cardinal } from "@modules/directions";
1111
import { getSession } from "server/sessions";
1212
import { system } from "@minecraft/server";
13+
import { Jobs } from "@modules/jobs";
1314

1415
enum RegionOperatorMode {
1516
Fill,
@@ -31,6 +32,7 @@ export class RegionOpModule extends EditorModule {
3132
private widgetComponents: WidgetComponentClipboard[] = [];
3233

3334
private tickId: number;
35+
private thread?: Thread;
3436

3537
private enableMask = false;
3638
private enableHeightMask = false;
@@ -46,7 +48,7 @@ export class RegionOpModule extends EditorModule {
4648

4749
constructor(session: IPlayerUISession) {
4850
super(session);
49-
const tool = session.toolRail.addTool("worldedit:region_operations", { title: "WorldEdit Region Operations" });
51+
const tool = session.toolRail.addTool("worldedit:region_operations", { title: "WorldEdit Region Operations", icon: "pack://textures/editor/region_operations_tool.png" });
5052
const widgetGroup = session.extensionContext.widgetManager.createGroup({ groupSelectionMode: WidgetGroupSelectionMode.None, visible: true });
5153

5254
this.widget = widgetGroup.createWidget(Vector.ZERO, { visible: true });
@@ -77,6 +79,7 @@ export class RegionOpModule extends EditorModule {
7779
enable: this.canOperate(),
7880
pressed: this.performOperation.bind(this),
7981
},
82+
{ type: "progress", uniqueId: "operationProgress", variant: ProgressIndicatorPropertyItemVariant.ProgressBar, visible: false },
8083
{ type: "divider" },
8184
{
8285
type: "dropdown",
@@ -188,6 +191,15 @@ export class RegionOpModule extends EditorModule {
188191
lastCardinal = cardinal;
189192
this.updateWidgets();
190193
}
194+
195+
if (this.thread && !this.thread.isActive) this.thread = undefined;
196+
const job = this.thread ? Jobs.getJobsForThread(this.thread)[0] : undefined;
197+
if (job) {
198+
this.pane.setVisibility("operationProgress", true);
199+
this.pane.setValue("operationProgress", Jobs.getProgress(job));
200+
} else {
201+
this.pane.setVisibility("operationProgress", false);
202+
}
191203
}, 2);
192204
}
193205

@@ -206,7 +218,7 @@ export class RegionOpModule extends EditorModule {
206218
[RegionOperatorMode.Outline]: "faces",
207219
[RegionOperatorMode.Wall]: "walls",
208220
}[this.mode];
209-
Server.command.getRegistration(command).callback(this.player, "editor-callback", args);
221+
this.thread = Server.command.getRegistration(command).callback(this.player, "editor-callback", args);
210222
} else if (this.mode === RegionOperatorMode.Stack) {
211223
Server.command.getRegistration("stack").callback(
212224
this.player,
@@ -220,7 +232,7 @@ export class RegionOpModule extends EditorModule {
220232
)
221233
);
222234
} else if (this.mode === RegionOperatorMode.Move) {
223-
Server.command.getRegistration("move").callback(
235+
this.thread = Server.command.getRegistration("move").callback(
224236
this.player,
225237
"editor-callback",
226238
new Map(
@@ -232,7 +244,7 @@ export class RegionOpModule extends EditorModule {
232244
)
233245
);
234246
} else if (this.mode === RegionOperatorMode.Smooth) {
235-
Server.command.getRegistration("smooth").callback(
247+
this.thread = Server.command.getRegistration("smooth").callback(
236248
this.player,
237249
"editor-callback",
238250
new Map(

src/editor/pane/builder.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
INumberPropertyItemOptions,
1111
IObservable,
1212
IPlayerUISession,
13+
IProgressIndicatorPropertyItemOptions,
1314
IPropertyItemBase,
1415
IPropertyPane,
1516
IRootPropertyPane,
@@ -32,6 +33,10 @@ interface DividerPaneItem extends BasePaneItem {
3233
type: "divider";
3334
}
3435

36+
interface ProgressPaneItem extends BasePaneItem, IProgressIndicatorPropertyItemOptions {
37+
type: "progress";
38+
}
39+
3540
interface ButtonPaneItem extends BasePaneItem, IButtonPropertyItemOptions {
3641
type: "button";
3742
pressed: () => void;
@@ -85,6 +90,7 @@ interface SubPane extends BasePaneItem, ISubPanePropertyItemOptions {
8590
export type PaneItem =
8691
| DividerPaneItem
8792
| ButtonPaneItem
93+
| ProgressPaneItem
8894
| SliderPaneItem
8995
| TogglePaneItem
9096
| DropdownPaneItem
@@ -102,8 +108,8 @@ export interface PaneLayout extends ISubPanePropertyItemOptions {
102108
export class UIPane {
103109
private pane: IPropertyPane;
104110
private readonly subPanes: Record<string | number, UIPane> = {};
105-
private readonly observables: Record<number, IObservable<number | boolean | Vector3 | LocalizedString>> = {};
106-
private readonly properties: Record<number, IPropertyItemBase> = {};
111+
private readonly observables: Record<string | number, IObservable<number | boolean | Vector3 | LocalizedString>> = {};
112+
private readonly properties: Record<string | number, IPropertyItemBase> = {};
107113
private readonly mainPane: IPropertyPane;
108114

109115
constructor(
@@ -189,6 +195,9 @@ export class UIPane {
189195
case "button":
190196
this.properties[id] = this.pane.addButton(item.pressed, item);
191197
break;
198+
case "progress":
199+
this.properties[id] = this.pane.addProgressIndicator({ ...item, progress: this.makeObservable(item.progress ?? 0, id) });
200+
break;
192201
case "label":
193202
this.properties[id] = this.pane.addText(this.makeObservable(item.text, id), item);
194203
break;

src/server/modules/jobs.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,27 @@ class JobHandler {
146146
return this.jobs.get(ctx ?? this.getContext()).player;
147147
}
148148

149-
public getJobsForSession(session: PlayerSession) {
150-
const jobs = [];
149+
public getProgress(ctx: JobContext) {
150+
return this.jobs.get(ctx)?.percent;
151+
}
152+
153+
public getJobsForSession(session: PlayerSession): JobContext[] {
154+
const jobs: JobContext[] = [];
151155
const player = session.player;
152156
for (const [id, data] of this.jobs.entries()) {
153157
if (data.player === player) jobs.push(id);
154158
}
155159
return jobs;
156160
}
157161

162+
public getJobsForThread(thread: Thread): JobContext[] {
163+
const jobs: JobContext[] = [];
164+
for (const [id, data] of this.jobs.entries()) {
165+
if (data.thread === thread) jobs.push(id);
166+
}
167+
return jobs;
168+
}
169+
158170
public cancelJob(jobId: JobContext) {
159171
const job = this.jobs.get(jobId);
160172
const history = getSession(job.player).history;

0 commit comments

Comments
 (0)