More fixes to the new menu engine. Should hopefully be pretty solid now.

This commit is contained in:
mysticbbs 2012-07-24 17:54:01 -04:00
parent d806eec5cf
commit 1292933785
4 changed files with 143 additions and 111 deletions

View File

@ -4313,7 +4313,8 @@
+ Added new ANSI menu editor to replace the old outdated crap. The new + Added new ANSI menu editor to replace the old outdated crap. The new
editor has references to all of the menu commands as well as the special editor has references to all of the menu commands as well as the special
functional hotkeys. functional hotkeys. It still maintains the ability to "simulate" menus
as well.
+ Revamped the entire menu system. Menu files must be converted if you are + Revamped the entire menu system. Menu files must be converted if you are
any version pre 1.10 alpha 15 using the CvtMenus program. Simply copy any version pre 1.10 alpha 15 using the CvtMenus program. Simply copy
@ -4336,7 +4337,9 @@
approach this way, and it allows for more options! approach this way, and it allows for more options!
+ Each menu command now has the option to redraw the menu or not after its + Each menu command now has the option to redraw the menu or not after its
command list executes. command list executes. This defaults to on to mimic previous menu system
however for some advanced stuff, like TIMER, you may will to turn them
off.
+ Menus can now be internally generated from 1 to 4 columns (up from 3) + Menus can now be internally generated from 1 to 4 columns (up from 3)
@ -4423,10 +4426,21 @@
counter used to fire off TIMER commands. It represents the number of counter used to fire off TIMER commands. It represents the number of
seconds that have passed since the menu was loaded. seconds that have passed since the menu was loaded.
+ TIMER commands also have 3 types, configurable per each menu option:
Interval - Always execute at the configured timed interval
OnlyOnce - Execute at interval ONLY ONCE per menu being loaded
PerRedraw - Execute after each menu redraw as per timer interval
+ When using hotkey-style menu input, extended hotkeys are no longer + When using hotkey-style menu input, extended hotkeys are no longer
required to have a / first. You can make a hotkey command named QUIT required to have a / first. You can make a hotkey command named QUIT
for example, and it will execute immediately when QUIT is entered. for example, and it will execute immediately when QUIT is entered.
Keep in mind it is still a hot-key styled input. So you cannot have
one hotkey named QUIT and one named QUITNOW. The QUIT command will
always get the hotkey. If you need functionality like that, hotkeys
can be disabled on the menu.
+ Similar to the display file and menu systems, the MPL scripts directory + Similar to the display file and menu systems, the MPL scripts directory
will now also fallback from the theme scripts path to the default will now also fallback from the theme scripts path to the default
scripts directory if the feature is enabled in the selected theme. scripts directory if the feature is enabled in the selected theme.

View File

