unit UMenuText;
interface
uses TextGL, UTexture, OpenGL12, SysUtils;
type
TText = class
private
SelectBool: boolean;
TextString: String;
TextTiles: Array of String;
STicks: Cardinal;
SelectBlink: Boolean;
public
X: real;
Y: real;
W: real; // if text is wider than W then it is breaked
// H: real;
Size: real;
ColR: real;
ColG: real;
ColB: real;
Int: real;
Style: integer;
Visible: boolean;
Align: integer; // 0 = left, 1 = center, 2 = right
procedure SetSelect(Value: Boolean);
property Selected: Boolean read SelectBool write SetSelect;
procedure SetText(Value: String);
property Text: String read TextString write SetText;
procedure DeleteLastL; //Procedure to Delete Last Letter
procedure Draw;
constructor Create; overload;
constructor Create(X, Y: real; Tekst: string); overload;
constructor Create(ParX, ParY, ParW: real; ParStyle: integer; ParSize, ParColR, ParColG, ParColB: real; ParAlign: integer; ParTekst: string); overload;
end;
implementation
uses UGraphic, StrUtils, Windows;
procedure TText.SetSelect(Value: Boolean);
begin
SelectBool := Value;
//Set Cursor Visible
SelectBlink := True;
STicks := GettickCount div 550;
end;
procedure TText.SetText(Value: String);
var
I: Integer;
L: Integer;
LastPos: Integer;
LastBreak: Integer;
begin
TextString := Value;
//Create Page Breaks if width is given
if (W > 0) then
begin
//Set Font Propertys
SetFontStyle(Style);
SetFontSize(Size);
//Create New TextTiles Array
SetLength (TextTiles, 0);
L := 0;
LastPos := 1;
LastBreak := 0;
I := Pos (' ', Value);
While (I <> 0) do
begin
if (glTextWidth(PChar(Copy (Value,LastBreak + 1,I - LastBreak))) > W) AND (LastPos <> 1) then
begin
//new Break
SetLength (TextTiles, L+1);
TextTiles[L] := Copy (Value, LastBreak + 1, LastPos - LastBreak);
Inc(L);
LastBreak := LastPos;
end;
LastPos := I;
I := PosEx (' ', Value, I+1);
end;
//Last Break
if (glTextWidth(PChar(Copy (Value,LastBreak + 1,Length(Value) - LastBreak))) > W) AND (LastPos <> 1) then
begin
//new Break
SetLength (TextTiles, L+1);
TextTiles[L] := Copy (Value, LastBreak + 1, LastPos - LastBreak);
Inc(L);
LastBreak := LastPos;
end;
//last Part
SetLength (TextTiles, L+1);
TextTiles[L] := Copy (Value, LastBreak + 1, Length(Value) - LastBreak);
end
else
begin
SetLength (TextTiles, 1);
TextTiles[0] := Value;
end;
I := 0;
// \n Hack
While (I <= High(TextTiles)) do
begin
LastPos := Pos ('\n', TextTiles[I]);
if (LastPos = 0) then //No /n Tags -> Search in next Tile
Inc(I)
else //Found \n Tag -> Create a Break
begin
//Add a new Tile and move all Tiles behind actual Tile to the right
L := Length(TextTiles);
SetLength(TextTiles, L+1);
For L := L-1 downto I + 1 do
begin
TextTiles[L+1] := TextTiles[L];
end;
//Write Text to new Tile
TextTiles[I+1] := Trim(Copy(TextTiles[I], LastPos + 2, Length(TextTiles[I]) - LastPos - 1));
//Delete Text that now is in new Tile from cur. Tile
Delete(TextTiles[I], LastPos, Length(TextTiles[I]) - LastPos + 1);
TextTiles[I] := Trim (TextTiles[I]);
//Goto next Tile because cur. Tile can not have another /n Tag
Inc(I)
end;
end;
//Set Cursor Visible
SelectBlink := True;
STicks := GettickCount div 550;
end;
Procedure TText.DeleteLastL;
var
S: String;
L: Integer;
begin
S := TextString;
L := Length(S);
if (L > 0) then
SetLength(S, L-1);
SetText(S);
end;
procedure TText.Draw;
var
X2, Y2: real;
Text2: string;
I: Integer;
begin
if Visible then begin
SetFontStyle(Style);
SetFontSize(Size);
SetFontItalic(False);
glColor3f(ColR*Int, ColG*Int, ColB*Int);
//If Selected Set Blink...
if SelectBool then
begin
I := Gettickcount div 550;
if I <> STicks then
begin //Change Visability
STicks := I;
SelectBlink := Not SelectBlink;
end;
end;
if (False) then //No Width set Draw as one Long String
begin
if not (SelectBool AND SelectBlink) then
Text2 := Text
else
Text2 := Text + '|';
case Align of
0: X2 := X;
1: X2 := X - glTextWidth(pchar(Text2))/2;
2: X2 := X - glTextWidth(pchar(Text2));
end;
SetFontPos(X2, Y);
glPrint(PChar(Text2));
SetFontStyle(0); // reset to default
end
else
begin //Draw Text as Many Strings
Y2 := Y;
for I := 0 to high(TextTiles) do
begin
if (not (SelectBool AND SelectBlink)) OR (I <> high(TextTiles)) then
Text2 := TextTiles[I]
else
Text2 := TextTiles[I] + '|';
case Align of
0: X2 := X;
1: X2 := X - glTextWidth(pchar(Text2))/2;
2: X2 := X - glTextWidth(pchar(Text2));
end;
SetFontPos(X2, Y2);
glPrint(PChar(Text2));
Y2 := Y2 + Size * 1.7;
end;
SetFontStyle(0); // reset to default
end;
end;
end;
constructor TText.Create;
begin
Create(0, 0, '');
end;
constructor TText.Create(X, Y: real; Tekst: string);
begin
Create(X, Y, 0, 0, 10, 0, 0, 0, 0, Tekst);
end;
constructor TText.Create(ParX, ParY, ParW: real; ParStyle: integer; ParSize, ParColR, ParColG, ParColB: real; ParAlign: integer; ParTekst: string);
begin
inherited Create;
X := ParX;
Y := ParY;
W := ParW;
Style := ParStyle;
Size := ParSize;
Text := ParTekst;
ColR := ParColR;
ColG := ParColG;
ColB := ParColB;
Int := 1;
Align := ParAlign;
SelectBool := false;
Visible := true;
end;
end.