diff --git a/mystic/bbs_cfg_menuedit.pas b/mystic/bbs_cfg_menuedit.pas index bc7f8d6..f852a27 100644 --- a/mystic/bbs_cfg_menuedit.pas +++ b/mystic/bbs_cfg_menuedit.pas @@ -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; diff --git a/mystic/bbs_io.pas b/mystic/bbs_io.pas index f75f162..723a7e6 100644 --- a/mystic/bbs_io.pas +++ b/mystic/bbs_io.pas @@ -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]; diff --git a/mystic/bbs_menus.pas b/mystic/bbs_menus.pas index a95d81e..0ee1fe0 100644 --- a/mystic/bbs_menus.pas +++ b/mystic/bbs_menus.pas @@ -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. diff --git a/mystic/records.pas b/mystic/records.pas index 0051658..1f04e7e 100644 --- a/mystic/records.pas +++ b/mystic/records.pas @@ -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