More fixes for new menu engine. Timer events now have additional execution options

This commit is contained in:
mysticbbs 2012-07-24 16:29:51 -04:00
parent 2d67b42fa6
commit 3f217b6262
4 changed files with 92 additions and 51 deletions

View File

@ -276,7 +276,7 @@ Begin
Form.AddNone ('C', ' Command ', 15, 11, 9, Topic + 'Menu command function');
Form.AddStr ('A', ' Access ' , 16, 12, 26, 12, 8, 30, 30, @Menu.Item[Num]^.CmdData[CmdNum]^.Access, Topic + 'Access level to run this command');
Form.AddStr ('D', ' Data ' , 18, 13, 26, 13, 6, 40, 80, @Menu.Item[Num]^.CmdData[CmdNum]^.Data, Topic + 'Menu command optional data');
Form.AddStr ('D', ' Data ' , 18, 13, 26, 13, 6, 40, 160, @Menu.Item[Num]^.CmdData[CmdNum]^.Data, Topic + 'Menu command optional data');
Form.AddTog ('G', ' Execute ', 15, 14, 26, 14, 9, 6, 0, 10, 'Selected Up Down Left Right Tab Escape PgUp PgDn Home End', @Menu.Item[Num]^.CmdData[CmdNum]^.JumpID, Topic + '(Grid) Execute command on what Grid event?');
Repeat
@ -346,6 +346,7 @@ Begin
VerticalLine (18, 6, 14);
VerticalLine (60, 10, 14);
VerticalLine (41, 14, 14);
VerticalLine (73, 10, 14);
WriteXY (4, 15, 112, 'Command ' + strRep(#196, 18) + ' Access ' + strRep(#196, 5) + ' Data ' + strRep(#196, 29));
@ -365,7 +366,9 @@ Begin
Form.AddByte ('X', 'X' , 14, 12, 20, 12, 1, 2, 0, 80, @Menu.Item[Num]^.X, Topic + 'X coordinate of lightbar');
Form.AddByte ('Y', 'Y' , 16, 12, 23, 12, 1, 2, 0, 50, @Menu.Item[Num]^.Y, Topic + 'Y coordinate of lightbar');
Form.AddWord ('M', ' Timer ' , 11, 13, 20, 13, 7, 5, 0, 65535, @Menu.Item[Num]^.Timer, Topic + 'Timer interval (seconds)');
Form.AddBol ('W', ' Redraw ' , 10, 14, 20, 14, 8, 3, @Menu.Item[Num]^.ReDraw, Topic + 'Redraw menu after running this command?');
Form.AddTog ('X', ' Exec Type' , 7, 14, 20, 14, 11, 9, 0, 2, 'Interval OnlyOnce PerRedraw', @Menu.Item[Num]^.TimerType, Topic + 'TIMER event execution type');
Form.AddBol ('W', ' Redraw ' , 33, 14, 43, 14, 8, 3, @Menu.Item[Num]^.ReDraw, Topic + 'Redraw menu after running this command?');
Form.AddByte ('U', ' Up ' , 56, 10, 62, 10, 4, 3, 0, 255, @Menu.Item[Num]^.JumpUp, Topic + '(Grid) Item # to jump to when UP is pressed');
Form.AddByte ('D', ' Down ' , 54, 11, 62, 11, 6, 3, 0, 255, @Menu.Item[Num]^.JumpDown, Topic + '(Grid) Item # to jump to when DOWN is pressed');
@ -379,12 +382,12 @@ Begin
Form.AddByte ('G', ' PageDn ' , 65, 13, 75, 13, 8, 3, 0, 255, @Menu.Item[Num]^.JumpPgDn, Topic + '(Grid) Item # to jump to when PGDN is pressed');
Form.AddByte ('N', ' End ' , 68, 14, 75, 14, 5, 3, 0, 255, @Menu.Item[Num]^.JumpEnd, Topic + '(Grid) Item # to jump to when END is pressed');
WriteXY (25, 21, 113, Status1);
WriteXY (26, 21, 120, Status1);
Repeat
Case Form.Execute of
#09 : Begin
WriteXY (25, 21, 113, Status2);
WriteXY (26, 21, 120, Status2);
Repeat
MakeList;
@ -394,8 +397,8 @@ Begin
List.Open (2, 15, 79, 21);
Case List.ExitCode of
'/' : Case GetCommandOption(10, 'A-Add|D-Delete|') of
'A' : Begin
'/' : Case GetCommandOption(10, 'I-Insert|D-Delete|') of
'I' : Begin
Menu.InsertCommand(Num, List.Picked);
Changed := True;
End;
@ -414,7 +417,7 @@ Begin
End;
Until False;
WriteXY (25, 21, 113, Status1);
WriteXY (26, 21, 120, Status1);
If List.ExitCode = #27 Then Break;
End;
@ -521,8 +524,8 @@ Begin
List.Open (9, 7, 72, 19);
Case List.ExitCode of
'/' : Case GetCommandOption(10, 'F-Flags|A-Add|D-Delete|C-Copy|P-Paste|V-View|') of
'A' : Begin
'/' : Case GetCommandOption(10, 'F-Flags|I-Insert|D-Delete|C-Copy|P-Paste|V-View|') of
'I' : Begin
Menu.InsertItem(List.Picked);
Changed := True;
End;

View File

@ -1271,14 +1271,14 @@ Begin
Repeat
If LastSecond <> TimerSeconds Then Begin
LastSecond := TimerSeconds;
If Assigned(GetKeyCallBack) Then
If GetKeyCallBack(False) Then Begin
Result := #02;
Exit;
End;
LastSecond := TimerSeconds;
If InMacro Then
If InMacroPos <= Length(InMacroStr) Then Begin
Result := InMacroStr[InMacroPos];

View File

@ -21,7 +21,6 @@ Type
UseHotKeys : Boolean;
ReDraw : Boolean;
SetAction : Boolean;
UseLongKey : Boolean;
UseTimer : Boolean;
TimerCount : LongInt;
TimerReload : Boolean;
@ -38,6 +37,7 @@ Type
Function ExecuteByHotkey (Key: String; Interval: LongInt) : Byte;
Function ExecuteCommand (Cmd, CmdData: String) : Boolean;
Function SpecialKey (Str: String) : Boolean;
Function MenuGetKey : Char;
Function ShowMenu : Boolean;
Procedure GenerateMenu;
Procedure DoStandardMenu;
@ -48,7 +48,9 @@ Implementation
Uses
m_Strings,
m_DateTime,
BBS_Core,
BBS_IO,
BBS_NodeInfo,
BBS_General,
BBS_Doors,
@ -379,18 +381,31 @@ Begin
Key := strUpper(Key);
For Count := 1 to Data.NumItems Do Begin
If Data.Item[Count] = Nil Then Begin
Result := 2;
Exit;
Break;
End;
If Data.Item[Count]^.HotKey = Key Then
If (Key <> 'TIMER') or ((Key = 'TIMER') And (Interval MOD Data.Item[Count]^.Timer = 0)) Then Begin
Result := ExecuteCommandList(Count, -1);
If Data.Item[Count]^.HotKey = Key Then Begin
If Key <> 'TIMER' Then
Result := ExecuteCommandList(Count, -1)
Else
If (Interval MOD Data.Item[Count]^.Timer <> 0) Then
Continue
Else Begin
If Result = 2 Then Exit;
Case Data.Item[Count]^.TimerType of
0 : Result := ExecuteCommandList(Count, -1);
1,
2 : If Data.Item[Count]^.TimerShow Then Begin
Result := ExecuteCommandList(Count, -1);
Data.Item[Count]^.TimerShow := False;
End;
End;
End;
If Result = 2 Then Break;
End;
End;
End;
@ -420,6 +435,12 @@ Var
Listed : Word;
Count : LongInt;
Begin
If UseTimer Then Begin
For Count := 1 to Data.NumItems Do
If Data.Item[Count]^.TimerType = 2 Then
Data.Item[Count]^.TimerShow := True;
End;
If ShowMenu Then Begin
Case Data.Info.DispCols of
1 : Format := 79;
@ -531,7 +552,7 @@ Begin
Temp := '';
While Not TBBSCore(Owner).ShutDown Do Begin
Ch := Session.io.GetKey;
Ch := MenuGetKey;
If TBBSCore(Owner).ShutDown Then Exit;
@ -602,6 +623,42 @@ Begin
End;
End;
Function TMenuEngine.MenuGetKey : Char;
Var
Current : LongInt;
LastSec : LongInt;
Begin
LastSec := TimerSeconds;
While Not TBBSCore(Owner).ShutDown Do Begin
Result := TBBSCore(Owner).io.InKey(1000);
If TBBSCore(Owner).ShutDown Then Exit;
If UseTimer And (TimerSeconds <> LastSec) Then Begin
LastSec := TimerSeconds;
Inc (TimerCount);
Case ExecuteByHotkey('TIMER', TimerCount) of
1 : If ReDraw Then Begin
Result := #02;
Exit;
End;
2 : Begin
TimerReload := True;
Result := #02;
Exit;
End;
End;
If TimerCount = 1000000000 Then TimerCount := 0;
End;
If Result <> #255 Then Break;
End;
End;
Procedure TMenuEngine.DoLightBarMenu;
Var
TempStr : String;
@ -703,10 +760,15 @@ Begin
Set_Node_Action(TBBSCore(Owner).GetPrompt(346));
If ReDraw Then Begin
If UseTimer Then Begin
For Count := 1 to Data.NumItems Do
If Data.Item[Count]^.TimerType = 2 Then
Data.Item[Count]^.TimerShow := True;
End;
ShowMenu;
// If Data.Info.Header <> '' Then
TBBSCore(Owner).io.OutFullLn(Data.Info.Header);
TBBSCore(Owner).io.OutFullLn(Data.Info.Header);
If Data.Info.Footer <> '' Then
TBBSCore(Owner).io.OutFull(Data.Info.Footer);
@ -734,7 +796,7 @@ Begin
TempStr := '';
While Not TBBSCore(Owner).ShutDown Do Begin
Ch := Session.io.GetKey;
Ch := MenuGetKey;
If UseTimer And (Ch = #02) Then Begin
If TimerReload Then Exit;
@ -927,23 +989,6 @@ Begin
End;
Procedure TMenuEngine.ExecuteMenu (Load, Forced, View, Action: Boolean);
Function TimerController (Forced: Boolean) : Boolean;
Begin
Inc (TimerCount);
Case ExecuteByHotkey('TIMER', TimerCount) of
0 : Result := False;
1 : Result := True;
2 : Begin
TimerReload := True;
Result := True;
End;
End;
If TimerCount = 1000000000 Then TimerCount := 0;
End;
Var
Count : LongInt;
Begin
@ -983,12 +1028,9 @@ Begin
Else
UseHotKeys := Not Boolean(Data.Info.InputType - 1);
// Run FIRSTCMD commands and setup valid extended keys
ExtKeys := '';
UseTimer := False;
ReDraw := True;
UseLongKey := False;
TimerCount := 0;
TimerReload := False;
@ -1010,13 +1052,9 @@ Begin
If Data.Item[Count]^.HotKey = 'PAGEDOWN' Then ExtKeys := ExtKeys + #81 Else
If Data.Item[Count]^.HotKey = 'HOME' Then ExtKeys := ExtKeys + #71 Else
If Data.Item[Count]^.HotKey = 'END' Then ExtKeys := ExtKeys + #79 Else
If Data.Item[Count]^.HotKey = 'TIMER' Then UseTimer := True Else
If Byte(Data.Item[Count]^.HotKey[0]) > 1 Then UseLongKey := True;
If Data.Item[Count]^.HotKey = 'TIMER' Then UseTimer := True;
End;
If UseTimer Then
Session.io.GetKeyCallBack := TimerController;
Case Data.Info.MenuType of
0 : DoStandardMenu;
1,
@ -1025,8 +1063,6 @@ Begin
Else
DoStandardMenu;
End;
Session.io.GetKeyCallback := NIL;
End;
End.

View File

@ -47,7 +47,7 @@ Const
mysMaxVoteQuestion = 20; // Max number of voting questions
mysMaxMenuNameLen = 20; // menu name size
mysMaxMenuItems = 75; // Maximum menu items per menu
mysMaxMenuCmds = 20; // Max menu commands per item
mysMaxMenuCmds = 25; // Max menu commands per item
mysMaxMenuInput = 12;
mysMaxMenuStack = 8;
mysMaxThemeText = 493; // Total prompts in theme file
@ -525,7 +525,7 @@ Type
RecMenuCmd = Packed Record
MenuCmd : String[2];
Access : String[mysMaxAcsSize];
Data : String[80];
Data : String[160];
JumpID : Byte;
End;
@ -553,6 +553,8 @@ Type
X : Byte;
Y : Byte;
Timer : Word;
TimerType : Byte;
TimerShow : Boolean;
End;
RecMenuInfo = Packed Record