diff --git a/src/game/g_gui.pas b/src/game/g_gui.pas
index 415d7efebe416edef48d18c1868876c1c9885d72..325646980cdf833a5e4a52d613ebaeab7a22a40a 100644 (file)
--- a/src/game/g_gui.pas
+++ b/src/game/g_gui.pas
uses
{$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
uses
{$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
- e_graphics, e_input, e_log, g_playermodel, g_basic, g_touch, MAPDEF, utils;
+ g_base, r_graphics, e_input, e_log, g_playermodel, g_basic, g_touch, MAPDEF, utils;
const
MAINMENU_HEADER_COLOR: TRGB = (R:255; G:255; B:255);
const
MAINMENU_HEADER_COLOR: TRGB = (R:255; G:255; B:255);
implementation
uses
implementation
uses
- {$INCLUDE ../nogl/noGLuses.inc}
g_textures, g_sound, SysUtils, e_res,
g_textures, g_sound, SysUtils, e_res,
- g_game, Math, StrUtils, g_player, g_options,
+ g_game, Math, StrUtils, g_player, g_options, g_console, r_playermodel,
g_map, g_weapons, xdynrec, wadreader;
g_map, g_weapons, xdynrec, wadreader;
Box: Array [0..8] of DWORD;
Saved_Windows: SSArray;
Box: Array [0..8] of DWORD;
Saved_Windows: SSArray;
+function GetLines (text: string; FontID: DWORD; MaxWidth: Word): SSArray;
+ var
+ k: Integer = 1;
+ lines: Integer = 0;
+ i, len, lastsep: Integer;
+
+ function PrepareStep (): Boolean; inline;
+ begin
+ // Skip leading spaces.
+ while PChar(text)[k-1] = ' ' do k += 1;
+ Result := k <= len;
+ i := k;
+ end;
+
+ function GetLine (j: Integer; Strip: Boolean): String; inline;
+ begin
+ // Exclude trailing spaces from the line.
+ if Strip then
+ while text[j] = ' ' do j -= 1;
+
+ Result := Copy(text, k, j-k+1);
+ end;
+
+ function LineWidth (): Integer; inline;
+ var w, h: Word;
+ begin
+ e_CharFont_GetSize(FontID, GetLine(i, False), w, h);
+ Result := w;
+ end;
+
+begin
+ Result := nil;
+ len := Length(text);
+ //e_LogWritefln('GetLines @%s len=%s [%s]', [MaxWidth, len, text]);
+
+ while PrepareStep() do
+ begin
+ // Get longest possible sequence (this is not constant because fonts are not monospaced).
+ lastsep := 0;
+ repeat
+ if text[i] in [' ', '.', ',', ':', ';']
+ then lastsep := i;
+ i += 1;
+ until (i > len) or (LineWidth() > MaxWidth);
+
+ // Do not include part of a word if possible.
+ if (lastsep-k > 3) and (i <= len) and (text[i] <> ' ')
+ then i := lastsep + 1;
+
+ // Add line.
+ SetLength(Result, lines + 1);
+ Result[lines] := GetLine(i-1, True);
+ //e_LogWritefln(' -> (%s:%s::%s) [%s]', [k, i, LineWidth(), Result[lines]]);
+ lines += 1;
+
+ k := i;
+ end;
+end;
+
+procedure Sort(var a: SSArray);
+var
+ i, j: Integer;
+ s: string;
+begin
+ if a = nil then Exit;
+
+ for i := High(a) downto Low(a) do
+ for j := Low(a) to High(a)-1 do
+ if LowerCase(a[j]) > LowerCase(a[j+1]) then
+ begin
+ s := a[j];
+ a[j] := a[j+1];
+ a[j+1] := s;
+ end;
+end;
procedure g_GUI_Init();
begin
procedure g_GUI_Init();
begin
if FBackTexture <> '' then // Here goes code duplication from g_game.pas:DrawMenuBackground()
if g_Texture_Get(FBackTexture, ID) then
begin
if FBackTexture <> '' then // Here goes code duplication from g_game.pas:DrawMenuBackground()
if g_Texture_Get(FBackTexture, ID) then
begin
- e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0);
+ e_Clear(0, 0, 0);
e_GetTextureSize(ID, @tw, @th);
if tw = th then
tw := round(tw * 1.333 * (gScreenHeight / th))
e_GetTextureSize(ID, @tw, @th);
if tw = th then
tw := round(tw * 1.333 * (gScreenHeight / th))
e_DrawSize(ID, (gScreenWidth - tw) div 2, 0, 0, False, False, tw, gScreenHeight);
end
else
e_DrawSize(ID, (gScreenWidth - tw) div 2, 0, 0, False, False, tw, gScreenHeight);
end
else
- e_Clear(GL_COLOR_BUFFER_BIT, 0.5, 0.5, 0.5);
+ e_Clear(0.5, 0.5, 0.5);
// small hack here
if FName = 'AuthorsMenu' then
// small hack here
if FName = 'AuthorsMenu' then
actDefCtl();
end;
else
actDefCtl();
end;
else
- if e_KeyNames[wParam] <> '' then
+ if (e_KeyNames[wParam] <> '') and not g_Console_MatchBind(wParam, 'togglemenu') then
FKey := wParam;
FIsQuery := False;
actDefCtl();
FKey := wParam;
FIsQuery := False;
actDefCtl();
actDefCtl();
end;
else
actDefCtl();
end;
else
- if e_KeyNames[wParam] <> '' then
+ if (e_KeyNames[wParam] <> '') and not g_Console_MatchBind(wParam, 'togglemenu') then
begin
if (FKeyIdx = 0) then FKey0 := wParam else FKey1 := wParam;
end;
begin
if (FKeyIdx = 0) then FKey0 := wParam else FKey1 := wParam;
end;
DrawBox(FX, FY, 4, 4);
DrawBox(FX, FY, 4, 4);
- if FModel <> nil then FModel.Draw(FX+4, FY+4);
+ if FModel <> nil then
+ r_PlayerModel_Draw(FModel, FX+4, FY+4);
end;
procedure TGUIModelView.NextAnim();
end;
procedure TGUIModelView.NextAnim();
SetLength(FItems, Length(FItems)+1);
FItems[High(FItems)] := Item;
SetLength(FItems, Length(FItems)+1);
FItems[High(FItems)] := Item;
- if FSort then g_Basic.Sort(FItems);
+ if FSort then g_gui.Sort(FItems);
end;
function TGUIListBox.ItemExists (item: String): Boolean;
end;
function TGUIListBox.ItemExists (item: String): Boolean;
FStartLine := 0;
FIndex := -1;
FStartLine := 0;
FIndex := -1;
- if FSort then g_Basic.Sort(FItems);
+ if FSort then g_gui.Sort(FItems);
end;
procedure TGUIListBox.SelectItem(Item: String);
end;
procedure TGUIListBox.SelectItem(Item: String);
begin
if FItems[FIndex] = #29 + '..' then
begin
begin
if FItems[FIndex] = #29 + '..' then
begin
- e_LogWritefln('TGUIFileListBox: Upper dir "%s" -> "%s"', [FSubPath, e_UpperDir(FSubPath)]);
+ //e_LogWritefln('TGUIFileListBox: Upper dir "%s" -> "%s"', [FSubPath, e_UpperDir(FSubPath)]);
FSubPath := e_UpperDir(FSubPath)
end
else
begin
s := Copy(AnsiString(FItems[FIndex]), 2);
FSubPath := e_UpperDir(FSubPath)
end
else
begin
s := Copy(AnsiString(FItems[FIndex]), 2);
- e_LogWritefln('TGUIFileListBox: Enter dir "%s" -> "%s"', [FSubPath, e_CatPath(FSubPath, s)]);
+ //e_LogWritefln('TGUIFileListBox: Enter dir "%s" -> "%s"', [FSubPath, e_CatPath(FSubPath, s)]);
FSubPath := e_CatPath(FSubPath, s);
end;
ScanDirs;
FSubPath := e_CatPath(FSubPath, s);
end;
ScanDirs;