Subversion Repositories jumper

Rev

Rev 11 | Rev 21 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit Choice;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ImgList, ComCtrls, Menus, ExtCtrls, System.ImageList;
  8.  
  9. type
  10.   TLevelChoice = class(TForm)
  11.     PlayBtn: TButton;
  12.     CancelBtn: TButton;
  13.     LevelImageList: TImageList;
  14.     LevelPopupMenu: TPopupMenu;
  15.     PLoadLevel: TMenuItem;
  16.     PRefreshList: TMenuItem;
  17.     PreviewGrp: TGroupBox;
  18.     PreviewImage: TImage;
  19.     LevelGrp: TGroupBox;
  20.     LevelList: TListView;
  21.     procedure PlayBtnClick(Sender: TObject);
  22.     procedure CancelBtnClick(Sender: TObject);
  23.     procedure FormShow(Sender: TObject);
  24.     procedure LevelListClick(Sender: TObject);
  25.     procedure LevelListChange(Sender: TObject; Item: TListItem;
  26.       Change: TItemChange);
  27.     procedure PRefreshListClick(Sender: TObject);
  28.     procedure FormResize(Sender: TObject);
  29.     procedure FormCreate(Sender: TObject);
  30.   private
  31.     procedure RefreshList;
  32.   public
  33.     function SelectedLevel: string;
  34.   end;
  35.  
  36. var
  37.   LevelChoice: TLevelChoice;
  38.  
  39. implementation
  40.  
  41. {$R *.dfm}
  42.  
  43. uses
  44.   Functions, LevelFunctions, Constants;
  45.  
  46. function TLevelChoice.SelectedLevel: string;
  47. begin
  48.   result := Format(LVL_FILE, [LevelList.Selected.Caption]);
  49. end;
  50.  
  51. procedure TLevelChoice.PlayBtnClick(Sender: TObject);
  52. var
  53.   Level: TLevel;
  54. begin
  55.   if Assigned(LevelList.Selected) then
  56.   begin
  57.     if LevelList.Selected.ImageIndex = 2 then
  58.     begin
  59.       Level := TLevel.Create(Format(LVL_FILE, [LevelList.Selected.Caption]));
  60.       try
  61.         if Level.CheckLevelIntegrity(true) <> leNone then
  62.         begin
  63.           exit;
  64.         end;
  65.       finally
  66.         FreeAndNil(Level);
  67.       end;
  68.     end;
  69.     ModalResult := mrOk;
  70.   end;
  71. end;
  72.  
  73. procedure TLevelChoice.CancelBtnClick(Sender: TObject);
  74. begin
  75.   ModalResult := mrCancel;
  76. end;
  77.  
  78. procedure TLevelChoice.FormShow(Sender: TObject);
  79. begin
  80.   RefreshList;
  81. end;
  82.  
  83. procedure TLevelChoice.LevelListClick(Sender: TObject);
  84. var
  85.   LevelFile: string;
  86.   Level: TLevel;
  87. begin
  88.   PlayBtn.Enabled := Assigned(LevelList.Selected);
  89.   PLoadLevel.Enabled := Assigned(LevelList.Selected);
  90.  
  91.   if Assigned(LevelList.Selected) then
  92.   begin
  93.     LevelFile := Format(LVL_FILE, [LevelList.Selected.Caption]);
  94.     Level := TLevel.Create(LevelFile);
  95.     try
  96.       DrawLevelPreview(Level, PreviewImage, Color);
  97.     finally
  98.       FreeAndNil(Level);
  99.     end;
  100.   end
  101.   else
  102.   begin
  103.     ClearImage(PreviewImage, Color);
  104.   end;
  105. end;
  106.  
  107. procedure TLevelChoice.LevelListChange(Sender: TObject; Item: TListItem;
  108.   Change: TItemChange);
  109. begin
  110.   if Change = ctState then LevelListClick(self);
  111. end;
  112.  
  113. procedure TLevelChoice.PRefreshListClick(Sender: TObject);
  114. begin
  115.   RefreshList;
  116. end;
  117.  
  118. procedure TLevelChoice.RefreshList;
  119. var
  120.   s: TSearchRec;
  121.   Level: TLevel;
  122. begin
  123.   LevelList.Clear;
  124.  
  125.   // Levels auflisten
  126.   if FindFirst(Format(LVL_FILE, ['*']), faAnyFile, s) = 0 then
  127.   begin
  128.     repeat
  129.       with LevelList.Items.Add do
  130.       begin
  131.         Caption := Copy(s.Name, 1, Length(s.Name)-Length(LVL_EXT));
  132.         Level := TLevel.Create(LVL_PATH + s.Name);
  133.  
  134.         if Level.CheckLevelIntegrity <> leNone then
  135.           ImageIndex := 2{Error}
  136.         else case Level.GetGameMode of
  137.           gmNormal: ImageIndex := 0{Normal};
  138.           gmDiagonal: ImageIndex := 1{Diagonal};
  139.           gmUndefined: ImageIndex := 2{Error};
  140.         end;
  141.       end;
  142.     until FindNext(s) <> 0;
  143.     FindClose(s);
  144.   end;
  145. end;
  146.  
  147. procedure TLevelChoice.FormResize(Sender: TObject);
  148. var
  149.   p: integer;
  150. begin
  151.   // WIDTH
  152.   p := ClientWidth - 3*LevelGrp.Left; // 100% useable
  153.   LevelGrp.Width := Round((1-MET_PREVIEW_SIZE_RATIO) * p);
  154.   PreviewGrp.Width := Round(MET_PREVIEW_SIZE_RATIO * p);
  155.   PreviewGrp.Left := 2*LevelGrp.Left + LevelGrp.Width;
  156.   LevelList.Width := LevelGrp.Width - 2*LevelList.Left;
  157.   PreviewImage.Width := PreviewGrp.Width - 2*PreviewImage.Left;
  158.   PlayBtn.Left := (LevelGrp.Left + LevelGrp.Width) - PlayBtn.Width;
  159.  
  160.   // HEIGHT
  161.   LevelGrp.Height := ClientHeight - 3*LevelGrp.Top - PlayBtn.Height;
  162.   PreviewGrp.Height := LevelGrp.Height;
  163.   PlayBtn.Top := 2*LevelGrp.Top + LevelGrp.Height;
  164.   CancelBtn.Top := PlayBtn.Top;
  165.   LevelList.Height := LevelGrp.Height - 2*LevelList.Top;
  166.   PreviewImage.Height := PreviewGrp.Height - 2*PreviewImage.Top;
  167.  
  168.   // TODO: Icons rearrangieren
  169. end;
  170.  
  171. procedure TLevelChoice.FormCreate(Sender: TObject);
  172. begin
  173.   if not ForceDirectories(ExtractFilePath(Application.ExeName) + LVL_PATH) then
  174.   begin
  175.     MessageDlg(Format(LNG_COULD_NOT_CREATE_DIR, [LVL_PATH]), mtError, [mbOK], 0);
  176.   end;
  177. end;
  178.  
  179. end.
  180.