X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_gui.pas;h=55302688c55c807547219faa4d47d2c81bf5d1e1;hb=67d37ea13feeca0671d60d88b1963cf1e0e901c4;hp=67f3b8a6ebd8f5e4fbfb4e2893229b7db0e94afd;hpb=1e8d8649f9fa70dd54b628bee55772e2f4b934a0;p=d2df-sdl.git diff --git a/src/game/g_gui.pas b/src/game/g_gui.pas index 67f3b8a..5530268 100644 --- a/src/game/g_gui.pas +++ b/src/game/g_gui.pas @@ -401,6 +401,7 @@ type procedure OnMessage(var Msg: TMessage); override; procedure Draw(); override; procedure AddItem(Item: String); + function ItemExists (item: String): Boolean; procedure SelectItem(Item: String); procedure Clear(); function GetWidth(): Integer; override; @@ -420,22 +421,21 @@ type TGUIFileListBox = class(TGUIListBox) private - FBasePath: String; - FPath: String; + FSubPath: String; FFileMask: String; FDirs: Boolean; + FBaseList: SSArray; // highter index have highter priority - procedure OpenDir(path: String); + procedure ScanDirs; public - procedure OnMessage(var Msg: TMessage); override; - procedure SetBase(path: String); + procedure OnMessage (var Msg: TMessage); override; + procedure SetBase (dirs: SSArray; path: String = ''); function SelectedItem(): String; - procedure UpdateFileList(); + procedure UpdateFileList; property Dirs: Boolean read FDirs write FDirs; property FileMask: String read FFileMask write FFileMask; - property Path: String read FPath; end; TGUIMemo = class(TGUIControl) @@ -551,8 +551,8 @@ implementation uses {$INCLUDE ../nogl/noGLuses.inc} - g_textures, g_sound, SysUtils, - g_game, Math, StrUtils, g_player, g_options, + g_textures, g_sound, SysUtils, e_res, + g_game, Math, StrUtils, g_player, g_options, g_console, g_map, g_weapons, xdynrec, wadreader; @@ -2226,21 +2226,25 @@ begin else FIndex := 0; + g_Sound_PlayEx(SCROLL_ADDSOUND); + if @FOnChangeEvent <> nil then FOnChangeEvent(Self); end; - IK_LEFT, IK_KPLEFT, VK_LEFT, - JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT: - begin - if FIndex > 0 then - Dec(FIndex) - else - FIndex := High(FItems); + IK_LEFT, IK_KPLEFT, VK_LEFT, + JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT: + begin + if FIndex > 0 then + Dec(FIndex) + else + FIndex := High(FItems); - if @FOnChangeEvent <> nil then - FOnChangeEvent(Self); - end; + g_Sound_PlayEx(SCROLL_SUBSOUND); + + if @FOnChangeEvent <> nil then + FOnChangeEvent(Self); + end; end; end; end; @@ -2439,58 +2443,40 @@ begin with Msg do case Msg of WM_KEYDOWN: - case wParam of - VK_ESCAPE: - begin - if FIsQuery then actDefCtl(); - FIsQuery := False; - end; - IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK: - begin - if not FIsQuery then - begin - with FWindow do - if FActiveControl <> Self then - SetActive(Self); - - FIsQuery := True; - end - else if (wParam < VK_FIRSTKEY) and (wParam > VK_LASTKEY) then - begin - // FKey := IK_ENTER; // - FKey := wParam; - FIsQuery := False; - actDefCtl(); - end; - end; - IK_BACKSPACE: // clear keybinding if we aren't waiting for a key - begin - if not FIsQuery then + if not FIsQuery then + begin + case wParam of + IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK: + begin + with FWindow do + if FActiveControl <> Self then + SetActive(Self); + FIsQuery := True; + end; + IK_BACKSPACE: // clear keybinding if we aren't waiting for a key begin FKey := 0; actDefCtl(); end; - end; - end; - - MESSAGE_DIKEY: + else + FIsQuery := False; + actDefCtl(); + end; + end + else begin - if not FIsQuery and (wParam = IK_BACKSPACE) then - begin - FKey := 0; + case wParam of + VK_FIRSTKEY..VK_LASTKEY: // do not allow to bind virtual keys + begin + FIsQuery := False; + actDefCtl(); + end; + else + if (e_KeyNames[wParam] <> '') and not g_Console_MatchBind(wParam, 'togglemenu') then + FKey := wParam; + FIsQuery := False; actDefCtl(); end - else if FIsQuery then - begin - case wParam of - IK_ENTER, IK_KPRETURN, VK_FIRSTKEY..VK_LASTKEY (*, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK*): // Not '' then - FKey := wParam; - FIsQuery := False; - actDefCtl(); - end - end; end; end; @@ -2595,72 +2581,52 @@ begin with Msg do case Msg of WM_KEYDOWN: - case wParam of - VK_ESCAPE: - begin - if FIsQuery then actDefCtl(); - FIsQuery := False; - end; - IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK: - begin - if not FIsQuery then - begin - with FWindow do - if FActiveControl <> Self then - SetActive(Self); - - FIsQuery := True; - end - else if (wParam < VK_FIRSTKEY) and (wParam > VK_LASTKEY) then - begin - // if (FKeyIdx = 0) then FKey0 := IK_ENTER else FKey1 := IK_ENTER; // - if (FKeyIdx = 0) then FKey0 := wParam else FKey1 := wParam; - FIsQuery := False; - actDefCtl(); - end; - end; - IK_BACKSPACE: // clear keybinding if we aren't waiting for a key - begin - if not FIsQuery then + if not FIsQuery then + begin + case wParam of + IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK: + begin + with FWindow do + if FActiveControl <> Self then + SetActive(Self); + FIsQuery := True; + end; + IK_BACKSPACE: // clear keybinding if we aren't waiting for a key begin if (FKeyIdx = 0) then FKey0 := 0 else FKey1 := 0; actDefCtl(); end; - end; - 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, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT: - if not FIsQuery then - begin - FKeyIdx := 1; - actDefCtl(); - end; - end; - - MESSAGE_DIKEY: - begin - if not FIsQuery and (wParam = IK_BACKSPACE) then - begin - if (FKeyIdx = 0) then FKey0 := 0 else FKey1 := 0; - actDefCtl(); - end - else if FIsQuery then - begin - case wParam of - IK_ENTER, IK_KPRETURN, VK_FIRSTKEY..VK_LASTKEY (*, JOY0_ATTACK, JOY1_ATTACK, JOY2_ATTACK, JOY3_ATTACK*): // Not '' then + IK_LEFT, IK_KPLEFT, VK_LEFT, JOY0_LEFT, JOY1_LEFT, JOY2_LEFT, JOY3_LEFT: + begin + FKeyIdx := 0; + actDefCtl(); + end; + IK_RIGHT, IK_KPRIGHT, VK_RIGHT, JOY0_RIGHT, JOY1_RIGHT, JOY2_RIGHT, JOY3_RIGHT: begin - if (FKeyIdx = 0) then FKey0 := wParam else FKey1 := wParam; + FKeyIdx := 1; + actDefCtl(); end; - FIsQuery := False; - actDefCtl() - end + else + FIsQuery := False; + actDefCtl(); end; + end + else + begin + case wParam of + VK_FIRSTKEY..VK_LASTKEY: // do not allow to bind virtual keys + begin + FIsQuery := False; + actDefCtl(); + end; + else + if (e_KeyNames[wParam] <> '') and not g_Console_MatchBind(wParam, 'togglemenu') then + begin + if (FKeyIdx = 0) then FKey0 := wParam else FKey1 := wParam; + end; + FIsQuery := False; + actDefCtl() + end end; end; @@ -2709,10 +2675,9 @@ begin if FModel = nil then Exit; - if FModel.Weapon < WP_LAST then - FModel.SetWeapon(FModel.Weapon+1) - else - FModel.SetWeapon(WEAPON_KASTET); + if FModel.Weapon < WP_LAST + then FModel.SetWeapon(FModel.Weapon+1) + else FModel.SetWeapon(WEAPON_IRONFIST); end; procedure TGUIModelView.OnMessage(var Msg: TMessage); @@ -2983,7 +2948,15 @@ begin if FSort then g_Basic.Sort(FItems); end; -procedure TGUIListBox.Clear(); +function TGUIListBox.ItemExists (item: String): Boolean; + var i: Integer; +begin + i := 0; + while (i <= High(FItems)) and (FItems[i] <> item) do Inc(i); + result := i <= High(FItems) +end; + +procedure TGUIListBox.Clear; begin FItems := nil; @@ -3173,7 +3146,7 @@ end; procedure TGUIFileListBox.OnMessage(var Msg: TMessage); var - a, b: Integer; + a, b: Integer; s: AnsiString; begin if not FEnabled then Exit; @@ -3256,7 +3229,18 @@ begin begin if FItems[FIndex][1] = #29 then // Ïàïêà begin - OpenDir(FPath+Copy(FItems[FIndex], 2, 255)); + if FItems[FIndex] = #29 + '..' then + begin + //e_LogWritefln('TGUIFileListBox: Upper dir "%s" -> "%s"', [FSubPath, e_UpperDir(FSubPath)]); + 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)]); + FSubPath := e_CatPath(FSubPath, s); + end; + ScanDirs; FIndex := 0; Exit; end; @@ -3289,70 +3273,78 @@ begin end; end; -procedure TGUIFileListBox.OpenDir(path: String); -var - SR: TSearchRec; - i: Integer; - sm, sc: string; +procedure TGUIFileListBox.ScanDirs; + var i, j: Integer; path: AnsiString; SR: TSearchRec; sm, sc: String; begin - Clear(); - - path := IncludeTrailingPathDelimiter(path); - path := ExpandFileName(path); + Clear; - // Êàòàëîãè: - if FDirs then + i := High(FBaseList); + while i >= 0 do begin - if FindFirst(path+'*', faDirectory, SR) = 0 then - repeat - if not LongBool(SR.Attr and faDirectory) then - Continue; - if (SR.Name = '.') or - ((SR.Name = '..') and (path = ExpandFileName(FBasePath))) then - Continue; - - AddItem(#1 + SR.Name); - until FindNext(SR) <> 0; - - FindClose(SR); + path := e_CatPath(FBaseList[i], FSubPath); + if FDirs then + begin + if FindFirst(path + '/' + '*', faDirectory, SR) = 0 then + begin + repeat + if LongBool(SR.Attr and faDirectory) then + if (SR.Name <> '.') and ((FSubPath <> '') or (SR.Name <> '..')) then + if Self.ItemExists(#1 + SR.Name) = false then + Self.AddItem(#1 + SR.Name) + until FindNext(SR) <> 0 + end; + FindClose(SR) + end; + Dec(i) end; - // Ôàéëû: - sm := FFileMask; - while sm <> '' do + i := High(FBaseList); + while i >= 0 do begin - i := Pos('|', sm); - if i = 0 then i := length(sm)+1; - sc := Copy(sm, 1, i-1); - Delete(sm, 1, i); - if FindFirst(path+sc, faAnyFile, SR) = 0 then repeat AddItem(SR.Name); until FindNext(SR) <> 0; - FindClose(SR); + path := e_CatPath(FBaseList[i], FSubPath); + sm := FFileMask; + while sm <> '' do + begin + j := Pos('|', sm); + if j = 0 then + j := length(sm) + 1; + sc := Copy(sm, 1, j - 1); + Delete(sm, 1, j); + if FindFirst(path + '/' + sc, faAnyFile, SR) = 0 then + begin + repeat + if Self.ItemExists(SR.Name) = false then + AddItem(SR.Name) + until FindNext(SR) <> 0 + end; + FindClose(SR) + end; + Dec(i) end; for i := 0 to High(FItems) do if FItems[i][1] = #1 then FItems[i][1] := #29; - - FPath := path; end; -procedure TGUIFileListBox.SetBase(path: String); +procedure TGUIFileListBox.SetBase (dirs: SSArray; path: String = ''); begin - FBasePath := path; - OpenDir(FBasePath); + FBaseList := dirs; + FSubPath := path; + ScanDirs end; -function TGUIFileListBox.SelectedItem(): String; +function TGUIFileListBox.SelectedItem (): String; + var s: AnsiString; begin - Result := ''; - - if (FIndex = -1) or (FItems = nil) or - (FIndex > High(FItems)) or - (FItems[FIndex][1] = '/') or - (FItems[FIndex][1] = '\') then - Exit; - - Result := FPath + FItems[FIndex]; + result := ''; + if (FIndex >= 0) and (FIndex <= High(FItems)) and (FItems[FIndex][1] <> '/') and (FItems[FIndex][1] <> '\') then + begin + s := e_CatPath(FSubPath, FItems[FIndex]); + if e_FindResource(FBaseList, s) = true then + result := ExpandFileName(s) + end; + e_LogWritefln('TGUIFileListBox.SelectedItem -> "%s"', [result]); end; procedure TGUIFileListBox.UpdateFileList(); @@ -3367,7 +3359,8 @@ begin else fn := FItems[FIndex]; - OpenDir(FPath); +// OpenDir(FPath); + ScanDirs; if fn <> '' then SelectItem(fn);