User Tools

Site Tools


message_area_selection_with_lightbars
% lightbar msg area selector
% by ck

{
    @ int maxCmd = 256   % maximum msg areas
    @ byte maxLen = 50   % maximum msg area description length
    @ byte curCmd = 1    % current lightbar position

    @ str<maxLen>(maxCmd) menu             

    proc doMenu[byte numCmd] {
        @ int longest, x, z, ty, tx, Top, WinSize
 
        proc barOn[byte Num] {
            gotoxy[tx-1,ty+Num-Top]
            cout["@X1F "+strSize[menu(Num),longest]+" "]
        }

        proc barOff[byte Num] {
            gotoxy[tx-1,ty+Num-Top]
            cout["@X08 "+strSize[menu(Num),longest]+" "]
        }

        proc RedrawCmds {
            @ int i
            i = curCmd
            for curCmd = Top to Top+WinSize-1 do if curCmd = i then barOn[curCmd] else barOff[curCmd]
            curCmd = i
        }

        longest = 0             % find the longest msg area name
                                % to know where to put the list
                                % and the size of the lightbar
                                % (to center the list)
        for x = 1 to numCmd do {
             z = strLen[strnocolor[menu(x)]]
             if z > longest then longest = z
        }

        ty = 3                  % list starts at y = 3
        tx = 40-(longest/2)     % center the list
        WinSize = 20            % Window size of the area list
        Top = 1

        z = curCmd
        for curCmd = Top to Top+WinSize-1 do if curCmd = z then barOn[curCmd] else barOff[curCmd]
        curCmd = z

        RedrawCmds

        @ str key
        key = ""       
        while (not key = #13) and (not hangup) do
        {
         key = inkey
         if (key = #80) or (key = " ")  then   % down or space pressed
          {
            barOff[curCmd]
            if curCmd = NumCmd then            % if at the end of the list
                                               % go back to the first item
             {                                 
               curCmd = 1
               Top = curCmd
               RedrawCmds
             }
            else
             curCmd = curCmd + 1
            z = curCmd - Top
            if z >= WinSize then               
             {              
               Top = Top + 1
               RedrawCmds
             } else barOn[curCmd]
          }
         if (key = #72) then                   % up pressed
          {
            barOff[curCmd]
            if curCmd = 1 then
             {
               curCmd = NumCmd
               Top = curCmd - WinSize + 1
               if Top < 1 then Top = 1
               RedrawCmds
             }
            else
             curCmd = curCmd - 1
            if (curCmd < Top) then
             {
               Top = Top - 1
               RedrawCmds
             } else barOn[curCmd]
          }
        }
    }

    @ int i
    @ int numCmd = 0

    initmalist                  % load a list of areas to which user has access
    for i = 1 to numMa do
     if (i <= maxCmd) then
      {
        getma[i]                % load msg area #i
        menu(i) = maname
        numCmd = numCmd + 1
      }

    setcolor[7,0]
    clrscr
    doMenu[numCmd]
    setcolor[7,0]

    getma[curCmd]               % set the current msg area to selected item
}
message_area_selection_with_lightbars.txt · Last modified: by admin

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki