_                _   _                 ____            _     _ 	
   / \   _ __   ___ | |_| |__   ___ _ __  |  _ \ _ __ ___ (_) __| |	
  / _ \ | '_ \ / _ \| __| '_ \ / _ \ '__| | | | | '__/ _ \| |/ _\` |	
 / ___ \| | | | (_) | |_| | | |  __/ |    | |_| | | | (_) | | (_| |	
/_/   \_\_| |_|\___/ \__|_| |_|\___|_|    |____/|_|  \___/|_|\__,_|	
                                                                bbs
  XQTRs lair...
Home // Blog // NULL emag. // Files // Docs // Tutors // GitHub repo

                                                                                
                                                                                
    lets create a lightbar menu, with some special uses. the following          
    code assumes that you are using my pycrt.py library from here:              
                                                                                
                      http://github.com/xqtr/pycrt/                             
                                                                                
    with small changes in the readkey() function, you can easily use the        
    python_bbs library and convert it to a mystic MPY script.                   
                                                                                
    our lightbar will have the following features:                              
                                                                                
    1.  each item, can be displayed anywhere in the screen. we can put the      
        items next to each other, below, diagonal or even in random             
        places. this way we can have a very interesting menu and not just       
        a "classic" vertical one.                                               
    2.  each item, can have a low/normal attribute and a highlighted /          
        selected one. to achieve this, we can just use color attributes or      
        pipe codes inside the text description.                                 
    3.  we will be able to select items, by using cursor keys but also by       
        using hotkeys, for more quick use of the menu.                          
    4.  each item will have a code, that it will be returned when the           
        specific item is selected with enter or the hotkey. it's more easy      
        to remember a string code, than index numbers.                          
    5.  we can use as many items we want. the only limitation is the size       
        of the screen... :p                                                     
                                                                                
                                                                                
    just to make it easy on ourselves, we use the following function to         
    create an item. each item, is a dictionary, so instead of trying to         
    remember each value for the dictionary fields, we use this function,        
    which is straightforward.                                                   
                                                                                
def baradditem(x,y,low,high,lowtext,hightext,key,code):                         
  return {'x':x,'y':y,'low':low,'high':high,'textlow':lowtext, \                
  'texthigh':hightext, 'key':key, 'code':code}                                  
                                                                                
    to create an item, we just do this:                                         
                                                                                
    item1 = baradditem(10,10,7,14,'|01[h]|03ello','|17|15[H]ELLO','hH','hello') 
                                                                                
    to hold all items information we just put each item inside a list like      
    this:                                                                       
                                                                                
    allitems.append(item1)                                                      
    allitems.append(item2)                                                      
    ...                                                                         
    allitems.append(itemx)                                                      
                                                                                
                                                                                
    now lets go to our main function... our function expects the list of        
    the items and if we want we can select the default selected item. by        
    default item index 0, will be selected. remember our list is zero           
    based, which means that if we have 5 items, their index number will be      
    0,1,2,3,4.                                                                  
                                                                                
def lightbarmenu(items,sel=0):                                                  
  # initialize our result variable                                              
  res = ""                                                                      
                                                                                
  # go into a loop                                                              
  while True:                                                                   
                                                                                
  # display the normal/unselected string of each item                           
    for i in range(len(items)):                                                 
      writexypipe(items[i]['x'],items[i]['y'],items[i]['low'], \                
      mcilen(items[i]['textlow']),items[i]['textlow'])                          
                                                                                
  # after we displayed all items, we also display the highlighted string        
  # of our selected item.                                                       
    writexypipe(items[sel]['x'],items[sel]['y'],items[sel]['high'], \           
    mcilen(items[sel]['texthigh']),items[sel]['texthigh'])                      
                                                                                
  # expect user input                                                           
    ans = readkey()                                                             
                                                                                
  # if user presses up/left cursor keys, decrease the selection index           
    if ans == "#up" or ans == "#left":                                          
      sel -= 1                                                                  
      if sel < 0: sel = len(items) - 1                                          
                                                                                
  # if user presses down/right cursor keys, increase the selection index        
    elif ans == "#down" or ans == "#right":                                     
      sel += 1                                                                  
      if sel > len(items) - 1 : sel = 0                                         
  # if esc is pressed, exit with an #esc code                                   
    elif ans == "#esc":                                                         
      res == "#esc"                                                             
      break                                                                     
  # if the user pressed enter, return the 'code' value of the selected          
  # item.                                                                       
    elif ans == "#enter":                                                       
      res = items[sel]['code']                                                  
      break                                                                     
  # if the user pressed something else, check to see if it's a hotkey. we       
  # check each items hotkey to see if matches the pressed key. if it is         
  # return the item 'code' field.                                               
    else:                                                                       
      for i in range(len(items)):                                               
        if ans in items[i]['key']:                                              
          res = items[i]['code']                                                
          return res                                                            
  return res                                                                    
                                                                                
                                                                                
  that was it!!! simple and short! you can create very cool lightbar menus      
  to use in your bbs or a door game or just a simple local terminal game        
  or script.                                                                    
                                                                                
  below is the code for the main function, with no comments to easily copy      
  paste.                                                                        
                                                                                
,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,./,.   
                                                                                
def lightbarmenu(items,sel=0):                                                  
  res = ""                                                                      
  while True:                                                                   
    for i in range(len(items)):                                                 
      writexypipe(items[i]['x'],items[i]['y'],items[i]['low'], \                
      mcilen(items[i]['textlow']),items[i]['textlow'])                          
    writexypipe(items[sel]['x'],items[sel]['y'],items[sel]['high'], \           
    mcilen(items[sel]['texthigh']),items[sel]['texthigh'])                      
                                                                                
    ans = readkey()                                                             
    if ans == "#up" or ans == "#left":                                          
      sel -= 1                                                                  
      if sel < 0: sel = len(items) - 1                                          
    elif ans == "#down" or ans == "#right":                                     
      sel += 1                                                                  
      if sel > len(items) - 1 : sel = 0                                         
    elif ans == "#esc":                                                         
      res == "#esc"                                                             
      break                                                                     
    elif ans == "#enter":                                                       
      res = items[sel]['code']                                                  
      break                                                                     
    else:                                                                       
      for i in range(len(items)):                                               
        if ans in items[i]['key']:                                              
          res = items[i]['code']                                                
          return res                                                            
  return res