Skip to content

Commit aa3ee8d

Browse files
committed
fixed listmenu
1 parent 519362d commit aa3ee8d

File tree

4 files changed

+54
-30
lines changed

4 files changed

+54
-30
lines changed

build/scripts/menus.js

Lines changed: 18 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/scripts/playerCommands.js

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/menus.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ function menu(
7676
ArrangedElements.stringified.push(["<No Options Provided>"])
7777
ArrangedElements.data.push([null]); // not needed, but nice to keep data and string in sync.
7878
}
79+
7980
if(!callback){
8081
//overload 1, just display a menu with no callback
8182
Call.menu(target.con, registeredListeners.none, title, description, ArrangedElements.stringified);
@@ -124,9 +125,11 @@ function menu(
124125
export function pageMenu(title:string, description:string, elements:GUI_Element[][], target:FishPlayer, callback: (opts: {data:any, text:string, sender:FishPlayer, outputSuccess:(message:string) => void, outputFail:(message:string) => void;}) => void){
125126
let pages = elements.length
126127
function drawpage(index:number){
127-
let e:GUI_Element[] = [new GUI_Page(index+1,pages)]
128+
let e:GUI_Element[] = [];
128129
e.push(...elements[index])
130+
e.push(new GUI_Page(index+1, pages))
129131
menu(title,description,e, target, (res) => {
132+
// handle control element of the ui
130133
if(typeof res.data === 'string'){
131134
switch (res.data) {
132135
case "left":
@@ -141,20 +144,23 @@ export function pageMenu(title:string, description:string, elements:GUI_Element[
141144
default:
142145
callback(res);
143146
}
147+
}else{
148+
callback(res.data);
144149
}
145150
})
146151
return;
147152
}
153+
drawpage(0);
148154

149155
}
150-
//auto formats a array into a page menu
151156
//TODO make list a GUI_Element[] instead of a single Container
152-
export function listMenu(title:string, description:string, list:GUI_Container,target:FishPlayer, callback: (opts: {data:any, text:string, sender:FishPlayer, outputSuccess:(message:string) => void, outputFail:(message:string) => void;}) => void, pageSize:number = 10){
153-
let buttons = { data:[] as any[][],}
154-
list.data()[0].reduce((result, _, index) => { if (index % pageSize === 0) { buttons.data.push(buttons.data.slice(index, index + pageSize));}return result;});
155-
let pages:GUI_Element[][] = [];
156-
buttons.data.forEach(page => {pages.push([new GUI_Container(page,1,list.stringifier)])})//wrap each page in a container
157-
pageMenu(title,description,pages,target,callback);
157+
export function listMenu(title:string, description:string, list:GUI_Container, target:FishPlayer, callback: (opts: {data:any, text:string, sender:FishPlayer, outputSuccess:(message:string) => void, outputFail:(message:string) => void;}) => void, pageSize:number = 10){
158+
let pooledData:any[] = [];
159+
list.data().flat().forEach((data) => {pooledData.push(data)});
160+
let pagedData:any[][] = pooledData.reduce((res, _, index) => {if (index % pageSize === 0) {res.push(pooledData.slice(index, index + pageSize));}return res;}, [] as any[][]);
161+
let pagesElements:GUI_Element[][] = [];
162+
pagedData.forEach(pageData => pagesElements.push([new GUI_Container(pageData,1,list.stringifier)]));
163+
pageMenu(title,description,pagesElements,target,callback);
158164
}
159165
//#endregion
160166
//#region GUI Elements
@@ -163,8 +169,6 @@ interface GUI_Element{
163169
format():string[][],
164170
data():any[][]
165171
}
166-
167-
//const reservedStrings = ["left", "center", "right"] // strings used for paged menus, cannot be handled correct
168172
export class GUI_Container implements GUI_Element {
169173
constructor(
170174
public options:any[],
@@ -183,8 +187,8 @@ export class GUI_Page implements GUI_Element{
183187
public currentPage:number,
184188
public pages:number
185189
){}
186-
public format = () => {return([["<--"], [`${this.currentPage}/${this.pages}`], ["-->"]])};
187-
public data = () => {return([["left","center","left"]])}
190+
public format = () => {return(to2DArray(["<--", `${this.currentPage}/${this.pages}`, "-->"],3))};
191+
public data = () => {return([["left","center","right"]])}
188192

189193
}
190194
export class GUI_Confirm implements GUI_Element{
@@ -197,5 +201,4 @@ export {
197201
registeredListeners as listeners,
198202
menu
199203
};
200-
201-
204+
//#endregion

src/playerCommands.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as api from './api';
77
import { command, commandList, fail, formatArg, Perm, Req } from './commands';
88
import { FishServer, Gamemode, rules, text } from './config';
99
import { FishEvents, fishState, ipPortPattern, recentWhispers, tileHistory, uuidPattern } from './globals';
10-
import { GUI_Cancel, GUI_Confirm, GUI_Container, listMenu, menu } from './menus';
10+
import { GUI_Cancel, GUI_Confirm, GUI_Container, GUI_Page, listMenu, menu, pageMenu } from './menus';
1111
import { FishPlayer } from './players';
1212
import { Rank, RoleFlag } from './ranks';
1313
import type { FishCommandData } from './types';
@@ -892,14 +892,16 @@ Win rate: ${target.stats.gamesWon / target.stats.gamesFinished}`
892892
);
893893
}
894894
},
895-
/*
895+
896896
debug:{
897897
args: [],
898898
description: "mcdebug, do not add to pr",
899899
perm:Perm.none,
900900
handler({sender}){
901-
menu("debug list menu", "", [new GUI_Container(["option1", "option2", "option3"]), new GUI_Container(["option4", "option5", "option6"], 1)],sender, ({data}) => {Log.info(`Data ${data}`)})
901+
//menu("debug page menu", "", [new GUI_Page(1,2)], sender)
902+
//pageMenu("Multi Page Menu", "", [[new GUI_Container(["1", "2", "3", "4"], 1)], [new GUI_Container(["5", "6", "7", "8"],1)], [new GUI_Confirm()]], sender, ({data}) =>{Log.info(`Button ${data} Pressed`)});
903+
listMenu("listmenu", "", new GUI_Container(["option1","option2","option3","option4","option5","option6","option7","option8","option9","option10","option11","option12","option13","option14","option15","option16","option17","option18","option19","option20",]),sender,({data}) =>{Log.info(`Button ${data} Pressed`)})
902904
}
903905
},
904-
*/
906+
905907
});

0 commit comments

Comments
 (0)