Theme/prompt editor complete!
This commit is contained in:
parent
896d5478ca
commit
c7044c641f
|
@ -244,7 +244,9 @@ Begin
|
|||
Str := Default;
|
||||
StrPos := Length(Str) + 1;
|
||||
Junk := Length(Str) - Field + 1;
|
||||
|
||||
If Junk < 1 Then Junk := 1;
|
||||
|
||||
CurPos := StrPos - Junk + 1;
|
||||
|
||||
Console.CursorXY (X, Y);
|
||||
|
@ -254,9 +256,11 @@ Begin
|
|||
|
||||
Repeat
|
||||
Ch := Key.ReadKey;
|
||||
|
||||
Case Ch of
|
||||
#00 : Begin
|
||||
Ch := Key.ReadKey;
|
||||
|
||||
Case Ch of
|
||||
#77 : If StrPos < Length(Str) + 1 Then Begin
|
||||
If (CurPos = Field) and (StrPos < Length(Str)) Then ScrollRight;
|
||||
|
|
|
@ -682,18 +682,20 @@ Begin
|
|||
|
||||
//If PosY > ScreenSize Then PosY := ScreenSize;
|
||||
|
||||
BufSize.Y := PosY - (Y - 1);
|
||||
BufSize.X := Width;
|
||||
BufCoord.X := 0;
|
||||
BufCoord.Y := 0;
|
||||
Region.Left := X - 1;
|
||||
Region.Top := Y - 1;
|
||||
Region.Right := Width - 1;
|
||||
Region.Bottom := PosY - 1;
|
||||
// If Active Then Begin
|
||||
BufSize.Y := PosY - (Y - 1);
|
||||
BufSize.X := Width;
|
||||
BufCoord.X := 0;
|
||||
BufCoord.Y := 0;
|
||||
Region.Left := X - 1;
|
||||
Region.Top := Y - 1;
|
||||
Region.Right := Width - 1;
|
||||
Region.Bottom := PosY - 1;
|
||||
|
||||
WriteConsoleOutput (ConOut, @Screen[1][1], BufSize, BufCoord, Region);
|
||||
WriteConsoleOutput (ConOut, @Screen[1][1], BufSize, BufCoord, Region);
|
||||
|
||||
CursorXY(PosX, PosY);
|
||||
CursorXY(PosX, PosY);
|
||||
// End;
|
||||
End;
|
||||
|
||||
Function TOutputWindows.ReadCharXY (X, Y: Byte) : Char;
|
||||
|
|
|
@ -94,18 +94,49 @@ Uses
|
|||
|
||||
Procedure WriteXY (X, Y, A: Byte; S: String);
|
||||
Begin
|
||||
Session.io.AnsiGotoXY(X, Y);
|
||||
Session.io.AnsiColor(A);
|
||||
Session.io.OutRaw(S);
|
||||
Session.io.AnsiGotoXY (X, Y);
|
||||
Session.io.AnsiColor (A);
|
||||
Session.io.OutRaw (S);
|
||||
End;
|
||||
|
||||
Procedure WriteXYPipe (X, Y, A, SZ: Byte; S: String);
|
||||
Var
|
||||
Count : Byte;
|
||||
Code : String[2];
|
||||
Begin
|
||||
Session.io.AnsiGotoXY(X, Y);
|
||||
Session.io.AnsiColor(A);
|
||||
Session.io.OutPipe(S);
|
||||
Session.io.AnsiGotoXY (X, Y);
|
||||
Session.io.AnsiColor (A);
|
||||
|
||||
While Screen.CursorX < SZ Do Session.io.BufAddChar(' ');
|
||||
Count := 1;
|
||||
|
||||
While Count <= Length(S) Do Begin
|
||||
If S[Count] = '|' Then Begin
|
||||
Code := Copy(S, Count + 1, 2);
|
||||
|
||||
If (Code[1] in ['0'..'2']) and (Code[2] in ['0'..'9']) Then Begin
|
||||
Inc (Count, 2);
|
||||
|
||||
Session.io.BufAddStr(Session.io.Pipe2Ansi(strS2I(Code)));
|
||||
End Else Begin
|
||||
Session.io.BufAddChar(S[Count]);
|
||||
Dec (SZ);
|
||||
End;
|
||||
End Else Begin
|
||||
Session.io.BufAddChar(S[Count]);
|
||||
Dec (SZ);
|
||||
End;
|
||||
|
||||
If SZ = 0 Then Break;
|
||||
|
||||
Inc (Count);
|
||||
End;
|
||||
|
||||
While SZ > 0 Do Begin
|
||||
Session.io.BufAddChar(' ');
|
||||
Dec(SZ);
|
||||
End;
|
||||
|
||||
Session.io.BufFlush;
|
||||
End;
|
||||
|
||||
Function InXY (X, Y, Field, Max, Mode: Byte; Default: String) : String;
|
||||
|
@ -189,7 +220,8 @@ Begin
|
|||
Until False;
|
||||
End;
|
||||
|
||||
MsgBox.Close;
|
||||
If BoxType < 2 Then MsgBox.Close;
|
||||
|
||||
MsgBox.Free;
|
||||
End;
|
||||
|
||||
|
@ -556,6 +588,8 @@ Begin
|
|||
|
||||
Inc (A);
|
||||
End;
|
||||
|
||||
Update;
|
||||
End;
|
||||
Until False;
|
||||
End;
|
||||
|
|
|
@ -23,11 +23,11 @@ Type
|
|||
Constructor Create;
|
||||
Destructor Destroy; Override;
|
||||
|
||||
Function GetStr (X, Y, Field, Len, Mode: Byte; Default: String) : String;
|
||||
Function GetNum (X, Y, Field, Len: Byte; Min, Max, Default: LongInt) : LongInt;
|
||||
Function GetChar (X, Y : Byte; Default: Char) : Char;
|
||||
Function GetStr (X, Y, Field, Len, Mode: Byte; Default: String) : String;
|
||||
Function GetNum (X, Y, Field, Len: Byte; Min, Max, Default: LongInt) : LongInt;
|
||||
Function GetChar (X, Y : Byte; Default: Char) : Char;
|
||||
Function GetEnter (X, Y, Len: Byte; Default : String) : Boolean;
|
||||
Function GetYN (X, Y : Byte; Default: Boolean) : Boolean;
|
||||
Function GetYN (X, Y : Byte; Default: Boolean) : Boolean;
|
||||
End;
|
||||
|
||||
Implementation
|
||||
|
@ -161,24 +161,191 @@ Begin
|
|||
GetEnter := Res;
|
||||
End;
|
||||
|
||||
// 0 = numbers only 1 = as typed 2 = all caps 3 = date input
|
||||
Function TAnsiMenuInput.GetStr (X, Y, Field, Len, Mode : Byte; Default : String) : String;
|
||||
{ mode options: }
|
||||
{ 0 = numbers only }
|
||||
{ 1 = as typed }
|
||||
{ 2 = all caps }
|
||||
{ 3 = date input }
|
||||
Var
|
||||
Str : String;
|
||||
Begin
|
||||
Session.io.AnsiGotoXY(X, Y);
|
||||
Ch : Char;
|
||||
Str : String;
|
||||
StrPos : Integer;
|
||||
Junk : Integer;
|
||||
CurPos : Integer;
|
||||
|
||||
Case Mode of
|
||||
0,
|
||||
1 : Str := Session.io.GetInput(Field, Len, 11, Default);
|
||||
2 : Str := Session.io.GetInput(Field, Len, 12, Default);
|
||||
3 : Str := Session.io.GetInput(Field, Len, 15, Default);
|
||||
Procedure ReDraw;
|
||||
Var
|
||||
T : String;
|
||||
Begin
|
||||
T := Copy(Str, Junk, Field);
|
||||
|
||||
WriteXY (X, Y, Attr, T);
|
||||
WriteXY (X + Length(T), Y, FillAttr, strRep(FillChar, Field - Length(T)));
|
||||
|
||||
Session.io.AnsiGotoXY (X + CurPos - 1, Screen.CursorY);
|
||||
End;
|
||||
|
||||
Procedure ReDrawPart;
|
||||
Begin
|
||||
Session.io.AnsiColor (Attr);
|
||||
Session.io.BufAddStr (Copy(Str, StrPos, Field - CurPos + 1));
|
||||
Session.io.AnsiColor (FillAttr);
|
||||
Session.io.BufAddStr (strRep(FillChar, (Field - CurPos + 1) - Length(Copy(Str, StrPos, Field - CurPos + 1))));
|
||||
Session.io.AnsiMoveX (X + CurPos - 1);
|
||||
End;
|
||||
|
||||
Procedure ScrollRight;
|
||||
Begin
|
||||
Inc (Junk);
|
||||
|
||||
If Junk > Length(Str) Then Junk := Length(Str);
|
||||
If Junk > Len then Junk := Len;
|
||||
|
||||
CurPos := StrPos - Junk + 1;
|
||||
|
||||
ReDraw;
|
||||
End;
|
||||
|
||||
Procedure ScrollLeft;
|
||||
Begin
|
||||
If Junk > 1 Then Begin
|
||||
Dec (Junk);
|
||||
|
||||
CurPos := StrPos - Junk + 1;
|
||||
|
||||
ReDraw;
|
||||
End;
|
||||
End;
|
||||
|
||||
Procedure AddChar (Ch : Char);
|
||||
Begin
|
||||
If Length(Str) >= Len Then Exit;
|
||||
|
||||
If (CurPos >= Field) and (Field <> Len) Then ScrollRight;
|
||||
|
||||
Insert (Ch, Str, StrPos);
|
||||
|
||||
If StrPos < Length(Str) Then ReDrawPart;
|
||||
|
||||
Inc (StrPos);
|
||||
Inc (CurPos);
|
||||
|
||||
Session.io.AnsiColor (Attr);
|
||||
Session.io.BufAddChar (Ch);
|
||||
End;
|
||||
|
||||
Begin
|
||||
Changed := False;
|
||||
Str := Default;
|
||||
StrPos := Length(Str) + 1;
|
||||
Junk := Length(Str) - Field + 1;
|
||||
|
||||
If Junk < 1 Then Junk := 1;
|
||||
|
||||
CurPos := StrPos - Junk + 1;
|
||||
|
||||
ReDraw;
|
||||
|
||||
Repeat
|
||||
Ch := Session.io.GetKey;
|
||||
|
||||
If Session.io.IsArrow Then Begin
|
||||
Case Ch of
|
||||
#77 : If StrPos < Length(Str) + 1 Then Begin
|
||||
If (CurPos = Field) and (StrPos < Length(Str)) Then ScrollRight;
|
||||
|
||||
Inc (CurPos);
|
||||
Inc (StrPos);
|
||||
|
||||
Session.io.AnsiGotoXY (Screen.CursorX + 1, Screen.CursorY);
|
||||
End;
|
||||
#75 : If StrPos > 1 Then Begin
|
||||
If CurPos = 1 Then ScrollLeft;
|
||||
|
||||
Dec (StrPos);
|
||||
Dec (CurPos);
|
||||
|
||||
Session.io.AnsiGotoXY (Screen.CursorX - 1, Screen.CursorY);
|
||||
End;
|
||||
#71 : If StrPos > 1 Then Begin
|
||||
StrPos := 1;
|
||||
Junk := 1;
|
||||
CurPos := 1;
|
||||
|
||||
ReDraw;
|
||||
End;
|
||||
#79 : Begin
|
||||
StrPos := Length(Str) + 1;
|
||||
Junk := Length(Str) - Field + 1;
|
||||
|
||||
If Junk < 1 Then Junk := 1;
|
||||
|
||||
CurPos := StrPos - Junk + 1;
|
||||
|
||||
ReDraw;
|
||||
End;
|
||||
#83 : If (StrPos <= Length(Str)) and (Length(Str) > 0) Then Begin
|
||||
Delete (Str, StrPos, 1);
|
||||
|
||||
ReDrawPart;
|
||||
End;
|
||||
Else
|
||||
If Pos(Ch, HiChars) > 0 Then Begin
|
||||
ExitCode := Ch;
|
||||
|
||||
Break;
|
||||
End;
|
||||
End;
|
||||
End Else
|
||||
Case Ch of
|
||||
#08 : If StrPos > 1 Then Begin
|
||||
Dec (StrPos);
|
||||
|
||||
Delete (Str, StrPos, 1);
|
||||
|
||||
If CurPos = 1 Then
|
||||
ScrollLeft
|
||||
Else Begin
|
||||
Session.io.AnsiMoveX(Screen.CursorX - 1);
|
||||
|
||||
Dec (CurPos);
|
||||
|
||||
ReDrawPart;
|
||||
End;
|
||||
End;
|
||||
^Y : Begin
|
||||
Str := '';
|
||||
StrPos := 1;
|
||||
Junk := 1;
|
||||
CurPos := 1;
|
||||
|
||||
ReDraw;
|
||||
End;
|
||||
#32..
|
||||
#254: Case Mode of
|
||||
0 : If Ch in ['0'..'9', '-'] Then AddChar(Ch);
|
||||
1 : AddChar (Ch);
|
||||
2 : AddChar (UpCase(Ch));
|
||||
3 : If (Ch > '/') and (Ch < ':') Then
|
||||
Case StrPos of
|
||||
2,5 : Begin
|
||||
AddChar (Ch);
|
||||
AddChar ('/');
|
||||
End;
|
||||
3,6 : Begin
|
||||
AddChar ('/');
|
||||
AddChar (Ch);
|
||||
End;
|
||||
Else
|
||||
AddChar (Ch);
|
||||
End;
|
||||
End;
|
||||
Else
|
||||
If Pos(Ch, LoChars) > 0 Then Begin
|
||||
ExitCode := Ch;
|
||||
|
||||
Break;
|
||||
End;
|
||||
End;
|
||||
Until False;
|
||||
|
||||
Changed := (Str <> Default);
|
||||
Result := Str;
|
||||
End;
|
||||
|
|
|
@ -82,7 +82,6 @@ Var
|
|||
Box : TAnsiMenuBox;
|
||||
Image : TConsoleImageRec;
|
||||
MenuPos : Array[0..4] of Byte = (1, 1, 1, 1, 1);
|
||||
ThemeOld : RecTheme;
|
||||
Res : Char;
|
||||
|
||||
Procedure BoxOpen (X1, Y1, X2, Y2: Byte);
|
||||
|
@ -284,16 +283,6 @@ Begin
|
|||
#77 : MenuPtr := 4;
|
||||
End;
|
||||
End Else Begin
|
||||
ThemeOld := Session.Lang;
|
||||
|
||||
Session.Lang.FieldColor1 := 15 + 1 * 16;
|
||||
Session.Lang.FieldColor2 := 7 + 1 * 16;
|
||||
Session.Lang.FieldChar := #176;
|
||||
Session.Lang.EchoChar := '*';
|
||||
|
||||
// theme will need to be reloaded after the theme edito
|
||||
// just in case that specific theme is changed.
|
||||
|
||||
Case Res of
|
||||
'A' : Configuration_ArchiveEditor;
|
||||
'B' : Configuration_MessageBaseEditor;
|
||||
|
@ -311,8 +300,6 @@ Begin
|
|||
Else
|
||||
MenuPtr := 0;
|
||||
End;
|
||||
|
||||
Session.Lang := ThemeOld;
|
||||
End;
|
||||
End;
|
||||
4 : Begin
|
||||
|
|
|
@ -9,13 +9,546 @@ Function Configuration_ThemeEditor (Select: Boolean) : String;
|
|||
Implementation
|
||||
|
||||
Uses
|
||||
m_Types,
|
||||
m_FileIO,
|
||||
m_Strings,
|
||||
bbs_Ansi_MenuBox,
|
||||
bbs_Ansi_MenuForm,
|
||||
bbs_Ansi_MenuInput,
|
||||
bbs_Core,
|
||||
bbs_Common,
|
||||
bbs_Cfg_Common;
|
||||
|
||||
Procedure CompileTheme (Var Theme: RecTheme);
|
||||
Var
|
||||
LastPer : Byte = 0;
|
||||
|
||||
Procedure UpdateBar (Cur : Integer);
|
||||
Var
|
||||
Percent : Byte;
|
||||
Begin
|
||||
Percent := Round(Cur / mysMaxThemeText * 100 / 5);
|
||||
|
||||
If Percent <> LastPer Then Begin
|
||||
LastPer := Percent;
|
||||
WriteXY (34, 12, 113, strRep(#178, Percent) + strRep(#176, 20 - Percent) + strPadL(strI2S(Percent * 5) + '%', 5, ' '));
|
||||
End;
|
||||
End;
|
||||
|
||||
Var
|
||||
InFile : Text;
|
||||
PromptFile : File of RecPrompt;
|
||||
Prompt : RecPrompt;
|
||||
Count : Integer;
|
||||
Done : Array[0..mysMaxThemeText] of Boolean;
|
||||
Temp : String;
|
||||
DoneNum : Integer;
|
||||
Begin
|
||||
Assign (PromptFile, Config.DataPath + Theme.FileName + '.thm');
|
||||
|
||||
{$I-} ReWrite (PromptFile); {$I+}
|
||||
|
||||
If IoResult <> 0 Then Begin
|
||||
ShowMsgBox(0, 'Cannot compile theme while using it');
|
||||
Exit;
|
||||
End;
|
||||
|
||||
Assign (InFile, Config.SystemPath + Theme.FileName + '.txt');
|
||||
Reset (InFile);
|
||||
|
||||
ShowMsgBox (3, 'Compiling: ');
|
||||
|
||||
Prompt := '';
|
||||
DoneNum := 0;
|
||||
|
||||
For Count := 0 to mysMaxThemeText Do Begin
|
||||
Done[Count] := False;
|
||||
Write (PromptFile, Prompt);
|
||||
End;
|
||||
|
||||
Reset (PromptFile);
|
||||
|
||||
While Not Eof(InFile) Do Begin
|
||||
ReadLn (InFile, Temp);
|
||||
|
||||
If Copy(Temp, 1, 3) = '000' Then Count := 0 Else
|
||||
If strS2I(Copy(Temp, 1, 3)) > 0 Then Count := strS2I(Copy(Temp, 1, 3)) Else
|
||||
Count := -1;
|
||||
|
||||
If Count <> -1 Then Begin
|
||||
Inc (DoneNum);
|
||||
|
||||
UpdateBar(DoneNum);
|
||||
|
||||
If Count > mysMaxThemeText Then Begin
|
||||
ShowMsgBox(0, 'String #' + strI2S(Count) + ' was not expected');
|
||||
|
||||
Close (InFile);
|
||||
Close (PromptFile);
|
||||
Erase (PromptFile);
|
||||
Exit;
|
||||
End;
|
||||
|
||||
Done[Count] := True;
|
||||
|
||||
Seek (PromptFile, Count);
|
||||
|
||||
Prompt := Copy(Temp, 5, Length(Temp));
|
||||
|
||||
Write (PromptFile, Prompt);
|
||||
End;
|
||||
End;
|
||||
|
||||
Close (InFile);
|
||||
Close (PromptFile);
|
||||
|
||||
For Count := 0 to mysMaxThemeText Do Begin
|
||||
If Not Done[Count] Then Begin
|
||||
ShowMsgBox (0, 'String #' + strI2S(Count) + ' was not found');
|
||||
Erase (PromptFile);
|
||||
Break;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
|
||||
Procedure EditPrompts (Var Theme: RecTheme);
|
||||
Const
|
||||
MaxText = 3000;
|
||||
LinesPerPage = 16;
|
||||
WinStartX = 3;
|
||||
WinStartY = 1;
|
||||
Var
|
||||
Box : TAnsiMenuBox;
|
||||
Input : TAnsiMenuInput;
|
||||
InFile : Text;
|
||||
TotalText : Word;
|
||||
StrData : Array[1..MaxText] of ^String;
|
||||
Comment : Array[1..LinesPerPage] of Array[1..3] of String[75];
|
||||
PageData : Array[1..LinesPerPage] of Integer;
|
||||
PageStart : Array[1..100] of Integer;
|
||||
PageTotal : Integer;
|
||||
CurPage : Byte = 1;
|
||||
CurLine : Byte = 1;
|
||||
CurPageLines : Byte;
|
||||
TotalPrompt : Integer;
|
||||
SearchMask : String;
|
||||
CopyStr : String = '';
|
||||
|
||||
Procedure DisposeStringData;
|
||||
Var
|
||||
Count : Word;
|
||||
Begin
|
||||
For Count := TotalText DownTo 1 Do
|
||||
Dispose (StrData[Count]);
|
||||
End;
|
||||
|
||||
Function LoadStringData : Boolean;
|
||||
Var
|
||||
Str : String;
|
||||
Buffer : Array[1..4096] of Byte;
|
||||
Begin
|
||||
Result := False;
|
||||
|
||||
Assign (InFile, Config.SystemPath + Theme.FileName + '.txt');
|
||||
SetTextBuf (InFile, Buffer, SizeOf(Buffer));
|
||||
|
||||
{$I-} Reset (InFile); {$I+}
|
||||
|
||||
If IoResult <> 0 Then Begin
|
||||
ShowMsgBox (0, 'Unable to open ' + Config.SystemPath + Theme.FileName + '.txt');
|
||||
Exit;
|
||||
End;
|
||||
|
||||
ShowMsgBox (2, 'Loading ' + Theme.FileName + '.txt');
|
||||
|
||||
TotalText := 0;
|
||||
|
||||
While Not Eof(InFile) Do Begin
|
||||
If TotalText = MaxText Then Begin
|
||||
Close (InFile);
|
||||
|
||||
ShowMsgBox (0, 'File too large');
|
||||
|
||||
DisposeStringData;
|
||||
Exit;
|
||||
End;
|
||||
|
||||
ReadLn (InFile, Str);
|
||||
Inc (TotalText);
|
||||
|
||||
New (StrData[TotalText]);
|
||||
|
||||
StrData[TotalText]^ := Str;
|
||||
End;
|
||||
|
||||
Close (InFile);
|
||||
|
||||
Result := True;
|
||||
End;
|
||||
|
||||
Procedure GetTotalPages;
|
||||
Var
|
||||
Str : String;
|
||||
Count : Integer;
|
||||
Lines : Integer;
|
||||
Last : Integer;
|
||||
Begin
|
||||
PageTotal := 0;
|
||||
Lines := 0;
|
||||
Last := 1;
|
||||
Count := 0;
|
||||
TotalPrompt := -1;
|
||||
|
||||
While Count < TotalText Do Begin
|
||||
Inc (Count);
|
||||
|
||||
Str := StrData[Count]^;
|
||||
|
||||
If (Str <> '') and (Str[1] <> ';') and (Str[1] <> '#') Then Begin
|
||||
Inc (TotalPrompt);
|
||||
Inc (Lines);
|
||||
|
||||
If Lines = 1 Then Begin
|
||||
Inc (PageTotal);
|
||||
|
||||
PageStart[PageTotal] := Last;
|
||||
End;
|
||||
End;
|
||||
|
||||
If Lines = LinesPerPage Then Begin
|
||||
Lines := 0;
|
||||
Last := Count + 1;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
|
||||
Procedure DrawPage (Silent: Boolean);
|
||||
Var
|
||||
Str : String;
|
||||
A : Byte;
|
||||
Count : Integer;
|
||||
Begin
|
||||
For A := 1 to LinesPerPage Do Begin
|
||||
Comment[A][1] := '';
|
||||
Comment[A][2] := '';
|
||||
Comment[A][3] := '';
|
||||
End;
|
||||
|
||||
CurPageLines := 0;
|
||||
Count := PageStart[CurPage];
|
||||
|
||||
While (CurPageLines < LinesPerPage) and (Count <= TotalText) Do Begin
|
||||
Str := StrData[Count]^;
|
||||
|
||||
Inc (Count);
|
||||
|
||||
If Str[1] = ';' Then Begin
|
||||
Delete (Str, 1, 2);
|
||||
|
||||
Comment[CurPageLines + 1][1] := Comment[CurPageLines + 1][2];
|
||||
Comment[CurPageLines + 1][2] := Comment[CurPageLines + 1][3];
|
||||
Comment[CurPageLines + 1][3] := Str;
|
||||
End Else
|
||||
If (Str <> '') and (Str[1] <> '#') Then Begin
|
||||
Inc(CurPageLines);
|
||||
|
||||
PageData[CurPageLines] := Count - 1;
|
||||
|
||||
If Not Silent Then
|
||||
WriteXYPipe (WinStartX, WinStartY + CurPageLines, 7, 75, Copy(Str, 5, 255));
|
||||
End;
|
||||
End;
|
||||
|
||||
If Not Silent Then
|
||||
If CurPageLines < LinesPerPage Then
|
||||
For A := CurPageLines + 1 to LinesPerPage Do
|
||||
WriteXY (WinStartX, A + WinStartY, 7, strRep(' ', 75));
|
||||
End;
|
||||
|
||||
Procedure DrawComments;
|
||||
Begin
|
||||
WriteXY (3, 19, 15, strPadR(Comment[CurLine][1], 75, ' '));
|
||||
WriteXY (3, 20, 15, strPadR(Comment[CurLine][2], 75, ' '));
|
||||
WriteXY (3, 21, 15, strPadR(Comment[CurLine][3], 75, ' '));
|
||||
End;
|
||||
|
||||
Procedure JumpToPrompt (Cur : Word);
|
||||
Var
|
||||
Box : TAnsiMenuBox;
|
||||
Input : TAnsiMenuInput;
|
||||
Num : Word;
|
||||
Count : Word;
|
||||
PageEnd : Word;
|
||||
LineNum : Word;
|
||||
B : Word;
|
||||
Begin
|
||||
Box := TAnsiMenuBox.Create;
|
||||
Input := TAnsiMenuInput.Create;
|
||||
|
||||
Box.Open (27, 8, 53, 12);
|
||||
|
||||
WriteXY (30, 10, 112, 'Jump to prompt #:');
|
||||
|
||||
Num := Input.GetNum(48, 10, 4, 4, 0, mysMaxThemeText, Cur);
|
||||
|
||||
Box.Close;
|
||||
Input.Free;
|
||||
Box.Free;
|
||||
|
||||
If Num <> Cur Then
|
||||
For Count := 1 to PageTotal Do Begin
|
||||
If Count = PageTotal Then
|
||||
PageEnd := TotalText
|
||||
Else
|
||||
PageEnd := PageStart[Count + 1] - 1;
|
||||
|
||||
LineNum := 0;
|
||||
|
||||
For B := PageStart[Count] to PageEnd Do Begin
|
||||
If (StrData[B]^[1] <> ';') and (StrData[B]^[1] <> '#') Then Begin
|
||||
Inc (LineNum);
|
||||
|
||||
If strS2I(Copy(StrData[B]^, 1, 3)) = Num Then Begin
|
||||
If Not ((Count = CurPage) and (CurLine = LineNum)) Then Begin
|
||||
CurPage := Count;
|
||||
CurLine := LineNum;
|
||||
|
||||
DrawPage(False);
|
||||
|
||||
Exit;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
|
||||
DrawPage(False);
|
||||
End;
|
||||
|
||||
Procedure Search (Again : Boolean);
|
||||
Var
|
||||
Temp : String;
|
||||
Start : Byte;
|
||||
A : Byte;
|
||||
B : Integer;
|
||||
PageEnd : Integer;
|
||||
LineNum : Integer;
|
||||
Box : TAnsiMenuBox;
|
||||
Input : TAnsiMenuInput;
|
||||
Begin
|
||||
If (Not Again) or ((Again) and (SearchMask = '')) Then Begin
|
||||
Box := TAnsiMenuBox.Create;
|
||||
Input := TAnsiMenuInput.Create;
|
||||
|
||||
Box.Header := ' Search ';
|
||||
|
||||
Box.Open(14, 8, 67, 10);
|
||||
|
||||
SearchMask := Input.GetStr(16, 9, 50, 50, 1, SearchMask);
|
||||
|
||||
Input.Free;
|
||||
Box.Free;
|
||||
|
||||
If SearchMask = '' Then Begin
|
||||
DrawPage(False);
|
||||
Exit;
|
||||
End;
|
||||
|
||||
Start := 1;
|
||||
Again := False;
|
||||
End Else
|
||||
Start := CurPage;
|
||||
|
||||
For A := Start to PageTotal Do Begin
|
||||
|
||||
If A = PageTotal Then
|
||||
PageEnd := TotalText
|
||||
Else
|
||||
PageEnd := PageStart[A+1]-1;
|
||||
|
||||
LineNum := 0;
|
||||
|
||||
For B := PageStart[A] to PageEnd Do Begin
|
||||
Temp := StrData[B]^;
|
||||
|
||||
If (Temp[1] <> ';') and (Temp[1] <> '#') Then Begin
|
||||
Inc (LineNum);
|
||||
|
||||
If Again and (A = CurPage) Then
|
||||
If (LineNum <= CurLine) and (LineNum < LinesPerPage) Then Continue;
|
||||
|
||||
If Pos(strUpper(SearchMask), strUpper(strStripPipe(StrData[B]^))) > 0 Then Begin
|
||||
If Not ((A = CurPage) and (CurLine = LineNum)) Then Begin
|
||||
CurPage := A;
|
||||
CurLine := LineNum;
|
||||
|
||||
DrawPage(False);
|
||||
|
||||
Exit;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
|
||||
ShowMsgBox(0, 'No maching text was found');
|
||||
|
||||
DrawPage(False);
|
||||
End;
|
||||
|
||||
Var
|
||||
EditStr : String;
|
||||
UndoStr : String;
|
||||
CurStr : String[3];
|
||||
Changed : Boolean = False;
|
||||
Saved : Boolean = False;
|
||||
Count : Integer;
|
||||
Image : TConsoleImageRec;
|
||||
Begin
|
||||
Screen.GetScreenImage(1, 1, 79, 24, Image);
|
||||
|
||||
If Not LoadStringData Then Exit;
|
||||
|
||||
GetTotalPages;
|
||||
|
||||
Session.io.AnsiColor(7);
|
||||
Session.io.AnsiClear;
|
||||
|
||||
Box := TAnsiMenuBox.Create;
|
||||
Input := TAnsiMenuInput.Create;
|
||||
|
||||
Box.FrameType := 1;
|
||||
Box.BoxAttr := 8;
|
||||
Box.Box3D := False;
|
||||
Box.Shadow := False;
|
||||
|
||||
Input.HiChars := #72#73#80#81;
|
||||
Input.LoChars := #01#02#06#07#11#16#20#21#27;
|
||||
|
||||
Box.Open (1, 1, 79, 22);
|
||||
|
||||
WriteXY (2, 18, 8, strRep('Ä', 77));
|
||||
WriteXY (3, 1, 8, ' / ');
|
||||
WriteXY (8, 1, 7, strI2S(TotalPrompt));
|
||||
WriteXY (73 - Length(Theme.FileName), 1, 7, ' ' + Theme.FileName + '.txt ');
|
||||
|
||||
WriteXYPipe (1, 23, 112, 79, ' Prompts ³ |01Press |15CTRL |01+ |15T|01op |15B|01ottom |15F|01ind |15A|01gain |15G|01oto |15K|01ut |15P|01aste |15U|01ndo |00³ ESC/Quit ');
|
||||
|
||||
DrawPage(False);
|
||||
|
||||
Repeat
|
||||
DrawComments;
|
||||
|
||||
CurStr := Copy(StrData[PageData[CurLine]]^, 1, 3);
|
||||
EditStr := Copy(StrData[PageData[CurLine]]^, 5, 255);
|
||||
UndoStr := EditStr;
|
||||
|
||||
WriteXY (4, 1, 7, CurStr);
|
||||
|
||||
EditStr := Input.GetStr(WinStartX, WinStartY + CurLine, 75, 254, 1, EditStr);
|
||||
|
||||
Case Input.ExitCode of
|
||||
#16 : If CopyStr <> '' Then Begin
|
||||
EditStr := CopyStr;
|
||||
Input.Changed := True;
|
||||
End;
|
||||
#21 : Begin
|
||||
EditStr := UndoStr;
|
||||
Input.Changed := False;
|
||||
End;
|
||||
End;
|
||||
|
||||
WriteXYPipe (WinStartX, WinStartY + CurLine, 7, 75, EditStr);
|
||||
|
||||
StrData[PageData[CurLine]]^ := CurStr + ' ' + EditStr;
|
||||
|
||||
If Input.Changed Then Changed := True;
|
||||
|
||||
Case Input.ExitCode of
|
||||
#01 : Search(True);
|
||||
#02 : Begin
|
||||
CurPage := PageTotal;
|
||||
|
||||
DrawPage(False);
|
||||
|
||||
CurLine := CurPageLines;
|
||||
End;
|
||||
|
||||
#06 : Search(False);
|
||||
#07 : JumpToPrompt(strS2I(CurStr));
|
||||
#11 : CopyStr := EditStr;
|
||||
#20 : Begin
|
||||
CurPage := 1;
|
||||
CurLine := 1;
|
||||
|
||||
DrawPage(False);
|
||||
End;
|
||||
#27 : Break;
|
||||
#72 : If CurLine > 1 Then
|
||||
Dec(CurLine)
|
||||
Else Begin
|
||||
If CurPage > 1 Then Begin
|
||||
Dec (CurPage);
|
||||
|
||||
DrawPage(False);
|
||||
|
||||
CurLine := CurPageLines;
|
||||
End;
|
||||
End;
|
||||
#73 : If CurPage > 1 Then Begin
|
||||
Dec (CurPage);
|
||||
|
||||
DrawPage(False);
|
||||
End Else
|
||||
CurLine := 1;
|
||||
#80 : If CurLine < CurPageLines Then
|
||||
Inc(CurLine)
|
||||
Else Begin
|
||||
If CurPage < PageTotal Then Begin
|
||||
Inc (CurPage);
|
||||
|
||||
DrawPage(False);
|
||||
|
||||
CurLine := 1;
|
||||
End;
|
||||
End;
|
||||
#81 : If CurPage < PageTotal Then Begin
|
||||
Inc (CurPage);
|
||||
|
||||
DrawPage(False);
|
||||
|
||||
CurLine := 1;
|
||||
End Else
|
||||
CurLine := CurPageLines;
|
||||
End;
|
||||
Until False;
|
||||
|
||||
If Changed Then
|
||||
If ShowMsgBox(1, 'Save changes?') Then Begin
|
||||
Saved := True;
|
||||
|
||||
Assign (InFile, Config.SystemPath + Theme.FileName + '.txt');
|
||||
ReWrite (InFile);
|
||||
|
||||
For Count := 1 to TotalText Do Begin
|
||||
EditStr := StrData[Count]^;
|
||||
WriteLn (InFile, EditStr);
|
||||
End;
|
||||
|
||||
Close (InFile);
|
||||
End;
|
||||
|
||||
DisposeStringData;
|
||||
|
||||
If Saved Then
|
||||
CompileTheme(Theme);
|
||||
|
||||
Box.Free;
|
||||
Input.Free;
|
||||
|
||||
Session.io.RemoteRestore(Image);
|
||||
End;
|
||||
|
||||
Procedure EditBars (Var Theme: RecTheme);
|
||||
Var
|
||||
Box : TAnsiMenuBox;
|
||||
|
@ -136,6 +669,7 @@ Begin
|
|||
|
||||
Repeat
|
||||
Case Form.Execute of
|
||||
'1' : EditPrompts(Theme);
|
||||
'2' : EditOptions(Theme);
|
||||
'3' : Begin
|
||||
Box.Hide;
|
||||
|
|
|
@ -1094,7 +1094,7 @@ End;
|
|||
{$IFDEF UNIX}
|
||||
Function TBBSIO.InKey : Char;
|
||||
Begin
|
||||
Result := #1;
|
||||
Result := #255;
|
||||
IsArrow := False;
|
||||
|
||||
If Input.KeyWait(1000) Then Begin
|
||||
|
@ -1109,7 +1109,7 @@ Begin
|
|||
Exit;
|
||||
End;
|
||||
|
||||
Result := #1;
|
||||
Result := #255;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
|
@ -1121,7 +1121,7 @@ Var
|
|||
Handles : Array[0..1] of THandle;
|
||||
InType : Byte;
|
||||
Begin
|
||||
Result := #1;
|
||||
Result := #255;
|
||||
|
||||
Handles[0] := Input.ConIn;
|
||||
|
||||
|
@ -1162,10 +1162,10 @@ Begin
|
|||
|
||||
ProcessSysopCommand(Result);
|
||||
|
||||
Result := #1;
|
||||
Result := #255;
|
||||
End;
|
||||
|
||||
If Not Screen.Active Then Result := #1;
|
||||
If Not Screen.Active Then Result := #255;
|
||||
End;
|
||||
2 : Begin // SOCKET read event
|
||||
If TBBSCore(Core).Client.ReadBuf(Result, 1) < 0 Then Begin
|
||||
|
@ -1179,12 +1179,14 @@ Begin
|
|||
IsArrow := True;
|
||||
|
||||
Case Result of
|
||||
(*
|
||||
#03 : Result := #81; { pgdn }
|
||||
#04 : Result := #77; { right }
|
||||
#05 : Result := #72; { up }
|
||||
#18 : Result := #73; { pgup }
|
||||
#19 : Result := #75; { left }
|
||||
#24 : Result := #80; { down }
|
||||
*)
|
||||
#27 : Begin
|
||||
If Not TBBSCore(Core).Client.DataWaiting Then WaitMS(25);
|
||||
If Not TBBSCore(Core).Client.DataWaiting Then WaitMS(25);
|
||||
|
@ -1218,7 +1220,7 @@ Var
|
|||
TimeCount : LongInt;
|
||||
LastSec : LongInt;
|
||||
Begin
|
||||
Result := #1;
|
||||
Result := #255;
|
||||
|
||||
TBBSCore(Core).TimeOut := TimerSeconds;
|
||||
|
||||
|
@ -1286,7 +1288,7 @@ Begin
|
|||
End;
|
||||
|
||||
Result := InKey;
|
||||
Until Result <> #1;
|
||||
Until Result <> #255;
|
||||
End;
|
||||
|
||||
Function TBBSIO.GetYNL (Str: String; Yes: Boolean) : Boolean;
|
||||
|
|
|
@ -20,6 +20,7 @@ BUGS AND POSSIBLE ISSUES
|
|||
FPC BUG? DirAttr is suspect in MPL is it 1 byte or 4 in size?
|
||||
! MDL screensave/restore in local console is broken in Windows(?) only?
|
||||
! View archive not working if its external view? [Griffin]
|
||||
! Editing current theme will prob not save right [g00r00]
|
||||
|
||||
FUTURE / IDEAS / WORK IN PROGRESS / NOTES
|
||||
=========================================
|
||||
|
|
Loading…
Reference in New Issue