diff --git a/images/eye-arrow-right.svg b/images/eye-arrow-right.svg
new file mode 100644
index 00000000..b042ea5e
--- /dev/null
+++ b/images/eye-arrow-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/layout/pages/zoning/zoning.xml b/layout/pages/zoning/zoning.xml
index b5ff9532..1ae23f87 100644
--- a/layout/pages/zoning/zoning.xml
+++ b/layout/pages/zoning/zoning.xml
@@ -132,6 +132,9 @@
+
diff --git a/scripts/pages/zoning/zoning.ts b/scripts/pages/zoning/zoning.ts
index e4edd4f7..cc863aa3 100644
--- a/scripts/pages/zoning/zoning.ts
+++ b/scripts/pages/zoning/zoning.ts
@@ -255,9 +255,9 @@ class ZoneMenuHandler {
const collapseButton = newTracklistPanel.FindChildTraverse('CollapseButton');
const childContainer = newTracklistPanel.FindChildTraverse('ChildContainer');
+ const expandIcon = newTracklistPanel.FindChildTraverse('TracklistExpandIcon');
+ const collapseIcon = newTracklistPanel.FindChildTraverse('TracklistCollapseIcon');
if (collapseButton && childContainer) {
- const expandIcon = newTracklistPanel.FindChildTraverse('TracklistExpandIcon');
- const collapseIcon = newTracklistPanel.FindChildTraverse('TracklistCollapseIcon');
collapseButton.SetPanelEvent('onactivate', () =>
this.toggleCollapse(childContainer, expandIcon, collapseIcon)
);
@@ -269,6 +269,15 @@ class ZoneMenuHandler {
selectButton.SetPanelEvent('onactivate', () =>
this.updateSelection(selectionObj.track, selectionObj.segment, selectionObj.zone)
);
+ if (selectionObj.zone) {
+ selectButton.SetPanelEvent('ondblclick', () =>
+ this.panels.zoningMenu.moveToRegion(selectionObj.zone.regions[0])
+ );
+ } else {
+ selectButton.SetPanelEvent('ondblclick', () =>
+ this.toggleCollapse(childContainer, expandIcon, collapseIcon)
+ );
+ }
if (setActive) {
selectButton.SetSelected(true);
@@ -412,8 +421,13 @@ class ZoneMenuHandler {
this.panels.regionHeight.text = (region?.height ?? 0).toFixed(2);
this.panels.regionSafeHeight.text = (region?.safeHeight ?? 0).toFixed(2);
- const tpIndex = region.teleDestTargetname === '' ? 0 : this.teleDestList?.indexOf(region.teleDestTargetname);
+ const tpIndex = !region.teleDestTargetname
+ ? region.teleDestPos !== undefined && region.teleDestYaw !== undefined
+ ? 1
+ : 0
+ : this.teleDestList?.indexOf(region.teleDestTargetname);
this.panels.regionTPDest.SetSelectedIndex(tpIndex);
+ this.updateRegionTPDest();
}
addRegion() {
@@ -440,6 +454,14 @@ class ZoneMenuHandler {
this.updateZones();
}
+ teleportToRegion() {
+ if (!this.selectedZone || !this.selectedZone.zone) return;
+
+ const index = this.panels.regionSelect.GetSelected().GetAttributeInt('value', -1);
+ const region = this.selectedZone.zone.regions[index];
+ this.panels.zoningMenu.moveToRegion(region);
+ }
+
pickCorners() {
if (!this.selectedZone || !this.selectedZone.zone) return;
@@ -458,10 +480,23 @@ class ZoneMenuHandler {
addPointToList(i: number, point: number[]) {
const newRegionPoint = $.CreatePanel('Panel', this.panels.pointsList, `Point ${i}`);
newRegionPoint.LoadLayoutSnippet('region-point');
- newRegionPoint.FindChildTraverse('PointX').text = point[0].toFixed(2);
- newRegionPoint.FindChildTraverse('PointY').text = point[1].toFixed(2);
+
const deleteButton = newRegionPoint.FindChildTraverse('DeleteButton');
deleteButton.SetPanelEvent('onactivate', () => this.deleteRegionPoint(newRegionPoint));
+
+ const xText = newRegionPoint.FindChildTraverse('PointX');
+ xText.text = point[0].toFixed(2);
+ xText.SetPanelEvent('ontextentrysubmit', () => {
+ point[0] = Number.parseFloat(xText.text);
+ this.updateZones();
+ });
+
+ const yText = newRegionPoint.FindChildTraverse('PointY');
+ yText.text = point[1].toFixed(2);
+ yText.SetPanelEvent('ontextentrysubmit', () => {
+ point[1] = Number.parseFloat(yText.text);
+ this.updateZones();
+ });
}
deleteRegionPoint(point: Panel) {
@@ -545,13 +580,9 @@ class ZoneMenuHandler {
delete region.teleDestPos;
delete region.teleDestYaw;
- this.panels.regionTPPos.x.text = '';
- this.panels.regionTPPos.y.text = '';
- this.panels.regionTPPos.z.text = '';
- this.panels.regionTPYaw.text = '';
this.setRegionTPDestTextEntriesActive(false);
} else if (teleDestIndex === 1 && region.points.length > 0) {
- if (!region.teleDestPos || !region.teleDestYaw) {
+ if (region.teleDestPos === undefined || region.teleDestYaw === undefined) {
region.teleDestPos = [0, 0, region.bottom];
const den = 1 / region.points.length;
region.points.forEach((val) => {
@@ -559,23 +590,20 @@ class ZoneMenuHandler {
region.teleDestPos[1] += val[1] * den;
});
region.teleDestYaw = 0;
+ region.teleDestTargetname = '';
}
this.panels.regionTPPos.x.text = region.teleDestPos[0].toFixed(2);
this.panels.regionTPPos.y.text = region.teleDestPos[1].toFixed(2);
this.panels.regionTPPos.z.text = region.teleDestPos[2].toFixed(2);
this.panels.regionTPYaw.text = region.teleDestYaw.toFixed(2);
+
this.setRegionTPDestTextEntriesActive(true);
} else {
region.teleDestTargetname = this.teleDestList[teleDestIndex];
-
delete region.teleDestPos;
delete region.teleDestYaw;
- this.panels.regionTPPos.x.text = '';
- this.panels.regionTPPos.y.text = '';
- this.panels.regionTPPos.z.text = '';
- this.panels.regionTPYaw.text = '';
this.setRegionTPDestTextEntriesActive(false);
}
@@ -605,6 +633,13 @@ class ZoneMenuHandler {
this.panels.regionTPPosPick.enabled = enable;
this.panels.regionTPYaw.enabled = enable;
this.panels.regionTPYawPick.enabled = enable;
+
+ if (!enable) {
+ this.panels.regionTPPos.x.text = '';
+ this.panels.regionTPPos.y.text = '';
+ this.panels.regionTPPos.z.text = '';
+ this.panels.regionTPYaw.text = '';
+ }
}
onPointPicked(point: { x: number; y: number; z: number }) {
diff --git a/scripts/types-mom/panels.d.ts b/scripts/types-mom/panels.d.ts
index dfb6206a..4aa47c1a 100644
--- a/scripts/types-mom/panels.d.ts
+++ b/scripts/types-mom/panels.d.ts
@@ -135,4 +135,6 @@ interface ZoneMenu extends AbstractPanel<'ZoneMenu'> {
getEntityList(): import('pages/zoning/zoning').EntityList;
setCornersFromRegion(region: import('common/web').Region): void;
+
+ moveToRegion(region: import('common/web').Region): void;
}