From 23e149c2d77d50f5f0d3062129ef71f80694ddb9 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Fri, 30 Dec 2005 06:19:06 +0000 Subject: [PATCH] Fix hotkey functionality. Make spaces between horizontal options the default attribute. Rename uber-function to lightbar_func. Add object support. Create a new Lightbar object with: var lb=new Lightbar(); Or optionally specify items like so: var lb=new Lightbar([{text:"Option1",retval:"1"},{text:"Option2",retval:"2"}]); Add a new option to the end of the items like this: lb.add(text, retval [, width]); Clear the items array using: lb.clear(); Execute the lightbar with: lb.getval([currentindex]); // Returns the retval for the selected item Properties are: xpos: Horizontal position of lightbar menu (1-based) xpos: Vertical position of lightbar menu (1-based) items: an array of objects each having the following properties: text - The displayed text. A | prefixes a hotkey retval - The value to return if this is selected OPTIONAL Properties: width - The width of this item. If not specified, is the width of the text. Otherwise, the text is truncated or padded with spaces to fit the width. direction: 0 for vertical, 1 for horizontal. Horizontal menus always have one space of padding added between items. fg: Foreground colour of a non-current item bg: Background colour of a non-current item hfg: Foreground colour of a current item hbg: Background colour of a current item kfg: Hotkey forground colour for non-current item khfg: Hotkey foreground colour for current item current: Index of currently highlighted item (ToDo: This should be passed by reference (how?)!) align: If width is greater than the text length, a zero indicates the text should be left-aligned, a 1 indicates it should be right-aligned, and a 2 indicates it should be centered. The Lightbar object will display a list of options and prompt the user for a selection if lightbar_func() returns NULL. Still todo... make the current value stay at the last selected one. --- exec/load/lightbar.js | 115 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 111 insertions(+), 4 deletions(-) diff --git a/exec/load/lightbar.js b/exec/load/lightbar.js index e1a5c392a4..eeef982992 100644 --- a/exec/load/lightbar.js +++ b/exec/load/lightbar.js @@ -7,7 +7,103 @@ load("sbbsdefs.js"); /* - * Lightbar function... draws and returns selected value. + * Lightbar object + * Properties: + * xpos: Horizontal position of lightbar menu (1-based) + * xpos: Vertical position of lightbar menu (1-based) + * items: an array of objects each having the following properties: + * text - The displayed text. A | prefixes a hotkey + * retval - The value to return if this is selected + * OPTIONAL Properties: + * width - The width of this item. If not specified, is the width of + * the text. Otherwise, the text is truncated or padded with + * spaces to fit the width. + * direction: 0 for vertical, 1 for horizontal. + * Horizontal menus always have one space of padding added between + * items. + * fg: Foreground colour of a non-current item + * bg: Background colour of a non-current item + * hfg: Foreground colour of a current item + * hbg: Background colour of a current item + * kfg: Hotkey forground colour for non-current item + * khfg: Hotkey foreground colour for current item + * current: Index of currently highlighted item (ToDo: This should be passed by reference (how?)!) + * align: If width is greater than the text length, a zero indicates the text + * should be left-aligned, a 1 indicates it should be right-aligned, and + * a 2 indicates it should be centered. + */ +function Lightbar(items) +{ + this.fg=7; + this.bg=1; + this.xpos=1; + this.ypos=1; + this.direction=0; + this.hfg=1; + this.hbg=7; + this.kfg=15; + this.khfg=15; + this.current=0; + this.align=0; + this.getval=Lightbar_getval; + this.clear=Lightbar_clearitems; + this.add=Lightbar_additem; + if(items==undefined) + this.items=new Array(); + else + this.items=items; +} + +function Lightbar_additem(txt, retval, width) +{ + var item=new Object; + + if(txt==undefined) { + alert("Text of item undefined!"); + return; + } + if(retval==undefined) { + alert("Retval of item undefined!"); + return; + } + item.text=txt; + item.retval=retval; + if(width!=undefined) + item.width=width; + this.items.push(item); +} + +function Lightbar_clearitems() +{ + this.items=new Array(); +} + +function Lightbar_getval(current) +{ + var retval; + if(current!=undefined) + this.current=current; + retval=lightbar_func(this.xpos, this.ypos, this.items, this.direction, this.fg + , this.bg, this.hfg, this.hbg, this.kfg, this.khfg, this.current + , this.align); + if(retval==null) { + for(i=0; i<this.items.length; i++) { + if(this.items[i] != undefined && this.items[i].text != undefined) { + writeln((i+1)+": "+this.items[i].text); + } + } + write("Choose an option: "); + i=console.getnum(i); + if(this.items[i]==undefined) + return(null); + if(this.items[i].retval==undefined) + return(undefined); + return(this.items[i].retval); + } +} + +/* + * Super-Overlord Lightbar function... draws and returns selected value. * Parameters: * xpos: Horizontal position of lightbar menu (1-based) * xpos: Vertical position of lightbar menu (1-based) @@ -34,12 +130,13 @@ * Return Values: * null for error, retval from the selected item for non-errors */ -function lightbar(xpos, ypos, items, direction, fg, bg, hfg, hbg, kfg, khfg, current, align) +function lightbar_func(xpos, ypos, items, direction, fg, bg, hfg, hbg, kfg, khfg, current, align) { var attr=bg<<4|fg; var cattr=hbg<<4|hfg; var kattr=bg<<4|kfg; var kcattr=hbg<<4|khfg; + var ret=undefined; if(!(user.settings & USER_ANSI)) { alert("ANSI not supported for lightbar!"); @@ -149,14 +246,15 @@ function lightbar(xpos, ypos, items, direction, fg, bg, hfg, hbg, kfg, khfg, cur console.attributes=kcattr; else console.attributes=kattr; + j++; } else { if(current==i) console.attributes=cattr; else console.attributes=attr; - console.write(items[i].text.substr(j,1)); } + console.write(items[i].text.substr(j,1)); } if(current==i) console.attributes=cattr; @@ -168,10 +266,15 @@ function lightbar(xpos, ypos, items, direction, fg, bg, hfg, hbg, kfg, khfg, cur } if(direction==0) cury++; - else + else { + console.attributes=attr; + console.write(" "); curx+=width+1; + } } console.gotoxy(cursx,cursy); + if(ret!=undefined) + return(ret); /* Get input */ var key=console.getkey(K_UPPER); @@ -220,6 +323,10 @@ function lightbar(xpos, ypos, items, direction, fg, bg, hfg, hbg, kfg, khfg, cur for(i=0; i<items.length; i++) { if(items[i].text.indexOf('|'+key)!=-1) { current=i; + if(items[current].retval==undefined) + return(undefined); + /* Let it go through once more to highlight */ + ret=items[current].retval; break; } } -- GitLab