diff --git a/src/game/g_gui.pas b/src/game/g_gui.pas
index 6f4dfbe73c07022fc28be9e626340fe1b13a1348..67f3b8a6ebd8f5e4fbfb4e2893229b7db0e94afd 100644 (file)
--- a/src/game/g_gui.pas
+++ b/src/game/g_gui.pas
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
private
FButtons: array of TGUITextButton;
FHeader: TGUILabel;
+ FLogo: DWord;
FIndex: Integer;
FFontID: DWORD;
FCounter: Byte;
FMarkerID1: DWORD;
FMarkerID2: DWORD;
public
- constructor Create(FontID: DWORD; Header: string);
+ constructor Create(FontID: DWORD; Logo, Header: string);
destructor Destroy; override;
procedure OnMessage(var Msg: TMessage); override;
function AddButton(fProc: Pointer; Caption: string; ShowWindow: string = ''): TGUITextButton;
var
g_GUIWindows: array of TGUIWindow;
g_ActiveWindow: TGUIWindow = nil;
+ g_GUIGrabInput: Boolean = False;
procedure g_GUI_Init();
function g_GUI_AddWindow(Window: TGUIWindow): TGUIWindow;
implementation
uses
-{$IFDEF USE_NANOGL}
- nanoGL,
-{$ELSE}
- GL, GLExt,
-{$ENDIF}
+ {$INCLUDE ../nogl/noGLuses.inc}
g_textures, g_sound, SysUtils,
g_game, Math, StrUtils, g_player, g_options,
g_map, g_weapons, xdynrec, wadreader;
var
i: Integer;
ID: DWORD;
+ tw, th: Word;
begin
- if FBackTexture <> '' then
+ if FBackTexture <> '' then // Here goes code duplication from g_game.pas:DrawMenuBackground()
if g_Texture_Get(FBackTexture, ID) then
- e_DrawSize(ID, 0, 0, 0, False, False, gScreenWidth, gScreenHeight)
+ begin
+ e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0);
+ e_GetTextureSize(ID, @tw, @th);
+ if tw = th then
+ tw := round(tw * 1.333 * (gScreenHeight / th))
+ else
+ tw := trunc(tw * (gScreenHeight / th));
+ 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);
+ // small hack here
+ if FName = 'AuthorsMenu' then
+ e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
+
for i := 0 to High(Childs) do
if Childs[i] <> nil then Childs[i].Draw;
end;
if @FOnKeyDownEx <> nil then FOnKeyDownEx(self, Msg.wParam);
if Msg.Msg = WM_KEYDOWN then
- if Msg.wParam = IK_ESCAPE then
- begin
- g_GUI_HideWindow;
- Exit;
- end;
+ begin
+ case Msg.wParam of
+ VK_ESCAPE:
+ begin
+ g_GUI_HideWindow;
+ Exit
+ end
+ end
+ end
end;
procedure TGUIWindow.SetActive(Control: TGUIControl);
case Msg.Msg of
WM_KEYDOWN:
case Msg.wParam of
- IK_RETURN, IK_KPRETURN: Click();
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK: Click();
end;
end;
end;
@@ -1020,6 +1034,7 @@ function TGUIMainMenu.AddButton(fProc: Pointer; Caption: string; ShowWindow: str
var
a, _x: Integer;
h, hh: Word;
+ lh: Word = 0;
begin
FIndex := 0;
if FButtons[a] <> nil then
_x := Min(_x, (gScreenWidth div 2)-(FButtons[a].GetWidth div 2));
- hh := FHeader.GetHeight;
+ if FLogo <> 0 then e_GetTextureSize(FLogo, nil, @lh);
+ hh := FButtons[High(FButtons)].GetHeight;
- h := hh*(2+Length(FButtons))+MAINMENU_SPACE*(Length(FButtons)-1);
- h := (gScreenHeight div 2)-(h div 2);
+ if FLogo <> 0 then h := lh + hh * (1 + Length(FButtons)) + MAINMENU_SPACE * (Length(FButtons) - 1)
+ else h := hh * (2 + Length(FButtons)) + MAINMENU_SPACE * (Length(FButtons) - 1);
+ h := (gScreenHeight div 2) - (h div 2);
- with FHeader do
+ if FHeader <> nil then with FHeader do
begin
FX := _x;
FY := h;
end;
- Inc(h, hh*2);
+ if FLogo <> 0 then Inc(h, lh)
+ else Inc(h, hh*2);
for a := 0 to High(FButtons) do
begin
FButtons[High(FButtons)] := nil;
end;
-constructor TGUIMainMenu.Create(FontID: DWORD; Header: string);
+constructor TGUIMainMenu.Create(FontID: DWORD; Logo, Header: string);
begin
inherited Create();
g_Texture_Get(MAINMENU_MARKER1, FMarkerID1);
g_Texture_Get(MAINMENU_MARKER2, FMarkerID2);
- FHeader := TGUILabel.Create(Header, FFontID);
- with FHeader do
+ if not g_Texture_Get(Logo, FLogo) then
begin
- FColor := MAINMENU_HEADER_COLOR;
- FX := (gScreenWidth div 2)-(GetWidth div 2);
- FY := (gScreenHeight div 2)-(GetHeight div 2);
+ FHeader := TGUILabel.Create(Header, FFontID);
+ with FHeader do
+ begin
+ FColor := MAINMENU_HEADER_COLOR;
+ FX := (gScreenWidth div 2)-(GetWidth div 2);
+ FY := (gScreenHeight div 2)-(GetHeight div 2);
+ end;
end;
end;
procedure TGUIMainMenu.Draw;
var
a: Integer;
+ w, h: Word;
+
begin
inherited;
- FHeader.Draw;
+ if FHeader <> nil then FHeader.Draw
+ else begin
+ e_GetTextureSize(FLogo, @w, @h);
+ e_Draw(FLogo, ((gScreenWidth div 2) - (w div 2)), FButtons[0].FY - FButtons[0].GetHeight - h, 0, True, False);
+ end;
if FButtons <> nil then
begin
case Msg.Msg of
WM_KEYDOWN:
case Msg.wParam of
- IK_UP, IK_KPUP:
+ IK_UP, IK_KPUP, VK_UP, JOY0_UP, JOY1_UP, JOY2_UP, JOY3_UP:
begin
repeat
Dec(FIndex);
g_Sound_PlayEx(MENU_CHANGESOUND);
end;
- IK_DOWN, IK_KPDOWN:
+ IK_DOWN, IK_KPDOWN, VK_DOWN, JOY0_DOWN, JOY1_DOWN, JOY2_DOWN, JOY3_DOWN:
begin
repeat
Inc(FIndex);
g_Sound_PlayEx(MENU_CHANGESOUND);
end;
- IK_RETURN, IK_KPRETURN: if (FIndex <> -1) and FButtons[FIndex].FEnabled then FButtons[FIndex].Click;
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK: if (FIndex <> -1) and FButtons[FIndex].FEnabled then FButtons[FIndex].Click;
end;
end;
end;
case Msg.Msg of
WM_KEYDOWN:
case Msg.wParam of
- IK_RETURN, IK_KPRETURN: if @FOnClickEvent <> nil then FOnClickEvent();
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK: if @FOnClickEvent <> nil then FOnClickEvent();
end;
end;
end;
WM_KEYDOWN:
begin
case Msg.wParam of
- IK_UP, IK_KPUP:
+ IK_UP, IK_KPUP, VK_UP,JOY0_UP, JOY1_UP, JOY2_UP, JOY3_UP:
begin
c := 0;
repeat
g_Sound_PlayEx(MENU_CHANGESOUND);
end;
- IK_DOWN, IK_KPDOWN:
+ IK_DOWN, IK_KPDOWN, VK_DOWN, JOY0_DOWN, JOY1_DOWN, JOY2_DOWN, JOY3_DOWN:
begin
c := 0;
repeat
g_Sound_PlayEx(MENU_CHANGESOUND);
end;
- IK_LEFT, IK_RIGHT, IK_KPLEFT, IK_KPRIGHT:
+ IK_LEFT, IK_RIGHT, IK_KPLEFT, IK_KPRIGHT, VK_LEFT, VK_RIGHT,
+ JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT,
+ JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT:
begin
if FIndex <> -1 then
if FItems[FIndex].Control <> nil then
FItems[FIndex].Control.OnMessage(Msg);
end;
- IK_RETURN, IK_KPRETURN:
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK:
begin
if FIndex <> -1 then
begin
WM_KEYDOWN:
begin
case Msg.wParam of
- IK_LEFT, IK_KPLEFT:
+ IK_LEFT, IK_KPLEFT, VK_LEFT, JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT:
if FValue > 0 then
begin
Dec(FValue);
g_Sound_PlayEx(SCROLL_SUBSOUND);
if @FOnChangeEvent <> nil then FOnChangeEvent(Self);
end;
- IK_RIGHT, IK_KPRIGHT:
+ IK_RIGHT, IK_KPRIGHT, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT:
if FValue < FMax then
begin
Inc(FValue);
case Msg.Msg of
WM_KEYDOWN:
case Msg.wParam of
- IK_RETURN, IK_RIGHT, IK_KPRETURN, IK_KPRIGHT:
+ IK_RETURN, IK_RIGHT, IK_KPRETURN, IK_KPRIGHT, VK_FIRE, VK_OPEN, VK_RIGHT,
+ JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT,
+ JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK:
begin
if FIndex < High(FItems) then
Inc(FIndex)
FOnChangeEvent(Self);
end;
- IK_LEFT, IK_KPLEFT:
+ IK_LEFT, IK_KPLEFT, VK_LEFT,
+ JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT:
begin
if FIndex > 0 then
Dec(FIndex)
IK_DELETE: Delete(FText, FCaretPos + 1, 1);
IK_END, IK_KPEND: FCaretPos := Length(FText);
IK_HOME, IK_KPHOME: FCaretPos := 0;
- IK_LEFT, IK_KPLEFT: if FCaretPos > 0 then Dec(FCaretPos);
- IK_RIGHT, IK_KPRIGHT: if FCaretPos < Length(FText) then Inc(FCaretPos);
- IK_RETURN, IK_KPRETURN:
+ IK_LEFT, IK_KPLEFT, VK_LEFT, JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT: if FCaretPos > 0 then Dec(FCaretPos);
+ IK_RIGHT, IK_KPRIGHT, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT: if FCaretPos < Length(FText) then Inc(FCaretPos);
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK:
with FWindow do
begin
if FActiveControl <> Self then
end;
end;
- g_Touch_ShowKeyboard(FWindow.FActiveControl = Self);
+ g_GUIGrabInput := (@FOnEnterEvent = nil) and (FWindow.FActiveControl = Self);
+ g_Touch_ShowKeyboard(g_GUIGrabInput)
end;
procedure TGUIEdit.SetText(Text: string);
case Msg of
WM_KEYDOWN:
case wParam of
- IK_ESCAPE:
+ VK_ESCAPE:
begin
if FIsQuery then actDefCtl();
FIsQuery := False;
end;
- IK_RETURN, IK_KPRETURN:
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK:
begin
if not FIsQuery then
begin
FIsQuery := True;
end
- else
+ else if (wParam < VK_FIRSTKEY) and (wParam > VK_LASTKEY) then
begin
- FKey := IK_ENTER; // <Enter>
+ // FKey := IK_ENTER; // <Enter>
+ FKey := wParam;
FIsQuery := False;
actDefCtl();
end;
FKey := 0;
actDefCtl();
end
- else if FIsQuery and (wParam <> IK_ENTER) and (wParam <> IK_KPRETURN) then // Not <Enter
+ else if FIsQuery then
begin
- if e_KeyNames[wParam] <> '' then
- FKey := wParam;
- FIsQuery := False;
- actDefCtl();
+ case wParam of
+ IK_ENTER, IK_KPRETURN, VK_FIRSTKEY..VK_LASTKEY (*, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK*): // Not <Enter
+ else
+ if e_KeyNames[wParam] <> '' then
+ FKey := wParam;
+ FIsQuery := False;
+ actDefCtl();
+ end
end;
end;
end;
+
+ g_GUIGrabInput := FIsQuery
end;
{ TGUIKeyRead2 }
function TGUIKeyRead2.WantActivationKey (key: LongInt): Boolean;
begin
- result :=
- (key = IK_BACKSPACE) or
- (key = IK_LEFT) or (key = IK_RIGHT) or
- (key = IK_KPLEFT) or (key = IK_KPRIGHT) or
- false; // oops
+ case key of
+ IK_BACKSPACE, IK_LEFT, IK_RIGHT, IK_KPLEFT, IK_KPRIGHT, VK_LEFT, VK_RIGHT,
+ JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT,
+ JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT:
+ result := True
+ else
+ result := False
+ end
end;
procedure TGUIKeyRead2.OnMessage(var Msg: TMessage);
case Msg of
WM_KEYDOWN:
case wParam of
- IK_ESCAPE:
+ VK_ESCAPE:
begin
if FIsQuery then actDefCtl();
FIsQuery := False;
end;
- IK_RETURN, IK_KPRETURN:
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK:
begin
if not FIsQuery then
begin
FIsQuery := True;
end
- else
+ else if (wParam < VK_FIRSTKEY) and (wParam > VK_LASTKEY) then
begin
- if (FKeyIdx = 0) then FKey0 := IK_ENTER else FKey1 := IK_ENTER; // <Enter>
+ // if (FKeyIdx = 0) then FKey0 := IK_ENTER else FKey1 := IK_ENTER; // <Enter>
+ if (FKeyIdx = 0) then FKey0 := wParam else FKey1 := wParam;
FIsQuery := False;
actDefCtl();
end;
actDefCtl();
end;
end;
- IK_LEFT, IK_KPLEFT:
+ IK_LEFT, IK_KPLEFT, VK_LEFT, JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT:
if not FIsQuery then
begin
FKeyIdx := 0;
actDefCtl();
end;
- IK_RIGHT, IK_KPRIGHT:
+ IK_RIGHT, IK_KPRIGHT, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT:
if not FIsQuery then
begin
FKeyIdx := 1;
if (FKeyIdx = 0) then FKey0 := 0 else FKey1 := 0;
actDefCtl();
end
- else if FIsQuery and (wParam <> IK_ENTER) and (wParam <> IK_KPRETURN) then // Not <Enter
+ else if FIsQuery then
begin
- if e_KeyNames[wParam] <> '' then
- begin
- if (FKeyIdx = 0) then FKey0 := wParam else FKey1 := wParam;
- end;
- FIsQuery := False;
- actDefCtl();
+ case wParam of
+ IK_ENTER, IK_KPRETURN, VK_FIRSTKEY..VK_LASTKEY (*, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK*): // Not <Enter
+ else
+ if e_KeyNames[wParam] <> '' then
+ begin
+ if (FKeyIdx = 0) then FKey0 := wParam else FKey1 := wParam;
+ end;
+ FIsQuery := False;
+ actDefCtl()
+ end
end;
end;
end;
+
+ g_GUIGrabInput := FIsQuery
end;
FIndex := High(FItems);
FStartLine := Max(High(FItems)-FHeight+1, 0);
end;
- IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT:
+ IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT, VK_LEFT, JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT:
if FIndex > 0 then
begin
Dec(FIndex);
if FIndex < FStartLine then Dec(FStartLine);
if @FOnChangeEvent <> nil then FOnChangeEvent(Self);
end;
- IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT:
+ IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT:
if FIndex < High(FItems) then
begin
Inc(FIndex);
if FIndex > FStartLine+FHeight-1 then Inc(FStartLine);
if @FOnChangeEvent <> nil then FOnChangeEvent(Self);
end;
- IK_RETURN, IK_KPRETURN:
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK:
with FWindow do
begin
if FActiveControl <> Self then SetActive(Self)
procedure TGUIFileListBox.OnMessage(var Msg: TMessage);
var
- a: Integer;
+ a, b: Integer;
begin
if not FEnabled then
Exit;
FStartLine := High(FItems)-FHeight+1;
end;
- IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT:
+ IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT, VK_UP, VK_LEFT, JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT:
if FIndex > 0 then
begin
Dec(FIndex);
FOnChangeEvent(Self);
end;
- IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT:
+ IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT, VK_DOWN, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT:
if FIndex < High(FItems) then
begin
Inc(FIndex);
FOnChangeEvent(Self);
end;
- IK_RETURN, IK_KPRETURN:
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK:
with FWindow do
begin
if FActiveControl <> Self then
end;
WM_CHAR:
- for a := 0 to High(FItems) do
+ for b := FIndex + 1 to High(FItems) + FIndex do
+ begin
+ a := b mod Length(FItems);
if ( (Length(FItems[a]) > 0) and
(LowerCase(FItems[a][1]) = LowerCase(Chr(wParam))) ) or
( (Length(FItems[a]) > 1) and
FOnChangeEvent(Self);
Break;
end;
+ end;
end;
end;
case Msg of
WM_KEYDOWN:
case wParam of
- IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT:
+ IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT, VK_UP, VK_LEFT, JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT:
if FStartLine > 0 then
Dec(FStartLine);
- IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT:
+ IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT, VK_DOWN, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT:
if FStartLine < Length(FLines)-FHeight then
Inc(FStartLine);
- IK_RETURN, IK_KPRETURN:
+ IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK:
with FWindow do
begin
if FActiveControl <> Self then