@ -307,6 +307,7 @@ Procedure EditItem (Num: Word);
Const Const
Status1 = ' (TAB) to edit menu commands '; Status1 = ' (TAB) to edit menu commands ';
Status2 = ' (TAB) Switch (/) Commands '; Status2 = ' (TAB) Switch (/) Commands ';
Grid = '(Grid) Item # to jump to on keypress ';
Var Var
Box : TAnsiMenuBox; Box : TAnsiMenuBox;
List : TAnsiMenuList; List : TAnsiMenuList;
@ -366,21 +367,21 @@ Begin
Form.AddByte ('X', 'X' , 14, 12, 20, 12, 1, 2, 0, 80, @Menu.Item[Num]^.X, Topic + 'X coordinate of lightbar'); 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.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.AddWord ('M', ' Timer' , 11, 13, 20, 13, 7, 5, 0, 65535, @Menu.Item[Num]^.Timer, Topic + 'Timer interval (seconds)');
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.AddTog ('X', ' Timer Type' , 6, 14, 20, 14, 12, 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.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 ('U', ' Up' , 56, 10, 62, 10, 4, 3, 0, 255, @Menu.Item[Num]^.JumpUp, Topic + Grid + 'UP');
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'); Form.AddByte ('D', ' Down' , 54, 11, 62, 11, 6, 3, 0, 255, @Menu.Item[Num]^.JumpDown, Topic + Grid + 'DOWN');
Form.AddByte ('L', ' Left ' , 54, 12, 62, 12, 6, 3, 0, 255, @Menu.Item[Num]^.JumpLeft, Topic + '(Grid) Item # to jump to when LEFT is pressed'); Form.AddByte ('L', ' Left' , 54, 12, 62, 12, 6, 3, 0, 255, @Menu.Item[Num]^.JumpLeft, Topic + Grid + 'LEFT');
Form.AddByte ('R', ' Right ' , 53, 13, 62, 13, 7, 3, 0, 255, @Menu.Item[Num]^.JumpRight, Topic + '(Grid) Item # to jump to when RIGHT is pressed'); Form.AddByte ('R', ' Right' , 53, 13, 62, 13, 7, 3, 0, 255, @Menu.Item[Num]^.JumpRight, Topic + Grid + 'RIGHT');
Form.AddByte ('E', ' Home ' , 54, 14, 62, 14, 6, 3, 0, 255, @Menu.Item[Num]^.JumpHome, Topic + '(Grid) Item # to jump to when HOME is pressed'); Form.AddByte ('E', ' Home' , 54, 14, 62, 14, 6, 3, 0, 255, @Menu.Item[Num]^.JumpHome, Topic + Grid + 'HOME');
Form.AddByte ('C', ' Escape ' , 65, 10, 75, 10, 8, 3, 0, 255, @Menu.Item[Num]^.JumpEscape, Topic + '(Grid) Item # to jump to when ESCAPE is pressed'); Form.AddByte ('C', ' Escape' , 65, 10, 75, 10, 8, 3, 0, 255, @Menu.Item[Num]^.JumpEscape, Topic + Grid + 'ESCAPE');
Form.AddByte ('T', ' Tab ' , 68, 11, 75, 11, 5, 3, 0, 255, @Menu.Item[Num]^.JumpTab, Topic + '(Grid) Item # to jump to when TAB is pressed'); Form.AddByte ('T', ' Tab' , 68, 11, 75, 11, 5, 3, 0, 255, @Menu.Item[Num]^.JumpTab, Topic + Grid + 'TAB');
Form.AddByte ('P', ' PageUp ' , 65, 12, 75, 12, 8, 3, 0, 255, @Menu.Item[Num]^.JumpPgUp, Topic + '(Grid) Item # to jump to when PGUP is pressed'); Form.AddByte ('P', ' PageUp' , 65, 12, 75, 12, 8, 3, 0, 255, @Menu.Item[Num]^.JumpPgUp, Topic + Grid + 'PGUP');
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 ('G', ' PageDn' , 65, 13, 75, 13, 8, 3, 0, 255, @Menu.Item[Num]^.JumpPgDn, Topic + Grid + 'PGDN');
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'); Form.AddByte ('N', ' End' , 68, 14, 75, 14, 5, 3, 0, 255, @Menu.Item[Num]^.JumpEnd, Topic + Grid + 'END');
WriteXY (26, 21, 120, Status1); WriteXY (26, 21, 120, Status1);

View File

@ -95,6 +95,7 @@ Type
Function InXY (X, Y, Field, Max, Mode: Byte; Default: String) : String; Function InXY (X, Y, Field, Max, Mode: Byte; Default: String) : String;
Function InKey (Wait: LongInt) : Char; Function InKey (Wait: LongInt) : Char;
Function GetYNL (Str: String; Yes: Boolean) : Boolean; Function GetYNL (Str: String; Yes: Boolean) : Boolean;
Function DoInputEvents (Var Ch: Char) : Boolean;
Function GetKey : Char; Function GetKey : Char;
Function GetYN (Str: String; Yes: Boolean) : Boolean; Function GetYN (Str: String; Yes: Boolean) : Boolean;
Function GetPW (Str : String; BadStr : String; PW : String) : Boolean; Function GetPW (Str : String; BadStr : String; PW : String) : Boolean;
@ -1258,30 +1259,17 @@ Begin
End; End;
{$ENDIF} {$ENDIF}
Function TBBSIO.GetKey : Char; Function TBBSIO.DoInputEvents (Var Ch: Char) : Boolean;
Var Var
TimeCount : LongInt; TimeCount : LongInt;
Begin Begin
Result := #255; Result := False;
TBBSCore(Core).TimeOut := TimerSeconds;
BufFlush;
Repeat
If LastSecond <> TimerSeconds Then Begin
LastSecond := TimerSeconds;
If Assigned(GetKeyCallBack) Then
If GetKeyCallBack(False) Then Begin
Result := #02;
Exit;
End;
If InMacro Then If InMacro Then
If InMacroPos <= Length(InMacroStr) Then Begin If InMacroPos <= Length(InMacroStr) Then Begin
Result := InMacroStr[InMacroPos]; Ch := InMacroStr[InMacroPos];
Result := True;
Inc (InMacroPos); Inc (InMacroPos);
Exit; Exit;
End Else End Else
@ -1340,6 +1328,27 @@ Begin
End; End;
End; End;
Function TBBSIO.GetKey : Char;
Begin
Result := #255;
TBBSCore(Core).TimeOut := TimerSeconds;
BufFlush;
Repeat
If LastSecond <> TimerSeconds Then Begin
LastSecond := TimerSeconds;
If Assigned(GetKeyCallBack) Then
If GetKeyCallBack(False) Then Begin
Result := #02;
Exit;
End;
If DoInputEvents(Result) Then Exit;
End;
Result := InKey(1000); Result := InKey(1000);
Until Result <> #255; Until Result <> #255;
End; End;

View File

@ -237,7 +237,10 @@ Begin
MenuName := CmdData; MenuName := CmdData;
Result := True; Result := True;
End; End;
'T' : Session.io.OutFull (CmdData); 'T' : Begin
Session.io.OutFull (CmdData);
Session.io.BufFlush;
End;
'U' : ShowUserList (strUpper(CmdData)); 'U' : ShowUserList (strUpper(CmdData));
'X' : Result := ExecuteMPL(NIL, CmdData) = 2; 'X' : Result := ExecuteMPL(NIL, CmdData) = 2;
'?' : Begin '?' : Begin
@ -625,9 +628,10 @@ End;
Function TMenuEngine.MenuGetKey : Char; Function TMenuEngine.MenuGetKey : Char;
Var Var
Current : LongInt;
LastSec : LongInt; LastSec : LongInt;
Begin Begin
Session.io.BufFlush;
LastSec := TimerSeconds; LastSec := TimerSeconds;
While Not TBBSCore(Owner).ShutDown Do Begin While Not TBBSCore(Owner).ShutDown Do Begin
@ -635,9 +639,12 @@ Begin
If TBBSCore(Owner).ShutDown Then Exit; If TBBSCore(Owner).ShutDown Then Exit;
If UseTimer And (TimerSeconds <> LastSec) Then Begin If TimerSeconds <> LastSec Then Begin
LastSec := TimerSeconds; LastSec := TimerSeconds;
If Session.io.DoInputEvents(Result) Then Exit;
If UseTimer Then Begin
Inc (TimerCount); Inc (TimerCount);
Case ExecuteByHotkey('TIMER', TimerCount) of Case ExecuteByHotkey('TIMER', TimerCount) of
@ -654,6 +661,7 @@ Begin
If TimerCount = 1000000000 Then TimerCount := 0; If TimerCount = 1000000000 Then TimerCount := 0;
End; End;
End;
If Result <> #255 Then Break; If Result <> #255 Then Break;
End; End;